/* Generated from crates/horizon-theme by `cargo run -p xtask -- tokens`; do not edit.
   docs/design-system.md describes the tokens. */

:root {
  --page: #fafafc;
  --plate-soft: #f3f3f8;
  --plate: #ebecf4;
  --surface: #ffffff;
  --rule: #e2e3ea;
  --ink: #16181f;
  --ink-soft: #3b3e49;
  --muted: #646875;
  --accent: #5b3fd6;
  --on-accent: #ffffff;
  --danger: #b4372a;
  --success: #1d7a48;
  color-scheme: light;
  --font: "Geist", ui-sans-serif, system-ui, sans-serif;
  --mono: "Geist Mono", ui-monospace, monospace;
  --text-micro: 11px;
  --text-micro-line: 1.5;
  --text-micro-tracking: 0.04em;
  --text-micro-weight: 400;
  --text-caption: 12px;
  --text-caption-line: 1.5;
  --text-caption-tracking: 0em;
  --text-caption-weight: 400;
  --text-label: 13px;
  --text-label-line: 1.5;
  --text-label-tracking: 0em;
  --text-label-weight: 400;
  --text-ui: 14px;
  --text-ui-line: 1.5;
  --text-ui-tracking: 0em;
  --text-ui-weight: 400;
  --text-body: clamp(15px, calc(15px + 2 * (100vw - 375px) / 1065), 17px);
  --text-body-line: 1.6;
  --text-body-tracking: 0em;
  --text-body-weight: 400;
  --text-heading: clamp(20px, calc(20px + 4 * (100vw - 375px) / 1065), 24px);
  --text-heading-line: 1.3;
  --text-heading-tracking: -0.01em;
  --text-heading-weight: 500;
  --text-title: clamp(32px, calc(32px + 16 * (100vw - 375px) / 1065), 48px);
  --text-title-line: 1.05;
  --text-title-tracking: -0.02em;
  --text-title-weight: 500;
  --text-display: clamp(34px, calc(34px + 30 * (100vw - 375px) / 1065), 64px);
  --text-display-line: 1.05;
  --text-display-tracking: -0.025em;
  --text-display-weight: 500;
  --text-wordmark: 18vw;
  --text-wordmark-line: 0.8;
  --text-wordmark-tracking: -0.04em;
  --text-wordmark-weight: 500;
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 48px;
  --space-8: 64px;
  --space-9: 96px;
  --gutter: 64px;
  --gutter-narrow: 16px;
  --radius: 8px;
  --radius-plate: 12px;
  --radius-pill: 999px;
  --rule-width: 1px;
  --control: 32px;
  --control-large: 40px;
  --segment: 28px;
  --field: 36px;
  --row: 86px;
  --index: 40px;
  --plate-bleed: 16px;
  --rise: 8px;
  --measure: 56ch;
  --quick: 150ms;
  --ease-quick: cubic-bezier(0.4, 0, 0.2, 1);
  --move: 240ms;
  --ease-move: cubic-bezier(0.23, 1, 0.32, 1);
  --enter: 600ms;
  --ease-enter: cubic-bezier(0.23, 1, 0.32, 1);
  --stagger: 40ms;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --page: #0d0e13;
    --plate-soft: #181a22;
    --plate: #20222c;
    --surface: #16181f;
    --rule: #24262f;
    --ink: #ecedf3;
    --ink-soft: #c5c7d1;
    --muted: #8b8f9c;
    --accent: #9a86ff;
    --on-accent: #0d0e13;
    --danger: #f07a68;
    --success: #45c27a;
    color-scheme: dark;
  }
}

:root[data-theme="dark"] {
  --page: #0d0e13;
  --plate-soft: #181a22;
  --plate: #20222c;
  --surface: #16181f;
  --rule: #24262f;
  --ink: #ecedf3;
  --ink-soft: #c5c7d1;
  --muted: #8b8f9c;
  --accent: #9a86ff;
  --on-accent: #0d0e13;
  --danger: #f07a68;
  --success: #45c27a;
  color-scheme: dark;
}

