| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| /* Website color, radius and surface tokens. */ | |
| :root { | |
| color-scheme: light dark; | |
| --background: light-dark(oklch(1 0 0), oklch(0.205 0.004 286)); | |
| --foreground: light-dark(oklch(0.17 0.005 286), oklch(0.95 0.004 286)); | |
| --accent: light-dark(oklch(0.7 0.135 250), oklch(0.74 0.15 250)); | |
| --success: light-dark(oklch(0.5 0.17 145), oklch(0.6 0.17 145)); | |
| --warning: light-dark(oklch(0.5 0.18 55), oklch(0.66 0.18 55)); | |
| --surface-sunken: light-dark( | |
| oklch(from var(--background) calc(l - 0.055) c h), | |
| oklch(from var(--background) calc(l - 0.065) c h) | |
| ); | |
| --surface-base: oklch(from var(--background) calc(l - 0.025) c h); | |
| --surface-raised: var(--background); | |
| --muted-foreground: color-mix(in oklch, var(--foreground) 68%, var(--background)); | |
| --accent-solid: light-dark( | |
| oklch(from var(--accent) 0.48 c h), | |
| oklch(from var(--accent) 0.76 c h) | |
| ); | |
| --success-text: color-mix(in oklab, var(--success) 50%, var(--foreground)); | |
| --warning-text: color-mix(in oklab, var(--warning) 50%, var(--foreground)); | |
| --border: oklch(from var(--foreground) l c h / 0.1); | |
| --radius-page: 28px; | |
| --radius-container: 12px; | |
| --radius-element: 8px; | |
| --tint: color-mix(in srgb, var(--accent-solid) 9%, var(--surface-raised)); | |
| --page: light-dark(var(--surface-raised), var(--surface-base)); | |
| --plain: light-dark(var(--surface-base), var(--surface-raised)); | |
| --font-family-body: | |
| "Geist Variable", -apple-system, BlinkMacSystemFont, system-ui, "Segoe UI", Roboto, | |
| "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", "Noto Sans SC", | |
| sans-serif; | |
| --font-family-code: | |
| "Geist Mono Variable", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; | |
| } | |
| :root[data-theme="light"] { | |
| color-scheme: light; | |
| } | |
| :root[data-theme="dark"] { | |
| color-scheme: dark; | |
| } | |
| html { | |
| margin: 0; | |
| background: var(--page); | |
| color: var(--foreground); | |
| font-family: var(--font-family-body); | |
| font-size: 14px; | |
| line-height: 1.5; | |
| -webkit-font-smoothing: antialiased; | |
| } | |
| body { | |
| margin: 0; | |
| } | |
| a { | |
| color: inherit; | |
| text-decoration: none; | |
| } | |
| code { | |
| font-family: var(--font-family-code); | |
| } | |
| .wrap { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| padding: 0 32px; | |
| } | |
| :focus-visible { | |
| outline: 2px solid var(--accent-solid); | |
| outline-offset: 2px; | |
| } | |
| /* Top navigation */ | |
| .nav { | |
| height: 60px; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| } | |
| .nav > * { | |
| flex-shrink: 0; | |
| } | |
| .nav .brand { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| font-weight: 600; | |
| font-size: 15px; | |
| margin-right: 20px; | |
| white-space: nowrap; | |
| } | |
| .nav .brand img { | |
| width: 26px; | |
| height: 26px; | |
| border-radius: var(--radius-element); | |
| } | |
| .nav .brand small { | |
| font-weight: 500; | |
| font-size: 11px; | |
| color: var(--accent-solid); | |
| background: var(--tint); | |
| border-radius: 999px; | |
| padding: 2px 8px; | |
| } | |
| .nav .links { | |
| display: flex; | |
| gap: 2px; | |
| } | |
| .nav .links a { | |
| padding: 6px 12px; | |
| border-radius: 999px; | |
| color: var(--muted-foreground); | |
| font-weight: 500; | |
| } | |
| .nav .links a:hover, | |
| .nav .links a[aria-current="page"] { | |
| background: var(--surface-sunken); | |
| color: var(--foreground); | |
| } | |
| .nav details { | |
| position: relative; | |
| } | |
| .nav details summary { | |
| list-style: none; | |
| cursor: pointer; | |
| padding: 6px 12px; | |
| border-radius: 999px; | |
| color: var(--muted-foreground); | |
| font-weight: 500; | |
| } | |
| .nav details summary::-webkit-details-marker { | |
| display: none; | |
| } | |
| .nav details summary:hover, | |
| .nav details[open] summary { | |
| background: var(--surface-sunken); | |
| color: var(--foreground); | |
| } | |
| .nav details .menu { | |
| position: absolute; | |
| top: calc(100% + 6px); | |
| left: 0; | |
| z-index: 10; | |
| display: grid; | |
| min-width: 180px; | |
| padding: 6px; | |
| background: var(--surface-raised); | |
| border: 1px solid var(--border); | |
| border-radius: 14px; | |
| box-shadow: 0 8px 24px rgb(0 0 0 / 0.08); | |
| } | |
| .nav details .menu a { | |
| white-space: nowrap; | |
| } | |
| /* The narrow-screen menu sits at the right edge and only appears when the link row is gone. */ | |
| .nav .more { | |
| display: none; | |
| } | |
| .nav .more summary { | |
| display: grid; | |
| place-items: center; | |
| width: 34px; | |
| height: 34px; | |
| padding: 0; | |
| border: 1px solid var(--border); | |
| } | |
| .nav .more .menu { | |
| left: auto; | |
| right: 0; | |
| } | |
| .nav .sp { | |
| flex: 1; | |
| } | |
| .lang { | |
| display: inline-flex; | |
| border: 1px solid var(--border); | |
| border-radius: 999px; | |
| overflow: hidden; | |
| font-size: 12px; | |
| font-weight: 500; | |
| white-space: nowrap; | |
| } | |
| .lang a, | |
| .lang span { | |
| padding: 5px 10px; | |
| color: var(--muted-foreground); | |
| } | |
| .lang .on { | |
| background: var(--foreground); | |
| color: var(--page); | |
| } | |
| .theme { | |
| display: inline-grid; | |
| place-items: center; | |
| width: 34px; | |
| height: 34px; | |
| margin: 0 10px 0 6px; | |
| padding: 0; | |
| border: 1px solid var(--border); | |
| border-radius: 999px; | |
| background: transparent; | |
| color: var(--muted-foreground); | |
| cursor: pointer; | |
| } | |
| .theme:hover { | |
| color: var(--foreground); | |
| background: var(--surface-sunken); | |
| } | |
| .theme svg { | |
| display: none; | |
| } | |
| :root[data-theme="dark"] .theme .sun, | |
| :root:not([data-theme="dark"]) .theme .moon { | |
| display: block; | |
| } | |
| .btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 8px; | |
| height: 40px; | |
| padding: 0 18px; | |
| border-radius: 999px; | |
| font-weight: 500; | |
| font-size: 14px; | |
| border: 1px solid transparent; | |
| white-space: nowrap; | |
| } | |
| .btn.primary { | |
| background: var(--foreground); | |
| color: var(--page); | |
| } | |
| .btn.secondary { | |
| background: var(--tint); | |
| color: var(--foreground); | |
| } | |
| .btn.sm { | |
| height: 34px; | |
| padding: 0 14px; | |
| font-size: 13px; | |
| } | |
| .btn .arr { | |
| font-family: var(--font-family-code); | |
| } | |
| /* Hero: the Astryx Centered Hero template */ | |
| /* Gaps follow the centered-hero template: 12 / 24 / 12 / 40. The hero and the scene still share one | |
| 900px laptop screen, so the scene animation plays in view. */ | |
| .hero { | |
| padding: 40px 0 24px; | |
| text-align: center; | |
| } | |
| h1.display { | |
| font-size: clamp(32px, 5vw, 52px); | |
| line-height: 1.12; | |
| font-weight: 500; | |
| letter-spacing: -0.03em; | |
| margin: 0 auto 12px; | |
| /* Three lines at every desktop width; the balance keeps them even. */ | |
| max-width: 24ch; | |
| text-wrap: balance; | |
| } | |
| /* CJK glyphs are a full em wide, so the Chinese headline needs its own measure to break in two lines. */ | |
| h1.display:lang(zh-CN) { | |
| max-width: 15em; | |
| } | |
| h1.display b { | |
| font-weight: 600; | |
| } | |
| .lede { | |
| font-size: 17px; | |
| line-height: 1.55; | |
| color: var(--muted-foreground); | |
| max-width: 60ch; | |
| margin: 0 auto 24px; | |
| text-wrap: balance; | |
| } | |
| .cta { | |
| display: flex; | |
| justify-content: center; | |
| gap: 12px; | |
| align-items: center; | |
| flex-wrap: wrap; | |
| } | |
| .fine { | |
| margin-top: 14px; | |
| font-size: 12.5px; | |
| color: var(--muted-foreground); | |
| } | |
| .fine a, | |
| .sec-h p a, | |
| .tile p a { | |
| color: var(--accent-solid); | |
| text-decoration: underline; | |
| text-underline-offset: 3px; | |
| } | |
| /* Hero scene: one turn of RuntimeEvents on a page-radius tinted ground */ | |
| .scene { | |
| margin: 40px auto 0; | |
| border-radius: var(--radius-page); | |
| background: var(--tint); | |
| overflow: hidden; | |
| position: relative; | |
| height: 320px; | |
| display: grid; | |
| place-items: center; | |
| } | |
| .turn { | |
| position: relative; | |
| display: grid; | |
| grid-template-columns: repeat(7, 1fr); | |
| gap: 10px; | |
| width: calc(100% - 64px); | |
| align-items: center; | |
| } | |
| .turn .rail { | |
| position: absolute; | |
| left: 24px; | |
| right: 24px; | |
| top: 50%; | |
| height: 1px; | |
| background: color-mix(in srgb, var(--foreground) 18%, transparent); | |
| } | |
| .turn .hwline { | |
| position: absolute; | |
| top: -52px; | |
| bottom: -52px; | |
| left: calc(5 / 7 * 100% - 7px); | |
| width: 2px; | |
| background: var(--accent-solid); | |
| border-radius: 2px; | |
| } | |
| .turn .hwline span { | |
| position: absolute; | |
| top: -2px; | |
| left: 10px; | |
| font: 500 11px / 1 var(--font-family-code); | |
| color: var(--accent-solid); | |
| white-space: nowrap; | |
| } | |
| .ev-pill { | |
| position: relative; | |
| background: var(--surface-raised); | |
| border-radius: 16px; | |
| padding: 14px 12px 12px; | |
| box-shadow: | |
| 0 1px 2px rgba(0, 0, 0, 0.06), | |
| 0 6px 20px -8px rgba(0, 0, 0, 0.18); | |
| display: flex; | |
| flex-direction: column; | |
| gap: 4px; | |
| min-width: 0; | |
| text-align: left; | |
| } | |
| .ev-pill b { | |
| font: 500 11px / 1.3 var(--font-family-code); | |
| color: var(--accent-solid); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .ev-pill small { | |
| font-size: 11.5px; | |
| color: var(--muted-foreground); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .ev-pill.mut b { | |
| color: var(--foreground); | |
| } | |
| .ev-pill.warn b { | |
| color: var(--warning-text); | |
| } | |
| .ev-pill.ok b { | |
| color: var(--success-text); | |
| } | |
| .ev-pill.dim { | |
| opacity: 0.45; | |
| box-shadow: none; | |
| background: color-mix(in srgb, var(--surface-raised) 60%, transparent); | |
| } | |
| .turn .ev-pill:nth-child(odd) { | |
| transform: translateY(-34px); | |
| } | |
| .turn .ev-pill:nth-child(even) { | |
| transform: translateY(34px); | |
| } | |
| .tape-cap { | |
| position: absolute; | |
| left: 24px; | |
| right: 24px; | |
| bottom: 18px; | |
| display: flex; | |
| gap: 22px; | |
| font: 500 11px / 1 var(--font-family-code); | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| color: var(--muted-foreground); | |
| } | |
| .tape-cap .hw { | |
| margin-left: auto; | |
| color: var(--accent-solid); | |
| text-transform: none; | |
| letter-spacing: 0; | |
| } | |
| /* Sections */ | |
| .sec { | |
| padding: 72px 0 0; | |
| } | |
| .sec-h { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 40px; | |
| align-items: end; | |
| margin-bottom: 28px; | |
| } | |
| h2 { | |
| font-size: 34px; | |
| line-height: 1.18; | |
| font-weight: 600; | |
| letter-spacing: -0.025em; | |
| margin: 0; | |
| text-wrap: balance; | |
| } | |
| .sec-h p { | |
| margin: 0; | |
| color: var(--muted-foreground); | |
| font-size: 15px; | |
| max-width: 52ch; | |
| } | |
| /* Bento */ | |
| .bento { | |
| display: grid; | |
| grid-template-columns: repeat(12, 1fr); | |
| grid-auto-rows: minmax(120px, auto); | |
| gap: 16px; | |
| } | |
| .tile { | |
| background: var(--tint); | |
| border-radius: 20px; | |
| padding: 26px 26px 22px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| min-height: 0; | |
| min-width: 0; | |
| } | |
| .tile.plain { | |
| background: var(--plain); | |
| } | |
| .tile h3 { | |
| margin: 0; | |
| font-size: 19px; | |
| font-weight: 600; | |
| letter-spacing: -0.01em; | |
| } | |
| .tile p { | |
| margin: 0; | |
| color: var(--muted-foreground); | |
| font-size: 14px; | |
| max-width: 46ch; | |
| } | |
| .tile .more { | |
| margin-top: 4px; | |
| font-weight: 500; | |
| font-size: 14px; | |
| color: var(--foreground); | |
| } | |
| .tile .more::after { | |
| content: " →"; | |
| } | |
| .tile .fig { | |
| margin-top: auto; | |
| padding-top: 18px; | |
| } | |
| .c3 { | |
| grid-column: span 3; | |
| } | |
| .c4 { | |
| grid-column: span 4; | |
| } | |
| .c5 { | |
| grid-column: span 5; | |
| } | |
| .c7 { | |
| grid-column: span 7; | |
| } | |
| .c12 { | |
| grid-column: span 12; | |
| } | |
| .r2 { | |
| grid-row: span 2; | |
| } | |
| /* Leaderboard as rows */ | |
| /* The tile's height comes from the two tiles beside it, so the table stretches its rows to fill | |
| whatever the copy above it leaves over. */ | |
| .tile.r2 .fig, | |
| .lb { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .lb { | |
| background: var(--surface-raised); | |
| border-radius: var(--radius-container); | |
| overflow: hidden; | |
| border: 1px solid var(--border); | |
| } | |
| .lb .row { | |
| flex: 1; | |
| display: grid; | |
| grid-template-columns: 22px 96px 1fr 58px; | |
| gap: 10px; | |
| align-items: center; | |
| padding: 7px 12px; | |
| font-size: 12.5px; | |
| border-bottom: 1px solid var(--border); | |
| } | |
| .lb .row:last-of-type { | |
| border-bottom: 0; | |
| } | |
| .lb .rk { | |
| color: var(--muted-foreground); | |
| font-family: var(--font-family-code); | |
| font-size: 11px; | |
| } | |
| .lb .tr { | |
| height: 6px; | |
| border-radius: 999px; | |
| background: var(--surface-sunken); | |
| overflow: hidden; | |
| } | |
| .lb .fi { | |
| height: 100%; | |
| background: color-mix(in oklch, var(--foreground) 24%, transparent); | |
| border-radius: 999px; | |
| } | |
| .lb .pc { | |
| text-align: right; | |
| font-variant-numeric: tabular-nums; | |
| font-weight: 500; | |
| } | |
| .lb .row.me { | |
| background: var(--tint); | |
| } | |
| .lb .row.me .fi { | |
| background: var(--accent-solid); | |
| } | |
| .lb .row.me .nm, | |
| .lb .row.me .pc { | |
| color: var(--accent-solid); | |
| font-weight: 600; | |
| } | |
| .lb .cap { | |
| padding: 8px 12px; | |
| font: 11px / 1.5 var(--font-family-code); | |
| color: var(--muted-foreground); | |
| background: var(--surface-sunken); | |
| } | |
| /* Big stat */ | |
| /* The stat sits in the middle of whatever height the copy leaves, not glued to the bottom. */ | |
| .tile .fig:has(> .stat) { | |
| flex: 1; | |
| display: flex; | |
| align-items: center; | |
| } | |
| .stat { | |
| font-size: 56px; | |
| font-weight: 600; | |
| letter-spacing: -0.04em; | |
| line-height: 1; | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .stat small { | |
| font-size: 16px; | |
| font-weight: 500; | |
| color: var(--muted-foreground); | |
| letter-spacing: 0; | |
| margin-left: 8px; | |
| } | |
| /* Runtime Host diagram */ | |
| .host { | |
| display: grid; | |
| grid-template-columns: 1fr auto 1fr; | |
| gap: 14px; | |
| align-items: center; | |
| font-size: 12.5px; | |
| } | |
| .host .col { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| } | |
| .host .chip { | |
| background: var(--surface-raised); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-element); | |
| padding: 6px 10px; | |
| font-weight: 500; | |
| } | |
| .host .core { | |
| background: var(--foreground); | |
| color: var(--page); | |
| border-radius: var(--radius-container); | |
| padding: 14px 16px; | |
| font-weight: 600; | |
| text-align: center; | |
| line-height: 1.3; | |
| } | |
| .host .core small { | |
| display: block; | |
| font-weight: 400; | |
| opacity: 0.7; | |
| font-size: 11px; | |
| } | |
| .host .lines { | |
| font-family: var(--font-family-code); | |
| color: var(--muted-foreground); | |
| font-size: 11px; | |
| text-align: center; | |
| } | |
| /* Event chips */ | |
| .evs { | |
| display: flex; | |
| gap: 6px; | |
| flex-wrap: wrap; | |
| align-items: center; | |
| } | |
| .evs .e { | |
| font: 500 11.5px / 1 var(--font-family-code); | |
| padding: 7px 10px; | |
| border-radius: 999px; | |
| background: var(--surface-raised); | |
| color: var(--accent-solid); | |
| border: 1px solid var(--border); | |
| } | |
| .evs .e.mut { | |
| color: var(--muted-foreground); | |
| } | |
| .evs .e.warn { | |
| color: var(--warning-text); | |
| } | |
| .evs .e.ok { | |
| color: var(--success-text); | |
| } | |
| .evs .cur { | |
| width: 2px; | |
| height: 22px; | |
| background: var(--accent-solid); | |
| } | |
| /* Events are appended one by one, then the caret keeps blinking: the log is still being written. */ | |
| @media (prefers-reduced-motion: no-preference) { | |
| .evs.armed .e, | |
| .evs.armed .cur { | |
| opacity: 0; | |
| transform: translateY(4px); | |
| } | |
| .evs.play .e { | |
| animation: append 0.3s ease-out forwards; | |
| animation-delay: calc(var(--i) * 0.28s); | |
| } | |
| .evs.play .cur { | |
| animation: | |
| append 0.2s ease-out forwards, | |
| blink 1s steps(1) infinite; | |
| animation-delay: calc(var(--i) * 0.28s); | |
| } | |
| } | |
| @keyframes append { | |
| to { | |
| opacity: 1; | |
| transform: none; | |
| } | |
| } | |
| /* The hero scene appends the same way; its cards keep their offsets, so only opacity moves. */ | |
| @media (prefers-reduced-motion: no-preference) { | |
| .turn.armed .ev-pill, | |
| .turn.armed .hwline { | |
| opacity: 0; | |
| } | |
| .turn.play .ev-pill { | |
| animation: appear 0.35s ease-out forwards; | |
| animation-delay: calc(0.2s + var(--i) * 0.28s); | |
| } | |
| .turn.play .hwline { | |
| animation: appear 0.3s ease-out forwards; | |
| animation-delay: calc(0.2s + var(--i) * 0.28s); | |
| } | |
| .turn.play .ev-pill.dim { | |
| animation-name: appear-dim; | |
| } | |
| } | |
| @keyframes appear { | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| @keyframes appear-dim { | |
| to { | |
| opacity: 0.45; | |
| } | |
| } | |
| @keyframes blink { | |
| 50% { | |
| opacity: 0; | |
| } | |
| } | |
| /* Get Maka: three paths */ | |
| .tile.get { | |
| flex-direction: row; | |
| gap: 40px; | |
| align-items: flex-start; | |
| } | |
| .get-h { | |
| flex: 0 0 240px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .paths3 { | |
| flex: 1; | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 24px; | |
| } | |
| .path { | |
| display: grid; | |
| grid-template-columns: 1fr; | |
| border-left: 1px solid var(--border); | |
| padding: 4px 0 4px 18px; | |
| align-content: start; | |
| gap: 8px; | |
| } | |
| .path b { | |
| display: block; | |
| font-weight: 600; | |
| font-size: 15px; | |
| margin-bottom: 4px; | |
| } | |
| .path span { | |
| color: var(--muted-foreground); | |
| font-size: 12.5px; | |
| line-height: 1.5; | |
| } | |
| .path .note { | |
| font: 500 11px / 1.4 var(--font-family-code); | |
| color: var(--warning-text); | |
| } | |
| .path .note.mut { | |
| color: var(--muted-foreground); | |
| } | |
| .path code { | |
| font-size: 12px; | |
| background: var(--surface-raised); | |
| border: 1px solid var(--border); | |
| border-radius: 6px; | |
| padding: 2px 6px; | |
| } | |
| /* Reading cards */ | |
| .reads { | |
| display: grid; | |
| grid-template-columns: repeat(4, 1fr); | |
| gap: 16px; | |
| } | |
| .rc { | |
| border-radius: 20px; | |
| overflow: hidden; | |
| background: var(--plain); | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .rc .cover { | |
| background: var(--tint); | |
| height: 200px; | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: center; | |
| align-items: center; | |
| font-family: var(--font-family-code); | |
| color: var(--accent-solid); | |
| font-size: 26px; | |
| font-weight: 500; | |
| letter-spacing: -0.02em; | |
| text-align: center; | |
| padding: 0 20px; | |
| line-height: 1.25; | |
| } | |
| .rc .cover small { | |
| display: block; | |
| font-size: 12px; | |
| color: var(--muted-foreground); | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| margin-top: 10px; | |
| font-weight: 500; | |
| } | |
| .rc .body { | |
| padding: 18px 20px 20px; | |
| } | |
| .rc h3 { | |
| margin: 0 0 6px; | |
| font-size: 17px; | |
| font-weight: 600; | |
| letter-spacing: -0.01em; | |
| text-wrap: balance; | |
| } | |
| .rc .meta { | |
| font-size: 12px; | |
| color: var(--muted-foreground); | |
| } | |
| .rc .meta a { | |
| color: var(--accent-solid); | |
| } | |
| /* Downloads page: the Astryx technical-documentation layout, content plus a | |
| sticky outline, rows for status and numbered steps with copyable code. */ | |
| .doc { | |
| display: grid; | |
| grid-template-columns: minmax(0, 1fr) 180px; | |
| gap: 64px; | |
| padding: 56px 0 0; | |
| max-width: 1040px; | |
| } | |
| .doc h1 { | |
| font-size: 40px; | |
| line-height: 1.15; | |
| font-weight: 600; | |
| letter-spacing: -0.03em; | |
| margin: 0 0 10px; | |
| text-wrap: balance; | |
| } | |
| .doc .sup { | |
| margin: 0; | |
| font-size: 15px; | |
| line-height: 1.6; | |
| color: var(--muted-foreground); | |
| max-width: 62ch; | |
| } | |
| .doc h2 { | |
| font-size: 24px; | |
| margin: 0 0 12px; | |
| } | |
| .doc h3 { | |
| margin: 0; | |
| font-size: 13px; | |
| font-weight: 600; | |
| letter-spacing: 0.02em; | |
| } | |
| .doc p, | |
| .doc li { | |
| font-size: 15px; | |
| line-height: 1.6; | |
| color: var(--muted-foreground); | |
| max-width: 68ch; | |
| margin: 0 0 12px; | |
| } | |
| .doc p a:not(.btn), | |
| .doc li a { | |
| color: var(--accent-solid); | |
| text-decoration: underline; | |
| text-underline-offset: 3px; | |
| } | |
| .doc .div { | |
| border: 0; | |
| border-top: 1px solid var(--border); | |
| margin: 40px 0; | |
| } | |
| .doc .note { | |
| display: inline-block; | |
| font: 500 11px / 1.4 var(--font-family-code); | |
| color: var(--warning-text); | |
| border: 1px solid color-mix(in srgb, var(--warning-text) 40%, transparent); | |
| border-radius: 999px; | |
| padding: 3px 10px; | |
| margin-bottom: 12px; | |
| } | |
| .doc .status { | |
| margin: 32px 0 48px; | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-container); | |
| background: var(--plain); | |
| overflow: hidden; | |
| } | |
| .doc .status h3 { | |
| padding: 12px 16px; | |
| color: var(--muted-foreground); | |
| border-bottom: 1px solid var(--border); | |
| } | |
| .doc .status .row { | |
| display: grid; | |
| grid-template-columns: 150px minmax(0, 1fr) auto; | |
| gap: 16px; | |
| align-items: center; | |
| padding: 12px 16px; | |
| border-bottom: 1px solid var(--border); | |
| font-size: 14px; | |
| } | |
| .doc .status .row:last-child { | |
| border-bottom: 0; | |
| } | |
| .doc .status .row:hover { | |
| background: var(--surface-sunken); | |
| } | |
| .doc .status .row b { | |
| font-weight: 600; | |
| } | |
| .doc .status .row span { | |
| color: var(--muted-foreground); | |
| } | |
| .doc .status .row small { | |
| font: 500 11px / 1 var(--font-family-code); | |
| color: var(--muted-foreground); | |
| white-space: nowrap; | |
| } | |
| .doc .status .row small.warn { | |
| color: var(--warning-text); | |
| } | |
| .doc .step { | |
| display: block; | |
| font-size: 14px; | |
| font-weight: 600; | |
| margin: 18px 0 8px; | |
| } | |
| .doc ul { | |
| padding-left: 20px; | |
| margin: 0 0 8px; | |
| } | |
| .doc li { | |
| margin: 0 0 4px; | |
| } | |
| .doc .code { | |
| position: relative; | |
| margin: 0 0 12px; | |
| } | |
| .doc pre { | |
| margin: 0; | |
| background: var(--plain); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-container); | |
| padding: 14px 96px 14px 16px; | |
| overflow-x: auto; | |
| font: 13px / 1.6 var(--font-family-code); | |
| color: var(--foreground); | |
| } | |
| .doc .copy { | |
| position: absolute; | |
| top: 8px; | |
| right: 8px; | |
| height: 28px; | |
| padding: 0 10px; | |
| border: 1px solid var(--border); | |
| border-radius: 999px; | |
| background: var(--surface-raised); | |
| color: var(--muted-foreground); | |
| font: 500 12px var(--font-family-body); | |
| cursor: pointer; | |
| } | |
| .doc .copy:hover { | |
| color: var(--foreground); | |
| } | |
| .doc code { | |
| font-size: 0.92em; | |
| } | |
| /* The distribution URL is one unbreakable word; it wraps rather than widening the page on phones. */ | |
| .doc p code { | |
| overflow-wrap: anywhere; | |
| } | |
| .doc .btn { | |
| margin-top: 4px; | |
| } | |
| .outline { | |
| position: sticky; | |
| top: 24px; | |
| align-self: start; | |
| padding-top: 132px; | |
| } | |
| .outline .lab { | |
| font: 500 11px / 1 var(--font-family-code); | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| color: var(--muted-foreground); | |
| margin-bottom: 12px; | |
| } | |
| .outline a { | |
| display: block; | |
| padding: 6px 0 6px 12px; | |
| border-left: 2px solid var(--border); | |
| color: var(--muted-foreground); | |
| font-size: 13px; | |
| line-height: 1.4; | |
| } | |
| .outline a:hover { | |
| color: var(--foreground); | |
| } | |
| .outline a[aria-current="true"] { | |
| border-color: var(--accent-solid); | |
| color: var(--foreground); | |
| font-weight: 500; | |
| } | |
| /* Footer */ | |
| .foot { | |
| margin-top: 72px; | |
| border-top: 1px solid var(--border); | |
| padding: 28px 0 32px; | |
| font-size: 12.5px; | |
| color: var(--muted-foreground); | |
| } | |
| .foot .links { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 4px 16px; | |
| margin-bottom: 18px; | |
| } | |
| .foot .links a { | |
| color: var(--foreground); | |
| font-weight: 500; | |
| } | |
| .foot .inc { | |
| display: inline-block; | |
| margin-bottom: 16px; | |
| } | |
| .foot .inc img { | |
| display: block; | |
| height: 36px; | |
| width: auto; | |
| padding: 6px 10px; | |
| border-radius: 8px; | |
| background: light-dark(transparent, #fff); | |
| } | |
| .foot p { | |
| margin: 0; | |
| } | |
| .foot .disc { | |
| max-width: 96ch; | |
| line-height: 1.6; | |
| } | |
| .foot .tm { | |
| margin-top: 12px; | |
| } | |
| @media (max-width: 1000px) { | |
| .scene { | |
| height: auto; | |
| padding: 28px 24px 48px; | |
| } | |
| .turn { | |
| width: 100%; | |
| grid-template-columns: repeat(4, 1fr); | |
| } | |
| .turn .rail, | |
| .turn .hwline { | |
| display: none; | |
| } | |
| .turn .ev-pill:nth-child(odd), | |
| .turn .ev-pill:nth-child(even) { | |
| transform: none; | |
| } | |
| } | |
| /* The English link row needs about 1000px with the page padding; below that the menu takes over. */ | |
| @media (max-width: 1024px) { | |
| .nav .links { | |
| display: none; | |
| } | |
| .nav .more { | |
| display: block; | |
| } | |
| } | |
| @media (max-width: 900px) { | |
| .sec-h { | |
| grid-template-columns: 1fr; | |
| gap: 12px; | |
| } | |
| .bento > .tile { | |
| grid-column: span 12; | |
| grid-row: auto; | |
| } | |
| .tile.get { | |
| flex-direction: column; | |
| gap: 20px; | |
| } | |
| .get-h { | |
| flex-basis: auto; | |
| } | |
| .paths3 { | |
| grid-template-columns: 1fr; | |
| } | |
| .reads { | |
| grid-template-columns: 1fr 1fr; | |
| } | |
| } | |
| @media (max-width: 720px) { | |
| .wrap { | |
| padding: 0 20px; | |
| } | |
| /* Get Maka moves into the menu and the theme follows the OS; the row does not fit them at 390px. */ | |
| .nav .btn, | |
| .nav .theme { | |
| display: none; | |
| } | |
| .nav .brand { | |
| margin-right: 0; | |
| } | |
| .lang a, | |
| .lang span { | |
| padding: 5px 8px; | |
| } | |
| .hero { | |
| padding-top: 40px; | |
| } | |
| .scene { | |
| padding: 28px 20px 24px; | |
| } | |
| .turn { | |
| grid-template-columns: 1fr 1fr; | |
| } | |
| .tape-cap { | |
| position: static; | |
| margin-top: 28px; | |
| flex-direction: column; | |
| gap: 8px; | |
| line-height: 1.5; | |
| text-align: center; | |
| } | |
| .tape-cap .hw { | |
| margin-left: 0; | |
| } | |
| .reads { | |
| grid-template-columns: 1fr; | |
| } | |
| h2 { | |
| font-size: 28px; | |
| } | |
| .doc { | |
| grid-template-columns: minmax(0, 1fr); | |
| gap: 0; | |
| } | |
| .outline { | |
| display: none; | |
| } | |
| .doc h1 { | |
| font-size: 32px; | |
| } | |
| .doc .status .row { | |
| grid-template-columns: 1fr; | |
| gap: 4px; | |
| } | |
| } |