/* base.css — reset, document typography, focus, motion, print, layout utilities,
   and the site chrome. Ported from the signed-off Phase B prototype
   (docs/prototype/assets/css/base.css, frozen reference). Everything above the chrome
   is byte-identical to it except this header and the language → face scheme marked
   below.

   THE CHROME IS NOT A PORT ANY MORE, and its class names say so. Up to CP-C1-4 this
   file carried the prototype's nav rules verbatim, under class names that carried the
   prototype's own prefix, and kept them so the port stayed diffable against
   docs/prototype/. That era ended on 2026-08-29: the owner called the ported header
   "too bare for production" and picked a different design — masthead + tool rail, with
   the rail folding into a disclosure on a phone (Option B + Option C's collapse,
   docs/design/2026-08-29-header-options/index.html). There is nothing left to diff, so
   the rules below are `.site-*` and are written against that design rather than against
   the prototype's. The prototype keeps its own green chrome; it is a frozen record of
   what was signed off, not a source this file re-reads.

   Rules: tokens only (no literal colours), logical properties only — never
   left/right/top/bottom, margin-left, text-align: left, etc.; the one exception is the
   select chevron's background-position (no logical form exists), mirrored by an explicit
   [dir="rtl"] override. Arabic RTL depends on it.

   ┌─ BANNED: element-wide `:lang(xx) { font-family: … }` ───────────────────────────┐
   │ `:lang(ar)` is a (0,1,0) selector and it matches EVERY element inside an Arabic  │
   │ page, not just <html>. A font-family on it therefore outranks the (0,0,1) rules  │
   │ for `code`, `kbd`, `samp`, `pre` and `h1…h6` and silently reaches things it was  │
   │ never meant to touch. The prototype hit this twice (rulings R32 and R35) and had │
   │ to buy each one back with a more specific counter-rule — a debt that grows with  │
   │ every element rule anyone adds later.                                            │
   │                                                                                  │
   │ THE ONLY SANCTIONED MECHANISM is the custom-property scheme below: the language  │
   │ picks a VALUE (--font-current / --lh-current), and TWO rules read that value     │
   │ into font-family — `body` and `[lang]`. Custom properties inherit without        │
   │ competing on specificity, so nothing is outranked and nothing has to be bought   │
   │ back.                                                                            │
   │                                                                                  │
   │ THE SANCTIONED READERS — the only four selectors in this file that may declare   │
   │ a font-family at all, written here exactly as they are written below:            │
   │                                                                                  │
   │   body                                        reads --font-current (the scheme)  │
   │   [lang]                                      reads --font-current (the scheme)  │
   │   code, kbd, samp, pre                        the monospace stack, ruling R32    │
   │   code[lang], kbd[lang], samp[lang], pre[lang]  the same, over `[lang]` (R32)    │
   │                                                                                  │
   │ Four declare a font-family; two of those read --font-current. A fifth reader     │
   │ re-opens the specificity war this scheme exists to end, so it has to be argued   │
   │ for HERE before it is added.                                                     │
   │                                                                                  │
   │ ENFORCEMENT — app/qa/sweeps.ts holds the machine copy of that list               │
   │ (`SANCTIONED_READERS`), and the two are one contract: change this box and that   │
   │ array in the same commit, or the build fails. The sweeps fail on `:lang(` and a  │
   │ face declaration in one rule, on any reader outside the four, AND on any of the  │
   │ four that has DISAPPEARED. "A face declaration" is `font-family:` or a `font:`   │
   │ shorthand that is not exactly `inherit` — the shorthand sets a family too, and   │
   │ `input, button, select, textarea { font: inherit }` below is the one legitimate  │
   │ use of it. Do not add a banned rule, not even "just for this page".              │
   └──────────────────────────────────────────────────────────────────────────────────┘ */

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

html { -webkit-text-size-adjust: 100%; }

body,
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd,
fieldset, legend { margin: 0; padding: 0; }

/* A list you styled is a list of things, not prose: it loses its markers and
   indent. A bare <ul> in body copy keeps both. */
ul[class], ol[class] { margin: 0; padding: 0; list-style: none; }

img, picture, video, canvas { display: block; max-inline-size: 100%; }

