/* ==========================================================================
   shauntstats — design system (ATHLETIC EDITORIAL rebrand, 2026-07-10)

   Surface 1 — LIGHT "The Edition" (DEFAULT): cream #F4F3ED paper, ink
   #1A1A1A, warm-gray chrome, slab-serif display, one signal red. Print-
   editorial: generous whitespace, double hairline rules, inline numerals,
   no glows, no neon.
   Surface 2 — DARK "The Night Edition": neutral ink-black #121212 canvas,
   panels #1B1B1B, warm paper-white ink stack, bright text-grade red accent.
   Same editorial furniture, inverted paper.

   THEME MECHANISM
   - Default tokens are LIGHT (cream). html[data-theme="dark"] pins the
     Night Edition (manual toggle, persisted by lab.js). A persisted
     html[data-theme="light"] resolves to the cream default (alias rule).
   - Chart code must reference tokens (var(--viz-*)), never raw hex, so both
     themes work with zero JS re-rendering.

   BRAND REDS (the old wordmark gold is dead — no gold anywhere in the system)
   - --accent: text-grade Athletic red (#C22F24 cream / #FF6B5E night),
     >= 4.5:1 on bg AND surface in each theme. UI duty: links, kickers,
     active states. NEVER a chart series.
   - --brand-red #FF4B44: graphic duty ONLY — thick rules, hero-plate
     washes, byline middots, display marks. Never body text, never a series.
   - --brand-mark: the red the "stats" half of the wordmark wears
     (#D6362B cream, 4.27:1 display-grade / #FF4B44 night, 5.2:1).
   - The hero plate and the footer are ALWAYS ink-black (#121212), in both
     themes — they re-scope the ink/accent tokens locally.

   TYPOGRAPHY
   - Display: RobotoSlab (variable 100–900, latin subset, embedded below —
     no external requests). H1/hero wght 800, tight leading (1.05); the
     standfirst is slab wght 300 (the Athletic dek). Body: system sans.
   - Kickers / micro-labels: ui-monospace, UPPERCASE, +0.08em tracking —
     colored --accent red by default; data-accent family tints override.
   - Numbers: mono + tabular-nums, always.

   VIZ PALETTE — validated with the dataviz six-checks validator (2026-07-09;
   surfaces re-verified for the Night Edition 2026-07-10):
   - DARK values are UNCHANGED from the Scout Lab validation; the chart
     surface moved #141A22 -> #1B1B1B (near-identical lightness, neutral
     hue). Re-verified 2026-07-10: all 8 categorical slots + home/away
     >= 3:1 on #1B1B1B (worst: cat-5 3.29:1); all --cat-* kicker accents
     >= 4.5:1. sequential (mint, one hue): ordinal PASS. diverging
     salmon/mint: pair CVD 19.0. home/away teal/violet: pair CVD 51.1.
   - LIGHT, chart surface #F4F3ED (cream) — values unchanged:
       categorical 8: ALL CHECKS PASS — worst adjacent CVD ΔE 42.0 (protan),
       all slots >= 3:1 on cream. No relief slots.
       sequential (teal, one hue): ordinal PASS (pale end 2.14:1).
       diverging: pair CVD 12.3, both >= 3:1.
       home/away #ff4b44/#00a0de: pair CVD 68.7 BUT sub-3:1 on cream
       (2.98 / 2.67) — RELIEF BAND: any light-theme chart using
       --viz-home/--viz-away MUST ship visible direct labels or a table view
       of the same values (match/model charts on this site already do).
   - SCATTER DUTY (all-pairs CVD): safe without extra encoding up to slots
       {1,2,3,5,8} in dark and {1,2,3,5} in light (ΔE >= 12); slot sets
       {1..5,8} dark / {1,2,3,4,5,7} light sit in the 8–12 floor band and
       are legal ONLY with direct labels or distinct markers. Beyond that,
       label every cluster (the site convention anyway).
   - Slot N keeps the same hue family in both themes, so a series never
     changes identity when the reader toggles the theme.
   ========================================================================== */

/* --------------------------------------------------------------------------
   0. Embedded display face — RobotoSlab (Apache-2.0), variable wght 100–900,
      latin subset, woff2. ~28 KB raw / ~37 KB base64.
   -------------------------------------------------------------------------- */

