/* =========================================================================================================
   COLOUR PALETTES (2026-10-28; the owner: "Add color pallettes to the settings"). A palette is a FULL THEME:
   the accent, the surfaces and the header together, in light and in dark. Four since 2026-10-30 (the owner:
   "leave only high contrast and indigo, then add low blue mode"): ROI Blue (today's look, the default), Indigo,
   High contrast and Low blue. Chosen in Settings, saved on the account
   (PUT /api/account/theme), worn as data-palette on <html> (js/modules/palette.js; api-tool.html sets it
   before first paint).

   GENERATED by tools/palette/gen-themes.mjs - edit the generator and run it, not this file.

   HOW: tokens only. Each theme redefines the tokens of main.css :root on :root[data-palette=x] (0,2,0 beats
   :root's 0,1,0) and the dark ones of dark-mode.css on :root[data-palette=x] body.theme-dark (0,2,2 beats
   0,1,1), so this file's place in the cascade does not matter and no rule elsewhere changes. ROI Blue has no
   block: no attribute, no change. Status, BASIC, chart-series, map, PDF and email colours are not tokens here
   and never follow a palette.

   WHY THE VALUES ARE SAFE: Indigo moves each ROI Blue token to its hue at the SAME WCAG luminance, and a
   contrast ratio depends on luminance alone - so every pair keeps the ratio it has in ROI Blue, in both modes.
   Low blue does the same at a warm amber (greys to paper and brown), sets a paper card, and deepens (lifts, in
   dark) any token ink until it clears AA on every ground, with the blue channel under green under red in every
   colour its rules set. The semantic inks keep their colours there too, so one already under AA in ROI Blue
   reads a little lower on the paper.
   High contrast deepens light-mode inks and borders and lifts dark-mode ones: 7:1 for the text
   the tokens draw (inks, captions, links, header and nav) on its grounds, 3:1 borders, a solid focus ring. The
   fixed status, BASIC and chart inks keep their own colours there too, by the rule above: whatever ratio they
   have in ROI Blue, some of them under AA (#f59e0b, #16a34a), which no palette changes.
   e2e/palette-themes.mjs checks the pairs and the picker; e2e/dark-audit.mjs takes PALETTE=<id>.
   ========================================================================================================= */

/* ── INDIGO ── */
:root[data-palette="indigo"] {
    /* accent ramp: 600 is --accent */
    --accent-50: #f3f5fe;
    --accent-100: #e5e7ff;
    --accent-200: #d1d6ff;
    --accent-300: #b7bcff;
    --accent-400: #9699fc;
    --accent-500: #7975f8;
    --accent-600: #6555ec;
    --accent-700: #5541d8;
    --accent-800: #4636af;
    --accent-900: #3a3488;
    --accent-950: #252252;
    --accent-rgb: 101, 85, 236;
    --accent-50-rgb: 243, 245, 254;
    --accent-100-rgb: 229, 231, 255;
    --accent-200-rgb: 209, 214, 255;
    --accent-300-rgb: 183, 188, 255;
    --accent-400-rgb: 150, 153, 252;
    --accent-500-rgb: 121, 117, 248;
    --accent-700-rgb: 85, 65, 216;
    --accent-800-rgb: 70, 54, 175;
    --accent-900-rgb: 58, 52, 136;
    --accent-950-rgb: 37, 34, 82;
    --accent-ink-rgb: 85, 65, 216;
    /* accent roles */
    --brand-nav: #634ef3;
    --brand-nav-rgb: 99, 78, 243;
    --accent-mid: #6d6bd9;
    --accent-mid-rgb: 109, 107, 217;
    --accent-mid-hi: #797ae9;
    --accent-mid-hi-rgb: 121, 122, 233;
    --accent-wash: #f1f1ff;
    --accent-wash-rgb: 241, 241, 255;
    --accent-hover-border: #d1d3f6;
    --accent-note-bg: #2c2b4e;
    --accent-note-border: #515291;
    --accent-note-ink: #bfc3f0;
    --ink-heading: #35355f;
    --accent-bright: #9a9efe;
    --accent-bright-rgb: 154, 158, 254;
    --accent-tint: #f3f3fe;
    /* neutral ramps, leaning the theme's way */
    --slate-50: #faf9ff;
    --slate-100: #f3f4fd;
    --slate-200: #e5e7f1;
    --slate-300: #d2d3e1;
    --slate-400: #9fa0b7;
    --slate-500: #6f718b;
    --slate-600: #525269;
    --slate-700: #3e3e56;
    --slate-800: #26273b;
    --slate-900: #16152b;
    --slate-950: #060516;
    --slate-50-rgb: 250, 249, 255;
    --slate-400-rgb: 159, 160, 183;
    --slate-500-rgb: 111, 113, 139;
    --slate-900-rgb: 22, 21, 43;
    --gray-50: #f8fafe;
    --gray-100: #f1f4fc;
    --gray-200: #e4e7ee;
    --gray-300: #d4d4dc;
    --gray-400: #9fa2b0;
    --gray-500: #6f717f;
    --gray-600: #525364;
    --gray-700: #3e3f52;
    --gray-800: #272736;
    --gray-900: #151727;
    --gray-950: #070611;
    --gray-400-rgb: 159, 162, 176;
    --gray-500-rgb: 111, 113, 127;
    --zinc-50: #f8faff;
    --zinc-100: #f4f3fe;
    --zinc-200: #e2e4ed;
    --zinc-300: #d2d4de;
    --zinc-400: #a1a1aa;
    --zinc-500: #71717a;
    --zinc-600: #52525b;
    --zinc-700: #3f3f46;
    --zinc-800: #26272d;
    --zinc-900: #17181d;
    --zinc-950: #08090e;
    --azia-ink: #24253c;
    --azia-ink-rgb: 36, 37, 60;
    --azia-ink-soft: #646582;
    --azia-muted: #8185a0;
    --azia-muted-rgb: 129, 133, 160;
    --dk-control: #3a3c42;
    --dk-control-border: #4f4f55;
    --dk-chip-ink: #c8c7d1;
    --dk-line: #383a40;
    --dk-panel: #23252b;
    /* light-mode roles */
    --bg: #f0f0fa;
    --surface: #f3f6fd;
    --surface-sunken: #eaeaf3;
    --surface-strong: #16152b;
    --text: #16152b;
    --text-body: #26273b;
    --text-muted: #525269;
    --text-soft: #5d6075;
    --text-faint: #6f718b;
    --accent: #6555ec;
    --accent2: #5541d8;
    --accent-ink: #5541d8;
    --accent-soft: #f3f3fe;
    --accent-soft-border: #d2d6fb;
    --surface-accent-soft: #f2f3fe;
    --border-subtle: #ebebf4;
    --border: #dee0eb;
    --border-strong: #bdbfd1;
    --border-emphasis: #9fa0b7;
    /* the header: a ground in the theme's palest step, so the theme shows from the first glance */
    --header-bg: var(--accent-50);
    --header-border: var(--accent-100);
    --logo-roi: #2d296c;
    /* one-off tones (var(--tone-<hex>, literal) in the sheets) */
    --tone-0b1220: #0f1120;
    --tone-0f1724: #161525;
    --tone-101828: #171629;
    --tone-101828-rgb: 23, 22, 41;
    --tone-132039: #1c1e39;
    --tone-172033: #1e1e34;
    --tone-17223a: #1f203a;
    --tone-17284a: #24254a;
    --tone-1e1e1e: #1c1e23;
    --tone-1f1f23: #1e1f25;
    --tone-202023: #1f2026;
    --tone-202023-rgb: 31, 32, 38;
    --tone-212529: #24242a;
    --tone-22375c: #33335c;
    --tone-2a2a2d: #292a30;
    --tone-2a4d7a: #45477b;
    --tone-2c3039: #2f2f3a;
    --tone-333333: #313338;
    --tone-33333a: #33333a;
    --tone-3366ff: #6b59fe;
    --tone-3366ff-rgb: 107, 89, 254;
    --tone-35507d: #4a4b7d;
    --tone-3a3a3c: #383a41;
    --tone-4a597a: #55567b;
    --tone-555555: #53555b;
    --tone-566274: #5d6075;
    --tone-566274-rgb: 93, 96, 117;
    --tone-5b6b88: #666888;
    --tone-666666: #64666c;
    --tone-888888: #888791;
    --tone-8a8a8a: #8a8993;
    --tone-8ab4f8: #a7adf7;
    --tone-8fbcf0: #afb4f1;
    --tone-93b4ff: #abaefe;
    --tone-999999: #9998a2;
    --tone-a3acb9: #aaaab9;
    --tone-b4b4bc: #b4b4bc;
    --tone-b6c2d4: #bdc0d4;
    --tone-bcd7ff: #cfd2fe;
    --tone-bfd3f6: #cdcff7;
    --tone-c6d6e8: #d0d3ea;
    --tone-c8d7ea: #d2d4ec;
    --tone-cccccc: #cccbd5;
    --tone-cfcfcf: #cfced8;
    --tone-dbe1ea: #dee0eb;
    --tone-dbe3ee: #dfe2ed;
    --tone-dbe7ff: #e2e5ff;
    --tone-dddddd: #dddce6;
    --tone-e0edff: #e7ebff;
    --tone-e1e5ea: #e3e4ee;
    --tone-e8eef6: #ebedf7;
    --tone-eaf2ff: #eef1fe;
    --tone-ececee: #eaecf4;
    --tone-ececee-rgb: 234, 236, 244;
    --tone-eeeeee: #eeedf7;
    --tone-eef1f6: #f0f0fa;
    --tone-eef2f7: #f0f1fb;
    --tone-f3f6ff: #f6f5ff;
    --tone-f4f5fb: #f3f5fe;
    --tone-f4f5fb-rgb: 243, 245, 254;
    --tone-f4f7fb: #f6f6ff;
    --tone-f4f7fb-rgb: 246, 246, 255;
    --tone-f5f5f5: #f5f4ff;
    --tone-f7faff: #faf9ff;
    --tone-f8faff: #f8faff;
    --tone-f8faff-rgb: 248, 250, 255;
    --tone-f9fafc: #f8faff;
    --tone-fbfbfd: #fafbff;
    /* read as var(--x, literal) and never defined by ROI Blue: the literal's token, in this palette */
    --brand: var(--accent-600);
    --dash-tile: var(--slate-50);
    --border-soft: var(--tone-eef2f7);
}
:root[data-palette="indigo"] body.theme-dark {
    --bg: #14161d;
    --surface-light: #14161d;
    --surface: #1f2026;
    --surface-alt: #25262d;
    --surface-sunken: #191b22;
    --surface-strong: #e6e5ef;
    --text: #eaecf4;
    --text-body: #d2d4de;
    --text-muted: #b4b5bf;
    --text-soft: #9d9da6;
    --text-faint: #919199;
    --accent: #6555ec;
    --accent2: #5541d8;
    --accent-ink: #9ca1f6;
    --accent-soft: #272746;
    --accent-soft-border: #454575;
    --border-subtle: #303036;
    --border: #3a3a42;
    --border-strong: #565663;
    --border-emphasis: #71717f;
    --accent-ink-rgb: 156, 161, 246;
    /* the dark header: the card's luminance with a stronger lean, so the theme reads in dark too */
    --header-bg: #232538;
    --header-border: #383b4e;
    --logo-roi: #9fa3f7;
}