/* `hidden` is a state, not a suggestion. Its UA rule is `display: none` at the
   lowest specificity, so ANY class that sets a display — .row, .btn, .chip — wins
   over it and the element stays on screen. Every hidden state in the suite depends
   on this line. */
[hidden] { display: none !important; }

input, button, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; background: none; border: 0; }

table { border-collapse: collapse; }

/* ── document ────────────────────────────────────────────────────────── */
/* Native controls and scrollbars follow the chosen theme, not the OS one. */
:root { color-scheme: light; }
:root[data-theme="dark"] { color-scheme: dark; }

body {
  background: var(--bg);
  color: var(--ink);
  /* The language-aware face. --font-current is undefined until a rule below claims
     it, so every unclaimed language (en, es, ru, pt) lands on --font-ui — which is
     what Cyrillic wants too: Manrope ships a Cyrillic cut. */
  font-family: var(--font-current, var(--font-ui));
  font-size: var(--fs-1);
  line-height: var(--lh-current, var(--lh-body));
  min-block-size: 100vh;
  -webkit-font-smoothing: antialiased;
}

/* ── the language → face scheme (see the ban in the file header) ──────────
   The page's language sets a VALUE; `body` above turns that value into a face.
   Arabic also raises the body leading: 1.6 crowds the marks that sit above and
   below the baseline, and a تشكيل-bearing line needs the room. */
html:lang(ar) { --font-current: var(--font-ar); --lh-current: 1.75; }
html:lang(zh) { --font-current: var(--font-zh); }

/* An element that declares its OWN language re-picks the face for itself — an
   Arabic name in an English chip list gets IBM Plex Sans Arabic rather than
   whatever the system substitutes glyph by glyph (the home page's demo roster is
   exactly this, and it is why the prototype's element-wide rule existed at all).
   `[lang|="ar"]` matches `lang="ar"` and `lang="ar-SA"`.
   Why this is NOT the banned pattern: an attribute selector matches only the
   element carrying the attribute, never its subtree, so it cannot reach past the
   one name it was put on. Reaching the whole subtree is what `:lang()` does and
   what the ban is about.

   FACE ONLY — never leading. A lang-tagged element keeps its container's leading:
   a name in a chip is set on the chip's line, a title on the card's. This is not a
   shortcut, it is the constraint. Anything strong enough to re-set the leading on
   `[lang]` is (0,1,1) or worse, and every component class that owns a line-height
   — .btn, .card__title, .chip__x (which uses `1` to centre the ×),
   .result-banner__name, .team-card__name — is only (0,1,0). A first draft of this
   file did exactly that and silently reset all five: .btn 18.4px → 28px,
   .result-banner__name 35.94px → 54.68px, .chip__x 20px → 35px. If Arabic prose
   leading is ever wanted on a lang-tagged block, it has to come from a selector
   that LOSES to a component class — a page-level class on the block itself, not
   an attribute selector reaching down into components. */
[lang|="ar"] { --font-current: var(--font-ar); }
[lang|="zh"] { --font-current: var(--font-zh); }
[lang] { font-family: var(--font-current, var(--font-ui)); }

/* ── typography ──────────────────────────────────────────────────────── */
h1, h2, h3, h4, h5, h6 {
  font-weight: 800;
  line-height: var(--lh-tight);
  text-wrap: balance;
}
h1 { font-size: var(--fs-5); letter-spacing: -.022em; }
h2 { font-size: var(--fs-4); letter-spacing: -.016em; }
h3 { font-size: var(--fs-3); letter-spacing: -.01em; }
h4 { font-size: var(--fs-2); }
h5 { font-size: var(--fs-1); }
h6 { font-size: var(--fs-0); text-transform: uppercase; letter-spacing: .1em; }

/* Arabic and Chinese headings: no tight tracking, no faux weights below 600.
   The small-caps treatments below (h6 and .eyebrow, defined further down) take the
   same reset for Arabic: letter-spacing prises the joins apart into isolated forms
   — the same failure the wheel engine avoids by forcing letterSpacing to 0 on the
   canvas. Uppercasing is a no-op on both scripts and is left alone.
   Promoted here from wheel.html at Checkpoint 1 (approved change C1-5). */
