@font-face { font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap; src: url('/fonts/inter-normal-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/ibm-plex-mono-400-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500 700; font-display: swap; src: url('/fonts/ibm-plex-mono-500-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
/* tokens/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 */
  }
}
/* tokens/themes/noir.css */
/* ============================================================================
   Theme: noir — P5 committed dark (Klarna / Rox / Legend class).
   A theme whose LIGHT MODE IS ITSELF DARK: tinted near-black ground with a
   violet-warm cast, in-hue surface step (+4–8% L), white ink tiers at
   100/93/66/40%, hairlines at ~12% white, NO accent (accent-scope none —
   links, rings and selection lines are ink), radius 0 (pills survive), mono
   uppercase label lane, drawn-rail ornament.
   Evidence: [klarna-section] (#1d192a → #373544, white 100/93%)
   [rox-section] (#0f0f0f, rule #1f1f1f, rails with drawn joins, muted #686868 —
   raised here to 4.5:1) [legend-section] (#151414, dashed 12–15% rules, mono caps).
   MODES: [data-mode="dark"] and the OS-dark media form set the SAME values as
   the light block (ground one step deeper), so a page that toggles modes does
   not flicker; [data-mode="light"] on a noir page is ALSO dark — this theme
   has no light rendering by design. color-scheme is forced to dark so native
   controls and scrollbars match.
   ISLANDS (batch-12): a descendant [data-mode="light"] island points at the
   light block's OWN values (there is no light noir — the island is the same
   near-black, so base's neutral light cannot show through); a descendant
   [data-mode="dark"] / [data-band="dark"] gets the deeper-ground dark block.
   data-band="tint|accent" come from base: the accent band reads the white
   "accent" + near-black ink through the --ds-band-* snapshots and renders as
   a white band with black ink — noir's one inversion.
   PAGE ATTRIBUTES this theme expects:
     data-theme="noir" data-depth="hairline" data-selection="tint" data-buttons="sm"
     data-labels="upper" data-controls="sentence" data-accent-scope="none"
     data-hover="tint" data-density="comfortable" data-illustration="render"
     data-texture="none" data-ornament="rails"
   Differences from base: depth=hairline, labels=upper, accent-scope=none,
   density=comfortable — all with CSS-only fallbacks below.
   Sets ONLY what differs from base.css.
   ========================================================================== */
[data-theme="noir"],
[data-theme="noir"] [data-mode="light"] {
  color-scheme: dark;
  /* -- surfaces: violet-warm near-black, in-hue step UP */
  --ds-ground:            #131217;
  --ds-ground-2:          #17161c;
  --ds-surface:           #1c1a22;
  --ds-surface-2:         #242129;
  --ds-surface-3:         #2c2933;
  --ds-surface-raised:    #242129;
  --ds-surface-hover:     #221f28;
  --ds-surface-pressed:   #282430;   /* hover < pressed < selected, in hue */
  --ds-surface-selected:  #2e2a37;
  --ds-surface-inverse:   #f4f2f7;
  --ds-surface-inverse-hover: #e4e1ea;  /* committed-dark: restated so base's light #262626 cannot leak (foundations pass) */
  --ds-skeleton:          #2a2731;   /* loading fill, in-hue — restated for the same reason */
  --ds-scrim:             rgba(0, 0, 0, .60);
  /* -- ink: white tiers */
  --ds-ink:               #ffffff;
  --ds-ink-2:             #ededf0;   /* 93% */
  --ds-ink-muted:         #a9a6b3;   /* 66% — 6.6:1 on surface-2 (Rox's #686868 would fail) */
  --ds-ink-faint:         #605c6b;   /* 40% */
  --ds-ink-inverse:       #131217;
  --ds-ink-on-primary:    #131217;
  --ds-ink-on-accent:     #131217;
  --ds-ink-code:          #ededf0;
  /* -- lines: ~12% white on ground; dashed rules are a pattern choice, not a token */
  --ds-rule-faint:        #1f1d25;   /* column rules, fainter than rows — restated (foundations pass) */
  --ds-rule-soft:         #232129;
  --ds-rule:              #2e2c35;   /* 1.25:1 on surface */
  --ds-rule-strong:       #3a3743;
  --ds-border:            #353240;
  --ds-border-strong:     #4a4657;
  /* -- action: white primary; NO accent — every accent token resolves to ink */
  --ds-primary-fill:        #ffffff;
  --ds-primary-fill-hover:  #e6e4ea;
  --ds-accent:              #ffffff;
  --ds-accent-hover:        #e6e4ea;
  --ds-accent-ink:          #ffffff;
  --ds-accent-tint:         rgba(255, 255, 255, .08);
  --ds-accent-soft:         rgba(255, 255, 255, .40);
  --ds-accent-2:            #ededf0;
  --ds-accent-2-ink:        #ffffff;
  --ds-accent-2-tint:       rgba(255, 255, 255, .08);
  /* -- semantic + data: base dark set (restated so light-mode noir is complete) */
  --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: #ffffff; --ds-chart-ramp-2: #a9a6b3; --ds-chart-ramp-3: #605c6b;
  /* -- depth: zero resting shadows; floats separate by a 1px light edge + deep drop */
  --ds-shadow-lift:   0 0 0 0 transparent;
  --ds-shadow-card:   0 0 0 0 transparent;
  --ds-shadow-float:  0 16px 40px rgba(0, 0, 0, .60), 0 0 0 1px rgba(255, 255, 255, .10);
  --ds-shadow-modal:  0 32px 96px rgba(0, 0, 0, .70), 0 0 0 1px rgba(255, 255, 255, .10);
  --ds-shadow-object: 0 8px 24px rgba(0, 0, 0, .60);
  --ds-overlay-fill:   rgba(0, 0, 0, .65);
  --ds-glass-fill:     rgba(28, 26, 34, .55);
  --ds-glass-border:   rgba(255, 255, 255, .14);
  --ds-texture-color:  rgba(255, 255, 255, .06);
  --ds-illustration-ground: #1c1a22;
  /* -- shape: drafting — 0 everywhere, pills untouched */
  --ds-radius-scale:  0;
  /* -- type: grotesk display at regular weight, mono caps label lane */
  --ds-font-sans:      "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --ds-font-mono:      "IBM Plex Mono", "Berkeley Mono", ui-monospace, "SF Mono", Menlo, monospace;
  --ds-font-label:     var(--ds-font-mono);
  --ds-text-base:      16px;
  --ds-display-weight: 500;
  --ds-display-tracking: -0.03em;
  --ds-heading-weight: 500;
  --ds-label-case:     uppercase;      /* fallback for data-labels="upper" */
  --ds-label-tracking-upper: .06em;    /* the theme's uppercase tracking; data-labels="upper" reads it (batch-12) */
  --ds-label-tracking: var(--ds-label-tracking-upper);
  /* -- space: 8px unit, comfortable, generous sections */
  --ds-space-unit:       8px;
  --ds-density-scale:    1.2;
  --ds-section-gap-units: 16;
  --ds-container-max:    1464px;       /* Rox container at 1920 */
  /* -- CSS-only fallbacks */
  --ds-card-bg:        var(--ds-ground);     /* data-depth="hairline" */
  --ds-card-border:    var(--ds-rule);
  --ds-card-shadow:    0 0 0 0 transparent;   /* composable none (CONTRACT §11) */
  --ds-ink-link:       var(--ds-ink);        /* data-accent-scope="none" */
  --ds-ring:           var(--ds-ink);
  --ds-accent-line:    var(--ds-ink);
  --ds-border-selected: var(--ds-ink);
  --ds-selection-graph: var(--ds-ink);
  --ds-selected-bg:    var(--ds-surface-selected);
  --ds-selected-ink:   var(--ds-ink);
  --ds-selected-line:  transparent;
}
/* -- CSS-only fallbacks restated for every host ISLAND under the theme root (batch-12) ---------
   A host (a data-mode / data-density / data-band … section) re-derives base's DEFAULTS for the
   derived tokens, so the fallbacks the light block sets on the theme root never reached a dark
   chapter, a tint band or a compact toolbar (cards took the surface step). (0,1,0) through
   :where() — later than base's host rule, so it wins; below every explicit (0,2,0) attribute, so a
   page's own data-depth / data-buttons / data-selection still wins on the element that carries it. */
:where([data-theme="noir"]) :is([data-mode], [data-density], [data-depth], [data-selection], [data-buttons],
      [data-labels], [data-controls], [data-accent-scope], [data-hover], [data-band="tint"], [data-band="dark"], [data-band="accent"]) {
  --ds-card-bg: var(--ds-ground);   /* data-depth="hairline"; the accent-scope="none" roles re-derive to the accent, which IS the ink here */
}
/* ---- dark. Restates EVERY colour the light block sets (contract rule D-3);
   the guarded media form below is byte-identical (generated from one source).
   Also written for a descendant data-mode="dark" island and data-band="dark" (batch-12). */
[data-theme="noir"][data-mode="dark"],
[data-theme="noir"] [data-mode="dark"],
[data-theme="noir"] [data-band="dark"] {
  color-scheme: dark;
  --ds-ground: #0f0e12; --ds-ground-2: #131217; --ds-surface: #1c1a22; --ds-surface-2: #242129; --ds-surface-3: #2c2933;
  --ds-surface-raised: #242129; --ds-surface-hover: #221f28; --ds-surface-pressed: #282430; --ds-surface-selected: #2e2a37; --ds-surface-inverse: #f4f2f7;
  --ds-scrim: rgba(0, 0, 0, .60); --ds-surface-inverse-hover: #e4e1ea; --ds-skeleton: #2a2731; --ds-rule-faint: #1f1d25;
  --ds-ink: #ffffff; --ds-ink-2: #ededf0; --ds-ink-muted: #a9a6b3; --ds-ink-faint: #605c6b; --ds-ink-inverse: #131217;
  --ds-ink-on-primary: #131217; --ds-ink-on-accent: #131217; --ds-ink-code: #ededf0;
  --ds-rule-soft: #232129; --ds-rule: #2e2c35; --ds-rule-strong: #3a3743; --ds-border: #353240; --ds-border-strong: #4a4657;
  --ds-primary-fill: #ffffff; --ds-primary-fill-hover: #e6e4ea;
  --ds-accent: #ffffff; --ds-accent-hover: #e6e4ea; --ds-accent-ink: #ffffff; --ds-accent-tint: rgba(255, 255, 255, .08); --ds-accent-soft: rgba(255, 255, 255, .40);
  --ds-accent-2: #ededf0; --ds-accent-2-ink: #ffffff; --ds-accent-2-tint: rgba(255, 255, 255, .08);
  --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: #ffffff; --ds-chart-ramp-2: #a9a6b3; --ds-chart-ramp-3: #605c6b;
  --ds-shadow-lift: 0 0 0 0 transparent; --ds-shadow-card: 0 0 0 0 transparent;
  --ds-shadow-float: 0 16px 40px rgba(0, 0, 0, .60), 0 0 0 1px rgba(255, 255, 255, .10);
  --ds-shadow-modal: 0 32px 96px rgba(0, 0, 0, .70), 0 0 0 1px rgba(255, 255, 255, .10);
  --ds-shadow-object: 0 8px 24px rgba(0, 0, 0, .60);
  --ds-overlay-fill: rgba(0, 0, 0, .65); --ds-glass-fill: rgba(28, 26, 34, .55); --ds-glass-border: rgba(255, 255, 255, .14);
  --ds-texture-color: rgba(255, 255, 255, .06); --ds-illustration-ground: #1c1a22;
}
@media (prefers-color-scheme: dark) {
  :root[data-theme="noir"]:not([data-mode="light"]),
  :root:not([data-mode="light"]) [data-theme="noir"]:not([data-mode="light"]) {
    color-scheme: dark;
    --ds-ground: #0f0e12; --ds-ground-2: #131217; --ds-surface: #1c1a22; --ds-surface-2: #242129; --ds-surface-3: #2c2933;
    --ds-surface-raised: #242129; --ds-surface-hover: #221f28; --ds-surface-pressed: #282430; --ds-surface-selected: #2e2a37; --ds-surface-inverse: #f4f2f7;
    --ds-scrim: rgba(0, 0, 0, .60); --ds-surface-inverse-hover: #e4e1ea; --ds-skeleton: #2a2731; --ds-rule-faint: #1f1d25;
    --ds-ink: #ffffff; --ds-ink-2: #ededf0; --ds-ink-muted: #a9a6b3; --ds-ink-faint: #605c6b; --ds-ink-inverse: #131217;
    --ds-ink-on-primary: #131217; --ds-ink-on-accent: #131217; --ds-ink-code: #ededf0;
    --ds-rule-soft: #232129; --ds-rule: #2e2c35; --ds-rule-strong: #3a3743; --ds-border: #353240; --ds-border-strong: #4a4657;
    --ds-primary-fill: #ffffff; --ds-primary-fill-hover: #e6e4ea;
    --ds-accent: #ffffff; --ds-accent-hover: #e6e4ea; --ds-accent-ink: #ffffff; --ds-accent-tint: rgba(255, 255, 255, .08); --ds-accent-soft: rgba(255, 255, 255, .40);
    --ds-accent-2: #ededf0; --ds-accent-2-ink: #ffffff; --ds-accent-2-tint: rgba(255, 255, 255, .08);
    --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: #ffffff; --ds-chart-ramp-2: #a9a6b3; --ds-chart-ramp-3: #605c6b;
    --ds-shadow-lift: 0 0 0 0 transparent; --ds-shadow-card: 0 0 0 0 transparent;
    --ds-shadow-float: 0 16px 40px rgba(0, 0, 0, .60), 0 0 0 1px rgba(255, 255, 255, .10);
    --ds-shadow-modal: 0 32px 96px rgba(0, 0, 0, .70), 0 0 0 1px rgba(255, 255, 255, .10);
    --ds-shadow-object: 0 8px 24px rgba(0, 0, 0, .60);
    --ds-overlay-fill: rgba(0, 0, 0, .65); --ds-glass-fill: rgba(28, 26, 34, .55); --ds-glass-border: rgba(255, 255, 255, .14);
    --ds-texture-color: rgba(255, 255, 255, .06); --ds-illustration-ground: #1c1a22;
  }
}
/* components/_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); }
/* components/button-primary/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);
}
/* components/button-secondary/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. */
/* components/icon-button/icon-button.css */
/* ============================================================================
   components/icon-button/icon-button.css — Icon button (core · S0)
   Root `.ds-icon-button` is the <button> itself: a square (or circle) the
   height of the control ladder holding one glyph. It never paints
   --ds-primary-fill (an icon-only primary is button-primary's circular submit
   or a fab). Variants by data-variant; shape by --_radius; hit target ≥ 32.
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_size --_glyph --_radius.
   ========================================================================== */
.ds-icon-button {
  --_size:   var(--ds-size-h);                    /* 36 · 32 sm · 44 lg · ×density        */
  --_glyph:  var(--ds-icon-size);                 /* 16; 20 (--ds-icon-size-row) at lg   */
  --_radius: var(--ds-radius-sm);                 /* square-ish; circle = radius-pill     */
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: var(--_size);
  height: var(--_size);
  padding: 0;
  font: inherit;
  line-height: 1;
  color: var(--ds-ink-2);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--_radius);
  box-shadow: var(--ds-shadow-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),
              color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-icon-button > svg,
.ds-icon-button__glyph {
  width: var(--_glyph);
  height: var(--_glyph);
  flex: none;
  fill: none; stroke: currentColor;               /* _base.css fills every svg — restate */
  stroke-width: var(--ds-icon-stroke);
  stroke-linecap: round; stroke-linejoin: round;
}
.ds-icon-button__glyph svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
/* filled glyphs (a kebab's dots, a heart) opt in per svg */
.ds-icon-button > svg[data-fill], .ds-icon-button__glyph svg[data-fill] { fill: currentColor; stroke: none; }
/* ---- states ------------------------------------------------------------------ */
.ds-icon-button:hover,
.ds-icon-button[data-state="hover"] {
  color: var(--ds-ink);
  background: var(--ds-hover-bg);
  border-color: var(--ds-border-strong);
}
.ds-icon-button:active,
.ds-icon-button[data-state="pressed"] { background: var(--ds-surface-2); color: var(--ds-ink); }
.ds-icon-button:focus-visible,
.ds-icon-button[data-state="focus"] {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: var(--ds-ring-offset);
}
/* active tool (aria-pressed): neutral selected tint + selected ink; hsajl's accent glyph
   is the theme's job (data-selection="accent") */
.ds-icon-button[aria-pressed="true"],
.ds-icon-button[aria-expanded="true"] {
  background: var(--ds-selected-bg);
  color: var(--ds-selected-ink);
  border-color: var(--ds-border-strong);
}
/* disabled: glyph goes faint, geometry unchanged [manychat-web-64] [givingli-web-15] */
.ds-icon-button:disabled,
.ds-icon-button[aria-disabled="true"] {
  color: var(--ds-ink-faint);
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  box-shadow: none;
  cursor: not-allowed;
}
/* destructive: --ds-danger-ink glyph, danger tint on hover — the colour code grammarly lacks */
.ds-icon-button[data-tone="danger"] { color: var(--ds-danger-ink); }
.ds-icon-button[data-tone="danger"]:hover { background: var(--ds-danger-tint); border-color: var(--ds-danger); color: var(--ds-danger-ink); }
.ds-icon-button[data-tone="danger"]:focus-visible { outline-color: var(--ds-danger); }
/* loading: glyph hidden, spinner in currentColor, same box */
.ds-icon-button[aria-busy="true"] { pointer-events: none; }
.ds-icon-button[aria-busy="true"] > * { visibility: hidden; }
.ds-icon-button[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: var(--_glyph);
  height: var(--_glyph);
  border: 2px solid transparent;
  border-block-start-color: currentColor;
  border-inline-end-color: currentColor;
  border-radius: var(--ds-radius-pill);
  animation: ds-icon-button-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-icon-button-spin { to { transform: rotate(360deg); } }
/* ---- sizes ------------------------------------------------------------------- */
.ds-icon-button[data-size] { --_size: var(--ds-size-h); }
.ds-icon-button[data-size="lg"] { --_glyph: var(--ds-icon-size-row); }
/* shape switch usable on any variant */
.ds-icon-button[data-shape="circle"] { --_radius: var(--ds-radius-pill); }
/* ============================================================================
   VARIANTS. Unmarked root = jstov (house): bordered square, 36/r-sm (32/r-sm
   in dense toolbars via data-size="sm"), 16px glyph in --ds-ink-2, ghost only
   in row/tile chrome.
   ========================================================================== */
/* bordered-square — 32 r8 [navattic-web-153] [screenshot-2026-09-17-125644] [hsvu79cweaarswf];
   28 r6 in retool chrome [retool-web-25]. sm on the ladder; the 8px radius is --ds-radius-md
   at 32 (navattic) — kept as the variant's own radius since a 32px box carries r8 fine. */
.ds-icon-button[data-variant="bordered-square"] {
  --_size: var(--ds-control-h-sm);
  --_radius: var(--ds-radius-md);
}
.ds-icon-button[data-variant="bordered-square"][data-size="xs"] {         /* retool 28 r6 */
  --_size: calc(var(--ds-control-h-sm) - var(--ds-space-1));
  --_radius: var(--ds-radius-sm);
}
/* ghost-glyph — 20px glyph, no container; hit box stays 32+ [grammarly-web-158-acordian]
   [manychat-web-184] [confluence-web-23] [elevenlabs-web-49] */
.ds-icon-button[data-variant="ghost-glyph"] {
  --_glyph: var(--ds-icon-size-row);
  background: transparent;
  border-color: transparent;
  box-shadow: none;
  color: var(--ds-ink-muted);
}
.ds-icon-button[data-variant="ghost-glyph"]:hover { background: var(--ds-hover-bg); border-color: transparent; color: var(--ds-ink); }
.ds-icon-button[data-variant="ghost-glyph"]:disabled { background: transparent; border-color: transparent; }
/* hairline-circle — 40 [oku-web-88] gear; 36 ring arrows [manychat-web-64]; 30 close
   [luma-creating-an-event-00-03]: 1px border, surface fill, full round */
.ds-icon-button[data-variant="hairline-circle"] {
  --_radius: var(--ds-radius-pill);
  --_size: calc(var(--ds-control-h) + var(--ds-space-1));       /* 40 */
}
.ds-icon-button[data-variant="hairline-circle"][data-size="md"] { --_size: var(--ds-control-h); }       /* 36 arrows */
.ds-icon-button[data-variant="hairline-circle"][data-size="sm"] { --_size: var(--ds-control-h-sm); }    /* 32 (luma 30) close */
/* filled-circle-close — 32 tint disc, no border, dark glyph [luma-creating-an-event-20-23] */
.ds-icon-button[data-variant="filled-circle-close"] {
  --_size: var(--ds-control-h-sm);
  --_radius: var(--ds-radius-pill);
  color: var(--ds-ink);
  background: var(--ds-surface-3);
  border-color: transparent;
  box-shadow: none;
}
.ds-icon-button[data-variant="filled-circle-close"]:hover { background: var(--ds-surface-selected); border-color: transparent; }
/* tint-circle — 36 tint disc, ink-2 glyph [contra-web-39] hidden-eye */
.ds-icon-button[data-variant="tint-circle"] {
  --_radius: var(--ds-radius-pill);
  background: var(--ds-surface-2);
  border-color: transparent;
  box-shadow: none;
}
.ds-icon-button[data-variant="tint-circle"]:hover { background: var(--ds-surface-3); border-color: transparent; }
/* on-media-disc — 40–44 solid disc over an image with a 1px glass ring
   [luma-creating-an-event-20-23] [luma-creating-an-event-24-27]. Paints the INVERSE surface
   (ink-black in light, near-white in dark) so the pair always reads over media. */
.ds-icon-button[data-variant="on-media-disc"] {
  --_size: var(--ds-control-h-lg);                                /* 44 */
  --_glyph: var(--ds-icon-size-row);
  --_radius: var(--ds-radius-pill);
  color: var(--ds-ink-inverse);
  background: var(--ds-surface-inverse);
  border-color: var(--ds-glass-border);
  box-shadow: var(--ds-shadow-object);
}
.ds-icon-button[data-variant="on-media-disc"]:hover { background: color-mix(in srgb, var(--ds-surface-inverse) 86%, var(--ds-ink-inverse)); border-color: var(--ds-glass-border); color: var(--ds-ink-inverse); }
/* kebab — 36 bordered, three INK dots (manychat's accent dots are the flagged weakness:
   an overflow menu is chrome, not an action) [manychat-web-114] [manychat-web-82] */
.ds-icon-button[data-variant="kebab"] { color: var(--ds-ink-2); }
.ds-icon-button[data-variant="kebab"] > svg { fill: currentColor; stroke: none; }
/* three-weight-family — filled circle / bare glyph / bordered: three weights of "icon
   action" by importance on one screen [luma-creating-an-event-20-23]. A composition of
   filled-circle-close + ghost-glyph + the default; no rule of its own. */
/* ---- state rules re-asserted AFTER every variant block (batch-6 finding): a variant that sets
   background/border/color at (0,2,0) would otherwise beat aria-pressed / :disabled written above it.
   Specificity bumped by repeating the root class so no variant can outrank a state. ---- */
.ds-icon-button.ds-icon-button[aria-pressed="true"],
.ds-icon-button.ds-icon-button[aria-expanded="true"] {
  background: var(--ds-selected-bg);
  color: var(--ds-selected-ink);
}
.ds-icon-button.ds-icon-button:disabled,
.ds-icon-button.ds-icon-button[aria-disabled="true"] {
  color: var(--ds-ink-faint);
  cursor: not-allowed;
}
/* components/card/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; }
/* components/carousel/carousel.css */
/* ============================================================================
   carousel — carousel / shelf                        (taxonomy §D · common · S0)
   Root: <section class="ds-carousel" aria-roledescription="carousel" aria-label="…">
   Parts: (slot: a .ds-section-header with a .ds-pagination in its actions — composed by class) ·
          __viewport (the clipping box; owns the overflow treatment) · __track (ul: the scroll-snap row,
          N-up via --_cols, fixed ratio via --_ratio) · __item (li: one slide/tile) · __tile (a plain media/tint
          tile drawn here so the demo renders before media-tile / tile ship) · __caption (label under a tile) ·
          __marquee (fibery / heron: an animated strip, duplicated content) · __chip (marquee chip)
   Overflow treatments (data-overflow): paged (default — snap pages, no visible scrollbar; the header pager
     moves it) · peek (the next tile is cut at the viewport edge — braintrust; ALSO the only affordance there)
     · fade (end fade — attio) · clip (hard clip — homerun, a weakness kept for reference) · marquee (fibery, heron)
   Variants (data-variant): givingli-shelf-6up · braintrust-peek-3up · manychat-recommendation-2up ·
     homerun-blank-first-template-row · attio-integration-tile-row-endfade · fibery-chip-marquee · heron-benefit-ticker
   Knobs: --_cols (N-up) · --_gap · --_ratio (tile aspect) · --_min-item (floor so phones show ~2.5 tiles) ·
     --_peek (how much of the next tile shows) · --_fade (end-fade length) · --_speed (marquee seconds) ·
     --_ring-room (track inset so a tile's selected outline is never clipped; 4 px) ·
     --_bleed (data-bleed="end": how far the viewport runs into the gutter; 48 px)
   Bleed (data-bleed="end"): the viewport runs --_bleed into the end gutter and the peek spends it (Oku gallery)
   ========================================================================== */
.ds-carousel svg[fill="none"] { fill: none; }
.ds-carousel {
  --_cols:     4;
  --_gap:      var(--ds-space-3);
  --_ratio:    16 / 9;
  --_min-item: 140px;
  --_peek:     0px;
  --_fade:     var(--ds-mock-fade);
  --_speed:    40s;
  --_ring-room: var(--ds-space-1);             /* 4 px: 2 px selected outline + 2 px offset */
  --_bleed:    var(--ds-space-12);             /* data-bleed: how far the viewport runs into the gutter */
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-4);
  min-width: 0;
  max-width: 100%;
}
.ds-carousel__viewport { position: relative; min-width: 0; max-width: 100%; }
.ds-carousel__track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: max(var(--_min-item), calc((100% - (var(--_cols) - 1) * var(--_gap) - var(--_peek)) / var(--_cols)));
  gap: var(--_gap);
  list-style: none;
  /* ring room (DESK-327): a composed tile's 2 px selected outline sits 2 px OUTSIDE it (4 px total), and an
     overflow-x scroller clips everything past its padding box — so the track pads --_ring-room on every side and
     pulls the same amount back with a negative margin. Tiles stay flush with the header; outlines are not cut. */
  padding: var(--_ring-room);
  margin: calc(-1 * var(--_ring-room));
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: var(--_ring-room);    /* snap lands the first tile with its ring room, not on the clip line */
  scrollbar-width: none;                       /* paged: the pager is the affordance; keyboard + swipe still scroll */
  -webkit-overflow-scrolling: touch;
}
.ds-carousel__track::-webkit-scrollbar { display: none; }
.ds-carousel__item { min-width: 0; scroll-snap-align: start; display: flex; flex-direction: column; gap: var(--ds-space-2); }
.ds-carousel__item:last-child { scroll-snap-align: end; }
/* a plain tile: fixed ratio, tint fill, media radius — the shelf's unit until media-tile / tile ship */
.ds-carousel__tile {
  display: flex; align-items: flex-end;
  aspect-ratio: var(--_ratio);
  width: 100%; max-width: 100%;
  border-radius: var(--ds-media-radius);
  background: var(--ds-illustration-ground);
  border: var(--ds-border-width) solid transparent;
  color: var(--ds-ink-2);
  padding: var(--ds-space-3);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  overflow: hidden;
  text-decoration: none;
  transition: transform 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-carousel__tile[data-hue="1"] { background: var(--ds-data-1-tint); color: var(--ds-data-1-ink); }
.ds-carousel__tile[data-hue="2"] { background: var(--ds-data-2-tint); color: var(--ds-data-2-ink); }
.ds-carousel__tile[data-hue="3"] { background: var(--ds-data-3-tint); color: var(--ds-data-3-ink); }
.ds-carousel__tile[data-hue="4"] { background: var(--ds-data-4-tint); color: var(--ds-data-4-ink); }
.ds-carousel__tile[data-hue="5"] { background: var(--ds-data-5-tint); color: var(--ds-data-5-ink); }
.ds-carousel__tile[data-hue="6"] { background: var(--ds-data-6-tint); color: var(--ds-data-6-ink); }
.ds-carousel__tile[data-hue="7"] { background: var(--ds-data-7-tint); color: var(--ds-data-7-ink); }
.ds-carousel__tile[data-hue="8"] { background: var(--ds-data-8-tint); color: var(--ds-data-8-ink); }
.ds-carousel__tile:is(a, button):hover,
.ds-carousel__tile[data-state="hover"] { border-color: var(--ds-border-strong); box-shadow: var(--ds-hover-shadow); }
.ds-carousel__tile[aria-current="true"], .ds-carousel__tile[aria-selected="true"] { border-color: var(--ds-border-selected); border-width: 2px; }
.ds-carousel__tile[data-state="empty"] { background: transparent; border: var(--ds-border-width) dashed var(--ds-rule); color: var(--ds-ink-muted); align-items: center; justify-content: center; text-align: center; }
.ds-carousel__tile[aria-busy="true"] { background: var(--ds-skeleton); color: transparent; }
.ds-carousel__tile[aria-disabled="true"] { background: var(--ds-surface-3); color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-carousel__caption { font-size: var(--ds-text-sm); color: var(--ds-ink-2); line-height: var(--ds-lh-list); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-carousel__badge {                                    /* givingli "Premium": translucent glass badge, top-left */
  position: absolute; inset-block-start: var(--ds-space-2); inset-inline-start: var(--ds-space-2);
  padding: var(--ds-space-0-5) var(--ds-space-2); border-radius: var(--ds-radius-pill);
  background: var(--ds-glass-fill); border: var(--ds-border-width) solid var(--ds-glass-border);
  font-size: var(--ds-text-xs); font-weight: var(--ds-weight-semibold); color: var(--ds-ink);
}
.ds-carousel__item { position: relative; }
/* ---- overflow treatments ---- */
.ds-carousel[data-overflow="peek"]  { --_peek: var(--ds-space-12); }               /* 48 px of the next tile shows */
.ds-carousel[data-overflow="fade"] .ds-carousel__viewport {
  -webkit-mask-image: linear-gradient(to right, var(--ds-ink) calc(100% - var(--_fade)), transparent);
          mask-image: linear-gradient(to right, var(--ds-ink) calc(100% - var(--_fade)), transparent);
}
.ds-carousel[data-overflow="clip"] .ds-carousel__track { overflow: hidden; scroll-snap-type: none; }   /* homerun: hard clip, no affordance (weakness) */
.ds-carousel[data-overflow="marquee"] .ds-carousel__viewport {
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, var(--ds-ink) var(--_fade), var(--ds-ink) calc(100% - var(--_fade)), transparent);
          mask-image: linear-gradient(to right, transparent, var(--ds-ink) var(--_fade), var(--ds-ink) calc(100% - var(--_fade)), transparent);
}
/* ---- gutter bleed (data-bleed="end", additive 2026-09-25, DESK-327) ----
   The root keeps max-width: 100% (the header + pager stay in the column); only the VIEWPORT runs --_bleed past the
   column's end edge into the page gutter. --_peek defaults to --_bleed, so the first --_cols tiles land exactly on
   the parent grid's lines and the next tile is cut at the SHEET edge — the peek is the overflow cue. Set --_bleed to
   the real gutter (the space between the column and the sheet edge) and let the sheet clip (overflow: clip). */
.ds-carousel[data-bleed="end"] { --_peek: var(--_bleed); }
.ds-carousel[data-bleed="end"] .ds-carousel__viewport { max-width: none; margin-inline-end: calc(-1 * var(--_bleed)); }
.ds-carousel[data-bleed="end"] .ds-carousel__track { scroll-padding-inline-end: calc(var(--_ring-room) + var(--_bleed)); }
/* ---- states on the root ---- */
.ds-carousel[data-state="empty"] .ds-carousel__track { scroll-snap-type: none; }
.ds-carousel[aria-busy="true"] .ds-carousel__tile { background: var(--ds-skeleton); color: transparent; border-color: transparent; }
.ds-carousel[aria-busy="true"] .ds-carousel__caption { color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs); width: 60%; }
/* ---- marquee strip (fibery two rows / heron ticker) ---- */
.ds-carousel__marquee {
  display: flex; gap: var(--_gap); width: max-content;
  animation: ds-carousel-marquee var(--_speed) linear infinite;
  animation-play-state: var(--ds-ambient-play, running);   /* AMBIENT loop: data-ambient="off" / --ds-ambient-play: paused parks it (§13.5) */
}
.ds-carousel__marquee[data-direction="reverse"] { animation-direction: reverse; }
.ds-carousel__viewport:hover .ds-carousel__marquee,
.ds-carousel__viewport:focus-within .ds-carousel__marquee { animation-play-state: paused; }     /* readable on demand */
@keyframes ds-carousel-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .ds-carousel__marquee { animation: none; } .ds-carousel[data-overflow="marquee"] .ds-carousel__viewport { overflow-x: auto; -webkit-mask-image: none; mask-image: none; } }
.ds-carousel__rows { display: flex; flex-direction: column; gap: var(--_gap); }
.ds-carousel__chip {
  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-radius: var(--ds-radius-pill);
  border: var(--ds-border-width) solid var(--ds-border);
  background: var(--ds-surface);
  color: var(--ds-ink-2); font-size: var(--ds-text-sm); white-space: nowrap;
}
.ds-carousel__chip svg { width: var(--ds-icon-size); height: var(--ds-icon-size); stroke: currentColor; stroke-width: var(--ds-icon-stroke); }
/* =========================================================================
   Designer variants
   ========================================================================= */
