/* VENDORED kit2 token register — brand style "atw" (At The Well), TOKENS_VERSION 3.40.0.
   Source: firepro/kit2/.generated/tokens/semantic.atw.css (generated by npx run firekit2:tokens).
   Do not hand-edit; re-vendor from a newer pinned version instead. */
/* GENERATED by firepro/kit2/tokenBuild — do not edit — run `npx run firekit2:tokens`. */
html,body{margin:0;padding:0}
*{box-sizing:border-box}
/* ============ LAYER: GLOBAL POLICY · global element wiring, a11y policies and
   choreography. Brand styles never override these; values resolve THROUGH brand style tokens
   (caret-color:var(--accent), divider voice, enter/exit choreography). ============ */
/* ============ POINTER FLOOR — density proposes, the pointer disposes ============ */
:root{--pointer-min:24px}
@media (pointer: coarse){
  :root{--pointer-min:44px}
  button{position:relative}
  button::after{content:"";position:absolute;left:50%;top:50%;width:max(100%,44px);height:max(100%,44px);transform:translate(-50%,-50%)}
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),select{min-height:44px}
}
/* ============ FOCUS POLICY — keyboard gets a ring, pointer doesn't ============ */
:focus{outline:none}
:focus-visible{outline:2px solid var(--accent);outline-offset:var(--ring-offset);border-radius:2px}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;border-color:var(--accent);box-shadow:var(--ring)}
/* ============ DISABLED POLICY — native controls keep token colors; composite/custom
   nodes opt in via data-disabled and take the one opacity ============ */
[data-disabled],[aria-disabled="true"]{opacity:var(--disabled-opacity);cursor:not-allowed;pointer-events:none}
/* ============ ENTRY CHOREOGRAPHY — [data-enter] plays the brand style's entrance on
   one element; [data-choreography="enter"] (the registered archetype axis,
   stamped by collection archetype factories with its resolved value) steps
   the host's children by --stagger-step (first 8; longer lists ride the cap).
   rugged's --enter-dur is 0ms, so it appears instantly. ============ */
[data-enter]{animation:fk-enter var(--enter-dur,160ms) var(--enter-ease,ease) both}
[data-choreography="enter"]>*{animation:fk-enter var(--enter-dur,160ms) var(--enter-ease,ease) both}
[data-choreography="enter"]>:nth-child(2){animation-delay:calc(var(--stagger-step,0ms)*1)}
[data-choreography="enter"]>:nth-child(3){animation-delay:calc(var(--stagger-step,0ms)*2)}
[data-choreography="enter"]>:nth-child(4){animation-delay:calc(var(--stagger-step,0ms)*3)}
[data-choreography="enter"]>:nth-child(5){animation-delay:calc(var(--stagger-step,0ms)*4)}
[data-choreography="enter"]>:nth-child(6){animation-delay:calc(var(--stagger-step,0ms)*5)}
[data-choreography="enter"]>:nth-child(7){animation-delay:calc(var(--stagger-step,0ms)*6)}
[data-choreography="enter"]>:nth-child(8){animation-delay:calc(var(--stagger-step,0ms)*7)}
@keyframes fk-enter{from{opacity:0;transform:var(--enter-from,none)}}
/* ============ FORCED COLORS (Windows High Contrast) ============ */
@media (forced-colors: active){
  :focus-visible{outline:2px solid CanvasText;outline-offset:2px}
  button,input,select,textarea{forced-color-adjust:auto}
}
/* ============ PRINT ============ */
@media print{
  :root{--bg:#ffffff;--surface:#ffffff;--shadow:none;--shadow-1:none;--shadow-2:none;--shadow-3:none;--shadow-4:none}
  nav,[data-print-hide]{display:none !important}
}
/* ============ SELECTION ============ */
::selection{background:var(--selection-bg);color:var(--on-selection)}
/* ============ SCROLLBARS ============ */
*{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}
::-webkit-scrollbar{width:var(--scrollbar-w);height:var(--scrollbar-w)}
::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:var(--radius-pill)}
::-webkit-scrollbar-track{background:var(--scrollbar-track)}
/* ============ REDUCED TRANSPARENCY — glass degrades to solid surface ============ */
@media (prefers-reduced-transparency: reduce){
  .glass{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--surface-ground)}
}
/* ============ BASE ELEMENT WIRING ============ */
/* link voice — rest/hover color, underline presence (BOTH states), thickness/offset/ink
   are all brand-style-owned tokens. Hover underline is NOT hardwired: atw's harvest never
   underlines (rest ink-colored text, hover recolors to brand — At The Well L271-273).

   :where() MAKES THIS A FLOOR. Bare `a:hover` is (0,1,1) and outranked every recipe
   class (0,1,0), so a recipe on an anchor lost color/decoration to prose typography
   on hover — computing its own tokens correctly and never reaching the declaration
   that consumes them. `<Button href>` renders `<a class="btn">`, and this rule
   resolves --link-color-hover to --accent-hover, the same token primary:hover uses
   for --btn-bg: the label became its own background in neutral and rugged.
   The whole compound is wrapped — `:where(a):hover` is still (0,1,0) — so at (0,0,0)
   prose links keep this voice and any recipe that declares the property wins. */