/* Horizon's design language (docs/design-system.md), set as a page. The tokens come from
   crates/horizon-theme through src/tokens.css, which build.mjs puts before this file: the
   same palette, type, spacing and motion as the launcher and the game's menus. Type is the
   interface; content is numbered index lists with one-pixel rules; one violet accent for the
   main action, links and focus; space instead of borders; quiet motion. */

@font-face { font-family: "Geist"; src: url("/fonts/Geist-Regular.woff2") format("woff2"); font-weight: 400; font-display: swap; }
@font-face { font-family: "Geist"; src: url("/fonts/Geist-Medium.woff2") format("woff2"); font-weight: 500; font-display: swap; }
@font-face { font-family: "Geist"; src: url("/fonts/Geist-SemiBold.woff2") format("woff2"); font-weight: 600; font-display: swap; }
@font-face { font-family: "Geist Mono"; src: url("/fonts/GeistMono-Regular.woff2") format("woff2"); font-weight: 400; font-display: swap; }

:root {
  --g: clamp(var(--gutter-narrow), 4.5vw, var(--gutter));
  --max: 1440px;
  --nav: 72px;
}

*, *::before, *::after { box-sizing: border-box; }

html {
  background: var(--page);
  color: var(--ink);
  font: 400 var(--text-body) / var(--text-body-line) var(--font);
  font-synthesis: none;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--nav) + 16px);
  transition: background-color var(--move) var(--ease-move), color var(--move) var(--ease-move);
}
body { margin: 0; min-height: 100vh; overflow-x: clip; }
img { display: block; max-width: 100%; height: auto; }
h1, h2, h3 { margin: 0; font-weight: var(--text-heading-weight); }
p { margin: 0; }
ol, ul { margin: 0; padding: 0; list-style: none; }
::selection { background: var(--accent); color: var(--on-accent); }

a { color: var(--accent); text-decoration: none; transition: color var(--quick) var(--ease-quick); }
a:hover { color: var(--ink); }
[hidden] { display: none !important; }
/* Links inside running text are underlined, so they don't rely on colour alone. */
p a:not(.button):not(.link-arrow), li > p a, .prose a {
  color: inherit; text-decoration: underline; text-decoration-color: var(--rule);
  text-decoration-thickness: 1px; text-underline-offset: 3px;
  transition: text-decoration-color var(--quick) var(--ease-quick);
}
p a:not(.button):not(.link-arrow):hover, li > p a:hover, .prose a:hover { text-decoration-color: currentColor; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--radius); }

code {
  font: 0.86em/1.5 var(--mono);
  background: var(--plate-soft);
  border-radius: 4px;
  padding: 1px 5px;
  overflow-wrap: anywhere;
}