/* givingli: 6 fixed-ratio 5:7 tiles, 12 px gap, r12, paged by the header's two-way pill; Premium badge */
.ds-carousel[data-variant="givingli-shelf-6up"] { --_cols: 6; --_gap: var(--ds-space-3); --_ratio: 5 / 7; --_min-item: 150px; }
.ds-carousel[data-variant="givingli-shelf-6up"] .ds-carousel__tile { border-radius: var(--ds-radius-lg); box-shadow: var(--ds-shadow-object); border: 0; }   /* the reference's soft card shadow — a physical card */
/* braintrust: 3 cards + the 4th cut at the viewport edge; 220×272 r16 pastel tiles */
.ds-carousel[data-variant="braintrust-peek-3up"] { --_cols: 3; --_gap: var(--ds-space-5); --_ratio: 220 / 272; --_min-item: 200px; --_peek: var(--ds-space-12); }
.ds-carousel[data-variant="braintrust-peek-3up"] .ds-carousel__tile { border-radius: var(--ds-radius-xl); align-items: flex-start; }
/* manychat: 2-up recommendation cards (illustration left, copy right), 12 px gutter, ring arrows in the heading */
.ds-carousel[data-variant="manychat-recommendation-2up"] { --_cols: 2; --_gap: var(--ds-space-3); --_min-item: 260px; }
.ds-carousel[data-variant="manychat-recommendation-2up"] .ds-carousel__card {
  display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: var(--ds-space-4); align-items: center;
  min-height: 128px; padding: var(--ds-space-3);
  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); color: var(--ds-ink); text-decoration: none;
}
.ds-carousel[data-variant="manychat-recommendation-2up"] .ds-carousel__card:hover { background: var(--ds-hover-bg); }
.ds-carousel[data-variant="manychat-recommendation-2up"] .ds-carousel__card .ds-carousel__tile { --_ratio: 1; border-radius: var(--ds-radius-sm); padding: var(--ds-space-2); }
.ds-carousel[data-variant="manychat-recommendation-2up"] .ds-carousel__card b { display: block; font-weight: var(--ds-weight-semibold); margin-block-end: var(--ds-space-1); }
.ds-carousel[data-variant="manychat-recommendation-2up"] .ds-carousel__card p { margin: 0; color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }
/* homerun: fixed 178×100 template thumbnails at 24 px gap, first = ground well with +, hard clip */
.ds-carousel[data-variant="homerun-blank-first-template-row"] { --_gap: var(--ds-space-6); --_ratio: 178 / 100; }
.ds-carousel[data-variant="homerun-blank-first-template-row"] .ds-carousel__track { grid-auto-columns: 178px; }
.ds-carousel[data-variant="homerun-blank-first-template-row"] .ds-carousel__tile { border-radius: var(--ds-radius-lg); background: var(--ds-surface-2); }
.ds-carousel[data-variant="homerun-blank-first-template-row"] .ds-carousel__item:first-child .ds-carousel__tile { background: var(--ds-ground-2); color: var(--ds-ink-2); align-items: center; justify-content: center; font-size: var(--ds-text-2xl); font-weight: var(--ds-weight-regular); }
/* attio: 56 px dark rounded squares in a row, end fade (the dark chapter — rendered on the inverse surface) */
.ds-carousel[data-variant="attio-integration-tile-row-endfade"] { --_gap: var(--ds-space-3); --_fade: var(--ds-space-20); }
.ds-carousel[data-variant="attio-integration-tile-row-endfade"] .ds-carousel__track { grid-auto-columns: 56px; }
.ds-carousel[data-variant="attio-integration-tile-row-endfade"] .ds-carousel__tile {
  --_ratio: 1; border-radius: var(--ds-radius-md);
  background: var(--ds-surface-2); border-color: var(--ds-rule);
  align-items: center; justify-content: center; padding: 0; color: var(--ds-ink-2); font-size: var(--ds-text-xs); font-weight: var(--ds-weight-bold);
}
/* fibery: two rows of chips, clipped both sides, drifting in opposite directions */
.ds-carousel[data-variant="fibery-chip-marquee"] { --_gap: var(--ds-space-2); --_speed: 48s; }
/* heron: a 22 px ticker of icon + two-word chips — chips lose their box and shrink to the label lane */
.ds-carousel[data-variant="heron-benefit-ticker"] { --_gap: var(--ds-space-8); --_speed: 30s; --_fade: var(--ds-space-8); }
.ds-carousel[data-variant="heron-benefit-ticker"] .ds-carousel__chip {
  min-height: var(--ds-space-6); padding: 0; border: 0; background: transparent;
  font-family: var(--ds-font-label); font-size: var(--ds-text-xs); letter-spacing: var(--ds-label-tracking); text-transform: var(--ds-label-case); color: var(--ds-ink-muted);
}
.ds-carousel[data-variant="heron-benefit-ticker"] .ds-carousel__viewport { border-block: var(--ds-border-width) solid var(--ds-rule); padding-block: var(--ds-space-1); }
/* components/chapter-header/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); }
/* components/code-snippet/code-snippet.css */
/* ============================================================================
   components/code-snippet/code-snippet.css — Code snippet / command bar   taxonomy-components.md §G · common · S1
   Root `.ds-code-snippet` is ONE line of code or a shell command in a box: an optional
   mono eyebrow, a prompt glyph, the command (user-selectable, truncating), an optional
   language tag and a composed copy control. It is the canonical form of cta-block's
   command bar (__command / __select / __cmd / __copy / __copy-done are superseded) and
   the line form used inside terminal-view. Not a code BLOCK (multi-line source), not an
   input. `.ds-code-snippet-group` stacks lines in one box (install steps).
   Composes (root class only): icon-button (data-variant="ghost-glyph", the copy glyph),
     button-secondary (data-variant="ghost-text", the house "Copy" text button),
     button-primary (data-variant="filled-ink", the cloudflare hero bar's paper Copy).
     The composed control sits on the snippet's OWN plane (inverse in a light page), so the
     snippet recolours its rest/hover through :where() — the composed states, ring, spinner
     and geometry are untouched. The hero bar's filled-ink Copy is left alone.
   Parts: __label · __select (+ __select-glyph) · __prompt · __code · __lang · __copy
          (+ __copy-idle · __copy-done) · __status (sr-only live region)
   Tones: unmarked = the plane the variant chooses (house: surface-2 well); data-tone="inverse"
          forces --ds-surface-inverse + --ds-ink-inverse in ANY mode; data-tone="surface"
          forces the light well. Tone rules are written LAST so they beat a variant.
   Overflow: data-overflow="ellipsis" (default) | fade | wrap | scroll.
   Sizes: data-size="sm|md|lg" (32/36/44 on the ladder; 52 at comfortable density — the
          cloudflare hero bar).
   States: rest · hover (copy) · focus-visible (copy, composed ring) · data-state="copied" on
          the ROOT (2 s, JS contract in the README) · aria-disabled · aria-busy (skeleton).
   Variants (data-variant): jstov (unmarked root) · cloudflare-hero-command-bar ·
          cloudflare-card-code-box · vercel-command-bar · synara-terminal-line
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_fill --_ink --_muted --_prompt
          --_border --_radius --_h --_text --_pad-x --_pad-end --_cs-gap (not --_gap: the composed
          buttons declare their own --_gap, which would shadow it on the copy element) --_fade --_success
          --_url --_divider.
   ========================================================================== */
.ds-code-snippet {
  --_fill:    var(--ds-surface-2);                    /* house: a mono well on the page      */
  --_ink:     var(--ds-ink);
  --_muted:   var(--ds-ink-muted);                    /* label, lang, the copy glyph at rest */
  --_prompt:  var(--ds-ink-muted);                    /* house rations accent to state       */
  --_border:  var(--ds-rule);
  --_radius:  var(--ds-radius-sm);                    /* 6 · 9 at scale 1.5 (≈ ref 10)       */
  --_h:       var(--ds-size-h);                       /* 36 · 32 sm · 44 lg · ×density        */
  --_text:    var(--ds-text-sm);                      /* the mono lane: 12 @14 · 13 @15       */
  --_pad-x:   var(--ds-size-pad-x);
  --_pad-end: var(--ds-space-1-5);                    /* the copy control sits 6 px in        */
  --_cs-gap:     var(--ds-space-2-5);
  --_fade:    var(--ds-space-8);                      /* data-overflow="fade" run-out         */
  --_success: var(--ds-success-ink);                  /* the copied colour on this plane      */
  --_url:     var(--_ink);                            /* house: a URL is ink, not accent      */
  --_divider: var(--ds-rule);                         /* between lines in a group             */
  position: relative;                                 /* the sr-only status lives inside      */
  display: grid;                                      /* NOT a wrapping flex row: wrapping happens on max-content sizes,
                                                         so the copy control would drop a line before the command shrank */
  grid-template-columns: [select] auto [prompt] auto [code] minmax(0, 1fr) [lang] auto [copy] auto;
  grid-auto-rows: auto;
  align-items: center;
  align-content: center;                              /* one row or two (label) sit centred in the min-height */
  column-gap: 0;                                      /* gaps are per-part margins — an absent part leaves no phantom track gap */
  width: 100%;
  min-width: 0;
  max-width: 100%;
  min-height: var(--_h);
  padding-block: var(--ds-space-1);
  padding-inline: var(--_pad-x) var(--_pad-end);
  font-family: var(--ds-font-mono);
  font-size: var(--_text);
  line-height: var(--ds-lh-list);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
  text-align: start;
  color: var(--_ink);
  background: var(--_fill);
  border: var(--ds-border-width) solid var(--_border);
  border-radius: var(--_radius);
  box-sizing: border-box;
}
.ds-code-snippet > * { min-width: 0; }
/* the gap between parts, as a margin on every part that follows another part (the label is its own row) */
.ds-code-snippet > :not(.ds-code-snippet__label) + :not(.ds-code-snippet__status) { margin-inline-start: var(--_cs-gap); }
/* ---- parts ---------------------------------------------------------------------- */
/* mono eyebrow above the line ("TERMINAL", "macOS"): the label lane, so case follows data-labels */
.ds-code-snippet__label {
  grid-column: 1 / -1;
  grid-row: 1;
  margin: 0;
  padding-block: var(--ds-space-1-5) var(--ds-space-0-5);
  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: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--_muted);
  user-select: none;
}
/* vercel: a leading selector cell ([npm ▾] | $ …) with a hairline after it */
.ds-code-snippet__select {
  grid-column: select;
  display: inline-flex;
  align-items: center;
  align-self: stretch;
  gap: var(--ds-space-1-5);
  margin-inline-start: calc(-1 * var(--_pad-x));
  margin-block: calc(-1 * var(--ds-space-1));
  padding-inline: var(--ds-space-4) var(--ds-space-3);
  border: 0;
  border-inline-end: var(--ds-border-width) solid var(--_border);
  border-radius: 0;
  background: transparent;
  color: var(--_ink);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  white-space: nowrap;
  cursor: pointer;
  flex: none;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-code-snippet__select:hover, .ds-code-snippet__select[data-state="hover"] { background: color-mix(in srgb, var(--_ink) 8%, transparent); }
.ds-code-snippet__select:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-ring-width)); }
.ds-code-snippet__select-glyph, .ds-code-snippet__select > svg {
  inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size);
  display: inline-block; flex: none;
  fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round;
  color: var(--_muted);
}
/* the prompt glyph: decorative, never selected with the command */
.ds-code-snippet__prompt {
  grid-column: prompt;
  color: var(--_prompt);
  font-weight: var(--ds-weight-medium);
  user-select: none;
}
/* the command: selectable, ellipsis by default */
.ds-code-snippet__code {
  grid-column: code;
  min-width: 0;
  margin: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  background: transparent;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  user-select: all;                                   /* one click selects the whole command */
}
.ds-code-snippet__code[data-kind="url"] { color: var(--_url); }
/* optional language tag at the end of the line */
.ds-code-snippet__lang {
  grid-column: lang;
  font-size: var(--ds-text-xs);
  color: var(--_muted);
  user-select: none;
}
/* the copy control: a composed icon-button / button-secondary / button-primary — placement only … */
.ds-code-snippet__copy { grid-column: copy; justify-self: end; }
/* … and a TEXT copy control leaves the mono lane: the snippet's root sets --ds-font-mono for the code, and a composed
   button-primary / button-secondary sets no family of its own, so its label inherited mono (the Cloudflare bar's
   "Copy" read as code). The control is a control: sans, at the size the composed button sets. 2026-09-20 */