:where(a){color:var(--link-color,var(--accent));text-decoration-line:var(--link-underline-rest,none);text-decoration-style:var(--link-style,solid);text-decoration-thickness:var(--link-thickness,auto);text-underline-offset:var(--link-offset,auto);text-decoration-color:var(--link-ink,currentColor);transition:color var(--dur-1) var(--ease-standard),text-decoration-color var(--dur-1) var(--ease-standard)}
:where(a:hover){color:var(--link-color-hover,var(--accent-hover));text-decoration-line:var(--link-underline-hover,underline);text-decoration-color:var(--link-ink-hover,currentColor)}
input::placeholder,textarea::placeholder{color:var(--text-disabled)}
input[type="checkbox"],input[type="radio"],input[type="range"],progress{accent-color:var(--accent)}
/* native-control completeness — caret, autofill, and a stable scrollbar gutter */
input,textarea,select{caret-color:var(--accent)}
input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus{-webkit-text-fill-color:var(--text);-webkit-box-shadow:0 0 0 40px var(--surface) inset;caret-color:var(--accent)}
html{scrollbar-gutter:stable}
/* text-wrap policy — headings balance, prose gets pretty rag */
h1,h2,h3,legend{text-wrap:balance}
p,li,figcaption{text-wrap:pretty}
/* prose numerals + font grade + code features (.num/[data-num] re-asserts tabular lining) */
body{font-variant-numeric:var(--numerals-prose,normal);font-variation-settings:"GRAD" var(--font-grade,0)}
code,pre,.code{font-feature-settings:var(--features-code,normal)}
/* corner shape — progressive; the brand style's --corner-shape applies where supported */
@supports (corner-shape: squircle){
  .btn::before,.card,.field,.menu{corner-shape:var(--corner-shape,round)}
}
/* view-transition tempo — inert until a consumer adopts the View Transitions API */
::view-transition-old(root),::view-transition-new(root){animation-duration:var(--vt-dur,200ms)}
/* ============ SEMANTIC TOKENS — neutral (default) ============ */
:root{
  --bg:#f0f1f4;
  --surface:#ffffff;
  --surface-2:#f9fafb;
  --surface-3:#f1f3f6;
  --inset:#e9ebef;
  --scrim:rgba(16,24,40,0.45);
  --border:#dde2e8;
  --border-strong:#c6cdd6;
  --border-hover:#9aa5b3;
  --hairline:#eef1f5;
  --surface-raised:#ffffff;
  --inverse-bg:#1a212b;
  --on-inverse:#ffffff;
  --knob:#ffffff;
  --text:#1a212b;
  --text-2:#4d5766;
  --text-3:#5f6b7c;
  --text-quiet:#8b95a3;
  --text-disabled:#9aa3b0;
  --accent:#2f6fed;
  --accent-hover:#2159cc;
  --accent-active:#1c4dad;
  --accent-grad-deep:#2f6fed;
  --on-accent:#ffffff;
  --accent-tint:#e9f0fe;
  --on-accent-tint:#1e4fb8;
  --selection-bg:#BACFF9;
  --on-selection:#1a212b;
  --danger:#d13c3c;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#ffffff;
  --ok:#1a7f4e;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --warn:#b0761f;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --info:#2159cc;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --accent-border:#dbe7fb;
  --info-border:#cddcfa;
  --danger-border:#f0c1c1;
  --ok-border:#c4e4d2;
  --warn-border:#f0dcb2;
  --eyebrow-color:#5f6b7c;
  --chart-1:#5b83d6;
  --chart-1-tint:#c9dbfc;
  --chart-2:#4aa06e;
  --chart-3:#b0761f;
  --chart-4:#8a6dbf;
  --chart-5:#c0705e;
  --chart-6:#7e8a9a;
  --chart-grid:#eef1f5;
  --chart-axis:#5f6b7c;
  --icon-stroke:1.6;
  --icon-stroke-strong:2;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --font-ui:'IBM Plex Sans',sans-serif;
  --font-display:var(--font-headline);
  --font-mono:'IBM Plex Mono',monospace;
  --display-weight:700;
  --display-case:none;
  --display-tracking:-0.01em;
  --btn-case:none;
  --btn-tracking:normal;
  --btn-weight:600;
  --eyebrow-tracking:0.1em;
  --eyebrow-weight:600;
  --eyebrow-style:normal;
  --font-eyebrow:inherit;
  --font-headline:'IBM Plex Sans',sans-serif;
  --type-display-size:26px;
  --type-display-lh:1.15;
  --type-headline-size:19px;
  --type-headline-lh:1.25;
  --type-title-size:15.5px;
  --type-title-lh:1.35;
  --type-title-weight:600;
  --type-body-size:14px;
  --type-body-lh:1.55;
  --type-label-size:13px;
  --type-label-lh:1.35;
  --type-caption-size:12px;
  --type-caption-lh:1.45;
  --type-micro-size:9.5px;
  --type-micro-lh:1.3;
  --type-code-size:12.5px;
  --type-code-lh:1.55;
  --type-eyebrow-size:11px;
  --type-hero-size:clamp(32px,5vw,56px);
  --type-hero-lh:1.08;
  --bw:1px;
  --radius-control:6px;
  --radius-surface:10px;
  --radius-xs:3px;
  --radius-pill:999px;
  --radius-item:0px;
  --run-wash-inset:6px;
  --radius-search:999px;
  --radius-feature:9px;
  --card-clip:none;
  --control-clip:none;
  --section-rule:2px solid #1a212b;
  --menu-radius:6px;
  --menu-pad:0px;
  --item-gap:0px;
  --seg-thumb-radius:6px;
  --seg-thumb-shadow:var(--shadow-1);
  --choice-shadow:var(--shadow-1);
  --card-shadow:var(--shadow-1);
  --choice-radius:6px;
  --slider-thumb-radius:50%;
  --seg-gap:2px;
  --seg-pad:2px;
  --shadow-1:0 1px 3px rgba(16,24,40,0.15);
  --shadow-2:0 4px 14px rgba(16,24,40,0.08);
  --shadow-3:0 8px 24px rgba(16,24,40,0.12);
  --shadow-4:0 24px 60px rgba(16,24,40,0.35);
  --shadow:0 8px 24px rgba(16,24,40,0.12);
  --ring:0 0 0 3px rgba(47,111,237,0.22);
  --ring-danger:0 0 0 3px rgba(209,60,60,0.18);
  --dur-1:90ms;
  --dur-2:160ms;
  --dur-3:260ms;
  --dur-4:360ms;
  --ease-standard:cubic-bezier(0.2,0,0,1);
  --ease-decel:cubic-bezier(0,0,0,1);
  --ease-accel:cubic-bezier(0.3,0,0.8,0.15);
  --spring-damping:0.69;
  --press-transform:scale(0.98);
  --wash-skeleton:linear-gradient(90deg,#eceff3 25%,#f7f8fa 50%,#eceff3 75%);
  --hatch:repeating-linear-gradient(45deg,#eef1f5,#eef1f5 4px,#f7f8fa 4px,#f7f8fa 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#e4edfd,#e4edfd 5px,#eff5ff 5px,#eff5ff 10px);
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --surface-wash:none;
  --media-filter:none;
  --media-overlay:transparent;
  --media-hover-scale:1;
  --scrim-blur:0px;
  --scheme:light;
  --link-color:var(--accent-hover);
  --link-color-hover:var(--text);
  --link-underline-rest:none;
  --link-underline-hover:underline;
  --link-thickness:1px;
  --link-offset:0.14em;
  --link-style:solid;
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --features-code:"zero" 1;
  --numerals-prose:lining-nums;
  --elev-strategy:shadow;
  --chart-stroke:2.2;
  --chart-stroke-2:1.6;
  --chart-dash:3 4;
  --chart-area-opacity:0.6;
  --chart-marker-r:3.6;
  --chart-bar-radius:3px;
  --chart-grid-dash:none;
  --chart-marker-radius:50%;
  --chart-marker-clip:none;
  --chart-marker-transform:none;
  --display-stroke-w:1px;
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --separation:rule;
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --divider-gap-boost:0px;
  --corner-shape:squircle;
  --enter-dur:var(--dur-2);
  --enter-ease:var(--ease-decel);
  --enter-from:translateY(4px) scale(0.99);
  --exit-dur:var(--dur-1);
  --exit-ease:var(--ease-accel);
  --exit-to:translateY(4px) scale(0.99);
  --stagger-step:24ms;
  --vt-style:crossfade;
  --vt-dur:var(--dur-2);
  --route-dur:var(--dur-2);
  --route-dur-long:var(--dur-4);
  --dur-ambient:12000ms;
  --ease-spring:linear(0, 0.0129, 0.0476, 0.0988, 0.1618, 0.2327, 0.308, 0.385, 0.4615, 0.5355, 0.6059, 0.6715, 0.7319, 0.7864, 0.835, 0.8778, 0.9147, 0.9462, 0.9726, 0.9942, 1.0115, 1.0249, 1.035, 1.0421, 1.0468, 1.0493, 1.05, 1.0494, 1.0477, 1.0451, 1.042, 1.0384, 1.0347, 1.0308, 1.027, 1.0233, 1.0198, 1.0165, 1.0135, 1.0107, 1);

  /* DECLARED SUBSET — spacing / size ramps. The --space names are DENSITY-OWNED: these are the comfortable defaults; [data-density="compact"] re-values them (see DENSITY AXIS) */
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:24px;
  --space-6:32px;
  --space-7:48px;
  --space-8:64px;

  /* HALF-STEPS — fine rhythm between ramp steps; prefer whole steps where the design allows */
  --space-half:2px;
  --space-1h:6px;
  --space-2h:10px;
  --space-3h:14px;
  --icon-xs:14px;
  --icon-sm:16px;
  --icon-md:20px;
  --icon-lg:24px;
  --tile-sm:24px;
  --tile-md:32px;
  --tile-lg:40px;
  --tile-xl:48px;

  /* MARKER DOTS — status/marker anatomy; density-invariant */
  --dot-sm:6px;
  --dot-md:8px;
  --dot-lg:12px;

  /* EMPHASIS EDGES — status stripes, selection rings, tab underlines; heavier than --bw by design */
  --stripe-w:3px;
  --ring-w:2px;

  /* SHAPE IDENTITY — full-round pinned as GLOBAL POLICY for identity-bearing control silhouettes (switch track + thumb; the radio dot's 50% twin); never brand-style-writable */
  --radius-round:999px;

  /* TOAST HIT-AREA — inline action block pad to the pointer floor; pulled back 1:1 as margin-block */
  --toast-action-hit-pad:4px;
  --toast-dismiss-hit-pad:6px;

  /* the ruling's authored pull-back beside the 6px pad — 1px shy, the specimen's optical seat */
  --toast-dismiss-hit-pull:5px;

  /* CHART LEGEND SWATCH — legend/ramp chip box */
  --swatch-w:34px;
  --swatch-h:22px;

  /* WEIGHT RAMP — no raw font-weight numbers in compositions */
  --weight-regular:400;
  --weight-medium:500;
  --weight-strong:600;
  --weight-heavy:700;

  /* MACRO RHYTHM — page scale (density owns --section-gap / --page-pad-*) */
  --content-max:1100px;
  --content-max-wide:1280px;

  /* MARKETING CONTAINER — blocks-register content width (self-clamping) */
  --block-max:min(1240px,94%);

  /* MARKETING BAND RHYTHM — hero band vertical padding (floor density-owned, ceiling art-direction) */
  --band-y-lg:clamp(var(--space-8),8vw,104px);
  --tile-min:170px;

  /* SPECIMEN MATRIX TRACK FLOOR — source-bound compact comparison cells; selected only by the registered tile-grid track axis */
  --tile-min-specimen:178px;
  --page-runout:100px;
  --measure:65ch;

  /* FIELD GRID + WIDTH RAMP — form grids declare one floor; content-sized fields pick a step */
  --field-min:170px;

  /* PANE FLOOR — the master-detail side-pane floor, published as a retunable archetype axis exactly as --tile-min / --field-min are (SPEC-41 baked rhythm; Q-22 keeps rhythm token-stepped, so panes never size in cqi) */
  --pane-min:280px;
  --field-w-xs:80px;
  --field-w-sm:128px;
  --field-w-md:192px;
  --field-w-ml:256px;
  --field-w-lg:320px;

  /* OVERLAY + CHROME RAMP — modal/drawer sizes are tokens, not label lore */
  --overlay-sm:400px;
  --overlay-md:560px;
  --overlay-lg:800px;
  --drawer-sm:380px;
  --drawer-md:520px;
  --drawer-lg:720px;

  /* RAIL COLUMN — the app-shell nav rail, retuned 380→232 on 2026-07-28 when the rail slot became its first consumer: the designer standalone draws the rail at 232px, and 380 (the drawer-sm pairing it was seeded beside) starved the canvas column on every laptop viewport */
  --rail-w:232px;

  /* INSPECTOR PANE — the app-shell end column (Workbench aside); sibling of --rail-w, sized from the designer standalone */
  --inspector-w:324px;

  /* LAYER SCALE — one stacking vocabulary; never hand-pick a z-index */
  --layer-base:0;
  --layer-sticky:10;
  --layer-rail:20;
  --layer-drawer:30;
  --layer-modal:40;
  --layer-popover:50;
  --layer-toast:60;

  /* STATE POLICY — hover/pressed are text-mix overlays (brand-style-aware); disabled is one opacity */
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --state-selected-bg:var(--accent-tint);

  /* STATE SEPARATION — the boundary that separates a selected control from its unselected siblings; solved per register to 3:1 against the local ground */
  --state-edge:var(--border);

  /* STATE SEPARATION — the boundary around the accent-tint selection wash (current nav row, selected menu option); accent-seeded so the edge is chromatic kin to the fill, solved per register to 3:1 against the local ground */
  --state-selected-edge:var(--accent);
  --seg-thumb-fill:var(--surface-raised);

  /* STATE SEPARATION — the selected segmented thumb's label ink, the register's accent-leaning surface voice; solved per register to AA on the derived thumb fill */
  --seg-thumb-ink:var(--link-color);
  --seg-thumb-edge:var(--border);
  --disabled-opacity:0.45;
  --drag-ghost-opacity:0.5;

  /* SEG/RUN TRACK — relational ink wash, exempt grouping decoration; the thumb carries state via chip+shadow+label delta at standard, edge under strong/max */
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --track-edge:transparent;

  /* SEAT GAP — the inset a track holds around its members; the GAP half of the corner law. Named once so a seat can never pad by one value and round by another. */
  --seat-gap:max(var(--space-half), var(--seg-pad));

  /* CONCENTRIC CORNERS — container radii derive from member radius + gap; never authored by eye */
  --seg-track-radius:min(calc(var(--seg-thumb-radius) + var(--seat-gap)), calc(var(--seg-thumb-radius) * 999));

  /* CONCENTRIC CORNERS — a seated command run derives from the BUTTON radius it holds, never the segmented thumb */
  --run-track-radius:min(calc(var(--radius-control) + var(--seat-gap)), calc(var(--radius-control) * 999));

  /* CONCENTRIC CORNERS — a nav group derives from its ROW radius */
  --nav-track-radius:min(calc(var(--run-item-radius, var(--radius-item)) + var(--seat-gap)), calc(var(--run-item-radius, var(--radius-item)) * 999));

  /* RUN TEXT EDGE — where a label starts inside a run: the wash inset plus the seat pad. The one value the nav row, the run eyebrow and a seated chip cloud all pad by, so they align by construction. */
  --run-text-edge:calc(var(--run-wash-inset) + var(--space-2h));

  /* CHROME SEAT — the inset a toolbar/chrome bar holds around its contents. Paired with --radius-chrome so the pad and the corner cannot disagree. */
  --chrome-pad:var(--space-2);

  /* CONCENTRIC CORNERS — chrome bars seat controls, so they derive from the control radius + their own inset; never --radius-surface (a content voice) around control chrome */
  --radius-chrome:min(calc(var(--radius-control) + var(--chrome-pad)), calc(var(--radius-control) * 999));

  /* SEAT INSET — the smallest clearance between a seated control and its host box; the GAP half of the top-down corner law. Minimum, not inline: concentricity binds on the closest edge. */
  --seat-inset:min(var(--space-1), calc((var(--control-h) - var(--control-h-xs)) / 2));

  /* CONCENTRIC CORNERS — a seated control derives its corner from the HOST it sits in, minus the seat inset. Default arm only: a host that overrides its shape declares --seat-outer-radius AND re-derives this cell in the same rule. Never author a seated corner by eye, and never hardcode a circle. */
  --seat-inner-radius:max(0px, calc(var(--radius-control) - var(--seat-inset)));

  /* FIELD AFFIX — resting glyph ink for a control seated inside a field */
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);

  /* A seated affix paints no ground at rest — it stands on the field's */
  --field-affix-bg:transparent;
  --field-affix-bg-hover:var(--surface-3);

  /* CLEAR AFFIX — the destructive clear carries a filled ground at rest, unlike the ghost action affix */
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);

  /* INTERACTION RINGS */
  --ring-focus:var(--ring);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --ring-offset:2px;

  /* ASPECT RATIOS — media boxes declare a role, not numbers */
  --ratio-media:4/3;
  --ratio-wide:16/9;
  --ratio-portrait:3/4;

  /* BLUR + GLASS — glass surfaces are a recipe, not per-sheet rgba guesses */
  --blur-sm:8px;
  --blur-md:16px;
  --blur-lg:32px;
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);

  /* CANVAS — ground behind the artboard; resolves through the brand style ground */
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));

  /* PAINTABLE GROUNDS — the page ground: texture over wash over colour. Paired with --bg, which stays pure colour for the derivation and color-mix sites an image cannot occupy. */
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);

  /* DRAG & DROP — insertion line, target wash, ghost opacity */
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);

  /* SCROLLBARS */
  --scrollbar-w:10px;
  --scrollbar-thumb:var(--border-strong);
  --scrollbar-track:transparent;

  /* SCROLL GUTTER CLEARANCE — minimum breathing room between a selection wash and a scroll gutter; scrollports declare it, the wash consumes it */
  --scroll-gutter-min:var(--space-1);

  /* UX TIMING — tooltip open, toast auto-dismiss, input/autosave debounce, spinner + skeleton sweep periods */
  --delay-tooltip:300ms;
  --timeout-toast:5000ms;
  --timeout-toast-long:8000ms;
  --timeout-confirm:1600ms;
  --debounce-input:250ms;
  --debounce-autosave:1200ms;
  --dur-spinner:800ms;
  --dur-shimmer:1400ms;

  /* CONTAINER THRESHOLDS — chrome collapse points (informational; queries inline via BP) */
  --bp-rail-collapse:900px;
  --bp-page-narrow:640px;

  /* ARCHETYPE CONTAINER THRESHOLD — section-stack drops to the tighter inter-section step below this CONTAINER width (never viewport: SPEC-56 reserves the viewport seam for page floorplans) */
  --bp-section-tight:480px;

  /* CHART RAMPS — series tints + sequential + diverging, derived from the categorical ramp */
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);

  /* FIELD ANATOMY — component tokens (contract) */
  --label-zone:22px;
  --meta-zone:21px;

  /* ELEVATION TINTS — raised = knob-mix overlay; invisible on light grounds (white over white), lifts on dark. Strategy declaration lives in the brand style voice (--elev-strategy). --knob is white-ish in every light register and light in every dark register, so this is the industry-standard "shadows carry elevation in light, tint carries it in dark" with zero per-brand-style authoring. */
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);

  /* FONT GRADE — dark-mode ink compensation (Material-style GRAD). Contract slot: every loaded font is static today so 0 everywhere; a variable font with GRAD lets dark registers pull negative grade without metric shift. */
  --font-grade:0;

  /* NESTED RADIUS LAW — inner radius = outer radius minus inset; never author a nested corner by eye. Zero-preserving: a square container yields a square inset. */
  --radius-nested:max(0px, calc(var(--radius-surface) - var(--pad)));
  --texture-surface:none;
  --texture-container:none;
  --texture-accent:none;
  --seg-thumb-fill:#ffffff;
  --seg-thumb-ink:#2159cc;
  --seg-thumb-edge:var(--border);
  --state-edge:#8a8f94;
  --state-selected-edge:#2f6fed;
  --state-selected-bg:#d9e0ee;
}
/* ============ MODE: DARK (neutral brand style; brand styles are single-mode) ============ */
[data-mode="dark"]{
  --bg:#0a1017;
  --surface:#0e161f;
  --surface-2:#0c131b;
  --surface-3:#182231;
  --inset:#0a1017;
  --scrim:rgba(0,0,0,0.6);
  --border:#1d2938;
  --border-strong:#2b3a4e;
  --border-hover:#3a4a5e;
  --hairline:#16202c;
  --surface-raised:#1f2c3b;
  --inverse-bg:#e4eaf3;
  --on-inverse:#0a1017;
  --knob:#e4eaf3;
  --text:#e4eaf3;
  --text-2:#a9b5c5;
  --text-3:#a9b9d1;
  --text-quiet:#536073;
  --text-disabled:#4d5560;
  --accent:#5b8def;
  --accent-hover:#7aa5f5;
  --accent-active:#8fb3f8;
  --accent-grad-deep:#5b8def;
  --on-accent:#0a1017;
  --accent-tint:rgba(66,115,201,0.20);
  --on-accent-tint:#7aa5f5;
  --selection-bg:#24395B;
  --on-selection:#e4eaf3;
  --danger:#e05252;
  --danger-hover:#e86a6a;
  --danger-tint:rgba(224,82,82,0.14);
  --on-danger-tint:#f09a9a;
  --on-danger:#0a1017;
  --ok:#46a97a;
  --ok-tint:rgba(60,160,110,0.16);
  --on-ok-tint:#7cd0a2;
  --warn:#e0a33e;
  --warn-tint:rgba(220,150,50,0.14);
  --on-warn-tint:#eec27f;
  --info:#6f9ff0;
  --info-tint:rgba(90,130,220,0.16);
  --on-info-tint:#9cc0ff;
  --neutral-tint:#1c2531;
  --on-neutral-tint:#a9b5c5;
  --accent-border:#1e2c46;
  --info-border:#253652;
  --danger-border:#5a2a2a;
  --ok-border:#1e4534;
  --warn-border:#4a3a1e;
  --eyebrow-color:#a9b9d1;
  --chart-1:#7b9fe8;
  --chart-1-tint:#17243d;
  --chart-2:#5cb98a;
  --chart-3:#d9a24a;
  --chart-4:#a98ee0;
  --chart-5:#d08770;
  --chart-6:#5f6f85;
  --chart-grid:#16202c;
  --chart-axis:#8494ab;
  --section-rule:2px solid #e4eaf3;
  --ring:0 0 0 3px rgba(91,141,239,0.45);
  --wash-skeleton:linear-gradient(90deg,#0c131b 25%,#182231 50%,#0c131b 75%);
  --hatch:repeating-linear-gradient(45deg,#16202c,#16202c 4px,#0c131b 4px,#0c131b 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#17243d,#17243d 5px,#0e161f 5px,#0e161f 10px);
  --scheme:dark;
  --seg-thumb-fill:#343d47;
  --seg-thumb-ink:#7ea9f9;
  --seg-thumb-edge:var(--border);
  --state-edge:#586677;
  --state-selected-edge:#5b8def;
  --state-selected-bg:rgba(66,115,201,0.20);
}
/* ============ BRAND STYLES — dual-mode. The base block is each brand style's LIGHT palette
   (atw's is the OKLab-derived counterpart of its native dark voice, transcribed
   from the original payloads); the [data-mode="dark"][data-brand-style] pair carries
   the dark palette (native for atw, derived for lumen/rugged). Voice tokens
   (type, geometry, motion) live once in the base block, shared by both. ============ */
[data-brand-style="atw"]{
  --bg:#f9fafe;
  --surface:#ececf4;
  --surface-2:#e9e9f2;
  --surface-3:#e1e1eb;
  --inset:#f0f0f8;
  --scrim:rgba(252,252,252,0.6);
  --border:#d6d7e1;
  --border-strong:#acaab8;
  --border-hover:#8c8997;
  --hairline:#e1e1eb;
  --surface-raised:#efeffb;
  --inverse-bg:#211f1c;
  --on-inverse:#f9fafe;
  --knob:#211f1c;
  --text:#211f1c;
  --text-2:#3c3a40;
  --text-3:#4d4c53;
  --text-quiet:#8c8a96;
  --text-disabled:#9b99a4;
  --accent:#e22f2a;
  --accent-hover:#ec3935;
  --accent-active:#d1332b;
  --accent-grad-deep:#e22f2a;
  --on-accent:#050507;
  --accent-tint:#fddadc;
  --on-accent-tint:#b63737;
  --selection-bg:#f0b4b3;
  --on-selection:#211f1c;
  --danger:#e94642;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#16171a;
  --ok:#1f9a61;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --warn:#b67905;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --info:#4f6beb;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --accent-border:#6f484a;
  --info-border:#4e5b89;
  --danger-border:#794a4c;
  --ok-border:#406c55;
  --warn-border:#6e5d3b;
  --eyebrow-color:#8e0413;
  --chart-1:#4f6beb;
  --chart-1-tint:#4e5b89;
  --chart-2:#1f9a61;
  --chart-3:#bb7e12;
  --chart-4:#886bbc;
  --chart-5:#e05e59;
  --chart-6:#4d4c53;
  --chart-grid:#e1e1eb;
  --chart-axis:#4d4c53;
  --icon-stroke:1.5;
  --icon-stroke-strong:1.8;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --font-ui:'Archivo',sans-serif;
  --font-display:var(--font-headline);
  --font-mono:'JetBrains Mono',monospace;
  --display-weight:400;
  --display-case:uppercase;
  --display-tracking:0.04em;
  --btn-case:uppercase;
  --btn-tracking:0.08em;
  --btn-weight:700;
  --eyebrow-tracking:0.16em;
  --eyebrow-weight:500;
  --eyebrow-style:normal;
  --font-eyebrow:'JetBrains Mono',monospace;
  --font-headline:'Anton',sans-serif;
  --type-display-size:36px;
  --type-display-lh:1.1;
  --type-headline-size:24px;
  --type-headline-lh:1.25;
  --type-title-size:15.5px;
  --type-title-lh:1.35;
  --type-title-weight:600;
  --type-body-size:14px;
  --type-body-lh:1.55;
  --type-label-size:13px;
  --type-label-lh:1.35;
  --type-caption-size:12px;
  --type-caption-lh:1.45;
  --type-micro-size:9.5px;
  --type-micro-lh:1.3;
  --type-code-size:12.5px;
  --type-code-lh:1.55;
  --type-eyebrow-size:11px;
  --type-hero-size:clamp(48px,9vw,110px);
  --type-hero-lh:0.98;
  --bw:1px;
  --radius-control:0px;
  --radius-surface:0px;
  --radius-xs:0px;
  --radius-pill:0px;
  --radius-item:0px;
  --run-wash-inset:0px;
  --radius-search:0px;
  --radius-feature:0;
  --card-clip:polygon(0 0, calc(100% - 18px) 0, 100% 18px, 100% 100%, 0 100%);
  --control-clip:polygon(0 0, 100% 0, 100% calc(100% - var(--notch,12px)), calc(100% - var(--notch,12px)) 100%, 0 100%);
  --section-rule:2px solid #e22f2a;
  --menu-radius:0px;
  --menu-pad:0px;
  --item-gap:0px;
  --seg-thumb-radius:0px;
  --seg-thumb-shadow:var(--shadow-1);
  --choice-shadow:var(--shadow-1);
  --card-shadow:var(--shadow-1);
  --choice-radius:0px;
  --slider-thumb-radius:0;
  --seg-gap:2px;
  --seg-pad:2px;
  --shadow-1:0 1px 3px rgba(0,0,0,0.4);
  --shadow-2:0 4px 14px rgba(0,0,0,0.45);
  --shadow-3:0 8px 24px rgba(0,0,0,0.5);
  --shadow-4:0 24px 60px rgba(0,0,0,0.6);
  --shadow:0 8px 24px rgba(0,0,0,0.5);
  --ring:0 0 0 3px rgba(191,11,17,0.35);
  --ring-danger:0 0 0 3px rgba(151,9,20,0.3);
  --dur-1:70ms;
  --dur-2:120ms;
  --dur-3:200ms;
  --dur-4:320ms;
  --ease-standard:cubic-bezier(0.2,0,0,1);
  --ease-decel:cubic-bezier(0,0,0,1);
  --ease-accel:cubic-bezier(0.3,0,0.8,0.15);
  --spring-damping:0.63;
  --press-transform:scale(0.97);
  --wash-skeleton:linear-gradient(90deg,#e1e1eb 25%,#e9e9f2 50%,#e1e1eb 75%);
  --hatch:repeating-linear-gradient(45deg,#e1e1eb,#e1e1eb 4px,#e9e9f2 4px,#e9e9f2 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#f8d9da,#f8d9da 5px,#fae5e5 5px,#fae5e5 10px);
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --surface-wash:none;
  --media-filter:none;
  --media-overlay:transparent;
  --media-hover-scale:1;
  --scrim-blur:0px;
  --scheme:light;
  --link-color:var(--text-2);
  --link-color-hover:var(--text);
  --link-underline-rest:none;
  --link-underline-hover:none;
  --link-thickness:2px;
  --link-offset:0.16em;
  --link-style:solid;
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --features-code:"zero" 1;
  --numerals-prose:lining-nums;
  --elev-strategy:tint;
  --chart-stroke:2.2;
  --chart-stroke-2:1.6;
  --chart-dash:2 3;
  --chart-area-opacity:0.55;
  --chart-marker-r:3.4;
  --chart-bar-radius:0px;
  --chart-grid-dash:2 3;
  --chart-marker-radius:0;
  --chart-marker-clip:none;
  --chart-marker-transform:none;
  --display-stroke-w:2px;
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --separation:rule;
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --divider-gap-boost:0px;
  --corner-shape:round;
  --enter-dur:var(--dur-1);
  --enter-ease:var(--ease-spring);
  --enter-from:scale(0.96);
  --exit-dur:var(--dur-1);
  --exit-ease:var(--ease-accel);
  --exit-to:scale(0.96);
  --stagger-step:16ms;
  --vt-style:slide;
  --vt-dur:var(--dur-2);
  --route-dur:var(--dur-2);
  --route-dur-long:var(--dur-4);
  --dur-ambient:8000ms;
  --ease-spring:linear(0, 0.0154, 0.057, 0.1181, 0.1928, 0.2762, 0.3639, 0.4526, 0.5393, 0.6218, 0.6986, 0.7686, 0.8311, 0.8858, 0.9326, 0.9718, 1.0037, 1.029, 1.0482, 1.0621, 1.0712, 1.0764, 1.0782, 1.0773, 1.0743, 1.0697, 1.064, 1.0575, 1.0507, 1.0437, 1.0369, 1.0304, 1.0244, 1.0188, 1.0138, 1.0095, 1.0057, 1.0026, 1, 0.998, 1);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --state-selected-bg:var(--accent-tint);
  --state-edge:var(--border);
  --state-selected-edge:var(--accent);
  --seg-thumb-fill:var(--surface-raised);
  --seg-thumb-ink:var(--link-color);
  --seg-thumb-edge:var(--border);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --seat-gap:max(var(--space-half), var(--seg-pad));
  --seg-track-radius:min(calc(var(--seg-thumb-radius) + var(--seat-gap)), calc(var(--seg-thumb-radius) * 999));
  --run-track-radius:min(calc(var(--radius-control) + var(--seat-gap)), calc(var(--radius-control) * 999));
  --nav-track-radius:min(calc(var(--run-item-radius, var(--radius-item)) + var(--seat-gap)), calc(var(--run-item-radius, var(--radius-item)) * 999));
  --run-text-edge:calc(var(--run-wash-inset) + var(--space-2h));
  --radius-chrome:min(calc(var(--radius-control) + var(--chrome-pad)), calc(var(--radius-control) * 999));
  --seat-inner-radius:max(0px, calc(var(--radius-control) - var(--seat-inset)));
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-focus:var(--ring);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
  --radius-nested:max(0px, calc(var(--radius-surface) - var(--pad)));
  --seg-thumb-fill:#fcfcff;
  --seg-thumb-ink:#3c3a40;
  --seg-thumb-edge:var(--border);
  --state-edge:#84858e;
  --state-selected-edge:#e22f2a;
  --state-selected-bg:#fddadc;
}
[data-mode="dark"][data-brand-style="atw"]{
  --bg:#0A0A0D;
  --surface:#131318;
  --surface-2:#15151B;
  --surface-3:#1B1B22;
  --inset:#101015;
  --scrim:rgba(0,0,0,0.6);
  --border:#23232B;
  --border-strong:#4A4854;
  --border-hover:#6A6875;
  --hairline:#1B1B22;
  --surface-raised:#2A2A33;
  --inverse-bg:#F2F0EB;
  --on-inverse:#0A0A0D;
  --knob:#F2F0EB;
  --text:#F2F0EB;
  --text-2:#C9C7CE;
  --text-3:#9F9DA6;
  --text-quiet:#5E5C67;
  --text-disabled:#5B5963;
  --accent:#E8362F;
  --accent-hover:#FF4D45;
  --accent-active:#C92A24;
  --accent-grad-deep:#E8362F;
  --on-accent:#0A0A0D;
  --accent-tint:#2A1215;
  --on-accent-tint:#FF7A73;
  --selection-bg:#4A1C1E;
  --on-selection:#F2F0EB;
  --danger:#FF5C55;
  --danger-hover:#FF7A73;
  --danger-tint:#2A1215;
  --on-danger-tint:#FF8A80;
  --on-danger:#0A0A0D;
  --ok:#2FA46B;
  --ok-tint:#1A3527;
  --on-ok-tint:#7FD8A8;
  --warn:#D9931A;
  --warn-tint:#2E2410;
  --on-warn-tint:#E8B45A;
  --info:#4D68E8;
  --info-tint:#161B33;
  --on-info-tint:#A9B8FF;
  --neutral-tint:#23232B;
  --on-neutral-tint:#C9C7CE;
  --accent-border:#3A181B;
  --info-border:#2A3560;
  --danger-border:#4A2023;
  --ok-border:#1E4A34;
  --warn-border:#4A3A18;
  --eyebrow-color:#FF6B64;
  --chart-1:#4D68E8;
  --chart-1-tint:#2a3560;
  --chart-2:#2FA46B;
  --chart-3:#D9931A;
  --chart-4:#8a6dbf;
  --chart-5:#FF7A73;
  --chart-6:#9F9DA6;
  --chart-grid:#1B1B22;
  --chart-axis:#9F9DA6;
  --section-rule:2px solid #E8362F;
  --ring:0 0 0 3px rgba(232,54,47,0.35);
  --ring-danger:0 0 0 3px rgba(255,92,85,0.3);
  --wash-skeleton:linear-gradient(90deg,#1B1B22 25%,#15151B 50%,#1B1B22 75%);
  --hatch:repeating-linear-gradient(45deg,#1B1B22,#1B1B22 4px,#15151B 4px,#15151B 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#2a1516,#2a1516 5px,#1f1112 5px,#1f1112 10px);
  --scheme:dark;
  --seg-thumb-fill:#39393e;
  --seg-thumb-ink:#C9C7CE;
  --seg-thumb-edge:var(--border);
  --state-edge:#62626c;
  --state-selected-edge:#E8362F;
  --state-selected-bg:#30181a;
}
[data-brand-style="atw"][data-contrast="strong"]{
  --text-3:#4d4c53;
  --eyebrow-color:#8e0413;
  --text-disabled:#696772;
  --text-quiet:#696772;
  --border:#a4a5af;
  --border-hover:#7e7b88;
  --border-strong:#878593;
  --hairline:#afafb8;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#fbfbff;
  --seg-thumb-ink:#3c3a40;
  --seg-thumb-edge:#797a83;
  --state-edge:#83848e;
  --state-selected-edge:#e22f2a;
  --state-selected-bg:#fddadc;
}
[data-mode="dark"][data-brand-style="atw"][data-contrast="strong"]{
  --text-3:#a3a1aa;
  --eyebrow-color:#fb776e;
  --text-disabled:#817f8a;
  --text-quiet:#817f8a;
  --border:#484851;
  --border-hover:#6d6b79;
  --border-strong:#65626f;
  --hairline:#42424a;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#444448;
  --seg-thumb-ink:#C9C7CE;
  --seg-thumb-edge:#74747d;
  --state-edge:#62626c;
  --state-selected-edge:#E8362F;
  --state-selected-bg:#30181a;
}
/* ============ OS PREFERENCE: prefers-contrast — maps to the STRONG bump
   (Apple "Increase Contrast" semantics); forced-colors (WHCM) stays the full
   replacement. Light blocks before dark, all before max, so equal
   specificity resolves by source order. ============ */
@media (prefers-contrast: more){
:root{
  --text-2:#37404f;
  --text-3:#455060;
  --eyebrow-color:#455060;
  --text-disabled:#656d79;
  --text-quiet:#616a78;
  --border:#a7acb2;
  --border-hover:#76818e;
  --border-strong:#838a92;
  --hairline:#b0b3b7;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#ffffff;
  --seg-thumb-ink:#2159cc;
  --seg-thumb-edge:#7f8489;
  --state-edge:#8d9298;
  --state-selected-edge:#2f6fed;
  --state-selected-bg:#d9e0ee;
}
}
@media (prefers-contrast: more){
[data-brand-style="atw"]{
  --text-3:#4d4c53;
  --eyebrow-color:#8e0413;
  --text-disabled:#696772;
  --text-quiet:#696772;
  --border:#a4a5af;
  --border-hover:#7e7b88;
  --border-strong:#878593;
  --hairline:#afafb8;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#fbfbff;
  --seg-thumb-ink:#3c3a40;
  --seg-thumb-edge:#797a83;
  --state-edge:#83848e;
  --state-selected-edge:#e22f2a;
  --state-selected-bg:#fddadc;
}
}
@media (prefers-contrast: more){
[data-mode="dark"]{
  --text-2:#adb9c9;
  --text-3:#a9b9d1;
  --eyebrow-color:#a9b9d1;
  --text-disabled:#79828e;
  --text-quiet:#758397;
  --border:#3e4b5c;
  --border-hover:#5e6f84;
  --border-strong:#54657b;
  --hairline:#394452;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#3c454e;
  --seg-thumb-ink:#87b1fd;
  --seg-thumb-edge:#667486;
  --state-edge:#586678;
  --state-selected-edge:#5b8def;
  --state-selected-bg:rgba(66,115,201,0.20);
}
}
@media (prefers-contrast: more){
[data-mode="dark"][data-brand-style="atw"]{
  --text-3:#a3a1aa;
  --eyebrow-color:#fb776e;
  --text-disabled:#817f8a;
  --text-quiet:#817f8a;
  --border:#484851;
  --border-hover:#6d6b79;
  --border-strong:#65626f;
  --hairline:#42424a;
  --disabled-opacity:0.62;
  --track-ink:10%;
  --track-edge:color-mix(in oklab, var(--text) 30%, transparent);
  --seg-thumb-fill:#444448;
  --seg-thumb-ink:#C9C7CE;
  --seg-thumb-edge:#74747d;
  --state-edge:#62626c;
  --state-selected-edge:#E8362F;
  --state-selected-bg:#30181a;
}
}
/* max — accessibility beats brand; wins over every brand style.
   data-contrast="max" alone = light HC; with data-mode="dark" = dark HC. */
[data-contrast="max"]{
  --bg:#ffffff;
  --surface:#ffffff;
  --surface-2:#ffffff;
  --surface-3:#e8e8e8;
  --inset:#eeeeee;
  --scrim:rgba(0,0,0,0.6);
  --border:#5a5a5a;
  --border-strong:#2e2e2e;
  --border-hover:#000000;
  --hairline:#8a8a8a;
  --surface-raised:#ffffff;
  --inverse-bg:#000000;
  --on-inverse:#ffffff;
  --knob:#000000;
  --text:#000000;
  --text-2:#1f1f1f;
  --text-3:#3d3d3d;
  --text-disabled:#595959;
  --accent:#0033cc;
  --accent-hover:#0028a3;
  --accent-active:#001f80;
  --accent-grad-deep:#0033cc;
  --on-accent:#ffffff;
  --accent-tint:rgba(0,51,204,0.12);
  --on-accent-tint:#0028a3;
  --selection-bg:#0033cc;
  --on-selection:#ffffff;
  --danger:#a30000;
  --danger-hover:#850000;
  --danger-tint:rgba(163,0,0,0.10);
  --on-danger-tint:#850000;
  --on-danger:#ffffff;
  --ok:#006400;
  --ok-tint:rgba(0,100,0,0.12);
  --on-ok-tint:#004d00;
  --warn:#7a4d00;
  --warn-tint:rgba(122,77,0,0.10);
  --on-warn-tint:#5c3a00;
  --info:#0044aa;
  --info-tint:rgba(0,68,170,0.10);
  --on-info-tint:#003380;
  --neutral-tint:#e8e8e8;
  --on-neutral-tint:#1f1f1f;
  --accent-border:#0033cc;
  --info-border:#0044aa;
  --danger-border:#a30000;
  --ok-border:#006400;
  --warn-border:#7a4d00;
  --eyebrow-color:#3d3d3d;
  --chart-1:#0033cc;
  --chart-1-tint:#d6defb;
  --chart-2:#006400;
  --chart-3:#7a4d00;
  --chart-4:#5f1f8f;
  --chart-5:#933000;
  --chart-6:#3d3d3d;
  --chart-grid:#b0b0b0;
  --chart-axis:#1f1f1f;
  --icon-stroke:2;
  --icon-stroke-strong:2.5;
  --code-bg:#000000;
  --code-border:#3d3d3d;
  --code-muted:#a8a8a8;
  --code-chip-border:#6a6a6a;
  --code-text:#e0e0e0;
  --code-text-strong:#ffffff;
  --code-blue:#a3caff;
  --code-green:#7fd8a8;
  --code-amber:#ffcf70;
  --code-purple:#ce93d8;
  --bw:2px;
  --radius-control:6px;
  --radius-surface:10px;
  --radius-xs:3px;
  --radius-pill:999px;
  --section-rule:2px solid #000000;
  --seg-thumb-shadow:none;
  --choice-shadow:none;
  --card-shadow:none;
  --shadow-1:none;
  --shadow-2:none;
  --shadow-3:none;
  --shadow-4:none;
  --shadow:none;
  --ring:0 0 0 2px #0033cc;
  --ring-danger:0 0 0 2px #a30000;
  --spring-damping:1;
  --press-transform:none;
  --wash-skeleton:linear-gradient(90deg,#e8e8e8 25%,#f5f5f5 50%,#e8e8e8 75%);
  --hatch:repeating-linear-gradient(45deg,#e8e8e8,#e8e8e8 4px,#f5f5f5 4px,#f5f5f5 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#d6defb,#d6defb 5px,#e9edfc 5px,#e9edfc 10px);
  --scrim-blur:0px;
  --scheme:light;
  --ease-spring:cubic-bezier(0.2,0,0,1);
  --state-selected-edge:#0033cc;
  --state-selected-bg:rgba(0,51,204,0.12);
  --track-ink:0%;
  --track-edge:var(--border-strong);
}
[data-mode="dark"][data-contrast="max"]{
  --bg:#000000;
  --surface:#000000;
  --surface-2:#000000;
  --surface-3:#1c1c1c;
  --inset:#111111;
  --scrim:rgba(0,0,0,0.8);
  --border:#3d3d3d;
  --border-strong:#6a6a6a;
  --border-hover:#8a8a8a;
  --hairline:#2a2a2a;
  --surface-raised:#1c1c1c;
  --inverse-bg:#ffffff;
  --on-inverse:#000000;
  --knob:#ffffff;
  --text:#ffffff;
  --text-2:#e0e0e0;
  --text-3:#a8a8a8;
  --text-quiet:#949494;
  --text-disabled:#787878;
  --accent:#7ab3ff;
  --accent-hover:#a3caff;
  --accent-active:#c4dcff;
  --accent-grad-deep:#7ab3ff;
  --on-accent:#000000;
  --accent-tint:rgba(122,179,255,0.22);
  --on-accent-tint:#a3caff;
  --selection-bg:#7ab3ff;
  --on-selection:#000000;
  --danger:#ff8a80;
  --danger-hover:#ffa39e;
  --danger-tint:rgba(255,138,128,0.22);
  --on-danger-tint:#ffa39e;
  --on-danger:#000000;
  --ok:#7fd8a8;
  --ok-tint:rgba(127,216,168,0.22);
  --on-ok-tint:#7fd8a8;
  --warn:#ffcf70;
  --warn-tint:rgba(255,207,112,0.22);
  --on-warn-tint:#ffcf70;
  --info:#a3caff;
  --info-tint:rgba(163,202,255,0.22);
  --on-info-tint:#a3caff;
  --neutral-tint:#1c1c1c;
  --on-neutral-tint:#e0e0e0;
  --accent-border:#7ab3ff;
  --info-border:#a3caff;
  --danger-border:#ff8a80;
  --ok-border:#7fd8a8;
  --warn-border:#ffcf70;
  --eyebrow-color:#a8a8a8;
  --chart-1:#7ab3ff;
  --chart-1-tint:#1c2a3a;
  --chart-2:#7fd8a8;
  --chart-3:#ffcf70;
  --chart-4:#ce93d8;
  --chart-5:#ffab91;
  --chart-6:#a8a8a8;
  --chart-grid:#2a2a2a;
  --chart-axis:#a8a8a8;
  --icon-stroke:2;
  --icon-stroke-strong:2.5;
  --code-bg:#000000;
  --code-border:#3d3d3d;
  --code-muted:#a8a8a8;
  --code-chip-border:#6a6a6a;
  --code-text:#e0e0e0;
  --code-text-strong:#ffffff;
  --code-blue:#a3caff;
  --code-green:#7fd8a8;
  --code-amber:#ffcf70;
  --code-purple:#ce93d8;
  --bw:2px;
  --radius-control:6px;
  --radius-surface:10px;
  --radius-xs:3px;
  --radius-pill:999px;
  --section-rule:2px solid #ffffff;
  --seg-thumb-shadow:none;
  --choice-shadow:none;
  --card-shadow:none;
  --shadow-1:none;
  --shadow-2:none;
  --shadow-3:none;
  --shadow-4:none;
  --shadow:none;
  --ring:0 0 0 2px #7ab3ff;
  --ring-danger:0 0 0 2px #ff8a80;
  --spring-damping:1;
  --press-transform:none;
  --wash-skeleton:linear-gradient(90deg,#111111 25%,#2a2a2a 50%,#111111 75%);
  --hatch:repeating-linear-gradient(45deg,#1c1c1c,#1c1c1c 4px,#111111 4px,#111111 8px);
  --hatch-accent:repeating-linear-gradient(45deg,#1c2a3a,#1c2a3a 5px,#111111 5px,#111111 10px);
  --scrim-blur:0px;
  --scheme:dark;
  --link-color:var(--accent);
  --link-underline-rest:underline;
  --link-underline-hover:underline;
  --link-thickness:2px;
  --link-ink:currentColor;
  --link-ink-hover:currentColor;
  --elev-strategy:border;
  --chart-stroke:3;
  --chart-stroke-2:2;
  --chart-marker-radius:50%;
  --chart-marker-transform:none;
  --display-shadow:none;
  --display-gradient:linear-gradient(var(--text),var(--text));
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid #3d3d3d;
  --corner-shape:round;
  --ease-spring:cubic-bezier(0.2,0,0,1);
  --state-selected-edge:#7ab3ff;
  --state-selected-bg:rgba(122,179,255,0.22);
  --track-ink:0%;
  --track-edge:var(--border-strong);
}
/* ============ TEXT-SIZE ALIASES — one type ramp. The --fs* names resolve to the
   role ramp (--type-*); density scales chrome (heights, padding, gaps), NEVER type. ============ */
:root{
  --fs:var(--type-body-size); --fs-sm:var(--type-caption-size);
  --fs-label:var(--type-label-size); --fs-eyebrow:var(--type-eyebrow-size);
}
/* ============ DENSITY AXIS (pointer floor still wins; type is density-invariant) ============
   Density owns the ENTIRE spacing vocabulary: the --space ramp re-values under
   compact along with the control/row/page vars (law: compact = 0.75 × comfortable,
   snapped to whole px, half-steps keep strict interleave). Nothing box-geometric
   may be hand-rolled px in a sheet — every value resolves through this set.
   Icons, tiles and type are density-invariant. ============ */
:root,[data-density="comfortable"]{
  --control-h:max(34px,var(--pointer-min)); --control-h-sm:max(28px,var(--pointer-min)); --control-h-lg:max(40px,var(--pointer-min)); --control-h-xs:max(26px,var(--pointer-min));
  /* xl = the DISPLAY step (hero CTA / capture forms) — published per control, never universal (2026-07-25 sizing ruling) */
  --control-h-xl:max(52px,var(--pointer-min)); --control-pad-x-xl:26px;
  --control-pad-x:14px; --control-pad-x-sm:11px; --control-pad-x-lg:18px; --control-gap:7px; --field-pad-x:12px;
  --pad:16px; --gap:12px;
  --row-h:max(38px,var(--pointer-min)); --row-h-lg:max(44px,var(--pointer-min)); --slider-track-h:4px; --slider-thumb:16px;
  --switch-track-w:36px; --switch-track-h:20px; --switch-thumb:16px; --track-h:4px; --tree-indent:38px; --checkbox-size:18px;
  --section-gap:56px; --page-pad-x:24px; --page-pad-y:36px;
}
[data-density="compact"]{
  --space-1:3px; --space-2:6px; --space-3:9px; --space-4:12px;
  --space-5:18px; --space-6:24px; --space-7:36px; --space-8:48px;
  --space-half:2px; --space-1h:4px; --space-2h:8px; --space-3h:10px;
  --control-h:max(26px,var(--pointer-min)); --control-h-sm:max(24px,var(--pointer-min)); --control-h-lg:max(32px,var(--pointer-min)); --control-h-xs:max(24px,var(--pointer-min));
  --control-pad-x:10px; --control-pad-x-sm:8px; --control-pad-x-lg:13px; --control-gap:5px; --field-pad-x:9px;
  --control-h-xl:max(44px,var(--pointer-min)); --control-pad-x-xl:19px;
  --pad:10px; --gap:7px;
  --row-h:max(28px,var(--pointer-min)); --row-h-lg:max(32px,var(--pointer-min)); --slider-track-h:3px; --slider-thumb:12px;
  --switch-track-w:32px; --switch-track-h:18px; --switch-thumb:14px; --track-h:3px; --tree-indent:32px; --checkbox-size:16px;
  --label-zone:20px; --meta-zone:19px;
  --section-gap:36px; --page-pad-x:16px; --page-pad-y:24px;
}
/* ============ DENSE — the tool-chrome tier, DERIVED, never authored ============
   dense = round(compact² / comfortable) per token: each name's own
   comfortable→compact ratio taken one step further, then clamped
   non-decreasing inside its ramp family. Two laws bend and both are stated:
   the foot of the --space ramp SATURATES (half ties 1, 3 ties 3h — whole-px
   has no room below 2px), so strict half-step interleave is a compact law
   only; and the height family mostly floors on --pointer-min, leaving three
   distinct control heights instead of five. The pointer floor still wins. ============ */
[data-density="dense"]{
  --space-1:2px; --space-2:5px; --space-3:7px; --space-4:9px;
  --space-5:14px; --space-6:18px; --space-7:27px; --space-8:36px;
  --space-half:2px; --space-1h:3px; --space-2h:6px; --space-3h:7px;
  --control-h:max(22px,var(--pointer-min)); --control-h-sm:max(22px,var(--pointer-min)); --control-h-lg:max(26px,var(--pointer-min)); --control-h-xs:max(22px,var(--pointer-min));
  --control-pad-x:7px; --control-pad-x-sm:6px; --control-pad-x-lg:9px; --control-gap:4px; --field-pad-x:7px;
  --control-h-xl:max(37px,var(--pointer-min)); --control-pad-x-xl:14px;
  --pad:6px; --gap:4px;
  --row-h:max(21px,var(--pointer-min)); --row-h-lg:max(23px,var(--pointer-min)); --slider-track-h:2px; --slider-thumb:9px;
  --switch-track-w:28px; --switch-track-h:16px; --switch-thumb:12px; --track-h:2px; --tree-indent:27px; --checkbox-size:14px;
  --label-zone:18px; --meta-zone:17px;
  --section-gap:23px; --page-pad-x:11px; --page-pad-y:16px;
}
/* CONTAINER THRESHOLDS — rail collapses below 900px; page goes single-column below 640px.
   CSS cannot var() a query condition — inline these literals in @container/@media conditions;
   the --bp-* tokens mirror them for JS consumers. */
/* ============ LAYER: GLOBAL POLICY · LAYOUT PRIMITIVES — the only spacing API compositions use ============ */
/* Contract §1 at every scale: children own no margins; the container's gap owns spacing.
   Knobs are tokens — data-gap="0..8" steps a container onto --space-N (source order lets
   it beat the class defaults), --tile-min retunes a grid inline (style="--tile-min:220px"). */
.page{max-width:var(--content-max);margin-inline:auto;padding-block:var(--page-pad-y) var(--page-runout);padding-inline:var(--page-pad-x);display:flex;flex-direction:column;gap:var(--section-gap)}
.stack{display:flex;flex-direction:column;gap:var(--gap)}
.row{display:flex;align-items:center;gap:var(--gap);flex-wrap:wrap}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--tile-min),1fr));gap:var(--gap)}
/* inert crate root — a control whose root is a subscription must still return ONE
   worker node, and that mandatory wrapper may not participate in layout or it
   perturbs the archetype's rhythm. The wrapper is a runtime shape, never paint, so
   the recipe lives here and the control emits only the hook (SPEC-7: no style
   attribute in tier 1). Named for the CAUSE, not for overlays — the next
   conditional-root control reuses it without a rename. */
[data-fp-inert-root]{display:contents}
/* rows — list/table separation follows the brand style voice: rule brand styles draw --divider,
   space brand styles resolve it to none and open --divider-gap-boost instead */
.rows{display:flex;flex-direction:column}
.rows>*+*{border-block-start:var(--divider,1px solid var(--hairline));margin-block-start:var(--divider-gap-boost,0px)}
/* row tone (Q-12) — INK ONLY on the value readout: a row is not a badge, so the
   status axis buys no tint panel and no border. warn takes --on-warn-tint, never
   the --warn base (the InlineAlert law); neutral rides the base rule unmarked. */
.rows [data-tone="info"] [data-role="value"]{color:var(--info)}
.rows [data-tone="ok"] [data-role="value"]{color:var(--ok)}
.rows [data-tone="warn"] [data-role="value"]{color:var(--on-warn-tint)}
.rows [data-tone="danger"] [data-role="value"]{color:var(--danger)}
/* key-value anatomy — the .rows recipe alone left the specimen to the UA dl defaults
   (serif dt over indented dd), and that render was ADMITTED and then baseline-defended
   (Workbench reconstruction, 2026-07-28). The row is a label/value pair on one line:
   label reads in the mono spec voice (token names, contract keys), the value keeps the
   body ink so tone rules above still land on the readout. Resets are scoped to the
   specimen root so no other .rows consumer inherits them. */
/* The LABEL never shrinks and every VALUE starts on ONE line — one pair of tracks buys
   both, and the tracks belong to the LIST, not to the row. Labels are spec-voice short by
   contract (a token name, an ordinal, a part) and a flex row with a long wrapping VALUE
   crushed them to per-character wrap (measured on the Laws table, 2026-07-28); the same
   flex row, ends apart, also gave every row's value its OWN left edge, so a four-row list
   spent five alignment lines against a cap of four (SPEC-42 battery, measured
   2026-07-28). A max-content label track states the floor as GEOMETRY instead of as a
   flex exception, and SUBGRID is what makes it one column rather than one per row: the
   rows keep their own boxes (the .rows hairline paints on them, and data-tone reads
   through them) while contributing to, and riding, the list's tracks. Sizing to the
   widest label in THIS list is why the track is derived and not a fixed step — a
   two-character ordinal must not pay for the sheet's 130px column inside a 324px
   inspector. The value owns the wrapping; a pathological label overflowing its row is
   the battery's to report. */
.rows[data-role="key-value-list"]{margin:0;display:grid;grid-template-columns:max-content 1fr;column-gap:var(--space-3)}
[data-role="key-value-list"]>[data-role="row"]{display:grid;grid-column:1/-1;grid-template-columns:subgrid;align-items:center;padding-block:var(--space-1h);min-inline-size:0}
[data-role="key-value-list"] [data-role="label"]{font-family:var(--font-mono);font-size:var(--fs-sm);color:var(--text-2)}
[data-role="key-value-list"] [data-role="value"]{margin:0;display:flex;align-items:center;gap:var(--space-2);font-size:var(--fs-sm);color:var(--text);min-inline-size:0}
[data-role="key-value-list"] [data-role="readout"]{overflow-wrap:anywhere}
/* The COPY affordance never shrinks either — it is a POINTER TARGET, not text. It rides
   the .btn icon-only sm box, which is already floored at --pointer-min, but as a flex
   item beside a wrapping readout it shrank to 15×28 / 13×24 and broke the SPEC-42 floor
   in a constrained value column (measured on long-value-narrow, 2026-07-28). Declining
   to shrink is how every small affordance in the register holds its floor (chip remove,
   page-banner dismiss, save-state-chip retry); the readout beside it owns the wrap. */
[data-role="key-value-list"] [data-role="copy"]{flex:none}
[data-gap="0"]{gap:0}
[data-gap="1"]{gap:var(--space-1)}
[data-gap="2"]{gap:var(--space-2)}
[data-gap="3"]{gap:var(--space-3)}
[data-gap="4"]{gap:var(--space-4)}
[data-gap="5"]{gap:var(--space-5)}
[data-gap="6"]{gap:var(--space-6)}
[data-gap="7"]{gap:var(--space-7)}
[data-gap="8"]{gap:var(--space-8)}
/* alignment steps — .row centers by default; declare intent, don't hand-type flex */
.spacer{flex:1 1 0;min-width:0}
.row[data-justify="start"]{justify-content:flex-start}
.row[data-justify="center"]{justify-content:center}
.row[data-justify="end"]{justify-content:flex-end}
.row[data-justify="between"]{justify-content:space-between}
.row[data-align="start"]{align-items:flex-start}
.row[data-align="end"]{align-items:flex-end}
.row[data-align="baseline"]{align-items:baseline}
.row[data-align="stretch"]{align-items:stretch}
.stack[data-align="center"]{align-items:center}
/* form grid — the field-row counterpart of .grid's --tile-min */
.grid-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(var(--field-min),1fr));gap:var(--gap)}
/* full-bleed escape inside a padded .stack card (media flush to card edge) */
.bleed{margin-inline:calc(-1*var(--pad))}
/* numerals — tables, KPIs, timers: digits must not jitter */
.num,[data-num]{font-variant-numeric:tabular-nums lining-nums}
/* long-form text column */
.measure{max-width:var(--measure)}
/* glass — earned only over imagery */
.glass{background:var(--glass-bg);border:1px solid var(--glass-border);-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md))}
/* skeleton — loading wash rides the brand style (reduced motion stills the sweep) */
.skeleton{background:var(--wash-skeleton);background-size:200% 100%;animation:shimmer var(--dur-shimmer) linear infinite;border-radius:var(--radius-xs)}
/* icons — stroke follows the brand style voice */
svg.icon{stroke-width:var(--icon-stroke)}
/* ============ LAYER: GLOBAL POLICY · ARRANGEMENT ARCHETYPES — SPEC-41 baked rhythm ============ */
/* Each entry's rhythm is hand-tuned EXACTLY ONCE here; an assembly declares an archetype and
   fills its slots, and therefore can never carry divergent arrangement (SPEC-41). Every rule
   below obeys the four Q-22 answers ratified 2026-07-24:
   1. NAMED containers (container-name:kit2-<archetype>). Anonymous containment resolves to the
      NEAREST ancestor container, so a section-stack nested in a master-detail pane would key on
      whichever ancestor happened to establish containment — invisible at the authoring site.
   2. Rhythm is TOKEN-STEPPED. A query selects WHICH --space-N step applies; it never computes a
      length. No cqi/cqw below the token layer, or "no ad-hoc distances" degrades from
      structurally impossible to merely lint-enforced.
   3. A host cannot query its OWN container, so responsive rhythm lands on the inner .arch-flow
      element. The .arch-* host establishes containment and slot geometry, nothing else.
   4. Thresholds inline as literals (CSS cannot var() a query condition); --bp-* mirrors them.
   Class prefix 'arch-' is deliberate: the register holds generic nouns (wizard, loading,
   navigation) that control recipes will want later — the two namespaces must never collide. */
/* master-detail — PAGE floorplan, VIEWPORT-keyed (SPEC-56's one exception: a page IS the
   viewport consumer). Slots listPane | detailPane | supplementPane.
   Ladder: three columns → supplement drops beneath the pair at --bp-rail-collapse → single
   column at --bp-page-narrow. Panes scroll independently and the floorplan owns the viewport
   block box, so a long list can never push the detail pane out of view. Side panes ride the
   --pane-min floor (retunable inline exactly as --tile-min is). */
.arch-master-detail{display:grid;grid-template-columns:var(--pane-min) minmax(0,1fr) var(--pane-min);gap:var(--gap);block-size:100%;min-block-size:0}
.arch-master-detail>[data-slot]{min-inline-size:0;min-block-size:0;overflow:auto}
.arch-master-detail>[data-slot]>*{margin-block:0}
/* an absent supplement must not reserve its track — the two-pane habitat is the common one */
.arch-master-detail:not(:has(>[data-slot="supplementPane"])){grid-template-columns:var(--pane-min) minmax(0,1fr)}
@media (width < 900px){
  .arch-master-detail{grid-template-columns:var(--pane-min) minmax(0,1fr)}
  .arch-master-detail>[data-slot="supplementPane"]{grid-column:1 / -1;overflow:visible}
}
@media (width < 640px){
  .arch-master-detail{grid-template-columns:minmax(0,1fr);block-size:auto}
  .arch-master-detail>[data-slot]{overflow:visible}
}
/* section-stack — ARRANGEMENT, CONTAINER-keyed. Slots heading | body[many].
   The only ladder is inter-section breathing room: --section-gap at habitat width, stepping
   down to --space-5 once the container is narrow enough that section-gap reads as a hole
   rather than a separation. Nothing about this rhythm may key on the viewport — the same
   section-stack must read correctly full-bleed, inside a master-detail pane, and in a drawer,
   and only its own container knows which of those it is in. */
.arch-section-stack{container-type:inline-size;container-name:kit2-section-stack;display:block;min-inline-size:0}
.arch-section-stack>.arch-flow{display:flex;flex-direction:column;gap:var(--section-gap);min-inline-size:0}
/* Contract clause 1 ENFORCED, not assumed: a slot filled with margin-bearing content
   (any UA-margined <p>/<h*>) would otherwise stack its margin ON TOP of the archetype gap,
   so the rendered rhythm would be the CONTENT's, not the archetype's — and SPEC-41's
   guarantee that an assembly cannot express divergent arrangement would be advisory only.
   Scoped to DIRECT children of a slot, so content deeper down keeps its own flow. */
.arch-section-stack>.arch-flow>*{margin-block:0}
@container kit2-section-stack (width < 480px){
  .arch-section-stack>.arch-flow{gap:var(--space-5)}
}
/* header-body-actions — ARRANGEMENT, CONTAINER-keyed. Slots title | meta | actions[many] | body.
   The canonical section head: identity column (title over meta, tight rhythm) with a trailing
   action cluster, body beneath at GROUP rhythm — head and body are one unit, so the space
   between sibling units stays section-stack's to own. Actions pin to the title row so the
   cluster reads against the title line, and the meta row only exists when meta is present
   (no phantom row-gap under a lone title). Ladder: below --bp-section-tight the head collapses
   to one column and the cluster becomes its own start-aligned row — a squeezed trailing
   cluster would otherwise crush the title into premature wrapping. */
.arch-header-body-actions{container-type:inline-size;container-name:kit2-header-body-actions;display:block;min-inline-size:0}
.arch-header-body-actions>.arch-flow{display:flex;flex-direction:column;gap:var(--gap);min-inline-size:0}
.arch-header-body-actions>.arch-flow>.arch-head{display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:var(--gap);row-gap:var(--space-1);align-items:start}
.arch-header-body-actions>.arch-flow>.arch-head>[data-slot="actions"]{grid-column:2;grid-row:1;display:flex;flex-wrap:wrap;gap:var(--space-2);justify-content:flex-end}
/* Contract clause 1 ENFORCED (children own no margins), scoped to DIRECT slot children so body assemblies keep their own internal flow. */
.arch-header-body-actions>.arch-flow>.arch-head>[data-slot]>*{margin-block:0}
.arch-header-body-actions>.arch-flow>[data-slot="body"]>*{margin-block:0}
@container kit2-header-body-actions (width < 480px){
  .arch-header-body-actions>.arch-flow>.arch-head{grid-template-columns:minmax(0,1fr)}
  .arch-header-body-actions>.arch-flow>.arch-head>[data-slot="actions"]{grid-column:1;grid-row:auto;justify-content:flex-start}
}
/* The BAKED presentation face (2026-07-26): 'plain' is the base rule above — the bare section
   head of the seed contract, and the default, because it is the face every existing baseline
   already proves. 'framed' is the corpus's single most common shape, the panel-with-header-band
   (~90+ instances / 10 apps), RESOLVED as this face rather than a duplicate register entry on
   the kpi-band precedent (axis over duplicate). It paints exactly two things: the card surface
   on the host (the .card recipe verbatim, including its in-flow --pad content inset) and the
   head/body RULE. The rule rides the BODY's leading edge rather than the head's trailing edge,
   which is not cosmetic: on the head it would need padding beneath the head content to avoid
   hugging the title, and head-pad + border + flow-gap is a SUM (2×--gap + --bw) that no
   rhythm step names — the SPEC-42 rhythm lane caught exactly that (15px compact, off
   vocabulary). On the body the flow gap stays the measured slot-to-slot distance and the
   body's own leading pad opens the matching space BELOW the rule, so the band reads centred
   in a symmetric group step and every distance is still a register step. Adjacency scopes it
   (.arch-head + body): a head-free framed panel must not carry a rule with nothing above it.
   The rule is inset by the host pad rather than full-bleed: the dialog construction (head owns
   the pad, host clips) buys a full-bleed band by pushing the BODY fill onto the frame edge,
   and a body's inset must not depend on which fill lands in it. The row-list body every corpus
   panel carries is a FILL (list-pane), never arrangement — this face adds no row anatomy,
   exactly as kpi-band's joined face adds no cell inset. */
.arch-header-body-actions[data-presentation="framed"]{background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);padding:var(--pad)}
.arch-header-body-actions[data-presentation="framed"]>.arch-flow>.arch-head+[data-slot="body"]{padding-block-start:var(--gap);border-block-start:var(--bw) solid var(--hairline)}
@container style(--seat-presentation: captured){
  .arch-header-body-actions[data-presentation="plain"]{min-inline-size:auto;height:100%}
  .arch-header-body-actions[data-presentation="plain"]>.arch-flow{min-inline-size:auto;height:100%;display:grid;grid-template-rows:auto 1fr;gap:0}
  .arch-header-body-actions[data-presentation="plain"]>.arch-flow>.arch-head{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-half);padding:var(--space-1h) var(--space-2h);border-block-end:var(--bw) solid var(--hairline);background:var(--surface-2);min-width:0}
  .arch-header-body-actions[data-presentation="plain"]>.arch-flow>.arch-head>[data-slot]{grid-column:1;grid-row:auto;padding:0;min-width:0}
  .arch-header-body-actions[data-presentation="plain"]>.arch-flow>.arch-head+[data-slot="body"]{border:0;padding:var(--space-4) var(--space-3);display:flex;align-items:center;justify-content:center;min-height:var(--page-runout);min-width:auto}
}
/* scoped-cell — ARRANGEMENT, CONTAINER-keyed. Slot body.
   The host owns the comparison frame around one PLAIN header-body-actions body under
   one BrandStyleScope. The source-bound compact face is explicit anatomy: a stacked micro-copy
   header band on --surface-2, followed by a centred specimen body over --page-runout.
   The flow join is zero-gap and the separator belongs to the header boundary, so the
   measured tile-grid gap remains the only inter-cell rhythm. All insets use register steps.
   The track fixes and CLIPS the OUTER cell; the nested plain panel still computes its
   brand-style-specific min-content measure before that frame clips it. That is the source
   comparison instrument: dialect content is never coerced to the neutral track width,
   and it never paints across the neighbouring bracket.
   The selected ring is OUTSIDE the frame and changes neither measure nor slot rhythm.
   The frame paints --bg-ground, re-anchored by the enclosing BrandStyleScope selector to
   that scope's --bg; inheriting the ambient AppShell ground would repaint every
   bracket in the page brand style and drop the comparison the arrangement exists to show.
   No pointer or keyboard rule lands here: a captured current face is paint, while
   activation remains an explicit assembly boundary rather than a clickable container. */
.arch-scoped-cell{container-type:inline-size;container-name:kit2-scoped-cell;display:grid;grid-template-rows:auto 1fr;min-inline-size:0;background:var(--bg-ground);color:var(--text);font-family:var(--font-ui);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);box-shadow:none;padding-block-end:0;overflow:hidden;--seat-presentation:captured}
.arch-scoped-cell>.arch-flow,.arch-scoped-cell>.arch-flow>[data-slot="body"]{min-inline-size:auto;height:100%}
.arch-scoped-cell>.arch-flow>[data-slot="body"]>*{margin-block:0}
.arch-scoped-cell[data-face="current"]{box-shadow:0 0 0 var(--ring-w) var(--accent)}
/* app-shell — PAGE floorplan, VIEWPORT-keyed. Slots rail | topBar | pageHeader |
   content(outlet) | inspector | statusBar (Workbench reconstruction, 2026-07-28: the
   designer standalone declares header and footer LANDMARKS and a shell-owned aside; the
   floorplan owed them seats — landmark:footer sat in the design mapping with no register
   home). Chrome is FLUSH (gap 0): shell separation belongs to the rail/bar surfaces
   themselves, and any floorplan gap would open unpainted seams between chrome and canvas.
   The bar and status bands span the full inline size (the designer's header/footer are
   page-wide bands ABOVE and BELOW the rail run, not column residents); rail and inspector
   flank the middle rows only. pageHeader is the PERSISTENT title row between the bar and
   the outlet: a shell row precisely so it outlives the outlet's route swap.
   Ladder: below --bp-page-narrow every band stacks — the shell never hides navigation by
   fiat; compact rail STATES are the rail assembly's business. */