/* ── HIGH CONTRAST ── */
:root[data-palette="high-contrast"] {
    /* every ramp, role and tone through the light curve */
    --accent-50: #eff6ff;
    --accent-100: #dbeafe;
    --accent-200: #a4c0e2;
    --accent-300: #7eb1e8;
    --accent-400: #4184d8;
    --accent-500: #0e58c9;
    --accent-600: #0035b0;
    --accent-700: #0012a6;
    --accent-800: #04067d;
    --accent-900: #020b5a;
    --accent-950: #03022c;
    --accent-rgb: 0, 53, 176;
    --accent-50-rgb: 239, 246, 255;
    --accent-100-rgb: 219, 234, 254;
    --accent-200-rgb: 164, 192, 226;
    --accent-300-rgb: 126, 177, 232;
    --accent-400-rgb: 65, 132, 216;
    --accent-500-rgb: 14, 88, 201;
    --accent-700-rgb: 0, 18, 166;
    --accent-800-rgb: 4, 6, 125;
    --accent-900-rgb: 2, 11, 90;
    --accent-950-rgb: 3, 2, 44;
    --brand-nav: #0627bf;
    --brand-nav-rgb: 6, 39, 191;
    --accent-mid: #004e9d;
    --accent-mid-rgb: 0, 78, 157;
    --accent-mid-hi: #005eba;
    --accent-mid-hi-rgb: 0, 94, 186;
    --accent-wash: #eef2ff;
    --accent-wash-rgb: 238, 242, 255;
    --accent-hover-border: #a9b6d4;
    --accent-note-bg: #010c21;
    --accent-note-border: #002f5c;
    --accent-note-ink: #99b7da;
    --ink-heading: #001332;
    --accent-bright: #5289db;
    --accent-bright-rgb: 82, 137, 219;
    --accent-tint: #eff4ff;
    --slate-50: #f8fafc;
    --slate-100: #f1f5f9;
    --slate-200: #e2e8f0;
    --slate-300: #a9b3bd;
    --slate-400: #404d61;
    --slate-500: #091627;
    --slate-600: #010310;
    --slate-700: #000102;
    --slate-800: #000001;
    --slate-900: #000000;
    --slate-950: #000000;
    --slate-50-rgb: 248, 250, 252;
    --slate-400-rgb: 64, 77, 97;
    --slate-500-rgb: 9, 22, 39;
    --slate-900-rgb: 0, 0, 0;
    --gray-50: #f9fafb;
    --gray-100: #f3f4f6;
    --gray-200: #e6e6eb;
    --gray-300: #b0b4bb;
    --gray-400: #474e59;
    --gray-500: #0f151e;
    --gray-600: #00040b;
    --gray-700: #010005;
    --gray-800: #000001;
    --gray-900: #000000;
    --gray-950: #000000;
    --gray-400-rgb: 71, 78, 89;
    --gray-500-rgb: 15, 21, 30;
    --zinc-50: #fafafa;
    --zinc-100: #f4f4f5;
    --zinc-200: #dfdee2;
    --zinc-300: #b2b3b5;
    --zinc-400: #4b4c52;
    --zinc-500: #14141c;
    --zinc-600: #030307;
    --zinc-700: #020003;
    --zinc-800: #000001;
    --zinc-900: #000000;
    --zinc-950: #000000;
    --azia-ink: #000001;
    --azia-ink-rgb: 0, 0, 1;
    --azia-ink-soft: #040c21;
    --azia-muted: #1e283f;
    --azia-muted-rgb: 30, 40, 63;
    --dk-control: #010001;
    --dk-control-border: #030206;
    --dk-chip-ink: #969594;
    --dk-line: #010001;
    --dk-panel: #000000;
    --tone-0b1220: #000000;
    --tone-0f1724: #000000;
    --tone-101828: #000000;
    --tone-101828-rgb: 0, 0, 0;
    --tone-132039: #000000;
    --tone-172033: #000000;
    --tone-17223a: #000000;
    --tone-17284a: #000623;
    --tone-1e1e1e: #000000;
    --tone-1f1f23: #000000;
    --tone-202023: #000000;
    --tone-202023-rgb: 0, 0, 0;
    --tone-212529: #000000;
    --tone-22375c: #021033;
    --tone-2a2a2d: #000001;
    --tone-2a4d7a: #00234b;
    --tone-2c3039: #000002;
    --tone-333333: #010000;
    --tone-33333a: #010000;
    --tone-3366ff: #1134cd;
    --tone-3366ff-rgb: 17, 52, 205;
    --tone-35507d: #0e2550;
    --tone-3a3a3c: #010002;
    --tone-4a597a: #02031b;
    --tone-555555: #030405;
    --tone-566274: #030915;
    --tone-566274-rgb: 3, 9, 21;
    --tone-5b6b88: #040e26;
    --tone-666666: #0c0c0c;
    --tone-888888: #2b2a29;
    --tone-8a8a8a: #2b2d2b;
    --tone-8ab4f8: #709adb;
    --tone-8fbcf0: #78a4d7;
    --tone-93b4ff: #7c9ae5;
    --tone-999999: #413f40;
    --tone-a3acb9: #555c69;
    --tone-b4b4bc: #6d6c72;
    --tone-b6c2d4: #7a8796;
    --tone-bcd7ff: #b1cdf4;
    --tone-bfd3f6: #9aaece;
    --tone-c6d6e8: #a5b4c7;
    --tone-c8d7ea: #a9b7cb;
    --tone-cccccc: #9d9f9d;
    --tone-cfcfcf: #a5a6a5;
    --tone-dbe1ea: #cfd4dc;
    --tone-dbe3ee: #d0dae3;
    --tone-dbe7ff: #dbe5ff;
    --tone-dddddd: #cacaca;
    --tone-e0edff: #e0edff;
    --tone-e1e5ea: #dce0e4;
    --tone-e8eef6: #e8eef6;
    --tone-eaf2ff: #eaf2ff;
    --tone-ececee: #ececee;
    --tone-ececee-rgb: 236, 236, 238;
    --tone-eeeeee: #eeeeee;
    --tone-eef1f6: #eef1f6;
    --tone-eef2f7: #eef2f7;
    --tone-f3f6ff: #f3f6ff;
    --tone-f4f5fb: #f4f5fb;
    --tone-f4f5fb-rgb: 244, 245, 251;
    --tone-f4f7fb: #f4f7fb;
    --tone-f4f7fb-rgb: 244, 247, 251;
    --tone-f5f5f5: #f5f5f5;
    --tone-f7faff: #f7faff;
    --tone-f8faff: #f8faff;
    --tone-f8faff-rgb: 248, 250, 255;
    --tone-f9fafc: #f9fafc;
    --tone-fbfbfd: #fbfbfd;
    /* grounds, inks and borders: set by hand (7:1 text and 3:1 borders and more on every ground) */
    --bg: #ffffff;
    --surface: #f4f4f5;
    --surface-sunken: #e9e9ec;
    --surface-strong: #000000;
    --text: #000000;
    --text-body: #0a0a0a;
    --text-muted: #1f2937;
    --text-soft: #2d3748;
    --text-faint: #374151;
    --accent: #0035b0;
    --accent2: #0012a6;
    --accent-ink: #04067d;
    --accent-soft: #e8efff;
    --accent-soft-border: #0035b0;
    --surface-accent-soft: #e8efff;
    --border-subtle: #8a94a6;
    --border: #6b7280;
    --border-strong: #4b5563;
    --border-emphasis: #1f2937;
    --success-ink: #14532d;
    --warning-ink: #7c2d12;
    --danger-ink: #7f1d1d;
    --header-bg: #ffffff;
    --header-border: #000000;
    --header-ink: #000000;
    --nav-ink: #1f2937;
    --nav-active-bg: #e8efff;
    --nav-active-ink: #04067d;
    --nav-active-border: #0035b0;
    --logo-roi: #020b5a;
    --logo-sight: #000000;
    --info: #0035b0;
    --info-ink: #04067d;
    --info-soft: #e8efff;
    --info-soft-border: #0035b0;
    --slate-200: #6b7280;
    --slate-300: #4b5563;
    --fill-slate-200: #e2e8f0;
    --info-rgb: 0, 53, 176;
    --accent-ink-rgb: 4, 6, 125;
    /* read as var(--x, literal) and never defined by ROI Blue: the literal's token, in this palette */
    --brand: var(--accent-600);
    --dash-tile: var(--slate-50);
    --border-soft: var(--tone-eef2f7);
    /* focus: a solid ring, white then black, that shows on any ground */
    --focus-ring: 0 0 0 2px #ffffff, 0 0 0 5px #000000;
    --focus-outline: 3px solid #000000;
}
:root[data-palette="high-contrast"] body.theme-dark {
    /* every ramp, role and tone through the dark curve (the ramps are the same in both modes elsewhere;
       High contrast lifts the light steps dark rules write text in) */
    --accent-50: #fffeff;
    --accent-100: #f9fbff;
    --accent-200: #e9f4fe;
    --accent-300: #b2d6ff;
    --accent-400: #73b1fe;
    --accent-500: #3b82f6;
    --accent-600: #2563eb;
    --accent-700: #1d4ed8;
    --accent-800: #1e40af;
    --accent-900: #1e3a8a;
    --accent-950: #172554;
    --accent-rgb: 37, 99, 235;
    --accent-50-rgb: 255, 254, 255;
    --accent-100-rgb: 249, 251, 255;
    --accent-200-rgb: 233, 244, 254;
    --accent-300-rgb: 178, 214, 255;
    --accent-400-rgb: 115, 177, 254;
    --accent-500-rgb: 59, 130, 246;
    --accent-700-rgb: 29, 78, 216;
    --accent-800-rgb: 30, 64, 175;
    --accent-900-rgb: 30, 58, 138;
    --accent-950-rgb: 23, 37, 84;
    --brand-nav: #285cf3;
    --brand-nav-rgb: 40, 92, 243;
    --accent-mid: #2a78d6;
    --accent-mid-rgb: 42, 120, 214;
    --accent-mid-hi: #3987e5;
    --accent-mid-hi-rgb: 57, 135, 229;
    --accent-wash: #fdfefe;
    --accent-wash-rgb: 253, 254, 254;
    --accent-hover-border: #eaf1fe;
    --accent-note-bg: #16304d;
    --accent-note-border: #2c5a8f;
    --accent-note-ink: #bcdbfe;
    --ink-heading: #1e3a5f;
    --accent-bright: #83b6fe;
    --accent-bright-rgb: 131, 182, 254;
    --accent-tint: #fefeff;
    --slate-50: #feffff;
    --slate-100: #fffefe;
    --slate-200: #f7fbff;
    --slate-300: #e5f1fc;
    --slate-400: #a8b8cd;
    --slate-500: #64748b;
    --slate-600: #475569;
    --slate-700: #334155;
    --slate-800: #1e293b;
    --slate-900: #0f172a;
    --slate-950: #020617;
    --slate-50-rgb: 254, 255, 255;
    --slate-400-rgb: 168, 184, 205;
    --slate-500-rgb: 100, 116, 139;
    --slate-900-rgb: 15, 23, 42;
    --gray-50: #feffff;
    --gray-100: #fefeff;
    --gray-200: #f7fbfd;
    --gray-300: #edf0f7;
    --gray-400: #b2b8c4;
    --gray-500: #6b7280;
    --gray-600: #4b5563;
    --gray-700: #374151;
    --gray-800: #1f2937;
    --gray-900: #111827;
    --gray-950: #030712;
    --gray-400-rgb: 178, 184, 196;
    --gray-500-rgb: 107, 114, 128;
    --zinc-50: #feffff;
    --zinc-100: #fefeff;
    --zinc-200: #f8f9fd;
    --zinc-300: #eef0f2;
    --zinc-400: #b5b6bf;
    --zinc-500: #71717a;
    --zinc-600: #52525b;
    --zinc-700: #3f3f46;
    --zinc-800: #27272a;
    --zinc-900: #18181b;
    --zinc-950: #09090b;
    --azia-ink: #1c273c;
    --azia-ink-rgb: 28, 39, 60;
    --azia-ink-soft: #596882;
    --azia-muted: #7987a1;
    --azia-muted-rgb: 121, 135, 161;
    --dk-control: #3c3c3c;
    --dk-control-border: #4f4f55;
    --dk-chip-ink: #e7e5e7;
    --dk-line: #3a3a3a;
    --dk-panel: #252526;
    --tone-0b1220: #0b1220;
    --tone-0f1724: #0f1724;
    --tone-101828: #101828;
    --tone-101828-rgb: 16, 24, 40;
    --tone-132039: #132039;
    --tone-172033: #172033;
    --tone-17223a: #17223a;
    --tone-17284a: #17284a;
    --tone-1e1e1e: #1e1e1e;
    --tone-1f1f23: #1f1f23;
    --tone-202023: #202023;
    --tone-202023-rgb: 32, 32, 35;
    --tone-212529: #212529;
    --tone-22375c: #22375c;
    --tone-2a2a2d: #2a2a2d;
    --tone-2a4d7a: #2a4d7a;
    --tone-2c3039: #2c3039;
    --tone-333333: #333333;
    --tone-33333a: #33333a;
    --tone-3366ff: #3366ff;
    --tone-3366ff-rgb: 51, 102, 255;
    --tone-35507d: #35507d;
    --tone-3a3a3c: #3a3a3c;
    --tone-4a597a: #4a597a;
    --tone-555555: #555555;
    --tone-566274: #566274;
    --tone-566274-rgb: 86, 98, 116;
    --tone-5b6b88: #5b6b88;
    --tone-666666: #666666;
    --tone-888888: #888888;
    --tone-8a8a8a: #8c8b8b;
    --tone-8ab4f8: #a0c4fe;
    --tone-8fbcf0: #a1cdfe;
    --tone-93b4ff: #abc5fe;
    --tone-999999: #a9a8a8;
    --tone-a3acb9: #bdc5d2;
    --tone-b4b4bc: #d1d0d7;
    --tone-b6c2d4: #d3e0f1;
    --tone-bcd7ff: #d7e8ff;
    --tone-bfd3f6: #e4effe;
    --tone-c6d6e8: #e5f1ff;
    --tone-c8d7ea: #e6f2ff;
    --tone-cccccc: #eae9e8;
    --tone-cfcfcf: #edebed;
    --tone-dbe1ea: #f2f8ff;
    --tone-dbe3ee: #f3f9fe;
    --tone-dbe7ff: #f9fafe;
    --tone-dddddd: #f4f6f4;
    --tone-e0edff: #fbfcff;
    --tone-e1e5ea: #f5fafe;
    --tone-e8eef6: #fafdff;
    --tone-eaf2ff: #fcfefe;
    --tone-ececee: #fcfcfe;
    --tone-ececee-rgb: 252, 252, 254;
    --tone-eeeeee: #fcfdfc;
    --tone-eef1f6: #fefdff;
    --tone-eef2f7: #fcfefe;
    --tone-f3f6ff: #fdfffe;
    --tone-f4f5fb: #fffeff;
    --tone-f4f5fb-rgb: 255, 254, 255;
    --tone-f4f7fb: #fdfffe;
    --tone-f4f7fb-rgb: 253, 255, 254;
    --tone-f5f5f5: #fffeff;
    --tone-f7faff: #feffff;
    --tone-f8faff: #feffff;
    --tone-f8faff-rgb: 254, 255, 255;
    --tone-f9fafc: #feffff;
    --tone-fbfbfd: #fffffe;
    --bg: #000000;
    --surface-light: #000000;
    --surface: #0d0d0d;
    --surface-alt: #121212;
    --surface-sunken: #000000;
    --surface-strong: #ffffff;
    --text: #ffffff;
    --text-body: #f5f5f5;
    --text-muted: #e0e0e0;
    --text-soft: #d0d0d0;
    --text-faint: #c4c4c4;
    --accent: #0035b0;
    --accent2: #0012a6;
    --accent-ink: #a8c8ff;
    --accent-soft: #0f1f45;
    --accent-soft-border: #a8c8ff;
    --border-subtle: #3d3d45;
    --border: #72727c;
    --border-strong: #8e8e98;
    --border-emphasis: #c8c8d0;
    --success-ink: #86efac;
    --warning-ink: #fcd34d;
    --danger-ink: #fca5a5;
    --header-bg: #000000;
    --header-border: #ffffff;
    --nav-active-bg: #0f1f45;
    --nav-active-ink: #ffffff;
    --nav-active-border: #a8c8ff;
    --logo-roi: #a8c8ff;
    --logo-sight: #ffffff;
    --info-ink: #a8c8ff;
    --info-soft: #0f1f45;
    --info-soft-border: #a8c8ff;
    --info: #a8c8ff;
    --dk-panel: #121212;
    --brand-nav: #0035b0;
    --fill-slate-200: initial;
    --fill-border: #4a4a52;
    --dk-line: #72727c;
    --gray-600: #72727c;
    --gray-700: #72727c;
    --zinc-600: #72727c;
    --zinc-700: #72727c;
    --fill-zinc-700: #3f3f46;
    --brand-nav-rgb: 0, 53, 176;
    --info-rgb: 168, 200, 255;
    --accent-ink-rgb: 168, 200, 255;
    --focus-ring: 0 0 0 2px #000000, 0 0 0 5px #ffffff;
    --focus-outline: 3px solid #ffffff;
}