.ds-code-snippet__copy:where(.ds-button-primary, .ds-button-secondary) { font-family: var(--ds-font-sans); }
/* … plus its rest/hover colours on THIS plane (a ghost in a light page's dark box would
   otherwise take the page's muted ink). :where() keeps the composed control's own state
   rules — ring, pressed, disabled, spinner — at their specificity. The hero bar's filled
   primary is excluded: it paints its own plane. */
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary) {   /* (0,3,0): beats a composed variant's (0,2,0) rest rule */
  color: var(--_muted);
  background: transparent;
  border-color: transparent;
  box-shadow: none;
}
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary):hover,
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary)[data-state="hover"] {   /* (0,4,0): beats a composed variant's :hover (0,3,0) whatever the load order */
  color: var(--_ink);
  background: color-mix(in srgb, var(--_ink) 12%, transparent);
  border-color: transparent;
  box-shadow: none;
}
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary):active {
  background: color-mix(in srgb, var(--_ink) 18%, transparent);
}
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy:disabled,
.ds-code-snippet .ds-code-snippet__copy.ds-code-snippet__copy[aria-disabled="true"] {   /* (0,4,0) beats icon-button's re-asserted (0,3,0) disabled rule */
  color: color-mix(in srgb, var(--_ink) 38%, transparent);
  background: transparent;
  border-color: transparent;
}
/* the two faces of the copy control: idle (glyph / "Copy") and done (check / "Copied ✓") */
.ds-code-snippet__copy-done { display: none; }
.ds-code-snippet[data-state="copied"] .ds-code-snippet__copy-idle { display: none; }
.ds-code-snippet[data-state="copied"] .ds-code-snippet__copy-done { display: inline-flex; }
.ds-code-snippet[data-state="copied"] .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary),
.ds-code-snippet[data-state="copied"] .ds-code-snippet__copy.ds-code-snippet__copy:where(.ds-icon-button, .ds-button-secondary):hover {
  color: var(--_success);
}
/* the live region that announces "Copied" (JS fills it) */
.ds-code-snippet__status { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* ---- overflow modes ------------------------------------------------------------- */
/* fade: the tail runs out under a mask instead of an ellipsis — for URLs, where "…" reads as
   part of the address. overflow:hidden clips at the padding edge, so the padding-end zone IS
   the fade zone: a short command never reaches it, a long one fades through it. */
.ds-code-snippet[data-overflow="fade"] .ds-code-snippet__code {
  text-overflow: clip;
  padding-inline-end: var(--_fade);
  -webkit-mask-image: linear-gradient(to right, currentColor calc(100% - var(--_fade)), transparent);
  mask-image: linear-gradient(to right, currentColor calc(100% - var(--_fade)), transparent);
}
.ds-code-snippet[data-overflow="wrap"] { align-items: start; }
.ds-code-snippet[data-overflow="wrap"] .ds-code-snippet__code { white-space: pre-wrap; overflow-wrap: anywhere; text-overflow: clip; padding-block: calc((var(--_h) - 2 * var(--ds-space-1) - 1lh) / 2); }
.ds-code-snippet[data-overflow="wrap"] .ds-code-snippet__prompt { padding-block: calc((var(--_h) - 2 * var(--ds-space-1) - 1lh) / 2); }
.ds-code-snippet[data-overflow="wrap"] .ds-code-snippet__copy { align-self: start; }
.ds-code-snippet[data-overflow="scroll"] .ds-code-snippet__code { overflow-x: auto; white-space: pre; text-overflow: clip; scrollbar-width: thin; padding-block-end: var(--ds-space-0-5); }
/* ---- states on the root ----------------------------------------------------------- */
/* disabled: ink drops to faint on the deeper well, the copy control is disabled by the page */
.ds-code-snippet[aria-disabled="true"] {
  --_ink: var(--ds-ink-faint);
  --_prompt: var(--ds-ink-faint);
  --_muted: var(--ds-ink-faint);
  --_url: var(--ds-ink-faint);
  cursor: not-allowed;
}
.ds-code-snippet[aria-disabled="true"] .ds-code-snippet__code { user-select: none; }
/* loading: the command's footprint is a skeleton bar on this plane; the copy waits */
.ds-code-snippet[aria-busy="true"] .ds-code-snippet__code {
  color: transparent;
  min-width: 14ch;
  max-width: 36ch;
  height: .9em;
  border-radius: var(--ds-radius-xs);
  background: color-mix(in srgb, var(--_ink) 14%, transparent);
  user-select: none;
}
.ds-code-snippet[aria-busy="true"] .ds-code-snippet__prompt { color: color-mix(in srgb, var(--_prompt) 50%, transparent); }
.ds-code-snippet[aria-busy="true"] .ds-code-snippet__copy { pointer-events: none; opacity: .5; }
/* ============================================================================
   VARIANTS. Unmarked root = jstov (house): a hairline --ds-surface-2 well (inverse only
   when the page puts it in a dark island — the mode remap does that), the prompt in
   --ds-ink-muted (accent is rationed to state), a URL in ink, the copy control a
   ghost TEXT button "Copy" → "Copied ✓" in --ds-success-ink.
   ========================================================================== */
/* cloudflare-hero-command-bar — the 52-px bar on the dark hero: paper at 6 % + a 14 % edge with a
   blur (= the glass tokens), radius 14 (--ds-radius-md at scale 1.5), 18/8 padding, "$" in the
   brand orange, 14-px mono, a PAPER-filled 36-px "Copy" inside the bar (button-primary
   filled-ink — the reference's second filled control, kept as its designer choice; see README)
   [try-cloudflare-1440-t00] [try-cloudflare.html .cmd-bar] */
.ds-code-snippet[data-variant="cloudflare-hero-command-bar"] {
  --_fill:   var(--ds-glass-fill);
  --_border: var(--ds-glass-border);
  --_prompt: var(--ds-accent);
  --_radius: var(--ds-radius-md);
  --_pad-x:  var(--ds-space-4);
  --_pad-end: var(--ds-space-2);
  --_cs-gap:    var(--ds-space-3);
  --_url:    var(--ds-accent);
  --_h:      var(--ds-control-h-lg);                  /* 44 · 52 at comfortable density (the reference) */
  --_text:   var(--ds-text-md);
  display: inline-grid;
  width: auto;                                        /* hugs the command; max-width 100% keeps phones safe */
  -webkit-backdrop-filter: blur(var(--ds-glass-blur));
  backdrop-filter: blur(var(--ds-glass-blur));
}
/* cloudflare-card-code-box — the dark box at the foot of a white step card: --ds-surface-inverse,
   radius 10 (--ds-radius-sm at 1.5), 10 / 14 / 8 padding, 13-px mono, no prompt, a URL in the
   brand orange, a 28-px ghost copy glyph that goes success-green when copied; ellipsis
   [try-cloudflare-1440-t02] [try-cloudflare.html .code-chip] */
.ds-code-snippet[data-variant="cloudflare-card-code-box"] {
  --_fill:    var(--ds-surface-inverse);
  --_ink:     var(--ds-ink-inverse);
  --_muted:   color-mix(in srgb, var(--ds-ink-inverse) 66%, transparent);
  --_prompt:  var(--ds-accent);
  --_border:  transparent;
  --_radius:  var(--ds-radius-sm);
  --_pad-x:   var(--ds-space-3);
  --_pad-end: var(--ds-space-2);
  --_success: var(--ds-success);
  --_url:     var(--ds-accent);
  --_divider: color-mix(in srgb, var(--ds-ink-inverse) 12%, transparent);
  padding-block: var(--ds-space-2);
}
.ds-code-snippet[data-variant="cloudflare-card-code-box"] .ds-code-snippet__copy { --_size: var(--ds-control-h-sm); --_radius: var(--ds-radius-xs); }   /* icon-button's documented knobs: 32 / 40 (ref 28), radius 7 */
/* vercel-command-bar — [selector ▾] | $ command | copy, on --ds-surface with --ds-border at the
   button radius and the lg control height; the copy is a square ghost glyph with an inset ring;
   pairs with a filled pill in cta-block [vercel-page] — the canonical form of cta-block__command */
.ds-code-snippet[data-variant="vercel-command-bar"] {
  --_fill:   var(--ds-surface);
  --_border: var(--ds-border);
  --_radius: var(--ds-radius-button);
  --_h:      var(--ds-control-h-lg);
  --_text:   var(--ds-text-md);
  --_pad-x:  var(--ds-space-4);
  --_pad-end: 0px;
  --_cs-gap: var(--ds-space-2);
  width: auto;
  display: inline-grid;
  align-content: stretch;                             /* the single row fills the bar so the select + copy cells stretch edge to edge */
  padding-block: 0;
  overflow: hidden;                                   /* the square copy cell + select are clipped to the radius; their rings are inset */
}
.ds-code-snippet[data-variant="vercel-command-bar"] .ds-code-snippet__select { margin-block: 0; }
.ds-code-snippet[data-variant="vercel-command-bar"] .ds-code-snippet__copy { --_size: var(--ds-control-h-lg); --_radius: 0px; align-self: stretch; height: auto; }
.ds-code-snippet[data-variant="vercel-command-bar"] .ds-code-snippet__copy:focus-visible { outline-offset: calc(-1 * var(--ds-ring-width)); }
/* synara-terminal-line — one line INSIDE a terminal pane: no box, no radius, the pane's own ink,
   a muted "$", the copy glyph appears on hover / focus-within [hsvu79cweaarswf] */
.ds-code-snippet[data-variant="synara-terminal-line"] {
  --_fill:   transparent;
  --_border: transparent;
  --_ink:    currentColor;
  --_muted:  color-mix(in srgb, currentColor 62%, transparent);
  --_prompt: color-mix(in srgb, currentColor 62%, transparent);
  --_radius: 0px;
  --_h:      auto;
  --_pad-x:  0px;
  --_pad-end: 0px;
  --_cs-gap:    var(--ds-space-2);
  --_text:   1em;                                     /* the pane's own size */
  --_success: var(--ds-success);
  padding-block: 0;
  line-height: inherit;
}
.ds-code-snippet[data-variant="synara-terminal-line"] .ds-code-snippet__code { user-select: text; }
.ds-code-snippet[data-variant="synara-terminal-line"] .ds-code-snippet__copy { --_size: var(--ds-control-h-sm); opacity: 0; transition: opacity var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-code-snippet[data-variant="synara-terminal-line"]:hover .ds-code-snippet__copy,
.ds-code-snippet[data-variant="synara-terminal-line"]:focus-within .ds-code-snippet__copy,
.ds-code-snippet[data-variant="synara-terminal-line"][data-state="copied"] .ds-code-snippet__copy,
.ds-code-snippet[data-variant="synara-terminal-line"][data-state="hover"] .ds-code-snippet__copy { opacity: 1; }
/* ---- tones — written last so an explicit data-tone beats any variant's plane -------- */
.ds-code-snippet[data-tone="inverse"] {
  --_fill:    var(--ds-surface-inverse);
  --_ink:     var(--ds-ink-inverse);
  --_muted:   color-mix(in srgb, var(--ds-ink-inverse) 66%, transparent);
  --_border:  transparent;
  --_success: var(--ds-success);
  --_divider: color-mix(in srgb, var(--ds-ink-inverse) 12%, transparent);
}
.ds-code-snippet[data-tone="surface"] {
  --_fill:    var(--ds-surface-2);
  --_ink:     var(--ds-ink);
  --_muted:   var(--ds-ink-muted);
  --_border:  var(--ds-rule);
  --_success: var(--ds-success-ink);
  --_divider: var(--ds-rule);
}
.ds-code-snippet[data-tone="surface"][aria-disabled="true"] { --_fill: var(--ds-surface-3); --_ink: var(--ds-ink-faint); --_muted: var(--ds-ink-faint); }
/* ---- sizes — AFTER the variants and tones, so an explicit data-size beats a variant's default ---- */
.ds-code-snippet[data-size] { --_h: var(--ds-size-h); --_pad-x: var(--ds-size-pad-x); }
.ds-code-snippet[data-size="sm"] { --_text: var(--ds-text-xs); --_cs-gap: var(--ds-space-2); --_pad-end: var(--ds-space-1); --_radius: var(--ds-radius-xs); }
.ds-code-snippet[data-size="md"] { --_text: var(--ds-text-sm); }
.ds-code-snippet[data-size="lg"] { --_text: var(--ds-text-md); --_cs-gap: var(--ds-space-3); --_pad-end: var(--ds-space-2); --_radius: var(--ds-radius-md); }
/* ============================================================================
   GROUP — `.ds-code-snippet-group`: stacked lines in ONE box (install steps). The group
   paints the box; each line drops its own edge and radius and gains a divider. The group's
   data-tone / data-variant plane flows to the lines through the knobs below.
   ========================================================================== */
.ds-code-snippet-group {
  --_fill:    var(--ds-surface-2);
  --_ink:     var(--ds-ink);
  --_muted:   var(--ds-ink-muted);
  --_border:  var(--ds-rule);
  --_radius:  var(--ds-radius-sm);
  --_divider: var(--ds-rule);
  --_success: var(--ds-success-ink);
  display: flex;
  flex-direction: column;
  width: 100%;
  min-width: 0;
  background: var(--_fill);
  border: var(--ds-border-width) solid var(--_border);
  border-radius: var(--_radius);
  overflow: hidden;
  color: var(--_ink);
}
.ds-code-snippet-group > .ds-code-snippet {
  --_fill: transparent;
  --_border: transparent;
  --_radius: 0px;
  border-inline: 0;
  border-block-start: 0;
  border-radius: 0;
}
.ds-code-snippet-group > .ds-code-snippet + .ds-code-snippet { border-block-start: var(--ds-border-width) solid var(--_divider); }
.ds-code-snippet-group > .ds-code-snippet__label {
  margin: 0;
  padding: var(--ds-space-2) var(--ds-size-pad-x) 0;
  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: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--_muted);
}
.ds-code-snippet-group[data-tone="inverse"],
.ds-code-snippet-group[data-variant="cloudflare-card-code-box"] {
  --_fill:    var(--ds-surface-inverse);
  --_ink:     var(--ds-ink-inverse);
  --_muted:   color-mix(in srgb, var(--ds-ink-inverse) 66%, transparent);
  --_border:  transparent;
  --_divider: color-mix(in srgb, var(--ds-ink-inverse) 12%, transparent);
  --_success: var(--ds-success);
}
.ds-code-snippet-group[data-tone="inverse"] > .ds-code-snippet,
.ds-code-snippet-group[data-variant="cloudflare-card-code-box"] > .ds-code-snippet {
  --_ink:     var(--ds-ink-inverse);
  --_muted:   color-mix(in srgb, var(--ds-ink-inverse) 66%, transparent);
  --_prompt:  var(--ds-accent);
  --_success: var(--ds-success);
  --_url:     var(--ds-accent);
}
.ds-code-snippet-group[data-variant="cloudflare-card-code-box"] > .ds-code-snippet .ds-code-snippet__copy { --_size: var(--ds-control-h-sm); --_radius: var(--ds-radius-xs); }
/* ---- phones: the hero bar goes full width and the paper button keeps its label ------ */
@media (max-width: 480px) {
  .ds-code-snippet[data-variant="vercel-command-bar"] { display: grid; width: 100%; }
  .ds-code-snippet[data-variant="vercel-command-bar"] .ds-code-snippet__select { padding-inline: var(--ds-space-3); }
}
/* components/data-table/data-table.css */
/* ============================================================================
   data-table — Data table
   taxonomy-components.md §D · core · S1 (core anatomy S0; which variant is aesthetic)
   Anatomy: [outer border] · header row (tinted or plain) · body rows · [column rules] ·
   [selection column] · [group headers] · [ghost add row] · footer (count, tools, pagination).
   Root .ds-data-table is a <div> wrapping __scroll (overflow-x: auto) > <table class="__table">
   and an optional __footer — a <table> cannot scroll itself.
   Variants: jstov (default) · navattic-bordered-grid · retool-list-first-hairline ·
             manychat-bordered-card-table · manychat-card-row-table · clickup-grouped-list ·
             origin-transaction-list · (quicken-fill-nested-tree → tree-table)
   Knobs: --_row-h --_head-h --_pad-x --_radius --_head-bg --_rule-row --_rule-col --_cols (card-row grid) --_cover (overflow cover fill)
   Axes: data-figures="mono" (numbers + __id in the mono lane) · data-frame="none" (no outer rule/radius/fill — flush in a card body)
   Three rule grades (navattic): outer edge --ds-rule · rows --ds-rule-soft · columns --_rule-col
   (transparent unless data-columns="ruled"; the contract has no 4th grade fainter than
   rule-soft — reported as tokens_missing).
   Composes: .ds-checkbox (selection column), .ds-entity-cell (entity rows) — by root class only.
   ========================================================================== */
.ds-data-table {
  --_row-h: var(--ds-control-h);              /* 32 / 36 / 44 with density — list-first rows = control height */
  --_head-h: var(--ds-control-h-sm);          /* 28 / 32 / 40 */
  --_pad-x: var(--ds-control-pad-x);          /* 12 */
  --_radius: var(--ds-radius-md);
  --_head-bg: transparent;
  --_rule-row: var(--ds-rule-soft);
  --_rule-col: transparent;
  --_cover: var(--ds-surface);                /* overflow cover fill; declared here so no ancestor's knob leaks in */
  display: flex;
  flex-direction: column;
  min-width: 0;
  background: var(--ds-surface);              /* data surfaces are always surface + rule; data-depth does not drive tables */
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: var(--_radius);
  color: var(--ds-ink);
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-list);
}
.ds-data-table svg { fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-data-table[data-rows="entity"]      { --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-5)); }   /* 64: a two-line entity cell */
.ds-data-table[data-rows="comfortable"] { --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-8)); }   /* 76 ≈ manychat 75 */
.ds-data-table[data-columns="ruled"]    { --_rule-col: var(--ds-rule-soft); }
.ds-data-table[data-header="tint"]      { --_head-bg: var(--ds-surface-2); }
/* scroll wrapper: the overflow cue is a fixed edge shadow hidden by a cover that scrolls with the content */
.ds-data-table__scroll {
  position: relative;                        /* absolutely-positioned descendants (sr-only labels) stay inside the scroll clip */
  overflow-x: auto;
  overscroll-behavior-x: contain;
  border-radius: calc(var(--_radius) - var(--ds-border-width)) calc(var(--_radius) - var(--ds-border-width)) 0 0;
  background:
    linear-gradient(to left, var(--_cover, var(--ds-surface)) 40%, transparent) 100% 0 / var(--ds-space-8) 100% no-repeat local,
    linear-gradient(to left, var(--ds-rule), transparent) 100% 0 / var(--ds-space-4) 100% no-repeat scroll;
}
.ds-data-table__scroll:last-child { border-radius: calc(var(--_radius) - var(--ds-border-width)); }
.ds-data-table__table { width: 100%; min-width: var(--_min-w, 0); border-collapse: collapse; }
.ds-data-table__table caption { text-align: start; padding: var(--ds-space-3) var(--_pad-x); font-weight: var(--ds-weight-semibold); }
/* header row: label lane, sentence case by default (data-labels="upper" uppercases it) */
.ds-data-table__th {
  height: var(--_head-h);
  padding: 0 var(--_pad-x);
  vertical-align: middle;
  text-align: start;
  background: var(--_head-bg);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  font-family: var(--ds-font-label);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  letter-spacing: var(--ds-label-tracking);
  text-transform: var(--ds-label-case);
  color: var(--ds-ink-muted);
  white-space: nowrap;
}
.ds-data-table__th + .ds-data-table__th, .ds-data-table__td + .ds-data-table__td { border-inline-start: var(--ds-border-width) solid var(--_rule-col); }
/* sort control lives inside the th so the ring has a box; caret shows direction (manychat's stacked ▲▼ is the weakness) */
.ds-data-table__sort {
  appearance: none;
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  min-height: var(--ds-control-h-sm);
  margin-inline: calc(-1 * var(--ds-space-1));
  padding: 0 var(--ds-space-1);
  border: 0;
  border-radius: var(--ds-radius-xs);
  background: none;
  font: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  color: inherit;
  cursor: pointer;
}
.ds-data-table__sort:hover { color: var(--ds-ink); }
.ds-data-table__sort svg { width: 12px; height: 12px; opacity: 0; transition: opacity var(--ds-dur-fast) var(--ds-ease-standard), transform var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-data-table__sort:hover svg { opacity: 1; color: var(--ds-ink-faint); }
.ds-data-table__th[aria-sort="ascending"] .ds-data-table__sort svg, .ds-data-table__th[aria-sort="descending"] .ds-data-table__sort svg { opacity: 1; color: var(--ds-ink); }
.ds-data-table__th[aria-sort="descending"] .ds-data-table__sort svg { transform: rotate(180deg); }
.ds-data-table__th[aria-sort="ascending"], .ds-data-table__th[aria-sort="descending"] { color: var(--ds-ink); }
/* body cells */
.ds-data-table__td {
  height: var(--_row-h);
  padding: var(--ds-space-1) var(--_pad-x);
  vertical-align: middle;
  border-block-end: var(--ds-border-width) solid var(--_rule-row);
  color: var(--ds-ink-2);
}
.ds-data-table__table tbody tr:last-child > .ds-data-table__td { border-block-end-color: transparent; }
.ds-data-table__primary { color: var(--ds-ink); font-weight: var(--ds-weight-medium); }
.ds-data-table__num { text-align: end; font-variant-numeric: tabular-nums; }
.ds-data-table__null { font-style: italic; color: var(--ds-ink-muted); }           /* null = italic word (navattic, house) */
.ds-data-table__null[data-null="dash"] { font-style: normal; }                    /* quicken's – ; manychat's n/a */
.ds-data-table__secondary { display: block; font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.ds-data-table__truncate { display: block; max-width: var(--_max, 240px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-data-table__nowrap { white-space: nowrap; }
/* selection column: composes .ds-checkbox by root; the cell is the checkbox's tap target */
.ds-data-table__select { width: calc(var(--ds-control-h-sm) + var(--_pad-x)); padding-inline-end: 0; }
/* metric glyph before a count (navattic's bar-chart) */
.ds-data-table__glyph { display: inline-block; width: var(--ds-icon-size); height: var(--ds-icon-size); vertical-align: -3px; margin-inline-end: var(--ds-space-1); color: var(--ds-ink-muted); }
/* enum chip — local fallback (enum-chip does not exist yet): tint + same-hue ink, never white-on-colour */
.ds-data-table__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  min-height: calc(var(--ds-space-5) + 2px);
  padding-inline: var(--ds-space-2);
  border-radius: var(--ds-radius-xs);
  background: var(--_chip-tint, var(--ds-surface-2));
  color: var(--_chip-ink, var(--ds-ink-2));
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  white-space: nowrap;
}
.ds-data-table__chip[data-shape="pill"] { border-radius: var(--ds-radius-pill); }
.ds-data-table__chip[data-hue="1"] { --_chip-tint: var(--ds-data-1-tint); --_chip-ink: var(--ds-data-1-ink); }
.ds-data-table__chip[data-hue="2"] { --_chip-tint: var(--ds-data-2-tint); --_chip-ink: var(--ds-data-2-ink); }
.ds-data-table__chip[data-hue="3"] { --_chip-tint: var(--ds-data-3-tint); --_chip-ink: var(--ds-data-3-ink); }
.ds-data-table__chip[data-hue="4"] { --_chip-tint: var(--ds-data-4-tint); --_chip-ink: var(--ds-data-4-ink); }
.ds-data-table__chip[data-hue="6"] { --_chip-tint: var(--ds-data-6-tint); --_chip-ink: var(--ds-data-6-ink); }
.ds-data-table__chip[data-tone="live"] { --_chip-tint: var(--ds-live); --_chip-ink: var(--ds-ink-on-semantic); text-transform: uppercase; letter-spacing: .04em; }  /* the ONE semantic fill: live */
.ds-data-table__chip[data-tone="off"] { --_chip-tint: var(--ds-surface-2); --_chip-ink: var(--ds-ink-muted); text-transform: uppercase; letter-spacing: .04em; }
/* status glyph (clickup's dashed-circle "to do") */
.ds-data-table__status { display: inline-grid; place-items: center; width: var(--ds-icon-size); height: var(--ds-icon-size); vertical-align: -3px; margin-inline-end: var(--ds-space-2); color: var(--ds-ink-muted); }
/* hover-revealed row actions: fixed-width column so nothing reflows */
.ds-data-table__actions-cell { width: calc(var(--ds-control-h-sm) + var(--_pad-x)); padding-inline-start: 0; text-align: end; }
.ds-data-table__actions { display: inline-flex; gap: var(--ds-space-1); opacity: 0; transition: opacity var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-data-table__row:hover .ds-data-table__actions, .ds-data-table__row:focus-within .ds-data-table__actions, .ds-data-table__row[data-state="hover"] .ds-data-table__actions { opacity: 1; }
@media (hover: none) { .ds-data-table__actions { opacity: 1; } }
.ds-data-table__icon-button {
  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-data-table__icon-button:hover { background: var(--ds-surface-hover); color: var(--ds-ink); }
.ds-data-table__icon-button svg { width: var(--ds-icon-size); height: var(--ds-icon-size); }
/* ---- row states ----------------------------------------------------------------- */
.ds-data-table__row { transition: background-color var(--ds-dur-fast) var(--ds-ease-standard); }
tbody .ds-data-table__row:hover > .ds-data-table__td, .ds-data-table__row[data-state="hover"] > .ds-data-table__td { background: var(--ds-hover-bg); }
.ds-data-table__row[aria-selected="true"] > .ds-data-table__td { background: var(--ds-selected-bg); color: var(--ds-selected-ink); }
.ds-data-table__row[aria-selected="true"] .ds-data-table__primary { color: inherit; font-weight: var(--ds-selected-weight); }
.ds-data-table__row[data-state="inactive"] > .ds-data-table__td, .ds-data-table__row[data-state="inactive"] .ds-data-table__primary { color: var(--ds-ink-muted); }   /* whole-row muting [manychat-web-42] */
.ds-data-table__row[aria-disabled="true"] > .ds-data-table__td, .ds-data-table__row[aria-disabled="true"] .ds-data-table__primary { color: var(--ds-ink-faint); }
.ds-data-table__row[aria-disabled="true"] { cursor: not-allowed; }
.ds-data-table__row:focus-visible { outline-offset: calc(-1 * var(--ds-ring-width)); }
/* group header row (clickup): caret · status chip · count; rows below indent nothing */
.ds-data-table__group > .ds-data-table__th { height: var(--ds-control-h); font-family: var(--ds-font-sans); font-size: var(--ds-text-sm); text-transform: none; letter-spacing: 0; color: var(--ds-ink); background: transparent; border-block-end: var(--ds-border-width) solid var(--_rule-row); }
.ds-data-table__group-cell { display: flex; align-items: center; gap: var(--ds-space-2); }
.ds-data-table__group-cell .ds-data-table__icon-button { width: var(--ds-space-6); height: var(--ds-space-6); }
.ds-data-table__group[aria-expanded="false"] .ds-data-table__icon-button svg { transform: rotate(-90deg); }
.ds-data-table__count { color: var(--ds-ink-muted); font-weight: var(--ds-weight-regular); font-variant-numeric: tabular-nums; }
/* ghost add row */
.ds-data-table__add > .ds-data-table__td { padding-block: 0; }
.ds-data-table__add-button { appearance: none; display: inline-flex; align-items: center; gap: var(--ds-space-1-5); min-height: var(--_row-h); padding: 0; border: 0; background: none; font: inherit; color: var(--ds-ink-muted); cursor: pointer; border-radius: var(--ds-radius-xs); }
.ds-data-table__add-button:hover { color: var(--ds-ink); }
.ds-data-table__add-button svg { width: 14px; height: 14px; }
/* loading: skeleton bars in the true frame */
.ds-data-table[aria-busy="true"] .ds-data-table__table { pointer-events: none; }
.ds-data-table__num > .ds-data-table__skeleton { margin-inline-start: auto; }
.ds-data-table__skeleton { display: block; height: var(--ds-space-3); width: var(--_w, 70%); max-width: 100%; border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); }
/* empty: keep the header (the columns are the promise), dashed footprint below it */
.ds-data-table[data-state="empty"] { border-style: dashed; border-color: var(--ds-rule-strong); }
.ds-data-table__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(--ds-space-6) var(--_pad-x); text-align: center; color: var(--ds-ink-muted); }
.ds-data-table__empty > span { max-width: var(--ds-measure); }
.ds-data-table__empty a { color: var(--ds-ink-link); }
.ds-data-table__empty-row > .ds-data-table__td { border-block-end: 0; }
/* error: danger edge + message in the footer slot */
.ds-data-table[aria-invalid="true"] { border-color: var(--ds-danger); }
.ds-data-table__error { display: flex; align-items: center; gap: var(--ds-space-1-5); color: var(--ds-danger-ink); font-size: var(--ds-text-sm); }
.ds-data-table__error svg { width: var(--ds-icon-size); height: var(--ds-icon-size); flex: none; }
/* ---- footer: count · page-size · tools · pagination ------------------------------- */
.ds-data-table__footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-2) var(--ds-space-4);
  min-height: var(--_head-h);
  padding: var(--ds-space-1) var(--_pad-x);
  border-block-start: var(--ds-border-width) solid var(--ds-rule);
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
}
.ds-data-table__footer-count { color: var(--ds-ink); font-weight: var(--ds-weight-medium); font-variant-numeric: tabular-nums; }
.ds-data-table__footer-count[data-align="center"] { margin-inline: auto; }
.ds-data-table__tools { display: inline-flex; align-items: center; gap: var(--ds-space-1); }
/* pager: two outline buttons one rung down (control-h-sm) [navattic-web-153] */
.ds-data-table__pager { display: inline-flex; align-items: center; gap: var(--ds-space-2); }
.ds-data-table__page-button {
  appearance: none;
  display: inline-flex;
  align-items: center;
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-3);
  border: var(--ds-border-width) solid var(--ds-border);
  border-radius: var(--ds-radius-button);
  background: var(--ds-surface);
  color: var(--ds-ink-2);
  font: inherit;
  font-size: var(--ds-text-sm);
  text-transform: var(--ds-control-case);
  cursor: pointer;
  box-shadow: var(--ds-shadow-lip);
}
.ds-data-table__page-button:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-data-table__page-button:disabled { color: var(--ds-ink-faint); border-color: var(--ds-rule); background: var(--ds-surface); box-shadow: none; }
/* ---- axes: figures lane + frame ----------------------------------------------------------- */
/* data-figures="mono": body numbers and IDs move to the mono lane (tabular, one size down, zero tracking) so a column
   of amounts / references reads as a ledger; numbers stay end-aligned, IDs stay start-aligned (a reference is a
   label, not a quantity). Header cells keep the label lane. Ink stays the cell's own (--ds-ink-2), never ink-code. */
.ds-data-table[data-figures="mono"] :is(.ds-data-table__td.ds-data-table__num, .ds-data-table__id, .ds-data-table__footer-count) {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
}
.ds-data-table[data-figures="mono"] .ds-data-table__td.ds-data-table__num { text-align: end; }
.ds-data-table[data-figures="mono"] .ds-data-table__td.ds-data-table__num .ds-data-table__secondary { font-family: var(--ds-font-sans); }
.ds-data-table__id { font-variant-numeric: tabular-nums; white-space: nowrap; }     /* a reference cell (INV-0271); mono under data-figures="mono" */
/* data-frame="none": no outer rule, radius or fill — for a table flush inside a card body (the card is the frame;
   a bordered table in a bordered card is the retool-25 nested-border weakness). The first and last columns lose their
   outer inset so the text lines up with the card header; the overflow cover takes the card fill. */
.ds-data-table[data-frame="none"] { --_radius: 0px; --_cover: var(--ds-card-bg); background: transparent; border: 0; }
.ds-data-table[data-frame="none"] :is(.ds-data-table__th, .ds-data-table__td):first-child { padding-inline-start: 0; }
.ds-data-table[data-frame="none"] :is(.ds-data-table__th, .ds-data-table__td):last-child { padding-inline-end: 0; }
.ds-data-table[data-frame="none"] .ds-data-table__footer { padding-inline: 0; }
.ds-data-table[data-frame="none"][data-state="empty"] .ds-data-table__empty { border: var(--ds-border-width) dashed var(--ds-rule-strong); border-radius: var(--ds-radius-sm); }   /* the dashed footprint moves inside */
.ds-data-table[data-frame="none"][aria-invalid="true"] .ds-data-table__footer { border-block-start-color: var(--ds-danger); }
/* ============================================================================ variants */
/* navattic-bordered-grid — r8 card whose OUTER border is the row grade; 32 tinted header (ground), 64 entity rows,
   row rules + column rules (a true grid); 14/500 ink-2 sentence-case headers; everything left-aligned incl. numbers (fidelity — a weakness) */
.ds-data-table[data-variant="navattic-bordered-grid"] { --_head-bg: var(--ds-ground); --_rule-col: var(--ds-rule-soft); --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-5)); border-color: var(--ds-rule-soft); }
.ds-data-table[data-variant="navattic-bordered-grid"] .ds-data-table__th { font-family: var(--ds-font-sans); font-size: var(--ds-text-md); text-transform: none; letter-spacing: 0; color: var(--ds-ink-2); border-block-end-color: var(--ds-rule-soft); }
.ds-data-table[data-variant="navattic-bordered-grid"] .ds-data-table__num { text-align: start; font-variant-numeric: normal; }
.ds-data-table[data-variant="navattic-bordered-grid"] .ds-data-table__td { padding-inline: var(--ds-space-4); }
.ds-data-table[data-variant="navattic-bordered-grid"] .ds-data-table__td:first-child { padding-inline-start: var(--ds-space-3); }
/* retool-list-first-hairline — outer 1 px r4, 32 header (optional tint band via data-header), 32 rows + rule-grade hairlines,
   text left / numbers right, enum pills, 32 footer with CENTRED count and tool icons right; 12 px text */
.ds-data-table[data-variant="retool-list-first-hairline"] { --_radius: var(--ds-radius-xs); --_row-h: var(--ds-control-h-sm); --_rule-row: var(--ds-rule); font-size: var(--ds-text-sm); }
.ds-data-table[data-variant="retool-list-first-hairline"] .ds-data-table__th { font-family: var(--ds-font-sans); font-size: var(--ds-text-sm); font-weight: var(--ds-weight-semibold); text-transform: none; letter-spacing: 0; color: var(--ds-ink); }
.ds-data-table[data-variant="retool-list-first-hairline"] .ds-data-table__td { color: var(--ds-ink); }
.ds-data-table[data-variant="retool-list-first-hairline"] .ds-data-table__chip { border-radius: var(--ds-radius-pill); }
.ds-data-table[data-variant="retool-list-first-hairline"] .ds-data-table__footer { min-height: var(--ds-control-h-sm); }
/* manychat-bordered-card-table — white r8 + card shadow, 44 header 14/600 ink, 75 rows, rule-grade row rules, 24 px cell padding,
   whole-row muting for inactive records */
.ds-data-table[data-variant="manychat-bordered-card-table"] { --_head-h: var(--ds-control-h-lg); --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-8)); --_rule-row: var(--ds-rule); --_pad-x: var(--ds-space-6); box-shadow: var(--ds-shadow-card); }
.ds-data-table[data-variant="manychat-bordered-card-table"] .ds-data-table__th { font-family: var(--ds-font-sans); font-size: var(--ds-text-md); font-weight: var(--ds-weight-semibold); text-transform: none; letter-spacing: 0; color: var(--ds-ink); border-block-end-color: var(--ds-rule); }
/* manychat-card-row-table — UNBOXED header row + floating card rows that reuse the header's column x-positions; 16 px gaps;
   two-line rows (primary + secondary under each KPI). Grid layout, so the markup restates table roles. */