/* THE PAGE GROUND paints HERE, not on body: the shell root is the dialect scope, so a
   brand style or mode flip repaints it, while the framework body reset underneath is an
   app-agnostic dark every mount would otherwise wear. --bg-ground rather than --bg so a
   brand style's page texture rides it (paintable-grounds census: ground). First live mount
   (the Workbench) exposed the gap: the token was defined and nothing painted it.
   THE BASE VOICE rides the same scope for the same reason: leaf recipes (.btn, .nav-item)
   each declare --font-ui, but prose inside slot fills inherited the UA serif because no
   ancestor ever set the family — the second gap the first live mount exposed. */
.arch-app-shell{background:var(--bg-ground);color:var(--text);font-family:var(--font-ui);font-size:var(--fs);line-height:var(--type-body-lh);display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto auto minmax(0,1fr) auto;block-size:100%;min-block-size:0}
/* Chrome rows are PINNED, not re-templated. The 1fr row's job must never fall to a
   content-sized row (a real-viewport bug the auto-height capture harness cannot see), and
   with two optional chrome rows the `:has()` re-template that guarded the one-row case
   would owe an entry per presence combination. Explicit grid-row placement is total by
   construction: content always lands on the 1fr row, and an empty auto track collapses to
   zero at gap 0, so an absent bar, header, inspector or status band reserves nothing. */
/* THE RAIL SLOT OWNS ITS WIDTH, and until now nothing did — which is why this slot had
   never been filled. The column is `auto`, so it sizes to its content; but every member
   shaped like a rail (rail-stack, list-pane) declares `container-type:inline-size`, and
   inline-size containment means an element sizes from its parent and NOT from its
   contents. Auto column asking the child, child asking the column: the track resolved to
   zero and the rail rendered as nothing, with the DOM perfectly correct. --rail-w was
   already in the register for this and consumed by no rule at all. The inspector column
   is the same shape on the end side, sized by --inspector-w. Both are shell PANE slots:
   they paint their surface, edge and inset because arrangement members deliberately carry
   no chrome. That is the rail-stack contract's mounting-slot boundary. */
.arch-app-shell>[data-slot="rail"]{grid-column:1;grid-row:2 / 4;inline-size:var(--rail-w);min-block-size:0;overflow:auto;background:var(--surface-ground);border-inline-end:var(--bw) solid var(--border);padding:var(--space-4) var(--space-2)}
.arch-app-shell>[data-slot="topBar"]{grid-column:1 / -1;grid-row:1;min-inline-size:0;padding:var(--space-2h) var(--space-4);background:var(--surface-ground);border-block-end:var(--bw) solid var(--border);position:relative;z-index:var(--layer-sticky)}
.arch-app-shell>[data-slot="pageHeader"]{grid-column:2;grid-row:2;min-inline-size:0;padding:var(--space-3) var(--space-5);border-block-end:var(--bw) solid var(--hairline)}
/* The content seat is the shell's one block-axis constraint boundary. A mounted page
   gets the fixed 1fr row through this column flex host, so its own flex:1 stage can
   divide the available viewport from an intrinsic detail band. Leaving the seat block
   formatted lets the page grow to max-content and turns that split into route-dependent
   overflow — the reconstruction Workbench exposed exactly that drift. The direct page
   root also fills the seat in BOTH directions: flex-shrink constrains tall pages, while
   flex-grow keeps short pages from collapsing the 1fr row around their contents. */
.arch-app-shell>[data-slot="content"]{grid-column:2;grid-row:3;display:flex;flex-direction:column;min-inline-size:0;min-block-size:0;overflow:auto}
.arch-app-shell>[data-slot="content"]>*{flex:1 1 auto;min-block-size:0}
.arch-app-shell>[data-slot="inspector"]{grid-column:3;grid-row:2 / 4;inline-size:var(--inspector-w);min-block-size:0;overflow:auto;background:var(--surface-ground);border-inline-start:var(--bw) solid var(--border);padding:var(--space-4) var(--space-4) var(--space-7)}
.arch-app-shell>[data-slot="statusBar"]{grid-column:1 / -1;grid-row:4;min-inline-size:0;padding:var(--space-1h) var(--space-4);background:var(--surface-ground);border-block-start:var(--bw) solid var(--border);font-family:var(--font-mono);font-size:var(--type-micro-size);color:var(--text-3)}
/* QUARANTINE SEAT OWNERSHIP (reconstruction, 2026-07-31, REVERSED same day): a seat-yield rule
   (`[data-slot]:has(>[data-stub]:only-child){padding:0;background:none;border:none}`) briefly zeroed seat
   chrome after a live topBar measured 81px against the source's 55px. The doubling it patched cannot
   recur: the emission's rounding lane skips every stub declaration that byte-matches a register rule
   (preflightRounding register-owned skip), so a minted fill NEVER carries seat chrome — and with the
   yield rule active the seats measured SHORT by exactly their own pads (run-0055: topBar 34px vs 55,
   statusBar 10.9px vs 27.7, all three viewports). The seat owns its chrome unconditionally; a fill that
   restates it is emission drift for the matrix to report, never for a selector to hide. */
.arch-app-shell>[data-slot]>*{margin-block:0}
@media (width < 640px){
  .arch-app-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto minmax(0,1fr) auto auto}
  .arch-app-shell>[data-slot="rail"]{grid-column:1;grid-row:1;inline-size:auto;overflow:visible;border-inline-end:none;border-block-end:var(--bw) solid var(--border);padding:0}
  .arch-app-shell>[data-slot="topBar"]{grid-column:1;grid-row:2}
  .arch-app-shell>[data-slot="pageHeader"]{grid-column:1;grid-row:3}
  .arch-app-shell>[data-slot="content"]{grid-column:1;grid-row:4}
  .arch-app-shell>[data-slot="inspector"]{grid-column:1;grid-row:5;inline-size:auto;border-inline-start:none;border-block-start:var(--bw) solid var(--border)}
  .arch-app-shell>[data-slot="statusBar"]{grid-column:1;grid-row:6}
}
/* list-index — PAGE floorplan, VIEWPORT-keyed. Slots header | scopeRail | filterBand |
   collection | inspector | footer (Q-28 grammar, 2026-07-25). The PLAIN index is ladder-free:
   a single column is correct at every width, and the collection owns the leftover viewport
   block and scrolls inside it, so the footer (pagination) can never be pushed out of view.
   Q-28 ruling: a scope rail and/or an inspector promotes that column into the THREE-REGION
   BROWSE body grid — the shape 8+ corpus apps build — with no combination archetype minted:
   the slot declaration IS the fact, so :has() is the only thing that has to notice. Both
   rails ride the --pane-min track and span the whole body beside band, collection and
   footer; each absent rail frees its own track, and the inspector pins to the LAST line (-2)
   so freeing the leading rail re-numbers the grid for free. The grid placements sit on the
   slot hosts unconditionally and are INERT while the host is a flex column — which is what
   keeps the plain index byte-identical to its pre-Q-28 self. Ladder: below --bp-rail-collapse
   the body returns to the base column, so both rails become full-width runs in DOM order. */
.arch-list-index{display:flex;flex-direction:column;gap:var(--gap);block-size:100%;min-block-size:0}
.arch-list-index>[data-slot="collection"]{flex:1;grid-column:2;grid-row:3;min-block-size:0;overflow:auto}
.arch-list-index>[data-slot]{min-inline-size:0}
.arch-list-index>[data-slot]>*{margin-block:0}
.arch-list-index:has(>[data-slot="scopeRail"]),.arch-list-index:has(>[data-slot="inspector"]){display:grid;grid-template-columns:var(--pane-min) minmax(0,1fr) var(--pane-min);grid-template-rows:auto auto minmax(0,1fr) auto}
.arch-list-index:has(>[data-slot="scopeRail"]):not(:has(>[data-slot="inspector"])){grid-template-columns:var(--pane-min) minmax(0,1fr)}
.arch-list-index:has(>[data-slot="inspector"]):not(:has(>[data-slot="scopeRail"])){grid-template-columns:minmax(0,1fr) var(--pane-min)}
.arch-list-index>[data-slot="header"]{grid-column:1 / -1;grid-row:1}
.arch-list-index>[data-slot="scopeRail"]{grid-column:1;grid-row:2 / -1;min-block-size:0;overflow:auto}
.arch-list-index>[data-slot="filterBand"]{grid-column:2;grid-row:2}
.arch-list-index>[data-slot="inspector"]{grid-column:-2;grid-row:2 / -1;min-block-size:0;overflow:auto}
.arch-list-index>[data-slot="footer"]{grid-column:2;grid-row:4}
/* no scope rail: the body column IS the first track, so the three body rows re-pin to it */
.arch-list-index:not(:has(>[data-slot="scopeRail"]))>[data-slot="filterBand"],.arch-list-index:not(:has(>[data-slot="scopeRail"]))>[data-slot="collection"],.arch-list-index:not(:has(>[data-slot="scopeRail"]))>[data-slot="footer"]{grid-column:1}
/* Narrow: the body returns to the base flex column and every grid placement above goes
   inert, so the rails stack in DOM order. No overflow re-declaration under the shared
   @media prelude (register guard) — every region keeps its base scroll. */
@media (width < 900px){
  .arch-list-index:has(>[data-slot="scopeRail"]),.arch-list-index:has(>[data-slot="inspector"]){display:flex}
}
/* object-detail — PAGE floorplan, VIEWPORT-keyed. Slots identityHeader | sections[many] | related.
   Whole-page scroll (no viewport box): detail pages are documents. Identity spans the full
   width; sections stack in .arch-main at SECTION rhythm; related rides a --pane-min rail
   beside them (row-gap is section, column-gap is group). .arch-main exists because
   sections are MANY: without the wrapper each section would mint its own grid row and the
   related rail could not span them. Absent related frees its track (:has()).
   Ladder: below --bp-rail-collapse the rail drops beneath the sections. */
.arch-object-detail{display:grid;grid-template-columns:minmax(0,1fr) var(--pane-min);gap:var(--section-gap) var(--gap);min-block-size:0}
.arch-object-detail>[data-slot="identityHeader"]{grid-column:1 / -1;min-inline-size:0}
.arch-object-detail>.arch-main{grid-column:1;display:flex;flex-direction:column;gap:var(--section-gap);min-inline-size:0}
/* related keeps an AUTO row: the cursor lands it beside .arch-main whether or not the
   identity header exists — a row-2 pin would strand it below a headerless main. */
.arch-object-detail>[data-slot="related"]{grid-column:2;min-inline-size:0}
.arch-object-detail:not(:has(>[data-slot="related"])){grid-template-columns:minmax(0,1fr)}
.arch-object-detail>[data-slot]>*,.arch-object-detail>.arch-main>*{margin-block:0}
@media (width < 900px){
  .arch-object-detail{grid-template-columns:minmax(0,1fr)}
  .arch-object-detail>[data-slot="related"]{grid-column:1;grid-row:auto}
}
/* dashboard-overview — PAGE floorplan, VIEWPORT-keyed stratum, intrinsic interior: the header
   leads, then the KPI band, then tiles filling an auto-FILL grid on the published --tile-min
   axis (retunable inline for bigger dashboard cards). Band-to-tiles is SECTION rhythm.
   Whole-page scroll; no @media — the tile grid is intrinsically width-correct. Slots
   header | kpiBand | tiles[many] (tiles are direct children of .arch-tiles, the many-slot
   wrapper precedent).

   THE ONE ASYMMETRIC PAIR. Every other step down this column is SECTION — two peers, one
   uniform gap. A header is not a peer of what follows it: it LABELS it, and proximity is how
   that reads, so the pair after the header binds at --space-5 instead. Spelled here rather
   than as a fifth SPEC-40 word because all four relationship words are peer distances and
   tier 0 is where the register says the asymmetric case is resolved (list-index runs its whole
   flow at --gap; header-body-actions binds head-to-body at the same step). One rule, on the
   ADJACENT sibling rather than on a named slot, so the bind lands on whatever actually
   follows the header — the band when there is one, the tile grid when there is not. The calc
   subtracts the flex gap the pair has already spent; --space-5 sits below --section-gap at
   all three densities (24/56, 18/36, 14/23), so the delta is negative by construction. */
.arch-dashboard-overview{display:flex;flex-direction:column;gap:var(--section-gap);min-block-size:0}
.arch-dashboard-overview>[data-slot="header"]+*{margin-block-start:calc(var(--space-5) - var(--section-gap))}
.arch-dashboard-overview>.arch-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--tile-min),100%),1fr));gap:var(--gap);min-inline-size:0}
.arch-dashboard-overview>[data-slot="header"]>*,.arch-dashboard-overview>[data-slot="kpiBand"]>*,.arch-dashboard-overview>.arch-tiles>*{margin-block:0;min-inline-size:0}
/* supporting-pane — PAGE floorplan, VIEWPORT-keyed. Slots primary | supportingRail.
   The asymmetric split master-detail is not: one document column plus a --pane-min rail,
   whole-page scroll (the rail supports reading, it is not an independent pane). Ladder:
   below --bp-rail-collapse the rail drops beneath the primary column. */
.arch-supporting-pane{display:grid;grid-template-columns:minmax(0,1fr) var(--pane-min);gap:var(--gap);min-block-size:0}
/* An absent rail must not reserve its track (master-detail's :has() precedent). */
.arch-supporting-pane:not(:has(>[data-slot="supportingRail"])){grid-template-columns:minmax(0,1fr)}
.arch-supporting-pane>[data-slot]{min-inline-size:0}
.arch-supporting-pane>[data-slot]>*{margin-block:0}
@media (width < 900px){
  .arch-supporting-pane{grid-template-columns:minmax(0,1fr)}
}
/* wizard — PAGE floorplan, VIEWPORT-keyed stratum, ladder-free: auto/1fr/auto rows are
   width-correct everywhere. Slots stepper | stepBody | footerActions. The floorplan owns
   the viewport block box so the commit row is ALWAYS visible; only the step body scrolls
   — a wizard where "Continue" can leave the screen is a broken wizard. */
.arch-wizard{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:var(--gap);block-size:100%;min-block-size:0}
/* Absent chrome re-templates the rows so auto-placement can never hand the 1fr row to
   the commit band (invisible in the auto-height capture harness, real at mount). */
.arch-wizard:not(:has(>[data-slot="stepper"])){grid-template-rows:minmax(0,1fr) auto}
.arch-wizard:not(:has(>[data-slot="footerActions"])){grid-template-rows:auto minmax(0,1fr)}
.arch-wizard:not(:has(>[data-slot="stepper"])):not(:has(>[data-slot="footerActions"])){grid-template-rows:minmax(0,1fr)}
.arch-wizard>[data-slot="stepBody"]{min-block-size:0;overflow:auto}
.arch-wizard>[data-slot]{min-inline-size:0}
.arch-wizard>[data-slot]>*{margin-block:0}
/* workspace-canvas — PAGE floorplan, VIEWPORT-keyed. Slots toolbar | structureRail |
   canvas(free) | artifactStage | inspector | footerBand (Q-28 grammar, 2026-07-25).
   Studio chrome is FLUSH (gap 0, same law as app-shell). The canvas is the ONE sanctioned
   free region and the floorplan seals it: overflow:hidden, so the app's interior can never
   scroll the shell. Its XOR twin the artifact STAGE is the deliberate opposite — it scrolls,
   because the interior it centres is sized by the ARTIFACT (--artifact-w, consumer-supplied:
   SPEC-56's third keying, neither container nor viewport) and an artifact wider than its
   stage must stay reachable. No default is published — an unsupplied width is invalid at
   computed-value time and falls back to auto, which is the honest answer for "the artifact
   did not say". Centring is margin-inline:auto, not centred flex: auto margins collapse to
   zero on overflow while centred flex clips the start edge out of reach. Both rails ride a
   --pane-min track and scroll alone; each absent rail frees its own track, and the inspector
   pins to the LAST line (-2) so freeing the leading rail re-numbers the grid for free.
   Ladder: below --bp-rail-collapse everything stacks — rail, interior at 2fr, inspector. */
.arch-workspace-canvas{display:grid;grid-template-columns:var(--pane-min) minmax(0,1fr) var(--pane-min);grid-template-rows:auto minmax(0,1fr) auto;block-size:100%;min-block-size:0}
.arch-workspace-canvas>[data-slot="toolbar"]{grid-column:1 / -1;min-inline-size:0}
.arch-workspace-canvas>[data-slot="structureRail"]{grid-column:1;grid-row:2;min-block-size:0;overflow:auto}
.arch-workspace-canvas>[data-slot="canvas"]{grid-column:2;grid-row:2;min-inline-size:0;min-block-size:0;overflow:hidden}
.arch-workspace-canvas>[data-slot="artifactStage"]{grid-column:2;grid-row:2;min-inline-size:0;min-block-size:0;overflow:auto}
.arch-workspace-canvas>[data-slot="artifactStage"]>*{inline-size:var(--artifact-w);margin-inline:auto}
.arch-workspace-canvas>[data-slot="inspector"]{grid-column:-2;grid-row:2;min-block-size:0;overflow:auto}
.arch-workspace-canvas>[data-slot="footerBand"]{grid-column:1 / -1;min-inline-size:0}
/* each absent rail frees its own track, and the pair of them collapses to one column */
.arch-workspace-canvas:not(:has(>[data-slot="structureRail"])){grid-template-columns:minmax(0,1fr) var(--pane-min)}
.arch-workspace-canvas:not(:has(>[data-slot="inspector"])){grid-template-columns:var(--pane-min) minmax(0,1fr)}
.arch-workspace-canvas:not(:has(>[data-slot="structureRail"])):not(:has(>[data-slot="inspector"])){grid-template-columns:minmax(0,1fr)}
.arch-workspace-canvas:not(:has(>[data-slot="structureRail"]))>[data-slot="canvas"],.arch-workspace-canvas:not(:has(>[data-slot="structureRail"]))>[data-slot="artifactStage"]{grid-column:1}
.arch-workspace-canvas>[data-slot]>*{margin-block:0}
/* Narrow: the interior keeps 2/3 of the block, the inspector 1/3, the structure rail an auto
   row above them (empty when it is absent — chrome is flush, so an empty auto row costs
   nothing). The single column is re-asserted THROUGH each freed-track selector, not just the
   bare host: a :not(:has()) rule outranks a plain class, so a lone .arch-workspace-canvas
   here would leave a rail-free workspace on two tracks below the breakpoint. Every region
   keeps its BASE overflow (re-declaring overflow under a shared @media prelude shadows
   master-detail's — guard). */
@media (width < 900px){
  .arch-workspace-canvas,.arch-workspace-canvas:not(:has(>[data-slot="structureRail"])),.arch-workspace-canvas:not(:has(>[data-slot="inspector"])){grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto minmax(0,2fr) minmax(0,1fr) auto}
  .arch-workspace-canvas>[data-slot="structureRail"]{grid-column:1;grid-row:2}
  .arch-workspace-canvas>[data-slot="canvas"],.arch-workspace-canvas>[data-slot="artifactStage"]{grid-column:1;grid-row:3}
  .arch-workspace-canvas>[data-slot="inspector"]{grid-column:1;grid-row:4}
  .arch-workspace-canvas>[data-slot="footerBand"]{grid-row:5}
}
/* settings-editor — PAGE floorplan, VIEWPORT-keyed. Slots sectionNav | form(spec) | saveBand.
   Nav rail and form scroll independently inside the viewport box; the save band spans the
   full width and is ALWAYS visible (a settings page whose save control scrolls away loses
   edits). Ladder: below --bp-rail-collapse the nav becomes a band above the form. */
.arch-settings-editor{display:grid;grid-template-columns:var(--pane-min) minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto;gap:var(--gap);block-size:100%;min-block-size:0}
/* Absent nav/save chrome frees its track instead of reserving dead space (:has() law). */
.arch-settings-editor:not(:has(>[data-slot="sectionNav"])){grid-template-columns:minmax(0,1fr)}
.arch-settings-editor:not(:has(>[data-slot="saveBand"])){grid-template-rows:minmax(0,1fr)}
.arch-settings-editor>[data-slot="sectionNav"]{grid-row:1;min-block-size:0;overflow:auto}
.arch-settings-editor>[data-slot="form"]{grid-row:1;min-inline-size:0;min-block-size:0;overflow:auto}
.arch-settings-editor>[data-slot="saveBand"]{grid-column:1 / -1;min-inline-size:0}
.arch-settings-editor>[data-slot]>*{margin-block:0}
/* Narrow: the nav row is content-sized, so its base overflow:auto is inert — no overflow
   re-declaration under the shared @media prelude (register guard). */
@media (width < 900px){
  .arch-settings-editor{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}
  .arch-settings-editor>[data-slot="sectionNav"]{grid-row:1}
  .arch-settings-editor>[data-slot="form"]{grid-row:2}
}
/* auth-gate — PAGE floorplan, VIEWPORT-keyed stratum, ladder-free: a centered column is
   correct at every width. Slots brand | card(spec) | metaLinks, stacked dead-center at
   SECTION rhythm; the card spec owns its own width — the gate only places it. */
.arch-auth-gate{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--section-gap);block-size:100%;min-block-size:0}
.arch-auth-gate>[data-slot]{min-inline-size:0}
.arch-auth-gate>[data-slot]>*{margin-block:0}
/* setup-checklist — PAGE floorplan, VIEWPORT-keyed stratum, ladder-free: a centered measure
   column is correct at every width. Slots progress | tasks[many] | ghosts[many] (admitted
   Q-30, 2026-07-25 — Shopify Setup Guide + GOV.UK Task List + Salesforce Guidance Center).
   Whole-page scroll: a first-run checklist is a document, exactly like its dashboard-overview
   twin. This is the one PAGE entry with an inner .arch-flow, and it earns it: the host is the
   page box while .arch-flow is the capped, centred MEASURE column — two boxes doing two jobs,
   where every other floorplan's host is its own grid. The column caps at --overlay-lg (the
   register's existing 800px step) because nothing between --measure (prose ch) and
   --content-max (full page scale) exists, and minting a token is a SPEC-22 event this recipe
   does not carry. Tasks and ghosts are MANY fills, so each takes a wrapper (dashboard-
   overview's .arch-tiles precedent) — without one, every task would spend a SECTION step
   instead of sharing the GROUP run. There is NO STEPPER and no traversal anywhere in this
   rhythm: the tasks are concurrent (GOV.UK: "allow users to complete tasks in any order"),
   which is precisely what makes this entry not a wizard. */
.arch-setup-checklist{display:block;min-inline-size:0;min-block-size:0}
.arch-setup-checklist>.arch-flow{display:flex;flex-direction:column;gap:var(--section-gap);max-inline-size:var(--overlay-lg);margin-inline:auto;min-inline-size:0}
.arch-setup-checklist>.arch-flow>.arch-tasks,.arch-setup-checklist>.arch-flow>.arch-ghosts{display:flex;flex-direction:column;gap:var(--gap);min-inline-size:0}
.arch-setup-checklist>.arch-flow>[data-slot]>*,.arch-setup-checklist>.arch-flow>.arch-tasks>*,.arch-setup-checklist>.arch-flow>.arch-ghosts>*{margin-block:0}
/* toolbar-row — ARRANGEMENT, CONTAINER-keyed. Slots leading[many] | trailing[many].
   Two clusters on one band, pushed apart; controls inside a cluster sit at --space-2 (the
   intra-cluster rhythm every band shares with header-body-actions). The band WRAPS rather
   than laddering: below --bp-section-tight the trailing cluster falls to its own line and
   re-aligns start, so a narrow pane reads as two stacked runs, never a crushed single row. */
.arch-toolbar-row{container-type:inline-size;container-name:kit2-toolbar-row;display:block;min-inline-size:0}
.arch-toolbar-row>.arch-flow{display:flex;justify-content:space-between;align-items:center;gap:var(--gap);flex-wrap:wrap;min-inline-size:0}
.arch-toolbar-row>.arch-flow>[data-slot]{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;min-inline-size:0}
.arch-toolbar-row>.arch-flow>[data-slot="trailing"]{justify-content:flex-end}
.arch-toolbar-row>.arch-flow>[data-slot]>*{margin-block:0}
@container kit2-toolbar-row (width < 480px){
  .arch-toolbar-row>.arch-flow>[data-slot]{flex:1 1 100%}
  .arch-toolbar-row>.arch-flow>[data-slot="trailing"]{justify-content:flex-start}
}
/* form-grid — ARRANGEMENT, CONTAINER-keyed intrinsically. Slot fields (spec-driven).
   Rides the same --field-min axis as the .grid-fields primitive: columns are however many
   field floors fit the CONTAINER — intrinsic sizing is container-relative by construction,
   so no query ladder exists to drift. The archetype's own contribution is rhythm: --gap
   between columns, --gap between rows, and margin-zeroed field boxes. */
.arch-form-grid{container-type:inline-size;container-name:kit2-form-grid;display:block;min-inline-size:0}
.arch-form-grid>.arch-flow{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(var(--field-min),100%),1fr));gap:var(--gap);min-inline-size:0}
.arch-form-grid>.arch-flow>*{margin-block:0;min-inline-size:0}
/* tile-grid — ARRANGEMENT, CONTAINER-keyed intrinsically. Slot tiles[many].
   auto-FILL against the published --tile-min axis (retunable inline, exactly as .grid is):
   ghost tracks keep tile width honest on wide containers instead of overstretching a
   sparse collection. kpi-band is the deliberate auto-FIT contrast. The registered
   occupancy axis (2026-08-01) selects the SAME pair per mount: honest = auto-fill (the
   default and founding contract), flood = auto-fit — the Workbench specimen row, where
   the comparison cells divide the row instead of holding tile width. */
.arch-tile-grid{container-type:inline-size;container-name:kit2-tile-grid;display:block;min-inline-size:0}
.arch-tile-grid[data-track="specimen"]{--tile-min:var(--tile-min-specimen)}
.arch-tile-grid>.arch-flow{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--tile-min),100%),1fr));gap:var(--gap);align-items:start;min-inline-size:0}
.arch-tile-grid[data-occupancy="flood"]>.arch-flow{grid-template-columns:repeat(auto-fit,minmax(min(var(--tile-min),100%),1fr))}
.arch-tile-grid>.arch-flow>*{margin-block:0;min-inline-size:0}
/* kpi-band — ARRANGEMENT, CONTAINER-keyed intrinsically. Slot tiles[many] (stat tiles).
   auto-FIT: a band is a full-bleed strip, so tiles STRETCH to divide the row evenly —
   four KPIs read as one band, not four cards adrift. Same --tile-min floor keeps a narrow
   pane from mincing tiles; short rows widen instead. Row COUNT is never declared: wrap is
   whole-cell at container steps and falls out of the container (B-2, 2026-07-25).
   The baked data-presentation face (B-2): 'detached' is the base rule — discrete tiles at
   --gap, the 2026-07-23 seed contract, and the default. 'joined' is the corpus-dominant
   fused band: ONE framed box whose internal hairlines ARE the grid gap (--bw of --hairline
   ground, each cell re-asserting --surface). That construction is chosen because it is the
   only one whose dividers survive WRAP — a border-per-cell doubles against the frame the
   moment a row breaks, and this band's row count is the container's to decide. The frame
   is the one place this rhythm layer paints, and only because the ratified fused face IS a
   frame — it adds no cell INSET even so: the tile filler owns its padding in both faces,
   exactly as it does everywhere else in this layer. */
.arch-kpi-band{container-type:inline-size;container-name:kit2-kpi-band;display:block;min-inline-size:0}
.arch-kpi-band>.arch-flow{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(var(--tile-min),100%),1fr));gap:var(--gap);min-inline-size:0}
.arch-kpi-band>.arch-flow>*{margin-block:0;min-inline-size:0}
.arch-kpi-band[data-presentation="joined"]>.arch-flow{gap:var(--bw);background:var(--hairline);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);overflow:hidden}
.arch-kpi-band[data-presentation="joined"]>.arch-flow>*{background:var(--surface-ground)}
/* a band with no tiles must not paint a frame around nothing — the one case where the
   joined face has to say something the detached face gets for free */
.arch-kpi-band[data-presentation="joined"]>.arch-flow:empty{border-width:0;background:none}
/* filter-band — ARRANGEMENT, CONTAINER-keyed. Slots facets[many] | secondFacets[many] | trailing[many].
   Re-specced B-1 (2026-07-25) from an additive applied-filter builder to the SINGLE-SELECT
   facet strip the corpus actually builds. Still ONE wrapping run: both facet hosts are
   display:contents, so every chip of both groups — and the group rule between them — are
   siblings on that run and wrap together. The rule is a real box emitted only WITH the
   second group, so it can never orphan; it speaks --border at --bw over --icon-md, which is
   the .divider[data-orientation="vertical"] recipe verbatim — the group rule plays that
   control's exact role, and --hairline (the WITHIN-SURFACE voice this band has no frame to
   sit inside) would disappear against page ground. The trailing
   cluster (count readout / sort) rides the END of the first line on an auto margin —
   alignment, never a distance — and re-aligns start once the band wraps (toolbar-row's law). */
.arch-filter-band{container-type:inline-size;container-name:kit2-filter-band;display:block;min-inline-size:0}
.arch-filter-band>.arch-flow{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);min-inline-size:0}
.arch-filter-band>.arch-flow>[data-slot="facets"],.arch-filter-band>.arch-flow>[data-slot="secondFacets"]{display:contents}
.arch-filter-band>.arch-flow>.arch-rule{inline-size:var(--bw);block-size:var(--icon-md);background:var(--border);flex-shrink:0}
.arch-filter-band>.arch-flow>[data-slot="trailing"]{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;margin-inline-start:auto}
.arch-filter-band>.arch-flow>[data-slot]>*{margin-block:0}
@container kit2-filter-band (width < 480px){
  .arch-filter-band>.arch-flow>[data-slot="trailing"]{margin-inline-start:0}
}
/* footer-action-row — ARRANGEMENT, CONTAINER-keyed. Slots primary | secondary[many] | destructive.
   The commit band: destructive quarantined at the START (an auto margin pushes the rest
   away — alignment, not a distance), secondary then primary at the END so the eye lands on
   primary last. Below --bp-section-tight it stacks FULL-WIDTH, primary on top (the stack
   is column-reverse of DOM order, so keyboard/DOM order stays destructive-last-in-danger
   position while the thumb gets primary first). */
.arch-footer-action-row{container-type:inline-size;container-name:kit2-footer-action-row;display:block;min-inline-size:0}
.arch-footer-action-row>.arch-flow{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2);flex-wrap:wrap;min-inline-size:0}
.arch-footer-action-row>.arch-flow>[data-slot="destructive"]{margin-inline-end:auto}
.arch-footer-action-row>.arch-flow>[data-slot="secondary"]{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}
.arch-footer-action-row>.arch-flow>[data-slot]>*{margin-block:0}
@container kit2-footer-action-row (width < 480px){
  .arch-footer-action-row>.arch-flow{flex-direction:column-reverse;align-items:stretch}
  .arch-footer-action-row>.arch-flow>[data-slot="destructive"]{margin-inline-end:0}
  .arch-footer-action-row>.arch-flow>[data-slot="secondary"]{flex-direction:column-reverse;align-items:stretch}
  /* single-control hosts join the stretch so every stacked action is full-width */
  .arch-footer-action-row>.arch-flow>[data-slot="primary"],.arch-footer-action-row>.arch-flow>[data-slot="destructive"]{display:flex;flex-direction:column;align-items:stretch}
}
/* list-pane — ARRANGEMENT, CONTAINER-keyed. Slots rows[many] | empty.
   Rows are FLUSH (gap 0): separation belongs to the rows' own padding and dividers, and
   any archetype gap here would double against them. The pane owns exactly two things:
   margin-zeroed flush stacking, and a centered empty state with enough block padding that
   an empty pane still reads as a REGION, not a collapsed sliver. */
.arch-list-pane{container-type:inline-size;container-name:kit2-list-pane;display:block;min-inline-size:0}
.arch-list-pane>.arch-flow{display:flex;flex-direction:column;min-inline-size:0}
.arch-list-pane>.arch-flow>[data-slot="rows"]{display:flex;flex-direction:column;min-inline-size:0}
/* A row is a READING LINE: whatever control fills the seat, its content aligns start —
   center-justified row fills mint one alignment line per label (SPEC-42 cap catch,
   found by the first tier-2 admission). Alignment is arrangement; the archetype owns it. */
.arch-list-pane>.arch-flow>[data-slot="rows"]>*{justify-content:flex-start;text-align:start}
.arch-list-pane>.arch-flow>[data-slot="empty"]{display:grid;place-items:center;padding-block:var(--space-7);text-align:center}
.arch-list-pane>.arch-flow>[data-slot]>*{margin-block:0}
/* table-frame — ARRANGEMENT, CONTAINER-keyed. Slots toolbar | table | footer.
   Chrome above and below at GROUP rhythm; the table slot is the ONE sanctioned horizontal
   scroller (a wide table scrolls inside its frame — the page body never does). */