@font-face {
  font-family: "RobotoSlab";
  src: url("data:font/woff2;base64,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") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* METRIC-MATCHED FALLBACK (CLS, audit 2026-07-28; recut 2026-08-10 — full
   story in tests/audit/budgets.json notes["perf.teams"]). Two rules the first
   cut broke: (1) same family + same descriptors = the LAST @font-face WINS,
   so the old Georgia/Times pair silently rendered Times metrics everywhere —
   alternate local sources need separate families, stacked in --font-display;
   (2) one size-adjust cannot serve a variable slab: measured slab/Georgia is
   ~1.05 at wght 300-400 but ~0.93 at 700-800, hence weight bands, and the bold
   band must name the bold face (a bare local("Georgia") pins regular at every
   weight). ascent/descent (1.05/0.27em) divide by size-adjust. NOT
   font-display:optional — that drops the slab on a slow paint. */
@font-face {
  font-family: "RobotoSlab-fallback";
  src: local("Georgia");
  font-weight: 100 500;
  size-adjust: 105.3%; ascent-override: 99.7%; descent-override: 25.6%; line-gap-override: 0%;
}
@font-face {
  font-family: "RobotoSlab-fallback";
  src: local("Georgia-Bold"), local("Georgia Bold");
  font-weight: 501 900;
  size-adjust: 92.9%; ascent-override: 113.0%; descent-override: 29.1%; line-gap-override: 0%;
}
@font-face {
  font-family: "RobotoSlab-fallback-t";
  src: local("Times New Roman"), local("Liberation Serif");
  font-weight: 100 500;
  size-adjust: 114.5%; ascent-override: 91.7%; descent-override: 23.6%; line-gap-override: 0%;
}
@font-face {
  font-family: "RobotoSlab-fallback-t";
  src: local("TimesNewRomanPS-BoldMT"), local("Times New Roman Bold"), local("LiberationSerif-Bold"), local("Liberation Serif Bold");
  font-weight: 501 900;
  size-adjust: 111.2%; ascent-override: 94.4%; descent-override: 24.3%; line-gap-override: 0%;
}

/* --------------------------------------------------------------------------
   1. Design tokens — LIGHT "The Edition" (cream) is the DEFAULT
   -------------------------------------------------------------------------- */

:root, .theme-scope[data-theme="light"] {
  color-scheme: light;

  /* Surfaces */
  --bg: #F4F3ED;              /* cream paper canvas */
  --bg-glow: none;            /* glow gradients are dead — both themes */
  --surface: #FBFAF5;         /* cards / chart surface (validated on #F4F3ED) */
  --surface-2: #ECEAE0;       /* wells, tracks, method boxes, table stripes */
  --surface-glass: rgba(244, 243, 237, 0.84);  /* translucent panel (header) */
  --border: rgba(26, 26, 26, 0.16);
  --hairline: rgba(26, 26, 26, 0.09);
  --line: var(--border);      /* control-border alias (fixes ui-audit KO-1) */

  /* Ink */
  --ink: #1A1A1A;             /* primary text     15.7:1 on cream */
  --ink-2: #5C5A52;           /* warm secondary    6.2:1 */
  --ink-3: #6d6c64;           /* brand warm gray   4.75:1 on --bg, 5.05:1 on --surface (AA, F-104) — meta only */

  /* Statz-score tiers — editorial colour for the cross-league score. Coral for
     the standouts, ink for the field, grey for rotational (resolved by the
     .score-* classes). Coral pair is text-grade on cream (>= 4.5:1 on --bg). */
  --score-elite: #b5341f;     /* 82+  standout coral   5.43:1 on --bg */
  --score-excellent: #b64d10; /* 72+  orange coral     4.65:1 on --bg, ΔE 15.3 from elite */
  --score-strong: var(--ink); /* 60+  the field, primary ink */
  --score-solid: var(--ink-2);   /* 48+  secondary ink */
  --score-rotational: var(--ink-3); /* <48 muted meta ink */

  /* Accent — text-grade Athletic red (5.07:1 on --bg, 5.39:1 on --surface) */
  --accent: #C22F24;
  --accent-ink: #FBFAF5;      /* cream ink on accent fills */
  --accent-wash: rgba(194, 47, 36, 0.08);

  /* Brand reds. --brand-red is GRAPHIC duty only (thick rules, hero-plate
     washes, display marks) — never body text, never a chart series.
     --brand-mark is the red the "stats" half of the wordmark wears —
     text-grade #C22F24 (5.07:1 on cream; the old #D6362B sat at 4.27:1,
     under the 4.5:1 normal-text bar — audit W2-A6). */
  --brand-red: #FF4B44;
  --brand-mark: #C22F24;

  /* Wordmark — ink on cream; the marked word wears --brand-mark. */
  --wordmark: #1A1A1A;

  /* Chart chrome */
  --grid: #D9D6CC;            /* warm gridlines (recessive on cream) */
  --axis: #B0ADA2;            /* warm spines */

  /* Categorical series (fixed order — assign 1..N, never cycle, never skip).
     Athletic 4-cat palette + same-hue-family extensions; slot N mirrors the
     dark slot's hue family. Validated on cream 2026-07-09. */
  --viz-cat-1: #4a77b8;       /* blue    (Athletic attack — brand-exact) */
  --viz-cat-2: #b87b10;       /* amber   (Athletic progression, chart-graded) */
  --viz-cat-3: #0c8570;       /* teal    (Athletic possession, chroma-lifted) */
  --viz-cat-4: #b0530e;       /* rust    (shooting family) */
  --viz-cat-5: #8c3049;       /* maroon  (Athletic defence — brand-exact) */
  --viz-cat-6: #6f930c;       /* olive   (progression/lime family) */
  --viz-cat-7: #7945aa;       /* violet  (dribbling family) */
  --viz-cat-8: #0e7552;       /* green   (possession family) */

  /* Sequential (teal, one hue) — LOW → HIGH = pale → deep on cream.
     Magnitude only. */
  --viz-seq-1: #54b9a2;
  --viz-seq-2: #3ca38d;
  --viz-seq-3: #1e8d78;
  --viz-seq-4: #0a7764;
  --viz-seq-5: #006151;
  --viz-seq-6: #054b3e;
  --viz-seq-7: #02372d;

  /* Diverging: polarity around a baseline — salmon/mint poles, chart-graded;
     midpoint is a neutral, never a hue. */
  --viz-div-neg: #bb3237;     /* below baseline / unlucky / underperforming */
  --viz-div-mid: #DBD7CA;
  --viz-div-pos: #127a56;     /* above baseline / lucky / overperforming */

  /* Status — reserved meaning, never "series N", always icon+label. */
  --viz-good: #178a43;
  --viz-warn: #9a7100;
  --viz-serious: #a54a22;
  --viz-critical: #b3261e;

  /* Match colors (The Athletic convention). RELIEF: 2.98/2.67 on cream —
     charts using these MUST direct-label or ship a table twin. */
  --viz-home: #ff4b44;        /* home side / "model" series */
  --viz-away: #00a0de;        /* away side / "baseline" series */
  --viz-draw: var(--ink-3);   /* draws / neutral */

  /* Percentile heat ramp (STATZ pills: 0–25–50–75–90). Component fills with
     dark ink text — NOT chart-series colors. Same pastels in both themes. */
  --pct-1: #F0716D;
  --pct-2: #F59E6D;
  --pct-3: #F5C86D;
  --pct-4: #B8E06D;
  --pct-5: #2DD4A0;
  --pct-ink: #10151C;

  /* Category accents (stat families) — icon / kicker / border-tint duty.
     Text-grade on cream (>= 4.5:1). */
  --cat-attacking: #7e5d08;
  --cat-shooting: #934407;
  --cat-creation: #06707c;
  --cat-dribbling: #7931b2;
  --cat-progression: #536f06;
  --cat-possession: #006f4d;
  --cat-defence: #3658ac;
  --cat-receiving: #8c3d6c;

  /* Typography */
  --font-display: "RobotoSlab", "Roboto Slab", "RobotoSlab-fallback", "RobotoSlab-fallback-t", Rockwell, Georgia, serif;
  --font-body: system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  --font-mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace;

  /* TYPE FLOOR (audit 2026-07-28). --fs-xs called itself the floor while 45
     declarations across 11 pages sat below it, inventing their own size — down
     to 0.52rem (8.3px). Those labels are also the ones set in --ink-3, whose
     4.75:1 holds at 12px but NOT below, which is why light theme carried far
     more contrast failures than dark (scout 326 vs 104).
     Two legal rungs below --fs-xs, and nothing else:
       --fs-2xs   DOM text. The hard floor. Dense sub-labels and units only,
                  never a sentence, and pair it with --ink-2, not --ink-3.
       --fs-tick  SVG chart ticks ONLY. Exempt because axis labels are read
                  against the plot, not as prose — do not use it in the DOM. */
  /* MEASURE (audit 2026-07-28). Running text sat at 91-101 chars/line (44em x
     17px = 748px); 63ch measures ~85. ch not rem — measure follows the FONT, and
     .method-box runs 14px. NOTE 1ch here is 10.7px vs a 7.8px average glyph, so
     1ch ~ 1.35 chars: the number is NOT the target char count, it was counted.
     Set to 54ch (~73) first, which reads better in isolation but left 450-520px
     of empty container beside it on the tool pages — that reads as a broken
     layout, not a considered measure. 85 is the width that holds in both. */
  --measure: 63ch;
  --fs-xs: 0.75rem;           /* 12 — axis ticks, kickers, source lines */
  --fs-2xs: 0.6875rem;        /* 11 — dense sub-labels ONLY. Floor for DOM text. */
  --fs-tick: 0.6875rem;       /* 11 — SVG chart ticks. Not for DOM. */
  --fs-sm: 0.875rem;          /* 14 — captions, table body, UI */
  --fs-base: 1.0625rem;       /* 17 — prose */
  --fs-lg: 1.1875rem;         /* 19 — standfirst */
  --fs-h3: 1.1875rem;
  --fs-h2: clamp(1.5rem, 1.2rem + 1.5vw, 2rem);
  --fs-h1: clamp(2.25rem, 1.5rem + 3.4vw, 3.5rem);
  --fs-hero: clamp(2.75rem, 1.8rem + 4.6vw, 5.5rem);

  /* Layout */
  --shell-max: 68.75rem;      /* 1100px */
  --shell-pad: clamp(1rem, 4vw, 2rem);
  --sp-1: 0.25rem;
  --sp-2: 0.5rem;
  --sp-3: 0.75rem;
  --sp-4: 1rem;
  --sp-5: 1.5rem;
  --sp-6: 2rem;
  --sp-7: 3rem;
  --sp-8: 4.5rem;
  --r-sm: 4px;   /* Athletic chrome is near-square — separation by whitespace */
  --r-md: 4px;
  --r-lg: 6px;
  --shadow: 0 1px 2px rgba(19, 18, 16, 0.06), 0 8px 24px rgba(19, 18, 16, 0.07);
  /* Warm-tinted like --shadow. Three popover panels (.sl-drawer, .ctx-panel,
     .nav-panel) and the pressed segmented button used to hardcode PURE BLACK,
     which reads cold-grey against cream — the only holes left in an otherwise
     fully tokenized system (audit 2026-07-28). Note .hero-panel keeps its own
     pure-black shadow deliberately: it is a photographic print on the ink-black
     plate, not a panel on paper. */
  --shadow-pop: 0 8px 28px rgba(19, 18, 16, 0.16);
  --shadow-inset: 0 1px 2px rgba(19, 18, 16, 0.14);
}

/* Dark tokens — "The Night Edition" (manual toggle): Athletic ink-black.
   The --viz-*, --pct-* and --cat-* values below are the Scout Lab dark
   palette UNCHANGED (validated 2026-07-09 on #141A22; re-verified 2026-07-10
   on the new #1B1B1B chart surface — all slots >= 3:1, worst cat-5 3.29:1). */
:root[data-theme="dark"], .theme-scope[data-theme="dark"] {
  color-scheme: dark;

  --bg: #121212;              /* neutral ink-black */
  --bg-glow: none;
  --surface: #1B1B1B;         /* panels, cards, chart surface */
  --surface-2: #242424;       /* wells, tracks, method boxes, table stripes */
  --surface-glass: rgba(18, 18, 18, 0.78);
  --border: #343230;          /* neutral warm-black hairlines */
  --hairline: rgba(242, 239, 233, 0.10);
  --line: var(--border);      /* control-border alias (fixes ui-audit KO-1) */

  --ink: #F2EFE9;             /* warm paper-white  15.0:1 on --surface */
  --ink-2: #BBB8B0;           /* secondary          8.7:1 */
  --ink-3: #8F8D86;           /* muted              5.2:1 — meta only */

  /* Statz-score tiers — Night Edition. Coral pair is text-grade on ink
     (>= 4.5:1 on --bg); ink tiers inherit the audited --ink family. */
  --score-elite: #ff6f57;     /* 82+  standout coral   6.84:1 on --bg */
  --score-excellent: #f0876e; /* 72+  softer coral     7.49:1 on --bg */
  --score-strong: var(--ink);
  --score-solid: var(--ink-2);
  --score-rotational: var(--ink-3);

  /* Accent — bright text-grade red (6.2:1 on --surface, 6.7:1 on --bg) */
  --accent: #FF6B5E;
  --accent-ink: #121212;
  --accent-wash: rgba(255, 107, 94, 0.10);

  --brand-red: #FF4B44;
  --brand-mark: #FF4B44;      /* 5.2:1 on --surface at display size */
  --wordmark: #F2EFE9;        /* cream wordmark on ink */

  --grid: #262626;            /* neutral hairline gridlines (recessive) */
  --axis: #4A4740;            /* warm-neutral spine */

  /* Categorical series — Scout dark palette, verbatim. */
  --viz-cat-1: #577edb;       /* blue    (defence family) */
  --viz-cat-2: #bc8c12;       /* amber   (attacking) */
  --viz-cat-3: #04a5b5;       /* cyan    (creation) */
  --viz-cat-4: #c05d18;       /* orange  (shooting) */
  --viz-cat-5: #aa4a83;       /* rose    (receiving) */
  --viz-cat-6: #79a100;       /* lime    (progression) */
  --viz-cat-7: #9555d0;       /* violet  (dribbling) */
  --viz-cat-8: #0e835c;       /* green   (possession) */

  /* Sequential ramp, LOW → HIGH (mint, one hue). Low recedes toward the
     panel; high glows. Magnitude only. */
  --viz-seq-1: #075b42;
  --viz-seq-2: #007556;
  --viz-seq-3: #0f906a;
  --viz-seq-4: #17ab80;
  --viz-seq-5: #28c595;
  --viz-seq-6: #4cdeac;
  --viz-seq-7: #68f5c2;

  --viz-div-neg: #db5151;
  --viz-div-mid: #36404D;
  --viz-div-pos: #17ab80;

  --viz-good: #2DD4A0;
  --viz-warn: #F5C86D;
  --viz-serious: #F59E6D;
  --viz-critical: #F0716D;

  /* Dark A-vs-B: entity A teal, entity B violet (pair CVD ΔE 51.1). */
  --viz-home: #15ac99;
  --viz-away: #af6cef;
  --viz-draw: var(--ink-3);

  --pct-1: #F0716D;
  --pct-2: #F59E6D;
  --pct-3: #F5C86D;
  --pct-4: #B8E06D;
  --pct-5: #2DD4A0;
  --pct-ink: #10151C;

  /* Category accents — the Scout pastels (all >= 6.5:1 as text on #1B1B1B). */
  --cat-attacking: #F5C86D;
  --cat-shooting: #F59E6D;
  --cat-creation: #67E8F9;
  --cat-dribbling: #C084FC;
  --cat-progression: #B8E06D;
  --cat-possession: #34D399;
  --cat-defence: #7DA2F5;
  --cat-receiving: #F9A8D4;

  --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.3);
  /* On ink-black, black IS the correct shadow hue — these carry more opacity
     than their cream counterparts because the surface underneath is darker. */
  --shadow-pop: 0 8px 28px rgba(0, 0, 0, 0.5);
  --shadow-inset: 0 1px 2px rgba(0, 0, 0, 0.35);
}

/* Alias: a persisted data-theme="light" IS the cream default — kept so
   readers who toggled to light under the old system resolve identically. */
:root[data-theme="light"] {
  color-scheme: light;
}

/* Category accent hook: stamp data-accent="attacking|shooting|creation|
   dribbling|progression|possession|defence|receiving" on any component to
   tint its kicker / hover edge with that stat family's hue. */
[data-accent="attacking"]   { --accent-cat: var(--cat-attacking); }
[data-accent="shooting"]    { --accent-cat: var(--cat-shooting); }
[data-accent="creation"]    { --accent-cat: var(--cat-creation); }
[data-accent="dribbling"]   { --accent-cat: var(--cat-dribbling); }
[data-accent="progression"] { --accent-cat: var(--cat-progression); }
[data-accent="possession"]  { --accent-cat: var(--cat-possession); }
[data-accent="defence"]     { --accent-cat: var(--cat-defence); }
[data-accent="receiving"]   { --accent-cat: var(--cat-receiving); }

/* Statz-score tier classes (theme-independent; resolve the --score-* tokens
   defined in both theme blocks above). See Lab.scoreTier() in lab.js. */
.score-elite { color: var(--score-elite); }
.score-excellent { color: var(--score-excellent); }
.score-strong { color: var(--score-strong); }
.score-solid { color: var(--score-solid); }
.score-rotational { color: var(--score-rotational); }
.score-na { color: var(--ink-3); }

/* --------------------------------------------------------------------------
   2. Base
   -------------------------------------------------------------------------- */

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

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

body {
  margin: 0;
  background-color: var(--bg);
  background-image: var(--bg-glow);
  background-repeat: no-repeat;
  background-attachment: fixed;
  color: var(--ink);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: 1.6;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
}

img, svg { max-width: 100%; height: auto; }
svg { display: block; }

a { color: var(--accent); text-underline-offset: 0.15em; }
a:hover { color: var(--ink); }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: 2px;
}

/* Chart data points are transparent SVG hit shapes (attachTip makes them
   focusable so keyboard users get the same tooltip hover gives). An outline on
   a zero-fill <path> is invisible in some engines and clipped by the chart's
   viewBox in others, so paint the shape itself on focus instead. */
.pz-hit:focus-visible, .wh-hit:focus-visible, .bar-hit:focus-visible {
  outline: none;
  fill: var(--accent-wash);
  stroke: var(--accent);
  stroke-width: 2;
}

::selection { background: var(--accent-wash); }

.visually-hidden {
  position: absolute; width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  overflow: hidden; white-space: nowrap;
}

.skip-link {
  position: absolute; left: var(--sp-4); top: -3rem;
  background: var(--surface); color: var(--ink);
  padding: var(--sp-2) var(--sp-4); border-radius: var(--r-sm);
  border: 1px solid var(--border); z-index: 100;
  transition: top 120ms ease;
}
.skip-link:focus { top: var(--sp-2); }

/* --------------------------------------------------------------------------
   3. Typography
   -------------------------------------------------------------------------- */

h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 700;
  line-height: 1.12;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 0;
}
h1 { font-size: var(--fs-h1); font-weight: 800; line-height: 1.05; letter-spacing: -0.015em; }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); font-family: var(--font-body); font-weight: 600; letter-spacing: 0; }

p { margin: 0 0 var(--sp-4); }

/* Mono-UPPERCASE micro-label — red by default; data-accent tints override. */
.kicker {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent-cat, var(--accent));
  margin: 0 0 var(--sp-2);
}

/* The Athletic dek: light slab, a step above body size. */
.standfirst {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.1875rem, 1.05rem + 0.65vw, 1.4375rem);
  line-height: 1.5;
  color: var(--ink-2);
  max-width: var(--measure);
}