.ds-data-table[data-variant="manychat-card-row-table"] { --_cols: auto minmax(0, 1fr) 72px 72px 148px 40px; --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-6) + var(--ds-space-1)); background: transparent; border: 0; border-radius: 0; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__scroll { background: none; }
.ds-data-table[data-variant="manychat-card-row-table"] :is(.ds-data-table__table, thead, tbody) { display: block; min-width: 0; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__row { display: grid; grid-template-columns: var(--_cols); align-items: center; column-gap: var(--ds-space-3); min-width: 0; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__th { height: auto; padding: 0 var(--_pad-x) var(--ds-space-3); border: 0; background: transparent; font-family: var(--ds-font-sans); font-size: var(--ds-text-xs); text-transform: none; letter-spacing: 0; color: var(--ds-ink-muted); }
.ds-data-table[data-variant="manychat-card-row-table"] tbody .ds-data-table__row { min-height: calc(var(--ds-control-h-lg) + var(--ds-space-6) + var(--ds-space-1)); background: var(--ds-surface); border-radius: var(--ds-radius-md); box-shadow: var(--ds-shadow-card); padding-block: var(--ds-space-3); }
.ds-data-table[data-variant="manychat-card-row-table"] tbody .ds-data-table__row + .ds-data-table__row { margin-block-start: var(--ds-space-4); }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__td { height: auto; min-width: 0; padding: 0 var(--_pad-x); border: 0; }
.ds-data-table[data-variant="manychat-card-row-table"] tbody .ds-data-table__row:hover > .ds-data-table__td, .ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__row[data-state="hover"] > .ds-data-table__td { background: transparent; }   /* no fill on hover in the reference; the kebab appears */
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__row[aria-selected="true"] > .ds-data-table__td { background: transparent; color: inherit; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__primary { font-size: var(--ds-text-lg); font-weight: var(--ds-weight-semibold); display: flex; align-items: center; gap: var(--ds-space-2); min-width: 0; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__primary .ds-data-table__truncate { flex: 0 1 auto; min-width: 0; max-width: 100%; }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__summary { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1-5); margin-block-start: var(--ds-space-2); font-size: var(--ds-text-xs); color: var(--ds-ink-muted); }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__summary svg { width: var(--ds-icon-size); height: var(--ds-icon-size); color: var(--ds-danger); }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__num .ds-data-table__secondary { margin-block-start: var(--ds-space-2); }
.ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__select, .ds-data-table[data-variant="manychat-card-row-table"] .ds-data-table__actions-cell { width: auto; }
@media (max-width: 600px) {
  .ds-data-table[data-variant="manychat-card-row-table"] { --_cols: auto minmax(0, 1fr) 40px; }
  .ds-data-table[data-variant="manychat-card-row-table"] :is(.ds-data-table__th, .ds-data-table__td)[data-collapse] { display: none; }
}
/* clickup-grouped-list — unboxed; caret · status pill · count group headers, 36 rows with rule-grade hairlines, ghost add row, 13/500 names */
.ds-data-table[data-variant="clickup-grouped-list"] { --_row-h: var(--ds-control-h); --_rule-row: var(--ds-rule); --_pad-x: var(--ds-space-2); background: transparent; border: 0; border-radius: 0; }
.ds-data-table[data-variant="clickup-grouped-list"] .ds-data-table__scroll { background: none; }
.ds-data-table[data-variant="clickup-grouped-list"] .ds-data-table__th { font-family: var(--ds-font-sans); font-size: var(--ds-text-xs); text-transform: none; letter-spacing: 0; border-block-end-color: var(--ds-rule); }
.ds-data-table[data-variant="clickup-grouped-list"] .ds-data-table__primary { font-size: var(--ds-text-sm); }
.ds-data-table[data-variant="clickup-grouped-list"] .ds-data-table__chip { text-transform: uppercase; letter-spacing: .02em; font-weight: var(--ds-weight-bold); --_chip-tint: var(--ds-surface-3); --_chip-ink: var(--ds-ink); }
/* origin-transaction-list — no outer border, no dividers, 66–71 px pitch; rows are list-rows in table clothing (name + meta cell, right amount) */
.ds-data-table[data-variant="origin-transaction-list"] { --_row-h: calc(var(--ds-control-h-lg) + var(--ds-space-6)); --_rule-row: transparent; --_pad-x: 0px; background: transparent; border: 0; border-radius: 0; }
.ds-data-table[data-variant="origin-transaction-list"] .ds-data-table__scroll { background: none; }
.ds-data-table[data-variant="origin-transaction-list"] .ds-data-table__th { height: auto; padding-block-end: var(--ds-space-3); border-block-end: 0; font-family: var(--ds-font-label); font-size: var(--ds-text-xs); letter-spacing: .06em; text-transform: uppercase; }
.ds-data-table[data-variant="origin-transaction-list"] .ds-data-table__td { color: var(--ds-ink); }
.ds-data-table[data-variant="origin-transaction-list"] .ds-data-table__num { font-weight: var(--ds-weight-medium); font-size: var(--ds-text-lg); }
/* ============================================================================ DESK-446 — empty / loading / share axes
   Three orthogonal axes set on the root; each value is named for the reference it models (they combine with any table
   variant above): data-empty="gusto-colspan-action | plain-footprint | rox-ghosted-overlay" ·
   data-loading="neon-skeleton-rows | databricks-skeleton-grid | clickup-blurred-overlay" (aria-busy goes on the <table>) ·
   data-share="ynab-underline | deel-cell-fill | reddit-bar-pct" (a __share cell carries --_share: 42%).
   New parts: __empty-icon · __empty-title · __empty-text · __empty-action · __ghost · __overlay · __overlay-card · __status-line
              __share · __share-num · __share-bar · __share-pct.   New knobs: --_share --_bar --_bar-tint --_bar-h --_share-w */
/* ---- empty row: one colspan row, parts shared by the three treatments ---------------------------------------------- */
.ds-data-table__empty-icon { display: grid; place-items: center; inline-size: var(--ds-control-h-lg); block-size: var(--ds-control-h-lg); border-radius: var(--ds-radius-md); background: var(--ds-surface-2); color: var(--ds-ink-muted); }
.ds-data-table__empty-icon svg { inline-size: var(--ds-icon-size-row, var(--ds-icon-size)); block-size: var(--ds-icon-size-row, var(--ds-icon-size)); }
.ds-data-table__empty-title { color: var(--ds-ink); font-size: var(--ds-text-md); font-weight: var(--ds-weight-semibold); }
.ds-data-table__empty-text { max-inline-size: var(--ds-measure); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
.ds-data-table__empty-action {
  appearance: none; display: inline-flex; align-items: center; min-height: var(--ds-control-h-sm); margin-block-start: var(--ds-space-1);
  padding-inline: var(--ds-space-3); 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-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium);
  text-transform: var(--ds-control-case); text-decoration: none; cursor: pointer; box-shadow: var(--ds-shadow-lip);
}
.ds-data-table__empty-action:hover { border-color: var(--ds-border-strong); background: var(--ds-hover-bg); }
.ds-data-table__empty-action:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
/* gusto: header kept, the body is ONE row — icon, title, sentence, action — no footprint, no rule under it */
.ds-data-table[data-empty="gusto-colspan-action"] .ds-data-table__empty { min-height: calc(var(--ds-control-h-lg) * 4); gap: var(--ds-space-2); }
.ds-data-table[data-empty="gusto-colspan-action"] .ds-data-table__empty-icon { background: transparent; color: var(--ds-danger-ink); }
/* plain: the colspan cell holds a quiet footprint box (rule-soft edge, sm radius) inset from the table edge; no action */
.ds-data-table[data-empty="plain-footprint"] .ds-data-table__empty-row > .ds-data-table__td { padding: var(--ds-space-4) var(--_pad-x); }
.ds-data-table[data-empty="plain-footprint"] .ds-data-table__empty { border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-sm); min-height: calc(var(--ds-control-h-lg) * 3); }
.ds-data-table[data-empty="plain-footprint"] .ds-data-table__empty-icon { inline-size: var(--ds-control-h); block-size: var(--ds-control-h); border-radius: var(--ds-radius-sm); }
/* rox: the columns stay promised as GHOST rows (aria-hidden, fading out) with a centred status overlay on top */
.ds-data-table__scroll:has(> .ds-data-table__overlay) { position: relative; }
.ds-data-table__ghost > .ds-data-table__row > .ds-data-table__td { border-block-end-color: var(--_rule-row); }
.ds-data-table__ghost { -webkit-mask-image: linear-gradient(to bottom, currentColor, transparent); mask-image: linear-gradient(to bottom, currentColor, transparent); pointer-events: none; user-select: none; }
.ds-data-table__ghost .ds-data-table__skeleton { background: var(--ds-surface-3); }
.ds-data-table__overlay { position: absolute; inset: var(--_head-h) 0 0 0; display: grid; place-items: center; padding: var(--_pad-x); text-align: center; }
.ds-data-table__overlay > .ds-data-table__empty { min-height: 0; padding: 0; }
/* ---- loading: skeleton in the true frame; aria-busy lives on the <table> ----------------------------------------- */
@keyframes ds-dt-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
.ds-data-table[data-loading] .ds-data-table__skeleton { animation: ds-dt-pulse calc(var(--ds-dur-slow) * 5) var(--ds-ease-standard) infinite; }
.ds-data-table__table[aria-busy="true"] { pointer-events: none; }
.ds-data-table__table[aria-busy="true"] .ds-data-table__td { color: transparent; }
/* neon: header stays real, each body cell is one bar sized to its column (--_w), hairlines kept so the rows read as rows */
.ds-data-table[data-loading="neon-skeleton-rows"] .ds-data-table__skeleton { block-size: var(--ds-space-2-5, var(--ds-space-3)); }
/* databricks: the header is skeleton too (the columns are not known yet), column rules on, a status line says what is loading */
.ds-data-table[data-loading="databricks-skeleton-grid"] { --_rule-col: var(--ds-rule-soft); }
.ds-data-table[data-loading="databricks-skeleton-grid"] .ds-data-table__th .ds-data-table__skeleton { background: var(--ds-surface-3); }
.ds-data-table__status-line { display: flex; align-items: center; gap: var(--ds-space-2); padding: var(--ds-space-2) var(--_pad-x); border-block-end: var(--ds-border-width) solid var(--ds-rule-soft); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); }
/* clickup: the rows are blurred ghosts, a floating card says what is happening */
.ds-data-table[data-loading="clickup-blurred-overlay"] .ds-data-table__table { filter: blur(var(--ds-space-0-5)); }
.ds-data-table[data-loading="clickup-blurred-overlay"] .ds-data-table__overlay { z-index: 1; inset: 0; }
.ds-data-table__overlay-card { display: grid; justify-items: center; gap: var(--ds-space-1); max-inline-size: 280px; padding: var(--ds-space-5) var(--ds-space-6); border: var(--ds-border-width) solid var(--ds-border); border-radius: var(--ds-radius-md); background: var(--ds-surface); box-shadow: var(--ds-shadow-lip), var(--ds-shadow-float); text-align: center; }
.ds-data-table__overlay-card svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); color: var(--ds-ink-muted); }
/* ---- share: an in-cell proportion for spend share — the number stays end-aligned and tabular ---------------------- */
.ds-data-table__share { --_bar: var(--ds-data-1); --_bar-tint: var(--ds-data-1-tint); --_bar-h: var(--ds-space-1); position: relative; text-align: end; font-variant-numeric: tabular-nums; }
.ds-data-table__share[data-hue="2"] { --_bar: var(--ds-data-2); --_bar-tint: var(--ds-data-2-tint); }
.ds-data-table__share[data-hue="3"] { --_bar: var(--ds-data-3); --_bar-tint: var(--ds-data-3-tint); }
.ds-data-table__share[data-hue="4"] { --_bar: var(--ds-data-4); --_bar-tint: var(--ds-data-4-tint); }
.ds-data-table__share-num { position: relative; z-index: 1; display: block; }
.ds-data-table__share-pct { display: block; min-inline-size: 4ch; text-align: end; color: var(--ds-ink-muted); font-size: var(--ds-text-sm); }
.ds-data-table__share-bar { display: block; inline-size: 100%; block-size: var(--_bar-h); border-radius: var(--ds-radius-pill); background: var(--ds-rule-soft); overflow: hidden; }
.ds-data-table__share-bar::before { content: ""; display: block; inline-size: var(--_share, 0%); block-size: 100%; border-radius: inherit; background: var(--_bar); }
/* ynab: thin track UNDER the figure, end-aligned number above it; zero keeps the empty track */
.ds-data-table[data-share="ynab-underline"] .ds-data-table__share { min-inline-size: calc(var(--ds-control-h-lg) * 3); }
.ds-data-table[data-share="ynab-underline"] .ds-data-table__share-bar { margin-block-start: var(--ds-space-1); }
/* deel: the bar IS the cell — a tint fill to --_share behind the figure, no track (row height held) */
.ds-data-table[data-share="deel-cell-fill"] .ds-data-table__share { min-inline-size: calc(var(--ds-control-h-lg) * 3); }
.ds-data-table[data-share="deel-cell-fill"] .ds-data-table__share-bar { position: absolute; inset: 0; block-size: auto; border-radius: 0; background: transparent; }
.ds-data-table[data-share="deel-cell-fill"] .ds-data-table__share-bar::before { background: var(--_bar-tint); }
/* reddit: bar + percentage side by side in their OWN column; the amount keeps its own numeric column */
.ds-data-table[data-share="reddit-bar-pct"] .ds-data-table__share { display: flex; align-items: center; gap: var(--ds-space-2); min-inline-size: calc(var(--ds-control-h-lg) * 3); }
.ds-data-table[data-share="reddit-bar-pct"] .ds-data-table__share-bar { flex: 1 1 auto; min-inline-size: var(--ds-space-10, 40px); block-size: var(--ds-space-2); }
.ds-data-table[data-share="reddit-bar-pct"] .ds-data-table__share-pct { flex: none; }
.ds-data-table:not([data-share="deel-cell-fill"]) .ds-data-table__row[aria-selected="true"] .ds-data-table__share-bar { background: var(--ds-surface); }
/* components/feature-showcase/feature-showcase.css */
/* ============================================================================
   components/feature-showcase/feature-showcase.css — Feature showcase / named feature card
   taxonomy-components.md §K · common · S1  ·  the unit behind L-FEAT-01/02/03/04/05/06/09 and the icon value strip
   Root:  <article class="ds-feature-showcase" data-variant="…"> — ONE feature (a card, a row, a cell, or a block).
   Parts: __head (+ __index · __label · __title · __nick · __icon) · __visual[data-crop] (+ __frame · __art)
          · __caption (+ __caption-title · __body · __link) · __claim (two-tone h3) · __spec (+ __spec-label ·
          __spec-key · __spec-value) · __features (uppercase mono list, vercel) · __list (+ __item[aria-selected] ·
          __bullet · __item-title · __item-body) · __void (the icon strip's empty middle) · __error
   Group: .ds-feature-showcase-group[data-layout="pair | trio | grid | strip | list | switcher"]
          pair / trio / strip = equal cells split by the SHARED hairline (the rule IS the gutter);
          grid = auto-fit card grid; list = indexed rows with hairlines between; switcher = media | tinted list
   Axes:  data-crop="clip | fade | none"    how the UI vignette meets its box (clip = L-SHOT-03, fade = L-SHOT-02)
          data-layout="aside"               (on the unit) visual 8 cols | claim + spec 3 cols from 1024 (L-FEAT-01)
          data-side="right"                 flips the aside layout; sides alternate per instance in a page
          data-caption="inside | outside"   where the words live (intercom = outside the card)
   Variants (data-variant): jstov (unmarked root) · vercel-alternating-fade-masked-mock-plus-mono-spec-list ·
     attio-narrative-block-plus-feature-pair · intercom-feature-card-with-external-caption ·
     intercom-feature-switcher-tint-selection · fibery-named-feature-card · heron-numbered-tag-cards ·
     heron-indexed-product-row-3-5-4 · attio-icon-value-strip-5up
   States: rest · hover (interactive root: tint step or lift per data-hover) · focus-visible (the ring) ·
     aria-selected (switcher item: --ds-selected-*) · aria-busy (skeleton visual in the true frame) ·
     data-state="empty" (dashed footprint + mono word) · aria-invalid (danger edge + __error line)
   Composes by ROOT class only: text-link · stat · data-table · list-row · status-badge · enum-chip (inside the frame).
   Tokens only. Private knobs: --_radius --_pad --_visual-h --_fade --_pitch --_gap --_edge --_fill --_min --_cols
   ========================================================================== */
/* ---------------------------------------------------------------------------
   0. THE UNIT — a grid of named areas; every variant re-maps, never re-orders the DOM
   ------------------------------------------------------------------------- */
.ds-feature-showcase {
  --_radius:   var(--ds-radius-lg);                /* 12 — house card; fibery 20 (xl); intercom 0        */
  --_pad:      var(--ds-card-pad);
  --_visual-h: 300px;                              /* the vignette block; fade / clip cut any mock to it  */
  --_fade:     var(--ds-mock-fade);
  --_pitch:    2.2;                                /* spec-list line pitch (vercel 33 px on 15 px mono)   */
  --_gap:      var(--ds-space-4);
  --_edge:     var(--ds-card-border);              /* card edge; transparent for frameless variants       */
  --_fill:     var(--ds-card-bg);
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-areas: "head" "visual" "caption" "aside";
  gap: var(--_gap);
  min-width: 0;
  background: var(--_fill);
  border: var(--ds-border-width) solid var(--_edge);
  border-radius: var(--_radius);
  box-shadow: var(--ds-card-shadow);
  color: var(--ds-ink);
  text-decoration: none;
  overflow: hidden;                                /* the rounded overflow IS the crop (L-SHOT-03) */
}
.ds-feature-showcase > * { min-width: 0; }
.ds-feature-showcase svg[fill="none"] { fill: none; stroke: currentColor; }
/* ---- head: [index] label · title · nickname / spec token ------------------------------------- */
.ds-feature-showcase__head {
  grid-area: head;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--ds-space-2) var(--ds-space-4);
  padding: var(--_pad) var(--_pad) 0;
}
.ds-feature-showcase__title {
  margin: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink);
  text-wrap: balance;
}
.ds-feature-showcase__index, .ds-feature-showcase__label {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-muted);
}
.ds-feature-showcase__index { color: var(--ds-ink-faint); }      /* [0n] — decorative index, aria-hidden */
/* house: the nickname slot carries a mono spec token (WHEN → THEN · = formula) instead of an italic name */
.ds-feature-showcase__nick {
  margin-inline-start: auto;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.ds-feature-showcase__icon { inline-size: var(--ds-icon-size-row); block-size: var(--ds-icon-size-row); color: var(--ds-ink); flex: none; }
/* ---- visual: the UI vignette in its box ------------------------------------------------------ */
.ds-feature-showcase__visual {
  grid-area: visual;
  position: relative;
  min-width: 0;
  min-height: 0;
}
.ds-feature-showcase[data-crop="clip"] .ds-feature-showcase__visual,
.ds-feature-showcase:not([data-crop]) .ds-feature-showcase__visual { height: var(--_visual-h); overflow: hidden; }
.ds-feature-showcase[data-crop="fade"] .ds-feature-showcase__visual {
  max-height: var(--_visual-h);
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, var(--ds-ink) calc(100% - var(--_fade)), transparent);
          mask-image: linear-gradient(to bottom, var(--ds-ink) calc(100% - var(--_fade)), transparent);
}
/* the frame: hairline + 12 + surface, NO chrome, no shadow — a page object that outruns the mask */
.ds-feature-showcase__frame {
  display: flex;
  flex-direction: column;
  gap: var(--ds-card-gap);
  margin-inline: var(--_pad);
  padding: var(--ds-card-pad);
  min-height: calc(var(--_visual-h) + var(--_fade));
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: calc(var(--_radius) - var(--ds-space-1));       /* child radius ≤ parent − 2 */
  border-block-end: 0;
  border-end-start-radius: 0;
  border-end-end-radius: 0;
  min-width: 0;
}
.ds-feature-showcase__frame > * { min-width: 0; }
/* the art slot: a diagram / render / line drawing on the illustration ground (feature card with external caption) */
.ds-feature-showcase__art {
  display: grid;
  place-items: center;
  min-height: var(--_visual-h);
  background: var(--ds-illustration-ground);
  color: var(--ds-line-art);
}
.ds-feature-showcase__art > svg { inline-size: min(60%, 260px); }
/* ---- caption: title + body + link, inside the card by default ---------------------------------- */
.ds-feature-showcase__caption {
  grid-area: caption;
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-2);
  padding: 0 var(--_pad) var(--_pad);
}
.ds-feature-showcase__caption-title {
  margin: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  text-wrap: pretty;
}
.ds-feature-showcase__body { margin: 0; font-size: var(--ds-text-md); line-height: var(--ds-lh-body); color: var(--ds-ink-muted); max-width: 48ch; }
.ds-feature-showcase__link { margin-block-start: var(--ds-space-1); }
/* ---- aside: two-tone claim + mono spec table / uppercase feature list (vercel side column) ------- */
.ds-feature-showcase__aside { grid-area: aside; display: flex; flex-direction: column; gap: var(--ds-space-6); padding: 0 var(--_pad) var(--_pad); }
.ds-feature-showcase__claim {
  margin: 0;
  font-size: var(--ds-text-2xl);                 /* vercel: 32 on 16 (2×) */
  font-weight: var(--ds-weight-medium);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  text-wrap: pretty;
}
.ds-feature-showcase__spec-label { margin: 0 0 var(--ds-space-2); font-family: var(--ds-font-mono); font-size: var(--ds-text-sm); color: var(--ds-ink-muted); line-height: var(--ds-lh-list); }
.ds-feature-showcase__spec {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  column-gap: var(--ds-space-4);
  margin: 0;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  line-height: var(--_pitch);
  font-variant-numeric: tabular-nums;
}
.ds-feature-showcase__spec-key { color: var(--ds-ink-muted); text-transform: uppercase; letter-spacing: .06em; white-space: nowrap; }
.ds-feature-showcase__spec-value { margin: 0; color: var(--ds-ink); overflow-wrap: anywhere; }
.ds-feature-showcase__features {
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .04em;
  text-transform: uppercase;
  line-height: var(--_pitch);
  color: var(--ds-ink);
}
/* ---- states ----------------------------------------------------------------------------------- */
a.ds-feature-showcase, button.ds-feature-showcase { cursor: pointer; 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); }
a.ds-feature-showcase:hover, button.ds-feature-showcase:hover, .ds-feature-showcase[data-state="hover"] { background: var(--ds-hover-bg); box-shadow: var(--ds-hover-shadow), var(--ds-card-shadow); }
.ds-feature-showcase:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-feature-showcase[aria-busy="true"] .ds-feature-showcase__visual { background: var(--ds-skeleton); }
.ds-feature-showcase[aria-busy="true"] .ds-feature-showcase__visual > * { visibility: hidden; }
.ds-feature-showcase[aria-busy="true"] :is(.ds-feature-showcase__title, .ds-feature-showcase__body, .ds-feature-showcase__caption-title) { color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs); }
.ds-feature-showcase[data-state="empty"] .ds-feature-showcase__visual {
  display: grid;
  place-items: center;
  margin-inline: var(--_pad);
  border: var(--ds-border-width) dashed var(--ds-rule-strong);
  border-radius: calc(var(--_radius) - var(--ds-space-1));
  color: var(--ds-ink-muted);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
}
.ds-feature-showcase[aria-invalid="true"] { --_edge: var(--ds-danger); }
.ds-feature-showcase__error { grid-column: 1 / -1; margin: 0; padding: 0 var(--_pad) var(--_pad); font-size: var(--ds-text-sm); color: var(--ds-danger-ink); }
/* ---------------------------------------------------------------------------
   1. GROUPS — pair / trio / strip share ONE hairline (the rule is the gutter); grid; list; switcher
   ------------------------------------------------------------------------- */
.ds-feature-showcase-group {
  --_min: 260px;
  --_gap: var(--ds-card-gap);
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--_gap);
  min-width: 0;
}
.ds-feature-showcase-group > * { min-width: 0; }
.ds-feature-showcase-group[data-layout="grid"] { grid-template-columns: repeat(auto-fit, minmax(min(var(--_min), 100%), 1fr)); }
.ds-feature-showcase-group[data-layout="grid"] > [data-span="2"] { grid-column: span 2; }
/* hairline cells: no gap, no card chrome — the shared rule separates them (attio pair · heron ×4 · attio strip) */
.ds-feature-showcase-group:is([data-layout="pair"], [data-layout="trio"], [data-layout="strip"]) {
  gap: 0;
  border: var(--ds-border-width) solid var(--ds-rule);
}
.ds-feature-showcase-group:is([data-layout="pair"], [data-layout="trio"], [data-layout="strip"]) > .ds-feature-showcase {
  --_edge: transparent;
  --_fill: transparent;
  --_radius: 0;
  box-shadow: none;
}
.ds-feature-showcase-group:is([data-layout="pair"], [data-layout="trio"], [data-layout="strip"]) > .ds-feature-showcase + .ds-feature-showcase { border-block-start: var(--ds-border-width) solid var(--ds-rule); }
/* list: indexed rows, hairline between rows, no card */
.ds-feature-showcase-group[data-layout="list"] { gap: 0; border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase { --_edge: transparent; --_fill: transparent; --_radius: 0; box-shadow: none; border-block-end: var(--ds-border-width) solid var(--ds-rule); }
/* switcher: media | tinted list — the selected item is one tint step and darker text; no chevrons, borders or arrows */
.ds-feature-showcase-group[data-layout="switcher"] { gap: var(--ds-space-6); align-items: start; }
.ds-feature-showcase__list { display: flex; flex-direction: column; gap: var(--ds-space-1); margin: 0; padding: 0; list-style: none; min-width: 0; }
.ds-feature-showcase__item {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: var(--ds-space-3);
  row-gap: var(--ds-space-1);
  padding: var(--ds-space-4);
  border-radius: var(--ds-radius-md);
  color: var(--ds-ink-muted);
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-feature-showcase__item:hover, .ds-feature-showcase__item[data-state="hover"] { background: var(--ds-hover-bg); color: var(--ds-ink-2); }
.ds-feature-showcase__item:focus-visible { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: calc(-1 * var(--ds-ring-width)); }
.ds-feature-showcase__item[aria-selected="true"] { background: var(--ds-selected-bg); color: var(--ds-ink-2); }
.ds-feature-showcase__bullet { inline-size: var(--ds-space-1-5); block-size: var(--ds-space-1-5); margin-block-start: .5em; background: var(--ds-accent); }   /* intercom's 6 px square */
.ds-feature-showcase__item-title { margin: 0; font-size: var(--ds-text-lg); font-weight: var(--ds-weight-medium); color: var(--ds-ink); line-height: var(--ds-lh-heading); }
.ds-feature-showcase__item[aria-selected="true"] .ds-feature-showcase__item-title { color: var(--ds-selected-ink); font-weight: var(--ds-selected-weight); }
.ds-feature-showcase__item-body { grid-column: 2; margin: 0; font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); max-width: 40ch; }
.ds-feature-showcase__item > .ds-text-link { grid-column: 2; justify-self: start; }
/* ---------------------------------------------------------------------------
   2. VARIANTS
   ------------------------------------------------------------------------- */
/* vercel — no card: fade-masked hairline frame + claim column; two-tone claim, "Features" label, N uppercase items [vercel-page] */
.ds-feature-showcase[data-variant="vercel-alternating-fade-masked-mock-plus-mono-spec-list"] {
  --_edge: transparent; --_fill: transparent; --_radius: 0; --_pad: 0px; --_visual-h: 420px;
  box-shadow: none; overflow: visible;
}
.ds-feature-showcase[data-variant="vercel-alternating-fade-masked-mock-plus-mono-spec-list"] .ds-feature-showcase__frame { margin: 0; border-radius: var(--ds-media-radius); border-block-end: var(--ds-border-width) solid var(--ds-rule); }
.ds-feature-showcase[data-variant="vercel-alternating-fade-masked-mock-plus-mono-spec-list"] .ds-feature-showcase__aside { padding: 0; }
/* attio — narrative block: inline two-tone h3 ABOVE a full-width mock; the pair below is a group[data-layout="pair"] [attio-2-1-830x8225] */
.ds-feature-showcase[data-variant="attio-narrative-block-plus-feature-pair"] { --_edge: transparent; --_fill: transparent; --_radius: 0; --_pad: 0px; --_gap: var(--ds-space-8); box-shadow: none; overflow: visible; }
.ds-feature-showcase[data-variant="attio-narrative-block-plus-feature-pair"] .ds-feature-showcase__head { padding: 0; }
.ds-feature-showcase[data-variant="attio-narrative-block-plus-feature-pair"] .ds-feature-showcase__title { font-size: var(--ds-text-xl); font-weight: var(--ds-weight-semibold); max-width: 44ch; }
.ds-feature-showcase[data-variant="attio-narrative-block-plus-feature-pair"] .ds-feature-showcase__title .ds-muted { font-weight: var(--ds-weight-regular); }
.ds-feature-showcase[data-variant="attio-narrative-block-plus-feature-pair"] .ds-feature-showcase__frame { margin: 0; border-radius: var(--ds-media-radius); border-block-end: var(--ds-border-width) solid var(--ds-rule); background: var(--ds-ground-2); }
/* attio pair cell — h4 + 2-line muted body + mini-mock fading to a fixed block; inside a pair group */
.ds-feature-showcase-group[data-layout="pair"] > .ds-feature-showcase { --_visual-h: 260px; --_pad: var(--ds-space-6); grid-template-areas: "caption" "visual"; }
.ds-feature-showcase-group[data-layout="pair"] > .ds-feature-showcase .ds-feature-showcase__caption { padding: var(--_pad) var(--_pad) 0; }
.ds-feature-showcase-group[data-layout="pair"] > .ds-feature-showcase .ds-feature-showcase__frame { border-radius: var(--ds-radius-md); }
/* intercom — the card holds ONLY the visual; caption sits BELOW it on the band; 0 radius; corner marks [intercom-3-830x8816] */
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] { --_edge: transparent; --_fill: transparent; --_radius: 0; --_pad: 0px; --_gap: var(--ds-space-5); box-shadow: none; overflow: visible; }
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__visual { position: relative; padding: var(--ds-space-8) var(--ds-space-6) 0; background: var(--ds-illustration-ground); }
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__visual::before,
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__visual::after {
  content: ""; position: absolute; inset-block-start: var(--ds-space-2); inline-size: var(--ds-space-1-5); block-size: var(--ds-space-1-5); background: var(--ds-ink-faint);
}
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__visual::before { inset-inline-start: var(--ds-space-2); }
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__visual::after  { inset-inline-end: var(--ds-space-2); }
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__frame { margin: 0; border-radius: var(--ds-radius-sm) var(--ds-radius-sm) 0 0; }
.ds-feature-showcase[data-variant="intercom-feature-card-with-external-caption"] .ds-feature-showcase__body { font-family: var(--ds-font-body-alt); color: var(--ds-ink-2); }
/* fibery — cream card lighter than ground, 20 px radius; title left + italic serif accent nickname right; zero prose [fibery-3-830x6495] */
.ds-feature-showcase[data-variant="fibery-named-feature-card"] { --_radius: var(--ds-radius-xl); --_fill: var(--ds-surface); --_edge: var(--ds-rule); --_visual-h: 280px; }
.ds-feature-showcase[data-variant="fibery-named-feature-card"] .ds-feature-showcase__nick { font-family: var(--ds-font-body-alt); font-style: italic; font-size: var(--ds-text-md); color: var(--ds-accent-ink); letter-spacing: 0; text-transform: none; }
.ds-feature-showcase[data-variant="fibery-named-feature-card"] .ds-feature-showcase__frame { margin-inline: var(--_pad) 0; border-inline-end: 0; border-end-end-radius: 0; }
/* heron — numbered tag cards: LABEL … [0n] header row, dashed rule, isometric drawing, bold claim, one sentence [heron-ai-830x5619]
   (heron sets the claim in uppercase — skin; headings stay sentence case, R8) */