.arch-table-frame{container-type:inline-size;container-name:kit2-table-frame;display:block;min-inline-size:0}
.arch-table-frame>.arch-flow{display:flex;flex-direction:column;gap:var(--gap);min-inline-size:0}
.arch-table-frame>.arch-flow>[data-slot="table"]{min-inline-size:0;overflow-x:auto}
.arch-table-frame>.arch-flow>[data-slot]>*{margin-block:0}
/* split-columns — ARRANGEMENT, CONTAINER-keyed. Slots start | end.
   Two equal content columns at GROUP rhythm, stacking below --bp-section-tight (start
   first — reading order and DOM order agree). Unequal splits are a DIFFERENT archetype
   (content-rail-stack here, supporting-pane at page stratum); this one is deliberately
   symmetric. B-4.1 (2026-07-25): the seam is FIXED-RATIO — there is no resize affordance
   in this rhythm and never was; a draggable seam is an opt-in axis the SplitPane CONTROL
   would carry, never a baked clause here (0 resizable splits in the 74-screen corpus). */
.arch-split-columns{container-type:inline-size;container-name:kit2-split-columns;display:block;min-inline-size:0}
.arch-split-columns>.arch-flow{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap);min-inline-size:0}
.arch-split-columns>.arch-flow>[data-slot]>*{margin-block:0}
@container kit2-split-columns (width < 480px){
  .arch-split-columns>.arch-flow{grid-template-columns:minmax(0,1fr)}
}
/* media-frame — ARRANGEMENT, CONTAINER-keyed. Slots media | caption | actions[many].
   A figure: media fills the frame inline, caption sits TIGHT beneath it (they are one
   object), the action run follows at intra-cluster rhythm. Media boxes are display:block
   and capped at 100% so a raw <img> can never widen the frame past its container. */
.arch-media-frame{container-type:inline-size;container-name:kit2-media-frame;display:block;min-inline-size:0}
.arch-media-frame>.arch-flow{display:flex;flex-direction:column;gap:var(--space-1);min-inline-size:0}
.arch-media-frame>.arch-flow>[data-slot="media"]>*{display:block;max-inline-size:100%;margin-block:0}
.arch-media-frame>.arch-flow>[data-slot="actions"]{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}
.arch-media-frame>.arch-flow>[data-slot="caption"]>*,.arch-media-frame>.arch-flow>[data-slot="actions"]>*{margin-block:0}
/* commit-band — ARRANGEMENT, CONTAINER-keyed. Slots readout | when | primary | caveat.
   Admitted B-3 (2026-07-25): the pane/page TERMINAL band. The readiness readout takes the
   free measure (flex:1) and the when-selector + gated primary ride the END of the same
   line; the caveat/reversal line sits TIGHT beneath the row, because caveat and commit are
   ONE object — band↔neighbour space stays section-stack's to own. STICKY at the block-end
   of its scroll ancestor: a commit control that can scroll out of view is the defect this
   entry exists to close (the wizard floorplan answers the same question with a viewport
   row). No paint — the band's own surface is the assembly's, exactly as everywhere else in
   this layer; .arch-head mounts only when a row slot is filled, so an empty band never
   spends the flow gap (header-body-actions' precedent). Ladder: below --bp-section-tight
   every row slot takes its own full-width line and the primary stretches, so a narrow pane
   never crushes the readout into premature wrapping (toolbar-row / footer-action-row law). */
.arch-commit-band{container-type:inline-size;container-name:kit2-commit-band;position:sticky;inset-block-end:0;display:block;min-inline-size:0}
.arch-commit-band>.arch-flow{display:flex;flex-direction:column;gap:var(--space-1);min-inline-size:0}
.arch-commit-band>.arch-flow>.arch-head{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--gap);min-inline-size:0}
/* readout takes the leftover measure, so justify-content only bites when it is ABSENT */
.arch-commit-band>.arch-flow>.arch-head>[data-slot="readout"]{flex:1 1 auto;min-inline-size:0}
.arch-commit-band>.arch-flow>[data-slot="caveat"]{min-inline-size:0}
.arch-commit-band>.arch-flow>.arch-head>[data-slot]>*,.arch-commit-band>.arch-flow>[data-slot="caveat"]>*{margin-block:0}
@container kit2-commit-band (width < 480px){
  .arch-commit-band>.arch-flow>.arch-head{align-items:stretch}
  .arch-commit-band>.arch-flow>.arch-head>[data-slot]{flex:1 1 100%}
  /* single-control host joins the stretch so the stacked commit is full-width */
  .arch-commit-band>.arch-flow>.arch-head>[data-slot="primary"]{display:flex;flex-direction:column;align-items:stretch}
}
/* content-rail-stack — ARRANGEMENT, CONTAINER-keyed. Slots main[many] | rail[many].
   Admitted B-4.2 (2026-07-25): the asymmetric two-column BODY — a minmax(0,1.7fr) content
   column beside a minmax(--pane-min,1fr) rail, ALIGNED START so a short rail never
   stretches to the main column's height. Each side is an independent vertical stack of
   heterogeneous panels at GROUP rhythm, which is exactly what makes this NOT a split:
   split-columns is symmetric and seamed, this one's whole point is the RATIO, so no ratio
   axis is published (a screen wanting equal halves is asking for split-columns).
   An absent rail frees its track rather than reserving dead space — every rail-bearing
   entry obeys that :has() law (master-detail, object-detail, supporting-pane).
   Ladder: below --bp-rail-collapse the rail drops BENEATH the main column, the same step
   every rail-bearing floorplan collapses on; DOM order is main then rail, so the stacked
   reading order needs no re-ordering. */
.arch-content-rail-stack{container-type:inline-size;container-name:kit2-content-rail-stack;display:block;min-inline-size:0}
.arch-content-rail-stack>.arch-flow{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(var(--pane-min),1fr);gap:var(--gap);align-items:start;min-inline-size:0}
.arch-content-rail-stack>.arch-flow:not(:has(>[data-slot="rail"])){grid-template-columns:minmax(0,1fr)}
.arch-content-rail-stack>.arch-flow>[data-slot]{display:flex;flex-direction:column;gap:var(--gap);min-inline-size:0}
.arch-content-rail-stack>.arch-flow>[data-slot]>*{margin-block:0}
@container kit2-content-rail-stack (width < 900px){
  .arch-content-rail-stack>.arch-flow{grid-template-columns:minmax(0,1fr)}
}
/* preflight-list — ARRANGEMENT, CONTAINER-keyed. Slots summary(optional) | checks[many].
   Admitted 2026-07-26 (Phase-4 mint): the graded run of a publish spine — the ONE sub-anatomy
   of that spine a design system documents (GitLab Pajamas "Merge request reports": graded
   statuses, a severity ladder, a status/subject/actions row grid). GRADING IS ROW CONTENT:
   pass / warn-with-remedy / hard-block are the filling control's verdict, so no severity axis,
   no blocked count and no per-grade selector appears here — the archetype owns only the run.
   The summary is the run's ROLLUP, so it rides the GROUP step above it rather than joining it,
   and .arch-checks wraps the MANY fill so its members share ONE run at the --space-2
   intra-cluster step (setup-checklist's .arch-tasks precedent; a run of status lines is one
   cluster, not a stack of cards). LADDER-FREE: a status run is a column at every width, so the
   named container is declared per Q-22.1 and queried by nothing — the list-pane precedent —
   and whether a ROW reflows inside itself is the row's business. */
.arch-preflight-list{container-type:inline-size;container-name:kit2-preflight-list;display:block;min-inline-size:0}
.arch-preflight-list>.arch-flow{display:flex;flex-direction:column;gap:var(--gap);min-inline-size:0}
.arch-preflight-list>.arch-flow>.arch-checks{display:flex;flex-direction:column;gap:var(--space-2);min-inline-size:0}
.arch-preflight-list>.arch-flow>[data-slot]>*,.arch-preflight-list>.arch-flow>.arch-checks>*{margin-block:0}
/* rail-stack — ARRANGEMENT, CONTAINER-keyed. Slots lockup(optional) | groups[many] |
   footer(optional). Admitted 2026-07-26: the interior five rail-shaped slots across four
   page entries demanded and none could name (app-shell.rail, list-index.scopeRail,
   workspace-canvas.structureRail, settings-editor.sectionNav, supporting-pane
   .supportingRail). THE SCROLL SEAM IS THE ENTRY. A rail is not a column that happens to
   be narrow: the lockup holds, the groups scroll, the foot stays reachable — that is the
   shape, and it is the one thing every hand-rolled rail got a different way. The overflow
   therefore lands on .arch-groups and nowhere else, and it needs min-block-size:0 on both
   the flow and the run or the flex default (min-height:auto) refuses to shrink them and
   the whole rail scrolls instead of its middle.
   THE SEAM HAS A PRECONDITION, and it is declared because it is not met everywhere. A
   percentage block-size resolves against a DEFINITE one, so the seam engages only where the
   mounting slot supplies a height. Four of the five demanded slots do: app-shell.rail,
   list-index.scopeRail, workspace-canvas.structureRail and settings-editor.sectionNav are
   all grid items with min-block-size:0 under a block-size:100% grid host, so they stretch
   definite. supporting-pane does NOT — it is a whole-page-scroll floorplan that declares no
   block-size anywhere, deliberately ("the rail supports reading, it is not an independent
   pane"). There, block-size:100% resolves to auto, .arch-groups has no spare space to
   claim, and the rail simply grows with the page. That is the RIGHT reading for a
   supporting rail and the wrong one to claim silently, so: this entry degrades to a plain
   stack without a definite height, and nothing here tries to force one. An arrangement that
   reached up to size its own host would be the imperative hack, not the fix.
   BLOCK-SIZE ON AN ARRANGEMENT IS NEW, and precedent-setting. Every other arrangement
   entry is intrinsically sized; only PAGE-stratum entries claim block-size:100%. This one
   claims it while staying inline-size-KEYED (SPEC-56 is about which axis drives REFLOW,
   and nothing here reads block size) — but the line is thin enough that the ledger row
   records the crossing rather than leaving it to be discovered.
   GROUP INTERNALS ARE NOT HERE. A group is a heading over a run = section-stack over
   list-pane, both ratified in the 2026-07-23 seed, so no heading rule and no row rule
   appears below. .arch-groups wraps the MANY fill so its members share ONE run (the
   .arch-tasks / .arch-checks precedent).
   ONE STEP, --space-5, between the three regions AND between groups — measured off the
   rail this entry was carved from, whose group separation was exactly --space-5 and whose
   lockup spent --space-3h below itself. --section-gap is the word that FITS the relation
   and it is the wrong size for the habitat: 56px at comfortable spends a fifth of a rail's
   height on one gap.
   NOT STEPPING DOWN IS THE DELIBERATE PART, and it runs against the nested-many idiom, so
   it is argued rather than assumed: dashboard-overview and setup-checklist both step
   --section-gap outer / --gap inner, and preflight-list --gap outer / --space-2 inner. In
   every one of those the INNER run is a run of rows or tiles — peers finer than the regions
   around them, so a finer step reads as "these belong together". Here the inner run is a
   run of GROUPS, each already a heading over a run of rows and therefore the COARSEST unit
   in the rail. Stepping down would set group-to-group tighter than the heading already
   spends above its own rows (--space-2h), which reads as one long list with stray labels —
   the exact thing a labeled rail exists not to be. The regions bracket the same weight: a
   lockup and a foot are distinguished by their CONTENT (a tile, a switcher) the way a
   heading distinguishes a group, so buying that distinction again in air pays twice.
   The .eyebrow part already owns the gap DOWN to the run it introduces, which is why no
   heading margin appears here.
   INLINE SIZE IS THE MOUNTING SLOT'S, never this entry's — the same rail interior serves a
   240px app-shell rail and a 320px inspector-side scope rail. LADDER-FREE for the same
   reason: the collapsed icon face is the ROW's (.nav-item[data-collapsed]) and the decision
   to collapse belongs to the page floorplan at --bp-rail-collapse, so the named container
   is declared per Q-22.1 and queried by nothing (the list-pane precedent). */
.arch-rail-stack{container-type:inline-size;container-name:kit2-rail-stack;display:block;min-inline-size:0;block-size:100%}
.arch-rail-stack>.arch-flow{display:flex;flex-direction:column;gap:var(--space-5);block-size:100%;min-inline-size:0;min-block-size:0}
.arch-rail-stack>.arch-flow>[data-slot="lockup"],.arch-rail-stack>.arch-flow>[data-slot="filter"],.arch-rail-stack>.arch-flow>[data-slot="footer"]{flex:0 0 auto;min-inline-size:0}
.arch-rail-stack>.arch-flow>.arch-groups{flex:1 1 auto;display:flex;flex-direction:column;gap:var(--space-5);min-inline-size:0;min-block-size:0;overflow-y:auto}
.arch-rail-stack>.arch-flow>[data-slot]>*,.arch-rail-stack>.arch-flow>.arch-groups>*{margin-block:0}
.arch-rail-stack [data-visible="false"],.arch-rail-stack [hidden]{display:none}
.arch-rail-stack [data-slot="filter"][data-collapsed="true"]{display:none}
.arch-rail-stack[data-group-heading-presentation="sticky"]{--group-heading-presentation:sticky}
/* release-review — PAGE floorplan, VIEWPORT-keyed stratum, ladder-free: one capped, centred
   content column is correct at every width. Slots changeset | preflight(optional) |
   diff(optional) | commitBand(commit-band) | history(optional), admitted 2026-07-26 on the
   Phase-4 dossier — a 12-tool census in which every piece ships in >=5 vendors while the
   COMPOSED page is documented by none, which is the commit-band provenance precedent and the
   reason this entry is INVENTED. Slot ORDER and PRESENCE are the register's only claims and
   this recipe makes no others: an absent optional region emits no host, so its section step
   collapses (the freed-gap law). The column caps at --content-max, NOT setup-checklist's
   --overlay-lg measure: staged lists, a graded run and a side-by-side diff all mince at a
   measure. Whole-page scroll — no region owns an independent scrollport and the floorplan
   claims no viewport block box, deliberately: the commit control stays reachable through the
   commit-band arrangement's OWN sticky posture, which is the whole reason it carries one, and
   this recipe declares NO position anywhere. The commitBand host is a plain box like every
   other region: a display:contents host would hand the band the column as its containing
   block, but an invisible host is also a region the SPEC-42 rhythm lane cannot police — it
   measured diff -> history ACROSS the band and reported the sum as an off-vocabulary gap,
   correctly. The band's sticky travel is therefore the mounting screen's to arrange. */
.arch-release-review{display:block;min-inline-size:0;min-block-size:0}
.arch-release-review>.arch-flow{display:flex;flex-direction:column;gap:var(--section-gap);max-inline-size:var(--content-max);margin-inline:auto;min-inline-size:0}
.arch-release-review>.arch-flow>[data-slot]{min-inline-size:0}
.arch-release-review>.arch-flow>[data-slot]>*{margin-block:0}
/* chip-cloud — ARRANGEMENT, CONTAINER-keyed. Slot chips[many]. Admitted 2026-07-27 (CANON
   shape / house carve — every chip vendor documents the wrap as the component's own layout:
   M3 chip sets wrap to multiple lines, Spectrum TagGroup, Carbon tag sets, Polaris tag
   lists; naming it on the arrangement stratum is ours, the rail-stack provenance posture;
   dossier kit-2-chip-cloud-dossier-2026-07-27.md). A THIRD collection rhythm: list-pane is
   stacked rows and tile-grid measures a column count from a declared tile minimum, but a
   cloud's members keep their intrinsic widths, flow inline and WRAP at the container — no
   column structure exists to declare, which is why no --tile-min appears below. ONE FINE
   STEP (--space-1h) in both axes, measured off the Workbench Sidebar rail this entry was
   carved from: chips are finer than rows, so the cloud spends less air than the run around
   it, the preflight-list inner-step precedent. The [data-seat="run"] face takes the row
   inline padding so a cloud seated in a rail group shares the rows' text edge — the
   .eyebrow[data-seat="run"] law extended to the one other shape that sits in a run; a cloud
   in a page body owes no rail edge, so the padding is a face, never baked. LADDER-FREE:
   wrap IS the reflow, so the named container is declared per Q-22.1 and queried by nothing
   (the list-pane precedent). No overflow face — "+N more" arrives as an axis when a
   consumer demands it (the kpi-band axis-over-entry law). */
.arch-chip-cloud{container-type:inline-size;container-name:kit2-chip-cloud;display:block;min-inline-size:0}
.arch-chip-cloud>.arch-flow{display:flex;flex-wrap:wrap;gap:var(--space-1h);min-inline-size:0}
.arch-chip-cloud>.arch-flow>*{margin-block:0}
.arch-chip-cloud[data-seat="run"]>.arch-flow{padding-inline:var(--run-text-edge)}
/* ============ LAYER: GLOBAL POLICY · CONTROL RECIPES — one anatomy per primitive; brand styles art-direct through
   custom properties only (--control-clip/--card-clip, radii, --btn-* voice, shadows).
   BUTTON ARCHITECTURE: fill, border, radius and clip paint on an inset ::before layer,
   NEVER on the host — the host box stays unclipped so the global :focus-visible outline
   ring survives a clipping brand style (never rely on outline on a clipped element). Specimens
   freezing a state override --btn-bg / --btn-fg / --btn-border inline; setting
   background on the host is a bug (an unclipped rectangle paints over the notch).
   Elevation shadows stay on the host: under a clipped fill the sliver at the notch is
   accepted (ATW's grounds are near-black). ::after is reserved for the pointer floor. */
/* text-decoration is DECLARED, because <Button href> renders an anchor and the link
   policy is a (0,0,0) floor: lowering it fixes properties a recipe states, never the
   ones it stays silent about. Silence wore the prose underline at rest wherever
   --link-underline-rest is `underline` (rugged, lumen). The `link` variant restates
   it for itself, where the underline is the point. */
.btn{position:relative;isolation:isolate;display:inline-flex;align-items:center;justify-content:center;gap:var(--control-gap);height:var(--control-h);padding:0 var(--control-pad-x);border:none;background:none;color:var(--btn-fg,var(--text));font-size:13.5px;font-weight:var(--btn-weight);font-family:var(--font-ui);line-height:normal;text-transform:var(--btn-case);letter-spacing:var(--btn-tracking);text-decoration:none;cursor:pointer;--notch:12px}
.btn::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--btn-bg,transparent);border:var(--btn-border,none);border-radius:var(--radius-control);clip-path:var(--control-clip,none);transition:background var(--dur-1) var(--ease-standard)}
.btn:active:not(:disabled){transform:var(--press-transform)}
.btn:disabled{cursor:not-allowed}
.btn[data-variant="primary"]{--btn-bg:var(--accent-grad);--btn-fg:var(--on-accent)}
.btn[data-variant="primary"]:hover:not(:disabled){--btn-bg:var(--accent-hover)}
.btn[data-variant="primary"]:active:not(:disabled){--btn-bg:var(--accent-active)}
.btn[data-variant="secondary"]{--btn-bg:var(--surface);--btn-fg:var(--text);--btn-border:var(--bw) solid var(--border-strong)}
.btn[data-variant="secondary"]:hover:not(:disabled){--btn-bg:var(--surface-3)}
.btn[data-variant="secondary"]:active:not(:disabled){--btn-bg:var(--surface-3);--btn-border:var(--bw) solid var(--border-hover)}
.btn[data-variant="ghost"]{--btn-fg:var(--text-2)}
.btn[data-variant="ghost"]:hover:not(:disabled){--btn-bg:var(--surface-3);--btn-fg:var(--text)}
.btn[data-variant="ghost"]:active:not(:disabled){--btn-bg:var(--inset);--btn-fg:var(--text)}
.btn[data-variant="destructive"]{--btn-bg:var(--danger);--btn-fg:var(--on-danger)}
.btn[data-variant="destructive"]:hover:not(:disabled){--btn-bg:var(--danger-hover)}
.btn[data-variant="destructive"]:active:not(:disabled){--btn-bg:var(--danger-hover)}
.btn[data-variant="destructive"]:focus-visible{outline-color:var(--danger)}
.btn[data-variant="link"]{--control-clip:none;padding:0 2px;color:var(--link-color);text-transform:none;letter-spacing:normal}
.btn[data-variant="link"]:hover:not(:disabled){color:var(--link-color-hover);text-decoration:underline}
.btn[data-size="sm"]{height:var(--control-h-sm);padding:0 var(--control-pad-x-sm);font-size:12.5px;--notch:10px}
.btn[data-size="lg"]{height:var(--control-h-lg);padding:0 var(--control-pad-x-lg);font-size:14.5px;--notch:14px}
.btn[data-size="xl"]{height:var(--control-h-xl);padding:0 var(--control-pad-x-xl);font-size:15.5px;--notch:16px}
/* icon-only stays square — a notch on a 34px square reads as damage, not identity */
.btn[data-icon-only]{width:var(--control-h);padding:0;--control-clip:none}
.btn[data-icon-only][data-size="sm"]{width:var(--control-h-sm)}
.btn[data-icon-only][data-size="lg"]{width:var(--control-h-lg)}
.btn[data-icon-only][data-size="xl"]{width:var(--control-h-xl)}
/* selected (toggle/segmented member) */
/* PRESSED carries state on the EDGE, not the fill alone. --surface-3 measured
   dE 0.015-0.079 from the ground it sits on across every register — under the 0.10
   perceptual floor everywhere — and it is also what :hover resolves to on a
   secondary button, so pressed and hovered were pixel-identical. The border paints
   on the inset ::before layer, so it costs no layout. */
.btn[aria-pressed="true"],.btn[data-selected]{--btn-bg:var(--surface-3);--btn-fg:var(--text);--btn-border:var(--bw) solid var(--state-edge)}
/* loading — pending paint (sheet §7 state row): dimmed shell, wait cursor, the
   spinner role spins; the reduced-motion policy replaces movement with stillness. */
.btn[data-loading]{opacity:0.85;cursor:wait}
/* THE SPINNER MEASURE (2026-08-06). The anatomy card states two clauses at once —
   "replaces the leading slot while pending; NEVER RESIZES THE BOX" — and they are
   consistent only if the mark occupies exactly the box the glyph it stands in for does.
   So the measure is the leading slot's own: --icon-md, the .icon recipe's default width
   (the parts layer), which is what a consumer-slotted Icon Child resolves to inside .btn.
   This is the .stat-tile trend-seat ruling applied to a second seat ("its height is
   --row-h-lg because that is exactly .skeleton[data-shape='block'], so the pending mark
   and the chart occupy the same box by construction") — register-measure equality, never
   a transcribed art size. FINDING, recorded rather than repaired: the sheet's own §7
   loading cells draw a 13px arc and carry no rest-state leading glyph, so the specimens
   do not satisfy the card's own second clause; the card is the LAW and the inline art is
   specimen drawing, exactly as the 12/14/15/16 spread across the other tier-1 glyphs is.
   Ink and stroke follow the .toast dismiss-glyph row; the arc geometry is the sheet's. */
.btn [data-role="spinner"]{flex-shrink:0;width:var(--icon-md);height:var(--icon-md);fill:none;stroke:currentColor;stroke-width:var(--icon-stroke-strong);animation:spin var(--dur-spinner) linear infinite}
/* THE PENDING RESERVE (SPEC-51, 2026-08-06) — the row every other pending family already
   declares (.table / .stat-tile / .list-item / .validation-summary), finally stated for the
   one host that could not borrow theirs. First row is their idiom verbatim: the mark stays
   INLINE-BLOCK inside the zone it stands in for, so the label run's own type strut still
   sets the line box and the pending height IS the loaded height.

   Second row is what .btn owes and they do not. Their zones are block or flex-grown, so
   .skeleton[data-shape="line"]'s width:100% has a definite basis to resolve against; .btn
   is a SHRINK-TO-FIT inline-flex host, where that percentage resolves against a container
   sized by its own content and the wash collapses to nothing. The reserve is therefore an
   inline measure, and it is TRANSCRIBED, not chosen: v1's harvested `loadingReserveCh`
   default 6 (census/families/buttons.md edge #5 — "reserves measure so the button does not
   grow when the real label lands" — receipted at FilledTonalButton.crate.ts:71-77,99). The
   unit carries its own pedigree too: ch is font-relative, so one row rides the whole size
   ladder's font-size steps (13.5 / 12.5 / 14.5 / 15.5px) instead of four. It sits under
   .skeleton[data-shape="line"]'s own --field-w-sm cap at every step, so the primitive's
   declared maximum still governs and no second measure enters the system. */
.btn .skeleton{display:inline-block;vertical-align:middle}
.btn [data-role="label"] .skeleton{inline-size:6ch}
/* grouped controls share edges and stay square — dense composites never notch.
   --btn-divider is the split-button seam (inline on the non-first member); the same
   slot doubles as the border-collapse escape for outlined groups (default none). */
.btn-group{display:inline-flex}
.btn-group .btn{--control-clip:none}
.btn-group .btn::before{border-radius:0}
.btn-group .btn:first-child::before{border-start-start-radius:var(--radius-control);border-end-start-radius:var(--radius-control)}
.btn-group .btn:last-child::before{border-start-end-radius:var(--radius-control);border-end-end-radius:var(--radius-control)}
.btn-group .btn:not(:first-child)::before{border-inline-start:var(--btn-divider,none)}
/* shared-track anatomy — ONE recipe for every tracked run. .seg-track is the
   PERMANENT tier-1 anatomy (segmented / single-choice: containment IS the
   semantics — never toggled, never per-screen). Ground is --track, a relational
   ink wash that reads on any local surface in any register; the boundary rides
   --track-edge and escalates with the contrast axis (wash → wash+edge → edge-only).
   The STATE duty is the thumb's: .seg-thumb[data-selected="1"] is a raised
   card — the track may whisper, the thumb may not. At standard contrast the
   carrier is chip + shadow + label delta (the 2026-08-01 state-carrier ruling:
   Apple/M3/Carbon/Primer-convergent, and 1.4.11 asks no ring of a labelled
   member) — --seg-thumb-fill is DERIVED per register against the track
   composite (core/segThumb.ts) and carries the raise as far as AA on its own
   label allows, --seg-thumb-shadow is the register's always-on elevation-1
   voice, and the ink swaps --text-2 → --seg-thumb-ink (tokens 3.28.0, the
   accent-identity ruling: the selected-nav label speaks the register's
   accent-leaning surface ink — a STATE ROLE seeded from --link-color and
   solved per register to AA on the derived fill, so a brand whose authored
   voice is plain ink, ATW, keeps it by declaration; the HC axis inherits the
   base solve through the cascade and the state lane's HC walk gates it,
   there is no HC-specific re-declaration). --seg-thumb-edge is the hairline
   var(--border) at standard and strengthens to 3:1 only under STRONG (and in
   band registers, where the flat map cannot carry a shadow). Between
   2026-07-28 and 2026-08-01 the edge carried 3:1 everywhere — a cure for a
   real defect (fill dE 0.005-0.072, border 1.04-1.32, shadow `none` in seven
   of eight registers: nothing carried) that the canon sweep then demoted; the
   gate (core/stateSeparation.ts) still measures every channel.
   Geometry (height, padding, type) stays with the specimen; the recipe owns
   only anatomy and state voice.
   Fill and edge ride the ::before FACE CHANNEL (--btn-bg/--btn-border), never
   the host background: the .btn architecture paints its face on the inset
   ::before ABOVE the host background, and the toggle rule
   .btn[data-selected]{--btn-bg:var(--surface-3)} fires on a seated thumb — a
   host-background fill is silently covered by an opaque --surface-3 chip at
   the CONTROL radius (the workbench declared-gap, absorbed 2026-08-01). The
   ::before re-rounds to --seg-thumb-radius, drops the notch clip, and paints
   THROUGH the host border box: the designer source draws the hairline on the
   host border itself and the elevation rides the host border-box, so a
   padding-box face leaves a --bw unpainted seam between hairline and shadow. */
.seg-track{display:inline-flex;align-items:center;gap:max(var(--space-half),var(--seg-gap));background:var(--track);border:var(--bw) solid var(--track-edge);border-radius:var(--seg-track-radius);padding:max(var(--space-half),var(--seg-pad))}
.seg-thumb{border:var(--bw) solid transparent;border-radius:var(--seg-thumb-radius);background:transparent;color:var(--text-2);white-space:nowrap;--btn-border:var(--bw) solid transparent}
.seg-thumb::before{inset:calc(-1*var(--bw));border-radius:var(--seg-thumb-radius);clip-path:none}
.seg-thumb[data-selected="1"]{color:var(--seg-thumb-ink);--btn-bg:var(--seg-thumb-fill);--btn-border:var(--bw) solid var(--seg-thumb-edge);box-shadow:var(--seg-thumb-shadow)}
/* seated runs — tier-2 brand-style-voice auditions, SPLIT BY DECISION ALTITUDE (the
   surprise test: one dock chip must never repaint more than its name promises).
     · Buttons axis (data-btn-track; sheets opt in via data-btn-track-toggle) is
       CONTROL-LOCAL: marked command runs (toolbars) ride the --track band.
     · Nav axis (data-nav-grouped; data-nav-group-toggle) is a RAIL/LIST STYLE —
       the inset-grouped POLARITY FLIP: nav groups render as raised surface
       cards while the rail demotes its ground through the --run-canvas hook
       (canvas demotion, never a heavier wash). Repainting the rail is the
       treatment, which is exactly why it is not a Buttons setting.
     · Action pairs NEVER seat (tier 3) — containment implies same-kind, and a
       tracked Save/Cancel misreads as a toggle.
   Without its attribute a .btn-run is layout-inert, so the authored composition
   renders untouched. Seated .btn members never notch (dense-composite law). */
[data-btn-track]{--radius-chrome:min(calc(var(--run-track-radius) + var(--chrome-pad)), calc(var(--radius-control) * 999))}
[data-btn-track] .btn-run:not([data-run="nav"]){background:var(--track);border:var(--bw) solid var(--track-edge);border-radius:var(--run-track-radius);padding:var(--seat-gap)}
[data-btn-track] .btn-run:not([data-run="nav"]) .btn{--control-clip:none}
[data-btn-track] .btn-run:not([data-run="nav"]) .btn::before{border-radius:var(--radius-control)}
[data-nav-grouped]{--run-canvas:var(--canvas)}
/* nav-card radius derives CONCENTRICALLY from its rows (outer = inner + gap;
   never radius-surface — lumen's 2px editorial card around its 8px rows was the
   inversion bug). --run-item-radius is the slot: defaults to --radius-item (the
   NavList row voice); sheets whose rows ride --radius-control set it inline. */
/* A nav run STACKS — the one thing every rail in the corpus had to say for itself.
   .btn-run was a marker class with no layout of its own, so each rail carried
   `display:flex;flex-direction:column;gap:var(--space-1)` inline; four rails wrote
   the same three declarations and nothing could tell whether they agreed. Command
   runs stay unstated here on purpose: those are horizontal by default and the row
   primitive already says so. */
.btn-run[data-run="nav"]{display:flex;flex-direction:column;gap:var(--space-1)}
/* The grouped face zeroes BOTH insets. It already zeroed --run-wash-inset because
   the track pads by --seat-gap and insetting twice nests a pill inside a card; the
   scroll clearance inherits from the scrollport and would re-open exactly that,
   one edge at a time, for any grouped nav inside a rail. The track is what meets
   the gutter here, and it carries its own border and pad to do it.
   Declared on the run, so it beats the scrollport's inherited value by proximity
   rather than by specificity — custom properties resolve on the nearest element
   that declares them. */
[data-nav-grouped] .btn-run[data-run="nav"]{background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--nav-track-radius);padding:var(--seat-gap);--run-wash-inset:0px;--run-scroll-clearance:0px}
/* nav row — the NavList row voice --radius-item has named since the run anatomy
   landed, finally given its recipe. A rail row is ONE component in three states:
   rest, hover, CURRENT. Current is a wash plus aria-current — never a second
   component, never a bolder weight, never a per-item computed paint (the forgery
   this replaces bound background/color/font-weight per row and shipped no aria
   at all). Anatomy mirrors .btn: fill and radius paint on the inset ::before so
   the global :focus-visible ring survives a clipping brand style.
   THE RUN HOLDS THE WASH IN, NOT THE RAIL (ruled 2026-07-27). This rule shipped
   full-bleed — the row owned inline padding, the run owned none — which made the
   only inset around a selected row a side effect of the MOUNTING rail's padding.
   Four rails, four insets, and no rail could tell it was redesigning selection by
   choosing a pad. --run-wash-inset is brand style voice now (0 = edge-to-edge band for
   the square voices, >0 = floating pill), and the label pads by --run-text-edge
   so it keeps its distance from the WASH edge rather than the run edge. The
   grouped face zeroes the inset above: that track already insets by --seat-gap,
   and insetting twice would nest a pill inside a card by accident.
   Height rides --row-h, already pointer-floored. */
.nav-item{position:relative;isolation:isolate;display:flex;align-items:center;gap:var(--control-gap);width:100%;min-height:var(--row-h);padding:0 var(--run-text-edge);border:none;background:none;color:var(--nav-fg,var(--text-2));font-size:var(--fs);font-family:var(--font-ui);font-weight:var(--weight-regular);line-height:normal;text-align:start;text-decoration:none;cursor:pointer}
/* TWO layers: selection owns the ground (--nav-bg), hover/press own a translucent
   overlay above it (--nav-overlay). One layer cannot say selected-AND-hovered —
   hover would have to replace the tint, the mistake --state-hover exists to prevent.
   background-image carries the overlay; background-color takes one value. */
/* The inset is split because the CONSTRAINT is one-sided. A scroll gutter exists
   on the inline-end only, so that is the only edge that takes a floor — insetting
   both would not solve anything the gutter side needs and would quietly turn every
   edge-to-edge band into a floating pill, which is the brand style variation this is
   deliberately preserving. --run-scroll-clearance defaults to 0px, so a run that
   sits in no scrollport resolves max(inset, 0) and renders exactly as before; a
   scrollport declares the clearance and the wash takes the larger of the two. */
.nav-item::before{content:"";position:absolute;inset-block:0;inset-inline-start:var(--run-wash-inset);inset-inline-end:max(var(--run-wash-inset),var(--run-scroll-clearance,0px));z-index:-1;background-color:var(--nav-bg,transparent);background-image:linear-gradient(var(--nav-overlay,transparent),var(--nav-overlay,transparent));border:var(--bw) solid var(--nav-edge,transparent);border-radius:var(--run-item-radius, var(--radius-item));transition:background-color var(--dur-1) var(--ease-standard),background-image var(--dur-1) var(--ease-standard)}
/* color and text-decoration-line are RESTATED, now as defence rather than repair:
   the link policy sat at (0,1,1) and outranked .nav-item (0,1,0), so a row computed
   the right --nav-fg and lost the declaration consuming it. The policy is a (0,0,0)
   floor since, but these keep the row correct if it is ever raised again. */