/* ── LOW BLUE ── */
:root[data-palette="low-blue"] {
    /* accent ramp: 600 is --accent */
    --accent-50: #fff4e3;
    --accent-100: #f4e7d2;
    --accent-200: #e9d6b8;
    --accent-300: #e5b98c;
    --accent-400: #d39651;
    --accent-500: #9c6001;
    --accent-600: #995c01;
    --accent-700: #864f01;
    --accent-800: #6d4101;
    --accent-900: #5d3800;
    --accent-950: #3d2201;
    --accent-rgb: 153, 92, 1;
    --accent-50-rgb: 255, 244, 227;
    --accent-100-rgb: 244, 231, 210;
    --accent-200-rgb: 233, 214, 184;
    --accent-300-rgb: 229, 185, 140;
    --accent-400-rgb: 211, 150, 81;
    --accent-500-rgb: 156, 96, 1;
    --accent-700-rgb: 134, 79, 1;
    --accent-800-rgb: 109, 65, 1;
    --accent-900-rgb: 93, 56, 0;
    --accent-950-rgb: 61, 34, 1;
    --accent-ink-rgb: 134, 79, 1;
    /* accent roles */
    --brand-nav: #995d00;
    --brand-nav-rgb: 153, 93, 0;
    --accent-mid: #aa6700;
    --accent-mid-rgb: 170, 103, 0;
    --accent-mid-hi: #bb771e;
    --accent-mid-hi-rgb: 187, 119, 30;
    --accent-wash: #fdf1db;
    --accent-wash-rgb: 253, 241, 219;
    --accent-hover-border: #e2d4bb;
    --accent-note-bg: #412a11;
    --accent-note-border: #785022;
    --accent-note-ink: #dec1a5;
    --ink-heading: #503315;
    --accent-bright: #d99a56;
    --accent-bright-rgb: 217, 154, 86;
    --accent-tint: #fef3dd;
    /* neutral ramps, leaning the theme's way */
    --slate-50: #fff9f1;
    --slate-100: #fff3e1;
    --slate-200: #f2e6d3;
    --slate-300: #e0d2bf;
    --slate-400: #7a6c5a;
    --slate-500: #7a6c5a;
    --slate-600: #5c5342;
    --slate-700: #483f2e;
    --slate-800: #312719;
    --slate-900: #1f1607;
    --slate-950: #0b0601;
    --slate-50-rgb: 255, 249, 241;
    --slate-400-rgb: 122, 108, 90;
    --slate-500-rgb: 122, 108, 90;
    --slate-900-rgb: 31, 22, 7;
    --gray-50: #fff9f1;
    --gray-100: #fef3dd;
    --gray-200: #f1e6d0;
    --gray-300: #e0d3c0;
    --gray-400: #746d64;
    --gray-500: #746d64;
    --gray-600: #5c5346;
    --gray-700: #493f31;
    --gray-800: #30271a;
    --gray-900: #1f1709;
    --gray-950: #0d0600;
    --gray-400-rgb: 116, 109, 100;
    --gray-500-rgb: 116, 109, 100;
    --zinc-50: #fefaef;
    --zinc-100: #fef3e0;
    --zinc-200: #efe3ce;
    --zinc-300: #dfd3bf;
    --zinc-400: #777168;
    --zinc-500: #777168;
    --zinc-600: #585249;
    --zinc-700: #443f37;
    --zinc-800: #2a2720;
    --zinc-900: #1b1811;
    --zinc-950: #0b0905;
    --azia-ink: #312513;
    --azia-ink-rgb: 49, 37, 19;
    --azia-ink-soft: #72664f;
    --azia-muted: #776d57;
    --azia-muted-rgb: 119, 109, 87;
    --dk-control: #3f3c33;
    --dk-control-border: #544f46;
    --dk-chip-ink: #d2c7b2;
    --dk-line: #3d3a31;
    --dk-panel: #2a241f;
    /* light-mode roles */
    --bg: #fdefdb;
    --surface: #fef5e5;
    --surface-sunken: #f7e9d4;
    --surface-strong: #1f1607;
    --text: #1f1607;
    --text-body: #312719;
    --text-muted: #5c5342;
    --text-soft: #696052;
    --text-faint: #7a6c5a;
    --accent: #995c01;
    --accent2: #864f01;
    --accent-ink: #864f01;
    --accent-soft: #fef3dd;
    --accent-soft-border: #e7d6bc;
    --surface-accent-soft: #fff2df;
    --border-subtle: #f8ead5;
    --border: #ecdfca;
    --border-strong: #cabfaa;
    --border-emphasis: #988d7a;
    /* the header: a ground in the theme's palest step, so the theme shows from the first glance */
    --header-bg: var(--accent-50);
    --header-border: var(--accent-100);
    --logo-roi: #4b2b01;
    /* one-off tones (var(--tone-<hex>, literal) in the sheets) */
    --tone-0b1220: #181106;
    --tone-0f1724: #1c160a;
    --tone-101828: #1f1708;
    --tone-101828-rgb: 31, 23, 8;
    --tone-132039: #2b1e08;
    --tone-172033: #271f10;
    --tone-17223a: #2b210c;
    --tone-17284a: #3c2309;
    --tone-1e1e1e: #231d17;
    --tone-1f1f23: #221f19;
    --tone-202023: #232019;
    --tone-202023-rgb: 35, 32, 25;
    --tone-212529: #28241e;
    --tone-22375c: #4b3216;
    --tone-2a2a2d: #2d2a23;
    --tone-2a4d7a: #664521;
    --tone-2c3039: #352f28;
    --tone-333333: #38322c;
    --tone-33333a: #38332b;
    --tone-3366ff: #a66501;
    --tone-3366ff-rgb: 166, 101, 1;
    --tone-35507d: #6a4927;
    --tone-3a3a3c: #3d3a32;
    --tone-4a597a: #67573b;
    --tone-555555: #58554c;
    --tone-566274: #696052;
    --tone-566274-rgb: 105, 96, 82;
    --tone-5b6b88: #786852;
    --tone-666666: #69665c;
    --tone-888888: #766d59;
    --tone-8a8a8a: #766d5b;
    --tone-8ab4f8: #dba979;
    --tone-8fbcf0: #dab188;
    --tone-93b4ff: #dfab75;
    --tone-999999: #756d5a;
    --tone-a3acb9: #766d5b;
    --tone-b4b4bc: #c0b3a0;
    --tone-b6c2d4: #cdbfad;
    --tone-bcd7ff: #eed0b2;
    --tone-bfd3f6: #e1d0b2;
    --tone-c6d6e8: #ded3c0;
    --tone-c8d7ea: #e1d4bf;
    --tone-cccccc: #d6cbb6;
    --tone-cfcfcf: #d9ceb9;
    --tone-dbe1ea: #ecdfca;
    --tone-dbe3ee: #ece1ce;
    --tone-dbe7ff: #f2e5d0;
    --tone-dddddd: #e7dcc7;
    --tone-e0edff: #f8ead6;
    --tone-e1e5ea: #f0e3cf;
    --tone-e8eef6: #f8ecd9;
    --tone-eaf2ff: #fcf0dd;
    --tone-ececee: #f6ebd8;
    --tone-ececee-rgb: 246, 235, 216;
    --tone-eeeeee: #f8edd8;
    --tone-eef1f6: #fdefdb;
    --tone-eef2f7: #fdf0dd;
    --tone-f3f6ff: #fff5e4;
    --tone-f4f5fb: #fff4e3;
    --tone-f4f5fb-rgb: 255, 244, 227;
    --tone-f4f7fb: #fef6e6;
    --tone-f4f7fb-rgb: 254, 246, 230;
    --tone-f5f5f5: #fef4e3;
    --tone-f7faff: #fff9f1;
    --tone-f8faff: #fefaef;
    --tone-f8faff-rgb: 254, 250, 239;
    --tone-f9fafc: #fefaef;
    --tone-fbfbfd: #fefbf4;
    /* read as var(--x, literal) and never defined by ROI Blue: the literal's token, in this palette */
    --brand: var(--accent-600);
    --dash-tile: var(--slate-50);
    --border-soft: var(--tone-eef2f7);
    /* Low blue: the card is warm paper, not white (ROI Blue's #fff is a pole no palette moves) */
    --surface-alt: #fef8ea;
    --surface-light: #fef8ea;
}
:root[data-palette="low-blue"] body.theme-dark {
    --bg: #19160e;
    --surface-light: #19160e;
    --surface: #232019;
    --surface-alt: #292620;
    --surface-sunken: #1e1b13;
    --surface-strong: #f0e5d0;
    --text: #f6ebd8;
    --text-body: #dfd3bf;
    --text-muted: #c1b4a0;
    --text-soft: #a99c8a;
    --text-faint: #9c907f;
    --accent: #995c01;
    --accent2: #864f01;
    --accent-ink: #d39e64;
    --accent-soft: #352810;
    --accent-soft-border: #614422;
    --border-subtle: #34302a;
    --border: #3f3a33;
    --border-strong: #5d564e;
    --border-emphasis: #797167;
    --accent-ink-rgb: 211, 158, 100;
    /* the dark header: the card's luminance with a stronger lean, so the theme reads in dark too */
    --header-bg: #2e2518;
    --header-border: #433b2e;
    --logo-roi: #d5a067;
    /* the shared greys and inks the light block deepened, as they are in dark (text on dark grounds) */
    --slate-500: #7e715f;
    --slate-500-rgb: 126, 113, 95;
    --gray-500: #777167;
    --gray-500-rgb: 119, 113, 103;
    --azia-muted: #918570;
    --azia-muted-rgb: 145, 133, 112;
    --slate-400: #ada08d;
    --slate-400-rgb: 173, 160, 141;
    --gray-400: #ada18f;
    --gray-400-rgb: 173, 161, 143;
    --zinc-400: #ada08e;
    --tone-888888: #918774;
    --tone-8a8a8a: #938977;
    --tone-999999: #a29886;
    --tone-a3acb9: #b5aa97;
    --accent-500: #bd7501;
    --accent-500-rgb: 189, 117, 1;
    --accent-mid: #ad6800;
    --accent-mid-rgb: 173, 104, 0;
}