.ds-feature-showcase[data-variant="heron-numbered-tag-cards"] { --_pad: var(--ds-space-5); --_visual-h: 200px; grid-template-areas: "head" "visual" "caption"; }
.ds-feature-showcase[data-variant="heron-numbered-tag-cards"] .ds-feature-showcase__head { padding-block-end: var(--ds-space-3); border-block-end: var(--ds-border-width) dashed var(--ds-rule-strong); margin-inline: var(--_pad); padding-inline: 0; }
.ds-feature-showcase[data-variant="heron-numbered-tag-cards"] .ds-feature-showcase__caption-title { font-size: var(--ds-text-xl); font-weight: var(--ds-weight-bold); max-width: 14ch; }
.ds-feature-showcase[data-variant="heron-numbered-tag-cards"] .ds-feature-showcase__art { background: transparent; min-height: var(--_visual-h); }
.ds-feature-showcase[data-variant="heron-numbered-tag-cards"] .ds-feature-showcase__body { font-size: var(--ds-text-sm); }
/* heron — indexed product row 3/5/4: label cell (index top, title bottom) | illustration | description + LEARN MORE → row [heron-ai-830x5619] */
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] { --_pad: var(--ds-space-5); --_visual-h: 260px; --_gap: 0px; }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__head { flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: var(--ds-space-2); padding: var(--_pad); }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__title { margin-block-start: auto; }   /* index top, title (+ spec) pinned bottom */
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__title { font-size: var(--ds-text-xl); font-weight: var(--ds-weight-bold); }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__art { background: transparent; }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__caption { padding: var(--_pad); gap: var(--ds-space-4); }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__body { font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
.ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__link { margin-block-start: auto; padding-block-start: var(--ds-space-3); border-block-start: var(--ds-border-width) solid var(--ds-rule); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .06em; text-transform: uppercase; }
/* attio — icon value strip: 5 equal hairline columns, icon top-left, a ~110 px void, h5 + 2-line body at the bottom [attio-2-1-830x8225] */
.ds-feature-showcase[data-variant="attio-icon-value-strip-5up"] { --_pad: var(--ds-space-5); grid-template-areas: "head" "visual" "caption"; grid-template-rows: auto 1fr auto; --_gap: var(--ds-space-2); }
.ds-feature-showcase[data-variant="attio-icon-value-strip-5up"] .ds-feature-showcase__void { grid-area: visual; min-height: 110px; }   /* the empty middle IS the design (attio) */
.ds-feature-showcase[data-variant="attio-icon-value-strip-5up"] .ds-feature-showcase__caption-title { font-size: var(--ds-text-md); font-weight: var(--ds-weight-medium); }
.ds-feature-showcase[data-variant="attio-icon-value-strip-5up"] .ds-feature-showcase__body { font-size: var(--ds-text-sm); }
/* house — the strip's void is filled with a mono spec line instead of left empty (attio's void collapses badly at narrow widths) */
.ds-feature-showcase:not([data-variant]) .ds-feature-showcase__void,
.ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__void { grid-area: visual; display: flex; align-items: center; min-height: var(--ds-space-12); font-family: var(--ds-font-mono); font-size: var(--ds-text-xs); letter-spacing: .06em; text-transform: uppercase; color: var(--ds-ink-muted); padding-inline: var(--_pad); }
/* ---------------------------------------------------------------------------
   3. BREAKPOINTS — 768: pair / trio / strip / switcher columns; 1024: the aside layout, the 3/5/4 row
   ------------------------------------------------------------------------- */
@media (min-width: 768px) {
  .ds-feature-showcase-group[data-layout="pair"]  { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ds-feature-showcase-group[data-layout="trio"]  { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ds-feature-showcase-group[data-layout="strip"] { grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr)); }
  .ds-feature-showcase-group:is([data-layout="pair"], [data-layout="trio"], [data-layout="strip"]) > .ds-feature-showcase + .ds-feature-showcase { border-block-start: 0; border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase-group[data-layout="switcher"] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .ds-feature-showcase[data-variant="heron-numbered-tag-cards"] { --_visual-h: 230px; }
}
@media (max-width: 767px) {
  /* a 4-up strip wraps 2 × 2: the rule grammar must survive the wrap */
  .ds-feature-showcase-group[data-layout="strip"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ds-feature-showcase-group[data-layout="strip"] > .ds-feature-showcase:nth-child(even) { border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase-group[data-layout="strip"] > .ds-feature-showcase:nth-child(2) { border-block-start: 0; }
}
@media (min-width: 1024px) {
  /* L-FEAT-01: visual 8 cols | gutter | claim 3 cols; the head spans the visual's columns; data-side flips */
  .ds-feature-showcase[data-layout="aside"] {
    grid-template-columns: repeat(12, minmax(0, 1fr));
    column-gap: var(--ds-space-6);
    grid-template-areas: "head head head head head head head head . . . ." "visual visual visual visual visual visual visual visual . aside aside aside";
  }
  .ds-feature-showcase[data-layout="aside"][data-side="right"] {
    grid-template-areas: ". . . . head head head head head head head head" "aside aside aside . visual visual visual visual visual visual visual visual";
  }
  .ds-feature-showcase[data-layout="aside"] .ds-feature-showcase__aside { padding-block-start: var(--ds-space-12); }
  /* the 3/5/4 product row */
  .ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] {
    grid-template-columns: minmax(0, 3fr) minmax(0, 5fr) minmax(0, 4fr);
    grid-template-areas: "head visual caption";
  }
  .ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__head { border-inline-end: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__visual { height: auto; }
  .ds-feature-showcase[data-variant="heron-indexed-product-row-3-5-4"] .ds-feature-showcase__caption { border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]),
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] {
    grid-template-columns: minmax(0, 3fr) minmax(0, 5fr) minmax(0, 4fr);
    grid-template-areas: "head visual caption";
    --_gap: 0px;
  }
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]) .ds-feature-showcase__head,
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__head { flex-direction: column; align-items: flex-start; justify-content: flex-start; gap: var(--ds-space-2); padding: var(--_pad); border-inline-end: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]) .ds-feature-showcase__title,
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__title { margin-block-start: auto; }   /* index top, title + spec pinned bottom (heron's label cell) */
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]) .ds-feature-showcase__nick,
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__nick { margin-inline-start: 0; }
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]) .ds-feature-showcase__caption,
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__caption { padding: var(--_pad); border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase:not([data-variant]) .ds-feature-showcase__frame,
  .ds-feature-showcase-group[data-layout="list"] > .ds-feature-showcase[data-variant="jstov"] .ds-feature-showcase__frame { margin: var(--_pad) 0 0 var(--_pad); border-end-end-radius: 0; border-inline-end: 0; }
  .ds-feature-showcase-group[data-layout="strip"] { grid-template-columns: repeat(auto-fit, minmax(min(160px, 100%), 1fr)); }
}
/* components/footer/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; }
}
/* components/hero/hero.css */
/* ============================================================================
   components/hero/hero.css — Hero                                   taxonomy-components.md §K · common · S1
   Root:  <section class="ds-hero" data-variant="…"> — the page's first region; the H1 lives here.
   Parts: __inner · __copy · __pill (+ __pill-glyph) · __works (+ __works-list · __works-slot · __works-caption)
          · __eyebrow · __title · __lede · __actions · __proof (a composed .ds-social-proof-line; placement hook only) · __aphorism (+ __cite)
          · __support (+ __support-text) · __lane (+ __lane-item) · __spec (+ __spec-key · __spec-value)
          · __band (+ __cell[data-cell="title|support|cta"]) · __strip (+ __strip-item)
          · __visual (+ composed .ds-product-window · __join) · __backdrop · __mark[data-corner]
          · __slab (+ __slab-title · __cluster · __cluster-item · __pager · __pager-btn · __pager-count)
          · __greeting (+ __greeting-title · __kpi · __kpi-label · __kpi-rule · __kpi-value) · __welcome
            (+ __welcome-intro · __welcome-brand · __welcome-body)
   Part axes: __pill[data-tone="accent"] (accent-tinted announcement, cloudflare) · __strip[data-markers="none"]
            (no square item markers, no closing rule, no block padding — cloudflare's bare stat row)
   Variants (data-variant on the root):
     jstov (unmarked root)      — L-HERO-01/03 house: Heron's headline BAND (H1 cell / support cell / CTA cell as three
                                  cells of the frame row) with Intercom's alignment, a mono SPEC STRIP under it instead
                                  of a marquee, and Synara's container-width product peek whose top edge IS the seam
     vercel-annotated-split     — three lanes: H1 + pill pair / centred visual / mono annotation column centred to the H1
     intercom-split-editorial-8-4 — H1 (8 cols) | serif support + pair (4 cols) top-aligned; corner registration marks
     attio-headline-over-floating-product-window — centred pill → H1. → lede → ghost + solid; macOS-chrome window on
                                  a tinted comb ground with a diffuse float shadow, cropped by the section edge
     fibery-split-4-8-screenshot-on-grid — 4/8 split, bold H1, italic aphorism BELOW the CTAs, cream frame on a
                                  perspective grid floor
     synara-painted-copy-safe-zone — glass tile strip as the eyebrow → 56/500 headline → lead → solid + glass pair →
                                  number-in-sentence proof → window at exact container width cut by the fold
     heron-hero-visual-sheet-plus-split-headline-band — text-free crop-marked sheet (composes .ds-sheet-section) then
                                  the band; a benefit ticker (composes .ds-carousel marquee) absorbs the support cell
     givingli-collection-spotlight-slab — tonal title on a tint slab, product cluster right, indexed pager bottom-right
     braintrust-onboarding-hero — greeting row (h1 · label | rule | numeral · one primary) + welcome card with three
                                  pastel action tiles (composes .ds-tile-grid[data-variant="braintrust-pastel-zone-tile"])
   Composes by ROOT class only: button-primary · button-secondary · split-button · tile (.ds-tile-grid / .ds-tile) ·
     stat (.ds-stat-group / .ds-stat) · data-table · carousel · sheet-section · text-link.
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_max --_inset --_stack --_title-size --_title-max --_lede-max
     --_visual-gap --_peek --_fade --_frame-radius --_lane-pitch --_slab-h --_hue-tint --_hue-ink
   Mobile-first; breakpoints 768 and 1024. Nothing overflows at 390: every lane stacks, the frame's table scrolls
   inside its own box.
   ========================================================================== */
/* ---------------------------------------------------------------------------
   0. ROOT + CONTAINER
   ------------------------------------------------------------------------- */
.ds-hero {
  --_max:          var(--ds-container-max);                                   /* 1152 — synara / house              */
  --_inset:        clamp(var(--ds-space-4), 4.2vw, var(--ds-space-16));       /* text inset inside the frame (C-03: 60 @ 1440) */
  --_stack:        var(--ds-space-6);                                         /* pill → h1 → lede → pair (attio 24) */
  --_title-size:   var(--ds-text-display-fluid, clamp(var(--ds-text-3xl), calc(var(--ds-text-xl) + 3vw), calc(var(--ds-text-display) * 1.4)));   /* house H1 = the contract's fluid display step (§13.4); variants keep their own formulas */
  --_title-max:    16ch;
  --_lede-max:     40ch;                                                      /* C-03: lede ≤ 40 ch                  */
  --_visual-gap:   clamp(var(--ds-space-10), 6vw, var(--ds-space-24));        /* copy → window (attio ≈ 90)          */
  --_peek:         clamp(220px, 30vw, 420px);                                 /* window height shown before the fold */
  --_fade:         var(--ds-mock-fade);                                       /* L-SHOT-02                            */
  --_frame-radius: var(--ds-media-radius);                                    /* 12 — L-SHOT-01 house                 */
  --_lane-pitch:   2.6;                                                       /* vercel: 40 px on 15 px mono          */
  position: relative;
  isolation: isolate;
  padding-block-start: var(--ds-section-gap);
  color: var(--ds-ink);
  font-family: var(--ds-font-sans);
  min-width: 0;
}
.ds-hero svg[fill="none"] { fill: none; stroke: currentColor; }
.ds-hero__inner {
  position: relative;
  width: 100%;
  max-width: var(--_max);
  margin-inline: auto;
  padding-inline: var(--ds-gutter-page);
  min-width: 0;
}
/* ---------------------------------------------------------------------------
   1. COPY STACK — pill / works / eyebrow → H1 → lede → pair → proof / aphorism
   ------------------------------------------------------------------------- */
.ds-hero__copy {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: start;
  gap: var(--_stack);
  min-width: 0;
}
.ds-hero__copy > * { min-width: 0; max-width: 100%; }
/* data-align="center" — L-HERO-03's centred stack on any variant (added 2026-09-19 for the section refactor) */
.ds-hero[data-align="center"] .ds-hero__copy { align-items: center; text-align: center; margin-inline: auto; }
.ds-hero[data-align="center"] .ds-hero__works-list { justify-content: center; }
.ds-hero[data-align="center"] .ds-hero__actions { justify-content: center; align-items: center; }
.ds-hero[data-align="center"] .ds-hero__proof { margin: 0; margin-block-start: var(--ds-space-1); }   /* placement only — typography is social-proof-line's (2026-09-20) */
/* announcement pill: hairline capsule, xs text, trailing › — no colour, no icon [attio] [fibery] */
.ds-hero__pill {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1-5);
  min-height: calc(var(--ds-control-h-sm) - var(--ds-space-2));           /* 24 (attio 22–24) */
  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);
  color: var(--ds-ink-2);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  text-decoration: none;
  transition: border-color var(--ds-dur-fast) var(--ds-ease-standard), color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-hero__pill:hover, .ds-hero__pill[data-state="hover"] { border-color: var(--ds-border-strong); color: var(--ds-ink); }
.ds-hero__pill-glyph { color: var(--ds-ink-muted); }
/* data-tone="accent" — the announcement pill tinted with the accent (Cloudflare's badge: brand 12 % fill, brand 35 %
   edge, accent-ink text); the accent-ink / accent-tint pair keeps the contrast on light and on a dark island. 2026-09-20 */
.ds-hero__pill[data-tone="accent"] {
  background: var(--ds-accent-tint);
  border-color: color-mix(in srgb, var(--ds-accent) 35%, transparent);
  color: var(--ds-accent-ink);
}
.ds-hero__pill[data-tone="accent"]:hover, .ds-hero__pill[data-tone="accent"][data-state="hover"] { border-color: var(--ds-accent); color: var(--ds-accent-ink); }
.ds-hero__pill[data-tone="accent"] .ds-hero__pill-glyph { color: inherit; opacity: .7; }
/* works-with strip: N composed .ds-tile slots + a mono caption that NAMES them (the house adds the label) [hsvu79cweaarswf] */
.ds-hero__works { display: flex; flex-direction: column; gap: var(--ds-space-2); align-items: inherit; }
.ds-hero__works-list { display: flex; flex-wrap: wrap; gap: var(--ds-space-2); margin: 0; padding: 0; list-style: none; }
.ds-hero__works-slot { position: relative; inline-size: var(--ds-tap-target-min); flex: none; }
.ds-hero__works-caption, .ds-hero__eyebrow {
  margin: 0;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
  max-width: 60ch;
}
/* H1: display lane, size by viewport, weight from the theme (regular-weight tight-tracked display is the house) */
.ds-hero__title {
  margin: 0;
  max-width: var(--_title-max);
  font-family: var(--ds-font-display);
  font-size: var(--_title-size);
  font-weight: var(--ds-display-weight);
  letter-spacing: var(--ds-display-tracking);
  line-height: var(--ds-lh-tight);
  color: var(--ds-ink);
  text-wrap: balance;
}
.ds-hero__lede {
  margin: 0;
  max-width: var(--_lede-max);
  font-size: var(--ds-text-lg);
  line-height: var(--ds-lh-prose);
  color: var(--ds-ink-muted);                    /* readable secondary — never faint */
  text-wrap: pretty;
}
.ds-hero__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ds-space-3);
  min-width: 0;
}
.ds-hero__actions > * { max-width: 100%; }
/* number-in-sentence proof (L-PROOF-02): muted sentence, figure + noun at full strength; house = mono tabular figures */
.ds-hero__proof {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--ds-space-1) var(--ds-space-2);
  margin: 0;
  margin-block-start: calc(var(--ds-space-5) - var(--_stack));   /* 20 under the pair (synara) */
  font-size: var(--ds-text-sm);
  color: var(--ds-ink-muted);
}
/* italic aphorism + attribution as the mood-closer UNDER the pair [fibery-3-830x6495] */
.ds-hero__aphorism {
  margin: 0;
  font-family: var(--ds-font-body-alt);
  font-style: italic;
  font-size: var(--ds-text-2xl);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink-2);
  max-width: 24ch;
}
.ds-hero__cite { display: block; margin-block-start: var(--ds-space-1); font-size: var(--ds-text-sm); font-style: italic; color: var(--ds-ink-muted); }
/* ---------------------------------------------------------------------------
   2. SUPPORT COLUMN (intercom) · ANNOTATION LANE (vercel) · SPEC TABLE (house)
   ------------------------------------------------------------------------- */
.ds-hero__support { display: flex; flex-direction: column; gap: var(--ds-space-5); min-width: 0; }
.ds-hero__support-text {
  margin: 0;
  font-family: var(--ds-font-body-alt);          /* intercom's serif support lane = the theme's body-alt */
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-prose);
  color: var(--ds-ink-2);
  max-width: 45ch;                               /* C-03: support ≤ 45 ch */
}
/* vercel: three uppercase mono fragments at 2.6× pitch, ink — the annotation REPLACES the subhead */
.ds-hero__lane {
  margin: 0;
  padding: 0;
  list-style: none;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .04em;
  text-transform: uppercase;
  line-height: var(--_lane-pitch);
  color: var(--ds-ink);
}
/* house: a mono KEY  VALUE spec table in the lane instead of noun phrases */
.ds-hero__spec {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  column-gap: var(--ds-space-4);
  margin: 0;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  line-height: 2.2;
  font-variant-numeric: tabular-nums;
}
.ds-hero__spec-key { color: var(--ds-ink-muted); text-transform: uppercase; letter-spacing: .06em; white-space: nowrap; }
.ds-hero__spec-value { margin: 0; color: var(--ds-ink); overflow-wrap: anywhere; }
/* ---------------------------------------------------------------------------
   3. THE BAND (house / heron) — H1 cell | support cell | CTA cell, one hairline row of the frame
   ------------------------------------------------------------------------- */
.ds-hero__band {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  border-block: var(--ds-border-width) solid var(--ds-rule);
  min-width: 0;
}
.ds-hero__cell {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-4);
  padding: var(--ds-space-6) var(--_inset);
  min-width: 0;
}
.ds-hero__cell + .ds-hero__cell { border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-hero__cell[data-cell="title"] { --_title-max: 18ch; }
.ds-hero__cell[data-cell="cta"] { justify-content: flex-end; align-items: flex-start; }
/* the mono spec strip under the band: three prepositional fragments (vercel grammar) as a row of the frame */
.ds-hero__strip {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ds-space-1) var(--ds-space-6);
  margin: 0;
  padding: var(--ds-space-2) var(--_inset);
  list-style: none;
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .06em;
  text-transform: uppercase;
  line-height: var(--ds-lh-list);
  color: var(--ds-ink-muted);
}
.ds-hero__strip-item { display: inline-flex; align-items: center; gap: var(--ds-space-2); min-width: 0; }
.ds-hero__strip-item::before { content: ""; inline-size: var(--ds-space-1-5); block-size: var(--ds-space-1-5); border: var(--ds-border-width) solid var(--ds-rule-strong); flex: none; }
/* data-markers="none" — the strip without the square item markers (Cloudflare's bare mono stat row) and without the
   closing rule: plain fragments at the mono size, separated by the row gap alone. 2026-09-20 */
.ds-hero__strip[data-markers="none"] { border-block-end: 0; padding-block: 0; }
.ds-hero__strip[data-markers="none"] .ds-hero__strip-item::before { display: none; }
/* ---------------------------------------------------------------------------
   4. VISUAL LANE — holds a composed .ds-product-window (which owns frame · chrome · crop/fade · mini shell).
      hero keeps only the lane (__visual) and its drawn joins (__join). Frame/chrome/pane rules removed 2026-09-20.
   ------------------------------------------------------------------------- */