.muted { color: var(--ink-3); }
.small { font-size: var(--fs-sm); }

/* Numbers: mono, tabular. Use .num on every inline data figure. */
.num, .mono {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: 0.94em;
}

.prose { max-width: var(--measure); }
/* Unclassed <p> IS running prose; classed <p> is chrome. annual.html sets its
   long-read body as bare <p> in section.shell — nothing constrained it, 126-134
   chars/line at 1036px, the site's worst. Footnotes/chart-sources/hints all carry
   a class and stay full width: a source line belongs under the chart it cites. */
.section > p:not([class]),
/* about.html's source descriptions are prose too — they just live one div deeper,
   so the selector above cannot reach them (measured 146-158 characters). */
.src p { max-width: var(--measure); }
.prose p { color: var(--ink-2); }
.prose strong { color: var(--ink); font-weight: 600; }
.prose h2, .prose h3 { margin: var(--sp-6) 0 var(--sp-3); }
.prose ul, .prose ol { color: var(--ink-2); padding-left: 1.4em; margin: 0 0 var(--sp-4); }
.prose li { margin-bottom: var(--sp-2); }
.prose code {
  font-family: var(--font-mono); font-size: 0.85em;
  background: var(--surface-2); border: 1px solid var(--hairline);
  border-radius: 4px; padding: 0.1em 0.35em;
}
.prose blockquote {
  margin: var(--sp-5) 0; padding: var(--sp-2) var(--sp-5);
  border-left: 2px solid var(--accent); color: var(--ink-2);
  font-family: var(--font-display); font-size: var(--fs-lg); font-style: italic;
}

/* Wordmark — the Athletic house style: bold slab, "shaunt" in ink
   (cream on the ink footer / Night Edition), "stats" in the brand red.
   Markup: shaunt<span class="brand-mark">stats</span>. Gold is dead. */
.wordmark {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.0625rem;
  letter-spacing: -0.01em;
  color: var(--wordmark);
  text-decoration: none;
  white-space: nowrap;
}
.wordmark.sm { font-size: 0.9375rem; }
.wordmark .brand-mark { color: var(--brand-mark); }

/* --------------------------------------------------------------------------
   4. Layout: shell, header, footer, sections
   -------------------------------------------------------------------------- */

.shell {
  max-width: var(--shell-max);
  margin-inline: auto;
  padding-inline: var(--shell-pad);
}

.site-header {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--surface-glass);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
/* Masthead rule-double — the inline signature under the brand row. */
.site-header::after {
  content: "";
  display: block;
  height: 5px;                /* 1px rule + 3px gap + 1px rule */
  border-top: 1px solid var(--ink);
  border-bottom: 1px solid var(--ink);
}
.header-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  min-height: 3.5rem;
}
/* Brand lockup (existing markup: "shaunt<span class=brand-mark>stats</span>")
   — ink slab wordmark, the marked word wears the brand red. */
.brand {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 1.125rem;
  letter-spacing: -0.01em;
  color: var(--ink);
  text-decoration: none;
  white-space: nowrap;
}
.brand:hover { color: var(--ink); }
.brand .brand-mark { color: var(--brand-mark); }
/* RESERVE THE NAV'S BOX (CLS, 2026-08-10). lab.js swaps .nav-back for
   [Index][Shortlist n] after first paint; a content-sized nav grew ~42px
   leftward and Lighthouse booked the settle as a shift. flex:1 spans the box
   brand -> right edge from FIRST paint: injection changes what it contains,
   never its rect, and flex-end keeps Search/theme pinned through the swap. */
.site-nav {
  display: flex; align-items: center; gap: var(--sp-4);
  flex: 1 1 auto; justify-content: flex-end; min-width: 0;
}
/* Same box metrics as the .nav-toggle that replaces it — the swap exchanges
   one bordered chip for another, not a bare link for a button. */
.nav-back {
  font: 600 var(--fs-sm) var(--font-body);
  border: 1px solid var(--line); border-radius: 4px;
  padding: 3px 10px;
  color: var(--ink-2);
  text-decoration: none;
  white-space: nowrap;
}
.nav-back:hover { color: var(--ink); border-color: var(--ink-3); }

/* ── Dense lists ──────────────────────────────────────────────────────── */
/* Long homogeneous lists (fixtures, chips) skip layout/paint offscreen —
   the cheap alternative to virtualization for a few hundred rows. */
.dense-list > * { content-visibility: auto; contain-intrinsic-size: auto 44px; }

/* ── Shortlist (masthead drawer + star toggles, injected by lab.js) ───── */
.sl-toggle {
  border: 1px solid var(--line); background: transparent; color: var(--ink-2);
  font: 600 var(--fs-sm) var(--font-body); border-radius: 4px;
  padding: 3px 10px; cursor: pointer;
}
.sl-toggle:hover, .sl-toggle[aria-expanded="true"] { color: var(--ink); border-color: var(--ink-3); }
.sl-count { color: var(--ink); }
.sl-drawer {
  /* --masthead-offset is measured by lab.js on open/resize — the header
     wraps taller than 52px on narrow screens. */
  position: fixed; top: var(--masthead-offset, 52px); right: var(--sp-4); z-index: 70;
  width: min(21rem, calc(100vw - 2 * var(--sp-4)));
  background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-lg);
  box-shadow: var(--shadow-pop);
  padding: var(--sp-3); max-height: 70vh; overflow-y: auto;
}
.sl-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: var(--sp-2); }
.sl-act {
  border: 1px solid var(--line); background: transparent; color: var(--ink-2);
  font: 600 0.72rem var(--font-body); border-radius: 4px; padding: 2px 8px; cursor: pointer;
}
.sl-act:hover { color: var(--ink); }
.sl-acts { display: inline-flex; gap: var(--sp-2); }
.sl-hint { color: var(--ink-3); font-size: 0.72rem; margin-left: var(--sp-2); }
.sl-empty { color: var(--ink-3); font-size: var(--fs-sm); margin: var(--sp-2) 0; }
.sl-row { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); padding: 4px 0; border-top: 1px solid var(--line); }
.sl-row a { color: var(--ink); text-decoration: none; font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sl-row a:hover { color: var(--ink-2); }
.sl-x { border: 0; background: transparent; color: var(--ink-3); cursor: pointer; font-size: 0.8rem; }
.sl-x:hover { color: var(--ink); }
.sl-foot { border-top: 1px solid var(--line); padding-top: var(--sp-2); margin-top: var(--sp-2); font-size: var(--fs-sm); }
.sl-foot a { color: var(--ink-2); }
.sl-btn {
  border: 0; background: transparent; color: var(--ink-3); cursor: pointer;
  font-size: 1rem; line-height: 1; padding: 2px 4px;
}
.sl-btn:hover, .sl-btn[aria-pressed="true"] { color: var(--ink); }
/* The star is an inline SVG rather than a ★/☆ glyph — see the comment on
   Lab.shortlist.button. It sizes off the button's font-size so every existing
   call site keeps the dimensions it already had, and `display: block` keeps it
   off the text baseline (an inline SVG otherwise leaves a descender gap that
   made the button 3px taller than the row).
   `flex: none` matters because most call sites put the button in a flex row
   (.p-cell on board/archetypes, the fit rows): a glyph simply overflowed a
   shrunken box, but an SVG honours it, and the star rendered 14px wide in a
   16px slot until the button was told not to shrink. */
.sl-btn { flex: none; }
.sl-star { width: 1em; height: 1em; display: block; }

/* ── Player context chip (masthead, injected by lab.js) ────────────────── */
.ctx-chip {
  border: 1px solid var(--line); background: transparent; color: var(--ink-2);
  font: 600 var(--fs-sm) var(--font-body); border-radius: 4px;
  padding: 3px 10px; cursor: pointer; max-width: 11rem;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ctx-chip:hover, .ctx-chip[aria-expanded="true"] { color: var(--ink); border-color: var(--ink-3); }
.ctx-chip .ctx-mark { color: var(--accent); }
.ctx-panel {
  position: fixed; top: var(--masthead-offset, 52px); right: var(--sp-4); z-index: 72;
  width: min(16rem, calc(100vw - 2 * var(--sp-4)));
  background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-lg);
  box-shadow: var(--shadow-pop); padding: var(--sp-3);
}
.ctx-panel .ctx-head { margin: 0 0 var(--sp-2); font: 700 var(--fs-sm) var(--font-display); }
.ctx-panel .ctx-body { display: flex; flex-direction: column; gap: 6px; }
.ctx-panel a { color: var(--ink-2); text-decoration: none; font-size: var(--fs-sm); }
.ctx-panel a:hover, .ctx-panel a:focus-visible { color: var(--ink); }
.ctx-panel .sl-act { align-self: flex-start; margin-top: var(--sp-2); }

/* ── Page index (masthead switcher panel, injected by lab.js) ──────────── */
.nav-toggle {
  border: 1px solid var(--line); background: transparent; color: var(--ink-2);
  font: 600 var(--fs-sm) var(--font-body); border-radius: 4px;
  padding: 3px 10px; cursor: pointer;
}
.nav-toggle:hover, .nav-toggle[aria-expanded="true"] { color: var(--ink); border-color: var(--ink-3); }
.nav-panel {
  position: fixed; top: var(--masthead-offset, 52px); right: var(--sp-4); z-index: 71;
  width: min(38rem, calc(100vw - 2 * var(--sp-4)));
  background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-lg);
  box-shadow: var(--shadow-pop);
  padding: var(--sp-3) var(--sp-4); max-height: min(80vh, 42rem); overflow-y: auto;
  display: grid; grid-template-columns: 1fr 1fr; column-gap: var(--sp-5);
}
/* display:grid would beat the UA's [hidden]{display:none} — restore it. */
.nav-panel[hidden] { display: none; }
.nav-col { min-width: 0; }
.nav-group { margin-bottom: var(--sp-3); }
.nav-group-title {
  display: block;
  font: 700 var(--fs-xs) var(--font-mono);
  text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-3);
  padding-bottom: 4px; border-bottom: 1px solid var(--ink);
  text-decoration: none; /* group titles are links to their flagship page */
}
a.nav-group-title:hover, a.nav-group-title:focus-visible { color: var(--accent); }
.nav-item {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--sp-2); padding: 5px 0; border-top: 1px solid var(--line);
  text-decoration: none;
}
.nav-group .nav-item:first-of-type { border-top: 0; }
.nav-item-label { color: var(--ink); font-weight: 600; font-size: var(--fs-sm); }
.nav-item-sub {
  font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--ink-3);
  text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Athletic hover discipline: dim to ink-2 — never red, never underline. */
.nav-item:hover .nav-item-label { color: var(--ink-2); }
/* Current page wears the red print marker (accent chrome, not headline red). */
.nav-item[aria-current="page"] .nav-item-label::before {
  content: "▸ "; color: var(--brand-mark);
}
.nav-foot {
  grid-column: 1 / -1; display: flex; justify-content: space-between; gap: var(--sp-3);
  border-top: 1px solid var(--line); padding-top: var(--sp-2); font-size: var(--fs-sm);
}
.nav-foot a { color: var(--ink-2); text-decoration: none; }
.nav-foot a:hover { color: var(--ink); }
.nav-foot a[aria-current="page"] { color: var(--ink); }
@media (max-width: 640px) {
  .nav-panel { grid-template-columns: 1fr; }
  .nav-foot { flex-direction: column; gap: var(--sp-1); }
}

main { display: block; }

.section { margin-block: var(--sp-8); }
.section-title { margin-bottom: var(--sp-3); }
/* Oversized inline numeral — the Gretel "inline" echo. Sits beside section
   titles: <h2 class="section-title"><span class="section-no">01</span> …</h2>.
   Solid ink where text-stroke is unsupported; hollow (stroked) elsewhere. */
.section-no {
  font-family: var(--font-display);
  font-size: 2.75rem;
  font-weight: 800;
  line-height: 1;
  letter-spacing: 0;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  vertical-align: -0.08em;
  margin-right: 0.3em;
}
@supports (-webkit-text-stroke: 1px black) {
  .section-no {
    color: transparent;
    -webkit-text-stroke: 1.5px var(--ink);
  }
}
.section-lede { color: var(--ink-2); max-width: var(--measure); margin-bottom: var(--sp-5); }