.sr-only {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.skip {
  position: fixed; left: var(--g); top: 12px; z-index: 50; padding: 8px 14px;
  background: var(--ink); color: var(--page); border-radius: var(--radius-pill);
  transform: translateY(-200%);
}
.skip:focus { transform: none; }

.container { width: 100%; max-width: var(--max); margin: 0 auto; padding: 0 var(--g); }

/* --- Type ----------------------------------------------------------------------------- */

.display {
  font-size: var(--text-display); line-height: var(--text-display-line);
  letter-spacing: var(--text-display-tracking); font-weight: var(--text-display-weight);
  text-wrap: balance;
}
.title {
  font-size: var(--text-title); line-height: var(--text-title-line);
  letter-spacing: var(--text-title-tracking); font-weight: var(--text-title-weight);
  text-wrap: balance;
}
.lede { max-width: var(--measure); color: var(--muted); text-wrap: pretty; }
.kicker, .meta, .download-meta, .eyebrow, .row-index, .row-meta, .disclaimer {
  font: var(--text-micro-weight) var(--text-micro) / var(--text-micro-line) var(--mono);
  letter-spacing: var(--text-micro-tracking);
  color: var(--muted);
}
.kicker { display: flex; gap: 16px; text-transform: uppercase; margin-bottom: 24px; }
.kicker span { color: var(--ink); }
.meta { margin-top: 16px; }
.download-meta { margin-top: 12px; }
.download-meta a { color: inherit; }

/* --- Buttons --------------------------------------------------------------------------- */

.button {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: var(--control); padding: 0 16px; border: 0; border-radius: var(--radius-pill);
  font: 500 var(--text-label) / 1 var(--font); cursor: pointer; white-space: nowrap;
  transition: background-color var(--quick) var(--ease-quick), color var(--quick) var(--ease-quick), opacity var(--quick) var(--ease-quick);
}
.button.large { height: var(--control-large); padding: 0 22px; font-size: var(--text-ui); }
.button.small { height: 30px; padding: 0 14px; }
.button.primary { background: var(--accent); color: var(--on-accent); }
.button.primary:hover { color: var(--on-accent); opacity: 0.88; }
.button.secondary { background: var(--plate-soft); color: var(--ink); }
.button.secondary:hover { background: var(--plate); color: var(--ink); }
.button.ghost { background: transparent; color: var(--muted); }
.button.ghost:hover { background: var(--plate-soft); color: var(--ink); }
.button:active { opacity: 0.85; }

.link-arrow { display: inline-flex; gap: 8px; color: var(--accent); font-weight: 500; }
.link-arrow span { transition: transform var(--quick) var(--ease-quick); }
.link-arrow:hover span { transform: translateX(3px); }

/* --- Navigation ------------------------------------------------------------------------- */

.nav {
  position: fixed; inset: 0 0 auto; z-index: 20; height: var(--nav);
  background: color-mix(in srgb, var(--page) 0%, transparent);
  transition: background-color var(--move) var(--ease-move), box-shadow var(--move) var(--ease-move);
}
.nav.is-scrolled, .nav.is-menu {
  background: color-mix(in srgb, var(--page) 88%, transparent);
  -webkit-backdrop-filter: blur(16px) saturate(1.2); backdrop-filter: blur(16px) saturate(1.2);
  box-shadow: 0 1px 0 var(--rule);
}
.nav-inner { display: flex; align-items: center; gap: 24px; height: 100%; max-width: var(--max); margin: 0 auto; padding: 0 var(--g); }
.nav-mark { display: inline-flex; align-items: center; gap: 10px; color: var(--ink); font-weight: 500; font-size: var(--text-label); }
.nav-mark:hover { color: var(--ink); }
.mark { width: 18px; height: 18px; }
.mark-stem { fill: var(--ink); }
.mark-low { fill: var(--ink); opacity: 0.36; }
.mark-line { fill: var(--accent); }
.nav-links { display: flex; gap: 2px; margin-left: auto; }
.nav-links a, .nav-github, .theme-toggle {
  display: inline-flex; align-items: center; height: 32px; padding: 0 12px;
  border-radius: var(--radius-pill); color: var(--muted); font-size: var(--text-label);
  transition: background-color var(--quick) var(--ease-quick), color var(--quick) var(--ease-quick);
}
.nav-links a:hover, .nav-github:hover, .theme-toggle:hover { color: var(--ink); background: var(--plate-soft); }
.nav-links a[aria-current] { color: var(--ink); background: var(--plate-soft); }
.nav-end { display: flex; align-items: center; gap: 2px; }
.theme-toggle {
  border: 0; background: none; cursor: pointer;
  font: var(--text-micro) / 1 var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase;
}
.nav-end .button { margin-left: 8px; }
.menu-button {
  display: none; align-items: center; gap: 10px; height: 44px; padding: 0 4px 0 14px; margin-left: 4px;
  border: 0; background: none; color: var(--ink); font: 500 var(--text-label) / 1 var(--font); cursor: pointer;
}
.menu-icon { position: relative; width: 18px; height: 10px; }
.menu-icon::before, .menu-icon::after {
  content: ""; position: absolute; left: 0; right: 0; height: 1.5px; border-radius: 1px; background: currentColor;
  transition: transform var(--move) var(--ease-move), top var(--move) var(--ease-move);
}
.menu-icon::before { top: 0; }
.menu-icon::after { top: 8px; }
.is-menu .menu-icon::before { top: 4px; transform: rotate(45deg); }
.is-menu .menu-icon::after { top: 4px; transform: rotate(-45deg); }

.menu {
  position: fixed; inset: var(--nav) 0 0; z-index: 19; display: flex; flex-direction: column;
  justify-content: space-between; padding: 24px var(--g) 32px; background: var(--page);
  opacity: 0; transition: opacity var(--move) var(--ease-move);
}
.menu.is-open { opacity: 1; }
.menu nav { display: flex; flex-direction: column; }
.menu nav a {
  display: flex; align-items: baseline; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--rule);
  color: var(--ink); font-size: var(--text-title); line-height: var(--text-title-line);
  letter-spacing: var(--text-title-tracking); font-weight: 500;
  opacity: 0; transform: translateY(var(--rise));
  transition: opacity var(--enter) var(--ease-enter), transform var(--enter) var(--ease-enter);
}
.menu.is-open nav a { opacity: 1; transform: none; }
.menu-foot { display: flex; flex-direction: column; gap: 16px; }
.menu-foot p { font-size: var(--text-caption); color: var(--muted); }