.ds-hero__visual { position: relative; margin-block-start: var(--_visual-gap); min-width: 0; }
/* macOS-style chrome bar (attio / synara) — three lights in a tint bar */
/* empty: the frame footprint is drawn dashed with a mono word — a hero never ships a blank stage */
/* loading: the window is a skeleton in its true frame */
.ds-hero[aria-busy="true"] :is(.ds-hero__title, .ds-hero__lede, .ds-hero__eyebrow, .ds-hero__support-text),
.ds-hero[aria-busy="true"] :is(.ds-hero__title, .ds-hero__lede) * {
  color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs);
  -webkit-box-decoration-break: clone; box-decoration-break: clone;
}
/* intercom's registration marks: 6 px accent squares at the region's four corners (decorative) */
.ds-hero__mark {
  position: absolute;
  inline-size: var(--ds-space-1-5);
  block-size: var(--ds-space-1-5);
  background: var(--ds-accent);
  pointer-events: none;
}
.ds-hero__mark[data-corner="tl"] { inset-block-start: 0; inset-inline-start: var(--ds-space-2); }
.ds-hero__mark[data-corner="tr"] { inset-block-start: 0; inset-inline-end: var(--ds-space-2); }
.ds-hero__mark[data-corner="bl"] { inset-block-end: 0; inset-inline-start: var(--ds-space-2); }
.ds-hero__mark[data-corner="br"] { inset-block-end: 0; inset-inline-end: var(--ds-space-2); }
/* drawn joins where the seam meets the rails (rox) — house only, ≥ 768 */
.ds-hero__join {
  position: absolute;
  inset-block-start: -5px;
  width: 9px;
  height: 9px;
  display: none;
  pointer-events: none;
  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-hero__join[data-side="start"] { inset-inline-start: -5px; }
.ds-hero__join[data-side="end"]   { inset-inline-end: -5px; }
/* ---------------------------------------------------------------------------
   5. VARIANT · jstov (house — unmarked root)
      the drafting sheet: rails, the band as a frame row, the spec strip, copy inset 60, the window's top
      edge IS the seam (no radius, no shadow), bottom fades into the ground.
   ------------------------------------------------------------------------- */
@media (min-width: 768px) {
  .ds-hero:not([data-variant]) .ds-hero__inner,
  .ds-hero[data-variant="jstov"] .ds-hero__inner { padding-inline: 0; }   /* rails carry the edge; copy inset comes from __copy */
}
.ds-hero:not([data-variant]) .ds-hero__band,
.ds-hero[data-variant="jstov"] .ds-hero__band { --_title-max: 18ch; }
.ds-hero:not([data-variant]) .ds-hero__figure,
.ds-hero[data-variant="jstov"] .ds-hero:not([data-variant]) .ds-hero__visual,
.ds-hero[data-variant="jstov"] .ds-hero__visual { margin-block-start: 0; padding-block-start: var(--ds-space-2); height: calc(var(--_peek) + var(--ds-space-2));
  max-width: var(--_max); margin-inline: auto; }          /* C-03: the window never passes the rails (builder finding 2026-09-19) */
/* the −5px join marks must never cause a page scroll: clip them at the root when the frame meets the viewport */
.ds-hero:not([data-variant]),
.ds-hero[data-variant="jstov"] { overflow-x: clip; }
/* ---------------------------------------------------------------------------
   6. VARIANT · vercel-annotated-split  [vercel-page]
      three lanes: two-word H1 at 5× + pill pair / centred visual / mono lane vertically centred to the H1
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="vercel-annotated-split"] {
  --_title-size: clamp(var(--ds-text-3xl), 5.2vw, calc(var(--ds-text-display) * 1.5));   /* 5× at 1920; vw-capped so one long word stays in its lane */
  --_title-max: 12ch;
  --_stack: var(--ds-space-8);                    /* h1 → pair 48 */
}
.ds-hero[data-variant="vercel-annotated-split"] .ds-hero__inner { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-10); align-items: center; }
.ds-hero[data-variant="vercel-annotated-split"] .ds-hero__visual { margin: 0; display: grid; place-items: center; min-height: 240px; }
/* the pastel blob under the mark: the theme's illustration ground + texture, never a raw hue */
.ds-hero[data-variant="vercel-annotated-split"] .ds-hero__visual::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: radial-gradient(closest-side, var(--ds-illustration-ground), transparent);
  pointer-events: none;
}
.ds-hero[data-variant="vercel-annotated-split"] .ds-hero__visual svg { inline-size: clamp(96px, 30%, 200px); color: var(--ds-ink); }
/* ---------------------------------------------------------------------------
   7. VARIANT · intercom-split-editorial-8-4  [intercom-3-830x8816]
      H1 8 cols | support paragraph (serif lane, inline proper-noun link) + pair 4 cols, top-aligned to the cap line
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="intercom-split-editorial-8-4"] { --_title-max: 22ch; }
.ds-hero[data-variant="intercom-split-editorial-8-4"] .ds-hero__inner { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-8); align-items: start; padding-block: var(--ds-space-6); }
.ds-hero[data-variant="intercom-split-editorial-8-4"] .ds-hero__support-text a { color: var(--ds-ink); }
/* ---------------------------------------------------------------------------
   8. VARIANT · attio-headline-over-floating-product-window  [attio-2-1-830x8225]
      centred stack · window narrower than the container on a tinted, comb-textured ground · float shadow · cropped
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="attio-headline-over-floating-product-window"] { overflow: hidden; --_title-max: 18ch; }
.ds-hero[data-variant="attio-headline-over-floating-product-window"] .ds-hero__copy { align-items: center; text-align: center; margin-inline: auto; }
.ds-hero[data-variant="attio-headline-over-floating-product-window"] .ds-hero__actions { justify-content: center; }
.ds-hero[data-variant="attio-headline-over-floating-product-window"] .ds-hero__visual {
  margin-block-start: 0;
  padding-block-start: var(--_visual-gap);
  padding-inline: var(--ds-gutter-page);
  height: calc(var(--_peek) + var(--_visual-gap));
  background: linear-gradient(to bottom, transparent, var(--ds-illustration-ground));
}
.ds-hero[data-variant="attio-headline-over-floating-product-window"] .ds-hero__visual::before {
  content: "";
  position: absolute;
  inset: 0;
  background: repeating-linear-gradient(to right, var(--ds-texture-color) 0 1px, transparent 1px 14px);
  -webkit-mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 75%);
          mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 75%);
  pointer-events: none;
}
/* ---------------------------------------------------------------------------
   9. VARIANT · fibery-split-4-8-screenshot-on-grid  [fibery-3-830x6495]
      4/8 split · bold H1 · aphorism under the pair · cream (surface-2) frame with a strong hairline on a perspective grid
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] {
  overflow: hidden;                                /* the perspective floor bleeds 30 % past the grid — clip it at the section */
  --_stack: var(--ds-space-5);
  --_title-max: 12ch;
  --_lede-max: 38ch;
  --_title-size: clamp(var(--ds-text-3xl), calc(var(--ds-text-xl) + 2.4vw), calc(var(--ds-text-display) * 1.3));
}
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__inner { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--ds-space-10); align-items: start; padding-block-end: var(--ds-space-12); }
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__title { font-weight: var(--ds-weight-bold); }
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__lede { font-size: var(--ds-text-md); color: var(--ds-ink-2); }
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__aphorism { color: var(--ds-accent-ink); }
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__visual { margin: 0; padding: var(--ds-space-6); }
.ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__visual::before {
  content: "";
  position: absolute;
  inset: 10% -30% -10%;
  z-index: -1;
  background:
    repeating-linear-gradient(to right, var(--ds-texture-color) 0 1px, transparent 1px 40px),
    repeating-linear-gradient(to bottom, var(--ds-texture-color) 0 1px, transparent 1px 40px);
  transform: perspective(720px) rotateX(58deg);
  transform-origin: 50% 0;
  -webkit-mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 30%, var(--ds-ink) 80%, transparent);
          mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 30%, var(--ds-ink) 80%, transparent);
  pointer-events: none;
}
/* ---------------------------------------------------------------------------
   10. VARIANT · synara-painted-copy-safe-zone  [hsvu79cweaarswf]
       full-bleed backdrop plate with a copy-safe zone, glass tiles as the eyebrow, solid + glass pair, proof line,
       the window at EXACT container width cut by the fold. Copy is ink on the plate — never white over an image.
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="synara-painted-copy-safe-zone"] { padding-block-start: 0; overflow: hidden; --_stack: var(--ds-space-8); --_lede-max: 45ch; }
.ds-hero__backdrop {
  position: absolute;
  inset: 0;
  z-index: -1;
  overflow: hidden;
  background:
    radial-gradient(60% 90% at 84% 62%, var(--ds-texture-color), transparent 70%),
    radial-gradient(40% 50% at 70% 20%, var(--ds-texture-color), transparent 70%),
    var(--ds-illustration-ground);
}
.ds-hero__backdrop > :is(img, picture, svg, video) { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 80% 50%; }
.ds-hero[data-variant="synara-painted-copy-safe-zone"] .ds-hero__inner { padding-block-start: var(--ds-space-16); }
.ds-hero[data-variant="synara-painted-copy-safe-zone"] .ds-hero__visual { margin-block-start: var(--ds-space-12); }
/* ---------------------------------------------------------------------------
   11. VARIANT · heron-hero-visual-sheet-plus-split-headline-band  [heron-ai-830x5619]
       a text-free crop-marked sheet (composed .ds-sheet-section) then the band; ticker under the support cell
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] { padding-block-start: 0; }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__inner { padding-inline: 0; }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__band { border-block-start: 0; }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__title { font-weight: var(--ds-weight-bold); --_title-max: 22ch; }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__cell[data-cell="support"] { padding-block-end: 0; gap: var(--ds-space-5); }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__cell[data-cell="support"] > .ds-carousel { margin-block-start: auto; margin-inline: calc(-1 * var(--_inset)); border-block-start: var(--ds-border-width) solid var(--ds-rule); }
.ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__support-text { font-family: var(--ds-font-sans); font-size: var(--ds-text-sm); color: var(--ds-ink-2); }
/* ---------------------------------------------------------------------------
   12. VARIANT · givingli-collection-spotlight-slab  [givingli-web-15]
       rounded tint slab · tonal title bottom-left (a deep shade of the slab's own hue) · product cluster right ·
       indexed pager bottom-right. data-hue="1…8" picks the slab's hue from the data set.
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="givingli-collection-spotlight-slab"] { padding-block-start: var(--ds-space-6); }
.ds-hero__slab {
  --_slab-h: clamp(200px, 22vw, 320px);
  --_hue-tint: var(--ds-data-1-tint);
  --_hue-ink:  var(--ds-data-1-ink);
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  min-height: var(--_slab-h);
  padding: var(--ds-space-6);
  border-radius: var(--ds-radius-xl);            /* 24 for a full-width slab (radius-by-scale) */
  background: var(--_hue-tint);
  color: var(--_hue-ink);
  overflow: hidden;
  min-width: 0;
}
.ds-hero__slab[data-hue="2"] { --_hue-tint: var(--ds-data-2-tint); --_hue-ink: var(--ds-data-2-ink); }
.ds-hero__slab[data-hue="3"] { --_hue-tint: var(--ds-data-3-tint); --_hue-ink: var(--ds-data-3-ink); }
.ds-hero__slab[data-hue="6"] { --_hue-tint: var(--ds-data-6-tint); --_hue-ink: var(--ds-data-6-ink); }
.ds-hero__slab[data-hue="7"] { --_hue-tint: var(--ds-data-7-tint); --_hue-ink: var(--ds-data-7-ink); }
.ds-hero__slab-title {
  align-self: end;
  margin: 0;
  font-family: var(--ds-font-display);
  font-size: clamp(var(--ds-text-2xl), calc(var(--ds-text-lg) + 2vw), var(--ds-text-display));
  font-weight: var(--ds-display-weight);
  letter-spacing: var(--ds-display-tracking);
  line-height: var(--ds-lh-tight);
  color: inherit;
  max-width: 16ch;
  text-wrap: balance;
}
.ds-hero__cluster { display: none; position: absolute; inset-block: var(--ds-space-6) auto; inset-inline-end: var(--ds-space-16); gap: 0; list-style: none; margin: 0; padding: 0; }
.ds-hero__cluster-item {
  inline-size: 96px;
  aspect-ratio: 5 / 7;
  margin-inline-start: calc(-1 * var(--ds-space-8));
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: var(--ds-radius-sm);
  background: var(--ds-surface);
  box-shadow: var(--ds-shadow-object);           /* physical objects: the cards float on the slab */
  display: grid;
  place-items: center;
  color: var(--ds-ink-muted);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
}
.ds-hero__cluster-item:nth-child(1) { transform: rotate(-8deg); }
.ds-hero__cluster-item:nth-child(3) { transform: rotate(8deg) translateY(var(--ds-space-2)); }
.ds-hero__pager {
  position: absolute;
  inset-block-end: var(--ds-space-4);
  inset-inline-end: var(--ds-space-4);
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  padding: var(--ds-space-0-5);
  border-radius: var(--ds-radius-pill);
  background: var(--ds-surface-inverse);
  color: var(--ds-ink-inverse);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  font-variant-numeric: tabular-nums;
}
.ds-hero__pager-btn {
  display: grid;
  place-items: center;
  inline-size: var(--ds-control-h-sm);
  block-size: calc(var(--ds-control-h-sm) - var(--ds-space-2));
  border: 0;
  border-radius: var(--ds-radius-pill);
  background: transparent;
  color: inherit;
  cursor: pointer;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-hero__pager-btn svg { inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-hero__pager-btn:hover, .ds-hero__pager-btn[data-state="hover"] { background: var(--ds-surface-inverse-hover); }
.ds-hero__pager-btn:disabled { color: var(--ds-ink-faint); cursor: not-allowed; }
.ds-hero__pager-count { padding-inline: var(--ds-space-1); }
/* ---------------------------------------------------------------------------
   13. VARIANT · braintrust-onboarding-hero  [braintrust-web-13]
       greeting row (h1 · `label | rule | numeral` · ONE 48 px primary) then a welcome card: intro column +
       three pastel action tiles (composed .ds-tile-grid[data-variant="braintrust-pastel-zone-tile"])
   ------------------------------------------------------------------------- */
.ds-hero[data-variant="braintrust-onboarding-hero"] { padding-block-start: var(--ds-space-6); --_title-size: var(--ds-text-display); }
.ds-hero__greeting {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--ds-space-4) var(--ds-space-6);
  min-height: var(--ds-control-h-lg);
  margin-block-end: var(--ds-space-8);
}
.ds-hero__greeting-title { margin: 0; font-family: var(--ds-font-display); font-size: var(--_title-size); font-weight: var(--ds-display-weight); letter-spacing: var(--ds-display-tracking); line-height: var(--ds-lh-tight); }
.ds-hero__kpi { display: inline-flex; align-items: center; gap: var(--ds-space-3); flex-wrap: wrap; }
.ds-hero__kpi-label { font-size: var(--ds-text-sm); font-weight: var(--ds-weight-medium); color: var(--ds-ink-muted); }
.ds-hero__kpi-rule { inline-size: var(--ds-border-width); block-size: var(--ds-control-h-sm); background: var(--ds-rule-strong); }
.ds-hero__kpi-value { font-family: var(--ds-font-mono); font-size: var(--ds-text-2xl); font-weight: var(--ds-weight-regular); font-variant-numeric: tabular-nums; color: var(--ds-ink); }
.ds-hero__welcome {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--ds-space-6);
  padding: var(--ds-space-6);
  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-lg);
  min-width: 0;
}
.ds-hero__welcome-intro { display: flex; flex-direction: column; gap: var(--ds-space-2); min-width: 0; max-width: 32ch; }
.ds-hero__welcome-intro > .ds-hero__eyebrow { font-family: var(--ds-font-sans); text-transform: none; letter-spacing: 0; font-size: var(--ds-text-sm); font-weight: var(--ds-weight-regular); }
.ds-hero__welcome-brand { margin: 0; font-size: var(--ds-text-2xl); font-weight: var(--ds-weight-medium); letter-spacing: var(--ds-display-tracking); line-height: var(--ds-lh-heading); }
.ds-hero__welcome-body { margin: 0; font-size: var(--ds-text-sm); line-height: var(--ds-lh-body); color: var(--ds-ink-2); }
/* ---------------------------------------------------------------------------
   14. BREAKPOINTS — 768: rails + joins (house), synara copy-safe zone; 1024: the lanes / splits / band cells
   ------------------------------------------------------------------------- */
@media (min-width: 768px) {
  .ds-hero:not([data-variant]) .ds-hero__inner,
  .ds-hero[data-variant="jstov"] .ds-hero__inner,
  .ds-hero[data-variant="heron-hero-visual-sheet-plus-split-headline-band"] .ds-hero__inner { border-inline: var(--ds-border-width) solid var(--ds-rule); }   /* the rails */
  .ds-hero:not([data-variant]) .ds-hero__join,
  .ds-hero[data-variant="jstov"] .ds-hero__join { display: block; }
  .ds-hero__cluster { display: flex; }
  .ds-hero[data-variant="synara-painted-copy-safe-zone"] .ds-hero__copy { max-width: var(--_copy-max, 58%); }   /* the copy-safe zone; --_copy-max knob (recreation finding 2026-09-20) */
}
@media (min-width: 1024px) {
  .ds-hero__band { grid-template-columns: minmax(0, 7fr) minmax(0, 4fr) auto; }
  .ds-hero__cell + .ds-hero__cell { border-block-start: 0; border-inline-start: var(--ds-border-width) solid var(--ds-rule); }
  .ds-hero__cell[data-cell="cta"] { min-inline-size: 12rem; }
  .ds-hero[data-variant="vercel-annotated-split"] .ds-hero__inner { grid-template-columns: minmax(0, 6fr) minmax(0, 3fr) minmax(0, 3fr); gap: var(--ds-space-8); min-height: 60vh; }
  .ds-hero[data-variant="vercel-annotated-split"] .ds-hero__lane { align-self: center; }
  .ds-hero[data-variant="intercom-split-editorial-8-4"] .ds-hero__inner { grid-template-columns: minmax(0, 8fr) minmax(0, 4fr); gap: var(--ds-space-12); }
  .ds-hero[data-variant="fibery-split-4-8-screenshot-on-grid"] .ds-hero__inner { grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); gap: var(--ds-space-12); }
  .ds-hero__welcome { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); align-items: start; }   /* three tiles need three quarters */
}
@media (prefers-reduced-motion: reduce) {
  .ds-hero__cluster-item { transform: none; }
}
/* components/key-value-facts/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); }
/* components/list-row/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; }
/* components/marketing-nav/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; }
}
/* components/product-window/product-window.css */
/* ============================================================================
   product-window — Product screenshot frame                (taxonomy §H · common · S1 · L-SHOT-01…05)
   Root:  <figure class="ds-product-window" data-chrome="none|macos" data-crop="none|clip|fade" [data-fit="content"]
          [data-backdrop="dots|comb|grid|plate"] [data-overflow="start|end|both"] [data-rails] [data-size="sm|md"]>
   Parts: __backdrop (textured field behind the frame, decorative) · __stage (the CLIPPING box — owns data-crop) ·
          __frame (hairline + radius + surface; `inert aria-hidden` when it holds live markup) ·
          __chrome (+ __light ×3 · __address) · __body (the SIZE CONTAINER `ds-product-window`) ·
          __app (+ __app-body · __side · __pane · __pane-title — the composable mini shell; the sidebar appears
          only when the WINDOW is ≥ 800 px wide, never the page) · __img (a plain screenshot instead of __app) ·
          __mark[data-corner] (corner marks) · __band (a slot over the top edge — plane) · __zoom (retool pill) ·
          __message (error copy) · __caption (visible mono caption) · a .ds-sr-only alt ALWAYS
   Variants (data-variant on the root):
     jstov (unmarked root)      — Vercel's chrome-less hairline frame at 12, NO shadow on the page plane, top edge
                                  clipped + bottom faded (L-SHOT-02/03); data-rails when the frame sits at container
                                  width (its vertical edges ARE the page rails); the dotted drawing grid is the only
                                  backdrop allowed
     vercel-fade-masked-frame   — hairline r12, no chrome, bottom fade ~180 into the ground
     attio-macos-chrome-cropped-by-next-section — traffic lights, r14, diffuse object shadow, tint + comb backdrop,
                                  narrower than the container, clipped by the next section
     synara-container-width-peek — real chrome at exact container width, thin border + soft shadow, cut by the fold
     fibery-overflow-clipped-vignette — cream frame (surface-2) around a bordered canvas; the UI is LARGER than its
                                  card and cropped by the rounded overflow (data-overflow)
     intercom-on-photographic-backdrop — window centred on a textured plate with corner marks; the panel is r0
     retool-artboard-frame      — app frame on a dot-grid canvas with a floating zoom pill
     attio-feature-pair-mini-mock-with-fade — data-size="sm": a 320 px block that fades, for 50/50 feature pairs
     plane-peeking-characters-hero-frame (S2) — window on a coloured ground, characters overlapping its top edge;
                                  a brand asset: the SLOT ships, the characters come from illustration-slot
   Composes by ROOT class only: top-bar · sidebar-nav-panel · nav-item · stat · data-table · avatar · illustration-slot.
   Supersedes: patterns/sections/l-hero-03-centred-product-window.css __app/__app-body/__app-side/__pane/__pane-title
     + @container ds-hero-app; components/hero/hero.css __visual[data-crop]/__frame/__chrome/__light (the __join
     seam ornament stays with the hero — it belongs to the page frame, not the window);
     components/feature-showcase __visual[data-crop]/__frame (the fade-masked frame).
   Shadows: attio/synara float as PHYSICAL objects → --ds-shadow-object (float/modal are for overlays only).
   Tokens only (tools/lint-tokens.mjs). Private knobs: --_radius --_peek --_fade --_max --_scale --_bleed --_pad --_mark
   Mobile-first: nothing overflows at 390 — the stage clips, the table scrolls in its own box.
   ========================================================================== */
.ds-product-window {
  --_radius: var(--ds-media-radius);                 /* 12 — L-SHOT-01 house; attio 14, plane 16 via variants */
  --_peek:   clamp(220px, 30vw, 420px);              /* height shown before the crop                        */
  --_fade:   var(--ds-mock-fade);                    /* 96 house · vercel 180                                 */
  --_max:    100%;
  --_scale:  1;                                      /* attio: internal UI at ~60 % — zoom on __app          */
  --_bleed:  25%;                                    /* fibery: how far the UI outruns its card              */
  --_pad:    0px;                                    /* backdrop padding                                     */
  position: relative;
  isolation: isolate;
  margin: 0;
  padding: var(--_pad);
  min-width: 0;
  color: var(--ds-ink);
  font-family: var(--ds-font-sans);
}
.ds-product-window svg[fill="none"] { fill: none; stroke: currentColor; }
/* ---- backdrop: a decorative field behind the frame (skin). data-backdrop paints ::before; the optional
   __backdrop element is for CUSTOM art (an <img> / <video>) and is only positioned, never painted ---- */
.ds-product-window[data-backdrop]::before,
.ds-product-window__backdrop { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; }
.ds-product-window__backdrop > * { inline-size: 100%; block-size: 100%; object-fit: cover; }
.ds-product-window[data-backdrop] { --_pad: clamp(var(--ds-space-4), 4vw, var(--ds-space-12)); }
/* dots — the house's ONLY backdrop: the drawing grid (heron / attio workflow canvas) */
.ds-product-window[data-backdrop="dots"]::before {
  background: radial-gradient(circle, var(--ds-texture-color) 1px, transparent 1.2px) 0 0 / 12px 12px;
}
/* comb — attio: vertical hairlines fading upward on a tint gradient */
.ds-product-window[data-backdrop="comb"]::before {
  background:
    repeating-linear-gradient(to right, var(--ds-texture-color) 0 1px, transparent 1px 14px),
    linear-gradient(to bottom, transparent, var(--ds-illustration-ground));
  -webkit-mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 60%);
          mask-image: linear-gradient(to bottom, transparent, var(--ds-ink) 60%);
}
/* grid — fibery: grid-paper floor */
.ds-product-window[data-backdrop="grid"]::before {
  background:
    linear-gradient(var(--ds-texture-color) 1px, transparent 1px) 0 0 / 100% 28px,
    linear-gradient(to right, var(--ds-texture-color) 1px, transparent 1px) 0 0 / 28px 100%,
    var(--ds-surface-2);
}
/* plate — intercom: a "photographic" field. Token-painted stand-in: illustration ground + two data tints */
.ds-product-window[data-backdrop="plate"]::before {
  background:
    radial-gradient(120% 80% at 20% 10%, var(--ds-data-6-tint), transparent 60%),
    radial-gradient(90% 70% at 90% 90%, var(--ds-data-7-tint), transparent 55%),
    var(--ds-illustration-ground);
}
/* ---- stage: the clipping box; data-crop lives on the ROOT, geometry here ---- */
.ds-product-window__stage { position: relative; min-width: 0; max-width: var(--_max); margin-inline: auto; }
.ds-product-window[data-crop="clip"] .ds-product-window__stage,
.ds-product-window[data-crop="fade"] .ds-product-window__stage { height: var(--_peek); overflow: hidden; }   /* L-SHOT-03: crop origin top-left */
.ds-product-window[data-crop="fade"] .ds-product-window__stage {
  -webkit-mask-image: linear-gradient(to bottom, var(--ds-ink) calc(100% - var(--_fade)), transparent);
          mask-image: linear-gradient(to bottom, var(--ds-ink) calc(100% - var(--_fade)), transparent);
}
/* crop="none" = natural height: the shell no longer reserves --_peek, so a short mock does not leave a blank half (2026-09-20) */
.ds-product-window[data-crop="none"] .ds-product-window__app-body { min-height: auto; }
/* fit="content": the stage is as tall as its content and the crop applies only when the content is TALLER than --_peek
   (max-height instead of height). Under fade the bottom mask still paints at the stage's edge — use clip for a hard
   content-height stage. With crop="none" the axis is a no-op (nothing caps). */
.ds-product-window[data-fit="content"] .ds-product-window__app-body { min-height: auto; }
.ds-product-window[data-fit="content"][data-crop="clip"] .ds-product-window__stage,
.ds-product-window[data-fit="content"][data-crop="fade"] .ds-product-window__stage { height: auto; max-height: var(--_peek); }
/* ---- frame: hairline + radius + surface; no chrome, no shadow (house) ---- */
.ds-product-window__frame {
  position: relative;
  width: 100%;
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: var(--_radius);
  background: var(--ds-surface);
  color: var(--ds-ink);
  text-align: start;
  overflow: hidden;
  min-width: 0;
}
.ds-product-window__frame > * { min-width: 0; }
/* rails: at container width the frame's vertical edges are the page rails — no radius, no side borders */
.ds-product-window[data-rails] .ds-product-window__frame { border-radius: 0; border-inline: 0; }
/* ---- chrome: macOS-style bar (attio / synara). Lights neutral by default; attio colours them ---- */
.ds-product-window__chrome {
  display: none;
  align-items: center;
  gap: var(--ds-space-2);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-3);
  background: var(--ds-surface-2);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
}
.ds-product-window[data-chrome="macos"] .ds-product-window__chrome { display: flex; }
.ds-product-window__light { inline-size: 10px; block-size: 10px; border-radius: var(--ds-radius-pill); background: var(--ds-rule-strong); flex: none; }
.ds-product-window__address {
  margin-inline: auto;
  padding: 0 var(--ds-space-3);
  min-height: calc(var(--ds-control-h-sm) - var(--ds-space-2));
  display: inline-flex;
  align-items: center;
  border-radius: var(--ds-radius-xs);
  background: var(--ds-surface);
  border: var(--ds-border-width) solid var(--ds-rule);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  color: var(--ds-ink-muted);
  white-space: nowrap;
  max-width: 60%;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* ---- body: THE size container. Anything composed inside reads the window's width, not the page's ---- */
.ds-product-window__body {
  display: flex;
  flex-direction: column;
  min-width: 0;
  background: var(--ds-surface);
  container-type: inline-size;
  container-name: ds-product-window;
}
.ds-product-window__img { display: block; width: 100%; height: auto; }
/* the composable mini shell: top-bar (composed) → [side | pane] */
.ds-product-window__app { display: flex; flex-direction: column; min-width: 0; zoom: var(--_scale); }
.ds-product-window__app-body {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  min-width: 0;
  min-height: var(--_peek);
}
.ds-product-window__side { display: none; min-width: 0; }
.ds-product-window__pane {
  display: flex;
  flex-direction: column;
  gap: var(--ds-card-gap);
  padding: var(--ds-card-pad);
  min-width: 0;
  background: var(--ds-surface);
}
.ds-product-window__pane-title {
  margin: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-heading-weight);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
}
@container ds-product-window (min-width: 800px) {
  .ds-product-window__app-body:has(> .ds-product-window__side) { grid-template-columns: auto minmax(0, 1fr); }
  .ds-product-window__side { display: block; }
}
/* overflow (fibery): the UI outruns its card and the rounded overflow crops it */
.ds-product-window[data-overflow="start"] .ds-product-window__app { width: calc(100% + var(--_bleed)); margin-inline-start: calc(-1 * var(--_bleed)); }
.ds-product-window[data-overflow="end"]   .ds-product-window__app { width: calc(100% + var(--_bleed)); }
.ds-product-window[data-overflow="both"]  .ds-product-window__app { width: calc(100% + 2 * var(--_bleed)); margin-inline-start: calc(-1 * var(--_bleed)); }
/* ---- corner marks (intercom): 12 px L-marks at the stage corners; ink over a plate, accent otherwise ---- */
.ds-product-window__mark {
  position: absolute;
  inline-size: var(--ds-space-3);
  block-size: var(--ds-space-3);
  color: var(--_mark, var(--ds-accent));
  pointer-events: none;
  z-index: 1;
  background:
    linear-gradient(currentColor, currentColor) 0 0 / 100% 1px no-repeat,
    linear-gradient(currentColor, currentColor) 0 0 / 1px 100% no-repeat;
}
.ds-product-window[data-backdrop="plate"] .ds-product-window__mark { color: var(--_mark, var(--ds-ink)); }   /* over real photography: --_mark: var(--ds-ink-on-overlay) */
.ds-product-window__mark[data-corner="tl"] { inset-block-start: var(--ds-space-3); inset-inline-start: var(--ds-space-3); }
.ds-product-window__mark[data-corner="tr"] { inset-block-start: var(--ds-space-3); inset-inline-end: var(--ds-space-3); transform: scaleX(-1); }
.ds-product-window__mark[data-corner="bl"] { inset-block-end: var(--ds-space-3); inset-inline-start: var(--ds-space-3); transform: scaleY(-1); }
.ds-product-window__mark[data-corner="br"] { inset-block-end: var(--ds-space-3); inset-inline-end: var(--ds-space-3); transform: scale(-1); }
/* ---- caption + alt ---- */
.ds-product-window__caption {
  margin: var(--ds-space-2) 0 0;
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .05em;
  text-transform: uppercase;
  color: var(--ds-ink-muted);
}
/* ---- states ---- */
/* empty: the footprint is drawn dashed with a mono word — never a blank stage (X-04) */
.ds-product-window[data-state="empty"] .ds-product-window__frame {
  display: grid;
  place-items: center;
  min-height: var(--_peek);
  border-style: dashed;
  border-color: var(--ds-rule-strong);
  background: transparent;
  color: var(--ds-ink-muted);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  letter-spacing: .06em;
  text-transform: uppercase;
}
.ds-product-window[data-state="empty"] .ds-product-window__frame > :not(.ds-product-window__message) { display: none; }
/* loading: the skeleton fills the TRUE frame; nothing reflows on arrival (X-01) */
.ds-product-window[aria-busy="true"] .ds-product-window__frame { background: var(--ds-skeleton); border-color: transparent; min-height: var(--_peek); }
.ds-product-window[aria-busy="true"] .ds-product-window__frame > * { visibility: hidden; }
/* error: the screenshot failed — danger tint + the message in danger ink */
.ds-product-window[data-state="error"] .ds-product-window__frame {
  display: grid;
  place-items: center;
  min-height: var(--_peek);
  border-color: var(--ds-danger);
  background: var(--ds-danger-tint);
}
.ds-product-window[data-state="error"] .ds-product-window__frame > :not(.ds-product-window__message) { display: none; }
.ds-product-window__message { margin: 0; padding: var(--ds-space-4); font-size: var(--ds-text-sm); text-align: center; }
.ds-product-window[data-state="error"] .ds-product-window__message { color: var(--ds-danger-ink); }
/* interactive (the window is a link to a demo): tint step per data-hover, ring on the frame */
a.ds-product-window { display: block; text-decoration: none; color: inherit; }
a.ds-product-window:hover .ds-product-window__frame,
.ds-product-window[data-state="hover"] .ds-product-window__frame { border-color: var(--ds-border-strong); box-shadow: var(--ds-hover-shadow); }
a.ds-product-window:focus-visible { outline: none; }
a.ds-product-window:focus-visible .ds-product-window__frame { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
/* ---- size: sm = the feature-pair mini mock (attio): a fixed 320 block that fades ---- */
.ds-product-window[data-size="sm"] { --_peek: 320px; --_scale: .85; --_radius: var(--ds-radius-md); }
/* ---------------------------------------------------------------------------
   VARIANTS
   ------------------------------------------------------------------------- */
/* vercel-fade-masked-frame [vercel-page] — hairline r12, no chrome, bottom fade ~180 */
.ds-product-window[data-variant="vercel-fade-masked-frame"] { --_fade: 180px; }
/* attio-macos-chrome-cropped-by-next-section [attio-2-1-830x8225] */
.ds-product-window[data-variant="attio-macos-chrome-cropped-by-next-section"] {
  --_radius: calc(var(--ds-radius-lg) + 2px);
  --_max: 1024px;
}
.ds-product-window[data-variant="attio-macos-chrome-cropped-by-next-section"] .ds-product-window__frame { box-shadow: var(--ds-shadow-object); }
.ds-product-window[data-variant="attio-macos-chrome-cropped-by-next-section"] .ds-product-window__light:nth-child(1) { background: var(--ds-danger); }
.ds-product-window[data-variant="attio-macos-chrome-cropped-by-next-section"] .ds-product-window__light:nth-child(2) { background: var(--ds-warning); }
.ds-product-window[data-variant="attio-macos-chrome-cropped-by-next-section"] .ds-product-window__light:nth-child(3) { background: var(--ds-success); }
/* synara-container-width-peek [hsvu79cweaarswf] — thin border + soft shadow, exact container width */
.ds-product-window[data-variant="synara-container-width-peek"] { --_max: var(--ds-container-max); }
.ds-product-window[data-variant="synara-container-width-peek"] .ds-product-window__frame { box-shadow: var(--ds-shadow-object); }
/* fibery-overflow-clipped-vignette [fibery-3-830x6495] — cream frame around a bordered canvas; UI larger than the card */
.ds-product-window[data-variant="fibery-overflow-clipped-vignette"] { --_radius: var(--ds-radius-xl); }
.ds-product-window[data-variant="fibery-overflow-clipped-vignette"] .ds-product-window__frame {
  padding: var(--ds-space-2);
  background: var(--ds-surface-2);
  border-color: var(--ds-rule-strong);
}
.ds-product-window[data-variant="fibery-overflow-clipped-vignette"] .ds-product-window__body {
  border: var(--ds-border-width) solid var(--ds-rule);
  border-radius: calc(var(--_radius) - var(--ds-space-2));            /* child ≤ parent − 2 */
  overflow: hidden;
}
/* intercom-on-photographic-backdrop [intercom-3-830x8816] — r0 panel, window centred on the plate, white marks */
.ds-product-window[data-variant="intercom-on-photographic-backdrop"] { --_radius: var(--ds-radius-md); --_pad: clamp(var(--ds-space-6), 6vw, var(--ds-space-20)); --_max: 880px; }
.ds-product-window[data-variant="intercom-on-photographic-backdrop"] .ds-product-window__frame { box-shadow: var(--ds-shadow-object); }
/* retool-artboard-frame [retool-web-25] — dot canvas, tinted app frame with 20 inner padding, floating zoom pill */
.ds-product-window[data-variant="retool-artboard-frame"] { --_radius: var(--ds-radius-xs); --_pad: var(--ds-space-6); }
.ds-product-window[data-variant="retool-artboard-frame"]::before {
  content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: radial-gradient(circle, var(--ds-texture-color) 1px, transparent 1.2px) 0 0 / 12px 12px, var(--ds-ground-2);
}
.ds-product-window[data-variant="retool-artboard-frame"] .ds-product-window__frame { background: var(--ds-surface-2); border-color: var(--ds-border); overflow: visible; }
.ds-product-window[data-variant="retool-artboard-frame"] .ds-product-window__body { padding: var(--ds-space-5); background: var(--ds-surface-2); gap: var(--ds-space-4); }
.ds-product-window[data-variant="retool-artboard-frame"] .ds-product-window__pane { border: var(--ds-border-width) solid var(--ds-rule); border-radius: var(--ds-radius-sm); }
.ds-product-window__zoom {
  position: absolute;
  inset-block-end: calc(-1 * var(--ds-control-h-sm) / 2);
  inset-inline-start: var(--ds-space-4);
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-3);
  min-height: var(--ds-control-h-sm);
  padding-inline: var(--ds-space-3);
  border-radius: var(--ds-radius-sm);
  background: var(--ds-surface-raised);
  box-shadow: var(--ds-shadow-float);            /* a floating tool cluster — the one shadowed layer */
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-xs);
  color: var(--ds-ink-2);
  z-index: 2;
}
.ds-product-window__zoom button { border: 0; background: transparent; padding: 0; color: inherit; font: inherit; cursor: pointer; }
/* plane-peeking-characters-hero-frame (S2) [screenshot-2026-09-17-125644] — coloured ground, window offset and
   bleeding off the end, a __band slot whose art overlaps the top edge by 5 px. The characters are illustration-slot's. */
