/* ============================================================================
   palette.css — MP071 (Alex Cristache). LOAD LAST on every page.

   Source: `_notes/PALETTE-MP071.md` — the six hexes Ash picked, with their
   published contrast ratios. Structure comes from `_notes/15_design-pass.md`
   § 3.2 "three surfaces, full stop" (A page canvas · B light panel · C dark
   panel) and DESIGN.md's one-saturated-colour rule.

   This file is a PALETTE LAYER only. It re-colours what is already built; it
   changes no layout, no spacing, no type scale. Delete the one <link> and the
   old colours come back.

   WHAT IT REPLACES
     green   #37CC8D (Pixy a2) · #1E9E63 (live subpage) · #7fe3b3 (svf stages)
     gold    #f1b84b (our tags, eyebrows, em.s accents)
     orange  #FEAF62 (Pixy a1)
     beige   #f4f1ea (--canvas) · #E7E7E4 (panel 2) · cream card washes
     RED     #e60023 — the Pinterest red the previous pass installed. It does
             not exist anywhere in MP071 and is now GONE from this file.
     grey    #ffffff/#f6f6f3/#fbfbf9 canvases · #262622/#141412/#0b0b0a darks
   WITH MP071: warm off-white + cool blue-grey surfaces, a navy dark panel, and
   ONE saturated colour — Sea Buckthorn amber.

   THE SIX (+ white for the raised card)
     Magical Moonlight #F0EEEB  18.13:1   light canvas / dark ink
     Neverything       #13181B  17.88:1   light ink   / dark canvas
     Ateneo Blue       #003A6C  11.53:1   dark panel + dark-theme card  (SURFACE ONLY)
     Polar Drift       #CCD5DA  14.10:1   light panel + hairline
     Sea Buckthorn     #FFBF65  12.89:1   ★ THE ACCENT
     Miami Coral       #FD8973   9:1      the live alternative accent
   ========================================================================== */

/* ╔════════════════════════════════════════════════════════════════════════╗
   ║                                                                        ║
   ║   §0 · HOW TO CHANGE THE BACKGROUNDS                                   ║
   ║                                                                        ║
   ║   Every background on the site comes from FIVE lines per theme. Drop   ║
   ║   new hexes in and the whole site follows — you do not need to touch   ║
   ║   any other file, or any other rule in this one.                       ║
   ║                                                                        ║
   ║     LIGHT theme  →  the `:root, [data-theme=light]` block below        ║
   ║     DARK  theme  →  the `[data-theme=dark]` block below it             ║
   ║                                                                        ║
   ║   ┌──────────────────┬──────────────────────────────────────────────┐  ║
   ║   │ EDIT THIS LINE   │ TO CHANGE                                    │  ║
   ║   ├──────────────────┼──────────────────────────────────────────────┤  ║
   ║   │ --bg-canvas      │ (surface A) the PAGE CANVAS — every page's    │  ║
   ║   │   L: line 149    │ base colour: home, services, work, THE WORK, │  ║
   ║   │   D: line 210    │ the FAQ, the header and the footer.          │  ║
   ║   │ --bg-panel2      │ (surface B) the PANEL SURFACE — "EVERYTHING  │  ║
   ║   │   L: line 150    │ YOUR BRAND NEEDS", the drifting rail behind  │  ║
   ║   │   D: line 211    │ it, and the VISION IN MOTION ticker that     │  ║
   ║   │                  │ closes it. The page's ONLY light panel.      │  ║
   ║   │ --bg-card        │ the CARD SURFACE — the Production Worlds     │  ║
   ║   │   L: line 151    │ cards on the rail, and the lightbox plate.   │  ║
   ║   │   D: line 216    │ Must stay a step ABOVE --bg-panel2: since    │  ║
   ║   │                  │ the cards lost their drop shadows, that      │  ║
   ║   │                  │ value step is the only thing separating them.│  ║
   ║   │ --bg-panel-dark  │ (surface C) THE SECOND PANEL — the hero's    │  ║
   ║   │   L: line 152    │ right-side box AND THE ENGINE ROOM. ALIASED  │  ║
   ║   │   D: line 218    │ to --bg-panel2 (Ash, 2026-07-28) — see §0.1. │  ║
   ║   │                  │ Drop a hex here to give them their own       │  ║
   ║   │                  │ colour again; if it is DARK, also flip       │  ║
   ║   │                  │ --fg-on-panel* in the same block.            │  ║
   ║   │ --bg-hairline    │ every HAIRLINE — FAQ rules, card borders,    │  ║
   ║   │   L: line 159    │ filter chips, the back-to-top pill's edge.   │  ║
   ║   │   D: line 220    │                                              │  ║
   ║   └──────────────────┴──────────────────────────────────────────────┘  ║
   ║                                                                        ║
   ║   Four more, kept next to the five so nothing is hidden:               ║
   ║     --bg-canvas-soft   collapsed onto --bg-canvas. It used to be a     ║
   ║                       phantom FOURTH surface 1–2% off the canvas —     ║
   ║                       exactly the "bongoose" mud. Leave it aliased.    ║
   ║     --bg-hairline-soft the lighter rule.                               ║
   ║     --bg-stage        the hero stage. Aliased to --bg-panel-dark, so   ║
   ║                       the hero and the Engine Room move together.      ║
   ║     --bg-inset-dark   a genuinely DARK inset box — the services dial   ║
   ║                       and live-effects' `.dark` panels, which sit on   ║
   ║                       their own dark photography. Split out so the     ║
   ║                       line above cannot repaint them. See § H0.        ║
   ║                                                                        ║
   ║   ── §0.1 · THE SECOND PANEL (supersedes "the two darks") ─────────    ║
   ║   Ash, 2026-07-28: *"change the background color of the hero banner    ║
   ║   'we dont maker post' right side box and the engine room background.  ║
   ║   i likew the background color used in panel two"*                     ║
   ║                                                                        ║
   ║   So --bg-panel-dark is now `var(--bg-panel2)` and --bg-stage rides    ║
   ║   it. The hero's side box and the Engine Room are panel 2's surface,   ║
   ║   in both themes. The page runs TWO surfaces plus a card: the canvas   ║
   ║   (A) and the panel (B) — down from three, which is the direction      ║
   ║   _notes/15_design-pass.md § 3.2 was pushing anyway.                   ║
   ║                                                                        ║
   ║   The earlier step — aliasing --bg-stage to --bg-panel-dark so the     ║
   ║   hero and the Engine Room stopped running two unrelated darks — is    ║
   ║   still in force; the pair simply moved somewhere lighter together.    ║
   ║                                                                        ║
   ║   THE CATCH, and why § H exists: the old surface was near-black and    ║
   ║   panel 2's is a LIGHT grey-blue, so the ink on both panels had to be  ║
   ║   re-derived. Anything painted on those two panels reads               ║
   ║   --fg-on-panel / -lead / -mute (which FLIP). Anything painted on      ║
   ║   FOOTAGE — the reel, the tile photos, the scroll cue, the header      ║
   ║   lockup — keeps --fg-on-dark / --fg-on-dark-mute (which do NOT).      ║
   ║                                                                        ║
   ║   ── §0.2 · THE ACCENT, AND HOW TO SWAP IT ────────────────────────    ║
   ║   ★ ONE LINE. `--accent-base` on LINE 132. Nothing else.               ║
   ║       Sea Buckthorn (live)   →  --accent-base: #FFBF65;                ║
   ║       Miami Coral (alt)      →  --accent-base: #FD8973;                ║
   ║   Everything else — the fill, the pressed state, the on-accent ink,    ║
   ║   the dark-theme text rendering and all five Mokko --color-primary-*   ║
   ║   steps — is derived from it.                                          ║
   ║   Sea Buckthorn is the pick: it is a near-match for By The Owl's own   ║
   ║   prior brand gold #f1b84b that this rebuild replaced, so it reads as  ║
   ║   returning to brand rather than adopting a fourth new colour, and it  ║
   ║   carries the higher ratio (12.89:1 vs Coral's 9:1).                   ║
   ║   Ateneo Blue is a SURFACE, never an accent. There is exactly one      ║
   ║   accent — DESIGN.md allows exactly one.                               ║
   ║                                                                        ║
   ║   RULES WHEN YOU SWAP THEM                                             ║
   ║   · Light backgrounds pair with the --fg-* ink ramp in the SAME block. ║
   ║     If you darken --bg-canvas in LIGHT mode, lighten --fg-* to match,  ║
   ║     and re-run the contrast table in _notes/17_mp071-apply.md.         ║
   ║   · Never hardcode a value that only holds in one theme. Every colour  ║
   ║     below resolves to a token in this block — that is the whole point. ║
   ║   · Do NOT add a second saturated colour.                              ║
   ╚════════════════════════════════════════════════════════════════════════╝ */

/* ══════ THE ACCENT — one line, both themes, every derived step ════════════ */
:root,
[data-theme],
[data-theme=light],
[data-theme=dark] {
  --accent-base: #FFBF65;   /* ★ LINE 132 — Sea Buckthorn. Swap to #FD8973
                                for Miami Coral and the whole system follows. */
  --accent-ink:  #13181B;   /* Neverything — the ink that rides ON the accent.
                                #13181B on #FFBF65 = 10.98:1. White would be
                                1.63:1, which is why the accent's partner is
                                the palette's ink, not white. */
  --fg-accent-on-dark: var(--accent-base);
                            /* the accent as TEXT on a surface that is dark in
                                BOTH themes (the Engine Room, the hero stage,
                                the services dial). It never flips, because the
                                surface never flips: 10.98:1 on #13181B,
                                7.08:1 on #003A6C. See § G9. */
}