/* Fold — the shared collapsible-section primitive (native <details> for free
   a11y). Promoted from builder.html's details.metric-group idiom so every
   page folds the same way. Markup:
     <details class="fold" id="x" data-default="closed">
       <summary>Title <span class="fold-count">N</span></summary>
       <div class="fold-body">…</div>
     </details>
   Lab.folds() (lab.js) syncs open state to the ?open= URL param by id. */
details.fold {
  border: 1px solid var(--hairline); border-radius: var(--r-sm);
  background: var(--surface); margin-bottom: var(--sp-3);
}
details.fold > summary {
  cursor: pointer; display: flex; align-items: baseline; gap: var(--sp-2);
  padding: var(--sp-3);
  font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-2);
  user-select: none; -webkit-user-select: none; list-style: none;
}
details.fold > summary::-webkit-details-marker { display: none; }
details.fold > summary::after {
  content: "\203A";                 /* › chevron: right closed, down open */
  margin-left: auto; align-self: center;
  color: var(--ink-3); font-size: 1.1em; line-height: 1;
  transition: transform 0.15s ease;
}
details.fold[open] > summary::after { transform: rotate(90deg); }
details.fold > summary .fold-count { color: var(--ink-3); font-weight: 600; }
details.fold > .fold-body { padding: 0 var(--sp-3) var(--sp-3); }

.page-header { padding-block: var(--sp-8) var(--sp-6); }
.page-header .page-title { max-width: 14em; }
.page-header .standfirst { margin-top: var(--sp-4); }
.page-meta {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  letter-spacing: 0.04em;
  color: var(--ink-3);
  margin-top: var(--sp-3);
}

/* Footer — an ink-black band in BOTH themes (theathletic.com convention),
   cream text, rule-double on top. Ink/brand tokens are re-scoped so the
   existing footer markup (credit line + .wordmark.sm) resolves cream/red. */
.site-footer {
  --ink: #F2EFE9;
  --ink-2: #CBC8C0;
  --ink-3: #A5A29A;
  --accent: #FF6B5E;
  --accent-wash: rgba(255, 107, 94, 0.12);
  --wordmark: #F2EFE9;
  --brand-mark: #FF4B44;
  --border: #343230;
  --hairline: rgba(242, 239, 233, 0.22);
  margin-top: var(--sp-8);
  background: #121212;
  color: var(--ink-2);
  padding-block: var(--sp-2) var(--sp-6);
  font-size: var(--fs-sm);
}
.site-footer::before {
  content: "";
  display: block;
  height: 5px;                /* rule-double in cream across the band */
  border-top: 1px solid var(--ink);
  border-bottom: 1px solid var(--ink);
  margin-bottom: var(--sp-5);
}
.site-footer a { color: var(--ink-2); }
.site-footer a:hover { color: var(--ink); }

hr.rule { border: 0; border-top: 1px solid var(--hairline); margin: var(--sp-7) 0; }

/* Double hairline — the inline signature. Use as <hr class="rule-double">
   or an empty <div class="rule-double" aria-hidden="true">. */
.rule-double {
  display: block;
  border: 0;
  height: 5px;                /* 1px rule + 3px gap + 1px rule */
  border-top: 1px solid var(--ink);
  border-bottom: 1px solid var(--ink);
  background: none;
  margin: var(--sp-7) 0;
}

/* Byline — mono meta row with red middot separators:
   <p class="byline">By the pipeline <span class="dot">·</span> July 2026</p> */
.byline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.3em 0.6em;
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-3);
  margin: var(--sp-4) 0 0;
}
.byline .dot { color: var(--brand-red); font-weight: 700; }

/* --------------------------------------------------------------------------
   5. Stat tiles & strips — terminal readouts
   -------------------------------------------------------------------------- */

.stat-strip {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
  gap: 1px;
  background: var(--hairline);
  border: 1px solid var(--hairline);
  border-radius: var(--r-md);
  overflow: hidden;
  margin-block: var(--sp-6);
}
.stat-tile {
  background: var(--surface);
  padding: var(--sp-5) var(--sp-4);
}
.stat-tile .stat-label {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
  margin-bottom: var(--sp-2);
}
.stat-tile .stat-value {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: clamp(1.4rem, 1.1rem + 1.4vw, 2rem);
  font-weight: 600;
  color: var(--ink);
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.stat-tile .stat-sub {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin-top: var(--sp-1);
}
.stat-tile .stat-delta { font-family: var(--font-mono); font-size: var(--fs-sm); }
.stat-delta.up { color: var(--viz-good); }
.stat-delta.down { color: var(--viz-critical); }

/* --------------------------------------------------------------------------
   6. Cards (hub grid + generic)
   -------------------------------------------------------------------------- */

.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-5);
}

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(18.5rem, 1fr));
  gap: var(--sp-4);
}

.demo-card {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  background: var(--surface);
  border: 1px solid var(--border);
  border-top: 2px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-5);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 140ms ease, color 140ms ease;
}
/* Image-led cards (the Athletic front page): a landscape crop of the page's
   hero band bleeds to the card edges; the SVG motif is the no-image
   fallback (onerror removes .card-photo, :has() reveals the motif). */
.demo-card .card-photo {
  aspect-ratio: 3 / 2;
  overflow: hidden;
  margin: calc(-1 * var(--sp-5)) calc(-1 * var(--sp-5)) var(--sp-4);
  border-radius: 5px 5px 0 0;
  background: var(--surface-2);
}
.demo-card .card-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  filter: contrast(1.04);
}
.demo-card:has(.card-photo) .card-motif { display: none; }

/* Athletic hover: text dims — no lift, no shadow, no underline. */
.demo-card:hover, .demo-card:focus-visible {
  border-color: var(--accent-cat, var(--accent));
  color: var(--ink);
}
.demo-card:hover .card-title, .demo-card:focus-visible .card-title { color: var(--ink-2); }
.demo-card .kicker { margin-bottom: 0; }
.demo-card .card-title {
  font-family: var(--font-display);
  font-size: 1.4rem;
  font-weight: 700;
  line-height: 1.15;
}
.demo-card .card-hook {
  color: var(--ink-2);
  font-size: var(--fs-sm);
  line-height: 1.5;
  margin: 0;
  flex-grow: 1;
}
.demo-card .card-motif {
  margin-top: var(--sp-3);
  height: 3.5rem;
  display: flex;
  align-items: flex-end;
}
.demo-card .card-motif svg { height: 100%; width: auto; max-width: 100%; }

/* --------------------------------------------------------------------------
   7. Data tables
   -------------------------------------------------------------------------- */

/* A <caption> takes its TABLE's width, and the table lives inside this
   scroll container — so on a phone a caption on a 1,000px table laid its text
   out across 1,000px and ran off-screen. These captions carry the sourcing and
   the "click a header to sort" affordance, so they were the one part of the
   table you could not read without scrolling sideways to find it. Pin the
   caption to the container's left edge and let it wrap in the visible width;
   the table still scrolls underneath it. */
.table-wrap > table > caption {
  position: sticky;
  left: 0;
  width: max-content;
  /* 100vw overshoots by the wrapper's own inset; 100cqi is exactly the
     container's visible inline size, which is the box we want to wrap in. */
  max-width: 100vw;
  max-width: 100cqi;
  text-align: left;
}

/* ...but a caption that opts OUT of being seen has to win that back. The rule
   above (0,1,2) and .data-table caption (0,1,1) both outrank a lone
   .visually-hidden (0,1,0), so scout's screen-reader-only table caption kept
   position:sticky and width:max-content and held a real ~32x24 box in the
   header. Its text was blank only because .visually-hidden also ships
   clip-path, which survives a position override where the older clip
   rect(0,0,0,0) does not — clip applies to absolutely positioned boxes only.
   Hidden paint is not hidden layout: give the caption the utility back. */
.table-wrap > table > caption.visually-hidden {
  position: absolute;
  width: 1px;
  max-width: none;
  padding: 0;
}

.table-wrap {
  container-type: inline-size;
  overflow: auto;
  max-height: 32rem;
  border: 1px solid var(--hairline);
  border-radius: var(--r-md);
  background: var(--surface);
}
.data-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size: var(--fs-sm);
}
.data-table caption {
  text-align: left; padding: var(--sp-3) var(--sp-4);
  color: var(--ink-2); font-weight: 600;
}
.data-table th {
  position: sticky;
  top: 0;
  z-index: 2;
  background: var(--surface-2);
  color: var(--ink-2);
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: left;
  padding: var(--sp-2) var(--sp-3);
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.data-table td {
  padding: var(--sp-2) var(--sp-3);
  border-bottom: 1px solid var(--hairline);
  vertical-align: baseline;
}
.data-table tbody tr:last-child td { border-bottom: 0; }
.data-table tbody tr:hover td { background: var(--surface-2); }
/* Row leader. The flank panel's caption promised "best in bold" and
   shipped with no rule behind it, so nothing was bold. */
.data-table td.is-best { font-weight: 700; color: var(--ink); }

.data-table .num, .data-table th.num, .data-table td.num {
  text-align: right;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}
.data-table th[data-sort] { cursor: pointer; user-select: none; }
.data-table th[data-sort]:hover { color: var(--ink); }
.data-table th[aria-sort]::after {
  content: ""; display: inline-block; margin-left: 0.4em;
  border: 4px solid transparent; vertical-align: middle;
}
.data-table th[aria-sort="ascending"]::after { border-bottom-color: var(--ink-2); margin-bottom: 3px; }
.data-table th[aria-sort="descending"]::after { border-top-color: var(--ink-2); margin-top: 3px; }

/* --------------------------------------------------------------------------
   8. Chart containers
   -------------------------------------------------------------------------- */

figure.chart {
  margin: var(--sp-5) 0;
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-lg);
  padding: var(--sp-5);
}
.chart-head { margin-bottom: var(--sp-4); }
.chart-title {
  font-family: var(--font-display);
  font-size: 1.0625rem;
  font-weight: 700;
  color: var(--ink);
  margin: 0;
}
.chart-sub {
  font-size: var(--fs-sm);
  color: var(--ink-2); /* carries the unit/encoding — must not be meta-gray */
  margin: var(--sp-1) 0 0;
}
/* Horizontal overflow lives INSIDE the chart body — the page never scrolls x. */
.chart-body { overflow-x: auto; overflow-y: hidden; }
.chart-body > svg { min-width: var(--chart-min, 34rem); width: 100%; height: auto; }
.chart-body.no-min > svg { min-width: 0; }
figcaption.chart-source, .chart-source {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin: var(--sp-3) 0 0;
}

/* In-SVG conventions (builders: use these classes inside chart SVGs) */
.chart svg text { font-family: var(--font-body); fill: var(--ink-2); }
.chart svg .tick text, .chart svg .axis-label {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: 11px;
  fill: var(--ink-3);
}
.chart svg .grid line { stroke: var(--grid); stroke-width: 1; }
.chart svg .axis line, .chart svg .axis path { stroke: var(--axis); stroke-width: 1; }
.chart svg .series-line { fill: none; stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
.chart svg .direct-label { font-size: 12px; font-weight: 600; fill: var(--ink); }

/* Legend (HTML, above or below the plot) */
.legend {
  display: flex; flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-4);
  font-size: var(--fs-sm); color: var(--ink-2);
  margin: var(--sp-3) 0 0;
  padding: 0; list-style: none;
}
.legend li { display: inline-flex; align-items: center; gap: 0.45em; }
.legend .swatch {
  display: inline-block; width: 0.85em; height: 0.85em;
  border-radius: 3px; flex: none;
}
.legend .swatch.line { height: 3px; width: 1.2em; border-radius: 2px; }

/* --------------------------------------------------------------------------
   9. Tooltip (singleton, positioned by lab.js)
   -------------------------------------------------------------------------- */

