e936e412ba
playhorizon.dev/hub is the public entry point to what is happening on Horizon. Overview: where Horizon is, the 3 to 5 things in focus, what is next, what shipped last, how to help. Roadmap: Now / Next / Later / Help wanted / Shipped, filtered by area, every item with its issues and pull requests in their GitHub state (baked at build, refreshed in the browser). Contribute: good first tasks, claiming, connecting an agent to Kira, the rules. A Simple / Technical switch swaps every item's plain and dev text and is remembered. /roadmap redirects to the Roadmap tab. tools/roadmap.py build now also writes website/data/roadmap.json, which the site reads and serves at /hub/roadmap.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
790 lines
49 KiB
CSS
790 lines
49 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
|
|
launcher's Blocks palettes, type, spacing and motion. The base below lays out the page; the
|
|
"Blocks" section at the end gives it the launcher's blocky, Minecraft-like look. */
|
|
|
|
@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); max-width: 100vw;
|
|
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);
|
|
transition: background-color var(--move) var(--ease-move), box-shadow var(--move) var(--ease-move);
|
|
}
|
|
.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; white-space: nowrap; }
|
|
.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; max-width: 100vw;
|
|
justify-content: space-between; gap: 24px; overflow-y: auto; 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; flex-shrink: 0; }
|
|
.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; flex-shrink: 0; }
|
|
.menu-foot p { font-size: var(--text-caption); color: var(--muted); }
|
|
|
|
@media (max-width: 1279px) {
|
|
.nav-links, .nav-github { display: none; }
|
|
.menu-button { display: inline-flex; }
|
|
.nav-end { margin-left: auto; }
|
|
}
|
|
@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. */
|
|
.eyebrow { text-transform: uppercase; }
|
|
.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 { 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 { grid-template-columns: minmax(0, 1fr); }
|
|
.section-head { gap: 16px; }
|
|
.screens { 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 {
|
|
display: grid; grid-template-columns: 248px minmax(0, 1fr); gap: clamp(32px, 6vw, 96px);
|
|
max-width: var(--max); margin: 0 auto; padding: calc(var(--nav) + 48px) var(--g) 0; align-items: start;
|
|
}
|
|
.docs-nav-wrap { position: sticky; top: calc(var(--nav) + 24px); max-height: calc(100vh - var(--nav) - 48px); 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: calc(var(--nav) + 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; }
|
|
}
|
|
@media (pointer: coarse) {
|
|
.docs-nav li a, .docs-toc a { display: flex; align-items: center; min-height: 44px; }
|
|
}
|
|
|
|
/* --- Blocks: the launcher's look on the page (docs/design-system.md, "Blocks") -------------
|
|
Pixel type for headings and controls, square panels with a dark outline, a light bevel on top
|
|
and a darker lip below, the violet face for the main action, sunk wells, a stone texture
|
|
behind the page and Horizon's pixel landscape behind the hero. The art is drawn in code
|
|
(scripts/art.mjs, like launcher/src/art.rs); nothing in it comes from Minecraft. */
|
|
|
|
@font-face { font-family: "Pixelify Sans"; src: url("/fonts/PixelifySans-Medium.woff2") format("woff2"); font-weight: 500; font-display: swap; }
|
|
@font-face { font-family: "Pixelify Sans"; src: url("/fonts/PixelifySans-SemiBold.woff2") format("woff2"); font-weight: 600; font-display: swap; }
|
|
@font-face { font-family: "Pixelify Sans"; src: url("/fonts/PixelifySans-Bold.woff2") format("woff2"); font-weight: 700; font-display: swap; }
|
|
|
|
:root {
|
|
--stone: url("/media/stone-light.png");
|
|
--scene: url("/media/scene-light.png");
|
|
--sky: #8d7fd8;
|
|
--panel-edges: inset 0 var(--block-bevel) 0 var(--bevel), inset 0 calc(-1 * var(--block-bevel)) 0 var(--lip);
|
|
--radius: 0px; --radius-plate: 0px; --radius-pill: 0px;
|
|
}
|
|
:root[data-theme="dark"] { --stone: url("/media/stone-dark.png"); --scene: url("/media/scene-dark.png"); --sky: #0a0f2c; }
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([data-theme="light"]) { --stone: url("/media/stone-dark.png"); --scene: url("/media/scene-dark.png"); --sky: #0a0f2c; }
|
|
}
|
|
|
|
/* The stone: 64 texels of the page colour in close shades, each texel 4 px. */
|
|
body { position: relative; isolation: isolate; }
|
|
body::before {
|
|
content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
|
|
background: var(--stone) 0 0 / 256px 256px repeat; image-rendering: pixelated;
|
|
}
|
|
|
|
/* Pixel type for what names and what you act on; paragraphs stay in Geist. */
|
|
.display, .title, .statement, .row-name, .card-title, .release-tag, .count,
|
|
.fact h3, .features h3, .system h3, .contributors-title, .footer-disclaimer, .footer-word,
|
|
.nav-mark, .docs-prose h2, .docs-prose h3, .prose h2, .prose h3, .prose h4, .menu nav a {
|
|
font-family: var(--pixel); font-weight: 600; letter-spacing: 0;
|
|
}
|
|
.display, .count, .footer-word { font-weight: 700; }
|
|
.nav-mark { font-size: 18px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; }
|
|
code { border-radius: 0; background: var(--well); box-shadow: 0 0 0 1px var(--outline); }
|
|
|
|
/* Buttons: blocks with an outline, a bevel and a lip; they sink a pixel when pressed. */
|
|
.button {
|
|
border: var(--block-outline) solid var(--outline); border-radius: 0;
|
|
font: 500 var(--text-ui) / 1 var(--pixel);
|
|
box-shadow: inset 0 var(--block-bevel) 0 var(--button-bevel), inset 0 calc(-1 * var(--block-lip)) 0 var(--lip);
|
|
padding-bottom: 2px;
|
|
}
|
|
.button.large { font-size: 18px; }
|
|
.button.primary { background: var(--face); color: var(--on-face); box-shadow: inset 0 var(--block-bevel) 0 var(--face-bevel), inset 0 calc(-1 * var(--block-lip)) 0 var(--face-lip); }
|
|
.button.primary:hover { opacity: 1; filter: brightness(1.08); }
|
|
.button.secondary { background: var(--button); }
|
|
.button.secondary:hover { background: var(--button); filter: brightness(1.06); }
|
|
.button.ghost { border-color: transparent; box-shadow: none; }
|
|
.button:active { opacity: 1; transform: translateY(1px); box-shadow: inset 0 var(--block-bevel) 0 var(--lip); }
|
|
:focus-visible { border-radius: 0; }
|
|
|
|
/* The top bar: the sidebar colour with an outline under it, tabs with an accent underline. */
|
|
.nav { background: var(--side); -webkit-backdrop-filter: none; backdrop-filter: none; box-shadow: 0 var(--block-outline) 0 var(--outline); }
|
|
.nav-links a, .nav-github, .theme-toggle { border-radius: 0; font-family: var(--pixel); font-weight: 500; font-size: 15px; }
|
|
.nav-links a:hover, .nav-github:hover, .theme-toggle:hover { background: var(--raised); }
|
|
.nav-links a[aria-current] { background: var(--raised); box-shadow: inset 0 -3px 0 var(--accent); }
|
|
.theme-toggle { text-transform: none; letter-spacing: 0; }
|
|
.menu { background: var(--side); }
|
|
.menu nav a { border-bottom: 0; }
|
|
|
|
/* Lists become stacks of panels. */
|
|
.index, .systems, .contributors-list { border-top: 0; display: grid; gap: 8px; }
|
|
.row, .system, .release, .release:last-of-type, .contributor { border-bottom: 0; border-top: 0; }
|
|
.row > a, .row.card, .fact.row, .features li, .system, .release, .contributor, .docs-pager a {
|
|
background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges);
|
|
border-radius: 0;
|
|
}
|
|
.row > a, .row.card, .fact.row, .features li, .system { padding-left: 20px; padding-right: 20px; }
|
|
.row > a::before, .row.card::before { display: none; }
|
|
.row > a:hover, .row.card:hover, .contributor:hover, .docs-pager a:hover { background: var(--raised); }
|
|
.row > a:hover .row-index { color: var(--accent); }
|
|
.row-name { font-size: clamp(20px, 2.2vw, 28px); }
|
|
.release { padding: 0 20px; }
|
|
.release + .release { margin-top: 8px; }
|
|
.release .prose { padding-left: 12rem; }
|
|
.contributor { padding: 12px 14px; }
|
|
.contributors-list { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; }
|
|
.contributor-avatar { border-radius: 0; box-shadow: 0 0 0 2px var(--outline); image-rendering: pixelated; }
|
|
.system.is-full .system-state { color: var(--success); }
|
|
|
|
/* Screenshots and the launcher's screens: square, outlined. */
|
|
.zoom, .screen, .lightbox, .prose pre, .docs-prose figure img { border-radius: 0; box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
.tabs { border-radius: 0; background: var(--well); box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
.tabs button { border-radius: 0; font-family: var(--pixel); font-weight: 500; font-size: 15px; }
|
|
.tabs button[aria-selected="true"] { color: var(--on-face); }
|
|
.tab-pill { border-radius: 0; background: var(--face); box-shadow: inset 0 var(--block-bevel) 0 var(--face-bevel), inset 0 calc(-1 * var(--block-bevel)) 0 var(--face-lip); }
|
|
|
|
/* The hero: Horizon's landscape under a veil of the page colour, the words on the left. */
|
|
.hero {
|
|
position: relative; isolation: isolate; overflow: hidden;
|
|
background: var(--scene) 70% 100% / clamp(1200px, 135vw, 2400px) auto no-repeat, var(--sky); image-rendering: pixelated;
|
|
border-bottom: var(--block-outline) solid var(--outline);
|
|
}
|
|
.hero::before {
|
|
content: ""; position: absolute; inset: 0; z-index: -1;
|
|
background:
|
|
linear-gradient(90deg, color-mix(in srgb, var(--page) 92%, transparent) 0%, color-mix(in srgb, var(--page) 78%, transparent) 45%, color-mix(in srgb, var(--page) 0%, transparent) 78%),
|
|
linear-gradient(180deg, color-mix(in srgb, var(--page) 0%, transparent) 55%, color-mix(in srgb, var(--page) 70%, transparent) 100%);
|
|
}
|
|
.hero .kicker span, .hero .kicker { color: var(--ink-soft); }
|
|
.hero .lede { color: var(--ink-soft); }
|
|
.hero { padding-bottom: clamp(160px, 18vw, 280px); }
|
|
.hero-after { padding-top: 40px; }
|
|
.hero-after .hero-index { margin-top: 0; max-width: 860px; }
|
|
.hero-after .disclaimer { margin-top: 24px; }
|
|
@media (max-width: 900px) {
|
|
.hero::before { background: color-mix(in srgb, var(--page) 84%, transparent); }
|
|
}
|
|
|
|
/* Documentation. */
|
|
.docs-nav li a { border-radius: 0; }
|
|
.docs-nav li a[aria-current] { background: var(--raised); box-shadow: inset 4px 0 0 var(--accent); }
|
|
.docs-toc a { border-radius: 0; background: var(--button); box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
.docs-pager a { box-shadow: var(--panel-edges); }
|
|
.docs-prose h2 { border-top: var(--block-outline) solid var(--outline); }
|
|
.docs-prose blockquote { border-left: 4px solid var(--accent); background: var(--panel); padding: 10px 16px; box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
|
|
/* The footer: the giant wordmark in pixels. */
|
|
.footer { background: var(--side); border-top: var(--block-outline) solid var(--outline); margin-top: 48px; }
|
|
.footer-word { color: var(--raised); letter-spacing: 0.02em; }
|
|
:root[data-theme="dark"] .footer-word { color: var(--panel); }
|
|
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .footer-word { color: var(--panel); } }
|
|
|
|
/* --- Releases and Benchmarks pages, and the home page's "Recently added" ------------------ */
|
|
|
|
/* Pixelify Sans' "fi" ligature draws as "A" ("8 Axes"): no common ligatures anywhere. */
|
|
:root { font-variant-ligatures: no-common-ligatures; }
|
|
|
|
.page-main { padding-top: calc(var(--nav) + clamp(40px, 6vw, 80px)); }
|
|
.page-title { max-width: 18ch; margin-bottom: 20px; }
|
|
.page-main > .container > .lede { font-size: var(--text-body); }
|
|
.page-main .disclaimer { margin-top: 48px; }
|
|
|
|
/* Release and source badges: small square tags. */
|
|
.badge {
|
|
display: inline-flex; align-items: center; height: 22px; padding: 0 8px; margin-right: 10px; vertical-align: 2px;
|
|
font: 500 12px / 1 var(--pixel); letter-spacing: 0.02em; text-transform: uppercase; white-space: nowrap;
|
|
border: var(--block-outline) solid var(--outline); background: var(--well); color: var(--ink-soft);
|
|
}
|
|
.badge-game { background: color-mix(in srgb, var(--success) 22%, var(--panel)); color: var(--ink); }
|
|
.badge-launcher { background: color-mix(in srgb, var(--accent) 20%, var(--panel)); color: var(--ink); }
|
|
.badge-us { background: color-mix(in srgb, var(--accent) 20%, var(--panel)); color: var(--ink); }
|
|
.badge-players { background: color-mix(in srgb, var(--success) 22%, var(--panel)); color: var(--ink); }
|
|
.badge-estimate { background: color-mix(in srgb, var(--warn) 24%, var(--panel)); color: var(--ink); }
|
|
|
|
/* Home: the newest releases on a line each, then what they added. */
|
|
.recent-list .row > a { grid-template-columns: 8.5rem minmax(0, 13rem) minmax(0, 1fr) auto; align-items: baseline; }
|
|
.recent-line { color: var(--muted); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.recent-list .row-name { font-size: clamp(18px, 1.8vw, 22px); }
|
|
.recent-list .badge { margin-right: 0; }
|
|
.recent-picks { margin-top: 32px; }
|
|
.recent-picks .eyebrow { margin-bottom: 12px; }
|
|
.highlights { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
|
|
.highlight {
|
|
display: flex; flex-direction: column; justify-content: space-between; gap: 16px; padding: 18px 20px;
|
|
background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges);
|
|
}
|
|
.highlight p { color: var(--ink); }
|
|
.highlight-from { font: var(--text-micro) / 1 var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); }
|
|
.highlight-from:hover { color: var(--accent); }
|
|
|
|
/* Releases: a filter, then every release as a panel that opens. */
|
|
.release-filter { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 32px; }
|
|
.release-filter .button[aria-pressed="true"], .hub-detail .button[aria-pressed="true"] { background: var(--face); color: var(--on-face); box-shadow: inset 0 var(--block-bevel) 0 var(--face-bevel), inset 0 calc(-1 * var(--block-lip)) 0 var(--face-lip); }
|
|
.release-count { margin: 16px 0 12px; }
|
|
.release-list { display: grid; gap: 8px; }
|
|
.release-list .release + .release { margin-top: 0; }
|
|
.release-entry summary { grid-template-columns: minmax(0, 11rem) minmax(0, 1fr) auto; }
|
|
.release-entry .release-sub { display: flex; align-items: baseline; flex-wrap: wrap; row-gap: 4px; }
|
|
.release-detail { padding: 0 0 24px 11rem; margin-left: 16px; display: grid; gap: 20px; max-width: calc(11rem + 16px + var(--measure) + 120px); }
|
|
.release-detail .prose { padding: 0; margin: 0; font-size: var(--text-ui); max-width: none; }
|
|
.release-overview { padding: 16px 18px; background: var(--well); box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
.release-counts { font-family: var(--pixel); font-weight: 600; color: var(--ink); margin-bottom: 8px; }
|
|
.release-overview ul { list-style: square; padding-left: 18px; color: var(--ink-soft); font-size: var(--text-ui); }
|
|
.release-overview li + li { margin-top: 4px; }
|
|
.release-downloads ul { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 8px; margin-top: 8px; }
|
|
.release-downloads li { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px; background: var(--button); box-shadow: 0 0 0 var(--block-outline) var(--outline); }
|
|
.release-downloads li a { font-weight: 500; }
|
|
.release-downloads li span { font: var(--text-micro) / 1.4 var(--mono); color: var(--muted); overflow-wrap: anywhere; }
|
|
.release-github { font-size: var(--text-caption); }
|
|
.release-entry:target { box-shadow: var(--panel-edges), 0 0 0 3px var(--accent); }
|
|
|
|
/* Benchmarks. */
|
|
.bench-section { margin-top: clamp(64px, 8vw, 112px); }
|
|
.bench-section > .title { margin-bottom: 16px; }
|
|
.bench-section > .lede { margin-bottom: 32px; }
|
|
.machines { display: grid; grid-template-columns: minmax(0, 1fr); gap: 24px; }
|
|
.machine { min-width: 0; padding: 24px; background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges); }
|
|
.machine-head { display: grid; gap: 10px; margin-bottom: 20px; }
|
|
.machine-name { font-family: var(--pixel); font-weight: 600; font-size: var(--text-title); line-height: var(--text-title-line); }
|
|
.machine-facts { display: flex; flex-wrap: wrap; gap: 6px 28px; margin: 0; }
|
|
.machine-facts div { display: flex; gap: 8px; min-width: 0; }
|
|
.machine-facts dt { font: var(--text-micro) / 1.6 var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); }
|
|
.machine-facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; font-size: var(--text-caption); color: var(--ink-soft); }
|
|
.machine-note { font-size: var(--text-caption); color: var(--muted); max-width: 90ch; }
|
|
/* relative: the screen-reader-only labels inside are absolute and would escape the scroll box otherwise. */
|
|
.table-wrap { position: relative; overflow-x: auto; }
|
|
.bench-table { width: 100%; border-collapse: collapse; font-size: var(--text-ui); }
|
|
.bench-table th, .bench-table td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--rule); vertical-align: baseline; }
|
|
.bench-table thead th { font: var(--text-micro) / 1.4 var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); font-weight: 400; }
|
|
.bench-table thead tr:first-child th { color: var(--ink); }
|
|
.bench-table tbody th { font-weight: 500; color: var(--ink); }
|
|
.bench-table td.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
.bench-table td.wins { color: var(--ink); font-weight: 600; }
|
|
.bench-table td.vs { font-size: var(--text-caption); white-space: nowrap; }
|
|
.vs-horizon { color: var(--success); }
|
|
.vs-java { color: var(--danger); }
|
|
.vs-tie, .vs-none { color: var(--muted); }
|
|
.capped { font: var(--text-micro) / 1 var(--mono); color: var(--warn); cursor: help; }
|
|
.metric-hint { display: block; font: var(--text-micro) / 1.4 var(--mono); color: var(--muted); font-weight: 400; }
|
|
.java-wins { margin-top: 16px; font-size: var(--text-caption); color: var(--ink-soft); }
|
|
.picker { display: flex; flex-wrap: wrap; gap: 16px 24px; align-items: end; padding: 20px; background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges); }
|
|
.picker label { display: grid; gap: 6px; }
|
|
.picker label > span, .picker legend { font: var(--text-micro) / 1.4 var(--mono); letter-spacing: var(--text-micro-tracking); text-transform: uppercase; color: var(--muted); }
|
|
.picker select {
|
|
min-width: min(320px, 80vw); height: var(--control); padding: 0 10px; font: inherit; font-size: var(--text-ui); color: var(--ink);
|
|
background: var(--well); border: var(--block-outline) solid var(--outline); border-radius: 0;
|
|
}
|
|
.picker-rd { display: flex; gap: 16px; align-items: center; border: 0; padding: 0; margin: 0; }
|
|
.picker-rd legend { margin-bottom: 6px; }
|
|
.picker-rd label { display: inline-flex; align-items: center; gap: 6px; font-family: var(--pixel); font-weight: 500; height: var(--control); }
|
|
.picker-rd input { accent-color: var(--accent); width: 18px; height: 18px; }
|
|
.pick-result { margin-top: 16px; padding: 20px; background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges); }
|
|
.pick-head { margin-bottom: 12px; font-size: var(--text-caption); color: var(--ink-soft); line-height: 1.8; }
|
|
.pick-result .meta { margin-top: 12px; }
|
|
.pick-notes { margin: 12px 0 0; padding-left: 20px; font-size: var(--text-caption); color: var(--ink-soft); line-height: 1.6; }
|
|
.players-hardware th[scope="rowgroup"] { vertical-align: top; }
|
|
.empty { color: var(--muted); }
|
|
.prose-section .prose { max-width: 80ch; }
|
|
.spec-table { margin-top: 24px; }
|
|
.spec-table summary { cursor: pointer; font-family: var(--pixel); font-weight: 600; }
|
|
.spec-table .bench-table { margin-top: 16px; max-width: 760px; }
|
|
|
|
@media (max-width: 900px) {
|
|
.recent-list .row > a { grid-template-columns: minmax(0, 1fr) auto; row-gap: 4px; }
|
|
.recent-list .row-index { grid-column: 1; grid-row: 1; }
|
|
.recent-list .row-name { grid-column: 1; grid-row: 2; }
|
|
.recent-line { grid-column: 1 / -1; grid-row: 3; white-space: normal; }
|
|
.recent-list .row-meta { grid-column: 2; grid-row: 1; }
|
|
.highlights { grid-template-columns: minmax(0, 1fr); }
|
|
.release-entry summary { grid-template-columns: minmax(0, 1fr) auto; }
|
|
.release-detail { padding-left: 0; margin-left: 0; }
|
|
.machine { padding: 16px; }
|
|
}
|
|
|
|
/* --- The hub (/hub): tabs, the Simple / Technical switch, roadmap items as panels ------------------- */
|
|
|
|
.hub-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px; margin-top: 32px; }
|
|
.hub-tabs { margin-bottom: 0; }
|
|
.hub-detail { display: flex; gap: 8px; }
|
|
/* A link to a tab (/hub#roadmap) lands with the tabs in view under the top bar. */
|
|
.hub-panel { margin-top: 40px; scroll-margin-top: calc(var(--nav) + 120px); }
|
|
.js .hub-panel:not(.is-active) { display: none; }
|
|
/* Simple shows `plain`, Technical shows `dev`; without the switch (no JavaScript) Simple reads. */
|
|
.hub .hub-dev { display: none; }
|
|
:root[data-detail="dev"] .hub .hub-dev { display: block; }
|
|
:root[data-detail="dev"] .hub .hub-plain { display: none; }
|
|
.hub-lead { max-width: 60ch; font-size: var(--text-heading); line-height: var(--text-heading-line); color: var(--ink); }
|
|
.hub-block { margin-top: 56px; }
|
|
.hub-block > .title { margin-bottom: 16px; }
|
|
.hub-intro { margin-bottom: 16px; color: var(--ink-soft); max-width: var(--measure); }
|
|
.hub-rows .row > a { grid-template-columns: var(--index) minmax(0, 1fr) auto; align-items: baseline; }
|
|
.hub-row-body { display: grid; gap: 4px; min-width: 0; }
|
|
.hub-row-title { font-size: clamp(18px, 1.8vw, 22px); font-weight: 500; color: var(--ink); }
|
|
.hub-row-body .hub-plain, .hub-row-body .hub-dev { color: var(--ink-soft); font-size: var(--text-ui); max-width: 80ch; }
|
|
.hub-rows .row-meta { max-width: 16rem; }
|
|
.hub-section { margin-top: 48px; }
|
|
.hub-section-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 20px; }
|
|
.hub-items { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr)); gap: 8px; margin-top: 16px; }
|
|
.hub-item {
|
|
display: flex; flex-direction: column; gap: 10px; padding: 18px 20px; scroll-margin-top: calc(var(--nav) + 24px);
|
|
background: var(--panel); border: var(--block-outline) solid var(--outline); box-shadow: var(--panel-edges);
|
|
}
|
|
.hub-item:target { box-shadow: var(--panel-edges), 0 0 0 3px var(--accent); }
|
|
.hub-item-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
.hub-item-meta .badge { margin-right: 0; }
|
|
.hub-ongoing { font: var(--text-micro) / 1 var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--muted); }
|
|
.hub-item-title { font-size: var(--text-heading); line-height: var(--text-heading-line); }
|
|
.hub-item .hub-plain, .hub-item .hub-dev { font-size: var(--text-ui); color: var(--ink-soft); }
|
|
.hub-progress { font: var(--text-micro) / 1.4 var(--mono); letter-spacing: var(--text-micro-tracking); color: var(--ink); }
|
|
.hub-links { display: flex; flex-wrap: wrap; gap: 6px; margin-top: auto; padding-top: 4px; }
|
|
.hub-link {
|
|
display: inline-flex; gap: 6px; align-items: baseline; padding: 3px 7px; font: var(--text-micro) / 1.3 var(--mono);
|
|
color: var(--ink-soft); background: var(--well); box-shadow: 0 0 0 var(--block-outline) var(--outline);
|
|
}
|
|
.hub-link span { color: var(--muted); }
|
|
.hub-link:hover { color: var(--accent); }
|
|
.hub-link.is-merged { background: color-mix(in srgb, var(--success) 18%, var(--well)); }
|
|
.hub-link.is-in-review { background: color-mix(in srgb, var(--accent) 18%, var(--well)); }
|
|
.hub-link.is-in-progress { background: color-mix(in srgb, var(--warn) 22%, var(--well)); }
|
|
.hub-link.is-merged span, .hub-link.is-in-review span, .hub-link.is-in-progress span { color: var(--ink); }
|
|
.hub-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); gap: 8px; }
|
|
.hub-cards .highlight { justify-content: flex-start; }
|
|
.hub-cards h3 { font-size: var(--text-heading); line-height: var(--text-heading-line); }
|
|
.hub-cards p { color: var(--ink-soft); font-size: var(--text-ui); }
|
|
.hub-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
|
|
.hub-cards .hub-actions { margin-top: auto; }
|
|
.hub-rules { list-style: decimal; padding-left: 20px; max-width: var(--measure); }
|
|
.hub-rules li + li { margin-top: 10px; }
|
|
.hub-rules li::marker { color: var(--muted); font-family: var(--mono); }
|
|
.hub-source { margin-top: 40px; max-width: var(--measure); }
|
|
@media (max-width: 720px) {
|
|
.hub-rows .row > a { grid-template-columns: var(--index) minmax(0, 1fr); }
|
|
.hub-rows .row-meta { grid-column: 2; text-align: left; }
|
|
}
|