/* ══════════════════════ LIGHT THEME — the 5 background lines ══════════════ */
:root,
[data-theme=light] {
  --bg-canvas:        #F0EEEB;   /* ← 1. PAGE CANVAS   · Magical Moonlight  */
  --bg-panel2:        #CCD5DA;   /* ← 2. PANEL SURFACE · Polar Drift        */
  --bg-card:          #FFFFFF;   /* ← 3. CARD SURFACE  · raised, on panel 2 */
  --bg-panel-dark:    var(--bg-panel2);          /* ← 4. THE SECOND PANEL — the hero's
                                        side box + THE ENGINE ROOM. Ash, 2026-07-28:
                                        "i like the background color used in panel two".
                                        Aliased, so it tracks line 150 automatically.
                                        Drop a hex here to un-alias it — and if that hex
                                        is DARK, flip --fg-on-panel* below to the light
                                        pair (#F0EEEB / #B7B6B5) or the ink inverts. */
  --bg-hairline:      rgba(204, 213, 218, .55);  /* ← 5. HAIRLINE · Polar Drift 55% */

  --bg-canvas-soft:   var(--bg-canvas);          /*    aliased — no 4th surface */
  --bg-hairline-soft: rgba(204, 213, 218, .34);  /*    the lighter rule  */
  --bg-stage:         var(--bg-panel-dark);      /*    the hero stage rides line 152 */

  /* a genuinely DARK inset box — the services dial and live-effects' `.dark`
     panels, which sit on their own dark photography and are NOT what Ash moved.
     This used to be --bg-panel-dark; it is split out so the hero/Engine-Room
     change cannot silently repaint the services page. */
  --bg-inset-dark:    #13181B;

  /* ink ramp — Neverything stepped toward Magical Moonlight ------------- */
  --fg-ink:      #13181B;   /* headings, card titles, ticker lead word   15.44:1 */
  --fg-heading:  #13181B;   /* the big panel-2 / section headlines       15.44:1 */
  --fg-lead:     #484B4D;   /* the lead paragraph under a headline        7.59:1 */
  --fg-body:     #2E3234;   /* body copy                                 11.18:1 */
  --fg-mute:     #555859;   /* eyebrows, captions, secondary marks        6.20:1
                               — held at 4.82:1 on panel 2, so the 12px bold
                                 eyebrows clear 4.5:1 on the PANEL too. */
  --fg-eyebrow:  #555859;   /* one eyebrow spec; was Mokko's #747474 */
  --fg-faint:    #67696A;   /* the quietest mark on the page              4.77:1 */

  /* ink ON --bg-panel-dark (the hero side box + the Engine Room). Now that the
     surface is panel 2's, this is simply the page ramp again — the panel and
     the page share one set of inks. Figures are against #CCD5DA. */
  --fg-on-panel:      #13181B;   /* 12.01:1 */
  --fg-on-panel-lead: #484B4D;   /*  5.90:1 */
  --fg-on-panel-mute: #555859;   /*  4.82:1 — clears the body floor on the panel */

  /* ink ON MEDIA and on --bg-inset-dark — video, photography, the black scrim
     pills, the services dial. These do NOT flip: the ground never flips. */
  --fg-on-dark:  #F0EEEB;   /* 15.44 on #13181B · 9.95 on #003A6C */
  --fg-on-dark-mute: #B7B6B5; /* 8.83 on #13181B · 5.69 on #003A6C */

  /* the ONE saturated colour, in its three jobs ------------------------- */
  --fill-accent:      var(--accent-base);   /* accent as a FILL, under --fg-on-accent */
  --fill-accent-press:#DEA85B;              /* one notch deeper; ink on it 8.40:1 */
  --fg-accent:        #854D00;              /* accent as TEXT/ICON on a LIGHT surface.
                                               Same hue as the base (35°), dropped to
                                               L26% so it clears 4.5:1 on the canvas
                                               (5.93:1) AND on panel 2 (4.61:1).
                                               #FFBF65 as text on the canvas is 1.41:1.
                                               One accent, two renderings — the same
                                               move the old palette made for red. */
  --fg-on-accent:     var(--accent-ink);
  --fg-focus:         #435ee5;  /* focus ring (a system colour, not brand) */
}

/* ══════════════════════ DARK THEME — the same 5 lines ═════════════════════ */
[data-theme=dark] {
  --bg-canvas:        #13181B;   /* ← 1. PAGE CANVAS   · Neverything        */
  --bg-panel2:        #0B263B;   /* ← 2. PANEL SURFACE · 40% Ateneo Blue over
                                        Neverything. The one derived value in
                                        the set: panel 2 has to sit BETWEEN the
                                        canvas and the cards, and MP071 has no
                                        sixth surface hex. 1.15:1 off canvas. */
  --bg-card:          #003A6C;   /* ← 3. CARD SURFACE  · Ateneo Blue — the note's
                                        "the dark theme's card". 1.35:1 on panel 2. */
  --bg-panel-dark:    var(--bg-panel2);          /* ← 4. THE SECOND PANEL — aliased to
                                        line 211, same as the light block. */
  --bg-hairline:      rgba(240, 238, 235, .14);  /* ← 5. HAIRLINE · Moonlight 14% */

  --bg-canvas-soft:   var(--bg-canvas);
  --bg-hairline-soft: rgba(240, 238, 235, .09);
  --bg-stage:         var(--bg-panel-dark);      /*    the hero stage rides line 218 */

  --bg-inset-dark:    #003A6C;   /* the genuinely-dark inset box (services dial) */

  /* ink ramp — Magical Moonlight stepped toward Neverything -------------
     Each figure is against the dark canvas; the panel and card are checked
     in _notes/17_mp071-apply.md and every one clears its floor. */
  --fg-ink:      #F0EEEB;   /* 15.44:1 canvas · 13.39 panel · 9.95 card */
  --fg-heading:  #F0EEEB;
  --fg-lead:     #BFBFBD;   /*  9.71 · 8.42 · 6.26 */
  --fg-body:     #DAD9D6;   /* 12.67 · 10.98 · 8.17 */
  --fg-mute:     #A5A5A4;   /*  7.25 · 6.29 · 4.68 — clears 4.5 on the CARD */
  --fg-eyebrow:  #A5A5A4;
  --fg-faint:    #989898;   /*  6.20 on canvas (canvas-only role) */

  /* ink ON --bg-panel-dark — figures against #0B263B */
  --fg-on-panel:      #F0EEEB;   /* 13.39:1 */
  --fg-on-panel-lead: #BFBFBD;   /*  8.42:1 */
  --fg-on-panel-mute: #A5A5A4;   /*  6.29:1 */

  /* ink ON MEDIA / --bg-inset-dark — identical in both blocks, on purpose */
  --fg-on-dark:  #F0EEEB;
  --fg-on-dark-mute: #B7B6B5;

  --fill-accent:      var(--accent-base);   /* SAME hex as light — it is a fill
                                               under --accent-ink, so it never
                                               needs a second rendering. */
  --fill-accent-press:#DEA85B;
  --fg-accent:        var(--accent-base);   /* on a DARK surface the base reads
                                               directly: 10.98 canvas · 9.52 panel
                                               · 7.08 card. No lift needed. */
  --fg-on-accent:     var(--accent-ink);
  --fg-focus:         #8fa2ff;
}

/* ══════════ everything below just plugs the old names into the new ════════
   Nothing here needs editing to change a colour. These lines exist so the
   ~15 stylesheets already shipped keep working off the five tokens above.
   ======================================================================== */
:root,
[data-theme=light],
[data-theme=dark] {
  /* brand — the ONLY saturated colour in the system */
  --pin-primary:        var(--fill-accent);
  --pin-primary-press:  var(--fill-accent-press);
  --pin-on-primary:     var(--fg-on-accent);

  /* surface */
  --pin-canvas:         var(--bg-canvas);
  --pin-surface-soft:   var(--bg-canvas-soft);
  --pin-surface-card:   var(--bg-panel2);
  --pin-secondary-bg:   var(--bg-hairline-soft);
  --pin-secondary-press: var(--bg-hairline);
  --pin-surface-dark:   var(--bg-inset-dark);
  --pin-hairline:       var(--bg-hairline);
  --pin-hairline-soft:  var(--bg-hairline-soft);

  /* text */
  --pin-ink:            var(--fg-ink);
  --pin-ink-soft:       var(--fg-body);
  --pin-body:           var(--fg-body);
  --pin-charcoal:       var(--bg-inset-dark);
  --pin-mute:           var(--fg-mute);
  --pin-ash:            var(--fg-faint);
  /* --pin-stone / --pin-on-dark are ON-DARK tokens: they live on the ENGINE
     ROOM and the hero stage, which are dark in BOTH themes. They must NOT
     flip, or the dark panel loses its text in light mode. */
  --pin-stone:          var(--fg-on-dark-mute);
  --pin-on-dark:        var(--fg-on-dark);

  --pin-focus:          var(--fg-focus);

  /* shape — DESIGN.md: exactly three radii in active use, nothing between */
  --pin-r-md:           16px;
  --pin-r-lg:           32px;
  --pin-r-full:         9999px;

  /* --- retarget the tokens our ported CSS already consumes --------------- */
  --canvas:      var(--bg-canvas);
  --surface:     var(--bg-card);
  --ink:         var(--fg-ink);
  --body:        var(--fg-body);
  --mute:        var(--fg-mute);
  --hair:        var(--bg-hairline);
  --green:       var(--fill-accent);      /* was #f1b84b / #1E9E63 / #e60023 */
  --green-tx:    var(--fg-accent);
  /* HARDCODED-TOKEN FIX (MP071): was the literal `rgba(230, 0, 35, .10)` — the
     old accent, frozen. It could not follow a palette swap, and in dark mode it
     stayed a red wash after everything around it had moved. Derived now. */
  --green-soft:  color-mix(in srgb, var(--fill-accent) 12%, transparent);
  --dc-accent:   var(--fg-accent);
  /* the `.dark` boxes in live-effects.css (the services dial) — deliberately
     NOT --bg-panel-dark any more. Ash moved the hero stage and the Engine Room
     onto panel 2's surface; the services dial sits on its own dark photography
     and was not part of that ask, so it keeps a real dark. See § H0. */
  --dark:        var(--bg-inset-dark);
  --dark-2:      var(--bg-inset-dark);
  --on-dark:     var(--fg-on-dark);
  /* HARDCODED-TOKEN FIX (MP071): these two were `color-mix(in srgb, var(--fg-on-dark) 62%, transparent)` and
     `color-mix(in srgb, var(--fg-on-dark) 14%, transparent)` — resolved copies of the on-dark ramp. Correct by
     luck (surface C is dark in both themes) but they would have stranded the
     moment --fg-on-dark moved off white, which MP071 does. */
  --on-dark-mute: var(--fg-on-dark-mute);
  --on-dark-hair: color-mix(in srgb, var(--fg-on-dark) 14%, transparent);

  /* Mokko paints `body { background-color: var(--color-bg) }`. Pointing it at
     --bg-canvas is what makes line 1 of the block above drive the whole page. */
  --color-bg:           var(--bg-canvas);
}