.lab-tip {
  position: fixed;
  z-index: 90;
  max-width: 18rem;
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  box-shadow: var(--shadow);
  padding: var(--sp-2) var(--sp-3);
  font-size: var(--fs-sm);
  line-height: 1.45;
  pointer-events: none;
  opacity: 0;
  transition: opacity 80ms ease;
}
.lab-tip.show { opacity: 1; }
.lab-tip .tip-title { font-weight: 650; margin-bottom: 2px; }
.lab-tip .tip-row { display: flex; align-items: baseline; gap: 0.5em; }
.lab-tip .tip-key {
  align-self: center;
  width: 0.9em; height: 3px; border-radius: 2px; flex: none;
}
.lab-tip .tip-label { color: var(--ink-2); margin-right: auto; }
.lab-tip .tip-val {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}

/* --------------------------------------------------------------------------
   10. Controls: buttons, segmented controls, sliders, toggle
   -------------------------------------------------------------------------- */

.btn {
  display: inline-flex; align-items: center; gap: 0.4em;
  font: inherit; font-size: var(--fs-sm); font-weight: 600;
  color: var(--ink); background: var(--surface);
  border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 0.4em 0.9em; cursor: pointer;
}
.btn:hover { border-color: var(--ink-3); color: var(--ink); }
.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }

/* Segmented control: <div class="seg" role="group"> of buttons.
   lab.js flips aria-pressed; CSS renders state. */
.seg {
  display: inline-flex;
  /* containment: a seg never leaks past its container — cap it and let the
     buttons wrap onto a second row when the space runs out (the buttons
     themselves stay nowrap, so wide segs fold between buttons, not mid-label) */
  flex-wrap: wrap;
  max-width: 100%;
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 3px;
  gap: 2px;
}
.seg .seg-btn {
  font: inherit; font-size: var(--fs-sm); font-weight: 600;
  color: var(--ink-2); background: transparent;
  border: 0; border-radius: calc(var(--r-md) - 4px);
  padding: 0.32em 0.85em; cursor: pointer;
  white-space: nowrap;
}
.seg .seg-btn:hover { color: var(--ink); }
.seg .seg-btn[aria-pressed="true"] {
  background: var(--surface);
  color: var(--ink);
  box-shadow: var(--shadow-inset);
}

/* PRESSED STATES + CONTROL TRANSITIONS (audit 2026-07-28).
   This stylesheet had 26 :hover rules and ZERO :active rules, and the primary
   controls carried no transition at all — so every hover snapped at 0ms and
   nothing on the site acknowledged a click. On a product whose whole interaction
   IS clicking segmented controls, chips and sort headers, that is the most-felt
   gap in the system.

   All six interactive families are listed together deliberately: fixing two of
   them would leave the other four dead and make the inconsistency worse than the
   original defect. 120ms matches the cadence already used elsewhere in this file
   (:399, :861) — NOT the 200-300ms that generic guidance suggests, which reads as
   sluggish on a control you click hundreds of times in a session.

   transform is the only animated property here (compositor-only, no layout), and
   the blanket prefers-reduced-motion block at the end of this file already zeroes
   every duration, so these need no separate guard. */
.btn,
.seg .seg-btn,
.sl-toggle,
.sl-btn,
.ctx-chip,
.theme-toggle {
  transition: border-color 120ms ease, background-color 120ms ease,
              color 120ms ease, transform 60ms ease;
}
.btn:active,
.sl-toggle:active,
.sl-btn:active,
.ctx-chip:active,
.theme-toggle:active { transform: translateY(1px); }
/* the segmented button sits inside a track, so it scales rather than shifting —
   a 1px drop would break its alignment against the neighbouring segments */
.seg .seg-btn:active { transform: scale(0.98); }

/* Controls row: ONE row above the content it scopes — never inside a chart. */
.controls-row {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-3) var(--sp-4);
  margin-block: var(--sp-4);
}
.controls-row label { font-size: var(--fs-sm); color: var(--ink-2); font-weight: 600; }

select {
  font: inherit; font-size: var(--fs-sm);
  color: var(--ink); background: var(--surface);
  border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 0.35em 0.6em;
}

/* Range slider */
input[type="range"] {
  -webkit-appearance: none; appearance: none;
  width: 12rem; max-width: 100%; height: 1.4rem;
  background: transparent; cursor: pointer;
}
input[type="range"]::-webkit-slider-runnable-track {
  height: 4px; border-radius: 2px; background: var(--surface-2);
}
input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 16px; height: 16px; margin-top: -6px;
  border-radius: 50%; background: var(--accent);
  border: 2px solid var(--surface);
}
input[type="range"]::-moz-range-track {
  height: 4px; border-radius: 2px; background: var(--surface-2);
}
input[type="range"]::-moz-range-thumb {
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--accent); border: 2px solid var(--surface);
}
input[type="range"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
output.range-out {
  font-family: var(--font-mono); font-variant-numeric: tabular-nums;
  font-size: var(--fs-sm); color: var(--ink); min-width: 3.5em; display: inline-block;
}

/* Theme toggle */
.theme-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.25rem; height: 2.25rem;
  background: transparent; color: var(--ink-2);
  border: 1px solid var(--border); border-radius: 50%;
  cursor: pointer; padding: 0;
}
.theme-toggle:hover { color: var(--ink); border-color: var(--ink-3); }
.theme-toggle svg { width: 1.05rem; height: 1.05rem; }
/* Show the icon of the theme you would switch TO. Default (cream): moon. */
.theme-toggle .tt-sun { display: none; }
.theme-toggle .tt-moon { display: block; }
:root[data-theme="dark"] .theme-toggle .tt-sun { display: block; }
:root[data-theme="dark"] .theme-toggle .tt-moon { display: none; }

/* --------------------------------------------------------------------------
   11. Method box, badges, footnotes, data errors
   -------------------------------------------------------------------------- */

/* Notebook card: cream well, rule-double header rule, red mono title.
   HTML contract unchanged — this restyle is CSS-only. */
.method-box {
  background: var(--surface-2);
  border: 1px solid var(--hairline);
  border-radius: var(--r-md);
  padding: var(--sp-5);
  /* margin-inline must stay auto: compare.html uses <aside class="method-box
     shell">, so the box IS the shell there — a shorthand `margin: … 0` overrides
     .shell's margin-inline:auto and slams the whole card against the viewport
     edge (audit 2026-07-28). Block margin only. */
  margin-block: var(--sp-6);
  margin-inline: auto;
}
/* The method box spans its container, and so does the prose inside it — same
   width as the Notes & caveats block beneath it. Capping the box (2026-07-28)
   was wrong twice over: with `margin: … 0` it left-aligned instead of centring,
   and a 723px card under a 1100px notes list reads as a mis-set column, not as a
   measure. Consistency across the page beats the ideal line length here. */
.method-box::before {
  content: "";
  display: block;
  height: 5px;                /* rule-double across the notebook head */
  border-top: 1px solid var(--ink);
  border-bottom: 1px solid var(--ink);
  margin-bottom: var(--sp-4);
}
.method-box .method-title {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0 0 var(--sp-3);
}
.method-box p:last-child { margin-bottom: 0; }
.method-box code {
  font-family: var(--font-mono); font-size: 0.85em;
  background: var(--surface); border: 1px solid var(--hairline);
  border-radius: 4px; padding: 0.1em 0.35em;
}

/* Text pill ONLY — scout/dashboard reuse .badge on <img> club crests, and the
   pill's background/padding/radius turn an 18px crest into a blank gray disc. */
.badge:not(img) {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 0.15em 0.7em;
  white-space: nowrap;
}
.badge.accent { color: var(--accent); background: var(--accent-wash); border-color: transparent; }

.footnote {
  font-size: var(--fs-sm);
  color: var(--ink-3);
  border-top: 1px solid var(--hairline);
  padding-top: var(--sp-3);
  margin-top: var(--sp-6);
}
.footnote sup, sup.fn { font-family: var(--font-mono); font-size: 0.7em; color: var(--accent); }

.data-error {
  background: var(--surface-2);
  border: 1px solid var(--viz-critical);
  border-radius: var(--r-md);
  color: var(--ink);
  padding: var(--sp-4) var(--sp-5);
  margin: var(--sp-5) 0;
  font-size: var(--fs-sm);
}
.data-error strong { color: var(--viz-critical); }

/* --------------------------------------------------------------------------
   12. Percentile pill (STATZ heat ramp — component fill, dark ink text)
   -------------------------------------------------------------------------- */

.pct-pill {
  display: inline-block;
  min-width: 2.4em;
  text-align: center;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--pct-ink);
  border-radius: 999px;
  padding: 0.12em 0.55em;
}
/* Fill with the band's ramp stop via JS/inline style: background: var(--pct-3) */

/* Two absences, two looks — see Lab.pct. `.na` is a deliberate choice not to
   rank (solid, quiet); `.gated` is a sample too small to report (dashed, so it
   reads as a hole rather than a value). Both were page-local copies before. */
.pct-pill.na {
  background: var(--surface-2); color: var(--ink-2);
  box-shadow: inset 0 0 0 1px var(--hairline);
}
/* --axis, not --grid: the dashed outline has to read at 1px in BOTH themes,
   and --grid (#262626) vanishes against the dark surface (#1B1B1B). */
.pct-pill.gated {
  background: none; color: var(--ink-3);
  border: 1px dashed var(--axis);
  padding: calc(0.12em - 1px) calc(0.55em - 1px);
}
.pct-pill.is-tipped { outline: 2px solid var(--accent); outline-offset: 1px; }

/* The named percentile key (Lab.pct.legend). The old .pct-scale was an
   aria-hidden gradient: it showed the ramp and never named a boundary. */
.pct-legend { font-size: var(--fs-xs); color: var(--ink-3); letter-spacing: 0.02em; }
.pct-legend .legend-lab {
  font-family: var(--font-mono); text-transform: uppercase;
  letter-spacing: 0.08em; color: var(--ink-3);
}

/* --------------------------------------------------------------------------
   13. Entities: avatars, club badges, chips
   -------------------------------------------------------------------------- */

/* Player headshot. Sizes: .s 1.5rem / .m 2.25rem (default) / .l 3.5rem.
   The same classes work on the .avatar-fallback initials <div>. */
.avatar {
  width: 2.25rem; height: 2.25rem;
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface-2);
  border: 1px solid var(--border);
  flex: none;
  vertical-align: middle;
}
.avatar.s { width: 1.5rem; height: 1.5rem; }
.avatar.l { width: 3.5rem; height: 3.5rem; }

/* Initials variant — used when no headshot exists / an image 404s. */
.avatar-fallback {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 0.8125rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink-2);
  user-select: none;
}
.avatar-fallback.s { font-size: 0.5625rem; }
.avatar-fallback.l { font-size: 1.125rem; }

/* Club badge (inline crest image). Square box, contained, no crop. */
.club-badge {
  width: 1.5rem; height: 1.5rem;
  object-fit: contain;
  flex: none;
  vertical-align: middle;
}
.club-badge.s { width: 1.125rem; height: 1.125rem; }
.club-badge.l { width: 2.5rem; height: 2.5rem; }

/* Entity chip: badge/avatar + name inline. */
.entity-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink);
  white-space: nowrap;
  vertical-align: middle;
}
.entity-chip .muted { font-weight: 400; }

/* --------------------------------------------------------------------------
   14. Hero plate — the editorial cover. A rounded ink-black plate (BOTH
       themes; it is the one always-dark element besides the footer) holding
       the red kicker → slab display headline → standfirst → byline, plus
       tilted duotone photo panels with a cream-on-ink SVG motif fallback.

       Markup contract (see PAGE_TEMPLATE.md, Athletic addendum v2):
         <div class="hero-plate">
           <div class="hero-copy"> kicker / h1 / standfirst / byline </div>
           <figure class="hero-art" data-panels="4" role="presentation">
             <div class="hero-panels" aria-hidden="true"></div>
             <div class="plate-motif" aria-hidden="true"> …inline SVG… </div>
           </figure>
         </div>
       JS: Lab.heroArt('<slug>', document.querySelector('.hero-art'));
       Panels stay hidden until a hero image actually loads — the motif is
       the default, so nothing ever looks broken and nothing shifts layout.
   -------------------------------------------------------------------------- */