@media (max-width: 1119px) {
  .nav-links, .nav-github { display: none; }
  .menu-button { display: inline-flex; }
}
@media (max-width: 520px) {
  .nav-end .button { display: none; }
}

/* --- Index lists: the signature component ------------------------------------------------ */

.index { border-top: 1px solid var(--rule); }
.row { position: relative; border-bottom: 1px solid var(--rule); }
.row > a, .row.card {
  position: relative; display: grid; grid-template-columns: var(--index) 1fr auto; align-items: baseline;
  column-gap: 16px; padding: 18px 0; color: var(--ink);
}
.row-index { transition: color var(--quick) var(--ease-quick); }
.row-name { font-size: var(--text-title); line-height: var(--text-title-line); letter-spacing: var(--text-title-tracking); font-weight: 500; }
.row-meta { text-align: right; }
/* Hover: a soft plate fades in behind the row and reaches past it; the index turns to ink. */
.row > a::before, .row.card::before {
  content: ""; position: absolute; inset: 0 calc(-1 * var(--plate-bleed)); z-index: -1;
  border-radius: var(--radius-plate); background: var(--plate-soft); opacity: 0;
  transition: opacity var(--quick) var(--ease-quick);
}
.row > a, .row.card { z-index: 0; }
.row > a:hover::before, .row.card:hover::before { opacity: 1; }
.row > a:hover .row-index, .row.card:hover .row-index { color: var(--ink); }
.row > a:hover, .row.card:hover { color: var(--ink); }

/* --- Hero -------------------------------------------------------------------------------- */

.hero { padding: calc(var(--nav) + clamp(48px, 9vw, 120px)) 0 clamp(64px, 8vw, 112px); }
.hero-title { max-width: 14ch; margin-bottom: 20px; }
.hero .lede { font-size: var(--text-body); }
.hero-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 32px; }
.hero-index { margin-top: clamp(48px, 7vw, 88px); }
.hero .disclaimer { margin-top: 24px; }

/* --- Sections ------------------------------------------------------------------------------- */

.section { padding: clamp(72px, 10vw, 144px) 0; }
.section-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px 48px; align-items: end; margin-bottom: 48px; }
.section-head .kicker { grid-column: 1 / -1; margin-bottom: 0; }
.section .title { font-size: var(--text-display); line-height: var(--text-display-line); letter-spacing: var(--text-display-tracking); }

.statement {
  max-width: 28ch; font-size: var(--text-title); line-height: 1.15;
  letter-spacing: var(--text-title-tracking); font-weight: 500; text-wrap: balance;
}
.facts { margin-top: 56px; }
.fact, .features li {
  display: grid; grid-template-columns: var(--index) minmax(0, 18rem) minmax(0, 1fr); column-gap: 16px;
  align-items: baseline; padding: 20px 0;
}
.fact h3, .features h3 { font-size: var(--text-heading); line-height: var(--text-heading-line); letter-spacing: var(--text-heading-tracking); }
.fact p, .features p { max-width: var(--measure); color: var(--muted); }

/* Screenshots: no frames, the images themselves. */
.mosaic { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; }
.tile { margin: 0; grid-column: span 2; }
.tile-wide { grid-column: span 4; }
.tile-tall { grid-column: span 2; }
.tile-wide, .tile-tall { grid-row: span 1; }
.zoom { display: block; width: 100%; padding: 0; border: 0; background: var(--plate-soft); border-radius: var(--radius-plate); overflow: hidden; cursor: zoom-in; }
.zoom img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; transition: transform var(--enter) var(--ease-enter); }
.zoom:hover img { transform: scale(1.02); }
figcaption { display: flex; gap: 12px; margin-top: 10px; font-size: var(--text-caption); color: var(--muted); }
figcaption span { font-family: var(--mono); font-size: var(--text-micro); letter-spacing: var(--text-micro-tracking); padding-top: 1px; }