/* --- accents: every gold / green / mint becomes the ONE accent ------------
   MP071 FIX: these are all TEXT roles and they used to read `--pin-primary`,
   which is the FILL token. That was survivable under red (#e60023 as text is
   5.25:1 on white) and is not under an amber: #FFBF65 as text is 1.41:1 on the
   canvas. Text roles take --fg-accent, fills take --fill-accent / --pin-primary.
   That split is the whole reason the two tokens exist. */
.er3-tag,
.er3-lanes a::before,
.er3-st,
.fq-head em.s,
.svc-page em.s,
em.s,
.bto-pw-eyebrow,
.bto-card-tag,
.svc-eyebrow,
.wk-cat,
.wk-tile-cap .wk-cat,
.svf-stage .kick,
.bto-step-when,
.svc-n,
.bto-panels .bto-step-when,
.bto-banner-title em,
.bto-banner-title span,
.bto-banner-title .accent { color: var(--fg-accent); }

.er3-st::before { background: var(--fill-accent); }

/* the svf stage rules hardcode mint — DESIGN.md allows exactly one accent.
   HARDCODED-TOKEN FIX (MP071): the border was the literal `rgba(230,0,35,.5)`. */
.svf-steps .step { border-top-color: color-mix(in srgb, var(--fill-accent) 50%, transparent); }
.svf-steps .step .n { color: var(--fg-accent); }
.svf-stage .chipset span b { color: var(--fg-accent); }

/* --- surfaces: beige / cream become Pinterest's warm neutral ------------- */
/* PANEL-2 SURFACE — driven by --bg-panel2 (§0, line 2). This is the rule that
   beats marquee-banner.css:45 and mokko-bridge.css:153, both of which hardcode
   #E7E7E4; palette.css loads last so it wins at equal specificity. */
.bto-banner.mil-p-160-100,
.bto-banner { background: var(--bg-panel2); }

/* SUPERSEDED 2026-07-27 (design pass) — the % stops made the plate ~60%
   transparent by the time it reached the headline, so the drifting cards read
   straight THROUGH "EVERYTHING YOUR BRAND NEEDS". Restated below in px so the
   fade band is a fixed 280px regardless of viewport. Geometry (the ::before
   inset) is in mokko-bridge.css § H.

   THEME NOTE 2026-07-27: the third stop used to be the literal
   `rgba(246, 246, 243, 0)` — panel-2's LIGHT grey at zero alpha. That is a
   resolved token, and in dark mode it faded the plate out through a light
   grey. Replaced with plain `transparent`; Chrome interpolates gradients with
   premultiplied alpha, so `transparent` fades the *first* stop's colour out
   rather than washing through black. One token, both themes. */
.bto-banner-copy::before {
  background: linear-gradient(90deg,
    var(--bg-panel2) 0,
    var(--bg-panel2) calc(100% - 280px),
    transparent 100%);
}

/* CARD SURFACE — driven by --bg-card (§0, line 3). Beats marquee-banner.css:152
   (`background: #fff`). */
.bto-pw-card,
.wk-lb-inner video { background: var(--bg-card); }
.bto-pw-card { border-color: var(--bg-hairline); }
.bto-pw-title { color: var(--fg-ink); }
.bto-pw-desc  { color: var(--fg-body); }
/* the thumbnail well was `rgba(53, 54, 57, .06)` — a light-mode ink wash that
   vanishes on a dark card. */
.bto-pw-thumb { background: var(--bg-hairline-soft); }

/* DARK-PANEL SURFACE — driven by --bg-panel-dark (§0, line 4). Beats
   sections.css:105 (`background: #0a0f0c`). */
.er-sec { background: var(--bg-panel-dark); }
/* HARDCODED-TOKEN FIX (MP071): the bloom was a literal `rgba(230,0,35,.14)`
   radial. §B below already supersedes it with a neutral bloom and mokko-bridge
   § P5.2 stops the pseudo-element being generated at all — but the literal is
   removed rather than left to rot. */
.er-sec::before {
  background: radial-gradient(50% 50% at 50% 50%,
    color-mix(in srgb, var(--fg-on-dark) 7%, transparent) 0%, transparent 70%);
}
.er3-term { border-color: color-mix(in srgb, var(--fg-on-dark) 12%, transparent); }

/* --- buttons: one accent primary, everything else monochrome -------------
   Mokko's primary is its green #97EA90. DESIGN.md is explicit that the system
   has exactly ONE saturated colour and it carries every primary action, so the
   green goes. These are Mokko's real class names (`.btn--primary`), not Pixy's
   — the `mil-*` ones were stripped in the conversion. */
.btn.btn--primary,
.rts-btn.btn-primary,
.bto-nav-cta {
  background: var(--pin-primary) !important;
  border-color: var(--pin-primary) !important;
  color: var(--pin-on-primary) !important;
}
.btn.btn--primary:hover,
.bto-nav-cta:hover {
  background: var(--pin-primary-press) !important;
  border-color: var(--pin-primary-press) !important;
}

/* the ghost/secondary partner — monochrome, never a second accent */
.bto-btn-ghost {
  background: transparent !important;
  border: 1px solid var(--pin-ink) !important;
  color: var(--pin-ink) !important;
}
.bto-btn-ghost:hover { background: var(--pin-ink) !important; color: var(--pin-canvas) !important; }

.bto-pw-btn { border-color: var(--pin-hairline); color: var(--pin-ink); }
.bto-pw-card:hover .bto-pw-btn { background: var(--pin-primary); border-color: var(--pin-primary); color: var(--pin-on-primary); }

/* --- hairlines ----------------------------------------------------------- */
.fq-list  { border-top-color: var(--pin-hairline); }
.fq-item  { border-bottom-color: var(--pin-hairline); }
.fq-a p   { color: var(--pin-body); }
.fq-n     { color: var(--pin-mute); }
.svc-section + .svc-section { border-top-color: var(--pin-hairline); }
.wk-filter button { border-color: var(--pin-hairline); color: var(--pin-ink); }
.wk-filter button.is-checked { background: var(--pin-ink); border-color: var(--pin-ink); color: var(--pin-canvas); }

/* --- shape: collapse onto DESIGN.md's three radii ------------------------ */
.bto-pw-card,
.er3-tile,
.er3-term,
.wk-tile,
.svc-film,
.mil-project-img { border-radius: var(--pin-r-md); }

/* pill is for CHIPS AND BUTTONS ONLY. Applying it to the card thumbnail turned
   every thumbnail into a circle — DESIGN.md gives images 16px, not pill. */
.bto-card-tag,
.bto-pw-btn,
.wk-filter button { border-radius: var(--pin-r-full); }

.bto-pw-thumb { border-radius: var(--pin-r-md); }

.hb-scroller .hb-viewer { border-radius: var(--pin-r-lg); }

/* --- focus ring (DESIGN.md: 2px outer blue + white inner gap) ------------ */
a:focus-visible,
button:focus-visible,
input:focus-visible {
  outline: 2px solid var(--pin-focus);
  outline-offset: 2px;
}

/* --- SUPERSEDED 2026-07-27 (MP071) ---------------------------------------
   This block used to read: "`.hb-stage` (#14130f) is NOT re-coloured, on
   purpose — the hero is a cinematic film stage and the brief froze it."
   That was correct while the two darks could not be reconciled. Under MP071
   they can (§0.1), so --bg-stage is now `var(--bg-panel-dark)` and the hero
   stage and the Engine Room are the same room in both themes. The hero's
   GEOMETRY is still frozen — one background token moved, nothing else. */

/* the hero's client-logo strip was the old cream #f4f1ea (hero.css:127), a
   colour MP071 does not contain. It is the same job as the page canvas — a
   light strip docking into the dark stage — so it takes the canvas token and
   inverts with the site. */
.hb-brands { background: var(--bg-canvas); }


/* ============================================================================
   ============================================================================
   DESIGN PASS — Creative Director, 2026-07-27
   Everything below this line was added in the design QA pass. COLOUR ONLY;
   all geometry/spacing lives in bto-css/mokko-bridge.css.
   ============================================================================
   ========================================================================== */


/* ==========================================================================
   A · KILL MOKKO'S MINT AT THE TOKEN, NOT PER-COMPONENT

   Mokko's `--color-primary` is `hsl(115.33, 68.18%, 74.12%)` — mint green
   (#97EA90) — and it is consumed in ~30 places across style.css: button fills,
   the `.ms-sl` underline, the back-to-top pill, focus rings, and a dozen
   `hsla(var(--color-primary-h) …)` alpha washes that a per-component override
   can never reach. `--color-accent` is a second saturated colour again
   (hsl(342,89%,48%) — a pink-red that is not the accent either).

   The previous pass chased these one class at a time (`.btn--primary`,
   `.back-to-top .ms-btt--inner`, …) and the mint kept resurfacing — it is why
   "See our services" still renders green in _shots/mokko-panel2.png while the
   header CTA next to it renders red.

   Retargeting the tokens themselves is the single highest-leverage fix on the
   page: one block, and every mint/pink surface in Mokko becomes the one
   saturated colour DESIGN.md allows. The -h/-s/-l triplets must move too or
   the alpha washes stay mint.

   MP071 UPDATE 2026-07-27: the whole triplet set moves off red and onto Sea
   Buckthorn. #FFBF65 === hsl(35, 100%, 70%). The five steps stay on hue 35 /
   sat 100% and only lightness moves, so every `hsla(var(--color-primary-h) …)`
   alpha wash inside Mokko becomes an amber wash of the SAME accent — no
   second saturated colour anywhere.

   If you swap --accent-base (§0.2, line 133) to Miami Coral #FD8973, also move
   the hue here from 35 to 9 and the lightness steps to 72/64/57/79/86 — that
   is the only place a swap needs a second edit, because Mokko needs the
   channels split and CSS cannot decompose a hex into H/S/L.
   ========================================================================== */