.hero-plate {
  /* Always-ink plate: re-scope ink/accent tokens so children resolve cream
     and Night-grade red in BOTH themes. (Verified: ink 16.3:1, ink-2 11.2:1,
     ink-3 7.4:1, accent 6.7:1 on #121212.) */
  --ink: #F2EFE9;
  --ink-2: #CBC8C0;
  --ink-3: #A5A29A;
  --accent: #FF6B5E;
  --accent-cat: var(--accent); /* light-graded family tints fail contrast on ink — plate kickers wear night red */
  --accent-wash: rgba(255, 107, 94, 0.12);
  --wordmark: #F2EFE9;
  --brand-mark: #FF4B44;
  --border: #343230;
  --hairline: rgba(242, 239, 233, 0.14);
  /* Surfaces belong to the plate's contract too. Without these, an element
     inside the plate that reaches for --surface gets the LIGHT theme's
     near-white #FBFAF5 and paints a pale panel on the ink — while its text
     resolves to the cream --ink re-scoped above, i.e. cream on near-white.
     That is exactly what happened to .entrance (index.html): its
     color-mix(--surface 55%) composited to rgb(146,146,143), leaving the
     kicker at 2.72:1 and the description at 1.22:1. The plate re-scopes what
     children resolve; surfaces were the gap. */
  --surface: #1B1B1B;
  --surface-2: #242424;
  --surface-glass: rgba(18, 18, 18, 0.78);
  background: #121212;
  color: var(--ink);
  border-radius: 14px; /* the poster plate keeps its radius (spec-settled) */
  padding: clamp(1.5rem, 4vw, 3rem);
  /* Art BESIDE the copy, not stacked above it. Measured 2026-07-27: the
     banner-on-top layout made the median plate 944px on a 900px desktop
     viewport — 105%, so every page opened with nothing but masthead. Side
     by side, the plate is as tall as its TALLER column instead of the sum
     of both. Phones keep the stack (there is no room for two), and copy
     stays first in the DOM for readers either way. */
  display: grid;
  grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr);
  align-items: center;
  gap: var(--sp-5);
  overflow: hidden;
}
.hero-plate .hero-art { order: 1; }
.hero-plate .hero-copy { min-width: 0; max-width: 46em; }
.hero-plate h1 { color: var(--ink); font-size: var(--fs-hero); line-height: 1.05; }
:root[data-theme="dark"] .hero-plate { border: 1px solid var(--border); }

/* Art slot: motif fallback and photo panels overlay the same grid cell, so
   swapping them causes zero layout shift. Motif is the no-image default. */
.hero-art {
  display: grid;
  min-height: 13rem;
  margin: 0;
}
.hero-art > * { grid-area: 1 / 1; min-width: 0; }
.hero-art .hero-panels { display: none; }
.hero-art.has-art .hero-panels { display: flex; }
.hero-art.has-art .plate-motif { display: none; }

/* Fallback: the page's SVG motif, scaled up, cream-on-ink. */
.plate-motif {
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0.9;
}
.plate-motif svg { width: min(100%, 22rem); height: auto; }

/* Tilted vertical photo panels (filled by Lab.heroArt). Athletic-collage
   proportions: tall ~1:2 strips that FILL the art column, slightly
   overlapping, alternating tilt — not small floating thumbnails. */
.hero-panels {
  gap: 0;
  align-items: center;
  justify-content: center;
  padding: clamp(0.75rem, 2vw, 1.5rem) var(--sp-2);
}
.hero-panel {
  flex: 1 1 0;
  min-width: 0;
  max-width: 11rem;
  height: clamp(15rem, 26vw, 24rem);
  margin-inline: clamp(-0.4rem, -0.6vw, -0.25rem); /* slight overlap, like pasted prints */
  border-radius: 4px;
  overflow: hidden;
  position: relative;
  background: #1B1B1B;
  transform: rotate(-3.4deg);
  box-shadow: 0 12px 30px rgba(0, 0, 0, 0.55);
}
.hero-panel:nth-child(2n) { transform: rotate(2.6deg) translateY(3.5%); height: clamp(13.5rem, 24vw, 22rem); z-index: 1; }
.hero-panel:nth-child(3n) { transform: rotate(-1.8deg) translateY(-3%); }
.hero-panel img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  /* full-colour agency photography (spec §7 USER OVERRIDE) — light print
     punch only, no duotone, no wash */
  filter: contrast(1.06) saturate(1.03);
}
/* Pre-composed collage art (the delivered 21:9 prompts compose their own
   panels-on-cream): render as ONE tilted print, never re-sliced. */
.hero-panel--print {
  flex: 0 1 auto;
  width: auto;
  max-width: 100%;
  max-height: min(72vh, 36rem);
  height: auto;
  aspect-ratio: 16 / 10; /* pre-load default; JS adopts the art's true aspect */
  margin-inline: 0;
  transform: rotate(-0.9deg); /* subtle pinned-print tilt at banner scale */
}

@media (max-width: 800px) {
  /* ONE source of truth for the phone art band's height. It is reserved on the
     container AND applied to the panel, so the box is the right size from first
     paint whether it is showing the fallback motif or the loaded art. Changing
     this clamp moves both together — which is the point. */
  .hero-plate { --hero-art-h: clamp(7rem, 28vh, 12rem); --hero-band-pad: 12px; }
  .hero-plate { grid-template-columns: 1fr; align-items: stretch; }
  .hero-plate .hero-art { order: -1; }
  /* audit W3-P2: on phones the art used to eat most of viewport one (up to
     72vh) before the title appeared — compact it to a cropped editorial
     band so title + first control land above the fold. Lab.heroArt prefers
     the 4:5 portrait source on phones and the 21:9 source on compact tablets;
     both skip the aspect-ratio stamp so the fixed-height cover crop can win. */
  /* RESERVED, not 0 (CLS, audit 2026-07-28). order:-1 puts this band ABOVE the
     copy, and Lab.heroArt fills it after load — unreserved, it grew from the
     motif to the full band and pushed the page down. Measured on index:
     .hero-copy did not change height, it MOVED +105px. */
  /* + the band's own block padding (.hero-panels is padded 12px 8px), or the
     reservation is 24px short and the page still drops when the art lands. */
  .hero-art { min-height: calc(var(--hero-art-h) + 2 * var(--hero-band-pad)); }
  .hero-panel--print {
    aspect-ratio: auto;
    width: 100%;
    height: var(--hero-art-h);
    max-height: none;
  }
  .hero-panel--print img { width: 100%; height: 100%; object-fit: cover; object-position: center 30%; }
  .plate-motif svg { width: min(100%, 9rem); }
}

/* ---- The hero fold (2026-07-27) ---------------------------------------
   Measured at 390px: the plate ran 762-1455px against an 844px viewport —
   a median 98% of the first screen, so no page showed a single row of its
   own content until you scrolled. The cost is not the art (216px) but the
   copy: a standfirst wrapping to ten lines (261-493px) and a provenance
   byline wrapping to six (110-130px). Neither is what you came for, and
   neither is deleted — the standfirst clamps to its first four lines and
   the byline waits behind one control. Above 50rem both run in full: the
   standfirst is three lines there and the byline is one. */
@media (max-width: 50rem) {
  .hero-plate .standfirst {
    display: -webkit-box; -webkit-box-orient: vertical;
    -webkit-line-clamp: 4; overflow: hidden;
  }
  .hero-plate .standfirst.is-open {
    -webkit-line-clamp: unset; overflow: visible;
  }
  /* provenance rides with the standfirst — one control, not two */
  .hero-plate .byline { display: none; }
  .hero-plate .standfirst.is-open ~ .byline { display: block; }
}
/* Wide screens never fold, so the control has nothing to say. */
@media (min-width: 50.0625rem) { .hero-more { display: none; } }

/* RESERVE THE FOLD CONTROL'S BOX (CLS, audit 2026-07-28).
   lab.js injects .hero-more at DOMContentLoaded, after the browser has already
   painted the parsed hero — so every phone page shifted its entire body down by
   the button's height once the script ran. Measured +52px on hero-copy across
   index/scout/compare, and it was the single largest CLS contributor sitewide
   because it fires on EVERY page rather than only the ones with a wide nav.

   The placeholder copies the button's box metrics exactly (same margin, padding,
   font and casing) rather than hardcoding a pixel height, so it cannot drift out
   of sync when the type scale moves. :has() removes the reservation the instant
   the real button lands, so nothing is double-counted and nothing is left behind
   on wide screens where the button is display:none. */
@media (max-width: 50rem) {
  .hero-copy:not(:has(.hero-more))::after {
    content: "More";
    /* inline-block, NOT block: <button> is inline-block, so it sits on a text
       baseline and its line box adds ~8px of descender leading underneath. A
       block placeholder has no line box and under-reserved by exactly that. */
    display: inline-block;
    visibility: hidden;
    margin-top: var(--sp-2);
    padding: 0.35em 0;
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }
}
.hero-more {
  margin-top: var(--sp-2); padding: 0.35em 0;
  background: none; border: 0; cursor: pointer;
  font-family: var(--font-mono); font-size: var(--fs-xs);
  letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--accent);
}
.hero-more:hover { text-decoration: underline; }
.hero-more:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }

/* ------------------------------- Hub-specific --------------------------- */

.hero { padding-block: var(--sp-7) var(--sp-4); }
.hero .hero-title {
  font-size: var(--fs-hero);
  max-width: 14em;
  margin-bottom: var(--sp-4);
}
/* The hub headline is a SENTENCE where every other page's is a title. At the
   shared poster scale (--fs-hero tops out at 5.5rem) it wrapped to five lines
   and 462px inside the copy column — the tallest single element on the site,
   and the reason the hub's own entrances sat below the fold. Scaled to the
   column it actually occupies, it still leads the plate. */
.hero-plate .hero-title { font-size: clamp(2.1rem, 3.4vw, 3.1rem); }
/* Athletic red is never headline text — emphasis is italic ink. */
.hero .hero-title em { font-style: italic; color: inherit; }
.hero .manifesto { font-size: var(--fs-lg); color: var(--ink-2); max-width: 42em; }

/* --------------------------------------------------------------------------
   15. Responsive & motion
   -------------------------------------------------------------------------- */

@media (max-width: 640px) {
  .page-header { padding-block: var(--sp-7) var(--sp-5); }
  .section { margin-block: var(--sp-7); }
  .card-grid { grid-template-columns: 1fr; }
  .stat-strip { grid-template-columns: repeat(2, 1fr); }
  input[type="range"] { width: 100%; }
}
@media (max-width: 400px) {
  .stat-strip { grid-template-columns: 1fr 1fr; }
  .stat-tile { padding: var(--sp-4) var(--sp-3); }
  .header-row { min-height: 3rem; }
  .brand { font-size: 1rem; }
}

/* Masthead containment: below ~430px the brand and the injected nav controls
   (Index toggle, back link, shortlist, theme toggle) cannot share one line —
   wrap the row and let the nav itself wrap and shrink instead of leaking past
   the viewport (probe: .site-nav/.theme-toggle measured +66px at 327px). */
@media (max-width: 430px) {
  .header-row {
    /* nowrap, NOT wrap (CLS, audit 2026-07-28). A wrapping flex line wraps
       BEFORE it shrinks, so the moment lab.js widened this nav the row broke to
       two lines and dropped the whole page ~33px. With nowrap the overflow has
       to go somewhere elastic instead — the chip below — which is exactly what
       we want, and it degrades at ANY viewport width rather than at whatever
       number a max-width guessed. The earlier overflow this wrap was guarding
       against (probe: +66px at 327px) came from the nav having nothing
       shrinkable in it; the min-width:0 pair below is what actually fixes that. */
    flex-wrap: nowrap;
    column-gap: var(--sp-3);
    row-gap: var(--sp-1);
    padding-block: var(--sp-2);
    min-width: 0;
  }
  /* SHRINK, DON'T WRAP (CLS, audit 2026-07-28). lab.js injects .sl-toggle +
     .ctx-chip after first paint; the row then wrapped to two lines and dropped
     the page ~33px — the largest shift on every data page (compare 0.196,
     dashboard 0.175, scout 0.169). The chip is the only elastic item: the three
     buttons must keep 44px, the chip already has overflow+ellipsis. min-width:0
     is required — an auto min-width floors it at min-content and it wraps. */
  .site-nav {
    flex-wrap: nowrap;
    min-width: 0;
    max-width: 100%;
    gap: var(--sp-2);
    justify-content: flex-end;
    margin-left: auto;
  }
  /* The chip is the designated shock absorber: it takes whatever width is left
     and ellipses the rest. No pixel budget to maintain — flexbox does the
     arithmetic, so this keeps working when the wordmark, the nav or the type
     scale changes. It keeps a generous cap so it does not sprawl on a tablet. */
  .ctx-chip {
    min-width: 0;
    flex: 0 1 auto;
    max-width: 9rem;
  }
  /* The brand and the three touch targets are inelastic; only the chip gives. */
  .brand { flex: none; }
}