.nav-item:hover:not([aria-disabled="true"]){--nav-overlay:var(--state-hover);--nav-fg:var(--text);color:var(--nav-fg);text-decoration-line:none}
.nav-item:active:not([aria-disabled="true"]){--nav-overlay:var(--state-pressed)}
/* CURRENT — wash + ink, nothing else. A rail never swaps anatomy to say "you are
   here": no weight change, no rule, no inserted chevron.
   THE WASH MUST BE ITS OWN. This rule shipped on --surface-3, the same value :hover
   then resolved to, so current and hovered rows were pixel-identical and "you are
   here" was readable only while the pointer was elsewhere. The law said wash-only
   and the recipe obeyed it into a state that says nothing. (:hover has since moved
   off --surface-3 onto the --state-hover overlay, so the collision is now structural
   rather than a value coincidence: the two states no longer share a layer at all.)
   Riding --state-selected-bg rather than picking a third neutral by eye: the register
   already DECLARES that token as the selection wash (STATE POLICY, semanticTokens) and
   the Designer Guide already paints it in the swatch row labelled "selected" — it had
   simply never been consumed by a recipe. A hand-picked value here would have forked
   the selection voice on its first real use. Checked across all 44 brand-style/mode/contrast
   blocks that declare both: --state-selected-bg never equals --surface-3, so the three
   states stay distinct everywhere, not just in the default brand style.
   THE INK MOVES WITH THE WASH, and this is the part a wash-only law makes easy to
   miss. --state-selected-bg resolves to --accent-tint, a CHROMATIC ground, and the
   contrast gate certifies exactly one foreground on it: --on-accent-tint (checked as
   "on-accent-tint on accent-tint" in every brand style). Keeping --text here would have put
   body ink on a tint no gate measures — passing the build while reading however each
   brand style happened to fall out. Every one of the 44 blocks that declares --accent-tint
   declares its partner, so the pair is always resolvable.
   CURRENT OUTRANKS HOVER by cascade order (this rule sorts after :hover at equal
   specificity), so hovering the current row holds the selected wash rather than
   flickering back to the hover neutral.
   That ordering decides the INK too — a hovered current row used to drop selected
   ink for prose-link ink (rugged dark: coral 253,154,135 fell to brown 159,85,59).
   Selection is the strongest resting state a row has; hover must not outrank it.
   It STILL ANSWERS a pointer, via the overlay: selection keeps --nav-bg, hover adds
   --state-hover above it, so the row reads "selected, and you are pointing at it".
   THE EDGE IS CHROMATIC KIN TO THE WASH: --state-selected-edge, the accent-seeded
   3:1 walk, not the border-seeded neutral. The gray edge passed the same floor,
   but a neutral line trapped between white paper and a chromatic wash reads as a
   faded seam rather than a state (measured 2026-07-28; core/stateEdge.ts). */
.nav-item[aria-current]:not([aria-current="false"]){--nav-bg:var(--state-selected-bg);--nav-edge:var(--state-selected-edge);--nav-fg:var(--on-accent-tint);color:var(--nav-fg);text-decoration-line:none}
.nav-item[aria-current]:not([aria-current="false"]):hover:not([aria-disabled="true"]){--nav-overlay:var(--state-hover)}
.nav-item[aria-disabled="true"]{--nav-fg:var(--text-disabled);cursor:not-allowed}
.nav-item[data-size="lg"]{min-height:var(--row-h-lg)}
/* SCROLL GUTTER CLEARANCE — every scrollport in the register, declared in ONE
   place and adjacent to the wash that consumes it, because the two are only
   correct as a pair.
   The list is EXHAUSTIVE rather than "the slots that host a nav today": a rule
   that covers the current consumers is a rule that silently stops covering them
   when someone mounts a run somewhere new, and the whole failure this fixes was a
   pair nobody was watching. A slot that never holds a run pays nothing — the
   custom property is inert unless a wash reads it.
   Adding a scrollport without a clearance is a gate failure, not a style nit
   (core/scrollClearance.ts).
   @invariant scroll-gutter-clearance */
.arch-master-detail>[data-slot],.arch-app-shell>[data-slot="rail"],.arch-app-shell>[data-slot="content"],.arch-app-shell>[data-slot="inspector"],.arch-list-index>[data-slot="collection"],.arch-list-index>[data-slot="scopeRail"],.arch-list-index>[data-slot="inspector"],.arch-wizard>[data-slot="stepBody"],.arch-workspace-canvas>[data-slot="structureRail"],.arch-workspace-canvas>[data-slot="artifactStage"],.arch-workspace-canvas>[data-slot="inspector"],.arch-settings-editor>[data-slot="sectionNav"],.arch-settings-editor>[data-slot="form"],.arch-rail-stack>.arch-flow>.arch-groups,.combobox-tags,.dialog [data-role="body"],.drawer [data-role="body"]{--run-scroll-clearance:var(--scroll-gutter-min)}
/* row parts — the label is the only flexible box, so long names ellipsize
   instead of pushing the meta slot out of the rail. */
.nav-item .nav-icon{flex:0 0 auto;display:inline-flex;width:var(--icon-md);height:var(--icon-md)}
.nav-item .nav-label{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nav-item .nav-meta{flex:0 0 auto;color:var(--text-3)}
/* collapsed rail — the icon face below --bp-rail-collapse. The label stays in the
   DOM as the accessible name; only its box is dropped. */
.nav-item[data-collapsed]{justify-content:center;padding:0}
.nav-item[data-collapsed] .nav-label,.nav-item[data-collapsed] .nav-meta{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
/* ============ LAYER: PARTS — the seats a composition is assembled from. A part is
   NOT a control: no axes, no states, nothing to press. It is a named seat with a
   settled voice, and it exists so a screen the register has no member for is still
   built out of pieces the register named. Arranging parts in an order nobody has
   arranged before is legal; inventing the part is not. Every part below was a
   forgery first — the eyebrow shipped its five tokens in all four brand styles with no
   class to bind them, so the group heading was retyped by hand 261 times across
   the methodology corpus, a different padding each time. That is what an unnamed
   part costs, and it is invisible to the anatomy gate because none of it clicks. */
/* eyebrow — the overline: section kickers, rail and menu group headings, tile
   captions. Owns the gap DOWN to what it introduces, the way .field-label owns its
   own; the gap BETWEEN groups belongs to the stack, never to a per-heading pad
   (the forged rails each picked their own and none of them agreed). data-seat="run"
   is the rail/menu case: the heading takes the ROW inline padding so a group label
   and a row label share one text edge — --run-text-edge, which carries the wash
   inset with it, so a brand style that floats its selection pill moves the heading and the
   row together instead of leaving the overline hanging outside the wash. */
.eyebrow{display:block;font-family:var(--font-eyebrow);font-size:var(--fs-eyebrow);font-weight:var(--eyebrow-weight);font-style:var(--eyebrow-style,normal);color:var(--eyebrow-color);text-transform:uppercase;letter-spacing:var(--eyebrow-tracking);margin-bottom:var(--space-2h)}
.eyebrow[data-seat="run"]{padding-inline:var(--run-text-edge)}
@container style(--group-heading-presentation: sticky){
  .eyebrow[data-seat="run"]{position:sticky;top:0;z-index:var(--layer-sticky);background:var(--surface-ground);padding-block:var(--space-1);border-block-end:var(--bw) solid var(--hairline)}
}
.eyebrow[data-level="sub"]{color:var(--text-3)}
.eyebrow[data-level="micro-label"]{font-family:var(--font-mono);font-size:var(--type-micro-size);font-weight:normal;font-style:normal;color:var(--text-2);text-transform:uppercase;letter-spacing:var(--eyebrow-tracking);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.eyebrow[data-level="micro-note"]{font-family:var(--font-mono);font-size:var(--type-micro-size);font-weight:normal;font-style:normal;color:var(--text-3);text-transform:none;letter-spacing:normal;line-height:1.45;margin:0;overflow-wrap:anywhere}
/* headline — the display voice, finally a recipe (Headline mint, 2026-07-28): the
   register carried --font-display / --display-weight / --display-case /
   --display-tracking per brand style and CONSUMED THEM IN ZERO RULES, so no member could
   render a headline and every converted screen shipped its titles in the body voice.
   Base face is the CONTENT headline (the display-treatment specimen's voice, one
   canonical author instead of a divergent declaration per surface).
   data-level="title" is the IDENTITY level and deliberately LEAVES the display face
   for the title role — the .lockup law below: identity in the display face is a
   reserved decision, so the wordmark level rides --font-ui at the title ramp. */
.headline{display:block;margin:0;font-family:var(--font-headline);font-size:var(--type-headline-size);line-height:var(--type-headline-lh);font-weight:var(--display-weight);text-transform:var(--display-case);letter-spacing:var(--display-tracking);color:var(--text);overflow-wrap:anywhere;min-inline-size:0}
.headline[data-level="title"]{font-family:var(--font-ui);font-size:var(--type-title-size);line-height:var(--type-title-lh);font-weight:var(--type-title-weight);text-transform:none;letter-spacing:normal}
/* lockup — an identity block: a tile, a name, a line under it, and a seat for one
   trailing action. A rail header, the auth-gate brand, an object-detail identity
   header and a menu header are all this part at two sizes. The name rides the TITLE
   role, not the display face: authoring --font-display here is barred by
   no-divergent-font-declaration, and identity in the display face would need the
   placeholder seam emit/designerGuide.ts uses — a deliberate decision, not a default.
   Both rows ellipsize: a long name can never widen the rail that holds it. */
.lockup{display:flex;align-items:center;gap:var(--space-3);min-width:0}
.lockup .lockup-tile{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:var(--tile-lg);height:var(--tile-lg);border-radius:var(--radius-surface);background:var(--surface-3);border:var(--bw) solid var(--border);overflow:hidden}
.lockup .lockup-text{flex:1 1 auto;min-width:0}
.lockup .lockup-title{display:block;font-size:var(--type-title-size);line-height:var(--type-title-lh);font-weight:var(--type-title-weight);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lockup .lockup-sub{display:block;font-size:var(--fs-sm);line-height:var(--type-caption-lh);color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lockup .lockup-action{flex:0 0 auto;margin-inline-start:auto}
.lockup[data-layout="baseline"]{align-items:baseline;gap:var(--space-2);padding-inline:var(--run-text-edge)}
.lockup[data-layout="baseline"] .lockup-title{font-family:var(--font-headline);font-size:var(--type-title-size);line-height:var(--type-body-lh);font-weight:var(--display-weight);text-transform:var(--display-case);letter-spacing:var(--display-tracking)}
.lockup[data-layout="baseline"] .lockup-sub{font-family:var(--font-mono);font-size:var(--type-micro-size);line-height:var(--type-body-lh);color:var(--text-3);text-transform:uppercase;letter-spacing:var(--eyebrow-tracking)}
/* The tile is OPTIONAL — omit the element and the same part is a titled row:
   a switch row, a list row, a menu header. Minting a second "row title" recipe
   for that would be the family of near-twins the control law exists to prevent,
   so the row face is a SIZE on this part instead. sm is the in-row voice: the
   label role, which is what every hand-rolled row title in the corpus reached
   for, over the same ellipsizing sub line. */
.lockup[data-size="sm"] .lockup-tile{width:var(--tile-md);height:var(--tile-md)}
.lockup[data-size="sm"] .lockup-title{font-size:var(--fs-label);line-height:var(--type-label-lh);font-weight:var(--weight-strong)}
/* card — surface primitive; ATW cuts the TOP-RIGHT corner (clip on the host: cards
   take no focus ring; the unstroked diagonal on bordered cards is source-faithful) */
.card{background:var(--surface-ground);border:var(--card-edge,var(--bw) solid var(--border));border-radius:var(--radius-surface);clip-path:var(--card-clip,none);box-shadow:var(--card-shadow)}
/* quiet surfaces — the brand cut belongs to IN-FLOW CONTENT surfaces only.
   Transient floating chrome (data-floating: palettes, notification panels),
   in-flow control chrome (data-chrome: pagination/stepper bars) and the seated
   ghost face (data-ghost, below) stay neutral — a notch on ephemeral, toolbar-shaped
   or unpainted chrome reads as an artifact, not identity.
   The resting --card-shadow flattens with the clip: floating specimens own their
   overlay shadow (--shadow-3/-4, inline or recipe), and a docked chrome bar is
   seated furniture, not a raised surface. */
.card[data-floating],.card[data-chrome],.card[data-ghost]{clip-path:none;box-shadow:none}
/* basic content pad (§11 card vocab: 16px = --pad) — scoped OFF the floating/chrome/ghost
   surfaces exactly as the clip opt-out above: popover/panel/palette/pagination cards
   own their inner padding inline (some carry none), so only in-flow content cards get
   the pad. Riding --pad keeps it density-reactive. */
.card:not([data-floating]):not([data-chrome]):not([data-ghost]){padding:var(--pad)}
/* chrome bars SEAT control runs, so their corner derives one level up from the
   run they hold — not --radius-surface, which is the CONTENT voice. Pad and
   radius ship together (--chrome-pad / --radius-chrome): a sheet that pads a
   toolbar by eye is exactly how the corner and the inset come to disagree. */
.card[data-chrome]{padding:var(--chrome-pad);border-radius:var(--radius-chrome)}
/* raised surfaces — data-raised selects a level; tint + shadow compose per the brand style's
   elevation strategy (tint invisible on light grounds by construction) */
.card[data-raised="1"]{background:linear-gradient(var(--elev-tint-1),var(--elev-tint-1)),var(--surface-ground);box-shadow:var(--shadow-1)}
.card[data-raised="2"]{background:linear-gradient(var(--elev-tint-2),var(--elev-tint-2)),var(--surface-ground);box-shadow:var(--shadow-2)}
.card[data-raised="3"]{background:linear-gradient(var(--elev-tint-3),var(--elev-tint-3)),var(--surface-ground);box-shadow:var(--shadow-3)}
.card[data-raised="4"]{background:linear-gradient(var(--elev-tint-4),var(--elev-tint-4)),var(--surface-ground);box-shadow:var(--shadow-4)}
/* THE GHOST FACE — the third member of the quiet-surface family, and the one that paints
   NOTHING at rest: no ground, no edge, no clip, no elevation, no pad. It exists for the
   seat that already owns the frame — a card whose habitat is another registered surface
   (the SpecimenMatrix comparison cell: scoped-cell paints the bracket, the card carries
   only the press contract). Nesting two painted surfaces is what the interaction-ownership
   canon §3.2 refused; a face that paints nothing dissolves the conflict instead of
   arbitrating it, and it is the in-place mechanism the floating/chrome opt-outs already
   established. Cross-vendor name: Radix Themes' Card variant="ghost" is the same
   surface-less face; Button's own `ghost` variant is the in-house word for it.
   AFTER the elevation ramp deliberately — same specificity, so source order decides, and
   a ghost card that also names a raise still paints nothing. STATE paint is untouched:
   the interactive rules below hang the hover wash, the selected ring and the focus ring
   on the stretched TARGET, a different element, so a picked ghost card still announces
   itself. Only the resting chrome is gone. */
.card[data-ghost]{background:none;border:0;box-shadow:none}
/* interactive cards (cards edge #E1/#E2) — THE CARD IS NEVER THE CONTROL. The card stays a
   <div>; one real <a>/<button> inside it carries the action and its ::after stretches over
   the whole surface. Cross-vendor mechanism: Bootstrap's stretched-link helper, Inclusive
   Components' card pseudo-content, Roselli's block-links ruling — all three refuse the
   wrapping anchor for the same reason (selectable text, nested interactives, announcement).
   Carbon's clickable Tile takes the stricter subset (no CTA inside), which is compatible:
   a card that seats no secondary action simply never reaches the raise rule below. */
.card[data-interactive]{position:relative}
/* THE TARGET IS THE OVERLAY. Bootstrap hangs the stretched box on a ::after because its
   link holds the visible card title and must stay in flow; this target holds only its
   clipped name, so the element itself takes the box — the same construction, one rule
   fewer, and the only one SPEC-42 can MEASURE (boxTree.ts credits a pseudo overlay only
   against a POSITIONED host, so a ::after resolving against the card reads as a 0x0 link).
   The UA button face is stripped: an unstyled <button> stretched over a card would paint
   grey over the whole surface. No z-index (LAW-13, and the layer scale is for stacking
   CONTEXTS): a positioned target paints above in-flow content, and the raise rule below
   only has to make a descendant positioned — same painting step, later in tree order,
   because the target is emitted FIRST. */
.card[data-interactive] > [data-role="target"]{position:absolute;inset:0;background:transparent;border:0;padding:0;border-radius:var(--radius-surface);cursor:pointer}
/* the target's NAME is for the announcement, not the eye — the visible content is whatever
   the composition slotted. Clipped exactly as the collapsed rail label is; the clip sits on
   the label, never on the target, or it would take the ::after hit area with it. CHILD
   combinators throughout: a descendant selector here clips the label of every control
   NESTED inside the card — the compound story's secondary button collapsed to 20×26px. */
.card[data-interactive] > [data-role="target"] > [data-role="label"]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
/* the seam that makes a COMPOUND press surface legal: every other real control inside an
   interactive card is raised over the overlay, so a secondary action still receives its own
   click (the 84 behaviour-residue rows the passive card could not carry). */
.card[data-interactive] a:not([data-role="target"]),.card[data-interactive] button:not([data-role="target"]),.card[data-interactive] input,.card[data-interactive] select,.card[data-interactive] textarea{position:relative}
/* SPEC-45 §8.8, routed rather than chosen: the link and command faces carry NO meaning on
   the border channel, so they keep --border-hover; the selection-bearing face may not move
   its border at all and takes the state layer instead — laid on the overlay, which already
   spans the surface, so no ground is replaced (the --state-hover posture). */
.card[data-interactive="link"]:hover,.card[data-interactive="action"]:hover{border-color:var(--border-hover)}
.card[data-interactive="select"]:hover > [data-role="target"]{background:var(--state-hover)}
/* selection keeps the border channel, COLOUR ONLY — widening a resting border moves the
   box (LAW-13) — plus the inset ring on the target, which never collides with the
   elevation ramp's own box-shadow because it is a different element. The focus ring rides
   the same inset channel and replaces the global outline (the .field:focus-visible
   precedent): a card wears the clip on its own host, so an outward ring would be cut by
   the brand corner. Last, so a focused selected card shows focus. */
.card[data-selected]{border-color:var(--state-selected-edge)}
.card[data-selected] > [data-role="target"]{box-shadow:var(--ring-selected)}
.card[data-interactive] > [data-role="target"]:focus-visible{outline:none;box-shadow:inset 0 0 0 var(--ring-w) var(--accent)}
/* menu — popover panel + items (structural minimums clamp; brand styles may raise, never erase) */
.menu{background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--menu-radius);box-shadow:var(--shadow-3);padding-block:max(4px,var(--menu-pad))}
.menu-item{display:flex;align-items:center;gap:var(--control-gap);padding:7px 12px;font-size:13.5px;cursor:pointer;border-radius:var(--radius-item)}
.menu-item:hover{background:var(--surface-3)}
/* menu full anatomy (row 51, first .menu consumer): active follows the worker's
   aria-activedescendant cursor (hover repaints via data-active, not :hover state);
   the indicator column renders on every action row of a checkable menu and the
   badge column reserves an aligned end slot — labels ride ONE left edge (SPEC-42). */
.menu-item[data-active]{background:var(--surface-3)}
.menu-item[aria-disabled="true"]{color:var(--text-disabled);cursor:not-allowed}
.menu-item[aria-disabled="true"]:hover{background:none}
.menu-item[data-danger]{color:var(--danger)}
/* indicator box height is FIXED so a checked glyph never regrows the row (gap-equality) */
.menu-item [data-role="indicator"]{display:inline-flex;justify-content:center;align-items:center;width:var(--space-3);height:1em;line-height:1;flex-shrink:0}
.menu-item[role="menuitemcheckbox"][aria-checked="true"] [data-role="indicator"]::before{content:"\2713"}
.menu-item[role="menuitemradio"][aria-checked="true"] [data-role="indicator"]::before{content:"\2022"}
.menu-item [data-role="label"]{flex:1 1 auto;min-width:0}
.menu-item [data-role="badge"]{margin-inline-start:auto;min-width:var(--space-8);text-align:end;font-size:var(--fs-sm);color:var(--text-3);flex-shrink:0}
.menu-divider{border-block-start:var(--bw) solid var(--hairline);margin-block:max(4px,var(--menu-pad))}
.menu-header{padding:5px 12px;font-size:var(--fs-sm);font-weight:var(--weight-strong);color:var(--text-3)}
/* COMBOBOX. The popup is the MENU surface with listbox semantics and menu rows — the
   #selection sheet paints it that way. Only what the sheet expresses INLINE earns a rule.
   ACTIONS ARE ROWS, transcribed PAST the sheet, which draws create and retry as <button>:
   focus never enters this popup, so a button in there is reachable by pointer alone. */
/* --state-selected-bg rather than --accent-tint directly: they resolve to the same
   colour, but the state role is what STATE_SEPARATION declares and what the lane
   measures, and a second spelling for one state is how a component drifts out of
   the gate. The ring is --state-selected-edge, the accent-seeded edge, for the
   same reason: the wash is chromatic, so its boundary is drawn in its own hue
   family (core/stateEdge.ts) rather than as a neutral seam. The inset ring
   rather than a border because a menu row is not a layered anatomy — a real
   border would move the label. */
.menu-item[role="option"][aria-selected="true"]{background:var(--state-selected-bg);color:var(--on-accent-tint);box-shadow:inset 0 0 0 var(--bw) var(--state-selected-edge)}
.menu-item [data-role="body"]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}
.menu-item [data-role="description"]{font-size:var(--fs-sm);color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.menu-item[data-role="action"]{color:var(--text-3);border-block-start:var(--bw) solid var(--hairline);margin-block-start:var(--space-1)}
/* The trailing slot centres on the FIRST ROW, not the box: the sheet centres on the box,
   which drifts down the page as tags accumulate. It never joins the tag flow. */
.combobox{position:relative}
.combobox [data-role="trailing"]{position:absolute;inset-inline-end:var(--space-3);top:calc(var(--control-h) / 2);transform:translateY(-50%);display:flex;align-items:center;gap:var(--space-1h);pointer-events:none}
.combobox [data-role="trailing"] button{pointer-events:auto;border:none;background:transparent;display:flex;align-items:center;justify-content:center;min-width:var(--tile-sm);min-height:var(--tile-sm);color:var(--text-2);cursor:pointer}
.combobox [data-role="spinner"]{width:var(--space-3h);height:var(--space-3h);border:var(--ring-w) solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin var(--dur-spinner) linear infinite;flex-shrink:0}
/* Tags live INSIDE the field, before the caret. --info-tint is what the sheet reads, and it
   stands: a tag is a token the field carries, not a row that is selected. ARMED is
   visible, never remembered — first Backspace arms, second removes. */
.combobox-tags{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1h);min-height:var(--control-h);max-height:calc(var(--control-h) * 3);overflow-y:auto;padding-block:var(--space-1);padding-inline:var(--space-1h) var(--space-6);border:var(--bw) solid var(--border-strong);border-radius:var(--radius-control);background:var(--surface-ground);cursor:text}
.combobox-tags [data-role="tag"]{display:flex;align-items:center;gap:var(--space-1);background:var(--info-tint);color:var(--on-info-tint);font-size:var(--fs-label);padding-block:var(--space-1);padding-inline:var(--space-2) var(--space-1);border-radius:var(--choice-radius)}
.combobox-tags [data-role="tag"][data-armed]{background:var(--accent);color:var(--on-accent)}
.combobox-tags [data-role="tag"] button{border:none;background:transparent;cursor:pointer;color:inherit;display:flex;align-items:center;justify-content:center;min-width:var(--tile-sm);min-height:var(--tile-sm)}
.combobox-tags [data-role="control"]{flex:1 1 var(--field-w-xs);min-width:var(--space-8);min-height:var(--tile-sm);height:auto;border:none;background:none;outline:none;font:inherit;color:var(--text);padding:0;padding-inline-start:var(--space-1)}
/* Skeleton rows at REAL row height, so arrival never resizes the popup. */
.combobox-face{padding:7px 12px;font-size:var(--fs-sm);color:var(--text-3)}
.combobox-face[data-combobox-state="failed"]{color:var(--on-danger-tint)}
.combobox-face [data-role="skeleton-row"]{display:flex;align-items:center;gap:var(--space-3);height:var(--row-h)}
/* dialog — modal surface (§11, row 49): the overlay2 host owns promotion, focus trap
   and dismiss; the recipe owns anatomy only — pinned header/footer around a scrolling
   body, the closed sm|md|lg|full size axis, the destructive voice. Centering rides the
   UA popover stylesheet (popover=manual promotion); capture pages render in-flow. */
.dialog{display:flex;flex-direction:column;background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);box-shadow:var(--shadow-4);width:min(480px,calc(100vw - var(--space-5)));max-height:min(85vh,calc(100vh - var(--space-5)));overflow:hidden}
.dialog[data-size="sm"]{width:min(360px,calc(100vw - var(--space-5)))}
.dialog[data-size="lg"]{width:min(680px,calc(100vw - var(--space-5)))}
.dialog[data-size="full"]{width:calc(100vw - var(--space-5));max-height:calc(100vh - var(--space-5))}
.dialog [data-role="header"]{flex-shrink:0;padding:var(--pad);border-bottom:var(--bw) solid var(--hairline)}
.dialog [data-role="title"]{margin:0;font-size:15px;font-weight:var(--weight-strong)}
.dialog [data-role="body"]{flex:1 1 auto;min-height:0;overflow-y:auto;padding:var(--pad);font-size:var(--fs);line-height:1.5}
.dialog [data-role="body"] p{margin:0 0 var(--space-2)}
/* footer rides the content grid: the dismissing action sits START (on the body's
   alignment line — SPEC-42 edge discipline), the committing action END; a lone
   action keeps the end position. */
.dialog [data-role="footer"]{flex-shrink:0;display:flex;justify-content:space-between;gap:var(--control-gap);padding:var(--pad);border-top:var(--bw) solid var(--hairline)}
.dialog [data-role="footer"]>:only-child{margin-inline-start:auto}
.dialog[data-variant="destructive"] [data-role="title"]{color:var(--danger)}
/* drawer — edge-anchored dialog variant (§11, row 50): same pinned-zone anatomy as
   .dialog; promotion geometry (fixed, full-height, edge-anchored) is SCOPED to the
   host-promoted state via [popover], so unpromoted capture pages render in-flow. */
.drawer{display:flex;flex-direction:column;background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);box-shadow:var(--shadow-4);width:min(360px,calc(100vw - var(--space-7)));overflow:hidden}
.drawer[data-size="sm"]{width:min(280px,calc(100vw - var(--space-7)))}
.drawer[data-size="lg"]{width:min(480px,calc(100vw - var(--space-7)))}
.drawer[popover]{position:fixed;top:0;bottom:0;height:100dvh;max-height:none;margin:0;border-radius:0;border:none}
.drawer[popover][data-side="start"]{left:0;right:auto;border-inline-end:var(--bw) solid var(--border)}
.drawer[popover][data-side="end"]{right:0;left:auto;border-inline-start:var(--bw) solid var(--border)}
.drawer [data-role="header"]{flex-shrink:0;padding:var(--pad);border-bottom:var(--bw) solid var(--hairline)}
.drawer [data-role="title"]{margin:0;font-size:15px;font-weight:var(--weight-strong)}
.drawer [data-role="body"]{flex:1 1 auto;min-height:0;overflow-y:auto;padding:var(--pad);font-size:var(--fs);line-height:1.5}
.drawer [data-role="body"] p{margin:0 0 var(--space-2)}
/* footer rides the content grid exactly as .dialog's (SPEC-42 edge discipline) */
.drawer [data-role="footer"]{flex-shrink:0;display:flex;justify-content:space-between;gap:var(--control-gap);padding:var(--pad);border-top:var(--bw) solid var(--hairline)}
.drawer [data-role="footer"]>:only-child{margin-inline-start:auto}
/* popover — anchored non-modal panel (§11, row 46): one padded zone (title/body/actions,
   no pinned bars — lighter than .dialog); anchoring geometry is host-runtime, so the
   recipe owns only the panel voice; capture pages render in-flow. */
.popover{background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);box-shadow:var(--shadow-3);width:min(320px,calc(100vw - var(--space-5)));padding:var(--pad)}
.popover [data-role="title"]{margin:0 0 var(--space-1h);font-size:var(--fs-label);font-weight:var(--weight-strong)}
.popover [data-role="body"]{font-size:var(--fs-sm);line-height:1.5;color:var(--text-2)}
.popover [data-role="body"] p{margin:0 0 var(--space-1h)}
.popover [data-role="actions"]{display:flex;justify-content:flex-end;gap:var(--control-gap);margin-top:var(--space-2h)}
/* seat-action — the icon-only affordance seated INSIDE or beside another control:
   a field's clear x and password-eye, a stepper's +/-, a tag's remove, a calendar's
   month arrows. Minted 2026-07-27 off the anatomy census, which had been carrying it
   as 54 occurrences across 12 sections of the Component Sheet under the useless
   heading "92 button" — one line keyed on TAG, so the single most repeated unbuilt
   shape in the corpus was invisible as a shape. Re-keying that census by shape is
   what surfaced it; this is the recipe it asked for.
   NOT a .btn, and the distinction is the whole design: a button brings its own
   ground and stands on its own, while this takes the HOST's ground and exists only
   inside another control's box — which is why it declares no height of its own and
   paints nothing at rest. Hover is the only ground it ever owns.
   It looks small and is not: the pointer floor already grows every button's hit
   target on coarse pointers, so the visible mark shrinks while the target does not —
   the Guide's own "small visible mark inside a full-size hit target" law, which the
   Switch already rides. */
.seat-action{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:var(--control-h-xs);height:var(--control-h-xs);padding:0;border:none;background:transparent;border-radius:var(--seat-inner-radius);color:var(--text-2);cursor:pointer}
.seat-action:hover:not([aria-disabled="true"]){background:var(--surface-3);color:var(--text)}
.seat-action:active:not([aria-disabled="true"]){background:var(--inset)}
.seat-action[aria-disabled="true"]{color:var(--text-disabled);cursor:not-allowed}
/* Seated in a FIELD, the one host that positions rather than flows: the field owns
   the inline pad that keeps text off the action, so the action only says where it
   sits. Two sides, because a clear-x trails and a prefix leads. */
.field-seat{position:relative;display:flex;align-items:center}
.field-seat>.seat-action{position:absolute;inset-inline-end:var(--space-1)}
.field-seat>.seat-action[data-side="start"]{inset-inline-end:auto;inset-inline-start:var(--space-1)}
/* The seat republishes the HOST shape: --seat-inner-radius defaults to
   --radius-control, right until the field rides --radius-search. Scoped by :has()
   because --radius-search is always DEFINED, so a bare var() fallback would never
   fire and would pill the seat of every ordinary field.
   Outer AND inner are declared together, and the pairing is the law: a custom
   property resolves its var()s where it is DECLARED, so the :root cell of
   --seat-inner-radius can never see a host override. Re-derive both, always. */
.field-seat:has(>.field[type="search"]){--seat-outer-radius:var(--radius-search);--seat-inner-radius:max(0px, calc(var(--seat-outer-radius) - var(--seat-inset)))}
/* The E8 clear affordance, landed: the kit-owned clear-x this recipe reserved when
   it suppressed the engine's own search chrome. The glyph is recipe ink (the chip
   remove precedent — an <svg> and its <path> are two more boxes and the SPEC-42
   battery counts boxes). The field's trailing pad derives from the seat grammar:
   the action is --control-h-xs wide and sits --space-1 off the end, plus the same
   step of breathing room — declared as the sum, scoped by :has() so an unseated
   field keeps its own symmetric pad. */
.field-seat>[data-role="clear"]::before{content:"\00d7";font-size:var(--fs-label);line-height:1}
.field-seat:has(>[data-role="clear"])>.field{padding-inline-end:calc(var(--control-h-xs) + var(--space-1) + var(--space-1))}
/* field — text-entry box; fields never notch (text alignment beats identity) */
.field{width:100%;height:var(--control-h);padding:0 var(--field-pad-x);border:var(--bw) solid var(--border-strong);border-radius:var(--radius-control);font-size:var(--fs);font-family:inherit;color:var(--text);background:var(--surface-ground);outline:none}
textarea.field{height:auto;padding-block:8px}
select.field{cursor:pointer}
/* type=search — the engine's own clear chrome is suppressed: the kit owns that
   affordance (a .seat-action in a .field-seat) and two clears must never paint
   together. Scoped to [type="search"], not .field, so select.field keeps its
   native chevron. Contract E8, transcribed from v1 SearchBar.css.ts:106-111. */
.field[type="search"]{appearance:none}
.field[type="search"]::-webkit-search-decoration,.field[type="search"]::-webkit-search-cancel-button{display:none}
[data-role="field"][data-face="search"]>.field{border-radius:var(--radius-search)}
/* field label + meta zones and state chrome — §3 single-line text-input states,
   transcribed token-for-token from the Component Sheet specimens (the sheet is the
   spec). display:block lets the label/meta zones (label is a native inline <label>,
   meta a <span>) carry the specimen's block margins; the required marker paints
   danger like the specimen's asterisk span. Disabled/read-only/invalid couple the
   label+meta voices from the [data-role="field"] block root (the invalid idiom). */
.field-label{display:block;font-size:var(--fs-label);font-weight:var(--weight-strong);margin-bottom:var(--space-1h)}
.field-label [data-role="required"]{color:var(--danger)}
.field-meta{display:block;margin-top:var(--space-1h);font-size:var(--fs-sm);color:var(--text-3)}
.field:hover:not(:disabled):not([readonly]){border-color:var(--border-hover)}
.field:disabled{border-color:var(--border);color:var(--text-disabled);background:var(--surface-3-ground);cursor:not-allowed}
[data-role="field"]:has(.field:disabled) .field-label,[data-role="field"]:has(.field:disabled) .field-meta{color:var(--text-disabled)}
.field[readonly]{border-color:var(--border);color:var(--text-2);background:var(--surface-2-ground)}
[data-invalid] .field,.field[aria-invalid="true"]{border-color:var(--danger)}
[data-invalid] .field-meta{color:var(--on-danger-tint)}
[data-invalid] .field:focus-visible{box-shadow:var(--ring-danger)}
/* textarea — the multi-line field specimen (§3 TEXTAREA rows, transcribed value-for-value:
   the sheet pads its box var(--space-2) var(--space-3) and sets line-height 1.5, where the
   single-line .field rides --field-pad-x on a --control-h box). Rides the FIELD FAMILY for
   boundary, label/meta zones, hover, disabled, read-only, invalid and the focus ring — this
   recipe owns ONLY the multi-line box voice and the grow axis. `fixed` is the base rule (the
   native rows attribute sets the height and the vertical handle stays: "Resizable vertically
   only"); [data-grow="auto"] is the §3 AUTO-GROW specimen with its handle removed ("No manual
   resize handle") — CSS field-sizing does the growing the sheet drives with a JS onInput
   binding, so no control measures scrollHeight. min-height is the SPEC-51 reserved floor: an
   auto field bound to a pending resource holds a control-height box instead of collapsing. */
.textarea{padding:var(--space-2) var(--space-3);line-height:1.5;resize:vertical;min-height:var(--control-h)}
.textarea[data-grow="auto"]{field-sizing:content;resize:none;overflow:hidden}
/* badge / status pill — tone re-aims via --badge-* (sheet §9 BADGES row, transcribed:
   borderless weight-medium pill; neutral is the quiet base face on surface-3 and the
   dot speaks the tone BASE color, never the tint; icon pills tighten gap to space-1
   per the §9 icon specimen). Q-12 RESOLVED 2026-07-24: the selector axis is data-tone
   kit-wide — severity survives only as the token-family prose term. */
.badge{display:inline-flex;align-items:center;gap:var(--space-1h);background:var(--badge-bg,var(--surface-3));color:var(--badge-fg,var(--text-2));font-size:var(--fs-sm);font-weight:var(--weight-medium);padding:var(--space-1) var(--space-2);border-radius:var(--radius-pill)}
.badge[data-tone="ok"]{--badge-bg:var(--ok-tint);--badge-fg:var(--on-ok-tint);--badge-dot:var(--ok)}
.badge[data-tone="warn"]{--badge-bg:var(--warn-tint);--badge-fg:var(--on-warn-tint);--badge-dot:var(--warn)}
.badge[data-tone="danger"]{--badge-bg:var(--danger-tint);--badge-fg:var(--on-danger-tint);--badge-dot:var(--danger)}
.badge[data-tone="info"]{--badge-bg:var(--info-tint);--badge-fg:var(--on-info-tint);--badge-dot:var(--info)}
.badge [data-role="dot"]{width:var(--dot-sm);height:var(--dot-sm);border-radius:50%;background:var(--badge-dot,var(--text-3));flex-shrink:0}
.badge [data-role="icon"]{display:inline-flex;align-items:center;flex-shrink:0}
.badge [data-role="icon"] svg{fill:none;stroke:currentColor;stroke-width:var(--icon-stroke-strong)}
.badge:has([data-role="icon"]){gap:var(--space-1)}
/* divider — passive rules (sheet #overlays DIVIDERS row; the token split is ROLE-
   intentional and transcribed, not unified: section rules + labeled flanks speak
   neutral-tint, the vertical pane rule speaks border, menu dividers keep their own
   .menu-divider hairline). The labeled variant also carries data-orientation, so
   the plain-rule branch excludes it. */
