/* ============================================================
   WHERE THIS FILE LIVES (ADR-062)
   This file in Raydo-Platform/raydo is the single source of truth
   for the Raydo design tokens. Its content below is RDS v2.6 exactly
   as raydo.eu shipped it (July 2026): the website leads the design,
   the platform holds the file. raydo.eu consumes a pinned copy and
   its CI fails when that copy drifts. Change a token HERE, then
   update the website's pin. Never edit the website's copy.
   ============================================================ */

/* ============================================================
   RAYDO DESIGN SYSTEM — RDS v2.6 · Tokens
   THE single source of truth. Import it; never restyle ad hoc, and
   never redefine a token inline on a page. A rebrand is this file.

   v2.0 (27 Jul 2026) — "The Ring & the Sun" · Tim's upgrade rulings
     NEW MARK   the R monogram (brand/raydo-r-monogram-*.svg) is the
                logo. The current flows through the letter. The old
                Lift-off composition retires from logo duty; its DNA
                (rail · ring) lives on as component grammar.
     GRAMMAR    simplified to three: the RING (the iconic moment, the
                one state container), the RAIL (quiet structure — a
                component, not an icon), and ATTENTION (marigold).
                The rider is RETIRED as core grammar; --rds-rider* and
                --rds-bead are kept only as deprecated aliases so old
                surfaces don't break. Do not use them in new work.
     ATTENTION  the one law that identifies us: marigold #f2b134 is
                the attention colour. Wherever Raydo wants your eye,
                marigold marks it — and only ONE marigold point per
                view. An open ring alone is a state, not an ask.
                (--rds-attention, §G)
     RING       substate geometry tokens (§G) — rest · attention ·
                hover (the gap narrows) · pressed · working (the arc
                rides) · done (closes, draws its tick) · expired.
                The ring speaks with geometry, never with icon salad.
     GRADIENTS  §2b — the clean gradient grounds (CSS, grained). For
                highlight surfaces where the live Current is not
                earned or not possible (decks, cards, og-images,
                email). Always rising to the upper right.
     CURRENT    silk now has two named variants (see js/current.js):
                Sovereign Pure (no marigold at all) and Sovereign
                Sunrise (opts.sun — the sun felt behind the silk).
                The lines/strand-field mode is RETIRED.
     ICONS      §5b — the utility icon set (94 icons, icons/, 24-grid,
                stroke 1.75). Utility icons never sit inside the state
                ring; the ring-verb vocabulary is retired (the tick is
                the only glyph a ring ever draws).
     SPACE      section-rhythm tokens (§4) + the box-in-box rule:
                one bordered container per nesting path.

   v1.9.1 (25 Jul 2026) — alignment pass (index.html is canon)
     REMOVED   31 tokens with zero references anywhere in rds-v1 (not
               index.html, not base.css/components.css, not the other
               HTML surfaces, not the JS layer): the pre-ember-discipline
               oat/rose ramp remnants (COLOUR-RECOMMENDATION.md already
               called for oat's demotion — the ramp just hadn't been
               trimmed), the icon-sm/md/lg/icon-stroke scale superseded
               by the v1.9 stroke-ring/glyph/hair unification below, and
               a handful of orphaned scale-steps (border/border-strong,
               radius-full, elev-0, weight-bold, tracking-normal, space-1,
               ease-breathe/exit, z-base/raised/modal, bare --rds-surface/
               -value/-value-soft/-alert-soft superseded by their -raised/
               -paper/-ink/-soft(rescued) siblings).
     FLAGGED   (kept, not deleted — these name real brand signatures or
               product rules with no consuming component yet; that's a
               build decision, not cleanup): the Living Line's dedicated
               token block (§ below), the grammar's ring-gap angle, the
               cadence/presence/message-limit constants. See
               DESIGN-VISION.md system review + COVERAGE.md for what
               each maps to.
     RESOLVED  (25 Jul 2026, same day) — .rds-voice-wave now reads
               --rds-line-stroke/-width/-rider instead of re-declaring
               the same values by hand (RDS-101); the two hand-typed
               rotate(-64deg) rules now read --rds-ring-gap-deg via
               calc() (RDS-102); --rds-liftoff-angle REMOVED per call —
               unused anywhere, confirmed not needed (RDS-103).

   v1.9 (4 Jul 2026) — the token file finally tells the truth:
     MOVED IN  the v1.6 signal decision (ember = the marigold signal
               #f2b134) that used to live as a per-page <style id=
               "signal-layer"> override — the source of ~84 hardcoded
               hex and of channels.html rendering off-canon.
     ADDED     --rds-ember-mist / -paper / -rgb (attached glows)
     ADDED     --rds-stroke-ring 1.6 / --rds-stroke-glyph 1.4 (§5) —
               one lean stroke scale; the canonical done-tick geometry
     ADDED     --rds-motion alias (§8) — was referenced, never defined
     CONVERGED --rds-wait / --rds-value / --rds-value-ink to the v1.6
               CORE so every surface (index · channels · platform)
               reads the same signal.

   Lineage (v1.0 "Groundwork", full reasoning in DIRECTION.md):
     KILLED  --rds-current-mesh (CSS blob gradients) → js/current.js shader
     KILLED  glass tokens (--rds-glass-*)            → white + hairline + ink
     KILLED  tilt (--rds-tilt-*)                     → press depth (physics)
     KILLED  page blooms/washes                      → 2% paper grain only
     NEW     rail / ring / bead grammar constants (§G)
     NEW     press-depth elevation model (§7)
     KEPT    all colour scales, inks, type, space, radius, motion
             laws, presence, message anatomy.
   ============================================================ */