:root,
[data-theme],
[data-theme=light],
[data-theme=dark] {
  --color-primary:          var(--accent-base);   /* #FFBF65 */
  --color-primary-h:        35;
  --color-primary-s:        100%;
  --color-primary-l:        70%;

  --color-primary-dark:     #FFAE3D;
  --color-primary-dark-h:   35;
  --color-primary-dark-s:   100%;
  --color-primary-dark-l:   62%;

  --color-primary-darker:   #FF9F1A;
  --color-primary-darker-h: 35;
  --color-primary-darker-s: 100%;
  --color-primary-darker-l: 55%;

  --color-primary-light:    #FFD08F;
  --color-primary-light-h:  35;
  --color-primary-light-s:  100%;
  --color-primary-light-l:  78%;

  --color-primary-lighter:  #FFDFB3;
  --color-primary-lighter-h: 35;
  --color-primary-lighter-s: 100%;
  --color-primary-lighter-l: 85%;

  /* Mokko's second saturated colour. DESIGN.md allows exactly one, so accent
     collapses onto primary rather than getting its own value. */
  --color-accent:           var(--accent-base);
  --color-accent-h:         35;
  --color-accent-s:         100%;
  --color-accent-l:         70%;
  --color-accent-dark:      #FFAE3D;
  --color-accent-dark-h:    35;
  --color-accent-dark-s:    100%;
  --color-accent-dark-l:    62%;
  --color-accent-darker:    #FF9F1A;
  --color-accent-darker-h:  35;
  --color-accent-darker-s:  100%;
  --color-accent-darker-l:  55%;
  --color-accent-light:     #FFD08F;
  --color-accent-light-h:   35;
  --color-accent-light-s:   100%;
  --color-accent-light-l:   78%;
  --color-accent-lighter:   #FFDFB3;
  --color-accent-lighter-h: 35;
  --color-accent-lighter-s: 100%;
  --color-accent-lighter-l: 85%;
}

/* belt-and-braces on the two CTAs that matter most — the nav pill sits on the
   first fold and a green one there is the worst brand failure available. */
.main-header .bto-nav-cta,
.main-header__inner .bto-nav-cta,
.bto-banner-ctas .btn.btn--primary {
  background-color: var(--pin-primary) !important;
  border-color: var(--pin-primary) !important;
  color: var(--pin-on-primary) !important;
}
.main-header .bto-nav-cta .ms-btn__text,
.bto-banner-ctas .btn.btn--primary .ms-btn__text {
  color: var(--pin-on-primary) !important;
}
.main-header .bto-nav-cta:hover,
.bto-banner-ctas .btn.btn--primary:hover {
  background-color: var(--pin-primary-press) !important;
  border-color: var(--pin-primary-press) !important;
}


/* ==========================================================================
   B · ACCENT SCARCITY — red stops being decorative

   Found: red (inherited from the gold it replaced) was carrying every eyebrow,
   every "ENGINE LANE" label, the highlight word in three headlines, and the
   category tag on all 20 cards in THE WORK. That is ~30 red marks per scroll.

   DESIGN.md, Do: "Reserve primary for primary CTAs, the active-tab indicator,
   and the brand wordmark only. It is never decorative." and "Build hierarchy
   from font weight (400 → 600 → 700) and size, not from color tinting."

   After this block the accent appears in exactly four roles:
     · the nav CTA (DESIGN.md: the sticky CTA anchors every viewport)
     · the ONE primary CTA in panel 2
     · the FAQ open/hover marker (an active-state indicator — permitted)
     · the ticker's owl-eye glyph (brand mark — permitted)

   Everything else moves onto the warm-neutral ramp. The two-tone headline
   gesture is kept, just monochrome — which is what the ticker
   ("VISION IN" ink / "MOTION" grey) already does, so the page gains an idiom
   instead of losing one.

   Scoped to homepage-only selectors on purpose: `.svc-*`, `.wk-*`, `.svf-*`
   and the bare `em.s` are shared with services.html / work.html, which are
   owned by another agent and are out of scope for this pass.
   ========================================================================== */

/* panel 2 — the highlight word, and the card eyebrows on the drifting rail */
.bto-banner-title em.s,
.bto-banner-title em,
.bto-banner-title span { color: var(--pin-mute); }
.bto-pw-card .bto-pw-eyebrow { color: var(--pin-mute); }

/* THE WORK — 20 cards' worth of category tags */
#work .bto-work-cap .tag { color: var(--pin-mute); }
#work .bto-work-cap p { color: var(--pin-mute); }
#work .bto-work-rights { color: var(--pin-ash); }

/* ENGINE ROOM — on the dark panel the neutral ramp inverts to stone/white */
.er-sec .er-center .kick { color: var(--pin-stone); }
.er-sec .er-head em.s { color: var(--pin-stone); }
.er-sec .er3-tag {
  color: var(--pin-on-dark);
  background: rgba(0, 0, 0, .62);
  border-color: color-mix(in srgb, var(--fg-on-dark) 22%, transparent);
}
/* the tile hover still carried the pre-palette gold on its border + a warm
   gold-black shadow; both go monochrome. */
.er-sec .er3-tile:hover {
  border-color: color-mix(in srgb, var(--fg-on-dark) 45%, transparent);
  box-shadow: 0 12px 32px rgba(0, 0, 0, .35);
}
.er-sec .er3-tile { border-color: color-mix(in srgb, var(--fg-on-dark) 14%, transparent); }
/* the section's ambient glow was a red radial — decorative saturated colour on
   a dark panel. Neutralised to a light bloom. */
.er-sec::before {
  background: radial-gradient(50% 50% at 50% 50%, color-mix(in srgb, var(--fg-on-dark) 7%, transparent) 0%, transparent 70%);
}

/* FAQ — the headline highlight goes tonal; the open/hover marker STAYS on the
   accent because it is an active-state indicator, which DESIGN.md allows. */
.fq-sec .fq-head em.s { color: var(--pin-mute); }

/* the eyebrow, unified — one spec everywhere it appears on the homepage */
.bto-banner .bto-eyebrow,
#work .ms-ah-wrapper .heading-title,
.bto-footer-cols .bto-eyebrow { color: var(--pin-mute); }


/* ==========================================================================
   C · HEADER LOCKUP OVER THE HERO — contrast

   Found (_shots/mokko-home-top.png): "By The Owl" is white over a blown-out
   frame of the showreel and all but disappears; "VISION IN MOTION" under it
   is at 0.6 opacity and is simply gone. It reads fine on the scrolled light
   pill — this is purely the `.logo-light` state over video.

   Fix is a legibility scrim + text shadow, NOT a header redesign: the geometry,
   the two-mark swap and the capsule are untouched. Colour values here; the
   scrim's geometry is in mokko-bridge.css.

   Noted deviation: DESIGN.md has no shadow outside the modal ambient. Text on
   uncontrolled moving video is the one case the Pinterest system never has to
   solve (it never sets type over video), and WCAG contrast wins over a shadow
   rule. Logged rather than silently taken.
   ========================================================================== */
.main-header__inner .logo-light .bto-logo {
  color: var(--pin-on-dark);
  text-shadow: 0 1px 2px rgba(0, 0, 0, .55), 0 2px 14px rgba(0, 0, 0, .45);
}
.main-header__inner .logo-light .bto-logo::before {
  background: radial-gradient(60% 130% at 22% 50%,
    rgba(0, 0, 0, .60) 0%, rgba(0, 0, 0, .34) 45%, rgba(0, 0, 0, 0) 100%);
}
/* 0.6 on 9px letterspaced caps over video is invisible; the tagline carries
   the brand line and has to survive. */
.main-header__inner .logo-light .bto-logo .bto-logo__tag { opacity: .95; }
.main-header__inner .logo-dark .bto-logo .bto-logo__tag {
  opacity: 1;
  color: var(--pin-mute);
}


/* ==========================================================================
   D · BACK-TO-TOP — legible over imagery

   Found (_shots/mokko-work-section.png): the pill is `position: fixed` bottom-
   right with NO background until hover, so "Back to top" + the arrow render as
   near-black text directly on a reel thumbnail. Illegible, and it reads like a
   rendering bug.

   DESIGN.md ships the exact component for this: `button-pill-on-image` —
   canvas fill, ink label, pill radius. Applied permanently instead of on hover.
   ========================================================================== */
/* the pill is the <a>; the inner circle rides inside it, so the inner must go
   transparent or it reads as a white disc on a white pill. */
.back-to-top {
  background-color: var(--pin-canvas);
  border: 1px solid var(--pin-hairline);
}
.back-to-top .ms-btt--text { color: var(--pin-ink); }
.back-to-top .ms-btt--inner { background-color: transparent; }
.back-to-top .ms-btt-i { fill: var(--pin-ink); }
/* Mokko's hover fills the inner disc with --color-primary; that is the accent,
   and an accent disc here would be one accent mark too many. Inverts to ink. */
.back-to-top .ms-btt--inner::after { background-color: var(--pin-ink); }
.back-to-top:hover .ms-btt-i { fill: var(--pin-canvas); }

/* below 1023 the label is display:none and mokko-bridge fills the disc with the
   accent. Same reasoning — keep it monochrome. */
@media (max-width: 1023px) {
  .back-to-top .ms-btt--inner { background-color: transparent; }
  .back-to-top .ms-btt-i { fill: var(--pin-ink); }
}

/* --- the last Mokko green: its back-to-top control ------------------------
   Flagged by the services build. DESIGN.md allows exactly one saturated
   colour, so this goes onto the accent with everything else. */