.divider[data-orientation="horizontal"]:not([data-labeled]){height:1px;background:var(--neutral-tint)}
.divider[data-orientation="vertical"]{width:1px;height:var(--icon-md);background:var(--border);flex-shrink:0}
.divider[data-labeled]{display:flex;align-items:center;gap:var(--space-3)}
.divider[data-labeled] [data-role="rule"]{flex:1;height:1px;background:var(--neutral-tint)}
.divider [data-role="label"]{font-size:var(--fs-eyebrow);font-weight:var(--weight-strong);color:var(--text-disabled);text-transform:uppercase;letter-spacing:var(--eyebrow-tracking)}
/* inline alert / banner — severity voice via --alert-* (sheet §10 INLINE ALERTS row;
   warn's icon speaks on-warn-tint, never the warn base — the base fails on the tint).
   Every tone's icon speaks its OWN severity ink, info included: the sheet moved its
   info glyph off --accent onto --info on 2026-07-26 and this rule kept the old word,
   which is the whole of InlineAlert's six brand-style-cell parity mismatches — each recorded
   maxDelta is exactly |--accent - --info| in that brand style, and the brand-accent brand styles are
   precisely the ones that fail. Siblings never forked: .badge/.toast/.table all say --info. */
.alert{display:flex;gap:var(--space-2h);background:var(--alert-bg,var(--neutral-tint));border:var(--bw) solid var(--alert-border,var(--border));border-radius:var(--radius-control);padding:var(--space-3) var(--space-3h)}
.alert[data-tone="info"]{--alert-bg:var(--info-tint);--alert-border:var(--info-border);--alert-icon:var(--info);--alert-fg:var(--on-info-tint)}
.alert[data-tone="ok"]{--alert-bg:var(--ok-tint);--alert-border:var(--ok-border);--alert-icon:var(--ok);--alert-fg:var(--on-ok-tint)}
.alert[data-tone="warn"]{--alert-bg:var(--warn-tint);--alert-border:var(--warn-border);--alert-icon:var(--on-warn-tint);--alert-fg:var(--on-warn-tint)}
.alert[data-tone="danger"]{--alert-bg:var(--danger-tint);--alert-border:var(--danger-border);--alert-icon:var(--danger);--alert-fg:var(--on-danger-tint)}
.alert [data-role="icon"]{stroke:var(--alert-icon,var(--text-2));stroke-width:var(--icon-stroke-strong);flex-shrink:0;margin-top:1px}
.alert [data-role="body"]{flex:1;font-size:var(--fs-label);line-height:1.5;color:var(--alert-fg,var(--text))}
/* display treatment — a hero SELECTS a treatment (like schemes); the brand style owns its look */
[data-display="outline"]{-webkit-text-stroke:var(--display-stroke-w,1px) currentColor;-webkit-text-fill-color:transparent}
[data-display="shadowed"]{text-shadow:var(--display-shadow,none)}
/* gradient — the third member (2026-08-05): the glyphs clip a brand-style-owned gradient;
   every reference brand style resolves it to the flat accent identity. Forced colors
   re-inks the glyphs and drops the fill — treated text never goes transparent. */
[data-display="gradient"]{background:var(--display-gradient,var(--accent-grad));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
@media (forced-colors: active){
  [data-display="gradient"]{background:none;-webkit-text-fill-color:currentColor}
}
/* ambient motion — the THIRD motion class (2026-08-05): seconds-scale decorative
   loops for MARKETING SURFACES ONLY (a hero ornament, a brand band) — app chrome
   never loops decoratively, the same fence as .glass over imagery. A band SELECTS
   a program; the brand style owns the one tempo (--dur-ambient) and may bind 0ms, which
   renders the declaration perfectly still. Reduced motion stills both programs
   (the generated branch). pulse breathes opacity above the disabled band so a
   pulsing layer never reads as a disabled one; drift travels a gradient ground. */
[data-ambient="pulse"]{animation:fk-ambient-pulse var(--dur-ambient,0ms) var(--ease-standard) infinite}
[data-ambient="drift"]{background-size:200% 200%;animation:fk-ambient-drift var(--dur-ambient,0ms) var(--ease-standard) infinite alternate}
/* ---- wave-1 recipe growth (2026-07-24, the receipts' register-growth work orders;
   transcribed from the Component Sheet specimens — the sheet is the spec). ---- */
/* empty-state — centered feature well; data-variant re-points the illustration fill only */
/* border speaks --border, not --hairline: every sheet empty-state specimen is a .card
   (#feedback ×4 + the #data table well) — hairline was a mistranscription (triaged 07-24) */
.empty-state{background:var(--surface-ground);border:var(--bw) solid var(--border);border-radius:var(--radius-surface);padding:var(--space-5) var(--space-3h);text-align:center}
.empty-state [data-role="illustration"]{width:var(--tile-lg);height:var(--tile-lg);border-radius:var(--radius-feature);margin:0 auto var(--space-2h);background:var(--empty-illustration-bg,var(--surface-3))}
.empty-state[data-variant="error"]{--empty-illustration-bg:var(--danger-tint)}
.empty-state [data-role="title"]{margin:0 0 var(--space-1);font-size:var(--fs-label);font-weight:var(--weight-strong)}
.empty-state [data-role="description"]{margin:0 0 var(--space-2h);font-size:var(--fs-sm);color:var(--text-3)}
.empty-state [data-role="actions"]{display:flex;justify-content:center;gap:var(--control-gap)}
.empty-state[data-presentation="inline"]{display:contents;background:transparent;border:0;border-radius:0;padding:0;text-align:center}
.empty-state[data-presentation="inline"] [data-role="illustration"],.empty-state[data-presentation="inline"] [data-role="title"],.empty-state[data-presentation="inline"] [data-role="actions"]{display:none}
.empty-state[data-presentation="inline"] [data-role="description"]{display:block;width:100%;margin:0;text-align:center;font-family:var(--font-mono);font-size:var(--type-micro-size);font-weight:normal;line-height:1.5;color:var(--text-3)}
/* loading — the standalone spinner ring + skeleton shape variants (Skeleton control).
   Scoped under [data-role="loading"] so the .btn svg spinner keeps its own anatomy. */
[data-role="loading"] [data-role="spinner"]{display:inline-block;width:20px;height:20px;border:var(--ring-w) solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin var(--dur-spinner) linear infinite;flex-shrink:0}
[data-role="loading"] [data-role="spinner"][data-size="14"]{width:14px;height:14px}
[data-role="loading"] [data-role="spinner"][data-size="30"]{width:30px;height:30px}
[data-role="loading"][data-fullpage]{align-items:center;justify-content:center;min-height:40vh;gap:var(--space-2h)}
[data-role="loading"][data-fullpage] [data-role="label"]{font-size:var(--fs-sm);color:var(--text-3)}
.skeleton[data-shape="avatar"]{width:var(--tile-sm);height:var(--tile-sm);border-radius:50%;flex-shrink:0}
.skeleton[data-shape="line"]{height:11px;width:100%;max-width:var(--field-w-sm)}
.skeleton[data-shape="block"]{height:var(--row-h-lg);width:100%;border-radius:var(--radius-control)}
/* toast — transient notice (row 41), sheet §feedback TOASTS row TRANSCRIBED (triaged
   2026-07-24: the earlier tint-panel recipe was pattern-matched from .alert/.badge,
   not the sheet): surface bg + generic border, the tone speaks ONLY through the
   --stripe-w start stripe + the icon stroke (warn icon = on-warn-tint, never the base
   — the InlineAlert law); single fs-label message line; inline text action; svg X
   dismiss. info's LIGHT stripe face is mechanism-extrapolated (the sheet's info toast
   is the DARK inverse variant — deferred pending the inverse-context token ruling).
   POINTER FLOOR (2026-07-27 ruling — supersedes the 2026-07-26 amendment): the specimen
   paints a 14px dismiss box and a 16px-tall inline action, both under the SPEC-42 floor,
   but the floor binds the CLICK TARGET, not the glyph ("the ✕ doesn't have to be 24×24,
   BUT the click size must be at least that"). So each target grows PADDING to 24 and pulls
   exactly that much back as negative margin: the border box — what a pointer hits, and what
   the battery measures — clears the floor, while the layout box and every painted pixel
   stay the specimen's. The recipe therefore carries NO divergence from the sheet, and the
   three parity entries gate again rather than being reported-not-gated. */
.toast{display:flex;align-items:flex-start;gap:var(--space-2h);background:var(--surface-ground);border:var(--bw) solid var(--border);border-inline-start:var(--stripe-w) solid var(--toast-stripe,var(--info));border-radius:var(--radius-control);padding:var(--space-3) var(--space-3);box-shadow:var(--shadow-2)}
.toast[data-tone="ok"]{--toast-stripe:var(--ok);--toast-icon:var(--ok)}
.toast[data-tone="warn"]{--toast-stripe:var(--warn);--toast-icon:var(--on-warn-tint)}
.toast[data-tone="danger"]{--toast-stripe:var(--danger);--toast-icon:var(--danger)}
.toast[data-tone="info"]{--toast-stripe:var(--info);--toast-icon:var(--info)}
.toast [data-role="icon"]{stroke:var(--toast-icon,var(--info));stroke-width:var(--icon-stroke-strong);flex-shrink:0;margin-top:1px}
.toast [data-role="message"]{flex:1;font-size:var(--fs-label)}
.toast [data-role="action"]{border:none;background:transparent;font-family:inherit;font-size:var(--fs-label);font-weight:var(--weight-strong);color:var(--accent);cursor:pointer;padding:var(--toast-action-hit-pad) 0;margin-block:calc(-1*var(--toast-action-hit-pad));flex-shrink:0}
.toast [data-role="action"]:hover{text-decoration:underline}
.toast [data-role="dismiss"]{border:none;background:transparent;padding:var(--toast-dismiss-hit-pad);margin:calc(-1*var(--toast-dismiss-hit-pull));cursor:pointer;color:var(--text-disabled);display:flex;flex-shrink:0}
.toast [data-role="dismiss"]:hover{color:var(--text)}
.toast [data-role="dismiss"] svg{fill:none;stroke:currentColor;stroke-width:var(--icon-stroke-strong)}
/* toast-viewport — SPEC-3 toast region (2026-08-01, the Toast admission's deferred
   host slice; vendor sweep receipts in ToastViewport.crate.ts): fixed at BOTTOM-END
   (ruled 2026-08-01 — bottom edge is 6-of-8 vendor convergence, the end seat is the
   Fluent `bottom-end` code default + sonner default; logical insets keep it RTL-true),
   16px from both edges (Spectrum: "16 px away from the bottom of the viewport";
   sonner mobileOffset 16px), 16px between stacked notices (Fluent: "keep 16 pixels
   of space between them"), width 18rem — Carbon's 288px/18rem, the ONE vendor-
   documented toast width in the sweep — shrinking to viewport-minus-margins on
   narrow screens (Spectrum: never larger than the viewport width). Newest notice
   sits NEAREST the edge: plain column order, oldest up (Fluent: new toasts appear
   at the edge, pushing older toward the center). The inset/margin/border/padding/
   background resets beat the UA popover stylesheet the host's top-layer promotion
   applies. Layer var, never a hand-picked z-index (LAW-13). */
.toast-viewport{position:fixed;inset:auto;inset-inline-end:var(--space-4);inset-block-end:var(--space-4);margin:0;border:none;padding:0;background:transparent;overflow:visible;display:flex;flex-direction:column;gap:var(--space-4);width:min(18rem,calc(100vw - (2 * var(--space-4))));z-index:var(--layer-toast);outline:none}
.toast-viewport [data-role="notice"]{display:block}
/* segmented-control — SPEC-45 single-choice specimen; rides the shared .seg-track /
   .seg-thumb anatomy (ground + selected-state voice stay there), so this recipe owns
   ONLY the segment box geometry + type and the size axis, sourced from the --control-*
   tokens (geometry stays with the specimen, per the seg-track contract). */
.segmented-control [data-role="segment"]{display:inline-flex;align-items:center;justify-content:center;height:var(--control-h);padding:0 var(--control-pad-x);font-size:13.5px;font-weight:var(--btn-weight);font-family:var(--font-ui);cursor:pointer;white-space:nowrap}
.segmented-control[data-size="sm"] [data-role="segment"]{height:var(--control-h-sm);padding:0 var(--control-pad-x-sm);font-size:12.5px}
.segmented-control[data-size="lg"] [data-role="segment"]{height:var(--control-h-lg);padding:0 var(--control-pad-x-lg);font-size:14.5px}
.segmented-control[data-disabled] [data-role="segment"]{cursor:not-allowed}
/* segmented-control marked dot — R4 anatomy extension (intake rulebook, ruled
   2026-07-29, the rung's minting case): an optional authored-register dot inside a
   segment, declared as segment data (marked), never inferred. Accent is the identity
   channel; geometry rides the --dot-sm/--space-1 tokens like the badge dot. */
.segmented-control [data-role="segment"] [data-role="dot"]{width:var(--dot-sm);height:var(--dot-sm);border-radius:50%;background:var(--accent);margin-inline-start:var(--space-1);flex-shrink:0}
/* switch — SPEC-45 on/off toggle (Selection row 7, APG switch). The native <button
   role="switch"> host paints the .switch recipe; the on/off face rides aria-checked
   directly (the .btn[aria-pressed] precedent, never a color prop). Track + thumb
   geometry come from the density-reactive --switch-* tokens; the checked thumb travel
   is the inner track width (track-w minus the --space-half inset on each side) less the
   thumb. The host clears the --pointer-min hit floor (min-height) while the visible track
   stays token-sized; disabled dims via the native :disabled (the host is a real button).
   SHAPE IS IDENTITY (ruled 2026-08-01): the pill track and circular thumb ride the
   SHARED_T --radius-round pin, never the brand-style-writable --radius-pill — sharp brand styles zero
   that register for badges and chips, and a squared switch stops reading as a switch.
   Canon: Radix theme radius is contextual per component (a Checkbox never goes
   full-round), shadcn pins its Switch rounded-full beside a themable --radius, M3
   squares a switch only through the switch's OWN component token. House precedent:
   the radio dot pins border-radius:50%. */
.switch{display:inline-flex;align-items:center;justify-content:center;min-height:var(--pointer-min);padding:0;border:none;background:none;cursor:pointer}
.switch [data-role="track"]{display:inline-flex;align-items:center;width:var(--switch-track-w);height:var(--switch-track-h);padding:var(--space-half);border-radius:var(--radius-round);background:var(--surface-3);border:var(--bw) solid var(--border-strong);transition:background var(--dur-1) var(--ease-standard),border-color var(--dur-1) var(--ease-standard)}
.switch [data-role="thumb"]{width:var(--switch-thumb);height:var(--switch-thumb);border-radius:var(--radius-round);background:var(--surface);box-shadow:var(--shadow-1);transition:transform var(--dur-1) var(--ease-standard),background var(--dur-1) var(--ease-standard)}
.switch[aria-checked="true"] [data-role="track"]{background:var(--accent);border-color:var(--accent)}
.switch[aria-checked="true"] [data-role="thumb"]{transform:translateX(calc(var(--switch-track-w) - var(--switch-thumb) - var(--space-half) - var(--space-half)));background:var(--on-accent)}
.switch:disabled{cursor:not-allowed;opacity:var(--disabled-opacity)}
/* native-select — field-family <select> with a chevron affix; the well positions the
   chevron and pads the select's inline-end so option text never runs under it. Selection,
   disabled and invalid VOICE all ride the shared .field recipe (field family) — this recipe
   owns ONLY the well + the register-token chevron glyph (native appearance suppressed). */
.native-select{position:relative;display:block}
[data-role="field"][data-width="sm"]:has(>.native-select){inline-size:var(--field-w-sm)}
.native-select .field{width:100%;padding-inline-end:var(--control-h);appearance:none;-webkit-appearance:none}
.native-select::after{content:"";position:absolute;inset-inline-end:var(--field-pad-x);top:50%;width:var(--space-1h);height:var(--space-1h);border-inline-end:var(--bw) solid var(--text-3);border-block-end:var(--bw) solid var(--text-3);transform:translateY(-70%) rotate(45deg);pointer-events:none}
.native-select:has(.field:disabled)::after{border-color:var(--text-disabled)}
[data-invalid] .native-select::after{border-color:var(--danger)}
/* radio-group — SPEC-45 single-choice specimen (Selection row 6, APG radiogroup).
   Native <fieldset><legend> grouping with a real radio per option sharing a name:
   single selection, roving focus and arrow-key navigation come free from the
   platform. The real input is the transparent a11y overlay filling its row (the
   .checkbox precedent — the row clears the pointer floor); the painted dial rides
   the shared --checkbox-size and the --accent fill. The recipe owns the fieldset
   reset, the orientation flow axis, the legend voice and the option-row dial. */
.radio-group{border:0;margin:0;padding:0;min-width:0;display:flex;flex-direction:column;gap:var(--control-gap)}
.radio-group[data-orientation="horizontal"]{flex-direction:row;flex-wrap:wrap;align-items:center;gap:var(--gap)}
.radio-group[data-orientation="horizontal"] [data-role="legend"]{flex-basis:100%}
.radio-group [data-role="legend"]{padding:0;margin-bottom:var(--space-1h);font-size:var(--fs-label);font-weight:var(--weight-strong)}
.radio-group [data-role="option"]{position:relative;display:inline-flex;align-items:center;gap:var(--control-gap);min-height:var(--pointer-min);font-size:var(--fs-label);line-height:1.4;color:var(--text);cursor:pointer}
.radio-group [data-role="control"]{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.radio-group [data-role="dot"]{display:block;flex-shrink:0;width:var(--checkbox-size);height:var(--checkbox-size);background:var(--surface);border:var(--bw) solid var(--border-strong);border-radius:50%;transition:background var(--dur-1) var(--ease-standard),border-color var(--dur-1) var(--ease-standard)}
.radio-group [data-role="dot"] [data-mark="dot"]{fill:var(--on-accent);opacity:0}
.radio-group [data-role="option"]:not([data-disabled]):hover [data-role="dot"]{border-color:var(--border-hover)}
.radio-group [data-role="option"][data-state="checked"] [data-role="dot"]{background:var(--accent);border-color:var(--accent)}
.radio-group [data-role="option"][data-state="checked"] [data-mark="dot"]{opacity:1}
.radio-group [data-role="control"]:focus-visible~[data-role="dot"]{box-shadow:var(--ring)}
.radio-group [data-role="option"][data-disabled="true"]{color:var(--text-disabled);cursor:not-allowed}
.radio-group:disabled [data-role="legend"]{color:var(--text-disabled)}
/* checkbox — SPEC-45 selection specimen (Selection row 5, native + APG checkbox). The
   real <input type="checkbox"> is the a11y element (transparent overlay over the box — the
   focus + hit target); the painted box + marks ride data-state (checked | indeterminate |
   unchecked) so the indeterminate face — a JS-only native property, invisible in static
   capture — renders from the token recipe, not the UA. Box is the density-reactive
   --checkbox-size; the check + dash marks stroke --on-accent; disabled dims via policy. */
.checkbox{position:relative;display:inline-flex;align-items:center;min-height:var(--pointer-min);gap:var(--control-gap);font-size:var(--fs-label);line-height:1.4;color:var(--text);cursor:pointer}
.checkbox [data-role="control"]{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.checkbox [data-role="box"]{display:block;flex-shrink:0;width:var(--checkbox-size);height:var(--checkbox-size);background:var(--surface);border:var(--bw) solid var(--border-strong);border-radius:var(--radius-xs);stroke-linecap:round;stroke-linejoin:round;transition:background var(--dur-1) var(--ease-standard),border-color var(--dur-1) var(--ease-standard)}
.checkbox [data-role="box"] [data-mark]{stroke:var(--on-accent);stroke-width:var(--icon-stroke-strong);opacity:0}
.checkbox:not([data-disabled]):hover [data-role="box"]{border-color:var(--border-hover)}
.checkbox[data-state="checked"] [data-role="box"],.checkbox[data-state="indeterminate"] [data-role="box"]{background:var(--accent);border-color:var(--accent)}
.checkbox[data-state="checked"] [data-mark="check"]{opacity:1}
.checkbox[data-state="indeterminate"] [data-mark="dash"]{opacity:1}
.checkbox [data-role="control"]:focus-visible~[data-role="box"]{box-shadow:var(--ring)}
/* tooltip — §11 row 45; a v1-parity LOCAL popup (NOT overlay-promoted). The wrapper
   is the in-flow relative anchor; the always-mounted [data-role="popup"] chip toggles
   paint via data-visible (geometry never moves — LAW-13), rides the ratified inverse
   surface voice (--inverse-bg / --on-inverse) and sits on the --layer-popover plane.
   data-placement offsets the chip by --space-1h; top/bottom align to the trigger's
   left edge, start/end offset x. pointer-events:none — the tip never eats the pointer. */
.tooltip{position:relative;display:inline-block}
.tooltip [data-role="popup"]{position:absolute;z-index:var(--layer-popover);width:max-content;max-width:var(--field-w-ml);padding:var(--space-1) var(--space-2);background:var(--inverse-bg);color:var(--on-inverse);border-radius:var(--radius-control);font-size:var(--fs-sm);line-height:1.4;box-shadow:var(--shadow-2);pointer-events:none;opacity:0;visibility:hidden}
.tooltip [data-role="popup"][data-visible="true"]{opacity:1;visibility:visible;pointer-events:auto}
.tooltip [data-role="popup"][data-placement="top"]{bottom:100%;left:0;margin-bottom:var(--space-1h)}
.tooltip [data-role="popup"][data-placement="bottom"]{top:100%;left:0;margin-top:var(--space-1h)}
.tooltip [data-role="popup"][data-placement="start"]{right:100%;top:0;margin-right:var(--space-1h)}
.tooltip [data-role="popup"][data-placement="end"]{left:100%;top:0;margin-left:var(--space-1h)}
/* Anchored viewport flip (ordered by Justin, 2026-08-01; canon rung: Radix/Floating UI
   flip middleware, Carbon v11 autoAlign, Primer's popover+anchor rebuild — every
   mainstream system treats authored placement as a PREFERENCE and repositions when it
   would clip). Where the anchor-positioning module exists, the popup rides
   position:fixed off the wrapper's anchor — same box, same gap, but its containing
   block is the VIEWPORT, so position-try-fallbacks flips a clipping placement to the
   opposite side declaratively (the workbench dock's top-of-viewport glosses rendered
   off-screen) and escapes ancestor overflow clipping on the way. The absolute rules
   above stay as the graceful floor for engines without the module (Firefox). LAW-13
   holds: geometry stays all-CSS and data-visible still only toggles paint. The shared
   anchor name resolves per-popup to its OWN wrapper — the nearest preceding bearer in
   tree order — so one dashed-ident serves every mount. */
@supports (position-try-fallbacks: flip-block){
  .tooltip{anchor-name:--fk-tooltip}
  .tooltip [data-role="popup"]{position:fixed;position-anchor:--fk-tooltip}
  .tooltip [data-role="popup"][data-placement="top"]{inset:auto;margin:0;position-area:block-start span-inline-end;margin-block-end:var(--space-1h);position-try-fallbacks:flip-block}
  .tooltip [data-role="popup"][data-placement="bottom"]{inset:auto;margin:0;position-area:block-end span-inline-end;margin-block-start:var(--space-1h);position-try-fallbacks:flip-block}
  .tooltip [data-role="popup"][data-placement="start"]{inset:auto;margin:0;position-area:inline-start span-block-end;margin-inline-end:var(--space-1h);position-try-fallbacks:flip-inline}
  .tooltip [data-role="popup"][data-placement="end"]{inset:auto;margin:0;position-area:inline-end span-block-end;margin-inline-start:var(--space-1h);position-try-fallbacks:flip-inline}
}
/* ---- wave-2 recipe growth (2026-07-26, the chip transcription: inventory rows 36 + 10). ---- */
/* chip / tag — sheet #data TAGS / CHIPS + OVERFLOW, transcribed. A chip is a TOKEN, so it
   takes --radius-control on a --surface-3 wash; the pill radius stays with .badge, which is
   a status WORD. Four faces off data-kind: plain (static text, the base rule), removable
   (label + dismiss target), action (an --accent command), overflow (the "+N" remainder).
   The three INTERACTIVE faces take the pointer floor the inline sheet specimen does not
   (SPEC-42, the .checkbox / .switch precedent): the host floors on --pointer-min and the
   dismiss target is a --pointer-min square, so a tag row is reachable by touch. That is the
   one deliberate divergence from the specimen, and it is why those three parity entries are
   reported-not-gated in Chip.sheetParity.ts. The dismiss GLYPH is a ::before, not the sheet's
   inline <svg>: an svg and its path are two more boxes, and the SPEC-42 alignment-lines
   battery counts boxes (the .menu-item indicator precedent). */
.chip{background:var(--surface-3);color:var(--text-2);font-size:var(--fs-sm);padding:var(--space-1) var(--space-2);border-radius:var(--radius-control)}
.chip[data-kind="removable"]{display:inline-flex;align-items:center;gap:var(--space-1);min-height:var(--pointer-min);padding-block:0;padding-inline:var(--space-2) var(--space-1)}
.chip[data-kind="action"]{display:inline-flex;align-items:center;min-height:var(--pointer-min);border:none;color:var(--accent);font-family:inherit;cursor:pointer}
.chip[data-kind="action"]:hover{background:var(--inset)}
.chip[data-kind="overflow"]{display:inline-flex;align-items:center;min-height:var(--pointer-min);background:none;border:none;color:var(--text-3);font-family:inherit;cursor:pointer}
.chip[data-kind="overflow"]:hover{color:var(--text);text-decoration:underline}
.chip [data-role="remove"]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--pointer-min);height:var(--pointer-min);padding:0;border:none;background:none;border-radius:var(--radius-xs);color:var(--text-3);cursor:pointer}
.chip [data-role="remove"]:hover{color:var(--text)}
.chip [data-role="remove"]::before{content:"\00d7";font-size:var(--fs-label);line-height:1}
/* chip-selector — sheet #selection CHIP / TAG SELECTOR — MULTI, transcribed (inventory row
   10, APG listbox multi-select). Column host: the visible group label, the wrapping option
   track, then the meta line the error voice speaks through (the field family's always-there
   meta, so an invalid group never grows). Each option is a chip-shaped button at
   --choice-radius; the selected face is the SOLID register (--accent ground + --on-accent
   ink — the .combobox-tags armed / .calendar-day selected precedent), never a check glyph
   (ruled by Justin, 2026-08-01): a glyph is CONTENT, content widens the selected chip, and
   a track that reflows on toggle misreports what changed. Both faces share one geometry —
   selection re-inks, never re-measures — and fill-vs-outline scans without decoding a mark.
   Selected hover deepens the fill (--accent-hover, the .calendar-day precedent).
   The RESTING face carries --choice-shadow (tokens 3.26.0, choice-face-separation lane —
   ruled by Justin, 2026-08-02): the option fills --surface and rests ON --surface, dE 0.000
   by construction, and the census (data/gateTables.ts CHOICE_FACE_CENSUS) shows no vendor
   rests a choice surface on an outline alone — the shadow is the carrier (the M3
   elevated-chip / Polaris border-plus-shadow grammar). The border STAYS: it is the HC
   axis's channel, where both --choice-shadow columns author `none`. */
.chip-selector{display:flex;flex-direction:column;gap:var(--space-1h);align-items:flex-start}
.chip-selector [data-role="label"]{font-size:var(--fs-label);font-weight:var(--weight-strong);color:var(--text)}
.chip-selector [data-role="track"]{display:flex;flex-wrap:wrap;gap:var(--space-2)}
.chip-selector [data-role="option"]{display:inline-flex;align-items:center;min-height:var(--pointer-min);padding:var(--space-1) var(--space-3);background:var(--surface);border:var(--bw) solid var(--border-strong);border-radius:var(--choice-radius);box-shadow:var(--choice-shadow);color:var(--text-2);font-size:var(--fs-label);font-family:inherit;cursor:pointer}
.chip-selector [data-role="option"]:hover:not(:disabled){border-color:var(--border-hover)}
.chip-selector [data-role="option"][aria-selected="true"]{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.chip-selector [data-role="option"][aria-selected="true"]:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}
.chip-selector [data-role="option"]:disabled{background:var(--surface-2);border-color:var(--border);box-shadow:none;color:var(--text-disabled);cursor:not-allowed}
.chip-selector [data-role="meta"]{font-size:var(--fs-sm);color:var(--text-3)}
.chip-selector[data-invalid] [data-role="option"]{border-color:var(--danger)}
.chip-selector[data-invalid] [data-role="meta"]{color:var(--on-danger-tint)}
/* stepper — the wizard traversal specimen (Navigation row 29, sheet §navigation).
   The connector rides INSIDE its own step, so ONE flex flow carries
   step · connector · step at a single --space-2h gap without a display:contents
   <li> — which is what a flat run would have cost, and it would have cost the
   list semantics this control is contracted on. The base marker IS the upcoming
   face; done / current / error override it, and the error mark replaces the
   ordinal in place so a failed step keeps its seat. Horizontal labels never wrap
   (the connectors absorb the leftover measure); the vertical rail wraps instead,
   because a rail has no width to give. No rule reads aria-current — the ARIA
   states the fact for AT, [data-state] paints it. */
.stepper{display:flex;align-items:center;gap:var(--space-2h);margin:0;padding:0;list-style:none}
.stepper [data-role="step"]{display:flex;align-items:center;gap:var(--space-2h);flex:1 1 auto;min-width:0}
.stepper [data-role="step"]:first-child{flex:0 0 auto}
.stepper [data-role="connector"]{flex:1 1 auto;height:var(--ring-w);min-width:var(--space-5);background:var(--border)}
.stepper [data-role="connector"][data-state="done"]{background:var(--accent)}
.stepper [data-role="trigger"]{display:flex;align-items:center;gap:var(--space-2);white-space:nowrap;min-height:var(--pointer-min,var(--tile-sm));padding:0;border:none;background:transparent;color:inherit;font-family:inherit;cursor:pointer}
.stepper [data-role="marker"]{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--tile-sm);height:var(--tile-sm);border-radius:50%;border:var(--bw) solid var(--border-strong);background:var(--surface-3);color:var(--text-3);font-size:var(--fs-sm);font-weight:var(--weight-strong)}
.stepper [data-role="marker"] [data-mark="check"]{width:var(--tile-sm);height:var(--tile-sm);fill:none;stroke:currentColor;stroke-width:var(--icon-stroke-strong)}
.stepper [data-role="label"]{font-size:var(--fs);color:var(--text-3);font-weight:var(--weight-regular)}
.stepper [data-role="step"][data-state="done"] [data-role="marker"]{border:none;background:var(--accent);color:var(--on-accent)}
.stepper [data-role="step"][data-state="done"] [data-role="label"]{color:var(--text-2)}
.stepper [data-role="step"][data-state="current"] [data-role="marker"]{border:var(--ring-w) solid var(--accent);background:var(--accent-tint);color:var(--on-accent-tint);font-weight:var(--weight-heavy)}
.stepper [data-role="step"][data-state="current"] [data-role="label"]{color:var(--text);font-weight:var(--weight-strong)}
.stepper [data-role="step"][data-state="error"] [data-role="marker"]{border:none;background:var(--danger);color:var(--on-danger);font-size:var(--fs-label);font-weight:var(--weight-heavy)}
.stepper [data-role="step"][data-state="error"] [data-role="label"]{color:var(--on-danger-tint);font-weight:var(--weight-strong)}
.stepper[data-orientation="vertical"]{flex-direction:column;align-items:stretch;gap:0}
.stepper[data-orientation="vertical"] [data-role="step"]{flex-direction:column;align-items:stretch;gap:0}
.stepper[data-orientation="vertical"] [data-role="connector"]{width:var(--ring-w);height:auto;min-width:0;min-height:var(--space-3h);margin-inline-start:calc((var(--tile-sm) - var(--ring-w)) / 2)}
.stepper[data-orientation="vertical"] [data-role="trigger"]{white-space:normal;text-align:start}
/* table — the CELL/ROW PRIMITIVE SET (inventory row 31, TableKit), transcribed from the
   sheet's #data "Full-featured table", "DENSITY — COMPACT" and "TABLE — LOADING SKELETON"
   specimens.
   SCOPE IS THE RATIFIED ONE (Table 3, 2026-07-23) and it is narrower than the specimen:
   this recipe owns header ground + rule, body hairlines, the row states, the two density
   steps, the numeric / muted / toned cell faces and the aggregate foot — and nothing else.
   Sticky header, sticky selection column, resize handle, expand row, toolbar and bulk band
   are the tier-2 DataTable assembly; there is deliberately no rule for any of them here.
   border-collapse stays SEPARATE at zero spacing (the specimen's own choice): each cell
   then keeps its OWN hairline, so a selected row re-points its edges to --accent-border
   without a collapsed neighbour winning the seam.
   THE SORT TARGET FILLS ITS CELL. A sortable head drops the cell padding and the <button>
   takes it, which buys two things at once — the whole column head is the hit target
   (floored on --pointer-min, SPEC-42), and the button starts on the cell's own left edge,
   so it mints no second alignment line. The direction mark is an ::after GLYPH off
   aria-sort for the same reason (the .menu-item indicator precedent): one extra element
   per sorted column costs one alignment line per column.
   SELECTED INK MOVES WITH THE WASH — the .nav-item[aria-current] law. --accent-tint is a
   chromatic ground and the contrast gate certifies exactly one foreground on it, so the
   row takes --on-accent-tint rather than the specimen's inherited --text, which no gate
   measures. The selection rail rides --stripe-w, the register's declared emphasis edge. */
.table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-label);color:var(--text)}
.table th{background:var(--surface-2-ground);border-block-end:var(--bw) solid var(--border);padding:var(--space-2) var(--space-3);text-align:start;font-size:var(--fs-sm);font-weight:var(--weight-strong);color:var(--text-2)}
.table td{background:var(--surface-ground);border-block-end:var(--bw) solid var(--hairline);padding:var(--space-2) var(--space-3);text-align:start}
/* the sortable head — the cell's pad moves to the target, so the head IS the button */
.table th:has([data-role="sort"]){padding:0}
.table [data-role="sort"]{display:flex;align-items:center;gap:var(--space-1);width:100%;min-height:var(--pointer-min);padding:var(--space-2) var(--space-3);border:none;background:none;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;text-align:inherit;cursor:pointer}
.table [data-role="sort"]:hover{color:var(--text)}
.table th[data-kind="number"] [data-role="sort"]{justify-content:flex-end}
.table th[aria-sort="ascending"] [data-role="sort"]::after{content:"\2191";color:var(--accent)}
.table th[aria-sort="descending"] [data-role="sort"]::after{content:"\2193";color:var(--accent)}
/* cell kinds — number is the tabular readout (digits must not jitter, the .num law),
   muted the secondary column; text is the base rule and mints no selector. */
.table th[data-kind="number"],.table td[data-kind="number"]{text-align:end;font-variant-numeric:tabular-nums lining-nums}
.table td[data-kind="muted"]{color:var(--text-2)}
/* cell tone (Q-12) — INK ONLY on the readout, exactly as .rows row tone: a cell is not
   a badge, so the status axis buys no tint panel and no border. warn takes
   --on-warn-tint, never the --warn base (the InlineAlert law); neutral is the base rule. */
.table td[data-tone="info"]{color:var(--info)}
.table td[data-tone="ok"]{color:var(--ok)}
.table td[data-tone="warn"]{color:var(--on-warn-tint)}
.table td[data-tone="danger"]{color:var(--danger)}
/* row states — hover is the recipe's own; selected is DECLARED on the row */
.table tbody tr:hover td{background:var(--surface-2-ground)}
.table tbody tr[data-state="selected"] td{background:var(--accent-tint);border-block-end-color:var(--accent-border);color:var(--on-accent-tint)}
.table tbody tr[data-state="selected"] td:first-child{box-shadow:inset var(--stripe-w) 0 0 var(--accent)}
/* aggregate foot — raised ground, the rule ABOVE it, strong ink, no bottom hairline */
.table tfoot td{background:var(--surface-2-ground);border-block-start:var(--bw) solid var(--border);border-block-end:none;font-weight:var(--weight-strong);color:var(--text-2)}
/* density — the compact step (sheet "DENSITY — COMPACT") drops padding one rung and the
   head takes the eyebrow grade. The unmarked default remains comfortable through the base
   rules above; the explicit comfortable face reasserts that same geometry when selected. */
