/* 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; } /* --- Documentation (/docs): a left navigation and one page at a time --------------------- */ .docs-bar { position: sticky; top: 0; z-index: 20; height: 56px; 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); } .docs-bar-inner { display: flex; align-items: center; gap: 16px; height: 100%; max-width: var(--max); margin: 0 auto; padding: 0 var(--g); } .docs-bar-title { padding-left: 16px; border-left: 1px solid var(--rule); color: var(--muted); font-size: var(--text-label); } .docs-bar-end { margin-left: auto; display: flex; align-items: center; gap: 16px; } .docs-bar-link { color: var(--muted); font-size: var(--text-label); } .docs-bar-link:hover { color: var(--ink); } .docs { display: grid; grid-template-columns: 248px minmax(0, 1fr); gap: clamp(32px, 6vw, 96px); max-width: var(--max); margin: 0 auto; padding: 48px var(--g) 0; align-items: start; } .docs-nav-wrap { position: sticky; top: 80px; max-height: calc(100vh - 104px); overflow-y: auto; padding-bottom: 24px; } .docs-nav-wrap summary { display: none; } .docs-nav-group { margin: 28px 0 8px; font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); } .docs-nav-group:first-child { margin-top: 0; } .docs-nav li a { display: block; padding: 6px 12px; margin-left: -12px; border-radius: var(--radius); color: var(--ink-soft); font-size: var(--text-ui); } .docs-nav li a:hover { background: var(--plate-soft); color: var(--ink); } .docs-nav li a[aria-current] { background: var(--plate-soft); color: var(--ink); font-weight: 500; } .docs-main { min-width: 0; padding-bottom: 48px; } .docs-main .title { margin-bottom: 16px; } .docs-main .lede { max-width: 64ch; font-size: var(--text-heading); line-height: 1.45; } .docs-toc { margin-top: 28px; max-width: 72ch; } .docs-toc p { font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); margin-bottom: 8px; } .docs-toc ul { display: flex; flex-wrap: wrap; gap: 6px; } .docs-toc a { display: block; padding: 4px 12px; border-radius: var(--radius-pill); background: var(--plate-soft); color: var(--ink-soft); font-size: var(--text-label); } .docs-toc a:hover { background: var(--plate); color: var(--ink); } .docs-prose { max-width: 72ch; margin-top: 40px; font-size: var(--text-body); } .docs-prose > * + * { margin-top: 14px; } .docs-prose h2 { margin-top: 56px; padding-top: 24px; border-top: 1px solid var(--rule); font-size: clamp(24px, 2.4vw, 30px); line-height: 1.2; letter-spacing: var(--text-title-tracking); scroll-margin-top: 80px; } .docs-prose h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; } .docs-prose h3 { margin-top: 32px; scroll-margin-top: 80px; } .docs-prose ol { list-style: decimal; } .docs-prose pre { font: 0.86em/1.6 var(--mono); } .docs-prose blockquote { padding: 2px 0 2px 16px; border-left: 2px solid var(--accent); color: var(--ink-soft); } .docs-prose blockquote > * + * { margin-top: 8px; } .docs-prose figure { margin: 28px 0; } .docs-prose figure img { width: 100%; border-radius: var(--radius-plate); box-shadow: 0 0 0 1px var(--rule); } .docs-prose figcaption { margin-top: 10px; font-size: var(--text-caption); color: var(--muted); } .docs-pager { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; max-width: 72ch; margin-top: 56px; } .docs-pager a { display: flex; flex-direction: column; gap: 2px; padding: 14px 16px; border-radius: var(--radius-plate); box-shadow: 0 0 0 1px var(--rule); color: var(--ink); font-weight: 500; } .docs-pager a:hover { background: var(--plate-soft); color: var(--ink); } .docs-pager a span { font: var(--text-micro) / var(--text-micro-line) var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); font-weight: 400; } .docs-pager-next { grid-column: 2; text-align: right; } .docs-edit { margin-top: 32px; font-size: var(--text-caption); color: var(--muted); } .docs-edit a { color: inherit; text-decoration: underline; text-decoration-color: var(--rule); text-underline-offset: 3px; } .docs-main .disclaimer { margin-top: 24px; } @media (max-width: 900px) { .docs { grid-template-columns: minmax(0, 1fr); gap: 0; padding-top: 12px; } .docs-nav-wrap { position: static; max-height: none; overflow: visible; margin-bottom: 24px; border-bottom: 1px solid var(--rule); } .docs-nav-wrap summary { display: flex; align-items: center; min-height: 44px; cursor: pointer; font-weight: 500; list-style: none; } .docs-nav-wrap summary::-webkit-details-marker { display: none; } .docs-nav-wrap summary::after { content: "+"; margin-left: auto; color: var(--muted); } .docs-nav-wrap[open] summary::after { content: "\2212"; } .docs-pager { grid-template-columns: minmax(0, 1fr); } .docs-pager-next { grid-column: 1; } .docs-bar-link { display: none; } } @media (pointer: coarse) { .docs-nav li a, .docs-toc a, .docs-bar-title, .docs-bar-link { display: flex; align-items: center; min-height: 44px; } }