/* Below ~360px the row genuinely cannot hold the wordmark plus three 44px
   targets on one line — measured at 320px the nav starts at x=72 against a
   brand ending at x=103, i.e. it sits ON the wordmark. So here wrapping is the
   correct layout, and the fix is not to prevent it but to RESERVE it: the row
   carries the two-line height from first paint, so lab.js widening the nav
   changes what the row contains without changing how tall it is. Same principle
   as the hero art band above — the shift comes from the reservation being
   absent, not from the content arriving. */
@media (max-width: 360px) {
  .header-row {
    flex-wrap: wrap;
    min-height: 5.8rem;
  }
  .site-nav { flex-wrap: wrap; }
  /* at this width the chip truncates to ~22px, which is not a tappable control
     and reads as a stray ellipsis — the selected player is still reachable from
     the page body, so drop the shortcut rather than ship an unusable one */
  .ctx-chip { display: none; }
  .site-nav > .nav-toggle,
  .site-nav > .sl-toggle,
  .site-nav > .theme-toggle { flex: none; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* --------------------------------------------------------------------------
   Global ⌘K palette (lab-palette.js, competitive round 2026-08-10): search
   players / teams / pages from any page. Chrome mirrors the export dialog's
   register; rows ride the shared picker-opt listbox grammar. */
.pal-toggle {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  color: var(--ink-2);
  font: inherit;
  font-size: var(--fs-xs);
  padding: 0.32em 0.6em;
  cursor: pointer;
  transition: border-color 120ms ease, color 120ms ease;
}
.pal-toggle:hover,
.pal-toggle:focus-visible { color: var(--ink); border-color: var(--ink-3); }
.pal-kbd {
  font-family: var(--font-mono);
  font-size: 0.85em;
  color: var(--ink-2); /* ink-3 measured 4.38:1 — under the 4.5 gate */
  border: 1px solid var(--hairline);
  border-radius: 3px;
  padding: 0 0.3em;
}
@media (max-width: 640px) {
  .pal-toggle-txt, .pal-kbd { display: none; }
  .pal-toggle::before { content: "⌕"; font-size: 1.05rem; line-height: 1; }
}
.pal-dialog {
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow);
  padding: var(--sp-4);
  width: min(38rem, calc(100vw - 2 * var(--sp-4)));
  margin-top: 9vh;                 /* palette sits high, like a launcher */
}
.pal-dialog::backdrop { background: rgba(18, 18, 18, 0.55); }
.pal-input {
  width: 100%;
  font: inherit;
  font-size: var(--fs-base);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  padding: 0.5em 0.7em;
}
.pal-input:focus-visible { outline: 2px solid var(--ink-3); outline-offset: 1px; }
.pal-chips { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); flex-wrap: wrap; }
.pal-chip {
  display: inline-flex; align-items: baseline; gap: 0.4em;
  font-size: var(--fs-xs);
  border: 1px solid var(--hairline);
  border-radius: 999px;
  background: transparent;
  color: var(--ink-2);
  padding: 0.22em 0.7em;
  cursor: pointer;
}
.pal-chip[aria-pressed="true"] { color: var(--ink); border-color: var(--ink); }
.pal-count { font-family: var(--font-mono); font-size: 0.85em; color: var(--ink-3); }
.pal-list {
  position: static !important;     /* the shared picker-list floats; here it's in-flow */
  max-height: min(52vh, 26rem);
  overflow-y: auto;
  margin-top: var(--sp-3);
  border-top: 1px solid var(--hairline);
  padding-top: var(--sp-2);
}
.pal-opt { display: flex; align-items: baseline; gap: var(--sp-3); }
.pal-kind { flex: none; color: var(--accent); width: 1em; }
.pal-name { flex: none; font-weight: 600; }
.pal-sub {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pal-hint {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin: var(--sp-3) 0 0;
}

/* --------------------------------------------------------------------------
   The Analyst's answer (lab-ask.js). Everything here is chrome around numbers
   the pipeline computed — the caption, the basis chips and the footnote are
   the load-bearing parts, so they are styled to be read, not skipped. */
.pal-answer {
  max-height: min(56vh, 30rem);
  overflow-y: auto;
  margin-top: var(--sp-3);
  border-top: 1px solid var(--hairline);
  padding-top: var(--sp-3);
}
.ask-caption {
  font-size: var(--fs-xs);
  color: var(--ink-2);
  margin: 0 0 var(--sp-3);
}
.ask-working, .ask-detail { font-size: var(--fs-xs); color: var(--ink-3); margin: 0; }
/* A refusal is an answer, so it gets the accent rather than error-red. */
.ask-refusal {
  font-size: var(--fs-sm);
  color: var(--ink);
  border-left: 2px solid var(--accent);
  padding-left: var(--sp-3);
  margin: 0 0 var(--sp-2);
}
.ask-measured {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin: var(--sp-2) 0 0;
}
.ask-table { width: 100%; border-collapse: collapse; font-size: var(--fs-xs); }
.ask-table th, .ask-table td {
  text-align: left; padding: var(--sp-1) var(--sp-2);
  border-bottom: 1px solid var(--hairline);
}
.ask-table th { color: var(--ink-3); font-weight: 600; }
.ask-table .num { text-align: right; font-family: var(--font-mono); }
.ask-more, .ask-foot, .ask-note {
  font-size: var(--fs-xs); color: var(--ink-3); margin: var(--sp-2) 0 0;
}
.ask-foot { border-top: 1px solid var(--hairline); padding-top: var(--sp-2); }

.ask-move { margin: 0 0 var(--sp-4); }
.ask-move-head { font-size: var(--fs-xs); font-weight: 600; margin: 0 0 var(--sp-1); }
/* Capped: at full panel width one move's pitch is ~245px tall and six of them
   bury the link list that says which pass is evidenced and which is not. */
.ask-pitch { width: 100%; max-width: 17rem; height: auto; display: block; }
.ask-pitch-bg { fill: var(--surface-2); }
.ask-pitch-line { fill: none; stroke: var(--hairline); stroke-width: 0.4; }
.ask-link { stroke: var(--ink-3); stroke-width: 0.6; }
/* The one link the feed vouches for is drawn as the solid one; the
   reconstructed build-up is dashed, so the picture carries the same caveat
   the caption does. */
.ask-link.is-buildup { stroke-dasharray: 2 1.6; }
.ask-link.is-assist { stroke: var(--accent); stroke-width: 1; }
.ask-link.is-prog { stroke-width: 1.2; }
.ask-dot { fill: var(--ink-2); }
.ask-shot { fill: var(--accent); }
.ask-links { list-style: none; margin: var(--sp-2) 0 0; padding: 0; font-size: var(--fs-xs); }
.ask-links li { display: flex; gap: var(--sp-2); align-items: baseline; }
.ask-passer { font-weight: 600; }
.ask-basis { font-family: var(--font-mono); color: var(--ink-3); }
.ask-basis.is-inferred { font-style: italic; }
.ask-prog { color: var(--accent); font-family: var(--font-mono); }
.ask-route { font-weight: 600; }

/* v2: conversation + inline-answer furniture */
.ask-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin: 0 0 var(--sp-3); }
.ask-chip {
  display: inline-flex; align-items: baseline; gap: var(--sp-1);
  font-family: var(--font-mono); font-size: var(--fs-xs);
  color: var(--ink-2); background: var(--surface-2);
  border: 1px solid var(--hairline); border-radius: 999px;
  padding: 0.1rem var(--sp-2); cursor: pointer;
}
.ask-chip:hover { border-color: var(--accent); color: var(--ink); }
.ask-chip-x { color: var(--ink-3); }
.ask-rowsub {
  display: block; font-family: var(--font-mono); font-size: var(--fs-xs);
  color: var(--ink-3);
}
.ask-actions {
  display: flex; align-items: baseline; gap: var(--sp-4);
  margin: var(--sp-3) 0 0;
}
.ask-open { font-weight: 600; font-size: var(--fs-xs); }
.ask-export {
  font-family: var(--font-mono); font-size: var(--fs-xs);
  color: var(--ink-2); background: none;
  border: 1px solid var(--hairline); border-radius: 4px;
  padding: 0.15rem var(--sp-2); cursor: pointer;
}
.ask-export:hover:not(:disabled) { border-color: var(--accent); color: var(--ink); }
.ask-export:disabled { opacity: 0.5; cursor: default; }
.ask-role { margin: 0 0 var(--sp-3); }
.ask-role-head { font-size: var(--fs-xs); font-weight: 600; margin: 0 0 var(--sp-1); }
.ask-cands { list-style: none; margin: 0; padding: 0; font-size: var(--fs-xs); }
.ask-cands li {
  display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) auto;
  gap: var(--sp-2); align-items: baseline;
  padding: var(--sp-1) 0; border-bottom: 1px solid var(--hairline);
}
.ask-fit { font-family: var(--font-mono); color: var(--ink-2); text-align: right; }
.ask-radar { margin: var(--sp-3) 0 0; }
.ask-radar-head { font-size: var(--fs-xs); color: var(--ink-3); margin: 0 0 var(--sp-1); }
.ask-radar svg { max-width: 20rem; height: auto; display: block; }

/* --------------------------------------------------------------------------
   Entity band (split-shell phase 1, 2026-08-10): the selected player's home
   under the masthead on scout / dashboard / compare / studio. The shell ships
   in the static HTML with its height reserved, so the JS fill costs zero CLS;
   empty (no selection yet, or artifact build) it reads as quiet spacing. */
.entity-band {
  min-height: 46px;
  border-bottom: 1px solid transparent; /* swaps to hairline when filled — no shift */
}
.entity-band[data-filled] {
  border-bottom-color: var(--hairline);
  background: var(--surface);
}
.eb-row {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: 45px;
  overflow-x: auto;               /* phones: the strip scrolls, never wraps */
  white-space: nowrap;
  scrollbar-width: none;
}
.eb-row::-webkit-scrollbar { display: none; }
/* An SVG diamond (see renderEntityBand), not the ◈ glyph — axe cannot judge
   non-BMP text and pa11y books the "incomplete" as an error at ANY color.
   Shapes are exempt, so the mark keeps the brand red. */
.eb-mark { color: var(--accent); flex: none; display: inline-flex; align-items: center; }
.eb-name {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-sm);
  color: var(--ink);
  flex: none;
}
.eb-team {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  flex: none;
}
.eb-pill {
  flex: none;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink);
  border: 1px solid var(--ink-3);
  border-radius: 4px;
  padding: 0.1em 0.45em;
}
.eb-tabs {
  margin-left: auto;
  display: flex;
  gap: var(--sp-4);
  flex: none;
}
.eb-tabs a {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  letter-spacing: 0.04em;
  color: var(--ink-2);
  text-decoration: none;
  padding: 0.35em 0;
  border-bottom: 2px solid transparent;
}
.eb-tabs a:hover { color: var(--ink); border-bottom-color: var(--ink-3); }
.eb-tabs a[aria-current="page"] { color: var(--ink); border-bottom-color: var(--ink); }