.ms-btt, .ms-btt--inner, .back-to-top,
.ms-btt svg, .back-to-top svg { color: var(--pin-primary); }
.ms-btt--inner { border-color: var(--pin-primary); }
.ms-btt--inner:hover { background: var(--pin-primary); color: var(--pin-on-primary); }


/* ============================================================================
   ============================================================================
   E · THEME PASS — 2026-07-27
   Making dark mode actually correct. COLOUR AND CONTRAST ONLY; no layout,
   no spacing, no type. Everything here resolves to a §0 token.

   The three files this section has to out-cascade are hero.css, sections.css
   and marquee-banner.css (plus mokko-bridge.css, owned by the design agent).
   They were authored light-mode-only and hardcode their greys. palette.css
   loads LAST on every page, so restating the rule here is enough — nothing in
   those files needs to change, and pulling this <link> restores them exactly.
   ============================================================================
   ========================================================================== */


/* --------------------------------------------------------------------------
   E1 · LINKS — the single biggest dark-mode contrast failure on the site.

   Mokko ships `a, .link { color: var(--color-primary) }` (style.css) — so
   EVERY plain anchor takes the primary colour: the services index rows, the
   footer brand lockup, .svc-btn, the work filters.

   MP071 makes this MORE acute, not less. Sea Buckthorn #FFBF65 as TEXT is
   1.41:1 on the light canvas and 1.09:1 on panel 2 — it is an amber, it only
   works as a fill or on a dark surface. And it cannot be fixed by changing
   --color-primary, because that token is also the BUTTON FILL, where #FFBF65
   under --accent-ink is 10.98:1 and is what makes the CTAs legible.

   So links move to --fg-accent, which is #854D00 in light (the same hue 35°
   dropped to L26%, 5.93:1 on canvas / 4.61:1 on panel 2) and the base #FFBF65
   itself in dark (10.98:1). Fills keep --fill-accent. One accent, two
   renderings — DESIGN.md's single-saturated-colour rule is intact. This is the
   same structure the old palette used for red; only the values moved.
   -------------------------------------------------------------------------- */
a, .link { color: var(--fg-accent); }
/* buttons are anchors too — re-assert their label so the rule above can never
   bleed into a pill. */
a.btn, a.btn .ms-btn__text,
.bto-nav-cta, .bto-nav-cta .ms-btn__text { color: var(--fg-on-accent); }
.bto-btn-ghost, .bto-btn-ghost .ms-btn__text { color: var(--fg-ink) !important; }
.bto-pw-card, .bto-pw-card:hover { color: inherit; }


/* --------------------------------------------------------------------------
   E2 · PANEL 2 — it was the only surface that did not flip.

   `.bto-banner` is now on --bg-panel2 (see above), but three text colours on
   it are literals in files this pass does not own:
     mokko-bridge.css:172  .bto-banner-title  #353639
     mokko-bridge.css:180  .bto-banner-lead   #5b5c5f
     mokko-bridge.css:100  .bto-eyebrow       #747474
   Restated as tokens. The LIGHT values are byte-identical to those literals,
   so light mode is unchanged.
   -------------------------------------------------------------------------- */
.bto-banner-title { color: var(--fg-heading); }
.bto-banner-lead  { color: var(--fg-lead); }
.bto-eyebrow,
.ms-ah-wrapper .heading-title,
.heading-title    { color: var(--fg-eyebrow); }


/* --------------------------------------------------------------------------
   E3 · THE TICKER — the reported bug, and it was the reverse of the diagnosis.

   `bto-css/text-ticker.css` resolved var(--color-contrast-higher) to the
   literal hsl(0,0%,0%). That file is NOT linked by any page (checked all
   three), so it was never the live rule — the ticker was inheriting Mokko's
   own `.ms-tt__text { color: var(--color-contrast-higher) }`, which flips
   correctly to near-white in dark.

   The actual failure was that the ticker's BACKGROUND did not flip: it sits
   inside panel 2 (panel-fixes.css makes it `background: transparent`), and
   panel 2 was pinned to a light grey. Near-white text on #f6f6f3 = 1.05:1.
   Fixing --bg-panel2 fixes the ticker. Pinning it to a token as well so it
   can never drift back.

   The "MOTION" span is Mokko's own literal #949494 (style.css:13391), which
   is 2.83:1 on panel 2 — it fails the 3:1 large-text floor in LIGHT mode too.
   Moved onto --fg-mute, which keeps the two-tone gesture and passes both.
   -------------------------------------------------------------------------- */
.bto-ticker .ms-tt__text            { color: var(--fg-ink); }
.bto-ticker .ms-tt__text span       { color: var(--fg-mute); }
.bto-ticker .ms-tt__text,
.bto-ticker .ms-tt__text span       { -webkit-text-stroke-color: var(--fg-ink); }


/* --------------------------------------------------------------------------
   E4 · THE FAQ — the worst measured failure before this pass.

   `.fq-a p` was #33332e on the dark canvas: 1.06:1. Invisible. It reads
   var(--pin-body), which the old palette pinned to a light-mode ink. Now the
   whole ink ramp flips, so this is a token restatement for clarity plus the
   two marks sections.css hardcodes.
   -------------------------------------------------------------------------- */
.fq-sec           { background: var(--bg-canvas-soft); }
.fq-head          { color: var(--fg-ink); }
.fq-head em.s     { color: var(--fg-mute); }
.fq-q             { color: var(--fg-ink); }
.fq-a p           { color: var(--fg-body); }
.fq-n             { color: var(--fg-mute); }
.fq-pl            { color: var(--fg-mute); }
.fq-q:hover .fq-pl,
.fq-item.open .fq-pl { color: var(--fg-accent); }
.fq-list          { border-top-color: var(--bg-hairline); }
.fq-item          { border-bottom-color: var(--bg-hairline); }


/* --------------------------------------------------------------------------
   E5 · THE ENGINE ROOM — an always-dark panel, so it must NOT flip; but it
   has to stay DARKER than the page in dark mode or it stops reading as a
   panel at all (#262622 on a #1c1c1c page was a 1.3:1 step — invisible).
   --bg-panel-dark is now the darkest value in the dark block.

   sections.css also left a full gold + mint terminal behind inside it
   (lines 22, 26, 45-65) that §B of the design pass missed. That is a second
   and a third saturated colour, which DESIGN.md forbids outright. Folded onto
   the on-dark neutral ramp — colour only, the terminal's geometry, grid lines
   and pulse animation are untouched.
   -------------------------------------------------------------------------- */
.er-sec .er-head       { color: var(--fg-on-dark); }
.er-sec .er3-tile:hover { border-color: color-mix(in srgb, var(--fg-on-dark) 45%, transparent); }
.er-sec .er3-term {
  background-color: rgba(0, 0, 0, .55);
  background-image:
    linear-gradient(color-mix(in srgb, var(--fg-on-dark) 4%, transparent) 1px, transparent 1px),
    linear-gradient(90deg, color-mix(in srgb, var(--fg-on-dark) 4%, transparent) 1px, transparent 1px);
  box-shadow: 0 0 40px rgba(0, 0, 0, .45);
  border-color: color-mix(in srgb, var(--fg-on-dark) 18%, transparent);
}
.er-sec .er3-tbar {
  color: var(--fg-on-dark-mute);
  border-bottom-color: color-mix(in srgb, var(--fg-on-dark) 16%, transparent);
  background: color-mix(in srgb, var(--fg-on-dark) 4%, transparent);
}
.er-sec .er3-dots i        { background: color-mix(in srgb, var(--fg-on-dark) 32%, transparent); }
.er-sec .er3-lanes a       { color: var(--fg-on-dark-mute); }
.er-sec .er3-lanes a::before { color: color-mix(in srgb, var(--fg-on-dark) 45%, transparent); }
.er-sec .er3-st            { color: color-mix(in srgb, var(--fg-on-dark) 72%, transparent); }
/* the status dot is the one permitted accent down here — it is a live-state
   indicator. Its glow was mint (`rgba(51,214,132,.8)`, sections.css:59).
   HARDCODED-TOKEN FIX (MP071): the glow was then frozen as `rgba(230,0,35,.8)`
   — the dot read from a token, its own halo did not, so a palette swap would
   have left a red bloom around an amber dot. Derived now. */
.er-sec .er3-st::before {
  background: var(--fill-accent);
  box-shadow: 0 0 8px color-mix(in srgb, var(--fill-accent) 80%, transparent);
}

/* `.er3-human` was the one mark on surface C the theme pass never reached:
   sections.css:66 paints it `rgba(244,241,234,.4)`, a resolved on-dark literal
   that is 3.02:1 on the dark theme's navy C. On the on-dark ramp it is 5.69. */
.er-sec .er3-human { color: var(--fg-on-dark-mute); }


/* --------------------------------------------------------------------------
   E6 · THE HERO STAGE — dark in both themes by design (the brief froze it).
   Exposed as --bg-stage so it is still reachable from §0; hero.css:262 sets
   it `!important`, so this has to match that weight to win.

   hero.css:255 also re-asserts the pre-palette gold on `.hb-head .kick` with
   `!important`, and hero.css:103 puts the same gold on the timecode. Same
   DESIGN.md problem as E5 — folded onto the on-dark ramp.

   MP071: --bg-stage now resolves to --bg-panel-dark (§0.1), so the stage and
   the Engine Room are one surface in both themes. Three more literals in
   hero.css were found by the MP071 sweep and are folded in below.
   -------------------------------------------------------------------------- */
.hb-stage { background: var(--bg-stage) !important; }
.hb-scroller { background: var(--bg-canvas-soft); color: var(--fg-ink); }
.hb-head .kick { color: var(--fg-on-dark-mute) !important; }
.hb-tc         { color: var(--fg-on-dark-mute); }
.hb-scroller .dark .kick { color: var(--fg-on-dark-mute); }
.hb-scroller h1 em.s,
.hb-scroller h2 em.s,
.hb-scroller h3 em.s { color: var(--fg-mute); }

