/* =============================================================================
 * NeuralCiberGuard — SHARED DESIGN TOKENS  ·  the canonical contract
 * Canonical source: sites/shared/tokens.css
 * =============================================================================
 *
 * Authority for every literal in this file:
 *   PARITY-INVENTORY-ROOT.md §1 (tokens) · §1.4 (hard-coded colours that must
 *     survive verbatim) · §2 (typography) · §5 (accessibility)
 *   PARITY-INVENTORY-GEDS-GAME.md §A1.1 (neural.css) · §A1.2 (geds semantic
 *     block) · §A1.3 (the four verified divergences) · §B10.1 (Senior)
 *   DESIGN-UPGRADES-FROM-REFERENCES.md (the governing "maintain, then upgrade")
 *
 * Values are quoted VERBATIM. Anything that is not verbatim carries the marker
 * `NEW (additive)` together with the reason and, for a colour, the MEASURED
 * contrast ratio. There are exactly seven such entries and they are enumerated
 * here so the list can be audited without reading the file:
 *     §10  the spacing ladder — a scale neither source declares. Every step is
 *          a value the sources already use; no existing declaration changes.
 *     §18  six dark-theme status colours — --ncg-ok-bg, --ncg-warn-tint,
 *          --ncg-danger-text, --ncg-danger-tint, --ncg-info-text and
 *          --ncg-info-tint. The source system has no dark status set at all,
 *          so there was nothing to preserve; each carries its measured ratio
 *          against BOTH dark surfaces.
 * Nothing else in this file was invented.
 *
 * ONE VALUE IS DELIBERATELY NOT VERBATIM — read §4 before "restoring" it
 * ---------------------------------------------------------------------
 * `--ncg-warn` ships as #8A4B00, not the source system's #A65F00. This is a
 * MEASURED ACCESSIBILITY CORRECTION, adjudicated 2026-08-07 with the arithmetic
 * written out at §4, not drift and not a redesign. The verbatim rule exists to
 * stop values changing SILENTLY; it was never a licence to ship a value that
 * fails a conformance criterion. #A65F00 fails WCAG 2.2 SC 1.4.3 on three of
 * the four light surfaces this system defines. The full working is at §4 and is
 * repeated in PARITY-VERIFICATION.md §3. Do not revert it to #A65F00.
 *
 * HOW THIS FILE IS DEPLOYED — read before editing
 * -----------------------------------------------
 * Each property (root / geds / game) is a SEPARATE Cloudflare deployment whose
 * document root is its own `sites/<name>/` directory. A stylesheet living at
 * `sites/shared/` therefore has NO public URL on any origin: a page that linked
 * `/shared/tokens.css` would 404 on all three. That is exactly the class of
 * dangling reference this release exists to remove, so it is not done.
 *
 * Instead this file is the CANONICAL SOURCE, and each property that adopts it
 * ships a byte-identical copy inside its own document root:
 *
 *     sites/shared/tokens.css   →   sites/root/css/tokens.css
 *                               →   sites/geds/css/tokens.css
 *                               →   sites/game/css/tokens.css
 *
 * Cross-origin linking is not an option even in principle: all three origins
 * ship `style-src 'self' 'unsafe-inline' https://fonts.googleapis.com`, so a
 * <link> at another NCG origin is blocked by CSP. (Attack class the directive
 * prevents: stylesheet-injection / CSS exfiltration from an untrusted origin.)
 *
 * `sites/shared/` deliberately contains no `wrangler.toml`, so
 * `scripts/verify-site.sh` skips it during site discovery and it is never
 * uploaded to any CDN.
 *
 * SYNC RULE: edit this file, then copy it over every served copy in the SAME
 * commit. Verify with:  diff sites/shared/tokens.css sites/geds/css/tokens.css
 *
 * LOAD ORDER:
 *     <link rel="stylesheet" href="/css/tokens.css">      <!-- FIRST  -->
 *     <link rel="stylesheet" href="/css/components.css">  <!-- SECOND -->
 * If you use `@import` instead, it MUST be the first statement in the importing
 * sheet. An `@import` placed after any rule is ignored outright — that is
 * precisely how Manrope was lost in the game CSS (GEDS-GAME inventory §11).
 *
 * WHY EVERY PROPERTY HERE IS PREFIXED `--ncg-`
 * --------------------------------------------
 * The inventories PROVE (§A1.4) that this codebase runs two palettes that give
 * the SAME name to DIFFERENT values:
 *
 *     token      root site (index.html)     neural.css (geds + game)
 *     --ink      #1A1512                    #1C1917
 *     --crimson  #9B3B4B                    #914955
 *     --cream    #FBF3E4                    #FAF9F6
 *     --r        16px                       14px
 *     --serif    …,'Times New Roman',serif  …,Georgia,serif
 *
 * A shared file that declared unprefixed `--ink` on `:root` would silently
 * restyle whichever of the two systems it did not match. So this file claims a
 * private namespace: it declares ONLY `--ncg-*` properties and therefore cannot
 * collide with, or override, any token an existing page already defines.
 * Dropping it into any of the three sites today changes zero rendered pixels.
 *
 *   --ncg-<name>       the canonical editorial system (neural.css values) —
 *                      the cream #FAF9F6 · charcoal #1C1917 · crimson #914955
 *                      triad the brief fixes.
 *   --ncg-warm-<name>  the root site's palette. Its own stylesheet header calls
 *                      it a "Warm editorial palette (cream paper · crimson ·
 *                      copper)"; same language, warmer literals, plus the
 *                      copper/gold/green ramp the editorial system lacks.
 *   --ncg-dark-<name>  the dark literals, declared once and aliased by scope.
 *   --ncg-<role>       SEMANTIC ROLES. components.css consumes ONLY these,
 *                      never a raw palette entry. That is what lets one
 *                      component render correctly in light, in dark, on the
 *                      terminal island and in Senior mode without a fork.
 *
 * DARK MODE is scoped to `[data-theme="dark"]`, matching the root site's
 * shipped behaviour exactly: a binary light↔dark toggle persisted to the
 * localStorage key "ncg-theme". There is deliberately NO
 * `@media (prefers-color-scheme: dark)` block — the root site documents
 * "No JS → light theme, no OS-dark support at all", and adding a media query
 * would change that behaviour without sign-off. components.md §9 carries the
 * opt-in snippet for a surface that wants it. The selector is a bare attribute
 * selector rather than `:root[…]`, so any single section can be a dark island
 * (the games strip and the capstone panel already are) just by carrying the
 * attribute.
 *
 * A change to any VERBATIM value below is a REGRESSION, not a redesign.
 * ========================================================================== */