/* Parity: the count, then every subsystem as an index row. */
.parity-hero { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 48px; align-items: end; margin-bottom: 64px; }
.count { font-size: clamp(96px, 16vw, 220px); line-height: 0.85; letter-spacing: -0.05em; font-weight: 500; }
.count .digits span { display: inline-block; }
.count-label { margin-top: 20px; max-width: 32ch; color: var(--muted); }
.parity-copy .title { margin-bottom: 16px; }
.prose { color: var(--ink-soft); max-width: var(--measure); }
.prose > * + * { margin-top: 12px; }
.systems { border-top: 1px solid var(--rule); }
.system {
  display: grid; grid-template-columns: var(--index) minmax(0, 1fr) auto; column-gap: 16px; row-gap: 6px;
  padding: 20px 0; border-bottom: 1px solid var(--rule); position: relative;
}
.system-head { display: contents; }
.system-index { grid-column: 1; grid-row: 1; font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); padding-top: 0.6em; }
.system h3 { grid-column: 2; grid-row: 1; font-size: var(--text-heading); line-height: var(--text-heading-line); letter-spacing: var(--text-heading-tracking); }
.system-state {
  grid-column: 3; grid-row: 1; display: inline-flex; align-items: center; gap: 6px; padding-top: 0.5em;
  font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking);
  text-transform: uppercase; color: var(--muted);
}
.system.is-full .system-state { color: var(--success); }
.check { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 1.6; }
.system-detail { grid-column: 2 / 4; max-width: 72ch; font-size: var(--text-caption); line-height: 1.6; color: var(--muted); }
.gap { color: var(--ink); font-weight: 500; }
.legend { max-width: 80ch; }

/* The launcher: copy and features on the left, the menus on the right. */
.launcher-grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: clamp(32px, 5vw, 80px); align-items: start; }
.launcher-copy .title { margin-bottom: 16px; }
.launcher-copy .features { margin-top: 40px; }
.features li { grid-template-columns: var(--index) minmax(0, 1fr); row-gap: 4px; }
.features li p { grid-column: 2; font-size: var(--text-ui); }
.launcher-actions { margin-top: 32px; }
.screens { position: sticky; top: calc(var(--nav) + 24px); }
.tabs { position: relative; display: inline-flex; padding: 2px; gap: 2px; margin-bottom: 16px; border-radius: var(--radius-pill); background: var(--plate-soft); }
.tabs button {
  position: relative; z-index: 1; height: var(--segment); padding: 0 14px; border: 0; background: none;
  border-radius: var(--radius-pill); color: var(--muted); font: 500 var(--text-label) / 1 var(--font); cursor: pointer;
  transition: color var(--quick) var(--ease-quick);
}
.tabs button:hover { color: var(--ink); }
.tabs button[aria-selected="true"] { color: var(--page); }
.tab-pill { position: absolute; top: 0; left: 0; border-radius: var(--radius-pill); background: var(--ink); transition: transform var(--move) var(--ease-move), width var(--move) var(--ease-move); }
.screen { position: relative; aspect-ratio: 16 / 10; border-radius: var(--radius-plate); overflow: hidden; background: var(--plate-soft); }
.screen-panel { position: absolute; inset: 0; opacity: 0; transition: opacity var(--move) var(--ease-move); }
.screen-panel.is-active { opacity: 1; }
.screen-panel img { width: 100%; height: 100%; object-fit: cover; }
.screen-caption { margin-top: 12px; font-size: var(--text-caption); color: var(--muted); }