/* 1 · hero.css:262 sets `.hb-stage { color: rgba(244,241,234,.92) !important }`
      — the old cream, and it INHERITS into every element in the hero, which is
      why the sweep found it on ~40 nodes. It is the stage's on-dark ink, so it
      goes on the on-dark ramp at the same weight. The three local --on-dark*
      overrides hero.css declares alongside it are re-pointed too, so the
      chrome consumers (.hb-top, .hb-nodes-title, the hairlines) follow. */
.hb-stage {
  color: var(--fg-on-dark) !important;
  --on-dark: var(--fg-on-dark);
  --on-dark-mute: var(--fg-on-dark-mute);
  --on-dark-hair: color-mix(in srgb, var(--fg-on-dark) 8%, transparent);
}

/* 2 · hero.css:142 — the side column's ambient wash is still the PRE-PALETTE
      MINT `rgba(127,227,179,.10)` (#7fe3b3, the svf stage green). A second
      saturated colour on a dark panel, and the last survivor of the green this
      file was written to remove. Neutralised to the same on-dark bloom §B gave
      the Engine Room. Geometry, size and position untouched. */
.hb-side {
  border-left-color: color-mix(in srgb, var(--fg-on-dark) 8%, transparent);
  background-image:
    radial-gradient(56% 42% at 60% 46%,
      color-mix(in srgb, var(--fg-on-dark) 8%, transparent), transparent 72%),
    radial-gradient(color-mix(in srgb, var(--fg-on-dark) 5%, transparent) 1px, transparent 1.5px);
}

/* 3 · hero.css:113 — the top bar's hairline, same resolved cream. */
.hb-top { border-bottom-color: color-mix(in srgb, var(--fg-on-dark) 8%, transparent); }


/* --------------------------------------------------------------------------
   E7 · THE WORK RAIL + the remaining page furniture.
   -------------------------------------------------------------------------- */
#work .bto-work-cap .tag,
#work .bto-work-cap p { color: var(--fg-mute); }
#work .bto-work-rights { color: var(--fg-faint); }
.wk-page, .masonry    { background: var(--bg-canvas); }
.wk-lb-cap            { color: var(--fg-body); }
.wk-filter button     { border-color: var(--bg-hairline); color: var(--fg-ink); }
.wk-filter button.is-checked {
  background: var(--fg-ink); border-color: var(--fg-ink); color: var(--bg-canvas);
}
.svc-section + .svc-section { border-top-color: var(--bg-hairline); }
.svc-footer-note      { color: var(--fg-faint); }


/* --------------------------------------------------------------------------
   E8 · BACK-TO-TOP — it was a hardcoded WHITE pill floating on the dark page.
   Now a canvas pill in both themes, so it inverts with the site.
   -------------------------------------------------------------------------- */
.back-to-top {
  background-color: var(--bg-canvas);
  border: 1px solid var(--bg-hairline);
}
.back-to-top .ms-btt--text { color: var(--fg-ink); }
.back-to-top .ms-btt-i     { fill: var(--fg-ink); }
.back-to-top .ms-btt--inner::after { background-color: var(--fg-ink); }
.back-to-top:hover .ms-btt-i { fill: var(--bg-canvas); }
.ms-btt, .ms-btt--inner, .back-to-top,
.ms-btt svg, .back-to-top svg { color: var(--fg-accent); }
.ms-btt--inner { border-color: var(--fg-accent); }
.ms-btt--inner:hover { background: var(--fill-accent); color: var(--fg-on-accent); }


/* --------------------------------------------------------------------------
   E9 · HEADER / FOOTER / MENU chrome that Mokko leaves on light literals.
   -------------------------------------------------------------------------- */
.main-header__inner .logo-dark .bto-logo .bto-logo__tag { color: var(--fg-mute); }
.bto-footer-cols .bto-eyebrow { color: var(--fg-mute); }
.bto-footer-cols a { color: var(--fg-body); }
.bto-brand-tag     { color: var(--fg-mute); }
/* the header logo scrim over video: black at low alpha in both themes, because
   it is a legibility scrim on uncontrolled footage, not a themed surface. */
a:focus-visible, button:focus-visible, input:focus-visible {
  outline-color: var(--fg-focus);
}


/* ============================================================================
   F · NOT REACHABLE FROM A TOKEN — for the agent who owns mokko-bridge.css /
   panel-fixes.css (and for whoever next touches hero.css / sections.css /
   marquee-banner.css).

   Everything in this list is currently OUT-CASCADED by a rule above, so the
   page renders correctly today. They are listed because each one is a literal
   that MP071 (or the next swap) strands: if palette.css's matching rule is ever
   deleted, or a selector's specificity changes, the old colour comes straight
   back. Fixing them at source is the other agent's call, not mine.

   OWNED BY THE DESIGN AGENT — mokko-bridge.css
     :1064  --bto-panel-ink       #353639   light-only. Consumed at :1067 by
     :1065  --bto-panel-ink-mute  #5b5c5f   .bto-banner-title / .bto-banner-lead.
            → point them at var(--fg-heading) / var(--fg-lead) and this file's
              § E2 restatement becomes redundant instead of load-bearing.
     :1330  --bto-surface-a fallback  #ffffff   ) the three A/B/C fallbacks are
     :1331  --bto-surface-b fallback  #f6f6f3   ) the OLD greys. Refresh to
     :1332  --bto-surface-c fallback  #262622   ) #F0EEEB / #CCD5DA / #13181B.
     :1336  --bto-on-c fallback #ffffff · :1337 --bto-on-c-mute #c8c8c1 → #F0EEEB / #B7B6B5.
     :153   .bto-banner { background: #E7E7E4 }        beaten by § "PANEL-2 SURFACE".
     :172   .bto-banner-title { color: #353639 }       beaten by § E2.
     :180   .bto-banner-lead  { color: #5b5c5f }       beaten by § E2.
     :102   .bto-eyebrow      { color: #747474 }       beaten by § E2.
     :341   .er-sec { color: rgba(244,241,234,.92) }   beaten by their own P5.1.
     :176/:322/:344/:354/:373/:377  var(--pin-primary, #f1b84b) fallbacks — the
            pre-palette gold. Harmless while palette.css is linked.
     :1343-1361  the N.2 comment block now describes a resolved problem: the
            hero's half of the two-darks fix HAS been taken (--bg-stage is
            var(--bg-panel-dark) as of this pass). Worth a one-line update.

   NOT OWNED BY EITHER OF US — hero.css / sections.css / marquee-banner.css
     hero.css:120-122  .hb-dots i  #f26d5f / #f2bf5f / #59c76f — three saturated
            colours (a macOS traffic-light metaphor) inside the hero's editor
            chrome. Not old grey, not the old red, and deliberate skeuomorphism,
            so LEFT ALONE — but it is three more saturated colours than
            DESIGN.md allows. Ash's call.
     hero.css:100  .hb-viewer { background: #000 } — the video well. Correct.
     sections.css:153  .bto-work-rights { opacity: .45 } — an OPACITY, not a
            colour, and it caps that line at ~1.8:1 no matter what colour is
            put on it. Cannot be fixed from a colour token. (mokko-bridge
            already uses exactly this fix — `opacity: 1` — for .bto-work-cap p
            at :833; the same one-liner would close this.)
     marquee-banner.css:89  the .bto-banner-copy::before fade still hardcodes
            #E7E7E4. Inert: mokko-bridge § L1 sets `content: none`.
   ========================================================================== */


/* ============================================================================
   G · MP071 VERIFICATION FIXES — found by qa-mp071.mjs, 2026-07-27.
   Everything here is a real defect the headless sweep caught after the tokens
   landed. Colour only. Each one names what was measured.
   ============================================================================
   ========================================================================== */


/* --------------------------------------------------------------------------
   G1 · THE SURFACE TOKENS WERE RESOLVING LIGHT IN DARK MODE.  ← the big one.

   mokko-bridge.css § N declares the three named surfaces on `:root`:

       :root { --bto-surface-a: var(--bg-canvas, #ffffff); … }

   `:root` is <html>. `data-theme` is on <body>. So --bg-canvas is substituted
   AT <html>, where only the light block applies — and the already-resolved
   LIGHT hex then inherits down into the dark-themed body. Measured: in dark
   mode the FAQ painted #F0EEEB with #F0EEEB text on it (1.00:1 — literally
   invisible), and the Engine Room painted #13181B instead of the navy.

   This is the same class of bug as the ticker's resolved token, one level up:
   a value frozen at the wrong element instead of at the wrong time.

   Restating the three surfaces inside BOTH theme blocks fixes it — the dark
   block sits on <body>, so it re-resolves there. mokko-bridge is not touched;
   palette.css loads last and `[data-theme=dark]` is a deeper element than
   `:root`, so both themes land correctly.
   -------------------------------------------------------------------------- */
:root,
[data-theme=light],
[data-theme=dark] {
  --bto-surface-a:  var(--bg-canvas);
  --bto-surface-b:  var(--bg-panel2);
  --bto-surface-c:  var(--bg-panel-dark);
  /* UPDATED 2026-07-28 (§ H): surface C is no longer dark in both themes — it is
     panel 2's surface now, which is LIGHT in light mode. `--bto-on-c` is what
     mokko-bridge § P5.1 paints the Engine Room's ink with, so it has to flip
     with the theme or the panel is white-on-pale-blue. On the on-panel ramp. */
  --bto-on-c:       var(--fg-on-panel);
  --bto-on-c-mute:  var(--fg-on-panel-mute);
  --bto-hairline-c: color-mix(in srgb, var(--fg-on-panel) 22%, transparent);
  /* same trap, same file (mokko-bridge:1064-1065): panel 2's copy colours were
     light-only literals declared on :root. */
  --bto-panel-ink:      var(--fg-heading);
  --bto-panel-ink-mute: var(--fg-lead);
}