/* ── Links azia-slim.css paints #3366ff (a vendor sheet we never edit): the theme's tone instead. :where() keeps
   this at azia's own weight (0,0,1), so every rule of ours that colours a link still wins. ── */
:where(html[data-palette]) a:where(:not([class])) { color: var(--tone-3366ff, #3366ff); }

/* ── High contrast underlines link-style text, so a link is told from text by more than colour (WCAG 1.4.1), as
   the theme for low vision promises. Graphite, whose grey accent first needed it, went on 2026-10-30 (the owner:
   only High contrast and Indigo stay, and Low blue joins); High contrast keeps every rule. The plain links in the
   page's content first. ── */
:root[data-palette="high-contrast"] #pageContent a:where(:not([class])) { text-decoration: underline; }
/* …and the classed controls of ours that read as links in a line of text: a record's name in a table cell or an
   empty state, a dashboard link, a tile's See what… line (round 4). Boxed buttons keep their box and no underline. */
:root[data-palette="high-contrast"] :is(.agency-customer-link, td > .agency-linkbtn, .agency-empty .agency-linkbtn, .agency-dash-link, .agency-tile-go) { text-decoration: underline; }
/* …and the report pages' (round 6, 2026-10-29): the Overview's links, the inspection report numbers on Predictive
   and Violations, the policies table's PDF link. #pageContent, to beat #pageContent .ov-link's none. The PDF
   link's WORD only (round 7): an underline on the link ran under its page icon and the gap before PDF. */
:root[data-palette="high-contrast"] #pageContent :is(.ov-link, .pred-insp-report-link, .agency-doc-cell-link .agency-doc-label) { text-decoration: underline; }

/* ── High contrast, light: the dashboards' cards and tiles are white on a white page, edged by --dash-line, which
   is slate-200 (1.23:1) in light: the faintest edges in the theme, which promises stronger borders. The strong
   border, as every other card of the theme has and as dark mode already gives --dash-line (round 4). Scoped to
   the two dashboards: the account page's bar tracks read --dash-line too, as a fill under the accent. Round 6
   made slate-200 itself the theme's border (4.8:1); the dashboards keep the strong one. ── */
:root[data-palette="high-contrast"] body:not(.theme-dark) :is(.agency-dash, .carrier-dash) { --dash-line: var(--border-strong); }

/* ── High contrast: the boxes no token reaches (round 6, 2026-10-29; both modes since round 7). The line greys
   above edge most boxes now; these are edged with a see-through accent or grey (rgba(var(--accent-rgb), 0.1) and
   kin, 1.1 to 2.3:1 in either mode) or a pale or dark status literal. The theme's border, and a status box the
   strong ink of its status (the deep one in light, the pale one in dark), so it keeps its meaning.
   e2e/palette-themes.mjs's edge scan walks the main screens in both modes and fails any boxed edge under 3:1.
   BODY IN EITHER MODE: body:is(.theme-dark, :not(.theme-dark)) keeps the weight the light-only rules had, which
   also beats the dark rules' body.theme-dark .x. ── */
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) :is(.oa-item, .analytics-basic-history-item, .analytics-gap-row, .boc3-history-item, .acord25-toolbar, .score-info-bubble, .insurance-table, .insurance-table th, .insurance-table td),
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) #basicsSummaryTable :is(.violations-table, .violations-table th, .violations-table td) { border-color: var(--border); }
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) :is(.admin-panel-notice, .claim-entry.is-mine) { border-color: var(--accent-soft-border); }
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) .pred-sug-card-alert { border-color: var(--danger-ink); }
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) .se-note { border-color: var(--warning-ink); }
:root[data-palette="high-contrast"] body:is(.theme-dark, :not(.theme-dark)) #pageContent .claim-list .claim-group-row.is-loose td { border-top-color: var(--warning-ink); }
/* …the dark side of that one is !important in report-detail.css (as the dark table rules are), so its twin is too. */
:root[data-palette="high-contrast"] body.theme-dark #pageContent .claim-list .claim-group-row.is-loose td { border-top-color: var(--warning-ink) !important; }