/* Patch notes. */
.release-latest { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: 48px; padding-top: 32px; border-top: 1px solid var(--rule); }
.release-head { position: sticky; top: calc(var(--nav) + 24px); align-self: start; display: flex; flex-direction: column; gap: 12px; }
.eyebrow { text-transform: uppercase; }
.release-version { font-size: var(--text-display); line-height: var(--text-display-line); letter-spacing: var(--text-display-tracking); font-weight: 500; }
.release-line { color: var(--muted); max-width: 36ch; }
.release-body { font-size: var(--text-ui); }
.prose h2, .prose h3, .prose h4 { font-size: var(--text-heading); line-height: var(--text-heading-line); color: var(--ink); margin-top: 28px; }
.prose ul, .prose ol { padding-left: 18px; list-style: disc; }
.prose li + li { margin-top: 6px; }
.prose li::marker { color: var(--muted); }
.prose strong { color: var(--ink); font-weight: 500; }
.prose pre { padding: 16px; border-radius: var(--radius-plate); background: var(--plate-soft); overflow-x: auto; }
.prose pre code { background: none; padding: 0; }
.release-older { margin-top: 64px; }
.release-older-title { font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); text-transform: uppercase; margin-bottom: 12px; }
.release { border-top: 1px solid var(--rule); }
.release:last-of-type { border-bottom: 1px solid var(--rule); }
.release summary {
  display: grid; grid-template-columns: minmax(0, 12rem) minmax(0, 1fr) auto; gap: 16px; align-items: baseline;
  padding: 18px 0; cursor: pointer; list-style: none;
}
.release summary::-webkit-details-marker { display: none; }
.release-tag { font-size: var(--text-heading); font-weight: 500; letter-spacing: var(--text-heading-tracking); }
.release-sub { color: var(--muted); font-size: var(--text-ui); }
.release time { font: var(--text-micro) / 1 var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); }
.release[open] summary .release-tag { color: var(--accent); }
.release .prose { padding: 0 0 24px 12rem; margin-left: 16px; font-size: var(--text-ui); }
.release-more { margin-top: 24px; }

/* Community. */
.cards { margin-top: 48px; }
.row.card { grid-template-columns: var(--index) minmax(0, 1fr) minmax(0, 1.4fr) auto; }
.card-title { font-size: var(--text-title); line-height: var(--text-title-line); letter-spacing: var(--text-title-tracking); font-weight: 500; }
.card-text { color: var(--muted); }
.card-arrow { color: var(--muted); transition: transform var(--quick) var(--ease-quick), color var(--quick) var(--ease-quick); }
.card:hover .card-arrow { color: var(--accent); transform: translateX(4px); }
.contributors { margin-top: 96px; }
.contributors-title { font-size: var(--text-heading); line-height: var(--text-heading-line); }
.contributors-text { margin-top: 8px; color: var(--muted); }
.contributors-list { margin-top: 24px; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 0 24px; border-top: 1px solid var(--rule); }
.contributor { display: grid; grid-template-columns: 32px 1fr; column-gap: 12px; align-items: center; padding: 14px 0; border-bottom: 1px solid var(--rule); color: var(--ink); }
.contributor-avatar { grid-row: span 2; width: 32px; height: 32px; border-radius: 50%; background: var(--plate); }
.contributor-name { font-weight: 500; }
.contributor-count { font: var(--text-micro) / 1.4 var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); }
.contributor:hover .contributor-name { color: var(--accent); }

/* --- Footer: small print, then the giant faint wordmark --------------------------------- */

.footer { padding: clamp(72px, 9vw, 120px) 0 0; overflow: hidden; }
.footer-disclaimer { max-width: 24ch; font-size: var(--text-heading); line-height: var(--text-heading-line); letter-spacing: var(--text-heading-tracking); font-weight: 500; }
.footer-cols { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; margin-top: 40px; }
.footer-cols p { font-size: var(--text-caption); line-height: 1.7; color: var(--muted); }
.footer-bar { display: flex; justify-content: space-between; align-items: center; gap: 24px; margin-top: 56px; font-size: var(--text-caption); color: var(--muted); }
.footer-links { display: flex; flex-wrap: wrap; gap: 20px; }
.footer-links a { color: var(--muted); }
.footer-links a:hover { color: var(--ink); }
.footer-word {
  box-sizing: border-box; width: 100%; margin: 24px auto 0; padding: 0 var(--g); max-width: var(--max);
  font-size: var(--text-wordmark); line-height: var(--text-wordmark-line); letter-spacing: var(--text-wordmark-tracking);
  font-weight: var(--text-wordmark-weight); color: var(--plate); white-space: nowrap; user-select: none;
  translate: -0.05em 0.12em;
}
:root[data-theme="dark"] .footer-word { color: var(--plate-soft); }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .footer-word { color: var(--plate-soft); } }