/* --------------------------------------------------------------------------
   G2 · THE TICKER — the reported bug was still half-live, for two reasons.

   1. IT IS NOT INSIDE PANEL 2 ANY MORE. `_notes/15_design-pass.md` § 3.2 says
      "the ticker must stay on B — it sits inside `#everything`". It does not:
      index.html closes `</section>` at the end of `.bto-banner` and opens
      `<div class="project-area last bto-ticker">` as a SIBLING. So
      panel-fixes.css:24 `#everything .bto-ticker { background: transparent }`
      never matches, and the ticker was taking surface A. That is exactly the
      "panel 2 appears to end early → phantom fourth surface" the note warns
      about. Painting it B directly puts it back on the panel it closes.
   2. THE SPAN WAS STILL MOKKO'S #949494. Measured 2.62:1 in light — it fails
      the 3:1 large-text floor, which is the failure § E3 said it had fixed.
      It had not: Mokko's `.project-area .ms-text-ticker .ms-tt__text span`
      (style.css:13391) is a 3-class selector and § E3's `.bto-ticker
      .ms-tt__text span` is 2 — Mokko wins on specificity regardless of order.
      Matched at 3 classes here, so the token actually applies.
   -------------------------------------------------------------------------- */
.bto-ticker { background: var(--bg-panel2); }
.bto-ticker .ms-text-ticker .ms-tt__text      { color: var(--fg-ink); }
.bto-ticker .ms-text-ticker .ms-tt__text span { color: var(--fg-mute); }
.bto-ticker .ms-text-ticker .ms-tt__text,
.bto-ticker .ms-text-ticker .ms-tt__text span { -webkit-text-stroke-color: var(--fg-ink); }


/* --------------------------------------------------------------------------
   G3 · TWO LEADS ON MOKKO'S OWN MID-CONTRAST TOKEN.
   mokko-bridge.css:252 and :394 set `color: var(--color-contrast-medium)`.
   That is Mokko's #757575, which is 3.98:1 on the MP071 canvas and 3.76:1 in
   the footer — both under the 4.5:1 body floor. On our own lead step they are
   7.59:1 and 7.16:1, and the ramp flips with the theme.
   -------------------------------------------------------------------------- */
.bto-work-lead,
.bto-footer-lead { color: var(--fg-lead); }


/* --------------------------------------------------------------------------
   G4 · THE HEADER BRAND TAGLINE — as far as colour can take it.
   `.bto-brand-tag` is 9px/600 and sections.css:199 puts `opacity: .55` on it.
   Measured 2.39:1 light / 3.07:1 dark on --fg-mute. Moving it to full ink
   takes it to 4.49:1 light / 5.42:1 dark, which is the CEILING for this mark:
   at 55% opacity even pure black on the canvas can only reach 4.49:1, so the
   last 0.01 is an opacity problem, not a colour one. Logged in § F for the
   owner of sections.css — the one-line fix there is `opacity: 1`.
   -------------------------------------------------------------------------- */
.bto-brand-tag { color: var(--fg-ink); }


/* --------------------------------------------------------------------------
   G5 · THE HERO'S SCROLL CUE — hero.css:156 `rgba(244, 241, 234, .5)`, the
   last resolved on-dark cream the sweep found. It rides over the reel, so it
   takes the on-dark ramp like every other mark on surface C.
   -------------------------------------------------------------------------- */
.hb-cue { color: var(--fg-on-dark-mute); }


/* --------------------------------------------------------------------------
   G6 · THE FOOTER'S BIG CONTACT LINK — a Mokko literal that does not flip.
   style.css:21053 `.ms-footer .container .footer-title .ms-sl { color: #747474 }`
   beats Mokko's own `a.ms-sl { color: var(--color-contrast-higher) }` on
   specificity, so the site's single most important link renders the same
   mid-grey in BOTH themes: 3.81:1 light, 3.48:1 dark. It clears the 3:1
   large-text floor at 28px and nothing else, and it never inverts.
   On the ink token it is 15.44:1 in both. Kept monochrome rather than moved
   to the accent — § B's accent-scarcity rule, and DESIGN.md's "build hierarchy
   from font weight and size, not from color tinting".
   -------------------------------------------------------------------------- */
.ms-footer .container .footer-title .ms-sl { color: var(--fg-ink); }
.ms-footer .container .footer-title .ms-sl:hover { color: var(--fg-accent); }


/* --------------------------------------------------------------------------
   G7 · THE FOOTER WAS A PHANTOM FOURTH SURFACE.
   Mokko's `.footer-inner` carries `background-color: rgba(149,149,149,.07)` —
   a 7% grey veil that lands the footer on #EAE8E5 against a #F0EEEB canvas.
   Measured: a ~1.5% step. That is the textbook version of the mud this whole
   pass is about, and `_notes/15_design-pass.md` § 3.2 is explicit — "FAQ (A) →
   footer (A): no change. Separate them with a hairline, not a fourth value."
   The footer joins surface A.
   -------------------------------------------------------------------------- */
.ms-footer .footer-inner { background-color: transparent; }


/* --------------------------------------------------------------------------
   G8 · SERVICES — five more light-only literals.
   `bto-css/services-mokko.css` (linked by services.html only) hardcodes
   `#747474` on the section sub-lead, the index row copy, the row's "go" label
   and the footer note, plus `#7474747a` on the row number. None of them flip:
   measured 4.04:1 in light AND 3.83:1 in dark on the same hex — under the body
   floor in both. Same fix as G3: onto the ramp, which flips.
   -------------------------------------------------------------------------- */
.svc-sub,
.svc-index__name,
.svc-index__go   { color: var(--fg-lead); }
.svc-index__n    { color: var(--fg-mute); }
.svc-footer-note { color: var(--fg-faint); }


/* --------------------------------------------------------------------------
   G9 · ACCENT MARKS THAT LIVE ON A DARK BOX — the second rendering, applied.

   § "accents" moved every accent TEXT role from --pin-primary (the fill) to
   --fg-accent (the text rendering). Correct for the marks on the canvas — and
   WRONG for the ones sitting on a dark panel, because --fg-accent's LIGHT
   value is the deepened #854D00, which is ~1.9:1 on near-black. Those marks
   need the base amber, which is what --fg-accent already is in dark mode.

   So the rule is: --fg-accent on a light surface, --accent-base on a dark one.
   Exposed as --fg-accent-on-dark so it reads as a role, not a hex.

   Scope is deliberately the services dial / story-film stage and the generic
   `.dark` box from live-effects.css. The Engine Room and the hero are NOT in
   this list: § B stripped their accent marks back to the on-dark neutral ramp
   on purpose (accent scarcity), and this block loads later, so naming them
   here would silently undo that.

   `live-effects.css:114` also still paints Mokko-era mint #7fe3b3 on
   `.dark .step .n` — the last green on the site, missed because it keys on the
   generic `.dark` box rather than an `.svf-*` / `.svc-*` class.
   -------------------------------------------------------------------------- */
.dark em.s,          .svf-stage em.s,
.dark .kick,         .svf-stage .kick,
.dark .step .n,      .svf-steps .step .n,
.dark .chipset span b, .svf-stage .chipset span b,
.dialout .tier       { color: var(--fg-accent-on-dark); }
.dark .step,
.svf-steps .step     { border-top-color: color-mix(in srgb, var(--accent-base) 50%, transparent); }


/* --------------------------------------------------------------------------
   G10 · THE FOOTER ARROW — a colour baked into the MARKUP.
   index.html/services.html/work.html carry `<path … stroke="#747474">` inline
   on the footer link's arrow, so it stays mid-grey in both themes while the
   label next to it inverts. A presentation attribute loses to any CSS rule,
   so this reaches it without touching the HTML — and `currentColor` ties the
   arrow to its own label permanently.
   -------------------------------------------------------------------------- */
.ms-footer .footer-title .ms-sl svg path { stroke: currentColor; }


/* --------------------------------------------------------------------------
   G11 · THE SERVICES STORY-FILM STAGE — the last pre-MP071 hexes on the site.

   `live-effects.css` was authored against the old token set and still carries
   the OLD CREAM #f4f1ea at six alphas (lines 129, 134, 173, 195, 201, 203, 207)
   plus one more light-only `#747474` on `.svc-index__sub`. The creams are not
   contrast failures — the stage is dark in both themes, so light-on-dark is
   right — but they are the old palette, they cannot follow a swap, and they
   are 4 points off Magical Moonlight, which is exactly the kind of near-miss
   that reads as mud when it sits next to the real thing. All on the on-dark
   ramp now, at their original alphas, so nothing changes visually.
   -------------------------------------------------------------------------- */
.svc-index__sub    { color: var(--fg-lead); }
.svf-stage .lead,
.dark .lead        { color: color-mix(in srgb, var(--fg-on-dark) 78%, transparent); }
.svf-steps .step p { color: color-mix(in srgb, var(--fg-on-dark) 80%, transparent); }
.svf-stage .chipset span,
.chipset span      { color: color-mix(in srgb, var(--fg-on-dark) 75%, transparent);
                     border-color: color-mix(in srgb, var(--fg-on-dark) 22%, transparent); }
.svf-cue           { color: color-mix(in srgb, var(--fg-on-dark) 45%, transparent); }
.p1s span          { background: color-mix(in srgb, var(--fg-on-dark) 4%, transparent);
                     border-color: color-mix(in srgb, var(--fg-on-dark) 14%, transparent); }
.dialbox,
.svc-dial .dialbox { background: color-mix(in srgb, var(--fg-on-dark) 4%, transparent);
                     border-color: color-mix(in srgb, var(--fg-on-dark) 18%, transparent); }
.dialrange, input[type=range].dialrange, #dialRange {
  background: linear-gradient(90deg,
    var(--fill-accent) var(--p, 50%),
    color-mix(in srgb, var(--fg-on-dark) 18%, transparent) var(--p, 50%));
}