.table[data-density="comfortable"] th{padding:var(--space-2) var(--space-3);font-size:var(--fs-sm)}
.table[data-density="comfortable"] th:has([data-role="sort"]){padding:0}
.table[data-density="comfortable"] [data-role="sort"]{padding:var(--space-2) var(--space-3)}
.table[data-density="comfortable"] td{padding:var(--space-2) var(--space-3)}
.table[data-density="compact"] th{padding:var(--space-1) var(--space-2h);font-size:var(--fs-eyebrow)}
.table[data-density="compact"] th:has([data-role="sort"]){padding:0}
.table[data-density="compact"] [data-role="sort"]{padding:var(--space-1) var(--space-2h)}
.table[data-density="compact"] td{padding:var(--space-1) var(--space-2h)}
/* pending (SPEC-51) — the skeleton row IS the loaded row: same head, same cells, same
   padding, a tier-0 .skeleton bar standing in for each value, so nothing below the table
   moves when the data lands. The one rule the primitive owes a table cell is display: a
   .skeleton span is inline (it rides flex hosts everywhere else) and an inline box cannot
   take the width its shape declares, so inside a cell it becomes a block. */
.table .skeleton{display:block}
/* ---- wave-3 recipe growth (2026-07-26, the Q-3 transcription wave: inventory rows 2 / 33 / 37). ---- */
/* stat-tile — the KPI reading (sheet §data "KPI / stat tiles", transcribed). A <dl>: the
   caption is the term, and the figure / delta / trend seat are its descriptions. Zone MARGINS
   own the vertical rhythm (the .field-label / .field-meta precedent) rather than a flex gap,
   because each zone keeping its OWN type box is what holds the loading footprint equal to the
   loaded one. The tile is a CELL, not a surface: it owns its padding in both kpi-band faces
   and paints no frame — the joined band's internal hairlines ARE the grid gap, so a border
   per cell would double against the frame the moment a row wraps (the B-2 construction
   ruling). The .card around each KPI specimen on the sheet is the sheet's demo box, exactly
   as it is around the key-value specimen .rows also declines to paint. */
.stat-tile{display:block;margin:0;padding:var(--pad);min-inline-size:0}
.stat-tile [data-role="label"]{margin:0 0 var(--space-1h);font-size:var(--fs-label);font-weight:var(--weight-medium);color:var(--text-3)}
/* the figure — the display type role at the brand style's display weight and tracking, never its
   display FAMILY (no-divergent-font-declaration); the .num part on the same element carries
   the tabular lining the sheet specimen sets by hand. It breaks inside itself rather than
   overflowing its cell: a tile's habitat floor is the band's --tile-min, and a number that
   is silently cut is a wrong number. */
.stat-tile [data-role="value"]{display:block;margin:0;font-size:var(--type-display-size);line-height:var(--type-display-lh);font-weight:var(--display-weight);letter-spacing:var(--display-tracking);color:var(--text);overflow-wrap:anywhere}
/* the delta — ONE fact in two channels: the mark says which way it moved, the ink says
   whether that is good, and the VIEW derives both from direction plus the metric's declared
   polarity (there is no colour prop to disagree with the mark). Ink only — no tint panel and
   no border, because a reading is not a badge (the .rows tone law). Adverse speaks
   --on-danger-tint, which is the sheet's own ink and the InlineAlert law (a tint's partner
   ink reads where the saturated base does not); neutral rides the base rule, so a flat or
   unjudged movement paints no status at all. */
.stat-tile [data-role="delta"]{display:block;margin:var(--space-1) 0 0;font-size:var(--fs-label);line-height:var(--type-label-lh);font-weight:var(--weight-strong);color:var(--text-3)}
.stat-tile [data-role="delta"][data-tone="ok"]{color:var(--ok)}
.stat-tile [data-role="delta"][data-tone="danger"]{color:var(--on-danger-tint)}
.stat-tile [data-role="delta"] [data-mark]{margin-inline-end:var(--space-1)}
/* the trend seat — the tile reserves and sizes it, the consumer fills it. Its height is
   --row-h-lg because that is exactly .skeleton[data-shape="block"], so the pending mark and
   the chart occupy the same box by construction; the seat stretches its fill, so a chart is
   never told how wide the cell is. */
.stat-tile [data-role="spark"]{display:flex;align-items:stretch;margin:var(--space-2h) 0 0;block-size:var(--row-h-lg)}
.stat-tile [data-role="spark"]>*{flex:1 1 auto;min-inline-size:0}
/* pending marks stay INLINE-BLOCK inside the zone they stand in for, so the zone's own type
   strut still sets the line box and the loading footprint IS the loaded footprint (SPEC-51
   constructional, the FormGrid seat idiom). The fixed-height trend seat blockifies its mark
   through flex, which is why it needs no exception here. */
.stat-tile .skeleton{display:inline-block;vertical-align:middle}
/* progress — the ONE task-progress readout (row 37 absorbs the determinate and
   indeterminate bar, the ring and the segmented meter behind the shape axis), sheet
   §data PROGRESS — BARS, RING, METER transcribed. Waiting for CONTENT is Skeleton's
   (LAW-13): this paints a task moving, a gauge reading, or a capacity split — never a
   region loading.
   VALUE → GEOMETRY IS THE VIEW'S, PAINT IS THE REGISTER'S. Style attributes are banned
   in tier 1, so the control emits its reading as an SVG width PRESENTATION attribute
   (<svg data-role="fill" width="72%">) and the ring as stroke-dashoffset; every rule
   below owns ground, measure, radius and voice, and none of them owns a fill width.
   The one exception is the INDETERMINATE mark, whose 35% and whose sweep are the
   register's precisely because there is no reading to map — it rides @keyframes indet,
   minted for this face and unconsumed until now.
   Two columns, one grid: caption at the start edge, readout at the end (tabular), track
   across both — so a labelled bar rides ONE left edge (SPEC-42). */
.progress{display:grid;grid-template-columns:1fr auto;row-gap:var(--space-1)}
.progress [data-role="label"]{min-width:0;font-size:var(--fs-label);font-weight:var(--weight-medium);color:var(--text)}
.progress [data-role="value"]{justify-self:end;font-size:var(--fs-label);color:var(--text-3);font-variant-numeric:tabular-nums}
.progress [data-role="track"]{grid-column:1/-1;position:relative}
.progress:not([data-shape="ring"]) [data-role="track"]{display:flex;width:100%;height:var(--track-h);border-radius:var(--radius-xs);background:var(--neutral-tint);overflow:hidden}
.progress:not([data-shape="ring"]) [data-role="fill"]{height:100%;border-radius:var(--radius-xs);background:var(--accent)}
/* the running mark — no reading to map, so the register owns both its measure and its motion */
.progress [data-role="fill"][data-indeterminate="true"]{position:absolute;top:0;width:35%;animation:indet var(--dur-shimmer) ease-in-out infinite}
/* segmented meter — a capacity DECOMPOSITION, so its bands ride the categorical chart
   ramp by position: a per-band severity would need a tone axis row 37 does not declare,
   and data-tone is the one status axis (Q-12/LAW-5). Bands butt against each other
   inside the track — the divisions ARE the reading, so a gap would be a lie. */
.progress[data-shape="meter"] [data-role="track"]{height:var(--space-2h)}
.progress[data-shape="meter"] [data-role="fill"]{border-radius:0;background:var(--chart-1)}
.progress[data-shape="meter"] [data-role="fill"]:nth-child(2){background:var(--chart-2)}
.progress[data-shape="meter"] [data-role="fill"]:nth-child(3){background:var(--chart-3)}
/* ring — the sheet's fixed gauge canvas: a 64-unit box with the arc on r=27 at 3.2x the
   brand style's --chart-stroke over a --hairline groove. The readout is the SAME value zone the
   bar labels, re-seated in the middle rather than re-minted, so one anatomy carries all
   three faces. The BOX is the one measure this register does not carry: it is one fact
   with the viewBox, so it rides the view's width/height presentation attributes beside
   it (a second 64 here could drift from the first, and a literal no brand style can retune has
   no home in the register — SPEC-65, ANATOMY_CENSUS only shrinks). The rules below size
   nothing: the box track is simply excluded from the bar/meter groove above, so the svg
   takes its own intrinsic 64. --chart-stroke stays the only part a brand style re-values, and
   it scales with the box because the arc is drawn in viewBox units. */
.progress[data-shape="ring"]{position:relative;display:inline-block}
.progress[data-shape="ring"] [data-role="track"]{display:block;overflow:visible}
.progress[data-shape="ring"] [data-role="track"] circle{fill:none;stroke:var(--hairline);stroke-width:calc(var(--chart-stroke)*3.2)}
.progress[data-shape="ring"] [data-role="fill"]{stroke:var(--accent);stroke-linecap:round}
.progress[data-shape="ring"] [data-role="value"]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:var(--fs-label);font-weight:var(--weight-heavy);font-variant-numeric:tabular-nums;color:var(--text)}
/* save-state-chip — the AUTOSAVE readout (inventory row 56), sheet §extended SAVE-STATE —
   AUTOSAVE CONTRACT transcribed. ONE pill anatomy wearing four faces off data-kind: saved,
   saving, unsaved, failed. Each face DERIVES its ground from the ratified Q-12 tone family
   — neutral for the two settled faces, --warn-tint for the edit not yet sent, --danger-tint
   for the failure — so there is no tone prop that could disagree with the state (the
   .stat-tile delta law). No token and no colour is minted here.
   EVERY FACE IS ONE --control-h-sm PILL AT ONE PADDING, and that is the SPEC-51 form, not a
   convenience: the chip rides the end of a chrome row while the state cycles under someone
   typing, so a face that changed the box would reflow that row on every keystroke. The mark
   SEAT is held the same way — saved / saving / unsaved each paint into one --dot-lg box, so
   the three settled faces are pixel-aligned and the failed face trades that seat for its
   retry target rather than adding one.
   THE MARKS ARE ::before GLYPHS AND BORDER GEOMETRY, never the specimen's inline <svg> (the
   .chip dismiss precedent): an svg and its path are two more boxes and the SPEC-42 alignment
   battery counts boxes. THE RETRY TARGET TAKES THE POINTER FLOOR the specimen's bare text
   button does not (SPEC-42, the .chip / .toast precedent), and the host is inline-flex where
   the specimen borrows the sheet's block-level .row utility — a status pill sits INSIDE a
   line of chrome, exactly as .badge and .chip do. Those are the deliberate divergences, and
   they are why every parity entry is reported-not-gated in SaveStateChip.sheetParity.ts. */
.save-state-chip{display:inline-flex;align-items:center;flex-wrap:nowrap;gap:var(--space-1);height:var(--control-h-sm);padding:0 var(--control-pad-x-sm);border-radius:var(--radius-pill);font-size:var(--fs-sm);white-space:nowrap}
.save-state-chip [data-role="glyph"]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--dot-lg);height:var(--dot-lg);line-height:1}
.save-state-chip[data-kind="saved"]{background:var(--neutral-tint);color:var(--on-neutral-tint)}
.save-state-chip[data-kind="saved"] [data-role="glyph"]::before{content:"\2713"}
.save-state-chip[data-kind="saving"]{background:var(--neutral-tint);color:var(--on-neutral-tint)}
.save-state-chip[data-kind="saving"] [data-role="glyph"]{border:var(--ring-w) solid var(--border-hover);border-top-color:var(--on-neutral-tint);border-radius:50%;animation:spin var(--dur-spinner) linear infinite}
.save-state-chip[data-kind="unsaved"]{background:var(--warn-tint);color:var(--on-warn-tint)}
/* the dirty dot keeps the --dot-lg SEAT and paints --dot-md inside it (the specimen's own
   two sizes), so the mark column does not jump between this face and the spinner. */
.save-state-chip[data-kind="unsaved"] [data-role="glyph"]{width:var(--dot-md);height:var(--dot-md);margin:calc((var(--dot-lg) - var(--dot-md)) / 2);border-radius:50%;background:var(--warn)}
.save-state-chip[data-kind="failed"]{background:var(--danger-tint);color:var(--on-danger-tint)}
.save-state-chip [data-role="retry"]{display:inline-flex;align-items:center;flex-shrink:0;min-inline-size:var(--pointer-min);min-block-size:var(--pointer-min);padding:0;border:none;background:none;color:inherit;font-family:inherit;font-size:inherit;font-weight:var(--weight-strong);text-decoration:underline;cursor:pointer}
.save-state-chip [data-role="retry"]:hover{text-decoration:none}
/* list-item — the #data LIST ITEM VARIANTS specimens (inventory row 38), transcribed.
   ONE anatomy in five faces, and the face is DERIVED from the zones the row carries,
   never from a kind prop a caller could set against its own content (the Stepper
   `stateOf` law): the BARE-LABEL row is the base rule, and a row carrying a supporting
   line, an avatar or a selection box takes the tighter block padding and the medium
   primary line the sheet gives exactly those specimens.
   THE ROW OWNS ITS OWN BOTTOM RULE. A run's trailing rule is the RUN's to suppress, and
   this control is one row that never knows whether it is the last — so it paints the
   separator it is responsible for and the container drops the last one. .list-run is that
   container's minimum and nothing more (the reset a real <ul> owes, the .stepper <ol>
   treatment): its hairline rhythm, its surface and its clipping are assembly altitude.
   SELECTED INK MOVES WITH THE WASH — the .nav-item[aria-current] / .table row law:
   --accent-tint is a chromatic ground and the contrast gate certifies exactly one
   foreground on it, so a selected row takes --on-accent-tint and its supporting line
   comes with it rather than keeping --text-3 on a ground nothing measured it against.
   Hover is the plain --surface-2 wash the specimen paints; selection outranks it on
   source order at equal specificity, so a selected row never washes out under the pointer.
   The pointer cursor rides the OPTION face ALONE: the sheet gives every row one, and a
   cursor promising an action a plain listitem does not answer is a defect, not a face. */
.list-run{margin:0;padding:0;list-style:none}
.list-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-3h);border-block-end:var(--bw) solid var(--hairline);font-size:var(--fs-label);color:var(--text)}
.list-item>*{flex-shrink:0}
.list-item:has([data-role="description"],[data-role="avatar"],[data-role="control"]){padding-block:var(--space-2)}
.list-item[role="option"]{cursor:pointer}
.list-item:hover{background:var(--surface-2)}
.list-item[data-selected]{background:var(--accent-tint);color:var(--on-accent-tint)}
/* the selection box takes the POINTER FLOOR the specimen's 14px input does not: the sheet
   floors its LABEL at --tile-sm and leaves the real target below it, which is the one
   thing in this specimen set to transcribe past rather than reproduce (the .checkbox /
   .chip precedent). No sibling import (SPEC-6) — the box is this row's own anatomy. */
.list-item [data-role="control"]{width:var(--tile-sm);height:var(--tile-sm);margin:0;cursor:pointer}
.list-item [data-role="avatar"]{display:flex;align-items:center;justify-content:center;width:var(--control-h-xs);height:var(--control-h-xs);border-radius:50%;background:var(--accent-tint);color:var(--on-accent-tint);font-size:var(--fs-sm);font-weight:var(--weight-strong)}
.list-item [data-role="body"]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}
.list-item:has([data-role="description"],[data-role="avatar"],[data-role="control"]) [data-role="label"]{font-weight:var(--weight-medium)}
.list-item [data-role="description"]{font-size:var(--fs-sm);color:var(--text-3)}
.list-item[data-selected] [data-role="description"]{color:var(--on-accent-tint)}
/* pending (SPEC-51) — the mark stays INLINE-BLOCK inside the zone it stands in for, so the
   zone's own type strut still sets the line box and the loading footprint IS the loaded one
   (the .stat-tile seat idiom). The avatar disc holds its seat with no initials in it. */
.list-item .skeleton{display:inline-block;vertical-align:middle}
/* ---- wave-4 recipe growth (2026-07-27, the Q-3 transcription wave: inventory rows 30 / 43 / 44). ---- */
/* kbd — the keyboard-hint run (inventory row 30), transcribed from the sheet's key chips.
   The outer native <kbd> is the shortcut and resets the UA mono face so notation stays in
   the UI face; each inner key restores --font-mono. The run owns its wrapping and one
   token gap, so a narrow habitat cannot make chord and sequence spacing disagree. */
.kbd{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--space-1);max-width:100%;min-width:0;font-family:var(--font-ui);font-size:var(--fs-sm);color:var(--text-2)}
.kbd [data-role="key"]{min-width:0;max-width:100%;padding:var(--space-half) var(--space-1h);background:var(--surface-2);border:var(--bw) solid var(--border);border-radius:var(--radius-xs);color:var(--text-2);font-family:var(--font-mono);font-size:var(--fs-eyebrow);overflow-wrap:anywhere}
.kbd [data-role="separator"]{flex-shrink:0;white-space:nowrap}
/* page-banner — the single persistent band above app chrome (inventory row 43). The band
   owns no width or position; its one inverse ground and every part use the certified
   --on-inverse partner. Optional targets take the pointer floor without changing their
   glyph or text, and the message is the only child allowed to shrink and wrap. */
.page-banner{display:flex;align-items:center;gap:var(--space-2h);min-width:0;padding:var(--space-2) var(--space-4);background:var(--inverse-bg);border-radius:var(--radius-control);color:var(--on-inverse);font-size:var(--fs-label);line-height:var(--type-label-lh)}
.page-banner [data-role="icon"]{flex-shrink:0;stroke:currentColor;stroke-width:var(--icon-stroke)}
.page-banner [data-role="message"]{flex:1 1 auto;min-width:0;overflow-wrap:anywhere}
.page-banner [data-role="link"]{display:inline-flex;align-items:center;justify-content:center;min-width:var(--pointer-min);min-height:var(--pointer-min);color:inherit;text-decoration:underline;vertical-align:middle}
.page-banner [data-role="link"]:hover{text-decoration:none}
.page-banner [data-role="dismiss"]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--pointer-min);height:var(--pointer-min);padding:0;border:none;background:none;border-radius:var(--radius-xs);color:inherit;font-family:inherit;cursor:pointer}
.page-banner [data-role="dismiss"] svg{display:block;stroke:currentColor;stroke-width:var(--icon-stroke-strong)}
/* validation-summary — the fixed danger panel (inventory row 44): one named heading over
   a reset list of real field anchors. The links take the pointer floor, long messages
   break rather than widening the form, and a pending mark stays inside the same type seat
   its loaded copy fills (SPEC-51). */
.validation-summary{display:block;min-width:0;padding:var(--space-3h) var(--space-4);background:var(--danger-tint);border:var(--bw) solid var(--danger-border);border-radius:var(--radius-control);color:var(--on-danger-tint)}
.validation-summary [data-role="title"]{margin:0 0 var(--space-2);font-size:var(--fs-label);line-height:var(--type-label-lh);font-weight:var(--weight-strong);color:var(--on-danger-tint);overflow-wrap:anywhere}
.validation-summary [data-role="list"]{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}
.validation-summary [data-role="list"]>li{min-width:0;margin:0}
.validation-summary [data-role="link"]{display:flex;align-items:center;min-width:var(--pointer-min);min-height:var(--pointer-min);color:var(--on-danger-tint);font-size:var(--fs-label);line-height:var(--type-label-lh);text-decoration:underline;overflow-wrap:anywhere}
.validation-summary [data-role="link"]:hover{text-decoration:none}
.validation-summary .skeleton{display:inline-block;vertical-align:middle}
/* ---- wave-5 recipe growth (2026-07-27, the Q-3 transcription wave: inventory row 27). ---- */
/* breadcrumbs — the ancestor path (inventory row 27), transcribed from the §navigation
   "Breadcrumbs — collapsed middle" specimen. ONE gap word does the whole rhythm: the trail owns
   the distance between steps and each step owns the same distance to its own chevron, so a step
   carrying notation and a step without it read identically. Nothing here is physical — no
   left/right and no inline-start/end — so the path reverses whole under dir=rtl and only the
   chevron GLYPH, which the sheet's own caption calls physical, is mirrored. Levels and the
   ellipsis chip take the SPEC-42 pointer floor the specimen's bare text does not (the
   .validation-summary anchor precedent); the current page is not a target and takes none. */
.breadcrumbs{display:block;min-width:0;font-size:var(--fs);color:var(--text-2)}
.breadcrumbs [data-role="trail"]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-1h);min-width:0;margin:0;padding:0;list-style:none}
.breadcrumbs [data-role="trail"]>li{display:flex;align-items:center;gap:var(--space-1h);min-width:0}
.breadcrumbs [data-role="separator"]{flex-shrink:0;stroke:var(--text-disabled);stroke-width:var(--icon-stroke-strong)}
/* the one physical thing in the run: a chevron points, so it flips where the reading does */
.breadcrumbs [data-role="separator"]:dir(rtl){transform:scaleX(-1)}
.breadcrumbs [data-role="link"]{display:inline-flex;align-items:center;min-width:var(--pointer-min);min-height:var(--pointer-min);color:var(--text-2);text-decoration:none;overflow-wrap:anywhere}
.breadcrumbs [data-role="link"]:hover{color:var(--accent);text-decoration:underline}
.breadcrumbs [data-role="expand"]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;min-width:var(--pointer-min);min-height:var(--pointer-min);padding:0 var(--space-2);border:none;border-radius:var(--radius-control);background:var(--neutral-tint);color:var(--text-2);font-family:inherit;font-size:var(--fs);cursor:pointer}
.breadcrumbs [data-role="expand"]:hover{background:var(--inset)}
.breadcrumbs [data-role="current"]{min-width:0;color:var(--text);font-weight:var(--weight-strong);overflow-wrap:anywhere}
/* ---- wave-6 recipe growth (2026-07-27, the Q-3 transcription wave: inventory row 55). ---- */
/* disclosure — one section that opens (inventory row 55), transcribed from the §overlays
   "Accordion" specimen. The heading wrapper resets the UA heading voice: role="heading"
   carries the semantics and the trigger inside owns the type, so the stack and inline
   faces paint identically (the host axis is semantic and mints no rule of its own). The
   trigger takes the SPEC-42 pointer floor the specimen's bare text does not and fills its
   habitat, so the whole header row is the target. The ONE moving part is the mark, on the
   shared ramp; the PANEL never animates, because 0 -> auto needs a measurement. */
.disclosure{display:block;min-width:0;font-size:var(--fs);color:var(--text)}
.disclosure [data-role="heading"]{display:block;min-width:0;margin:0;font:inherit}
.disclosure [data-role="trigger"]{display:flex;align-items:center;gap:var(--space-2);width:100%;min-width:0;min-height:var(--pointer-min);padding:var(--space-1h) var(--space-2);border:none;border-radius:var(--radius-control);background:none;color:var(--text);font-family:inherit;font-size:var(--fs-label);font-weight:var(--weight-medium);line-height:var(--type-label-lh);text-align:start;overflow-wrap:anywhere;cursor:pointer}
.disclosure [data-role="trigger"]:hover{background:var(--surface-3)}
.disclosure [data-role="indicator"]{flex-shrink:0;margin-inline-start:auto;stroke:var(--text-3);stroke-width:var(--icon-stroke-strong);transition:transform var(--dur-1) var(--ease-standard)}
/* the mark turns; nothing else moves, and reduced motion leaves it wherever the state put it */
.disclosure [aria-expanded="true"] [data-role="indicator"]{transform:rotate(180deg)}
.disclosure [data-role="panel"]{min-width:0;padding:var(--space-1) var(--space-2) var(--space-3);color:var(--text-2);font-size:var(--fs-label);line-height:var(--type-label-lh);overflow-wrap:anywhere}
/* the closed panel is hidden off the TRIGGER's own aria-expanded rather than off a second
   attribute on the panel: one declaration decides both what a reader is told and what a
   reader is shown, so the box and the announcement cannot disagree. display:none (not
   visibility) because a 0x0 interactive box is a SPEC-42 hit-size defect. */
.disclosure:not(:has([data-role="trigger"][aria-expanded="true"])) [data-role="panel"]{display:none}
/* calendar — the §5 grid; FIXED 6x7 frame */
/* range field: ONE boundary around both ends — a range is a single value */
.range-field{display:flex;align-items:center;height:var(--control-h);border:var(--bw) solid var(--border-strong);border-radius:var(--radius-control);background:var(--surface-ground);font-size:var(--fs);transition:border-color var(--dur-1) var(--ease-standard),box-shadow var(--dur-1) var(--ease-standard)}
.range-field:hover{border-color:var(--border-hover)}
/* the boundary is the GROUP's; an inner input paints none and rings nothing */
.range-field input{flex:1 1 0;min-width:0;height:100%;padding:0 var(--space-3);border:none;background:none;color:var(--text);font:inherit;font-variant-numeric:tabular-nums;outline:none;box-shadow:none}
.range-field:focus-within{border-color:var(--accent);box-shadow:var(--ring)}
.range-field [data-role="separator"]{flex:0 0 auto;color:var(--text-3)}
.range-field [data-role="trigger"]{flex:0 0 auto;margin-inline-end:var(--space-half)}
[data-invalid] .range-field{border-color:var(--danger)}
[data-invalid] .range-field:focus-within{box-shadow:var(--ring-danger)}
.range-field input:disabled{cursor:not-allowed}
/* field affix: a real TRIGGER, so the input reserves its width */
.calendar-field{position:relative;display:block}
.calendar-field .field{padding-inline-end:var(--control-h-sm);font-variant-numeric:tabular-nums}
.calendar-field [data-role="trigger"]{position:absolute;inset-inline-end:var(--space-half);top:50%;transform:translateY(-50%)}
.calendar-field [data-role="glyph"],.calendar [data-role="glyph"]{stroke:currentColor;stroke-width:var(--icon-stroke)}
.calendar [data-role="chevron"]{stroke:currentColor;stroke-width:var(--icon-stroke-strong)}
/* columns take the POINTER FLOOR as track minimum */
.calendar{--cal-cols:repeat(7,minmax(var(--pointer-min),1fr));display:flex;flex-direction:column;gap:var(--space-2);font-size:var(--fs-label);color:var(--text)}
.calendar[data-week-numbers]{--cal-cols:var(--space-6) repeat(7,minmax(var(--pointer-min),1fr))}
.calendar [data-role="header"]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-1);margin-bottom:var(--space-2)}
.calendar [data-role="title"]{flex:1 1 auto;text-align:center;font-size:var(--fs-label);font-weight:var(--weight-strong);color:var(--text);white-space:nowrap}
.calendar [data-role="weekhead"]{display:grid;grid-template-columns:var(--cal-cols);gap:1px;margin-bottom:var(--space-half)}
.calendar [data-role="weekhead"] span{text-align:center;font-size:var(--fs-eyebrow);font-weight:var(--weight-strong);color:var(--text-3);padding:var(--space-1) 0}
.calendar [data-role="grid"]{display:grid;gap:1px}
.calendar [data-role="row"]{display:grid;grid-template-columns:var(--cal-cols);gap:1px}
.calendar [data-role="weeknum"]{display:flex;align-items:center;justify-content:center;font-family:var(--font-mono);font-size:var(--type-micro-size);color:var(--text-3)}
.calendar-day{display:flex;align-items:center;justify-content:center;min-height:var(--pointer-min);height:var(--control-h-sm);border:none;padding:0;border-radius:var(--radius-control);background:transparent;color:var(--text);font-family:inherit;font-size:var(--fs-label);font-weight:var(--weight-regular);font-variant-numeric:tabular-nums;cursor:pointer;transition:background var(--dur-1) var(--ease-standard),color var(--dur-1) var(--ease-standard)}
.calendar-day:hover{background:var(--inset)}
/* borrowed days hide via visibility, keeping the frame */
.calendar-day[data-adjacent]{color:var(--text-3)}
.calendar[data-hide-adjacent] .calendar-day[data-adjacent]{visibility:hidden;pointer-events:none}
/* today is a RING; one date can be both today and selected */
.calendar-day[data-today]{box-shadow:inset 0 0 0 var(--bw) var(--accent);color:var(--on-accent-tint);font-weight:var(--weight-strong)}
/* range band: ONE attribute, so a cell subscribes once */
.calendar-day[data-band]{background:var(--accent-tint);color:var(--on-accent-tint);border-radius:0}
.calendar-day[data-band="start"]{border-start-start-radius:var(--radius-control);border-end-start-radius:var(--radius-control)}
.calendar-day[data-band="end"]{border-start-end-radius:var(--radius-control);border-end-end-radius:var(--radius-control)}
.calendar-day[data-band="solo"]{border-radius:var(--radius-control)}
/* selection wins every other voice, including today's ring */
.calendar-day[data-selected]{background:var(--accent);color:var(--on-accent);font-weight:var(--weight-strong);box-shadow:none;border-radius:var(--radius-control)}
.calendar-day[data-selected]:hover{background:var(--accent-hover)}
/* unavailable stays reachable; refused at activation */
.calendar-day[aria-disabled="true"]{color:var(--text-disabled);box-shadow:none;cursor:not-allowed}
.calendar-day[aria-disabled="true"]:hover{background:none}
/* focus stays on the grid, so the active cell paints off data-active */
.calendar [data-role="grid"]:focus-visible{outline:none}
.calendar [data-role="grid"]:focus-visible .calendar-day[data-active]{outline:2px solid var(--accent);outline-offset:1px}
/* ---- icon (2026-08-01, the named glyph register's renderer: inventory Icon). ---- */
/* icon — ink from context (currentColor), stroke weight is BRAND STYLE VOICE (--icon-stroke),
   size rides the --icon-* ladder with --icon-md as the unmarked base. Solid brand
   marks flip data-ink; the rare source-filled accent dot rides data-filled. */
.icon{display:inline-block;flex-shrink:0;width:var(--icon-md);height:var(--icon-md);stroke:currentColor;fill:none;stroke-width:var(--icon-stroke);stroke-linecap:round;stroke-linejoin:round}
.icon[data-size="xs"]{width:var(--icon-xs);height:var(--icon-xs)}
.icon[data-size="sm"]{width:var(--icon-sm);height:var(--icon-sm)}
.icon[data-size="lg"]{width:var(--icon-lg);height:var(--icon-lg)}
.icon[data-ink="fill"]{fill:currentColor;stroke:none}
.icon [data-filled]{fill:currentColor}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
@keyframes indet{0%{inset-inline-start:-40%}100%{inset-inline-start:110%}}
/* ambient programs — opacity floor 0.85 keeps a pulsing layer clear of the disabled
   band; drift geometry mirrors shimmer's oversized-ground travel, but DIAGONAL:
   the register's own gradients run vertical (--accent-grad 180deg) while shimmer's
   runs horizontal, and a one-axis drift over a perpendicular gradient is inert. */
@keyframes fk-ambient-pulse{50%{opacity:0.85}}
@keyframes fk-ambient-drift{from{background-position:0% 0%}to{background-position:100% 100%}}