:lang(ar) h1, :lang(ar) h2, :lang(ar) h3,
:lang(zh) h1, :lang(zh) h2, :lang(zh) h3,
:lang(ar) h6, :lang(ar) .eyebrow { letter-spacing: 0; }

/* Ruling R35. In the prototype this was a repair: `:lang(ar)`'s 1.75 body leading
   leaked onto the headings and set 39px display type on a 68px line, and 1.35 was
   what pulled it back. Under the scheme above the leak cannot happen — a heading
   keeps --lh-tight — so this rule is no longer a repair but the typographic
   choice it was always standing in for: 1.15 is too tight for Arabic. 1.35 is the
   Arabic reading of `--lh-tight` — loose enough to clear a شدّة or a فتحة on a
   display-size H1, tight enough that a heading still reads as one block. Body text
   keeps 1.75. Kept as `:lang(ar) h…` (not `html:lang(ar) h…`) so an Arabic heading
   inside an otherwise English page is set correctly too; a leading is not a
   font-family and this selector is not the banned pattern. */
:lang(ar) h1, :lang(ar) h2, :lang(ar) h3,
:lang(ar) h4, :lang(ar) h5, :lang(ar) h6 { line-height: 1.35; }

p { text-wrap: pretty; }

a { color: var(--brand); text-underline-offset: .15em; }
a:hover { text-decoration-thickness: 2px; }

strong, b { font-weight: 800; }

code, kbd, samp, pre {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: .92em;
  /* Technical strings stay LTR inside an RTL page, and never reorder the text
     around them: without this, "--seg-1" renders as "seg-1--" under dir="rtl". */
  direction: ltr;
  unicode-bidi: isolate;
}

/* Ruling R32. A technical string is said and typed the same way in every
   language, so it is set the same way in every language: a URL, a join code, a
   seed or a token name never goes into the Arabic text face or the Han one, where
   a 0 and an O, a 1 and an l are drawn to match their neighbours rather than to
   be told apart.
   The prototype needed two (0,1,1) blocks — `:lang(ar) code…` and `:lang(zh)
   code…` — to buy this back from the element-wide font-family rules. Those rules
   are gone, so the (0,0,1) `code` rule above simply holds: an inherited value
   never beats a rule. The one selector that still could is `[lang]` above, which
   applies when the technical string carries its own language tag; (0,1,1) settles
   it, and this is the whole of what R32 costs now. */
code[lang],
kbd[lang],
samp[lang],
pre[lang] {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
}

hr { border: 0; border-block-start: 1px solid var(--line); }

/* ── focus ───────────────────────────────────────────────────────────── */
:focus-visible {
  outline: 2px solid var(--brand);
  outline-offset: 2px;
}
:focus:not(:focus-visible) { outline: none; }

/* ── motion ──────────────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
}

/* ── i18n gap marker (Task 5 fills this in; the rule lives here from day one) ── */
.i18n-missing { outline: 2px dashed var(--danger); }

/* ── utilities ───────────────────────────────────────────────────────── */
.visually-hidden {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  z-index: 30;
  inset-block-start: var(--sp-2);
  inset-inline-start: var(--sp-2);
  padding: var(--sp-2) var(--sp-4);
  border-radius: var(--r-1);
  background: var(--brand);
  color: var(--brand-ink);
  font-weight: 600;
  text-decoration: none;
  translate: 0 -300%;
  transition: translate var(--t-fast) ease-out;
}
.skip-link:focus { translate: 0 0; }

/* Column of things. Override the gap inline: style="--stack-gap: var(--sp-6)". */
.stack {
  display: flex;
  flex-direction: column;
  gap: var(--stack-gap, var(--sp-4));
}

/* Row of things. Override with --row-gap. */
.row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--row-gap, var(--sp-3));
}

/* Reading measure. */
.wrap-narrow { max-inline-size: 68ch; margin-inline: auto; }

/* Page gutter. */
.wrap-page {
  inline-size: 100%;
  max-inline-size: 72rem;
  margin-inline: auto;
  padding-inline: var(--sp-4);
}

