/* base.css — reset, custom properties, defaults.
   Structural pass only. No design system, no fonts (009 §2).

   ⚠️ "NO PALETTE" WAS TRUE UNTIL 2026-09-03 AND IS NOT ANY MORE (156 §1A).
   The sentence used to read "no design system, no fonts, no palette," and
   css/fonts.css:25-27 still cites it by name as the reason the faces are not
   declared here — that reasoning is unaffected and still correct, because
   fonts are what moved out, not what moved in. What moved in is exactly one
   token, --accent, and it is here rather than in a section sheet because
   three separate places on the site already resolve to the same colour and
   none of them could see the others. Corrected in the same pass that added
   it: 149 shipped a fonts.css header that had stopped being true, and 000 §5
   catalogues a stale header as its own defect class. */

:root {
  /* 156 §1A. Xinlu 2026-09-03, by looking at the bar's four swinging dots and
     asking for that colour. It is the site's oldest orphan: INSPIRE's word
     colour, kept alive after the word itself went (000 §8), still sampled by
     projects/glow.js:53-58 as a hardcoded HUES.word = '226 34 58' — and
     #6E7FB8 measures HSL 226.22 34.26 57.65, which is that triple. 000 §8's
     own suggested resolution was to promote it from "the word's colour" to
     "the site's accent"; this is that promotion, reached independently.

     ⚠️ THE CONTRAST TRADE IS REAL AND IS XINLU'S TO WEIGH (156 §1A.2).
     Against the intro's black: resting #c4c4c4 is 12.040:1, this accent is
     5.391:1. Hovering an item makes it markedly more colourful and markedly
     dimmer. It clears the 4.5 small-text floor and the 3.0 thin-rule floor,
     so it is a trade and not a defect — but ?railhover=lift only reaches
     9.337:1, and with this hue there is no tint that keeps the colour and
     out-brightens near-white. The third dial is --rail-rest, not this. */
  --accent: #6E7FB8;

  /* Section height. svh is the small viewport height: it stays fixed while
     iOS Safari's address bar collapses, where vh does not. A collapsing vh
     forces a mid-scroll refresh, which is how pins break (009 §8). */
  --section-h: 100vh;      /* fallback for browsers without svh */
  --label-size: clamp(2rem, 8vw, 5rem);
  --index-size: clamp(0.75rem, 2vw, 1rem);
}

@supports (height: 100svh) {
  :root { --section-h: 100svh; }
}

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

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

body,
h1,
h2,
p { margin: 0; }

/* ⚠️ h1 JOINED THIS LIST ON 2026-08-31 (106 §3.2). The site had no <h1> at all
   between v0.8.0 and v0.10.0 — 091 C1' measured the count at 0 — so the UA's
   0.67em default never applied to anything. The hero's heading is absolutely
   positioned and its top is a percentage, so a stray margin would offset it
   from the value --type-y names without changing that value. */

/* ONE visually-hidden recipe, two consumers, one place. .badge__sr held these
   same nine declarations in css/chrome/badge.css until 2026-08-31; it is
   folded in here rather than copied, because two copies that drift is an
   accessibility bug nothing renders and no screenshot shows. Kept as a
   selector list rather than renaming .badge__sr, so no badge markup changes.
   clip AND clip-path: the first is deprecated and the second is not
   universally honoured on the element types this is used on, so both ship. */
.u-sr-only,
.badge__sr {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

body {
  font-family: system-ui, -apple-system, sans-serif;
  background: #101010;
  color: #f4f4f4;
}