/* ── High contrast, light: the admin users table is the one table of ours wearing azia's .table, whose heads are
   its #7987a1 literal (3.5:1 on the head row), a vendor sheet no token reaches. Its muted ink (2026-10-28).
   Low blue too (2026-10-30): it promises AA for every pair. ── */
:root[data-palette="high-contrast"] body:not(.theme-dark) .admin-users-table thead th,
:root[data-palette="low-blue"] body:not(.theme-dark) .admin-users-table thead th { color: var(--text-muted); }

/* ── Low blue, light (2026-10-30): what ROI Blue paints white is paper here, as its card is. ROI Blue's card is
   #fff and these paint #fff as a literal (a pole no token moves), so in Low blue they stood out as the brightest,
   bluest light on the screen. The paper token instead. The paper the app shows as paper keeps its white (the
   ACORD sheet and its canvases, the email preview, a signature), and so does a switch's knob.
   THE PANELS (dialogs, menus, side cards, result lists): at a weight that beats their own rules. */
:root[data-palette="low-blue"] body:not(.theme-dark) :is(.modal-content, .confirm-dialog, .export-pdf-modal, .agency-modal-panel, .acord25-modal,
  .pred-add-modal-content, .dashboard-sidebar, .nav-user-dropdown, .carrier-search-results, #carrierSearchResults, .admin-summary-card,
  .predictive-basic-card, .pred-sug-card, .pred-driver-card, .pred-plan-step, .coi-form-card, .coi-fill-section, .acord25-coi-card,
  .score-info-bubble, .incident-detail-panel, .font-onboard-card, .prospect-mini-panel, .carrier-load-progress-dialog,
  .fmcsa-outage-dialog, .app-stale-panel, .initial-loading) { background-color: var(--surface-alt); }
