/* scorr_themes.css — APP_QA_R4 P1 · the theme token layer  (four sets as of cc#1185 P9)
   =============================================================================================
   Source of truth: design_refs/scorr_home_themes_R1.html @ 80da8c6. The THREE ORIGINAL token
   blocks (dark, goldday, goldnight) are BYTE-FAITHFUL to that ref — same names, same values, same
   order. Nothing there is added, dropped or "improved"; if a value looks wrong, the ref is the
   thing to change, then this file. Two things have since been APPENDED without touching those
   three: the cc#1185 P3 :root schema, and the cc#1185 P9 AQUA WHITE set at the bottom, which has
   no ref because it does not exist in one yet.

   WHERE THIS FILE LIVES, since P1 asks which pattern was used: repo ROOT, served at
   /static/scorr_themes.css by a route in pwa_endpoints.py. That is the existing convention —
   scorr_theme_r5.css does exactly this (pwa_endpoints.py, cc#1064). There is no static/ directory
   in the repo; the /static/ prefix is a URL namespace, not a folder. The URL is build-id stamped
   by whoever links it, so a deploy busts the 1-day cache (the cc#1060 lesson).

   THE MAPPING RULES, named here so a later reader does not have to infer them from hexes:

   · P&L NEVER RE-SKINS. --win and --loss are money truth. They stay green and red in all three
     themes — they change SHADE to suit the ground (volt #C8F542 on the dark field, a deeper
     #1F9D61 on white so it reads on paper, #3DD68C on black-gold) but never HUE and never role.
     A profit is green in every theme or the theme is wrong.
   · --label IS THE INDEX-NAME COLOUR. NIFTY / BANKNIFTY name labels, per LABEL_AMBER_V1
     (cc#1075). Amber on dark; under goldday/goldnight the layer supersedes it with the theme's
     own label tone. Direction and state words keep --win/--loss, never --label.
   · --brand IS STRUCTURE + GLOW. Section eyebrows, tool icons, the active switch — paired with
     --brandglow for the text-shadow. Aqua on dark (THEME_TOKENS_R51_V1), gold on both gold
     themes. Structure, never decoration.
   · --accent IS INTERACTIVE ONLY. Links and tappable affordances. Pulse on dark; the golds fold
     it into the brand gold, because those palettes carry one accent, not two.
   · --field / --panel / --hi / --edge are the surface ramp, --ink / --muted the text pair.

   NO PAGE CONSUMES THIS YET — P1 ships the asset alone, P2 wires home to it. Adding it changes
   nothing on any live screen until a page links it AND sets body[data-theme].
--------------------------------------------------------------------------------------------- */

/* ══ cc#1722 · DEPTH ROLES — three more contract keys ═════════════════════════════════════════════
   --panel-shadow (box-shadow of a card / panel: drop shadow + an inset metallic lip), --field-grad
   (a background-image wash laid over --field) and --accent-soft (the fill behind accent-coloured
   chip text). Every block declares them; for every set except the ones that opt in the values are
   the NEUTRAL ones — none / none / transparent — which render byte-identically to today (measured:
   card box-shadow was "none" on every light set and body already paints --texture as its image;
   a "none" layer in front of it draws nothing). Consumers live in mobile/theme_mobile.css'' light-set
   release block, so a dark set never reads them. */

/* ══ cc#1721 · --wayfind, the 18th contract key ═══════════════════════════════════════════════════
   R5 calls it WAYFINDING (scorr_theme_r5.css --r5-aqua, cc#1071): the colour of "where you can go"
   — section eyebrows (.sect), the heroTrack glitter ring, tool tiles, inactive nav. mobile/home.html
   carried it as a raw #35E0FF in three places because --brand is gold on goldnight and could not
   stand in for aqua (the cc#1378 note in that file says exactly this). Now every set declares the
   role: goldnight / dark / ainight keep #35E0FF (byte-for-byte the colour those pages show today),
   the light sets take their own text-safe accent, the pink sets their brand. Appended as the LAST
   declaration of each block; no existing value in any block changed. */

/* ══ cc#1185 P3 · THE LOCKED SCHEMA ═══════════════════════════════════════════════════════════
   Spec: session_log 28379, push 3 — "extend the token file to the COMPLETE key set from P1; every
   primitive a page uses has a key, GOLD NIGHT values filled for all."

   DERIVED, NOT INVENTED. Every value below was read out of a real declaration in a real file by
   the P3 census, which walked the same corpus as the P1 and P2 reports with comments masked. P2's
   1,710 bucket-(b) declarations reuse a much smaller set of distinct VALUES; this block is that
   set, named once each. 152 keys cover all 1,710.

   ELEVEN OF THOSE 152 COME FROM BUCKET (a), and the reason matters. P2 filed a literal under (a)
   when its VALUE happened to equal some already-declared token. For a COLOUR that is usually
   intent — #d4af37 is --brand, #ff9f45 is --label — and those repoint to the existing name, not
   to a new one. For a LENGTH it is coincidence: 16px is not "the cut token" because both happen
   to be 16. Repointing a font-size at a token that means something else is how a theme file
   becomes a trap, so the eleven (a) LENGTH values get ordinary ramp keys like every other length.
   The biggest of them, 6px, carries 74 uses — leaving it out would have left the largest single
   spacing hole in the file behind a classification artefact.

   IT SITS ON :root, NOT INSIDE A THEME BLOCK, and that is the whole reason this push is safe.
   Today every one of these values is a hardcoded literal, identical on all three themes because a
   literal cannot vary. Declaring it on :root gives every theme exactly the value it renders now.
   The three body[data-theme] blocks below are UNTOUCHED — which is what DO_NOT_TOUCH requires for
   WHITE-GOLDEN (goldday) and the legacy dark aqua set, and it means dark stays correct when the
   repoint pushes land. AQUA WHITE (P9) overrides on its own block only the keys it needs to move.

   ZERO PIXEL DELTA, BY CONSTRUCTION AND BY MEASUREMENT. Nothing reads these names yet, so nothing
   can render differently. Measured rather than asserted: all 141 names were checked against every
   declaration and every var() call site in the repository — 0 collisions with an existing
   declaration, 0 with an existing call site. A brand-new name that nothing reads cannot move a
   pixel. The repointing is P4 to P7; this push is the vocabulary, not the rewrite.

   THE NAMES CARRY THEIR VALUES on purpose (--type-95 is 9.5px, --space-n4 is -4px). That is not
   a style preference, it is an honest label: this is an INVENTORY of what the app uses, not a
   designed ramp. A thirty-step type scale in half-pixel increments is an accretion, and semantic
   names like --type-sm would imply a design decision nobody has made. Collapsing it into a real
   ramp moves pixels, so it is a separate card and a founder call, not something to slip in here.

   WHAT IS DELIBERATELY NOT KEYED, so nobody reads the absence as an oversight:
   · width / height / max-width — 44 distinct values. Layout geometry, not theme. A theme swap
     does not move a page's 430px max-width or an icon's 26px box.
   · clip-path (15) and backdrop-filter (2) — shape and effect geometry, same reason.
   · 18 of the 33 shadows — composites of geometry, colour and spread. A composite is not a token,
     it is a copy. The two repeated glow geometries ARE keyed; the rest are P7's.
   · font-weight and line-height — they carry no px/rem/em literal, so P2 never counted them as
     violations and there is nothing here to name.
   · P&L green/red and pass/fail — SEMANTIC, exempt from the swap by the card's own invariant.
   One judgement worth a second pair of eyes: --state-live / --state-stale / --state-off are the
   live-feed status colours. They are keyed as theme colours here because live-vs-stale is not
   money truth, but if the founder wants them frozen across themes they move to the semantic
   allowlist, and that is a one-line change to this block.
   -------------------------------------------------------------------------------------------- */
