a13e6b40ce
/docs has a left navigation and eleven pages written for players first, then hosters, then contributors: what Horizon is, install, settings, multiplayer, logs and bug reports, hosting (the launcher's Servers page and the command line), modpacks, mods and data packs, performance, contributing and the FAQ. /server redirects to /docs/hosting. The build checks every link between the pages and every image. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
502 lines
30 KiB
CSS
502 lines
30 KiB
CSS
/* 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; }
|
|
}
|