:root {

  /* ---------- 1 · PRIMITIVE COLOUR SCALES (unchanged from v0.7) ----- */
  --rds-sage-50:  #e8f5f2;
  --rds-sage-100: #d3ece7;
  --rds-sage-200: #aaddd3;
  --rds-sage-300: #74c6b7;
  --rds-sage-450: #34a394;   /* vivid — decorative/large only */
  --rds-sage-500: #2f8f81;   /* canonical brand value */
  --rds-sage-600: #2a8576;
  --rds-sage-700: #1f6b60;   /* sage as text on white · 5.7:1 */
  --rds-sage-800: #185349;
  --rds-sage-900: #123e37;

  /* oat ramp trimmed to the three shades actually in use (v1.9.1) —
     COLOUR-RECOMMENDATION.md: oat is demoted, no secondary colour scale.
     oat-300/800 survive as the ember's paper-side/text neighbours; the
     signal itself is the marigold tokens below. */
  --rds-oat-50:  #fbf2e2;
  --rds-oat-300: #e3b86a;
  --rds-oat-800: #8a5f1e;    /* oat as text on white · 5.6:1 */

  /* marigold — the promoted warm signal (Colour Direction A · screenshot-4 values) */
  --rds-marigold-500: #f2b134;   /* marigold signal — the point, never a field */
  --rds-marigold-50:  #faf6ee;   /* marigold mist — a near-white warm halo & wash only, never text */
  --rds-marigold-rgb: 242, 177, 52;   /* for attached glows: rgba(var(--rds-marigold-rgb), α) */
  /* --rds-marigold-ink RETIRED (4 Jul): muddy warm brown killed. Warm text/
     strokes on light now use the marigold signal (accents) or sage-700 (legible text). */

  /* rose ramp trimmed to the shades in use (v1.9.1) — rose stays scarce
     by law, a full 9-step ramp read as a status system waiting to happen. */
  --rds-rose-50:  #fbeeec;
  --rds-rose-200: #efbeb7;
  --rds-rose-300: #e89e94;
  --rds-rose-500: #e0726a;
  --rds-rose-600: #c8554c;
  --rds-rose-700: #b24c45;   /* rose as text on white · 5.2:1 */

  --rds-sand-50:  #fbfaf6;
  --rds-sand-100: #f5f2ea;   /* warm-paper island (T2 / Sheet) */
  --rds-sand-200: #eef1ef;
  --rds-sand-300: #e6ebe8;
  --rds-sand-400: #cdd6d2;
  --rds-sand-450: #97a39e;   /* decorative mid — never text */
  --rds-sand-500: #6f6a5e;   /* lightest text-safe · 5.2:1 */
  --rds-sand-600: #535d58;   /* secondary text · 7.0:1 */
  --rds-sand-800: #232a27;   /* primary ink · 14.7:1 */
  --rds-sand-900: #141a17;

  --rds-shadow-warm: 31, 107, 96;   /* sage ambient shadow base (rgba) */
  --rds-shadow-deep: 18, 62, 55;

  /* ---------- 2 · SEMANTIC ROLES ---------- */
  --rds-bg:             #ffffff;
  --rds-bg-tint:        #f7faf9;
  --rds-surface-soft:   var(--rds-sand-200);
  --rds-surface-raised: #ffffff;
  --rds-surface-paper:  #eef2f0;   /* the card/island — de-creamed (4 Jul): a clean, cool sage-stone, not warm oat */
  --rds-surface-ink:    var(--rds-sand-900);  /* NEW: ink-dark panels (governance, code) */

  --rds-ink:        var(--rds-sand-800);
  --rds-ink-soft:   var(--rds-sand-600);
  --rds-ink-dim:    var(--rds-sand-500);
  --rds-ink-invert: #ffffff;
  /* crest cream (#fdeac4) is DELETED — the warm display accent on
     colour bands is the marigold mist. One warm family, one source. */
  --rds-ink-cream:  var(--rds-marigold-50);
  /* text on the Current is ALWAYS white — the Current is always deep,
     whatever the page theme. Never theme-flipped. */
  --rds-ink-on-current: #ffffff;

  --rds-rule:        var(--rds-sand-300);
  --rds-rule-soft:   #eef1ef;
  --rds-rule-strong: var(--rds-sand-400);

  --rds-action:        var(--rds-sage-500);
  --rds-action-hover:  var(--rds-sage-700);
  --rds-action-soft:   var(--rds-sage-50);
  --rds-action-ink:    var(--rds-sage-700);
  --rds-on-action:     #ffffff;

  --rds-value-ink:   var(--rds-sage-700);      /* warm text retired → legible sage */

  /* Valence axis — calm by design */
  --rds-done:       var(--rds-sage-700);
  --rds-done-soft:  var(--rds-sage-50);
  --rds-wait:       var(--rds-ember);     /* 'your call' open rings · the marigold signal */
  --rds-wait-soft:  var(--rds-sand-50);   /* wait fields are PAPER, never yellow */
  --rds-alert:      var(--rds-rose-600);
  --rds-alert-ink:  var(--rds-rose-700);

  --rds-subsurface-ink: var(--rds-sage-700);

  /* ---------- G · THE GRAMMAR (new in v1.0) ----------
     The Mark decomposed into structural primitives. Components build
     FROM these; the logo is just their most compact arrangement. */
  --rds-rail-ink:        var(--rds-sand-800);   /* structural rails */
  --rds-rail-live:       var(--rds-sage-500);   /* an active/filling rail */
  --rds-rail-w:          2px;                    /* UI rail weight */
  --rds-rail-w-strong:   3px;                    /* section/hero rails */
  --rds-ring-ink:        var(--rds-sage-700);
  --rds-ring-w:          2.0px;
  /* FLAGGED (v1.9.1): --rds-ring-gap-deg has no consuming rule yet — the
     open-ring gap (single-open ring faces upper-right, ≈1:30, per the
     v1.9 stroke unification) appears to be hand-set per component rather
     than read from this token. Either wire components to it or retire it —
     leaving as-is pending a call, since "the ring's gap" is a signature law. */
  --rds-ring-gap-deg:    64deg;                  /* the open Rao ring gap */

  /* ---------- G2 · THE RING MOMENT ----------
     One state container. Seven substates, told by SHAPE first — every
     state is distinguishable in pure greyscale, so colour only ever
     amplifies what the geometry already says.

     THE MOUTH TURNS. An ordinary open ring rests with its mouth at the
     UPPER RIGHT (315° clockwise from 3 o'clock, 1:30) — the direction
     the Mark releases in, and the direction everything else in the
     system rises toward. An ASK turns its mouth to the UPPER LEFT
     (225°, 10:30), where the eye enters a surface. So a request is
     distinguished from a state twice over — by orientation and by the
     light it holds — and both survive greyscale.

     Within a state the mouth is ANCHORED: rotation moves with the dash
     so the ring closes IN PLACE, never spinning to a new position.

     Canonical 24-view: c=12, r=9, C=2πr=56.55.
       rest      open at the upper right, modest mouth (56°), ink —
                 a state, not an ask
       attention the mouth TURNS to the upper left, opens wider (77°),
                 and the ring HOLDS A WARM LIGHT — a soft marigold disc
                 inside it. Work is sitting in the ring, waiting for
                 your decision. The light is a value, not just a hue,
                 so the ask reads with the colour taken away.
       hover     the mouth closes in on the light (24°) and the light
                 rises to meet the stroke — still visibly open
       pressed   the mouth SHUTS and the whole ring compresses (0.93)
                 and sits 1px down: committed, never a bounce
       working   a sage arc rides a faint closed track (the only loop);
                 the light dims — it is no longer yours to act on
       done      the ring closes, the light is spent, and the tick
                 draws in its place
       expired   closed, DASHED, dim — a spent ring reads as a void
     LAW: at most ONE attention ring per view. */
  --rds-ring-c:              56.55;    /* circumference at r=9, unitless */
  --rds-ring-mouth-rest:     315deg;   /* a state opens up-right · 1:30 */
  --rds-ring-mouth-ask:      225deg;   /* an ask turns up-left · 10:30 */
  --rds-ring-dash-rest:      47.75 8.8;    /* 56° mouth */
  --rds-ring-dash-attention: 44.5 12.05;   /* 77° mouth */
  --rds-ring-dash-hover:     52.78 3.77;   /* 24° mouth — still visibly open */
  --rds-ring-dash-pressed:   56 0.55;      /* almost shut */
  --rds-ring-dash-closed:    56.55 0;
  --rds-ring-dash-expired:   2.6 2.35;     /* the spent ring: closed but dashed */
  --rds-ring-arc:            14 42.55;     /* the working arc */
  /* per-state rotation: keeps the mouth's centre pinned at 10:30
     while the dash narrows, so the ring closes in place */
  /* states open up-right */
  --rds-ring-rot-rest:      -17deg;
  --rds-ring-rot-hover:     -33deg;
  --rds-ring-rot-pressed:   -43.25deg;
  --rds-ring-rot-done:      20deg;    /* a small turn home as it closes */
  /* the ask opens up-left */
  --rds-ring-rot-attention:      -96.6deg;
  --rds-ring-rot-attention-hover: -123deg;
  --rds-ring-rot-attention-press: -133.2deg;
  /* the held light: a marigold disc inside the ring, never a hard dot */
  --rds-ring-light-r:        5.6;
  --rds-ring-light-fill:     rgba(var(--rds-marigold-rgb), .28);
  --rds-attention:           var(--rds-marigold-500);  /* THE attention colour — one point per view */
  --rds-attention-rgb:       var(--rds-marigold-rgb);

  /* THE RIDER — RETIRED as core grammar (v2.0, Tim's ruling 27 Jul).
     Deprecated aliases only — kept so v1.x surfaces render; never
     use in new work. What survives of the rider is the LAW it served:
     marigold marks the point that wants your eye (--rds-attention).

     v1.6 CORE — THE EMBER IS THE MARIGOLD SIGNAL (#f2b134). The
     exploration is over: the one warm point is the bright marigold,
     not the old brassy oat-600. This decision used to live as a per-
     page `<style id="signal-layer">` override in every HTML file (the
     source of ~84 hardcoded hex and of channels.html rendering off-
     canon). It is now canonical here — a rebrand is one token file. */
  --rds-ember:           var(--rds-marigold-500);   /* the one warm point */
  --rds-ember-mist:      var(--rds-marigold-50);     /* near-white warm halo & wash only, never text — FLAGGED (v1.9.1): not yet consumed by any rule */
  --rds-ember-paper:     var(--rds-sage-700);        /* warm text is retired → legible sage on paper — FLAGGED (v1.9.1): not yet consumed */
  --rds-ember-rgb:       var(--rds-marigold-rgb);    /* attached glow: rgba(var(--rds-ember-rgb), α) */
  --rds-bead:            var(--rds-ember);   /* FLAGGED (v1.9.1): components read --rds-ember directly today, not this alias */
  --rds-rider:           var(--rds-ember);   /* FLAGGED (v1.9.1): components read --rds-ember directly today, not this alias */
  --rds-rider-size:      11px;

  /* ---------- 2b · THE GRADIENT GROUNDS (v2.0) ----------
     The clean gradients — for highlight surfaces where the live
     Current is not earned or not possible (decks, cards, og-images,
     email headers, section washes). Laws:
       · always RISING — light gathers to the upper right, the
         direction of the Mark's release. Never top-down, never flat.
       · the sun variant carries the ONE marigold glow — a light
         source, never a colour stop; it counts as the view's one
         attention point.
       · always grained (.rds-ground adds the 2% grain) — a banded
         gradient is a lint error.
       · text on deep grounds is white; on day grounds, ink.
     Consumed by the .rds-ground--* classes in components.css. */
  --rds-grad-sovereign: linear-gradient(38deg,
      #0d2f2a 0%, var(--rds-sage-900) 26%, var(--rds-sage-700) 64%,
      var(--rds-sage-500) 100%);
  --rds-grad-rise: linear-gradient(38deg,
      var(--rds-sage-700) 0%, var(--rds-sage-500) 38%,
      var(--rds-sage-450) 68%, var(--rds-sage-300) 100%);   /* v2.1: clearly lighter than sovereign — it reaches the pale crest */
  --rds-grad-sun:
      radial-gradient(58% 74% at 74% 24%,
        rgba(var(--rds-marigold-rgb), .38) 0%,
        rgba(var(--rds-marigold-rgb), .14) 38%,
        rgba(var(--rds-marigold-rgb), 0) 66%),
      linear-gradient(38deg,
        #0d2f2a 0%, var(--rds-sage-900) 30%, var(--rds-sage-700) 68%,
        var(--rds-sage-500) 100%);
  --rds-grad-day: linear-gradient(38deg,
      #ffffff 0%, var(--rds-sage-50) 58%, #d9efe9 100%);

  /* ---------- 3 · TYPOGRAPHY (one Raydo voice) ---------- */
  --rds-font-display: 'Raydo Kin', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --rds-font-body: 'Raydo Kin', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --rds-font-hand:    'Caveat', 'Segoe Script', cursive;
  --rds-font-mono:    ui-monospace, 'SF Mono', 'Cascadia Code', monospace;

  --rds-text-hero:    clamp(3rem, 8vw, 6.5rem);
  --rds-text-display: clamp(1.875rem, 4vw, 3rem);
  --rds-text-h3:      1.5rem;
  --rds-text-h4:      1.375rem;
  --rds-text-h5:      1.05rem;      /* smallest display heading (seniority / catalog caps) */
  --rds-text-lead:    1.0625rem;
  --rds-text-msg:     0.9375rem;    /* message & diff CONTENT — the two-size law's content size */
  --rds-text-body:    0.90625rem;
  --rds-text-prose:   1rem;
  --rds-text-sm:      0.8125rem;
  --rds-text-caption: 0.71875rem;
  --rds-text-mono:    0.75rem;      /* 12px — the play-0 ledger's tabular mono */
  --rds-text-eyebrow: 0.65625rem;   /* 10.5px — the uppercase eyebrow / tag micro-label */
  --rds-text-micro:   0.65rem;
  --rds-text-hand:    1.1875rem;
  --rds-text-numeral: clamp(2.25rem, 4.5vw, 3.5rem);  /* NEW: value numerals, tabular */

  --rds-weight-light: 300; --rds-weight-regular: 400;
  --rds-weight-medium: 500; --rds-weight-semi: 600;

  --rds-leading-tight: 1.04; --rds-leading-snug: 1.3;
  --rds-leading-normal: 1.6; --rds-leading-relaxed: 1.7;

  --rds-tracking-display: -0.035em;
  --rds-tracking-tight:   -0.015em;
  --rds-tracking-label:   0.14em;

  /* ---------- 4 · SPACE ---------- */
  --rds-space-2: 8px;  --rds-space-3: 12px;
  --rds-space-4: 16px; --rds-space-5: 20px; --rds-space-6: 24px;
  --rds-space-8: 32px; --rds-space-10: 40px; --rds-space-12: 48px;
  --rds-space-16: 64px; --rds-space-20: 80px; --rds-space-24: 96px;

  /* v2.0 · section rhythm — one breath between chapters, one inside.
     THE BOX-IN-BOX RULE: along any nesting path, at most ONE bordered
     or shadowed container. A card inside a card is a lint error —
     inner grouping is done with space and a hairline rule, never a
     second box. Demo stages sit on bare tint (no border). */
  --rds-sect-pad:   clamp(72px, 10vw, 128px);
  --rds-sect-gap:   var(--rds-space-12);   /* head → body inside a section */

  /* ---------- 5 · BORDERS ---------- */
  --rds-border-hair: 1px;

  /* ONE stroke scale (v1.9 unification). Before: rings drew at 1.5 / 1.9 /
     2.0 across components and the icon set looked unrelated to the guide
     rings — the old --rds-icon-stroke/-sm/-md/-lg scale it replaced was
     removed in v1.9.1 (zero references left once this scale took over).
     Now every state ring is the same lean weight, and the glyph that
     draws inside it is a notch finer — so the whole family reads as one
     hand. Unitless: consumed by SVG stroke-width. */
  --rds-stroke-ring:  1.6;   /* state rings: checkbox · weekrail · inbox · workitem · btn · riderline · ring-ico */
  --rds-stroke-glyph: 1.4;   /* drawn glyphs & ticks inside a ring */
  --rds-stroke-hair:  1.25;  /* the finest structural stroke — FLAGGED (v1.9.1): defined for the unified scale, not yet applied anywhere */

  /* ---------- 5b · UTILITY ICONS (v2.0) ----------
     The 94-icon set (icons/ · 24-grid · stroke 1.75, detail 1.5 ·
     rounded caps · currentColor). Utility icons NAME things — a
     source, an object, a domain. The ring TELLS states. The two
     never mix: no utility icon ever sits inside a state ring, and
     no state is ever told by a utility icon. One ink per icon,
     inherited from text; never brand-coloured confetti. */
  --rds-ico-stroke: 1.75;
  --rds-ico-sm: 16px;  --rds-ico-md: 20px;  --rds-ico-lg: 24px;

  /* THE ONE done-tick. Same proportional geometry everywhere so the
     checkmark is unmistakably the same mark, expressed in each ring's
     coordinate space (a shared <symbol> can't be reused for the animated
     ticks, whose .tick class the draw animation targets — so the geometry
     is the contract). Proportions, relative to ring centre c and radius r:
       P1 = (c − 0.467r, c + 0.022r)
       P2 = (c − 0.144r, c + 0.333r)
       P3 = (c + 0.467r, c − 0.311r)
     Canonical 24-view (c=12, r=9):  M7.8 12.2 L10.7 15 L16.2 9.2
     See references/tokens.json → tick for the per-context strings. */

  /* ---------- 6 · RADIUS ---------- */
  --rds-radius-xs: 5px;  --rds-radius-sm: 12px; --rds-radius-md: 16px;
  --rds-radius-lg: 20px; --rds-radius-xl: 24px; --rds-radius-2xl: 36px;
  --rds-radius-pill: 100px;

  /* ---------- 7 · ELEVATION — the press-depth model (v1.0) ----------
     Three resting tiers + one pressed state. Depth is something a
     surface DOES under your hand, not a pose it strikes. No glass,
     no offset-tilt. Ambient shadows stay sage-tinted. */
  --rds-elev-1: 0 1px 2px rgba(var(--rds-shadow-warm), .05),
                0 4px 16px rgba(var(--rds-shadow-warm), .06);
  --rds-elev-2: 0 2px 8px rgba(var(--rds-shadow-warm), .07),
                0 14px 34px rgba(var(--rds-shadow-warm), .09);
  --rds-elev-3: 0 18px 44px rgba(var(--rds-shadow-warm), .12);
  --rds-elev-pressed: 0 1px 2px rgba(var(--rds-shadow-warm), .10);
  --rds-elev-sheet: 0 34px 90px rgba(var(--rds-shadow-deep), .20);
  /* the paper-lift hard shadow SURVIVES ONLY on rendered T2 paper cards */
  --rds-lift-paper: 0 14px 34px rgba(var(--rds-shadow-warm), .14),
                    9px 10px 0 rgba(52, 163, 148, .15);

  --rds-focus-outline: 2px solid var(--rds-sage-700);
  --rds-focus-offset:  2px;

  /* ---------- 7b · GLASS (v2.2 — readmitted under law) ----------
     v1.0 killed glass as decoration; v2.2 readmits it as a MATERIAL:
     a glass surface exists only where there is something real to
     blur — the Current, a gradient ground, imagery, or scrolling
     content under chrome. Never on flat white, never stacked, colour
     stays on the solid layer beneath. Near-solid fallback under
     prefers-reduced-transparency (components.css). */
  --rds-glass-blur:   18px;
  --rds-glass-sat:    160%;
  --rds-glass-bg:     rgba(255, 255, 255, .12);
  --rds-glass-edge:   rgba(255, 255, 255, .26);

  /* ---------- 8 · MOTION — settle physics ---------- */
  --rds-motion-fast: .18s;
  --rds-motion-base: .28s;
  --rds-motion-slow: .4s;
  --rds-motion: var(--rds-motion-base);   /* default alias — was referenced but never defined */
  --rds-motion-draw: .55s;     /* ring/rail stroke draws */
  --rds-ease-settle:  cubic-bezier(.22, 1, .36, 1);   /* THE settle curve — JS reads this token, never re-literals it */
  --rds-motion-travel: 8px;            /* max entrance travel */
  --rds-stagger: 55ms;                 /* rail-order stagger step */

  /* Living Line (kept from v0.7). FLAGGED (v1.9.1): this whole block has
     zero references across rds-v1 — no rule currently draws "the Living
     Line" from these tokens. Per the raydo-design skill this is one of
     the three core signatures (Mark / Current / Living Line), so treat
     this as an unbuilt signature, not dead weight: either wire a
     component to it (voice waveform, nudge arrival, ambient accents per
     the skill) or fold it into the ember/rail tokens it would duplicate. */
  --rds-line-stroke:      var(--rds-action);
  --rds-line-stroke-soft: var(--rds-sage-450);
  --rds-line-width:       2.5px;
  --rds-line-rider:       var(--rds-ember);   /* the Living Line's light = the marigold signal */
  --rds-line-duration:    7s;

  /* ---------- 9 · LAYOUT ---------- */
  --rds-container: 1080px;
  --rds-sheet-max: 1480px;
  --rds-gutter: 40px;
  --rds-z-sticky: 50;
  --rds-z-overlay: 100; --rds-z-toast: 300;

  /* ---------- 10 · PRESENCE SCALE (kept) ---------- RESOLVED (RDS-105,
     25 Jul 2026): the presence dial's 5 forms stay 5 distinct forms (per
     rds-message-templates.yaml's presence_map — that's the real design,
     not a padding scale). What these 3 tokens now drive is the .presence-
     stage container's own padding as it steps P1→P5 (index.html), so the
     room around whichever form is showing shrinks as trust grows. */
  --rds-presence-1-pad: var(--rds-space-6);
  --rds-presence-2-pad: var(--rds-space-4);
  --rds-presence-3-pad: var(--rds-space-2);

  /* ---------- 11 · THE INVISIBLE LAYER (kept verbatim) ---------- FLAGGED
     (v1.9.1): the message-anatomy word/ask limits and the cadence/quiet-
     hours numbers are product rules (DESIGN-VISION §1/§2/§7), not CSS —
     nothing currently reads them at runtime. Copy review and the
     `.rds-when` schedule chips (COVERAGE.md v1.2 table) look like they
     enforce these by hand rather than from source. Worth wiring a lint
     step (same idea as t2/lint.js) to these tokens so the numbers can't drift. */
  /* v1.9.1 (RDS-106): these three verified against the ACTUAL enforcement
     point — rds_copy_lint.py, which reads rules.outcome_max_words /
     .prose_max_words / .max_asks from ../rds-message-templates.yaml, not
     from this file. As of 25 Jul 2026 both copies agree (12 / 35 / 1) —
     but they're two hand-kept copies of the same law, not one source.
     Change a number here → change it in rds-message-templates.yaml too,
     or the lint quietly stops matching the design system. */
  --rds-msg-outcome-max-words: 12;
  --rds-msg-total-max-words:   35;   /* = rds-message-templates.yaml rules.prose_max_words */
  --rds-msg-max-asks:          1;
  --rds-mark-bead: '·'; --rds-mark-aside: '—'; --rds-mark-done: '✓';
  --rds-cadence-windows: 3; --rds-cadence-max-pings: 5;
  --rds-cadence-quiet-start: 19; --rds-cadence-quiet-end: 7;
}

/* ---------- DARK THEME (kept structure; glass removed) ---------- */
[data-theme="dark"], .rds-dark {
  /* v1.5.4 — the dark ground is INK: the same warm green-grey family
     the light theme writes with (sand-900 and its neighbours), so dark
     mode feels like the system's own ink, not a tinted teal wash. */
  --rds-bg: #141a17; --rds-bg-tint: #181f1b;
  --rds-surface-soft: #242c28;
  --rds-surface-raised: #2a332e; --rds-surface-paper: #212925;
  --rds-surface-ink: #0b100d;
  /* dark ink runs a step brighter than light-mode's inverse — the
     deep ground swallows contrast, so text must not whisper */
  --rds-ink: #f2f5f0; --rds-ink-soft: #c3cdc5; --rds-ink-dim: #9aa8a0;
  --rds-ink-invert: #141a17;
  --rds-rule: #303a35; --rds-rule-soft: #28312c; --rds-rule-strong: #47524c;
  --rds-action: var(--rds-sage-300); --rds-action-hover: var(--rds-sage-200);
  --rds-action-soft: rgba(116,198,183,.14); --rds-action-ink: var(--rds-sage-300);
  --rds-on-action: #0f1512;
  --rds-value-ink: var(--rds-oat-300);
  --rds-done: var(--rds-sage-200); --rds-done-soft: rgba(116,198,183,.16);
  --rds-wait: var(--rds-oat-300); --rds-wait-soft: rgba(227,184,106,.14);
  --rds-alert: var(--rds-rose-300); --rds-alert-ink: var(--rds-rose-300);
  --rds-rail-ink: #ecefe9; --rds-ring-ink: var(--rds-sage-300);
  --rds-subsurface-ink: var(--rds-sage-300);   /* sage-700 is invisible on dark */
  --rds-elev-1: 0 4px 14px rgba(0,0,0,.4);
  --rds-elev-2: 0 8px 22px rgba(0,0,0,.42);
  --rds-elev-3: 0 12px 30px rgba(0,0,0,.45);
  --rds-focus-outline: 2px solid var(--rds-sage-200);
}

/* ---------- ACCESSIBILITY DEFAULTS ---------- */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: var(--rds-focus-outline);
  outline-offset: var(--rds-focus-offset);
  border-radius: var(--rds-radius-xs);
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --rds-motion-fast: 0s; --rds-motion-base: 0s; --rds-motion-slow: 0s;
    --rds-motion-draw: 0s; --rds-stagger: 0ms;
  }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}