:root{
  /* font-size — 32 steps, every distinct value the app uses, ascending. */
  --type-8:8px;--type-85:8.5px;--type-9:9px;--type-95:9.5px;--type-10:10px;--type-105:10.5px;
  --type-11:11px;--type-115:11.5px;--type-12:12px;--type-125:12.5px;--type-13:13px;
  --type-135:13.5px;--type-14:14px;--type-145:14.5px;--type-15:15px;--type-16:16px;
  --type-165:16.5px;--type-17:17px;--type-18:18px;--type-19:19px;--type-20:20px;--type-21:21px;
  --type-22:22px;--type-24:24px;--type-26:26px;--type-30:30px;--type-32:32px;--type-34:34px;
  --type-36:36px;--type-40:40px;--type-52:52px;--type-80:80px;
  /* padding / margin / gap — 37 steps, every distinct value the app uses, ascending. */
  --space-n16:-16px;--space-n14:-14px;--space-n12:-12px;--space-n10:-10px;--space-n6:-6px;
  --space-n45:-4.5px;--space-n4:-4px;--space-n2:-2px;--space-0:0px;--space-1:1px;--space-2:2px;
  --space-3:3px;--space-4:4px;--space-5:5px;--space-6:6px;--space-7:7px;--space-8:8px;
  --space-85:8.5px;--space-9:9px;--space-10:10px;--space-11:11px;--space-12:12px;
  --space-13:13px;--space-14:14px;--space-15:15px;--space-16:16px;--space-17:17px;
  --space-18:18px;--space-19:19px;--space-20:20px;--space-22:22px;--space-24:24px;
  --space-28:28px;   /* cc#1656: card-to-eyebrow margin-top on /m/v8, spec-named explicitly */
  --space-40:40px;--space-60:60px;--space-70:70px;--space-78:78px;--space-80:80px;
  /* border-radius — 20 steps, every distinct value the app uses, ascending. */
  --radius-1:1px;--radius-2:2px;--radius-3:3px;--radius-4:4px;--radius-5:5px;--radius-6:6px;
  --radius-7:7px;--radius-8:8px;--radius-9:9px;--radius-10:10px;--radius-11:11px;
  --radius-12:12px;--radius-13:13px;--radius-14:14px;--radius-15:15px;--radius-16:16px;
  --radius-17:17px;--radius-18:18px;--radius-19:19px;--radius-20:20px;
  /* border width — 4 steps, every distinct value the app uses, ascending. */
  --bw-1:1px;--bw-15:1.5px;--bw-2:2px;--bw-3:3px;
  /* letter-spacing — 33 steps. em and px are separate ramps: they are different
     units and folding them into one list would invite a wrong swap later. */
  --track-em1:-0.03em;--track-em2:-0.02em;--track-em3:-0.01em;--track-em4:-0.005em;
  --track-em5:0.01em;--track-em6:0.02em;--track-em7:0.04em;--track-em8:0.05em;
  --track-em9:0.06em;--track-em10:0.07em;--track-em11:0.08em;--track-em12:0.1em;
  --track-em13:0.11em;--track-em14:0.12em;--track-em15:0.13em;--track-em16:0.14em;
  --track-em17:0.2em;--track-px1:-1px;--track-px2:-0.2px;--track-px3:-0.1px;--track-px4:0.2px;
  --track-px5:0.3px;--track-px6:0.4px;--track-px7:0.5px;--track-px8:0.6px;--track-px9:0.8px;
  --track-px10:1px;--track-px11:1.1px;--track-px12:1.2px;--track-px13:1.4px;--track-px14:1.5px;
  --track-px15:1.6px;--track-px16:2.5px;
  /* colours — 24 keys, each named for the ROLE its selector gives it, because a theme
     author filling the next set needs to know what a key IS. */
  --accent-alt:#9b82ff;--bar-track:#94a3b8;--fade-null:rgba(0,0,0,0);--field-deep:#0a101e;
  --field-night:#070b14;--filter-so:#b08cff;--gate-bg:#0f1730;--grab:#3a3a42;
  --ink-strong:#e6edf7;--news-rule:#d9d6cc;--press-edge:#000;--row-detail-bg:#f6f8fb;
  --scrollthumb:rgba(120,130,150,.4);--state-idle:#334155;--state-live:#34d399;
  --state-live-bd:rgba(52,211,153,.45);--state-live-bg:rgba(52,211,153,.12);--state-off:#475569;
  --state-stale-bd:rgba(251,191,36,.45);--state-stale-bg:rgba(251,191,36,.12);
  --tab-on-ink:#151204;--veil:rgba(0,0,0,.55);--veil-overlay:rgba(5,9,18,.72);
  --veil-sheet:rgba(4,8,18,.62);
  /* the two repeated glow geometries — 15 of the 33 shadow declarations. The other 18
     are composites of geometry + colour + spread; a composite is not a token, it is a
     copy, so they stay literal and P7 handles them. */
  --glow-10:0 0 10px;--glow-8:0 0 8px
}

