  :root{
    /* The void behind the galaxy.
       Separate from --bg on purpose. --bg is the charcoal floor that panels,
       overlays and controls sit on, and it leans violet by construction: at
       #0a090c red sits ABOVE green with blue on top, which is a magenta bias,
       and spread across an empty screen that reads as a purple wash rather
       than as space. Here red sits below green instead, so the cast is cold
       rather than violet, and the whole thing is darker — deep sky is close to
       black, and the colour in it belongs to the stars and the nebula, not to
       the emptiness between them. */
    --void:#07080b;
    /* Warm charcoal command floor */
    --bg:#0a090c;
    --bg-elev:#100f14;
    --bg-panel:#131218;
    --fg:#eceae6;
    --fg-soft:#c4c0b8;
    /* Tonal violet signal.
       One hue at six values, desaturating as it darkens, so violet can be a
       surface, an edge or a highlight and not only "the accent". --accent and
       --accent-deep are rungs on this ladder, not separate colours, so nothing
       that already points at them changes value. */
    --v-100:#efe9f7;
    --v-200:#cdc0e0;
    --v-300:#a892c6;
    --v-400:#8a6fad;
    --v-500:#5c4a78;
    --v-600:#2a2133;
    --v-700:#171320;
    --accent:var(--v-400);
    --accent-deep:var(--v-500);
    --accent-soft:rgba(138,111,173,.16);
    --signal:var(--accent);
    /* State is value, not hue. Five mid-saturation hue families competing with
       one violet identity read as a template; WORLD had already solved this
       locally and nobody promoted it. Live is bright violet, middling is the
       accent itself, caution is quiet ink. Exactly one true off-hue survives,
       for genuine failure, and that is --neg: every single site that reads it
       is an error, a failure, a fatal, an unavailable or a deletion, so it
       stays the off-hue rather than resolving to the same ink as ordinary
       copy. (--neg was briefly aliased to --fg on 2026-08-14, which rendered
       "bad" identical to "fine" on the status readout, the module error dot
       and every warfront failure line.) --neg-critical is kept as an alias so
       either name resolves. --dem/--rep stay: real political convention, not
       decoration. */
    --pos:var(--v-300);
    --mid:var(--v-400);
    --warn:var(--fg-soft);
    --neg:#d97a82;
    --neg-critical:var(--neg);
    --dem:#7a91c4;
    --rep:#c47a7a;
    /* .62 keeps the dim register while clearing WCAG AA (~6:1 on --bg);
       the old .48 fell below 4.5:1 for small text. */
    --dim:rgba(236,234,230,.62);
    --line:rgba(236,234,230,.10);
    --line-strong:rgba(138,111,173,.28);
    --violet:var(--accent);
    /* Type scale, 1.25. Without it 228 of ~370 sizes sat in the 11-13px mush
       and the shell jumped from the hero straight to 14px. Module h2 to --t-1,
       sub-heads to --t-3, body to --t-5, meta to --t-7. */
    --t-hero:clamp(40px,9vw,104px);
    --t-1:34px;
    --t-2:27px;
    --t-3:21px;
    --t-4:17px;
    --t-5:14px;
    --t-6:12px;
    --t-7:11px;
    /* Weights the fonts actually ship. Cabinet Grotesk loads 400/500/700 and
       Switzer 400/500/600/700, so 450/550/620/640/650/680/720 all snap and the
       tuning they imply is fiction. Display hierarchy is carried by SIZE. */
    --w-body:400;
    --w-emph:500;
    --w-strong:600;
    --w-display:700;
    /* Motion: duration scales with the size of the change, and the curve says
       what kind of change it is. --ease-space is kept as the settle curve so
       the eleven places already using it stay identical. */
    --ease-space:cubic-bezier(.16,1,.3,1);
    --ease-touch:cubic-bezier(.3,.7,.4,1);
    --ease-settle:var(--ease-space);
    --ease-recoil:cubic-bezier(.6,0,.25,1);
    --ease-breath:cubic-bezier(.5,0,.5,1);
    --dur-touch:110ms;
    --dur-state:190ms;
    --dur-shift:320ms;
    --dur-surface:520ms;
    /* Self-hosted Fontshare — display has character; body is quiet workhorse.
       Mono only for real data (times, codes, figures). */
    --font-display:"Cabinet Grotesk",system-ui,sans-serif;
    --font-body:"Switzer",system-ui,sans-serif;
    --font-mono:ui-monospace,"Cascadia Code","SF Mono",Consolas,monospace;
    --orb-ui-opacity:1;
    --brand-zoom-opacity:1;
    --menu-zoom-opacity:.85;
    --radius-control:2px;
    /* Actually tight: small blur, low offset, tinted to --v-700 rather than
       pure black, cast from one direction. The old 28px black bloom is what
       made the router dock and the status readout read as floating cards. */
    --shadow-tight:0 1px 0 rgba(239,233,247,.05),0 3px 8px rgba(23,19,32,.55);
    /* One value per meaning, so module files and controls stop guessing.
       color-scheme was declared in one template only, which is why every
       <select> popup opened as a white list; disabled state was eleven
       different opacities; five module files each invented their own
       clearance under the fixed header. */
    color-scheme:dark;
    --disabled-opacity:.42;
    --module-top-clear:clamp(96px,11vh,136px);
  }