:root{

  /* ═══════════════════════════════════════════════════════════════════════
     §1 · PALETTE — canonical editorial system
     VERBATIM: geds/css/neural.css lines 6–17, byte-identical in geds + game.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-cream:#FAF9F6;            /* paper / light surface        (brand FIXED) */
  --ncg-cream-2:#F3F1EA;          /* raised + sunken surface                    */
  --ncg-cream-3:#ECE9E0;          /* hairline / divider                         */

  --ncg-ink:#1C1917;              /* body ink (brand FIXED)   16.61:1 on cream  */
  --ncg-ink-2:#44403C;            /* secondary text            9.76:1 AAA       */
  --ncg-ink-3:#78716C;            /* muted text                4.56:1 AA        */
  /* MEASURED CONTRAST TRAP. --ncg-ink-3 clears AA on --ncg-cream (4.56:1) and
     FAILS on --ncg-cream-2 (4.24:1). It must never sit on a raised surface, nor
     on a hover state that raises the surface. Use --ncg-text-2 (9.09:1 there)
     instead. components.css obeys this rule without exception. */

  --ncg-crimson:#914955;          /* the single accent (brand FIXED)  6.07:1 AA */
  --ncg-crimson-d:#7A3B46;        /* pressed / link hover             7.85:1    */
  --ncg-crimson-soft:rgba(145,73,85,.08);
  --ncg-crimson-line:rgba(145,73,85,.22);

  --ncg-charcoal:#1C1917;         /* dark island fill (brand FIXED)             */
  --ncg-charcoal-2:#292524;       /* dark island edge                           */

  /* ═══════════════════════════════════════════════════════════════════════
     §2 · PALETTE — root site "warm" system, light
     VERBATIM: PARITY-INVENTORY-ROOT.md §1.1. All 24 light colour properties.
     Regression checklist item 8 pins these literals.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-warm-paper:#FAF8F3;
  --ncg-warm-paper-2:#F3EFE7;
  --ncg-warm-card:#FFFFFF;
  --ncg-warm-card-2:#FBF8F2;

  --ncg-warm-ink:#1A1512;         /* 16.5:1 AAA per the source header           */
  --ncg-warm-ink-2:#4A423C;       /*  9.3:1 AAA                                 */
  --ncg-warm-ink-3:#6E6459;       /*  5.4:1 AA                                  */
  --ncg-warm-ink-4:#8A7F76;       /* DECORATIVE ONLY — never text               */

  --ncg-warm-line:#E7E0D5;
  --ncg-warm-line-2:#D8CFC0;

  --ncg-warm-crimson:#9B3B4B;     /*  6.3:1 AA per the source header            */
  --ncg-warm-crimson-2:#B4576B;
  --ncg-warm-crimson-ink:#7A2C39;

  --ncg-warm-copper:#B87333;      /* DECORATIVE — bars, rules, large display    */
  --ncg-warm-copper-2:#C88A4A;
  --ncg-warm-copper-t:#8F5A22;    /* TEXT-safe amber           5.46:1 AA        */

  --ncg-warm-gold:#C9973F;        /* DECORATIVE                                 */
  --ncg-warm-gold-t:#8F5A22;      /* identical to copper-t BY DESIGN (ROOT §1.2
                                     states this explicitly) — not a bug        */

  --ncg-warm-green:#5B8C5A;       /* DECORATIVE                                 */
  --ncg-warm-green-2:#6FA36E;
  --ncg-warm-green-t:#44693F;     /* TEXT-safe green           5.98:1 AA        */

  --ncg-warm-cream:#FBF3E4;       /* the root site's --cream. A DIFFERENT value
                                     from --ncg-cream. Both are correct; they
                                     belong to different systems (§A1.4).       */

  /* ═══════════════════════════════════════════════════════════════════════
     §3 · PALETTE — dark literals
     VERBATIM: PARITY-INVENTORY-ROOT.md §1.2, all 23 overrides. Declared on
     :root rather than inside the dark scope so the theme scope — and any
     opt-in OS-preference block a surface adds later — can alias them without
     restating a single literal. Declaring them here paints nothing.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-dark-paper:#140F0D;
  --ncg-dark-paper-2:#1A1310;
  --ncg-dark-card:#1E1613;
  --ncg-dark-card-2:#241A16;
  --ncg-dark-cream:#2A1D16;

  --ncg-dark-ink:#F5EEE4;         /* 15.46:1 on card AAA                        */
  --ncg-dark-ink-2:#C9BDB0;       /*  9.66:1 AAA                                */
  --ncg-dark-ink-3:#9A8E82;       /*  5.57:1 AA                                 */
  --ncg-dark-ink-4:#7A6F64;       /* DECORATIVE ONLY — 3.88:1, never text       */

  --ncg-dark-line:#2E241E;
  --ncg-dark-line-2:#3A2D25;

  --ncg-dark-crimson:#C76B7B;     /*  4.93:1 on card AA                         */
  --ncg-dark-crimson-2:#D98A98;
  --ncg-dark-crimson-ink:#E0A0AC; /*  8.30:1 AAA                                */

  --ncg-dark-copper:#D9944E;
  --ncg-dark-copper-2:#E5A968;
  --ncg-dark-copper-t:#D9944E;    /* collapses to the decorative value in dark —
                                     deliberate, ROOT §1.2                      */
  --ncg-dark-gold:#E0B45E;
  --ncg-dark-gold-t:#E0B45E;      /* same deliberate collapse                   */

  --ncg-dark-green:#6FA36E;
  --ncg-dark-green-2:#84B583;
  --ncg-dark-green-t:#84B583;     /*  7.56:1 on card AAA                        */

  /* ═══════════════════════════════════════════════════════════════════════
     §4 · PALETTE — semantic status
     VERBATIM: geds/index.html override block 2 (lines 79–116) — the block that
     WINS the cascade. §A1.3 D3 warns that keeping the dead first block instead
     would change every verdict colour on the page, so the winning values are
     the ones carried here.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-safe:#1F7A3A;   --ncg-safe-bg:#E7F3EB;   /* 5.11:1 cream · 4.72:1 tint  */
  --ncg-danger:#B81D30; --ncg-danger-bg:#FCE8EB; /* 6.12:1 cream · 5.49:1 tint  */
  --ncg-warn:#8A4B00;   --ncg-warn-bg:#FBEFD9;   /* 6.46:1 cream · 5.98:1 tint  */
  --ncg-info:#1E5285;   --ncg-info-bg:#E3ECF5;   /* 7.67:1 cream · 6.76:1 tint  */
  --ncg-family:#914955; --ncg-family-bg:#F3E9EB; /* 6.07:1 cream · 5.37:1 tint  */

  /* ─────────────────────────────────────────────────────────────────────────
     DELIBERATE, MEASURED ACCESSIBILITY CORRECTION — adjudicated 2026-08-07.
     --ncg-warn is the ONE token in this file whose literal is not verbatim.

     The source system's value was #A65F00. Two engineers disagreed about it:
     one restored #A65F00 citing "a rewrite must not change a token value", the
     other set #8A4B00 citing a measured SC 1.4.3 failure. The measurement was
     re-derived from first principles (WCAG 2.x relative luminance, sRGB
     linearisation c<=0.03928 ? c/12.92 : ((c+0.055)/1.055)^2.4, then
     L = 0.2126R + 0.7152G + 0.0722B, ratio = (Lhi+0.05)/(Llo+0.05)) and it
     HOLDS. #A65F00 has L = 0.162914:

         surface                          #A65F00   #8A4B00 (L = 0.104354)
         --ncg-cream    #FAF9F6  L .947292  4.68:1 AA   6.46:1 AA
         --ncg-cream-2  #F3F1EA  L .879058  4.36:1 FAIL 6.02:1 AA
         --ncg-cream-3  #ECE9E0  L .814925  4.06:1 FAIL 5.60:1 AA
         --ncg-warn-bg  #FBEFD9  L .872520  4.33:1 FAIL 5.98:1 AA
         #FFFFFF label on the solid pill   4.93:1 AA   6.80:1 AA

     #A65F00 therefore fails the 4.5:1 floor for normal-size text on THREE of
     the four light surfaces this file defines, including its own tint and the
     raised surface every card and pill sits on. It passes only on base cream.
     #8A4B00 clears 4.5:1 on all four with margin and stays inside the same
     hue family (both are pure orange-brown, hue 34deg, blue channel 0), so
     nothing about the brand reads differently.

     WHY THE VERBATIM RULE YIELDS HERE. The no-token-change rule exists to stop
     values drifting SILENTLY between a source system and its rewrite. It is not
     a reason to ship a value that fails a conformance criterion the release
     commits to (WCAG 2.2 AA). This change is the opposite of silent: it is
     recorded here, in the file header, in geds/index.html, in geds/senior.html,
     in components.md and in PARITY-VERIFICATION.md §3.

     DO NOT REVERT TO #A65F00. If a future reviewer finds "#A65F00" quoted in a
     parity inventory, that inventory is recording the ORIGIN of the value, not
     approving it. Re-run the arithmetic above before changing anything.

     Re-verified INDEPENDENTLY a third time on 2026-08-07, from the raw hex and
     the formulae above rather than from this table: every figure reproduces to
     2 dp. The luminances are exactly L(#A65F00) = 0.162914 and
     L(#8A4B00) = 0.104354. The geds engineer originally reported 4.44:1 on
     --ncg-cream-2; the true figure is 4.36:1, so the ORIGINAL FINDING WAS
     UNDERSTATED, not overstated. The ruling stands on stronger evidence than
     the one it was made on.

     Consequence: the #8F5A22 workaround below is now redundant for warn. It is
     retained ONLY as an alias so existing call sites keep resolving, and it now
     points at --ncg-warn so the system has exactly ONE warn colour. #8F5A22
     itself lives on as --ncg-warm-copper-t / --ncg-warm-gold-t (§2), which are
     the ROOT site's copper and gold text tokens and are unrelated to warn —
     those two stay verbatim.

     ⚠ DO NOT "HARMONISE" THE GAME ORIGIN ONTO THIS VALUE. game/ciber-traversal
     .html declares its own `--warn:#f29e4b` (a DIFFERENT namespace: bare
     `--warn`, not `--ncg-warn`) for a dark CRT ground. Measured on that page's
     own surfaces it is 8.47:1 on --void #2A0B10, 7.72:1 on --surface #3A1016
     and 9.09:1 on #1C0509 — comfortably AA. Pushing #8A4B00 onto that origin in
     the name of consistency would take it to 2.68:1 and FAIL SC 1.4.3. Two
     correct answers for two different grounds is not drift. This matters
     because PARITY-VERIFICATION.md item 78 defers a token reconciliation on
     exactly that file; whoever picks it up must not sweep this token into it.
     ───────────────────────────────────────────────────────────────────────── */
  --ncg-warn-text-on-tint:var(--ncg-warn);

  /* geds delivery-matrix status — VERBATIM geds/index.html:49 (.st-now) */
  --ncg-status-now:#3F6B3A;                      /* 5.91:1 cream · 5.46:1 tint  */
  --ncg-status-now-line:rgba(63,107,58,.35);
  --ncg-status-now-bg:rgba(63,107,58,.07);

  /* ═══════════════════════════════════════════════════════════════════════
     §5 · PALETTE — terminal island (always dark, in BOTH themes)
     VERBATIM: PARITY-INVENTORY-ROOT.md §1.4, "Hard-coded colours that are NOT
     tokens (must survive verbatim)". Naming them here does not change them; it
     stops the next rewrite approximating them, which has already happened once.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-term-bg:#0E0A08;          /* .terminal-wrap / .terminal-body            */
  --ncg-term-chrome:#171210;      /* .tbar / .terminal-input-line               */
  --ncg-term-ink:#e8e0d5;         /* 15.07:1 on bg AAA                          */
  --ncg-term-ink-2:#c9bdb0;       /* 10.69:1 AAA                                */
  --ncg-term-ink-3:#8a7f76;       /*  5.05:1 on bg · 4.76:1 on chrome — AA both */
  --ncg-term-line:#3a2d25;
  --ncg-term-ok:#28c840;          /*  8.85:1 AAA — prompt / ok                  */
  --ncg-term-dot-1:#ff5f57;       /* macOS traffic light                        */
  --ncg-term-dot-2:#febc2e;
  --ncg-term-dot-3:#28c840;

  /* Intel severity + form error — VERBATIM ROOT §1.4 */
  --ncg-sev-critical:#B02A37;     /* .ichip.ransom / .icvss.crit                */
  --ncg-sev-high:#B45309;         /* .ichip.due / .icvss.high                   */
  --ncg-form-error:#A4303F;       /* .acct-msg.err                              */

  /* ═══════════════════════════════════════════════════════════════════════
     §6 · PALETTE + METRICS — Senior / high-legibility
     VERBATIM: PARITY-INVENTORY-GEDS-GAME.md §B10.1, quoted in full from
     game/ciber-traversal.html lines 2421–2445. This is the proven accessibility
     precedent DESIGN-UPGRADES §13 requires the Senior web experience to inherit
     rather than reinvent. Every ratio below was measured, not assumed.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-senior-bg:#241016;        /* #elder-screen background                   */
  --ncg-senior-surface:#2E1319;   /* .el-action-section / .el-action-step       */
  --ncg-senior-btn:#3A1016;       /* .el-nav-btn background                     */
  --ncg-senior-btn-hover:#4A171D; /* .el-nav-btn:hover                          */
  --ncg-senior-text:#FFF6E4;      /* 16.85:1 on bg · 15.98:1 on card — AAA      */
  --ncg-senior-head:#FFFFFF;      /* 18.09:1 AAA — h1 / h2                      */
  --ncg-senior-gold:#FFD24A;      /* 12.55:1 AAA — h3, a[href^="tel"] AND
                                     `.el-detail strong`. THE SECOND SELECTOR IS
                                     THE DETAIL MOST LIKELY TO BE DROPPED.      */
  --ncg-senior-action:#9FE07B;    /* 11.56:1 AAA — "what to do" step labels     */
  --ncg-senior-edge:#FF8A3D;      /*  7.71:1 — button + action-card border      */
  --ncg-senior-edge-soft:rgba(255,138,61,.45);

  --ncg-senior-fs:20px;           /* base font-size            — VERBATIM       */
  --ncg-senior-target:58px;       /* min-height on every control — VERBATIM,
                                     well above the 44px house floor            */
  --ncg-senior-lh:1.75;           /* EVERY descendant           — VERBATIM      */
  --ncg-senior-lh-copy:1.8;       /* p / li / .el-detail        — VERBATIM      */
  --ncg-senior-ls:.01em;          /* global; 0 on headings      — VERBATIM      */
  --ncg-senior-r:12px;            /* buttons                    — VERBATIM      */
  --ncg-senior-r-card:14px;       /* action cards               — VERBATIM      */
  --ncg-senior-border:2px;        /* every button and card      — VERBATIM      */
  --ncg-senior-measure:920px;     /* .el-section max-width      — VERBATIM      */
  --ncg-senior-pad:38px 30px;     /* .el-section padding        — VERBATIM      */

  /* ═══════════════════════════════════════════════════════════════════════
     §7 · PALETTE — the dark islands (games strip, capstone, game hub)
     VERBATIM: ROOT §1.4 (.game-card, .capstone) and game/index.html:25–27.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-game-grad:linear-gradient(150deg,#241016,#1a0c10);
  --ncg-game-orange:#FF8A3D;
  --ncg-game-gold:#FFD24A;
  --ncg-game-gold-2:#FFC94A;
  --ncg-game-ink:#d6c9be;
  --ncg-game-ink-2:#c9bdb0;
  --ncg-game-ink-3:#a89b90;

  --ncg-capstone-grad:linear-gradient(155deg,#7A2C39,#5e2029);
  --ncg-capstone-gold:#E0B45E;
  --ncg-capstone-gold-2:#ECC77E;
  --ncg-capstone-deep:#3d1219;
  --ncg-capstone-cream:#FBF3E4;

  --ncg-hub-bg:#0b0e12;           /* game hub --gbg                             */
  --ncg-hub-panel:#12181f;
  --ncg-hub-panel-2:#0e141a;
  --ncg-hub-line:#22303f;
  --ncg-hub-line-2:#2c3d4f;
  --ncg-hub-ink:#F0EBE1;
  --ncg-hub-ink-2:#B9AE9F;
  --ncg-hub-ink-3:#7C8896;
  --ncg-hub-crimson:#C6707E;
  --ncg-hub-copper:#C98A45;
  --ncg-hub-teal:#36D2BF;

  /* ═══════════════════════════════════════════════════════════════════════
     §8 · TYPOGRAPHY — families
     VERBATIM: ROOT §1.5 and neural.css §A1.1. The two systems ship slightly
     different FALLBACK stacks; both are preserved rather than merged. Only the
     three loaded families are genuinely shared across all origins (§A1.4).
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-serif:'Fraunces',Georgia,serif;
  --ncg-sans:'Inter',system-ui,-apple-system,sans-serif;
  --ncg-mono:'JetBrains Mono',ui-monospace,Menlo,monospace;

  --ncg-warm-serif:'Fraunces',Georgia,'Times New Roman',serif;
  --ncg-warm-sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
  --ncg-warm-mono:'JetBrains Mono',ui-monospace,'SF Mono',Menlo,Consolas,monospace;

  /* THE ROLE SPLIT — ROOT §2.3 calls it "the visual signature of the page":
       serif = display headings and big numerals
       mono  = every eyebrow / kicker / tag / chip / meta / label / terminal
       sans  = body copy only
     Weights that must be requested from Google Fonts:
       Fraunces 400/500/600 + ITALIC 500 (load-bearing for `.hero h1 em`)
       Inter 400/500/600/700 · JetBrains Mono 400/500/600
     Loading is `display=swap` with two preconnects, no preload, no FontFace
     API and no size-adjust metric matching (ROOT §2.1). Do not "improve" it
     into a blocking font gate. */

  /* ═══════════════════════════════════════════════════════════════════════
     §9 · TYPOGRAPHY — size, leading, tracking
     Fluid sizes are VERBATIM clamp() declarations. The fixed ladder is the
     exhaustive set of px sizes the source uses; the half-pixel steps are
     intentional and MUST NOT be rounded (ROOT regression checklist item 21 —
     "a rewrite that rounds them to the nearest whole pixel visibly changes
     density"):
       8 · 9 · 9.5 · 10 · 10.5 · 11 · 11.5 · 12 · 12.5 · 13 · 13.5 · 14 ·
       14.5 · 15 · 15.5 · 16 · 16.5 · 17 · 18 · 19 · 20 · 21 · 22 · 24 ·
       26 · 30 · 34
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-fs-display:clamp(40px,7vw,76px);      /* root .hero h1                  */
  --ncg-fs-raised:clamp(52px,8vw,88px);       /* root #fund .f-raised           */
  --ncg-fs-title:clamp(30px,4.5vw,50px);      /* root .title                    */
  --ncg-fs-h1:clamp(30px,5vw,50px);           /* neural h1                      */
  --ncg-fs-cap-h2:clamp(28px,4vw,44px);       /* root .capstone h2              */
  --ncg-fs-lab-h3:clamp(26px,4vw,40px);       /* root .lab-card h3              */
  --ncg-fs-veil:clamp(22px,4vw,34px);         /* root .veil-mark                */
  --ncg-fs-h2:clamp(22px,3vw,30px);           /* neural h2                      */
  --ncg-fs-hero-sub:clamp(16.5px,2vw,20px);   /* root .hero .sub                */
  --ncg-fs-lead:clamp(16px,2vw,18.5px);       /* neural .lead                   */
  --ncg-fs-lead-warm:clamp(16px,1.8vw,19px);  /* root .lead                     */
  --ncg-fs-ghost:clamp(120px,24vw,340px);     /* root .hero-ghost watermark     */

  --ncg-fs-nano:9.5px;            /* micro tick labels                          */
  --ncg-fs-micro:10px;            /* neural .tag                                */
  --ncg-fs-tag:10.5px;            /* root chips                                 */
  --ncg-fs-eyebrow:11.5px;        /* neural .kick / .eyebrow — VERBATIM         */
  --ncg-fs-meta:12px;             /* neural .crumb — VERBATIM                   */
  --ncg-fs-code:13px;             /* neural code / .cmd / .fp — VERBATIM        */
  --ncg-fs-sm:13.5px;             /* neural nav.top a / .note — VERBATIM        */
  --ncg-fs-base:14px;             /* neural .card p / .btn — VERBATIM           */
  --ncg-fs-md:15px;               /* neural ul.clean li — VERBATIM              */
  --ncg-fs-body:16px;             /* root body — VERBATIM                       */
  --ncg-fs-lg:18px;
  --ncg-fs-xl:20px;               /* neural h3 / .brand — VERBATIM              */

  --ncg-lh-display:1.02;          /* root h1                                    */
  --ncg-lh-title:1.08;            /* root .title                                */
  --ncg-lh-tight:1.1;
  --ncg-lh-snug:1.4;
  --ncg-lh-normal:1.5;
  --ncg-lh-body:1.6;              /* root body — VERBATIM                       */
  --ncg-lh-editorial:1.65;        /* neural body — VERBATIM                     */
  --ncg-lh-terminal:1.7;          /* root terminal — VERBATIM                   */
  --ncg-lh-legal:1.75;

  /* Tracking ladder — ROOT §2.3, exhaustive.
       display / negative : -.035 -.03 -.025 -.02 -.01em
       mono / uppercase   :  .01 .02 .06 .08 .1 .12 .14 .16 .18 .2 .22em      */
  --ncg-ls-display:-.03em;
  --ncg-ls-tight:-.02em;
  --ncg-ls-snug:-.01em;
  --ncg-ls-wide:.06em;
  --ncg-ls-wider:.1em;
  --ncg-ls-widest:.2em;           /* neural .kick — VERBATIM                    */

  /* Tabular numerals are LOAD-BEARING wherever a number animates or a column
     of numbers must align: ROOT §2.3 records `font-variant-numeric:tabular-nums`
     on #xy, #fund .f-raised, #fund .f-amt and #fund .f-stat .n, and regression
     item 22 pins it. .ring, .stat-bar and .rank-ladder all set it. */

  /* ═══════════════════════════════════════════════════════════════════════
     §10 · SPACING
     NEW (additive): neither source declares a spacing scale — ROOT §1.9 has
     only --wrap/--gutter/--nav-h and neural.css only --maxw. Every step below
     is a value the sources already use, collected into one 2px-based ladder so
     components stop hard-coding padding. No existing declaration changes.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-sp-0-5:2px;   --ncg-sp-1:4px;     --ncg-sp-1-5:6px;
  --ncg-sp-2:8px;     --ncg-sp-2-5:10px;  --ncg-sp-3:12px;
  --ncg-sp-3-5:14px;  --ncg-sp-4:16px;    --ncg-sp-4-5:18px;
  --ncg-sp-5:20px;    --ncg-sp-5-5:22px;  --ncg-sp-6:24px;
  --ncg-sp-6-5:26px;  --ncg-sp-7:30px;    --ncg-sp-7-5:34px;
  --ncg-sp-8:38px;    --ncg-sp-9:48px;    --ncg-sp-10:64px;

  /* Layout — VERBATIM ROOT §1.9 and neural.css */
  --ncg-wrap:1160px;                       /* root --wrap                       */
  --ncg-maxw:1080px;                       /* neural --maxw                     */
  --ncg-gutter:clamp(20px,5vw,64px);       /* root --gutter                     */
  --ncg-gutter-editorial:26px;             /* neural .wrap padding              */
  --ncg-nav-h:64px;                        /* root --nav-h                      */
  --ncg-measure:660px;                     /* neural .lead max-width            */
  --ncg-scroll-margin:calc(var(--ncg-nav-h) + 12px);
  /* ROOT regression item 6: every <section> keeps
     scroll-margin-top:calc(var(--nav-h) + 12px) so anchored jumps clear the
     sticky header. Losing it silently hides the top of every deep-linked
     section behind the nav. */

  /* Minimum interactive target. WCAG 2.2 SC 2.5.8 (AA) requires 24×24; the
     house floor is 44×44 (SC 2.5.5 AAA) because this product is read by adults
     65+ and by people with tremor. Senior surfaces raise it to the 58px proven
     in Ciber Traversal (§B10.1). */
  --ncg-target-min:44px;
  --ncg-target-senior:58px;

  /* ═══════════════════════════════════════════════════════════════════════
     §11 · RADIUS
     VERBATIM: ROOT §1.6, neural.css, geds inline block, ciber-traversal.
     §A1.3 D1 records that geds redefines --r 14px → 12px, which is why
     index.html and 404.html of the same site do not match. Component radii are
     named by VALUE here so that collision cannot recur.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-r-xs:4px;                 /* --ct-r                                     */
  --ncg-r-sm:10px;                /* root --r-sm · --ct-r2                      */
  --ncg-r-md:12px;                /* geds inline --r · Senior buttons           */
  --ncg-r-card:14px;              /* neural --r · Senior action cards           */
  --ncg-r:16px;                   /* root --r · --ct-r3                         */
  --ncg-r-geds-lg:20px;           /* geds inline --r-lg                         */
  --ncg-r-lg:24px;                /* root --r-lg                                */
  --ncg-r-xl:32px;                /* root --r-xl                                */
  --ncg-r-pill:999px;
  --ncg-r-circle:50%;
  --ncg-hairline:1px;

  /* ═══════════════════════════════════════════════════════════════════════
     §12 · SHADOW — VERBATIM ROOT §1.7, neural.css, geds inline §A1.2
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-shadow-editorial:0 1px 2px rgba(28,25,23,.04),0 8px 24px rgba(28,25,23,.05);

  --ncg-shadow-sm:0 1px 2px rgba(26,21,18,.04),0 2px 8px rgba(26,21,18,.04);
  --ncg-shadow:0 4px 12px rgba(26,21,18,.06),0 12px 32px rgba(26,21,18,.07);
  --ncg-shadow-lg:0 8px 24px rgba(26,21,18,.08),0 30px 70px rgba(26,21,18,.12);
  --ncg-shadow-crimson:0 12px 40px rgba(155,59,75,.22);

  --ncg-shadow-geds-sm:0 1px 2px rgba(26,24,20,0.06), 0 1px 3px rgba(26,24,20,0.08);
  --ncg-shadow-geds-md:0 4px 8px rgba(26,24,20,0.06), 0 8px 20px rgba(26,24,20,0.08);
  --ncg-shadow-geds-lg:0 12px 24px rgba(26,24,20,0.08), 0 20px 40px rgba(26,24,20,0.10);

  /* ═══════════════════════════════════════════════════════════════════════
     §13 · MOTION — VERBATIM ROOT §1.8
     --ncg-spring OVERSHOOTS (the 1.56 control point). ROOT §1.8: substituting
     a non-overshooting curve "changes the feel of every interactive element".
     It is applied to .btn, #fund .f-btn, .pcard, #cur and @keyframes tickpulse.
     Do not normalise it.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-ease:cubic-bezier(.22,.61,.36,1);
  --ncg-ease-out:cubic-bezier(.16,1,.3,1);
  --ncg-spring:cubic-bezier(.34,1.56,.64,1);
  --ncg-ease-ct:ease;             /* --ct-t / --ct-t2 both use plain `ease`     */

  /* Durations. ROOT §1.8 records the full set in use:
     .16 .18 .2 .25 .3 .35 .4 .45 .5 .6 .7 .8 1 1.1 1.2 1.4 2 2.2 2.4 2.6 4.5
     7 9 46s. The named steps below are the ones the shared components need. */
  --ncg-dur-instant:.15s;         /* --ct-t                                     */
  --ncg-dur-1:.16s;
  --ncg-dur-2:.18s;               /* neural link transition — VERBATIM          */
  --ncg-dur-3:.2s;
  --ncg-dur-4:.25s;               /* --ct-t2                                    */
  --ncg-dur-5:.3s;
  --ncg-dur-6:.4s;                /* root roadmap .detail expand — VERBATIM     */
  --ncg-dur-7:.7s;                /* root .reveal — VERBATIM                    */

  /* Reveal stagger — VERBATIM ROOT §1.8 (.d1–.d4) */
  --ncg-stagger-1:.06s; --ncg-stagger-2:.12s;
  --ncg-stagger-3:.18s; --ncg-stagger-4:.24s;

  /* ═══════════════════════════════════════════════════════════════════════
     §14 · FOCUS — VERBATIM ROOT §5.3 and geds §A1.2
     ROOT: `:focus-visible{outline:2.5px solid var(--crimson);outline-offset:3px;
     border-radius:4px}` — global, never removed. Regression item 107 forbids
     overriding it to none. geds declares a second, navy variant.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-focus-w:2.5px;
  --ncg-focus-off:3px;
  --ncg-focus-r:4px;
  --ncg-focus-alt-w:3px;          /* geds --focus                               */
  --ncg-focus-alt-off:2px;        /* geds --focus-off                           */
  --ncg-focus-alt-color:#1E5285;  /* geds --focus navy · 7.67:1 on cream        */

  /* ═══════════════════════════════════════════════════════════════════════
     §15 · Z-INDEX LADDER — VERBATIM ROOT §1.10. All 8 layers, exhaustive.
     Regression item 14 pins this ladder with #veil on top and .skip above .nav.
     Every component in components.css deliberately creates NO stacking context
     above 0, so a shared component can never cover the nav, the skip link or
     the veil.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-z-hero-bg:-1;             /* .hero-bg                                   */
  --ncg-z-grain:500;              /* body::after grain                          */
  --ncg-z-hud:700;                /* #folio, #xy                                */
  --ncg-z-dock:800;               /* .dock                                      */
  --ncg-z-nav:900;                /* .nav                                       */
  --ncg-z-rail:1000;              /* #scroll-rail                               */
  --ncg-z-skip:1100;              /* .skip, #cur, #curDot                       */
  --ncg-z-veil:1200;              /* #veil                                      */

  /* ═══════════════════════════════════════════════════════════════════════
     §16 · BREAKPOINTS — VERBATIM ROOT §1.11 (the source has no token; these
     are literals). CSS cannot expand a custom property inside `@media`, so
     these exist for JavaScript (getComputedStyle), container queries and
     documentation ONLY. Media queries in components.css use literal values,
     exactly as the source does.
     Ladder: 980 · 920 (nav collapse) · 900 · 860 · 820 · 760 · 720 ·
             640 (neural) · 600 · 560 · 520 · 480
     Feature queries in use: (pointer:fine) · (pointer:coarse) ·
     (prefers-reduced-motion:reduce) ×11 · (prefers-color-scheme:dark) [JS
     only] · @media print.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-bp-980:980px; --ncg-bp-920:920px; --ncg-bp-900:900px;
  --ncg-bp-860:860px; --ncg-bp-820:820px; --ncg-bp-760:760px;
  --ncg-bp-720:720px; --ncg-bp-640:640px; --ncg-bp-600:600px;
  --ncg-bp-560:560px; --ncg-bp-520:520px; --ncg-bp-480:480px;

  /* ═══════════════════════════════════════════════════════════════════════
     §17 · ROLES — light.
     THE ONLY TOKENS components.css IS ALLOWED TO CONSUME. Defaults are the
     canonical editorial system. A surface that wants the warm root palette
     re-points these roles (§19) — it never edits a component rule.
     ═══════════════════════════════════════════════════════════════════════ */

  --ncg-surface:var(--ncg-cream);             /* page paper                     */
  --ncg-surface-card:#FFFFFF;                 /* = root --card, VERBATIM        */
  --ncg-surface-raised:var(--ncg-cream-2);    /* hover · sunken · rails         */
  --ncg-surface-invert:var(--ncg-charcoal);   /* dark island on a light page    */

  --ncg-text:var(--ncg-ink);                  /* 16.61:1 AAA                    */
  --ncg-text-2:var(--ncg-ink-2);              /*  9.09:1 even on raised — safe
                                                  EVERYWHERE                    */
  --ncg-text-3:var(--ncg-ink-3);              /*  4.56:1 — BASE SURFACE ONLY.
                                                  See the §1 contrast trap.     */
  --ncg-text-invert:var(--ncg-cream);
  --ncg-text-on-accent:var(--ncg-cream);      /* on a filled --ncg-accent       */

  --ncg-line:var(--ncg-cream-3);              /* hairline divider (decorative)  */
  --ncg-line-strong:var(--ncg-crimson-line);  /* emphasised edge                */
  --ncg-line-ui:var(--ncg-ink-3);             /* 4.56:1 — for a border that
                                                  IDENTIFIES a control or its
                                                  state, where SC 1.4.11 demands
                                                  3:1. Hairlines above are
                                                  decorative and exempt.        */

  --ncg-accent:var(--ncg-crimson);            /* 6.07:1 — text-safe             */
  --ncg-accent-strong:var(--ncg-crimson-d);   /* 7.85:1                         */
  --ncg-accent-soft:var(--ncg-crimson-soft);
  --ncg-accent-line:var(--ncg-crimson-line);

  --ncg-ok-text:var(--ncg-safe);              /* 4.72:1 on --ncg-ok-bg          */
  --ncg-ok-bg:var(--ncg-safe-bg);
  --ncg-ok-line:rgba(31,122,58,.32);
  --ncg-warn-text:var(--ncg-warn);            /* 5.98:1 on tint — see §4        */
  --ncg-warn-edge:var(--ncg-warn);            /* border + dot · 6.02:1 on cream-2*/
  --ncg-warn-tint:var(--ncg-warn-bg);
  /* DECORATIVE HAIRLINE ONLY — currently consumed by nothing. At 32% alpha it
     composites to ~1.6:1 on the cream surfaces (1.66 / 1.63 / 1.61), which is
     BELOW SC 1.4.11's 3:1 floor. That is fine for a supporting rule next to a
     tinted ground and real text, and it is how the one live sibling
     (--ncg-ok-line) is used. It is NOT fine as the sole thing identifying a
     component or its state — use --ncg-warn-edge (6.02:1) for that. The
     2026-08-07 §4 adjudication improved this value from 1.52:1 to 1.63:1 as a
     side effect; it did not make it a boundary token.                          */
  --ncg-warn-line:rgba(138,75,0,.32);         /* = --ncg-warn at 32% (§4)       */
  --ncg-danger-text:var(--ncg-danger);        /* 5.49:1 on tint                 */
  --ncg-danger-tint:var(--ncg-danger-bg);
  --ncg-danger-line:rgba(184,29,48,.30);
  --ncg-info-text:var(--ncg-info);            /* 6.76:1 on tint                 */
  --ncg-info-tint:var(--ncg-info-bg);
  --ncg-info-line:rgba(30,82,133,.28);

  --ncg-focus-color:var(--ncg-crimson);       /* 6.07:1 vs paper — far past the
                                                  3:1 SC 1.4.11 floor           */

  --ncg-elev-1:var(--ncg-shadow-editorial);
  --ncg-elev-2:var(--ncg-shadow);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §18 · ROLES — dark.
   Aliases the §3 literals and introduces the six NEW status values the source
   system never had (it has no dark status set at all). Every ratio was measured
   against BOTH dark surfaces — --ncg-dark-paper #140F0D and --ncg-dark-card
   #1E1613 — and the LOWER of the two is quoted.
   ═══════════════════════════════════════════════════════════════════════════ */