/* MIDNIGHT BLUE (key dark) — cc#1725 (founder 05-Sep, phone: "Give Midnight Blue slightly dark blue
   tone, shining"; label rename cc#1724). A step deeper navy that brightens toward the top of the
   page. field #070C1A; panel #0F1A33; hi = panel_hi #152243; edge = line #1E2C4E; ink #EEF2FF;
   muted #93A0C4. ACCENTS UNCHANGED on founder instruction: brand cyan #35E0FF (nav glyphs, wayfind),
   accent purple #7C5CFF (dot), label amber #FF9F45, win lime #C8F542, loss coral #FF4D6D. The
   "shine": --field-grad is a radial wash, brighter blue #10203F at the top falling to near-black
   #060A16 at the bottom; --panel-shadow = soft black drop + faint blue halo + a lit top lip
   rgba(140,170,255,.22) (the glossy edge); --accent-soft = cyan chip fill. railgrad = the card
   rail #4D7CFE -> #7AA2FF (vertical, brighter than the old ink->transparent). gold-lo = line2
   #2B3D6B, gold-hi = the lit blue #7AA2FF, sunk one step below the field — declared for the first
   time here (the set was 18/21; the R5 pressed-slab lip read the gold fallback #7A6320 on a blue
   theme). CONTRAST panel / field / gradient top #10203F: ink 17.2 / 19.1 / 16.0, muted 7.85 / 8.72 /
   7.32, cyan 11.6 / 12.9 / 10.8. Both consumers (body wash, card shadow) are dark-scoped rules in
   theme_mobile.css — dark is not in the LIGHT-SET release block, so they are added there for dark. */