/* --------------------------------------------------------------------------
   G12 · THE TICKER'S OWL-EYE RING — the last #e60023 on the site, and it was
   not in any stylesheet.

   `site/img/ticker-circle.svg` shipped `stroke="#e60023"` baked into the ASSET.
   It is loaded as `<img src>`, so CSS cannot reach inside it and the computed-
   style sweep cannot see it either — it only showed up in the screenshots.
   The one attribute is now Neverything #13181B, and this rule inverts it for
   the dark theme: invert(1) of #13181B is #ECE7E4, i.e. Magical Moonlight to
   within 4 points. The mark is transparent-background and single-stroke, so
   invert touches only the drawn pixels.

   NOTE — this changes a call § B made. § B listed the owl-eye as one of the
   four places the accent was allowed to survive. That held while the accent
   was a red: red on the old panel grey was ~3.4:1. Sea Buckthorn on Polar
   Drift is 1.09:1 — the ring would simply vanish on the light panel. So the
   glyph goes monochrome and joins the ticker's own two-tone idiom (ink lead
   word / grey second word) instead. Accent count on the page drops to three.
   Ratio: 12.01:1 on panel 2 light, 12.9:1 on panel 2 dark.
   -------------------------------------------------------------------------- */
[data-theme=dark] .bto-ticker .ms-tt__text.img img,
[data-theme=dark] .bto-ticker .ms-text-ticker .ms-tt__text.img img { filter: invert(1); }


/* ============================================================================
   ============================================================================
   H · THE SECOND PANEL — 2026-07-28

   Ash: *"also change the background color of the hero banner 'we dont maker
   post' right side box and the 'engine room backgreound. i likew the background
   color used in panel two"*

   Both targets were on --bg-stage / --bg-panel-dark, which § 0.1 had just
   aliased together. They are now aliased one step further, onto --bg-panel2.
   One line each, both themes — but the surface was NEAR-BLACK and panel 2's is
   a LIGHT grey-blue, so every mark on those two panels had to be re-derived.
   That is what this section is: a surface change and an ink pass.

   WHAT MOVED
     hero stage  .hb-stage   #13181B → #CCD5DA (light) · #003A6C → #0B263B (dark)
     Engine Room .er-sec     same pair
   WHAT DELIBERATELY DID NOT
     · the video well (.hb-viewer #000) and everything painted ON footage —
       the scroll cue, the header lockup, the .er3-tag pills on the tile photos.
       Their ground is still the image, so they keep --fg-on-dark.
     · the services dial / live-effects `.dark` boxes — now on --bg-inset-dark
       (§ H0). Ash asked for two surfaces, not three.
   ============================================================================
   ========================================================================== */


/* --------------------------------------------------------------------------
   H0 · WHY THERE IS NOW A SEPARATE --bg-inset-dark

   `--dark` / `--dark-2` / `--pin-surface-dark` / `--pin-charcoal` all pointed at
   --bg-panel-dark. Aliasing that to panel 2 would have silently repainted the
   services dial and every live-effects `.dark` box as well — surfaces Ash did
   not mention, which sit on their own dark photography, and whose ink
   (--fg-accent-on-dark, the on-dark ramp) is calibrated for a dark ground.
   They now read --bg-inset-dark, which holds exactly what --bg-panel-dark used
   to: #13181B light, #003A6C dark. The services page is byte-identical.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   H1 · THE ENGINE ROOM

   Six photo tiles, a head and an eyebrow — the terminal tile (.er3-term /
   .er3-tbar / .er3-lanes / .er3-st / .er3-human) is no longer in the markup, so
   the rules for it in § E5 are inert. They are left in place per this file's
   convention and re-pointed anyway, so re-adding the tile cannot resurrect a
   light-on-light bug.

   `#engine.er-sec` (mokko-bridge § P5.1) paints the panel's ink from
   `--bto-on-c`, and that ID beats anything class-based here — which is why the
   fix is at the token (§ G1) rather than a specificity fight. The rules below
   cover the marks that carry their own colour.
   -------------------------------------------------------------------------- */
.er-sec                     { color: var(--fg-on-panel); }
.er-sec .er-head            { color: var(--fg-on-panel); }
.er-sec .er-center .kick    { color: var(--fg-on-panel-mute); }
.er-sec .er-head em.s       { color: var(--fg-on-panel-mute); }

/* the tile borders were an on-dark white wash — invisible on a pale panel */
.er-sec .er3-tile           { border-color: color-mix(in srgb, var(--fg-on-panel) 22%, transparent); }
.er-sec .er3-tile:hover     { border-color: color-mix(in srgb, var(--fg-on-panel) 45%, transparent);
                              box-shadow: none; }

/* inert (mokko-bridge § P5.2 sets `content: none`) but re-derived so a white
   bloom can never appear on a light ground if that rule is ever removed */
.er-sec::before {
  background: radial-gradient(50% 50% at 50% 50%,
    color-mix(in srgb, var(--fg-on-panel) 6%, transparent) 0%, transparent 70%);
}

/* the terminal, if it ever returns: its fill derives from the panel ink, so the
   box and the text inside it invert together instead of the box staying black */
.er-sec .er3-term {
  background-color: color-mix(in srgb, var(--fg-on-panel) 6%, transparent);
  background-image:
    linear-gradient(color-mix(in srgb, var(--fg-on-panel) 5%, transparent) 1px, transparent 1px),
    linear-gradient(90deg, color-mix(in srgb, var(--fg-on-panel) 5%, transparent) 1px, transparent 1px);
  box-shadow: none;
  border-color: color-mix(in srgb, var(--fg-on-panel) 18%, transparent);
}
.er-sec .er3-tbar {
  color: var(--fg-on-panel-mute);
  border-bottom-color: color-mix(in srgb, var(--fg-on-panel) 16%, transparent);
  background: color-mix(in srgb, var(--fg-on-panel) 4%, transparent);
}
.er-sec .er3-dots i        { background: color-mix(in srgb, var(--fg-on-panel) 32%, transparent); }
.er-sec .er3-lanes a       { color: var(--fg-on-panel-mute); }
.er-sec .er3-lanes a::before { color: color-mix(in srgb, var(--fg-on-panel) 45%, transparent); }
.er-sec .er3-st            { color: var(--fg-on-panel-mute); }
.er-sec .er3-human         { color: var(--fg-on-panel-mute); }

/* NOT re-derived, on purpose: `.er3-tag`. The tile tags sit on the tile's
   PHOTOGRAPH behind their own `rgba(0,0,0,.62)` scrim — measured ground #07090A
   light / #001629 dark. Their ink stays --fg-on-dark: 17.2:1 either way. */


/* --------------------------------------------------------------------------
   H2 · THE HERO STAGE — and the one place the ink must NOT follow it

   hero.js wipes `.hb-side` open to 360–520px on desktop, where it is a real
   column BESIDE the reel and its ground is `.hb-stage`. That is Ash's "right
   side box", and its ink follows the new light surface.

   At ≤1024 hero.css:164 re-positions the same element `absolute; bottom: 0`
   OVER the viewer and gives it its own `linear-gradient(…, rgba(6,8,6,.85))`
   scrim — the headline is over VIDEO there, so it must stay light. The split
   below is that existing breakpoint, not a new one: same geometry, two grounds,
   two inks.

   REGRESSION FIXED HERE: § E6's `.hb-side { background-image: … }` was written
   unscoped. `.hb-side` is a single class in both files and palette.css loads
   last, so it was overriding hero.css's MOBILE SCRIM at every width — the ≤1024
   headline had been running on the `.hb-viewer::after` bottom gradient alone
   since that pass. The scrim is restored below.
   -------------------------------------------------------------------------- */
.hb-stage {
  color: var(--fg-on-panel) !important;
  --on-dark:      var(--fg-on-panel);
  --on-dark-mute: var(--fg-on-panel-mute);
  --on-dark-hair: color-mix(in srgb, var(--fg-on-panel) 14%, transparent);
}
.hb-top { border-bottom-color: color-mix(in srgb, var(--fg-on-panel) 12%, transparent); }
.hb-tc  { color: var(--fg-on-panel-mute); }

/* the window-chrome dot trio. hero.css:120-122 hardcodes #f26d5f / #f2bf5f /
   #59c76f — three saturated colours DESIGN.md does not allow, flagged in the
   MP071 note and left alone then because they sat on a near-black ground where
   they at least read. On #CCD5DA they measure 2.1 / 1.7 / 2.0:1 — mush. The
   ground change is the trigger to resolve it: one monochrome trio, descending,
   off the panel ink. It still reads as window chrome and it now works on both
   grounds. FLAGGED FOR ASH — the traffic-light metaphor is the cost. */
.hb-dots i:nth-child(1) { background: color-mix(in srgb, var(--fg-on-panel) 34%, transparent); }
.hb-dots i:nth-child(2) { background: color-mix(in srgb, var(--fg-on-panel) 24%, transparent); }
.hb-dots i:nth-child(3) { background: color-mix(in srgb, var(--fg-on-panel) 16%, transparent); }

/* ---- DESKTOP: the side box is a panel, so its copy takes the panel ink ---- */
@media (min-width: 1025px) {
  .hb-side {
    border-left-color: color-mix(in srgb, var(--fg-on-panel) 12%, transparent);
    background-image:
      radial-gradient(56% 42% at 60% 46%,
        color-mix(in srgb, var(--fg-on-panel) 6%, transparent), transparent 72%),
      radial-gradient(color-mix(in srgb, var(--fg-on-panel) 5%, transparent) 1px, transparent 1.5px);
  }
  /* hero.css:254-256 pins these white with !important, for a stage that used to
     be near-black. Matched at the same weight. The text-shadow goes with them:
     a black glow under dark ink on a pale panel is a halo, not legibility. */
  .hb-head .kick { color: var(--fg-on-panel-mute) !important; }
  .hb-head h1    { color: var(--fg-on-panel) !important;      text-shadow: none !important; }
  .hb-head p     { color: var(--fg-on-panel-lead) !important; text-shadow: none !important; }
}

/* ---- ≤1024: the same box overlays the reel. Light ink, scrim restored ----- */
@media (max-width: 1024px) {
  .hb-side {
    border-left-color: transparent;
    background-image: linear-gradient(180deg, transparent, rgba(6, 8, 6, .85) 70%);
  }
  .hb-head .kick { color: var(--fg-on-dark-mute) !important; }
  .hb-head h1    { color: var(--fg-on-dark) !important; }
  .hb-head p     { color: var(--fg-on-dark-mute) !important; }
}