/* THE DASHBOARDS' cards and tiles read --dash-surface, #fff in light (report-detail.css). */
:root[data-palette="low-blue"] body:not(.theme-dark),
:root[data-palette="low-blue"] body:not(.theme-dark) :is(.agency-dash, .carrier-dash) { --dash-surface: var(--surface-alt); }
/* THE HEADER'S CONTROLS AND THE RESULT ROWS: at their own weight (:where() adds none, and this sheet loads after
   theirs), so a hover, focus or chosen state of theirs still wins, as on ROI Blue's white. */
/* (A selector list, not :is(): :is() would lend every one the weight of its weightiest, and beat their states.) */
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .nav-user,
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .nav-theme-toggle,
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .carrier-search-result,
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .carrier-search-empty,
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .sidebar-anchor-link,
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) .ch-history-table tbody tr:nth-child(odd) td { background-color: var(--surface-alt); }
/* …the Switch customer hits, which components.css makes white with !important in light (the arrowed-to one is told
   by its bar, not its ground). */
:root[data-palette="low-blue"] body:not(.theme-dark) .sidebar-search-card button.agency-header-hit { background: var(--surface-alt) !important; }
/* THE WHITE FIELDS AND BUTTONS (2026-10-30, round 1 of verification): the header's two search fields (#fff
   !important in components.css and main.css, so a rule here lost), the customer tab row, the dialogs' and walks'
   fields and buttons, the Add violation search and results, a policy's ACORD button, Export PDF's Cancel, the
   out-of-date dialog's quiet button and the admin's Edit and Delete read var(--control-bg, #fff) in their own
   rules, at their own weight, so an active tab or a primary button still wears the accent. Set here for Low blue
   light only; every other palette leaves it unset, so their #fff stays, pixel for pixel. */
