/* GENERATED by design-system tools/loop.mjs sync — do not edit; edit ds.config.json / the library and re-run. Load order per AUTHORING §1. */
/* ds/base.css */
/* ============================================================================
   JSTOV design system — tokens/base.css
   The neutral baseline. Implements the whole contract (tokens/CONTRACT.md) so
   that ANY module renders correctly with no theme file loaded.

   Load order (mandatory):  tokens/base.css → tokens/themes/<name>.css (optional)
                           → components/_base.css → components/<id>/<id>.css

   Layers in this file
     1. Skin tokens, light defaults          :root, [data-mode="light"]      (0,1,0)
     2. Structure knobs + constants           :root                            (0,1,0)
     3. Derived tokens (calc / var chains)    the RE-DERIVE HOSTS rule         (0,1,0)
     4. Dark remap                            :root[data-mode="dark"],
                                              :not(:root)[data-mode="dark"]   (0,2,0)
                                              + guarded prefers-color-scheme
     5. Policy attributes                     :root[data-x="v"],
                                              :not(:root)[data-x="v"]         (0,2,0)
        + band islands (data-band)            [data-band="v"][data-band]      (0,2,0)
     6. Reduced motion, grid-snapping (@supports round())

   Specificity ladder — why the selectors look the way they do
     • Theme LIGHT blocks are [data-theme="x"] (0,1,0) and load after this file,
       so they beat the defaults in 1–3 by source order.
     • Dark blocks (4) and policy attributes (5) are written at (0,2,0) so that
       (a) a theme's light block can never leak a colour into dark mode, and
       (b) an EXPLICIT attribute on the page beats a theme's CSS-only fallback
       for that policy (a theme's fallback is (0,1,0)).
     • Theme DARK blocks are [data-theme="x"][data-mode="dark"] (0,2,0) and load
       later, so they beat the neutral dark remap.
     • The guarded media form for a theme is :root[data-theme="x"]:not([data-mode="light"])
       (0,3,0) so it beats the neutral guarded form (0,2,0).

   Re-derive hosts
     Custom properties that contain var()/calc() are substituted on the element
     that DECLARES them, and descendants inherit the finished value. If a theme
     scoped to <section data-theme="paper"> sets --ds-space-unit:8px, a
     --ds-space-4 declared only on :root would still be 16px inside the section.
     So every derived token is declared on the HOST LIST — :root plus every
     element that can carry a theme/policy attribute, and every data-band
     island — and recomputes wherever a knob can change. Keep that list in sync
     with CONTRACT.md §3.

   Islands (batch 12, 2026-09-20)
     data-mode="dark|light" and data-band="tint|dark|accent" are section-level
     islands. Base defines all three bands theme-agnostically (§5 below); a
     theme's dark block also lists [data-theme="x"] [data-mode="dark"] and
     [data-theme="x"] [data-band="dark"] so an island inside a themed page gets
     THE THEME's dark, not this file's neutral one. The accent band reads the
     page's accent through the --ds-band-* snapshots (declared on every host
     except the accent band itself, because a custom property cannot reference
     its own redefinition on the same element). Put data-band on a <section>,
     never on the root and never on the same element as data-theme/data-mode —
     the root is where the snapshot is taken from.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   1. LIGHT SKIN DEFAULTS — everything that changes between light and dark
   (colours, shadows, glass, texture). [data-mode="light"] is in the list so a
   light island inside a dark page works without resetting structure.
   ------------------------------------------------------------------------- */
:root,
[data-mode="light"] {
  color-scheme: light;

  /* ---- Surfaces (§7.1) — pure-neutral ramp, surfaces lighter than ground --- */
  --ds-ground:            #fafafa;   /* page / chrome background                */
  --ds-ground-2:          #f4f4f4;   /* second chrome plane: sidebar, rail, canvas */
  --ds-surface:           #ffffff;   /* cards, inputs, popovers                 */
  --ds-surface-2:         #f3f3f3;   /* inset: nested fields, chips, wells      */
  --ds-surface-3:         #ececec;   /* deeper inset / disabled fill            */
  --ds-skeleton:          #e2e2e2;   /* loading placeholder fill — visible on ground AND surface (batch-1 finding) */
  --ds-surface-raised:    #ffffff;   /* overlay fill (popover, modal) — NEUTRAL even in themed planes */
  --ds-surface-hover:     #f0f0f0;   /* one tint step for hover                 */
  --ds-surface-pressed:   #ebebeb;   /* pressed fill — hover < pressed < selected in distance from surface (batch-12) */
  --ds-surface-selected:  #e6e6e6;   /* selected nav / row / tab (neutral)      */
  --ds-surface-inverse:   #111111;   /* dark chrome, inverse cards              */
  --ds-surface-inverse-hover: #262626; /* hover step for inverse fills (batch-2 finding) */
  --ds-surface-polarity:  1;         /* 1 = surface lighter than ground, -1 = darker (informational) */
  --ds-scrim:             rgba(0, 0, 0, .40);
  --ds-scrim-filter:      none;      /* none | blur(6px) | grayscale(.5)        */

  /* ---- Ink (§7.2) ---------------------------------------------------------- */
  --ds-ink:               #111111;   /* primary text                            */
  --ds-ink-2:             #3d3d3d;   /* secondary text, body inside cards, nav  */
  --ds-ink-muted:         #6b6b6b;   /* labels, placeholders, meta — READABLE, ≥ 4.5:1 on ground/surface/surface-2 */
  --ds-ink-faint:         #a3a3a3;   /* DECORATIVE only: disabled, indices, hints */
  --ds-ink-inverse:       #fafafa;   /* text on --ds-surface-inverse            */
  --ds-ink-on-primary:    #ffffff;   /* text on --ds-primary-fill               */
  --ds-ink-on-accent:     #ffffff;   /* text on --ds-accent fill                */
  /* --ds-ink-link and --ds-ink-code are derived (see hosts rule)               */

  /* ---- Lines (§7.3) — three hairline grades + control borders --------------- */
  --ds-rule-soft:         #ededed;   /* in-content / row dividers (1.17:1)      */
  --ds-rule-faint:        #f4f4f4;   /* table COLUMN rules, fainter than rows (batch-2 finding) */
  --ds-rule:              #e5e5e5;   /* structural hairline: dividers, card edges (≥ 1.15:1 — 1.26 here) */
  --ds-rule-strong:       #d4d4d4;   /* column / section rules, the control lip */
  --ds-border:            #d9d9d9;   /* control borders: inputs, buttons, chips */
  --ds-border-strong:     #bdbdbd;   /* darker fields when a brand wants them; hover border */
  /* --ds-ring, --ds-border-selected are derived                                */

  /* ---- Action & accent (§7.4) ---------------------------------------------- */
  --ds-primary-fill:        #111111; /* THE one filled button; ink-black here   */
  --ds-primary-fill-hover:  #2a2a2a;
  --ds-primary-border:      transparent;   /* optional 1px darker edge          */
  --ds-primary-highlight:   transparent;   /* optional 1px inner top highlight  */
  --ds-accent:              #2563eb; /* links, active state, badges, dots, CTA if hue */
  --ds-accent-hover:        #1d4fd8;
  --ds-accent-ink:          #1e40af; /* accent darkened for text on tint        */
  --ds-accent-tint:         #e9effd; /* accent at ~10% for chips / selected rows */
  --ds-accent-soft:         #93b4f5; /* ~45% — open triggers, soft borders      */
  --ds-accent-2:            #7c5ee4; /* second accent: selection | data | sub-brand | AI */
  --ds-accent-2-ink:        #5b3fc4;
  --ds-accent-2-tint:       #eee9fb;
  /* --ds-accent-line derived                                                   */

  /* ---- Semantic (§7.5) — fill / tint / ink triplets ------------------------- */
  --ds-success:       #15803d;  --ds-success-tint:  #e3f0e8;  --ds-success-ink:  #14703a;
  --ds-danger:        #dc2626;  --ds-danger-tint:   #fbe5e5;  --ds-danger-ink:   #b91c1c;
  --ds-warning:       #d97706;  --ds-warning-tint:  #faefe1;  --ds-warning-ink:  #9a4f00;
  --ds-info:          #0369a1;  --ds-info-tint:     #e1edf4;  --ds-info-ink:     #075985;
  /* same-hue hairlines for tinted callouts / validation outlines (batch-5 finding); themes may tune */
  --ds-success-line:  color-mix(in srgb, var(--ds-success) 35%, transparent);
  --ds-danger-line:   color-mix(in srgb, var(--ds-danger)  35%, transparent);
  --ds-warning-line:  color-mix(in srgb, var(--ds-warning) 35%, transparent);
  --ds-info-line:     color-mix(in srgb, var(--ds-info)    35%, transparent);
  --ds-ink-on-semantic: #ffffff;    /* text on a semantic FILL (warning fill needs ink — see CONTRACT) */
  --ds-ink-on-warning:  #1a1200;    /* text on a warning FILL — dark in BOTH modes (batch-2 finding) */
  /* --ds-live, --ds-presence, --ds-selection-graph derived                     */

  /* ---- Data (§7.6) — 8-hue categorical set, distinguishable in both modes ---
     Hue order: blue · violet · green · orange · pink · amber · teal · umber.
     Adjacent hues are ≥ 40° apart; every light mark is ≥ 3:1 on #ffffff AND on
     --ds-ground, so a 1 px chart line passes on either plane (amber was 2.98 /
     2.85 — darkened to #ad861b = 3.39 / 3.24, batch-12; its ink #7d6218 stays
     darker than the fill and 5.2:1 on the tint). Dark amber #e2c04e is 10:1
     on the dark surface — untouched. Amber is still a fill/badge hue: text
     uses its ink.                                                             */
  --ds-data-1: #2f6fed;  --ds-data-1-tint: #e2ebfc;  --ds-data-1-ink: #2455bd;
  --ds-data-2: #7c5ee4;  --ds-data-2-tint: #ede8fb;  --ds-data-2-ink: #6248b8;
  --ds-data-3: #0f9d6b;  --ds-data-3-tint: #ddf1ea;  --ds-data-3-ink: #0b7751;
  --ds-data-4: #da6c36;  --ds-data-4-tint: #fbebe4;  --ds-data-4-ink: #a6542c;   /* orange 2.87 → 3.06 on surface-2 (the tint band's ground), batch-12 */
  --ds-data-5: #d23f7a;  --ds-data-5-tint: #f9e4ec;  --ds-data-5-ink: #b53669;
  --ds-data-6: #ad861b;  --ds-data-6-tint: #f7f2e1;  --ds-data-6-ink: #7d6218;
  --ds-data-7: #0e9aa7;  --ds-data-7-tint: #ddf1f3;  --ds-data-7-ink: #0b757f;
  --ds-data-8: #8a6a4b;  --ds-data-8-tint: #efeae6;  --ds-data-8-ink: #7f6245;
  --ds-chart-ramp-1: #1e40af; --ds-chart-ramp-2: #2f6fed; --ds-chart-ramp-3: #93b4f5;  /* one hue, dark→light */
  /* --ds-chart-grid, --ds-chart-comparison derived                             */

  /* ---- Elevation (§7.7) — shadow recipes; card-* derived from data-depth ---- */
  --ds-shadow-lift:   0 1px 2px rgba(0, 0, 0, .05);                    /* pressable controls */
  --ds-shadow-card:   0 1px 3px rgba(0, 0, 0, .08);                    /* inert unless data-depth="shadow" */
  --ds-shadow-float:  0 8px 24px rgba(0, 0, 0, .12), 0 0 0 1px rgba(0, 0, 0, .04);   /* popover / toast */
  --ds-shadow-modal:  0 24px 80px rgba(0, 0, 0, .18), 0 0 0 1px rgba(0, 0, 0, .04);
  --ds-shadow-object: 0 4px 12px rgba(0, 0, 0, .12);                   /* physical objects: covers, task cards */
  /* --ds-shadow-lip derived                                                    */

  /* ---- Imagery & ornament (§7.12) ------------------------------------------ */
  --ds-overlay-fill:   rgba(0, 0, 0, .60);   /* chrome on images                 */
  --ds-ink-on-overlay: #ffffff;              /* ink on --ds-overlay-fill / over media — light in BOTH modes (batch-2 finding) */
  --ds-glass-fill:     rgba(255, 255, 255, .35);
  --ds-glass-border:   rgba(255, 255, 255, .55);
  --ds-texture-color:  rgba(0, 0, 0, .06);
  --ds-illustration-ground: #eef2f7;         /* shared tint behind illustrations */
  /* --ds-line-art, --ds-media-radius derived                                   */
}

/* ---------------------------------------------------------------------------
   2. STRUCTURE DEFAULTS — system-owned knobs and constants. Declared on :root
   ONLY (a light/dark island must not reset them). Themes SCALE these
   (--ds-radius-scale, --ds-density-scale, --ds-space-unit, --ds-text-base) or
   point lane families at their own stacks; they do not redefine the steps.
   ------------------------------------------------------------------------- */
:root {
  /* ---- Lines: widths ------------------------------------------------------- */
  --ds-border-width:      1px;
  --ds-ring-width:        2px;
  --ds-ring-offset:       2px;
  --ds-ring-outset:       0px;       /* 0 | 3px — highlight ring drawn outside the box (Jasper) */

  /* ---- Elevation: the control lip ------------------------------------------- */
  --ds-control-lip:   0px;                                             /* 0 | 1px — darker bottom edge on pressables */

  /* ---- Shape (§7.8) — steps derive from --ds-radius-scale ------------------ */
  --ds-radius-scale:  1;             /* 0 drafting · 1 tool · 2 soft (any number works) */
  --ds-radius-pill:   9999px;
  /* xs/sm/md/lg/xl + --ds-radius-button derived                                */

  /* ---- Typography (§7.9) --------------------------------------------------- */
  --ds-font-sans:     "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --ds-font-serif:    ui-serif, Georgia, "Times New Roman", serif;
  --ds-font-mono:     ui-monospace, "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
  /* lane families — a theme points a lane at one of the families above:      */
  --ds-font-display:  var(--ds-font-sans);   /* display / hero lane              */
  --ds-font-label:    var(--ds-font-sans);   /* label / metadata lane            */
  --ds-font-body-alt: var(--ds-font-sans);   /* explanatory / "writing" lane     */
  --ds-font-sign:     var(--ds-font-display); /* signage lane: place names, wayfinding, posters (2026-10-11) */
  --ds-text-base:     14px;          /* 14 app · 16 forms/marketing/consumer      */
  /* scale ratios (flat by default; a theme may re-shape them)                  */
  --ds-scale-xs: .786;  --ds-scale-sm: .857;  --ds-scale-lg: 1.143;  --ds-scale-xl: 1.429;
  --ds-scale-2xl: 1.714; --ds-scale-3xl: 2.286; --ds-scale-display: 3.429;
  --ds-weight-regular: 400; --ds-weight-medium: 500; --ds-weight-semibold: 600; --ds-weight-bold: 700;
  --ds-display-weight: 600;          /* 400–500 editorial · 600–800 punch          */
  --ds-heading-weight: 600;
  --ds-display-tracking: -0.02em;
  --ds-heading-tracking: -0.01em;
  --ds-label-tracking: 0;            /* sentence-case tracking (set by data-labels) */
  --ds-label-tracking-upper: .08em;  /* the tracking uppercase labels take; a theme sets ITS value here and
                                        data-labels="upper" reads it (batch-12: the attribute no longer pins .08em) */
  --ds-label-case:     none;         /* none | uppercase  (set by data-labels)   */
  --ds-control-case:   none;         /* none | capitalize (set by data-controls) */
  --ds-lh-tight: 1.05; --ds-lh-heading: 1.2; --ds-lh-body: 1.45; --ds-lh-prose: 1.6; --ds-lh-list: 1.25;
  --ds-numeric:        tabular-nums; /* font-variant-numeric for numbers          */
  --ds-measure:        65ch;         /* reading measure for prose                  */

  /* ---- Space & density (§7.10) -------------------------------------------- */
  --ds-space-unit:     4px;          /* 4 apps · 8 marketing                     */
  --ds-density-scale:  1;            /* .85 compact · 1 default · 1.2 comfortable */
  --ds-control-h-base: 36px;         /* system-owned; themes scale via density   */
  --ds-field-gap:      8px;          /* label → control                          */
  --ds-gutter-page:    clamp(16px, 4vw, 72px);
  --ds-container-max:  1152px;
  --ds-container-narrow: 640px;
  --ds-container-prose:  720px;
  --ds-container-content: 1088px;    /* app content column (.ds-content, C-03) — theme-tunable (batch-12) */
  --ds-section-gap-units: 12;        /* marketing region gap in space units (C-01 house = 12–16) */
  --ds-rail-inset:     24px;         /* C-03 drawn rails: inset from the page edge, NOT a space step (48 px at unit 8 was wrong) — theme-tunable (batch-12) */
  --ds-rail-w:         64px;         /* labelled icon rail                        */
  --ds-sidebar-w:      256px;
  --ds-inspector-w:    320px;
  --ds-topbar-h:       56px;
  --ds-sheet-inset:    12px;         /* inset sheet gap from the chrome edge (house shell) */
  --ds-icon-size:      16px;         /* inline                                   */
  --ds-icon-size-row:  20px;         /* list / nav rows                          */
  --ds-icon-size-rail: 24px;         /* rails                                    */
  --ds-icon-stroke:    1.5px;
  --ds-tap-target-min: 40px;

  /* ---- Motion (§7.11) ------------------------------------------------------ */
  --ds-motion-scale:   1;            /* 0 under prefers-reduced-motion           */
  --ds-ease-standard:  cubic-bezier(.2, 0, 0, 1);
  --ds-ease-out:       cubic-bezier(0, 0, .2, 1);
  --ds-ease-in:        cubic-bezier(.4, 0, 1, 1);
  --ds-ambient-play:   running;      /* animation-play-state for marketing blobs / marquee / parallax:
                                        running | paused — paused under data-ambient="off" and reduced motion.
                                        Consume as `animation-play-state: var(--ds-ambient-play)` (batch-12) */
  --ds-ambient-motion: 1;            /* DEPRECATED alias of --ds-ambient-play (1 | 0) — nothing should read it; kept so
                                        old references resolve until they are re-pointed */
  /* --ds-dur-* derived                                                         */

  /* ---- Imagery: geometry --------------------------------------------------- */
  --ds-glass-blur:     12px;
  --ds-media-aspect:   16 / 9;
  --ds-mock-fade:      96px;                 /* fade-mask length on product frames */

  /* ---- Z-index ladder ------------------------------------------------------
     Transient layers sit ABOVE the scrim + modal pair (DESK-326, CONTRACT §15): a popover or dropdown
     opened over a scrimmed page, or portalled out of a modal, must be on top. Page-level popovers are
     light-dismissed when a modal opens, so a page popover never ends up over a modal.            */
  --ds-z-sticky:   100;
  --ds-z-scrim:    200;
  --ds-z-modal:    210;
  --ds-z-dropdown: 300;
  --ds-z-popover:  310;
  --ds-z-toast:    500;
  --ds-z-tooltip:  600;
}

/* ---------------------------------------------------------------------------
   3. DERIVED TOKENS — declared on every RE-DERIVE HOST (see header).
   A theme sets the knobs (unit, scales, seed, families); these follow.
   [data-band] is a host too (batch-12), so a band block sets planes and
   accent roles only — card-*, selected-*, hover-*, link / ring / lines
   re-derive from them on the band element itself.
   ------------------------------------------------------------------------- */
:root,
[data-theme], [data-mode], [data-density], [data-depth], [data-selection],
[data-buttons], [data-labels], [data-controls], [data-accent-scope], [data-hover],
[data-band] {
  /* ink chains */
  --ds-ink-link:          var(--ds-accent);
  --ds-ink-code:          var(--ds-ink-2);
  --ds-ring:              var(--ds-accent);
  --ds-border-selected:   var(--ds-accent);
  --ds-accent-line:       var(--ds-accent);
  --ds-live:              var(--ds-danger);
  --ds-presence:          var(--ds-success);
  --ds-selection-graph:   var(--ds-accent);
  --ds-data-primary:      var(--ds-data-1);   /* a chart's default / single series; themes whose data-1 IS the accent re-point it (CONTRACT §15.2) */
  --ds-chart-grid:        var(--ds-rule-soft);
  --ds-chart-comparison:  var(--ds-ink-faint);
  --ds-line-art:          var(--ds-rule-strong);

  /* elevation: card-* follow data-depth (defaults = tint-hairline) */
  --ds-card-bg:           var(--ds-surface);
  --ds-card-border:       var(--ds-rule);
  --ds-card-shadow:       0 0 0 0 transparent;   /* composable 'none' — `none` would invalidate a comma-joined box-shadow */
  --ds-shadow-lip:        inset 0 calc(-1 * var(--ds-control-lip)) 0 0 var(--ds-border-strong);
  --ds-hover-bg:          var(--ds-surface-hover);   /* data-hover="tint" */
  --ds-hover-shadow:      0 0 0 0 transparent;

  /* selection primitives (defaults = data-selection="tint") */
  --ds-selected-bg:       var(--ds-surface-selected);
  --ds-selected-ink:      var(--ds-ink);
  --ds-selected-line:     transparent;
  --ds-selected-weight:   var(--ds-weight-medium);

  /* shape */
  --ds-radius-xs:   calc(4px  * var(--ds-radius-scale));
  --ds-radius-sm:   calc(6px  * var(--ds-radius-scale));
  --ds-radius-md:   calc(8px  * var(--ds-radius-scale));
  --ds-radius-lg:   calc(12px * var(--ds-radius-scale));
  --ds-radius-xl:   calc(20px * var(--ds-radius-scale));
  --ds-radius-button: var(--ds-radius-sm);          /* data-buttons="pill" → pill */
  --ds-media-radius:  var(--ds-radius-lg);

  /* type scale */
  --ds-text-xs:      calc(var(--ds-text-base) * var(--ds-scale-xs));
  --ds-text-sm:      calc(var(--ds-text-base) * var(--ds-scale-sm));
  --ds-text-md:      var(--ds-text-base);
  --ds-text-lg:      calc(var(--ds-text-base) * var(--ds-scale-lg));
  --ds-text-xl:      calc(var(--ds-text-base) * var(--ds-scale-xl));
  --ds-text-2xl:     calc(var(--ds-text-base) * var(--ds-scale-2xl));
  --ds-text-3xl:     calc(var(--ds-text-base) * var(--ds-scale-3xl));
  --ds-text-display: calc(var(--ds-text-base) * var(--ds-scale-display));
  /* the house hero formula — one fluid display size instead of a clamp() per recipe (batch-12):
     never below 3xl, grows with the viewport, never past 1.4 × display */
  --ds-text-display-fluid: clamp(var(--ds-text-3xl), calc(var(--ds-text-xl) + 3vw), calc(var(--ds-text-display) * 1.4));
  /* title sizes by ROLE — components read these, never pick a step themselves (batch-12).
     Values = the built house: page-header 2xl · section-header (in-page shelf title) lg ·
     card md · chapter-header (marketing) 3xl. A theme may move a role one step. */
  --ds-text-title-page:    var(--ds-text-2xl);
  --ds-text-title-section: var(--ds-text-lg);
  --ds-text-title-card:    var(--ds-text-md);
  --ds-text-title-chapter: var(--ds-text-3xl);

  /* space steps (unit × n) — unit-based, NOT density-scaled */
  --ds-space-0-5: calc(var(--ds-space-unit) * .5);
  --ds-space-1:  calc(var(--ds-space-unit) * 1);
  --ds-space-1-5: calc(var(--ds-space-unit) * 1.5);   /* 6px half-step: kbd chips, 42px rows (batch-1 finding) */
  --ds-space-2:  calc(var(--ds-space-unit) * 2);
  --ds-space-2-5: calc(var(--ds-space-unit) * 2.5);   /* 10px: favicon rows, board wells (batch-2 finding) */
  --ds-space-3:  calc(var(--ds-space-unit) * 3);
  --ds-space-4:  calc(var(--ds-space-unit) * 4);
  --ds-space-5:  calc(var(--ds-space-unit) * 5);
  --ds-space-6:  calc(var(--ds-space-unit) * 6);
  --ds-space-7:  calc(var(--ds-space-unit) * 7);      /* 28px: 72px card rows, board gutters (batch-2 finding) */
  --ds-space-8:  calc(var(--ds-space-unit) * 8);
  --ds-space-10: calc(var(--ds-space-unit) * 10);
  --ds-space-12: calc(var(--ds-space-unit) * 12);
  --ds-space-16: calc(var(--ds-space-unit) * 16);
  --ds-space-20: calc(var(--ds-space-unit) * 20);
  --ds-space-24: calc(var(--ds-space-unit) * 24);
  --ds-section-gap: calc(var(--ds-space-unit) * var(--ds-section-gap-units));

  /* density-scaled sizes — snapped to the 4px grid by the @supports block below */
  --ds-control-h:    calc(var(--ds-control-h-base) * var(--ds-density-scale));
  --ds-control-h-sm: calc((var(--ds-control-h-base) - 4px) * var(--ds-density-scale));
  --ds-control-h-lg: calc((var(--ds-control-h-base) + 8px) * var(--ds-density-scale));
  --ds-row-h:        calc(var(--ds-control-h) + 4px);
  --ds-card-pad:     calc(16px * var(--ds-density-scale));
  --ds-card-gap:     calc(16px * var(--ds-density-scale));
  --ds-field-pitch:  calc(16px * var(--ds-density-scale));   /* control → next label */
  --ds-control-pad-x: calc(12px * var(--ds-density-scale));

  /* current-element size hooks (components/_base.css remaps them under data-size) */
  --ds-size-h:      var(--ds-control-h);
  --ds-size-text:   var(--ds-text-md);
  --ds-size-pad-x:  var(--ds-control-pad-x);

  /* motion */
  --ds-dur-fast: calc(120ms * var(--ds-motion-scale));
  --ds-dur-base: calc(180ms * var(--ds-motion-scale));
  --ds-dur-slow: calc(280ms * var(--ds-motion-scale));
}

/* Band snapshots — the page's accent pair as seen from OUTSIDE an accent band (batch-12).
   [data-band="accent"] redefines --ds-accent to the ink; a custom property cannot reference
   the value it is replacing on the same element (inherit() is not shipped), so the band reads
   these instead. Declared on every host EXCEPT the accent band, so the band inherits them from
   its nearest host ancestor — the page root, a themed wrapper, a dark island.
   --ds-band-ink-away is the ink's sRGB inverse: the direction a plane steps to GAIN contrast.
   Plumbing — components never read --ds-band-*. */
:is(:root, [data-theme], [data-mode], [data-density], [data-depth], [data-selection],
    [data-buttons], [data-labels], [data-controls], [data-accent-scope], [data-hover],
    [data-band]):not([data-band="accent"]) {
  --ds-band-accent:   var(--ds-accent);
  --ds-band-ink:      var(--ds-ink-on-accent);
  --ds-band-ink-away: rgb(from var(--ds-ink-on-accent) calc(255 - r) calc(255 - g) calc(255 - b));
}

/* Snap density-scaled sizes to the 4px grid where round() exists
   (Chromium 125+, Firefox 118+, Safari 15.4+). Fallback above is unsnapped. */
@supports (width: round(1px, 1px)) {
  :root,
  [data-theme], [data-mode], [data-density], [data-depth], [data-selection],
  [data-buttons], [data-labels], [data-controls], [data-accent-scope], [data-hover],
  [data-band] {
    --ds-control-h:    round(calc(var(--ds-control-h-base) * var(--ds-density-scale)), 4px);
    --ds-control-h-sm: round(calc((var(--ds-control-h-base) - 4px) * var(--ds-density-scale)), 4px);
    --ds-control-h-lg: round(calc((var(--ds-control-h-base) + 8px) * var(--ds-density-scale)), 4px);
    --ds-card-pad:     round(calc(16px * var(--ds-density-scale)), 4px);
    --ds-card-gap:     round(calc(16px * var(--ds-density-scale)), 4px);
    --ds-field-pitch:  round(calc(16px * var(--ds-density-scale)), 4px);
    --ds-control-pad-x: round(calc(12px * var(--ds-density-scale)), 2px);
  }
}

/* ---------------------------------------------------------------------------
   4. DARK REMAP — §7.1–7.3 + primary + accent + semantic + data + shadows.
   Neutral ramp inversion with P5's in-hue surface step (surfaces step UP from
   ground). Explicit data-mode wins; the guarded media form applies only when no
   data-mode is set on :root.
   ------------------------------------------------------------------------- */
:root[data-mode="dark"],
:not(:root)[data-mode="dark"],
:not(:root)[data-band="dark"] {      /* data-band="dark" IS the dark island (batch-12) — one source of truth, no alias copies */
  color-scheme: dark;
  --ds-ground:            #0f0f10;
  --ds-ground-2:          #141416;
  --ds-surface:           #18181a;
  --ds-surface-2:         #1f1f22;
  --ds-surface-3:         #26262a;
  --ds-skeleton:          #2e2e33;
  --ds-surface-raised:    #1f1f22;   /* popovers step up, not down, in dark      */
  --ds-surface-hover:     #222226;
  --ds-surface-pressed:   #26262a;
  --ds-surface-selected:  #2a2a2e;
  --ds-surface-inverse:   #fafafa;
  --ds-surface-inverse-hover: #e6e6e8;
  --ds-scrim:             rgba(0, 0, 0, .60);

  --ds-ink:               #f4f4f5;
  --ds-ink-2:             #c9c9cc;
  --ds-ink-muted:         #9d9da3;   /* 6.6:1 on surface                         */
  --ds-ink-faint:         #5e5e64;
  --ds-ink-inverse:       #111111;
  --ds-ink-on-primary:    #111111;
  --ds-ink-on-accent:     #0b0b0c;

  --ds-rule-soft:         #222226;
  --ds-rule-faint:        #1c1c1f;
  --ds-rule:              #2a2a2e;   /* 1.24:1 on surface                        */
  --ds-rule-strong:       #38383d;
  --ds-border:            #303035;
  --ds-border-strong:     #45454b;

  --ds-primary-fill:        #f4f4f5;
  --ds-primary-fill-hover:  #e2e2e4;
  --ds-accent:              #6b9cff;
  --ds-accent-hover:        #86adff;
  --ds-accent-ink:          #b9ccff;
  --ds-accent-tint:         #273043;
  --ds-accent-soft:         #3b5fb8;
  --ds-accent-2:            #a48cf5;
  --ds-accent-2-ink:        #c7b8fa;
  --ds-accent-2-tint:       #342f46;

  --ds-success: #34c57f;  --ds-success-tint: #1e3b2e;  --ds-success-ink: #5fd79b;
  --ds-danger:  #f26a6a;  --ds-danger-tint:  #44282a;  --ds-danger-ink:  #f58d8d;
  --ds-warning: #f2b04a;  --ds-warning-tint: #443624;  --ds-warning-ink: #f6c473;
  --ds-info:    #4fb3f0;  --ds-info-tint:    #233745;  --ds-info-ink:    #7ec8f5;
  --ds-ink-on-semantic: #0b0b0c;

  --ds-data-1: #6b9cff;  --ds-data-1-tint: #293248;  --ds-data-1-ink: #9dbcff;
  --ds-data-2: #a48cf5;  --ds-data-2-tint: #342f46;  --ds-data-2-ink: #c1b1f8;
  --ds-data-3: #3ecf95;  --ds-data-3-tint: #203d33;  --ds-data-3-ink: #6fdcb2;
  --ds-data-4: #f5915b;  --ds-data-4-tint: #443027;  --ds-data-4-ink: #f8ac84;
  --ds-data-5: #f06fa4;  --ds-data-5-tint: #432936;  --ds-data-5-ink: #f596bd;
  --ds-data-6: #e2c04e;  --ds-data-6-tint: #403a24;  --ds-data-6-ink: #ebd07e;
  --ds-data-7: #3fc7d4;  --ds-data-7-tint: #203b3f;  --ds-data-7-ink: #7cdae3;
  --ds-data-8: #c3a184;  --ds-data-8-tint: #3a332f;  --ds-data-8-ink: #d6bda8;
  --ds-chart-ramp-1: #b9ccff; --ds-chart-ramp-2: #6b9cff; --ds-chart-ramp-3: #3b5fb8;

  --ds-shadow-lift:   0 1px 2px rgba(0, 0, 0, .40);
  --ds-shadow-card:   0 1px 3px rgba(0, 0, 0, .50);
  --ds-shadow-float:  0 8px 24px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .06);
  --ds-shadow-modal:  0 24px 80px rgba(0, 0, 0, .65), 0 0 0 1px rgba(255, 255, 255, .06);
  --ds-shadow-object: 0 4px 12px rgba(0, 0, 0, .50);

  --ds-overlay-fill:   rgba(0, 0, 0, .65);
  --ds-glass-fill:     rgba(24, 24, 26, .55);
  --ds-glass-border:   rgba(255, 255, 255, .14);
  --ds-texture-color:  rgba(255, 255, 255, .06);
  --ds-illustration-ground: #1c2129;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-mode="light"]) {
    color-scheme: dark;
    --ds-ground: #0f0f10; --ds-ground-2: #141416; --ds-surface: #18181a; --ds-surface-2: #1f1f22;
    --ds-surface-3: #26262a; --ds-skeleton: #2e2e33; --ds-surface-raised: #1f1f22; --ds-surface-hover: #222226;
    --ds-surface-pressed: #26262a; --ds-surface-selected: #2a2a2e; --ds-surface-inverse: #fafafa; --ds-surface-inverse-hover: #e6e6e8; --ds-scrim: rgba(0, 0, 0, .60);
    --ds-ink: #f4f4f5; --ds-ink-2: #c9c9cc; --ds-ink-muted: #9d9da3; --ds-ink-faint: #5e5e64;
    --ds-ink-inverse: #111111; --ds-ink-on-primary: #111111; --ds-ink-on-accent: #0b0b0c;
    --ds-rule-soft: #222226; --ds-rule-faint: #1c1c1f; --ds-rule: #2a2a2e; --ds-rule-strong: #38383d; --ds-border: #303035; --ds-border-strong: #45454b;
    --ds-primary-fill: #f4f4f5; --ds-primary-fill-hover: #e2e2e4;
    --ds-accent: #6b9cff; --ds-accent-hover: #86adff; --ds-accent-ink: #b9ccff; --ds-accent-tint: #273043; --ds-accent-soft: #3b5fb8;
    --ds-accent-2: #a48cf5; --ds-accent-2-ink: #c7b8fa; --ds-accent-2-tint: #342f46;
    --ds-success: #34c57f; --ds-success-tint: #1e3b2e; --ds-success-ink: #5fd79b;
    --ds-danger: #f26a6a; --ds-danger-tint: #44282a; --ds-danger-ink: #f58d8d;
    --ds-warning: #f2b04a; --ds-warning-tint: #443624; --ds-warning-ink: #f6c473;
    --ds-info: #4fb3f0; --ds-info-tint: #233745; --ds-info-ink: #7ec8f5; --ds-ink-on-semantic: #0b0b0c;
    --ds-data-1: #6b9cff; --ds-data-1-tint: #293248; --ds-data-1-ink: #9dbcff;
    --ds-data-2: #a48cf5; --ds-data-2-tint: #342f46; --ds-data-2-ink: #c1b1f8;
    --ds-data-3: #3ecf95; --ds-data-3-tint: #203d33; --ds-data-3-ink: #6fdcb2;
    --ds-data-4: #f5915b; --ds-data-4-tint: #443027; --ds-data-4-ink: #f8ac84;
    --ds-data-5: #f06fa4; --ds-data-5-tint: #432936; --ds-data-5-ink: #f596bd;
    --ds-data-6: #e2c04e; --ds-data-6-tint: #403a24; --ds-data-6-ink: #ebd07e;
    --ds-data-7: #3fc7d4; --ds-data-7-tint: #203b3f; --ds-data-7-ink: #7cdae3;
    --ds-data-8: #c3a184; --ds-data-8-tint: #3a332f; --ds-data-8-ink: #d6bda8;
    --ds-chart-ramp-1: #b9ccff; --ds-chart-ramp-2: #6b9cff; --ds-chart-ramp-3: #3b5fb8;
    --ds-shadow-lift: 0 1px 2px rgba(0, 0, 0, .40); --ds-shadow-card: 0 1px 3px rgba(0, 0, 0, .50);
    --ds-shadow-float: 0 8px 24px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .06);
    --ds-shadow-modal: 0 24px 80px rgba(0, 0, 0, .65), 0 0 0 1px rgba(255, 255, 255, .06);
    --ds-shadow-object: 0 4px 12px rgba(0, 0, 0, .50);
    --ds-overlay-fill: rgba(0, 0, 0, .65); --ds-glass-fill: rgba(24, 24, 26, .55); --ds-glass-border: rgba(255, 255, 255, .14);
    --ds-texture-color: rgba(255, 255, 255, .06); --ds-illustration-ground: #1c2129;
  }
}

/* ---------------------------------------------------------------------------
   5. POLICY ATTRIBUTES — root (or any ancestor) data-* switches.
   Each sets the derived tokens components consume; components ALSO select on
   the attribute where geometry changes (tabs underline vs pill, etc.).
   Written at (0,2,0) so an explicit attribute beats a theme's CSS-only fallback.
   ------------------------------------------------------------------------- */

/* data-density — compact | default | comfortable  (D1 / D2 / D3) */
:root[data-density="compact"],     :not(:root)[data-density="compact"]     { --ds-density-scale: .85; }
:root[data-density="default"],     :not(:root)[data-density="default"]     { --ds-density-scale: 1; }
:root[data-density="comfortable"], :not(:root)[data-density="comfortable"] { --ds-density-scale: 1.2; }

/* data-depth — tint | hairline | shadow | tint-hairline | shadow-hairline  (§3.2.1; shadow-hairline = quicktunnels, batch-12) */
:root[data-depth="tint"],            :not(:root)[data-depth="tint"]            { --ds-card-bg: var(--ds-surface); --ds-card-border: transparent;   --ds-card-shadow: 0 0 0 0 transparent; }
:root[data-depth="hairline"],        :not(:root)[data-depth="hairline"]        { --ds-card-bg: var(--ds-ground);  --ds-card-border: var(--ds-rule); --ds-card-shadow: 0 0 0 0 transparent; }
:root[data-depth="shadow"],          :not(:root)[data-depth="shadow"]          { --ds-card-bg: var(--ds-surface); --ds-card-border: transparent;   --ds-card-shadow: var(--ds-shadow-card); }
:root[data-depth="tint-hairline"],   :not(:root)[data-depth="tint-hairline"]   { --ds-card-bg: var(--ds-surface); --ds-card-border: var(--ds-rule); --ds-card-shadow: 0 0 0 0 transparent; }
:root[data-depth="shadow-hairline"], :not(:root)[data-depth="shadow-hairline"] { --ds-card-bg: var(--ds-surface); --ds-card-border: var(--ds-rule); --ds-card-shadow: var(--ds-shadow-card); }

/* data-selection — tint | accent | accent-fill | underline | bar | invert  (§2.2.6; accent-fill = a brand theme's solid chip, batch-12) */
:root[data-selection="tint"],        :not(:root)[data-selection="tint"]        { --ds-selected-bg: var(--ds-surface-selected); --ds-selected-ink: var(--ds-ink);           --ds-selected-line: transparent;           --ds-selected-weight: var(--ds-weight-medium); }
:root[data-selection="accent"],      :not(:root)[data-selection="accent"]      { --ds-selected-bg: var(--ds-accent-tint);      --ds-selected-ink: var(--ds-accent-ink);    --ds-selected-line: transparent;           --ds-selected-weight: var(--ds-weight-medium); }
:root[data-selection="accent-fill"], :not(:root)[data-selection="accent-fill"] { --ds-selected-bg: var(--ds-accent);           --ds-selected-ink: var(--ds-ink-on-accent); --ds-selected-line: transparent;           --ds-selected-weight: var(--ds-weight-medium); }
:root[data-selection="underline"],   :not(:root)[data-selection="underline"]   { --ds-selected-bg: transparent;                --ds-selected-ink: var(--ds-ink);           --ds-selected-line: var(--ds-accent-line); --ds-selected-weight: var(--ds-weight-medium); }
:root[data-selection="bar"],         :not(:root)[data-selection="bar"]         { --ds-selected-bg: transparent;                --ds-selected-ink: var(--ds-ink);           --ds-selected-line: var(--ds-accent-line); --ds-selected-weight: var(--ds-weight-medium); }
:root[data-selection="invert"],      :not(:root)[data-selection="invert"]      { --ds-selected-bg: var(--ds-surface-inverse);  --ds-selected-ink: var(--ds-ink-inverse);   --ds-selected-line: transparent;           --ds-selected-weight: var(--ds-weight-medium); }

/* data-buttons — sm | pill  (§7.8 radius-button) */
:root[data-buttons="sm"],   :not(:root)[data-buttons="sm"]   { --ds-radius-button: var(--ds-radius-sm); }
:root[data-buttons="pill"], :not(:root)[data-buttons="pill"] { --ds-radius-button: var(--ds-radius-pill); }

/* data-labels — sentence | upper  (§7.9 label-case; upper implies tracking — the THEME's own value
   via --ds-label-tracking-upper, .08em in base; batch-12: the attribute no longer pins .08em over paper's .1em) */
:root[data-labels="sentence"], :not(:root)[data-labels="sentence"] { --ds-label-case: none;      --ds-label-tracking: 0; }
:root[data-labels="upper"],    :not(:root)[data-labels="upper"]    { --ds-label-case: uppercase; --ds-label-tracking: var(--ds-label-tracking-upper); }

/* data-controls — sentence | title  (§7.9 control-case) */
:root[data-controls="sentence"], :not(:root)[data-controls="sentence"] { --ds-control-case: none; }
:root[data-controls="title"],    :not(:root)[data-controls="title"]    { --ds-control-case: capitalize; }

/* data-accent-scope — state | action | all | none  (§7.4 policy).
   Only "none" changes CSS: links, rings and selection lines fall back to ink.
   state/action/all are enforced by review + the "one filled button" rule. With
   no attribute this file BEHAVES as "state": the primary above is ink-black and
   the accent is information only (links, rings, dots). A theme whose filled
   button is the hue declares "action" (workbench) or "all" (seeded,
   quicktunnels) in its header and sets --ds-primary-fill to the accent. */
:root[data-accent-scope="none"], :not(:root)[data-accent-scope="none"] {
  --ds-ink-link: var(--ds-ink); --ds-ring: var(--ds-ink); --ds-accent-line: var(--ds-ink);
  --ds-border-selected: var(--ds-ink); --ds-selection-graph: var(--ds-ink);
}

/* data-hover — tint | lift  (§7.11 hover-mode) */
:root[data-hover="tint"], :not(:root)[data-hover="tint"] { --ds-hover-bg: var(--ds-surface-hover); --ds-hover-shadow: 0 0 0 0 transparent; }
:root[data-hover="lift"], :not(:root)[data-hover="lift"] { --ds-hover-bg: var(--ds-surface);       --ds-hover-shadow: var(--ds-shadow-lift); }

/* data-ambient — off  (§7.11 ambient motion: marquee, blobs, parallax). One value: the page (or a
   region) parks its ambient animations. Reduced motion (§6) parks them too. The deprecated
   --ds-ambient-motion follows for anything that still reads it. (batch-12) */
:root[data-ambient="off"], :not(:root)[data-ambient="off"] { --ds-ambient-play: paused; --ds-ambient-motion: 0; }

/* ---- data-band — tint | dark | accent  (§7.1 islands; batch-12) --------------------------
   Section-level islands, defined here for EVERY theme; a theme may hand-tune its own at the
   same (0,2,0) — it loads later and wins (quicktunnels' accent band). Written as
   [data-band="v"][data-band] rather than :root[…], :not(:root)[…] on purpose: same (0,2,0),
   but a band never sits on the root (the root is where the accent band's snapshot is read
   from), so the :root form would be a lie. A band is a re-derive host (§3), so only planes and
   accent roles are set here; card-*, selected-*, hover-*, link / ring / lines follow. A theme's
   CSS-only fallbacks reach inside a band through the theme's own host rule (see any theme file,
   "restated for every host ISLAND").
   Put data-band on a <section> of its own — never on the root, never beside data-theme /
   data-mode on one element (a theme's island selector at the same specificity would win).
   data-band="dark" is NOT here: it is a selector on the dark remap (§4) and on every theme's
   dark block — one source of truth. */

/* tint — one plane step: the section sits on surface-2, its second plane on surface-3; cards
   (surface) and everything else keep the page's values. Available under any theme. */
[data-band="tint"][data-band] {
  --ds-ground:   var(--ds-surface-2);
  --ds-ground-2: var(--ds-surface-3);
  --ds-rule:     var(--ds-rule-strong);   /* one grade up: the structural hairline is 1.14:1 on surface-2 (R2 wants 1.15); card edges re-derive from it */
}

/* accent — the accent IS the ground. Generic recipe over the --ds-band-* snapshots (§3): holds
   for any hue and either ink polarity (white ink on a blue, dark ink on an orange / terracotta /
   white). Every plane steps AWAY from the ink (contrast can only rise — the theme's own
   ink-on-accent : accent pair, ≈ 5:1 on most brands, is the whole budget), so cards read as a
   deeper plane on a dark accent and a lighter one on a light accent; insets step further.
   Ink tiers collapse toward the ink (96 / 94 / 60 %) for the same reason — on a band, hierarchy
   is weight and size. Rules are the ink at 12 / 18 / 26 % over the accent. The ONE filled
   control inverts (ink fill, accent text); every accent role becomes the ink; semantic tints
   become a deeper accent step and semantic inks the ink, so a callout still reads; shadows
   soften to the ink at low alpha. Overlays (surface-raised, scrim) stay the page's — R6. */
[data-band="accent"][data-band] {
  /* planes */
  --ds-ground:                var(--ds-band-accent);
  --ds-ground-2:              color-mix(in srgb, var(--ds-band-accent) 96%, var(--ds-band-ink-away));
  --ds-surface:               color-mix(in srgb, var(--ds-band-accent) 90%, var(--ds-band-ink-away));
  --ds-surface-2:             color-mix(in srgb, var(--ds-band-accent) 84%, var(--ds-band-ink-away));
  --ds-surface-3:             color-mix(in srgb, var(--ds-band-accent) 76%, var(--ds-band-ink-away));
  --ds-surface-hover:         color-mix(in srgb, var(--ds-band-accent) 86%, var(--ds-band-ink-away));
  --ds-surface-pressed:       color-mix(in srgb, var(--ds-band-accent) 82%, var(--ds-band-ink-away));
  --ds-surface-selected:      color-mix(in srgb, var(--ds-band-accent) 76%, var(--ds-band-ink-away));
  --ds-skeleton:              color-mix(in srgb, var(--ds-band-accent) 86%, var(--ds-band-ink-away));
  --ds-surface-inverse:       var(--ds-band-ink);
  --ds-surface-inverse-hover: color-mix(in srgb, var(--ds-band-ink) 90%, var(--ds-band-accent));
  /* ink */
  --ds-ink:                   var(--ds-band-ink);
  --ds-ink-2:                 color-mix(in srgb, var(--ds-band-ink) 96%, var(--ds-band-accent));
  --ds-ink-muted:             color-mix(in srgb, var(--ds-band-ink) 94%, var(--ds-band-accent));
  --ds-ink-faint:             color-mix(in srgb, var(--ds-band-ink) 60%, var(--ds-band-accent));
  --ds-ink-inverse:           var(--ds-band-accent);
  --ds-ink-on-primary:        var(--ds-band-accent);
  --ds-ink-on-accent:         var(--ds-band-accent);
  /* lines: the ink over the accent at 8 / 12 / 18 / 26 %; borders 22 / 34 % */
  --ds-rule-faint:            color-mix(in srgb, var(--ds-band-ink)  8%, var(--ds-band-accent));
  --ds-rule-soft:             color-mix(in srgb, var(--ds-band-ink) 12%, var(--ds-band-accent));
  --ds-rule:                  color-mix(in srgb, var(--ds-band-ink) 18%, var(--ds-band-accent));
  --ds-rule-strong:           color-mix(in srgb, var(--ds-band-ink) 26%, var(--ds-band-accent));
  --ds-border:                color-mix(in srgb, var(--ds-band-ink) 22%, var(--ds-band-accent));
  --ds-border-strong:         color-mix(in srgb, var(--ds-band-ink) 34%, var(--ds-band-accent));
  /* action: the one filled control inverts; every accent role is the ink */
  --ds-primary-fill:          var(--ds-band-ink);
  --ds-primary-fill-hover:    color-mix(in srgb, var(--ds-band-ink) 88%, var(--ds-band-accent));
  --ds-primary-border:        transparent;
  --ds-primary-highlight:     transparent;
  --ds-accent:                var(--ds-band-ink);
  --ds-accent-hover:          color-mix(in srgb, var(--ds-band-ink) 88%, var(--ds-band-accent));
  --ds-accent-ink:            var(--ds-band-ink);
  --ds-accent-tint:           color-mix(in srgb, var(--ds-band-accent) 84%, var(--ds-band-ink-away));   /* chips: a deeper accent step, ink text */
  --ds-accent-soft:           color-mix(in srgb, var(--ds-band-ink) 45%, var(--ds-band-accent));
  --ds-ink-link:              var(--ds-band-ink);
  --ds-ring:                  var(--ds-band-ink);
  --ds-border-selected:       var(--ds-band-ink);
  --ds-accent-line:           var(--ds-band-ink);
  --ds-selection-graph:       var(--ds-band-ink);
  /* semantic on the band: tint = a deeper accent step, ink = the ink, line = the ink at 35 % (fills keep their hue for dots / badges) */
  --ds-success-tint:          var(--ds-accent-tint);  --ds-success-ink: var(--ds-band-ink);  --ds-success-line: color-mix(in srgb, var(--ds-band-ink) 35%, transparent);
  --ds-danger-tint:           var(--ds-accent-tint);  --ds-danger-ink:  var(--ds-band-ink);  --ds-danger-line:  color-mix(in srgb, var(--ds-band-ink) 35%, transparent);
  --ds-warning-tint:          var(--ds-accent-tint);  --ds-warning-ink: var(--ds-band-ink);  --ds-warning-line: color-mix(in srgb, var(--ds-band-ink) 35%, transparent);
  --ds-info-tint:             var(--ds-accent-tint);  --ds-info-ink:    var(--ds-band-ink);  --ds-info-line:    color-mix(in srgb, var(--ds-band-ink) 35%, transparent);
  /* depth + imagery: the ink at low alpha */
  --ds-shadow-lift:           0 1px 2px  color-mix(in srgb, var(--ds-band-ink) 10%, transparent);
  --ds-shadow-card:           0 1px 3px  color-mix(in srgb, var(--ds-band-ink) 12%, transparent);
  --ds-shadow-float:          0 8px 24px color-mix(in srgb, var(--ds-band-ink) 25%, transparent), 0 0 0 1px color-mix(in srgb, var(--ds-band-ink) 12%, transparent);
  --ds-shadow-modal:          0 24px 80px color-mix(in srgb, var(--ds-band-ink) 35%, transparent), 0 0 0 1px color-mix(in srgb, var(--ds-band-ink) 12%, transparent);
  --ds-shadow-object:         0 4px 12px color-mix(in srgb, var(--ds-band-ink) 25%, transparent);
  --ds-illustration-ground:   var(--ds-accent-tint);
  --ds-texture-color:         color-mix(in srgb, var(--ds-band-ink) 10%, transparent);
  --ds-glass-fill:            color-mix(in srgb, var(--ds-band-ink) 10%, transparent);
  --ds-glass-border:          color-mix(in srgb, var(--ds-band-ink) 20%, transparent);
}

/* data-texture / data-ornament / data-illustration / data-emoji / data-avatar
   are DESCRIPTIVE — no tokens change; patterns select on them
   (e.g. [data-texture="dot"] .ds-hero::before). See CONTRACT.md §3. */

/* ---------------------------------------------------------------------------
   6. REDUCED MOTION — durations collapse to 0 through --ds-motion-scale.
   ------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  :root,
  [data-theme], [data-mode], [data-density], [data-depth], [data-selection],
  [data-buttons], [data-labels], [data-controls], [data-accent-scope], [data-hover],
  [data-band] {
    --ds-motion-scale: 0;
    --ds-ambient-play: paused;
    --ds-ambient-motion: 0;   /* deprecated alias — see §2 */
  }
}

/* ds/theme-dishesof.css */
/* ============================================================================
   Theme: dishesof — "Dishes of London" (round 2: Jack's combination, 2026-10-21).
   data-theme="dishesof"
   Candidate theme from the london-menus design loop — not yet adopted by a product.
   Merges the three round-1 directions into one site:

   LIGHT is dishesof-index's daylight: a bright white ground, ink-black text,
   rules like a timetable and ONE food colour, tomato. Tomato fills the primary
   button (accent-scope action), the index letter marks and the focus ring.
   DARK is dishesof-nowserving's night with a SAFFRON accent (Jack picked it over coral, 2026-10-21): deep blue-plum surfaces (Jack: "the blue
   from now serving works best"), with the tomato lifted until it reads on them.
   The same night is used as a data-mode="dark" island for the home map panel in
   light mode, so the city map is always seen at night.

   MAP "SERVING" COLOUR: raspberry, carried over from nowserving as --ds-data-5
   (a data hue, so it only appears in the map and its scrubber, never as an
   action or a state). Tomato ~12 deg, raspberry ~340 deg.

   The three trust states read the SEMANTIC tokens only:
     Confirmed by the venue        success  (bottle green)
     Read from the website         info     (steel / canal blue)
     May be out of date            warning  (ochre; ink text on tint)
   Danger is never used for trust.

   Type: Archivo (display, variable width, set condensed), Albert Sans (body +
   UI), JetBrains Mono (prices, times, counts, dates). Taken over from
   dishesof-index, which this theme replaces; the round-1 option themes stay as
   they are for the record.

   PAGE ATTRIBUTES this theme expects:
     data-theme="dishesof" data-depth="hairline" data-selection="underline"
     data-buttons="sm" data-labels="sentence" data-controls="sentence"
     data-accent-scope="action" data-hover="tint" data-density="default"
     data-illustration="none" data-texture="none" data-ornament="none"
   Differences from base: radius scale .4, display line-height .92, heavy
   condensed display, a 16 px reading base, mono label lane.
   Sets ONLY what differs from base.css.
   ========================================================================== */

[data-theme="dishesof"],
[data-theme="dishesof"] [data-mode="light"] {
  /* -- surfaces: bright newsprint, white sheets, cool-neutral insets */
  --ds-ground:            #ffffff;
  --ds-ground-2:          #f3f3f1;
  --ds-surface:           #ffffff;
  --ds-surface-2:         #f4f4f2;
  --ds-surface-3:         #e8e8e5;
  --ds-surface-raised:    #ffffff;
  --ds-surface-hover:     #f6f6f4;
  --ds-surface-pressed:   #ecece9;
  --ds-surface-selected:  #e2e2de;
  --ds-surface-inverse:   #14110f;
  --ds-scrim:             rgba(20, 17, 15, .45);

  /* -- ink: jet, slightly warm */
  --ds-ink:               #14110f;
  --ds-ink-2:             #37322e;
  --ds-ink-muted:         #5c5750;
  --ds-ink-faint:         #a39e96;
  --ds-ink-inverse:       #ffffff;
  --ds-ink-on-primary:    #ffffff;
  --ds-ink-on-accent:     #ffffff;
  --ds-ink-code:          #37322e;

  /* -- lines */
  --ds-rule-soft:         #ebebe8;
  --ds-rule:              #dcdbd6;
  --ds-rule-strong:       #b0aea7;
  --ds-border:            #cbc9c3;
  --ds-border-strong:     #85827a;

  /* -- action: tomato primary + accent (buttons, index marks, links, ring) */
  --ds-primary-fill:        #c42e12;
  --ds-primary-fill-hover:  #a3240d;
  --ds-accent:              #c42e12;
  --ds-accent-hover:        #a3240d;
  --ds-accent-ink:          #a3240d;
  --ds-ink-link:            #b02a10;
  --ds-ring:                #c42e12;
  --ds-accent-tint:         #fde9e4;
  --ds-accent-soft:         #f1a898;
  --ds-accent-2:            #14110f;
  --ds-accent-2-ink:        #37322e;
  --ds-accent-2-tint:       #f3f3f1;

  /* -- semantics: the trust states */
  --ds-success: #1a7a3e;  --ds-success-tint: #e0f1e6;  --ds-success-ink: #125a2d;
  --ds-warning: #a86400;  --ds-warning-tint: #faeed3;  --ds-warning-ink: #6f4200;
  --ds-danger:  #b42a1c;  --ds-danger-tint:  #fbe4e0;  --ds-danger-ink:  #8f1f13;
  --ds-info:    #1f5fa8;  --ds-info-tint:    #e2ecf8;  --ds-info-ink:    #174a85;

  /* -- data hues: the map's times of day (sky wash) and raspberry "serving" (data-5) */
  --ds-data-1: #2f5fd0;  --ds-data-1-tint: #e3eafb;  --ds-data-1-ink: #2449a3;
  --ds-data-2: #6d4fd6;  --ds-data-2-tint: #ece7fb;  --ds-data-2-ink: #5639b5;
  --ds-data-3: #0b8659;
  --ds-data-4: #c25a2a;  --ds-data-4-tint: #fbe9df;  --ds-data-4-ink: #9a4519;
  --ds-data-5: #d1185f;  --ds-data-5-tint: #fce4ee;  --ds-data-5-ink: #a50e4a;
  --ds-data-6: #8f6f14;  --ds-data-6-tint: #f8f0d8;  --ds-data-6-ink: #6e5510;
  --ds-data-7: #0b8591;

  --ds-texture-color: rgba(20, 17, 15, .05);

  --ds-shadow-card:   0 1px 0 rgba(20, 17, 15, .06);
  --ds-shadow-float:  0 12px 32px rgba(20, 17, 15, .12), 0 0 0 1px rgba(20, 17, 15, .06);
  --ds-shadow-modal:  0 24px 72px rgba(20, 17, 15, .18), 0 0 0 1px rgba(20, 17, 15, .06);

  /* -- type + shape */
  --ds-radius-scale:  .4;
  --ds-font-sans:     "Albert Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  --ds-font-display:  "Archivo", "Albert Sans", ui-sans-serif, system-ui, sans-serif;
  --ds-font-mono:     "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --ds-font-serif:    var(--ds-font-sans);
  --ds-font-label:    var(--ds-font-mono);
  --ds-font-body-alt: var(--ds-font-sans);
  --ds-text-base:     16px;
  --ds-display-weight:   700;
  --ds-display-tracking: -0.01em;
  --ds-heading-weight:   700;
  --ds-heading-tracking: -0.02em;
  --ds-lh-tight:         .92;
  --ds-label-tracking-upper: .06em;
  --ds-container-max:    1240px;
  --ds-media-radius:     var(--ds-radius-sm);
  --ds-card-border:      var(--ds-rule);
}

/* -- island fallbacks: hosts re-derive link/ring/card border; restate them so
   bands and the night map island keep the tomato link, ring and hairline card. */
:where([data-theme="dishesof"]) :is([data-mode], [data-density], [data-depth], [data-selection], [data-buttons],
      [data-labels], [data-controls], [data-accent-scope], [data-hover], [data-band="tint"]) {
  --ds-ink-link: var(--ds-accent-ink);
  --ds-ring:     var(--ds-accent);
  --ds-card-border: var(--ds-rule);
}

[data-theme="dishesof"][data-mode="dark"],
[data-theme="dishesof"] [data-mode="dark"],
[data-theme="dishesof"] [data-band="dark"] {
  --ds-ground: #110e1b; --ds-ground-2: #17132a; --ds-surface: #1b1730; --ds-surface-2: #241f3c; --ds-surface-3: #2e2848;
  --ds-surface-raised: #241f3c; --ds-surface-hover: #221d38; --ds-surface-pressed: #2a2443; --ds-surface-selected: #342d52;
  --ds-surface-inverse: #f3f0fa;
  --ds-scrim: rgba(5, 3, 12, .64);
  --ds-ink: #f3f0fa; --ds-ink-2: #d4cfe4; --ds-ink-muted: #a59fbe; --ds-ink-faint: #6a6386; --ds-ink-inverse: #1b1628;
  --ds-ink-on-primary: #1b1205; --ds-ink-on-accent: #1b1205; --ds-ink-code: #d4cfe4;
  --ds-rule-soft: #221d38; --ds-rule: #322b4c; --ds-rule-strong: #4d4569; --ds-border: #3c3558; --ds-border-strong: #6e6690;
  --ds-primary-fill: #ffb23e; --ds-primary-fill-hover: #ffc466;
  --ds-accent: #ffb23e; --ds-accent-hover: #ffc466; --ds-accent-ink: #ffc870; --ds-ink-link: #ffc870; --ds-ring: #ffb23e;
  --ds-accent-tint: #3a2c14; --ds-accent-soft: #8a6020;
  --ds-accent-2: #f3f0fa; --ds-accent-2-ink: #d4cfe4; --ds-accent-2-tint: #241f3c;
  --ds-success: #4cc483; --ds-success-tint: #15301f; --ds-success-ink: #87dcab;
  --ds-warning: #e6b04a; --ds-warning-tint: #382b12; --ds-warning-ink: #f2cc80;
  --ds-danger:  #f07a6e; --ds-danger-tint:  #3d1c1a; --ds-danger-ink:  #f6a69c;
  --ds-info:    #6fa8e6; --ds-info-tint:    #182a40; --ds-info-ink:    #a5c8f0;
  --ds-data-1: #7c9cff; --ds-data-1-tint: #232b4f; --ds-data-1-ink: #a8bcff;
  --ds-data-2: #a48cf5; --ds-data-2-tint: #2f2850; --ds-data-2-ink: #c7b8fa;
  --ds-data-3: #3ecf95;
  --ds-data-4: #f5915b; --ds-data-4-tint: #3f2a24; --ds-data-4-ink: #f8ac84;
  --ds-data-5: #ff5c97; --ds-data-5-tint: #3e1530; --ds-data-5-ink: #ff94bb;
  --ds-data-6: #e2c04e; --ds-data-6-tint: #3b3424; --ds-data-6-ink: #ebd07e;
  --ds-data-7: #3fc7d4;
  --ds-texture-color: rgba(243, 240, 250, .08);
  --ds-shadow-card: 0 0 0 1px rgba(255, 255, 255, .04);
  --ds-shadow-float: 0 14px 36px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .06);
  --ds-shadow-modal: 0 24px 72px rgba(0, 0, 0, .65), 0 0 0 1px rgba(255, 255, 255, .06);
}

@media (prefers-color-scheme: dark) {
  :root[data-theme="dishesof"]:not([data-mode="light"]),
  :root:not([data-mode="light"]) [data-theme="dishesof"]:not([data-mode="light"]) {
    --ds-ground: #110e1b; --ds-ground-2: #17132a; --ds-surface: #1b1730; --ds-surface-2: #241f3c; --ds-surface-3: #2e2848;
    --ds-surface-raised: #241f3c; --ds-surface-hover: #221d38; --ds-surface-pressed: #2a2443; --ds-surface-selected: #342d52;
    --ds-surface-inverse: #f3f0fa;
    --ds-scrim: rgba(5, 3, 12, .64);
    --ds-ink: #f3f0fa; --ds-ink-2: #d4cfe4; --ds-ink-muted: #a59fbe; --ds-ink-faint: #6a6386; --ds-ink-inverse: #1b1628;
    --ds-ink-on-primary: #1b1205; --ds-ink-on-accent: #1b1205; --ds-ink-code: #d4cfe4;
    --ds-rule-soft: #221d38; --ds-rule: #322b4c; --ds-rule-strong: #4d4569; --ds-border: #3c3558; --ds-border-strong: #6e6690;
    --ds-primary-fill: #ffb23e; --ds-primary-fill-hover: #ffc466;
    --ds-accent: #ffb23e; --ds-accent-hover: #ffc466; --ds-accent-ink: #ffc870; --ds-ink-link: #ffc870; --ds-ring: #ffb23e;
    --ds-accent-tint: #3a2c14; --ds-accent-soft: #8a6020;
    --ds-accent-2: #f3f0fa; --ds-accent-2-ink: #d4cfe4; --ds-accent-2-tint: #241f3c;
    --ds-success: #4cc483; --ds-success-tint: #15301f; --ds-success-ink: #87dcab;
    --ds-warning: #e6b04a; --ds-warning-tint: #382b12; --ds-warning-ink: #f2cc80;
    --ds-danger:  #f07a6e; --ds-danger-tint:  #3d1c1a; --ds-danger-ink:  #f6a69c;
    --ds-info:    #6fa8e6; --ds-info-tint:    #182a40; --ds-info-ink:    #a5c8f0;
    --ds-data-1: #7c9cff; --ds-data-1-tint: #232b4f; --ds-data-1-ink: #a8bcff;
    --ds-data-2: #a48cf5; --ds-data-2-tint: #2f2850; --ds-data-2-ink: #c7b8fa;
    --ds-data-3: #3ecf95;
    --ds-data-4: #f5915b; --ds-data-4-tint: #3f2a24; --ds-data-4-ink: #f8ac84;
    --ds-data-5: #ff5c97; --ds-data-5-tint: #3e1530; --ds-data-5-ink: #ff94bb;
    --ds-data-6: #e2c04e; --ds-data-6-tint: #3b3424; --ds-data-6-ink: #ebd07e;
    --ds-data-7: #3fc7d4;
    --ds-texture-color: rgba(243, 240, 250, .08);
    --ds-shadow-card: 0 0 0 1px rgba(255, 255, 255, .04);
    --ds-shadow-float: 0 14px 36px rgba(0, 0, 0, .55), 0 0 0 1px rgba(255, 255, 255, .06);
    --ds-shadow-modal: 0 24px 72px rgba(0, 0, 0, .65), 0 0 0 1px rgba(255, 255, 255, .06);
  }
}

/* ds/_base.css */
/* ============================================================================
   JSTOV design system — components/_base.css
   The shared layer every component file assumes. Loads AFTER tokens/base.css
   (+ an optional theme) and BEFORE any components/<id>/<id>.css.

   Contents
     1. Reset (minimal)                    5. Universal focus ring
     2. Body ground / ink / font           6. Hairline grades
     3. Type lanes (.ds-display … .ds-mono) 7. Layout helpers (.ds-stack/.ds-row/.ds-grid/.ds-container)
     4. Control-height + data-size hooks   8. .ds-demo wrapper, .ds-sr-only, reduced motion

   Only --ds-* tokens for colour, radius, shadow, family, control height and
   spacing (tools/lint-tokens.mjs enforces it). This file is the ONE component
   file allowed to (re)declare --ds-size-* hooks.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   1. RESET — the minimum that makes components predictable
   ------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; tab-size: 4; }
body, h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd, ul, ol, pre, fieldset, legend { margin: 0; }
ul, ol { padding: 0; }
ul[class], ol[class] { list-style: none; }
fieldset { padding: 0; border: 0; min-width: 0; }
legend { padding: 0; }
img, svg, video, canvas, picture { display: block; max-width: 100%; height: auto; }
svg { fill: currentColor; }
button, input, select, textarea, optgroup {
  font: inherit;            /* controls inherit family, size, weight, lh    */
  color: inherit;
  letter-spacing: inherit;
  margin: 0;
}
button, [role="button"], summary { cursor: pointer; }
button:disabled, [aria-disabled="true"] { cursor: not-allowed; }
textarea { resize: vertical; }
a { color: var(--ds-ink-link); text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); text-underline-offset: .15em; }
a:hover { text-decoration-color: currentColor; }
hr { border: 0; height: 0; }
table { border-collapse: collapse; border-spacing: 0; }
:where(th) { text-align: inherit; font-weight: inherit; }
code, kbd, samp, pre { font-family: var(--ds-font-mono); font-size: .93em; }
::placeholder { color: var(--ds-ink-muted); opacity: 1; }
::selection { background: var(--ds-accent-tint); color: var(--ds-ink); }
[hidden] { display: none !important; }

/* ---------------------------------------------------------------------------
   2. BODY — ground, ink, family, line-height, numerals
   ------------------------------------------------------------------------- */
body {
  background: var(--ds-ground);
  color: var(--ds-ink);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
  font-weight: var(--ds-weight-regular);
  font-variant-numeric: var(--ds-numeric);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  min-height: 100dvh;
  overflow-x: clip;   /* the mobile rule: a page never scrolls sideways */
}
/* a themed island paints its own ground so the theme boundary is visible */
[data-theme]:not(:root), [data-mode]:not(:root) { background: var(--ds-ground); color: var(--ds-ink); }

/* ---------------------------------------------------------------------------
   3. TYPE LANES — hierarchy by weight + ink at one or two sizes (T1);
      display and metadata are the only lanes that change family.
   ------------------------------------------------------------------------- */
.ds-display {
  font-family: var(--ds-font-display);
  font-size: var(--ds-text-display);
  font-weight: var(--ds-display-weight);
  letter-spacing: var(--ds-display-tracking);
  line-height: var(--ds-lh-tight);
  text-wrap: balance;
}
.ds-h1, .ds-h2, .ds-h3, .ds-h4 {
  font-weight: var(--ds-heading-weight);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink);
  text-wrap: balance;
}
.ds-h1 { font-size: var(--ds-text-2xl); }   /* 24 @14 · 27 @16 — the "title" jump   */
.ds-h2 { font-size: var(--ds-text-xl); }    /* 20 · 23                               */
.ds-h3 { font-size: var(--ds-text-lg); }    /* 16 · 18                               */
.ds-h4 { font-size: var(--ds-text-md); }    /* body size, semibold — a group title  */
.ds-h1 { letter-spacing: var(--ds-display-tracking); }

.ds-body    { font-size: var(--ds-text-md); line-height: var(--ds-lh-body); font-weight: var(--ds-weight-regular); }
.ds-body-sm { font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); }
.ds-body-lg { font-size: var(--ds-text-lg); line-height: var(--ds-lh-prose); }

/* label lane: family + case + tracking are theme knobs */
.ds-label {
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--ds-ink-muted);
}
/* marketing eyebrow: ALWAYS uppercase mono-ish, regardless of data-labels (house rule) */
.ds-eyebrow {
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
}
/* mono lane: metadata, IDs, timestamps, code, tabular numbers */
.ds-mono {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-code);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
}
.ds-numeric { font-variant-numeric: tabular-nums; }

/* prose: the reading measure; body-alt family (serif in paper) */
.ds-prose {
  font-family: var(--ds-font-body-alt);
  font-size: var(--ds-text-lg);
  line-height: var(--ds-lh-prose);
  max-width: var(--ds-measure);
  color: var(--ds-ink-2);
}
.ds-prose > * + * { margin-block-start: 1em; }
.ds-prose :is(h1, h2, h3, h4) { font-family: var(--ds-font-sans); color: var(--ds-ink); line-height: var(--ds-lh-heading); }
.ds-prose a { color: var(--ds-ink-link); }
.ds-prose :is(ul, ol) { padding-inline-start: 1.4em; }
.ds-prose ul { list-style: disc; }
.ds-prose ol { list-style: decimal; }
.ds-quote { font-family: var(--ds-font-body-alt); font-style: italic; font-size: var(--ds-text-lg); line-height: var(--ds-lh-prose); }

/* two-tone heading / lead: first clause ink, tail muted — inside ONE element.
   <h2 class="ds-h1 ds-two-tone">Ship the plan. <span class="ds-muted">Then measure it.</span></h2> */
.ds-two-tone { color: var(--ds-ink); }
.ds-two-tone .ds-muted { color: var(--ds-ink-muted); font-weight: inherit; }

/* ink utilities */
.ds-ink       { color: var(--ds-ink); }
.ds-ink-2     { color: var(--ds-ink-2); }
.ds-muted     { color: var(--ds-ink-muted); }     /* readable secondary */
.ds-faint     { color: var(--ds-ink-faint); }     /* decorative only — never content */
.ds-strong    { font-weight: var(--ds-weight-semibold); }
.ds-medium    { font-weight: var(--ds-weight-medium); }
.ds-truncate  { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-tnum      { font-variant-numeric: tabular-nums; }

/* ---------------------------------------------------------------------------
   4. CONTROL HEIGHT + data-size HOOKS
      Components read --ds-size-h / --ds-size-text / --ds-size-pad-x instead
      of --ds-control-h so data-size on the element (or an ancestor toolbar)
      steps the whole family together: sm = h−4 · md = h · lg = h+8.
   ------------------------------------------------------------------------- */
[data-size="sm"] { --ds-size-h: var(--ds-control-h-sm); --ds-size-text: var(--ds-text-sm); --ds-size-pad-x: calc(var(--ds-control-pad-x) - 2px); }
[data-size="md"] { --ds-size-h: var(--ds-control-h);    --ds-size-text: var(--ds-text-md); --ds-size-pad-x: var(--ds-control-pad-x); }
[data-size="lg"] { --ds-size-h: var(--ds-control-h-lg); --ds-size-text: var(--ds-text-lg); --ds-size-pad-x: calc(var(--ds-control-pad-x) + 4px); }

/* the generic control box every input / button / select / chip starts from */
.ds-control {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-size-h);
  padding-inline: var(--ds-size-pad-x);
  font-size: var(--ds-size-text);
  line-height: var(--ds-lh-list);
  border-radius: var(--ds-radius-sm);
  border: var(--ds-border-width) solid var(--ds-border);
  background: var(--ds-surface);
  color: var(--ds-ink);
  text-transform: var(--ds-control-case);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-control:hover { border-color: var(--ds-border-strong); }
.ds-control:disabled, .ds-control[aria-disabled="true"] { color: var(--ds-ink-faint); background: var(--ds-surface-3); border-color: var(--ds-rule); }

/* ---------------------------------------------------------------------------
   5. UNIVERSAL FOCUS RING — --ds-ring at --ds-ring-width, offset, everywhere.
      No reference showed one (0 of 51); the contract defines it.
   ------------------------------------------------------------------------- */
:focus-visible {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
  border-radius: inherit;
}
:focus:not(:focus-visible) { outline: none; }
/* inputs draw the ring INSIDE their box (offset 0) so toolbars stay aligned */
:is(input, textarea, select, .ds-control):focus-visible { outline-offset: calc(-1 * var(--ds-border-width)); }
/* ring-outset: draw the highlight OUTSIDE the box when the theme asks (Jasper) */
[data-ring="outset"]:focus-visible { outline-offset: var(--ds-ring-outset); }

/* ---------------------------------------------------------------------------
   6. HAIRLINES — three grades. <hr class="ds-hairline"> or as a block edge.
   ------------------------------------------------------------------------- */
.ds-hairline          { border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-hairline--soft    { border-block-start-color: var(--ds-rule-soft); }
.ds-hairline--strong  { border-block-start-color: var(--ds-rule-strong); }
.ds-hairline--dashed  { border-block-start-style: dashed; }   /* empty slot / optional */
.ds-hairline--dotted  { border-block-start-style: dotted; }   /* editable inline setting */
hr.ds-hairline        { width: 100%; }
.ds-hairline-v        { border-inline-start: var(--ds-border-width) solid var(--ds-rule); align-self: stretch; }

/* ---------------------------------------------------------------------------
   7. LAYOUT HELPERS — gaps from the space scale; override per instance with
      style="--_gap: var(--ds-space-8)" (private --_ props are allowed inline).
   ------------------------------------------------------------------------- */
.ds-stack { display: flex; flex-direction: column; gap: var(--_gap, var(--ds-space-4)); }
.ds-row   { display: flex; flex-wrap: wrap; align-items: center; gap: var(--_gap, var(--ds-space-2)); }
.ds-row--between { justify-content: space-between; }
.ds-row--end     { justify-content: flex-end; }
.ds-row--nowrap  { flex-wrap: nowrap; }
.ds-grid  {
  display: grid;
  gap: var(--_gap, var(--ds-card-gap));
  grid-template-columns: repeat(auto-fit, minmax(min(var(--_min, 240px), 100%), 1fr));
}
.ds-grid[data-cols="2"] { --_min: 320px; }
.ds-grid[data-cols="3"] { --_min: 240px; }
.ds-grid[data-cols="4"] { --_min: 200px; }
.ds-spacer { flex: 1 1 auto; }

.ds-container {
  width: 100%;
  max-width: var(--ds-container-max);
  margin-inline: auto;
  padding-inline: var(--ds-gutter-page);
}
.ds-container--narrow { max-width: var(--ds-container-narrow); }
.ds-container--prose  { max-width: var(--ds-container-prose); }

/* app content column (C-03): centred, max-width ALWAYS set (--ds-container-content, theme-tunable), page gutters */
.ds-content { width: 100%; max-width: var(--ds-container-content); margin-inline: auto; padding-inline: var(--ds-gutter-page); }

/* card surface derived from data-depth (tint / hairline / shadow / tint-hairline) */
.ds-surface {
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
  border-radius: var(--ds-radius-md);
}
.ds-well { background: var(--ds-surface-2); border-radius: var(--ds-radius-md); }   /* inset tint */

/* ---------------------------------------------------------------------------
   8. DEMO WRAPPER, SR-ONLY, REDUCED MOTION
   ------------------------------------------------------------------------- */
/* <section class="ds-demo" data-component="button" data-variant="vercel-ink" data-title="…">
   The showcase generator concatenates these; the title is drawn from data-title. */
.ds-demo {
  padding: var(--ds-space-6) var(--ds-gutter-page);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-4);
  min-width: 0;
}
.ds-demo::before {
  content: attr(data-component) " · " attr(data-variant) " — " attr(data-title);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  color: var(--ds-ink-muted);
  letter-spacing: 0;
  text-transform: none;
}
.ds-demo[data-title=""]::before, .ds-demo:not([data-title])::before { content: attr(data-component) " · " attr(data-variant); }
.ds-demo > * { min-width: 0; }
.ds-demo__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-3); }
.ds-demo__note { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); max-width: var(--ds-measure); }

.ds-sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); clip-path: inset(50%);
  white-space: nowrap; border: 0;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ---- section rhythm (2026-09-20, from the Cloudflare recreation) ----------------------------------
   Every recipe pads --ds-section-gap on both sides, so two adjacent PLAIN sections would stack two gaps
   (the recreation ran 13 % taller than the page). Plain-after-plain drops its top padding: the gap between
   two sections is one --ds-section-gap. Bands (a data-mode or data-band island paints its own ground) keep
   both paddings, and a plain section after a band keeps its top padding, so content never touches a band edge. */
.ds-sec:not([data-mode]):not([data-band]) + .ds-sec:not([data-mode]):not([data-band]) { padding-block-start: 0; }

/* ---- .ds-accent-word — the last word (or a term) in the accent, inside a heading or a paragraph.
   Five recipes defined this scoped; promoted to a base utility (2026-09-20). Rationed like any accent. */
.ds-accent-word { color: var(--ds-accent); }

/* ds/components/checkbox.css */
/* ============================================================================
   components/checkbox/checkbox.css
   Value-collecting boolean (submitted later; a switch commits now). The
   <input type="checkbox"> IS the box (appearance:none); ::before draws the
   tick (a rotated L), ::after the indeterminate bar. Root <label> holds text.

   Private knobs:
     --_size            box edge (16 / 18 / 20 / 22 in the corpus)
     --_radius          box radius (xs = 4×scale default; sm for manychat)
     --_border-w        1px hairline or 2px (origin, manychat)
     --_border / --_fill / --_on-fill / --_on-ink / --_mixed-ink
   ========================================================================== */

.ds-checkbox {
  --_size: 18px;
  --_radius: var(--ds-radius-xs);
  --_border-w: var(--ds-border-width);
  --_border:   var(--ds-border);
  --_fill:     var(--ds-surface);
  --_on-fill:  var(--ds-accent);           /* boolean-on = the accent's job [manychat-web-126] */
  --_on-ink:   var(--ds-ink-on-accent);    /* the pair for an accent fill                      */
  --_mixed-ink: var(--ds-ink);             /* indeterminate = ink bar on the rest fill         */
  --_stroke: 2px;

  display: inline-flex;
  align-items: flex-start;
  gap: var(--ds-space-2);
  font-size: var(--ds-size-text);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  max-width: 100%;
  min-width: 0;
}
/* label first, box flush right (row-of-settings grammar) */
.ds-checkbox[data-label="start"] { flex-direction: row-reverse; justify-content: space-between; width: 100%; }

/* sizes — default (unmarked) follows data-size and density; fidelity variants pin --_size */
.ds-checkbox[data-size="sm"] { --_size: 16px; --_stroke: 1.5px; }
.ds-checkbox[data-size="lg"] { --_size: 20px; }
[data-density="compact"]     .ds-checkbox:not([data-size]):not([data-variant]) { --_size: 16px; --_stroke: 1.5px; }
[data-density="comfortable"] .ds-checkbox:not([data-size]):not([data-variant]) { --_size: 20px; }

/* ---- the box (the input itself) ------------------------------------------ */
.ds-checkbox__input {
  appearance: none;
  -webkit-appearance: none;
  flex: none;
  display: inline-grid;
  place-items: center;
  margin: 0;
  /* centre the box on the first text line */
  margin-block-start: calc((var(--ds-size-text) * var(--ds-lh-list) - var(--_size)) / 2);
  inline-size: var(--_size);
  block-size: var(--_size);
  border-radius: var(--_radius);
  border: var(--_border-w) solid var(--_border);
  background: var(--_fill);
  color: var(--_on-ink);
  cursor: inherit;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color     var(--ds-dur-fast) var(--ds-ease-standard);
}
/* tick — an L rotated 45°, drawn with the current colour */
.ds-checkbox__input::before {
  content: "";
  grid-area: 1 / 1;
  inline-size: calc(var(--_size) * .28);
  block-size:  calc(var(--_size) * .52);
  border-inline-end: var(--_stroke) solid currentColor;
  border-block-end:  var(--_stroke) solid currentColor;
  rotate: 45deg;
  translate: 0 -12%;
  opacity: 0;
  transition: opacity var(--ds-dur-fast) var(--ds-ease-standard);
}
/* indeterminate bar */
.ds-checkbox__input::after {
  content: "";
  grid-area: 1 / 1;
  inline-size: calc(var(--_size) * .5);
  block-size: var(--_stroke);
  background: currentColor;
  opacity: 0;
  transition: opacity var(--ds-dur-fast) var(--ds-ease-standard);
}

/* ---- states -------------------------------------------------------------- */
.ds-checkbox__input:checked {
  background: var(--_on-fill);
  border-color: var(--_on-fill);
  color: var(--_on-ink);
}
.ds-checkbox__input:checked::before { opacity: 1; }
/* indeterminate: rest fill, ink bar [manychat-web-126, navattic-web-153] */
.ds-checkbox__input:indeterminate,
.ds-checkbox__input[aria-checked="mixed"] {
  background: var(--_fill);
  border-color: var(--_border);
  color: var(--_mixed-ink);
}
.ds-checkbox__input:indeterminate::before, .ds-checkbox__input[aria-checked="mixed"]::before { opacity: 0; }
.ds-checkbox__input:indeterminate::after,  .ds-checkbox__input[aria-checked="mixed"]::after  { opacity: 1; }
/* hover — one grade: border → border-strong; checked fill → accent-hover */
.ds-checkbox:hover .ds-checkbox__input:not(:disabled):not(:checked),
.ds-checkbox[data-state="hover"] .ds-checkbox__input:not(:disabled):not(:checked) { border-color: var(--ds-border-strong); }
.ds-checkbox:hover .ds-checkbox__input:not(:disabled):checked:not(:indeterminate),
.ds-checkbox[data-state="hover"] .ds-checkbox__input:not(:disabled):checked:not(:indeterminate) { background: var(--ds-accent-hover); border-color: var(--ds-accent-hover); }
/* focus-visible — ring OUTSIDE the box (the _base input rule pulls it inside) */
.ds-checkbox__input:focus-visible {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
}
/* pressed */
.ds-checkbox__input:not(:disabled):not(:checked):active { background: var(--ds-surface-pressed, var(--ds-surface-3)); }   /* pressed = --ds-surface-pressed (§13.4) */
/* disabled — surface-3 box, rule edge, faint mark + faint text, still visible */
.ds-checkbox__input:disabled {
  cursor: not-allowed;
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  color: var(--ds-ink-faint);
}
.ds-checkbox:has(.ds-checkbox__input:disabled) { cursor: not-allowed; }
.ds-checkbox:has(.ds-checkbox__input:disabled) .ds-checkbox__label,
.ds-checkbox:has(.ds-checkbox__input:disabled) .ds-checkbox__hint { color: var(--ds-ink-faint); }
/* loading — the mark becomes a spinner in the same 18px frame */
.ds-checkbox__input[aria-busy="true"] { cursor: progress; }
.ds-checkbox__input[aria-busy="true"]::before {
  opacity: 1;
  inline-size: calc(var(--_size) * .6);
  block-size:  calc(var(--_size) * .6);
  border: var(--_stroke) solid var(--ds-border-strong);
  border-block-start-color: var(--ds-ink);
  border-radius: var(--ds-radius-pill);
  rotate: 0deg;
  translate: 0 0;
  animation: ds-checkbox-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
/* busy boxes drop to the rest fill so the spinner reads the same whatever the prior value */
.ds-checkbox__input[aria-busy="true"]:checked { background: var(--_fill); border-color: var(--_border); }
.ds-checkbox__input[aria-busy="true"]::after { opacity: 0; }
@keyframes ds-checkbox-spin { to { rotate: 1turn; } }
/* error — danger edge on the box; message in the hint */
.ds-checkbox__input[aria-invalid="true"]:not(:checked) { border-color: var(--ds-danger); }
.ds-checkbox__hint[data-tone="error"] { color: var(--ds-danger-ink); }

/* ---- text ---------------------------------------------------------------- */
.ds-checkbox__text { display: flex; flex-direction: column; gap: var(--ds-space-0-5); min-width: 0; }
.ds-checkbox__label { color: var(--ds-ink); }
.ds-checkbox__hint  { font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); color: var(--ds-ink-muted); }

/* ============================================================================
   VARIANTS
   ========================================================================== */

/* origin — 22px, 2px ink-2 border, r4; only unchecked captured [origin-connecting-an-account-00-04] */
.ds-checkbox[data-variant="origin-2px-border-22"] {
  --_size: 22px;
  --_border-w: 2px;
  --_border: var(--ds-ink-2);
  font-size: var(--ds-text-lg);
  gap: var(--ds-space-3);
}
.ds-checkbox[data-variant="origin-2px-border-22"]:hover .ds-checkbox__input:not(:disabled):not(:checked) { border-color: var(--ds-ink); }

/* manychat bulk — 20px, 2px rule-grade border, r6, unlabelled in a filter bar
   (weakness: no visible label → aria-label required) [manychat-web-184] */
.ds-checkbox[data-variant="manychat-bulk-20"] {
  --_size: 20px;
  --_border-w: 2px;
  --_border: var(--ds-rule-strong);
  --_radius: var(--ds-radius-sm);
}

/* navattic — 20px hairline, r4–5, inside a popover row [navattic-web-88] */
.ds-checkbox[data-variant="navattic-hairline-20"] {
  --_size: 20px;
  --_border: var(--ds-border);
}

/* navattic / manychat select-all — 18px hairline header checkbox whose
   indeterminate state is an ink minus on the rest fill [navattic-web-153, manychat-web-126] */
.ds-checkbox[data-variant="navattic-indeterminate-select-all"] {
  --_size: 18px;
  --_border: var(--ds-border);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
}

/* plane — 18px r4 hairline inside a work-item card [screenshot-2026-09-17-125644] */
.ds-checkbox[data-variant="plane-card-select"] {
  --_size: 18px;
  --_border: var(--ds-rule-strong);
}

/* ds/components/text-input.css */
/* ============================================================================
   components/text-input/text-input.css — Text input (core · S1)
   Root `.ds-text-input` is the BOX (border, radius, height); the native
   <input class="ds-text-input__control"> inside is chromeless. Variants on
   data-variant; states via native pseudo-classes read through :has() on the
   root, with a fallback ring on the bare control for engines without :has().
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_h --_pad-x --_radius
   --_w --_align --_icon.
   ========================================================================== */

.ds-text-input {
  --_h:      var(--ds-size-h);           /* 36 · 32 sm · 44 lg · ×density        */
  --_pad-x:  var(--ds-size-pad-x);       /* 12 · 10 sm · 16 lg                    */
  --_ti-text: var(--ds-size-text);       /* 14 · 13 sm · 16 lg (the size hook's text) */
  --_radius: var(--ds-radius-sm);        /* controls step (6 × radius-scale)      */
  --_w:      auto;                       /* instance width: style="--_w: 312px"  */
  --_align:  start;                      /* value alignment (descript = end)     */
  --_icon:   var(--ds-icon-size);        /* 16; origin uses the 20 row size      */
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  width: var(--_w);
  max-width: 100%;
  min-width: 0;
  min-height: var(--_h);
  padding-inline: var(--_pad-x);
  font-size: var(--_ti-text);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--_radius);
  transition: border-color var(--ds-dur-fast) var(--ds-ease-standard),
              background-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-text-input:hover { border-color: var(--ds-border-strong); }

/* ---- the native control: chromeless, fills the box ------------------------ */
.ds-text-input__control {
  flex: 1 1 auto;
  align-self: stretch;
  width: 100%;
  min-width: 0;
  padding: 0;
  border: 0;
  margin: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: var(--_align);
  text-overflow: ellipsis;
}
.ds-text-input__control::placeholder { color: var(--ds-ink-muted); opacity: 1; }   /* readable, ≥4.5:1 (R1) */
.ds-text-input__control::-webkit-search-decoration,
.ds-text-input__control::-webkit-search-cancel-button { appearance: none; }

/* fallback ring when :has() is unavailable: drawn on the bare control */
.ds-text-input__control:focus-visible {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
  border-radius: var(--ds-radius-xs);
}

/* ---- leading icon · inline label prefix · trailing affordances ------------- */
.ds-text-input__icon,
.ds-text-input__clear,
.ds-text-input__chevron { flex: none; color: var(--ds-ink-muted); }
.ds-text-input__icon { display: inline-flex; width: var(--_icon); height: var(--_icon); }
.ds-text-input__icon svg,
.ds-text-input__clear svg {
  width: 100%; height: 100%;
  fill: none; stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}
.ds-text-input__prefix { flex: none; color: var(--ds-ink-muted); white-space: nowrap; }

/* conditional clear ✕ — shown only once the control has a value (needs a
   placeholder attribute, even placeholder=" ", for :placeholder-shown to work) */
.ds-text-input__clear {
  display: inline-flex; align-items: center; justify-content: center;
  width:  calc(var(--ds-icon-size) + var(--ds-space-2));
  height: calc(var(--ds-icon-size) + var(--ds-space-2));
  margin-inline-end: calc(-1 * var(--ds-space-1));
  padding: var(--ds-space-1);
  border: 0; background: transparent; border-radius: var(--ds-radius-xs);
  cursor: pointer;
}
.ds-text-input__clear:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-text-input:has(> .ds-text-input__control:placeholder-shown) .ds-text-input__clear { display: none; }

/* unit segment: tinted trailing cell ("kg", "%", "/mo") welded to the edge */
.ds-text-input__unit {
  flex: none; align-self: stretch;
  display: inline-flex; align-items: center;
  margin-inline-end: calc(-1 * var(--_pad-x));
  padding-inline: var(--ds-space-3);
  border-inline-start: var(--ds-border-width) solid var(--ds-border);
  border-start-end-radius: calc(var(--_radius) - var(--ds-border-width));
  border-end-end-radius:   calc(var(--_radius) - var(--ds-border-width));
  background: var(--ds-surface-2);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
  white-space: nowrap;
}

/* chevron drawn from borders (no asset); rotates when the field is a picker */
.ds-text-input__chevron {
  width:  calc(var(--ds-icon-size) * .45);
  height: calc(var(--ds-icon-size) * .45);
  margin-inline-end: var(--ds-space-0-5);
  border: 0 solid currentColor;
  border-inline-end-width: var(--ds-icon-stroke);
  border-block-end-width:  var(--ds-icon-stroke);
  transform: translateY(-25%) rotate(45deg);
}

/* message line under the box: hint by default, error when data-tone="error" */
.ds-text-input__message {
  display: block;
  margin-block-start: var(--ds-space-1);
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-body);
  color: var(--ds-ink-muted);
}
/* error messages are composed .ds-validation-marks[data-kind="error"] roots (2026-09-20); __message keeps hint typography + placement */

/* ---- states (root reads the native control through :has) ----------------- */
@supports selector(:has(a)) {
  .ds-text-input__control:focus-visible { outline: none; }
  /* focus-visible: 2px --ds-ring drawn at −1px so it covers the 1px border and the
     box never grows out of its toolbar row (the _base.css input convention) */
  .ds-text-input:has(> .ds-text-input__control:focus-visible) {
    border-color: var(--ds-ring);
    outline: var(--ds-ring-width) solid var(--ds-ring);
    outline-offset: calc(-1 * var(--ds-border-width));
  }
  /* read-only = the descript tint idiom repurposed: tint fill, no border, ink value */
  .ds-text-input:has(> .ds-text-input__control[readonly]) {
    background: var(--ds-surface-2);
    border-color: transparent;
  }
  .ds-text-input:has(> .ds-text-input__control[readonly]) .ds-text-input__control { cursor: default; }
  /* disabled: faint ink on surface-3, still visible, not-allowed cursor */
  .ds-text-input:has(> .ds-text-input__control:disabled) {
    color: var(--ds-ink-faint);
    background: var(--ds-surface-3);
    border-color: var(--ds-rule);
    box-shadow: none;
    cursor: not-allowed;
  }
  .ds-text-input:has(> .ds-text-input__control:disabled) .ds-text-input__control { cursor: not-allowed; }
  .ds-text-input:has(> .ds-text-input__control:disabled) .ds-text-input__control::placeholder,
  .ds-text-input:has(> .ds-text-input__control:disabled) :is(.ds-text-input__icon, .ds-text-input__prefix, .ds-text-input__unit, .ds-text-input__chevron) { color: var(--ds-ink-faint); }
  /* error: danger border; the focus ring turns danger too so the error stays visible while typing */
  .ds-text-input:has(> .ds-text-input__control[aria-invalid="true"]) { border-color: var(--ds-danger); }
  .ds-text-input:has(> .ds-text-input__control[aria-invalid="true"]:focus-visible) {
    border-color: var(--ds-danger);
    outline-color: var(--ds-danger);
  }
}
/* attribute twins for engines without :has() and for static demos */
.ds-text-input[data-state="error"] { border-color: var(--ds-danger); }
.ds-text-input[data-state="hover"] { border-color: var(--ds-border-strong); }
.ds-text-input[data-state="focus"] {
  border-color: var(--ds-ring);
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: calc(-1 * var(--ds-border-width));
}

/* loading: inline spinner in the trailing slot, no layout jump (aria-busy on the root) */
.ds-text-input[aria-busy="true"]::after {
  content: "";
  flex: none;
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  border: 2px solid var(--ds-rule);
  border-block-start-color: var(--ds-ink-muted);
  border-radius: var(--ds-radius-pill);
  animation: ds-text-input-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
.ds-text-input[aria-busy="true"] .ds-text-input__clear { display: none; }
@keyframes ds-text-input-spin { to { transform: rotate(360deg); } }

/* ---- sizes: data-size on the root (or an ancestor toolbar) ----------------- */
.ds-text-input[data-size] { --_h: var(--ds-size-h); --_pad-x: var(--ds-size-pad-x); }
/* self-contained (DESK-373): the same ladder as components/_base.css §4, restated on the root, so a host that skips
   _base.css (a Tailwind app) still gets sm / lg; where _base.css loads the values are identical. */
.ds-text-input[data-size="sm"] { --_h: var(--ds-control-h-sm); --_pad-x: calc(var(--ds-control-pad-x) - 2px); --_ti-text: var(--ds-text-sm); }
.ds-text-input[data-size="md"] { --_h: var(--ds-control-h); --_pad-x: var(--ds-control-pad-x); --_ti-text: var(--ds-text-md); }
.ds-text-input[data-size="lg"] { --_h: var(--ds-control-h-lg); --_pad-x: calc(var(--ds-control-pad-x) + 4px); --_ti-text: var(--ds-text-lg); }

/* ============================================================================
   VARIANTS — each reference designer's approach, kept by name.
   Unmarked root = data-variant="jstov" (house): --ds-border hairline (one grade
   below --ds-rule in every preset), radius-sm, 36/32/44, value left, placeholder
   at --ds-ink-muted, specified 2px ring, read-only = tint fill.
   ========================================================================== */

/* descript-editing-profile-00-03 — 312×36 borderless tint, r6, value right-aligned
   to the row's action edge, no placeholder */
.ds-text-input[data-variant="descript-tint-fill-right-aligned"] {
  --_align: end;
  background: var(--ds-surface-2);
  border-color: transparent;
}
.ds-text-input[data-variant="descript-tint-fill-right-aligned"]:hover { background: var(--ds-surface-hover); border-color: transparent; }

/* retool-web-25 / retool-web-12 — white, 1px rule, r4, 12px text, 32 tall;
   icon-left for date, chevron-right for select */
.ds-text-input[data-variant="retool-hairline-32"] {
  --_h: var(--ds-control-h-sm);
  --_pad-x: calc(var(--ds-control-pad-x) - 2px);
  --_radius: var(--ds-radius-xs);
  font-size: var(--ds-text-sm);
}

/* navattic-web-174 / navattic-web-153 — 32 tall, 1px border + the 1px lip shadow
   shared with the secondary button so inputs and buttons align on a row */
.ds-text-input[data-variant="navattic-hairline-lip"] {
  --_h: var(--ds-control-h-sm);
  --_pad-x: calc(var(--ds-control-pad-x) - 2px);
  box-shadow: var(--ds-shadow-lift);
}

/* origin-connecting-an-account-00-04 — 700×68 r16, darker 1px border, 20px
   placeholder, 20px icon: the consumer hero field */
.ds-text-input[data-variant="origin-large-rounded"] {
  --_h: calc(var(--ds-control-h-lg) + var(--ds-space-6));   /* 44 + 24 = 68 */
  --_pad-x: var(--ds-space-6);
  --_radius: var(--ds-radius-lg);
  --_icon: var(--ds-icon-size-row);
  --_w: 100%;
  gap: var(--ds-space-4);
  font-size: var(--ds-text-xl);
  border-color: var(--ds-border-strong);
}

/* hsajlzkwuaagtdc — 47–48 tall r10, 1px border, 16px text, every input full
   width even for 2-digit values */
.ds-text-input[data-variant="hsaj-full-width-48"] {
  --_h: calc(var(--ds-control-h) + var(--ds-space-3));       /* 36 + 12 = 48 */
  --_pad-x: var(--ds-space-4);
  --_radius: var(--ds-radius-md);
  --_w: 100%;
  font-size: var(--ds-text-lg);
}

/* hsajlzjwgaajrfp — "Subject:" muted + value 600, one 56px row, hairline below,
   no box: the editor's inline-label row */
.ds-text-input[data-variant="hsajl-inline-label-row"] {
  --_h: calc(var(--ds-row-h) + var(--ds-space-4));            /* 40 + 16 = 56 */
  --_pad-x: var(--ds-space-5);
  --_radius: 0;
  --_w: 100%;
  gap: var(--ds-space-6);
  font-size: var(--ds-text-lg);
  background: transparent;
  border-width: 0 0 var(--ds-border-width);
  border-color: var(--ds-rule);
}
.ds-text-input[data-variant="hsajl-inline-label-row"]:hover { border-color: var(--ds-rule-strong); }
.ds-text-input[data-variant="hsajl-inline-label-row"] .ds-text-input__control { font-weight: var(--ds-weight-semibold); }
.ds-text-input[data-variant="hsajl-inline-label-row"] .ds-text-input__control::placeholder { font-weight: var(--ds-weight-regular); }

/* luma-creating-an-event-04-07 — 962×49 white r10 on a tinted modal ground,
   conditional ✕ clear; needs a tinted parent (.ds-well) to hold its edge */
.ds-text-input[data-variant="luma-modal-white-with-clear"] {
  --_h: calc(var(--ds-control-h-lg) + var(--ds-space-1));     /* 44 + 4 = 48 */
  --_pad-x: var(--ds-space-4);
  --_radius: var(--ds-radius-md);
  --_w: 100%;
  font-size: var(--ds-text-lg);
  border-color: transparent;
}
.ds-text-input[data-variant="luma-modal-white-with-clear"]:hover { border-color: var(--ds-rule); }

/* perplexity-asking-a-question-05-09 — inputs get a darker rule than cards plus
   a 2–4px soft bottom shadow so the box holds against the sheet */
.ds-text-input[data-variant="perplexity-composer-strong-rule"] {
  --_h: var(--ds-control-h-lg);
  --_pad-x: var(--ds-space-4);
  font-size: var(--ds-text-lg);
  border-color: var(--ds-border-strong);
  box-shadow: var(--ds-shadow-lift);
}

/* ---- data-form: multiline (textarea) and native select (DESK-371, found by Forematter) -----------------------------
   Self-contained: neither form needs components/_base.css, so a host that skips the base resets (a Tailwind app)
   still gets a finished field. Same box, same states (hover / :focus-within ring / :disabled / aria-invalid).
     <div class="ds-text-input" data-form="multiline"><textarea class="ds-text-input__control" rows="4"></textarea></div>
     <div class="ds-text-input" data-form="select"><select class="ds-text-input__control">…</select>
       <span class="ds-text-input__chevron" aria-hidden="true"></span></div>   (the chevron is border-drawn, empty)
   Knob: --_rows (multiline minimum height in lines, default 4). */
.ds-text-input[data-form="multiline"] {
  --_rows: 4;
  align-items: stretch;
  padding-block: calc(var(--_pad-x) * 0.66);
  width: var(--_w, 100%);
}
.ds-text-input[data-form="multiline"] > .ds-text-input__control {
  min-height: calc(var(--_rows) * 1lh);
  line-height: var(--ds-lh-body, 1.5);
  resize: vertical;
  text-overflow: clip;
  white-space: pre-wrap;
  appearance: none;
}
.ds-text-input[data-form="select"] { position: relative; padding-inline-end: 0; }
.ds-text-input[data-form="select"] > .ds-text-input__control {
  appearance: none;
  -webkit-appearance: none;
  cursor: pointer;
  padding-inline-end: calc(var(--_pad-x) + var(--ds-icon-size));
  min-height: calc(var(--_h) - 2 * var(--ds-border-width));
}
.ds-text-input[data-form="select"] > .ds-text-input__chevron {
  position: absolute;
  inset-inline-end: var(--_pad-x);
  top: 50%;
  margin: 0;
  transform: translateY(-75%) rotate(45deg);   /* the border-drawn chevron above, centred on the box */
  pointer-events: none;
}
.ds-text-input[data-form] > .ds-text-input__control:disabled { cursor: not-allowed; color: var(--ds-ink-faint); }

/* ds/components/search-input.css */
/* ============================================================================
   components/search-input/search-input.css — Search input (common · S0)
   Same box recipe as text-input (root = the box, chromeless <input type=search>
   inside) plus the search anatomy: magnifier · scope-naming placeholder ·
   conditional clear ✕ · optional kbd hint. Rounds with --ds-radius-button so a
   pill theme (paper) makes it a pill (contract §3 data-buttons).
   Private knobs: --_h --_pad-x --_radius --_w --_icon --_border --_text.
   ========================================================================== */

.ds-search-input {
  --_h:      var(--ds-size-h);
  --_pad-x:  var(--ds-size-pad-x);
  --_radius: var(--ds-radius-button);   /* sm or pill, follows data-buttons */
  --_w:      auto;                      /* toolbars: 192–255px; hero: 100%   */
  --_icon:   var(--ds-icon-size);
  --_border: var(--ds-border);          /* instance edge: transparent on a tinted ground */
  --_text:   var(--ds-size-text);
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  width: var(--_w);
  max-width: 100%;
  min-width: 0;
  min-height: var(--_h);
  padding-inline: var(--_pad-x);
  font-size: var(--_text);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--_border);
  border-radius: var(--_radius);
  transition: border-color var(--ds-dur-fast) var(--ds-ease-standard),
              background-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-search-input:hover { border-color: var(--ds-border-strong); }

.ds-search-input__control {
  flex: 1 1 auto;
  align-self: stretch;
  width: 100%;
  min-width: 0;
  padding: 0; border: 0; margin: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-overflow: ellipsis;
  appearance: none;
}
.ds-search-input__control::placeholder { color: var(--ds-ink-muted); opacity: 1; }
.ds-search-input__control::-webkit-search-decoration,
.ds-search-input__control::-webkit-search-cancel-button,
.ds-search-input__control::-webkit-search-results-button { appearance: none; display: none; }
.ds-search-input__control:focus-visible {                      /* fallback ring, no :has() */
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
  border-radius: var(--ds-radius-xs);
}

/* magnifier — leading, muted, 16px (20 in a hero via --_icon) */
.ds-search-input__icon { flex: none; display: inline-flex; width: var(--_icon); height: var(--_icon); color: var(--ds-ink-muted); }
.ds-search-input__icon svg,
.ds-search-input__clear svg {
  width: 100%; height: 100%;
  fill: none; stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}

/* conditional clear ✕ — visible only with a value (control needs a placeholder attr) */
.ds-search-input__clear {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  width:  calc(var(--ds-icon-size) + var(--ds-space-2));
  height: calc(var(--ds-icon-size) + var(--ds-space-2));
  margin-inline-end: calc(-1 * var(--ds-space-1));
  padding: var(--ds-space-1);
  border: 0; background: transparent;
  border-radius: var(--ds-radius-pill);
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-search-input__clear:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-search-input:has(> .ds-search-input__control:placeholder-shown) .ds-search-input__clear { display: none; }

/* kbd hint — "⌘K" in the field (retool: plain text; hsaj: bordered chip). Hidden once
   the field holds a value so it never sits beside the ✕. */
.ds-search-input__kbd {
  flex: none;
  margin-inline-end: calc(-1 * var(--ds-space-1));
  padding: 0 var(--ds-space-1);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  line-height: calc(var(--ds-icon-size) + var(--ds-space-1));
  color: var(--ds-ink-muted);
  background: var(--ds-surface-2);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-xs);
  white-space: nowrap;
}
.ds-search-input__kbd[data-style="text"] { background: transparent; border-color: transparent; padding: 0; }
.ds-search-input:has(> .ds-search-input__control:not(:placeholder-shown)) .ds-search-input__kbd { display: none; }

/* result count / scope line under the field (optional) */
.ds-search-input__message {
  display: block;
  margin-block-start: var(--ds-space-1);
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
}
.ds-search-input__message[data-tone="error"] { color: var(--ds-danger-ink); }

/* ---- states -------------------------------------------------------------- */
@supports selector(:has(a)) {
  .ds-search-input__control:focus-visible { outline: none; }
  .ds-search-input:has(> .ds-search-input__control:focus-visible) {
    border-color: var(--ds-ring);
    outline: var(--ds-ring-width) solid var(--ds-ring);
    outline-offset: calc(-1 * var(--ds-border-width));
  }
  .ds-search-input:has(> .ds-search-input__control:disabled) {
    color: var(--ds-ink-faint);
    background: var(--ds-surface-3);
    border-color: var(--ds-rule);
    box-shadow: none;
    cursor: not-allowed;
  }
  .ds-search-input:has(> .ds-search-input__control:disabled) .ds-search-input__control { cursor: not-allowed; }
  .ds-search-input:has(> .ds-search-input__control:disabled) .ds-search-input__control::placeholder,
  .ds-search-input:has(> .ds-search-input__control:disabled) :is(.ds-search-input__icon, .ds-search-input__kbd) { color: var(--ds-ink-faint); }
  .ds-search-input:has(> .ds-search-input__control[aria-invalid="true"]) { border-color: var(--ds-danger); }
  .ds-search-input:has(> .ds-search-input__control[aria-invalid="true"]:focus-visible) { border-color: var(--ds-danger); outline-color: var(--ds-danger); }
}
.ds-search-input[data-state="hover"] { border-color: var(--ds-border-strong); }
.ds-search-input[data-state="focus"] { border-color: var(--ds-ring); outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-border-width)); }
.ds-search-input[data-state="error"] { border-color: var(--ds-danger); }

/* loading (searching): the magnifier is replaced by a spinner — same 16px slot, no jump */
.ds-search-input[aria-busy="true"] .ds-search-input__icon svg { display: none; }
.ds-search-input[aria-busy="true"] .ds-search-input__icon::after {
  content: "";
  width: 100%; height: 100%;
  box-sizing: border-box;
  border: 2px solid var(--ds-rule);
  border-block-start-color: var(--ds-ink-muted);
  border-radius: var(--ds-radius-pill);
  animation: ds-search-input-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-search-input-spin { to { transform: rotate(360deg); } }

.ds-search-input[data-size] { --_h: var(--ds-size-h); --_pad-x: var(--ds-size-pad-x); }

/* ============================================================================
   VARIANTS — corpus default (unmarked root) = bordered-leading-icon.
   No house variant is defined in the taxonomy (S0); the default already carries
   the house input rules (36/r-button, --ds-border, ring, muted placeholder).
   ========================================================================== */

/* navattic-web-153 (192×32 r8) · retool-web-25 (32 r4) · manychat-web-42/126 (36 r6):
   white, 1px border, magnifier left; fixed 192–255 wide in toolbars */
.ds-search-input[data-variant="bordered-leading-icon"] { --_radius: var(--ds-radius-button); }   /* = the default box; 32 via data-size="sm" (navattic, retool), 36 at md (manychat) */

/* descript-editing-profile-00-03 (870×36 centred) · clickup-web-564 (200 pill + ⌘K)
   · givingli-web-15 (200×40): tint fill, no border, full pill */
.ds-search-input[data-variant="tint-pill"] {
  --_radius: var(--ds-radius-pill);
  --_pad-x: var(--ds-space-4);
  --_border: transparent;
  background: var(--ds-surface-2);
}
.ds-search-input[data-variant="tint-pill"]:hover { background: var(--ds-surface-hover); border-color: transparent; }
.ds-search-input[data-variant="tint-pill"] .ds-search-input__kbd { background: var(--ds-surface); }

/* origin-connecting-an-account-00-04 (700×68 r16, darker border) ·
   luma-creating-an-event-04-07 (962×49 white r10): large, with a conditional ⊗ clear */
.ds-search-input[data-variant="with-clear"] {
  --_h: calc(var(--ds-control-h-lg) + var(--ds-space-1));      /* 48 (luma); origin adds --_h inline */
  --_pad-x: var(--ds-space-4);
  --_radius: var(--ds-radius-md);
  --_icon: var(--ds-icon-size-row);
  --_w: 100%;
  --_text: var(--ds-text-lg);
  gap: var(--ds-space-3);
}
.ds-search-input[data-variant="with-clear"] .ds-search-input__clear {
  width:  calc(var(--ds-icon-size-row) + var(--ds-space-1));
  height: calc(var(--ds-icon-size-row) + var(--ds-space-1));
}

/* manychat-web-184 — the emoji picker's search: third-party scale (20px placeholder
   in a 14px app, surface-3 fill, no border). Kept as evidence of the mismatch. */
.ds-search-input[data-variant="emoji-mart-filled"] {
  --_h: var(--ds-control-h-lg);
  --_pad-x: var(--ds-space-4);
  --_radius: var(--ds-radius-md);
  --_w: 100%;
  --_text: var(--ds-text-xl);
  --_icon: var(--ds-icon-size-row);
  --_border: transparent;
  background: var(--ds-surface-3);
}

/* givingli-web-15 — ANTI-PATTERN: placeholder at ink strength reads as a value.
   Present so a reviewer can point at it; never the default. */
.ds-search-input[data-variant="placeholder-at-ink-strength"] {
  --_radius: var(--ds-radius-pill);
  --_pad-x: var(--ds-space-4);
  --_h: calc(var(--ds-control-h) + var(--ds-space-1));         /* 40 */
  --_border: transparent;
  background: var(--ds-surface-2);
}
.ds-search-input[data-variant="placeholder-at-ink-strength"] .ds-search-input__control::placeholder { color: var(--ds-ink); }
.ds-search-input[data-variant="placeholder-at-ink-strength"] .ds-search-input__icon { color: var(--ds-ink); }

/* ds/components/breadcrumb.css */
/* ============================================================================
   breadcrumb — where am I, as a text run          (taxonomy §A · common · S0)
   Root: <nav class="ds-breadcrumb" aria-label="Breadcrumb">
   Parts: __list (ol) · __item (li) · __link (parent crumb, <a>) · __leaf (aria-current="page")
          __sep (data-sep="slash|chevron|plus" on the root) · __icon (entity icon square)
          __control (leaf as a bordered select trigger) · __edit (pencil) · __badge (LIVE / DRAFT)
          __star (favourite toggle, aria-pressed) · __ellipsis (collapsed middle)
   Variants: navattic-interactive-leaf · hsaj-breadcrumb-as-h1 · clickup-icon-square ·
             manychat-editable-leaf-badge · perplexity-collection-untitled ·
             luma-admin-single-level
   The unmarked root is the CORPUS DEFAULT: parents muted 400, leaf ink 500, one body size.
   The house page-header composes hsaj-breadcrumb-as-h1 (taxonomy JSTOV: breadcrumb-as-H1).
   Private knobs: --_size --_gap --_leaf-weight --_sep-glyph.
   ========================================================================== */

/* stroke icons: components/_base.css paints svg { fill: currentColor }, which beats the fill="none"
   presentation attribute — restate it by attribute so line icons stay hollow */
.ds-breadcrumb svg[fill="none"] { fill: none; }

.ds-breadcrumb {
  --_size: var(--ds-text-md);
  --_gap: var(--ds-space-2);
  --_leaf-weight: var(--ds-weight-medium);
  --_sep-glyph: "/";
  min-width: 0;
  font-size: var(--_size);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-muted);
}
.ds-breadcrumb__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--_gap);
  min-width: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}
.ds-breadcrumb__item {
  display: inline-flex;
  align-items: center;
  gap: var(--_gap);
  min-width: 0;
  flex: 0 1 auto;
}
/* data-wrap="nowrap" (inside a bar): one line, the leaf truncates; default wraps (a page header) */
.ds-breadcrumb[data-wrap="nowrap"] .ds-breadcrumb__list { flex-wrap: nowrap; }
/* parents keep their words (up to half the row); the leaf is the crumb that truncates */
.ds-breadcrumb__item:has(> .ds-breadcrumb__link) { flex-shrink: 0; max-inline-size: 100%; }
/* parent crumb: muted, regular, becomes ink on hover — never underlined at rest */
.ds-breadcrumb__link {
  color: var(--ds-ink-muted);
  font-weight: var(--ds-weight-regular);
  text-decoration: none;
  border-radius: var(--ds-radius-xs);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-breadcrumb__link:hover,
.ds-breadcrumb__link[data-state="hover"] { color: var(--ds-ink); text-decoration: underline; text-underline-offset: .2em; }
/* the leaf: ink, one weight up, the only crumb that is not a link */
.ds-breadcrumb__leaf {
  color: var(--ds-ink);
  font-weight: var(--_leaf-weight);
  font-size: inherit;            /* the leaf may be an <h1>: the ROOT owns the size */
  line-height: inherit;
  margin: 0;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* separator glyph — data-sep on the root picks / › + ; aria-hidden in markup */
.ds-breadcrumb__sep {
  flex: none;
  color: var(--ds-ink-faint);          /* decorative — faint is allowed */
  font-weight: var(--ds-weight-regular);
  user-select: none;
}
.ds-breadcrumb__sep::before { content: var(--_sep-glyph); }
.ds-breadcrumb[data-sep="chevron"] { --_sep-glyph: "›"; }
.ds-breadcrumb[data-sep="plus"]    { --_sep-glyph: "+"; }
.ds-breadcrumb__sep svg { inline-size: 12px; block-size: 12px; display: block; }   /* glyph geometry, not spacing */
.ds-breadcrumb__sep:has(svg)::before { content: none; }

/* collapsed middle (mobile / deep paths): an … button that reveals the hidden crumbs */
.ds-breadcrumb__ellipsis {
  display: inline-grid;
  place-items: center;
  min-inline-size: var(--ds-icon-size-rail);
  block-size: var(--ds-icon-size-rail);
  padding: 0 var(--ds-space-1);
  border: 0;
  border-radius: var(--ds-radius-xs);
  background: transparent;
  color: var(--ds-ink-muted);
  font: inherit;
  cursor: pointer;
}
.ds-breadcrumb__ellipsis:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }

/* entity icon square (clickup): a data-hue tile that type-codes the object */
.ds-breadcrumb__icon {
  flex: none;
  display: inline-grid;
  place-items: center;
  inline-size: var(--ds-icon-size-row);
  block-size: var(--ds-icon-size-row);
  border-radius: var(--ds-radius-xs);
  background: var(--ds-data-1-tint);
  color: var(--ds-data-1-ink);
}
.ds-breadcrumb__icon[data-hue="2"] { background: var(--ds-data-2-tint); color: var(--ds-data-2-ink); }
.ds-breadcrumb__icon[data-hue="7"] { background: var(--ds-data-7-tint); color: var(--ds-data-7-ink); }
.ds-breadcrumb__icon svg { inline-size: 12px; block-size: 12px; }

/* leaf-as-control (navattic): a bordered select trigger for saved views */
.ds-breadcrumb__control {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-block-size: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-3) var(--ds-space-2);
  font: inherit;
  font-weight: var(--ds-weight-medium);
  color: var(--ds-ink);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-sm);
  box-shadow: var(--ds-shadow-lip);
  cursor: pointer;
  white-space: nowrap;
  max-inline-size: 100%;
}
.ds-breadcrumb__control svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: var(--ds-ink-muted); flex: none; }
.ds-breadcrumb__control:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-breadcrumb__control[aria-expanded="true"] { border-color: var(--ds-border-strong); background: var(--ds-surface-selected); }
.ds-breadcrumb__control:disabled { color: var(--ds-ink-faint); background: var(--ds-surface-3); border-color: var(--ds-rule); box-shadow: none; }

/* inline edit affordance (manychat): a pencil after the leaf; the leaf is dotted-underlined = editable */
.ds-breadcrumb__edit {
  display: inline-grid;
  place-items: center;
  inline-size: var(--ds-icon-size-rail);
  block-size: var(--ds-icon-size-rail);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-xs);
  background: transparent;
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-breadcrumb__edit svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
.ds-breadcrumb__edit:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-breadcrumb__leaf[data-editable="true"] { text-decoration: underline dotted; text-decoration-color: var(--ds-rule-strong); text-underline-offset: .25em; }
/* an unnamed leaf: the "null = italic word" house data rule, in the readable muted lane */
.ds-breadcrumb__leaf[data-state="empty"] { color: var(--ds-ink-muted); font-style: italic; font-weight: var(--ds-weight-regular); padding-inline-end: .12em; }   /* italic overhang must not clip */

/* status badge on the leaf (LIVE / DRAFT) — tint + same-hue ink, never white-on-colour */
.ds-breadcrumb__badge {
  flex: none;
  display: inline-flex;
  align-items: center;
  block-size: var(--ds-icon-size-row);      /* a badge is row-icon tall (20px), never a space step */
  padding-inline: var(--ds-space-2);
  border-radius: var(--ds-radius-xs);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: .06em;
  text-transform: uppercase;      /* badges are the one uppercase component (R8) */
  background: var(--ds-surface-2);
  color: var(--ds-ink-2);
  border: var(--ds-border-width) solid var(--ds-rule);
}
.ds-breadcrumb__badge[data-tone="live"]  { background: var(--ds-danger-tint);  color: var(--ds-danger-ink);  border-color: transparent; }
.ds-breadcrumb__badge[data-tone="draft"] { background: var(--ds-surface-2);    color: var(--ds-ink-muted);   border-color: var(--ds-rule); }

/* favourite toggle (clickup): a ghost star; pressed = filled accent (a boolean-on spends the accent) */
.ds-breadcrumb__star {
  display: inline-grid;
  place-items: center;
  inline-size: var(--ds-icon-size-rail);
  block-size: var(--ds-icon-size-rail);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-xs);
  background: transparent;
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-breadcrumb__star svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); fill: none; stroke: currentColor; }
.ds-breadcrumb__star:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-breadcrumb__star[aria-pressed="true"] { color: var(--ds-accent); }
.ds-breadcrumb__star[aria-pressed="true"] svg { fill: currentColor; }

/* -- variants ------------------------------------------------------------- */
/* hsaj: the breadcrumb IS the H1 — 26px, parent 400 muted, leaf 600, no separate title */
.ds-breadcrumb[data-variant="hsaj-breadcrumb-as-h1"] {
  --_size: var(--ds-text-2xl);
  --_gap: var(--ds-space-4);
  --_leaf-weight: var(--ds-heading-weight);
  --_sep-glyph: "›";
  line-height: var(--ds-lh-heading);
  letter-spacing: var(--ds-heading-tracking);
}
.ds-breadcrumb[data-variant="hsaj-breadcrumb-as-h1"] .ds-breadcrumb__leaf { color: var(--ds-ink); white-space: normal; overflow: visible; text-overflow: clip; text-wrap: balance; }   /* an H1 wraps; it is never ellipsised */
.ds-breadcrumb[data-variant="hsaj-breadcrumb-as-h1"] .ds-breadcrumb__sep { font-size: var(--ds-text-lg); color: var(--ds-ink-faint); }

/* navattic: parent plain, "/" separator with 12px gaps, leaf is a bordered view-switcher select */
.ds-breadcrumb[data-variant="navattic-interactive-leaf"] { --_gap: var(--ds-space-3); }

/* clickup: entity icon square + muted parent / ink current (600) + chevron + star */
.ds-breadcrumb[data-variant="clickup-icon-square"] { --_leaf-weight: var(--ds-weight-semibold); }

/* manychat: parent › Untitled + pencil + LIVE/DRAFT badge, in a 60px chrome bar */
.ds-breadcrumb[data-variant="manychat-editable-leaf-badge"] { --_sep-glyph: "›"; }
.ds-breadcrumb[data-variant="manychat-editable-leaf-badge"] .ds-breadcrumb__sep { color: var(--ds-accent); }   /* the reference paints the chevron in the accent */
.ds-breadcrumb[data-variant="manychat-editable-leaf-badge"] .ds-breadcrumb__leaf { font-weight: var(--ds-weight-regular); }

/* perplexity: "+ Collection / Untitled" entirely in the muted lane — the crumb is an affordance */
.ds-breadcrumb[data-variant="perplexity-collection-untitled"] { --_leaf-weight: var(--ds-weight-regular); }
.ds-breadcrumb[data-variant="perplexity-collection-untitled"] .ds-breadcrumb__link,
.ds-breadcrumb[data-variant="perplexity-collection-untitled"] .ds-breadcrumb__leaf { color: var(--ds-ink-muted); }
.ds-breadcrumb[data-variant="perplexity-collection-untitled"] .ds-breadcrumb__leaf { font-style: italic; padding-inline-end: .12em; }
.ds-breadcrumb[data-variant="perplexity-collection-untitled"] .ds-breadcrumb__link::before { content: "+ "; color: var(--ds-ink-faint); }

/* luma: a single parent with a trailing chevron ("Personal ›"), 14px ink-2 */
.ds-breadcrumb[data-variant="luma-admin-single-level"] { --_sep-glyph: "›"; --_gap: var(--ds-space-1); }
.ds-breadcrumb[data-variant="luma-admin-single-level"] .ds-breadcrumb__link { color: var(--ds-ink-2); }

/* -- label lane policy: breadcrumbs are navigation, never uppercased (R8) ------- */
.ds-breadcrumb, .ds-breadcrumb__link, .ds-breadcrumb__leaf { text-transform: none; }

/* -- mobile: the leaf keeps its width; parents may collapse behind the … --------- */
@media (max-width: 720px) {
  .ds-breadcrumb[data-collapse="mobile"] .ds-breadcrumb__item[data-collapsible] { display: none; }
  .ds-breadcrumb[data-collapse="mobile"] .ds-breadcrumb__item[data-role="ellipsis"] { display: inline-flex; }
}
.ds-breadcrumb__item[data-role="ellipsis"] { display: none; }

/* ============================================================================
   J15 — "you always know where you landed". Root states (all variants below carry them):
     rest · data-state="collapsed" (deep path: workspace + … + the last two parents + leaf; the … names what it hides) ·
     data-state="switched" (the workspace crumb changed: it holds a tint until the next navigation, and __live says it)
   New parts: __initials (workspace initials inside __icon) · __live (visible announcement, role=status)
   Variants added: jstov · frame-space-icon (clickup-icon-square and hsaj-breadcrumb-as-h1 gained the J15 states)
   ========================================================================== */
.ds-breadcrumb__initials { font-size: var(--ds-text-xs); font-weight: var(--ds-weight-bold); line-height: 1; letter-spacing: 0; }
.ds-breadcrumb__icon:has(.ds-breadcrumb__initials) { font-size: var(--ds-text-xs); }
.ds-breadcrumb[data-state="collapsed"] .ds-breadcrumb__item[data-role="ellipsis"] { display: inline-flex; }
.ds-breadcrumb[data-state="collapsed"] .ds-breadcrumb__item[data-collapsible] { display: none; }
.ds-breadcrumb[data-state="collapsed"] .ds-breadcrumb__leaf { max-inline-size: 32ch; }
.ds-breadcrumb__live { display: none; }
.ds-breadcrumb[data-state="switched"] { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-2) var(--ds-space-3); }
.ds-breadcrumb[data-state="switched"] .ds-breadcrumb__item[data-role="workspace"] > .ds-breadcrumb__link { color: var(--ds-accent-ink); background: var(--ds-accent-tint); padding-inline: var(--ds-space-1); }
.ds-breadcrumb[data-state="switched"] .ds-breadcrumb__live { display: inline-flex; align-items: center; min-height: var(--ds-icon-size-row); padding-inline: var(--ds-space-2); border-radius: var(--ds-radius-pill); background: var(--ds-surface-2); color: var(--ds-ink-2); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-regular); letter-spacing: 0; }
/* jstov: workspace initials square (inverse) as the first crumb, chevrons, parents muted, leaf semibold; the path
   is one line inside a bar (nowrap) and the LEAF is what truncates */
.ds-breadcrumb[data-variant="jstov"] { --_leaf-weight: var(--ds-weight-semibold); --_gap: var(--ds-space-1-5); font-size: var(--ds-text-sm); }
.ds-breadcrumb[data-variant="jstov"] .ds-breadcrumb__icon { background: var(--ds-surface-inverse); color: var(--ds-ink-inverse); border-radius: var(--ds-radius-xs); }
.ds-breadcrumb[data-variant="jstov"] .ds-breadcrumb__link { padding-inline: var(--ds-space-0-5); }
/* frame-space-icon: a building glyph before the space, › chevrons, the leaf bold and followed by nothing; tight 12 px
   run in the card header [mobbin-frame-search 05] */
.ds-breadcrumb[data-variant="frame-space-icon"] { --_size: var(--ds-text-xs); --_gap: var(--ds-space-1-5); --_leaf-weight: var(--ds-weight-semibold); }
.ds-breadcrumb[data-variant="frame-space-icon"] .ds-breadcrumb__icon { background: transparent; color: var(--ds-ink-muted); }
/* hsaj in a deep path: parents shrink to the body size so the H1 leaf stays the headline */
.ds-breadcrumb[data-variant="hsaj-breadcrumb-as-h1"] .ds-breadcrumb__icon { display: none; }
.ds-breadcrumb[data-variant="hsaj-breadcrumb-as-h1"][data-state="collapsed"] .ds-breadcrumb__link { font-size: var(--ds-text-md); }

/* ds/components/tabs.css */
/* ============================================================================
   tabs — navigation between peers (underline) + view switch (pill)   (taxonomy §A · core · S1)
   Two semantics, two behaviours, one file:
     data-kind="underline" (default)  <nav> of links, aria-current="page"  — page-level navigation
     data-kind="pill"                 role="tablist" of buttons, aria-selected — in-pane view switch
   Root: .ds-tabs      Parts: __list · __tab (li) · __item (a | button) · __label · __icon · __count ·
                              __dot · __end (right-aligned actions) · __action · __icon-btn · __skeleton · __empty
   Underline variants: quicken-sticky-full-pad · clickup-content-width · contra-label-width-with-prefix-icon ·
     oku-counted · manychat-channel-strip · luma-admin-on-band-rule · origin-segmented-underline ·
     clickup-equal-width-switch · manychat-text-tabs-plus-actions
   Pill variants: retool-tint-pill-tab · synara-tint-pill-tabs · origin-pill-row ·
     intercom-hairline-strip-over-media · retool-weight-only
   House (unmarked root / data-variant="jstov"): underline for page nav — accent line spanning the
   PADDED tab (quicken) on a 1px rail; data-kind="pill" = tint-track pill (hsaj/luma) for pane
   switching. Never both on one item (plane-double-signal is the documented anti-pattern).
   Private knobs: --_strip-h --_pad-x --_gap --_line-w --_line-inset --_line-color --_rail
                  --_ink --_ink-selected --_weight-selected --_size --_track --_pill-bg --_pill-radius
   ========================================================================== */

/* stroke icons: components/_base.css paints svg { fill: currentColor }, which beats the fill="none"
   presentation attribute — restate it by attribute so line icons stay hollow */
.ds-tabs svg[fill="none"] { fill: none; }

.ds-tabs {
  --_strip-h:        var(--ds-control-h-lg);          /* 44 default · 40 compact · 52 comfortable */
  --_pad-x:          var(--ds-space-3);
  --_gap:            var(--ds-space-1);
  --_line-w:         2px;
  --_line-inset:     0px;                              /* 0 = spans the padded tab; var(--_pad-x) = label width */
  --_line-color:     var(--ds-accent-line);            /* → ink under data-accent-scope="none" */
  --_rail:           var(--ds-rule);
  --_ink:            var(--ds-ink-muted);
  --_ink-selected:   var(--ds-ink);
  --_weight-selected: var(--ds-selected-weight);
  --_size:           var(--ds-text-md);
  --_track:          transparent;
  --_pill-bg:        var(--ds-selected-bg);
  --_pill-radius:    var(--ds-radius-sm);

  position: relative;
  display: flex;
  align-items: stretch;
  gap: var(--ds-space-4);
  min-width: 0;
  font-size: var(--_size);
  line-height: var(--ds-lh-list);
  color: var(--_ink);
  border-block-end: var(--ds-border-width) solid var(--_rail);
}
.ds-tabs__list {
  display: flex;
  align-items: stretch;
  gap: var(--_gap);
  min-width: 0;
  flex: 1 1 auto;
  margin: 0;
  padding: 0;
  list-style: none;
  overflow-x: auto;                 /* the strip scrolls inside itself on narrow screens */
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.ds-tabs__list::-webkit-scrollbar { display: none; }
.ds-tabs__tab { display: flex; flex: none; }

/* -- the item: link (nav) or button (tab) -------------------------------- */
.ds-tabs__item {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--_strip-h);
  padding-inline: var(--_pad-x);
  border: 0;
  border-radius: var(--ds-radius-xs);        /* the ring follows this */
  background: transparent;
  color: var(--_ink);
  font: inherit;
  font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case);
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: color var(--ds-dur-fast) var(--ds-ease-standard),
              background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
/* the indicator line — drawn by ::after so its width is a knob, and it sits ON the rail */
.ds-tabs__item::after {
  content: "";
  position: absolute;
  inset-inline: var(--_line-inset);
  inset-block-end: calc(-1 * var(--ds-border-width));
  block-size: var(--_line-w);
  background: transparent;
  border-radius: var(--_line-w) var(--_line-w) 0 0;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-tabs__label { min-width: 0; }
.ds-tabs__icon { flex: none; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: inherit; }
.ds-tabs__icon[data-hue="1"] { color: var(--ds-data-1); }
.ds-tabs__icon[data-hue="3"] { color: var(--ds-data-3); }
.ds-tabs__icon[data-hue="4"] { color: var(--ds-data-4); }
.ds-tabs__icon[data-hue="5"] { color: var(--ds-data-5); }
.ds-tabs__icon[data-hue="7"] { color: var(--ds-data-7); }
/* count chip: tint + ink-2, tabular, never white-on-colour */
.ds-tabs__count {
  flex: none;
  display: inline-grid;
  place-items: center;
  min-inline-size: var(--ds-icon-size-row);   /* 20px — chips are row-icon tall, never a space step */
  block-size: var(--ds-icon-size-row);
  padding-inline: var(--ds-space-1);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-2);
  color: var(--ds-ink-2);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  font-variant-numeric: tabular-nums;
  text-transform: none;
}
/* unread / attention dot — composes .ds-notification-dot when it ships; this is the fallback paint */
.ds-tabs__dot {                    /* PLACEMENT only — the dot is a composed .ds-notification-dot (2026-09-20) */
  flex: none;
  align-self: flex-start;
  margin-block-start: calc(var(--_strip-h) / 2 - 12px);
}

/* -- states --------------------------------------------------------------- */
.ds-tabs__item:hover,
.ds-tabs__item[data-state="hover"] { color: var(--ds-ink); }
.ds-tabs__item:hover::after,
.ds-tabs__item[data-state="hover"]::after { background: var(--ds-rule-strong); }        /* hover hint: a rule-grade line */

.ds-tabs__item:is([aria-current="page"], [aria-current="true"], [aria-selected="true"]) {
  color: var(--_ink-selected);
  font-weight: var(--_weight-selected);
}
.ds-tabs__item:is([aria-current="page"], [aria-current="true"], [aria-selected="true"])::after { background: var(--_line-color); }

.ds-tabs__item[aria-disabled="true"],
.ds-tabs__item:disabled {
  color: var(--ds-ink-faint);
  cursor: not-allowed;
}
.ds-tabs__item[aria-disabled="true"]::after, .ds-tabs__item:disabled::after { background: transparent; }
.ds-tabs__item[aria-disabled="true"] .ds-tabs__count { color: var(--ds-ink-faint); background: var(--ds-surface-3); }

/* weight change must not shift neighbours: reserve the bold width with a hidden twin */
.ds-tabs__label[data-label]::after {
  content: attr(data-label);
  display: block;
  block-size: 0;
  overflow: hidden;
  visibility: hidden;
  font-weight: var(--ds-weight-semibold);
}

/* loading — skeleton tabs in the TRUE strip height, no layout jump */
.ds-tabs__skeleton {
  display: inline-block;
  inline-size: var(--_skeleton-w, 64px);
  block-size: 12px;                 /* skeleton bar geometry */
  margin-inline: var(--_pad-x);
  align-self: center;
  border-radius: var(--ds-radius-xs);
  background: var(--ds-surface-3);
  animation: ds-tabs-pulse calc(var(--ds-dur-slow) * 4) var(--ds-ease-standard) infinite alternate;
}
@keyframes ds-tabs-pulse { to { opacity: .45; } }
.ds-tabs[aria-busy="true"] .ds-tabs__list { min-height: var(--_strip-h); }

/* empty — a dashed footprint that says what will go here and offers the first action */
.ds-tabs__empty {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  min-height: var(--_strip-h);
  padding-inline: var(--_pad-x);
  color: var(--ds-ink-muted);
  border: var(--ds-border-width) dashed var(--ds-rule-strong);
  border-radius: var(--ds-radius-sm);
  flex: 1 1 auto;
}
.ds-tabs[data-state="empty"] { border-block-end-color: transparent; }

/* sticky / scrolled (quicken): opaque, clips scrolled content, gains the lift once stuck */
.ds-tabs[data-sticky] { position: sticky; inset-block-start: 0; z-index: var(--ds-z-sticky); background: var(--ds-surface); }
.ds-tabs[data-sticky][data-state="stuck"] { box-shadow: var(--ds-shadow-lift); }

/* -- right-aligned end slot (manychat / plane / synara) --------------------- */
.ds-tabs__end {
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
  flex: none;
  margin-inline-start: auto;
  padding-inline-end: var(--ds-space-1);
}
.ds-tabs__action {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-control-h);
  padding-inline: var(--ds-control-pad-x);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-surface);
  color: var(--ds-ink);
  font: inherit;
  font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case);
  white-space: nowrap;
  box-shadow: var(--ds-shadow-lip);
  cursor: pointer;
}
.ds-tabs__action:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-tabs__action[data-tone="danger"] { color: var(--ds-danger-ink); }
.ds-tabs__icon-btn {
  display: inline-grid;
  place-items: center;
  inline-size: var(--ds-control-h-sm);
  block-size: var(--ds-control-h-sm);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: transparent;
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-tabs__icon-btn svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
.ds-tabs__icon-btn:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }

/* ============================================================================
   PILL KIND — role="tablist"; tint track, raised cell; no line
   ========================================================================== */
.ds-tabs[data-kind="pill"] {
  --_strip-h: var(--ds-control-h-sm);
  --_gap: var(--ds-space-0-5);
  --_track: var(--ds-surface-2);
  --_pill-bg: var(--ds-surface);
  --_pill-radius: var(--ds-radius-sm);
  display: inline-flex;
  align-items: center;
  max-inline-size: 100%;            /* never wider than its column; the list scrolls inside */
  border-block-end: 0;
}
.ds-tabs[data-kind="pill"] .ds-tabs__list {
  flex: 0 1 auto;
  padding: var(--ds-space-0-5);
  background: var(--_track);
  border-radius: calc(var(--_pill-radius) + var(--ds-space-0-5));   /* parent = child + inset, so child ≤ parent − 2 */
}
.ds-tabs[data-kind="pill"] .ds-tabs__item {
  border-radius: var(--_pill-radius);
  border: var(--ds-border-width) solid transparent;
}
.ds-tabs[data-kind="pill"] .ds-tabs__item::after { content: none; }
.ds-tabs[data-kind="pill"] .ds-tabs__item:hover,
.ds-tabs[data-kind="pill"] .ds-tabs__item[data-state="hover"] { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-tabs[data-kind="pill"] .ds-tabs__item[aria-selected="true"] {
  background: var(--_pill-bg);
  color: var(--ds-selected-ink);
  border-color: var(--ds-rule);            /* hairline-and-tint depth — never a shadow (R4) */
}
.ds-tabs[data-kind="pill"] .ds-tabs__item:disabled { background: transparent; }
/* a page that chose data-selection="underline|bar" gets a line on the pill kind too (contract §3) */
[data-selection="underline"] .ds-tabs[data-kind="pill"] .ds-tabs__item[aria-selected="true"],
[data-selection="bar"]       .ds-tabs[data-kind="pill"] .ds-tabs__item[aria-selected="true"] { background: transparent; border-color: transparent; }
[data-selection="underline"] .ds-tabs[data-kind="pill"] .ds-tabs__item[aria-selected="true"]::after,
[data-selection="bar"]       .ds-tabs[data-kind="pill"] .ds-tabs__item[aria-selected="true"]::after { content: ""; inset-block-end: 0; background: var(--ds-selected-line); }

/* ============================================================================
   UNDERLINE VARIANTS
   ========================================================================== */
/* quicken: 48px sticky opaque bar; accent text + 2px accent line spanning the PADDED tab; Title Case */
.ds-tabs[data-variant="quicken-sticky-full-pad"] {
  --_strip-h: calc(var(--ds-control-h-lg) + 4px);
  --_pad-x: var(--ds-space-4);
  --_gap: var(--ds-space-1);
  --_ink: var(--ds-ink-2);
  --_ink-selected: var(--ds-accent-ink);
  --_line-inset: 0px;
  --_rail: var(--ds-rule);
  background: var(--ds-surface);
}
/* clickup: 13/500 + coloured icon, 2px INK line exactly the tab's width; 36px */
.ds-tabs[data-variant="clickup-content-width"] {
  --_strip-h: var(--ds-control-h);
  --_size: var(--ds-text-sm);
  --_pad-x: var(--ds-space-2);
  --_gap: var(--ds-space-2);
  --_line-inset: var(--_pad-x);
  --_line-color: var(--ds-ink);
}
/* contra: 20px labels, prefix icons carry state, no rail, 2px ink line the label's width, 24–32 gaps */
.ds-tabs[data-variant="contra-label-width-with-prefix-icon"] {
  --_size: var(--ds-text-xl);
  --_pad-x: 0px;
  --_gap: var(--ds-space-8);
  --_line-inset: 0px;
  --_line-color: var(--ds-ink);
  --_rail: transparent;
  --_ink: var(--ds-ink-muted);
  --_weight-selected: var(--ds-weight-semibold);
}
.ds-tabs[data-variant="contra-label-width-with-prefix-icon"] .ds-tabs__item::after { inset-block-end: 0; }
/* oku: 15px labels + 24px tint count chip; 3px ink line the label's width over a 1px rail */
.ds-tabs[data-variant="oku-counted"] {
  --_size: var(--ds-text-md);
  --_pad-x: 0px;
  --_gap: var(--ds-space-6);
  --_line-w: 3px;
  --_line-inset: 0px;
  --_line-color: var(--ds-ink);
  --_strip-h: var(--ds-control-h-lg);
}
.ds-tabs[data-variant="oku-counted"] .ds-tabs__count { min-inline-size: var(--ds-icon-size-rail); block-size: var(--ds-icon-size-rail); }
/* manychat channel strip: brand glyph + name, 2px ACCENT line sitting on the bottom edge, 40px */
.ds-tabs[data-variant="manychat-channel-strip"] {
  --_strip-h: var(--ds-control-h-lg);
  --_pad-x: var(--ds-space-3);
  --_gap: var(--ds-space-2);
  --_line-inset: 0px;
  --_line-color: var(--ds-accent-line);
  --_ink: var(--ds-ink-2);
}
/* luma: 18px text tabs 22px apart, active black + 2px ink line flush with the band rule */
.ds-tabs[data-variant="luma-admin-on-band-rule"] {
  --_size: var(--ds-text-lg);
  --_pad-x: 0px;
  --_gap: var(--ds-space-5);
  --_line-inset: 0px;
  --_line-color: var(--ds-ink);
  --_strip-h: var(--ds-control-h);
  --_weight-selected: var(--ds-weight-medium);
}
/* origin: equal halves inside a card; ink + 2px line spanning the half; regular weight */
.ds-tabs[data-variant="origin-segmented-underline"] {
  --_size: var(--ds-text-lg);
  --_gap: 0px;
  --_line-inset: 0px;
  --_line-color: var(--ds-ink);
  --_weight-selected: var(--ds-weight-regular);
  --_strip-h: var(--ds-control-h-lg);
}
.ds-tabs[data-variant="origin-segmented-underline"] .ds-tabs__list { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.ds-tabs[data-variant="origin-segmented-underline"] .ds-tabs__tab { display: grid; }
.ds-tabs[data-variant="origin-segmented-underline"] .ds-tabs__item { justify-content: center; font-weight: var(--ds-weight-regular); }
/* clickup equal-width switch: 2 cells, thicker line, label colour UNCHANGED = an N-way switch */
.ds-tabs[data-variant="clickup-equal-width-switch"] {
  --_gap: 0px;
  --_line-w: 3px;
  --_line-inset: 0px;
  --_line-color: var(--ds-border-strong);
  --_ink: var(--ds-ink-2);
  --_ink-selected: var(--ds-ink-2);
  --_weight-selected: var(--ds-weight-medium);
  --_strip-h: var(--ds-control-h-lg);
}
.ds-tabs[data-variant="clickup-equal-width-switch"] .ds-tabs__list { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.ds-tabs[data-variant="clickup-equal-width-switch"] .ds-tabs__tab { display: grid; }
.ds-tabs[data-variant="clickup-equal-width-switch"] .ds-tabs__item { justify-content: center; }
/* manychat text tabs + outline action cluster right, 56px, rule under the whole strip */
.ds-tabs[data-variant="manychat-text-tabs-plus-actions"] {
  --_strip-h: var(--ds-topbar-h);
  --_pad-x: 0px;
  --_gap: var(--ds-space-8);
  --_line-inset: 0px;
  --_line-color: var(--ds-accent-line);
  --_ink: var(--ds-ink-muted);
}

/* ============================================================================
   PILL VARIANTS
   ========================================================================== */
/* retool: in a card header; selected = accent tint pill + accent ink, 12/600, 24px; inactive plain */
.ds-tabs[data-variant="retool-tint-pill-tab"] {
  --_strip-h: var(--ds-icon-size-rail);
  --_size: var(--ds-text-sm);
  --_gap: var(--ds-space-6);
  --_track: transparent;
  --_pill-bg: var(--ds-accent-tint);
  --_pill-radius: var(--ds-radius-sm);
  --_pad-x: var(--ds-space-2);
  --_ink: var(--ds-ink-2);
}
.ds-tabs[data-variant="retool-tint-pill-tab"] .ds-tabs__list { padding: 0; }
.ds-tabs[data-variant="retool-tint-pill-tab"] .ds-tabs__item[aria-selected="true"] { color: var(--ds-accent-ink); border-color: transparent; font-weight: var(--ds-weight-semibold); }
/* synara: text+icon tabs, selected = tint pill r8, no line; trailing + and layout icon; a 2nd-level strip */
.ds-tabs[data-variant="synara-tint-pill-tabs"] {
  --_size: var(--ds-text-sm);
  --_track: transparent;
  --_pill-bg: var(--ds-surface-selected);
  --_pill-radius: var(--ds-radius-md);
  --_gap: var(--ds-space-1);
  --_strip-h: var(--ds-control-h-sm);
  display: flex;
}
.ds-tabs[data-variant="synara-tint-pill-tabs"] .ds-tabs__list { padding: 0; }
.ds-tabs[data-variant="synara-tint-pill-tabs"] .ds-tabs__item[aria-selected="true"] { border-color: transparent; }
.ds-tabs[data-variant="synara-tint-pill-tabs"][data-level="2"] { --_size: var(--ds-text-xs); --_strip-h: var(--ds-icon-size-rail); --_pill-bg: var(--ds-surface-2); }
/* origin: page-level pill row; 30px tint pill, 18px regular, 40px apart, no weight change */
.ds-tabs[data-variant="origin-pill-row"] {
  --_size: var(--ds-text-lg);
  --_track: transparent;
  --_pill-bg: var(--ds-surface-selected);
  --_pill-radius: var(--ds-radius-lg);
  --_gap: var(--ds-space-4);
  --_strip-h: var(--ds-control-h-sm);
  --_ink: var(--ds-ink-2);
  --_weight-selected: var(--ds-weight-regular);
}
.ds-tabs[data-variant="origin-pill-row"] .ds-tabs__list { padding: 0; }
.ds-tabs[data-variant="origin-pill-row"] .ds-tabs__item { font-weight: var(--ds-weight-regular); }
.ds-tabs[data-variant="origin-pill-row"] .ds-tabs__item[aria-selected="true"] { border-color: transparent; }
/* intercom: four equal cells with a hairline around and between; active = cream cell + ink */
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] {
  inline-size: 100%;
  --_track: var(--ds-surface);
  --_pill-bg: var(--ds-surface-2);
  --_pill-radius: 0px;
  --_gap: 0px;
  --_strip-h: var(--ds-control-h-lg);
  --_ink: var(--ds-ink-muted);
  display: flex;
}
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__list {
  flex: 1 1 auto;
  inline-size: 100%;
  display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
  padding: 0;
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: var(--ds-radius-md);
  overflow: hidden;
}
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__tab { display: grid; }
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__tab + .ds-tabs__tab { border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__item { justify-content: center; border: 0; border-radius: 0; }
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__item[aria-selected="true"] { border-color: transparent; }
/* anchor-link form (L-HOW-03: the strip as a table of contents — <nav> › <ul> › <li class="ds-tabs__tab"> › <a class="ds-tabs__item"
   href="#chapter" aria-current="true">): the pill kind paints aria-current exactly like aria-selected, so a TOC needs no
   role="tab" and no script (2026-09-20, sections-E) */
.ds-tabs[data-kind="pill"] .ds-tabs__item[aria-current]:not([aria-current="false"]) { background: var(--_pill-bg); color: var(--ds-selected-ink); border-color: var(--ds-rule); font-weight: var(--_weight-selected); }
.ds-tabs[data-variant="intercom-hairline-strip-over-media"] .ds-tabs__item[aria-current]:not([aria-current="false"]) { border-color: transparent; }
/* data-flush (intercom variant, 2026-09-20): "bottom" squares the bottom corners so the strip sits flush on the media panel
   beneath it (the hairline stays — the panel is a photographic plate with no edge of its own); "row" makes it a row of the
   page frame: radius 0, no side hairlines (the page rails are the sides) and no bottom hairline (the window's seam is the line) */
.ds-tabs[data-variant="intercom-hairline-strip-over-media"][data-flush="bottom"] .ds-tabs__list { border-end-start-radius: 0; border-end-end-radius: 0; }
.ds-tabs[data-variant="intercom-hairline-strip-over-media"][data-flush="row"]    .ds-tabs__list { border-radius: 0; border-inline: 0; border-block-end: 0; }
/* retool weight-only: Components / Modules — position + weight, nothing drawn */
.ds-tabs[data-variant="retool-weight-only"] {
  --_track: transparent;
  --_pill-bg: transparent;
  --_gap: var(--ds-space-4);
  --_pad-x: 0px;
  --_strip-h: var(--ds-control-h-sm);
  --_weight-selected: var(--ds-weight-semibold);
}
.ds-tabs[data-variant="retool-weight-only"] .ds-tabs__list { padding: 0; }
.ds-tabs[data-variant="retool-weight-only"] .ds-tabs__item[aria-selected="true"] { border-color: transparent; }
.ds-tabs[data-variant="retool-weight-only"] .ds-tabs__item:hover { background: transparent; }

/* -- orientation: data-orientation="vertical" — a left RAIL of stacked items (L-FEAT-06, 2026-09-20) ------
   From 768 the strip stands on its side: the rail line moves to the inline-start edge, the indicator becomes a
   vertical bar ON that line, rows are --_row-h tall. Under 768 the attribute is inert and the strip is the
   ordinary horizontal scroll strip (Attio's rail "becomes a chip row"). data-sticky on a vertical strip pins it
   at --_stick from the top of the viewport inside a grid / flex column (align-self: start), no surface fill.
   House (unmarked / jstov): selected = --ds-selected-bg tint + the accent bar (Intercom's tint semantics on
   Attio's rail). attio-sticky-vertical-tab-rail: no tint — ink + 2 px accent bar only, 32 px rows, 5 items. */
@media (min-width: 768px) {
  .ds-tabs[data-orientation="vertical"] {
    --_row-h: var(--ds-control-h);                     /* 36 (32 compact / 44 comfortable) */
    flex-direction: column;
    align-items: stretch;
    gap: var(--ds-space-2);
    border-block-end: 0;
    border-inline-start: var(--ds-border-width) solid var(--_rail);
  }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__list { flex-direction: column; align-items: stretch; overflow: visible; }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__tab { flex: none; }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__item {
    flex: 1 1 auto;
    justify-content: flex-start;
    min-height: var(--_row-h);
    padding-inline: var(--ds-space-4);
    border-radius: 0 var(--ds-radius-xs) var(--ds-radius-xs) 0;
    white-space: normal;
    text-align: start;
  }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__item::after {
    inset-inline: auto;
    inset-inline-start: calc(-1 * var(--ds-border-width));   /* ON the rail line */
    inset-block: var(--_line-inset);
    inline-size: var(--_line-w);
    block-size: auto;
    border-radius: 0 var(--_line-w) var(--_line-w) 0;
  }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__dot { align-self: center; margin-block-start: 0; }
  .ds-tabs[data-orientation="vertical"] .ds-tabs__end { margin-inline-start: 0; padding-inline-end: 0; }
  .ds-tabs[data-orientation="vertical"][data-sticky] { position: sticky; inset-block-start: var(--_stick, var(--ds-space-6)); align-self: start; background: transparent; }
  .ds-tabs[data-orientation="vertical"][data-sticky][data-state="stuck"] { box-shadow: none; }
  /* house vertical: the selected row is one tint step (selection = paper tint, C-06) under the accent bar */
  .ds-tabs[data-orientation="vertical"]:not([data-variant]) .ds-tabs__item:is([aria-current="page"], [aria-current="true"], [aria-selected="true"]),
  .ds-tabs[data-orientation="vertical"][data-variant="jstov"] .ds-tabs__item:is([aria-current="page"], [aria-current="true"], [aria-selected="true"]) { background: var(--ds-selected-bg); color: var(--ds-selected-ink); }
  .ds-tabs[data-orientation="vertical"]:not([data-variant]) .ds-tabs__item:hover,
  .ds-tabs[data-orientation="vertical"][data-variant="jstov"] .ds-tabs__item:hover { background: var(--ds-hover-bg); }
}
/* attio: 5 sentence-case items, 16 px, 32 px rows; active = ink + 2 px accent bar ON the frame line, no weight
   change, no tint; inactive muted (Attio's #c9ccd0 fails AA — kept at --ds-ink-muted) [attio-2-1-830x8225] */
.ds-tabs[data-variant="attio-sticky-vertical-tab-rail"] {
  --_row-h: var(--ds-control-h-sm);
  --_strip-h: var(--ds-control-h-sm);
  --_weight-selected: var(--ds-weight-regular);
  --_pad-x: var(--ds-space-4);
  font-weight: var(--ds-weight-regular);
}
.ds-tabs[data-variant="attio-sticky-vertical-tab-rail"] .ds-tabs__item { font-weight: var(--ds-weight-regular); }
.ds-tabs[data-variant="attio-sticky-vertical-tab-rail"] .ds-tabs__item:hover::after,
.ds-tabs[data-variant="attio-sticky-vertical-tab-rail"] .ds-tabs__item[data-state="hover"]::after { background: transparent; }   /* attio: hover = ink only, the bar is the current item's */

/* -- density: the strip follows the control ladder automatically (control-h-* are density-scaled) -- */
/* -- mobile: nothing to do — the list scrolls; the end slot wraps under on very narrow bars ----- */
@media (max-width: 480px) {
  .ds-tabs:has(.ds-tabs__end) { flex-wrap: wrap; }
  .ds-tabs__end { margin-inline-start: 0; padding-block-end: var(--ds-space-2); }
}

/* ds/components/button-primary.css */
/* ============================================================================
   components/button-primary/button-primary.css — Primary button (core · S1)
   Root `.ds-button-primary` is the <button> (or <a role="button">) itself.
   THE one filled control in a view (R3 / button-hierarchy-rule). The fill
   source is the variant axis: unmarked/jstov paints --ds-primary-fill (ink in
   ledger/paper/noir, accent in workbench/seeded — the theme decides);
   `filled-ink` forces the inverse surface; `filled-accent` forces the accent.
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_h --_pad-x --_radius
   --_w --_lift --_gap --_icon.
   ========================================================================== */

.ds-button-primary {
  --_h:      var(--ds-size-h);                                  /* 36 · 32 sm · 44 lg · ×density   */
  --_pad-x:  calc(var(--ds-size-pad-x) + var(--ds-space-1));    /* 16 · 14 sm · 20 lg — 4 more than an input so the label breathes */
  --_radius: var(--ds-radius-button);                           /* sm (6×scale) or pill via data-buttons */
  --_w:      auto;                                              /* instance width: style="--_w: 100%"    */
  --_gap:    var(--ds-space-2);                                 /* icon ↔ label                            */
  --_icon:   var(--ds-icon-size);                               /* 16                                      */
  --_lift:   0 0 0 0 transparent;                               /* rest: no lift; navattic-tactile → --ds-shadow-lift */
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--_gap);
  width: var(--_w);
  max-width: 100%;
  min-width: 0;
  min-height: var(--_h);
  padding-inline: var(--_pad-x);
  padding-block: 0;
  font-family: inherit;
  font-size: var(--ds-size-text);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: 0;
  text-transform: var(--ds-control-case);        /* never uppercase by a label policy (R8) */
  text-decoration: none;
  white-space: nowrap;
  color: var(--ds-ink-on-primary);
  background: var(--ds-primary-fill);
  border: var(--ds-border-width) solid var(--ds-primary-border);
  border-radius: var(--_radius);
  /* 1px inner top highlight (transparent in base; workbench sets it) + optional lift */
  box-shadow: inset 0 var(--ds-border-width) 0 0 var(--ds-primary-highlight), var(--_lift, var(--ds-shadow-lift));
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard),
              color var(--ds-dur-fast) var(--ds-ease-standard);
}

/* ---- parts ---------------------------------------------------------------- */
.ds-button-primary__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ds-button-primary__icon {
  flex: none;
  display: inline-flex;
  width: var(--_icon);
  height: var(--_icon);
}
.ds-button-primary__icon svg {
  width: 100%; height: 100%;
  fill: none; stroke: currentColor;               /* _base.css sets svg{fill:currentColor} — restate */
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}
/* trailing arrow/chevron nudges outward so the optical margin matches the leading side */
.ds-button-primary__icon[data-slot="trailing"] { margin-inline-end: calc(-1 * var(--ds-space-0-5)); }
.ds-button-primary__icon[data-slot="leading"]  { margin-inline-start: calc(-1 * var(--ds-space-0-5)); }

/* ---- states ------------------------------------------------------------------ */
.ds-button-primary:hover,
.ds-button-primary[data-state="hover"] { background: var(--ds-primary-fill-hover); }
.ds-button-primary:active,
.ds-button-primary[data-state="pressed"] {
  background: var(--ds-primary-fill-hover);
  --_lift: 0 0 0 0 transparent;                  /* pressed = sits down: lift gone, highlight gone */
  box-shadow: inset 0 var(--ds-border-width) 0 0 transparent, var(--_lift, var(--ds-shadow-lift));
}
/* focus: the universal ring from _base.css, redrawn here at +2px so it clears the fill */
.ds-button-primary:focus-visible,
.ds-button-primary[data-state="focus"] {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
}
/* disabled: faint ink on surface-3, rule border, no lift/highlight, still visible */
.ds-button-primary:disabled,
.ds-button-primary[aria-disabled="true"] {
  color: var(--ds-ink-faint);
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  box-shadow: inset 0 0 0 0 transparent, var(--_lift, var(--ds-shadow-lift));
  --_lift: 0 0 0 0 transparent;
  cursor: not-allowed;
}
/* loading: keep the footprint, hide the content, centre a spinner in currentColor */
.ds-button-primary[aria-busy="true"] { pointer-events: none; }
.ds-button-primary[aria-busy="true"] > * { visibility: hidden; }
.ds-button-primary[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: var(--_icon);
  height: var(--_icon);
  border: 2px solid transparent;
  border-block-start-color: currentColor;
  border-inline-end-color: currentColor;
  border-radius: var(--ds-radius-pill);
  animation: ds-button-primary-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-button-primary-spin { to { transform: rotate(360deg); } }

/* ---- sizes: data-size on the root or an ancestor toolbar ------------------- */
.ds-button-primary[data-size] { --_h: var(--ds-size-h); --_pad-x: calc(var(--ds-size-pad-x) + var(--ds-space-1)); }
.ds-button-primary[data-size="sm"] { --_icon: var(--ds-icon-size); }
.ds-button-primary[data-size="lg"] { --_icon: var(--ds-icon-size-row); }

/* ============================================================================
   VARIANTS — each designer's approach by name. Unmarked root = jstov (house):
   --ds-primary-fill (ink by default, theme-switchable to accent), 36 tall,
   radius-button, one per view, no lift.
   ========================================================================== */

/* filled-ink — near-black neutral fill so the accent stays free for state and data
   [braintrust-web-13] [v0-web-8] [hsajlzjwgaajrfp] [descript-editing-profile-00-03]
   [origin-connecting-an-account-00-04] [clickup-web-147] [contra-web-39] [vercel-page]
   [attio-2-1-830x8225] [intercom-3-830x8816] [fibery-3-830x6495] [navattic-web-88].
   Forces the inverse surface even in an accent-primary theme (workbench). */
.ds-button-primary[data-variant="filled-ink"] {
  color: var(--ds-ink-inverse);
  background: var(--ds-surface-inverse);
  border-color: transparent;
}
.ds-button-primary[data-variant="filled-ink"]:hover,
.ds-button-primary[data-variant="filled-ink"][data-state="hover"],
.ds-button-primary[data-variant="filled-ink"]:active {
  background: color-mix(in srgb, var(--ds-surface-inverse) 86%, var(--ds-ink-inverse));
}

/* filled-accent — brand-hue fill, white label [luma-creating-an-event-24-27]
   [manychat-web-126] [manychat-web-42] [retool-web-25] [grammarly-web-158-acordian]
   [confluence-web-23] [jasper-web-19] [perplexity-asking-a-question-05-09] [sequence-section].
   Legal only under data-accent-scope="action" | "all" (R12). */
.ds-button-primary[data-variant="filled-accent"] {
  color: var(--ds-ink-on-accent);
  background: var(--ds-accent);
  border-color: transparent;
}
.ds-button-primary[data-variant="filled-accent"]:hover,
.ds-button-primary[data-variant="filled-accent"][data-state="hover"],
.ds-button-primary[data-variant="filled-accent"]:active { background: var(--ds-accent-hover); }

/* full-width-terminal — spans the form column, 52 tall, 2.5× the form gap above it,
   no cancel beside it [luma-creating-an-event-24-27] [clickup-web-147]
   [origin-connecting-an-account-00-04]; jasper centres it content-width instead. */
.ds-button-primary[data-variant="full-width-terminal"] {
  --_w: 100%;
  --_h: calc(var(--ds-control-h-lg) + var(--ds-space-2));     /* 44 + 8 = 52 */
  --_pad-x: var(--ds-space-6);
  --_icon: var(--ds-icon-size-row);
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-semibold);
  margin-block-start: calc(var(--ds-field-pitch) * 2.5);      /* 40 at 16 pitch: the CTA's clearance */
}
.ds-button-primary[data-variant="full-width-terminal"][data-align="center"] {
  --_w: auto;
  min-width: calc(var(--_h) * 4);                             /* jasper: content-width, centred by the parent */
}

/* over-wide — the label needs ~70px; the box is 4× its height (147 at 36) so width
   itself signals primacy [manychat-web-82] [manychat-web-109] */
.ds-button-primary[data-variant="over-wide"] { min-width: calc(var(--_h) * 4); }

/* navattic-tactile — fill + 1px darker border + 1px inner top highlight + 1px lift
   [navattic-web-174] [sequence-section adds a 2px tinted halo on the pill].
   --ds-primary-border / --ds-primary-highlight are theme-owned; base leaves them
   transparent, so on a neutral page this variant differs only by the lift. */
.ds-button-primary[data-variant="navattic-tactile"] {
  --_lift: var(--ds-shadow-lift);
  border-color: color-mix(in srgb, var(--ds-primary-fill) 70%, var(--ds-ink));
  box-shadow: inset 0 var(--ds-border-width) 0 0 color-mix(in srgb, var(--ds-ink-on-primary) 18%, transparent),
              var(--_lift, var(--ds-shadow-lift));
}
.ds-button-primary[data-variant="navattic-tactile"]:active {
  box-shadow: inset 0 var(--ds-border-width) 0 0 transparent, var(--ds-shadow-lift);
  --_lift: 0 0 0 0 transparent;
}

/* synara-solid-pill — 40px black pill, 15–16px medium label, trailing icon [hsvu79cweaarswf] */
.ds-button-primary[data-variant="synara-solid-pill"] {
  --_h: calc(var(--ds-control-h) + var(--ds-space-1));        /* 36 + 4 = 40 */
  --_pad-x: var(--ds-space-5);
  --_radius: var(--ds-radius-pill);
  font-size: var(--ds-text-lg);
}

/* perplexity-circular-submit — a disc the height of the control; the enabled state is
   the page's ONLY saturated fill, disabled = tint disc + faint glyph
   [perplexity-asking-a-question-00-04] */
.ds-button-primary[data-variant="perplexity-circular-submit"] {
  --_pad-x: 0;
  --_radius: var(--ds-radius-pill);
  --_w: var(--_h);
  aspect-ratio: 1;
  color: var(--ds-ink-on-accent);
  background: var(--ds-accent);
  border-color: transparent;
}
.ds-button-primary[data-variant="perplexity-circular-submit"]:hover { background: var(--ds-accent-hover); }
.ds-button-primary[data-variant="perplexity-circular-submit"]:disabled {
  color: var(--ds-ink-faint);
  background: var(--ds-surface-2);
  border-color: transparent;
}

/* grid-snapped-fixed-width — 144×32, r4, 13px semibold; Retool buttons snap to the
   app grid instead of hugging the label [retool-web-25] */
.ds-button-primary[data-variant="grid-snapped-fixed-width"] {
  --_h: var(--ds-control-h-sm);
  --_w: calc(var(--ds-control-h-sm) * 4.5);                   /* 144 at 32 */
  --_radius: var(--ds-radius-xs);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-semibold);
}

/* ds/components/button-secondary.css */
/* ============================================================================
   components/button-secondary/button-secondary.css — Secondary / tertiary
   buttons (core · S1). Root `.ds-button-secondary` is the <button> itself; it
   shares button-primary's geometry (height ladder, 16px padding, radius-button,
   icon slots) and NEVER paints --ds-primary-fill — hierarchy is by fill only:
   outline (default) → tint → ghost. `data-tone="danger"` recolours any variant
   to --ds-danger-ink text (outline shape kept — never a filled red).
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_h --_pad-x --_radius
   --_w --_gap --_icon.
   ========================================================================== */

.ds-button-secondary {
  --_h:      var(--ds-size-h);
  --_pad-x:  calc(var(--ds-size-pad-x) + var(--ds-space-1));    /* 16 at md — matches button-primary */
  --_radius: var(--ds-radius-button);
  --_w:      auto;
  --_gap:    var(--ds-space-2);
  --_icon:   var(--ds-icon-size);
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--_gap);
  width: var(--_w);
  max-width: 100%;
  min-width: 0;
  min-height: var(--_h);
  padding-inline: var(--_pad-x);
  padding-block: 0;
  font-family: inherit;
  font-size: var(--ds-size-text);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: 0;
  text-transform: var(--ds-control-case);
  text-decoration: none;
  white-space: nowrap;
  color: var(--ds-ink);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--_radius);
  box-shadow: var(--ds-shadow-lip);               /* 0 in base; 1px darker bottom edge when the theme sets --ds-control-lip */
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard),
              color var(--ds-dur-fast) var(--ds-ease-standard);
}

/* ---- parts ---------------------------------------------------------------- */
.ds-button-secondary__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ds-button-secondary__icon {
  flex: none;
  display: inline-flex;
  width: var(--_icon);
  height: var(--_icon);
}
.ds-button-secondary__icon svg {
  width: 100%; height: 100%;
  fill: none; stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}
.ds-button-secondary__icon[data-slot="trailing"] { margin-inline-end: calc(-1 * var(--ds-space-0-5)); }
.ds-button-secondary__icon[data-slot="leading"]  { margin-inline-start: calc(-1 * var(--ds-space-0-5)); }
/* a live dot inside the icon slot ("Record"): semantic colour, 8px */
.ds-button-secondary__dot {
  flex: none;
  width: var(--ds-space-2);
  height: var(--ds-space-2);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-live);
}

/* ---- states (outline default) ---------------------------------------------- */
.ds-button-secondary:hover,
.ds-button-secondary[data-state="hover"] {
  border-color: var(--ds-border-strong);
  background: var(--ds-hover-bg);                /* surface-hover under tint, surface under lift */
}
/* data-hover="lift": the row lifts instead of tinting. Selected on the attribute because
   --ds-hover-shadow is `none` under tint and `none` cannot sit inside a shadow list. */
[data-hover="lift"] .ds-button-secondary:hover,
[data-hover="lift"] .ds-button-secondary[data-state="hover"] { box-shadow: var(--ds-shadow-lip), var(--ds-shadow-lift); }
.ds-button-secondary:active,
.ds-button-secondary[data-state="pressed"] {
  background: var(--ds-surface-pressed, var(--ds-surface-3));   /* pressed = --ds-surface-pressed (§13.4); was surface-2, lighter than hover on base */
  border-color: var(--ds-border-strong);
  box-shadow: var(--ds-shadow-lip);
}
.ds-button-secondary:focus-visible,
.ds-button-secondary[data-state="focus"] {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
}
/* pressed-toggle (aria-pressed): neutral selected tint, never the accent (rule 3) */
.ds-button-secondary[aria-pressed="true"],
.ds-button-secondary[aria-expanded="true"] {
  background: var(--ds-selected-bg);
  color: var(--ds-selected-ink);
  border-color: var(--ds-border-strong);
}
/* disabled: fill / border / text all step lighter [manychat-web-42] */
.ds-button-secondary:disabled,
.ds-button-secondary[aria-disabled="true"] {
  color: var(--ds-ink-faint);
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  box-shadow: none;
  cursor: not-allowed;
}
/* loading: footprint kept, content hidden, spinner in currentColor */
.ds-button-secondary[aria-busy="true"] { pointer-events: none; }
.ds-button-secondary[aria-busy="true"] > * { visibility: hidden; }
.ds-button-secondary[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: var(--_icon);
  height: var(--_icon);
  border: 2px solid transparent;
  border-block-start-color: currentColor;
  border-inline-end-color: currentColor;
  border-radius: var(--ds-radius-pill);
  animation: ds-button-secondary-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-button-secondary-spin { to { transform: rotate(360deg); } }

/* ---- danger tone: same shape, --ds-danger-ink text; hover = danger tint ------ */
.ds-button-secondary[data-tone="danger"],
.ds-button-secondary[data-variant="danger-text"] { color: var(--ds-danger-ink); }
.ds-button-secondary[data-tone="danger"]:hover,
.ds-button-secondary[data-variant="danger-text"]:hover,
.ds-button-secondary[data-tone="danger"][data-state="hover"],
.ds-button-secondary[data-variant="danger-text"][data-state="hover"] {
  background: var(--ds-danger-tint);
  border-color: var(--ds-danger);
  color: var(--ds-danger-ink);
}
.ds-button-secondary[data-tone="danger"]:focus-visible,
.ds-button-secondary[data-variant="danger-text"]:focus-visible { outline-color: var(--ds-danger); }

/* ---- sizes ------------------------------------------------------------------- */
.ds-button-secondary[data-size] { --_h: var(--ds-size-h); --_pad-x: calc(var(--ds-size-pad-x) + var(--ds-space-1)); }
.ds-button-secondary[data-size="lg"] { --_icon: var(--ds-icon-size-row); }

/* ============================================================================
   VARIANTS. Unmarked root = jstov (house): outlined-white — --ds-surface fill,
   1px --ds-border (the contract's control border; the taxonomy's "rule-strong"
   is the same grade in ledger), 36 tall, radius-button, the control lip when the
   theme has one. tint-fill for in-card quiet actions; danger = tone.
   ========================================================================== */

/* outlined-white — 1px rule, white fill [descript-editing-profile-00-03] [jasper-web-19]
   [manychat-web-42] [retool-web-25] [clickup-web-147] [contra-web-39]: identical to the
   unmarked root (the house default); the attribute exists so the reference name selects it. */

/* outlined-lip — border + the 1px lift shadow shared with inputs so a toolbar row aligns
   [navattic-web-174] [navattic-web-153] [manychat-web-126] */
.ds-button-secondary[data-variant="outlined-lip"] {
  --_h: var(--ds-control-h-sm);
  --_pad-x: var(--ds-space-3);
  box-shadow: var(--ds-shadow-lip), var(--ds-shadow-lift);
}
.ds-button-secondary[data-variant="outlined-lip"]:hover { box-shadow: var(--ds-shadow-lip), var(--ds-shadow-lift); }

/* outlined-mono-caps-pill — 44–46 px pill, darker 1px border, label lane in mono caps
   with +0.12em tracking, 16px leading icon [origin-connecting-an-account-00-04]
   [origin-connecting-an-account-05-06]. Case is applied HERE (a designer variant),
   not by --ds-label-case (R8). */
.ds-button-secondary[data-variant="outlined-mono-caps-pill"] {
  --_h: var(--ds-control-h-lg);                                /* 44 (46 at origin's 16px base) */
  --_pad-x: var(--ds-space-6);
  --_radius: var(--ds-radius-pill);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  letter-spacing: .12em;
  text-transform: uppercase;
  border-color: var(--ds-border-strong);
  background: transparent;
}
.ds-button-secondary[data-variant="outlined-mono-caps-pill"]:hover { background: var(--ds-hover-bg); border-color: var(--ds-ink-muted); }

/* tint-fill — one tint step, no border, no shadow [perplexity-asking-a-question-00-04]
   32px "Learn More" · [luma-creating-an-event-24-27] 229×36 #f4f4f4 r8 ·
   [luma-creating-an-event-00-03] 50px "+ Create Event" · [origin-05-06] quiet pill */
.ds-button-secondary[data-variant="tint-fill"] {
  background: var(--ds-surface-2);
  border-color: transparent;
  box-shadow: none;
}
.ds-button-secondary[data-variant="tint-fill"]:hover,
.ds-button-secondary[data-variant="tint-fill"][data-state="hover"] { background: var(--ds-surface-3); border-color: transparent; box-shadow: none; }
.ds-button-secondary[data-variant="tint-fill"]:active { background: var(--ds-surface-pressed, var(--ds-surface-3)); }
.ds-button-secondary[data-variant="tint-fill"]:disabled { background: var(--ds-surface-3); border-color: transparent; }

/* ghost-text — bare label, no container; hover paints the hover tint
   [descript-editing-profile-00-03] [clickup-web-147] [confluence-web-23] quiet card CTAs */
.ds-button-secondary[data-variant="ghost-text"] {
  --_pad-x: var(--ds-space-2);
  color: var(--ds-ink-2);
  background: transparent;
  border-color: transparent;
  box-shadow: none;
}
.ds-button-secondary[data-variant="ghost-text"]:hover,
.ds-button-secondary[data-variant="ghost-text"][data-state="hover"] { background: var(--ds-hover-bg); border-color: transparent; color: var(--ds-ink); box-shadow: none; }
.ds-button-secondary[data-variant="ghost-text"]:disabled { background: transparent; border-color: transparent; }

/* glass — frosted control over media: --ds-glass-fill + --ds-glass-border + blur,
   40px pill, leading glyph [hsvu79cweaarswf]. Text is --ds-ink: the glass fill follows
   the mode (light glass in light, dark glass in dark) so the pair always reads. */
.ds-button-secondary[data-variant="glass"] {
  --_h: calc(var(--ds-control-h) + var(--ds-space-1));        /* 40 */
  --_pad-x: var(--ds-space-5);
  --_radius: var(--ds-radius-pill);
  font-size: var(--ds-text-lg);
  color: var(--ds-ink);
  background: var(--ds-glass-fill);
  border-color: var(--ds-glass-border);
  box-shadow: none;
  -webkit-backdrop-filter: blur(var(--ds-glass-blur));
  backdrop-filter: blur(var(--ds-glass-blur));
}
.ds-button-secondary[data-variant="glass"]:hover { background: var(--ds-glass-fill); border-color: var(--ds-ink); box-shadow: none; }

/* hsaj-full-width-ghost — input-shaped 48px white bar, radius-md, leading icon, full width
   [hsajlzkwuaagtdc]. Reference weakness: indistinguishable from disabled; here the
   rest state keeps --ds-border + ink while disabled drops to --ds-rule + faint. */
.ds-button-secondary[data-variant="hsaj-full-width-ghost"] {
  --_w: 100%;
  --_h: calc(var(--ds-control-h) + var(--ds-space-3));        /* 48 */
  --_pad-x: var(--ds-space-4);
  --_radius: var(--ds-radius-md);
  --_icon: var(--ds-icon-size-row);
  justify-content: flex-start;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-regular);
  box-shadow: none;
}

/* ink-outline — 1px INK border (not the rule grade), 34px, radius-md, 600 label; reads as a
   control against #ddd chips [airbnb-web-528] */
.ds-button-secondary[data-variant="ink-outline"] {
  --_h: calc(var(--ds-control-h-sm) + var(--ds-space-0-5));   /* 34 */
  --_radius: var(--ds-radius-md);
  font-weight: var(--ds-weight-semibold);
  border-color: var(--ds-ink);
  box-shadow: none;
}
.ds-button-secondary[data-variant="ink-outline"]:hover { border-color: var(--ds-ink); background: var(--ds-hover-bg); box-shadow: none; }

/* dark-ghost — on a dark chapter: one tint step up + its own border
   [attio-2-1-830x8225] #1c1c1e fill / #2e2f31 border. Token-wise it is surface-2 +
   border inside a data-mode="dark" island, which is how the demo shows it. */
.ds-button-secondary[data-variant="dark-ghost"] {
  background: var(--ds-surface-2);
  border-color: var(--ds-border);
  box-shadow: none;
}
.ds-button-secondary[data-variant="dark-ghost"]:hover { background: var(--ds-surface-3); border-color: var(--ds-border-strong); box-shadow: none; }

/* danger-text — red text only, same outline shape as its sibling [manychat-web-64] "Stop"
   beside "Edit"; [descript-editing-profile-00-03] danger link. Rules live in the tone
   block above; the attribute is kept so the reference name selects it. */

/* ds/components/banner-callout.css */
/* ============================================================================
   banner-callout — Banner / inline callout / announcement         (taxonomy §E · common · S1)
   Root: .ds-banner-callout — <div role="status"> (system notice), <aside> (callout), <a> (a pill that is one link),
     <div role="alert"> (a mode banner the user must see). It lives IN FLOW: a system notice pushes content down and
     never overlays the controls it references (X-05); the one exception, data-layout="floating", sits on the surface
     it governs (a canvas), not over chrome, and carries no shadow — it is not an overlay.
   Parts: __icon (16/20 stroke glyph; data-disc = a 28 px tinted disc) · __body (title + text) · __title · __text ·
          __action (link / small button slot, may sit inline in the sentence) · __dismiss (icon-button slot, end) ·
          __badge (status-badge slot, leading — "New") · __art (illustration slot, grammarly) · __chevron (trailing ›)
   Axes:  data-layout="inline|bar|pill|floating"     card callout (default) · full-width push-down bar · self-sized capsule ·
                                                     centred on the governed surface
          data-tone="neutral|info|success|warning|danger|accent|ai"   tint + same-hue hairline + same-hue ink;
                                                     ai = the SECOND accent (warm), never the action accent
   Variants: jstov (unmarked root — inline: tint + hairline, no dismiss unless transient; bar: neutral, icon · sentence ·
     one inline link · ×) · grammarly-plan-limit-tint-bordered · manychat-ai-insight-gradient ·
     manychat-push-down-system-notice · manychat-read-only-mode-banner · elevenlabs-announce-pill ·
     attio-announcement-capsule · fibery-note-pill · navattic-plan-status-pill · manychat-coach-mark-pill
   States: rest · hover (pill/link roots only: one tint step) · focus-visible (the universal ring on the root link) ·
     data-state="dismissed" (collapses) · aria-busy (skeleton bar in the true height)
   Private knobs: --_fill --_edge --_ink --_glyph --_radius --_pad-y --_pad-x --_gap --_min-h
   ========================================================================== */

.ds-banner-callout svg[fill="none"] { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

.ds-banner-callout {
  --_fill:   var(--ds-surface);
  --_edge:   var(--ds-rule);
  --_ink:    var(--ds-ink);                       /* title / links                      */
  --_glyph:  var(--ds-ink-muted);                 /* icon                                */
  --_radius: var(--ds-radius-md);
  --_pad-y:  var(--ds-space-3);
  --_pad-x:  var(--ds-space-4);
  --_gap:    var(--ds-space-3);
  --_min-h:  0px;
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: var(--_gap);
  min-inline-size: 0;
  max-inline-size: 100%;
  min-block-size: var(--_min-h);
  padding: var(--_pad-y) var(--_pad-x);
  border-radius: var(--_radius);
  background: var(--_fill);
  border: var(--ds-border-width) solid var(--_edge);
  color: var(--ds-ink-2);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
  text-decoration: none;
}
.ds-banner-callout__icon { flex: none; display: inline-grid; place-items: center; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); margin-block-start: calc((1lh - var(--ds-icon-size)) / 2); color: var(--_glyph); }
.ds-banner-callout__icon svg { inline-size: 100%; block-size: 100%; }
.ds-banner-callout__icon[data-disc] { inline-size: 28px; block-size: 28px; margin-block-start: 0; border-radius: var(--ds-radius-pill); background: var(--ds-surface-2); }
.ds-banner-callout__icon[data-disc] svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
.ds-banner-callout__body { flex: 1 1 auto; min-inline-size: 0; display: flex; flex-direction: column; gap: var(--ds-space-0-5); }
.ds-banner-callout__title { color: var(--_ink); font-weight: var(--ds-weight-semibold); }
.ds-banner-callout__text { color: inherit; max-inline-size: var(--ds-measure); }
.ds-banner-callout__text a, .ds-banner-callout__action { color: var(--_ink); font-weight: var(--ds-weight-medium); text-decoration: underline; text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); text-underline-offset: .15em; }
.ds-banner-callout__text a:hover, .ds-banner-callout__action:hover { text-decoration-color: currentColor; }
.ds-banner-callout__action { flex: none; align-self: center; }
:is(.ds-banner-callout:not([data-layout]), .ds-banner-callout[data-layout="inline"]) > .ds-banner-callout__body > .ds-banner-callout__action { align-self: flex-start; margin-block-start: var(--ds-space-1); }   /* column body: start-aligned */
.ds-banner-callout__dismiss { flex: none; align-self: flex-start; margin-block: calc(-1 * var(--ds-space-1)); margin-inline-end: calc(-1 * var(--ds-space-2)); }
.ds-banner-callout__badge { flex: none; align-self: center; }
.ds-banner-callout__chevron { flex: none; align-self: center; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: var(--ds-ink-muted); }
.ds-banner-callout__art { flex: none; align-self: center; display: grid; place-items: center; inline-size: 56px; block-size: 56px; color: var(--_ink); }
.ds-banner-callout__art svg { inline-size: 100%; block-size: 100%; }

/* -- tones: tint fill, same-hue hairline (35 % of the hue), same-hue ink for title/links ---------------- */
.ds-banner-callout[data-tone="info"]    { --_fill: var(--ds-info-tint);    --_edge: color-mix(in srgb, var(--ds-info) 35%, transparent);    --_ink: var(--ds-info-ink);    --_glyph: var(--ds-info); }
.ds-banner-callout[data-tone="success"] { --_fill: var(--ds-success-tint); --_edge: color-mix(in srgb, var(--ds-success) 35%, transparent); --_ink: var(--ds-success-ink); --_glyph: var(--ds-success); }
.ds-banner-callout[data-tone="warning"] { --_fill: var(--ds-warning-tint); --_edge: color-mix(in srgb, var(--ds-warning) 40%, transparent); --_ink: var(--ds-warning-ink); --_glyph: var(--ds-warning); }
.ds-banner-callout[data-tone="danger"]  { --_fill: var(--ds-danger-tint);  --_edge: color-mix(in srgb, var(--ds-danger) 35%, transparent);  --_ink: var(--ds-danger-ink);  --_glyph: var(--ds-danger); }
.ds-banner-callout[data-tone="accent"]  { --_fill: var(--ds-accent-tint);  --_edge: var(--ds-accent-soft);                                     --_ink: var(--ds-accent-ink);  --_glyph: var(--ds-accent); }
/* ai: the warm second accent — distinct from the action accent by contract; disc + gradient wash */
.ds-banner-callout[data-tone="ai"]      { --_fill: var(--ds-accent-2-tint); --_edge: transparent; --_ink: var(--ds-accent-2-ink); --_glyph: var(--ds-accent-2-ink); }
.ds-banner-callout[data-tone="ai"] .ds-banner-callout__icon[data-disc] { background: color-mix(in srgb, var(--ds-accent-2-tint) 60%, var(--ds-surface)); }
.ds-banner-callout[data-tone] .ds-banner-callout__text { color: var(--_ink); }
.ds-banner-callout[data-tone] .ds-banner-callout__title { color: var(--_ink); }

/* -- layouts ---------------------------------------------------------------------------------------- */
/* bar: full-width push-down system notice — one line, icon · sentence (link inline) · ×, hairline below */
.ds-banner-callout[data-layout="bar"] {
  --_radius: 0px;
  --_pad-y: var(--ds-space-1);
  --_min-h: calc(var(--ds-control-h-sm) + 2px);   /* 34 (manychat) */
  align-items: center;
  inline-size: 100%;
  border-width: 0 0 var(--ds-border-width);
}
.ds-banner-callout[data-layout="bar"] .ds-banner-callout__icon { margin-block-start: 0; }
.ds-banner-callout[data-layout="bar"] .ds-banner-callout__body { flex-direction: row; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--ds-space-2); }
.ds-banner-callout[data-layout="bar"] .ds-banner-callout__dismiss { align-self: center; margin-block: 0; }
.ds-banner-callout[data-layout="bar"][data-tone] { border-block-end-color: var(--_edge); }

/* pill: self-sized capsule, one click target; badge inset 8, text, chevron 16 */
.ds-banner-callout[data-layout="pill"] {
  --_radius: var(--ds-radius-pill);
  --_pad-y: 0px;
  --_pad-x: var(--ds-space-4);
  --_gap: var(--ds-space-2);
  --_min-h: var(--ds-control-h);
  display: inline-flex;
  align-items: center;
  inline-size: auto;
  max-inline-size: 100%;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-banner-callout[data-layout="pill"] .ds-banner-callout__body { flex-direction: row; align-items: center; gap: var(--ds-space-2); }
.ds-banner-callout[data-layout="pill"] .ds-banner-callout__text { color: var(--ds-ink); font-size: var(--ds-text-md); }
.ds-banner-callout[data-layout="pill"] .ds-banner-callout__icon { margin-block-start: 0; }
.ds-banner-callout[data-layout="pill"]:has(> .ds-banner-callout__badge) { padding-inline-start: var(--ds-space-2); }
.ds-banner-callout[data-layout="pill"]:hover, .ds-banner-callout[data-layout="pill"][data-state="hover"] { background: var(--ds-hover-bg); border-color: var(--ds-border-strong); }
.ds-banner-callout[data-layout="pill"]:hover .ds-banner-callout__chevron { transform: translateX(var(--ds-space-0-5)); }
.ds-banner-callout[data-layout="pill"][data-tone] .ds-banner-callout__text { color: var(--_ink); }
.ds-banner-callout[data-layout="pill"][data-tone]:hover { background: var(--_fill); border-color: var(--_ink); }
.ds-banner-callout[data-layout="pill"][data-w="full"] { display: flex; inline-size: 100%; }

/* floating: centred at the top of the surface it governs (host is position: relative); tint + hairline, NO shadow */
.ds-banner-callout[data-layout="floating"] {
  --_radius: var(--ds-radius-sm);
  --_pad-y: var(--ds-space-1);
  --_pad-x: var(--ds-space-3);
  --_min-h: var(--ds-control-h-sm);
  position: absolute;
  inset-block-start: var(--ds-space-3);
  inset-inline-start: 50%;
  transform: translateX(-50%);
  z-index: var(--ds-z-sticky);
  display: inline-flex;
  align-items: center;
  inline-size: max-content;
  max-inline-size: calc(100% - 2 * var(--ds-space-4));
}
.ds-banner-callout[data-layout="floating"] .ds-banner-callout__body { flex-direction: row; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--ds-space-3); }
.ds-banner-callout[data-layout="floating"] .ds-banner-callout__text { font-size: var(--ds-text-md); }
/* hanging: a tab flush to the bar above it (coach mark) — square top corners */
.ds-banner-callout[data-layout="floating"][data-hanging] { inset-block-start: 0; border-start-start-radius: 0; border-start-end-radius: 0; border-block-start-width: 0; }

/* -- states ------------------------------------------------------------------------------------------ */
.ds-banner-callout:is(a, button):focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-banner-callout[data-state="dismissed"] { display: none; }
.ds-banner-callout[aria-busy="true"] { --_fill: var(--ds-skeleton); --_edge: transparent; color: transparent; }
.ds-banner-callout[aria-busy="true"] > * { visibility: hidden; }

/* =========================================================================
   VARIANTS
   ========================================================================= */

/* grammarly: accent tint + 1 px accent-rule border, r4, 80 tall, content CENTRED: ~60 px brand blobs + 18/600 accent
   heading + one line with an inline link; no dismiss. Their soft shadow is skin and is dropped (R5). */
.ds-banner-callout[data-variant="grammarly-plan-limit-tint-bordered"] {
  --_fill: var(--ds-accent-tint);
  --_edge: var(--ds-accent-soft);
  --_ink: var(--ds-accent-ink);
  --_radius: var(--ds-radius-xs);
  --_min-h: 80px;
  --_pad-y: var(--ds-space-2);
  align-items: center;
  justify-content: center;
}
.ds-banner-callout[data-variant="grammarly-plan-limit-tint-bordered"] .ds-banner-callout__body { flex: 0 1 auto; }
.ds-banner-callout[data-variant="grammarly-plan-limit-tint-bordered"] .ds-banner-callout__title { font-size: var(--ds-text-lg); }
.ds-banner-callout[data-variant="grammarly-plan-limit-tint-bordered"] .ds-banner-callout__text { color: var(--ds-ink-2); }

/* manychat: AI insight card heading a list — no border, diagonal white → warm gradient, 28 px warm disc + sparkle,
   14 px question wrapping to two lines, 14 px accent link, × top-right. The AI hue is the second accent. */
.ds-banner-callout[data-variant="manychat-ai-insight-gradient"] {
  --_edge: transparent;
  --_radius: var(--ds-radius-md);
  --_ink: var(--ds-accent-2-ink);
  --_glyph: var(--ds-accent-2-ink);
  background: linear-gradient(135deg, var(--ds-surface) 30%, var(--ds-accent-2-tint) 100%);
}
.ds-banner-callout[data-variant="manychat-ai-insight-gradient"] .ds-banner-callout__text { color: var(--ds-ink); }
.ds-banner-callout[data-variant="manychat-ai-insight-gradient"] .ds-banner-callout__action { align-self: flex-start; color: var(--ds-ink-link); text-decoration: none; }

/* manychat: 34 px white bar ABOVE the app bar; bell · sentence · inline link · × far right; hairline below; pushes the app down */
.ds-banner-callout[data-variant="manychat-push-down-system-notice"] { --_fill: var(--ds-surface); --_edge: var(--ds-rule-strong); }
.ds-banner-callout[data-variant="manychat-push-down-system-notice"] .ds-banner-callout__text a { color: var(--ds-ink-link); font-weight: var(--ds-weight-regular); text-decoration: none; }

/* manychat: read-only mode — 326×29 warm-tint pill with a 1 px warm rule, r6, centred at the top of the canvas;
   "You are viewing a published version" + underlined accent "Edit"; no icon, no ×. Their 3.2:1 text → warning-ink. */
.ds-banner-callout[data-variant="manychat-read-only-mode-banner"] { --_fill: var(--ds-warning-tint); --_edge: color-mix(in srgb, var(--ds-warning) 35%, transparent); --_ink: var(--ds-warning-ink); }
.ds-banner-callout[data-variant="manychat-read-only-mode-banner"] .ds-banner-callout__text { color: var(--_ink); }
.ds-banner-callout[data-variant="manychat-read-only-mode-banner"] .ds-banner-callout__action { color: var(--ds-ink-link); }

/* elevenlabs: 36 tall white pill, 1 px hairline, self-sized; leading BLACK "New" pill badge (24 tall) · 14/400 message ·
   trailing muted chevron — one click target. */
.ds-banner-callout[data-variant="elevenlabs-announce-pill"] { --_edge: var(--ds-border); }

/* attio: hairline capsule, 12 px text, trailing ›, no colour, no icon; 40 px above the h1 as a soft news slot */
.ds-banner-callout[data-variant="attio-announcement-capsule"] { --_min-h: var(--ds-control-h-sm); --_pad-x: var(--ds-space-3); --_gap: var(--ds-space-1); }
.ds-banner-callout[data-variant="attio-announcement-capsule"] .ds-banner-callout__text { font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.ds-banner-callout[data-variant="attio-announcement-capsule"] .ds-banner-callout__chevron { inline-size: 12px; block-size: 12px; }

/* fibery: the author's-voice aside — amber tint, icon + 14/500 text + "→"; single-line = 31 px pill, two-line = r16 rect.
   Amber is a brand voice hue, not warning: painted with the amber data hue. */
.ds-banner-callout[data-variant="fibery-note-pill"] { --_fill: var(--ds-data-6-tint); --_edge: transparent; --_ink: var(--ds-data-6-ink); --_glyph: var(--ds-data-6-ink); --_min-h: 31px; }
.ds-banner-callout[data-variant="fibery-note-pill"] .ds-banner-callout__text { color: var(--_ink); font-weight: var(--ds-weight-medium); }
.ds-banner-callout[data-variant="fibery-note-pill"] .ds-banner-callout__chevron { color: var(--_ink); }
.ds-banner-callout[data-variant="fibery-note-pill"][data-layout="inline"] { --_radius: var(--ds-radius-lg); }

/* navattic: full-width 32 px bordered pill in the nav footer, 1 px lip, 16 px accent ring glyph + 14/400 "Starter limit reached" */
.ds-banner-callout[data-variant="navattic-plan-status-pill"] {
  --_min-h: var(--ds-control-h-sm);
  --_edge: var(--ds-border);
  --_glyph: var(--ds-accent);
  --_pad-x: var(--ds-space-3);
  box-shadow: var(--ds-shadow-lip);
}
.ds-banner-callout[data-variant="navattic-plan-status-pill"] .ds-banner-callout__text { font-size: var(--ds-text-md); font-weight: var(--ds-weight-regular); color: var(--ds-ink); }

/* manychat: coach-mark pill hanging from the toolbar centre — surface-2 fill, r8, 31 tall, muted 14 text with a pointer.
   Their emoji pointer is replaced by a stroke arrow (system labels never carry emoji: data-emoji policy). */
.ds-banner-callout[data-variant="manychat-coach-mark-pill"] { --_fill: var(--ds-surface-2); --_edge: transparent; --_glyph: var(--ds-ink-muted); --_min-h: 31px; --_radius: var(--ds-radius-sm); }
.ds-banner-callout[data-variant="manychat-coach-mark-pill"] .ds-banner-callout__text { color: var(--ds-ink-muted); font-size: var(--ds-text-md); }

/* ds/components/card.css */
/* ============================================================================
   card — Card / container
   taxonomy-components.md §D · core · S1 (the SEPARATION METHOD is the variant axis)
   Anatomy: surface · [header: title | tabs | mono label + rule] · body · [footer strip]
   · [media] · [inset well] · [drag handle] · [external caption].
   Variants: jstov (default) · tint-only · tint-step-down · hairline ·
             hairline-plus-tint-semantics · tint-plus-warm-hairline · bottom-only-shadow ·
             soft-shadow-card-row · elevated-subject · nested-tint-then-white ·
             mono-label-rule-header · title-rule-body · dashed-optional · intercom-zero-radius
   Knobs (private): --_bg --_border --_shadow --_radius --_pad
   The house card reads the DERIVED card tokens (--ds-card-bg/-border/-shadow follow
   data-depth); fidelity variants pin their own separation. A nested .ds-card is a
   tint-only inset at the next radius step down (never bordered-in-bordered, retool-25).
   Selected ≠ elevated (R4): selection is a 2 px --ds-selected-line outline, never a shadow.
   ========================================================================== */

.ds-card {
  --_bg: var(--ds-card-bg);
  --_border: var(--ds-card-border);
  --_shadow: var(--ds-card-shadow);
  --_radius: var(--ds-radius-md);
  --_pad: var(--ds-card-pad);
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  background: var(--_bg);
  border: var(--ds-border-width) solid var(--_border);
  box-shadow: var(--_shadow, var(--ds-card-shadow));
  border-radius: var(--_radius);
  color: var(--ds-ink);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
  text-decoration: none;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-base) var(--ds-ease-standard);
}
.ds-card > * { min-width: 0; }
.ds-card svg { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

/* ---- header slot: title OR tabs OR mono label; 40 px tall (retool) ------------------ */
.ds-card__header {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  min-height: calc(var(--ds-control-h) + var(--ds-space-1));
  padding: var(--ds-space-2) var(--_pad) 0;
}
.ds-card__header[data-rule="true"] { padding-block-end: var(--ds-space-2); border-block-end: var(--ds-border-width) solid var(--ds-rule-soft); }
.ds-card__title {
  flex: 1 1 auto;
  min-width: 0;
  font-size: var(--ds-text-title-card, var(--ds-text-md));   /* role alias (CONTRACT R14) */
  font-weight: var(--ds-weight-semibold);
  line-height: var(--ds-lh-heading);
  letter-spacing: var(--ds-heading-tracking);
  color: var(--ds-ink);
}
.ds-card__label {                /* mono-caps label lane (origin) — the eyebrow rule, not data-labels */
  flex: 1 1 auto;
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
}
.ds-card__header-actions { display: inline-flex; align-items: center; gap: var(--ds-space-2); margin-inline-start: auto; }
/* ghost icon button in the header / drag handle — control-h-sm square */
.ds-card__icon-button, .ds-card__handle {
  appearance: none;
  display: inline-grid;
  place-items: center;
  width: var(--ds-control-h-sm);
  height: var(--ds-control-h-sm);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: none;
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-card__icon-button:hover { background: var(--ds-surface-hover); color: var(--ds-ink); }
.ds-card__icon-button svg, .ds-card__handle svg { width: var(--ds-icon-size); height: var(--ds-icon-size); }

/* ---- body / footer / media / inset ------------------------------------------------- */
.ds-card__body { display: flex; flex-direction: column; gap: var(--ds-space-3); padding: var(--_pad); flex: 1 1 auto; }   /* grows: a bottom-pinned row (margin-block-start: auto on it, or flex: 1 on the paragraph above) shares a baseline across a grid of stretched cards — invisible when the card is content-height (2026-09-20, l-feat-03's step cards) */
.ds-card__header + .ds-card__body { padding-block-start: var(--ds-space-3); }
.ds-card__body > p { color: var(--ds-ink-2); max-width: var(--ds-measure); }
.ds-card__footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-2) var(--ds-space-3);
  min-height: var(--ds-control-h-lg);
  padding: var(--ds-space-2) var(--_pad);
  border-block-start: var(--ds-border-width) solid var(--ds-rule-soft);
  background: var(--ds-surface-2);
  border-radius: 0 0 calc(var(--_radius) - var(--ds-border-width)) calc(var(--_radius) - var(--ds-border-width));
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
}
.ds-card__media {
  display: block;
  overflow: clip;
  aspect-ratio: var(--ds-media-aspect);
  background: var(--ds-illustration-ground);
  border-radius: calc(var(--_radius) - var(--ds-border-width)) calc(var(--_radius) - var(--ds-border-width)) 0 0;
}
.ds-card__media img, .ds-card__media svg { width: 100%; height: 100%; object-fit: cover; }
/* inset well: tint-only, next radius step down (child ≤ parent − 2 px) */
.ds-card__inset { padding: var(--ds-space-3); background: var(--ds-surface-2); border-radius: var(--ds-radius-sm); }
/* a nested card = tint-only inset; never a bordered card in a bordered card at the same radius */
.ds-card .ds-card { --_bg: var(--ds-surface-2); --_border: transparent; --_shadow: none; --_radius: var(--ds-radius-sm); }
/* secondary action inside a card: outline, never a second filled button (R3) */
.ds-card__action {
  appearance: none;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-size-h);
  padding-inline: var(--ds-size-pad-x);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-surface);
  color: var(--ds-ink);
  font: inherit;
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  text-decoration: none;
  text-transform: var(--ds-control-case);
  white-space: nowrap;
  cursor: pointer;
  box-shadow: var(--ds-shadow-lip);
}
.ds-card__action:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-card__action:disabled { color: var(--ds-ink-faint); background: var(--ds-surface-3); border-color: var(--ds-rule); box-shadow: none; }
.ds-card__caption { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); line-height: var(--ds-lh-body); }

/* ---- interactive: <a>/<button> roots or data-interactive ---------------------------- */
a.ds-card, button.ds-card, .ds-card[data-interactive] { cursor: pointer; text-align: inherit; font: inherit; }
:is(a, button).ds-card:hover, .ds-card[data-interactive]:hover, .ds-card[data-state="hover"] { background: var(--ds-hover-bg); }
/* lift policy: the hover shadow REPLACES the resting one (a "none, <shadow>" list is invalid CSS, so this cannot be a token read) */
[data-hover="lift"] :is(:is(a, button).ds-card:hover, .ds-card[data-interactive]:hover, .ds-card[data-state="hover"]) { box-shadow: var(--ds-hover-shadow); }
:is(a, button).ds-card:hover { border-color: var(--_border); }
/* selected: 2 px selected-line outline, inset so the footprint never changes (R4) */
.ds-card[aria-selected="true"] { outline: 2px solid var(--ds-selected-line); outline-offset: -2px; }
.ds-card[aria-selected="true"]:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
/* disabled: still visible, faint ink, inset fill */
.ds-card[aria-disabled="true"] { --_bg: var(--ds-surface-3); --_border: var(--ds-rule); --_shadow: none; color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-card[aria-disabled="true"] :is(.ds-card__title, .ds-card__body > p, .ds-card__label) { color: var(--ds-ink-faint); }
/* error: danger border + message below the body */
.ds-card[aria-invalid="true"] { --_border: var(--ds-danger); }
.ds-card__error { display: flex; align-items: center; gap: var(--ds-space-1-5); padding: 0 var(--_pad) var(--ds-space-3); font-size: var(--ds-text-sm); color: var(--ds-danger-ink); }
.ds-card__error svg { width: var(--ds-icon-size); height: var(--ds-icon-size); flex: none; }
/* empty: dashed footprint, ghosted copy with the action inline — never a blank card */
.ds-card[data-state="empty"], .ds-card[data-variant="dashed-optional"] { --_bg: transparent; --_border: var(--ds-rule-strong); --_shadow: none; border-style: dashed; }
.ds-card__empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--ds-space-2); min-height: calc(var(--ds-control-h-lg) * 2); padding: var(--_pad); text-align: center; color: var(--ds-ink-muted); }
.ds-card__empty > span { max-width: var(--ds-measure); }
.ds-card__empty a { color: var(--ds-ink-link); }
/* ghost: the summary card whose content is not set yet — muted, not hidden [luma-creating-an-event-24-27] */
.ds-card[data-state="ghost"] :is(.ds-card__title, .ds-card__body) { color: var(--ds-ink-muted); }
/* loading: skeleton bars in the TRUE frame */
.ds-card[aria-busy="true"] { pointer-events: none; }
.ds-card__skeleton { display: block; height: var(--ds-space-3); width: var(--_w, 60%); max-width: 100%; border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); }
.ds-card__skeleton + .ds-card__skeleton { margin-block-start: var(--ds-space-2); }
/* dragging: the only time a card floats; the 6-dot handle is otherwise hover-revealed [contra-web-39] */
.ds-card__handle { position: absolute; inset-inline-start: var(--ds-space-1); inset-block-start: var(--ds-space-1); cursor: grab; opacity: 0; transition: opacity var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-card:hover .ds-card__handle, .ds-card__handle:focus-visible, .ds-card[data-state="dragging"] .ds-card__handle, .ds-card[data-state="hover"] .ds-card__handle { opacity: 1; }
.ds-card[data-state="dragging"] { box-shadow: var(--ds-shadow-object); cursor: grabbing; }
.ds-card[data-state="dragging"] .ds-card__handle { cursor: grabbing; }
@media (hover: none) { .ds-card__handle { opacity: 1; } }
.ds-card:has(> .ds-card__handle) > .ds-card__header { padding-inline-start: calc(var(--_pad) + var(--ds-space-6)); }

/* ============================================================================ variants */
/* tint-only — white card on a tinted ground, no border, no shadow [retool-web-12, braintrust-web-13, elevenlabs-web-49] */
.ds-card[data-variant="tint-only"] { --_bg: var(--ds-surface); --_border: transparent; --_shadow: none; }
/* tint-step-down — the card is DARKER than the ground so only the CTA pops [luma-creating-an-event-*]
   (a theme with --ds-surface-polarity: -1 makes surface-2 the darker plane) */
.ds-card[data-variant="tint-step-down"] { --_bg: var(--ds-surface-2); --_border: transparent; --_shadow: none; --_radius: var(--ds-radius-lg); }
/* hover on a tint-step-down card: one more step down — --ds-hover-bg reads the same as --ds-surface-2 on ledger (fix 2026-09-30) */
.ds-card[data-variant="tint-step-down"]:is(:is(a, button):hover, [data-interactive]:hover, [data-state="hover"]) { background: var(--ds-surface-3); }
/* hairline — 1 px rule on surface, no shadow [navattic-web-153, navattic-web-174, quicken-web-234-accordoin, confluence-web-23, oku-web-88, jasper-web-19, airbnb-web-528, attio-2-1-830x8225] */
.ds-card[data-variant="hairline"] { --_bg: var(--ds-surface); --_border: var(--ds-rule); --_shadow: none; }
/* hairline-plus-tint-semantics — tint fill = suggested by the system, white = yours; border unchanged [confluence-web-23] */
.ds-card[data-variant="hairline-plus-tint-semantics"] { --_bg: var(--ds-surface); --_border: var(--ds-rule); --_shadow: none; --_radius: var(--ds-radius-xs); }
.ds-card[data-variant="hairline-plus-tint-semantics"][data-kind="suggested"] { --_bg: var(--ds-surface-2); }
/* tint-plus-warm-hairline, lighter than ground [fibery-3-830x6495] — needs a theme whose surface is lighter than ground; here surface-2 + rule */
.ds-card[data-variant="tint-plus-warm-hairline"] { --_bg: var(--ds-surface-2); --_border: var(--ds-rule); --_shadow: none; }
/* bottom-only-shadow — white on bone, 0 1px 2px, no border [homerun-web-21] */
.ds-card[data-variant="bottom-only-shadow"] { --_bg: var(--ds-surface); --_border: transparent; --_shadow: var(--ds-shadow-lift); }
/* soft-shadow-card-row — white r8 + 0 2px 6px, no border; rows of these = the card-row table [manychat-web-126] */
.ds-card[data-variant="soft-shadow-card-row"] { --_bg: var(--ds-surface); --_border: transparent; --_shadow: var(--ds-shadow-card); --_radius: var(--ds-radius-md); }
/* elevated-subject — ONE shadowed subject card per page; context cards are bordered [airbnb-web-528] */
.ds-card[data-variant="elevated-subject"] { --_bg: var(--ds-surface); --_border: transparent; --_shadow: var(--ds-shadow-object); --_radius: var(--ds-radius-xl); --_pad: var(--ds-space-6); }
.ds-card[data-variant="elevated-subject"][data-role="context"] { --_border: var(--ds-rule); --_shadow: none; }
/* nested-tint-then-white — tint outer (identity) + white inner (content) [hsajlzjwgaajrfp, quicken-web-234-accordoin, grammarly-web-158-acordian] */
.ds-card[data-variant="nested-tint-then-white"] { --_bg: var(--ds-surface-2); --_border: transparent; --_shadow: none; --_radius: var(--ds-radius-lg); }
.ds-card[data-variant="nested-tint-then-white"] .ds-card { --_bg: var(--ds-surface); --_border: transparent; --_shadow: none; --_radius: var(--ds-radius-md); }
/* mono-label-rule-header — 24 px radius, 30–32 px padding, mono-caps label + hairline [origin-connecting-an-account-00-04, -05-06] */
.ds-card[data-variant="mono-label-rule-header"] { --_bg: var(--ds-surface); --_border: var(--ds-rule); --_shadow: none; --_radius: var(--ds-radius-xl); --_pad: var(--ds-space-8); }
.ds-card[data-variant="mono-label-rule-header"] .ds-card__header { padding-block: var(--ds-space-5) var(--ds-space-3); border-block-end: var(--ds-border-width) solid var(--ds-rule-soft); }
/* title-rule-body — 18/700 title + full-width rule; the 40 px header slot holds a title OR a tab strip; r4, 20 px body [retool-web-12, retool-web-25] */
.ds-card[data-variant="title-rule-body"] { --_bg: var(--ds-surface); --_border: var(--ds-rule); --_shadow: none; --_radius: var(--ds-radius-xs); --_pad: var(--ds-space-5); }
.ds-card[data-variant="title-rule-body"] .ds-card__header { padding-block: 0; border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.ds-card[data-variant="title-rule-body"] .ds-card__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-bold); }
.ds-card[data-variant="title-rule-body"] .ds-card__header + .ds-card__body { padding-block-start: var(--_pad); }
/* dashed-optional — dashed hairline = optional / not yet added / drop target [perplexity-asking-a-question-05-09, manychat-web-109, manychat-web-42, retool-web-25, v0-web-8] — rule shared with data-state="empty" above */
.ds-card[data-variant="dashed-optional"][data-state="drop-active"] { --_border: var(--ds-accent); --_bg: var(--ds-accent-tint); }
/* intercom-zero-radius — 0 px frame with an EXTERNAL caption; root is a <figure> whose __frame paints [intercom-3-830x8816] */
.ds-card[data-variant="intercom-zero-radius"] { --_bg: transparent; --_border: transparent; --_shadow: none; --_radius: 0; gap: var(--ds-space-3); }
.ds-card[data-variant="intercom-zero-radius"] .ds-card__frame { display: flex; flex-direction: column; background: var(--ds-surface); border: var(--ds-border-width) solid var(--ds-rule); border-radius: 0; }
.ds-card[data-variant="intercom-zero-radius"] .ds-card__media { border-radius: 0; }

/* ds/components/chapter-header.css */
/* ============================================================================
   components/chapter-header/chapter-header.css — Chapter / section header (marketing)
   taxonomy-components.md §K · common · S0  ·  implements L-HEAD-01 + L-HEAD-02 + L-HEAD-03 in ONE component
   Root:  <header class="ds-chapter-header"> (or <div>) — one per chapter; the h2 is the chapter's heading.
   Parts: __eyebrow (+ __eyebrow-index · __eyebrow-mark) · __title (L-HEAD-01: block two-tone via .ds-two-tone,
          or inline two-tone at data-level="h3") · __line[data-weight] (fibery mixed-weight pair) · __lead
          (support paragraph; may be .ds-two-tone) · __aside (right column: the lead, or an illustration) ·
          __actions (button-pair slot, composed) · __hint ([SCROLL TO CONTINUE], decorative)
   Axes:  data-eyebrow="mono | pill"    L-HEAD-02 device — mono "[03] LABEL" is the house; pill = Attio's
                                        sentence-case accent tint (drops the accent on a dark island)
          data-layout="stack | split"   split = L-HEAD-03: eyebrow + h2 left, __aside right, top-aligned to the h2
          data-align="start | center"
          data-level="h2 | h3"          h3 = Attio's INLINE two-tone: semibold fragment + regular continuation, ≤ 44 ch
          data-size="md | lg"           lg = display size from 768 (chapter opener, closing CTA)
          data-aside="start | end"      split only: the aside top-aligns to the h2 (start, house) or sits on its last line (end, cloudflare)
   Variants (data-variant): jstov (unmarked root) · attio-eyebrow-pill-plus-two-tone-h2 ·
     intercom-two-tone-heading-plus-lead · heron-two-column-eyebrow-h2-left-paragraph-right ·
     fibery-narrative-bridge-heading · fibery-mixed-weight-heading-pair
   States: rest · aria-busy="true" (skeleton bars in the true frame) — the header itself is inert; the
     buttons in __actions carry their own states.
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_gap --_title-size --_title-weight --_measure
     --_lead-measure --_lead-size --_cols
   ========================================================================== */

/* ---------------------------------------------------------------------------
   0. ROOT — a grid of named areas so every layout is a re-map, never a DOM change
   ------------------------------------------------------------------------- */
.ds-chapter-header {
  --_gap:          var(--ds-space-4);                /* eyebrow → h2 → lead pitch (attio 16–24) */
  --_title-size:   var(--ds-text-title-chapter, var(--ds-text-3xl));   /* 32 @14 · 37 @16 via the title-chapter alias (§13.4); lg → display ≥ 768 */
  --_title-weight: var(--ds-display-weight);         /* regular-weight display is the house    */
  --_measure:      26ch;                             /* 2–3 lines at chapter size             */
  --_lead-measure: 45ch;                             /* C-03: support ≤ 45 ch                  */
  --_lead-size:    var(--ds-text-lg);
  --_cols:         minmax(0, 7fr) minmax(0, 5fr);    /* split: h2 6–8 cols | paragraph 3–5    */
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-areas: "eyebrow" "title" "lead" "actions" "aside";
  row-gap: 0;                                        /* the pitch is a margin on each PRESENT part (below) — an absent eyebrow / lead / actions no longer reserves its row's gap (2026-09-20; was gap: --_gap, which left a title-only header 4 × --_gap taller than its title) */
  column-gap: var(--_gap);
  align-items: start;
  min-width: 0;
  color: var(--ds-ink);
}
.ds-chapter-header > * { min-width: 0; max-width: 100%; }
.ds-chapter-header > * + * { margin-block-start: var(--_gap); }   /* eyebrow → h2 → lead → actions → aside pitch; empty rows cost nothing. The parts carry no margin: 0 of their own (the base reset zeroes h2 / p) so this sibling rule is the one margin */
.ds-chapter-header svg[fill="none"] { fill: none; stroke: currentColor; }

/* ---------------------------------------------------------------------------
   1. EYEBROW — L-HEAD-02. Mono "[03] LABEL" (house / heron) or the sentence-case pill (attio)
   ------------------------------------------------------------------------- */
.ds-chapter-header__eyebrow {
  grid-area: eyebrow;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  justify-self: start;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: .06em;
  text-transform: uppercase;              /* the mono lane is the ONE caps lane (R8) */
  color: var(--ds-ink-muted);
}
.ds-chapter-header__eyebrow-index { color: var(--ds-ink-faint); }

/* __eyebrow-meta — optional muted suffix after the eyebrow text ("· step 2 of 3"); added 2026-09-19
   for L-PRICE-01's onboarding form. Separator drawn here so the text stays plain. */
.ds-chapter-header__eyebrow-meta { color: var(--ds-ink-muted); }
.ds-chapter-header__eyebrow-meta::before { content: "·"; margin-inline: var(--ds-space-2); color: var(--ds-ink-faint); }
      /* index numbers: decorative, aria-hidden */
/* intercom's "■ LABEL": a 6 px accent square before the word (shown by the variant, or by markup anywhere) */
.ds-chapter-header__eyebrow-mark {
  inline-size: var(--ds-space-1-5);
  block-size: var(--ds-space-1-5);
  flex: none;
  background: var(--ds-accent);
}
.ds-chapter-header[data-eyebrow="pill"] .ds-chapter-header__eyebrow,
.ds-chapter-header[data-variant="attio-eyebrow-pill-plus-two-tone-h2"]:not([data-eyebrow="mono"]) .ds-chapter-header__eyebrow {
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-sm);
  letter-spacing: 0;
  text-transform: none;
  padding: var(--ds-space-0-5) var(--ds-space-2);
  border-radius: var(--ds-radius-xs);     /* attio: 4–6 px rect, not a capsule */
  background: var(--ds-accent-tint);
  color: var(--ds-accent-ink);
}
.ds-chapter-header[data-eyebrow="pill"] .ds-chapter-header__eyebrow-index,
.ds-chapter-header[data-variant="attio-eyebrow-pill-plus-two-tone-h2"]:not([data-eyebrow="mono"]) .ds-chapter-header__eyebrow-index { color: inherit; opacity: .7; }
/* the pill drops its accent on dark — attio's rule; explicit islands and the OS-dark page alike */
[data-mode="dark"] .ds-chapter-header[data-eyebrow="pill"] .ds-chapter-header__eyebrow,
[data-mode="dark"] .ds-chapter-header[data-variant="attio-eyebrow-pill-plus-two-tone-h2"]:not([data-eyebrow="mono"]) .ds-chapter-header__eyebrow,
.ds-chapter-header[data-mode="dark"][data-eyebrow="pill"] .ds-chapter-header__eyebrow { background: var(--ds-surface-2); color: var(--ds-ink-2); }
@media (prefers-color-scheme: dark) {
  :root:not([data-mode="light"]) .ds-chapter-header[data-eyebrow="pill"]:not([data-mode="light"]) .ds-chapter-header__eyebrow,
  :root:not([data-mode="light"]) .ds-chapter-header[data-variant="attio-eyebrow-pill-plus-two-tone-h2"]:not([data-eyebrow="mono"]):not([data-mode="light"]) .ds-chapter-header__eyebrow { background: var(--ds-surface-2); color: var(--ds-ink-2); }
}

/* ---------------------------------------------------------------------------
   2. TITLE — L-HEAD-01. One element; the muted clause is <span class="ds-muted"> (components/_base.css .ds-two-tone)
   ------------------------------------------------------------------------- */
.ds-chapter-header__title {
  grid-area: title;
  font-family: var(--ds-font-display);
  font-size: var(--_title-size);
  font-weight: var(--_title-weight);
  letter-spacing: var(--ds-display-tracking);
  line-height: var(--ds-lh-tight);
  max-width: var(--_measure);
  text-wrap: balance;
  color: var(--ds-ink);
}
/* h3 level: attio's inline two-tone — semibold fragment + regular continuation in ONE paragraph, ≤ 44 ch */
.ds-chapter-header[data-level="h3"] {
  --_title-size: var(--ds-text-xl);
  --_measure: 44ch;
}
.ds-chapter-header[data-level="h3"] .ds-chapter-header__title {
  font-family: var(--ds-font-sans);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  text-wrap: pretty;
}
.ds-chapter-header[data-level="h3"] .ds-chapter-header__title .ds-muted { font-weight: var(--ds-weight-regular); }
/* fibery's mixed-weight pair: two lines, one regular, one bold (either order) */
.ds-chapter-header__line { display: block; }
.ds-chapter-header__line[data-weight="regular"] { font-weight: var(--ds-weight-regular); }
.ds-chapter-header__line[data-weight="bold"]    { font-weight: var(--ds-weight-bold); font-size: 1.3em; }

/* ---------------------------------------------------------------------------
   3. LEAD · ASIDE · ACTIONS · HINT
   ------------------------------------------------------------------------- */
.ds-chapter-header__lead {
  grid-area: lead;
  font-size: var(--_lead-size);
  line-height: var(--ds-lh-body);
  color: var(--ds-ink-muted);               /* readable secondary — never faint */
  max-width: var(--_lead-measure);
  text-wrap: pretty;
}
/* intercom: the lead is two-tone too — ink lead clause, muted remainder (the class must win over the muted default) */
.ds-chapter-header__lead.ds-two-tone { color: var(--ds-ink); }
.ds-chapter-header__aside {
  grid-area: aside;
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-3);
  min-width: 0;
}
.ds-chapter-header__aside > .ds-chapter-header__lead { grid-area: auto; }
.ds-chapter-header__aside > svg, .ds-chapter-header__aside > img { max-width: min(100%, 220px); color: var(--ds-ink); }   /* intercom's is an INK drawing, not a technical line */
.ds-chapter-header__actions {
  grid-area: actions;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-3);
  margin-block-start: calc(var(--_gap) + var(--ds-space-2));   /* the pitch + 8: a pair sits a touch further from the copy */
}
.ds-chapter-header__actions > * { max-width: 100%; }
.ds-chapter-header__hint {                  /* [SCROLL TO CONTINUE] — decorative, aria-hidden */
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-faint);
}

/* ---------------------------------------------------------------------------
   4. AXES — align · size · loading
   ------------------------------------------------------------------------- */
.ds-chapter-header[data-align="center"] { justify-items: center; text-align: center; }
.ds-chapter-header[data-align="center"] .ds-chapter-header__eyebrow { justify-self: center; }
.ds-chapter-header[data-align="center"] .ds-chapter-header__actions { justify-content: center; }
.ds-chapter-header[data-align="center"] .ds-chapter-header__aside { align-items: center; }

/* loading: bars in the true frame — no layout jump when the words arrive */
.ds-chapter-header[aria-busy="true"] :is(.ds-chapter-header__eyebrow, .ds-chapter-header__title, .ds-chapter-header__lead),
.ds-chapter-header[aria-busy="true"] :is(.ds-chapter-header__title, .ds-chapter-header__lead) * {
  color: transparent;
  background: var(--ds-skeleton);
  border-radius: var(--ds-radius-xs);
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
}
.ds-chapter-header[aria-busy="true"] .ds-chapter-header__eyebrow-mark { background: var(--ds-skeleton); }

/* ---------------------------------------------------------------------------
   5. VARIANTS
   ------------------------------------------------------------------------- */
/* attio — pill eyebrow, semibold two-tone h2 ending in a full stop, 2–3 lines [attio-2-1-830x8225] */
.ds-chapter-header[data-variant="attio-eyebrow-pill-plus-two-tone-h2"] {
  --_title-weight: var(--ds-weight-semibold);
  --_measure: 30ch;
}
/* intercom — "■ LABEL" mono eyebrow, two-tone h2 (either order) + two-tone lead + pair; ink drawing in the right third [intercom-3-830x8816] */
.ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"] {
  --_cols: minmax(0, 8fr) minmax(0, 4fr);
  --_measure: 24ch;
}
.ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"] .ds-chapter-header__eyebrow::before {
  content: "";
  inline-size: var(--ds-space-1-5);
  block-size: var(--ds-space-1-5);
  flex: none;
  background: var(--ds-accent);
}
.ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"] .ds-chapter-header__eyebrow > .ds-chapter-header__eyebrow-mark { display: none; }  /* the pseudo draws it */
.ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"] .ds-chapter-header__lead { font-family: var(--ds-font-body-alt); }
/* heron — mono eyebrow, bold h2 left, small muted paragraph right-aligned to the outer edge, scroll hint [heron-ai-830x5619]
   (heron sets the h2 in uppercase — a skin choice; headings never uppercase here, R8) */
.ds-chapter-header[data-variant="heron-two-column-eyebrow-h2-left-paragraph-right"] {
  --_title-weight: var(--ds-weight-bold);
  --_lead-size: var(--ds-text-sm);
  --_lead-measure: 34ch;
  --_cols: minmax(0, 8fr) minmax(0, 4fr);
}
.ds-chapter-header[data-variant="heron-two-column-eyebrow-h2-left-paragraph-right"] .ds-chapter-header__aside { gap: var(--ds-space-4); }
/* fibery — regular-weight centred sentence ending in … or :, a caption for the picture below [fibery-3-830x6495] */
.ds-chapter-header[data-variant="fibery-narrative-bridge-heading"] {
  --_title-size: var(--ds-text-2xl);
  --_title-weight: var(--ds-weight-regular);
  --_measure: 40ch;
  justify-items: center;
  text-align: center;
}
.ds-chapter-header[data-variant="fibery-narrative-bridge-heading"] .ds-chapter-header__title { font-family: var(--ds-font-sans); letter-spacing: var(--ds-heading-tracking); line-height: var(--ds-lh-heading); }
/* fibery — mixed-weight pair: line 1 regular, line 2 bold (or the reverse), left-aligned [fibery-3-830x6495] */
.ds-chapter-header[data-variant="fibery-mixed-weight-heading-pair"] {
  --_title-size: var(--ds-text-2xl);
  --_title-weight: var(--ds-weight-regular);
  --_measure: 30ch;
}
.ds-chapter-header[data-variant="fibery-mixed-weight-heading-pair"] .ds-chapter-header__title { font-family: var(--ds-font-sans); letter-spacing: var(--ds-heading-tracking); line-height: var(--ds-lh-heading); }

/* ---------------------------------------------------------------------------
   6. BREAKPOINTS — 768: display size for lg, split layout; 1024: wider measure
   ------------------------------------------------------------------------- */
@media (min-width: 768px) {
  .ds-chapter-header[data-size="lg"] { --_title-size: var(--ds-text-display); --_measure: 22ch; }
  .ds-chapter-header[data-size="lg"][data-variant="attio-eyebrow-pill-plus-two-tone-h2"] { --_measure: 28ch; }
  .ds-chapter-header[data-level="h3"] { --_title-size: var(--ds-text-2xl); }
  .ds-chapter-header[data-layout="split"],
  .ds-chapter-header[data-variant="heron-two-column-eyebrow-h2-left-paragraph-right"]:not([data-layout="stack"]),
  .ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"]:not([data-layout="stack"]) {
    grid-template-columns: var(--_cols);
    column-gap: var(--ds-space-8);
    grid-template-areas:
      "eyebrow eyebrow"
      "title   aside"
      "lead    aside"
      "actions aside";
  }
  /* the right column: top-aligned to the h2, right-aligned to the outer edge (heron / house); intercom's drawing sits at the top too */
  .ds-chapter-header[data-layout="split"] .ds-chapter-header__aside,
  .ds-chapter-header[data-variant="heron-two-column-eyebrow-h2-left-paragraph-right"]:not([data-layout="stack"]) .ds-chapter-header__aside,
  .ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"]:not([data-layout="stack"]) .ds-chapter-header__aside {
    justify-self: end;
    align-self: start;
    max-width: var(--_lead-measure);
    margin-block-start: 0;                          /* the column starts level with the h2 … */
  }
  .ds-chapter-header[data-layout="split"]:has(> .ds-chapter-header__eyebrow) .ds-chapter-header__aside,
  .ds-chapter-header[data-variant="heron-two-column-eyebrow-h2-left-paragraph-right"]:not([data-layout="stack"]):has(> .ds-chapter-header__eyebrow) .ds-chapter-header__aside {
    margin-block-start: var(--_gap);                /* … including the h2's own pitch under an eyebrow */
  }
  .ds-chapter-header[data-variant="intercom-two-tone-heading-plus-lead"]:not([data-layout="stack"]) .ds-chapter-header__aside { grid-row: 1 / span 4; max-width: none; align-items: flex-end; margin-block-start: 0; }
  /* data-aside="end" — the aside sits on the h2's LAST line instead of its first (Cloudflare's split header:
     the paragraph is bottom-aligned to the display; L-HEAD-03's `align-items: end` form). 2026-09-20 */
  .ds-chapter-header[data-layout="split"][data-aside="end"] .ds-chapter-header__aside { align-self: end; }
}

/* ---------------------------------------------------------------------------
   VOICE — data-voice="sign" (city signage layer, 2026-10-11). The title takes the signage lane: bold
   condensed capitals at 1.2× the size, tight leading, a wider measure (condensed caps set narrow).
   The ".ds-muted" half of a two-tone title keeps its muted ink. A deliberate, scoped exception to R8
   (CONTRACT §16): signage is caps by definition, prose and leads stay sentence case.
   ------------------------------------------------------------------------- */
.ds-chapter-header[data-voice="sign"] .ds-chapter-header__title {
  font-family: var(--ds-font-sign);
  font-size: calc(var(--_title-size) * 1.2);
  font-weight: var(--ds-weight-bold);
  letter-spacing: .005em;
  line-height: .95;
  text-transform: uppercase;
  max-width: calc(var(--_measure) * 1.25);
}
.ds-chapter-header[data-voice="sign"][data-level="h3"] .ds-chapter-header__title { font-size: var(--_title-size); }

/* ds/components/empty-state.css */
/* ============================================================================
   empty-state — Empty state                                       (taxonomy §E · core · S0)
   Root: .ds-empty-state — the element that occupies the slot the data will fill. THE EMPTY STATE IS THE CONTROL
     (X-04): a page empty is the populated layout ghosted with the CTA floating over it; a module empty is a card
     with the same frame as real items; a list empty is a dashed box the size of the first item; a field empty is
     a content-shaped row that IS the add control; a cell empty is an italic word. Never blank, never "Untitled".
   Axes:  data-level="page|module|list|field|cell|section"   which slot it fills — picks the house shape
          data-align="center|start"                          text alignment inside module/page shapes
   Parts: __ghost (the populated layout at 50 %, inert) · __overlay (the card floating over the ghost) · __body (title +
          text column in module / field / section rows) ·
          __art (illustration / glyph slot; data-shape="circle" = 48 px plus-circle; data-shape="glyph" = 32 px stroke glyph) ·
          __title · __text · __hint (field: accepted inputs) · __actions (row) · __action (the verb — a button-secondary
          or text-link root) · __links (help-links row, hairline-separated) · __footprint (list: the dashed box's copy)
   Variants: jstov (unmarked root — page = origin-ghosted-preview · module = contra-actionable-empty-card ·
     list = v0-dashed-footprint · field = luma-add-row-placeholder · cell = italic word · section = luma greyed card) ·
     origin-ghosted-preview · origin-in-card-icon-sentence-link · luma-add-row-placeholder · luma-admin-greyed-card ·
     manychat-instruction-card · contra-actionable-empty-card · v0-dashed-footprint · retool-dashed-target ·
     luma-absence-nudge-verb · navattic-italic-word · quicken-dash · manychat-n/a-vs-0 ·
     (homerun-sentence-tile · braintrust-zero-as-cta · manychat-stat-tiles-stay-at-zero → owned by stat; see README)
   States: rest · hover / focus-visible (field level — it is a button) · disabled (field) · aria-busy (the slot is
     loading: hand over to skeleton-loading) · data-state="drop-active" (list/field as a drop target)
   Private knobs: --_footprint (list min height) --_pad --_radius --_measure --_art
   ========================================================================== */

.ds-empty-state svg[fill="none"] { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

.ds-empty-state {
  --_footprint: calc(var(--ds-row-h) * 1.6);       /* the first item's height: 64 (v0) at default density */
  --_pad:       var(--ds-space-8);                 /* module card padding (contra 32)                     */
  --_radius:    var(--ds-radius-md);
  --_measure:   52ch;                              /* ≈ 520 px at 14 (manychat body max)                  */
  --_art:       48px;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ds-space-2);
  min-inline-size: 0;
  max-inline-size: 100%;
  color: var(--ds-ink-2);
  text-align: center;
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
}
.ds-empty-state[data-align="start"] { align-items: flex-start; text-align: start; }

/* -- parts ------------------------------------------------------------------------------------------ */
.ds-empty-state__art { display: grid; place-items: center; color: var(--ds-rule-strong); margin-block-end: var(--ds-space-2); }
.ds-empty-state__art svg { max-inline-size: 100%; }
.ds-empty-state__art[data-shape="circle"] {
  inline-size: var(--_art);
  block-size: var(--_art);
  border-radius: var(--ds-radius-pill);
  border: var(--ds-border-width) solid var(--ds-rule-strong);
  color: var(--ds-ink-2);
  margin: 0;
  flex: none;                                      /* never a flex-shrink victim: a 280 px rail squashed it to a pill (DESK-446 #12) */
  aspect-ratio: 1;
  min-inline-size: var(--_art);
  box-sizing: border-box;
}
.ds-empty-state__art[data-shape="circle"] svg { inline-size: 18px; block-size: 18px; stroke-width: 1px; }
.ds-empty-state__art[data-shape="glyph"] { inline-size: 32px; block-size: 32px; color: var(--ds-ink); margin: 0; flex: none; }
.ds-empty-state__art[data-shape="glyph"] svg { inline-size: 100%; block-size: 100%; }
.ds-empty-state__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-semibold); line-height: var(--ds-lh-heading); color: var(--ds-ink); text-wrap: balance; max-inline-size: var(--_measure); }
.ds-empty-state__text { color: var(--ds-ink-muted); max-inline-size: var(--_measure); text-wrap: pretty; }
.ds-empty-state__text strong { color: var(--ds-ink-2); font-weight: var(--ds-weight-medium); }
.ds-empty-state__hint { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.ds-empty-state__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: inherit; gap: var(--ds-space-2); margin-block-start: var(--ds-space-2); }
.ds-empty-state__links { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-3); margin-block-start: var(--ds-space-2); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-semibold); color: var(--ds-ink-2); }
.ds-empty-state__links > a { color: inherit; text-decoration: none; }
.ds-empty-state__links > a:hover { text-decoration: underline; }
.ds-empty-state__links > a + a { padding-inline-start: var(--ds-space-3); border-inline-start: var(--ds-border-width) solid var(--ds-rule-strong); }
.ds-empty-state__links > svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: var(--ds-warning); }

/* =========================================================================
   LEVELS — the house shape per slot (unmarked root + data-level)
   ========================================================================= */

/* page: the populated layout ghosted at 50 % with the CTA card floating over it; chrome stays live (origin) */
.ds-empty-state[data-level="page"] { display: block; text-align: start; min-block-size: 320px; }
.ds-empty-state__ghost { opacity: .5; pointer-events: none; user-select: none; }
.ds-empty-state__overlay {
  position: absolute;
  inset-block-start: var(--ds-space-10);
  inset-inline-start: 50%;
  transform: translateX(-50%);
  z-index: 1;
  inline-size: min(570px, calc(100% - 2 * var(--ds-space-4)));
  text-align: start;
}

/* module: same frame as the real items — hairline card, big padding, icon-circle left, copy + help links right (contra) */
.ds-empty-state[data-level="module"] {
  flex-direction: row;
  align-items: center;
  gap: var(--ds-space-6);
  padding: var(--_pad);
  border-radius: var(--_radius);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
  text-align: start;
}
.ds-empty-state[data-level="module"] > .ds-empty-state__body { display: flex; flex-direction: column; gap: var(--ds-space-1); min-inline-size: 0; flex: 1 1 auto; }
.ds-empty-state[data-level="module"] .ds-empty-state__title { font-size: var(--ds-text-xl); }
.ds-empty-state[data-level="module"][data-align="center"] { flex-direction: column; text-align: center; }
.ds-empty-state[data-level="module"][data-align="center"] > .ds-empty-state__body { align-items: center; }
@media (max-width: 480px) { .ds-empty-state[data-level="module"] { flex-direction: column; align-items: flex-start; --_pad: var(--ds-card-pad); } }

/* list: dashed footprint the size of the first item, centred muted copy, no CTA (v0) — arrival never reflows */
.ds-empty-state[data-level="list"] {
  justify-content: center;
  min-block-size: var(--_footprint);
  padding: var(--ds-space-3) var(--ds-space-4);
  border-radius: var(--_radius);
  border: var(--ds-border-width) dashed var(--ds-rule-strong);
  background: transparent;
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
}
.ds-empty-state[data-level="list"] .ds-empty-state__footprint { max-inline-size: var(--_measure); }
.ds-empty-state[data-level="list"] .ds-empty-state__footprint a { color: var(--ds-ink-link); }
.ds-empty-state[data-level="list"][data-state="drop-active"] { border-color: var(--ds-accent); background: var(--ds-accent-tint); color: var(--ds-accent-ink); }

/* field: the empty optional field IS the add control — a content-shaped row (luma): 20 px icon · verb-first title · hint.
   The root is a <button>; the filled row shares the grammar (field-row). */
.ds-empty-state[data-level="field"] {
  appearance: none;
  flex-direction: row;
  align-items: center;
  gap: var(--ds-space-3);
  inline-size: 100%;
  min-block-size: var(--ds-row-h);
  padding: var(--ds-space-2) var(--ds-space-4);
  border: var(--ds-border-width) solid transparent;
  border-radius: var(--ds-radius-sm);
  background: var(--ds-surface-2);
  color: var(--ds-ink);
  text-align: start;
  font: inherit;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-empty-state[data-level="field"] .ds-empty-state__art { inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); color: var(--ds-ink-muted); margin: 0; flex: none; }
.ds-empty-state[data-level="field"] .ds-empty-state__art svg { inline-size: 100%; block-size: 100%; }
.ds-empty-state[data-level="field"] > .ds-empty-state__body { display: flex; flex-direction: column; gap: 0; min-inline-size: 0; }
.ds-empty-state[data-level="field"] .ds-empty-state__title { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); line-height: var(--ds-lh-list); }
.ds-empty-state[data-level="field"]:hover, .ds-empty-state[data-level="field"][data-state="hover"] { background: var(--ds-surface-3); }
.ds-empty-state[data-level="field"]:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-empty-state[data-level="field"]:disabled { color: var(--ds-ink-faint); background: var(--ds-surface-3); cursor: not-allowed; }
.ds-empty-state[data-level="field"]:disabled .ds-empty-state__art, .ds-empty-state[data-level="field"]:disabled .ds-empty-state__hint { color: var(--ds-ink-faint); }
.ds-empty-state[data-level="field"][data-state="drop-active"] { border-color: var(--ds-accent); background: var(--ds-accent-tint); }

/* cell: an italic word in muted ink where a value would be — never a bare dash in the house (data-variant picks dash / n/a) */
.ds-empty-state[data-level="cell"] { display: inline; font-style: italic; color: var(--ds-ink-muted); text-align: inherit; font-size: inherit; line-height: inherit; }

/* section: the whole card greyed — icon, title, body all muted; NO internal CTA, the section header owns it (luma) */
.ds-empty-state[data-level="section"] {
  flex-direction: row;
  align-items: center;
  gap: var(--ds-space-4);
  padding: var(--ds-card-pad) var(--ds-space-6);
  border-radius: var(--_radius);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
  color: var(--ds-ink-muted);
  text-align: start;
}
.ds-empty-state[data-level="section"] .ds-empty-state__art { inline-size: 40px; block-size: 40px; color: var(--ds-ink-faint); margin: 0; flex: none; }
.ds-empty-state[data-level="section"] .ds-empty-state__art svg { inline-size: 100%; block-size: 100%; }
.ds-empty-state[data-level="section"] > .ds-empty-state__body { display: flex; flex-direction: column; gap: var(--ds-space-0-5); min-inline-size: 0; }
.ds-empty-state[data-level="section"] .ds-empty-state__title { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); }
.ds-empty-state[data-level="section"] .ds-empty-state__text { font-size: var(--ds-text-sm); }

/* -- loading: the slot is loading, not empty — skeleton-loading owns the frame; keep the footprint ---- */
.ds-empty-state[aria-busy="true"] { visibility: hidden; }

/* =========================================================================
   VARIANTS — designer fidelity on top of the level shapes
   ========================================================================= */

/* origin: the whole dashboard rendered with sample data at 50 %; a 570×450 promo card floats over the main column;
   sidebar, top bar and title stay at full opacity. (= the page level.) */
.ds-empty-state[data-variant="origin-ghosted-preview"] .ds-empty-state__overlay { inset-block-start: var(--ds-space-8); }

/* origin: in-card — centred 32 px link glyph (ink) → one 17 px ink sentence, ≤ 2 lines → mono-caps underlined link */
.ds-empty-state[data-variant="origin-in-card-icon-sentence-link"] { gap: var(--ds-space-3); padding-block: var(--ds-space-6); }
.ds-empty-state[data-variant="origin-in-card-icon-sentence-link"] .ds-empty-state__text { color: var(--ds-ink); font-size: var(--ds-text-lg); max-inline-size: 26ch; }
.ds-empty-state[data-variant="origin-in-card-icon-sentence-link"] .ds-empty-state__action {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  letter-spacing: .08em;
  text-transform: uppercase;
  text-decoration: underline;
  text-underline-offset: .2em;
  color: var(--ds-ink);
}

/* luma: 68 px card row r10 — 20 px icon · 20 px verb-led title ("Add Event Location") · 16 px hint; single-line version 46 px */
.ds-empty-state[data-variant="luma-add-row-placeholder"] { min-block-size: 68px; --_radius: var(--ds-radius-md); border-radius: var(--_radius); background: var(--ds-surface); border-color: var(--ds-rule); }
.ds-empty-state[data-variant="luma-add-row-placeholder"] .ds-empty-state__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-medium); }
.ds-empty-state[data-variant="luma-add-row-placeholder"][data-single] { min-block-size: 46px; }

/* luma: 1000×92 white card, r16, 24 pad; greyed 40 px envelope + 17 px title + 16 px body, ALL at #969696 (2.9:1 —
   intentionally sub-AA as a "nothing here" cue; the house raises it to --ds-ink-muted). No CTA inside. */
.ds-empty-state[data-variant="luma-admin-greyed-card"] { --_radius: var(--ds-radius-lg); padding: var(--ds-space-6); }
.ds-empty-state[data-variant="luma-admin-greyed-card"] .ds-empty-state__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-regular); }
.ds-empty-state[data-variant="luma-admin-greyed-card"] .ds-empty-state__text { font-size: var(--ds-text-md); }

/* manychat: 88 px white card, centred 16/500 title ("No data to show... yet!") + centred 14 muted body ≤ 520 px that
   names the exact action producing the first data point; no illustration, no button */
.ds-empty-state[data-variant="manychat-instruction-card"] { --_pad: var(--ds-space-4); min-block-size: 88px; justify-content: center; gap: var(--ds-space-1); }
.ds-empty-state[data-variant="manychat-instruction-card"] .ds-empty-state__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-medium); }

/* contra: 640×138, r20, 1 px rule, 32 pad; 48 px plus-circle (1 px rule, thin plus) left; title 22/700; subtitle 16 muted;
   💡 + two 14/600 help links split by a 1 px vertical rule. Same slot the real cards occupy. */
.ds-empty-state[data-variant="contra-actionable-empty-card"] { --_radius: var(--ds-radius-xl); --_pad: var(--ds-space-8); }
.ds-empty-state[data-variant="contra-actionable-empty-card"] .ds-empty-state__title { font-size: var(--ds-text-2xl); font-weight: var(--ds-weight-bold); }
.ds-empty-state[data-variant="contra-actionable-empty-card"] .ds-empty-state__text { font-size: var(--ds-text-lg); }

/* v0: 242×64, 1 px dashed rule, r8, no fill, centred 12 px muted two-line copy in the exact footprint of the first item */
.ds-empty-state[data-variant="v0-dashed-footprint"] { --_footprint: 64px; --_radius: var(--ds-radius-md); font-size: var(--ds-text-sm); border-color: var(--ds-rule); }

/* retool: 40 px box, 1 px dashed, r4, centred "No components selected" 12 px muted — dashed = target, distinct from solid cards */
.ds-empty-state[data-variant="retool-dashed-target"] { --_footprint: 40px; --_radius: var(--ds-radius-xs); padding-block: 0; font-size: var(--ds-text-sm); }

/* luma: centred stack in the middle ~450 px — 210 px illustration (a ghost of the layout with a "0" badge, drawn in the
   page's own greys) → 28/500 heading → 18 px muted sub → secondary button with a leading "+" */
.ds-empty-state[data-variant="luma-absence-nudge-verb"] { gap: var(--ds-space-3); padding-block: var(--ds-space-12); }
.ds-empty-state[data-variant="luma-absence-nudge-verb"] .ds-empty-state__art { inline-size: min(210px, 60vw); margin-block-end: var(--ds-space-4); }
.ds-empty-state[data-variant="luma-absence-nudge-verb"] .ds-empty-state__title { font-size: var(--ds-text-3xl); font-weight: var(--ds-weight-medium); letter-spacing: var(--ds-display-tracking); }
.ds-empty-state[data-variant="luma-absence-nudge-verb"] .ds-empty-state__text { font-size: var(--ds-text-lg); }

/* cell-level words: navattic "Not identified" italic · quicken "—" · manychat "n/a" (unknowable) vs "0" (known zero) */
.ds-empty-state[data-variant="navattic-italic-word"] { font-style: italic; }
.ds-empty-state[data-variant="quicken-dash"] { font-style: normal; color: var(--ds-ink-faint); }        /* a dash is decoration: it carries no meaning */
.ds-empty-state[data-variant="quicken-dash"]::before { content: "—"; }
.ds-empty-state[data-variant="manychat-n/a-vs-0"] { font-style: normal; font-variant-numeric: tabular-nums; }
.ds-empty-state[data-variant="manychat-n/a-vs-0"][data-value="zero"] { color: var(--ds-ink); }        /* a real zero is DATA: full ink */

/* =========================================================================
   COMPACT — the same states in a NARROW RAIL (a 280 px sidebar / inspector)   (DESK-446 #12)
   Three ways in: data-compact="true" on the root (explicit) · the root inside .ds-empty-state-host (a plain wrapper that
   only sets container-type: inline-size) narrower than 320 px · or one of the three rail variants below.
   Compact = the art keeps its square at --_art 32, padding drops to --_pad 16, the card stacks and left-aligns, and the
   title steps down one size so a two-word verb never wraps three times. data-compact="off" opts out.
   ========================================================================= */
.ds-empty-state-host { container: ds-empty-host / inline-size; min-inline-size: 0; }
.ds-empty-state[data-compact="true"] { --_art: 32px; --_pad: var(--ds-space-4); --_measure: 100%; gap: var(--ds-space-1-5); font-size: var(--ds-text-sm); }
.ds-empty-state[data-compact="true"][data-level="module"], .ds-empty-state[data-compact="true"][data-level="section"] { flex-direction: column; align-items: flex-start; gap: var(--ds-space-3); }
.ds-empty-state[data-compact="true"] .ds-empty-state__title, .ds-empty-state[data-compact="true"][data-level="module"] .ds-empty-state__title { font-size: var(--ds-text-md); }
.ds-empty-state[data-compact="true"] .ds-empty-state__text { font-size: var(--ds-text-sm); }
.ds-empty-state[data-compact="true"] .ds-empty-state__links { gap: var(--ds-space-2); }
@container ds-empty-host (max-width: 320px) {
  .ds-empty-state:not([data-compact="off"]) { --_art: 32px; --_pad: var(--ds-space-4); --_measure: 100%; gap: var(--ds-space-1-5); font-size: var(--ds-text-sm); }
  .ds-empty-state:not([data-compact="off"])[data-level="module"], .ds-empty-state:not([data-compact="off"])[data-level="section"] { flex-direction: column; align-items: flex-start; gap: var(--ds-space-3); }
  .ds-empty-state:not([data-compact="off"]) .ds-empty-state__title, .ds-empty-state:not([data-compact="off"])[data-level="module"] .ds-empty-state__title { font-size: var(--ds-text-md); }
  .ds-empty-state:not([data-compact="off"]) .ds-empty-state__text { font-size: var(--ds-text-sm); }
  .ds-empty-state:not([data-compact="off"]) .ds-empty-state__links { gap: var(--ds-space-2); }
}

/* squarespace-icon-line-link — a 24 px outline glyph, ONE muted line, a text link; no frame, nothing to fill the rail with
   [mobbin-squarespace-notifications] */
.ds-empty-state[data-variant="squarespace-icon-line-link"] { gap: var(--ds-space-2); padding-block: var(--ds-space-6); font-size: var(--ds-text-sm); }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__art { inline-size: var(--ds-icon-size-rail); block-size: var(--ds-icon-size-rail); color: var(--ds-ink-muted); margin: 0; }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__art svg { inline-size: 100%; block-size: 100%; }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__text { color: var(--ds-ink-2); font-size: var(--ds-text-sm); max-inline-size: 28ch; }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__action { color: var(--ds-ink-link); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium); text-decoration: underline; text-underline-offset: .2em; background: none; border: 0; padding: var(--ds-space-1); font-family: inherit; cursor: pointer; border-radius: var(--ds-radius-xs); }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__action:hover { color: var(--ds-ink); }
.ds-empty-state[data-variant="squarespace-icon-line-link"] .ds-empty-state__action:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }

/* plain-icon-left-compact — a small hairline card: icon tile left (32, never squashed), bold one-line title over a muted
   sentence, a small secondary action under both [mobbin-plain-no-tracked-issues] */
.ds-empty-state[data-variant="plain-icon-left-compact"] { flex-direction: row; align-items: flex-start; gap: var(--ds-space-3); padding: var(--ds-space-3) var(--ds-space-4); border-radius: var(--ds-radius-md); background: var(--ds-card-bg); border: var(--ds-border-width) solid var(--ds-card-border); box-shadow: var(--ds-card-shadow); text-align: start; font-size: var(--ds-text-sm); }
.ds-empty-state[data-variant="plain-icon-left-compact"] .ds-empty-state__art { inline-size: var(--ds-control-h-sm); block-size: var(--ds-control-h-sm); flex: none; margin: 0; border-radius: var(--ds-radius-sm); background: var(--ds-surface-2); color: var(--ds-ink-muted); }
.ds-empty-state[data-variant="plain-icon-left-compact"] .ds-empty-state__art svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
.ds-empty-state[data-variant="plain-icon-left-compact"] > .ds-empty-state__body { display: flex; flex-direction: column; align-items: flex-start; gap: var(--ds-space-0-5); min-inline-size: 0; }
.ds-empty-state[data-variant="plain-icon-left-compact"] .ds-empty-state__title { font-size: var(--ds-text-sm); }
.ds-empty-state[data-variant="plain-icon-left-compact"] .ds-empty-state__text { font-size: var(--ds-text-xs); }
.ds-empty-state[data-variant="plain-icon-left-compact"] .ds-empty-state__actions { margin-block-start: var(--ds-space-2); }

/* pin-ghost-footprint-cta — a dashed box (an optional slot) holding a ghost of what will fill it: a 2 × 2 of faint tiles,
   a title, one sentence, ONE call to action [mobbin-pin-no-candidates-shortlisted] */
.ds-empty-state[data-variant="pin-ghost-footprint-cta"] { gap: var(--ds-space-2); padding: var(--ds-space-5) var(--ds-space-4); border-radius: var(--ds-radius-md); border: var(--ds-border-width) dashed var(--ds-rule-strong); background: transparent; font-size: var(--ds-text-sm); }
.ds-empty-state[data-variant="pin-ghost-footprint-cta"] .ds-empty-state__art { inline-size: calc(var(--ds-space-12) + var(--ds-space-4)); block-size: auto; aspect-ratio: 1; color: var(--ds-rule-strong); margin-block-end: var(--ds-space-1); }
.ds-empty-state[data-variant="pin-ghost-footprint-cta"] .ds-empty-state__art svg { inline-size: 100%; block-size: 100%; }
.ds-empty-state[data-variant="pin-ghost-footprint-cta"] .ds-empty-state__title { font-size: var(--ds-text-md); }
.ds-empty-state[data-variant="pin-ghost-footprint-cta"] .ds-empty-state__text { font-size: var(--ds-text-sm); max-inline-size: 30ch; }
.ds-empty-state[data-variant="pin-ghost-footprint-cta"][data-state="drop-active"] { border-color: var(--ds-accent); background: var(--ds-accent-tint); color: var(--ds-accent-ink); }

/* ds/components/feature-checklist.css */
/* ============================================================================
   feature-checklist — Check list                                  (taxonomy §J · common · S0)
   Root: .ds-feature-checklist (<ul>) — rows of [mark] [label] [meta | icon] on a fixed pitch with a hanging indent:
         a wrapped label's second line starts under its first, never under the mark.
   Parts: __item (<li>) · __mark (16px glyph cell: CSS tick by default; may hold an svg, a dot, an index) ·
          __label · __meta (trailing muted note: "coming soon", "add-on") · __icon (trailing icon cell, heron) ·
          __empty (the footprint message when the list has no rows)
   Axes:  data-marker="check|dot|number|none"   what the mark draws (none = the row is bare text; heron)
          data-tone="success|ink|accent"          the mark's colour (success = corpus default; ink = "a fact, not a
                                                  celebration" — airbnb; accent = brand spin)
          data-pitch="dense|default|loose"        24 / 32 / 40 px row pitch on a 14 px body
          data-size="lg"                          16 px label + 24 px mark (airbnb, origin)
          data-rule="hairline"                    a --ds-rule between rows (heron)
          data-align="center"                     centred rows (origin's promo bullets)
          data-meta="mono"                        __meta in the mono lane (a spec cell: `52 parts · 4 m`) — the house
                                                  row for L-FEAT-10 (2026-09-20, additive)
   Item states: data-state="soon" (muted label, neutral mark) · data-included="false" (dash mark, muted — the
          comparison "not in this plan") · root aria-busy (skeleton rows) · root data-state="empty" (dashed footprint)
   Variants: jstov (unmarked root — 32 px pitch, 16 px success tick, ink-2 text, rows are TEXT not links) ·
          jasper-green-check-underlined-rows · airbnb-verification-checklist · heron-icon-checklist-4-rows · origin-3-bullets
   Private knobs: --_pad-y --_gap --_mark-size --_mark --_size --_ink --_icon-cell
   ========================================================================== */

.ds-feature-checklist svg[fill="none"] { fill: none; stroke: currentColor; }

.ds-feature-checklist {
  --_pad-y:     var(--ds-space-1-5);              /* 6 + 20 line + 6 = 32 px pitch on a 14 body          */
  --_gap:       var(--ds-space-3);                /* mark ↔ label: Jasper 12                              */
  --_mark-size: var(--ds-icon-size);              /* 16                                                    */
  --_mark:      var(--ds-success);
  --_size:      var(--ds-text-md);
  --_ink:       var(--ds-ink-2);
  --_icon-cell: 60px;
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
  list-style: none;
  min-width: 0;
  color: var(--_ink);
}
.ds-feature-checklist[data-pitch="dense"] { --_pad-y: var(--ds-space-1); }
.ds-feature-checklist[data-pitch="loose"] { --_pad-y: calc(var(--ds-space-2) + var(--ds-space-0-5)); }
.ds-feature-checklist[data-size="lg"]     { --_size: var(--ds-text-lg); --_mark-size: var(--ds-icon-size-rail); --_pad-y: var(--ds-space-2); }
.ds-feature-checklist[data-tone="ink"]    { --_mark: var(--ds-ink); }
.ds-feature-checklist[data-tone="accent"] { --_mark: var(--ds-accent); }

/* ---- the row: hanging indent by grid — mark cell · label · trailing cell ---------------------------- */
.ds-feature-checklist__item {
  display: grid;
  grid-template-columns: var(--_mark-size) minmax(0, 1fr) auto;
  column-gap: var(--_gap);
  align-items: start;
  padding-block: var(--_pad-y);
  font-size: var(--_size);
  line-height: var(--ds-lh-body);
  min-width: 0;
}
.ds-feature-checklist[data-marker="none"] .ds-feature-checklist__item { grid-template-columns: minmax(0, 1fr) auto; }
.ds-feature-checklist[data-marker="none"] .ds-feature-checklist__mark { display: none; }
.ds-feature-checklist[data-rule="hairline"] .ds-feature-checklist__item + .ds-feature-checklist__item { border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-feature-checklist[data-align="center"] .ds-feature-checklist__item { grid-template-columns: auto minmax(0, auto); justify-content: center; }

/* mark cell: sized to the first line so a wrapped row keeps the glyph on line one */
.ds-feature-checklist__mark {
  display: inline-grid;
  place-items: center;
  inline-size: var(--_mark-size);
  block-size: calc(var(--_size) * var(--ds-lh-body));
  color: var(--_mark);
}
/* check (default): a tick drawn with two borders — no image, one hue */
.ds-feature-checklist__mark::before {
  content: "";
  inline-size: calc(var(--_mark-size) * .34);
  block-size: calc(var(--_mark-size) * .62);
  margin-block-start: calc(var(--_mark-size) * -.18);
  border-inline-end: 2px solid currentColor;
  border-block-end: 2px solid currentColor;
  transform: rotate(45deg);
}
.ds-feature-checklist__mark > svg { inline-size: 100%; block-size: 100%; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-feature-checklist__mark:has(> svg)::before { content: none; }
.ds-feature-checklist[data-marker="dot"] .ds-feature-checklist__mark::before { inline-size: 6px; block-size: 6px; margin: 0; border: 0; border-radius: var(--ds-radius-pill); background: currentColor; transform: none; }
.ds-feature-checklist[data-marker="number"] { counter-reset: ds-feature; }
.ds-feature-checklist[data-marker="number"] .ds-feature-checklist__item { counter-increment: ds-feature; }
.ds-feature-checklist[data-marker="number"] .ds-feature-checklist__mark::before { content: counter(ds-feature, decimal-leading-zero); inline-size: auto; block-size: auto; margin: 0; border: 0; transform: none; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }

.ds-feature-checklist__label { min-width: 0; }
.ds-feature-checklist__label b { font-weight: var(--ds-weight-medium); color: var(--ds-ink); }
.ds-feature-checklist__meta { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); white-space: nowrap; padding-block-start: calc((var(--_size) * var(--ds-lh-body) - var(--ds-text-sm) * var(--ds-lh-body)) / 2); }
.ds-feature-checklist__icon {
  display: inline-grid;
  place-items: center;
  inline-size: var(--_icon-cell);
  align-self: stretch;
  margin-block: calc(-1 * var(--_pad-y));
  color: var(--ds-ink-2);
}
.ds-feature-checklist__icon > svg { inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

/* ---- item states ------------------------------------------------------------------------------------ */
.ds-feature-checklist__item[data-state="soon"] { color: var(--ds-ink-muted); }
.ds-feature-checklist__item[data-state="soon"] .ds-feature-checklist__mark { color: var(--ds-border-strong); }
.ds-feature-checklist__item[data-included="false"] { color: var(--ds-ink-muted); }
.ds-feature-checklist__item[data-included="false"] .ds-feature-checklist__mark { color: var(--ds-border-strong); }
.ds-feature-checklist__item[data-included="false"] .ds-feature-checklist__mark::before { inline-size: calc(var(--_mark-size) * .5); block-size: 0; margin: 0; border: 0; border-block-end: 2px solid currentColor; transform: none; }

/* ---- list states -------------------------------------------------------------------------------------- */
.ds-feature-checklist[aria-busy="true"] .ds-feature-checklist__item > * { visibility: hidden; }
.ds-feature-checklist[aria-busy="true"] .ds-feature-checklist__label { visibility: visible; color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs); max-inline-size: 60%; }
.ds-feature-checklist[data-state="empty"] { padding: var(--ds-space-4); border: var(--ds-border-width) dashed var(--ds-rule-strong); border-radius: var(--ds-radius-sm); }
.ds-feature-checklist__empty { margin: 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); text-align: center; }

/* =========================================================================
   VARIANTS
   ========================================================================= */

/* jasper: 32 px pitch, 14 px green 2 px-stroke check, every row underlined (their tooltip affordance —
   kept as the variant; the house leaves rows as plain text) */
.ds-feature-checklist[data-variant="jasper-green-check-underlined-rows"] { --_mark-size: 14px; --_gap: var(--ds-space-3); }
.ds-feature-checklist[data-variant="jasper-green-check-underlined-rows"] .ds-feature-checklist__label { text-decoration: underline; text-decoration-thickness: var(--ds-border-width); text-decoration-color: color-mix(in srgb, currentColor 45%, transparent); text-underline-offset: .18em; }

/* airbnb: 24 px INK checks, 16/400 text, 40 px pitch, inside a bordered card; completion is a fact, not a celebration */
.ds-feature-checklist[data-variant="airbnb-verification-checklist"] { --_mark: var(--ds-ink); --_mark-size: var(--ds-icon-size-rail); --_size: var(--ds-text-lg); --_ink: var(--ds-ink); --_pad-y: var(--ds-space-2); --_gap: var(--ds-space-4); }

/* heron: 52 px rows separated by hairlines, a one-sentence text cell + a 60 px icon cell (hexagon-outlined glyph);
   no check mark at all — the icon is the mark */
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] { --_pad-y: var(--ds-space-4); --_size: var(--ds-text-sm); --_ink: var(--ds-ink); }
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__item { grid-template-columns: minmax(0, 1fr) auto; min-block-size: 52px; align-items: center; }
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__item + .ds-feature-checklist__item { border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__mark { display: none; }
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__icon { border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
/* heron row with a house __meta spec cell before the icon (L-FEAT-10 JSTOV): label | meta | icon — additive 2026-09-20 */
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__item:has(> .ds-feature-checklist__meta) { grid-template-columns: minmax(0, 1fr) auto auto; }
.ds-feature-checklist[data-variant="heron-icon-checklist-4-rows"] .ds-feature-checklist__item:has(> .ds-feature-checklist__meta) .ds-feature-checklist__meta { padding-block-start: 0; padding-inline-end: var(--ds-space-4); }
/* data-meta="mono": the trailing note becomes a spec cell in the mono lane (uppercase, tracked, tabular) */
.ds-feature-checklist[data-meta="mono"] .ds-feature-checklist__meta { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .05em; text-transform: uppercase; font-variant-numeric: tabular-nums; }

/* origin: three centred bullets under a serif headline — filled 6 px dot, 18 px text, 3–5 words each */
.ds-feature-checklist[data-variant="origin-3-bullets"] { --_mark: var(--ds-ink); --_size: var(--ds-text-lg); --_ink: var(--ds-ink); --_mark-size: 12px; --_pad-y: var(--ds-space-1); }
.ds-feature-checklist[data-variant="origin-3-bullets"] .ds-feature-checklist__item { grid-template-columns: auto minmax(0, auto); justify-content: center; }
.ds-feature-checklist[data-variant="origin-3-bullets"] .ds-feature-checklist__mark::before { inline-size: 6px; block-size: 6px; margin: 0; border: 0; border-radius: var(--ds-radius-pill); background: currentColor; transform: none; }

/* ds/components/footer.css */
/* ============================================================================
   footer — Footer
   taxonomy-components.md §A · common · S1  ·  sections L-FOOT-01/02/03, L-TESTI-04

   Root: <footer class="ds-footer" data-variant="…">  (one per page)
   Parts (reading order):
     __inner · __row · __brand (__logo, __mark, __wordmark, __tagline, __ai-rail,
     __badges, __brand-foot, __ambient) · __groups > __col? > __group (__group-title,
     __list, __link, __badge, __ext) · __card (__card-title, __emphasis, __card-cta,
     __proof, __proof-link, __stars, __rating, __proof-divider) · __subscribe (__input,
     __submit, __subscribe-msg) · __signoff (__signoff-svg) · __rule · __legal (__copy, __operator,
     __status, __legal-links, __theme, __privacy, __region-pill) · __terminator ·
     __utility-row > __cell · __colophon · __plate · __social (__social-tile,
     __social-glyph) · __region · __table > __cell (heron)
   Variants: jstov (default) · sequence-conversion-card · klarna-wordmark-monument ·
     rox-engineering-grid · legend-dashed-utility-row · vercel-sitemap-badges ·
     heron-table-footer · intercom-mono-labelled · attio-mega · fibery-proof-rail ·
     luma-app-footer · perplexity-in-app-link-row
   States: link hover/focus/current · groups[aria-busy] skeleton · groups[data-state=empty]
     dashed footprint · subscribe aria-invalid / data-state=success / submit aria-busy ·
     card CTA hover / disabled / aria-busy · theme radiogroup aria-checked
   Axes (root): data-headings="rule|eyebrow" · data-legal="mono" (one mono legal row, 2026-09-20) ·
     data-rules="solid" (legend: hairlines instead of dashes, 2026-09-20) · data-mode="dark" island
     (house group titles → ink / semibold, 2026-09-20)
   Tokens only (tools/lint-tokens.mjs). Private knobs are --_*.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   0. ROOT
   ------------------------------------------------------------------------- */
.ds-footer {
  --_pitch: var(--ds-control-h);            /* link row pitch: 36 (median of 29–51) */
  --_col-min: 140px;                        /* sitemap column minimum (auto-fit): 2 cols at 390 */
  --_card-w: clamp(340px, 24cqi, 432px);    /* conversion card: ~24 % of the container (sequence 432 @ 1920) */
  --_max: var(--ds-container-max);
  --_band: var(--ds-surface-inverse);       /* house terminator: ink band */
  --_link-ink: var(--ds-ink-muted);
  --_title-ink: var(--ds-ink-muted);
  --_toggle-h: var(--ds-control-h-sm);
  --_spin: var(--ds-ink);
  position: relative;
  container-type: inline-size;
  background: var(--ds-ground);
  color: var(--ds-ink);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-list);
}
.ds-footer__inner {
  position: relative;
  width: 100%;
  max-width: var(--_max);
  margin-inline: auto;
  padding-inline: var(--ds-gutter-page);
  padding-block: var(--ds-space-16) var(--ds-space-8);
  min-width: 0;
}

/* first row: brand | groups | card  (flex so each slot is optional) */
.ds-footer__row {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  gap: var(--ds-space-10) var(--ds-space-6);   /* 40 × 24 (80 × 48 on an 8 px unit) */
  min-width: 0;
}
.ds-footer__brand  { flex: 1 1 160px; min-width: 0; display: flex; flex-direction: column; gap: var(--ds-space-5); }
.ds-footer__groups { flex: 2 1 320px; min-width: 0; }
/* several group grids stacked (rox: group A row, group B row — each row's headings align) */
.ds-footer__groups-stack { flex: 2 1 320px; min-width: 0; display: flex; flex-direction: column; gap: var(--ds-space-16); }
.ds-footer__groups-stack > .ds-footer__groups { flex: none; }
.ds-footer__card   { flex: 0 1 var(--_card-w); max-width: 100%; min-width: 0; }

/* ---------------------------------------------------------------------------
   1. BRAND BLOCK
   ------------------------------------------------------------------------- */
.ds-footer__logo {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  align-self: flex-start;
  min-height: var(--_pitch);
  border-radius: var(--ds-radius-sm);
  color: var(--ds-ink);
  text-decoration: none;
  font-weight: var(--ds-weight-semibold);
  font-size: var(--ds-text-lg);
  letter-spacing: var(--ds-heading-tracking);
}
.ds-footer__mark { width: var(--ds-icon-size-rail); height: var(--ds-icon-size-rail); flex: none; fill: currentColor; }
.ds-footer__tagline { color: var(--ds-ink-muted); max-width: 28ch; margin: 0; }

/* "Ask about us on:" AI-assistant rail (fibery; house GEO signal) */
.ds-footer__ai-rail { display: flex; flex-direction: column; gap: var(--ds-space-2); }
.ds-footer__ai-label { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.ds-footer__ai-list { display: flex; flex-wrap: wrap; gap: var(--ds-space-1); margin: 0; padding: 0; list-style: none; }
.ds-footer__ai-tile {
  display: inline-grid;
  place-items: center;
  width: var(--ds-control-h-sm);
  height: var(--ds-control-h-sm);
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: var(--ds-radius-sm);
  background: var(--ds-surface);
  color: var(--ds-ink-2);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-semibold);
  text-decoration: none;
  transition: border-color var(--ds-dur-fast) var(--ds-ease-standard), background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-footer__ai-tile:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); color: var(--ds-ink); }

/* compliance seals (fibery) */
.ds-footer__badges { display: flex; flex-wrap: wrap; gap: var(--ds-space-2); margin: 0; padding: 0; list-style: none; }
.ds-footer__seal {
  display: inline-grid;
  place-items: center;
  width: var(--ds-control-h-lg);
  height: var(--ds-control-h-lg);
  border: var(--ds-border-width) dashed var(--ds-rule-strong);
  border-radius: var(--ds-radius-pill);
  color: var(--ds-ink-muted);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .04em;
  text-transform: uppercase;
  text-align: center;
  line-height: 1;
}
.ds-footer__brand-foot { margin-block-start: auto; display: flex; flex-direction: column; gap: var(--ds-space-4); }

/* decorative ambient art (rox globe): behind content, never figure */
.ds-footer__ambient {
  position: absolute;
  inset-block-end: 0;
  inset-inline-start: 0;
  width: min(420px, 60%);
  height: auto;
  pointer-events: none;
  fill: none;
  stroke: var(--ds-line-art);
  stroke-width: 1;
  opacity: .5;
  z-index: 0;
}
.ds-footer__ambient + * { position: relative; z-index: 1; }

/* ---------------------------------------------------------------------------
   2. SITEMAP GROUPS — heading is row zero of the list (muted, same size, same pitch)
   ------------------------------------------------------------------------- */
.ds-footer__groups {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(var(--_col-min), 100%), 1fr));
  gap: var(--ds-space-8) var(--ds-space-5);
  align-items: start;
}
.ds-footer__col { display: flex; flex-direction: column; gap: var(--ds-space-8); min-width: 0; }
.ds-footer__group { min-width: 0; }
.ds-footer__group-title {
  display: flex;
  align-items: center;
  min-height: var(--_pitch);
  margin: 0;
  font-size: inherit;
  font-weight: var(--ds-weight-regular);
  line-height: var(--ds-lh-list);
  color: var(--_title-ink);
}
.ds-footer__list { margin: 0; padding: 0; list-style: none; }
.ds-footer__link {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--_pitch);
  max-width: 100%;
  border-radius: var(--ds-radius-xs);
  color: var(--_link-ink);
  text-decoration: none;
  transition: color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-footer__link:hover,
.ds-footer__link[data-state="hover"] {
  color: var(--ds-ink);
  text-decoration: underline;
  text-decoration-color: currentColor;
  text-underline-offset: .2em;
}
.ds-footer__link[aria-current="page"] { color: var(--ds-ink); font-weight: var(--ds-selected-weight); }
.ds-footer__link[aria-disabled="true"] { color: var(--ds-ink-faint); pointer-events: none; }
/* inline recency badge: mono caps, hairline, xs radius — never white-on-colour */
.ds-footer__badge {
  display: inline-block;
  padding: 0 var(--ds-space-1);
  border: var(--ds-border-width) solid var(--ds-rule-strong);
  border-radius: var(--ds-radius-xs);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .04em;
  text-transform: uppercase;
  line-height: 1.5;
  white-space: nowrap;
  color: var(--ds-ink-2);
  background: var(--ds-surface);
}
.ds-footer__badge[data-tone="accent"] { border-color: transparent; background: var(--ds-accent-tint); color: var(--ds-accent-ink); }
/* external-link glyph (↗) */
.ds-footer__ext { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; color: var(--ds-ink-faint); flex: none; }
.ds-footer__link:hover .ds-footer__ext { color: currentColor; }

/* rule-under-heading columns (rox): opt in per root or per group */
.ds-footer[data-headings="rule"] .ds-footer__group-title,
.ds-footer__group[data-headings="rule"] .ds-footer__group-title {
  color: var(--ds-ink);
  border-block-end: var(--ds-border-width) solid var(--ds-rule-strong);
  margin-block-end: var(--ds-space-2);
}
/* eyebrow headings (intercom / legend / heron): the label lane, forced caps */
.ds-footer[data-headings="eyebrow"] .ds-footer__group-title,
.ds-footer__group[data-headings="eyebrow"] .ds-footer__group-title {
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
}

/* loading: skeleton bars in the true frame (no layout jump) */
.ds-footer__groups[aria-busy="true"] .ds-footer__group-title,
.ds-footer__groups[aria-busy="true"] .ds-footer__link {
  position: relative;
  color: transparent !important;
  pointer-events: none;
}
.ds-footer__groups[aria-busy="true"] .ds-footer__group-title::after,
.ds-footer__groups[aria-busy="true"] .ds-footer__link::after {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block: calc(50% - .5em);
  width: 100%;
  border-radius: var(--ds-radius-xs);
  background: var(--ds-surface-3);
}
.ds-footer__groups[aria-busy="true"] .ds-footer__group-title::after { width: 60%; background: var(--ds-surface-2); }
/* empty: dashed footprint, never blank */
.ds-footer__groups[data-state="empty"] {
  display: grid;
  place-items: center;
  min-height: calc(var(--_pitch) * 4);
  border: var(--ds-border-width) dashed var(--ds-rule);
  border-radius: var(--ds-radius-md);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
}
.ds-footer__groups[data-state="empty"]::before { content: attr(data-empty); }

/* ---------------------------------------------------------------------------
   3. CONVERSION CARD (sequence; house optional) — holds the view's ONE primary
   ------------------------------------------------------------------------- */
.ds-footer__card {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-4);
  align-self: flex-start;
  padding: calc(var(--ds-card-pad) * 1.5);  /* 24; sequence 32 at 432 wide */
  border: var(--ds-border-width) solid var(--ds-card-border);
  border-radius: var(--ds-radius-lg);
  background: var(--ds-card-bg);
  box-shadow: var(--ds-card-shadow);
}
.ds-footer__card-title {
  margin: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-regular);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink-muted);
  text-wrap: balance;
}
.ds-footer__emphasis { color: var(--ds-ink); font-weight: var(--ds-weight-medium); }
.ds-footer__card-cta {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: var(--ds-control-h-lg);
  padding-inline: var(--ds-space-5);
  border: var(--ds-border-width) solid var(--ds-primary-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-primary-fill);
  color: var(--ds-ink-on-primary);
  font-weight: var(--ds-weight-medium);
  font-size: var(--ds-text-md);
  text-decoration: none;
  text-transform: var(--ds-control-case);
  box-shadow: var(--ds-shadow-lip);
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-footer__card-cta:hover { background: var(--ds-primary-fill-hover); }
.ds-footer__card-cta[aria-disabled="true"], .ds-footer__card-cta:disabled {
  background: var(--ds-surface-3); border-color: var(--ds-rule); color: var(--ds-ink-faint); box-shadow: none; cursor: not-allowed; pointer-events: none;
}
.ds-footer__card-cta[aria-busy="true"] { color: transparent; pointer-events: none; }
.ds-footer__card-cta[aria-busy="true"]::after {
  content: ""; position: absolute; inset: 0; margin: auto;
  width: var(--ds-icon-size); height: var(--ds-icon-size);
  border: 2px solid var(--ds-ink-on-primary); border-inline-end-color: transparent; border-radius: var(--ds-radius-pill);
  animation: ds-footer-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-footer-spin { to { transform: rotate(360deg); } }
.ds-footer__proof { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-2); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.ds-footer__proof-link { display: inline-flex; align-items: center; gap: var(--ds-space-1); color: var(--ds-ink-link); text-decoration: none; border-radius: var(--ds-radius-xs); white-space: nowrap; }
.ds-footer__proof-link:hover { text-decoration: underline; text-underline-offset: .2em; }
.ds-footer__proof-link .ds-footer__ext { color: currentColor; }
.ds-footer__stars { display: inline-flex; gap: 2px; color: var(--ds-data-6); }
.ds-footer__stars svg { width: var(--ds-icon-size); height: var(--ds-icon-size); fill: currentColor; }
.ds-footer__rating { font-variant-numeric: tabular-nums; color: var(--ds-ink-2); }
.ds-footer__proof-divider { width: var(--ds-border-width); height: 1.2em; background: var(--ds-rule-strong); }

/* ---------------------------------------------------------------------------
   4. SUBSCRIBE (heron; house optional) — input + submit cell, states specified
   ------------------------------------------------------------------------- */
.ds-footer__subscribe { display: flex; flex-direction: column; gap: var(--ds-space-2); min-width: 0; }
.ds-footer__subscribe-text { margin: 0; color: var(--ds-ink-muted); font-size: var(--ds-text-sm); max-width: 32ch; }
.ds-footer__subscribe-row { display: flex; min-width: 0; }
.ds-footer__input {
  flex: 1 1 auto;
  min-width: 0;
  min-height: var(--ds-control-h);
  padding-inline: var(--ds-control-pad-x);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-sm) 0 0 var(--ds-radius-sm);
  background: var(--ds-surface);
  color: var(--ds-ink);
}
.ds-footer__input:hover { border-color: var(--ds-border-strong); }
.ds-footer__input[aria-invalid="true"] { border-color: var(--ds-danger); }
.ds-footer__submit {
  position: relative;
  display: inline-grid;
  place-items: center;
  width: var(--ds-control-h);
  min-height: var(--ds-control-h);
  margin-inline-start: calc(-1 * var(--ds-border-width));
  padding: 0;
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: 0 var(--ds-radius-sm) var(--ds-radius-sm) 0;
  background: var(--ds-surface);
  color: var(--ds-ink);
  flex: none;
}
.ds-footer__submit:hover { background: var(--ds-hover-bg); border-color: var(--ds-border-strong); }
.ds-footer__submit svg { width: var(--ds-icon-size); height: var(--ds-icon-size); fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-footer__submit[aria-busy="true"] svg { visibility: hidden; }
.ds-footer__submit[aria-busy="true"]::after {
  content: ""; position: absolute; inset: 0; margin: auto;
  width: var(--ds-icon-size); height: var(--ds-icon-size);
  border: 2px solid var(--_spin); border-inline-end-color: transparent; border-radius: var(--ds-radius-pill);
  animation: ds-footer-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
.ds-footer__subscribe-msg { margin: 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); min-height: 1.4em; }
.ds-footer__subscribe[data-state="error"] .ds-footer__subscribe-msg { color: var(--ds-danger-ink); }
.ds-footer__subscribe[data-state="success"] .ds-footer__subscribe-msg { color: var(--ds-success-ink); }

/* ---------------------------------------------------------------------------
   5. SIGN-OFF, RULE, LEGAL ROW, TERMINATOR
   ------------------------------------------------------------------------- */
.ds-footer__signoff { margin-block: var(--ds-space-16) var(--ds-space-8); color: var(--ds-ink); }
.ds-footer__signoff-svg { width: 100%; height: auto; display: block; overflow: visible; }
.ds-footer__signoff-svg text { font-family: var(--ds-font-display); font-weight: var(--ds-weight-bold); fill: currentColor; letter-spacing: -.03em; }
.ds-footer__signoff[data-style="outline"] .ds-footer__signoff-svg text { fill: none; stroke: var(--ds-line-art); stroke-width: 1.5; }

.ds-footer__rule { width: 100%; height: 0; margin-block: var(--ds-space-10) 0; border: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-footer__rule[data-style="faded"] {
  border: 0;
  height: var(--ds-border-width);
  background: linear-gradient(to right, transparent, var(--ds-rule) 15%, var(--ds-rule) 85%, transparent);
}
.ds-footer__rule[data-style="dashed"] { border-block-start-style: dashed; }

.ds-footer__legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-3) var(--ds-space-6);
  padding-block: var(--ds-space-6) 0;
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
}
.ds-footer__legal-start, .ds-footer__legal-end { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-3) var(--ds-space-6); min-width: 0; }
.ds-footer__copy { margin: 0; }
/* the legal operator line (company, registration, VAT): a full-width xs row under the copyright */
.ds-footer__operator { margin: 0; flex-basis: 100%; font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.ds-footer__copy--dense { font-size: var(--ds-text-xs); line-height: var(--ds-lh-body); max-width: 72ch; }
.ds-footer__legal-links { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--ds-space-5); margin: 0; padding: 0; list-style: none; }
.ds-footer__legal-links a { color: inherit; text-decoration: none; border-radius: var(--ds-radius-xs); }
.ds-footer__legal-links a:hover { color: var(--ds-ink); text-decoration: underline; text-underline-offset: .2em; }
.ds-footer__legal-links a[aria-current="page"] { color: var(--ds-ink); }

/* live status token (house · vercel) — dot + mono caps; text stays muted (R12) */
.ds-footer__status {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-control-h-sm);
  border-radius: var(--ds-radius-xs);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
  text-decoration: none;
  white-space: nowrap;
}
.ds-footer__status::before { content: ""; width: 8px; height: 8px; border-radius: var(--ds-radius-pill); background: var(--ds-presence); flex: none; }
.ds-footer__status:hover { color: var(--ds-ink); }
.ds-footer__status[data-status="degraded"]::before { background: var(--ds-warning); }
.ds-footer__status[data-status="down"]::before { background: var(--ds-danger); }
.ds-footer__status[data-tone="accent"] { color: var(--ds-ink-link); }
.ds-footer__status[data-tone="accent"]::before { background: var(--ds-accent); }

/* 3-state theme toggle: system / light / dark — a radiogroup in a pill track */
.ds-footer__theme {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  height: var(--_toggle-h);
  padding: 2px;
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  margin: 0;
  align-self: flex-start;
  flex: none;
}
.ds-footer__theme-opt {
  display: inline-grid;
  place-items: center;
  width: calc(var(--_toggle-h) - 6px);
  height: calc(var(--_toggle-h) - 6px);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-pill);
  background: transparent;
  color: var(--ds-ink-muted);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-footer__theme-opt:hover { color: var(--ds-ink); background: var(--ds-hover-bg); }
.ds-footer__theme-opt[aria-checked="true"] { background: var(--ds-selected-bg); color: var(--ds-selected-ink); }
.ds-footer__theme-opt svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

/* privacy-choices toggle (intercom): tiny switch glyph + text link */
.ds-footer__privacy { display: inline-flex; align-items: center; gap: var(--ds-space-2); color: inherit; text-decoration: none; border-radius: var(--ds-radius-xs); }
.ds-footer__privacy::before {
  content: ""; width: 20px; height: 12px; border-radius: var(--ds-radius-pill);
  border: var(--ds-border-width) solid var(--ds-accent); background: linear-gradient(to right, var(--ds-accent) 50%, transparent 50%);
}
.ds-footer__privacy:hover { color: var(--ds-ink); text-decoration: underline; text-underline-offset: .2em; }

/* regional pill (fibery "Crafted in Europe") */
.ds-footer__region-pill {
  display: inline-flex; align-items: center; gap: var(--ds-space-2);
  min-height: var(--ds-control-h-sm); padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-raised); color: var(--ds-ink-2); font-size: var(--ds-text-xs); white-space: nowrap;
}

/* terminator: the brand band that ends the page (house 3 px ink; sequence gradient) */
.ds-footer__terminator { height: 3px; background: var(--_band); }

/* ---------------------------------------------------------------------------
   6. SOCIAL + WIDGETS
   ------------------------------------------------------------------------- */
.ds-footer__social { display: flex; flex-wrap: wrap; gap: var(--ds-space-2); margin: 0; padding: 0; list-style: none; }
.ds-footer__social-tile {
  display: inline-grid; place-items: center;
  width: var(--ds-control-h-lg); height: var(--ds-control-h-lg);
  border: var(--ds-border-width) solid var(--ds-border); border-radius: var(--ds-radius-sm);
  background: transparent; color: var(--ds-ink); text-decoration: none;
  font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-semibold);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-footer__social-tile:hover { background: var(--ds-hover-bg); border-color: var(--ds-border-strong); }
.ds-footer__social-tile[data-fill] { background: var(--ds-surface-2); border-color: var(--ds-rule); }
.ds-footer__social-glyph {
  display: inline-grid; place-items: center;
  width: var(--ds-control-h-sm); height: var(--ds-control-h-sm);
  border-radius: var(--ds-radius-sm); color: var(--ds-ink-muted); text-decoration: none;
  font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-semibold);
}
.ds-footer__social-glyph:hover { color: var(--ds-ink); background: var(--ds-hover-bg); }
.ds-footer__social-glyph svg, .ds-footer__social-tile svg { width: var(--ds-icon-size); height: var(--ds-icon-size); fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

/* market / region selector chip-button (klarna): the column's only filled surface */
.ds-footer__region {
  display: inline-flex; align-items: center; gap: var(--ds-space-3);
  min-height: var(--ds-control-h-lg); padding-inline: var(--ds-space-3) var(--ds-space-4);
  border: 0; border-radius: var(--ds-radius-sm);
  background: var(--ds-surface-2); color: var(--ds-ink); text-decoration: none; text-align: start; white-space: nowrap;
}
.ds-footer__region:hover { background: var(--ds-surface-3); }
.ds-footer__region-flag { width: 26px; height: 26px; border-radius: var(--ds-radius-pill); background: var(--ds-surface-3); display: inline-grid; place-items: center; font-size: var(--ds-text-xs); color: var(--ds-ink-muted); flex: none; }
.ds-footer__region svg { width: var(--ds-icon-size); height: var(--ds-icon-size); fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; margin-inline-start: var(--ds-space-4); }

/* App Store badge (legend): a black badge honoured as the vendor draws it */
.ds-footer__store {
  display: inline-flex; align-items: center; gap: var(--ds-space-2);
  min-height: var(--ds-control-h-lg); padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) solid var(--ds-rule-strong); border-radius: var(--ds-radius-sm);
  background: var(--ds-surface-inverse); color: var(--ds-ink-inverse); text-decoration: none; line-height: 1.1;
}
.ds-footer__store svg { width: var(--ds-icon-size-row); height: var(--ds-icon-size-row); fill: currentColor; }
.ds-footer__store small { display: block; font-size: var(--ds-text-xs); opacity: .8; }
.ds-footer__store strong { display: block; font-size: var(--ds-text-md); font-weight: var(--ds-weight-semibold); }

/* ---------------------------------------------------------------------------
   7. LEGEND: dashed utility row + colophon + plate
   ------------------------------------------------------------------------- */
.ds-footer__utility-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
  border-block: var(--ds-border-width) dashed var(--ds-rule-strong);
}
.ds-footer__cell { display: flex; flex-wrap: wrap; gap: var(--ds-space-6); padding: var(--ds-space-6) var(--ds-space-5); min-width: 0; }
.ds-footer__cell + .ds-footer__cell { border-inline-start: var(--ds-border-width) dashed var(--ds-rule-strong); }
.ds-footer__cell[data-align="center"] { align-items: center; justify-content: center; }
.ds-footer__cell[data-align="end"] { align-items: flex-end; justify-content: flex-end; }
.ds-footer__colophon {
  display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--ds-space-2) var(--ds-space-10);
  padding-block: var(--ds-space-4);
  font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .05em; text-transform: uppercase; color: var(--ds-ink-muted);
}
.ds-footer__colophon dl { display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-10); margin: 0; }
.ds-footer__colophon div { display: inline-flex; gap: var(--ds-space-2); }
.ds-footer__colophon dt::after { content: ":"; }
.ds-footer__colophon dd { margin: 0; color: var(--ds-ink-2); }
.ds-footer__plate {
  position: relative;
  display: grid;
  place-items: center;
  min-height: 240px;
  margin-block-start: var(--ds-space-8);
  background: linear-gradient(to bottom, transparent, var(--ds-illustration-ground));
  border-radius: var(--ds-radius-lg) var(--ds-radius-lg) 0 0;
}
.ds-footer__plate[data-plate="none"] { min-height: 120px; }
.ds-footer__plate-mark { width: 96px; height: 96px; border-radius: var(--ds-radius-pill); background: var(--ds-surface-inverse); display: grid; place-items: center; color: var(--ds-ink-inverse); }
.ds-footer__plate-mark svg { width: 40px; height: 40px; fill: currentColor; }

/* ---------------------------------------------------------------------------
   8. HERON TABLE — 3/2/2/2/3 cells × 2 rows, mark spanning rows
   ------------------------------------------------------------------------- */
.ds-footer__table {
  display: grid;
  grid-template-columns: 3fr 2fr 2fr 2fr 3fr;
  border: var(--ds-border-width) solid var(--ds-rule);
  border-inline-end: 0;
  border-block-end: 0;
}
.ds-footer__table > .ds-footer__cell {
  flex-direction: column;
  flex-wrap: nowrap;          /* a wrapping column flex sizes itself to max-content and overflows the track */
  align-items: stretch;
  gap: var(--ds-space-3);
  padding: var(--ds-space-4);
  border-inline-end: var(--ds-border-width) solid var(--ds-rule);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-footer__table > .ds-footer__cell + .ds-footer__cell { border-inline-start: 0; }
.ds-footer__cell-label {
  display: block;
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
}
.ds-footer__cell--span { grid-row: span 2; display: grid; place-items: center; }
.ds-footer__cell--span svg { width: min(160px, 60%); height: auto; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linejoin: round; }
.ds-footer__tagline--display { font-size: var(--ds-text-xl); font-weight: var(--ds-weight-semibold); line-height: var(--ds-lh-heading); letter-spacing: var(--ds-heading-tracking); text-transform: uppercase; color: var(--ds-ink); max-width: 18ch; }
.ds-footer__cell .ds-footer__link { min-height: var(--ds-control-h-sm); }
.ds-footer__cell .ds-footer__input { border-radius: 0; }
.ds-footer__cell .ds-footer__submit { border-radius: 0; }
.ds-footer__legal-cells { display: flex; margin: 0; padding: 0; list-style: none; }
.ds-footer__legal-cells a {
  display: inline-flex; align-items: center; min-height: var(--ds-control-h-lg); padding-inline: var(--ds-space-4);
  border-inline-start: var(--ds-border-width) solid var(--ds-rule); color: var(--ds-ink); text-decoration: none; font-size: var(--ds-text-sm);
}
.ds-footer__legal-cells a:hover { background: var(--ds-hover-bg); }

/* ---------------------------------------------------------------------------
   9. VARIANTS
   ------------------------------------------------------------------------- */

/* jstov (house, default) — Sequence's structure (brand | sitemap | conversion card;
   two-ended legal) with Klarna's ink-only hierarchy: no accent anywhere in the
   footer, headings = row zero, Fibery's "Ask about us on" AI rail in the brand
   column, Vercel's utility bar (status token + 3-state theme toggle) as the last
   row, 3 px ink band terminator. The card is optional (only when the page has no
   other close) and carries the view's one primary.                             */
.ds-footer:not([data-variant]),
.ds-footer[data-variant="jstov"] {
  --_pitch: var(--ds-control-h);
  --_col-min: 120px;
  --_band: var(--ds-surface-inverse);
}
.ds-footer:not([data-variant]) .ds-footer__brand,
.ds-footer[data-variant="jstov"] .ds-footer__brand,
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__brand { flex: 0 1 200px; }
.ds-footer:not([data-variant]) .ds-footer__proof-link,
.ds-footer[data-variant="jstov"] .ds-footer__proof-link { color: var(--ds-ink); }
.ds-footer:not([data-variant]) .ds-footer__stars,
.ds-footer[data-variant="jstov"] .ds-footer__stars { color: var(--ds-ink-2); }

/* sequence-conversion-card — brand | 3 ragged columns (51 px pitch, one type size)
   | bordered 432 px CTA card (gradient emphasis, full-width pill primary, G2 stars ›
   | product tour ›); faded hairline; two-ended legal; full-bleed gradient strip. */
.ds-footer[data-variant="sequence-conversion-card"] {
  --_pitch: calc(var(--ds-control-h) + var(--ds-space-4));
  --_col-min: 120px;
  --_link-ink: var(--ds-ink-2);
  --_band: linear-gradient(to right, var(--ds-accent), var(--ds-accent-2));
  font-size: var(--ds-text-lg);
  background: var(--ds-surface);
}
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__group-title { font-size: var(--ds-text-sm); }
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__card-title { font-size: var(--ds-text-lg); color: var(--ds-ink); }
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__emphasis {
  background: linear-gradient(90deg, var(--ds-accent), var(--ds-accent-2));
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  font-weight: inherit;
}
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__card-cta { border-radius: var(--ds-radius-pill); min-height: var(--ds-control-h-lg); }
.ds-footer[data-variant="sequence-conversion-card"] .ds-footer__terminator { height: var(--ds-space-1); }

/* klarna-wordmark-monument — five equal columns with widget slots (region
   chip-button, social tiles), bold white headings, 40 px pitch, no max-width;
   width-fitted wordmark band; hairline + split legal (dense disclosure left,
   utility links right). Committed dark: put data-mode="dark" on the root.       */
.ds-footer[data-variant="klarna-wordmark-monument"] {
  --_pitch: calc(var(--ds-control-h) + var(--ds-space-1));
  --_max: none;
  --_col-min: 200px;
  --_link-ink: var(--ds-ink-2);
  --_title-ink: var(--ds-ink);
}
.ds-footer[data-variant="klarna-wordmark-monument"] .ds-footer__inner { padding-inline: var(--ds-space-5); }
.ds-footer[data-variant="klarna-wordmark-monument"] .ds-footer__groups { gap: var(--ds-space-10) var(--ds-space-12); }
.ds-footer[data-variant="klarna-wordmark-monument"] .ds-footer__group-title {
  font-size: var(--ds-text-xl);
  font-weight: var(--ds-weight-bold);
  letter-spacing: var(--ds-heading-tracking);
  min-height: calc(var(--_pitch) + var(--ds-space-4));
  align-items: flex-start;
}
.ds-footer[data-variant="klarna-wordmark-monument"] .ds-footer__legal { align-items: flex-start; }

/* rox-engineering-grid — 1/3 brand column (space-between: logo top, 3-state theme
   toggle + legal bottom, corner-anchored wireframe globe) + 2/3 link grid of two
   stacked rule-under-heading groups; rails at the container edges, a full-bleed
   seam at the top, drawn joins; bar-less end (no legal row).                     */
.ds-footer[data-variant="rox-engineering-grid"] {
  --_pitch: calc(var(--ds-control-h) + var(--ds-space-1));
  --_col-min: 150px;
  --_toggle-h: var(--ds-control-h-lg);
  border-block-start: var(--ds-border-width) solid var(--ds-rule);
}
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner {
  border-inline: var(--ds-border-width) solid var(--ds-rule);
  padding-block: var(--ds-space-16) var(--ds-space-12);
}
/* drawn joins where the seam meets the rails */
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::before,
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::after {
  content: "";
  position: absolute;
  inset-block-start: -5px;
  width: 9px;
  height: 9px;
  background:
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) center / 100% 1px no-repeat,
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) center / 1px 100% no-repeat;
}
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::before { inset-inline-start: -5px; }
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::after { inset-inline-end: -5px; }
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__row { gap: var(--ds-space-10) 0; }
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__brand {
  flex: 1 1 240px;
  padding-inline-end: var(--ds-space-8);
  border-inline-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__groups-stack { padding-inline-start: var(--ds-space-12); }
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__group-title {
  color: var(--ds-ink);
  border-block-end: var(--ds-border-width) solid var(--ds-rule-strong);
  margin-block-end: var(--ds-space-2);
}
.ds-footer[data-variant="rox-engineering-grid"] .ds-footer__col { gap: var(--ds-space-16); }

/* legend-dashed-utility-row — three dashed cells (two eyebrow lists | App Store
   badge | social tiles bottom-right) + KEY: VALUE colophon + the mark centred in
   an empty band feathered into the ground; nothing beneath the plate.           */
.ds-footer[data-variant="legend-dashed-utility-row"] {
  --_pitch: calc(var(--ds-control-h) + var(--ds-space-2));
  --_link-ink: var(--ds-ink);
}
.ds-footer[data-variant="legend-dashed-utility-row"] .ds-footer__inner { padding-block: 0 0; }
.ds-footer[data-variant="legend-dashed-utility-row"] .ds-footer__group-title {
  font-family: var(--ds-font-label); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-medium);
  letter-spacing: .06em; text-transform: uppercase; color: var(--ds-ink-muted); min-height: var(--ds-control-h-sm);
}
.ds-footer[data-variant="legend-dashed-utility-row"] .ds-footer__colophon { border-block-end: var(--ds-border-width) dashed var(--ds-rule-strong); }

/* vercel-sitemap-badges — 12 groups flowing 6 × 2 (150 px min), 16/500 ink
   headings, 36 px pitch, inline NEW mono badges; utility bar = mark, accent
   status line left, 3-state theme toggle right. No rules, no band.              */
.ds-footer[data-variant="vercel-sitemap-badges"] {
  --_pitch: var(--ds-control-h);
  --_col-min: 150px;
  --_title-ink: var(--ds-ink);
}
.ds-footer[data-variant="vercel-sitemap-badges"] .ds-footer__group-title { font-weight: var(--ds-weight-medium); }
.ds-footer[data-variant="vercel-sitemap-badges"] .ds-footer__groups { gap: var(--ds-space-10) var(--ds-space-6); }
.ds-footer[data-variant="vercel-sitemap-badges"] .ds-footer__legal { flex-direction: column; align-items: flex-start; gap: var(--ds-space-6); padding-block-start: var(--ds-space-12); }
.ds-footer[data-variant="vercel-sitemap-badges"] .ds-footer__legal-end { width: 100%; justify-content: space-between; }

/* heron-table-footer — the page table continues: 3/2/2/2/3 × 2 cells, mark
   spanning rows, mono eyebrows, subscribe = text + input + bordered submit cell;
   construction-outline wordmark; bottom bar = legal left, bordered link cells right. */
.ds-footer[data-variant="heron-table-footer"] {
  --_pitch: var(--ds-control-h-sm);
  --_link-ink: var(--ds-ink);
  --_max: none;
}
.ds-footer[data-variant="heron-table-footer"] .ds-footer__inner { padding: 0; }
.ds-footer[data-variant="heron-table-footer"] .ds-footer__signoff { margin: 0; padding: var(--ds-space-6) var(--ds-gutter-page); border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.ds-footer[data-variant="heron-table-footer"] .ds-footer__legal { padding: 0 0 0 var(--ds-gutter-page); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .04em; text-transform: uppercase; }

/* intercom-mono-labelled — 5 columns, uppercase mono group heads, 1–3 groups per
   column, ~28 px pitch; legal row = 3 links + privacy toggle; no logo, no social. */
.ds-footer[data-variant="intercom-mono-labelled"] {
  --_pitch: var(--ds-control-h-sm);
  --_col-min: 180px;
  --_link-ink: var(--ds-ink-2);
  background: var(--ds-surface);
}
.ds-footer[data-variant="intercom-mono-labelled"] .ds-footer__group-title {
  font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-regular);
  letter-spacing: .1em; text-transform: uppercase; color: var(--ds-ink-muted);
}
.ds-footer[data-variant="intercom-mono-labelled"] .ds-footer__legal { justify-content: flex-start; padding-block-start: var(--ds-space-16); }

/* attio-mega — logo column (1/3) + 4 columns with stacked sub-groups, 32 px pitch,
   "New" accent badge (tint + accent ink, not white-on-blue), ↗ on externals;
   bottom row = social glyphs left, legal + 2 links right. Dark chapter close:
   put data-mode="dark" on the root.                                             */
.ds-footer[data-variant="attio-mega"] {
  --_pitch: var(--ds-control-h-sm);
  --_col-min: 130px;                       /* 4 × 130 + 3 gaps fits the 2/3 groups area at 1440 */
  --_link-ink: var(--ds-ink-2);
}
.ds-footer[data-variant="attio-mega"] .ds-footer__brand { flex: 0 1 33%; }   /* the reference's 1/3 logo column */
.ds-footer[data-variant="attio-mega"] .ds-footer__group-title { font-size: var(--ds-text-sm); }
.ds-footer[data-variant="attio-mega"] .ds-footer__link { font-size: var(--ds-text-sm); }
.ds-footer[data-variant="attio-mega"] .ds-footer__legal { padding-block-start: var(--ds-space-16); }

/* fibery-proof-rail — 6 columns on a lighter surface; brand column carries the
   tagline, "Ask about us on" AI tiles, compliance seals and a security line;
   bottom bar on the raised surface with ©, legal links, social glyphs and a
   regional pill.                                                                 */
.ds-footer[data-variant="fibery-proof-rail"] {
  --_pitch: var(--ds-control-h-sm);
  --_col-min: 130px;
  --_link-ink: var(--ds-ink-2);
  --_title-ink: var(--ds-ink);
  background: var(--ds-surface);
}
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__inner { padding-block-end: var(--ds-space-12); }
/* six equal columns in the reference: the brand is one of them, the five groups take the rest */
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__brand  { flex: 1 1 130px; }
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__groups { flex: 5 1 320px; }
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__group-title { font-weight: var(--ds-weight-semibold); }
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__link { font-size: var(--ds-text-sm); }
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__bar {
  background: var(--ds-surface-raised);
  border-block-start: var(--ds-border-width) solid var(--ds-rule);
}
.ds-footer[data-variant="fibery-proof-rail"] .ds-footer__bar .ds-footer__legal {
  max-width: var(--_max); margin-inline: auto; padding: var(--ds-space-4) var(--ds-gutter-page);
}

/* luma-app-footer — a rule; brand mark + links left / channel icons right; a
   centred promo line whose brand word takes the second accent's ink.            */
.ds-footer[data-variant="luma-app-footer"] {
  --_pitch: var(--ds-control-h-sm);
  --_link-ink: var(--ds-ink-muted);
}
.ds-footer[data-variant="luma-app-footer"] .ds-footer__inner { padding-block: 0 var(--ds-space-8); }
.ds-footer[data-variant="luma-app-footer"] .ds-footer__legal { justify-content: space-between; padding-block: var(--ds-space-5) 0; border-block-start: var(--ds-border-width) solid var(--ds-rule); font-size: var(--ds-text-md); }
.ds-footer[data-variant="luma-app-footer"] .ds-footer__legal-links { gap: var(--ds-space-1) var(--ds-space-5); }
.ds-footer__promo { margin: var(--ds-space-6) 0 0; text-align: center; color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }
.ds-footer__promo a { color: var(--ds-ink-link); text-decoration: none; }
.ds-footer__promo a:hover { text-decoration: underline; }
.ds-footer__promo .ds-footer__brand-word { color: var(--ds-accent-2-ink); font-weight: var(--ds-weight-medium); }

/* perplexity-in-app-link-row — centred muted links + a locale select at the
   bottom of the sheet; nothing else.                                            */
.ds-footer[data-variant="perplexity-in-app-link-row"] {
  --_pitch: var(--ds-control-h-sm);
  --_max: var(--ds-container-narrow);
  background: transparent;
}
.ds-footer[data-variant="perplexity-in-app-link-row"] .ds-footer__inner { padding-block: var(--ds-space-6); }
.ds-footer[data-variant="perplexity-in-app-link-row"] .ds-footer__legal { justify-content: center; padding: 0; }
.ds-footer__locale {
  appearance: none;
  -webkit-appearance: none;
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-2) var(--ds-space-6);
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: transparent;
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
  cursor: pointer;
}
.ds-footer__locale-wrap { position: relative; display: inline-flex; align-items: center; }
.ds-footer__locale-wrap svg { position: absolute; inset-inline-end: var(--ds-space-2); width: 12px; height: 12px; pointer-events: none; fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); color: var(--ds-ink-muted); }
.ds-footer__locale:hover { color: var(--ds-ink); background: var(--ds-hover-bg); }

/* ---------------------------------------------------------------------------
   9b. ADDITIVE AXES (2026-09-20, sections-G lane · L-FOOT-01 / L-FOOT-02)
   ------------------------------------------------------------------------- */
/* house on a DARK ISLAND (a data-mode="dark" ancestor, the root itself, or a data-band band): the muted
   row-zero title loses its hierarchy against a dark ground (quick-tunnels recreation, defect 14 — the page's
   titles are paper at 600), so the house title reads --ds-ink at --ds-weight-semibold there. Other variants
   set --_title-ink themselves; sequence / intercom / attio keep muted titles because that is the reference. */
[data-mode="dark"] .ds-footer:not([data-variant]) .ds-footer__group-title,
[data-mode="dark"] .ds-footer[data-variant="jstov"] .ds-footer__group-title,
[data-band] .ds-footer:not([data-variant]) .ds-footer__group-title,
[data-band] .ds-footer[data-variant="jstov"] .ds-footer__group-title,
.ds-footer[data-mode="dark"]:not([data-variant]) .ds-footer__group-title,
.ds-footer[data-mode="dark"][data-variant="jstov"] .ds-footer__group-title { color: var(--ds-ink); font-weight: var(--ds-weight-semibold); }
@media (prefers-color-scheme: dark) {
  :root:not([data-mode="light"]) .ds-footer:not([data-variant]):not([data-mode="light"]) .ds-footer__group-title,
  :root:not([data-mode="light"]) .ds-footer[data-variant="jstov"]:not([data-mode="light"]) .ds-footer__group-title { color: var(--ds-ink); font-weight: var(--ds-weight-semibold); }
}
/* data-legal="mono" — the legal row as ONE mono row (`© 2026 Ledgerline Ltd · Privacy · Terms · Status`) instead of
   the two-ended split; the clusters flow left, separated by a faint middle dot. The theme toggle keeps its place
   at the end of the row. (quick-tunnels defect 14: "two-ended legal row vs one mono row".) */
.ds-footer[data-legal="mono"] .ds-footer__legal {
  justify-content: flex-start;
  gap: var(--ds-space-2) var(--ds-space-3);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .02em;
}
.ds-footer[data-legal="mono"] .ds-footer__legal-start,
.ds-footer[data-legal="mono"] .ds-footer__legal-end,
.ds-footer[data-legal="mono"] .ds-footer__legal-links { gap: var(--ds-space-2) var(--ds-space-3); }
.ds-footer[data-legal="mono"] .ds-footer__legal-links li + li::before,
.ds-footer[data-legal="mono"] .ds-footer__legal-start > * + *:not(.ds-footer__status)::before,
.ds-footer[data-legal="mono"] .ds-footer__legal-end > .ds-footer__legal-links::before { content: "·"; margin-inline-end: var(--ds-space-3); color: var(--ds-ink-faint); }
.ds-footer[data-legal="mono"] .ds-footer__legal-links li { display: inline-flex; align-items: center; }
.ds-footer[data-legal="mono"] .ds-footer__legal-start > *,
.ds-footer[data-legal="mono"] .ds-footer__status { display: inline-flex; align-items: center; }
.ds-footer[data-legal="mono"] .ds-footer__legal-end { flex: 1 1 auto; }
.ds-footer[data-legal="mono"] .ds-footer__theme { margin-inline-start: auto; }
@container (max-width: 720px) {
  .ds-footer[data-legal="mono"] .ds-footer__legal-end > .ds-footer__legal-links::before { content: none; }   /* the cluster starts its own line: no orphaned dot */
}
/* data-rules="solid" (legend variant) — the dashed grid becomes the page's hairlines (L-FOOT-02 JSTOV:
   "dashed rules become the page's hairlines"): every dashed --ds-rule-strong rule is a solid --ds-rule. */
.ds-footer[data-variant="legend-dashed-utility-row"][data-rules="solid"] .ds-footer__utility-row,
.ds-footer[data-variant="legend-dashed-utility-row"][data-rules="solid"] .ds-footer__cell + .ds-footer__cell,
.ds-footer[data-variant="legend-dashed-utility-row"][data-rules="solid"] .ds-footer__colophon { border-style: solid; border-color: var(--ds-rule); }

/* ---------------------------------------------------------------------------
   10. NARROW (container ≤ 720 px): rails off, tables stack, legal wraps
   ------------------------------------------------------------------------- */
@container (max-width: 720px) {
  .ds-footer__inner { padding-block: var(--ds-space-10) var(--ds-space-6); }
  .ds-footer__row { gap: var(--ds-space-8); }
  .ds-footer__card { flex-basis: 100%; }
  .ds-footer__groups { gap: var(--ds-space-6) var(--ds-space-4); }
  .ds-footer__legal { flex-direction: column; align-items: flex-start; }
  .ds-footer__legal-end { width: 100%; justify-content: space-between; }
  .ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner { border-inline: 0; }
  .ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::before,
  .ds-footer[data-variant="rox-engineering-grid"] .ds-footer__inner::after { display: none; }
  .ds-footer[data-variant="rox-engineering-grid"] .ds-footer__brand { border-inline-end: 0; padding-inline-end: 0; }
  .ds-footer[data-variant="rox-engineering-grid"] .ds-footer__groups-stack { padding-inline-start: 0; }
  .ds-footer__ambient { width: 60%; opacity: .35; }
  .ds-footer__table { grid-template-columns: 1fr 1fr; }
  .ds-footer__cell--span { grid-row: span 1; grid-column: span 2; }
  .ds-footer[data-variant="heron-table-footer"] .ds-footer__legal { flex-direction: row; flex-wrap: wrap; padding-inline-start: var(--ds-space-4); }
  .ds-footer__legal-cells { flex-wrap: wrap; width: 100%; }
  .ds-footer__legal-cells a { border-inline-start: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule); flex: 1 1 auto; }
  .ds-footer__cell + .ds-footer__cell { border-inline-start: 0; border-block-start: var(--ds-border-width) dashed var(--ds-rule-strong); }
  .ds-footer__cell[data-align="end"] { justify-content: flex-start; }
}

/* ds/components/key-value-facts.css */
/* ============================================================================
   key-value-facts — key/value fact display           (taxonomy §D · common · S0)
   Root: <dl class="ds-key-value-facts" data-layout="stack|row|inline">
   Parts: __item (one dt+dd pair; a <div>, or a <button>/<a> wrapping dt+dd for a navigable row) ·
          __key (dt: the label lane) · __value (dd) · __icon (leading 16/20 px glyph) · __tile (descript brand tile)
          · __action (trailing quiet text button: Copy / Edit / Change) · __trail (trailing glyph: chevron / ↗)
          · __group (a titled sub-list: synara popover sections) · __group-label
   Layouts: stack (label OVER value, 8 px apart — luma) · row (key left, value right-aligned — synara, descript,
          the house inspector) · inline ("Key: value" on one line — airbnb, legend colophon)
   Variants (data-variant): luma-label-over-value-stack (default) · airbnb-prompt-answer · descript-payment-summary ·
     synara-popover-rows · luma-timezone-sidecar-card · legend-key-value-colophon · grammarly-caps-meta-label-value
   Value grammar: numbers right/tabular in row layout · null = an italic word ("None", "Not set") in --ds-ink-muted,
     never a blank · masked values in the mono lane · a sensitive row exposes an ACTION, not the value (descript)
   Private knobs: --_gap --_pitch --_min --_key-w --_key-ink --_value-ink
   ========================================================================== */

.ds-key-value-facts svg[fill="none"] { fill: none; }

.ds-key-value-facts {
  --_gap:       var(--ds-space-2);            /* label→value (stack) */
  --_pitch:     var(--ds-space-4);            /* item→item */
  --_min:       160px;                        /* stack grid column min */
  --_key-w:     minmax(96px, 12em);           /* row layout key column */
  --_key-ink:   var(--ds-ink-muted);
  --_value-ink: var(--ds-ink);
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(var(--_min), 100%), 1fr));
  gap: var(--_pitch) var(--ds-space-6);
  margin: 0;
  min-width: 0;
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
  color: var(--_value-ink);
}
.ds-key-value-facts__item { display: flex; flex-direction: column; gap: var(--_gap); min-width: 0; margin: 0; }
.ds-key-value-facts__key {
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);       /* keys follow data-labels (contract §3) */
  color: var(--_key-ink);
  min-width: 0;
}
.ds-key-value-facts__value {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-2);
  margin: 0;
  min-width: 0;
  font-size: var(--ds-text-lg);               /* luma: 18/600 value under a 16 label */
  font-weight: var(--ds-weight-semibold);
  line-height: var(--ds-lh-heading);
  color: var(--_value-ink);
  overflow-wrap: anywhere;
  font-variant-numeric: tabular-nums;
}
.ds-key-value-facts__value[data-lane="mono"] { font-family: var(--ds-font-mono); font-weight: var(--ds-weight-medium); font-size: var(--ds-text-md); letter-spacing: 0; }
.ds-key-value-facts__value[data-null] { font-style: italic; font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }   /* null = a word, never blank */
.ds-key-value-facts__value[data-masked] { font-family: var(--ds-font-mono); font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); letter-spacing: .08em; }
.ds-key-value-facts__value[data-tone="warning"] { color: var(--ds-warning-ink); }
.ds-key-value-facts__value[data-tone="success"] { color: var(--ds-success-ink); }
.ds-key-value-facts__value[data-tone="danger"]  { color: var(--ds-danger-ink); }
.ds-key-value-facts__value a { color: var(--ds-ink-link); }

.ds-key-value-facts__icon { width: var(--ds-icon-size); height: var(--ds-icon-size); flex: 0 0 auto; stroke: currentColor; stroke-width: var(--ds-icon-stroke); color: var(--ds-ink-muted); }
.ds-key-value-facts__trail { width: var(--ds-icon-size); height: var(--ds-icon-size); flex: 0 0 auto; stroke: currentColor; stroke-width: var(--ds-icon-stroke); color: var(--ds-ink-faint); margin-inline-start: auto; }
.ds-key-value-facts__tile {                    /* descript: 44×24 brand tile */
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 24px; flex: 0 0 auto;
  border-radius: var(--ds-radius-xs);
  border: var(--ds-border-width) solid var(--ds-rule);
  background: var(--ds-surface);
  font-family: var(--ds-font-label); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-bold); letter-spacing: .04em; color: var(--ds-ink-2);
}
.ds-key-value-facts__action {
  display: inline-flex; align-items: center; gap: var(--ds-space-1);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-2);
  border: 0; background: transparent;
  border-radius: var(--ds-radius-button);
  color: var(--ds-ink-2);
  font-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case);
  cursor: pointer; white-space: nowrap;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-key-value-facts__action:hover, .ds-key-value-facts__action[data-state="hover"] { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-key-value-facts__action:disabled { color: var(--ds-ink-faint); cursor: not-allowed; background: transparent; }
.ds-key-value-facts__action[data-state="done"] { color: var(--ds-success-ink); }     /* "Copied" */
.ds-key-value-facts__action svg { width: var(--ds-icon-size); height: var(--ds-icon-size); stroke: currentColor; stroke-width: var(--ds-icon-stroke); }

/* ---- row layout: key left, value right-aligned; the list scans as an inspector ---- */
.ds-key-value-facts[data-layout="row"] { display: flex; flex-direction: column; gap: 0; }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__item {
  display: grid;
  grid-template-columns: var(--_key-w) minmax(0, 1fr);
  align-items: center;
  column-gap: var(--ds-space-4);
  min-height: var(--ds-row-h);
  padding-block: var(--ds-space-1);
  border-block-end: var(--ds-border-width) solid var(--ds-rule-soft);   /* grade 1 between rows */
}
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__item:last-child { border-block-end: 0; }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__key { display: flex; align-items: center; gap: var(--ds-space-2); }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__value { justify-content: flex-end; text-align: end; font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__value[data-align="start"] { justify-content: flex-start; text-align: start; }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__action { margin-inline-start: auto; }   /* row layout: the action hugs the right edge */
.ds-key-value-facts[data-layout="row"][data-rules="none"] .ds-key-value-facts__item { border: 0; min-height: calc(var(--ds-row-h) - var(--ds-space-2)); }
@container (max-width: 360px) {
  .ds-key-value-facts[data-layout="row"] .ds-key-value-facts__item { grid-template-columns: minmax(0, 1fr); row-gap: var(--ds-space-0-5); }
  .ds-key-value-facts[data-layout="row"] .ds-key-value-facts__value { justify-content: flex-start; text-align: start; }
}

/* navigable rows: a <dl> may only hold div/dt/dd, so the link lives INSIDE the dd and the row reacts via :has() */
.ds-key-value-facts__value .ds-key-value-facts__link {           /* beats `__value a` — a navigable row is ink + chevron, not an inline link */
  display: inline-flex; align-items: center; gap: var(--ds-space-1);
  color: inherit; text-decoration: none; min-width: 0; border-radius: var(--ds-radius-xs);
  min-height: var(--ds-control-h-sm);
}
.ds-key-value-facts__value .ds-key-value-facts__link:hover { color: var(--ds-ink); }
.ds-key-value-facts__item:has(.ds-key-value-facts__link:hover),
.ds-key-value-facts__item[data-state="hover"] { background: var(--ds-hover-bg); }
.ds-key-value-facts__item:has(.ds-key-value-facts__link:hover) .ds-key-value-facts__trail,
.ds-key-value-facts__item[data-state="hover"] .ds-key-value-facts__trail { color: var(--ds-ink-2); }
.ds-key-value-facts[data-layout="row"] .ds-key-value-facts__item { border-radius: var(--ds-radius-xs); }
.ds-key-value-facts__item[aria-disabled="true"] { color: var(--ds-ink-faint); --_key-ink: var(--ds-ink-faint); cursor: not-allowed; }
.ds-key-value-facts__item[aria-disabled="true"] .ds-key-value-facts__link { pointer-events: none; }

/* ---- inline layout: "Key: value" on one line ---- */
.ds-key-value-facts[data-layout="inline"] { display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-6); }
.ds-key-value-facts[data-layout="inline"] .ds-key-value-facts__item { flex-direction: row; align-items: center; gap: var(--ds-space-2); }
.ds-key-value-facts[data-layout="inline"] .ds-key-value-facts__key::after { content: ":"; }
.ds-key-value-facts[data-layout="inline"] .ds-key-value-facts__value { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); }

/* ---- groups (synara popover sections) ---- */
.ds-key-value-facts__group { display: flex; flex-direction: column; gap: 0; min-width: 0; padding-block: var(--ds-space-2); border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.ds-key-value-facts__group:last-child { border-block-end: 0; }
.ds-key-value-facts__group-label { font-family: var(--ds-font-label); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); letter-spacing: var(--ds-label-tracking); text-transform: var(--ds-label-case); padding-block: var(--ds-space-1); }

/* ---- states on the root ---- */
.ds-key-value-facts[aria-busy="true"] .ds-key-value-facts__key,
.ds-key-value-facts[aria-busy="true"] .ds-key-value-facts__value { color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs); width: min(100%, 8em); }
.ds-key-value-facts[aria-busy="true"] .ds-key-value-facts__value { width: min(100%, 11em); }
.ds-key-value-facts[aria-busy="true"] .ds-key-value-facts__value > * { visibility: hidden; }
.ds-key-value-facts[data-state="empty"] { border: var(--ds-border-width) dashed var(--ds-rule); border-radius: var(--ds-radius-md); padding: var(--ds-card-pad); color: var(--ds-ink-muted); }

/* =========================================================================
   Designer variants
   ========================================================================= */
/* luma: 16 label over 18/600 value, 8 px apart — the default; keys are sentence case body ink */
.ds-key-value-facts[data-variant="luma-label-over-value-stack"] { --_key-ink: var(--ds-ink-2); }
.ds-key-value-facts[data-variant="luma-label-over-value-stack"] .ds-key-value-facts__key { font-family: var(--ds-font-sans); font-size: var(--ds-text-md); font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; }

/* airbnb: 24 px outline icon + "Prompt: answer" in a 2-col grid, row gap 20 — the reference sets prompt and
   answer in ONE style (weakness); here the key keeps its label ink so the pair is distinguishable */
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] { --_min: 260px; gap: var(--ds-space-5) var(--ds-space-8); }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__item { flex-direction: row; align-items: flex-start; gap: var(--ds-space-3); }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__icon { width: var(--ds-icon-size-rail); height: var(--ds-icon-size-rail); color: var(--ds-ink); margin-block-start: 1px; }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__key { display: inline; font-family: var(--ds-font-sans); font-size: var(--ds-text-lg); font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; color: var(--ds-ink-2); }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__key::after { content: ": "; }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__value { display: inline; font-size: var(--ds-text-lg); font-weight: var(--ds-weight-regular); line-height: var(--ds-lh-body); }
.ds-key-value-facts[data-variant="airbnb-prompt-answer"] .ds-key-value-facts__text { display: block; min-width: 0; }

/* descript: property row — label 15/400 left, control flush right; sensitive rows expose an action */
.ds-key-value-facts[data-variant="descript-payment-summary"] { --_key-w: minmax(120px, 1fr); }
.ds-key-value-facts[data-variant="descript-payment-summary"] .ds-key-value-facts__item { grid-template-columns: var(--_key-w) auto; min-height: var(--ds-control-h-lg); border-block-end-color: var(--ds-rule); }
.ds-key-value-facts[data-variant="descript-payment-summary"] .ds-key-value-facts__key { font-family: var(--ds-font-sans); font-size: var(--ds-text-md); font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; color: var(--ds-ink); }
.ds-key-value-facts[data-variant="descript-payment-summary"] .ds-key-value-facts__value { font-weight: var(--ds-weight-regular); color: var(--ds-ink-2); }

/* synara: popover rows — 16 px icon + 13 px label + trailing value / chevron / ↗ on a 20 px pitch, sectioned */
.ds-key-value-facts[data-variant="synara-popover-rows"] { --_key-w: auto; font-size: var(--ds-text-sm); max-width: 260px; }
.ds-key-value-facts[data-variant="synara-popover-rows"] .ds-key-value-facts__item { grid-template-columns: auto minmax(0, 1fr); min-height: var(--ds-control-h-sm); padding-block: 0; border: 0; }
.ds-key-value-facts[data-variant="synara-popover-rows"] .ds-key-value-facts__key { font-family: var(--ds-font-sans); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; color: var(--ds-ink); }
.ds-key-value-facts[data-variant="synara-popover-rows"] .ds-key-value-facts__value { font-size: var(--ds-text-sm); font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }
.ds-key-value-facts[data-variant="synara-popover-rows"] .ds-key-value-facts__value[data-lane="mono"] { font-size: var(--ds-text-xs); }

/* luma timezone sidecar: a card with globe / offset / city — value over key, icon top-left */
.ds-key-value-facts[data-variant="luma-timezone-sidecar-card"] { --_min: 180px; display: inline-grid; grid-template-columns: 1fr; }
.ds-key-value-facts[data-variant="luma-timezone-sidecar-card"] .ds-key-value-facts__item {
  display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: var(--ds-space-3); row-gap: 0; align-items: start;
  padding: var(--ds-space-3) var(--ds-space-4);
  background: var(--ds-card-bg); border: var(--ds-border-width) solid var(--ds-card-border); box-shadow: var(--ds-card-shadow);
  border-radius: var(--ds-radius-md); min-inline-size: 180px;
}
.ds-key-value-facts[data-variant="luma-timezone-sidecar-card"] .ds-key-value-facts__icon { grid-row: 1 / span 2; margin-block-start: 2px; }
.ds-key-value-facts[data-variant="luma-timezone-sidecar-card"] .ds-key-value-facts__value { order: -1; font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); }
.ds-key-value-facts[data-variant="luma-timezone-sidecar-card"] .ds-key-value-facts__key { font-family: var(--ds-font-sans); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; }

/* legend: "KEY: VALUE" mono caps colophon strip, no closing rule */
.ds-key-value-facts[data-variant="legend-key-value-colophon"] { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .06em; text-transform: uppercase; gap: var(--ds-space-2) var(--ds-space-8); }
.ds-key-value-facts[data-variant="legend-key-value-colophon"] .ds-key-value-facts__key,
.ds-key-value-facts[data-variant="legend-key-value-colophon"] .ds-key-value-facts__value { font-family: inherit; font-size: inherit; font-weight: var(--ds-weight-regular); letter-spacing: inherit; text-transform: inherit; }
.ds-key-value-facts[data-variant="legend-key-value-colophon"] .ds-key-value-facts__value { color: var(--ds-ink-2); }

/* grammarly: 11 px caps meta label / value stacked on a 24 px rhythm inside the record card */
.ds-key-value-facts[data-variant="grammarly-caps-meta-label-value"] { grid-template-columns: 1fr; --_pitch: var(--ds-space-6); --_gap: var(--ds-space-3); }
.ds-key-value-facts[data-variant="grammarly-caps-meta-label-value"] .ds-key-value-facts__key { font-size: var(--ds-text-xs); letter-spacing: .04em; text-transform: uppercase; }
.ds-key-value-facts[data-variant="grammarly-caps-meta-label-value"] .ds-key-value-facts__value { font-size: var(--ds-text-md); font-weight: var(--ds-weight-regular); line-height: var(--ds-lh-body); color: var(--ds-ink-2); }

/* ds/components/list-row.css */
/* ============================================================================
   list-row — List row / media object
   taxonomy-components.md §D · core · S0
   Anatomy: leading slot (avatar | icon tile | emoji | provider glyph | cover slab) ·
   title · meta line(s) · trailing slot (value | time | glyph | kebab | chevron | + | ×).
   Container: .ds-list-row-group (<ul>) owns dividers, pitch and the empty footprint.
   Variants (on the row): default (unmarked — no house spin in the taxonomy) ·
     origin-transaction-row · origin-provenance-row · manychat-conversation-row ·
     elevenlabs-teaser-row · synara-two-line-thread-row · confluence-icon-tile-head ·
     perplexity-append-row · oku-row-media-card · luma-attributed-auto-value ·
     luma-summary-with-first-line-preview · airbnb-icon-fact-row · synara-changed-file-row
   Knobs: --_lead (lead edge) · --_min-h (row min height) · --_pad-x/--_pad-y · --_gap ·
          --_divider (on the group) · --_actions-w (reserved width for hover-revealed actions)
   Rule: no dividers when the pitch is ≥ 64 (group data-pitch="lg|xl").
   Composes entity-cell by root class where a row IS an entity (see data-table).
   ========================================================================== */

.ds-list-row-group {
  --_divider: var(--ds-rule-soft);
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.ds-list-row-group > * { min-width: 0; }
.ds-list-row-group > * + * { border-block-start: var(--ds-border-width) solid var(--_divider); }
.ds-list-row-group[data-dividers="none"], .ds-list-row-group[data-pitch="lg"], .ds-list-row-group[data-pitch="xl"] { --_divider: transparent; }
.ds-list-row-group[data-dividers="rule"] { --_divider: var(--ds-rule); }
/* bordered group: hairline frame around the list (synara changed files, luma cards) */
.ds-list-row-group[data-frame="bordered"] { border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-md); background: var(--ds-surface); overflow: clip; }
/* group label between clusters (origin: hairline only between GROUPS, not rows) */
.ds-list-row-group__label {
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--ds-ink-muted);
  padding: var(--ds-space-4) var(--_pad-x, var(--ds-space-3)) var(--ds-space-1);
}
.ds-list-row-group__label[data-rule="true"] { border-block-start: var(--ds-border-width) solid var(--ds-rule); margin-block-start: var(--ds-space-2); }
/* empty group: dashed footprint, sentence in ONE span so it wraps at 390 */
.ds-list-row-group[data-state="empty"] { border: var(--ds-border-width) dashed var(--ds-rule-strong); border-radius: var(--ds-radius-md); background: transparent; }
.ds-list-row-group__empty { display: flex; align-items: center; justify-content: center; min-height: calc(var(--ds-control-h-lg) + var(--ds-space-4)); padding: var(--ds-space-3) var(--ds-space-4); text-align: center; color: var(--ds-ink-muted); }
.ds-list-row-group__empty > span { max-width: var(--ds-measure); }
.ds-list-row-group__empty a { color: var(--ds-ink-link); }

/* ---- the row --------------------------------------------------------------- */
.ds-list-row {
  --_lead: var(--ds-tap-target-min);            /* 40 — the corpus mode for avatars/tiles */
  --_min-h: calc(var(--ds-row-h) + var(--ds-space-2));   /* 48 default */
  --_pad-x: var(--ds-space-3);
  --_pad-y: var(--ds-space-2);
  --_gap: var(--ds-space-3);
  --_actions-w: 0px;
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--_gap);
  min-height: var(--_min-h);
  padding: var(--_pad-y) calc(var(--_pad-x) + var(--_actions-w)) var(--_pad-y) var(--_pad-x);
  color: var(--ds-ink);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-list);
  text-decoration: none;
  text-align: start;
  background: transparent;
  border: 0;
  width: 100%;
  min-width: 0;
  font-family: inherit;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-list-row > * { min-width: 0; }
.ds-list-row svg { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
/* pitch ladder on the GROUP: sm 40 / md 48 / lg 64 / xl 96 (the corpus 40 · 48 · 66 · 70 · 96) */
.ds-list-row-group[data-pitch="sm"] .ds-list-row { --_min-h: var(--ds-tap-target-min); --_lead: var(--ds-icon-size-rail); --_pad-y: var(--ds-space-1); }
.ds-list-row-group[data-pitch="lg"] .ds-list-row { --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-5)); --_pad-y: var(--ds-space-3); }
.ds-list-row-group[data-pitch="xl"] .ds-list-row { --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-12)); --_lead: var(--ds-space-12); --_pad-y: var(--ds-space-4); }

/* lead slot: avatar (circle) | tile (bordered square) | emoji | glyph (bare icon) | cover (full-height slab) */
.ds-list-row__lead {
  flex: none;
  display: grid;
  place-items: center;
  width: var(--_lead);
  height: var(--_lead);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-2);
  color: var(--ds-ink-muted);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  text-transform: uppercase;                   /* initials only */
  overflow: clip;
  position: relative;
}
.ds-list-row__lead img { width: 100%; height: 100%; object-fit: cover; }
.ds-list-row__lead svg { width: var(--ds-icon-size-row); height: var(--ds-icon-size-row); }
.ds-list-row__lead[data-lead="tile"] { border-radius: var(--ds-radius-sm); border: var(--ds-border-width) solid var(--ds-rule); background: var(--ds-surface); color: var(--ds-ink-2); }
.ds-list-row__lead[data-lead="emoji"] { background: transparent; font-size: calc(var(--_lead) * .5); text-transform: none; }
.ds-list-row__lead[data-lead="glyph"] { background: transparent; border-radius: 0; color: var(--ds-ink-2); width: var(--ds-icon-size-rail); height: var(--ds-icon-size-rail); }
.ds-list-row__lead[data-lead="glyph"] svg { width: 100%; height: 100%; }
.ds-list-row__lead[data-lead="cover"] { align-self: stretch; height: auto; min-height: var(--_lead); border-radius: var(--ds-radius-sm); }
/* verified / provider badge overlapping the lead's top-right (elevenlabs) */
.ds-list-row__lead-badge {
  position: absolute;
  inset-inline-end: -2px;
  inset-block-start: -2px;
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  display: grid;
  place-items: center;
  border-radius: var(--ds-radius-pill);
  background: var(--ds-data-6);
  color: var(--ds-ink-on-semantic);
  border: 2px solid var(--ds-surface);
}
.ds-list-row__lead-badge svg { width: 10px; height: 10px; stroke-width: 3; }

/* body: title + meta lines */
.ds-list-row__body { flex: 1 1 auto; display: flex; flex-direction: column; gap: var(--ds-space-0-5); min-width: 0; }
.ds-list-row__title { font-weight: var(--ds-weight-medium); color: inherit; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-list-row__title[data-wrap="true"] { white-space: normal; }
a.ds-list-row__title { color: inherit; text-decoration: none; }
a.ds-list-row__title:hover { text-decoration: underline; }
.ds-list-row__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--ds-space-1-5); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); min-width: 0; }
.ds-list-row__meta svg { width: 14px; height: 14px; flex: none; }
.ds-list-row__preview { font-size: var(--ds-text-sm); color: var(--ds-ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-list-row__path { font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-code); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* inline coloured status word inside meta (origin): tone = ink-muted | danger | warning | success */
.ds-list-row__status { color: var(--ds-ink-muted); }
.ds-list-row__status[data-tone="danger"]  { color: var(--ds-danger-ink); }
.ds-list-row__status[data-tone="warning"] { color: var(--ds-warning-ink); }
.ds-list-row__status[data-tone="success"] { color: var(--ds-success-ink); }
/* branch / provenance badge (synara): mono, accent-2 tint */
.ds-list-row__badge { display: inline-flex; align-items: center; gap: var(--ds-space-1); padding: 0 var(--ds-space-1-5); border-radius: var(--ds-radius-xs); background: var(--ds-accent-2-tint); color: var(--ds-accent-2-ink); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); line-height: var(--ds-lh-list); }
.ds-list-row__badge svg { width: 12px; height: 12px; }
/* unread dot — local fallback for notification-dot (does not exist yet) */
.ds-list-row__dot { flex: none; }   /* PLACEMENT only — a composed .ds-notification-dot (2026-09-20) */

/* trailing slot */
.ds-list-row__trail { flex: none; display: flex; align-items: center; gap: var(--ds-space-2); color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }
.ds-list-row__value { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); color: var(--ds-ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ds-list-row__value[data-sign="plus"] { color: var(--ds-success-ink); }
.ds-list-row__time { font-size: var(--ds-text-xs); color: var(--ds-ink-muted); white-space: nowrap; }
.ds-list-row__trail > svg { width: var(--ds-icon-size); height: var(--ds-icon-size); color: var(--ds-ink-faint); }
/* icon buttons in the trail: kebab · × · + · chevron — control-h-sm ghost squares */
.ds-list-row__icon-button {
  appearance: none;
  flex: none;
  display: inline-grid;
  place-items: center;
  width: var(--ds-control-h-sm);
  height: var(--ds-control-h-sm);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: none;
  color: var(--ds-ink-muted);
  cursor: pointer;
}
.ds-list-row__icon-button:hover { background: var(--ds-surface-hover); color: var(--ds-ink); }
.ds-list-row__icon-button svg { width: var(--ds-icon-size); height: var(--ds-icon-size); }
.ds-list-row__icon-button[data-kind="append"] { color: var(--ds-accent); }   /* the + that ADDS is an action → accent budget */
/* hover-revealed actions: reserve their width so nothing reflows [manychat-web-126, clickup-web-147] */
.ds-list-row__actions { position: absolute; inset-inline-end: var(--_pad-x); inset-block: 0; display: flex; align-items: center; gap: var(--ds-space-1); opacity: 0; transition: opacity var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-list-row:hover .ds-list-row__actions, .ds-list-row:focus-within .ds-list-row__actions, .ds-list-row[data-state="hover"] .ds-list-row__actions { opacity: 1; }
@media (hover: none) { .ds-list-row__actions { opacity: 1; } }
.ds-list-row:has(> .ds-list-row__actions) { --_actions-w: calc(var(--ds-control-h-sm) + var(--ds-space-2)); }

/* ---- states ------------------------------------------------------------------ */
/* interactive rows: <a>, <button>, or data-interactive; hover = one tint step, never elevation */
:is(a, button).ds-list-row, .ds-list-row[data-interactive] { cursor: pointer; }
:is(a, button).ds-list-row:hover, .ds-list-row[data-interactive]:hover, .ds-list-row[data-state="hover"] { background: var(--ds-hover-bg); }
.ds-list-row:focus-visible { outline-offset: calc(-1 * var(--ds-ring-width)); border-radius: var(--ds-radius-xs); }
/* selected: full-bleed selected tint, no radius [manychat-web-184] */
.ds-list-row[aria-selected="true"], .ds-list-row[aria-current="true"], .ds-list-row[aria-current="page"] { background: var(--ds-selected-bg); color: var(--ds-selected-ink); }
.ds-list-row[aria-selected="true"] .ds-list-row__title { font-weight: var(--ds-selected-weight); }
/* under data-selection="underline" / "bar" the selected-bg is transparent, so a selected row was invisible:
   draw an inset-start 2 px bar in --ds-selected-line (a pseudo-element, not a box-shadow — the lint composes
   box-shadow from --ds-shadow-* only). Under tint / accent / invert the line is transparent and nothing shows. */
[data-selection="underline"] .ds-list-row:is([aria-selected="true"], [aria-current="true"], [aria-current="page"])::before,
[data-selection="bar"]       .ds-list-row:is([aria-selected="true"], [aria-current="true"], [aria-current="page"])::before {
  content: "";
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  width: 2px;
  background: var(--ds-selected-line);
  pointer-events: none;
}
/* read / unread: read = the WHOLE row muted; unread = ink + semibold title + dot */
.ds-list-row[data-state="read"] { color: var(--ds-ink-muted); }
.ds-list-row[data-state="read"] .ds-list-row__title { font-weight: var(--ds-weight-regular); }
.ds-list-row[data-state="read"] .ds-list-row__value { color: inherit; }
.ds-list-row[data-state="unread"] .ds-list-row__title { font-weight: var(--ds-weight-semibold); }
.ds-list-row[data-state="unread"] .ds-list-row__preview { color: var(--ds-ink); }
/* ghost: the summary row whose value is not set — muted, present [luma-creating-an-event-24-27] */
.ds-list-row[data-state="ghost"] .ds-list-row__title, .ds-list-row[data-state="ghost"] .ds-list-row__preview { color: var(--ds-ink-muted); font-weight: var(--ds-weight-regular); }
/* disabled */
.ds-list-row[aria-disabled="true"] { color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-list-row[aria-disabled="true"] :is(.ds-list-row__meta, .ds-list-row__value, .ds-list-row__time, .ds-list-row__preview, .ds-list-row__lead) { color: var(--ds-ink-faint); }
.ds-list-row[aria-disabled="true"] .ds-list-row__lead { background: var(--ds-surface-3); }
/* error: a failed row — danger word in meta + the lead ringed */
.ds-list-row[aria-invalid="true"] .ds-list-row__lead { outline: var(--ds-border-width) solid var(--ds-danger); outline-offset: 1px; }
.ds-list-row__error { font-size: var(--ds-text-sm); color: var(--ds-danger-ink); }
/* loading: lead becomes the skeleton fill, lines become bars */
.ds-list-row[aria-busy="true"] { pointer-events: none; }
.ds-list-row[aria-busy="true"] .ds-list-row__lead { background: var(--ds-skeleton); color: transparent; border-color: transparent; }
.ds-list-row__skeleton { display: block; height: var(--ds-space-3); width: var(--_w, 160px); max-width: 100%; border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); }
.ds-list-row__skeleton + .ds-list-row__skeleton { margin-block-start: var(--ds-space-1-5); }

/* ============================================================================ variants */
/* origin-transaction-row — 40 tile, 18 name + 15 meta with an inline coloured status word, right amount (+ for income), 66 pitch, no dividers */
.ds-list-row[data-variant="origin-transaction-row"] { --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-5)); --_pad-x: 0px; --_gap: var(--ds-space-4); }
.ds-list-row[data-variant="origin-transaction-row"] .ds-list-row__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-regular); }
.ds-list-row[data-variant="origin-transaction-row"] .ds-list-row__value { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-medium); }
/* origin-provenance-row — 50 logo circle, name / via X / URL, kebab, 96 pitch, hairline only between groups */
.ds-list-row[data-variant="origin-provenance-row"] { --_lead: calc(var(--ds-space-12) + var(--ds-space-0-5)); --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-12)); --_pad-x: 0px; --_gap: var(--ds-space-4); --_pad-y: var(--ds-space-3); }
.ds-list-row[data-variant="origin-provenance-row"] .ds-list-row__lead { border: var(--ds-border-width) solid var(--ds-rule); background: var(--ds-surface); font-size: var(--ds-text-lg); }
.ds-list-row[data-variant="origin-provenance-row"] .ds-list-row__title { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-regular); }
.ds-list-row[data-variant="origin-provenance-row"] .ds-list-row__meta { display: block; }
/* manychat-conversation-row — avatar 40, name 14/600 + one-line preview, relative time on the name line; read = whole row muted; selected = full-bleed tint; 70 pitch */
.ds-list-row[data-variant="manychat-conversation-row"] { --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-6)); --_pad-x: var(--ds-space-4); --_pad-y: var(--ds-space-3); align-items: flex-start; }
.ds-list-row[data-variant="manychat-conversation-row"] .ds-list-row__title { font-weight: var(--ds-weight-semibold); }
.ds-list-row[data-variant="manychat-conversation-row"] .ds-list-row__trail { align-self: flex-start; padding-block-start: 2px; }
/* elevenlabs-teaser-row — 32 avatar + verified badge, 14/600 title, ONE clamped description line, 66 pitch, no dividers, no hover chrome */
.ds-list-row[data-variant="elevenlabs-teaser-row"] { --_lead: var(--ds-control-h-sm); --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-5)); --_pad-x: 0px; --_pad-y: var(--ds-space-3); }
.ds-list-row[data-variant="elevenlabs-teaser-row"] .ds-list-row__title { font-weight: var(--ds-weight-semibold); }
.ds-list-row[data-variant="elevenlabs-teaser-row"] .ds-list-row__meta { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--ds-text-md); }
/* synara-two-line-thread-row — provider glyph 16 + 13/500 title; folder + repo (11 muted) … branch badge right; selected = one-step darker tint, r8, inset */
.ds-list-row[data-variant="synara-two-line-thread-row"] { --_lead: var(--ds-icon-size); --_min-h: var(--ds-control-h-lg); --_pad-x: var(--ds-space-2); --_pad-y: var(--ds-space-1-5); --_gap: var(--ds-space-2); font-size: var(--ds-text-sm); border-radius: var(--ds-radius-sm); align-items: flex-start; }
.ds-list-row[data-variant="synara-two-line-thread-row"] .ds-list-row__lead { background: transparent; border-radius: 0; color: var(--ds-data-4); margin-block-start: 2px; }
.ds-list-row[data-variant="synara-two-line-thread-row"] .ds-list-row__lead svg { width: 100%; height: 100%; }
.ds-list-row[data-variant="synara-two-line-thread-row"] .ds-list-row__meta { font-size: var(--ds-text-xs); }
.ds-list-row[data-variant="synara-two-line-thread-row"] .ds-list-row__meta > :last-child { margin-inline-start: auto; }
.ds-list-row[data-variant="synara-two-line-thread-row"][aria-selected="true"] { background: var(--ds-surface-selected); color: var(--ds-ink); }
/* confluence-icon-tile-head — 32 bordered tile + 14/600 title / 12 muted subtitle; the head shared by every card type; no padding, no divider */
.ds-list-row[data-variant="confluence-icon-tile-head"] { --_lead: var(--ds-control-h-sm); --_min-h: var(--ds-control-h-sm); --_pad-x: 0px; --_pad-y: 0px; --_gap: var(--ds-space-2); }
.ds-list-row[data-variant="confluence-icon-tile-head"] .ds-list-row__title { font-weight: var(--ds-weight-semibold); }
.ds-list-row[data-variant="confluence-icon-tile-head"] .ds-list-row__meta { font-size: var(--ds-text-xs); }
/* perplexity-append-row — hairline rows (rule grade), 16/500 label, trailing accent + */
.ds-list-row[data-variant="perplexity-append-row"] { --_min-h: calc(var(--ds-control-h-lg) + var(--ds-space-2)); --_pad-x: 0px; }
.ds-list-row[data-variant="perplexity-append-row"] .ds-list-row__title { white-space: normal; }
/* oku-row-media-card — full-height tinted cover slab + text stack inside a hairline card (528×156 on a 4-col grid) */
.ds-list-row[data-variant="oku-row-media-card"] { --_lead: calc(var(--ds-space-24) + var(--ds-space-2)); --_min-h: calc(var(--ds-space-24) + var(--ds-space-16)); --_pad-x: 0px; --_pad-y: 0px; --_gap: var(--ds-space-4); border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-md); background: var(--ds-surface); overflow: clip; align-items: stretch; }
.ds-list-row[data-variant="oku-row-media-card"] .ds-list-row__lead { border-radius: 0; background: var(--ds-illustration-ground); color: var(--ds-ink-muted); font-family: var(--ds-font-serif); font-size: var(--ds-text-sm); text-transform: none; padding: var(--ds-space-2); text-align: center; }
.ds-list-row[data-variant="oku-row-media-card"] .ds-list-row__body { justify-content: center; padding-block: var(--ds-space-4); gap: var(--ds-space-1); }
.ds-list-row[data-variant="oku-row-media-card"] .ds-list-row__title { font-family: var(--ds-font-serif); font-size: var(--ds-text-lg); white-space: normal; }
.ds-list-row[data-variant="oku-row-media-card"] .ds-list-row__trail { align-self: flex-start; padding: var(--ds-space-2); }
/* luma-attributed-auto-value — 20 icon, "Zoom" + "Auto-created by Luma", trailing ×, 50 px row inside a card */
.ds-list-row[data-variant="luma-attributed-auto-value"], .ds-list-row[data-variant="luma-summary-with-first-line-preview"] { --_lead: var(--ds-icon-size-row); --_min-h: calc(var(--ds-row-h) + var(--ds-space-2)); --_pad-x: var(--ds-space-4); }
.ds-list-row[data-variant="luma-attributed-auto-value"] .ds-list-row__lead, .ds-list-row[data-variant="luma-summary-with-first-line-preview"] .ds-list-row__lead { background: transparent; border-radius: 0; color: var(--ds-ink-muted); }
.ds-list-row[data-variant="luma-attributed-auto-value"] .ds-list-row__lead svg, .ds-list-row[data-variant="luma-summary-with-first-line-preview"] .ds-list-row__lead svg { width: 100%; height: 100%; }
/* airbnb-icon-fact-row — 24 outline icon + "Prompt: answer" at body size/regular, 40 px pitch, no dividers */
.ds-list-row[data-variant="airbnb-icon-fact-row"] { --_min-h: var(--ds-tap-target-min); --_pad-x: 0px; --_pad-y: var(--ds-space-1); --_gap: var(--ds-space-3); }
.ds-list-row[data-variant="airbnb-icon-fact-row"] .ds-list-row__title { font-weight: var(--ds-weight-regular); white-space: normal; }
/* synara-changed-file-row — 16 file-type glyph + mono path, 40 px, inside a bordered group with rule dividers */
.ds-list-row[data-variant="synara-changed-file-row"] { --_lead: var(--ds-icon-size); --_min-h: var(--ds-tap-target-min); --_pad-y: var(--ds-space-1); --_gap: var(--ds-space-2); }
.ds-list-row[data-variant="synara-changed-file-row"] .ds-list-row__lead { background: transparent; border-radius: 0; color: var(--ds-ink-muted); }
.ds-list-row[data-variant="synara-changed-file-row"] .ds-list-row__lead svg { width: 100%; height: 100%; }

/* ============================================================================
   DESK-446 #10 — MULTI-COLUMN DIRECTORY (on .ds-list-row-group) + the NO-DATA row
   An A–Z directory of 32 councils or 400 suppliers. The group is a <div> (not a <ul>) carrying data-layout; each letter is a
   __section (role="group" aria-labelledby the letter) holding a __letter heading and a __list <ul> of rows.
   Parts: __index (A–Z jump strip: <a> per letter, <span aria-disabled="true"> for a letter with no entries; aria-current marks
          the one in view) · __section · __letter (+ __count in the heading) · __list
   data-layout  columns  CSS columns, one big letter above each run              [mobbin-selfridges-brand-directory]
                grid     responsive grid of compact rows, a count after the name [mobbin-urbanoutfitters-brands]
                dense    two-up list in a hairline frame, name left / meta right [mobbin-remote-eor-handbooks]
   Knobs: --_cols (columns: max column count, 3) · --_col-w (minimum column width). One column under 480 px in every layout.
   NO-DATA row: <div class="ds-list-row" data-state="no-data" aria-disabled="true"> — an element, never a link; its reason
   (__reason) is a dashed chip in the meta line or the trail. Visible and legible (ink-muted, not ink-faint — a council that
   has not published is still a council), quiet (no hover, no ring target), and not clickable (cursor not-allowed).
   ============================================================================ */
.ds-list-row-group[data-layout] { --_divider: transparent; display: flex; flex-direction: column; gap: var(--ds-space-6); --_cols: 3; --_col-w: 13rem; }
.ds-list-row-group[data-layout] > * + * { border-block-start: 0; }
.ds-list-row-group__index { display: flex; flex-wrap: wrap; gap: var(--ds-space-1); }
.ds-list-row-group__index > :is(a, span) {
  display: inline-grid; place-items: center; min-width: var(--ds-control-h-sm); min-height: var(--ds-control-h-sm); padding-inline: var(--ds-space-1);
  border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-sm); background: var(--ds-surface);
  color: var(--ds-ink); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium); text-decoration: none; font-variant-numeric: tabular-nums;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-list-row-group__index > a:hover { background: var(--ds-hover-bg); }
.ds-list-row-group__index > a:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-list-row-group__index > a[aria-current] { background: var(--ds-selected-bg); color: var(--ds-selected-ink); font-weight: var(--ds-selected-weight); border-color: var(--ds-selected-line); }
.ds-list-row-group__index > [aria-disabled="true"] { color: var(--ds-ink-faint); background: var(--ds-surface-3); border-color: transparent; cursor: not-allowed; }
.ds-list-row-group__section { display: flex; flex-direction: column; gap: var(--ds-space-2); min-width: 0; scroll-margin-block-start: var(--ds-space-4); }
.ds-list-row-group__letter { display: flex; align-items: baseline; gap: var(--ds-space-2); margin: 0; font-size: var(--ds-text-2xl); font-weight: var(--ds-weight-semibold); line-height: var(--ds-lh-heading); color: var(--ds-ink); }
.ds-list-row-group__count { font-size: var(--ds-text-sm); font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); font-variant-numeric: tabular-nums; }
.ds-list-row-group__list { list-style: none; margin: 0; padding: 0; min-width: 0; }
.ds-list-row-group__list > li { min-width: 0; break-inside: avoid; }
.ds-list-row-group[data-layout] .ds-list-row { --_min-h: var(--ds-control-h-sm); --_pad-y: 0px; --_pad-x: var(--ds-space-2); --_gap: var(--ds-space-2); font-size: var(--ds-text-md); border-radius: var(--ds-radius-sm); }
.ds-list-row-group[data-layout] .ds-list-row__title { font-weight: var(--ds-weight-regular); }
.ds-list-row-group[data-layout] :is(a, button).ds-list-row:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-ring-width)); }
.ds-list-row-group[data-layout] .ds-list-row[aria-current="page"] .ds-list-row__title { font-weight: var(--ds-selected-weight); }

/* selfridges-letter-columns — a big letter, then the names in balanced CSS columns; plain text rows */
.ds-list-row-group[data-layout="columns"] .ds-list-row-group__list { columns: var(--_cols) var(--_col-w); column-gap: var(--ds-space-6); }
.ds-list-row-group[data-layout="columns"] .ds-list-row { --_pad-x: 0px; border-radius: 0; }
.ds-list-row-group[data-layout="columns"] :is(a).ds-list-row:is(:hover, [data-state="hover"]) { background: transparent; text-decoration: underline; text-underline-offset: .2em; }
/* urbanoutfitters-counted-grid — letter row with a rule and a count; compact rows on an auto-fill grid, "(n)" after each name */
.ds-list-row-group[data-layout="grid"] .ds-list-row-group__letter { padding-block-end: var(--ds-space-1); border-block-end: var(--ds-border-width) solid var(--ds-rule); font-size: var(--ds-text-lg); }
.ds-list-row-group[data-layout="grid"] .ds-list-row-group__count { margin-inline-start: auto; }
.ds-list-row-group[data-layout="grid"] .ds-list-row-group__list { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(var(--_col-w), 100%), 1fr)); column-gap: var(--ds-space-4); }
.ds-list-row-group[data-layout="grid"] .ds-list-row__trail { font-size: var(--ds-text-sm); font-variant-numeric: tabular-nums; }
/* remote-dense-meta — a hairline frame, two rows abreast, name left and meta (code · action) right-aligned, rules between rows */
.ds-list-row-group[data-layout="dense"] { --_col-w: 22rem; --_divider: var(--ds-rule-soft); gap: 0; border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-md); background: var(--ds-surface); padding: var(--ds-space-2) var(--ds-space-4) var(--ds-space-3); }
.ds-list-row-group[data-layout="dense"] .ds-list-row-group__section { gap: 0; }
.ds-list-row-group[data-layout="dense"] .ds-list-row-group__letter { padding-block: var(--ds-space-3) var(--ds-space-1); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-medium); font-family: var(--ds-font-label); text-transform: var(--ds-label-case); letter-spacing: var(--ds-label-tracking); color: var(--ds-ink-muted); }
.ds-list-row-group[data-layout="dense"] .ds-list-row-group__list { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(var(--_col-w), 100%), 1fr)); column-gap: var(--ds-space-8); }
.ds-list-row-group[data-layout="dense"] .ds-list-row-group__list > li { border-block-end: var(--ds-border-width) solid var(--_divider); }
.ds-list-row-group[data-layout="dense"] .ds-list-row { --_min-h: var(--ds-row-h); --_pad-x: var(--ds-space-1); border-radius: 0; }
.ds-list-row-group[data-layout="dense"] .ds-list-row__trail { gap: var(--ds-space-3); font-size: var(--ds-text-sm); }
.ds-list-row__code { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); letter-spacing: .04em; }
@media (max-width: 480px) {
  .ds-list-row-group[data-layout="columns"] .ds-list-row-group__list { columns: 1; }
  .ds-list-row-group[data-layout="grid"] .ds-list-row-group__list, .ds-list-row-group[data-layout="dense"] .ds-list-row-group__list { grid-template-columns: minmax(0, 1fr); }
  .ds-list-row-group[data-layout="dense"] { padding-inline: var(--ds-space-3); }
}

/* no-data: a row for something that exists but has nothing to open — present, quiet, inert, with its reason */
.ds-list-row[data-state="no-data"] { cursor: not-allowed; background: transparent; color: var(--ds-ink-muted); }
.ds-list-row[data-state="no-data"][aria-disabled="true"] :is(.ds-list-row__meta, .ds-list-row__value, .ds-list-row__time, .ds-list-row__trail) { color: var(--ds-ink-muted); }
.ds-list-row[data-state="no-data"] .ds-list-row__lead { background: var(--ds-surface-3); color: var(--ds-ink-faint); }
.ds-list-row[data-state="no-data"] .ds-list-row__title { font-weight: var(--ds-weight-regular); }
.ds-list-row[data-state="no-data"]:hover { background: transparent; }
.ds-list-row__reason { display: inline-flex; align-items: center; gap: var(--ds-space-1); padding: 0 var(--ds-space-1-5); border: var(--ds-border-width) dashed var(--ds-rule-strong); border-radius: var(--ds-radius-xs); font-size: var(--ds-text-xs); line-height: var(--ds-lh-list); color: var(--ds-ink-muted); white-space: nowrap; }

/* ds/components/marketing-nav.css */
/* ============================================================================
   marketing-nav — Marketing site top nav
   taxonomy-components.md §A · common · S1  ·  sections L-NAV-01

   Root: <header class="ds-marketing-nav" data-variant="…">  (one per page)
   Parts: __inner · __brand (__mark, __wordmark) · __divider · __drawer ·
          __links > li > __link (+ __chevron) · __utilities (__icon-btn, __meta,
          __status, __clock, __avatar, __account) · __actions > __cta[data-cta] ·
          __menu-toggle
   Variants (data-variant): jstov (default) · vercel-button-trio · intercom-dual-cta ·
          attio-dual-cta · fibery-cta-trio · heron-table-nav ·
          synara-three-cluster-outlined-cta · luma-transparent-app-nav · airbnb-account-pill
   States: aria-current="page" · aria-expanded (menu trigger) · aria-disabled · aria-busy ·
          data-state="scrolled" · data-sticky · drawer open (menu-toggle[aria-expanded=true]
          or data-state="open")
   Axes:   data-collapse="cta" — below 1024 px only the links collapse; the primary CTA stays beside the toggle
   Tokens only (tools/lint-tokens.mjs). Private knobs are --_*.
   ========================================================================== */

/* ---------------------------------------------------------------------------
   0. ROOT — knobs, container, base type
   ------------------------------------------------------------------------- */
.ds-marketing-nav {
  /* bar height: the topbar rung (56). Variants step it with space tokens:
     52 = -space-1 (synara) · 60 = +space-1 (heron) · 64 = +space-2 (attio, fibery,
     intercom, house) · 80 = +space-6 (vercel, airbnb). All ladder-derived. */
  --_h: var(--ds-topbar-h);
  --_cta-h: var(--ds-size-h);                   /* CTA height; vercel lifts to control-h-lg */
  --_gap: var(--ds-space-4);                    /* between clusters (16 · 32 on an 8 px unit) */
  --_link-gap: var(--ds-space-1);               /* between links */
  --_max: var(--ds-container-max);              /* inner max-width; luma/klarna set none */
  --_spin: var(--ds-ink);                       /* loading spinner colour */
  position: relative;
  z-index: 1;
  container-type: inline-size;
  background: transparent;
  color: var(--ds-ink);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-list);
}
.ds-marketing-nav[data-sticky] {
  position: sticky;
  inset-block-start: 0;
  z-index: var(--ds-z-sticky);
}
/* the scrolled state no reference defined: ground made 88 % opaque + blur + rule */
.ds-marketing-nav[data-state="scrolled"] {
  background: color-mix(in srgb, var(--ds-ground) 88%, transparent);
  -webkit-backdrop-filter: blur(var(--ds-glass-blur));
  backdrop-filter: blur(var(--ds-glass-blur));
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  transition: background-color var(--ds-dur-base) var(--ds-ease-standard),
              border-color var(--ds-dur-base) var(--ds-ease-standard);
}

.ds-marketing-nav__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-2) var(--_gap);
  min-height: var(--_h);
  width: 100%;
  max-width: var(--_max);
  margin-inline: auto;
  padding-inline: var(--ds-gutter-page);
  min-width: 0;
}

/* ---------------------------------------------------------------------------
   1. BRAND
   ------------------------------------------------------------------------- */
.ds-marketing-nav__brand {
  order: 0;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  flex: none;
  min-height: var(--ds-control-h-sm);
  border-radius: var(--ds-radius-sm);
  color: var(--ds-ink);
  text-decoration: none;
  font-weight: var(--ds-weight-semibold);
  font-size: var(--ds-text-lg);
  letter-spacing: var(--ds-heading-tracking);
}
.ds-marketing-nav__mark {
  width: var(--ds-icon-size-rail);
  height: var(--ds-icon-size-rail);
  flex: none;
  fill: currentColor;
}
.ds-marketing-nav__wordmark { white-space: nowrap; }
/* only a brand: push everything else right */
.ds-marketing-nav__inner:not(:has(.ds-marketing-nav__links)) .ds-marketing-nav__brand { margin-inline-end: auto; }

/* fibery: hairline after the logo */
.ds-marketing-nav__divider {
  order: 0;
  width: var(--ds-border-width);
  align-self: stretch;
  margin-block: var(--ds-space-4);
  margin-inline: calc(-1 * var(--ds-space-2));
  background: var(--ds-rule-strong);
  flex: none;
}

/* ---------------------------------------------------------------------------
   2. DRAWER (display: contents on desktop; a stacked panel on phones)
   ------------------------------------------------------------------------- */
.ds-marketing-nav__drawer { display: contents; }

/* ---------------------------------------------------------------------------
   3. LINKS
   ------------------------------------------------------------------------- */
.ds-marketing-nav__links {
  order: 1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--_link-gap);
  margin: 0;
  margin-inline-end: auto;                 /* links hug the brand; clusters go right */
  padding: 0;
  list-style: none;
  min-width: 0;
}
.ds-marketing-nav[data-align="center"] .ds-marketing-nav__links { margin-inline: auto; }

.ds-marketing-nav__link {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-control-pad-x);   /* density-scaled, not unit-scaled: stable on an 8 px unit */
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: transparent;
  color: var(--ds-ink-2);
  font-weight: var(--ds-weight-medium);
  font-size: inherit;
  text-decoration: none;
  text-transform: var(--ds-control-case);
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-marketing-nav__link:hover,
.ds-marketing-nav__link[data-state="hover"] {
  color: var(--ds-ink);
  background: var(--ds-hover-bg);
  text-decoration: none;
}
.ds-marketing-nav__link[aria-current="page"] {
  color: var(--ds-ink);
  font-weight: var(--ds-selected-weight);
}
/* underline selection (page-nav grammar): 2 px line in the selected colour */
[data-selection="underline"] .ds-marketing-nav__link[aria-current="page"] {
  text-decoration: underline;
  text-decoration-thickness: 2px;
  text-decoration-color: var(--ds-selected-line);
  text-underline-offset: .55em;
}
[data-selection="bar"] .ds-marketing-nav__link[aria-current="page"]::after {
  content: "";
  position: absolute;
  inset-inline: var(--ds-space-3);
  inset-block-end: 0;
  height: 2px;
  background: var(--ds-selected-line);
}
.ds-marketing-nav__link[aria-expanded="true"] {
  color: var(--ds-ink);
  background: var(--ds-surface-selected);
}
.ds-marketing-nav__link[aria-disabled="true"] {
  color: var(--ds-ink-faint);
  pointer-events: none;
}
.ds-marketing-nav__chevron {
  width: 12px;
  height: 12px;
  color: var(--ds-ink-muted);
  fill: none;
  stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  transition: transform var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-marketing-nav__link[aria-expanded="true"] .ds-marketing-nav__chevron { transform: rotate(180deg); }
/* luma: icon + label routes */
.ds-marketing-nav__link-icon {
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  fill: none;
  stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* ---------------------------------------------------------------------------
   4. UTILITIES — icon buttons, GitHub count, live status token, clock, avatar
   ------------------------------------------------------------------------- */
.ds-marketing-nav__utilities {
  order: 2;
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
  flex: none;
}
.ds-marketing-nav__icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--ds-control-h-sm);
  height: var(--ds-control-h-sm);
  padding: 0;
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: transparent;
  color: var(--ds-ink-2);
  text-decoration: none;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-marketing-nav__icon-btn:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-marketing-nav__icon-btn[aria-pressed="true"] { background: var(--ds-surface-selected); color: var(--ds-ink); }
.ds-marketing-nav__icon-btn[aria-disabled="true"], .ds-marketing-nav__icon-btn:disabled { color: var(--ds-ink-faint); }
.ds-marketing-nav__icon {
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  fill: none;
  stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round;
  stroke-linejoin: round;
}
.ds-marketing-nav__icon--fill { fill: currentColor; stroke: none; }

/* GitHub icon + star count (synara social proof) */
.ds-marketing-nav__meta {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-2);
  border-radius: var(--ds-radius-sm);
  color: var(--ds-ink-2);
  font-weight: var(--ds-weight-medium);
  font-variant-numeric: tabular-nums;
  text-decoration: none;
}
.ds-marketing-nav__meta:hover { background: var(--ds-hover-bg); color: var(--ds-ink); }

/* house: live status token — presence dot + mono caps, the page's first mono */
.ds-marketing-nav__status {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-2);
  border-radius: var(--ds-radius-sm);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
  text-decoration: none;
  white-space: nowrap;
}
.ds-marketing-nav__status:hover { color: var(--ds-ink); background: var(--ds-hover-bg); }
.ds-marketing-nav__status::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: var(--ds-radius-pill);
  background: var(--ds-presence);
  flex: none;
}
.ds-marketing-nav__status[data-status="degraded"]::before { background: var(--ds-warning); }
.ds-marketing-nav__status[data-status="down"]::before { background: var(--ds-danger); }
/* a version token instead of a status: no dot, case kept ("v1.28") */
.ds-marketing-nav__status[data-status="version"] { text-transform: none; }
.ds-marketing-nav__status[data-status="version"]::before { display: none; }
/* below 600 px the token keeps its dot and its accessible name; the text is clipped */
@container (max-width: 600px) {
  .ds-marketing-nav__status:not([data-status="version"]) { padding-inline: var(--ds-space-1); }
  .ds-marketing-nav__status:not([data-status="version"]) .ds-marketing-nav__status-text {
    position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
}

/* luma: live clock + timezone (content promoted into chrome) */
.ds-marketing-nav__clock {
  color: var(--ds-ink-muted);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* avatar (28) — a placeholder for .ds-avatar until that sibling ships */
.ds-marketing-nav__avatar {
  display: inline-grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-2);
  border: var(--ds-border-width) solid var(--ds-rule);
  color: var(--ds-ink-2);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  overflow: hidden;
  flex: none;
}
.ds-marketing-nav__avatar img { width: 100%; height: 100%; object-fit: cover; }

/* airbnb: bordered account pill (hamburger + avatar), always round */
.ds-marketing-nav__account {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-control-h-lg);
  padding-inline: var(--ds-space-3) var(--ds-space-1);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  color: var(--ds-ink);
  transition: box-shadow var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-marketing-nav__account:hover { border-color: var(--ds-border-strong); box-shadow: var(--ds-shadow-lift); }
.ds-marketing-nav__account .ds-marketing-nav__avatar { width: 32px; height: 32px; }

/* ---------------------------------------------------------------------------
   5. ACTIONS — the CTA cluster (0–3, at most ONE data-cta="primary")
   ------------------------------------------------------------------------- */
.ds-marketing-nav__actions {
  order: 3;
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  flex: none;
}
.ds-marketing-nav__cta {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  min-height: var(--_cta-h);
  padding-inline: var(--ds-size-pad-x);
  border: var(--ds-border-width) solid transparent;
  border-radius: var(--ds-radius-button);
  background: transparent;
  color: var(--ds-ink);
  font-size: var(--ds-size-text);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  text-decoration: none;
  text-transform: var(--ds-control-case);
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard),
              box-shadow var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-marketing-nav__cta .ds-marketing-nav__icon { width: var(--ds-icon-size); height: var(--ds-icon-size); }

/* primary — THE filled button. A nav that carries it documents that the hero does not. */
.ds-marketing-nav__cta[data-cta="primary"] {
  --_spin: var(--ds-ink-on-primary);
  background: var(--ds-primary-fill);
  border-color: var(--ds-primary-border);
  color: var(--ds-ink-on-primary);
  box-shadow: var(--ds-shadow-lip);
}
.ds-marketing-nav__cta[data-cta="primary"]:hover { background: var(--ds-primary-fill-hover); }

/* secondary — surface + hairline (vercel, attio "Sign in", intercom arrow, synara outline) */
.ds-marketing-nav__cta[data-cta="secondary"],
.ds-marketing-nav__cta[data-cta="outline-arrow"] {
  background: var(--ds-surface);
  border-color: var(--ds-border);
  color: var(--ds-ink);
  box-shadow: var(--ds-shadow-lip);
}
.ds-marketing-nav__cta[data-cta="secondary"]:hover,
.ds-marketing-nav__cta[data-cta="outline-arrow"]:hover {
  border-color: var(--ds-border-strong);
  background: var(--ds-hover-bg);
}
/* outlined on the ground (synara): transparent fill, hairline only */
.ds-marketing-nav__cta[data-cta="outline"] {
  background: transparent;
  border-color: var(--ds-border);
  color: var(--ds-ink);
}
.ds-marketing-nav__cta[data-cta="outline"]:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }

/* light — one tint step, no border (fibery "Log in") */
.ds-marketing-nav__cta[data-cta="light"] { background: var(--ds-surface-2); color: var(--ds-ink); }
.ds-marketing-nav__cta[data-cta="light"]:hover { background: var(--ds-surface-3); }

/* ghost — text only in a control box */
.ds-marketing-nav__cta[data-cta="ghost"] { color: var(--ds-ink-2); }
.ds-marketing-nav__cta[data-cta="ghost"]:hover { color: var(--ds-ink); background: var(--ds-hover-bg); }

/* text — a plain text link that sits in the cluster (fibery "Book a demo", luma "Create Event") */
.ds-marketing-nav__cta[data-cta="text"] {
  padding-inline: var(--ds-space-1);
  color: var(--ds-ink-2);
  border-radius: var(--ds-radius-xs);
}
.ds-marketing-nav__cta[data-cta="text"]:hover { color: var(--ds-ink); text-decoration: underline; text-underline-offset: .2em; }

/* disabled + loading (specified — 0/51 references show them) */
.ds-marketing-nav__cta[aria-disabled="true"],
.ds-marketing-nav__cta:disabled {
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  color: var(--ds-ink-faint);
  box-shadow: none;
  cursor: not-allowed;
  pointer-events: none;
}
.ds-marketing-nav__cta[aria-busy="true"] { color: transparent; pointer-events: none; }
.ds-marketing-nav__cta[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  border: 2px solid var(--_spin);
  border-inline-end-color: transparent;
  border-radius: var(--ds-radius-pill);
  animation: ds-marketing-nav-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-marketing-nav-spin { to { transform: rotate(360deg); } }

/* ---------------------------------------------------------------------------
   6. MENU TOGGLE (phones only; shown only once JS enhances the root)
   ------------------------------------------------------------------------- */
.ds-marketing-nav__menu-toggle {
  order: 4;
  display: none;
  align-items: center;
  justify-content: center;
  width: var(--ds-control-h);
  height: var(--ds-control-h);
  padding: 0;
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-surface);
  color: var(--ds-ink);
  flex: none;
}
.ds-marketing-nav__menu-toggle:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-marketing-nav__menu-toggle .ds-marketing-nav__icon--close { display: none; }
.ds-marketing-nav__menu-toggle[aria-expanded="true"] .ds-marketing-nav__icon--menu { display: none; }
.ds-marketing-nav__menu-toggle[aria-expanded="true"] .ds-marketing-nav__icon--close { display: block; }

/* ---------------------------------------------------------------------------
   7. VARIANTS
   ------------------------------------------------------------------------- */

/* jstov (house, default) — Synara's withheld-CTA three-cluster on Heron's grid:
   brand cell | links (centred) | utilities cell, cells drawn by the frame's
   hairline; the nav's action is OUTLINED; a live status token in the utility
   cluster; the page's one primary fill belongs to the hero. 64 px.           */
.ds-marketing-nav:not([data-variant]),
.ds-marketing-nav[data-variant="jstov"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-2));
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-marketing-nav:not([data-variant]) .ds-marketing-nav__links,
.ds-marketing-nav[data-variant="jstov"] .ds-marketing-nav__links { margin-inline: auto; }
.ds-marketing-nav:not([data-variant]) .ds-marketing-nav__brand,
.ds-marketing-nav[data-variant="jstov"] .ds-marketing-nav__brand {
  align-self: stretch;
  padding-inline-end: var(--_gap);
  border-inline-end: var(--ds-border-width) solid var(--ds-rule);
  border-radius: 0;
}
.ds-marketing-nav:not([data-variant]) .ds-marketing-nav__utilities,
.ds-marketing-nav[data-variant="jstov"] .ds-marketing-nav__utilities {
  align-self: stretch;
  padding-inline-start: var(--_gap);
  border-inline-start: var(--ds-border-width) solid var(--ds-rule);
}

/* vercel-button-trio — mark only, 4 links (chevrons), three EQUAL 40 px buttons
   (secondary, secondary, primary) — hierarchy by fill alone. 80 px, no rule.  */
.ds-marketing-nav[data-variant="vercel-button-trio"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-6));
  --_cta-h: var(--ds-control-h-lg);
  --_link-gap: var(--ds-space-2);
}
.ds-marketing-nav[data-variant="vercel-button-trio"] .ds-marketing-nav__cta {
  border-radius: var(--ds-radius-md);
  padding-inline: var(--ds-space-4);
}
.ds-marketing-nav[data-variant="vercel-button-trio"] .ds-marketing-nav__link { font-size: var(--ds-text-lg); }

/* intercom-dual-cta — text links + 3 utility text links + black primary + an
   outline-with-arrow for a second product. No rule, sits on the ground. 64 px. */
.ds-marketing-nav[data-variant="intercom-dual-cta"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-2));
}
.ds-marketing-nav[data-variant="intercom-dual-cta"] .ds-marketing-nav__cta { border-radius: var(--ds-radius-xs); }
.ds-marketing-nav[data-variant="intercom-dual-cta"] .ds-marketing-nav__cta[data-cta="outline-arrow"] {
  background: transparent;
  border-color: var(--ds-ink);
}

/* attio-dual-cta — hairline "Sign in" + solid "Start for free"; the same two
   words recur at every CTA on the page. 64 px, surface bar, 1 px rule below.  */
.ds-marketing-nav[data-variant="attio-dual-cta"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-2));
  background: var(--ds-surface);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-marketing-nav[data-variant="attio-dual-cta"] .ds-marketing-nav__link { font-size: var(--ds-text-sm); }
.ds-marketing-nav[data-variant="attio-dual-cta"] .ds-marketing-nav__cta { border-radius: var(--ds-radius-md); font-size: var(--ds-text-sm); }

/* fibery-cta-trio — hairline divider after the logo; text link / light button /
   dark button: three tiers in one bar. Transparent on the ground, no rule. 64 px. */
.ds-marketing-nav[data-variant="fibery-cta-trio"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-2));
  --_link-gap: var(--ds-space-2);
}

/* heron-table-nav — the nav is the first row of the page's hairline table:
   logo cell + 5 equal bordered link cells (label lane: mono caps under
   data-labels="upper"), last cell = accent CTA with → pinned bottom-right. 60 px. */
.ds-marketing-nav[data-variant="heron-table-nav"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-1));
  --_gap: 0px;
  --_max: none;
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__inner {
  padding-inline: 0;
  flex-wrap: nowrap;
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__brand {
  flex: 1 1 50%;
  align-self: stretch;
  padding-inline: var(--ds-gutter-page);
  border-radius: 0;
  min-width: 0;
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__links {
  flex: 1 1 50%;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: 0;
  align-self: stretch;
  margin: 0;
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link {
  display: flex;
  align-items: flex-start;
  height: 100%;
  min-height: var(--_h);
  padding: var(--ds-space-3) var(--ds-space-4);
  border-radius: 0;
  border-inline-start: var(--ds-border-width) solid var(--ds-rule);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--ds-ink);
  white-space: normal;
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link[aria-haspopup]::after {
  /* the ⌟ registration-mark bracket on menu cells */
  content: "";
  position: absolute;
  inset-inline-end: var(--ds-space-2);
  inset-block-end: var(--ds-space-2);
  width: 6px;
  height: 6px;
  border-inline-end: var(--ds-border-width) solid var(--ds-rule-strong);
  border-block-end: var(--ds-border-width) solid var(--ds-rule-strong);
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link[data-cta] {
  color: var(--ds-ink-link);
  grid-column: span 1;
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link[data-cta] .ds-marketing-nav__icon {
  position: absolute;
  inset-inline-end: var(--ds-space-3);
  inset-block-end: var(--ds-space-2);
}
.ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link:hover { background: var(--ds-hover-bg); }

/* synara-three-cluster-outlined-cta — brand | links | utilities on a flat ground,
   no rule; theme toggle + GitHub star count as social proof; CTA outlined so the
   hero owns the viewport's only solid fill. 52 px.                              */
.ds-marketing-nav[data-variant="synara-three-cluster-outlined-cta"] {
  --_h: calc(var(--ds-topbar-h) - var(--ds-space-1));
  --_link-gap: var(--ds-space-2);
}
.ds-marketing-nav[data-variant="synara-three-cluster-outlined-cta"] .ds-marketing-nav__links { margin-inline: auto; }
.ds-marketing-nav[data-variant="synara-three-cluster-outlined-cta"] .ds-marketing-nav__link { color: var(--ds-ink); }
.ds-marketing-nav[data-variant="synara-three-cluster-outlined-cta"] .ds-marketing-nav__cta { border-radius: var(--ds-radius-pill); }

/* luma-transparent-app-nav — brand outside the container, icon+label routes,
   utilities carry a live datum (clock + tz), text CTA, search, bell, avatar.
   Transparent; bridges marketing and app. 64 px (66 in the capture).             */
.ds-marketing-nav[data-variant="luma-transparent-app-nav"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-2));
  --_max: none;
  --_link-gap: var(--ds-space-1);
}
.ds-marketing-nav[data-variant="luma-transparent-app-nav"] .ds-marketing-nav__inner { padding-inline: var(--ds-space-6); }
.ds-marketing-nav[data-variant="luma-transparent-app-nav"] .ds-marketing-nav__link { color: var(--ds-ink-muted); }
.ds-marketing-nav[data-variant="luma-transparent-app-nav"] .ds-marketing-nav__link[aria-current="page"] { color: var(--ds-ink); }

/* airbnb-account-pill — logo · one text link · globe · bordered pill (hamburger +
   avatar). Full-bleed surface bar, 1 px rule, 80 px.                              */
.ds-marketing-nav[data-variant="airbnb-account-pill"] {
  --_h: calc(var(--ds-topbar-h) + var(--ds-space-6));
  background: var(--ds-surface);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-marketing-nav[data-variant="airbnb-account-pill"] .ds-marketing-nav__cta[data-cta="text"] {
  font-weight: var(--ds-weight-semibold);
  color: var(--ds-ink);
  padding-inline: var(--ds-space-3);
  min-height: var(--ds-control-h);
  border-radius: var(--ds-radius-pill);
}
.ds-marketing-nav[data-variant="airbnb-account-pill"] .ds-marketing-nav__cta[data-cta="text"]:hover { background: var(--ds-hover-bg); text-decoration: none; }
.ds-marketing-nav[data-variant="airbnb-account-pill"] .ds-marketing-nav__icon-btn { border-radius: var(--ds-radius-pill); width: var(--ds-control-h); height: var(--ds-control-h); }

/* ---------------------------------------------------------------------------
   8. PHONES + TABLETS (container ≤ 1024 px): the drawer stacks under the bar
   ------------------------------------------------------------------------- */
@container (max-width: 1024px) {
  .ds-marketing-nav__inner { gap: var(--ds-space-2) var(--ds-space-3); }
  .ds-marketing-nav__drawer {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--ds-space-3);
    flex-basis: 100%;
    order: 5;
    padding-block: var(--ds-space-3) var(--ds-space-4);
    border-block-start: var(--ds-border-width) solid var(--ds-rule);
  }
  .ds-marketing-nav__links {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    margin: 0 !important;      /* beats the centred/auto margins of the desktop layouts */
  }
  .ds-marketing-nav__link {
    width: 100%;
    min-height: var(--ds-row-h);
    justify-content: space-between;
    white-space: normal;
  }
  .ds-marketing-nav__actions { flex-direction: column; align-items: stretch; gap: var(--ds-space-2); }
  .ds-marketing-nav__cta { width: 100%; }
  .ds-marketing-nav__brand { margin-inline-end: auto; }   /* one auto margin: everything else goes right */
  .ds-marketing-nav__utilities { margin-inline-start: 0; }
  .ds-marketing-nav__divider { display: none; }
  .ds-marketing-nav__menu-toggle { display: inline-flex; }
  /* house / heron cells lose their vertical rules when stacked */
  .ds-marketing-nav__brand,
  .ds-marketing-nav__utilities { border: 0 !important; padding-inline: 0 !important; }
  .ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__inner { flex-wrap: wrap; padding-inline: var(--ds-gutter-page); }
  .ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__brand { flex: 1 1 auto; padding-inline: 0; }
  .ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__links { display: flex; }
  .ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link {
    height: auto;
    min-height: var(--ds-row-h);
    align-items: center;
    border-inline-start: 0;
    border-block-end: var(--ds-border-width) solid var(--ds-rule);
  }
  .ds-marketing-nav[data-variant="heron-table-nav"] .ds-marketing-nav__link[data-cta] .ds-marketing-nav__icon { position: static; }
  .ds-marketing-nav[data-variant="luma-transparent-app-nav"] .ds-marketing-nav__inner { padding-inline: var(--ds-gutter-page); }
}
/* JS-enhanced: the drawer is collapsed until the toggle opens it */
@container (max-width: 1024px) {
  .ds-marketing-nav[data-js] .ds-marketing-nav__drawer { display: none; }
  .ds-marketing-nav[data-js]:has(.ds-marketing-nav__menu-toggle[aria-expanded="true"]) .ds-marketing-nav__drawer,
  .ds-marketing-nav[data-js][data-state="open"] .ds-marketing-nav__drawer { display: flex; }
}
/* no JS: never show a toggle that does nothing (the drawer is simply visible) */
.ds-marketing-nav:not([data-js]) .ds-marketing-nav__menu-toggle { display: none; }

/* ---------------------------------------------------------------------------
   9. data-collapse="cta" (additive, 2026-09-20 · L-NAV-01 / try.cloudflare fidelity)
      Below 1024 px only the LINKS collapse behind the toggle; the actions cluster stays in the bar
      row beside the toggle and shows the ONE data-cta="primary" (the rest are hidden, not moved); a cluster
      without a primary keeps its single control (the house's outlined action).
      Markup is unchanged: __drawer keeps display: contents, so __actions is still a flex item of __inner.
   ------------------------------------------------------------------------- */
@container (max-width: 1024px) {
  .ds-marketing-nav[data-collapse="cta"] .ds-marketing-nav__drawer,
  .ds-marketing-nav[data-collapse="cta"][data-js] .ds-marketing-nav__drawer,
  .ds-marketing-nav[data-collapse="cta"][data-js]:has(.ds-marketing-nav__menu-toggle[aria-expanded="true"]) .ds-marketing-nav__drawer,
  .ds-marketing-nav[data-collapse="cta"][data-js][data-state="open"] .ds-marketing-nav__drawer { display: contents; }
  .ds-marketing-nav[data-collapse="cta"] .ds-marketing-nav__links {
    flex-basis: 100%;
    order: 5;
    padding-block: var(--ds-space-3) var(--ds-space-4);
    border-block-start: var(--ds-border-width) solid var(--ds-rule);
  }
  .ds-marketing-nav[data-collapse="cta"] .ds-marketing-nav__actions { flex-direction: row; align-items: center; order: 3; flex: none; gap: var(--ds-space-2); }
  .ds-marketing-nav[data-collapse="cta"] .ds-marketing-nav__cta { width: auto; }
  /* with a primary in the cluster the rest hide; a cluster with no primary (house: one outlined action) keeps its one control */
  .ds-marketing-nav[data-collapse="cta"] .ds-marketing-nav__actions:has(.ds-marketing-nav__cta[data-cta="primary"]) .ds-marketing-nav__cta:not([data-cta="primary"]) { display: none; }
  /* JS-enhanced: the links (not the drawer) collapse behind the toggle */
  .ds-marketing-nav[data-collapse="cta"][data-js] .ds-marketing-nav__links { display: none; }
  .ds-marketing-nav[data-collapse="cta"][data-js]:has(.ds-marketing-nav__menu-toggle[aria-expanded="true"]) .ds-marketing-nav__links,
  .ds-marketing-nav[data-collapse="cta"][data-js][data-state="open"] .ds-marketing-nav__links { display: flex; }
}

/* ds/components/related-list.css */
/* ============================================================================
   related-list — Related / follow-up append list                 (taxonomy §I · niche · S0)
   Root: .ds-related-list — the END of an answer document: the answer ACTION ROW (text actions with a leading glyph on the
     left, glyph-only actions on the right, a hairline below) and the RELATED append-rows (a section icon + "Related",
     then hairline-separated 54 px rows, each a lowercase follow-up query with a trailing accent "+" = "append this as the
     next question"). The last thing on screen is the next question (J2 rule 9).
   Parts: __actions (role=toolbar) · __action (<button>: __action-glyph + label) · __group[data-align="end"] · __header ·
          __icon · __title · __list (<ul>) · __row (<li>) · __append (<button>: __text · __plus) · __empty (dashed footprint)
          · __skeleton (loading bars)
   Axes:  data-kind="rows|actions|both"   what the root holds (rows by default)
          data-state="loading|empty"
   Composes by root class: .ds-icon-button[data-variant="ghost-glyph"] (the glyph-only actions)
   Variants: default (unmarked = perplexity-hairline-rows-trailing-accent-plus — niche, no house spin) ·
     perplexity-answer-action-row
   Private knobs: --_pitch --_gap
   Tokens only (tools/lint-tokens.mjs).
   ========================================================================== */

.ds-related-list svg[fill="none"] { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

.ds-related-list {
  --_pitch: var(--ds-row-h);                     /* 40 at default density; perplexity's 54 @1.25 ≈ 43 CSS — the row ladder */
  --_gap:   var(--ds-space-4);
  display: flex;
  flex-direction: column;
  gap: var(--_gap);
  min-width: 0;
  max-width: 100%;
  color: var(--ds-ink);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-list);
}

/* -- answer action row: text actions left · glyph-only right · hairline below --------------------- */
.ds-related-list__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-1) var(--ds-space-2);
  min-block-size: var(--ds-control-h-sm);
  padding-block-end: var(--ds-space-3);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-related-list__group { display: flex; align-items: center; gap: var(--ds-space-1); min-width: 0; }
.ds-related-list__group[data-align="end"] { margin-inline-start: auto; }
.ds-related-list__action {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1-5);
  min-block-size: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-2);
  border: 0;
  border-radius: var(--ds-radius-sm);
  background: transparent;
  color: var(--ds-ink-muted);
  font: inherit;
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  cursor: pointer;
  white-space: nowrap;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-related-list__action-glyph { flex: none; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
.ds-related-list__action:hover, .ds-related-list__action[data-state="hover"] { background: var(--ds-hover-bg); color: var(--ds-ink); }
.ds-related-list__action:active { background: var(--ds-surface-pressed, var(--ds-surface-3)); }   /* pressed = --ds-surface-pressed (§13.4) */
.ds-related-list__action:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-related-list__action:disabled { color: var(--ds-ink-faint); cursor: not-allowed; background: transparent; }
.ds-related-list__action[aria-pressed="true"] { color: var(--ds-ink); background: var(--ds-surface-selected); }

/* -- section header: 20 px outline icon + "Related" ----------------------------------------------- */
.ds-related-list__header { display: flex; align-items: center; gap: var(--ds-space-2); min-block-size: var(--ds-space-7); }
.ds-related-list__icon { flex: none; inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); color: var(--ds-ink-2); }
.ds-related-list__title { margin: 0; font-size: var(--ds-text-lg); font-weight: var(--ds-weight-medium); line-height: var(--ds-lh-heading); color: var(--ds-ink); }

/* -- append rows: hairline-separated, the whole row is the control, trailing "+" ------------------- */
.ds-related-list__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; min-width: 0; }
.ds-related-list__row { min-width: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-related-list__row:first-child { border-block-start-color: var(--ds-rule); }
.ds-related-list__append {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  inline-size: 100%;
  min-block-size: var(--_pitch);
  padding: var(--ds-space-2) 0;
  border: 0;
  background: transparent;
  color: var(--ds-ink);
  font: inherit;
  font-weight: var(--ds-weight-medium);
  text-align: start;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-related-list__text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.ds-related-list__plus { flex: none; display: inline-grid; place-items: center; inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); color: var(--ds-accent); }   /* accent = it acts (append) */
.ds-related-list__plus > svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }
/* hover: a tint that bleeds 8 px past the text edge so the row reads as a control without a card */
.ds-related-list__append:hover, .ds-related-list__append[data-state="hover"] { background: var(--ds-hover-bg); margin-inline: calc(-1 * var(--ds-space-2)); inline-size: calc(100% + var(--ds-space-4)); padding-inline: var(--ds-space-2); border-radius: var(--ds-radius-sm); }
.ds-related-list__append:hover .ds-related-list__plus { color: var(--ds-accent-hover); }
.ds-related-list__append:active { background: var(--ds-surface-pressed, var(--ds-surface-3)); }
.ds-related-list__append:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-ring-width)); border-radius: var(--ds-radius-sm); }
.ds-related-list__append:disabled { color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-related-list__append:disabled .ds-related-list__plus { color: var(--ds-ink-faint); }
/* a row that has been appended: the plus becomes a check and the row goes quiet */
.ds-related-list__append[aria-pressed="true"] { color: var(--ds-ink-muted); }
.ds-related-list__append[aria-pressed="true"] .ds-related-list__plus { color: var(--ds-success); }

/* -- loading / empty --------------------------------------------------------------------------------- */
.ds-related-list__skeleton { display: block; block-size: var(--ds-text-sm); border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); inline-size: 70%; }
.ds-related-list__skeleton[data-w="short"] { inline-size: 50%; }
.ds-related-list[data-state="loading"] .ds-related-list__append { pointer-events: none; }
.ds-related-list__empty {
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-block-size: var(--_pitch);
  padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) dashed var(--ds-border);
  border-radius: var(--ds-radius-md);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
}

/* =========================================================================
   VARIANTS
   ========================================================================= */
/* perplexity-hairline-rows-trailing-accent-plus — three rows, 20/500 ink lowercase queries without "?", accent "+" at the
   right edge, hairline rules between, 54 px pitch (≈43 CSS) [perplexity-asking-a-question-05-09] */
.ds-related-list[data-variant="perplexity-hairline-rows-trailing-accent-plus"] { --_pitch: var(--ds-control-h-lg); }
.ds-related-list[data-variant="perplexity-hairline-rows-trailing-accent-plus"] .ds-related-list__append { font-size: var(--ds-text-lg); }

/* perplexity-answer-action-row — "Share" / "Rewrite" text actions with leading glyphs left, copy / edit / more glyph-only
   right, hairline below, Related after it [perplexity-asking-a-question-05-09] */
.ds-related-list[data-variant="perplexity-answer-action-row"] .ds-related-list__action { font-size: var(--ds-text-md); }

/* ds/components/segmented-control.css */
/* ============================================================================
   components/segmented-control/segmented-control.css
   N mutually-exclusive options in one track; exactly one is selected. Two
   markups share the styles:
     radio form   <fieldset class="ds-segmented-control"> <label class="…__item">
                  <input class="…__input" type="radio"> <span class="…__label">
     tablist form <div class="ds-segmented-control" role="tablist">
                  <button class="…__item" role="tab" aria-selected="true">
   In the radio form the <input> is absolutely positioned to fill the item and
   IS the pill (paint + focus ring); the label text sits above it.

   Private knobs:
     --_inset       track padding = track − pill (4px in luma/hsaj)
     --_radius      track radius · --_pill-radius pill radius (one ladder step below)
     --_track / --_track-border / --_pill / --_pill-ink / --_ink
   ========================================================================== */

.ds-segmented-control {
  --_inset: var(--ds-space-1);
  --_radius: var(--ds-radius-md);
  --_pill-radius: var(--ds-radius-sm);
  --_track: var(--ds-surface-2);
  --_track-border: transparent;
  --_pill: var(--ds-selected-bg);          /* follows data-selection (tint · accent · invert) */
  --_pill-ink: var(--ds-selected-ink);
  --_ink: var(--ds-ink-muted);
  --_gap: 0px;

  display: inline-flex;
  align-items: stretch;
  gap: var(--_gap);
  padding: var(--_inset);
  min-height: var(--ds-size-h);
  max-width: 100%;
  min-width: 0;
  overflow-x: auto;                         /* mobile rule: the track scrolls, the page never does */
  scrollbar-width: none;
  border-radius: var(--_radius);
  background: var(--_track);
  border: var(--ds-border-width) solid var(--_track-border);
  font-size: var(--ds-size-text);
  line-height: var(--ds-lh-list);
  color: var(--_ink);
}
.ds-segmented-control::-webkit-scrollbar { display: none; }
/* equal-width cells — "this is a 2-way switch, not a tab strip" [clickup-web-147, hsajlzkwuaagtdc] */
.ds-segmented-control[data-fill="equal"] { display: flex; width: 100%; }
.ds-segmented-control[data-fill="equal"] .ds-segmented-control__item { flex: 1 1 0; }

/* ---- item ---------------------------------------------------------------- */
.ds-segmented-control__item {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  min-width: 0;
  min-height: calc(var(--ds-size-h) - 2 * var(--_inset) - 2 * var(--ds-border-width));
  padding-block: 0;
  padding-inline: var(--ds-size-pad-x);
  border-radius: var(--_pill-radius);
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case);
  white-space: nowrap;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-segmented-control__label {
  position: relative;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  min-width: 0;
}
.ds-segmented-control__label svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); flex: none; }
.ds-segmented-control svg[fill="none"] { fill: none; }   /* _base.css paints svg fill:currentColor; honour fill="none" */
/* the radio: fills the item, paints the pill, carries the ring */
.ds-segmented-control__input {
  appearance: none;
  -webkit-appearance: none;
  position: absolute;
  inset: 0;
  margin: 0;
  border-radius: inherit;
  border: 0;
  background: transparent;
  cursor: inherit;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}

/* ---- states -------------------------------------------------------------- */
/* selected — pill paints --_pill; item ink + weight follow the selection tokens */
.ds-segmented-control__input:checked,
.ds-segmented-control__item[aria-selected="true"],
.ds-segmented-control__item[aria-checked="true"] { background: var(--_pill); }
.ds-segmented-control__item:has(.ds-segmented-control__input:checked),
.ds-segmented-control__item[aria-selected="true"],
.ds-segmented-control__item[aria-checked="true"] { color: var(--_pill-ink); font-weight: var(--ds-selected-weight); }
/* hover — unselected ink → ink, one tint step behind it (follows data-hover) */
.ds-segmented-control__item:hover:not(:has(.ds-segmented-control__input:checked)):not([aria-selected="true"]):not([aria-checked="true"]):not(:disabled),
.ds-segmented-control__item[data-state="hover"]:not(:has(.ds-segmented-control__input:checked)) { color: var(--ds-ink); }
.ds-segmented-control__input:hover:not(:checked):not(:disabled),
.ds-segmented-control__item[data-state="hover"] .ds-segmented-control__input:not(:checked) { background: var(--ds-hover-bg); }
.ds-segmented-control__item[role="tab"]:hover:not([aria-selected="true"]):not(:disabled) { background: var(--ds-hover-bg); }
/* focus-visible — the universal ring, hugging the pill inside the 4px inset */
.ds-segmented-control__input:focus-visible,
.ds-segmented-control__item[role="tab"]:focus-visible {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: 0;
}
/* disabled — one item, or the whole fieldset */
.ds-segmented-control__input:disabled,
.ds-segmented-control__item:disabled { cursor: not-allowed; }
.ds-segmented-control__item:has(.ds-segmented-control__input:disabled),
.ds-segmented-control__item:disabled { color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-segmented-control:disabled,
.ds-segmented-control[aria-disabled="true"] { --_track: var(--ds-surface-3); --_pill: var(--ds-surface); --_pill-ink: var(--ds-ink-faint); --_ink: var(--ds-ink-faint); cursor: not-allowed; }
.ds-segmented-control:disabled .ds-segmented-control__item,
.ds-segmented-control[aria-disabled="true"] .ds-segmented-control__item { cursor: not-allowed; color: var(--ds-ink-faint); }
/* loading — the selection is being applied: pill pulses in its own frame, control inert */
.ds-segmented-control[aria-busy="true"] { pointer-events: none; }
.ds-segmented-control[aria-busy="true"] .ds-segmented-control__input:checked,
.ds-segmented-control[aria-busy="true"] .ds-segmented-control__item[aria-selected="true"] {
  animation: ds-segmented-control-pulse calc(var(--ds-dur-slow) * 4) var(--ds-ease-standard) infinite alternate;
}
@keyframes ds-segmented-control-pulse { from { opacity: 1; } to { opacity: .45; } }

/* ---- data-selection geometry — only the line styles change shape ---------- */
/* underline / bar: no track, hairline baseline, 2px selected line; equal cells
   read as a switch [clickup-web-147 "Required views | Default View Templates"] */
[data-selection="underline"] .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]),
[data-selection="bar"]       .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]),
.ds-segmented-control[data-selection="underline"],
.ds-segmented-control[data-selection="bar"] {
  --_track: transparent;
  --_radius: 0px;
  --_pill-radius: 0px;
  --_inset: 0px;
  border: 0;
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
[data-selection="underline"] .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__input,
[data-selection="bar"]       .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__input,
.ds-segmented-control[data-selection="underline"] .ds-segmented-control__input,
.ds-segmented-control[data-selection="bar"] .ds-segmented-control__input,
[data-selection="underline"] .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__item[role="tab"],
.ds-segmented-control[data-selection="underline"] .ds-segmented-control__item[role="tab"] {
  border-block-end: 2px solid transparent;
  margin-block-end: -1px;
}
[data-selection="underline"] .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__input:checked,
[data-selection="bar"]       .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__input:checked,
.ds-segmented-control[data-selection="underline"] .ds-segmented-control__input:checked,
.ds-segmented-control[data-selection="bar"] .ds-segmented-control__input:checked,
[data-selection="underline"] .ds-segmented-control:is(:not([data-variant]), [data-variant="jstov"]) .ds-segmented-control__item[aria-selected="true"],
.ds-segmented-control[data-selection="underline"] .ds-segmented-control__item[aria-selected="true"] {
  border-block-end-color: var(--ds-selected-line);
}

/* ============================================================================
   VARIANTS
   ========================================================================== */

/* luma — 220×44 track r8; selected = WHITE pill with a 1px lift shadow, never
   accent; unselected muted. Fidelity: this is the corpus' one "elevated
   selection" (R4 exception, do not default to it) [luma-creating-an-event-00-03] */
.ds-segmented-control[data-variant="luma-lifted-white-pill"] {
  --_pill: var(--ds-surface);
  --_pill-ink: var(--ds-ink);
  min-height: var(--ds-control-h-lg);
}
.ds-segmented-control[data-variant="luma-lifted-white-pill"] .ds-segmented-control__input:checked,
.ds-segmented-control[data-variant="luma-lifted-white-pill"] .ds-segmented-control__item[aria-selected="true"] { box-shadow: var(--ds-shadow-lift); }
.ds-segmented-control[data-variant="luma-lifted-white-pill"] .ds-segmented-control__item { min-height: calc(var(--ds-control-h-lg) - 2 * var(--_inset)); font-size: var(--ds-text-md); }

/* cloudflare — a WHITE track with a hairline edge (--ds-surface + --ds-rule, r12 = --ds-radius-md at the
   theme's scale) and an INVERTED selected pill (--ds-surface-inverse / --ds-ink-inverse, r9), 36 px tabs
   at 14/500 — Cloudflare's macOS / Windows / Linux OS switch. Reached before 2026-09-20 as
   data-selection="invert" + two inline knobs (l-feat-03); one attribute now. The pill reads the inverse
   pair directly so the variant is the same under any page-level data-selection. [try-cloudflare .os-tabs] */
.ds-segmented-control[data-variant="cloudflare-white-track-inverted-pill"] {
  --_track: var(--ds-surface);
  --_track-border: var(--ds-rule);
  --_pill: var(--ds-surface-inverse);
  --_pill-ink: var(--ds-ink-inverse);
  --_ink: var(--ds-ink-2);
}

/* hsaj — 202×42 track r10, white pill ~80×34 r8 inset 4, no border, no
   shadow; 16/500 text, 18px tab padding [hsajlzkwuaagtdc] */
.ds-segmented-control[data-variant="hsaj-tint-track-white-pill"] {
  --_pill: var(--ds-surface);
  --_pill-ink: var(--ds-ink);
  --_radius: var(--ds-radius-md);
  --_pill-radius: var(--ds-radius-sm);
  min-height: var(--ds-control-h-lg);
  font-size: var(--ds-text-lg);
}
.ds-segmented-control[data-variant="hsaj-tint-track-white-pill"] .ds-segmented-control__item {
  min-height: calc(var(--ds-control-h-lg) - 2 * var(--_inset));
  padding-inline: calc(var(--ds-space-4) + var(--ds-space-0-5));
}

/* fibery — no track; each option is a bordered pill; selected = DARKER fill
   ("pressed into the paper"), unselected lighter [fibery-3-830x6495] */
.ds-segmented-control[data-variant="fibery-pressed-selection"] {
  --_track: transparent;
  --_inset: 0px;
  --_gap: var(--ds-space-1);
  --_pill: var(--ds-surface-selected);
  --_pill-ink: var(--ds-ink);
  --_ink: var(--ds-ink-2);
  --_pill-radius: var(--ds-radius-pill);
  --_radius: var(--ds-radius-pill);
  border: 0;
  flex-wrap: wrap;
  overflow: visible;
}
.ds-segmented-control[data-variant="fibery-pressed-selection"] .ds-segmented-control__item {
  min-height: var(--ds-size-h);
  border: var(--ds-border-width) solid var(--ds-border);
  background: var(--ds-surface);
}
.ds-segmented-control[data-variant="fibery-pressed-selection"] .ds-segmented-control__input { inset: calc(-1 * var(--ds-border-width)); }
.ds-segmented-control[data-variant="fibery-pressed-selection"] .ds-segmented-control__item:has(.ds-segmented-control__input:checked),
.ds-segmented-control[data-variant="fibery-pressed-selection"] .ds-segmented-control__item[aria-selected="true"] { border-color: var(--ds-border-strong); }

/* rox — 132×42 pill, hairline, recessed fill; three ICON-ONLY options on 44px
   centres; selected = a puck the FULL track height (no inset) with a tint fill
   and a 4px ring; icon flips muted → ink [rox-section] */
.ds-segmented-control[data-variant="rox-icon-only-three-state"] {
  --_track: var(--ds-surface-2);
  --_track-border: var(--ds-rule);
  --_radius: var(--ds-radius-pill);
  --_pill-radius: var(--ds-radius-pill);
  --_inset: 0px;
  --_pill: var(--ds-surface-selected);
  --_pill-ink: var(--ds-ink);
  min-height: var(--ds-control-h-lg);
}
.ds-segmented-control[data-variant="rox-icon-only-three-state"] .ds-segmented-control__item {
  min-height: calc(var(--ds-control-h-lg) - 2 * var(--ds-border-width));
  inline-size: calc(var(--ds-control-h-lg) - 2 * var(--ds-border-width));
  padding: 0;
}
.ds-segmented-control[data-variant="rox-icon-only-three-state"] .ds-segmented-control__input:checked,
.ds-segmented-control[data-variant="rox-icon-only-three-state"] .ds-segmented-control__item[aria-checked="true"] { border: 4px solid var(--ds-surface-3); }
.ds-segmented-control[data-variant="rox-icon-only-three-state"] .ds-segmented-control__label svg { inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); }

/* vercel — 32px hairline pill, three icon-only options, selected = tinted
   circle with ink icon, 2px inset [vercel-page] */
.ds-segmented-control[data-variant="vercel-three-segment-theme"] {
  --_track: var(--ds-surface);
  --_track-border: var(--ds-border);
  --_radius: var(--ds-radius-pill);
  --_pill-radius: var(--ds-radius-pill);
  --_inset: var(--ds-space-0-5);
  --_pill: var(--ds-surface-selected);
  --_pill-ink: var(--ds-ink);
  min-height: var(--ds-control-h-sm);
}
.ds-segmented-control[data-variant="vercel-three-segment-theme"] .ds-segmented-control__item {
  min-height: calc(var(--ds-control-h-sm) - 2 * var(--_inset) - 2 * var(--ds-border-width));
  inline-size: calc(var(--ds-control-h-sm) - 2 * var(--_inset) - 2 * var(--ds-border-width));
  padding: 0;
}

/* navattic — scope pill 71×27 in a content filter bar: tinted pill track,
   white pill, small text; 27 is off-ladder → nearest rung is sm [navattic-web-88] */
.ds-segmented-control[data-variant="navattic-88-scope-segment"] {
  --_radius: var(--ds-radius-pill);
  --_pill-radius: var(--ds-radius-pill);
  --_inset: var(--ds-space-0-5);
  --_pill: var(--ds-surface);
  --_pill-ink: var(--ds-ink);
  min-height: var(--ds-control-h-sm);
  font-size: var(--ds-text-sm);
}
.ds-segmented-control[data-variant="navattic-88-scope-segment"] .ds-segmented-control__item {
  min-height: calc(var(--ds-control-h-sm) - 2 * var(--_inset));
  padding-inline: var(--ds-space-3);
}
.ds-segmented-control[data-variant="navattic-88-scope-segment"] .ds-segmented-control__input:checked,
.ds-segmented-control[data-variant="navattic-88-scope-segment"] .ds-segmented-control__item[aria-selected="true"] { box-shadow: var(--ds-shadow-lift); }

/* retool — no track; active = accent-100 pill (62×24, r6, 12px semibold),
   inactive plain text, 24px gap; sits in a card header [retool-web-25] */
.ds-segmented-control[data-variant="retool-tint-pill-tab"] {
  --_track: transparent;
  --_inset: 0px;
  --_gap: var(--ds-space-6);
  --_pill: var(--ds-accent-tint);
  --_pill-ink: var(--ds-accent-ink);
  --_ink: var(--ds-ink-2);
  --_pill-radius: var(--ds-radius-sm);
  min-height: auto;
  border: 0;
  font-size: var(--ds-text-xs);
}
.ds-segmented-control[data-variant="retool-tint-pill-tab"] .ds-segmented-control__item {
  min-height: var(--ds-space-6);
  padding-inline: var(--ds-space-2);
  font-weight: var(--ds-weight-semibold);
}
.ds-segmented-control[data-variant="retool-tint-pill-tab"] .ds-segmented-control__item:has(.ds-segmented-control__input:checked),
.ds-segmented-control[data-variant="retool-tint-pill-tab"] .ds-segmented-control__item[aria-selected="true"] { font-weight: var(--ds-weight-semibold); }

/* ds/components/slider.css */
/* ============================================================================
   slider — Range / value slider with typed inputs · taxonomy-components.md §B (Input) · common · S1
   One markup for every variant: head (label + the value in words) · histogram (optional) · rail
   (track + fill + one or two role="slider" thumbs) · marks · typed Min / Max inputs that stay in
   sync with the thumbs · a hint that says what the range catches · an error line.
   Variants restyle that anatomy: jstov (default) · midday-inputs-over-track ·
   zillow-histogram-min-max · sweatpals-marked-steps.
   Knobs: --_lo / --_hi (thumb positions, % of the scale — set inline) · --_thumb (thumb size) ·
   --_track (track thickness) · --_hist-h (histogram height). Built for J12 (patterns/flows/search-filter.md).
   ========================================================================== */

.ds-slider {
  --_thumb: 20px;
  --_track: 4px;
  --_hist-h: 48px;
  --_fill: var(--ds-accent);
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-3);
  min-width: 0;
  color: var(--ds-ink);
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-list);
}

/* head: label + the value in words */
.ds-slider__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--ds-space-3); min-width: 0; }
.ds-slider__label {
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-label-case);
  letter-spacing: var(--ds-label-tracking);
}
.ds-slider__value { font-weight: var(--ds-weight-medium); font-variant-numeric: tabular-nums; }

/* histogram: one bar per step of the scale; bars inside the range carry data-in */
.ds-slider__histogram {
  display: flex;
  align-items: flex-end;
  gap: 2px;
  height: var(--_hist-h);
  padding-inline: calc(var(--_thumb) / 2);
}
.ds-slider__bar {
  flex: 1 1 0;
  height: var(--_bar-h, 4%);
  min-height: 2px;
  border-radius: var(--ds-radius-xs) var(--ds-radius-xs) 0 0;
  background: var(--ds-surface-3);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-slider__bar[data-in] { background: var(--_fill); }

/* rail: track + fill + thumbs; the rail is padded by half a thumb so 0% and 100% sit on the ends */
.ds-slider__rail {
  position: relative;
  height: var(--_thumb);
  margin-inline: calc(var(--_thumb) / 2);
}
.ds-slider__track {
  position: absolute;
  inset-inline: 0;
  top: 50%;
  height: var(--_track);
  transform: translateY(-50%);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-3);
}
.ds-slider__fill {
  position: absolute;
  inset-block: 0;
  left: var(--_lo, 0%);
  width: max(0%, calc(var(--_hi, 100%) - var(--_lo, 0%)));
  border-radius: inherit;
  background: var(--_fill);
}
.ds-slider__thumb {
  position: absolute;
  top: 50%;
  left: var(--_lo, 0%);
  width: var(--_thumb);
  height: var(--_thumb);
  transform: translate(-50%, -50%);
  border: 2px solid var(--_fill);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-lip);
  cursor: grab;
  touch-action: none;
  transition: transform var(--ds-dur-fast) var(--ds-ease-standard), box-shadow var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-slider__thumb[data-thumb="max"] { left: var(--_hi, 100%); }
.ds-slider__thumb:hover { box-shadow: var(--ds-hover-shadow); }
.ds-slider__thumb:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-slider__thumb[data-active] { transform: translate(-50%, -50%) scale(1.15); cursor: grabbing; outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
/* the value bubble shows while a thumb is held or focused */
.ds-slider__bubble {
  position: absolute;
  bottom: calc(100% + var(--ds-space-2));
  left: 50%;
  transform: translateX(-50%);
  padding: var(--ds-space-0-5) var(--ds-space-1-5);
  border-radius: var(--ds-radius-xs);
  background: var(--ds-surface-inverse);
  color: var(--ds-ink-inverse);
  font-size: var(--ds-text-xs);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transition: opacity var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-slider__thumb[data-active] .ds-slider__bubble,
.ds-slider__thumb:focus-visible .ds-slider__bubble { opacity: 1; }

/* marks: scale labels under the rail */
.ds-slider__marks {
  position: relative;
  height: calc(var(--ds-text-xs) * 1.5);
  margin-inline: calc(var(--_thumb) / 2);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-xs);
  font-variant-numeric: tabular-nums;
}
.ds-slider__mark { position: absolute; top: 0; left: var(--_at, 0%); transform: translateX(-50%); white-space: nowrap; }
.ds-slider__mark:first-child { transform: translateX(calc(-1 * var(--_thumb) / 2)); }
.ds-slider__mark:last-child { transform: translateX(calc(-100% + var(--_thumb) / 2)); }

/* typed inputs — the other half of the control; they and the thumbs always show the same numbers */
.ds-slider__inputs { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--ds-space-2); min-width: 0; }
.ds-slider__field { display: flex; flex-direction: column; gap: var(--ds-space-1); flex: 1 1 120px; min-width: 0; }
.ds-slider__field-label { color: var(--ds-ink-muted); font-size: var(--ds-text-xs); }
.ds-slider__field-box {
  display: flex;
  align-items: center;
  gap: var(--ds-space-1);
  min-height: var(--ds-size-h);
  padding-inline: var(--ds-size-pad-x);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-sm);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-lip);
  transition: border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-slider__field-box:hover { border-color: var(--ds-border-strong); }
.ds-slider__field-box:focus-within { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-border-width)); }
.ds-slider__field-box:has(.ds-slider__input[aria-invalid="true"]) { border-color: var(--ds-danger); }
.ds-slider__affix { color: var(--ds-ink-muted); }
.ds-slider__input {
  flex: 1 1 auto;
  min-width: 0;
  width: 100%;
  border: 0;
  padding: 0;
  background: none;
  color: inherit;
  font: inherit;
  font-variant-numeric: tabular-nums;
}
.ds-slider__input:focus-visible { outline: none; }
.ds-slider__input::placeholder { color: var(--ds-ink-muted); }
.ds-slider__sep { align-self: flex-end; min-height: var(--ds-size-h); display: inline-flex; align-items: center; color: var(--ds-ink-muted); }

.ds-slider__hint { margin: 0; color: var(--ds-ink-muted); font-variant-numeric: tabular-nums; }
.ds-slider__error { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1-5); margin: 0; color: var(--ds-danger-ink); }
.ds-slider__error svg,
.ds-slider svg { width: var(--ds-icon-size); height: var(--ds-icon-size); flex: none; fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-slider__fix {
  appearance: none; border: 0; padding: 0; background: none; cursor: pointer;
  color: var(--ds-ink-link); font: inherit; font-weight: var(--ds-weight-medium); text-decoration: underline; text-underline-offset: 2px;
}

/* ---- states ------------------------------------------------------------------ */
.ds-slider[data-state="error"] .ds-slider__value { color: var(--ds-danger-ink); }
.ds-slider[data-state="error"] .ds-slider__fill { display: none; }
.ds-slider[data-state="error"] .ds-slider__thumb { border-color: var(--ds-danger); }
.ds-slider[aria-busy="true"] .ds-slider__bar {
  background: linear-gradient(90deg, var(--ds-surface-2) 25%, var(--ds-surface-3) 50%, var(--ds-surface-2) 75%);
  background-size: 400% 100%;
  animation: ds-slider-shimmer calc(var(--ds-dur-slow) * 5) linear infinite;
}
.ds-slider[aria-busy="true"] .ds-slider__thumb { cursor: progress; }
@keyframes ds-slider-shimmer { to { background-position: -400% 0; } }
.ds-slider[aria-disabled="true"] { color: var(--ds-ink-faint); }
.ds-slider[aria-disabled="true"] .ds-slider__value { color: var(--ds-ink-muted); }
.ds-slider[aria-disabled="true"] .ds-slider__fill { display: none; }
.ds-slider[aria-disabled="true"] .ds-slider__bar { background: var(--ds-surface-3); }
.ds-slider[aria-disabled="true"] .ds-slider__thumb { border-color: var(--ds-rule); background: var(--ds-surface-3); box-shadow: none; cursor: not-allowed; }
.ds-slider[aria-disabled="true"] .ds-slider__thumb[data-thumb="min"] { left: 0%; }
.ds-slider[aria-disabled="true"] .ds-slider__thumb[data-thumb="max"] { left: 100%; }
.ds-slider[aria-disabled="true"] .ds-slider__field-box { background: var(--ds-surface-3); border-color: var(--ds-rule); box-shadow: none; cursor: not-allowed; }
.ds-slider[aria-disabled="true"] .ds-slider__input { color: var(--ds-ink-faint); cursor: not-allowed; }

/* single value: one thumb, the fill runs from the start */
.ds-slider[data-mode="single"] .ds-slider__fill { left: 0; width: var(--_hi, 0%); }

/* ---- variants ------------------------------------------------------------------ */
/* Midday: the typed min / max boxes come FIRST, then a thick ink track with hollow thumbs; the
   count reads as a full-width outlined line ("Show 1077 transactions") */
.ds-slider[data-variant="midday-inputs-over-track"] { --_track: 6px; --_thumb: 18px; --_fill: var(--ds-ink); }
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__head,
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__histogram,
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__marks,
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__sep { display: none; }
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__inputs { order: -1; }
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__field-box { min-height: var(--ds-control-h-sm); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); box-shadow: none; }
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__thumb { border-width: 2px; border-color: var(--ds-ink); box-shadow: none; }
.ds-slider[data-variant="midday-inputs-over-track"] .ds-slider__hint {
  padding: var(--ds-space-2);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-sm);
  color: var(--ds-ink);
  text-align: center;
  font-size: var(--ds-text-xs);
}

/* Zillow: a tall histogram is the hero; small filled thumbs on a hairline; Min – Max boxes */
.ds-slider[data-variant="zillow-histogram-min-max"] { --_hist-h: 72px; --_thumb: 14px; --_track: 2px; }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__bar { background: var(--ds-accent-tint); border-radius: 0; }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__bar[data-in] { background: var(--ds-accent); }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__histogram { gap: 1px; margin-bottom: calc(-1 * var(--ds-space-3)); }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__thumb { background: var(--ds-accent); border-color: var(--ds-accent); }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__mark:not(:first-child):not(:last-child) { display: none; }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__field-label { color: var(--ds-ink); font-weight: var(--ds-weight-medium); }
.ds-slider[data-variant="zillow-histogram-min-max"] .ds-slider__head .ds-slider__value { display: none; }
.ds-slider[data-variant="zillow-histogram-min-max"][aria-disabled="true"] .ds-slider__bar { background: var(--ds-surface-3); }

/* Sweatpals: no histogram; big ink thumbs on a hairline, labelled stops under it */
.ds-slider[data-variant="sweatpals-marked-steps"] { --_thumb: 22px; --_track: 2px; --_fill: var(--ds-ink); }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__histogram { display: none; }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__label { color: var(--ds-ink); font-size: var(--ds-text-md); font-weight: var(--ds-weight-semibold); text-transform: none; letter-spacing: 0; }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__track { background: var(--ds-rule-strong); }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__thumb { background: var(--ds-ink); border-color: var(--ds-ink); box-shadow: none; }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__mark { color: var(--ds-ink-2); font-weight: var(--ds-weight-medium); }
.ds-slider[data-variant="sweatpals-marked-steps"] .ds-slider__field-box { border-radius: var(--ds-radius-pill); background: var(--ds-surface-2); border-color: transparent; box-shadow: none; }
.ds-slider[data-variant="sweatpals-marked-steps"][data-state="error"] .ds-slider__thumb { background: var(--ds-danger); border-color: var(--ds-danger); }
.ds-slider[data-variant="sweatpals-marked-steps"][aria-disabled="true"] .ds-slider__thumb { background: var(--ds-surface-3); border-color: var(--ds-rule); }

/* ds/components/stat.css */
/* ============================================================================
   stat — Stat / KPI / metric                                (taxonomy §D · core · S1)
   Root: .ds-stat  (<div>, or <a>/<button> when the number navigates)
   Parts: __label · __value (· __prefix · __unit) · __meta (row under the value) · __legend (· __swatch) ·
          __delta[data-trend="up|down|flat"][data-tone="positive|negative|neutral"] · __comparator (control slot,
          composes .ds-select-trigger) · __ratio · __icon · __sentence · __num · __ring · __divider · __action ·
          __row / __key (synara micro-table)
   Group: .ds-stat-group[data-layout="strip|grid|quartet|pair|tiles"] — N stats sharing one baseline or card.
   Variants (data-variant on the root): jstov (= origin-label-number-legend, the house dashboard stat; unmarked root) ·
     retool-stat-strip-in-chart-card · manychat-zero-state-tile · manychat-headline-metric-pair ·
     manychat-two-tier-metric-cell · attio-stat-quartet · airbnb-numeral-over-label · homerun-sentence-stat-tile ·
     braintrust-zero-as-cta · synara-usage-micro-table · perplexity-quota-sentence · contra-progress-ring
     (elevenlabs-avatar-quota-ring is avatar[data-ring="quota"], not a stat)
   States: zero (a real 0, never hidden) · comparator on · aria-busy="true" (skeleton in the true frame) ·
     data-state="empty" (italic word) · data-state="error" · hover / focus-visible only when the root is <a>/<button>
   Private knobs: --_value-size --_value-weight --_label-size --_gap --_pad --_swatch --_ring-size --_ring-w
                  --_progress --_track --_arc
   ========================================================================== */

/* _base.css paints svg { fill: currentColor }; line icons restate hollow */
.ds-stat svg[fill="none"] { fill: none; stroke: currentColor; }

.ds-stat {
  --_value-size:   var(--ds-text-2xl);            /* 24 @14 — retool / manychat consensus            */
  --_value-weight: var(--ds-weight-semibold);
  --_label-size:   var(--ds-text-sm);
  --_gap:          var(--ds-space-1);
  --_pad:          0px;

  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: "label side" "value side" "meta side" "ratio side";
  align-items: start;
  column-gap: var(--ds-space-4);
  row-gap: var(--_gap);
  min-width: 0;
  padding: var(--_pad);
  color: var(--ds-ink);
  text-decoration: none;
  text-align: start;
  font-variant-numeric: tabular-nums;
}
.ds-stat:has(> .ds-stat__subject) { grid-template-areas: "label side" "value side" "subject side" "meta side" "ratio side"; }
button.ds-stat { border: 0; background: transparent; font: inherit; }
.ds-stat[data-size="sm"] { --_value-size: var(--ds-text-xl);  --_label-size: var(--ds-text-xs); }
.ds-stat[data-size="lg"] { --_value-size: var(--ds-text-3xl); --_label-size: var(--ds-text-md); }

/* -- parts ---------------------------------------------------------------- */
.ds-stat__label {
  grid-area: label;
  font-family: var(--ds-font-label);
  font-size: var(--_label-size);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--ds-ink-muted);
}
.ds-stat__value {
  grid-area: value;
  display: inline-flex;
  align-items: baseline;
  gap: 0;
  min-width: 0;
  font-size: var(--_value-size);
  font-weight: var(--_value-weight);
  line-height: var(--ds-lh-tight);
  letter-spacing: var(--ds-heading-tracking);
  color: var(--ds-ink);
}
.ds-stat__prefix { font-weight: var(--ds-weight-regular); color: var(--ds-ink-2); }       /* "$" before the numeral */
.ds-stat__unit   { margin-inline-start: var(--ds-space-0-5); font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); }
.ds-stat__meta {
  grid-area: meta;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-1) var(--ds-space-3);
  min-width: 0;
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-muted);
}
/* subject: the THIRD TIER — the name the number belongs to ("Kier Construction Ltd"). Sits under the value/label, ABOVE meta, and
   is the row meta/delta join: a delta or comparison inside __subject stays with its tier instead of drifting to the side column. */
.ds-stat__subject {
  grid-area: subject;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-1) var(--ds-space-2);
  min-width: 0;
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-2);
  overflow-wrap: anywhere;
}
.ds-stat__subject > .ds-stat__delta { font-size: var(--ds-text-sm); }
.ds-stat__avatar {
  flex: none;
  display: inline-grid;
  place-items: center;
  inline-size: var(--ds-space-5);
  block-size: var(--ds-space-5);
  border-radius: var(--ds-radius-pill);
  background: var(--_av-tint, var(--ds-surface-3));
  color: var(--_av-ink, var(--ds-ink-2));
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-semibold);
  line-height: 1;
}
.ds-stat__avatar[data-hue="1"] { --_av-tint: var(--ds-data-1-tint); --_av-ink: var(--ds-data-1-ink); }
.ds-stat__avatar[data-hue="2"] { --_av-tint: var(--ds-data-2-tint); --_av-ink: var(--ds-data-2-ink); }
.ds-stat__avatar[data-hue="3"] { --_av-tint: var(--ds-data-3-tint); --_av-ink: var(--ds-data-3-ink); }
.ds-stat__avatar[data-hue="4"] { --_av-tint: var(--ds-data-4-tint); --_av-ink: var(--ds-data-4-ink); }
.ds-stat__legend { display: inline-flex; align-items: center; gap: var(--ds-space-1-5); }
.ds-stat__swatch {
  flex: none;
  inline-size: 8px;                              /* origin: 8px colour dot before a 15px legend label */
  block-size: 8px;
  border-radius: var(--ds-radius-pill);
  background: var(--_swatch, var(--ds-accent));
}
.ds-stat__swatch[data-hue="1"] { --_swatch: var(--ds-data-1); }
.ds-stat__swatch[data-hue="2"] { --_swatch: var(--ds-data-2); }
.ds-stat__swatch[data-hue="3"] { --_swatch: var(--ds-data-3); }
.ds-stat__swatch[data-hue="4"] { --_swatch: var(--ds-data-4); }
.ds-stat__swatch[data-hue="5"] { --_swatch: var(--ds-data-5); }
.ds-stat__swatch[data-hue="6"] { --_swatch: var(--ds-data-6); }
.ds-stat__swatch[data-hue="7"] { --_swatch: var(--ds-data-7); }
.ds-stat__swatch[data-hue="8"] { --_swatch: var(--ds-data-8); }
.ds-stat__swatch[data-hue="comparison"] { --_swatch: var(--ds-chart-comparison); }

/* delta: direction (data-trend) is drawn, sentiment (data-tone) is coloured — churn going down is positive */
.ds-stat__delta {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  font-weight: var(--ds-weight-medium);
  font-variant-numeric: tabular-nums;
  color: var(--ds-ink-muted);
}
.ds-stat__delta::before {
  content: "";
  inline-size: 0; block-size: 0;
  border-inline: 4px solid transparent;
  border-block-end: 6px solid currentColor;
}
.ds-stat__delta[data-trend="down"]::before { transform: rotate(180deg); }
.ds-stat__delta[data-trend="flat"]::before { inline-size: 8px; block-size: 2px; border: 0; background: currentColor; border-radius: 1px; }
.ds-stat__delta[data-tone="positive"] { color: var(--ds-success-ink); }
.ds-stat__delta[data-tone="negative"] { color: var(--ds-danger-ink); }
.ds-stat__delta[data-tone="neutral"]  { color: var(--ds-ink-muted); }

/* comparator: "Compare with:" + a select-trigger, right-aligned on the label's baseline (origin) */
.ds-stat__comparator {
  grid-area: side;
  justify-self: end;
  align-self: start;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-2);
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
  white-space: nowrap;
}
.ds-stat__ratio {
  grid-area: ratio;
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  font-variant-numeric: tabular-nums;
  color: var(--ds-success-ink);                 /* manychat: the ratio is the success-coloured second tier */
}
.ds-stat__ratio[data-tone="neutral"]  { color: var(--ds-ink-muted); }
.ds-stat__ratio[data-tone="negative"] { color: var(--ds-danger-ink); }
.ds-stat__num { font-weight: var(--ds-weight-semibold); color: var(--ds-ink); font-variant-numeric: tabular-nums; }

/* -- group ---------------------------------------------------------------- */
.ds-stat-group {
  display: grid;
  gap: var(--_gap, var(--ds-card-gap));
  grid-template-columns: repeat(auto-fit, minmax(min(var(--_min, 160px), 100%), 1fr));
  min-width: 0;
}
.ds-stat-group > * { min-width: 0; }
.ds-stat-group[data-layout="quartet"] { --_min: 200px; column-gap: var(--ds-space-20); row-gap: var(--ds-space-8); }
.ds-stat-group[data-layout="tiles"]   { --_min: 200px; --_gap: var(--ds-space-3); }
.ds-stat-group[data-layout="pair"]    { grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); }
.ds-stat-group[data-divided] > * + * { border-inline-start: var(--ds-border-width) solid var(--ds-rule); padding-inline-start: var(--ds-card-gap); }

/* =========================================================================
   VARIANTS
   ========================================================================= */

/* jstov = origin-label-number-legend: muted label / 36px number / dot legend, comparator on the same baseline */
.ds-stat[data-variant="jstov"],
.ds-stat[data-variant="origin-label-number-legend"] {
  --_value-size: var(--ds-text-3xl);            /* 32 @14 · 36 @16 — origin's 34–36 */
  --_gap: var(--ds-space-1-5);
}

/* retool: label 12/600 INK over value 24/700, 8px gap, N equal columns inside the chart card */
.ds-stat[data-variant="retool-stat-strip-in-chart-card"] {
  --_label-size: var(--ds-text-xs);
  --_value-weight: var(--ds-weight-bold);
  --_gap: var(--ds-space-2);
}
.ds-stat[data-variant="retool-stat-strip-in-chart-card"] .ds-stat__label {
  color: var(--ds-ink);
  font-weight: var(--ds-weight-semibold);
  text-transform: none;
  letter-spacing: 0;
}

/* manychat: 128px tile, label top-left (14 muted), value bottom-left (24/700); real zeros keep the layout */
.ds-stat[data-variant="manychat-zero-state-tile"] {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-block-size: 128px;
  --_pad: var(--ds-space-3);
  --_label-size: var(--ds-text-md);
  --_value-weight: var(--ds-weight-bold);
  border-radius: var(--ds-radius-md);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
}
.ds-stat[data-variant="manychat-zero-state-tile"] .ds-stat__label { font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; }

/* manychat headline pair: count (ink) + ratio (success) on ONE baseline, verb clause under the count only */
.ds-stat[data-variant="manychat-headline-metric-pair"] {
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas: "value ratio" "label label" "subject subject" "meta meta";
  align-items: baseline;
  column-gap: var(--ds-space-6);
  --_value-size: var(--ds-text-xl);
  --_value-weight: var(--ds-weight-bold);
  --_label-size: var(--ds-text-md);
}
.ds-stat[data-variant="manychat-headline-metric-pair"] .ds-stat__ratio {
  justify-self: end;
  font-size: var(--_value-size);
  font-weight: var(--_value-weight);
  line-height: var(--ds-lh-tight);
}
.ds-stat[data-variant="manychat-headline-metric-pair"] .ds-stat__label { font-weight: var(--ds-weight-regular); text-transform: none; letter-spacing: 0; color: var(--ds-ink-2); }

/* manychat two-tier cell: count, success ratio beneath */
.ds-stat[data-variant="manychat-two-tier-metric-cell"] {
  --_value-size: var(--ds-text-lg);
  --_label-size: var(--ds-text-xs);
  --_gap: var(--ds-space-0-5);
}

/* attio quartet: 2px accent left rule · 32px REGULAR number · 13px muted label (number first) */
.ds-stat[data-variant="attio-stat-quartet"] {
  grid-template-areas: "value side" "label side" "subject side" "meta side";   /* meta + subject placed: they used to fall into implicit cells (bottom-right) */
  --_value-size: var(--ds-text-3xl);
  --_value-weight: var(--ds-weight-regular);
  --_label-size: var(--ds-text-sm);
  --_gap: var(--ds-space-2);
  padding-inline-start: var(--ds-space-4);
  border-inline-start: 2px solid var(--ds-accent-line);   /* → ink under data-accent-scope="none" */
}
.ds-stat[data-variant="attio-stat-quartet"] .ds-stat__value { letter-spacing: var(--ds-display-tracking); }
.ds-stat[data-variant="attio-stat-quartet"] .ds-stat__label { font-weight: var(--ds-weight-regular); }

/* 7shifts: label / value / subject stacked — the subject is a quiet second label under the number ("Kier Construction Ltd"); meta beneath it */
.ds-stat[data-variant="7shifts-label-value-subject"] {
  grid-template-areas: "label side" "value side" "subject side" "meta side";
  --_value-size: var(--ds-text-2xl);
  --_label-size: var(--ds-text-md);
  --_gap: var(--ds-space-1);
}
.ds-stat[data-variant="7shifts-label-value-subject"] .ds-stat__label { color: var(--ds-ink-2); font-weight: var(--ds-weight-medium); text-transform: none; letter-spacing: 0; }
.ds-stat[data-variant="7shifts-label-value-subject"] .ds-stat__subject { font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }
/* xero: value, then ONE line — subject name + delta share it ("vs Kier, up 0.55 from last year"); meta (period) under that */
.ds-stat[data-variant="xero-subject-delta-line"] {
  grid-template-areas: "label side" "value side" "subject side" "meta side";
  --_value-size: var(--ds-text-2xl);
  --_gap: var(--ds-space-1);
}
.ds-stat[data-variant="xero-subject-delta-line"] .ds-stat__label { color: var(--ds-ink); font-weight: var(--ds-weight-semibold); text-transform: none; letter-spacing: 0; }
.ds-stat[data-variant="xero-subject-delta-line"] .ds-stat__subject { flex-wrap: nowrap; justify-content: flex-start; font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }
.ds-stat[data-variant="xero-subject-delta-line"] .ds-stat__subject > :first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-stat[data-variant="xero-subject-delta-line"] .ds-stat__subject > .ds-stat__delta { flex: none; }
/* klaviyo: a bordered tile; value, label, then the third tier as an entity chip — avatar + name in a pill */
.ds-stat[data-variant="klaviyo-entity-chip"] {
  grid-template-areas: "value side" "label side" "subject side" "meta side";
  --_pad: var(--ds-space-4);
  --_value-size: var(--ds-text-2xl);
  --_label-size: var(--ds-text-md);
  --_gap: var(--ds-space-1);
  border-radius: var(--ds-radius-md);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
}
.ds-stat[data-variant="klaviyo-entity-chip"] .ds-stat__label { color: var(--ds-ink); font-weight: var(--ds-weight-medium); text-transform: none; letter-spacing: 0; }
.ds-stat[data-variant="klaviyo-entity-chip"] .ds-stat__subject { justify-self: start; margin-block-start: var(--ds-space-1); padding: var(--ds-space-0-5) var(--ds-space-2) var(--ds-space-0-5) var(--ds-space-0-5); border-radius: var(--ds-radius-pill); background: var(--ds-surface-2); color: var(--ds-ink-2); }
.ds-stat[data-variant="klaviyo-entity-chip"] .ds-stat__avatar { inline-size: var(--ds-space-5); block-size: var(--ds-space-5); }

/* airbnb: 22/600 numeral over a 600 unit label (their 10px label is raised to the xs floor) */
.ds-stat[data-variant="airbnb-numeral-over-label"] {
  grid-template-areas: "value side" "label side" "subject side" "meta side";
  align-content: center;
  --_value-size: var(--ds-text-xl);
  --_label-size: var(--ds-text-xs);
  --_gap: var(--ds-space-0-5);
}
.ds-stat[data-variant="airbnb-numeral-over-label"] .ds-stat__label { color: var(--ds-ink-2); font-weight: var(--ds-weight-semibold); }

/* homerun: 96px card, 24px line icon + 16px gap + 18/400 sentence; zero and non-zero share one layout */
.ds-stat[data-variant="homerun-sentence-stat-tile"] {
  display: flex;
  align-items: center;
  gap: var(--ds-space-4);
  min-block-size: 96px;
  --_pad: var(--ds-space-6);
  border-radius: var(--ds-radius-lg);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
}
.ds-stat__icon {
  flex: none;
  inline-size: var(--ds-icon-size-rail);        /* 24 */
  block-size: var(--ds-icon-size-rail);
  color: var(--ds-ink-2);
}
.ds-stat__icon svg { inline-size: 100%; block-size: 100%; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-stat__sentence {
  min-width: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-regular);
  line-height: var(--ds-lh-body);
  color: var(--ds-ink);
}
.ds-stat__sentence .ds-stat__num { font-weight: var(--ds-weight-regular); }   /* homerun folds the count into prose at one weight */
/* the house fix for "tiles look static": a link tile shows its affordance on hover (see states) */

/* braintrust: label | hairline | glyph+numeral | primary button — all 48 tall, zero beside the earning action */
.ds-stat[data-variant="braintrust-zero-as-cta"] {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--ds-space-4);
  min-block-size: 48px;
  --_value-size: var(--ds-text-xl);
}
.ds-stat[data-variant="braintrust-zero-as-cta"] .ds-stat__label { font-size: var(--ds-text-md); }
.ds-stat__divider { align-self: stretch; inline-size: var(--ds-border-width); min-block-size: var(--ds-space-6); background: var(--ds-rule-strong); }
.ds-stat[data-variant="braintrust-zero-as-cta"] .ds-stat__icon { inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); align-self: center; color: var(--ds-data-6); }
/* local primary-button fallback until button-primary ships — this stat IS the view's one filled control */
.ds-stat__action {
  display: inline-flex;
  align-items: center;
  min-block-size: var(--ds-control-h-lg);
  padding-inline: var(--ds-space-5);
  border: var(--ds-border-width) solid var(--ds-primary-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-primary-fill);
  color: var(--ds-ink-on-primary);
  font-size: var(--ds-text-md);
  font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case);
  text-decoration: none;
  cursor: pointer;
  box-shadow: var(--ds-shadow-lip);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-stat__action:hover { background: var(--ds-primary-fill-hover); }

/* synara micro-table: three key/number lines (their 9–10px is raised to the xs floor) */
.ds-stat[data-variant="synara-usage-micro-table"] {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-0-5);
  font-size: var(--ds-text-xs);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-muted);
}
.ds-stat__row { display: flex; justify-content: space-between; gap: var(--ds-space-3); margin: 0; }
.ds-stat__key { font-family: var(--ds-font-label); text-transform: var(--ds-label-case); letter-spacing: var(--ds-label-tracking); }
.ds-stat[data-variant="synara-usage-micro-table"] .ds-stat__num { font-size: inherit; }

/* perplexity: "5 searches left today. Reloads every 4 hours." — a sentence, numerals in ink */
.ds-stat[data-variant="perplexity-quota-sentence"] {
  display: block;
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-body);
  color: var(--ds-ink-muted);
}

/* contra: 44px conic ring with the numeral inside, 16/600 label beside — a pinned onboarding nudge */
.ds-stat[data-variant="contra-progress-ring"] {
  display: flex;
  align-items: center;
  gap: var(--ds-space-3);
  --_ring-size: 44px;
  --_ring-w: 4px;
  --_progress: 0;
  --_track: var(--ds-rule-strong);
  --_arc: conic-gradient(var(--ds-accent), var(--ds-accent-2), var(--ds-data-5), var(--ds-data-4));
}
.ds-stat__ring {
  position: relative;
  flex: none;
  display: grid;
  place-items: center;
  inline-size: var(--_ring-size);
  block-size: var(--_ring-size);
  border-radius: var(--ds-radius-pill);
  background: var(--_track);
}
.ds-stat__ring::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: var(--_arc);
  mask: conic-gradient(currentColor calc(var(--_progress) * 360deg), transparent 0),
        radial-gradient(farthest-side, transparent calc(100% - var(--_ring-w)), currentColor calc(100% - var(--_ring-w) + .5px));
  -webkit-mask: conic-gradient(currentColor calc(var(--_progress) * 360deg), transparent 0),
        radial-gradient(farthest-side, transparent calc(100% - var(--_ring-w)), currentColor calc(100% - var(--_ring-w) + .5px));
  mask-composite: intersect;
  -webkit-mask-composite: source-in;
}
.ds-stat__ring::after {
  content: "";
  position: absolute;
  inset: var(--_ring-w);
  border-radius: inherit;
  background: var(--ds-surface);
}
.ds-stat[data-variant="contra-progress-ring"] .ds-stat__value { position: relative; z-index: 1; font-size: var(--ds-text-xs); font-weight: var(--ds-weight-semibold); }
.ds-stat[data-variant="contra-progress-ring"] .ds-stat__label { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-semibold); color: var(--ds-ink); text-transform: none; letter-spacing: 0; }

/* =========================================================================
   STATES (last, so they beat variant paint at equal specificity)
   ========================================================================= */

/* interactive stat (a / button): hover paints one tint step or a lift per data-hover; the ring is universal */
.ds-stat:is(a, button) { cursor: pointer; border-radius: var(--ds-radius-md); transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), box-shadow var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-stat:is(a, button):not([data-variant="manychat-zero-state-tile"]):not([data-variant="homerun-sentence-stat-tile"]):not([data-variant="klaviyo-entity-chip"]) { --_pad: var(--ds-space-2); margin: calc(-1 * var(--ds-space-2)); }
.ds-stat:is(a, button):hover,
.ds-stat:is(a, button)[data-state="hover"] { background: var(--ds-hover-bg); box-shadow: var(--ds-hover-shadow); border-color: var(--ds-border-strong); }
/* homerun weakness fixed: a linked sentence tile gets a trailing arrow so it does not "look static" */
.ds-stat[data-variant="homerun-sentence-stat-tile"]:is(a, button) .ds-stat__sentence::after {
  content: "→";
  margin-inline-start: var(--ds-space-2);
  color: var(--ds-ink-muted);
  transition: transform var(--ds-dur-fast) var(--ds-ease-out);
  display: inline-block;
}
.ds-stat[data-variant="homerun-sentence-stat-tile"]:is(a, button):hover .ds-stat__sentence::after { transform: translateX(2px); }

/* loading: the frame is kept — each text part becomes a skeleton bar of its own size */
.ds-stat[aria-busy="true"] :is(.ds-stat__label, .ds-stat__value, .ds-stat__meta, .ds-stat__subject, .ds-stat__ratio, .ds-stat__sentence, .ds-stat__row) {
  color: transparent;
  background: var(--ds-skeleton);
  border-radius: var(--ds-radius-xs);
  min-inline-size: 3em;
}
.ds-stat[aria-busy="true"] :is(.ds-stat__label, .ds-stat__value, .ds-stat__meta, .ds-stat__subject, .ds-stat__ratio, .ds-stat__sentence, .ds-stat__row) > * { visibility: hidden; }
.ds-stat[aria-busy="true"] .ds-stat__ring::before { background: var(--ds-skeleton); mask: none; -webkit-mask: none; }
.ds-stat[aria-busy="true"] .ds-stat__icon { color: var(--ds-skeleton); }

/* empty: the null is an italic WORD in muted ink at body size (house: null = italic word, zero = real 0) */
.ds-stat[data-state="empty"] .ds-stat__value {
  font-style: italic;
  font-weight: var(--ds-weight-regular);
  font-size: var(--ds-text-md);
  color: var(--ds-ink-muted);
  letter-spacing: 0;
}
.ds-stat[data-state="empty"] .ds-stat__sentence { color: var(--ds-ink-muted); }
.ds-stat[data-state="empty"] .ds-stat__subject { font-style: italic; font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }

/* error: the number is replaced by a readable failure + a retry link in the meta row */
.ds-stat[data-state="error"] .ds-stat__value { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); color: var(--ds-danger-ink); letter-spacing: 0; }
.ds-stat[data-state="error"] .ds-stat__meta { color: var(--ds-danger-ink); }
.ds-stat[data-state="error"] .ds-stat__meta a { color: var(--ds-ink-link); }

/* disabled (a metric the plan does not include): faint, still visible */
.ds-stat[aria-disabled="true"] { cursor: not-allowed; }
.ds-stat[aria-disabled="true"] :is(.ds-stat__label, .ds-stat__value, .ds-stat__meta, .ds-stat__subject, .ds-stat__ratio, .ds-stat__sentence) { color: var(--ds-ink-faint); }

/* ds/components/status-badge.css */
/* ============================================================================
   status-badge — Status badge                              (taxonomy §D · core · S1)
   Root: .ds-status-badge (<span>; put it INSIDE the <a>/<button> if it must be interactive — it is never one itself)
   Parts: __glyph[data-shape="dot|check|ring|icon"] (ring: data-fill="dashed|empty|partial|filled") · __label
   Axes:  data-tone="neutral|success|danger|warning|info|accent|accent-2|live"   which hue
          data-emphasis="outlined|tint|filled|inverse|quiet"                   how loud
          data-hue="1…8"                                                      an enum hue instead of a semantic one
          data-size="sm|md|lg"                                                18 / 20 / 24
   Variants: jstov (unmarked root — neutral OUTLINED for resting states, ONE semantic fill for live/active,
     uppercase = the one caps lane) · manychat-live-filled-red · manychat-draft-quiet-outlined ·
     clickup-group-status-pill · origin-inline-coloured-word · navattic-tonal-default · perplexity-pro-dark-caps ·
     descript-new-tint-pill · elevenlabs-two-emphasis-levels · vercel-mono-boxed-new · attio-status-chip-vocabulary ·
     plane-state-ring · oku-premium-accent-pill · manychat-trial-on-avatar
   States: rest · aria-busy="true" (skeleton pill) — a badge has no hover/focus/disabled of its own
   Private knobs: --_h --_pad-x --_radius --_fill --_ink --_edge --_hue --_glyph --_gap --_size --_weight --_case --_tracking
   ========================================================================== */

.ds-status-badge svg[fill="none"] { fill: none; stroke: currentColor; }

.ds-status-badge {
  --_h:        20px;                              /* 20–24 across the corpus; icon-row tall            */
  --_pad-x:    var(--ds-space-2);
  --_radius:   var(--ds-radius-xs);               /* r4 — manychat / clickup / oku; pills opt in         */
  --_gap:      var(--ds-space-1);
  --_size:     var(--ds-text-xs);
  --_weight:   var(--ds-weight-medium);
  --_case:     uppercase;                         /* R8: the badge is the one caps lane                  */
  --_tracking: .04em;
  /* hue set — the house resting badge is NEUTRAL OUTLINED */
  --_hue:      var(--ds-ink-muted);
  --_fill:     transparent;
  --_ink:      var(--ds-ink-muted);
  --_edge:     var(--ds-border);
  --_glyph:    var(--_hue);

  display: inline-flex;
  align-items: center;
  gap: var(--_gap);
  min-block-size: var(--_h);
  padding-inline: var(--_pad-x);
  border-radius: var(--_radius);
  border: var(--ds-border-width) solid var(--_edge);
  background: var(--_fill);
  color: var(--_ink);
  font-family: var(--ds-font-label);
  font-size: var(--_size);
  font-weight: var(--_weight);
  line-height: 1;
  letter-spacing: var(--_tracking);
  text-transform: var(--_case);
  white-space: nowrap;
  vertical-align: middle;
  max-inline-size: 100%;
}
.ds-status-badge__label { overflow: hidden; text-overflow: ellipsis; }
.ds-status-badge[data-size="sm"] { --_h: 18px; --_pad-x: var(--ds-space-1-5); }
.ds-status-badge[data-size="lg"] { --_h: 24px; --_pad-x: var(--ds-space-3); --_size: var(--ds-text-sm); }

/* -- tones: each sets the hue triplet; emphasis then decides which member paints what ------------- */
.ds-status-badge[data-tone="success"]  { --_hue: var(--ds-success); --_fill: var(--ds-success-tint); --_ink: var(--ds-success-ink); --_edge: transparent; }
.ds-status-badge[data-tone="danger"]   { --_hue: var(--ds-danger);  --_fill: var(--ds-danger-tint);  --_ink: var(--ds-danger-ink);  --_edge: transparent; }
.ds-status-badge[data-tone="warning"]  { --_hue: var(--ds-warning); --_fill: var(--ds-warning-tint); --_ink: var(--ds-warning-ink); --_edge: transparent; }
.ds-status-badge[data-tone="info"]     { --_hue: var(--ds-info);    --_fill: var(--ds-info-tint);    --_ink: var(--ds-info-ink);    --_edge: transparent; }
.ds-status-badge[data-tone="accent"]   { --_hue: var(--ds-accent);  --_fill: var(--ds-accent-tint);  --_ink: var(--ds-accent-ink);  --_edge: transparent; }
.ds-status-badge[data-tone="accent-2"] { --_hue: var(--ds-accent-2); --_fill: var(--ds-accent-2-tint); --_ink: var(--ds-accent-2-ink); --_edge: transparent; }
/* live / on-air: the ONE filled badge (house). --ds-live derives from danger; --ds-ink-on-semantic pairs with it */
.ds-status-badge[data-tone="live"]     { --_hue: var(--ds-live); --_fill: var(--ds-live); --_ink: var(--ds-ink-on-semantic); --_edge: transparent; --_glyph: currentColor; }
.ds-status-badge[data-hue="1"] { --_hue: var(--ds-data-1); --_fill: var(--ds-data-1-tint); --_ink: var(--ds-data-1-ink); --_edge: transparent; }
.ds-status-badge[data-hue="2"] { --_hue: var(--ds-data-2); --_fill: var(--ds-data-2-tint); --_ink: var(--ds-data-2-ink); --_edge: transparent; }
.ds-status-badge[data-hue="3"] { --_hue: var(--ds-data-3); --_fill: var(--ds-data-3-tint); --_ink: var(--ds-data-3-ink); --_edge: transparent; }
.ds-status-badge[data-hue="4"] { --_hue: var(--ds-data-4); --_fill: var(--ds-data-4-tint); --_ink: var(--ds-data-4-ink); --_edge: transparent; }
.ds-status-badge[data-hue="5"] { --_hue: var(--ds-data-5); --_fill: var(--ds-data-5-tint); --_ink: var(--ds-data-5-ink); --_edge: transparent; }
.ds-status-badge[data-hue="6"] { --_hue: var(--ds-data-6); --_fill: var(--ds-data-6-tint); --_ink: var(--ds-data-6-ink); --_edge: transparent; }
.ds-status-badge[data-hue="7"] { --_hue: var(--ds-data-7); --_fill: var(--ds-data-7-tint); --_ink: var(--ds-data-7-ink); --_edge: transparent; }
.ds-status-badge[data-hue="8"] { --_hue: var(--ds-data-8); --_fill: var(--ds-data-8-tint); --_ink: var(--ds-data-8-ink); --_edge: transparent; }

/* -- emphasis ------------------------------------------------------------------------------------ */
.ds-status-badge[data-emphasis="outlined"] { --_fill: transparent; --_edge: var(--ds-border); }
.ds-status-badge[data-emphasis="outlined"]:not([data-tone]):not([data-hue]) { --_ink: var(--ds-ink-muted); }
.ds-status-badge[data-emphasis="tint"]:not([data-tone]):not([data-hue]) { --_fill: var(--ds-surface-2); --_ink: var(--ds-ink-2); --_edge: transparent; }
.ds-status-badge[data-emphasis="filled"]  { --_fill: var(--_hue); --_ink: var(--ds-ink-on-semantic); --_edge: transparent; --_glyph: currentColor; }
.ds-status-badge[data-emphasis="filled"]:not([data-tone]):not([data-hue]) { --_fill: var(--ds-surface-inverse); --_ink: var(--ds-ink-inverse); }
.ds-status-badge[data-emphasis="filled"][data-tone="accent"] { --_ink: var(--ds-ink-on-accent); }
/* warning never fills: white fails on the light amber and the pair flips by mode — it stays tint (contract §4.5) */
.ds-status-badge[data-emphasis="filled"][data-tone="warning"] { --_fill: var(--ds-warning-tint); --_ink: var(--ds-warning-ink); --_glyph: var(--_hue); }
.ds-status-badge[data-emphasis="inverse"] { --_fill: var(--ds-surface-inverse); --_ink: var(--ds-ink-inverse); --_edge: transparent; --_glyph: currentColor; }
.ds-status-badge[data-emphasis="quiet"]   { --_fill: transparent; --_edge: transparent; --_pad-x: 0px; }
.ds-status-badge[data-emphasis="quiet"]:not([data-tone]):not([data-hue]) { --_ink: var(--ds-ink-muted); }
.ds-status-badge[data-emphasis="quiet"][data-tone] { --_ink: var(--_hue); }
.ds-status-badge[data-emphasis="quiet"][data-tone="success"] { --_ink: var(--ds-success-ink); }
.ds-status-badge[data-emphasis="quiet"][data-tone="danger"]  { --_ink: var(--ds-danger-ink); }
.ds-status-badge[data-emphasis="quiet"][data-tone="warning"] { --_ink: var(--ds-warning-ink); }
.ds-status-badge[data-emphasis="quiet"][data-tone="info"]    { --_ink: var(--ds-info-ink); }

/* -- glyph: dot (default) · check · ring (plane state vocabulary) · icon ------------------------- */
.ds-status-badge__glyph {
  flex: none;
  position: relative;
  display: inline-grid;
  place-items: center;
  inline-size: 8px;
  block-size: 8px;
  border-radius: var(--ds-radius-pill);
  background: var(--_glyph);
  color: var(--_glyph);
}
.ds-status-badge__glyph[data-shape="check"] { inline-size: 12px; block-size: 12px; background: transparent; }
.ds-status-badge__glyph[data-shape="check"]::before {
  content: "";
  inline-size: 3px; block-size: 7px;
  border-inline-end: 1.5px solid currentColor;
  border-block-end: 1.5px solid currentColor;
  transform: translateY(-1px) rotate(45deg);
}
.ds-status-badge__glyph[data-shape="icon"] { inline-size: 12px; block-size: 12px; background: transparent; border-radius: 0; }
.ds-status-badge__glyph[data-shape="icon"] svg { inline-size: 100%; block-size: 100%; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
/* ring: stroke style encodes state — dashed (backlog) · empty (to do) · partial (in progress, amber) · filled (done) */
.ds-status-badge__glyph[data-shape="ring"] {
  inline-size: 14px;
  block-size: 14px;
  background: transparent;
  border: 1.5px solid var(--_glyph);
  box-sizing: border-box;
}
.ds-status-badge__glyph[data-shape="ring"][data-fill="dashed"]  { border-style: dashed; }
.ds-status-badge__glyph[data-shape="ring"][data-fill="partial"]::before {
  content: "";
  position: absolute;
  inset: 2px;
  border-radius: inherit;
  background: conic-gradient(var(--_glyph) 50%, transparent 0);
}
.ds-status-badge__glyph[data-shape="ring"][data-fill="filled"] { background: var(--_glyph); }
.ds-status-badge__glyph[data-shape="ring"][data-fill="filled"]::before {
  content: "";
  inline-size: 3px; block-size: 6px;
  border-inline-end: 1.5px solid var(--ds-ink-on-semantic);
  border-block-end: 1.5px solid var(--ds-ink-on-semantic);
  transform: translateY(-1px) rotate(45deg);
}
/* live badges pulse the dot; collapses under reduced motion via --ds-motion-scale */
.ds-status-badge[data-tone="live"] .ds-status-badge__glyph[data-shape="dot"] { animation: ds-status-badge-pulse calc(1.6s * var(--ds-motion-scale)) var(--ds-ease-standard) infinite; }
@keyframes ds-status-badge-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .45; } }

/* =========================================================================
   VARIANTS
   ========================================================================= */

/* manychat: LIVE 41×22 r4 filled (their red collides with danger) vs STOPPED neutral tint r4 */
.ds-status-badge[data-variant="manychat-live-filled-red"] {
  --_h: 22px;
  --_size: var(--ds-text-sm);
  --_weight: var(--ds-weight-medium);
  --_tracking: .02em;
  --_fill: var(--ds-surface-2);
  --_ink: var(--ds-ink-muted);
  --_edge: transparent;
}
.ds-status-badge[data-variant="manychat-live-filled-red"][data-tone="live"] { --_weight: var(--ds-weight-semibold); --_fill: var(--ds-live); --_ink: var(--ds-ink-on-semantic); }

/* manychat draft: uppercase tracked, 1px rule outline, 24 tall, r6, no fill; their #838383 (3.4:1) is raised to ink-muted */
.ds-status-badge[data-variant="manychat-draft-quiet-outlined"] {
  --_h: 24px;
  --_radius: var(--ds-radius-sm);
  --_size: var(--ds-text-sm);
  --_tracking: .06em;
  --_edge: var(--ds-rule);
  --_fill: transparent;
  --_ink: var(--ds-ink-muted);
}

/* clickup: "TO DO" 12/700 upper on the state's tint, r4 — a kanban group header token */
.ds-status-badge[data-variant="clickup-group-status-pill"] {
  --_size: var(--ds-text-sm);
  --_weight: var(--ds-weight-bold);
  --_tracking: .02em;
  --_edge: transparent;
}
.ds-status-badge[data-variant="clickup-group-status-pill"]:not([data-tone]):not([data-hue]) { --_fill: var(--ds-surface-2); --_ink: var(--ds-ink-2); }

/* origin: no box — the status is a coloured word in parentheses inside the meta line */
.ds-status-badge[data-variant="origin-inline-coloured-word"] {
  display: inline;
  min-block-size: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font: inherit;
  letter-spacing: 0;
  text-transform: none;
  white-space: normal;
  color: var(--_ink);
}
.ds-status-badge[data-variant="origin-inline-coloured-word"]::before { content: "("; }
.ds-status-badge[data-variant="origin-inline-coloured-word"]::after  { content: ")"; }
.ds-status-badge[data-variant="origin-inline-coloured-word"] .ds-status-badge__glyph { display: none; }

/* navattic: 81×20 r5 tonal, palette icon + 13/500 ink, sentence case, no border */
.ds-status-badge[data-variant="navattic-tonal-default"] {
  --_radius: var(--ds-radius-sm);
  --_size: var(--ds-text-sm);
  --_case: none;
  --_tracking: 0;
  --_fill: var(--ds-surface-2);
  --_ink: var(--ds-ink);
  --_edge: transparent;
  --_glyph: var(--ds-ink-2);
  --_gap: var(--ds-space-1-5);
}

/* perplexity: ~24×14 inverse rect, caps — the single uppercase token on the page (their 8px is raised to xs) */
.ds-status-badge[data-variant="perplexity-pro-dark-caps"] {
  --_h: 16px;
  --_pad-x: var(--ds-space-1);
  --_radius: var(--ds-radius-xs);
  --_weight: var(--ds-weight-semibold);
  --_tracking: .06em;
  --_fill: var(--ds-surface-inverse);
  --_ink: var(--ds-ink-inverse);
  --_edge: transparent;
}

/* descript: "New" on the accent tint, pill, 12/500 sentence */
.ds-status-badge[data-variant="descript-new-tint-pill"] {
  --_radius: var(--ds-radius-pill);
  --_size: var(--ds-text-sm);
  --_case: none;
  --_tracking: 0;
  --_fill: var(--ds-accent-tint);
  --_ink: var(--ds-accent-ink);
  --_edge: transparent;
}

/* elevenlabs: two emphasis levels for one word — inverse pill "New" (the look) vs grey tag "New" (the note) */
.ds-status-badge[data-variant="elevenlabs-two-emphasis-levels"] {
  --_h: 22px;
  --_radius: var(--ds-radius-pill);
  --_size: var(--ds-text-sm);
  --_case: none;
  --_tracking: 0;
  --_pad-x: var(--ds-space-2);
  --_fill: var(--ds-surface-2);
  --_ink: var(--ds-ink-2);
  --_edge: transparent;
}
.ds-status-badge[data-variant="elevenlabs-two-emphasis-levels"][data-emphasis="inverse"] { --_fill: var(--ds-surface-inverse); --_ink: var(--ds-ink-inverse); }

/* vercel: 10px mono caps in a 1px INK box, r3, 2×4 padding, surface fill; inline after link text */
.ds-status-badge[data-variant="vercel-mono-boxed-new"] {
  --_h: 16px;
  --_pad-x: var(--ds-space-1);
  --_radius: var(--ds-radius-xs);
  --_tracking: .06em;
  --_fill: var(--ds-surface);
  --_ink: var(--ds-ink);
  --_edge: var(--ds-ink);
  font-family: var(--ds-font-mono);
  margin-inline-start: var(--ds-space-2);
}

/* attio: hairline capsule with a leading glyph — Completed / Triggered (check) · Running / Live (dot) */
.ds-status-badge[data-variant="attio-status-chip-vocabulary"] {
  --_h: 22px;
  --_radius: var(--ds-radius-pill);
  --_size: var(--ds-text-sm);
  --_case: none;
  --_tracking: 0;
  --_gap: var(--ds-space-1-5);
  --_pad-x: var(--ds-space-2);
  --_fill: var(--ds-surface);
  --_ink: var(--ds-ink-2);
  --_edge: var(--ds-rule);
}

/* plane: no box; a 14px ring glyph whose stroke style is the state + a 14px sentence-case label */
.ds-status-badge[data-variant="plane-state-ring"] {
  --_h: 20px;
  --_pad-x: 0px;
  --_size: var(--ds-text-md);
  --_weight: var(--ds-weight-medium);
  --_case: none;
  --_tracking: 0;
  --_gap: var(--ds-space-2);
  --_fill: transparent;
  --_edge: transparent;
  --_ink: var(--ds-ink);
  --_glyph: var(--ds-ink-muted);
}
.ds-status-badge[data-variant="plane-state-ring"][data-tone="warning"] { --_glyph: var(--ds-warning); }
.ds-status-badge[data-variant="plane-state-ring"][data-tone="success"] { --_glyph: var(--ds-success); }

/* oku: 64×24 r4 ACCENT fill, 11px bold caps +.05em, 12px padding — the page's only accent use */
.ds-status-badge[data-variant="oku-premium-accent-pill"] {
  --_h: 24px;
  --_pad-x: var(--ds-space-3);
  --_weight: var(--ds-weight-bold);
  --_tracking: .05em;
  --_fill: var(--ds-accent);
  --_ink: var(--ds-ink-on-accent);
  --_edge: transparent;
}

/* manychat: 10px accent pill overlapping the avatar with a 2px surface ring (place it in avatar's __badge slot) */
.ds-status-badge[data-variant="manychat-trial-on-avatar"] {
  --_h: 16px;
  --_pad-x: var(--ds-space-1-5);
  --_radius: var(--ds-radius-pill);
  --_weight: var(--ds-weight-bold);
  --_tracking: .04em;
  --_fill: var(--ds-accent);
  --_ink: var(--ds-ink-on-accent);
  --_edge: var(--ds-surface);
  border-width: 2px;
}

/* =========================================================================
   STATES
   ========================================================================= */
/* loading: a skeleton pill of the label's width (or 48px when empty); label hidden, no edge */
.ds-status-badge[aria-busy="true"] {
  --_fill: var(--ds-skeleton);
  --_edge: transparent;
  color: transparent;
  min-inline-size: 48px;
}
.ds-status-badge[aria-busy="true"] > * { visibility: hidden; }

/* ds/components/suggestion-chips.css */
/* ============================================================================
   suggestion-chips — Suggestion / example chip row              (taxonomy §I · common · S0)
   Root: .ds-suggestion-chips — a <div role="group" aria-label> (or <ul>) holding ONE optional non-interactive
     __label chip ("Try asking ↵") and N __chip <button>s. Pressing a chip INSERTS its text into the composer
     (it never submits). The row hides while an attached list is open (J2 rule 4) — the composer sets it.
   Parts: __label (leading heading chip, inert) · __chip (<button>) · __icon (16 stroke glyph) · __emoji (native
          emoji lane, [data-emoji] policy) · __text · __rule (origin: the mono label's hairline) · __question
          (origin: the 26px first-person question) · __cta (origin: the full-width outline pill — compose
          .ds-button-secondary[data-variant="outlined-mono-caps-pill"] or use the local part) · __empty (dashed footprint)
   Axes:  data-align="start|center"          start under an app composer (house) · centred under a hero (perplexity)
          data-state="hidden|empty|loading"  hidden while the attached list is open · no suggestions yet · fetching
   Variants: jstov (unmarked — icon-led, start-aligned, 32 h, hairline one grade above perplexity's) ·
     perplexity-label-chip-plus-question-chips · origin-question-of-the-day-card ·
     sana-divided-prompt-rows (a hairline-divided LIST of full-width prompt rows, app mark + muted verb phrase + bold object)
   Private knobs: --_h --_gap --_radius --_edge --_fill --_ink
   Tokens only (tools/lint-tokens.mjs).
   ========================================================================== */

.ds-suggestion-chips svg[fill="none"] { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }

.ds-suggestion-chips {
  --_h:      var(--ds-control-h-sm);            /* 32 — one rung under the composer's 36 (rule 1)      */
  --_gap:    var(--ds-space-2);                 /* 8 (perplexity)                                      */
  --_radius: var(--ds-radius-pill);
  --_edge:   var(--ds-border);                  /* perplexity's ≈1.06:1 hairline is the weakness; --ds-border reads */
  --_fill:   var(--ds-surface);
  --_ink:    var(--ds-ink-2);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--_gap);
  min-width: 0;
  max-width: 100%;
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-list);
}
.ds-suggestion-chips[data-align="center"] { justify-content: center; }
.ds-suggestion-chips[data-align="start"]  { justify-content: flex-start; }
.ds-suggestion-chips[data-state="hidden"] { display: none; }

/* -- the inert label chip: a row heading, not an action ------------------------------------------ */
.ds-suggestion-chips__label {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1-5);
  min-height: var(--_h);
  padding-inline: var(--ds-space-1);
  color: var(--ds-ink-muted);
  font-weight: var(--ds-weight-medium);
  white-space: nowrap;
}
.ds-suggestion-chips__label svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); }

/* -- the chip: a button that inserts a prompt ---------------------------------------------------- */
.ds-suggestion-chips__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1-5);
  min-height: var(--_h);
  max-width: 100%;
  min-width: 0;
  padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) solid var(--_edge);
  border-radius: var(--_radius);
  background: var(--_fill);
  color: var(--_ink);
  font: inherit;
  font-size: var(--ds-text-sm);
  text-align: start;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), border-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-suggestion-chips__text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-suggestion-chips__icon { flex: none; display: inline-grid; place-items: center; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: var(--ds-ink-muted); }
.ds-suggestion-chips__icon svg { inline-size: 100%; block-size: 100%; }
.ds-suggestion-chips__emoji { flex: none; font-size: var(--ds-text-md); line-height: 1; }

.ds-suggestion-chips__chip:hover,
.ds-suggestion-chips__chip[data-state="hover"] { background: var(--ds-hover-bg); border-color: var(--ds-border-strong); color: var(--ds-ink); }
.ds-suggestion-chips__chip:hover .ds-suggestion-chips__icon { color: var(--ds-ink); }
.ds-suggestion-chips__chip:active,
.ds-suggestion-chips__chip[data-state="pressed"] { background: var(--ds-surface-2); }
.ds-suggestion-chips__chip:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-suggestion-chips__chip:disabled,
.ds-suggestion-chips__chip[aria-disabled="true"] { background: var(--ds-surface-3); border-color: var(--ds-rule); color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-suggestion-chips__chip:disabled .ds-suggestion-chips__icon { color: var(--ds-ink-faint); }
/* a chip that is fetching its prompt: skeleton text, keeps its footprint */
.ds-suggestion-chips__chip[aria-busy="true"] { pointer-events: none; color: transparent; }
.ds-suggestion-chips__chip[aria-busy="true"] .ds-suggestion-chips__text { border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); min-inline-size: 8em; }
.ds-suggestion-chips__chip[aria-busy="true"] .ds-suggestion-chips__icon { color: var(--ds-ink-faint); }

/* -- empty: a dashed footprint the size of one chip row, never blank (X-04) -------------------- */
.ds-suggestion-chips__empty {
  display: inline-flex;
  align-items: center;
  min-height: var(--_h);
  padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) dashed var(--ds-border);
  border-radius: var(--_radius);
  color: var(--ds-ink-muted);
  font-size: var(--ds-text-sm);
}

/* =========================================================================
   VARIANTS
   ========================================================================= */

/* perplexity-label-chip-plus-question-chips — "⇥ Try searching" label chip + emoji-led question chips, ground fill,
   hairline, 34 h, full radius, centred, wrapping to two rows [perplexity-asking-a-question-00-04] [-05-09] */
.ds-suggestion-chips[data-variant="perplexity-label-chip-plus-question-chips"] {
  --_fill: var(--ds-ground);
  --_edge: var(--ds-rule);                      /* as captured: near-invisible hairline; the emoji does the "object" work */
  --_ink: var(--ds-ink-2);
  justify-content: center;
}
.ds-suggestion-chips[data-variant="perplexity-label-chip-plus-question-chips"] .ds-suggestion-chips__chip { padding-inline: var(--ds-space-3); }

/* origin-question-of-the-day-card — mono caps label + rule → 26px first-person question → full-width outline
   "✦ ASK SIDEKICK" pill (64 h in the card) [origin-connecting-an-account-00-04] [origin-connecting-an-account-05-06] */
.ds-suggestion-chips[data-variant="origin-question-of-the-day-card"] {
  flex-direction: column;
  align-items: stretch;
  gap: var(--ds-space-4);
  padding: var(--ds-card-pad);
  border-radius: var(--ds-radius-lg);
  background: var(--ds-card-bg);
  border: var(--ds-border-width) solid var(--ds-card-border);
  box-shadow: var(--ds-card-shadow);
}
.ds-suggestion-chips[data-variant="origin-question-of-the-day-card"] .ds-suggestion-chips__label {
  min-height: 0;
  padding: 0 0 var(--ds-space-3);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-regular);
  letter-spacing: .12em;
  text-transform: uppercase;
  white-space: normal;
}
.ds-suggestion-chips__question {
  margin: 0;
  font-size: var(--ds-text-xl);
  font-weight: var(--ds-weight-regular);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink);
  text-wrap: balance;
}
.ds-suggestion-chips[data-variant="origin-question-of-the-day-card"] .ds-suggestion-chips__chip {
  --_h: var(--ds-control-h-lg);
  justify-content: center;
  gap: var(--ds-space-2);
  inline-size: 100%;
  border-color: var(--ds-border-strong);
  color: var(--ds-ink);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-sm);
  letter-spacing: .12em;
  text-transform: uppercase;
}
.ds-suggestion-chips[data-variant="origin-question-of-the-day-card"] .ds-suggestion-chips__chip .ds-suggestion-chips__icon { color: var(--ds-ink); }

/* sana-divided-prompt-rows — not chips at all: a column of full-width prompt ROWS under the composer, each divided
   by a hairline (top rule on every row, none at the bottom), an app / object mark in a 16 px lane, then a muted
   verb phrase with the OBJECT in medium ink ("Recap my <b>Teams</b> messages"); the last row is a quieter "···
   Connect your apps →" row. No label chip — the rows are self-evident. Hover tints the row, never lifts.
   [mobbin-sana-suggestion-chips] */
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] {
  --_h: calc(var(--ds-control-h-lg) + var(--ds-space-3));
  --_edge: var(--ds-rule);
  --_fill: transparent;
  --_ink: var(--ds-ink-muted);
  flex-direction: column;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: 0;
}
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip {
  gap: var(--ds-space-3);
  inline-size: 100%;
  padding-inline: var(--ds-space-3);
  border-width: var(--ds-border-width) 0 0;
  border-radius: 0;
  font-size: var(--ds-text-md);
}
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__text b { font-weight: var(--ds-weight-medium); color: var(--ds-ink-2); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__icon[data-hue="1"] { color: var(--ds-data-1); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__icon[data-hue="2"] { color: var(--ds-data-2); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__icon[data-hue="3"] { color: var(--ds-data-3); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__icon[data-hue="4"] { color: var(--ds-data-4); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__icon[data-hue="5"] { color: var(--ds-data-5); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip:is(:hover, [data-state="hover"]) { border-color: var(--ds-rule); background: var(--ds-hover-bg); color: var(--ds-ink-2); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip:is(:hover, [data-state="hover"]) .ds-suggestion-chips__text b { color: var(--ds-ink); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip:is(:focus-visible, [data-state="focus"]) { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-ring-width)); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip:disabled { border-color: var(--ds-rule); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip:disabled .ds-suggestion-chips__text b { color: var(--ds-ink-faint); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip[aria-busy="true"] .ds-suggestion-chips__text { min-inline-size: 16em; block-size: var(--ds-text-sm); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__chip[data-kind="more"] { font-size: var(--ds-text-sm); }
.ds-suggestion-chips__arrow { flex: none; display: inline-block; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); transition: transform var(--ds-dur-fast) var(--ds-ease-out); }
.ds-suggestion-chips__chip:is(:hover, [data-state="hover"]) .ds-suggestion-chips__arrow { transform: translateX(2px); }
.ds-suggestion-chips[data-variant="sana-divided-prompt-rows"] .ds-suggestion-chips__empty { border-radius: var(--ds-radius-sm); min-height: var(--_h); }

/* =========================================================================
   SIZE — chips read the ladder one rung under their composer
   ========================================================================= */
.ds-suggestion-chips[data-size="sm"] { --_h: var(--ds-space-7); font-size: var(--ds-text-xs); }
.ds-suggestion-chips[data-size="sm"] .ds-suggestion-chips__chip { font-size: var(--ds-text-xs); padding-inline: var(--ds-space-2-5); }
.ds-suggestion-chips[data-size="lg"] { --_h: var(--ds-control-h); }
.ds-suggestion-chips[data-size="lg"] .ds-suggestion-chips__chip { font-size: var(--ds-text-md); padding-inline: var(--ds-space-4); }

/* ds/components/text-link.css */
/* ============================================================================
   components/text-link/text-link.css — Text link / inline link (core · S1)
   Root `.ds-text-link` is the <a> itself. Two idioms, one each (the rule the
   taxonomy sets): data-kind="inline" (default — in running text: --ds-ink-link
   + soft underline) and data-kind="route" (a navigational "See more →": ink,
   no underline, trailing arrow); plus data-kind="danger" (the destructive text
   action: danger-ink, inline underline rules). Designer idioms stay as data-variant.
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_gap --_glyph.
   ========================================================================== */

.ds-text-link {
  --_gap:   var(--ds-space-1);
  --_glyph: 1em;                                   /* arrow / chevron scale with the text */
  display: inline;                                 /* wraps like text                         */
  color: var(--ds-ink-link);
  font: inherit;
  font-weight: inherit;
  text-decoration: underline;
  text-decoration-thickness: var(--ds-border-width);
  text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
  text-underline-offset: .18em;
  border-radius: var(--ds-radius-xs);              /* the ring follows this               */
  cursor: pointer;
  transition: color var(--ds-dur-fast) var(--ds-ease-standard),
              text-decoration-color var(--ds-dur-fast) var(--ds-ease-standard);
}
/* parts: an inline glyph after (→ › ↗) or before (G2 ›) the text */
.ds-text-link__glyph {
  display: inline-block;
  width: var(--_glyph);
  height: var(--_glyph);
  vertical-align: -.12em;
  margin-inline-start: var(--_gap);
  transition: transform var(--ds-dur-fast) var(--ds-ease-out);
}
.ds-text-link__glyph[data-slot="leading"] { margin-inline-start: 0; margin-inline-end: var(--_gap); }
.ds-text-link__glyph svg {
  width: 100%; height: 100%;
  fill: none; stroke: currentColor;
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}
.ds-text-link__label { }

/* ---- states ------------------------------------------------------------------ */
.ds-text-link:hover,
.ds-text-link[data-state="hover"] { text-decoration-color: currentColor; }
.ds-text-link:hover .ds-text-link__glyph:not([data-slot="leading"]) { transform: translateX(var(--ds-space-0-5)); }
.ds-text-link:focus-visible,
.ds-text-link[data-state="focus"] {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
  text-decoration-color: currentColor;
}
.ds-text-link:active { color: var(--ds-accent-hover); }
.ds-text-link[aria-current="page"],
.ds-text-link[aria-current="true"] { color: var(--ds-ink); font-weight: var(--ds-weight-medium); text-decoration: none; }
/* disabled link: no href, faint, no pointer — rare; prefer removing the link */
.ds-text-link[aria-disabled="true"] { color: var(--ds-ink-faint); text-decoration-color: currentColor; pointer-events: none; cursor: default; }
/* external: the ↗ glyph is content; nothing else changes */
.ds-text-link[data-external] .ds-text-link__glyph { vertical-align: -.05em; }

/* ---- kinds (the house rule: ONE inline idiom, ONE route idiom) -------------- */
/* route: ink, no underline, weight 500, trailing → ; a section "See more" or a nav item */
.ds-text-link[data-kind="route"] {
  display: inline-flex;
  align-items: center;
  color: var(--ds-ink);
  font-weight: var(--ds-weight-medium);
  text-decoration: none;
}
.ds-text-link[data-kind="route"]:hover,
.ds-text-link[data-kind="route"][data-state="hover"] { color: var(--ds-ink); text-decoration: underline; text-decoration-color: currentColor; }
.ds-text-link[data-kind="route"]:active { color: var(--ds-ink-2); }

/* danger: the destructive text action ("Delete account", "Remove") — --ds-danger-ink at rest, --ds-danger on
   hover, otherwise the inline rules (40 % underline → solid). Text only, never a red fill (R3); a danger
   action that needs a button footprint is button-secondary[data-variant="danger-text"]. (2026-09-20) */
.ds-text-link[data-kind="danger"] { color: var(--ds-danger-ink); }
.ds-text-link[data-kind="danger"]:hover,
.ds-text-link[data-kind="danger"][data-state="hover"] { color: var(--ds-danger); text-decoration-color: currentColor; }
.ds-text-link[data-kind="danger"]:active { color: var(--ds-danger); }

/* ============================================================================
   VARIANTS — each designer's idiom by name. Unmarked root = jstov: inline =
   --ds-ink-link + 40 % underline (the _base.css <a> convention), route =
   data-kind="route".
   ========================================================================== */

/* no-underline-coloured — accent, no underline at rest, underline on hover
   [descript-editing-profile-00-03] [grammarly-web-158-acordian] */
.ds-text-link[data-variant="no-underline-coloured"] { text-decoration: none; }
.ds-text-link[data-variant="no-underline-coloured"]:hover { text-decoration: underline; text-decoration-color: currentColor; }

/* underlined-ink — same colour as body, 1px underline, offset ~3px; affordance by underline
   alone [jasper-web-19] [oku-web-88] [intercom-3-830x8816] [braintrust-web-13] "View all jobs" */
.ds-text-link[data-variant="underlined-ink"] {
  color: var(--ds-ink);
  text-decoration-color: currentColor;
  text-underline-offset: .2em;
}
.ds-text-link[data-variant="underlined-ink"]:hover { color: var(--ds-ink-2); text-decoration-thickness: 2px; }

/* hue-plus-trailing-chevron — accent text + 8px gap + thin › in the same hue, no underline
   [sequence-section] "Take product tour ›", "G2 ›" (chevron before the stars) */
.ds-text-link[data-variant="hue-plus-trailing-chevron"] {
  --_gap: var(--ds-space-2);
  display: inline-flex;
  align-items: center;
  text-decoration: none;
}
.ds-text-link[data-variant="hue-plus-trailing-chevron"]:hover { color: var(--ds-accent-hover); }

/* arrow-suffix-route-link — "See more →": body ink, no underline, arrow suffix
   [oku-web-88] [braintrust-web-13] "Help Center ↗" */
.ds-text-link[data-variant="arrow-suffix-route-link"] {
  display: inline-flex;
  align-items: center;
  color: var(--ds-ink);
  text-decoration: none;
}
.ds-text-link[data-variant="arrow-suffix-route-link"]:hover { text-decoration: underline; text-decoration-color: currentColor; }

/* muted-underlined-in-system-text — inside a muted system line the link stays muted and
   is underlined; the reader knows it is a link without a colour jump [manychat-web-184] */
.ds-text-link[data-variant="muted-underlined-in-system-text"] {
  color: var(--ds-ink-muted);
  text-decoration-color: currentColor;
}
.ds-text-link[data-variant="muted-underlined-in-system-text"]:hover { color: var(--ds-ink); }

/* quiet-ink-cta — plain secondary ink, no underline, no glyph: scanners miss it (weakness
   kept as evidence) [confluence-web-23]. Hover restores an underline. */
.ds-text-link[data-variant="quiet-ink-cta"] {
  color: var(--ds-ink-2);
  text-decoration: none;
}
.ds-text-link[data-variant="quiet-ink-cta"]:hover { text-decoration: underline; text-decoration-color: currentColor; }

/* mono-caps-underlined — the label lane as a link: mono, uppercase, +0.12em, underlined
   [origin-connecting-an-account-05-06] "Direction", [heron-ai-830x5619] "BEARPLUS" */
.ds-text-link[data-variant="mono-caps-underlined"] {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--ds-ink);
  text-decoration-color: currentColor;
  text-underline-offset: .25em;
}
.ds-text-link[data-variant="mono-caps-underlined"]:hover { color: var(--ds-ink-2); }
/* a text link on a <button> (a reset / "clear" action): drop the UA button chrome so it matches the anchor (fix 2026-09-30) */
button.ds-text-link { padding: 0; border: 0; background: none; font: inherit; cursor: pointer; }

/* ds/components/wordmark-signoff.css */
/* ============================================================================
   components/wordmark-signoff/wordmark-signoff.css — Wordmark / signature sign-off
   taxonomy-components.md §K · niche · S2  ·  L-FOOT-03. OFF by default in the house (a slot, not a default).
   Root:  <div class="ds-wordmark-signoff" data-variant="…" data-fit="width|centred">  — between the link grid and the legal band
   Parts: __mark (the wordmark: text, or an inline <svg>) · __tick (heron's dimension ticks) · __glow (legend's light)
   Variants: jstov (unmarked = heron's construction outline) · klarna-full-bleed-wordmark · heron-construction-wordmark ·
             legend-mark-as-light-source
   Tokens only. Private knobs: --_fit (cqi per glyph) · --_h · --_chars
   ========================================================================== */
.ds-wordmark-signoff {
  --_chars: 10;                                    /* glyph count of the mark — sets the width-fit size */
  --_fit: calc(100cqi / var(--_chars) * 1.55);     /* ≈ full container width for a grotesk at cap-height ratio */
  --_h: var(--ds-space-24);
  position: relative;
  container-type: inline-size;
  display: grid;
  place-items: center;
  min-height: var(--_h);
  padding: var(--ds-space-6) var(--ds-gutter-page);
  overflow: hidden;
  color: var(--ds-ink);
  min-width: 0;
}
.ds-wordmark-signoff svg[fill="none"] { fill: none; stroke: currentColor; }
.ds-wordmark-signoff__mark {
  margin: 0;
  font-family: var(--ds-font-display);
  font-size: var(--_fit);
  font-weight: var(--ds-weight-bold);
  letter-spacing: var(--ds-display-tracking);
  line-height: 1;
  white-space: nowrap;
  user-select: none;
}
/* house / heron — the wordmark as construction geometry: outline strokes, dimension ticks, a crop-marked row */
.ds-wordmark-signoff:not([data-variant]) .ds-wordmark-signoff__mark,
.ds-wordmark-signoff[data-variant="heron-construction-wordmark"] .ds-wordmark-signoff__mark {
  color: transparent;
  -webkit-text-stroke: var(--ds-border-width) var(--ds-line-art);
  paint-order: stroke;
}
.ds-wordmark-signoff:not([data-variant]),
.ds-wordmark-signoff[data-variant="heron-construction-wordmark"] { border-block: var(--ds-border-width) solid var(--ds-rule); padding-block: var(--ds-space-10); }
.ds-wordmark-signoff__tick { position: absolute; inset-inline: var(--ds-gutter-page); block-size: 1px; background: var(--ds-line-art); pointer-events: none; }
.ds-wordmark-signoff__tick[data-edge="top"]    { inset-block-start: var(--ds-space-4); }
.ds-wordmark-signoff__tick[data-edge="bottom"] { inset-block-end: var(--ds-space-4); }
.ds-wordmark-signoff__tick::before, .ds-wordmark-signoff__tick::after { content: ""; position: absolute; inset-block-start: -3px; inline-size: 1px; block-size: 7px; background: var(--ds-line-art); }
.ds-wordmark-signoff__tick::before { inset-inline-start: 0; } .ds-wordmark-signoff__tick::after { inset-inline-end: 0; }
/* klarna — width-fitted solid wordmark on the inverse band, cropped by the band's bottom edge */
.ds-wordmark-signoff[data-variant="klarna-full-bleed-wordmark"] { background: var(--ds-surface-inverse); color: var(--ds-ink-inverse); padding-block: var(--ds-space-8) 0; align-items: end; --_h: var(--ds-space-20); }
.ds-wordmark-signoff[data-variant="klarna-full-bleed-wordmark"] .ds-wordmark-signoff__mark { margin-block-end: -0.18em; }
/* legend — a 182 px mark centred in an empty band (≈ 2.5× the mark), the mark lighting the scene */
.ds-wordmark-signoff[data-variant="legend-mark-as-light-source"] { --_h: 320px; background: var(--ds-surface-inverse); color: var(--ds-ink-inverse); }
.ds-wordmark-signoff[data-variant="legend-mark-as-light-source"] .ds-wordmark-signoff__mark { font-size: 0; inline-size: 128px; block-size: 128px; }
.ds-wordmark-signoff__glow { position: absolute; inset: 0; background: radial-gradient(circle at 50% 50%, var(--ds-texture-color), transparent 35%); pointer-events: none; }
/* the SVG form of __mark (2026-09-20, L-FOOT-03 recipe): a brand asset inside __mark fits the container width like the
   text form; in the outline variants it is drawn with the same --ds-line-art stroke (the text form's colour is transparent,
   so currentColor alone would vanish). Legend's 128 px mark keeps its box (the rule fills it). */
.ds-wordmark-signoff__mark > svg { display: block; inline-size: 100%; block-size: auto; }
.ds-wordmark-signoff:not([data-variant]) .ds-wordmark-signoff__mark > svg,
.ds-wordmark-signoff[data-variant="heron-construction-wordmark"] .ds-wordmark-signoff__mark > svg { fill: none; stroke: var(--ds-line-art); stroke-width: var(--ds-border-width); }

/* ds/sections/l-nav-01-marketing-top-nav.css */
/* ============================================================================
   patterns/sections/l-nav-01-marketing-top-nav.css
   L-NAV-01 · Marketing top nav · core
   Root <div class="ds-sec-l-nav-01-marketing-top-nav" data-variant="jstov | vercel-button-trio | attio-dual-cta |
        intercom-dual-cta | fibery-cta-trio | synara-three-cluster-outlined-cta | heron-table-nav | luma-transparent-app-nav"
        [data-sticky] [data-scrolled]>
   Everything visible is components/marketing-nav composed by its ROOT class; the wrapper is the page's first row.
   NO section gap: a nav sits flush under the viewport edge and against the hero (separation = nothing or the nav's
   own 1 px rule). What the wrapper adds instead:
     data-sticky   — position: sticky at the top of the page, --ds-z-sticky.
     data-scrolled — the scrolled state (open question 3 of the taxonomy: no reference defines one): the wrapper
                     paints --ds-ground at 88 % + a backdrop blur (--ds-glass-blur) + one hairline. A page's scroll
                     script toggles the attribute past --ds-topbar-h of scroll; CSS only, the composed nav is untouched.
                     Variants whose resting nav already draws a bottom rule (jstov, attio) keep that rule and the
                     wrapper draws none, so the scrolled bar never shows two lines.
   Tokens only. Private knobs: --_ground-alpha (scrolled opacity, 88 %).
   ========================================================================== */

.ds-sec-l-nav-01-marketing-top-nav {
  --_ground-alpha: 88%;
  position: relative;
  min-width: 0;
  padding: 0;                                                        /* the one section with no --ds-section-gap */
  color: var(--ds-ink);
}
.ds-sec-l-nav-01-marketing-top-nav > .ds-marketing-nav { width: 100%; }   /* placement of the composed root only */

/* sticky: the page decides; in flow by default */
.ds-sec-l-nav-01-marketing-top-nav[data-sticky] {
  position: sticky;
  inset-block-start: 0;
  z-index: var(--ds-z-sticky);
}

/* scrolled: 88 % ground + blur + one hairline; the resting bar is transparent (7/9 references) */
.ds-sec-l-nav-01-marketing-top-nav[data-scrolled] {
  background: color-mix(in srgb, var(--ds-ground) var(--_ground-alpha), transparent);
  -webkit-backdrop-filter: blur(var(--ds-glass-blur));
  backdrop-filter: blur(var(--ds-glass-blur));
  transition: background-color var(--ds-dur-base) var(--ds-ease-standard);
}
.ds-sec-l-nav-01-marketing-top-nav[data-scrolled]:not([data-variant="jstov"]):not([data-variant="attio-dual-cta"]) {
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}

/* ds/sections/l-foot-01-sitemap-footer.css */
/* ============================================================================
   patterns/sections/l-foot-01-sitemap-footer.css
   L-FOOT-01 · Sitemap grid footer · core
   Root <div class="ds-sec-l-foot-01-sitemap-footer" data-variant="jstov | sequence-conversion-card |
        klarna-wordmark-monument | rox-engineering-grid | vercel-sitemap-badges | heron-table-footer |
        intercom-mono-labelled | attio-mega | fibery-proof-rail">
   CHROME — the one landing region with NO --ds-section-gap: a footer sits flush against whatever closed the page
   (the CTA band, the last chapter's seam) and the page ends on its legal row / terminator / rails. Everything
   visible is components/footer composed by ROOT class (.ds-footer[data-variant][data-headings][data-legal]);
   the composed <footer> carries the contentinfo landmark, its own container (--_max), gutters and ground, so
   this root has no padding, no container and no gap — it is the page-rhythm wrapper (l-nav-01's approach).
   What the wrapper adds:
     __signoff — the optional L-FOOT-03 slot (signoff_html) between the link grid and the legal band (house);
                 the composed .ds-wordmark-signoff inside it is full-bleed by design, so the slot only sets rhythm.
     data-labels / data-density on the root — the heron block sets data-labels="upper" (its cell labels are
                 the label lane), the intercom block data-density="compact" (its 27 px pitch); page attributes win.
   Rhythm knob: --_gap-start (default 0). A page whose last content section carries no bottom gap of its own may set
     --_gap-start: var(--ds-section-gap) inline on the root; the house footer's own top padding (space-16) is the
     usual separation.
   Tokens only. Private knobs: --_gap-start --_signoff-gap
   ========================================================================== */

.ds-sec-l-foot-01-sitemap-footer {
  --_gap-start: 0px;                                                /* chrome: no section gap (the footer's own padding is the pitch) */
  --_signoff-gap: var(--ds-space-10);                               /* grid → sign-off slot → rule (klarna 104 ≈ space-24 on 8 px; house one gap) */
  position: relative;
  padding: 0;
  padding-block-start: var(--_gap-start);
  min-width: 0;
  color: var(--ds-ink);
}
.ds-sec-l-foot-01-sitemap-footer > .ds-footer { width: 100%; }        /* placement of the composed root only */

/* the L-FOOT-03 slot: a composed .ds-wordmark-signoff (or a brand SVG) between the grid and the legal band */
.ds-sec-l-foot-01-sitemap-footer__signoff {
  margin-block-start: var(--_signoff-gap);
  min-width: 0;
}
.ds-sec-l-foot-01-sitemap-footer__signoff > * { max-width: 100%; }

/* ds/sections/l-cta-03-colour-band.css */
/* ============================================================================
   patterns/sections/l-cta-03-colour-band.css
   L-CTA-03 · Colour band (scarce) · common
   Root <section class="ds-sec ds-sec-l-cta-03-colour-band"
                 data-variant="jstov | fibery-blue-dotted-band | fibery-peach-trapezoid | fibery-boxed-support-panel |
                               attio-light-dark-chapter-inversion | intercom-cream-chapter-band"
                 [data-mode="dark"] [data-band="tint | accent-tint | warm | accent"] [data-texture="dot"]
                 [data-ornament="rails | corner-marks | trapezoid"]>
   A BAND WRAPPER: the root paints ONE full-bleed ground and holds any recipe’s inner in its raw-HTML `content` slot. It
   never styles what is inside — the slot's chapter-header, cards and buttons read their own tokens, which the island /
   band remaps. Grounds:
     data-mode="dark"        --ds-ground under the dark remap (CONTRACT §5.3–5.4 — a re-derive host: cards, buttons,
                             rules all flip; a themed page needs the theme's descendant [data-mode="dark"] block to keep
                             its accent, else base's neutral dark shows)
     data-band="tint"   one plane step (intercom cream; the contract band)  ·  "accent-tint" the accent tint (fibery blue)  ·  "warm" the
                             data-6 tint (fibery peach)  ·  "accent" paints --ds-ground and expects a THEME band block
                             (every theme via base, quicktunnels hand-tuned); data-band IS a re-derive host since batch 12 — every
                             band here is a near-ground tint that ink reads on.
   Rhythm: --_band-pad = 1.5 × the theme's --ds-section-gap (Attio 120–160 / Intercom 15–20 u / Fibery 96–128 against
   the house 56–64 gap); _base.css keeps both paddings around a band / island, so content never touches an edge.
   Ornament (skin, off unless the attribute is set): rails (the page frame's 1 px lines at --_rail-inset running through
   the island) · corner-marks (four 6 px squares at the container's corners, colour bound to the ground) · trapezoid
   (fibery's clipped top corners: a clip-path on the root, --_slant wide × --_slant-h tall).
   Section-local parts: __inner · __panel (the boxed island) · __pair (the demo's two-card row — a slot helper any
     content may reuse)
   Composes nothing itself; the demo slot composes chapter-header · card · button-primary · button-secondary.
   Tokens only. Private knobs: --_gap --_band-pad --_dot-pitch --_rail-inset --_mark --_slant --_slant-h --_panel-pad
   ========================================================================== */

.ds-sec-l-cta-03-colour-band {
  --_gap:        var(--ds-section-gap);
  --_band-pad:   calc(var(--_gap) * 1.5);                       /* the band's own breathing room */
  --_dot-pitch:  var(--ds-space-4);                             /* fibery dotted halftone */
  --_rail-inset: var(--ds-space-6);                             /* attio rails 24 px in from the edge */
  --_mark:       6px;                                           /* intercom registration mark */
  --_slant:      var(--ds-space-12);                            /* fibery trapezoid: 48 px in … */
  --_slant-h:    var(--ds-space-8);                             /* … over 32 px down */
  --_panel-pad:  var(--ds-space-8);                             /* fibery boxed panel 32 */
  position: relative;
  padding-block: var(--_band-pad);
  padding-inline: var(--ds-gutter-page);
  color: var(--ds-ink);
  min-width: 0;
}
.ds-sec-l-cta-03-colour-band__inner {
  position: relative;
  width: 100%;
  max-width: var(--ds-container-max);
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-10);                                      /* head → content (C-01: 6–10 units) */
  min-width: 0;
}
.ds-sec-l-cta-03-colour-band__inner > * { min-width: 0; }

/* ---- grounds ------------------------------------------------------------------------------------------- */
.ds-sec-l-cta-03-colour-band[data-mode="dark"]        { background: var(--ds-ground); }
.ds-sec-l-cta-03-colour-band[data-band="tint"]        { background: var(--ds-ground); }      /* base remaps --ds-ground to surface-2 inside a tint band (CONTRACT §3) */
.ds-sec-l-cta-03-colour-band[data-band="accent-tint"]        { background: var(--ds-accent-tint); }
.ds-sec-l-cta-03-colour-band[data-band="warm"]        { background: var(--ds-data-6-tint); }
.ds-sec-l-cta-03-colour-band[data-band="accent"]      { background: var(--ds-ground); }      /* base's generic accent band (every theme; quicktunnels hand-tunes its own) */
.ds-sec-l-cta-03-colour-band[data-texture="dot"] {
  background-image: radial-gradient(circle, var(--ds-texture-color) 1px, transparent 1.5px);
  background-size: var(--_dot-pitch) var(--_dot-pitch);
  background-position: center;
}

/* house: the seam is the divider — one hairline top and bottom (the island's own rule colour) */
.ds-sec-l-cta-03-colour-band[data-variant="jstov"] { border-block: var(--ds-border-width) solid var(--ds-rule); }

/* ---- ornament (skin; nothing paints unless the attribute is present) ------------------------------------ */
/* rails: the page frame continues through the chapter */
.ds-sec-l-cta-03-colour-band[data-ornament="rails"]::before,
.ds-sec-l-cta-03-colour-band[data-ornament="rails"]::after {
  content: "";
  position: absolute;
  inset-block: 0;
  inline-size: var(--ds-border-width);
  background: var(--ds-rule);
  pointer-events: none;
}
.ds-sec-l-cta-03-colour-band[data-ornament="rails"]::before { inset-inline-start: var(--_rail-inset); }
.ds-sec-l-cta-03-colour-band[data-ornament="rails"]::after  { inset-inline-end: var(--_rail-inset); }
/* corner marks: four squares at the container's corners, in the ground's rule colour */
.ds-sec-l-cta-03-colour-band[data-ornament="corner-marks"] .ds-sec-l-cta-03-colour-band__inner {
  padding: var(--ds-space-6);
  background:
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) left top    / var(--_mark) var(--_mark) no-repeat,
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) right top   / var(--_mark) var(--_mark) no-repeat,
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) left bottom / var(--_mark) var(--_mark) no-repeat,
    linear-gradient(var(--ds-rule-strong), var(--ds-rule-strong)) right bottom / var(--_mark) var(--_mark) no-repeat;
}
/* trapezoid: fibery's clipped top corners; the content gets the slant's height as extra headroom */
.ds-sec-l-cta-03-colour-band[data-ornament="trapezoid"] {
  clip-path: polygon(0 100%, 0 var(--_slant-h), var(--_slant) 0, calc(100% - var(--_slant)) 0, 100% var(--_slant-h), 100% 100%);
  padding-block-start: calc(var(--_band-pad) + var(--_slant-h));
}

/* ---- the boxed panel: a dark island on the container ---------------------------------------------------- */
.ds-sec-l-cta-03-colour-band__panel {
  background: var(--ds-ground);
  color: var(--ds-ink);
  border-radius: var(--ds-radius-lg);
  padding: var(--_panel-pad);
  min-width: 0;
}

/* ---- the demo's slot helper: a pair of composed cards (any content may reuse it) ------------------------ */
.ds-sec-l-cta-03-colour-band__pair {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
  gap: var(--ds-space-6);
  min-width: 0;
}
.ds-sec-l-cta-03-colour-band__pair > * { min-width: 0; }


/* site/src/site.css */
/* combo (Dishes of London, round 2): self-hosted faces (latin subset from Google Fonts, in ../combo/fonts).
   Family names match the dishesof theme's stacks; no other font literal appears below. */
@font-face { font-family: "Archivo"; src: url("/assets/fonts/archivo.woff2") format("woff2"); font-weight: 100 900; font-stretch: 62% 125%; font-display: block; }
@font-face { font-family: "Albert Sans"; src: url("/assets/fonts/albert-sans.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Albert Sans"; src: url("/assets/fonts/albert-sans-italic.woff2") format("woff2"); font-weight: 100 900; font-style: italic; font-display: swap; }
@font-face { font-family: "JetBrains Mono"; src: url("/assets/fonts/jetbrains-mono.woff2") format("woff2"); font-weight: 100 800; font-display: swap; }

/* Layout glue + motion only. Tokens only. Durations x --ds-motion-scale; ambient loops read --ds-ambient-play.
   Content is complete at rest: the home map is server-rendered at Sunday 13:00 with the Sunday menus lit; the
   riffling index only shows while the hero script runs (it is the map's loading state). Reveals hide only once
   the script has run (.x-js); stills (navigator.webdriver without ?motion) and reduced motion keep the settled state. */
:root {
  --_x-out: cubic-bezier(.16, 1, .3, 1);
  --_x-step: calc(80ms * var(--ds-motion-scale));
  --_x-dur: calc(600ms * var(--ds-motion-scale));
  --_x-fast: calc(240ms * var(--ds-motion-scale));
  --_x-rule: max(3px, .06em);
  --_x-w: 800;
  --_x-track: -0.01em;
}
html { color-scheme: light; }
@media (prefers-color-scheme: dark) { html:not([data-mode="light"]) { color-scheme: dark; } }
html[data-mode="dark"] { color-scheme: dark; }
body { background: var(--ds-ground); color: var(--ds-ink); font-variant-numeric: lining-nums; }
svg[fill="none"] { fill: none; }
html { scroll-padding-top: calc(var(--ds-topbar-h) + var(--ds-space-6)); }
.x-mono { font-family: var(--ds-font-mono); font-variant-numeric: tabular-nums; }
.x-nav { position: sticky; inset-block-start: 0; z-index: var(--ds-z-sticky); background: var(--ds-ground); border-block-end: var(--ds-border-width) solid var(--ds-rule-strong); }

/* ---------------------------------------------------------------- type */
.x-h1 { margin: 0; font-family: var(--ds-font-display); font-weight: var(--ds-weight-bold); font-stretch: 70%; letter-spacing: var(--_x-track); line-height: var(--ds-lh-tight); color: var(--ds-ink); text-wrap: balance; }
.x-h1--hero { font-size: clamp(46px, 5.2vw, 80px); }
.x-h1--page { font-size: clamp(52px, 8.2vw, 128px); }
.x-h1--check { font-size: clamp(54px, 10vw, 112px); }
.x-h2 { margin: 0 0 var(--ds-space-4); font-family: var(--ds-font-display); font-stretch: 72%; font-size: clamp(32px, 4vw, 48px); font-weight: var(--_x-w); letter-spacing: var(--_x-track); line-height: var(--ds-lh-tight); color: var(--ds-ink); }
.x-h3 { margin: 0 0 var(--ds-space-4); font-family: var(--ds-font-display); font-stretch: 78%; font-size: var(--ds-text-2xl); font-weight: var(--ds-heading-weight); letter-spacing: var(--ds-heading-tracking); line-height: var(--ds-lh-heading); color: var(--ds-ink); }
.x-eyebrow { margin: 0 0 var(--ds-space-4); font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); }
.x-note { margin: var(--ds-space-3) 0 0; font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); color: var(--ds-ink-muted); max-inline-size: var(--ds-measure); }
.x-note--ink { color: var(--ds-ink-2); }
.x-k { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-bold); color: var(--ds-ink-muted); margin-inline-end: var(--ds-space-1); }
.x-src { font-size: var(--ds-text-sm); }
.x-checked { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); white-space: nowrap; }
.x-crumbs { margin-block-end: var(--ds-space-5); }
.x-signoff { margin-block: var(--ds-space-10) 0; color: var(--ds-ink); }
.x-signoff__city { color: var(--ds-accent); }

/* ---------------------------------------------------------------- reveals */
.x-js:not([data-still]) [data-reveal] { transition: opacity var(--_x-dur) var(--ds-ease-out), transform var(--_x-dur) var(--_x-out); transition-delay: calc(var(--_d, 0) * var(--_x-step)); }
.x-js:not([data-still]) [data-reveal="up"]:not([data-in]) { opacity: 0; transform: translate3d(0, 16px, 0); }
@media (prefers-reduced-motion: reduce) { [data-reveal] { transition: none !important; opacity: 1 !important; transform: none !important; } }

/* ---------------------------------------------------------------- sections */
.x-sec { padding-block: var(--ds-space-16); border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); }
.x-sec--tight { padding-block: var(--ds-space-10); border-block-start: 0; }
.x-sec--flush { border-block-start: 0; padding-block: var(--ds-space-2) var(--ds-space-6); }
.x-sec--band { background: var(--ds-ground-2); }
.x-chap { margin-block-end: var(--ds-space-10); }
.x-two { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 7fr); gap: var(--ds-space-12); align-items: start; }
.x-two--even { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
@media (max-width: 900px) { .x-two, .x-two--even { grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-8); } .x-sec { padding-block: var(--ds-space-12); } }
.x-narrow { max-inline-size: 46rem; margin-inline: auto; }

/* ---------------------------------------------------------------- the dish line: name ..... price (site-wide) */
.x-lines { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ds-space-4); }
.x-line { display: grid; grid-template-columns: minmax(0, auto) minmax(var(--ds-space-4), 1fr) auto; column-gap: var(--ds-space-2); align-items: last baseline; }
.x-line[hidden] { display: none; }
.x-line__name { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-semibold); line-height: var(--ds-lh-heading); color: var(--ds-ink); text-wrap: pretty; }
.x-line__dots { align-self: end; block-size: 1px; margin-block-end: .34em; border-block-end: 2px dotted var(--ds-border-strong); min-inline-size: var(--ds-space-4); }
.x-line__price { font-family: var(--ds-font-mono); font-variant-numeric: tabular-nums; font-weight: var(--ds-weight-bold); font-size: var(--ds-text-md); color: var(--ds-ink); white-space: nowrap; }
.x-line__price small { font-weight: var(--ds-weight-regular); color: var(--ds-ink-muted); }
.x-line__sub { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-2) var(--ds-space-3); margin-block-start: var(--ds-space-1); }
.x-line__ing { font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); color: var(--ds-ink-muted); max-inline-size: 62ch; }
.x-lines--card { gap: var(--ds-space-3); }
.x-lines--card .x-line__name, .x-lines--tight .x-line__name { font-size: var(--ds-text-md); }
.x-lines--tight { gap: var(--ds-space-2-5); }
.x-diet { display: inline-flex; flex-wrap: wrap; gap: var(--ds-space-2); align-items: center; }
.x-diet__group { display: inline-flex; gap: var(--ds-space-1); align-items: center; }
.x-diet .ds-status-badge, .x-dietkey .ds-status-badge { font-family: var(--ds-font-mono); }
.x-diet__ours { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); margin-inline-end: var(--ds-space-1); }
.x-dietkey { display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-6); align-items: center; margin: var(--ds-space-5) 0; font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.x-dietkey__item { display: inline-flex; align-items: center; gap: var(--ds-space-2); }
.x-dietkey__codes { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-allergy { margin-block: var(--ds-space-5) 0; }
.x-trust { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-2) var(--ds-space-3); margin: 0; font-size: var(--ds-text-sm); }
.x-trustbadge { font-family: var(--ds-font-mono); }

/* ---------------------------------------------------------------- home hero */
.x-hero { padding-block: var(--ds-space-8) var(--ds-space-12); }
.x-hero__grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: var(--ds-space-8) var(--ds-space-10); align-items: start; }
.x-hero__main { display: grid; gap: var(--ds-space-5); align-content: start; padding-block-start: var(--ds-space-2); }
.x-hero__main .x-eyebrow { margin: 0; }
.x-hero__lede { margin: 0; font-size: var(--ds-text-lg); line-height: var(--ds-lh-prose); color: var(--ds-ink-2); max-inline-size: 46ch; }
.x-find { display: grid; gap: var(--ds-space-2); margin-block-start: var(--ds-space-2); }
.x-find__label { font-family: var(--ds-font-display); font-stretch: 78%; font-weight: var(--ds-heading-weight); font-size: var(--ds-text-xl); letter-spacing: var(--ds-heading-tracking); color: var(--ds-ink); }
.x-find__row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--ds-space-2); }
.x-find__go { justify-content: center; }
.x-chips { margin-block-start: var(--ds-space-2); }

/* the night panel: one frame that starts as the riffling dish index and hands over to the map */
.x-now { position: relative; min-inline-size: 0; border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-lg); background: var(--ds-surface); color: var(--ds-ink); overflow: hidden; isolation: isolate; }
.x-map { position: relative; block-size: clamp(400px, calc(100svh - var(--ds-topbar-h) - 340px), 560px); isolation: isolate; }
.x-map__sky { position: absolute; inset: 0; z-index: -1; background-color: var(--_sky, var(--ds-data-1-tint)); -webkit-mask-image: linear-gradient(to bottom, var(--ds-ink) 0%, transparent 80%); mask-image: linear-gradient(to bottom, var(--ds-ink) 0%, transparent 80%); transition: background-color calc(900ms * var(--ds-motion-scale)) ease; }
.x-now[data-part="morning"] .x-map__sky { --_sky: var(--ds-data-6-tint); }
.x-now[data-part="midday"] .x-map__sky { --_sky: var(--ds-data-5-tint); }
.x-now[data-part="evening"] .x-map__sky { --_sky: var(--ds-data-2-tint); }
.x-now[data-part="night"] .x-map__sky { --_sky: var(--ds-data-1-tint); }
.x-map__geo { position: absolute; inset: var(--ds-space-4) var(--ds-space-4) var(--ds-space-4) 25%; }
.x-map__svg { display: block; inline-size: 100%; block-size: 100%; overflow: visible; }
.x-map__griddot { fill: var(--ds-rule-strong); opacity: .5; }
.x-map__borough { font-family: var(--ds-font-display); font-stretch: 70%; font-weight: var(--ds-weight-bold); font-size: 30px; letter-spacing: .04em; text-transform: uppercase; fill: var(--ds-ink-faint); paint-order: stroke; stroke: var(--ds-surface); stroke-width: 5px; stroke-linejoin: round; pointer-events: none; }
/* geography under the dots: faint, rule / ink-faint tokens only (raspberry stays for serving dots) */
.x-geo { pointer-events: none; }
.x-geo__boro { fill: var(--ds-ink-faint); fill-opacity: .07; stroke: var(--ds-rule-strong); stroke-width: 1.2; stroke-linejoin: round; stroke-dasharray: 5 4; }
.x-geo__thames, .x-geo__lea, .x-geo__canal { fill: none; stroke: var(--ds-ink-faint); stroke-linecap: round; stroke-linejoin: round; }
.x-geo__thames { stroke-width: 7; stroke-opacity: .32; }
.x-geo__lea { stroke-width: 2.6; stroke-opacity: .4; }
.x-geo__canal { stroke-width: 1.4; stroke-opacity: .5; stroke-dasharray: 6 3; }
.x-map__credit { margin: 0; font-family: var(--ds-font-mono); font-size: calc(var(--ds-text-xs) * .85); line-height: 1.4; color: var(--ds-ink-muted); }
.x-band__map .x-map__credit { padding-inline: var(--ds-space-2); }
.x-map__key .x-map__credit { max-inline-size: 46ch; }
.x-map__hood { font-family: var(--ds-font-mono); font-size: 13px; font-weight: var(--ds-weight-medium); fill: var(--ds-ink-2); paint-order: stroke; stroke: var(--ds-surface); stroke-width: 4px; stroke-linejoin: round; pointer-events: none; }
.x-map__scale path, .x-map__north path { stroke: var(--ds-ink-muted); stroke-width: 1.2; fill: none; }
.x-map__north path { fill: var(--ds-ink-muted); stroke: none; }
.x-map__scale text, .x-map__north text { font-family: var(--ds-font-mono); font-size: 12px; fill: var(--ds-ink-muted); }
.x-dot__core, .x-dot__halo { transform-box: fill-box; transform-origin: center; transition: fill var(--_x-fast) ease, stroke var(--_x-fast) ease, transform var(--_x-fast) var(--_x-out), opacity var(--_x-fast) ease; }
.x-dot__core { fill: var(--ds-ink-faint); stroke: var(--ds-surface); stroke-width: 1.5; transform: scale(.62); }
.x-dot__halo { fill: var(--ds-data-5); opacity: 0; transform: scale(.3); }
.x-dot[data-state="open"] .x-dot__core { fill: var(--ds-surface); stroke: var(--ds-data-5); stroke-width: 2.4; transform: scale(.9); }
.x-dot[data-state="serve"] .x-dot__core { fill: var(--ds-data-5); stroke: var(--ds-surface); stroke-width: 1.5; transform: scale(1.12); }
.x-dot[data-state="serve"] .x-dot__halo { opacity: .2; transform: scale(1); animation: x-halo 2.6s ease-out infinite; animation-delay: calc(var(--_k, 0) * -170ms); animation-play-state: var(--ds-ambient-play); }
@keyframes x-halo { 0% { opacity: .32; transform: scale(.55); } 100% { opacity: 0; transform: scale(1.35); } }
[data-still] .x-dot[data-state="serve"] .x-dot__halo { animation: none; opacity: .2; transform: scale(1); }
.x-dot[data-match="0"], .x-dot[data-dim] { opacity: .16; }
.x-dot[data-match="0"] .x-dot__halo { animation: none; opacity: 0; }
.x-dot.is-hot { opacity: 1; }
.x-dot__a { cursor: pointer; outline: none; }
.x-dot__hit { fill: transparent; stroke: none; }
.x-dot__halo { pointer-events: none; }
.x-dot__a:hover .x-dot__core, .x-dot__a:focus-visible .x-dot__core { stroke: var(--ds-ink); stroke-width: 2.4; transform: scale(1.4); }
.x-dot__a:focus-visible .x-dot__hit { stroke: var(--ds-ink); stroke-width: 2; stroke-dasharray: 4 3; }
.x-dot[data-match="0"], .x-dot[data-dim] { pointer-events: none; }
.x-map__tip { pointer-events: none; }
.x-map__tip[hidden] { display: none; }
.x-map__tip rect { fill: var(--ds-surface-inverse); }
.x-map__tip text { fill: var(--ds-ink-inverse); font-family: var(--ds-font-body); }
.x-map__tip-n { font-weight: var(--ds-weight-semibold); }
.x-map__tip-s { font-family: var(--ds-font-mono) !important; }
.x-dot.is-hot .x-dot__core { stroke: var(--ds-ink); stroke-width: 2.4; transform: scale(1.5); }
.x-clock { position: absolute; inset-block-start: var(--ds-space-5); inset-inline-start: var(--ds-space-5); pointer-events: none; }
.x-clock p { margin: 0; }
.x-clock__day { font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.x-clock__time { font-family: var(--ds-font-display); font-stretch: 70%; font-weight: var(--ds-weight-bold); font-size: clamp(64px, 6.4vw, 104px); line-height: .88; letter-spacing: -.01em; font-variant-numeric: tabular-nums; color: var(--ds-ink); }
.x-clock__filter { display: inline-block; margin-block-start: var(--ds-space-2) !important; padding: 2px var(--ds-space-2-5); border-radius: var(--ds-radius-pill); background: var(--ds-data-5-tint); color: var(--ds-data-5-ink); font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); }
.x-map__key { position: absolute; inset-inline-start: var(--ds-space-5); inset-block-end: var(--ds-space-4); display: grid; gap: var(--ds-space-1); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-map__key-item { display: inline-flex; align-items: center; gap: var(--ds-space-1-5); }
.x-map__key-item b { font-family: var(--ds-font-mono); color: var(--ds-ink); font-weight: var(--ds-weight-semibold); }
.x-keydot { inline-size: 10px; block-size: 10px; border-radius: var(--ds-radius-pill); flex: none; display: inline-block; }
.x-keydot[data-state="serve"] { background: var(--ds-data-5); }
.x-keydot[data-state="open"] { border: 2px solid var(--ds-data-5); background: var(--ds-surface); }
.x-dial { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--ds-space-4) var(--ds-space-6); align-items: start; padding: var(--ds-space-4) var(--ds-space-5) var(--ds-space-5); border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.x-dial__ctl { display: grid; gap: var(--ds-space-4); min-inline-size: 0; }
.x-dial__presets { inline-size: 100%; }
.x-dial__slider { --_fill: var(--ds-data-5); inline-size: 100%; min-inline-size: 0; }
.x-dial__slider .ds-slider__histogram { --_hist-h: 40px; }
.x-now__list { min-inline-size: 0; }
.x-now__k { margin: 0 0 var(--ds-space-3); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-now__rows { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ds-space-2-5); min-block-size: 196px; align-content: start; }
.x-now__row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 var(--ds-space-3); animation: x-rowin var(--_x-dur) var(--_x-out) both; animation-delay: calc(var(--_k, 0) * 60ms * var(--ds-motion-scale)); }
@keyframes x-rowin { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
[data-still] .x-now__row { animation: none; }
.x-now__dish { font-weight: var(--ds-weight-semibold); line-height: var(--ds-lh-heading); font-size: var(--ds-text-sm); }
.x-now__price { font-family: var(--ds-font-mono); font-weight: var(--ds-weight-bold); font-variant-numeric: tabular-nums; font-size: var(--ds-text-sm); }
.x-now__where { font-size: var(--ds-text-xs); color: var(--ds-ink-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.x-now__until { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); align-self: end; }
.x-now__empty { color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }

/* the riffle: index's departures board, shown only while the hero script runs (data-stage riffle / handover) */
.x-riffle { --_rh: clamp(62px, 6vw, 88px); position: absolute; inset: 0; z-index: 3; display: none; flex-direction: column; padding: var(--ds-space-4) var(--ds-space-6) var(--ds-space-4); background: var(--ds-surface); color: var(--ds-ink); }
.x-now[data-stage="riffle"] .x-riffle, .x-now[data-stage="handover"] .x-riffle { display: flex; }
.x-now[data-stage="riffle"] .x-map, .x-now[data-stage="riffle"] .x-dial { opacity: 0; }
.x-riffle__head { display: flex; justify-content: space-between; align-items: center; gap: var(--ds-space-4); padding-block-end: var(--ds-space-3); border-block-end: var(--ds-border-width) solid var(--ds-rule-strong); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-riffle__state { display: inline-flex; align-items: center; gap: var(--ds-space-2); color: var(--ds-ink-2); }
.x-riffle__spin { inline-size: 10px; block-size: 10px; border-radius: var(--ds-radius-pill); border: 2px solid var(--ds-rule-strong); border-block-start-color: var(--ds-accent); animation: x-spin 900ms linear infinite; }
@keyframes x-spin { to { transform: rotate(1turn); } }
.x-flap { position: relative; flex: 1; min-block-size: 0; overflow: hidden; -webkit-mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 20%, var(--ds-ink) 80%, transparent); mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 20%, var(--ds-ink) 80%, transparent); }
.x-flap::before { content: ""; position: absolute; inset-inline: 0; inset-block-start: calc(50% - var(--_rh) / 2); block-size: var(--_rh); border-block: var(--_x-rule) solid var(--ds-accent); pointer-events: none; z-index: 1; }
.x-flap__track { list-style: none; margin: 0; padding: 0; transform: translate3d(0, var(--_y, 0px), 0); transition: transform calc(var(--_flip, 160ms) * var(--ds-motion-scale)) cubic-bezier(.3, .8, .25, 1); will-change: transform; }
.x-flap__row { display: flex; align-items: center; justify-content: space-between; gap: var(--ds-space-4); block-size: var(--_rh); transition: opacity var(--_x-fast) ease; }
.x-flap__name { min-inline-size: 0; font-family: var(--ds-font-display); font-stretch: 66%; font-weight: var(--ds-weight-bold); font-size: calc(var(--_rh) * .58); line-height: 1; white-space: nowrap; }
.x-flap__n { display: grid; flex: none; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); font-variant-numeric: tabular-nums; color: var(--ds-ink-2); text-align: end; line-height: 1.35; }
.x-riffle__foot { margin: var(--ds-space-3) 0 0; padding-block-start: var(--ds-space-3); border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
/* hand-over: the board lets go of everything but the five names in its window, which fly onto the map as dot labels */
.x-riffle { transition: background-color calc(700ms * var(--ds-motion-scale)) ease; }
.x-now[data-stage="handover"] .x-riffle { background: transparent; pointer-events: none; }
.x-now[data-stage="handover"] .x-riffle__head, .x-now[data-stage="handover"] .x-riffle__foot, .x-now[data-stage="handover"] .x-flap::before, .x-now[data-stage="handover"] .x-flap__n { opacity: 0; transition: opacity calc(320ms * var(--ds-motion-scale)) ease; }
.x-now[data-stage="handover"] .x-flap__row { opacity: 0; transition: opacity calc(200ms * var(--ds-motion-scale)) ease; }
.x-map, .x-dial { transition: opacity calc(700ms * var(--ds-motion-scale)) ease; }
.x-now[data-stage="handover"] .x-dot .x-dot__core, .x-now[data-stage="handover"] .x-dot .x-dot__halo { animation: x-pop calc(520ms * var(--ds-motion-scale)) var(--_x-out) both; animation-delay: calc(var(--_pd, 0) * 1ms * var(--ds-motion-scale)); }
@keyframes x-pop { from { scale: 0; opacity: 0; } }
.x-fly { position: absolute; inset: 0; z-index: 4; pointer-events: none; }
.x-fly__tag { position: absolute; inset-block-start: 0; inset-inline-start: 0; transform-origin: 0 50%; white-space: nowrap; font-family: var(--ds-font-display); font-stretch: 66%; font-weight: var(--ds-weight-bold); line-height: 1; color: var(--ds-ink); transition: transform calc(900ms * var(--ds-motion-scale)) cubic-bezier(.5, 0, .2, 1), opacity calc(400ms * var(--ds-motion-scale)) ease, color calc(600ms * var(--ds-motion-scale)) ease; }
.x-fly__tag[data-landed] { color: var(--ds-data-5-ink); }
.x-fly__tag[data-gone] { opacity: 0; }
@media (prefers-reduced-motion: reduce) { .x-riffle, .x-fly { display: none !important; } .x-map, .x-dial { opacity: 1 !important; } .x-dot__halo { animation: none !important; } .x-now__row { animation: none; } }

/* ---------------------------------------------------------------- the A-Z index */
.x-entries { list-style: none; margin: 0; padding: 0; }
.x-entry { display: grid; grid-template-columns: clamp(3rem, 8vw, 7rem) minmax(0, 1fr); align-items: center; border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.x-entry--first, .x-entry:first-child { border-block-start: var(--_x-rule) solid var(--ds-ink); }
.x-entry:last-child { border-block-end: var(--ds-border-width) solid var(--ds-rule-strong); }
.x-entry__letter { font-family: var(--ds-font-display); font-stretch: 62%; font-weight: var(--_x-w); font-size: clamp(40px, 6vw, 84px); line-height: 1; color: var(--ds-accent-ink); align-self: start; padding-block-start: var(--ds-space-3); }
.x-entry__link { display: grid; grid-template-columns: minmax(0, 22rem) minmax(2rem, 1fr) auto 1.5rem; align-items: center; gap: var(--ds-space-5); padding-block: var(--ds-space-3); color: var(--ds-ink); text-decoration: none; border-radius: var(--ds-radius-xs); transition: background-color calc(160ms * var(--ds-motion-scale)) var(--ds-ease-out); }
.x-entry__link:hover { background: var(--ds-surface-hover); }
.x-entry__link:hover .x-entry__go { transform: translateX(var(--ds-space-1)); color: var(--ds-accent-ink); }
.x-entry__name { font-family: var(--ds-font-display); font-stretch: 66%; font-weight: var(--_x-w); font-size: clamp(32px, 4.6vw, 64px); letter-spacing: var(--_x-track); line-height: 1; }
.x-entry__bar { position: relative; block-size: 10px; background: var(--ds-surface-2); border-radius: var(--ds-radius-xs); overflow: hidden; }
.x-entry__bar::after { content: ""; position: absolute; inset: 0 auto 0 0; inline-size: calc(var(--_p, 0) * 1%); background: var(--ds-accent); border-radius: var(--ds-radius-xs); transform-origin: 0 50%; }
.x-js:not([data-still]) [data-reveal]:not([data-in]) .x-entry__bar::after { transform: scaleX(0); }
.x-js:not([data-still]) .x-entry__bar::after { transition: transform calc(900ms * var(--ds-motion-scale)) var(--_x-out) calc(var(--_d, 0) * var(--_x-step) + 150ms); }
.x-entry__n { font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.x-entry__n b { font-weight: var(--ds-weight-bold); color: var(--ds-ink); }
.x-entry__go { inline-size: 1.25rem; color: var(--ds-ink-muted); transition: transform calc(160ms * var(--ds-motion-scale)) var(--ds-ease-out), color calc(160ms * var(--ds-motion-scale)); }
.x-entry__go svg { inline-size: 100%; block-size: auto; }
@media (max-width: 700px) {
  .x-entry__link { grid-template-columns: minmax(0, 1fr) 1.25rem; gap: var(--ds-space-1) var(--ds-space-3); }
  .x-entry__bar { grid-column: 1 / -1; grid-row: 3; block-size: 6px; }
  .x-entry__n { grid-column: 1; grid-row: 2; font-size: var(--ds-text-xs); }
  .x-entry__name { grid-row: 1; }
  .x-entry__go { grid-column: 2; grid-row: 1; }
}

/* ---------------------------------------------------------------- asks, pilot, how we check */
.x-asks { margin: 0; }
.x-rel__n { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); margin-inline-start: var(--ds-space-2); }
.x-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--ds-space-8) var(--ds-space-6); padding-block: var(--ds-space-6); border-block: var(--_x-rule) solid var(--ds-ink); }
.x-stats .ds-stat { --_value-size: clamp(40px, 5.4vw, 76px); --_value-weight: var(--_x-w); }
@media (max-width: 800px) { .x-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.x-boro { margin: var(--ds-space-8) 0 0; display: grid; }
.x-boro__row { display: grid; grid-template-columns: 10rem minmax(0, 1fr) 7rem; align-items: center; gap: var(--ds-space-4); padding-block: var(--ds-space-3); border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.x-boro__k { margin: 0; font-family: var(--ds-font-display); font-stretch: 78%; font-size: var(--ds-text-xl); font-weight: var(--ds-heading-weight); }
.x-boro__bar { position: relative; margin: 0; block-size: 10px; background: var(--ds-surface-3); border-radius: var(--ds-radius-xs); overflow: hidden; }
.x-boro__bar::after { content: ""; position: absolute; inset: 0 auto 0 0; inline-size: calc(var(--_p, 0) * 1%); background: var(--ds-accent); border-radius: var(--ds-radius-xs); }
.x-boro__v { margin: 0; font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); text-align: end; font-variant-numeric: tabular-nums; }
@media (max-width: 520px) { .x-boro__row { grid-template-columns: minmax(0, 1fr) auto; } .x-boro__bar { grid-column: 1 / -1; grid-row: 2; } }
.x-steps { max-inline-size: 60ch; }
.x-never { list-style: none; margin: var(--ds-space-8) 0 0; padding: var(--ds-space-5) 0 0; border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); display: grid; gap: var(--ds-space-3); }
.x-never__item { display: flex; gap: var(--ds-space-3); align-items: baseline; color: var(--ds-ink-2); }
.x-never__item svg { flex: none; inline-size: 14px; block-size: 14px; translate: 0 2px; color: var(--ds-ink-muted); }
.x-key { margin: 0 0 var(--ds-space-6); display: grid; border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); }
.x-key__item { display: grid; gap: var(--ds-space-2); align-items: start; padding-block: var(--ds-space-3); border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.x-key__term, .x-key__meaning { margin: 0; min-inline-size: 0; }
.x-key__term .ds-status-badge { max-inline-size: 100%; }
.x-key__meaning { color: var(--ds-ink-2); font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); }

/* ---------------------------------------------------------------- page bands (dish, dish-b, venue, check): the specials header */
.x-band { padding-block: var(--ds-space-8) var(--ds-space-10); background: var(--ds-ground-2); border-block-end: var(--ds-border-width) solid var(--ds-rule-strong); }
.x-band__grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-8) var(--ds-space-12); align-items: end; }
.x-band--map .x-band__grid { grid-template-columns: minmax(0, 1fr) minmax(240px, 320px); }
.x-band__answer { margin: var(--ds-space-5) 0 0; font-size: clamp(18px, 1.7vw, 22px); line-height: var(--ds-lh-prose); color: var(--ds-ink-2); }
.x-band__answer strong { color: var(--ds-ink); font-weight: var(--ds-weight-bold); }
.x-band__answer .ds-status-badge { vertical-align: middle; margin-inline-start: var(--ds-space-2); }
.x-band__map { display: grid; gap: var(--ds-space-2); padding: var(--ds-space-2) var(--ds-space-2) var(--ds-space-3); border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-lg); background: var(--ds-surface); }
.x-band__map .x-map__svg { max-block-size: 300px; }
.x-band__map .x-map__hood { font-size: 17px; stroke-width: 5px; }
.x-band__map .x-map__borough { font-size: 26px; stroke-width: 6px; }
.x-band__map .x-dot__core { r: 9; }
.x-band__mapk { margin: 0; padding-inline: var(--ds-space-2); display: flex; align-items: center; gap: var(--ds-space-2); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-toolbar { padding-block: var(--ds-space-5) var(--ds-space-6); }
.x-filters { margin: 0; }
.x-filters__sum { display: none; align-items: center; justify-content: space-between; gap: var(--ds-space-3); min-block-size: 44px; padding-inline: var(--ds-space-3); border: var(--ds-border-width) solid var(--ds-rule-strong); border-radius: var(--ds-radius-md); font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink); cursor: pointer; list-style: none; }
.x-filters__sum::-webkit-details-marker { display: none; }
.x-filters__sum::after { content: ""; inline-size: 8px; block-size: 8px; border: solid currentColor; border-width: 0 2px 2px 0; transform: translateY(-2px) rotate(45deg); transition: transform var(--_x-fast) ease; }
.x-filters[open] > .x-filters__sum::after { transform: translateY(2px) rotate(-135deg); }
.x-filters__n { margin-inline-start: auto; color: var(--ds-ink-muted); }
.x-controls { display: grid; gap: var(--ds-space-4); margin: 0; }
.x-fgrid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--ds-space-4) var(--ds-space-4); align-items: start; }
.x-f { grid-column: span 3; display: grid; gap: var(--ds-space-1-5); min-inline-size: 0; margin: 0; padding: 0; border: 0; }
.x-f--q { grid-column: span 6; }
.x-f--chk { grid-column: span 3; align-content: start; }
.x-f--diet { grid-column: span 6; }
.x-f__checks { display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-4); }
.x-f__label { padding: 0; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-fgrid .ds-text-input, .x-fgrid .ds-search-input { inline-size: 100%; }
.x-sort { grid-column: span 12; display: flex; flex-wrap: wrap; align-items: center; border: 0; padding: 0; margin: 0; gap: 0 var(--ds-space-2); }
.x-sort .x-f__label { float: none; margin-inline-end: var(--ds-space-2); }
.x-fbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-3) var(--ds-space-5); }
.x-controls__count { margin: 0; font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-controls__count [data-count] { color: var(--ds-ink); font-weight: var(--ds-weight-bold); }
.x-fnote { margin: 0; font-size: var(--ds-text-sm); color: var(--ds-ink-2); max-inline-size: 80ch; }
.x-fnote[hidden], .x-fempty[hidden], .x-vcards[hidden] { display: none; }
.x-fempty { margin-block-start: var(--ds-space-6); }
html:not(.x-js) .x-filters { display: none; }
select, select option, select optgroup { background-color: var(--ds-surface); color: var(--ds-ink); }
select option:checked { background-color: var(--ds-surface-selected); }
.x-empty { margin: var(--ds-space-6) 0 0; font-size: var(--ds-text-lg); color: var(--ds-ink-2); }
@media (max-width: 900px) { .x-band--map .x-band__grid { grid-template-columns: minmax(0, 1fr); } .x-band__map { display: none; } .x-f, .x-f--chk, .x-f--diet { grid-column: span 6; } .x-f--q { grid-column: span 12; } }
@media (max-width: 700px) { .x-filters__sum { display: flex; } .x-filters[open] > .x-controls { margin-block-start: var(--ds-space-4); } .x-f, .x-f--q, .x-f--chk, .x-f--diet, .x-sort { grid-column: span 12; } }
@media (max-width: 520px) { .x-band { padding-block: var(--ds-space-5) var(--ds-space-8); } }

/* ---------------------------------------------------------------- dish (nowserving base): a Sunday at a glance + cards */
.x-glance { padding: clamp(18px, 2.4vw, 28px); }
.x-glance__head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--ds-space-3) var(--ds-space-6); margin-block-end: var(--ds-space-5); }
.x-glance__h { margin: 0; font-family: var(--ds-font-display); font-stretch: 72%; font-weight: var(--_x-w); font-size: clamp(28px, 3vw, 40px); letter-spacing: var(--_x-track); line-height: 1; }
.x-glance__sub { margin: var(--ds-space-2) 0 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); max-inline-size: 60ch; }
.x-glance__at { align-items: center; }
.x-glance__legend { float: inline-start; margin-inline-end: var(--ds-space-3); padding-block: 6px; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-axis, .x-lane { display: grid; grid-template-columns: var(--_namew, 220px) minmax(0, 1fr); gap: var(--ds-space-3); }
.x-axis { position: relative; block-size: 18px; margin-block-end: var(--ds-space-2); }
.x-axis__tick { position: absolute; inset-inline-start: calc(var(--_namew, 220px) + var(--ds-space-3) + (100% - var(--_namew, 220px) - var(--ds-space-3)) * var(--_f, 0)); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); transform: translateX(-50%); }
.x-glance { --_now: 18.18%; }
.x-lanes { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.x-lane { align-items: center; min-block-size: 30px; }
.x-lane__name { font-size: var(--ds-text-sm); font-weight: var(--ds-weight-semibold); color: var(--ds-ink); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.x-lane__name:hover { color: var(--ds-ink-link); }
.x-lane__track { position: relative; block-size: 26px; border-radius: var(--ds-radius-xs); background: var(--ds-surface-2); }
.x-lane__track::after { content: ""; position: absolute; z-index: 0; inset-block: -5px; inset-inline-start: var(--_now); inline-size: 2px; background: var(--ds-accent); border-radius: var(--ds-radius-xs); transition: inset-inline-start var(--_x-dur) var(--_x-out); }
.x-lane__bar { position: absolute; z-index: 1; inset-block: 3px; inset-inline-start: var(--_a, 0); inset-inline-end: calc(100% - var(--_b, 100%)); display: flex; align-items: center; padding-inline: 10px; border-radius: var(--ds-radius-xs); background: var(--ds-ink); color: var(--ds-ink-inverse); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); white-space: nowrap; overflow: hidden; transition: opacity var(--_x-fast) ease; }
.x-lane__bar[data-kind="open-start"] { -webkit-mask-image: linear-gradient(to left, var(--ds-ink) 70%, transparent); mask-image: linear-gradient(to left, var(--ds-ink) 70%, transparent); justify-content: flex-end; }
.x-lane__bar[data-kind="open-end"] { -webkit-mask-image: linear-gradient(to right, var(--ds-ink) 55%, transparent); mask-image: linear-gradient(to right, var(--ds-ink) 55%, transparent); }
.x-lane__bar[data-kind="unknown"] { inset-inline: 3px; background: var(--ds-surface-2); color: var(--ds-ink-muted); border: 1.5px dashed var(--ds-rule-strong); }
.x-lane__bar[data-off] { opacity: .35; }
.x-glance__note { margin: var(--ds-space-4) 0 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-vcards { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ds-space-4); grid-template-columns: repeat(auto-fill, minmax(min(100%, 480px), 1fr)); }
.x-vcard-wrap[hidden] { display: none; }
.x-vcard { padding: clamp(18px, 2vw, 26px); block-size: 100%; display: grid; align-content: start; gap: var(--ds-space-4); transition: border-color var(--_x-fast) ease; }
.x-vcard-wrap:hover .x-vcard { border-color: var(--ds-border-strong); }
.x-vcard__head > * { margin: 0; }
.x-vcard__name { font-family: var(--ds-font-display); font-stretch: 72%; font-weight: var(--_x-w); font-size: clamp(28px, 2.6vw, 36px); letter-spacing: var(--_x-track); line-height: 1; }
.x-vcard__name a { color: inherit; text-decoration: none; }
.x-vcard__name a:hover { color: var(--ds-ink-link); text-decoration: underline; text-decoration-thickness: var(--_x-rule); text-underline-offset: .12em; }
.x-vcard__where { margin-block-start: var(--ds-space-1-5) !important; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-vcard__where b { color: var(--ds-accent-ink); font-weight: var(--ds-weight-semibold); }
.x-when { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px var(--ds-space-2); padding: var(--ds-space-3) var(--ds-space-4); border-radius: var(--ds-radius-sm); background: var(--ds-surface-2); font-size: var(--ds-text-sm); margin: 0; }
.x-when > :not(.x-when__icon) { grid-column: 2; }
.x-when__icon { grid-row: 1 / span 2; color: var(--ds-ink-muted); }
.x-when__icon svg { inline-size: 18px; block-size: 18px; margin-block-start: 1px; }
.x-when__menu { font-weight: var(--ds-weight-semibold); }
.x-when__times { font-family: var(--ds-font-mono); }
.x-when__printed { color: var(--ds-ink-muted); font-size: var(--ds-text-xs); }
.x-when__now { justify-self: start; margin-block-start: var(--ds-space-1); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-when__now[data-now="yes"] { color: var(--ds-ink); font-weight: var(--ds-weight-bold); }
.x-when__now[data-now="yes"]::before { content: ""; display: inline-block; inline-size: 7px; block-size: 7px; border-radius: var(--ds-radius-pill); background: var(--ds-accent); margin-inline-end: 6px; vertical-align: 1px; }
.x-vcard .x-trust { padding-block-start: var(--ds-space-3); border-block-start: var(--ds-border-width) dashed var(--ds-rule-strong); }
.x-relwrap > .ds-related-list { max-inline-size: 760px; }

/* ---------------------------------------------------------------- dish-b (index base): the timetable */
.x-head, .x-trip { display: grid; grid-template-columns: minmax(0, 13rem) minmax(0, 1fr) minmax(0, 1.5fr); gap: var(--ds-space-3) var(--ds-space-8); }
.x-head { padding-block: var(--ds-space-3); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-trips { list-style: none; margin: 0; padding: 0; border-block-start: var(--_x-rule) solid var(--ds-ink); }
.x-trip { padding-block: var(--ds-space-6); border-block-end: var(--ds-border-width) solid var(--ds-rule-strong); align-items: start; }
.x-trip[hidden] { display: none; }
.x-trip__when { display: grid; gap: var(--ds-space-1); align-content: start; }
.x-trip__k { display: none; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-trip__time { font-family: var(--ds-font-mono); font-size: var(--ds-text-lg); font-weight: var(--ds-weight-bold); font-variant-numeric: tabular-nums; line-height: 1.2; color: var(--ds-ink); }
.x-trip__time--none { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); }
.x-trip__nt { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-trip__note { font-size: var(--ds-text-sm); font-style: italic; color: var(--ds-ink-muted); line-height: 1.35; }
.x-trip__printed { display: block; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); margin-block-start: var(--ds-space-1); }
.x-trip__venue { margin: 0; font-family: var(--ds-font-display); font-stretch: 72%; font-size: clamp(28px, 3.2vw, 40px); font-weight: var(--_x-w); letter-spacing: var(--_x-track); line-height: 1; }
.x-trip__venue a { color: var(--ds-ink); text-decoration: none; }
.x-trip__venue a:hover { color: var(--ds-accent-ink); text-decoration: underline; text-decoration-thickness: var(--_x-rule); text-underline-offset: .12em; }
.x-trip__hood { margin: var(--ds-space-2) 0 var(--ds-space-3); color: var(--ds-ink-2); font-size: var(--ds-text-sm); }
.x-trip__trust { margin: 0 0 var(--ds-space-2); display: flex; flex-wrap: wrap; gap: var(--ds-space-2); align-items: center; }
.x-trip__src { margin: 0; }
.x-trip__dishes { gap: var(--ds-space-3); }
.x-trip__dishes .x-line__name { font-size: var(--ds-text-md); }
.x-relgrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--ds-space-8); }
@media (max-width: 640px) { .x-relgrid { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 900px) {
  .x-head { display: none; }
  .x-trip { grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-4); }
  .x-trip__when { grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: var(--ds-space-1) var(--ds-space-3); }
  .x-trip__k { display: block; }
  .x-trip__nt, .x-trip__note { grid-column: 2; }
}

/* ---------------------------------------------------------------- venue (specials base) */
.x-vhead { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--ds-space-5) var(--ds-space-10); }
.x-vhead__main { min-inline-size: 0; }
.x-vhead__trust { display: grid; gap: var(--ds-space-2); justify-items: start; max-inline-size: 22rem; }
.x-vhead__meaning { font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-vlayout { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: var(--ds-space-10); padding-block: var(--ds-space-8) var(--ds-space-16); align-items: start; }
.x-vmain { min-inline-size: 0; }
.x-vmain__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--ds-space-2) var(--ds-space-6); }
.x-vmain__count { margin: 0; font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-mtabs { margin-block: var(--ds-space-4) var(--ds-space-2); min-inline-size: 0; }
.x-panels { display: grid; gap: var(--ds-space-10); }
.x-panel[hidden] { display: none; }
.x-menu__head { margin-block-end: var(--ds-space-6); padding-block-end: var(--ds-space-4); border-block-end: var(--_x-rule) solid var(--ds-ink); }
.x-menu__kind { margin: 0 0 var(--ds-space-1); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-menu__name { margin: 0; font-family: var(--ds-font-display); font-stretch: 68%; font-weight: var(--_x-w); font-size: clamp(34px, 4.4vw, 56px); letter-spacing: var(--_x-track); line-height: 1; }
.x-menu__meta { margin: var(--ds-space-3) 0 0; display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-6); align-items: center; font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.x-menu__when { display: inline-flex; align-items: center; gap: var(--ds-space-2); font-family: var(--ds-font-mono); }
.x-menu__icon svg { display: block; inline-size: 16px; block-size: 16px; color: var(--ds-ink-muted); }
.x-menu__count { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-menu__kitchen { margin: var(--ds-space-2) 0 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-msec { margin-block-end: var(--ds-space-10); }
.x-msec__h { margin: 0 0 var(--ds-space-4); display: flex; align-items: baseline; gap: var(--ds-space-3); font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-bold); letter-spacing: var(--ds-label-tracking-upper); text-transform: uppercase; color: var(--ds-accent-ink); }
.x-msec__n { font-size: var(--ds-text-xs); color: var(--ds-ink-muted); letter-spacing: 0; }
.x-drinks { display: grid; justify-items: start; gap: var(--ds-space-3); padding: var(--ds-space-8) var(--ds-space-6); border: 1.5px dashed var(--ds-rule-strong); border-radius: var(--ds-radius-md); }
.x-drinks .x-note { margin: 0; }
.x-drinks__t { margin: 0; font-family: var(--ds-font-display); font-stretch: 72%; font-weight: var(--_x-w); font-size: clamp(28px, 3vw, 40px); line-height: 1; color: var(--ds-ink); }
.x-vside { display: grid; gap: var(--ds-space-4); position: sticky; inset-block-start: calc(var(--ds-topbar-h) + var(--ds-space-4)); }
.x-sidecard { padding: var(--ds-space-5); background: var(--ds-surface); border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-md); }
.x-sidecard .x-h3 { font-size: var(--ds-text-xl); margin-block-end: var(--ds-space-3); }
.x-sidecard--offers { border-color: transparent; background: transparent; padding: var(--ds-space-2) 0 0; }
.x-offers { max-inline-size: none; padding: 0; }
.x-srcs { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ds-space-2); }
.x-claim { background: var(--ds-accent-tint); border-color: var(--ds-accent-soft); }
.x-claim .ds-button-primary { margin-block-start: var(--ds-space-4); }
.x-week { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.x-week__row { display: grid; grid-template-columns: 2.6em minmax(0, 1fr); gap: var(--ds-space-3); align-items: center; font-size: var(--ds-text-sm); }
.x-week__d { font-family: var(--ds-font-mono); color: var(--ds-ink-muted); }
.x-week__row[data-today] .x-week__d { color: var(--ds-accent-ink); font-weight: var(--ds-weight-bold); }
.x-week__track { position: relative; block-size: 24px; border-radius: var(--ds-radius-xs); background: var(--ds-surface-2); }
.x-week__bar { position: absolute; inset-block: 3px; inset-inline-start: var(--_a, 0%); inset-inline-end: calc(100% - var(--_b, 0%)); border-radius: var(--ds-radius-xs); background: var(--ds-surface-selected); }
.x-week__row[data-today] .x-week__bar { background: var(--ds-accent-soft); }
.x-week__t { position: absolute; inset-block: 0; inset-inline-start: calc(var(--_a, 15%) + 8px); display: flex; align-items: center; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink); }
.x-week__closed { position: absolute; inset: 0; display: flex; align-items: center; padding-inline: 8px; font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
@media (max-width: 1000px) { .x-vlayout { grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-8); } .x-vside { position: static; } }

/* ---------------------------------------------------------------- check (specials base, index boxes) */
.x-band--check .x-band__answer { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-2) var(--ds-space-3); }
.x-band--check .x-band__answer .ds-status-badge { margin-inline-start: 0; }
.x-check { padding-block: var(--ds-space-8) var(--ds-space-16); display: grid; gap: var(--ds-space-12); }
.x-check > *, .x-editor > * { min-inline-size: 0; }
.x-answers { display: grid; gap: var(--ds-space-3); }
.x-answers > a { inline-size: 100%; justify-content: center; }
.x-answers .x-note { margin-block-start: var(--ds-space-1); }
.x-box .x-box__k { max-inline-size: none; margin: 0; display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--ds-space-1) var(--ds-space-4); padding-block-end: var(--ds-space-3); border-block-end: var(--_x-rule) solid var(--ds-ink); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-box__h { margin: 0; font-family: var(--ds-font-display); font-stretch: 78%; font-size: var(--ds-text-xl); font-weight: var(--ds-heading-weight); letter-spacing: var(--ds-heading-tracking); }
.x-box__menus { margin: var(--ds-space-2) 0 0; padding: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); }
.x-box--secs { overflow: hidden; }
.x-box--secs .x-esecs { border: 0; }
.x-editor { display: grid; gap: var(--ds-space-5); padding-block-start: var(--ds-space-10); border-block-start: var(--_x-rule) solid var(--ds-ink); }
.x-editor > .x-eyebrow, .x-editor > .x-h2, .x-editor > .x-note { margin: 0; }
.x-etabs { min-inline-size: 0; }
.x-times { gap: var(--ds-space-3) !important; }
.x-times .x-note { margin: 0; }
.x-times__pair { display: grid; grid-template-columns: repeat(2, minmax(0, 10rem)); gap: var(--ds-space-3); }
.x-toggles { display: flex; flex-wrap: wrap; gap: var(--ds-space-2) var(--ds-space-4); }

.x-erows { list-style: none; margin: 0 0 var(--ds-space-4); padding: 0; display: grid; gap: var(--ds-space-3); inline-size: 100%; }
.x-erow { display: grid; grid-template-columns: minmax(0, 1fr) 8rem 2.75rem; grid-template-areas: "name price rm" "diet diet diet" "ing ing ing"; gap: var(--ds-space-3); padding: var(--ds-space-4); border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-sm); background: var(--ds-surface-2); align-items: end; }
.x-erow[hidden] { display: none; }
.x-erow__f { display: grid; gap: var(--ds-space-1); min-inline-size: 0; border: 0; margin: 0; padding: 0; }
.x-erow__l { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); padding: 0; }
.x-erow__name { grid-area: name; } .x-erow__price { grid-area: price; } .x-erow__ing { grid-area: ing; } .x-erow__rm { grid-area: rm; } .x-erow__diet { grid-area: diet; }
@media (max-width: 560px) { .x-erow { grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "name name" "price rm" "diet diet" "ing ing"; } .x-erow__price { max-inline-size: 10rem; } .x-times__pair { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.x-save { display: grid; gap: var(--ds-space-3); padding: var(--ds-space-5); background: var(--ds-accent-tint); border: var(--ds-border-width) solid var(--ds-accent-soft); border-radius: var(--ds-radius-md); }
.x-save .x-note { margin: 0; }
.x-save__btns { display: flex; flex-wrap: wrap; gap: var(--ds-space-3); }
.x-pro { margin-block-start: var(--ds-space-6); color: var(--ds-ink-muted); }
.x-pro .x-note { margin: 0 0 var(--ds-space-2); }
.x-pro__list { margin: 0; padding-inline-start: var(--ds-space-5); display: grid; gap: var(--ds-space-2); color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }
.x-remove { margin: 0; font-size: var(--ds-text-sm); display: flex; flex-wrap: wrap; gap: var(--ds-space-1) var(--ds-space-3); align-items: baseline; }
.x-remove .x-note { margin: 0; }
@media (max-width: 480px) { .x-save__btns > a { inline-size: 100%; justify-content: center; } .x-check { gap: var(--ds-space-10); } }

/* ---------------------------------------------------------------- responsive: home hero */
@media (max-width: 1100px) { .x-hero__grid { grid-template-columns: minmax(0, 1fr); } .x-h1--hero { max-inline-size: 14ch; } }
@media (max-width: 760px) {
  .x-hero { padding-block: var(--ds-space-5) var(--ds-space-8); }
  .x-hero__main { gap: var(--ds-space-4); }
  .x-hero__lede { font-size: var(--ds-text-md); }
  .x-find__row { grid-template-columns: minmax(0, 1fr); }
  .x-map { block-size: auto; display: grid; }
  .x-map__geo { position: relative; inset: auto; order: 2; aspect-ratio: 600 / 641; margin: 0 var(--ds-space-2); }
  .x-map__svg { position: absolute; inset: 0; }
  .x-map__hood { font-size: 17px; stroke-width: 5px; }
  .x-map__borough { font-size: 30px; stroke-width: 6px; }
  .x-clock { position: static; order: 1; padding: var(--ds-space-4) var(--ds-space-4) 0; }
  .x-map__key { position: static; order: 3; padding: var(--ds-space-2) var(--ds-space-4) var(--ds-space-3); }
  .x-dial { grid-template-columns: minmax(0, 1fr); padding-inline: var(--ds-space-4); }
  .x-now__rows { min-block-size: 0; }
  .x-riffle { --_rh: 58px; padding-inline: var(--ds-space-4); }
  .x-axis, .x-lane { --_namew: 104px; }
  .x-lane__bar-t { display: none; }
  .x-lane__bar[data-kind="unknown"] .x-lane__bar-t { display: inline; }
  .x-axis__tick[data-minor] { display: none; }
  .x-line__name { font-size: var(--ds-text-md); }
}

/* ================================================================ build additions (site/, 2026-10-21) ===== */
/* skip link */
.x-skip { position: absolute; inset-inline-start: var(--ds-space-4); inset-block-start: calc(-1 * var(--ds-space-16)); z-index: calc(var(--ds-z-sticky) + 1); padding: var(--ds-space-2) var(--ds-space-4); border-radius: var(--ds-radius-sm); background: var(--ds-surface); color: var(--ds-ink); }
.x-skip:focus { inset-block-start: var(--ds-space-2); }
main { display: block; }

/* the footer sign-off was faint in dark mode: its outline reads --ds-line-art, so give our wrapper a stronger line token */
.x-signoff { --ds-line-art: var(--ds-ink-2); }

/* menu selector: the pills wrap onto as many rows as they need (no horizontal scroll, nothing hidden off the edge).
   Under 600px a full-width native select picks the menu instead and the pills step aside (still in the tablist). */
.x-mtabs .ds-tabs__list { flex-wrap: wrap; overflow: visible; gap: var(--ds-space-1); }
.x-mtabs .ds-tabs__item { flex: 0 1 auto; max-inline-size: 100%; white-space: normal; text-align: start; }
.x-mpick { display: none; }
@media (max-width: 599px) {
  html.x-js .x-mpick { display: grid; gap: var(--ds-space-1-5); margin-block: var(--ds-space-4) var(--ds-space-2); }
  html.x-js .x-mtabs { display: none; }
}
html:not(.x-js) .x-mtabs { display: none; }
html:not(.x-js) .x-panel + .x-panel { padding-block-start: var(--ds-space-10); border-block-start: var(--_x-rule) solid var(--ds-ink); }

/* prices not printed read weaker than prices */
.x-line__price--none { font-family: var(--ds-font-sans); font-weight: var(--ds-weight-regular); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }

/* a venue card can hold the dish on more than one menu */
.x-vcard__menu { display: grid; gap: var(--ds-space-3); }
.x-vcard__menu + .x-vcard__menu { padding-block-start: var(--ds-space-4); border-block-start: var(--ds-border-width) dashed var(--ds-rule); }
.x-vcard__more { margin: 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.x-lane__days { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); font-weight: var(--ds-weight-regular); }

/* compact A-Z entries (area pages, the index page's own list) */
.x-entries--compact .x-entry { grid-template-columns: clamp(2.5rem, 6vw, 5rem) minmax(0, 1fr); }
.x-entries--compact .x-entry__name { font-size: clamp(26px, 3.2vw, 44px); }
.x-entries--compact .x-entry__letter { font-size: clamp(32px, 4.6vw, 60px); }
.x-entry[hidden] { display: none; }

/* search on the dish index page */
.x-search { display: grid; gap: var(--ds-space-3); max-inline-size: 46rem; margin-block-end: var(--ds-space-8); }
.x-search__row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 14rem) auto; gap: var(--ds-space-2); }
@media (max-width: 760px) { .x-search__row { grid-template-columns: minmax(0, 1fr); } }
.x-results { display: grid; gap: var(--ds-space-6); margin-block-end: var(--ds-space-10); }
.x-results[hidden] { display: none; }
.x-results__h { margin: 0 0 var(--ds-space-2); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-results__list { list-style: none; margin: 0; padding: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule-strong); }

/* venue cards for areas and diets */
.x-vcard__menus { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--ds-space-1); font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.x-vcard__menus span { font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.x-ours { margin: 0; display: flex; flex-wrap: wrap; gap: var(--ds-space-2); align-items: center; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }

/* area list */
.x-areas { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ds-space-3); grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }

/* prose pages (how we check, for venues, about) */
.x-prose { max-inline-size: var(--ds-measure); font-size: var(--ds-text-md); line-height: var(--ds-lh-prose); color: var(--ds-ink-2); }
.x-prose p { margin: 0 0 var(--ds-space-4); }
.x-prose h2 { margin: var(--ds-space-10) 0 var(--ds-space-3); }
.x-prose ul, .x-prose ol { margin: 0 0 var(--ds-space-4); padding-inline-start: var(--ds-space-5); display: grid; gap: var(--ds-space-2); }
.x-prose a { color: var(--ds-ink-link); }
.x-answers-demo { display: flex; flex-wrap: wrap; gap: var(--ds-space-3); margin-block: var(--ds-space-4); }
.x-answers-demo span { padding: var(--ds-space-2) var(--ds-space-4); border: var(--ds-border-width) solid var(--ds-rule-strong); border-radius: var(--ds-radius-sm); font-weight: var(--ds-weight-semibold); color: var(--ds-ink); }

/* opening hours not recorded */
.x-week__none { margin: 0; font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }

/* the map's own venue links (server-rendered still list) */
.x-now__dish a { color: inherit; text-decoration: none; }

/* long unbroken strings from menus (file names, codes) must not widen a card */
.x-vcard, .x-vcard > *, .x-vcard__menu > *, .x-when > * { min-inline-size: 0; }
.x-when__printed, .x-menu__kitchen, .x-note { overflow-wrap: anywhere; }
.x-boro__k a { color: inherit; text-decoration: none; }
.x-boro__k a:hover { color: var(--ds-ink-link); text-decoration: underline; }
.x-lines { grid-template-columns: minmax(0, 1fr); }
.x-line__name, .x-line__ing { overflow-wrap: anywhere; }
.x-line__price--long { white-space: normal; text-align: end; max-inline-size: 16ch; font-size: var(--ds-text-sm); }