/* Small caps-y kicker above a heading. */
.eyebrow {
  font-size: var(--fs-0);
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--ink-2);
}
/* Custom-property names are case-sensitive — never uppercase them. */
.eyebrow code { text-transform: none; letter-spacing: 0; }

/* Standfirst paragraph under a page or section title. */
.lede { font-size: var(--fs-2); color: var(--ink-2); max-inline-size: 52ch; }

/* ══ the site chrome (CP-C1-4: masthead + tool rail, phone pocket) ══════
   Two decks in one <header class="site-nav">:

     .site-nav__mast   brand lockup · language · theme · (phone) tool pocket
     .site-nav__rail   the tool links, underline-tabbed, and the deck that STAYS

   The footer (.site-foot) is the same design's other half: three headed columns
   under one navigation landmark, then a base line. _layout.tsx renders both and
   carries the reasoning for the markup; this file owns the look. */

.site-nav {
  background: var(--surface);
  /* THE MASTHEAD'S OWN HEIGHT, as a value two rules read: the mast is exactly this
     tall, and the sticky offset below is exactly its negative. One number, one place.
     It is spelled out as its parts rather than as 66px so that it follows the root
     font size: the tallest thing in the deck is the theme control — a 2.75rem button
     inside a 2px padding ring and a 1px border, so 6 px of chrome that is not type —
     and the deck adds --sp-2 above and below it. Measured against the real thing at
     1280, 768, 390 and 360 px, in en/ar/ru, light and dark. */
  --site-mast-block: calc(2.75rem + 6px + var(--sp-2) * 2);
}

/* THE RAIL IS WHAT STAYS ON SCREEN; the masthead scrolls away above it.

   The sticky BOX is this <header>, not the rail, and that is mechanism rather than
   preference: a sticky box is clamped to its containing block, so a rail that is the
   last child of the header has no room to move down inside it and would never stick
   at all. Pulling the whole header up by exactly the masthead's height leaves the
   rail — the header's other 100% — sitting at the top of the viewport, which is the
   behaviour asked for, with no second scroll container and no JavaScript. If the
   masthead ever grows past --site-mast-block the failure is a visible sliver of it
   rather than a broken layout.

   Above 46rem only, and for the same reason as before: below it the masthead wraps
   to two rows and a third of a phone screen is not chrome's to take. */
@media (min-width: 46rem) {
  .site-nav {
    position: sticky;
    inset-block-start: calc(-1 * var(--site-mast-block));
    z-index: 20;
  }
}

.site-nav__mast-inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3);
  min-block-size: var(--site-mast-block);
  padding-block: var(--sp-2);
}

/* ── the brand lockup ────────────────────────────────────────────────── */
/* The mark is the owner's logo since 2026-09-02 (BrandMark in pages/_layout.tsx, geometry
   in build/mark.ts) and this sizing is untouched by that swap — which is what the slot
   promised. `1.4em` rather than a rem so the footer's small copy is one font-size away
   from the masthead's; a new mark that is square and drawn to the edges of its viewBox
   needs nothing else here. */
.site-brand {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  flex: none;
  color: var(--ink);
  font-size: var(--fs-2);
  font-weight: 800;
  letter-spacing: -.02em;
  text-decoration: none;
}
.site-brand__mark { inline-size: 1.4em; block-size: 1.4em; flex: none; }
.site-brand--small { font-size: var(--fs-1); }

/* ── the tool rail ───────────────────────────────────────────────────── */
/* Hairlines top AND bottom: the rail is a deck of its own, not a border under the
   masthead. It scrolls INSIDE itself when the tools outgrow the measure, with the
   scrollbar hidden — the cut-off link at the end edge is the affordance. */
.site-nav__rail { border-block: 1px solid var(--line); }
.site-nav__rail-inner {
  display: flex;
  gap: var(--sp-1);
  overflow-x: auto;
  overscroll-behavior-inline: contain;
  scrollbar-width: none;
}
.site-nav__rail-inner::-webkit-scrollbar { display: none; }
.site-nav__rail a {
  flex: none;
  padding: var(--sp-3);
  color: var(--ink-2);
  font-size: var(--fs-0);
  font-weight: 600;
  text-decoration: none;
  /* The tab underline, transparent until it is the page you are on — declared on
     both states so the link never changes height when it becomes current. */
  border-block-end: 3px solid transparent;
  transition: color var(--t-fast) ease-out, border-color var(--t-fast) ease-out;
}
.site-nav__rail a:hover { color: var(--ink); }
.site-nav__rail a[aria-current="page"] {
  color: var(--brand);
  border-block-end-color: var(--brand);
}