:root[data-palette="low-blue"] body:not(.theme-dark) { --control-bg: var(--surface-alt); }
/* THE REPORT PAGES' TAB STRIP (2026-10-30, round 2 of verification): below 992px azia paints .az-header-menu #fff
   (its phone drawer's ground) and our sheets set it in the header's flow as a row of its own, so at 768 and 390 it
   was a full-width white band between the warm header and the paper, on every report page. The header shows
   through, as dark mode has it (dark-mode.css). Low blue only: ROI Blue's header is #fff, and Indigo stays as at
   436fceb. */
:root[data-palette="low-blue"] body:not(.theme-dark) .az-header.app-header .app-header-menu { background-color: transparent; }
/* …and a placeholder the sheets leave to Chrome (#757575, 4.35:1 on the paper; 4.61 on white): the faint ink, which
   clears 4.5:1 on the paper. :where() keeps it at an element's weight, so a sheet's own placeholder ink still wins. */
:where(:root[data-palette="low-blue"] body:not(.theme-dark)) :is(input, textarea)::placeholder { color: var(--text-faint); opacity: 1; }
/* THE ADMIN USERS TABLE'S CELLS: azia's .table writes #3b4863, a slate blue no token reaches (its heads are
   warmed above). The body ink. */
:root[data-palette="low-blue"] body:not(.theme-dark) .admin-users-table { color: var(--text-body); }
/* …and its rules: azia's .table draws them #cdd4e0, a cool slate under the head row and between rows (round 2 of
   verification). The warm step at that weight. */
:root[data-palette="low-blue"] body:not(.theme-dark) .admin-users-table :is(th, td) { border-top-color: var(--slate-300); }
:root[data-palette="low-blue"] body:not(.theme-dark) .admin-users-table thead th { border-bottom-color: var(--slate-300); }
/* THE DONUT'S FIRST SLICE is the accent (report-detail.css), which here is a brown at the luminance of the fourth
   slice's #c2410c beside it (1.04:1), two warm hues hard to tell apart, the more so for red-green colour blindness.
   A step darker in light and lighter in dark, so lightness tells them apart as hue does in ROI Blue. */