.ds-product-window[data-variant="plane-peeking-characters-hero-frame"] { --_radius: var(--ds-radius-xl); --_pad: var(--ds-space-10) 0 0 var(--ds-space-10); overflow: hidden; }
.ds-product-window[data-variant="plane-peeking-characters-hero-frame"]::before { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; background: var(--ds-data-7); }
.ds-product-window[data-variant="plane-peeking-characters-hero-frame"] .ds-product-window__stage { overflow: hidden; }
.ds-product-window[data-variant="plane-peeking-characters-hero-frame"] .ds-product-window__frame { width: calc(100% + var(--ds-space-10)); border-end-end-radius: 0; border-end-start-radius: 0; border-block-end: 0; }
.ds-product-window__band {
  position: relative;
  display: flex;
  justify-content: space-around;
  align-items: flex-end;
  margin-block-end: -5px;                          /* the peek: art overlaps the frame's top edge */
  z-index: 1;
  min-width: 0;
  pointer-events: none;
}
.ds-product-window__band > * { flex: 0 1 auto; min-width: 0; }
/* ---------------------------------------------------------------------------
   BREAKPOINTS — the peek shortens on phones; the zoom pill hides
   ------------------------------------------------------------------------- */
@media (max-width: 767px) {
  .ds-product-window { --_peek: clamp(200px, 60vw, 320px); }
  .ds-product-window__zoom { display: none; }
  .ds-product-window[data-variant="plane-peeking-characters-hero-frame"] { --_pad: var(--ds-space-6) 0 0 var(--ds-space-4); }
}
/* components/segmented-control/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); }
/* components/social-proof-line/social-proof-line.css */
/* ============================================================================
   social-proof-line — Social proof                                (taxonomy §J · common · S0)
   Root: .ds-social-proof-line (<p>) — a muted sentence in which ONLY the figure + its noun are at full strength;
         the cheapest proof there is (L-PROOF-02). Sits 20 px under a CTA pair (hero, cta-block), in a nav utility
         cluster, or as the proof row of a card.
   Parts: __figure (mono tabular figure + noun, ink, medium) · __sep (decorative middot, faint) ·
          __stars (five ★ in the rating hue; aria-label carries the score) · __brand (the muted subject of a two-tone
          claim) · __icon (16 px glyph before a count — github star) · __rule (a vertical hairline between two receipts) ·
          composed .ds-text-link for receipts ("G2 ›", "Take product tour ›") · composed .ds-avatar-stack for "joined by"
   Axes:  data-on-media   over an image: text --ds-ink-on-overlay (light in both modes), figure at full white
          data-size="sm|md"  12 / 14 (md for the card proof row)
   Variants: jstov (unmarked root — Vercel's grammar, Synara's placement; the figure is MONO tabular; never five
          unlabelled stars) · synara-number-in-sentence · vercel-two-tone-claim · sequence-stars-plus-receipt-link ·
          synara-github-star-count-in-nav · origin-testimonial-band-in-promo (stars + one-line quote + first name)
   States: aria-busy (the figure is a skeleton block; the sentence stays) · data-state="empty" = do not render —
          there is no honest empty proof line.
   Private knobs: --_gap --_ink --_figure-ink --_star
   ========================================================================== */
.ds-social-proof-line svg[fill="none"] { fill: none; stroke: currentColor; }
.ds-social-proof-line {
  --_gap:        var(--ds-space-2);
  --_ink:        var(--ds-ink-muted);
  --_figure-ink: var(--ds-ink);
  --_star:       var(--ds-data-6);               /* the rating hue — one hue for stars everywhere            */
  display: block;                                /* a sentence: inline flow, so word spaces stay word spaces  */
  margin: 0;
  min-width: 0;
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-body);
  color: var(--_ink);
  text-decoration: none;
  text-wrap: pretty;
}
/* a ROW of receipts / an avatar stack + sentence: flex with a gap (the sequence proof row, "joined by") */
.ds-social-proof-line[data-layout="row"] { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--_gap); }
.ds-social-proof-line[data-size="md"] { font-size: var(--ds-text-md); }
.ds-social-proof-line[data-on-media] { --_ink: color-mix(in srgb, var(--ds-ink-on-overlay) 72%, transparent); --_figure-ink: var(--ds-ink-on-overlay); }
.ds-social-proof-line__figure { color: var(--_figure-ink); font-family: var(--ds-font-mono); font-weight: var(--ds-weight-medium); font-variant-numeric: tabular-nums; letter-spacing: 0; }
.ds-social-proof-line__sep    { color: var(--ds-ink-faint); margin-inline: var(--ds-space-1); }   /* decorative only */
.ds-social-proof-line__brand  { color: var(--ds-ink-muted); }
.ds-social-proof-line__stars  { display: inline-block; color: var(--_star); letter-spacing: .06em; font-size: .92em; white-space: nowrap; }
.ds-social-proof-line__icon   { display: inline-block; inline-size: var(--ds-icon-size); block-size: var(--ds-icon-size); vertical-align: -.2em; margin-inline-end: var(--ds-space-1); }
.ds-social-proof-line__icon svg { inline-size: 100%; block-size: 100%; stroke-width: var(--ds-icon-stroke); stroke-linecap: round; stroke-linejoin: round; }
.ds-social-proof-line__rule   { display: inline-block; inline-size: var(--ds-border-width); block-size: 1.1em; vertical-align: -.2em; margin-inline: var(--ds-space-1); background: var(--ds-rule-strong); }
.ds-social-proof-line[data-layout="row"] .ds-social-proof-line__rule { margin-inline: 0; }
.ds-social-proof-line__quote  { color: var(--ds-ink); }
.ds-social-proof-line__cite   { font-style: normal; }
.ds-social-proof-line > .ds-avatar-stack { flex: none; }
/* =========================================================================
   VARIANTS
   ========================================================================= */
/* synara: "Already downloaded by 17,027 people" — sans figure + noun at 500, sentence at 60 % over the image */
.ds-social-proof-line[data-variant="synara-number-in-sentence"] .ds-social-proof-line__figure { font-family: var(--ds-font-sans); }
/* vercel: "[Brand] powers [number] [thing] on [Host]." — the sentence in ink-2, the BRAND muted so the metric is the subject */
.ds-social-proof-line[data-variant="vercel-two-tone-claim"] { --_ink: var(--ds-ink-2); font-size: var(--ds-text-md); }
.ds-social-proof-line[data-variant="vercel-two-tone-claim"] .ds-social-proof-line__figure { font-family: var(--ds-font-sans); font-weight: var(--ds-weight-medium); }
/* sequence: [G2 ›] [★★★★★] | [Take product tour ›] — receipts in the link hue, stars amber, a 1 px pipe between;
   their stars carry no figure (weakness kept as the variant; the house adds "4.8 · 212 reviews") */
.ds-social-proof-line[data-variant="sequence-stars-plus-receipt-link"] { --_gap: var(--ds-space-3); display: flex; flex-wrap: wrap; align-items: center; gap: var(--ds-space-1) var(--_gap); font-size: var(--ds-text-sm); }
.ds-social-proof-line[data-variant="sequence-stars-plus-receipt-link"] .ds-social-proof-line__rule { margin-inline: 0; }
.ds-social-proof-line[data-variant="sequence-stars-plus-receipt-link"] .ds-text-link { color: var(--ds-ink-link); }
/* synara nav: GitHub glyph + "1.8K" in the utility cluster — a count as live proof, no sentence */
.ds-social-proof-line[data-variant="synara-github-star-count-in-nav"] { --_ink: var(--ds-ink-2); --_figure-ink: var(--ds-ink-2); display: inline-flex; align-items: center; gap: var(--ds-space-1); font-size: var(--ds-text-md); }
.ds-social-proof-line[data-variant="synara-github-star-count-in-nav"] .ds-social-proof-line__figure { font-weight: var(--ds-weight-medium); }
/* origin: five stars over a first-person one-line quote and a first name + initial — the proof line of the promo band */
.ds-social-proof-line[data-variant="origin-testimonial-band-in-promo"] { display: flex; flex-direction: column; align-items: flex-start; gap: var(--ds-space-1-5); font-size: var(--ds-text-md); --_ink: currentColor; }
.ds-social-proof-line[data-variant="origin-testimonial-band-in-promo"] .ds-social-proof-line__stars { font-size: var(--ds-text-lg); letter-spacing: .08em; }
.ds-social-proof-line[data-variant="origin-testimonial-band-in-promo"] .ds-social-proof-line__quote { color: inherit; max-width: 44ch; }   /* text ink follows the band's hue */
.ds-social-proof-line[data-variant="origin-testimonial-band-in-promo"] .ds-social-proof-line__cite { font-size: var(--ds-text-sm); }
/* =========================================================================
   STATES (last)
   ========================================================================= */
.ds-social-proof-line[aria-busy="true"] .ds-social-proof-line__figure { color: transparent; background: var(--ds-skeleton); border-radius: var(--ds-radius-xs); min-inline-size: 6ch; }
.ds-social-proof-line[aria-busy="true"] .ds-social-proof-line__stars { color: var(--ds-skeleton); }
.ds-social-proof-line[data-state="empty"] { display: none; }               /* no figure = no line; never "trusted by many" */
/* components/split-button/split-button.css */
/* ============================================================================
   components/split-button/split-button.css — Split button (common · S0)
   Root `.ds-split-button` is a <div role="group"> holding two <button>s that
   share ONE border and ONE radius: `__main` (the action) and `__aux` (the
   chevron that opens a menu — or heron's → arrow). Fill by data-fill=
   "primary|outline|tint"; primary counts as the view's one filled control
   (button-hierarchy-rule). Tokens only. Private knobs: --_h --_pad-x --_radius
   --_w --_divider --_aux-w.
   ========================================================================== */
.ds-split-button {
  --_h:       var(--ds-size-h);
  --_pad-x:   calc(var(--ds-size-pad-x) + var(--ds-space-1));   /* 16 — matches button-primary */
  --_radius:  var(--ds-radius-button);
  --_w:       auto;
  --_aux-w:   var(--_h);                                         /* the chevron cell is square   */
  --_divider: var(--ds-border);
  display: inline-flex;
  align-items: stretch;
  width: var(--_w);
  max-width: 100%;
  min-width: 0;
  min-height: var(--_h);
  font-size: var(--ds-size-text);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-list);
  text-transform: var(--ds-control-case);
  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);
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard),
              border-color var(--ds-dur-fast) var(--ds-ease-standard);
}
/* ---- segments ---------------------------------------------------------------- */
.ds-split-button__main,
.ds-split-button__aux {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  min-width: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  background: transparent;
  border: 0;
  cursor: pointer;
  white-space: nowrap;
  text-decoration: none;                            /* segments may be <a> (heron) */
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--ds-dur-fast) var(--ds-ease-standard);
}
.ds-split-button__main {
  flex: 1 1 auto;
  padding-inline: var(--_pad-x);
  border-start-start-radius: calc(var(--_radius) - var(--ds-border-width));
  border-end-start-radius:   calc(var(--_radius) - var(--ds-border-width));
}
.ds-split-button__aux {
  flex: none;
  width: var(--_aux-w);
  border-inline-start: var(--ds-border-width) solid var(--_divider);
  border-start-end-radius: calc(var(--_radius) - var(--ds-border-width));
  border-end-end-radius:   calc(var(--_radius) - var(--ds-border-width));
}
.ds-split-button__label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ds-split-button__icon {
  flex: none;
  display: inline-flex;
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
}
.ds-split-button__icon svg,
.ds-split-button__aux > 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-split-button__icon svg { width: 100%; height: 100%; }
.ds-split-button__icon svg[data-fill], .ds-split-button__aux > svg[data-fill] { fill: currentColor; stroke: none; }
/* the chevron rotates when the menu is open */
.ds-split-button__aux > svg { transition: transform var(--ds-dur-fast) var(--ds-ease-standard); }
.ds-split-button__aux[aria-expanded="true"] > svg[data-chevron] { transform: rotate(180deg); }
/* ---- states (outline default) ---------------------------------------------- */
.ds-split-button:hover { border-color: var(--ds-border-strong); }
.ds-split-button__main:hover, .ds-split-button__aux:hover,
.ds-split-button__main[data-state="hover"], .ds-split-button__aux[data-state="hover"] { background: var(--ds-hover-bg); }
.ds-split-button__main:active, .ds-split-button__aux:active { background: var(--ds-surface-pressed, var(--ds-surface-3)); }   /* pressed = --ds-surface-pressed (§13.4) */
.ds-split-button__aux[aria-expanded="true"] { background: var(--ds-selected-bg); color: var(--ds-selected-ink); }
/* focus: the ring is drawn on the SEGMENT, outside the shared border, and rendered above
   its sibling; the segment's own radius keeps the ring's corners honest */