/* --------------------------------------------------------------------------
   Motion arrival pack (competitive round, 2026-08-10).
   Everything here is opacity/transform/width-in-a-reserved-track only — no
   property that moves layout, so CLS budgets are untouched. The whole section
   sits behind no-preference AND the blanket reduce block above zeroes it, so
   reduced-motion users get the exact pre-pack behavior. The hero art band and
   the masthead are deliberately absent from every rule here.               */
:root {
  --ease-swift: cubic-bezier(0.2, 0.7, 0.2, 1);  /* value sweeps, card land */
  --ease-pop: cubic-bezier(0.16, 1, 0.3, 1);     /* overlay entrances       */
}
@keyframes lab-land { from { opacity: 0; transform: translateY(8px); } }
@keyframes lab-pop  { from { opacity: 0; transform: scale(0.97); } }
@keyframes lab-fade { from { opacity: 0; } }
@media (prefers-reduced-motion: no-preference) {
  .lab-land {
    animation: lab-land 320ms var(--ease-swift) both;
    animation-delay: calc(var(--land-i, 0) * 40ms);
  }
  /* Overlay entrances: one shared pop for the popup family (Lab.popup stamps
     .lab-pop), the drawers, and the export <dialog>. Entrance only — close
     stays instant, which reads as responsiveness, not as a missing exit. */
  .lab-pop:not([hidden]),
  .nav-panel:not([hidden]),
  .sl-panel:not([hidden]) { animation: lab-pop 200ms var(--ease-pop); }
  .xport-dialog[open],
  .pal-dialog[open] { animation: lab-pop 200ms var(--ease-pop); }
  .xport-dialog[open]::backdrop,
  .pal-dialog[open]::backdrop { animation: lab-fade 200ms ease; }
  /* Cross-document View Transitions: the MPA's shell holds still across
     full-page loads (Chromium ships this; other engines simply ignore it). */
  @view-transition { navigation: auto; }
  ::view-transition-old(root),
  ::view-transition-new(root) { animation-duration: 180ms; }
  .site-header { view-transition-name: masthead; }
}

/* --------------------------------------------------------------------------
   16. Shared export / share / widget-boundary assets (next-wave, 2026-07-10)

   .theme-scope — opt-in theme wrapper. The token blocks in §1 are scoped to
   `:root, .theme-scope[data-theme="light"]` and `:root[data-theme="dark"],
   .theme-scope[data-theme="dark"]`, so the exporter can clone a figure into
   a hidden .theme-scope wrapper and getComputedStyle resolves the OTHER
   theme's tokens without touching the live page. Tokens only — works on
   cream and Night alike.
   -------------------------------------------------------------------------- */

.theme-scope {
  background: var(--bg);
  color: var(--ink);
}

/* ---- Share affordance -----------------------------------------------------
   Every figure.chart hosts a quiet 28px icon button in its top-right corner,
   revealed on hover / keyboard focus (always visible on touch). Wired by
   Lab.share.init() in lab-export.js. */

figure.chart { position: relative; }

.xport-btn {
  position: absolute;
  top: var(--sp-3);
  right: var(--sp-3);
  width: 28px;
  height: 28px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  background: var(--surface);
  color: var(--ink-3);
  cursor: pointer;
  /* visible at rest — a hidden affordance is an affordance nobody finds
     (hover-only reveal also never fires on touch devices) */
  opacity: 0.55;
  transition: opacity 120ms ease, color 120ms ease, border-color 120ms ease;
}
figure.chart:hover .xport-btn,
figure.chart:focus-within .xport-btn,
.xport-btn:focus-visible { opacity: 1; }
.xport-btn:hover,
.xport-btn:focus-visible { color: var(--accent); border-color: var(--border); }
.xport-btn svg { width: 15px; height: 15px; display: block; }

/* Touch devices: lift interactive targets toward the 44px floor (KO-4).
   Pointer-coarse only — desktop densities are untouched. */
@media (pointer: coarse) {
  .xport-btn { width: 2.75rem; height: 2.75rem; }
  .xport-btn svg { width: 18px; height: 18px; }
  .seg .seg-btn { min-height: 2.75rem; }
  /* audit W2-A5: the shared interactive chrome meets ~44px on touch */
  .sl-toggle, .nav-toggle, .theme-toggle { min-height: 2.75rem; }
  .sl-btn, .sl-x { min-width: 2.75rem; min-height: 2.75rem; }
  .sl-act { min-height: 2.35rem; }
  th[data-sort] { padding-block: 0.7rem; }
  input[type="range"] { min-height: 2.75rem; }
  .deep-notice-x { min-width: 2.75rem; min-height: 2.75rem; }
  .chip { min-height: 2.35rem; }
  /* audit 2026-07-23: primary/CTA buttons met only ~35px on touch */
  .btn { min-height: 2.75rem; }
  /* the hero fold's More/Less control — and, in the SAME declaration, the
     placeholder that reserves its box before lab.js injects it. This 44px touch
     floor is most of the control's height (44 of 52px), so a reservation that
     missed it under-reserved by half and left the shift in place. Keeping both
     selectors on one line is what stops them drifting apart again. */
  .hero-more,
  .hero-copy:not(:has(.hero-more))::after { min-height: 44px; }
}
@media (hover: none) { .xport-btn { opacity: 1; } }

/* Native <dialog> styled as an editorial panel: chart surface, a
   rule-double under the header row, the standard mono kicker (global
   .kicker already applies inside). Markup sketch:
     <dialog class="xport-dialog">
       <div class="xport-head">
         <p class="kicker">Share this graphic</p>
         <h2 class="xport-title">…</h2>
       </div>
       <div class="share-body"> preset/theme segs · preview · actions </div>
     </dialog> */
.xport-dialog {
  background: var(--surface);
  color: var(--ink);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow);
  padding: var(--sp-5);
  width: min(34rem, calc(100vw - 2 * var(--sp-4)));
  max-height: calc(100vh - 2 * var(--sp-6));
}
.xport-dialog::backdrop {
  /* ink-black scrim in BOTH themes (the hero-plate/footer always-ink
     convention, rgb 18 18 18); ::backdrop can't read page tokens
     everywhere yet. */
  background: rgba(18, 18, 18, 0.55);
}
.xport-dialog .xport-head { margin-bottom: var(--sp-4); }
.xport-dialog .xport-head::after {
  content: "";
  display: block;
  height: 5px;                /* rule-double: 1px rule + 3px gap + 1px rule */
  border-top: 1px solid var(--ink);
  border-bottom: 1px solid var(--ink);
  margin-top: var(--sp-3);
}
/* Title and close on ONE row — the close button used to wrap under the title
   because the head had no row layout at all (competitive-round finding). */
.xport-dialog .xport-titlerow {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
}
.xport-dialog .xport-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: var(--fs-lg);
  color: var(--ink);
  margin: 0;
}
.xport-dialog .xport-close {
  flex: none;
  width: 2rem; height: 2rem;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  color: var(--ink-2);
  font-size: 1.1rem; line-height: 1;
  cursor: pointer;
}
.xport-dialog .xport-close:hover,
.xport-dialog .xport-close:focus-visible { color: var(--ink); border-color: var(--ink-3); }

/* Labeled control rows: one aligned label column, breathing room between rows
   — these previously shipped with no styles at all, which is why the dialog
   read as cramped next to the card it frames. */
.xport-dialog .xport-controls {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  margin-block: var(--sp-4);
}
.xport-dialog .share-field {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
}
.xport-dialog .xport-field-label {
  flex: none;
  min-width: 3.8rem;
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.xport-dialog .xport-select {
  flex: 1;
  min-width: 0;
  font: inherit;
  font-size: var(--fs-sm);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  padding: 0.38em 0.55em;
}
.xport-dialog .xport-custom { display: inline-flex; align-items: center; gap: var(--sp-2); }
.xport-dialog .xport-custom[hidden] { display: none; }
.xport-dialog .xport-dim {
  width: 5.2em;
  font: inherit;
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  padding: 0.34em 0.45em;
}
.xport-dialog .xport-dim-x { color: var(--ink-3); }
.xport-dialog .xport-handle {
  flex: 1; min-width: 8rem;
  font: inherit; font-size: var(--fs-sm);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  padding: 0.38em 0.55em;
}
.xport-dialog .xport-filename {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin: 0 0 var(--sp-2);
  overflow-wrap: anywhere;
}
.xport-dialog .xport-unfurl {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  background: var(--surface-2);
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: var(--sp-3);
}
.xport-dialog .xport-unfurl[hidden] { display: none; }
.xport-dialog .xport-unfurl-img {
  width: 96px; height: auto;
  border: 1px solid var(--hairline);
  border-radius: 3px;
  display: block;
}
.xport-dialog .xport-unfurl-cap {
  font-size: var(--fs-xs);
  color: var(--ink-2);
}
.xport-dialog .xport-preview {
  background: var(--surface-2);
  border: 1px solid var(--hairline);
  border-radius: var(--r-sm);
  padding: var(--sp-3);
  margin-block: var(--sp-4);
  overflow: auto;
}
.xport-dialog .xport-preview img,
.xport-dialog .xport-preview svg { display: block; max-width: 100%; height: auto; }
.xport-dialog .xport-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--sp-3);
  margin-top: var(--sp-4);
}
.xport-dialog .xport-error {
  font-size: var(--fs-sm);
  color: var(--accent);
  margin: var(--sp-2) 0 0;
}
/* Download is the primary action; the copy pair reads as quiet siblings. */
.xport-dialog .xport-download { border-color: var(--ink); }

/* ---- Per-widget error boundary --------------------------------------------
   Rendered by Lab.showWidgetError(host, msg, retryFn) INSIDE the failing
   widget (role="status"). Deliberately muted next to .data-error: a quiet
   inline note with an optional Retry, never a page-level alarm. */
.widget-error {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-2) var(--sp-3);
  background: var(--surface-2);
  border: 1px solid var(--hairline);
  border-left: 2px solid var(--viz-warn);
  border-radius: var(--r-sm);
  color: var(--ink-2);
  font-size: var(--fs-sm);
  padding: var(--sp-3) var(--sp-4);
  margin: var(--sp-3) 0;
}
.widget-error .widget-error-msg { margin: 0; }
.widget-error .widget-error-retry {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent);
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 0.3em 0.75em;
  cursor: pointer;
}
.widget-error .widget-error-retry:hover,
.widget-error .widget-error-retry:focus-visible { background: var(--accent-wash); }

/* ---- Pizza / wheel / studio label helpers ---------------------------------
   Shared classes for the polar-chart builders (Lab.chart.pizza / .wheel and
   the studio one-pagers). Each sets BOTH color and fill so the same class
   works on in-SVG <text> and on HTML labels. Tokens only — legible on cream
   and Night. */

/* In-wedge percentile / value numeral — mono, tabular, always. */
.pizza-num, .wheel-num, .studio-num, .viz-num,
.chart svg .pizza-num, .chart svg .wheel-num, .chart svg .viz-num {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  font-size: 12px;
  color: var(--ink);
  fill: var(--ink);
}

/* Rim label — the metric name around the rim: small, quiet, never the sole
   carrier of a value (the numeral is). */
.pizza-rim-label, .wheel-rim-label, .viz-rim-label,
.chart svg .pizza-rim-label, .chart svg .wheel-rim-label, .chart svg .viz-rim-label {
  font-family: var(--font-body);
  font-size: 10.5px;
  letter-spacing: 0.01em;
  color: var(--ink-2);
  fill: var(--ink-2);
}

/* Quadrant-group / axis-family label — the mono kicker register. Wears the
   family tint via data-accent when present, --accent otherwise. */
.pizza-group-label, .wheel-group-label, .viz-group-label,
.chart svg .pizza-group-label, .chart svg .wheel-group-label, .chart svg .viz-group-label {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent-cat, var(--accent));
  fill: var(--accent-cat, var(--accent));
}

/* Ring/tick annotations (the dashed 25/50/75 rings' numerals). */
.pizza-ring-label, .wheel-ring-label, .viz-ring-label,
.chart svg .pizza-ring-label, .chart svg .wheel-ring-label, .chart svg .viz-ring-label {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: 9.5px;
  color: var(--ink-3);
  fill: var(--ink-3);
}