:root[data-palette="low-blue"] body:not(.theme-dark) .agency-donut-c0 { stroke: var(--accent-800); background: var(--accent-800); }
:root[data-palette="low-blue"] body.theme-dark .agency-donut-c0 { stroke: var(--accent-400); background: var(--accent-400); }
/* THE ONE-HUE BARS (premium by line and by carrier, the leaderboards, the usage heatmap) read --dash-bar, ROI
   Blue's mid blue: a bar of one hue says nothing by its colour, so here it is the warm accent's mid step. The
   calendar's renewal dots and edges read --dash-bar too, beside amber X-dates, green events and violet Outlook
   items: a category there, so they keep the blue (the semantic colours stay, as in every palette). */
:root[data-palette="low-blue"] body:not(.theme-dark) :is(.agency-bar-fill, .agency-lb-fill, .usage-heat-cell, .usage-heat-swatch) { --dash-bar: var(--accent-mid); }
:root[data-palette="low-blue"] body.theme-dark :is(.agency-bar-fill, .agency-lb-fill, .usage-heat-cell, .usage-heat-swatch) { --dash-bar: var(--accent-mid-hi); }
/* …and the out-of-date dialog's key caps: azia's kbd writes them white, on a pale step here (1.1:1; ROI Blue
   keeps that, the default must not move). The page's ink. */
:root[data-palette="low-blue"] body:not(.theme-dark) .app-stale-keys kbd { color: var(--text); }
/* …and the claims list's Information needed chip: its amber ink on its 18% amber wash reads the paper through the
   wash (4.43:1). The same status amber, a step deeper, to clear AA over the paper (the generator works it out). */
:root[data-palette="low-blue"] body:not(.theme-dark) .claim-status.is-info { color: #876001; }

/* ── Native checkboxes, radios and sliders: Chrome draws them in its own blue (#0075ff) whatever the palette, and
   about a hundred of ours set no accent-color. It inherits, so set here it reaches every control that does not set
   its own (those already read the accent). ROI Blue has no attribute: its controls stay as at 6adb15c. Dark takes
   the lifted ink for every one of them, those with their own var(--accent) too, as the deep accent is 2.14:1 on
   High contrast's black (2026-10-28, round 3). ── */
:root[data-palette] { accent-color: var(--accent); }
:root[data-palette] body.theme-dark,
:root[data-palette] body.theme-dark :is(input[type="checkbox"], input[type="radio"], input[type="range"]) { accent-color: var(--accent-ink); }

/* ── High contrast: the header's two search fields. A rule at vendor weight takes their focus halo away
   (box-shadow: none !important) and their edge was 1.61:1 light, 2.82:1 dark, on 6adb15c too. The palette's
   strong edge and its solid focus outline, which High contrast promises (round 3). Ids, to beat dark mode's
   #dotNumberPersistent rule. ── */
:root[data-palette="high-contrast"] #dotNumberPersistent,
:root[data-palette="high-contrast"] #agencyHeaderSearch { border-color: var(--border-strong) !important; }
:root[data-palette="high-contrast"] #dotNumberPersistent:focus-visible,
:root[data-palette="high-contrast"] #agencyHeaderSearch:focus-visible { outline: var(--focus-outline) !important; outline-offset: 2px !important; }

/* ── The picker's previews (Settings): each swatch paints its own theme in both modes, from these, whatever the
   page wears. Values resolved from the blocks above, so a swatch shows exactly what picking it gives. ── */
.palette-swatch[data-pv="roi-blue"] .palette-pv-light { --pv-head: #ffffff; --pv-head-ink: #1c273c; --pv-tab: #ffffff; --pv-tab-ink: #285cf3; --pv-logo: #08306b; --pv-bg: #eef1f6; --pv-card: #ffffff; --pv-line: #b6c1d1; --pv-ink: #0f172a; --pv-muted: #475569; --pv-btn: #2563eb; --pv-link: #1d4ed8; }
.palette-swatch[data-pv="roi-blue"] .palette-pv-dark { --pv-head: #26262a; --pv-head-ink: #d4d4d8; --pv-tab: #202023; --pv-tab-ink: #6ea8fe; --pv-logo: #7dabf8; --pv-bg: #161618; --pv-card: #26262a; --pv-line: #565663; --pv-ink: #ececee; --pv-muted: #b5b5bc; --pv-btn: #2563eb; --pv-link: #7aa9f7; }
.palette-swatch[data-pv="indigo"] .palette-pv-light { --pv-head: #f3f5fe; --pv-head-ink: #24253c; --pv-tab: #ffffff; --pv-tab-ink: #634ef3; --pv-logo: #2d296c; --pv-bg: #f0f0fa; --pv-card: #ffffff; --pv-line: #bdbfd1; --pv-ink: #16152b; --pv-muted: #525269; --pv-btn: #6555ec; --pv-link: #5541d8; }
.palette-swatch[data-pv="indigo"] .palette-pv-dark { --pv-head: #232538; --pv-head-ink: #d2d4de; --pv-tab: #1f2026; --pv-tab-ink: #9a9efe; --pv-logo: #9fa3f7; --pv-bg: #14161d; --pv-card: #25262d; --pv-line: #565663; --pv-ink: #eaecf4; --pv-muted: #b4b5bf; --pv-btn: #6555ec; --pv-link: #9ca1f6; }
.palette-swatch[data-pv="high-contrast"] .palette-pv-light { --pv-head: #ffffff; --pv-head-ink: #000000; --pv-tab: #e8efff; --pv-tab-ink: #04067d; --pv-logo: #020b5a; --pv-bg: #ffffff; --pv-card: #ffffff; --pv-line: #4b5563; --pv-ink: #000000; --pv-muted: #1f2937; --pv-btn: #0035b0; --pv-link: #04067d; }
.palette-swatch[data-pv="high-contrast"] .palette-pv-dark { --pv-head: #000000; --pv-head-ink: #f5f5f5; --pv-tab: #0f1f45; --pv-tab-ink: #ffffff; --pv-logo: #a8c8ff; --pv-bg: #000000; --pv-card: #121212; --pv-line: #8e8e98; --pv-ink: #ffffff; --pv-muted: #e0e0e0; --pv-btn: #0035b0; --pv-link: #a8c8ff; }
.palette-swatch[data-pv="low-blue"] .palette-pv-light { --pv-head: #fff4e3; --pv-head-ink: #312513; --pv-tab: #ffffff; --pv-tab-ink: #995d00; --pv-logo: #4b2b01; --pv-bg: #fdefdb; --pv-card: #fef8ea; --pv-line: #cabfaa; --pv-ink: #1f1607; --pv-muted: #5c5342; --pv-btn: #995c01; --pv-link: #864f01; }
.palette-swatch[data-pv="low-blue"] .palette-pv-dark { --pv-head: #2e2518; --pv-head-ink: #dfd3bf; --pv-tab: #232019; --pv-tab-ink: #d99a56; --pv-logo: #d5a067; --pv-bg: #19160e; --pv-card: #292620; --pv-line: #5d564e; --pv-ink: #f6ebd8; --pv-muted: #c1b4a0; --pv-btn: #995c01; --pv-link: #d39e64; }