/* ── the two disclosures: language, and the phone's tool pocket ──────── */
/* `list-style: none` plus the WebKit pseudo-element is the pair that removes the
   default triangle everywhere; the chevron is drawn in the markup instead so it can
   take a token colour and rotate with the open state. */
.site-lang,
.site-tools { position: relative; flex: none; }
.site-lang { margin-inline-start: auto; }
/* The pocket belongs to the phone; site.css turns it on below 46rem, where it turns the
   rail off. Exactly one of the two is rendered at any viewport. */
.site-tools { display: none; }

.site-disc {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-block-size: 2.75rem;
  padding-inline: var(--sp-3);
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: var(--r-round);
  font-size: var(--fs-0);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.site-disc::-webkit-details-marker { display: none; }
.site-disc:hover { border-color: var(--ink-2); }
details[open] > .site-disc { border-color: var(--brand); color: var(--brand); }
/* Square, so an icon-only summary is still a 44 px target rather than a 44 × 24 slot. */
.site-disc--icon { min-inline-size: 2.75rem; justify-content: center; padding-inline: var(--sp-2); }
.site-disc__chevron { inline-size: 1em; block-size: 1em; color: var(--ink-2); }
details[open] > .site-disc .site-disc__chevron { color: inherit; rotate: 180deg; }

/* The panel a disclosure drops. Absolute, so opening one moves nothing on the page. */
.site-panel {
  position: absolute;
  inset-block-start: calc(100% + var(--sp-2));
  z-index: 40;
  min-inline-size: 11rem;
  padding: var(--sp-1);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  /* The one shadow in the chrome. --seg-ink is the token set's non-inverting dark —
     the same reason the modal scrim is built from it: --ink and --bg swap, and a
     shadow that inverts is a light halo on a dark page. */
  box-shadow: 0 12px 32px color-mix(in srgb, var(--seg-ink) 18%, transparent);
}
.site-lang__panel { inset-inline-end: 0; }
.site-tools__panel { inset-inline-start: 0; min-inline-size: 12.5rem; }

.site-panel a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  min-block-size: 2.75rem;
  padding-inline: var(--sp-3);
  border-radius: var(--r-1);
  color: var(--ink);
  text-decoration: none;
}
.site-panel a:hover { background: var(--surface-2); }
/* THE AUTONYM'S ROW IS LAID OUT BY THE LIST, NOT BY THE AUTONYM.
   Every language link carries `dir="auto"` (spec §4.3) so "العربية" is its own bidi run and
   cannot reorder whatever sits beside it. On a full-width row that attribute has a second
   effect nobody asked for: it makes the ROW right-to-left, so the one Arabic entry in an
   English list sits flush against the far edge while the other five sit at the near one —
   and its tick lands on the opposite side from all the others. `direction: inherit` takes the
   base direction back from the attribute and leaves `unicode-bidi: isolate`, which is the half
   that matters, exactly as the attribute set it. Measured: the isolation survives. It is the
   same pairing `code, kbd, samp, pre` uses above, for the same kind of reason — and on an
   Arabic page it inherits `rtl`, so that list mirrors as a whole, which is the point. */
.site-panel a,
.site-foot__langs a { direction: inherit; }
.site-panel a[aria-current="page"] { color: var(--brand); font-weight: 700; }
/* A tick on the row you are already on. Generated content and therefore not a string
   a translator is asked for: it is a mark, not a word, and it reads the same in six
   languages. `aria-current` is what says it to a screen reader. */
.site-panel a[aria-current="page"]::after { content: "✓"; font-size: var(--fs-0); }