.ds-split-button__main:focus-visible, .ds-split-button__aux:focus-visible,
.ds-split-button__main[data-state="focus"], .ds-split-button__aux[data-state="focus"] {
  outline: var(--ds-ring-width) solid var(--ds-ring);
  outline-offset: calc(var(--ds-ring-offset) + var(--ds-border-width));
  z-index: 1;
}
/* disabled: whole control faint when the action is; the aux alone may be disabled (no menu) */
.ds-split-button__main:disabled, .ds-split-button__aux:disabled { color: var(--ds-ink-faint); cursor: not-allowed; background: transparent; }
.ds-split-button:has(> .ds-split-button__main:disabled),
.ds-split-button[data-state="disabled"] {
  color: var(--ds-ink-faint);
  background: var(--ds-surface-3);
  border-color: var(--ds-rule);
  box-shadow: none;
  --_divider: var(--ds-rule);
}
/* loading: the main segment keeps its width, content hidden, spinner in currentColor */
.ds-split-button__main[aria-busy="true"] { pointer-events: none; }
.ds-split-button__main[aria-busy="true"] > * { visibility: hidden; }
.ds-split-button__main[aria-busy="true"]::after {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  width: var(--ds-icon-size);
  height: var(--ds-icon-size);
  border: 2px solid transparent;
  border-block-start-color: currentColor;
  border-inline-end-color: currentColor;
  border-radius: var(--ds-radius-pill);
  animation: ds-split-button-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-split-button-spin { to { transform: rotate(360deg); } }
/* ---- fills --------------------------------------------------------------------- */
/* primary: the view's one filled control — --ds-primary-fill, divider = ink-on-primary at 25 % */
.ds-split-button[data-fill="primary"] {
  --_divider: color-mix(in srgb, var(--ds-ink-on-primary) 25%, transparent);
  color: var(--ds-ink-on-primary);
  background: var(--ds-primary-fill);
  border-color: var(--ds-primary-border);
  box-shadow: inset 0 var(--ds-border-width) 0 0 var(--ds-primary-highlight), var(--ds-shadow-lip);
}
.ds-split-button[data-fill="primary"]:hover { border-color: var(--ds-primary-border); }
.ds-split-button[data-fill="primary"] .ds-split-button__main:hover,
.ds-split-button[data-fill="primary"] .ds-split-button__aux:hover,
.ds-split-button[data-fill="primary"] .ds-split-button__main[data-state="hover"],
.ds-split-button[data-fill="primary"] .ds-split-button__main:active,
.ds-split-button[data-fill="primary"] .ds-split-button__aux:active,
.ds-split-button[data-fill="primary"] .ds-split-button__aux[aria-expanded="true"] { background: var(--ds-primary-fill-hover); color: inherit; }
.ds-split-button[data-fill="primary"]:has(> .ds-split-button__main:disabled),
.ds-split-button[data-fill="primary"][data-state="disabled"] { color: var(--ds-ink-faint); background: var(--ds-surface-3); border-color: var(--ds-rule); box-shadow: none; --_divider: var(--ds-rule); }
/* tint: one tint step, no border */
.ds-split-button[data-fill="tint"] {
  background: var(--ds-surface-2);
  border-color: transparent;
  box-shadow: none;
}
.ds-split-button[data-fill="tint"]:hover { border-color: transparent; }
.ds-split-button[data-fill="tint"] .ds-split-button__main:hover,
.ds-split-button[data-fill="tint"] .ds-split-button__aux:hover { background: var(--ds-surface-3); }
/* ---- sizes ------------------------------------------------------------------- */
.ds-split-button[data-size] { --_h: var(--ds-size-h); --_pad-x: calc(var(--ds-size-pad-x) + var(--ds-space-1)); }
/* ============================================================================
   VARIANTS. Unmarked root = jstov (house): 36 / radius-button, solid 1px
   divider, square chevron cell, data-fill decides primary vs outline.
   ========================================================================== */
/* v0-outline-split — 258×34 white, 1px border, r6, centred label, ~36px chevron cell;
   the product's primary action styled quiet because the composer is the real primary [v0-web-8] */
.ds-split-button[data-variant="v0-outline-split"] {
  --_h: calc(var(--ds-control-h-sm) + var(--ds-space-0-5));   /* 34 */
  --_w: min(258px, 100%);
  --_radius: var(--ds-radius-sm);
  --_aux-w: var(--ds-control-h);                              /* 36 */
}
/* synara-run-split — ▶ solid glyph | ⌄ : 32px, r8, one border; main is icon-only [hsvu79cweaarswf] */
.ds-split-button[data-variant="synara-run-split"] {
  --_h: var(--ds-control-h-sm);
  --_radius: var(--ds-radius-md);
  --_aux-w: calc(var(--ds-control-h-sm) - var(--ds-space-2));  /* 24: a narrow chevron cell */
}
.ds-split-button[data-variant="synara-run-split"] .ds-split-button__main { --_pad-x: var(--ds-space-2); padding-inline: var(--ds-space-2); }
/* clickup-add-task-split — dark 24px, r4, 12px label: chrome-tier primary [clickup-web-147] */
.ds-split-button[data-variant="clickup-add-task-split"] {
  --_h: calc(var(--ds-control-h-sm) - var(--ds-space-2));      /* 24 */
  --_pad-x: var(--ds-space-2);
  --_radius: var(--ds-radius-xs);
  --_aux-w: calc(var(--ds-control-h-sm) - var(--ds-space-2));
  font-size: var(--ds-text-sm);
}
/* navattic-88-save-split — primary "Save ▾", 32px, navy fill with the tactile highlight;
   the chevron implies save-as / publish variants [navattic-web-88] */
.ds-split-button[data-variant="navattic-88-save-split"] {
  --_h: var(--ds-control-h-sm);
  --_pad-x: var(--ds-space-3);
  --_radius: var(--ds-radius-md);
  --_aux-w: calc(var(--ds-control-h-sm) - var(--ds-space-1));
  box-shadow: inset 0 var(--ds-border-width) 0 0 color-mix(in srgb, var(--ds-ink-on-primary) 18%, transparent), var(--ds-shadow-lift);
}
/* heron-label-divider-arrow — label cell | DASHED divider | arrow cell, 40px, radius 0, mono
   caps; outline / filled / submit / nav by fill alone [heron-ai-830x5619] */
.ds-split-button[data-variant="heron-label-divider-arrow"] {
  --_h: calc(var(--ds-control-h) + var(--ds-space-1));         /* 40 */
  --_pad-x: var(--ds-space-4);
  --_radius: 0;
  --_aux-w: var(--_h);
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  letter-spacing: .12em;
  text-transform: uppercase;
  box-shadow: none;
}
.ds-split-button[data-variant="heron-label-divider-arrow"] .ds-split-button__aux { border-inline-start-style: dashed; }
.ds-split-button[data-variant="heron-label-divider-arrow"][data-fill="primary"] {
  --_divider: color-mix(in srgb, var(--ds-ink-on-accent) 60%, transparent);
  color: var(--ds-ink-on-accent);
  background: var(--ds-accent);
  border-color: var(--ds-accent);
  box-shadow: none;
}
.ds-split-button[data-variant="heron-label-divider-arrow"][data-fill="primary"] .ds-split-button__main:hover,
.ds-split-button[data-variant="heron-label-divider-arrow"][data-fill="primary"] .ds-split-button__aux:hover { background: var(--ds-accent-hover); }
/* components/stat/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); }
/* components/status-badge/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; }
/* components/terminal-view/terminal-view.css */
/* ============================================================================
   components/terminal-view/terminal-view.css — Light terminal (niche · S1)
   Root `.ds-terminal-view` is a mono-lane pane: a LIGHT ground (ink on
   --ds-surface-2 — a well; synara paints --ds-surface), a mono header block
   (mascot slot · name/version · model · path), full-width INVERTED prompt bars
   for the user's turns, output in ink, tool traces + durations in muted, and a
   live input line at the bottom. Colour is reserved for semantics (error /
   success / diff) and provider identity (the mascot slot keeps its own hue).
   data-tone="inverse" is the classic dark terminal in ANY mode; data-mode=
   "dark" is the token remap. Tokens only (tools/lint-tokens.mjs).
   Private knobs: --_fill --_ink --_muted --_prompt-fill --_prompt-ink --_pad
   --_radius --_size --_lh --_min-h --_border --_mascot.
   ========================================================================== */
.ds-terminal-view {
  --_fill:        var(--ds-surface-2);                  /* a mono well on the page             */
  --_ink:         var(--ds-ink);
  --_muted:       var(--ds-ink-muted);                  /* readable: traces are content        */
  --_prompt-fill: var(--ds-surface-inverse);
  --_prompt-ink:  var(--ds-ink-inverse);
  --_pad:         var(--ds-space-4);
  --_radius:      var(--ds-radius-md);
  --_size:        var(--ds-text-sm);                    /* 12 @14 — the mono lane              */
  --_lh:          var(--ds-lh-body);
  --_min-h:       240px;
  --_border:      var(--ds-rule);
  --_mascot:      var(--ds-accent-2);                   /* the AI hue; a provider mark keeps its own */
  position: relative;                                   /* .ds-sr-only inside an overflow box   */
  display: flex;
  flex-direction: column;
  width: 100%;
  min-width: 0;
  min-height: var(--_min-h);
  background: var(--_fill);
  border: var(--ds-border-width) solid var(--_border);
  border-radius: var(--_radius);
  overflow: hidden;
  font-family: var(--ds-font-mono);
  font-size: var(--_size);
  line-height: var(--_lh);
  color: var(--_ink);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
}
/* ---- pane strip (composed tabs live here; the strip is the UI lane, not mono) ------- */
.ds-terminal-view__strip {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-1);
  padding: var(--ds-space-1) var(--ds-space-2);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  background: var(--ds-surface);
  font-family: var(--ds-font-sans);
  font-size: var(--ds-text-sm);
  line-height: var(--ds-lh-list);
  color: var(--ds-ink);
}
/* ---- the log ------------------------------------------------------------------ */
.ds-terminal-view__log {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  padding: var(--_pad);
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-3);
  scrollbar-width: thin;
  overscroll-behavior: contain;
}
.ds-terminal-view__log > * { min-width: 0; max-width: 100%; }
/* mono header: mascot · name + version · model · path */
.ds-terminal-view__header { display: flex; align-items: flex-start; gap: var(--ds-space-3); min-width: 0; }
.ds-terminal-view__mascot { flex: none; width: calc(var(--ds-icon-size-rail) + var(--ds-space-2)); height: calc(var(--ds-icon-size-rail) + var(--ds-space-2)); color: var(--_mascot); }
.ds-terminal-view__mascot svg { width: 100%; height: 100%; fill: currentColor; shape-rendering: crispEdges; }
.ds-terminal-view__mascot svg [data-eye] { fill: var(--_fill); }             /* the eyes punch through to the ground */
.ds-terminal-view__meta { display: flex; flex-direction: column; min-width: 0; }
.ds-terminal-view__meta > * { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-terminal-view__name { color: var(--_ink); font-weight: var(--ds-weight-medium); }
.ds-terminal-view__version, .ds-terminal-view__model, .ds-terminal-view__path { color: var(--_muted); }
.ds-terminal-view__version { font-weight: var(--ds-weight-regular); margin-inline-start: var(--ds-space-1); }
/* the inverted prompt bar: full width of the pane (bleeds through the padding) */
.ds-terminal-view__prompt {
  max-width: none;                                        /* bleeds past the log's padding */
  margin-inline: calc(-1 * var(--_pad));
  padding: var(--ds-space-0-5) var(--_pad);
  background: var(--_prompt-fill);
  color: var(--_prompt-ink);
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.ds-terminal-view__prompt-prefix { opacity: .6; margin-inline-end: var(--ds-space-1); }   /* a dim › before the user's words */
.ds-terminal-view__prompt::selection, .ds-terminal-view__prompt *::selection { background: var(--_prompt-ink); color: var(--_prompt-fill); }
/* output lines */
.ds-terminal-view__line {
  margin: 0;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  color: var(--_ink);
}
.ds-terminal-view__line[data-kind="trace"]   { color: var(--_muted); }         /* "Searched for 1 pattern" */
.ds-terminal-view__line[data-kind="status"]  { color: var(--_muted); }         /* "Crunched for 8s · done 12:24 PM" */
.ds-terminal-view__line[data-kind="command"] { color: var(--_ink); font-weight: var(--ds-weight-medium); }
.ds-terminal-view__line[data-kind="command"]::before { content: "$ "; color: var(--_muted); font-weight: var(--ds-weight-regular); }
.ds-terminal-view__line[data-kind="error"]   { color: var(--ds-danger-ink); }
.ds-terminal-view__line[data-kind="warning"] { color: var(--ds-warning-ink); }
.ds-terminal-view__line[data-kind="success"] { color: var(--ds-success-ink); }
/* a provider / AI glyph that leads a status line ("✻") */
.ds-terminal-view__glyph { color: var(--_mascot); margin-inline-end: var(--ds-space-1); }
/* durations are copy: tabular, same lane as their line */
.ds-terminal-view__duration { font-variant-numeric: tabular-nums; }
/* diff stat: coloured text only, no background */
.ds-terminal-view__diff-add { color: var(--ds-success-ink); }
.ds-terminal-view__diff-del { color: var(--ds-danger-ink); }
/* a bold lead-in inside prose ("Note:") stays in ink */
.ds-terminal-view__line strong { font-weight: var(--ds-weight-semibold); color: var(--_ink); }
/* a wide block (a table, a long path) scrolls inside its own box — the pane never overflows */
.ds-terminal-view__block { overflow-x: auto; white-space: pre; margin: 0; min-width: 0; max-width: 100%; scrollbar-width: thin; }
/* live input line: prefix + a bare mono input; the ring is drawn on the ROW */
.ds-terminal-view__input {
  display: flex;
  align-items: baseline;
  gap: var(--ds-space-2);
  margin-block-start: auto;                               /* sits at the bottom of a short log */
  border-radius: var(--ds-radius-xs);
}
.ds-terminal-view__input-prefix { flex: none; color: var(--_muted); }
.ds-terminal-view__input-field {
  flex: 1 1 auto;
  min-width: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--_ink);
  font: inherit;
  line-height: inherit;
  caret-color: var(--_ink);
}
.ds-terminal-view__input-field::placeholder { color: var(--_muted); }
.ds-terminal-view__input-field:focus-visible { outline: none; }               /* redrawn on the row below (R9) */
.ds-terminal-view__input:focus-within { outline: var(--ds-ring-width) solid var(--ds-ring); outline-offset: var(--ds-ring-offset); }
.ds-terminal-view__input-field:disabled { color: var(--ds-ink-faint); cursor: not-allowed; }
/* working line: ring spinner + words, muted (durations as copy) */
.ds-terminal-view__working { display: inline; color: var(--_muted); }
.ds-terminal-view__working::before {
  content: "";
  display: inline-block;
  vertical-align: -1px;
  margin-inline-end: var(--ds-space-2);
  width: var(--ds-space-3);
  height: var(--ds-space-3);
  border: 2px solid var(--ds-rule-strong);
  border-block-start-color: var(--_muted);
  border-radius: var(--ds-radius-pill);
  animation: ds-terminal-view-spin calc(var(--ds-dur-slow) * 3) linear infinite;
}
@keyframes ds-terminal-view-spin { to { transform: rotate(360deg); } }
/* empty pane: nothing has run */
.ds-terminal-view__empty { margin: auto; text-align: center; color: var(--_muted); max-width: 36ch; }
/* loading (attaching): skeleton lines */
.ds-terminal-view__skeleton-bar { height: .8em; border-radius: var(--ds-radius-xs); background: var(--ds-skeleton); width: var(--_w, 60%); }
/* ---- states on the root ---------------------------------------------------------- */
.ds-terminal-view[aria-busy="true"] .ds-terminal-view__input-field { cursor: progress; }
/* the session ended with an error: danger hairline, input off */
.ds-terminal-view[data-state="error"] { --_border: var(--ds-danger-line); }
/* disconnected: dashed edge, input off, a reconnect line in the log */
.ds-terminal-view[data-state="disconnected"] { border-style: dashed; --_border: var(--ds-border-strong); }
.ds-terminal-view[data-state="disconnected"] .ds-terminal-view__log { opacity: .7; }
/* selected pane (in a split): 2px selection ring — never a shadow */
.ds-terminal-view[aria-selected="true"] { outline: 2px solid var(--ds-border-selected); outline-offset: 0; }
/* disabled / read-only transcript */
.ds-terminal-view[aria-disabled="true"] { --_ink: var(--ds-ink-2); }
.ds-terminal-view[aria-disabled="true"] .ds-terminal-view__input { display: none; }
/* ---- tone: the classic dark terminal in any mode -------------------------------------- */
.ds-terminal-view[data-tone="inverse"] {
  --_fill: var(--ds-surface-inverse);
  --_ink: var(--ds-ink-inverse);
  --_muted: color-mix(in srgb, var(--ds-ink-inverse) 62%, transparent);
  --_prompt-fill: var(--ds-surface-inverse-hover);
  --_prompt-ink: var(--ds-ink-inverse);
  --_border: var(--ds-surface-inverse-hover);
}
.ds-terminal-view[data-tone="inverse"] .ds-terminal-view__working::before { border-color: color-mix(in srgb, var(--ds-ink-inverse) 25%, transparent); border-block-start-color: var(--_muted); }
.ds-terminal-view[data-tone="inverse"] .ds-terminal-view__line[data-kind="error"]   { color: var(--ds-danger); }
.ds-terminal-view[data-tone="inverse"] .ds-terminal-view__line[data-kind="success"] { color: var(--ds-success); }
.ds-terminal-view[data-tone="inverse"] .ds-terminal-view__diff-add { color: var(--ds-success); }
.ds-terminal-view[data-tone="inverse"] .ds-terminal-view__diff-del { color: var(--ds-danger); }
/* ============================================================================
   VARIANTS. Unmarked root = jstov (house): synara's light terminal as a well
   (--ds-surface-2 + rule + radius-md) so it can sit in a card or a page, the
   mascot slot in the AI hue, prompt bars in --ds-surface-inverse, a live input
   line, and error / disconnected / empty / loading states.
   ========================================================================== */
/* synara-light-terminal — the tool PANE: white ground (surface), no border, no radius, 11–12px
   mono at 1.5; pixel mascot in the provider's own orange; #343434 prompt row (inverse mixed
   toward its ink); traces muted; "Crunched for 8s · done 12:24 PM" footer [hsvu79cweaarswf] */
.ds-terminal-view[data-variant="synara-light-terminal"] {
  --_fill: var(--ds-surface);
  --_border: transparent;
  --_radius: 0px;
  --_prompt-fill: color-mix(in srgb, var(--ds-surface-inverse) 86%, var(--ds-ink-inverse));
  --_mascot: var(--ds-data-4);                                       /* provider identity passes through */
  --_lh: var(--ds-lh-prose);
}
.ds-terminal-view[data-variant="synara-light-terminal"] .ds-terminal-view__strip { padding: 0 var(--ds-space-2); border-block-end-color: var(--ds-rule); }
/* components/text-link/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; }
/* patterns/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);
}
/* patterns/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%; }
/* patterns/sections/l-hero-01-split-editorial.css */
/* ============================================================================
   patterns/sections/l-hero-01-split-editorial.css
   L-HERO-01 · Split editorial hero (headline left, support + CTA right) · core
   Root <section class="ds-sec-l-hero-01-split-editorial" data-variant="jstov | intercom-8-4-serif-support |
        vercel-annotated | heron-split-headline-band | cloudflare-dark-command">
   Everything visible is components/hero composed by its ROOT class (band / strip / copy / support / lane /
   marks / backdrop). The section is a page-rhythm wrapper; it never restyles a hero part.
   Variant map: jstov → hero unmarked (band + spec strip) · intercom-8-4-serif-support → intercom-split-editorial-8-4 ·
   vercel-annotated → vercel-annotated-split · heron-split-headline-band → heron-hero-visual-sheet-plus-split-headline-band
   (sans sheet) · cloudflare-dark-command → synara-painted-copy-safe-zone inside a data-mode="dark" island.
   Section-local parts (cloudflare only): __rings (the ornament SVG inside hero's documented __backdrop slot) ·
   __rings-art (the group hidden under 900 px) · __live-dot (the pill's live dot) · .ds-accent-word (the H1's last word).
   Tokens only. Private knobs: --_min-h (island height) · --_dot (live-dot size).
   Knobs it SETS on the hero root (hero's public API, not its parts): --_title-size · --_title-max · --_lede-max ·
   --_stack · --_inset.
   ========================================================================== */
.ds-sec-l-hero-01-split-editorial {
  position: relative;
  min-width: 0;
}
/* The accent word: the display's LAST word in the accent hue — the recipe's rule, not the component's
   (C-06: the one saturated element in the hero besides the live dot; the hero paints no primary). */
/* ---------------------------------------------------------------------------
   cloudflare-dark-command — a committed-dark island [try-cloudflare]
   The wrapper paints the ground and sizes the hero root to the fold; the copy-safe zone (58 %), the
   backdrop plate and the copy stack are the synara variant's own structure.
   ------------------------------------------------------------------------- */
.ds-sec-l-hero-01-split-editorial[data-variant="cloudflare-dark-command"] {
  --_copy-max: 68%;                              /* command bar (540) + gap + ghost (162) = 714 must fit on one line at 1440 */
  --_min-h: clamp(560px, calc(100vh - var(--ds-topbar-h)), 960px);
  --_dot: var(--ds-space-2);
  background: var(--ds-ground);
  color: var(--ds-ink);
  overflow: hidden;
}
/* size + centre the composed hero ROOT (placement only): the reference is a 100vh band with the copy on its
   vertical centre; 64 px of breathing room below the strip. */
.ds-sec-l-hero-01-split-editorial[data-variant="cloudflare-dark-command"] > .ds-hero {
  --_title-size: clamp(calc(var(--ds-text-display) * .72), calc(var(--ds-text-xl) + 6.4vw), calc(var(--ds-text-display) * 1.56));   /* 52 → 112 (8vw): the reference's clamp(52px, 8vw, 112px) at display 72; was ×1.1 = 79 min, which clipped “Localhost,” at 390 */
  --_title-max: 12ch;                       /* three explicit lines; the widest is "Localhost," */
  --_lede-max: 48ch;                        /* 520 px @ 19 px */
  --_stack: var(--ds-space-7);              /* 28 between pill / h1 / lede / actions / strip */
  --_inset: 0px;                            /* the spec strip sits flush with the copy, not inset like a band row */
  display: grid;
  align-content: center;
  min-block-size: var(--_min-h);
  padding-block-end: var(--ds-space-16);
}
/* the ornament: one SVG in hero's __backdrop slot (the slot sizes + positions it; the rect inside paints
   --ds-ground so the plate never shows the illustration ground). The art group hides under 900 px. */
.ds-sec-l-hero-01-split-editorial__rings { pointer-events: none; }
.ds-sec-l-hero-01-split-editorial__rings-art { display: none; }
@media (min-width: 900px) {
  .ds-sec-l-hero-01-split-editorial__rings-art { display: block; }
}
/* the pill's live dot: an 8 px accent disc (live state — the accent's job) with a slow pulse; still under reduced motion */
.ds-sec-l-hero-01-split-editorial__live-dot {
  display: inline-block;
  inline-size: var(--_dot, var(--ds-space-2));
  block-size: var(--_dot, var(--ds-space-2));
  border-radius: var(--ds-radius-pill);
  background: var(--ds-accent);
  flex: none;
  animation: ds-sec-l-hero-01-pulse 2s var(--ds-ease-standard) infinite;   /* collapses under reduced motion (_base.css) */
}
@keyframes ds-sec-l-hero-01-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .3; } }
@media (prefers-reduced-motion: reduce) {
  .ds-sec-l-hero-01-split-editorial__live-dot { animation: none; }
}
/* patterns/sections/l-feat-09-indexed-row.css */
/* ============================================================================
   patterns/sections/l-feat-09-indexed-row.css
   L-FEAT-09 · Indexed product row · common
   Root <section class="ds-sec-l-feat-09-indexed-row"
                 data-variant="jstov | heron-indexed-product-row-3-5-4 | cloudflare-agent-band"
                 [data-band="accent"]>
   Head = components/chapter-header. Rows:
     jstov / heron  → components/feature-showcase inside .ds-feature-showcase-group[data-layout="list"]
                      (the 3/5/4 label | frame | description row, hairline between rows) — the section only
                      sets rhythm and places the head.
     cloudflare     → a full-bleed ACCENT band: data-band="accent" on the root is the THEME's remap (the
                      quicktunnels theme paints it; this file lays the band out and paints nothing — under
                      any other theme it degrades to the ground). Left: chapter-header + the section's own
                      compact indexed list (01 / 02 / 03 · title · body, hairlines between — the row form
                      with no illustration cell). Right: a dark window = data-mode="dark" island holding a
                      composed .ds-product-window[data-chrome="macos"] whose body holds a composed
                      .ds-terminal-view (knobs inline: flat fill, no edge, no radius).
   Section-local parts: __inner · __copy · __list · __row · __index · __row-text · __row-title · __row-body ·
     __window (the dark island wrapper) · __caret (the blinking block cursor inside the terminal's command line)
   Composes by ROOT class only: chapter-header · feature-showcase (+ -group) · text-link · key-value-facts
     (inside frame_html) · product-window · terminal-view. No component PART is restyled here.
   Tokens only. Private knobs: --_gap --_head-gap --_cols --_col-gap --_index-w --_row-pad --_term-h --_band-pad
   ========================================================================== */
.ds-sec-l-feat-09-indexed-row {
  --_gap:      var(--ds-section-gap);
  --_head-gap: var(--ds-space-10);                                  /* head → rows (C-01: 6–10 units) */
  --_cols:     minmax(0, 1fr) minmax(0, 1fr);                       /* cloudflare: copy | window */
  --_col-gap:  clamp(var(--ds-space-8), 5vw, var(--ds-space-16));   /* cloudflare 64 */
  --_index-w:  var(--ds-space-8);                                   /* cloudflare 32 px index column */
  --_row-pad:  var(--ds-space-4);                                   /* cloudflare 18 px row padding */
  --_term-h:   340px;                                               /* cloudflare: the terminal body height */
  --_band-pad: var(--_gap);                                         /* the band's block padding: the reference pads its orange band exactly as its light chapters (112 = 112); was --_gap × 1.5, which read the theme's 112 as ≈ 75 and made the band 168 + 168 (quick-tunnels close pass, 2026-09-20) */
  position: relative;
  padding-block: var(--_gap);
  padding-inline: var(--ds-gutter-page);                            /* the section owns its container */
  color: var(--ds-ink);
  min-width: 0;
}
.ds-sec-l-feat-09-indexed-row__inner {
  width: 100%;
  max-width: var(--ds-container-max);
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: var(--_head-gap);
  min-width: 0;
}
/* ---------------------------------------------------------------------------
   1. HOUSE / HERON — composed rows; the section only spaces them
   ------------------------------------------------------------------------- */
.ds-sec-l-feat-09-indexed-row__inner > .ds-feature-showcase-group { width: 100%; }
/* ---------------------------------------------------------------------------
   2. CLOUDFLARE — the accent band (laid out, never painted here) and its compact indexed list
   ------------------------------------------------------------------------- */
.ds-sec-l-feat-09-indexed-row[data-band] {
  padding-block: var(--_band-pad);                                  /* = --_gap (cloudflare 112); a theme or page that wants a band to breathe more sets the knob */
  background: var(--ds-ground);                                     /* the theme remaps --ds-ground inside data-band="accent" (quicktunnels: orange); elsewhere this IS the page ground */
  color: var(--ds-ink);
}
.ds-sec-l-feat-09-indexed-row__copy {
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-6);                                           /* cloudflare 24: eyebrow → h2 → lede → list all sit on one 24 px pitch (was 32) */
  min-width: 0;
}
/* the compact indexed row: index column | title + body; one hairline above the list, one under each row */
.ds-sec-l-feat-09-indexed-row__list {
  margin: 0;
  padding: 0;
  list-style: none;
  border-block-start: var(--ds-border-width) solid var(--ds-rule);
  min-width: 0;
}
.ds-sec-l-feat-09-indexed-row__row {
  display: grid;
  grid-template-columns: var(--_index-w) minmax(0, 1fr);
  column-gap: var(--ds-space-4);
  padding-block: var(--_row-pad);
  border-block-end: var(--ds-border-width) solid var(--ds-rule);
  min-width: 0;
}
.ds-sec-l-feat-09-indexed-row__index {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-medium);
  line-height: var(--ds-lh-heading);
  padding-block-start: .15em;                                       /* optical: the mono index sits on the title's cap line */
  color: var(--ds-ink);
  font-variant-numeric: tabular-nums;
}
.ds-sec-l-feat-09-indexed-row__row-text { display: flex; flex-direction: column; gap: var(--ds-space-1); min-width: 0; }
.ds-sec-l-feat-09-indexed-row__row-title {
  margin: 0;
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink);
}
.ds-sec-l-feat-09-indexed-row__row-body { margin: 0; font-size: var(--ds-text-md); line-height: var(--ds-lh-body); color: var(--ds-ink-2); max-width: 52ch; }
/* the window: a dark island around the composed product-window; a physical object on the band (--ds-shadow-object) */
.ds-sec-l-feat-09-indexed-row__window {
  min-width: 0;
  border-radius: var(--ds-media-radius);
  box-shadow: var(--ds-shadow-object);
}
.ds-sec-l-feat-09-indexed-row__window > .ds-product-window { margin: 0; }
/* the blinking block cursor after the typed command (a section glyph inside the terminal's log slot) */
.ds-sec-l-feat-09-indexed-row__caret {
  display: inline-block;
  inline-size: .55em;
  block-size: 1.05em;
  margin-inline-start: var(--ds-space-0-5);
  vertical-align: text-bottom;
  background: var(--ds-accent);
  animation: ds-sec-l-feat-09-caret calc(var(--ds-dur-slow) * 4) steps(1) infinite;   /* stops under reduced motion */
}
@keyframes ds-sec-l-feat-09-caret { 50% { opacity: 0; } }
/* ---------------------------------------------------------------------------
   3. BREAKPOINTS — 1024: copy | window
   ------------------------------------------------------------------------- */
@media (min-width: 1024px) {
  .ds-sec-l-feat-09-indexed-row[data-variant="cloudflare-agent-band"] .ds-sec-l-feat-09-indexed-row__inner {
    display: grid;
    grid-template-columns: var(--_cols);
    column-gap: var(--_col-gap);
    align-items: center;
  }
}
/* patterns/sections/l-feat-03-step-cards.css */
/* ============================================================================
   patterns/sections/l-feat-03-step-cards.css
   L-FEAT-03 · Feature pair / N-up cells with centre hairline · core
   Root <section class="ds-sec-l-feat-03-step-cards"
                 data-variant="jstov | attio-feature-pair | heron-numbered-tag-cards | cloudflare-install-run-share"
                 [data-os="macos | windows | linux"]>
   Head = components/chapter-header. Cells:
     jstov / attio / heron → components/feature-showcase inside .ds-feature-showcase-group[data-layout=
                             "strip" | "pair"] — equal cells split by the SHARED hairline (the rule IS the
                             gutter); the section only sets rhythm and places the head.
     cloudflare            → a header row (display h2 left | composed .ds-segmented-control right) over an
                             auto-fit grid of composed .ds-card[data-variant="hairline"] roots (radius-xl,
                             28 px padding — knobs inline) each holding the section's step parts (mono accent
                             index · title with an optional accent word · body with an optional link) and a
                             composed .ds-code-snippet[data-variant="cloudflare-card-code-box"] (its __copy
                             is a composed .ds-icon-button ghost glyph).
   OS switch (CSS only): every install command is in the markup, each wrapped in __cmd[data-os]; the root's
     data-os shows one and hides the rest. Without data-os the composed radio group drives it through
     :has(input[value]:checked) — no script. Cards whose command has no data-os always show.
   Section-local parts: __inner · __band · __grid · __step (class on the composed .ds-card root) · __step-inner (superseded by .ds-card__body 2026-09-20) ·
     __index · __title · __body · __cmd[data-os]
   Composes by ROOT class only: chapter-header · feature-showcase (+ -group) · segmented-control · card ·
     text-link · code-snippet (+ icon-button) · key-value-facts (inside mock_html). No component PART is restyled.
   Tokens only. Private knobs: --_gap --_head-gap --_min --_grid-gap
   ========================================================================== */
.ds-sec-l-feat-03-step-cards {
  --_gap:      var(--ds-section-gap);
  --_head-gap: var(--ds-space-10);                                  /* head → cells (C-01: 6–10 units); cloudflare 56 */
  --_min:      240px;                                               /* card column min → 4-up ≥ ~1100, 2-up tablet, 1-up phone */
  --_grid-gap: var(--ds-space-5);                                   /* cloudflare 20 */
  position: relative;
  padding-block: var(--_gap);
  padding-inline: var(--ds-gutter-page);                            /* the section owns its container */
  color: var(--ds-ink);
  min-width: 0;
}
.ds-sec-l-feat-03-step-cards__inner {
  width: 100%;
  max-width: var(--ds-container-max);
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: var(--_head-gap);
  min-width: 0;
}
.ds-sec-l-feat-03-step-cards__inner > .ds-feature-showcase-group { width: 100%; }
/* ---------------------------------------------------------------------------
   1. CLOUDFLARE — header row, the card grid, the step parts, the OS switch
   ------------------------------------------------------------------------- */
/* header row: h2 left, the segmented control right, bottom-aligned (cloudflare `align-items: end`) */
.ds-sec-l-feat-03-step-cards__band {
  position: relative;                                               /* the segmented control's sr-only legend needs a positioned ancestor */
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--ds-space-6) var(--ds-space-8);
  min-width: 0;
}
.ds-sec-l-feat-03-step-cards__band > .ds-chapter-header { flex: 1 1 320px; }      /* placement of the composed root */
.ds-sec-l-feat-03-step-cards__band > .ds-segmented-control { flex: 0 0 auto; }
.ds-sec-l-feat-03-step-cards__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(var(--_min), 100%), 1fr));
  gap: var(--_grid-gap);
  margin: 0;
  padding: 0;
  list-style: none;
  min-width: 0;
}
.ds-sec-l-feat-03-step-cards__grid > * { min-width: 0; }
/* the step: a composed .ds-card root (the plane: radius-xl + 28 px padding knobs set inline) whose own
   .ds-card__body holds the parts — since 2026-09-20 the card's body grows (flex: 1 1 auto), so the code box
   sits on one baseline across the row with no section-local body. __step-inner is kept for markup that still
   uses it (same box: gap 12, the card's padding knob). */
.ds-sec-l-feat-03-step-cards__step { block-size: 100%; }
.ds-sec-l-feat-03-step-cards__step-inner {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: var(--ds-space-3);                                          /* cloudflare 14 → the 12 step */
  padding: var(--_pad, var(--ds-card-pad));                         /* the card's padding knob, inherited */
  min-width: 0;
}
.ds-sec-l-feat-03-step-cards__index {
  font-family: var(--ds-font-mono);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-semibold);
  line-height: var(--ds-lh-list);
  color: var(--ds-accent);                                          /* cloudflare: the index is the one accent mark per card */
  font-variant-numeric: tabular-nums;
}
.ds-sec-l-feat-03-step-cards__title {
  margin: 0;
  font-size: var(--ds-text-xl);
  font-weight: var(--ds-weight-semibold);
  letter-spacing: var(--ds-heading-tracking);
  line-height: var(--ds-lh-heading);
  color: var(--ds-ink);
  text-wrap: balance;
}
.ds-sec-l-feat-03-step-cards__body {
  margin: 0;
  flex: 1 1 auto;                                                   /* the code box sits on one baseline across the row */
  font-size: var(--ds-text-md);
  line-height: var(--ds-lh-body);
  color: var(--ds-ink-2);
}
.ds-sec-l-feat-03-step-cards__cmd { min-width: 0; }
.ds-sec-l-feat-03-step-cards__cmd > * { max-width: 100%; }
/* the OS switch — explicit attribute on the root wins; else the composed radios drive it (no script) */
.ds-sec-l-feat-03-step-cards[data-os="macos"]   .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="macos"]),
.ds-sec-l-feat-03-step-cards[data-os="windows"] .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="windows"]),
.ds-sec-l-feat-03-step-cards[data-os="linux"]   .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="linux"]) { display: none; }
.ds-sec-l-feat-03-step-cards:not([data-os]):has(.ds-segmented-control__input[value="macos"]:checked)   .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="macos"]),
.ds-sec-l-feat-03-step-cards:not([data-os]):has(.ds-segmented-control__input[value="windows"]:checked) .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="windows"]),
.ds-sec-l-feat-03-step-cards:not([data-os]):has(.ds-segmented-control__input[value="linux"]:checked)   .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="linux"]) { display: none; }
/* no attribute and no checked radio (or no :has support): macOS is the default */
.ds-sec-l-feat-03-step-cards:not([data-os]):not(:has(.ds-segmented-control__input:checked)) .ds-sec-l-feat-03-step-cards__cmd[data-os]:not([data-os="macos"]) { display: none; }
/* patterns/sections/l-feat-01-alternating-showcase.css */
/* ============================================================================
   patterns/sections/l-feat-01-alternating-showcase.css
   L-FEAT-01 · Alternating showcase · core
   Root <section class="ds-sec-l-feat-01-alternating-showcase"
                 data-variant="jstov | vercel-alternating | intercom-text-left-media-right">
   Since 2026-09-19 the section only (a) sets page rhythm, (b) PLACES the composed chapter-header
   in the feature-showcase's `head` grid area (so the H2 aligns to the mock's left edge and flips
   with data-side), (c) keeps Intercom's decorative breather tile. Everything else is
   components/feature-showcase[data-layout="aside"] + components/chapter-header.
   Composition by root class only; no sibling PART is restyled here (grid-area is placement).
   Tokens only. Private knob: --_gap (rhythm between instances).
   ========================================================================== */
.ds-sec-l-feat-01-alternating-showcase {
  --_gap: var(--ds-section-gap);
  display: flex;
  flex-direction: column;
  gap: var(--_gap);
  padding-block: var(--_gap);
  padding-inline: var(--ds-gutter-page);           /* the section owns its container (builder finding 2026-09-19) */
  min-width: 0;
}
.ds-sec-l-feat-01-alternating-showcase > .ds-feature-showcase {
  width: 100%;
  max-width: var(--ds-container-max);
  margin-inline: auto;
}
/* Place the composed chapter header in the article's `head` area (component grid, ≥1024).
   Below 1024 the article is a single column and DOM order (heading → mock → claim) carries. */
.ds-sec-l-feat-01-alternating-showcase > .ds-feature-showcase > .ds-chapter-header {
  grid-area: head;
  min-width: 0;
}
/* Intercom: decorative "breather" tile under the text column (aria-hidden) */
.ds-sec-l-feat-01-alternating-showcase__breather {
  inline-size: min(160px, 40%);
  aspect-ratio: 1;
  margin-block-start: var(--ds-space-8);
  background: linear-gradient(160deg, var(--ds-illustration-ground), var(--ds-accent-tint));
  border: var(--ds-border-width) solid var(--ds-rule);
}