/* --- Lightbox ---------------------------------------------------------------------------- */

.lightbox { width: min(1400px, 94vw); max-height: 92vh; padding: 0; border: 0; border-radius: var(--radius-plate); background: var(--surface); color: var(--ink); }
.lightbox::backdrop { background: color-mix(in srgb, var(--page) 86%, transparent); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.lightbox img { width: 100%; }
.lightbox form { position: absolute; top: 12px; right: 12px; }
.lightbox-caption { padding: 14px 16px; font-size: var(--text-caption); color: var(--muted); }

/* --- 404 --------------------------------------------------------------------------------- */

.lost { min-height: 100vh; display: flex; flex-direction: column; justify-content: space-between; }
.lost .hero { padding-top: clamp(96px, 16vh, 200px); }

/* --- Motion: content arrives with a fade and a short rise, a few tens of ms apart --------- */

.js .reveal, .js .reveal-media {
  opacity: 0; transform: translateY(var(--rise)); filter: blur(4px);
  transition: opacity var(--enter) var(--ease-enter) var(--d, 0ms), transform var(--enter) var(--ease-enter) var(--d, 0ms), filter var(--enter) var(--ease-enter) var(--d, 0ms);
}
.js .reveal.is-visible, .js .reveal-media.is-visible { opacity: 1; transform: none; filter: none; }
.js .systems .system { opacity: 0; transform: translateY(var(--rise)); transition: opacity var(--enter) var(--ease-enter) var(--d, 0ms), transform var(--enter) var(--ease-enter) var(--d, 0ms); }
.js .systems.is-visible .system { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .js .reveal, .js .reveal-media, .js .systems .system { transform: none; filter: none; transition: opacity 200ms linear; }
  .menu nav a { transform: none; }
}

/* --- Touch: every target at least 44 px high ------------------------------------------- */

@media (pointer: coarse) {
  .button, .button.large, .button.small, .tabs button { height: 44px; }
  .nav-mark, .theme-toggle, .nav-github { min-height: 44px; }
  .link-arrow, .footer-links a { display: inline-flex; align-items: center; min-height: 44px; }
}

/* --- Narrow screens ------------------------------------------------------------------------ */

@media (max-width: 900px) {
  .section-head, .parity-hero, .launcher-grid, .release-latest { grid-template-columns: minmax(0, 1fr); }
  .section-head { gap: 16px; }
  .screens, .release-head { position: static; }
  .fact { grid-template-columns: var(--index) minmax(0, 1fr); row-gap: 6px; }
  .fact p { grid-column: 2; }
  .mosaic { grid-template-columns: minmax(0, 1fr); }
  .tile, .tile-wide, .tile-tall { grid-column: auto; }
  .row.card { grid-template-columns: var(--index) minmax(0, 1fr) auto; row-gap: 4px; }
  .card-text { grid-column: 2; grid-row: 2; font-size: var(--text-ui); }
  .card-arrow { grid-row: 1; grid-column: 3; }
  .release summary { grid-template-columns: minmax(0, 1fr) auto; }
  .release-sub { grid-column: 1 / -1; grid-row: 2; }
  .release .prose { padding-left: 0; margin-left: 0; }
  .footer-cols { grid-template-columns: minmax(0, 1fr); }
  .footer-bar { flex-direction: column; align-items: flex-start; }
  .system { grid-template-columns: var(--index) minmax(0, 1fr); }
  .system-state { grid-column: 2; grid-row: 2; padding-top: 0; }
  .system-detail { grid-column: 2; }
  .row > a { grid-template-columns: 28px 1fr auto; padding: 16px 0; }
  :root { --index: 28px; }
}

/* The privacy page: one long read under the hero type. */
.privacy h1 { margin-bottom: 16px; }
.privacy .prose { margin: 40px 0; }
.privacy .disclaimer { margin-top: 32px; }