/* ============ LAYER: BAND REGISTERS — Q-11 full-table re-anchoring per [data-scheme] band ============ */
/* band alt/neu-light */
[data-scheme="alt"]{
  --bg:#f4f5f7;
  --inset:#eceff3;
  --surface:#ffffff;
  --surface-2:#fdfefe;
  --surface-3:#f5f7f9;
  --surface-raised:#ffffff;
  --knob:#ffffff;
  --scrim:rgba(16,24,40,0.45);
  --hairline:rgba(26,33,43,0.14);
  --border:#e1e6eb;
  --border-strong:#cad1d9;
  --border-hover:#9ea9b6;
  --text:#1a212b;
  --text-2:#4a5461;
  --text-3:#666f7d;
  --text-quiet:#8b95a3;
  --text-disabled:#9aa3b0;
  --inverse-bg:#1a212b;
  --on-inverse:#ffffff;
  --accent:#2f6fed;
  --on-accent:#ffffff;
  --accent-hover:#2159cc;
  --accent-active:#1c4dad;
  --accent-grad-deep:#2f6fed;
  --accent-tint:#eef4ff;
  --on-accent-tint:#1e4fb8;
  --accent-border:#dbe7fb;
  --selection-bg:#bed3fc;
  --on-selection:#1a212b;
  --link-color:#2867e5;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#5c6672;
  --danger:#d13c3c;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#ffffff;
  --danger-border:#f0c1c1;
  --ok:#1a7f4e;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --ok-border:#c4e4d2;
  --warn:#b0761f;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --warn-border:#f0dcb2;
  --info:#2159cc;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --info-border:#cddcfa;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --chart-1:#5b83d6;
  --chart-1-tint:#c9dbfc;
  --chart-2:#4aa06e;
  --chart-3:#b0761f;
  --chart-4:#8a6dbf;
  --chart-5:#c0705e;
  --chart-6:#7e8a9a;
  --chart-grid:#f2f5f8;
  --chart-axis:#5f6b7c;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#dee4ef;
  --state-edge:#8e9297;
  --state-selected-edge:#2f6fed;
  --seg-thumb-fill:#ffffff;
  --seg-thumb-edge:#868b90;
  --seg-thumb-ink:#1a212b;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band alt/neu-dark */
[data-mode="dark"] [data-scheme="alt"]{
  --bg:#1a2029;
  --inset:#1a2029;
  --surface:#1e2732;
  --surface-2:#1c232d;
  --surface-3:#293345;
  --surface-raised:#313e4f;
  --knob:#ffffff;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(242,244,247,0.14);
  --border:#2f3b4c;
  --border-strong:#3e4d63;
  --border-hover:#4d5d74;
  --text:#f2f4f7;
  --text-2:#bac4d0;
  --text-3:#b9c4d3;
  --text-quiet:#5f6977;
  --text-disabled:#595d64;
  --inverse-bg:#e4eaf3;
  --on-inverse:#0a1017;
  --accent:#2f6fed;
  --on-accent:#ffffff;
  --accent-hover:#2159cc;
  --accent-active:#6598f8;
  --accent-grad-deep:#2f6fed;
  --accent-tint:#27364f;
  --on-accent-tint:#87affa;
  --accent-border:#001344;
  --selection-bg:#374c71;
  --on-selection:#f2f4f7;
  --link-color:#9abcfc;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#b9c4d3;
  --danger:#e05252;
  --danger-hover:#e86a6a;
  --danger-tint:rgba(224,82,82,0.14);
  --on-danger-tint:#f09a9a;
  --on-danger:#0a1017;
  --danger-border:#5a2a2a;
  --ok:#46a97a;
  --ok-tint:rgba(60,160,110,0.16);
  --on-ok-tint:#7cd0a2;
  --ok-border:#1e4534;
  --warn:#e0a33e;
  --warn-tint:rgba(220,150,50,0.14);
  --on-warn-tint:#eec27f;
  --warn-border:#4a3a1e;
  --info:#6f9ff0;
  --info-tint:rgba(90,130,220,0.16);
  --on-info-tint:#9cc0ff;
  --info-border:#253652;
  --neutral-tint:#1c2531;
  --on-neutral-tint:#a9b5c5;
  --chart-1:#7b9fe8;
  --chart-1-tint:#17243d;
  --chart-2:#5cb98a;
  --chart-3:#d9a24a;
  --chart-4:#a98ee0;
  --chart-5:#d08770;
  --chart-6:#5f6f85;
  --chart-grid:#27313f;
  --chart-axis:#919daf;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#27364f;
  --state-edge:#637083;
  --state-selected-edge:#2f6fed;
  --seg-thumb-fill:#464e5a;
  --seg-thumb-edge:#707e91;
  --seg-thumb-ink:#f2f4f7;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band alt/atw-derived */
[data-brand-style="atw"] [data-scheme="alt"]{
  --bg:#ececf3;
  --inset:#e4e4ed;
  --surface:#dfdee9;
  --surface-2:#dcdbe7;
  --surface-3:#d4d3e0;
  --surface-raised:#e2e1f0;
  --knob:#181515;
  --scrim:rgba(252,252,252,0.6);
  --hairline:rgba(15,14,11,0.14);
  --border:#c9c9d6;
  --border-strong:#a09dae;
  --border-hover:#807c8d;
  --text:#0f0e0b;
  --text-2:#2b292f;
  --text-3:#525057;
  --text-quiet:#74747f;
  --text-disabled:#83828d;
  --inverse-bg:#211f1c;
  --on-inverse:#f9fafe;
  --accent:#bf0b11;
  --on-accent:#f6f6fb;
  --accent-hover:#a2000d;
  --accent-active:#af1714;
  --accent-grad-deep:#bf0b11;
  --accent-tint:#f0cdc7;
  --on-accent-tint:#9b1d19;
  --accent-border:#523437;
  --selection-bg:#e3a7a9;
  --on-selection:#0f0e0b;
  --link-color:#840212;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#bf0b11;
  --danger:#e4403d;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#0f1013;
  --danger-border:#794a4c;
  --ok:#099158;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --ok-border:#406c55;
  --warn:#aa7105;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --warn-border:#6e5d3b;
  --info:#4f6beb;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --info-border:#4e5b89;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --chart-1:#4f6beb;
  --chart-1-tint:#4e5b89;
  --chart-2:#1f9a61;
  --chart-3:#bb7e12;
  --chart-4:#886bbc;
  --chart-5:#e05e59;
  --chart-6:#4d4c53;
  --chart-grid:#d4d3e0;
  --chart-axis:#38383e;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#f0cdc7;
  --state-edge:#7b7b87;
  --state-selected-edge:#bf0b11;
  --seg-thumb-fill:#f4f3fd;
  --seg-thumb-edge:#747480;
  --seg-thumb-ink:#0f0e0b;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band alt/atw-native */
[data-mode="dark"][data-brand-style="atw"] [data-scheme="alt"]{
  --bg:#101015;
  --inset:#15151B;
  --surface:#191921;
  --surface-2:#1b1b24;
  --surface-3:#22222b;
  --surface-raised:#31313c;
  --knob:#fbf9f7;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(242,240,235,0.14);
  --border:#2a2a34;
  --border-strong:#52505e;
  --border-hover:#727080;
  --text:#F2F0EB;
  --text-2:#C9C7CE;
  --text-3:#b6b4bc;
  --text-quiet:#5E5C67;
  --text-disabled:#5B5963;
  --inverse-bg:#F2F0EB;
  --on-inverse:#0A0A0D;
  --accent:#E8362F;
  --on-accent:#0A0A0D;
  --accent-hover:#FF4D45;
  --accent-active:#C92A24;
  --accent-grad-deep:#E8362F;
  --accent-tint:#311a16;
  --on-accent-tint:#FF7A73;
  --accent-border:#3A181B;
  --selection-bg:#522327;
  --on-selection:#F2F0EB;
  --link-color:#fc978f;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#fd9d90;
  --danger:#FF5C55;
  --danger-hover:#FF7A73;
  --danger-tint:#2A1215;
  --on-danger-tint:#FF8A80;
  --on-danger:#0A0A0D;
  --danger-border:#4A2023;
  --ok:#2FA46B;
  --ok-tint:#1A3527;
  --on-ok-tint:#7FD8A8;
  --ok-border:#1E4A34;
  --warn:#D9931A;
  --warn-tint:#2E2410;
  --on-warn-tint:#E8B45A;
  --warn-border:#4A3A18;
  --info:#4D68E8;
  --info-tint:#161B33;
  --on-info-tint:#A9B8FF;
  --info-border:#2A3560;
  --neutral-tint:#23232B;
  --on-neutral-tint:#C9C7CE;
  --chart-1:#4D68E8;
  --chart-1-tint:#2a3560;
  --chart-2:#2FA46B;
  --chart-3:#D9931A;
  --chart-4:#8a6dbf;
  --chart-5:#FF7A73;
  --chart-6:#9F9DA6;
  --chart-grid:#22222b;
  --chart-axis:#9F9DA6;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#311a16;
  --state-edge:#676772;
  --state-selected-edge:#E8362F;
  --seg-thumb-fill:#404048;
  --seg-thumb-edge:#71717d;
  --seg-thumb-ink:#F2F0EB;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band tint/neu-light */
[data-scheme="tint"]{
  --bg:#e9f0fe;
  --inset:#dbe7fb;
  --surface:#fdfeff;
  --surface-2:#f5f9ff;
  --surface-3:#ebf2ff;
  --surface-raised:#fdfeff;
  --knob:#fdfeff;
  --scrim:rgba(16,24,40,0.45);
  --hairline:#c9dcfa;
  --border:#d6e1f2;
  --border-strong:#bfcce0;
  --border-hover:#93a4bc;
  --text:#1a212b;
  --text-2:#4a5461;
  --text-3:#5c6875;
  --text-quiet:#8b95a3;
  --text-disabled:#9aa3b0;
  --inverse-bg:#1a212b;
  --on-inverse:#ffffff;
  --accent:#2f6fed;
  --on-accent:#ffffff;
  --accent-hover:#2159cc;
  --accent-active:#1c4dad;
  --accent-grad-deep:#2f6fed;
  --accent-tint:#e6efff;
  --on-accent-tint:#1e4fb8;
  --accent-border:#dbe7fb;
  --selection-bg:#b6cefd;
  --on-selection:#1a212b;
  --link-color:#2159cc;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#5c6672;
  --danger:#d13c3c;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#ffffff;
  --danger-border:#f0c1c1;
  --ok:#1a7f4e;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --ok-border:#c4e4d2;
  --warn:#b0761f;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --warn-border:#f0dcb2;
  --info:#2159cc;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --info-border:#cddcfa;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --chart-1:#5b83d6;
  --chart-1-tint:#c9dbfc;
  --chart-2:#4aa06e;
  --chart-3:#b0761f;
  --chart-4:#8a6dbf;
  --chart-5:#c0705e;
  --chart-6:#7e8a9a;
  --chart-grid:#e7f0ff;
  --chart-axis:#5f6b7c;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#d6dfef;
  --state-edge:#8791a1;
  --state-selected-edge:#2f6fed;
  --seg-thumb-fill:#fdfeff;
  --seg-thumb-edge:#808a9a;
  --seg-thumb-ink:#1a212b;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band tint/neu-dark */
[data-mode="dark"] [data-scheme="tint"]{
  --bg:#17243d;
  --inset:#1c2b47;
  --surface:#1b2b46;
  --surface-2:#192742;
  --surface-3:#26385a;
  --surface-raised:#2d4265;
  --knob:#ffffff;
  --scrim:rgba(0,0,0,0.6);
  --hairline:#253652;
  --border:#2b3f62;
  --border-strong:#3a517a;
  --border-hover:#4a628b;
  --text:#f2f4f7;
  --text-2:#bfc9d5;
  --text-3:#bec9d8;
  --text-quiet:#5f6977;
  --text-disabled:#595d64;
  --inverse-bg:#e4eaf3;
  --on-inverse:#0a1017;
  --accent:#2f6fed;
  --on-accent:#ffffff;
  --accent-hover:#2159cc;
  --accent-active:#6598f8;
  --accent-grad-deep:#2f6fed;
  --accent-tint:#223a65;
  --on-accent-tint:#87affa;
  --accent-border:#001344;
  --selection-bg:#335088;
  --on-selection:#f2f4f7;
  --link-color:#a1c1fd;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#b8c9e1;
  --danger:#e05252;
  --danger-hover:#e86a6a;
  --danger-tint:rgba(224,82,82,0.14);
  --on-danger-tint:#f09a9a;
  --on-danger:#0a1017;
  --danger-border:#5a2a2a;
  --ok:#46a97a;
  --ok-tint:rgba(60,160,110,0.16);
  --on-ok-tint:#7cd0a2;
  --ok-border:#1e4534;
  --warn:#e0a33e;
  --warn-tint:rgba(220,150,50,0.14);
  --on-warn-tint:#eec27f;
  --warn-border:#4a3a1e;
  --info:#6f9ff0;
  --info-tint:rgba(90,130,220,0.16);
  --on-info-tint:#9cc0ff;
  --info-border:#253652;
  --neutral-tint:#1c2531;
  --on-neutral-tint:#a9b5c5;
  --chart-1:#7b9fe8;
  --chart-1-tint:#17243d;
  --chart-2:#5cb98a;
  --chart-3:#d9a24a;
  --chart-4:#a98ee0;
  --chart-5:#d08770;
  --chart-6:#5f6f85;
  --chart-grid:#243555;
  --chart-axis:#919daf;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#223a65;
  --state-edge:#5f759c;
  --state-selected-edge:#2f6fed;
  --seg-thumb-fill:#42526e;
  --seg-thumb-edge:#6c83ab;
  --seg-thumb-ink:#f2f4f7;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band tint/atw-derived */
[data-brand-style="atw"] [data-scheme="tint"]{
  --bg:#f8d4d7;
  --inset:#f2c3c5;
  --surface:#ebc6cd;
  --surface-2:#e8c3cb;
  --surface-3:#e0bcc5;
  --surface-raised:#eec9d4;
  --knob:#1c0403;
  --scrim:rgba(252,252,252,0.6);
  --hairline:#e9b3b4;
  --border:#d5b2bb;
  --border-strong:#aa8794;
  --border-hover:#8a6774;
  --text:#0f0e0b;
  --text-2:#2b292f;
  --text-3:#525057;
  --text-quiet:#74747f;
  --text-disabled:#83828d;
  --inverse-bg:#211f1c;
  --on-inverse:#f9fafe;
  --accent:#bf0b11;
  --on-accent:#f6f6fb;
  --accent-hover:#a2000d;
  --accent-active:#af1714;
  --accent-grad-deep:#bf0b11;
  --accent-tint:#f9b5ab;
  --on-accent-tint:#9b1d19;
  --accent-border:#523437;
  --selection-bg:#e98d8e;
  --on-selection:#0f0e0b;
  --link-color:#840212;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#840212;
  --danger:#d32f30;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#f3f5f9;
  --danger-border:#794a4c;
  --ok:#00824d;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --ok-border:#406c55;
  --warn:#9f6905;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --warn-border:#6e5d3b;
  --info:#4b66e6;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --info-border:#4e5b89;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --chart-1:#4f6beb;
  --chart-1-tint:#4e5b89;
  --chart-2:#1f9a61;
  --chart-3:#bb7e12;
  --chart-4:#886bbc;
  --chart-5:#e05e59;
  --chart-6:#4d4c53;
  --chart-grid:#e0bcc5;
  --chart-axis:#38383e;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#f5b1a7;
  --state-edge:#86666f;
  --state-selected-edge:#bf0b11;
  --seg-thumb-fill:#fedce2;
  --seg-thumb-edge:#82636b;
  --seg-thumb-ink:#0f0e0b;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band tint/atw-native */
[data-mode="dark"][data-brand-style="atw"] [data-scheme="tint"]{
  --bg:#2A1215;
  --inset:#3A181B;
  --surface:#351c21;
  --surface-2:#371e24;
  --surface-3:#3e242b;
  --surface-raised:#50343d;
  --knob:#ffffff;
  --scrim:rgba(0,0,0,0.6);
  --hairline:#4A2023;
  --border:#482d35;
  --border-strong:#73535f;
  --border-hover:#967480;
  --text:#F2F0EB;
  --text-2:#C9C7CE;
  --text-3:#bbb9c1;
  --text-quiet:#5E5C67;
  --text-disabled:#5B5963;
  --inverse-bg:#F2F0EB;
  --on-inverse:#0A0A0D;
  --accent:#E8362F;
  --on-accent:#0A0A0D;
  --accent-hover:#FF4D45;
  --accent-active:#C92A24;
  --accent-grad-deep:#E8362F;
  --accent-tint:#4c1813;
  --on-accent-tint:#FF7A73;
  --accent-border:#3A181B;
  --selection-bg:#6e2025;
  --on-selection:#F2F0EB;
  --link-color:#fd9e96;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#fea59e;
  --danger:#FF5C55;
  --danger-hover:#FF7A73;
  --danger-tint:#2A1215;
  --on-danger-tint:#FF8A80;
  --on-danger:#0A0A0D;
  --danger-border:#4A2023;
  --ok:#2FA46B;
  --ok-tint:#1A3527;
  --on-ok-tint:#7FD8A8;
  --ok-border:#1E4A34;
  --warn:#D9931A;
  --warn-tint:#2E2410;
  --on-warn-tint:#E8B45A;
  --warn-border:#4A3A18;
  --info:#4D68E8;
  --info-tint:#161B33;
  --on-info-tint:#A9B8FF;
  --info-border:#2A3560;
  --neutral-tint:#23232B;
  --on-neutral-tint:#C9C7CE;
  --chart-1:#4D68E8;
  --chart-1-tint:#2a3560;
  --chart-2:#2FA46B;
  --chart-3:#D9931A;
  --chart-4:#8a6dbf;
  --chart-5:#FF7A73;
  --chart-6:#9F9DA6;
  --chart-grid:#3e242b;
  --chart-axis:#9F9DA6;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#4c1813;
  --state-edge:#866770;
  --state-selected-edge:#E8362F;
  --seg-thumb-fill:#5c4347;
  --seg-thumb-edge:#91727a;
  --seg-thumb-ink:#F2F0EB;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band inverse/neu-light */
[data-scheme="inverse"]{
  --bg:#161c26;
  --inset:#1f2836;
  --surface:#1a222f;
  --surface-2:#181f2a;
  --surface-3:#252f42;
  --surface-raised:#2c3a4c;
  --knob:#fafcff;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(255,255,255,0.18);
  --border:#2a3649;
  --border-strong:#394860;
  --border-hover:#495970;
  --text:#f2f4f7;
  --text-2:#b5bfcb;
  --text-3:#b4bfce;
  --text-quiet:#5f6977;
  --text-disabled:#595d64;
  --inverse-bg:#e4eaf3;
  --on-inverse:#0a1017;
  --accent:#e4eaf3;
  --on-accent:#161c26;
  --accent-hover:#ffffff;
  --accent-active:#ffffff;
  --accent-grad-deep:#e4eaf3;
  --accent-tint:#20324c;
  --on-accent-tint:#80b1f9;
  --accent-border:#937433;
  --selection-bg:#32476d;
  --on-selection:#f2f4f7;
  --link-color:#98baff;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#a0bffe;
  --danger:#e05252;
  --danger-hover:#e86a6a;
  --danger-tint:rgba(224,82,82,0.14);
  --on-danger-tint:#f09a9a;
  --on-danger:#0a1017;
  --danger-border:#5a2a2a;
  --ok:#46a97a;
  --ok-tint:rgba(60,160,110,0.16);
  --on-ok-tint:#7cd0a2;
  --ok-border:#1e4534;
  --warn:#e0a33e;
  --warn-tint:rgba(220,150,50,0.14);
  --on-warn-tint:#eec27f;
  --warn-border:#4a3a1e;
  --info:#6f9ff0;
  --info-tint:rgba(90,130,220,0.16);
  --on-info-tint:#9cc0ff;
  --info-border:#253652;
  --neutral-tint:#1c2531;
  --on-neutral-tint:#a9b5c5;
  --chart-1:#7b9fe8;
  --chart-1-tint:#17243d;
  --chart-2:#5cb98a;
  --chart-3:#d9a24a;
  --chart-4:#a98ee0;
  --chart-5:#d08770;
  --chart-6:#5f6f85;
  --chart-grid:#232d3c;
  --chart-axis:#919daf;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#20324c;
  --state-edge:#606e83;
  --state-selected-edge:#e4eaf3;
  --seg-thumb-fill:#414a57;
  --seg-thumb-edge:#6b788e;
  --seg-thumb-ink:#f2f4f7;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band inverse/neu-dark */
[data-mode="dark"] [data-scheme="inverse"]{
  --bg:#e4eaf3;
  --inset:#d6dde9;
  --surface:#f3f8fe;
  --surface-2:#edf3fa;
  --surface-3:#e5ecf5;
  --surface-raised:#f3f8fe;
  --knob:#f3f8fe;
  --scrim:rgba(16,24,40,0.45);
  --hairline:rgba(10,16,23,0.18);
  --border:#d1dbe7;
  --border-strong:#bac6d5;
  --border-hover:#8f9eb2;
  --text:#0a1017;
  --text-2:#2b3648;
  --text-3:#3d4c63;
  --text-quiet:#767f89;
  --text-disabled:#848c96;
  --inverse-bg:#1a212b;
  --on-inverse:#ffffff;
  --accent:#0a1017;
  --on-accent:#e4eaf3;
  --accent-hover:#1b2735;
  --accent-active:#010000;
  --accent-grad-deep:#0a1017;
  --accent-tint:#dae9fc;
  --on-accent-tint:#00427f;
  --accent-border:#876200;
  --selection-bg:#aec8f7;
  --on-selection:#0a1017;
  --link-color:#2159cc;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#3d4c63;
  --danger:#d13c3c;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#ffffff;
  --danger-border:#f0c1c1;
  --ok:#1a7f4e;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --ok-border:#c4e4d2;
  --warn:#b0761f;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --warn-border:#f0dcb2;
  --info:#2159cc;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --info-border:#cddcfa;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --chart-1:#5b83d6;
  --chart-1-tint:#c9dbfc;
  --chart-2:#4aa06e;
  --chart-3:#b0761f;
  --chart-4:#8a6dbf;
  --chart-5:#c0705e;
  --chart-6:#7e8a9a;
  --chart-grid:#e2eaf4;
  --chart-axis:#4b5664;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#cad9ec;
  --state-edge:#838c97;
  --state-selected-edge:#0a1017;
  --seg-thumb-fill:#fcfdff;
  --seg-thumb-edge:#7b858f;
  --seg-thumb-ink:#0a1017;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band inverse/atw-derived */
[data-brand-style="atw"] [data-scheme="inverse"]{
  --bg:#0f0e0b;
  --inset:#1a1710;
  --surface:#181716;
  --surface-2:#1a1919;
  --surface-3:#202020;
  --surface-raised:#302f31;
  --knob:#faf6e8;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(246,246,251,0.16);
  --border:#292829;
  --border-strong:#504d52;
  --border-hover:#716e73;
  --text:#f6f6fb;
  --text-2:#b2b0bf;
  --text-3:#b5b3bd;
  --text-quiet:#616174;
  --text-disabled:#5e5e70;
  --inverse-bg:#F2F0EB;
  --on-inverse:#0A0A0D;
  --accent:#ca1f1d;
  --on-accent:#f6f6fb;
  --accent-hover:#a2000d;
  --accent-active:#a10004;
  --accent-grad-deep:#ca1f1d;
  --accent-tint:#301612;
  --on-accent-tint:#fd887a;
  --accent-border:#1c0508;
  --selection-bg:#50201a;
  --on-selection:#f6f6fb;
  --link-color:#fb9386;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#fb9b8f;
  --danger:#FF5C55;
  --danger-hover:#FF7A73;
  --danger-tint:#2A1215;
  --on-danger-tint:#FF8A80;
  --on-danger:#0A0A0D;
  --danger-border:#4A2023;
  --ok:#2FA46B;
  --ok-tint:#1A3527;
  --on-ok-tint:#7FD8A8;
  --ok-border:#1E4A34;
  --warn:#D9931A;
  --warn-tint:#2E2410;
  --on-warn-tint:#E8B45A;
  --warn-border:#4A3A18;
  --info:#4D68E8;
  --info-tint:#161B33;
  --on-info-tint:#A9B8FF;
  --info-border:#2A3560;
  --neutral-tint:#23232B;
  --on-neutral-tint:#C9C7CE;
  --chart-1:#4D68E8;
  --chart-1-tint:#2a3560;
  --chart-2:#2FA46B;
  --chart-3:#D9931A;
  --chart-4:#8a6dbf;
  --chart-5:#FF7A73;
  --chart-6:#9F9DA6;
  --chart-grid:#202020;
  --chart-axis:#a3a2b5;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#331915;
  --state-edge:#696869;
  --state-selected-edge:#ca1f1d;
  --seg-thumb-fill:#3f3e3e;
  --seg-thumb-edge:#706f70;
  --seg-thumb-ink:#f6f6fb;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band inverse/atw-native */
[data-mode="dark"][data-brand-style="atw"] [data-scheme="inverse"]{
  --bg:#F2F0EB;
  --inset:#E6E2D7;
  --surface:#ece9e8;
  --surface-2:#e2dfdf;
  --surface-3:#dad7d8;
  --surface-raised:#e8e5e8;
  --knob:#1c180e;
  --scrim:rgba(252,252,252,0.6);
  --hairline:rgba(10,10,13,0.16);
  --border:#cfcdcf;
  --border-strong:#a5a1a6;
  --border-hover:#868086;
  --text:#0A0A0D;
  --text-2:#44424E;
  --text-3:#5B5963;
  --text-quiet:#6e6e81;
  --text-disabled:#7c7c8f;
  --inverse-bg:#211f1c;
  --on-inverse:#f9fafe;
  --accent:#E8362F;
  --on-accent:#0A0A0D;
  --accent-hover:#FF4D45;
  --accent-active:#d73930;
  --accent-grad-deep:#E8362F;
  --accent-tint:#f6cfca;
  --on-accent-tint:#941715;
  --accent-border:#744c4e;
  --selection-bg:#e8aaa1;
  --on-selection:#0a0a0d;
  --link-color:#C92A24;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#C92A24;
  --danger:#e94642;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#16171a;
  --danger-border:#794a4c;
  --ok:#16955d;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --ok-border:#406c55;
  --warn:#b67905;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --warn-border:#6e5d3b;
  --info:#4f6beb;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --info-border:#4e5b89;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --chart-1:#4f6beb;
  --chart-1-tint:#4e5b89;
  --chart-2:#1f9a61;
  --chart-3:#bb7e12;
  --chart-4:#886bbc;
  --chart-5:#e05e59;
  --chart-6:#4d4c53;
  --chart-grid:#dad7d8;
  --chart-axis:#323340;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#f2cbc6;
  --state-edge:#7d7b7d;
  --state-selected-edge:#E8362F;
  --seg-thumb-fill:#fefcfb;
  --seg-thumb-edge:#7d7b7d;
  --seg-thumb-ink:#0A0A0D;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band accent/neu-light */
[data-scheme="accent"]{
  --bg:#2f6fed;
  --inset:#2159cc;
  --surface:#2b66da;
  --surface-2:#2a63d3;
  --surface-3:#2962d1;
  --surface-raised:#285ec9;
  --knob:#000000;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(255,255,255,0.30);
  --border:#5e95fc;
  --border-strong:#81adfb;
  --border-hover:#a0c1fa;
  --text:#ffffff;
  --text-2:#ffffff;
  --text-3:#ffffff;
  --text-quiet:#2f3640;
  --text-disabled:#64676a;
  --inverse-bg:#e4eaf3;
  --on-inverse:#0a1017;
  --accent:#ffffff;
  --on-accent:#2159cc;
  --accent-hover:#f0f5ff;
  --accent-active:#ffffff;
  --accent-grad-deep:#ffffff;
  --accent-tint:#275dc7;
  --on-accent-tint:#ffffff;
  --accent-border:#ab8639;
  --selection-bg:#82adfc;
  --on-selection:#404040;
  --link-color:#ffffff;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#ffffff;
  --danger:#fab3ad;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#505050;
  --danger-border:#f0c1c1;
  --ok:#7ed9a2;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --ok-border:#c4e4d2;
  --warn:#fabc6d;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --warn-border:#f0dcb2;
  --info:#aac8ff;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --info-border:#cddcfa;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --chart-1:#7b9fe8;
  --chart-1-tint:#17243d;
  --chart-2:#5cb98a;
  --chart-3:#d9a24a;
  --chart-4:#a98ee0;
  --chart-5:#d08770;
  --chart-6:#5f6f85;
  --chart-grid:#4787ff;
  --chart-axis:#bec9d9;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#1c52bb;
  --state-edge:#a9c6fb;
  --state-selected-edge:#ffffff;
  --seg-thumb-fill:#285ec9;
  --seg-thumb-edge:#bad2fd;
  --seg-thumb-ink:#ffffff;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band accent/neu-dark */
[data-mode="dark"] [data-scheme="accent"]{
  --bg:#2f6fed;
  --inset:#2159cc;
  --surface:#2b66da;
  --surface-2:#2a63d3;
  --surface-3:#2962d1;
  --surface-raised:#285ec9;
  --knob:#000000;
  --scrim:rgba(16,24,40,0.45);
  --hairline:rgba(10,16,23,0.30);
  --border:#195fdf;
  --border-strong:#024bc6;
  --border-hover:#002c84;
  --text:#ffffff;
  --text-2:#ffffff;
  --text-3:#ffffff;
  --text-quiet:#ffffff;
  --text-disabled:#ffffff;
  --inverse-bg:#1a212b;
  --on-inverse:#ffffff;
  --accent:#0a1017;
  --on-accent:#e4eaf3;
  --accent-hover:#132030;
  --accent-active:#010000;
  --accent-grad-deep:#0a1017;
  --accent-tint:#275dc7;
  --on-accent-tint:#ffffff;
  --accent-border:#876200;
  --selection-bg:#0148d3;
  --on-selection:#ffffff;
  --link-color:#ffffff;
  --link-color-hover:var(--text);
  --link-ink:color-mix(in oklab, var(--accent) 45%, transparent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#ffffff;
  --danger:#fab3ad;
  --danger-hover:#b83232;
  --danger-tint:#fdeaea;
  --on-danger-tint:#a02b2b;
  --on-danger:#505050;
  --danger-border:#f0c1c1;
  --ok:#7ed9a2;
  --ok-tint:#daeee3;
  --on-ok-tint:#155c3c;
  --ok-border:#c4e4d2;
  --warn:#fabc6d;
  --warn-tint:#fff4e0;
  --on-warn-tint:#7a5200;
  --warn-border:#f0dcb2;
  --info:#aac8ff;
  --info-tint:#e9f0fe;
  --on-info-tint:#1c3f8f;
  --info-border:#cddcfa;
  --neutral-tint:#e8ecf1;
  --on-neutral-tint:#4d5766;
  --chart-1:#5b83d6;
  --chart-1-tint:#c9dbfc;
  --chart-2:#4aa06e;
  --chart-3:#b0761f;
  --chart-4:#8a6dbf;
  --chart-5:#c0705e;
  --chart-6:#7e8a9a;
  --chart-grid:#2c6fee;
  --chart-axis:#ffffff;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#1c52bb;
  --state-edge:#a8c7fc;
  --state-selected-edge:#0a1017;
  --seg-thumb-fill:#285ec9;
  --seg-thumb-edge:#bbd3fb;
  --seg-thumb-ink:#ffffff;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:2px 2px 0 var(--accent-tint);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--hairline);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band accent/atw-derived */
[data-brand-style="atw"] [data-scheme="accent"]{
  --bg:#bf0b11;
  --inset:#b3000c;
  --surface:#b00a10;
  --surface-2:#aa0a0f;
  --surface-3:#a80a0f;
  --surface-raised:#a2090e;
  --knob:#000000;
  --scrim:rgba(0,0,0,0.6);
  --hairline:rgba(246,246,251,0.3);
  --border:#e74341;
  --border-strong:#fe918b;
  --border-hover:#facdc9;
  --text:#f6f6fb;
  --text-2:#f6f6fb;
  --text-3:#f6f6fb;
  --text-quiet:#9a9aaf;
  --text-disabled:#5e5e70;
  --inverse-bg:#F2F0EB;
  --on-inverse:#0A0A0D;
  --accent:#f6f6fb;
  --on-accent:#0f0e0b;
  --accent-hover:#dbdbe5;
  --accent-active:#d3e4ec;
  --accent-grad-deep:#f6f6fb;
  --accent-tint:#a0090e;
  --on-accent-tint:#f6f6fb;
  --accent-border:#1297af;
  --selection-bg:#fc453f;
  --on-selection:#222226;
  --link-color:#f6f6fb;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#f6f6fb;
  --danger:#fe847a;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#16171a;
  --danger-border:#794a4c;
  --ok:#4bbb80;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --ok-border:#406c55;
  --warn:#dd9e40;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --warn-border:#6e5d3b;
  --info:#8da7fc;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --info-border:#4e5b89;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --chart-1:#4D68E8;
  --chart-1-tint:#2a3560;
  --chart-2:#2FA46B;
  --chart-3:#D9931A;
  --chart-4:#8a6dbf;
  --chart-5:#FF7A73;
  --chart-6:#9F9DA6;
  --chart-grid:#db3536;
  --chart-axis:#a8a7ba;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#910006;
  --state-edge:#fc8980;
  --state-selected-edge:#f6f6fb;
  --seg-thumb-fill:#cf3936;
  --seg-thumb-edge:#fb9087;
  --seg-thumb-ink:#f6f6fb;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}
/* band accent/atw-native */
[data-mode="dark"][data-brand-style="atw"] [data-scheme="accent"]{
  --bg:#E8362F;
  --inset:#F0453D;
  --surface:#ea4640;
  --surface-2:#eb4c46;
  --surface-3:#eb4e48;
  --surface-raised:#eb544e;
  --knob:#ffffff;
  --scrim:rgba(252,252,252,0.6);
  --hairline:rgba(10,10,13,0.30);
  --border:#be081c;
  --border-strong:#7c0012;
  --border-hover:#4d0007;
  --text:#0A0A0D;
  --text-2:#0A0A0D;
  --text-3:#0A0A0D;
  --text-quiet:#444456;
  --text-disabled:#7c7c8f;
  --inverse-bg:#211f1c;
  --on-inverse:#f9fafe;
  --accent:#0A0A0D;
  --on-accent:#F2F0EB;
  --accent-hover:#1B1B22;
  --accent-active:#00070b;
  --accent-grad-deep:#0A0A0D;
  --accent-tint:#ec5650;
  --on-accent-tint:#0A0A0D;
  --accent-border:#00000c;
  --selection-bg:#a4000c;
  --on-selection:#c4c4c9;
  --link-color:#0A0A0D;
  --link-color-hover:var(--text);
  --link-ink:var(--accent);
  --link-ink-hover:var(--accent);
  --eyebrow-color:#0A0A0D;
  --danger:#790007;
  --danger-hover:#e05e59;
  --danger-tint:#fddadc;
  --on-danger-tint:#ad403b;
  --on-danger:#a1a3a7;
  --danger-border:#794a4c;
  --ok:#003f22;
  --ok-tint:#b4d4c2;
  --on-ok-tint:#05633e;
  --ok-border:#406c55;
  --warn:#4e3100;
  --warn-tint:#e1d4bc;
  --on-warn-tint:#7b5603;
  --warn-border:#6e5d3b;
  --info:#1d1f9e;
  --info-tint:#d6dfff;
  --on-info-tint:#515b9b;
  --info-border:#4e5b89;
  --neutral-tint:#d6d7e1;
  --on-neutral-tint:#3c3a40;
  --chart-1:#4f6beb;
  --chart-1-tint:#4e5b89;
  --chart-2:#1f9a61;
  --chart-3:#bb7e12;
  --chart-4:#886bbc;
  --chart-5:#e05e59;
  --chart-6:#4d4c53;
  --chart-grid:#cd0b20;
  --chart-axis:#323340;
  --code-bg:#171c24;
  --code-border:#2a313d;
  --code-muted:#8f9bab;
  --code-chip-border:#3a4350;
  --code-text:#aeb9c8;
  --code-text-strong:#d5dce6;
  --code-blue:#8ab4f8;
  --code-green:#a5d6a7;
  --code-amber:#ffb74d;
  --code-purple:#ce93d8;
  --media-overlay:transparent;
  --state-selected-bg:#f9625b;
  --state-edge:#73010c;
  --state-selected-edge:#0A0A0D;
  --seg-thumb-fill:#fd695f;
  --seg-thumb-edge:#68010a;
  --seg-thumb-ink:#0A0A0D;
  --accent-grad:linear-gradient(180deg,var(--accent),var(--accent-grad-deep));
  --display-shadow:3px 3px 0 var(--accent);
  --display-gradient:var(--accent-grad);
  --card-edge:var(--bw) solid var(--border);
  --divider:1px solid var(--border);
  --state-hover:color-mix(in oklab, var(--text) 6%, transparent);
  --state-pressed:color-mix(in oklab, var(--text) 11%, transparent);
  --track:color-mix(in oklab, var(--text) var(--track-ink, 6%), transparent);
  --field-affix-fg:var(--text-3);
  --field-affix-fg-active:var(--text);
  --field-affix-bg-hover:var(--surface-3);
  --field-affix-clear-bg:var(--neutral-tint);
  --field-affix-clear-bg-hover:var(--inset);
  --field-affix-clear-fg:var(--text-2);
  --ring-selected:inset 0 0 0 1px color-mix(in oklab, var(--accent) 25%, transparent);
  --glass-bg:color-mix(in srgb, var(--surface) 72%, transparent);
  --glass-border:color-mix(in srgb, var(--border) 60%, transparent);
  --canvas:color-mix(in srgb, var(--text) 4%, var(--bg));
  --bg-ground:var(--texture-surface, none), var(--surface-wash, none), var(--bg);
  --surface-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface);
  --surface-2-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-2);
  --surface-3-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-3);
  --surface-raised-ground:var(--texture-container, none), var(--surface-wash, none), var(--surface-raised);
  --inset-ground:var(--texture-container, none), var(--surface-wash, none), var(--inset);
  --drop-indicator:2px solid var(--accent);
  --drop-target-bg:var(--accent-tint);
  --scrollbar-thumb:var(--border-strong);
  --chart-2-tint:color-mix(in oklab, var(--chart-2) 30%, var(--surface));
  --chart-3-tint:color-mix(in oklab, var(--chart-3) 30%, var(--surface));
  --chart-4-tint:color-mix(in oklab, var(--chart-4) 30%, var(--surface));
  --chart-5-tint:color-mix(in oklab, var(--chart-5) 30%, var(--surface));
  --chart-6-tint:color-mix(in oklab, var(--chart-6) 30%, var(--surface));
  --chart-seq-1:color-mix(in oklab, var(--chart-1) 18%, var(--surface));
  --chart-seq-2:color-mix(in oklab, var(--chart-1) 34%, var(--surface));
  --chart-seq-3:color-mix(in oklab, var(--chart-1) 50%, var(--surface));
  --chart-seq-4:color-mix(in oklab, var(--chart-1) 66%, var(--surface));
  --chart-seq-5:color-mix(in oklab, var(--chart-1) 82%, var(--surface));
  --chart-seq-6:var(--chart-1);
  --chart-neg:var(--danger);
  --chart-pos:var(--ok);
  --chart-div-neg-2:var(--chart-neg);
  --chart-div-neg-1:color-mix(in oklab, var(--chart-neg) 45%, var(--surface));
  --chart-div-mid:color-mix(in oklab, var(--text) 14%, var(--surface));
  --chart-div-pos-1:color-mix(in oklab, var(--chart-pos) 45%, var(--surface));
  --chart-div-pos-2:var(--chart-pos);
  --elev-tint-1:color-mix(in oklab, var(--knob) 3%, transparent);
  --elev-tint-2:color-mix(in oklab, var(--knob) 5%, transparent);
  --elev-tint-3:color-mix(in oklab, var(--knob) 8%, transparent);
  --elev-tint-4:color-mix(in oklab, var(--knob) 11%, transparent);
}

/* ============ REDUCED MOTION — GENERATED from the motion-role register (SPEC-58);
   emitted last so the :root overrides out-cascade every register block (equal
   specificity resolves by source order). Replace, don't remove: transforms
   neutralize, springs resolve to standard, fades stay but shorten, loops still. ============ */
@media (prefers-reduced-motion: reduce){
  :root{--enter-from:none;--exit-to:none;--press-transform:none;--media-hover-scale:1;--stagger-step:0ms;--ease-spring:var(--ease-standard);--exit-dur:90ms}
  [data-enter],[data-choreography="enter"]>*{animation-duration:90ms}
  .skeleton{animation:none !important;background-size:100% 100%}
  [data-role="spinner"]{animation:none !important}
  .progress [data-role="fill"]{animation:none !important}
  [data-ambient]{animation:none !important}
  [data-ambient="drift"]{background-size:100% 100%}
  *{scroll-behavior:auto !important}
}