body[data-theme="dark"]{--field:#070C1A;--panel:#0F1A33;--hi:#152243;--edge:#1E2C4E;--ink:#EEF2FF;
 --muted:#93A0C4;--brand:#35E0FF;--brandglow:rgba(53,224,255,.4);--accent:#7C5CFF;--label:#FF9F45;
 --win:#C8F542;--loss:#FF4D6D;--railgrad:linear-gradient(180deg,#4D7CFE,#7AA2FF);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.014) 0 2px,transparent 2px 9px);
 --gold-lo:#2B3D6B;--gold-hi:#7AA2FF;--sunk:#040812;
 --wayfind:#35E0FF;
 --panel-shadow:0 10px 28px rgba(0,0,0,.45), 0 0 0 1px rgba(80,120,255,.08), inset 0 1px 0 rgba(140,170,255,.22);
 --field-grad:radial-gradient(120% 80% at 50% 0%, #10203F 0%, #0A1229 45%, #060A16 100%);
 --accent-soft:rgba(53,224,255,.10)}
body[data-theme="goldday"]{--field:#FAF7F0;--panel:#FFFFFF;--hi:#F3EEE3;--edge:#E5DFD2;--ink:#1A1A1E;
 --muted:#8A8578;--brand:#A67C00;--brandglow:rgba(166,124,0,.25);--accent:#A67C00;--label:#A67C00;
 --win:#1F9D61;--loss:#D93B4F;--railgrad:linear-gradient(90deg,#D4AF37,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(0,0,0,.012) 0 2px,transparent 2px 9px);
 --wayfind:#07657A;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}
body[data-theme="goldnight"]{--field:#0A0A0C;--panel:#131316;--hi:#1B1B20;--edge:#2A2A32;--ink:#F5F2EA;
 --muted:#8E8A7E;--brand:#D4AF37;--brandglow:rgba(212,175,55,.35);--accent:#D4AF37;--label:#8C7A3F;
 --win:#3DD68C;--loss:#FF5C6C;--railgrad:linear-gradient(90deg,#D4AF37,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.014) 0 2px,transparent 2px 9px);
  /* cc#1095 / founder ruling 2 of 2 (Fable RECO 2741, Arpit 18-Aug ~19:52): the three
     shell tokens that were genuinely ABSENT on a goldnight page. ADD ONLY — the other four
     names in that ruling (--gold, --well, --line, --chalk) already resolve here from
     scorr_theme_r5.css, so adding them would OVERRIDE rather than add. Fable's own
     condition says that is a STOP, and it is logged as one. None of the 13 tokens above
     is touched.
     Values read from the locked refs, not retyped from memory: --gold-lo and --gold-hi are
     identical in scorr_card_slab_R1 @ 1261fe9 and scorr_card_pressed_R1 @ 1221452. --sunk
     DIFFERS between them (slab #0E0E11, pressed #0C0C0F); the ruling names #0C0C0F, so that
     is what is written, and the divergence is logged rather than silently resolved. */
  --gold-lo:#7A6320;--gold-hi:#F0D67A;--sunk:#0C0C0F
;
 --wayfind:#35E0FF;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}

/* ══ cc#1185 P9 · AQUA WHITE ═══════════════════════════════════════════════════════════════════
   The fourth set. HIDDEN and INERT the moment it lands: every boot script in the repo accepts only
   `dark` or `goldnight` and falls back to goldnight for anything else, so no page can select this
   today. It is here to be complete and contrast-checked, not to ship. P10 adds the founder's
   hidden preview.

   ONE THING P10 MUST GET RIGHT: the attribute value is `aquawhite`, one word. The card names the
   preview parameter `?theme=aqua_white`, so P10 has to normalise the underscore away before it
   sets the attribute. Written here rather than left to be discovered by a preview that silently
   renders goldnight.

   EVERY ONE OF THE 17 CONTRACT KEYS IS FILLED. That is the P8 completeness check's whole point:
   a set missing a key does not render blank, it falls through to whatever sits underneath and
   looks correct on the theme you happen to be testing. dark and goldday are each missing three;
   this set is not, and the validator says so.

   CONTRAST, MEASURED AGAINST ALL THREE GROUNDS (--panel #FFFFFF, --field #F4F9FB, --hi #E9F3F7).
   The worst ratio of the three is the one that counts, because a token that only passes on the
   whitest surface fails on the card it actually sits in:
       --ink    #0E1A20   17.69 / 16.67 / 15.69   worst 15.69:1
       --muted  #576B74    5.58 /  5.26 /  4.95   worst  4.95:1
       --brand  #07657A    6.66 /  6.28 /  5.91   worst  5.91:1
       --label  #8F5300    6.17 /  5.81 /  5.47   worst  5.47:1
       --win    #14794A    5.44 /  5.12 /  4.82   worst  4.82:1
       --loss   #C0273A    5.85 /  5.51 /  5.19   worst  5.19:1
   All six clear WCAG AA for body text (4.5:1) on every ground. --edge is 1.31:1 against --panel
   and that is correct, not a failure — it is a hairline border, never text, and a border that
   passed a text-contrast test would be a rule drawn in ink.

   P&L KEEPS ITS HUE AND CHANGES ITS SHADE, which is the rule this file already states and already
   follows: volt on the dark field, #1F9D61 on goldday's paper, #3DD68C on black-gold. Aqua white's
   ground is lighter and cooler than goldday's, and goldday's exact pair measures 3.47:1 for green
   on --hi — below AA. So the pair is DARKENED, not re-hued: green is still green, red is still
   red, a profit still reads as a profit. The alternative was keeping a matching hex that fails a
   contrast floor, and a number a founder cannot read is not money truth either.

   --gold-lo / --gold-hi / --sunk keep their GOLD names and carry AQUA values. The names came from
   goldnight's slab bevel (cc#1095) and renaming them would break the contract for every set that
   already fills them. Inherited name, correct value — said plainly so nobody "fixes" it later.
   -------------------------------------------------------------------------------------------- */
/* cc#1720 (founder 05-Sep, phone screenshot of the AI Night tick: "I want this colour in Aqua
   White theme, currently this theme appears dull"). ACCENT FAMILY = AI Night's exact hexes, read
   from the ainight block below: --brand #35E0FF (the tick, active nav glyph, .sect glow, progress
   and every --gold/--cyan alias resolves through --brand), --brandglow rgba(53,224,255,.55),
   --railgrad cyan->transparent, --gold-hi #9FF0FF (hero highlight). CONTRAST GUARD: #35E0FF is a
   FILL/STROKE colour on white — as text it measures 1.58 / 1.49 / 1.41 on panel / field / hi, so
   every token that renders TEXT keeps the same hue one step darker: --accent (links, interactive
   text) = #00798F, same hue as #35E0FF, 5.08 / 4.79 / 4.51 on panel / field / hi (>= 4.5 on all
   three). Section eyebrows (.sect, text) are pointed at --accent for this set in theme_mobile.css.
   DULLNESS: --muted #46585F (was #576B74; one step darker, 7.44 / 7.01 / 6.6), --edge #BFD4DD
   (was #D3E4EB; one step stronger so the layout has edges). field / panel / hi / ink / label / win /
   loss / texture / gold-lo / sunk unchanged. Previous values kept here for the diff:
   brand #07657A · brandglow rgba(7,101,122,.25) · accent #07657A · railgrad #07657A · gold-hi #FFFFFF. */
body[data-theme="aquawhite"]{--field:#F4F9FB;--panel:#FFFFFF;--hi:#E9F3F7;--edge:#BFD4DD;
 --ink:#0E1A20;--muted:#46585F;--brand:#35E0FF;--brandglow:rgba(53,224,255,.55);--accent:#00798F;
 --label:#8F5300;--win:#14794A;--loss:#C0273A;
 --railgrad:linear-gradient(90deg,#35E0FF,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(0,0,0,.012) 0 2px,transparent 2px 9px);
 --gold-lo:#9FC6D2;--gold-hi:#9FF0FF;--sunk:#E4EEF2;
 --wayfind:#00798F;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}

/* ── cc#1637 · THEME_BLUSH_ROSENIGHT_V1 (session_log 37303, founder 03-Sep-2026) ──────────────
   Two pink sets designed and contrast-measured by Fable (WCAG AA on all three grounds; worst
   ratios in the log row). Values copied in by code from that row, not retyped. P&L keeps hue:
   --win green, --loss red; the pink brand is used on eyebrows, icons, active nav and glow only,
   never on a number. --gold-lo / --gold-hi / --sunk keep their gold NAMES and carry pink values,
   exactly as aquawhite does above - inherited contract, do not rename. Append only. */
/* BLUSH PREMIUM — cc#1723 (founder 05-Sep, phone: "Blush also make premium, the pinkish colour on
   top part is better"). The header pink becomes the WHOLE field #F7DCE3; panels #FFF8FA lift off it
   with a rose shadow (was: near-white body, panels barely separated). hi = panel_hi #FBEAEF; edge =
   line #EBBFCB; ink = rose-black #2B0E1A; muted #7A4658; brand = raspberry #B5174E (the carousel dot
   the founder pointed at — CTAs, hero words, active nav, tick, bell badge, nav underline replaces
   lime); accent = plum #7A2E9E (links, secondary chips); label = plum (DAILY DIGEST link, index
   chips); wayfind = raspberry (THE BOOK section labels, card rail, glitter ring — replaces green/
   cyan). win: Fable's #15753F measured 4.47 on the field, one step darker #126636 (6.73 / 5.47 /
   6.08 on panel / field / hi, 5.09 on the gradient bottom); loss #B4223A as given (6.21 / 5.05 /
   5.61, 4.69 gradient bottom). CONTRAST panel / field / hi: ink 17.0 / 13.8 / 15.4, muted 7.05 /
   5.73 / 6.37, raspberry 6.27 / 5.10 / 5.67, plum 7.40 / 6.01 / 6.68. DEPTH ROLES (cc#1722 keys):
   --panel-shadow = rose drop shadow + white top lip; --field-grad = header pink -> deeper pink wash;
   --accent-soft = raspberry chip fill. gold-lo = line2 #D99AAD, gold-hi white, sunk one step below
   the field. Wordmark raspberry -> plum is a scoped rule in theme_mobile.css (--brand -> --accent). */
/* cc#1751 BLUSH = SEASHELL (BLUSH_SEASHELL_V1, session_log 39474; founder picked candidate 4 of
   design_refs/scorr_blush_seashell_R1.html, 06-Sep: "4 lock seashell theme"). Supersedes the cc#1723
   values above — founder: too pink, reads as red/danger. Palette applied verbatim onto the contract
   keys: field #FDF5F6 (almost white with a pink cast) · panel #FFFFFF · panel_hi #FBEEF1 -> --hi ·
   line #F0DCE1 -> --edge · line2 #E4C7CF -> --gold-lo · chalk #2B0E1A -> --ink · muted #7A4658 ·
   accent dusty rose #B75A78 -> --brand (CTAs, hero labels, active nav glyph + underline, tick,
   section labels, bell badge) and --wayfind / --railgrad (card_rail) · accent2 plum #8460A8 ->
   --accent and --label (dot, links, wordmark gradient partner — theme_mobile.css paints the
   wordmark --brand -> --accent) · P&L #15753F / #B4223A unchanged, the hero word stays the only
   strong red · panel_shadow 0 8px 22px rgba(183,90,120,.09) + panel_edge inset top 1px
   rgba(255,255,255,.75) -> --panel-shadow · accent_soft rgba(183,90,120,.08) -> --accent-soft.
   No field wash in the mock -> --field-grad none. Derived, not in the palette: --sunk one step
   below the field #F6E6EA; --brandglow the rose at .22. CONTRAST on panel / field / hi: ink
   17.8 / 16.6 / 15.8, muted 7.38 / 6.88 / 6.54, rose 4.42 / 4.12 / 3.92 (as locked; a text use
   of the rose sits just under 4.5 — stated on the card, not altered), plum 4.98 / 4.64 / 4.41,
   win 5.76 / 5.36 / 5.10, loss 6.50 / 6.06 / 5.76. The palette's dim #A87B8C and
   accent_soft_line rgba(183,90,120,.28) have no contract slot (chips keep --brand as the line). */
body[data-theme="blush"]{--field:#FDF5F6;--panel:#FFFFFF;--hi:#FBEEF1;--edge:#F0DCE1;
 --ink:#2B0E1A;--muted:#7A4658;--brand:#B75A78;--brandglow:rgba(183,90,120,.22);--accent:#8460A8;
 --label:#8460A8;--win:#15753F;--loss:#B4223A;
 --railgrad:linear-gradient(90deg,#B75A78,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(0,0,0,.012) 0 2px,transparent 2px 9px);
 --gold-lo:#E4C7CF;--gold-hi:#FFFFFF;--sunk:#F6E6EA;
 --wayfind:#B75A78;
 --panel-shadow:0 8px 22px rgba(183,90,120,.09), inset 0 1px 0 rgba(255,255,255,.75);
 --field-grad:none;
 --accent-soft:rgba(183,90,120,.08)}
body[data-theme="rosenight"]{--field:#0F0A0D;--panel:#1A1216;--hi:#241820;--edge:#2E1F27;
 --ink:#FBF1F4;--muted:#B08A98;--brand:#FF6B9D;--brandglow:rgba(255,107,157,.35);--accent:#FF6B9D;
 --label:#D98AA8;--win:#3DD68C;--loss:#FF5C6C;
 --railgrad:linear-gradient(90deg,#FF6B9D,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.014) 0 2px,transparent 2px 9px);
 --gold-lo:#7A2F4C;--gold-hi:#FFB3CC;--sunk:#0C0709;
 --wayfind:#FF6B9D;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}
/* cc#1637 amend (37303 rosewall_03sep, founder 03-Sep 07:55): ROSE WALL - dark pink wall, light pink
   cards; the founder-preferred direction. The 17 contract keys here, copied by code. The set's two
   on-field tokens (--on-field, --on-field-muted) and --nav-bg are NOT contract keys, so they live in
   the scoped rosewall block in mobile/theme_mobile.css, keeping every other set 17/17 complete. */
body[data-theme="rosewall"]{--field:#B8355F;--panel:#FFEAF1;--hi:#FFDDE8;--edge:#F2B9CC;
 --ink:#2A0F1C;--muted:#5E3347;--brand:#7A0C3D;--brandglow:rgba(122,12,61,.25);--accent:#7A0C3D;
 --label:#8C1F4E;--win:#0F6B3F;--loss:#A3161C;
 --railgrad:linear-gradient(90deg,#FFF1F5,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.05) 0 2px,transparent 2px 9px);
 --gold-lo:#7A0C3D;--gold-hi:#FFFFFF;--sunk:#FFF6F9;
 --wayfind:#7A0C3D;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}

/* cc#1641 · THEME_AINIGHT_V1 (session_log 37945, founder approved on glass 03-Sep ~17:40 IST via
   scorr_home_theme_mockup.html: "blue background could be dark and shiny like AI colour"). A NEW
   eighth set, not a rewrite of dark (dark stays byte-locked to the R1 ref). Near-black blue field
   with a cyan brand and a faint violet accent; P&L keeps hue (green up, red down). All six text
   tokens measured AA or better on all three grounds. Append only, existing sets untouched. */
body[data-theme="ainight"]{--field:#05070F;--panel:#0B1020;--hi:#111A30;--edge:#1E3050;
 --ink:#EAF2FF;--muted:#7F90B3;--brand:#35E0FF;--brandglow:rgba(53,224,255,.55);--accent:#8B7BFF;
 --label:#FFB454;--win:#3DF5A0;--loss:#FF4D6D;
 --railgrad:linear-gradient(90deg,#35E0FF,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.014) 0 2px,transparent 2px 9px);
 --gold-lo:#1E3050;--gold-hi:#9FF0FF;--sunk:#03050B;
 --wayfind:#35E0FF;
 --panel-shadow:none;--field-grad:none;--accent-soft:transparent}

/* cc#1719 · THEME_SILVERGOLD_V1 + THEME_WINEPURPLE_V1 (founder 05-Sep: "Can we add 2 new themes:
   silver gold, and wine, purple and metallic white"). cc#1721 (founder 05-Sep 20:35, phone: "Silver
   gold theme should be light not dark"): SILVER GOLD IS A LIGHT SET — the cc#1719 dark block was a
   palette error and is replaced here with Fable's light palette. field = metallic silver-white,
   panel white, hi = panel_hi, edge = line; ink = near-black; muted = silver-grey; brand = gold FILL
   (tick, active glyph, progress, carousel dot — 1.83:1 on the field, never text); accent = dark gold
   TEXT #7D6112 (the card's #8C6D14 measured 4.24 on the field, so one step darker: 5.85 / 5.09 /
   4.68 on panel / field / hi); label = slate silver #5B6471 (5.99 / 5.21 / 4.80), the accent2 role
   for index-name chips; win #147548 / loss #C0263C = the light-safe pair, stepped so both clear 4.5
   on all three grounds (5.73 / 4.98 / 4.59 and 5.86 / 5.10 / 4.69). DERIVED: brandglow gold .25,
   railgrad gold->transparent, texture light hairline, gold-lo = line2 #BFC3CC, gold-hi white, sunk
   one step below the field, wayfind = the accent text gold (see the --wayfind note below). The
   metallic panel edge (border-top 1px #FFFFFF) is not a contract key and is not declared here. */
/* cc#1749 SILVER GOLD — BRUSHED (SILVER_GOLD_BRUSHED_V1, session_log 39481; founder picked
   candidate 1 of design_refs/scorr_silver_gold_brushed_R1.html, 06-Sep). The palette's values are
   applied verbatim onto the contract keys, no interpretation: field #EDEEF2 · panel #FFFFFF ·
   line #CDD1D9 -> --edge · line2 #B8BDC7 -> --gold-lo · chalk #181A1F -> --ink · muted #5B6170 ·
   dim #8A909C -> --label · accent gold #C29A34 -> --brand (CTAs, active nav glyph + underline,
   tick, section labels, carousel dot, bell badge, card rail -> --railgrad / --wayfind) ·
   accent_text #8C6D14 -> --accent (any TEXT in gold on the field) · light P&L pair #15753F /
   #B4223A · field_gradient -> --field-grad (brushed aluminium, top to bottom) · panel_lip +
   panel_shadow + panel_bottom_edge -> --panel-shadow · chip_fill -> --accent-soft. --hi = the
   panel_gradient's bottom stop #F7F8FA so theme_mobile.css can paint the panel gradient
   (panel -> hi) from tokens. Not representable without a new contract key, stated on the card:
   the chip_gradient #FFFFFF -> #F3F4F7 (chips paint panel -> hi instead), the chip border
   rgba(110,117,132,.32) (chips use --edge), meta theme-color #F6F7F9 (the resolver sets it from
   --field). Supersedes the cc#1721 flat set and the cc#1749 first-push interpretation. */
body[data-theme="silvergold"]{--field:#EDEEF2;--panel:#FFFFFF;--hi:#F7F8FA;--edge:#CDD1D9;
 --ink:#181A1F;--muted:#5B6170;--brand:#C29A34;--brandglow:rgba(194,154,52,.25);--accent:#8C6D14;
 --label:#8A909C;--win:#15753F;--loss:#B4223A;
 --railgrad:linear-gradient(90deg,#C29A34,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(0,0,0,.012) 0 2px,transparent 2px 9px);
 --gold-lo:#B8BDC7;--gold-hi:#FFFFFF;--sunk:#E4E6EB;
 --wayfind:#C29A34;
 --panel-shadow:0 8px 22px rgba(20,24,40,.09), inset 0 1px 0 #FFFFFF, inset 0 -1px 0 rgba(120,126,140,.18);
 --field-grad:linear-gradient(180deg,#F6F7F9 0%,#EDEEF2 45%,#E4E6EB 100%);
 --accent-soft:rgba(110,117,132,.08)}
/* WINE PURPLE — cc#1722 (founder 05-Sep 20:36, phone: "Wine purple should be richer, look premium").
   The cc#1719 set was a washed lilac-grey with white panels and no depth. Fable's rich palette:
   field = deeper mauve-ivory #EBE2E8 (the metallic white is the PANEL #FBF9FA, not the field); hi =
   panel_hi; edge = line #D2BFCC (lines visible again); ink = wine-black #2A1226; muted #6A4A63;
   brand = deep wine #6B1F35 (CTAs, hero words, active nav, tick, section labels, bell badge — all
   route through --brand/--gold); accent = royal purple #5B3A9B (links, carousel dot, secondary
   chips — the contract's interactive key); label = purple (DAILY DIGEST link, index chips);
   wayfind = purple (card rail / glitter ring); win #15753F / loss #B4223A = Fable's deeper pair, both
   >= 4.5 on panel AND field (5.49 / 4.54, 6.20 / 5.13). CONTRAST on panel / field / hi: ink 16.5 /
   13.7 / 14.5, muted 7.23 / 5.98 / 6.36, wine 10.7 / 8.85 / 9.42, purple 7.94 / 6.57 / 6.99.
   DEPTH ROLES (new contract keys, see the note above the P3 schema): --panel-shadow = the drop
   shadow + metallic top lip; --field-grad = the top-to-bottom field wash; --accent-soft = the chip
   fill behind wine text. gold-lo = line2 #B99FB1, gold-hi white, sunk one step below the field. The
   wordmark gradient (wine -> purple) is a scoped rule in theme_mobile.css reading --brand/--wayfind. */
/* cc#1753 WINE PURPLE = AUBERGINE, now a DARK set (WINE_PURPLE_AUBERGINE_V1, session_log 39478;
   founder picked candidate 4 of design_refs/scorr_wine_purple_aubergine_R1.html, 06-Sep: "4
   Aubergine"). Supersedes the cc#1722 light palette above — it sat too close to Seashell (39474).
   Spread is now 4 dark (Gold Night, Midnight Blue, AI Night, Wine Purple) / 3 light. Palette
   applied verbatim onto the contract keys: field #120A18 · panel #1C1223 · panel_hi #241830 ->
   --hi · line #31223C -> --edge · line2 #45325A -> --gold-lo · chalk #EFE7F7 -> --ink · muted
   #AB98C4 · accent wine #C64B80 -> --brand (CTAs, hero labels, active nav glyph + underline, tick,
   section labels, bell badge) · accent2 purple #7E57C2 -> --accent, --label and --wayfind (dot,
   links, wordmark gradient partner — theme_mobile.css paints the wordmark --brand -> --wayfind) ·
   card_rail wine -> purple -> --railgrad · dark-safe P&L pair #34D399 / #FB7185 (the light pair
   fails on #120A18; the hero word #FB7185 stays distinct from the wine accent) · field_gradient
   -> --field-grad (the radial glow, same role Midnight Blue uses) · panel_shadow + panel_lip ->
   --panel-shadow · accent_soft rgba(198,75,128,.12) -> --accent-soft. Dark-set roles filled with
   dark values, never left to fall through: --texture = the dark hairline (white at .014, as
   goldnight / dark), --sunk = the gradient's bottom stop #0B0610 (one step below the field),
   --gold-hi = the lip's lavender #D2BEFF (derived from panel_lip rgb(210,190,255)), --brandglow =
   the wine at .35 (the dark sets' glow strength). meta theme-color #120A18 comes from --field via
   the resolver. CONTRAST on field / panel / hi: chalk 16.1 / 15.0 / 14.0, muted 7.41 / 6.91 /
   6.42, wine 4.36 / 4.07 / 3.78 (as locked — a text use of the wine sits just under 4.5, stated on
   the card, not altered), purple 3.72 / 3.47 / 3.23 (dot / links / rail, as locked), win 10.1 /
   9.42 / 8.75, loss 7.21 / 6.73 / 6.25. No slot in the contract: dim #7A6A94, accent_soft_line
   rgba(198,75,128,.40) (chips keep --brand as the line). */
body[data-theme="winepurple"]{--field:#120A18;--panel:#1C1223;--hi:#241830;--edge:#31223C;
 --ink:#EFE7F7;--muted:#AB98C4;--brand:#C64B80;--brandglow:rgba(198,75,128,.35);--accent:#7E57C2;
 --label:#7E57C2;--win:#34D399;--loss:#FB7185;
 --railgrad:linear-gradient(180deg,#C64B80,#7E57C2);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.014) 0 2px,transparent 2px 9px);
 --gold-lo:#45325A;--gold-hi:#D2BEFF;--sunk:#0B0610;
 --wayfind:#7E57C2;
 --panel-shadow:0 10px 28px rgba(0,0,0,.55), inset 0 1px 0 rgba(210,190,255,.14);
 --field-grad:radial-gradient(120% 80% at 50% 0%, #221334 0%, #120A18 55%, #0B0610 100%);
 --accent-soft:rgba(198,75,128,.12)}

/* ══ cc#1775 · DUSK VIOLET + INDIGO ASH (THEME_DUSKVIOLET_INDIGOASH_V1, session_log 39650; founder
   06-Sep picked candidates A and C of Fable's 5-way mock: "this colour bit sharp for eyes ... make 2
   themes live dusk violet, indigo ash both looks cool"). Two DARK sets built to be easier on the
   eyes than Aubergine (winepurple): peak ink contrast 13.67 / 13.60 against Aubergine's 16.12, and
   every text token measured by Fable on the worst of panel/field/hi clears AA 4.5 —
   Dusk Violet: ink 10.49, muted 5.90, label 6.35, brand/accent 5.00, win 6.38, loss 5.26, gold-hi 7.97;
   Indigo Ash:  ink 10.10, muted 5.87, label 6.71, brand/accent 5.65, win 6.08, loss 5.22, gold-hi 8.08.
   Every hex, gradient and alpha below is 39650's verbatim — nothing re-derived or adjusted.
   ROLE MAPPING, key for key from the winepurple block above (the contract has no --accent2):
     --brand / --accent / --label  the set's primary hue (39650 sets brand = accent; label its own step)
     --wayfind                     THE SECOND HUE. winepurple carries its purple partner #7E57C2 on
                                   --wayfind (the wordmark gradient partner in theme_mobile.css and the
                                   Home eyebrow .sect); Dusk Violet #7E93CE periwinkle, Indigo Ash
                                   #6FB0C4 soft cyan sit on the same key. No new token.
     --brandglow                   .20 alpha against Aubergine's .35 (the halation complaint)
     --win / --loss                P&L keeps hue — green / red, softened in chroma only; money cells
                                   never carry the brand colour.
     --railgrad / --texture / --field-grad / --panel-shadow / --accent-soft / --gold-lo / --gold-hi /
     --sunk / --field / --panel / --hi / --edge / --ink / --muted  as named in 39650. 21 keys each. */
body[data-theme="duskviolet"]{--field:#171526;--panel:#1F1D31;--hi:#28263D;--edge:#332F4A;
 --ink:#DCD8EA;--muted:#A6A1BE;--brand:#A28BD4;--brandglow:rgba(162,139,212,.20);--accent:#A28BD4;
 --label:#B3A2DC;--win:#4FBF8B;--loss:#E8798C;
 --railgrad:linear-gradient(90deg,#A28BD4,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.012) 0 2px,transparent 2px 9px);
 --gold-lo:#4A3A6B;--gold-hi:#C9B6F0;--sunk:#100E1C;
 --wayfind:#7E93CE;
 --panel-shadow:0 10px 28px rgba(0,0,0,.45);
 --field-grad:radial-gradient(120% 80% at 50% 0%, #201D35 0%, #171526 55%, #110F1D 100%);
 --accent-soft:rgba(162,139,212,.12)}
body[data-theme="indigoash"]{--field:#141A26;--panel:#1C2331;--hi:#252D3D;--edge:#2E3849;
 --ink:#D6DDE8;--muted:#9EAABC;--brand:#8CA6DB;--brandglow:rgba(140,166,219,.20);--accent:#8CA6DB;
 --label:#9DB6E0;--win:#4FC08D;--loss:#E58292;
 --railgrad:linear-gradient(90deg,#8CA6DB,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(255,255,255,.012) 0 2px,transparent 2px 9px);
 --gold-lo:#33455F;--gold-hi:#AFC8EC;--sunk:#0E131D;
 --wayfind:#6FB0C4;
 --panel-shadow:0 10px 28px rgba(0,0,0,.45);
 --field-grad:radial-gradient(120% 80% at 50% 0%, #1B2434 0%, #141A26 55%, #0E131D 100%);
 --accent-soft:rgba(140,166,219,.12)}

/* ══ cc#1790 · DUSK DAY (THEME_DUSK_DAY_V1, session_log 39734; founder 06-Sep: "convert dusk violet to
   light theme / file this with a name, dont remove dark violet for now"). The LIGHT sibling of Dusk
   Violet: same violet, grounds inverted — the accent moves from the light violet a dark ground needs to a
   deep violet for a light ground, the partner blue darkens the same way and lands on --wayfind. Every
   value below is the entry's, not re-derived. All 21 contract keys declared (cc#1185). Dusk Violet is
   untouched. Switcher 8 → 9 (39734 supersedes the 39651 count lock). Measured worst-of panel/field/hi:
   ink 13.11 · muted 6.05 · label/accent 5.26 · win 5.42 · loss 5.38 — all AA. */
body[data-theme="duskday"]{--field:#F4F2FA;--panel:#FFFFFF;--hi:#EBE8F6;--edge:#DBD5EC;
 --ink:#241F38;--muted:#5B5175;--brand:#6B4FA8;--brandglow:rgba(107,79,168,.14);--accent:#6B4FA8;
 --label:#6B4FA8;--win:#0F6B46;--loss:#B3243D;
 --railgrad:linear-gradient(90deg,#6B4FA8,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(60,40,110,.030) 0 2px,transparent 2px 9px);
 --gold-lo:#E3DBF5;--gold-hi:#3F2E6B;--sunk:#FBFAFE;
 --wayfind:#4A63A8;
 --panel-shadow:0 6px 20px rgba(60,40,110,.10);
 --field-grad:radial-gradient(120% 80% at 50% 0%, #FAF8FE 0%, #F4F2FA 55%, #EFEBF7 100%);
 --accent-soft:rgba(107,79,168,.10)}

/* ══ cc#1791 · ORANGE PEEL (THEME_ORANGE_PEEL_V1, session_log 39738; founder 06-Sep: "build a mock theme
   for orange peel / this orange not possible? / file both orange and violet light"). A LIGHT set on a
   warm-white field. THE TWO-ORANGE RULE: the bright orange the founder pointed at is NON-TEXT ONLY (as
   small text it measures 2.84 and fails AA) — it lives on --wayfind, whose only readers are graphic
   (nav underline bar, nav icon, chip border, the wordmark O, rails via --railgrad, glow via --brandglow,
   chip wash via --accent-soft). --brand / --accent / --label carry the SAME HUE pushed darker for text
   (4.99 worst case). All 21 contract keys declared; --field-grad is none (flat warm-white, the Blush
   precedent). Measured worst-of panel/field/hi: ink 16.50 · muted 6.71 · accent 4.99 · win 4.79 ·
   loss 5.01 — all AA. Every value is the entry's, not re-derived. */
body[data-theme="orangepeel"]{--field:#FDF8F3;--panel:#FFFFFF;--hi:#F6F1EB;--edge:#E8DFD4;
 --ink:#1A1206;--muted:#5C5348;--brand:#B54200;--brandglow:rgba(255,108,17,.30);--accent:#B54200;
 --label:#B54200;--win:#0F7A4A;--loss:#C62828;
 --railgrad:linear-gradient(90deg,#FF9147,#FF6C11,transparent);
 --texture:repeating-linear-gradient(115deg,rgba(150,100,40,.026) 0 2px,transparent 2px 9px);
 --gold-lo:#FFE0C7;--gold-hi:#5C3410;--sunk:#FFFFFF;
 --wayfind:#FF6C11;
 --panel-shadow:0 4px 18px rgba(120,80,40,.10);
 --field-grad:none;
 --accent-soft:rgba(255,108,17,.08)}

/* ══ cc#1792 · ELECTRIC VIOLET (THEME_ELECTRIC_VIOLET_V1, session_log 39762; founder 06-Sep 22:55: "Dusk
   violet little bit dull can we build sharper metallic wine or violet background / Electric violet replacing
   dusk violet"). A DARK set that REPLACES Dusk Violet in the switcher; the duskviolet block above is
   WITHDRAWN, not deleted (the cc#1776 winepurple pattern) and a stored duskviolet is remapped once in the
   boot path. Dusk DAY (cc#1790) is a different theme and stays. The point of the set is SURFACE, not
   brightness: --panel-shadow carries the lit rim + sink, --texture is the diagonal sheen, --field-grad the
   graded field; mobile/theme_mobile.css applies the metallic recipe (graded panels, rim, sheen, inset bars,
   gradient-clipped wordmark and verdict word). Every value is the entry's. All 21 contract keys. Measured
   worst-of panel/field/hi: ink 12.93 · muted 7.46 · label 7.59 · accent 6.05 · accent2 8.25 · win 9.05 ·
   loss 5.65 — all AA. The hero glow stays OFF (cc#1775 scope 4). */
body[data-theme="electricviolet"]{--field:#150E26;--panel:#1D1533;--hi:#291E45;--edge:#3F2F63;
 --ink:#EFE8FF;--muted:#BCADE0;--brand:#B98CFF;--brandglow:rgba(185,140,255,.34);--accent:#B98CFF;
 --label:#C3A8FF;--win:#3DE0A0;--loss:#FF6B8A;
 --railgrad:linear-gradient(90deg,transparent,#B98CFF,#7BC5FF,transparent);
 --texture:linear-gradient(108deg,transparent 38%,rgba(215,200,255,.11) 50%,transparent 62%);
 --gold-lo:#4A3A7A;--gold-hi:#D9C2FF;--sunk:#0E0919;
 --wayfind:#7BC5FF;
 --panel-shadow:inset 0 1px 0 rgba(200,180,255,.26), inset 0 -1px 0 rgba(0,0,0,.5), 0 14px 34px rgba(0,0,0,.55);
 --field-grad:radial-gradient(120% 55% at 50% -8%, rgba(185,140,255,.13), transparent 62%), linear-gradient(180deg,#241B3D 0%,#150E26 42%,#0E0919 100%);
 --accent-soft:rgba(185,140,255,.12)}