/* ── the theme control ───────────────────────────────────────────────── */
.site-seg {
  display: inline-flex;
  gap: 2px;
  padding: 2px;
  flex: none;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r-round);
}
.site-seg button {
  min-block-size: 2.75rem;
  padding-inline: var(--sp-4);
  border-radius: var(--r-round);
  color: var(--ink-2);
  font-size: var(--fs-0);
  font-weight: 600;
  transition: background-color var(--t-fast) ease-out, color var(--t-fast) ease-out;
}
.site-seg button:hover { color: var(--ink); }
.site-seg button[aria-pressed="true"] {
  background: var(--brand);
  color: var(--brand-ink);
}

/* The pocket panel's copy of the control (pages/_layout.tsx says why there are two). The
   pocket only ever renders below 46rem, so these rules never meet the masthead's copy —
   which site.css hides there. Full-width, so the three labels share the panel's measure
   instead of huddling at its start under a column of full-width links. */
.site-tools__panel .site-seg { display: flex; margin-block-start: var(--sp-1); }
.site-tools__panel .site-seg button { flex: 1 1 0; padding-inline: var(--sp-2); }

/* ── the footer ──────────────────────────────────────────────────────── */
/* A real site footer now: the tools, the site's own pages and the six languages, each
   under a heading, then a base line carrying the mark and the two promises. It is a
   SURFACE rather than a rule under the content, which is what separates it from the
   page above it without a second hairline. */
.site-foot {
  margin-block-start: var(--sp-7);
  background: var(--surface);
  border-block-start: 1px solid var(--line);
  font-size: var(--fs-0);
  color: var(--ink-2);
}
.site-foot__grid {
  display: grid;
  gap: var(--sp-5);
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  padding-block: var(--sp-6) var(--sp-5);
}
/* An <h2> the size of an eyebrow: the columns need a heading a screen reader can
   navigate by, and a display-sized one in a footer would shout. The Arabic and
   Chinese letter-spacing reset in the typography block above applies to it already. */
.site-foot__head {
  margin-block-end: var(--sp-2);
  font-size: var(--fs-0);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.site-foot__col a {
  display: block;
  padding-block: var(--sp-1);
  color: var(--ink);
  font-weight: 600;
  text-decoration: none;
}
.site-foot__col a:hover { color: var(--brand); text-decoration: underline; }
.site-foot__col a[aria-current="page"] { color: var(--brand); }
.site-foot__base {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-2) var(--sp-5);
  padding-block: var(--sp-4) var(--sp-6);
  border-block-start: 1px solid var(--line);
}

/* ── print: black on white, no chrome ────────────────────────────────── */
@media print {
  :root,
  :root[data-theme="dark"] {
    --bg: #FFFFFF; --surface: #FFFFFF; --surface-2: #FFFFFF;
    --ink: #000000; --ink-2: #333333; --line: #999999;
    --brand: #000000; --brand-ink: #FFFFFF; --brand-soft: #FFFFFF;
    --ok: #000000; --warn: #000000; --danger: #000000;
    --chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 6.2 8 10l4-3.8' fill='none' stroke='%23333333' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  }
  /* The masthead's BrandMark is gone with the rest of `.site-nav` below, but the footer's
     provenance row keeps its own copy (`.site-foot__base`, not `[data-no-print]`), and
     that one still has to print.

     Segment colours never invert (same story as components.css's `.team-card__name`):
     the mark's six slices are SVG `fill="var(--seg-N)"` attributes, which the `:root`
     override above does not reach, and would leave a coloured pinwheel on an otherwise
     black-on-white sheet — or nothing at all, in a browser that drops fill colour when
     background printing is off. Same treatment as the team card: the slices take the
     print palette's own ink instead. The hub needs no rule of its own EITHER, and since
     the owner's logo replaced the stand-in (2026-09-02) that is for a better reason than
     before: the hub is a real HOLE in the drawing, so the page shows through it — white,
     here, because this block has just made every ground white. It used to be a painted
     `fill="var(--surface)"` circle, which happened to come out white for the same reason
     and only by way of a token that could have moved. */
  .site-brand__mark path { fill: var(--ink); }

  /* `.site-nav` is the whole header — both decks — so one selector still hides it. */
  .site-nav,
  .skip-link,
  button,
  [data-no-print] { display: none !important; }
  body { background: #FFFFFF; color: #000000; }
  a { color: #000000; text-decoration: underline; }
}