[data-theme="dark"]{
  --ncg-surface:var(--ncg-dark-paper);
  --ncg-surface-card:var(--ncg-dark-card);
  --ncg-surface-raised:var(--ncg-dark-card-2);
  --ncg-surface-invert:var(--ncg-dark-paper-2);

  --ncg-text:var(--ncg-dark-ink);             /* 15.46:1 AAA                    */
  --ncg-text-2:var(--ncg-dark-ink-2);         /*  9.66:1 AAA                    */
  --ncg-text-3:var(--ncg-dark-ink-3);         /*  5.57:1 AA — safe on both dark
                                                  surfaces, unlike its light
                                                  counterpart                   */
  --ncg-text-invert:var(--ncg-dark-paper);
  --ncg-text-on-accent:#140F0D;               /* VERBATIM ROOT §1.4
                                                 `[data-theme="dark"] .btn.solid`
                                                 — crimson-on-dark text would
                                                 otherwise be illegible.
                                                 Regression item 16 pins it.    */

  --ncg-line:var(--ncg-dark-line);
  --ncg-line-strong:var(--ncg-dark-line-2);
  --ncg-line-ui:var(--ncg-dark-ink-3);        /* 5.57:1 — SC 1.4.11 satisfied   */

  --ncg-accent:var(--ncg-dark-crimson);       /* 4.93:1 AA                      */
  --ncg-accent-strong:var(--ncg-dark-crimson-ink); /* 8.30:1 AAA                */
  --ncg-accent-soft:rgba(199,107,123,.12);
  --ncg-accent-line:rgba(199,107,123,.32);

  --ncg-ok-text:var(--ncg-dark-green-t);      /* #84B583 · 7.56:1 AAA           */
  --ncg-ok-bg:#1B2A1B;                        /* NEW (additive) — the dark
                                                 palette has no status tint.
                                                 6.40:1 with --ncg-ok-text.     */
  --ncg-ok-line:rgba(132,181,131,.34);

  --ncg-warn-text:var(--ncg-dark-gold-t);     /* #E0B45E · 9.21:1 AAA           */
  --ncg-warn-edge:var(--ncg-dark-gold-t);
  --ncg-warn-tint:#2A2214;                    /* NEW (additive) · 8.12:1        */
  --ncg-warn-line:rgba(224,180,94,.34);

  --ncg-danger-text:#F08A94;                  /* NEW (additive) — no dark red
                                                 exists that is distinct from
                                                 the crimson accent. 7.43:1 on
                                                 card, AAA.                     */
  --ncg-danger-tint:#2E1519;                  /* NEW (additive) · 7.09:1        */
  --ncg-danger-line:rgba(240,138,148,.34);

  --ncg-info-text:#8CB8E0;                    /* NEW (additive) — #1E5285 lifted
                                                 for a dark ground. 8.52:1 on
                                                 card, AAA.                     */
  --ncg-info-tint:#141F2A;                    /* NEW (additive) · 7.98:1        */
  --ncg-info-line:rgba(140,184,224,.30);

  --ncg-focus-color:var(--ncg-dark-crimson);  /* 4.93:1 vs card — past 3:1      */

  --ncg-elev-1:var(--ncg-shadow-sm);
  --ncg-elev-2:var(--ncg-shadow);

  /* Shadow literals — VERBATIM ROOT §1.7 dark half */
  --ncg-shadow-sm:0 1px 2px rgba(0,0,0,.3),0 2px 8px rgba(0,0,0,.3);
  --ncg-shadow:0 4px 12px rgba(0,0,0,.35),0 12px 32px rgba(0,0,0,.4);
  --ncg-shadow-lg:0 8px 24px rgba(0,0,0,.45),0 30px 70px rgba(0,0,0,.55);
  --ncg-shadow-crimson:0 12px 40px rgba(199,107,123,.2);

  /* Warm palette dark overrides — VERBATIM ROOT §1.2, so a page that consumes
     --ncg-warm-* directly keeps its exact dark values too. */
  --ncg-warm-paper:var(--ncg-dark-paper);
  --ncg-warm-paper-2:var(--ncg-dark-paper-2);
  --ncg-warm-card:var(--ncg-dark-card);
  --ncg-warm-card-2:var(--ncg-dark-card-2);
  --ncg-warm-cream:var(--ncg-dark-cream);
  --ncg-warm-ink:var(--ncg-dark-ink);
  --ncg-warm-ink-2:var(--ncg-dark-ink-2);
  --ncg-warm-ink-3:var(--ncg-dark-ink-3);
  --ncg-warm-ink-4:var(--ncg-dark-ink-4);
  --ncg-warm-line:var(--ncg-dark-line);
  --ncg-warm-line-2:var(--ncg-dark-line-2);
  --ncg-warm-crimson:var(--ncg-dark-crimson);
  --ncg-warm-crimson-2:var(--ncg-dark-crimson-2);
  --ncg-warm-crimson-ink:var(--ncg-dark-crimson-ink);
  --ncg-warm-copper:var(--ncg-dark-copper);
  --ncg-warm-copper-2:var(--ncg-dark-copper-2);
  --ncg-warm-copper-t:var(--ncg-dark-copper-t);
  --ncg-warm-gold:var(--ncg-dark-gold);
  --ncg-warm-gold-t:var(--ncg-dark-gold-t);
  --ncg-warm-green:var(--ncg-dark-green);
  --ncg-warm-green-2:var(--ncg-dark-green-2);
  --ncg-warm-green-t:var(--ncg-dark-green-t);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §19 · SURFACE PRESET — "warm" (the root site's palette). OPT-IN.
   Put `data-ncg-palette="warm"` on <html> (or on any subtree) and every shared
   component renders in the root site's warm system instead of the editorial
   one, with zero component edits. Nothing applies it by default, so no page
   changes appearance until someone opts in deliberately.
   ═══════════════════════════════════════════════════════════════════════════ */

[data-ncg-palette="warm"]{
  --ncg-surface:var(--ncg-warm-paper);
  --ncg-surface-card:var(--ncg-warm-card);
  --ncg-surface-raised:var(--ncg-warm-paper-2);
  --ncg-text:var(--ncg-warm-ink);
  --ncg-text-2:var(--ncg-warm-ink-2);
  --ncg-text-3:var(--ncg-warm-ink-3);
  --ncg-line:var(--ncg-warm-line);
  --ncg-line-strong:var(--ncg-warm-line-2);
  --ncg-line-ui:var(--ncg-warm-ink-3);        /* 5.4:1 — SC 1.4.11 satisfied    */
  --ncg-accent:var(--ncg-warm-crimson);       /* 6.3:1 per the source header    */
  --ncg-accent-strong:var(--ncg-warm-crimson-ink);
  --ncg-accent-soft:rgba(155,59,75,.08);
  --ncg-accent-line:rgba(155,59,75,.22);
  --ncg-ok-text:var(--ncg-warm-green-t);      /* 5.98:1 AA                      */
  --ncg-warn-text:var(--ncg-warm-copper-t);   /* 5.46:1 AA                      */
  --ncg-focus-color:var(--ncg-warm-crimson);
  --ncg-elev-1:var(--ncg-shadow-sm);
  --ncg-elev-2:var(--ncg-shadow);
}

/* ═══════════════════════════════════════════════════════════════════════════
   §20 · SURFACE PRESET — Senior / high-legibility. OPT-IN.
   Put `data-ncg-palette="senior"` on the Senior experience's root element. This
   re-points the roles at the VERBATIM Ciber Traversal elder-mode values and
   raises the minimum target from 44px to the proven 58px. The type, leading and
   tracking rules that complete the treatment live in components.css §S, which
   is where the `a[href^="tel"]` AND `.el-detail strong` pairing is preserved.
   ═══════════════════════════════════════════════════════════════════════════ */

[data-ncg-palette="senior"]{
  --ncg-surface:var(--ncg-senior-bg);
  --ncg-surface-card:var(--ncg-senior-surface);
  --ncg-surface-raised:var(--ncg-senior-btn);
  --ncg-text:var(--ncg-senior-text);          /* 15.98:1 on card AAA            */
  --ncg-text-2:var(--ncg-senior-text);        /* Senior has NO muted text tier —
                                                 that is the point of the mode  */
  --ncg-text-3:var(--ncg-senior-text);
  --ncg-text-invert:var(--ncg-senior-bg);
  --ncg-text-on-accent:var(--ncg-senior-bg);
  --ncg-line:var(--ncg-senior-edge-soft);
  --ncg-line-strong:var(--ncg-senior-edge);
  --ncg-line-ui:var(--ncg-senior-edge);       /* 7.71:1 — SC 1.4.11 satisfied   */
  --ncg-accent:var(--ncg-senior-gold);        /* 11.91:1 on card AAA            */
  --ncg-accent-strong:var(--ncg-senior-gold);
  --ncg-accent-soft:rgba(255,210,74,.10);
  --ncg-accent-line:var(--ncg-senior-edge-soft);
  --ncg-ok-text:var(--ncg-senior-action);     /* 10.97:1 on card AAA            */
  --ncg-ok-bg:var(--ncg-senior-surface);
  --ncg-ok-line:var(--ncg-senior-edge-soft);
  --ncg-focus-color:var(--ncg-senior-gold);   /* 12.55:1 vs bg                  */
  --ncg-target-min:var(--ncg-target-senior);  /* 58px                           */
  --ncg-r-card:var(--ncg-senior-r-card);
  --ncg-elev-1:none;                          /* shadows are invisible on this
                                                 ground and cost paint          */
  --ncg-elev-2:none;
}
