/* ⛔ GENERATED by `npm run tokens` from design/tokens/tokens.css — DO NOT EDIT.
   Both landing/tokens.css and app/css/tokens.css are this exact file;
   tests/test_design_tokens.js fails if either drifts. */
/* ============================================================================
   WheelsUp design primitives — THE ONE SOURCE (EPIC-34 · S-34.3)

   ⛔ THIS FILE IS NOT SERVED. `npm run tokens` copies it, under a GENERATED
   banner, to the two places a browser can reach:
       landing/tokens.css   (the landing Worker serves ONLY ./landing)
       app/css/tokens.css   (the app serves app/)
   tests/test_design_tokens.js fails the moment either copy differs from what this file
   generates. Edit HERE, run `npm run tokens`, commit all three.

   WHAT BELONGS HERE — primitives only:
     · every name is `--wu-*`, named by VALUE and ROLE (`--wu-teal-700`), never
       by USE (`--brand`). Use-names are each surface's semantic layer
       (landing/design-tokens.css, landing/landing.css, app/css/styles.css,
       app/preview.html) and point here with var().
     · ONE `:root` block and nothing else. No component rules (the skip link and
       the lightbox stay in landing/design-tokens.css — the app has its own).
     · ⛔ never a non-`--wu-` name. `--border` defined here would silently
       "define" the undefined token EPIC-28 shipped in the app (contrast §12).

   WHAT DOES NOT — and why it is still a literal where it lives:
     · the A11Y-calibrated TEXT tier (`--text-*`, `--*-text`, `--label`,
       `--on-*`, `--*-on-hero`) and the grounds it was measured against
       (`--bg-*`, app `--surface-2`, `--chip-*`, `--row-hl-bg`, `--attn-*`, the
       tool-layer panels). Their values were chosen BY MEASUREMENT against each
       other; routing them through a shared primitive would let an edit here
       re-value a published WCAG pair from a file that never mentions it.
     · translucent `rgba()` tokens (no relative-colour syntax yet), gradients,
       and the print block (paper, not screen).

   S-34.3 IS ZERO RENDERED CHANGE: primitives carry TODAY's values, drift and
   all. Where two surfaces spell one colour two ways, both values are here and
   marked ⚠️ DRIFT — S-34.5 picks one. The type scale, space, width and dialog
   tokens are DEFINED ONLY: nothing consumes them until S-34.4…S-34.6.
   ============================================================================ */
:root {
  /* ── Teal — the brand hue ─────────────────────────────────────────────── */
  --wu-teal-300: #5eead4;   /* landing --brand-300 · app dark --brand-300 · /preview --teal */
  --wu-teal-400: #2dd4bf;   /* app light --brand-300  ⚠️ DRIFT vs 300 (audit F-1) */
  --wu-teal-450: #19c2ad;   /* app dark --brand (night teal) */
  --wu-teal-500: #14b8a6;   /* landing --brand-400 · app --brand-2 */
  --wu-teal-600: #0d8a80;   /* landing --brand-600 */
  --wu-teal-700: #0f766e;   /* --brand on both surfaces · app --color-info */
  --wu-teal-800: #115e59;   /* --brand-700 on both surfaces */

  /* ── Sand — the warm accent ───────────────────────────────────────────── */
  --wu-sand-200: #f8c089;   /* app --sand-light */
  --wu-sand-400: #f4a259;   /* landing --sand · app dark --sand · /preview --sand */
  --wu-sand-500: #e08a3c;   /* landing --sand-600 (hover)  ⚠️ DRIFT vs 600 */
  --wu-sand-600: #e0853a;   /* app light --sand / --sand-strong / --color-warn */

  /* ── Navy + ink — text navy and the near-black grounds ─────────────────── */
  --wu-navy-900: #0f1b2d;   /* --ink on both surfaces */
  --wu-navy-800: #16263c;   /* landing --ink-800 */
  --wu-ink-950:  #070d16;   /* landing --ink-950 */
  --wu-ink-900:  #0a111e;   /* landing --ink-900 */

  /* ── Slate + white — light neutrals ───────────────────────────────────── */
  --wu-white:     #ffffff;
  --wu-slate-100: #f1f5f9;  /* landing --surface / --paper-2 */
  --wu-slate-150: #e9eef5;  /* landing --surface-2 */
  --wu-slate-200: #e2e8f0;  /* landing --border */
  --wu-slate-300: #cbd5e1;  /* landing --slate-300 */
  --wu-slate-500: #64748b;  /* landing --slate */

  /* ── Status ───────────────────────────────────────────────────────────── */
  --wu-green-400: #4ade80;  /* landing --ok · app dark --color-ok */
  --wu-green-600: #16a34a;  /* landing --success · app light --color-ok */
  --wu-red-400:   #f87171;  /* app dark --color-danger */
  --wu-red-600:   #dc2626;  /* landing --danger · app light --color-danger */

  /* ── Families ─────────────────────────────────────────────────────────────
     DEC-39A: IBM Plex Mono is the one mono, on both surfaces (S-34.4). B612 is
     gone: the departure board was rendered in Plex at 375/1440/2560 and every
     flap fits its cell, so the owner's board exemption was not needed. */
  --wu-font-sans:      'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --wu-font-display:   'Saira Condensed', 'Arial Narrow', sans-serif;
  --wu-font-mono:      'IBM Plex Mono', 'Consolas', monospace;

  /* ── Type scale (DEC-40A · owner 2026-09-16: 11 steps, snapped up to 24px) ──
     rem against a 16px root — BOTH surfaces, since T-34.4.4 moved the app root 15px → 16px
     (2026-09-16). The px noted beside each step is now what actually renders on both. The floor
     stays written as max() so it cannot drop below 11px if a root ever moves again.
     Steps sit on the clusters in the rendered census (16,866 text runs, 2026-09-15/16). The 20px
     and 24px steps exist because the net-pay row, the leave verdict and the view titles sit there
     and their AA-LARGE sand colour is only valid at >=18.66px bold — a scale without them would
     shrink a published contrast pair out of compliance.
     ⛔ SIZES ABOVE 24px ARE NOT SNAPPED (owner 2026-09-16): the display tier is chosen in the
     heading recipes (T-34.4.3), not rounded. The three display steps below are DEFINED ONLY. */
  --wu-fs-2xs: max(11px, 0.6875rem);  /* 11px — the floor, on either root */
  --wu-fs-xs:  0.75rem;     /* 12px */
  --wu-fs-sm:  0.8125rem;   /* 13px */
  --wu-fs-md:  0.875rem;    /* 14px */
  --wu-fs-base: 1rem;       /* 16px */
  --wu-fs-lg:  1.125rem;    /* 18px */
  --wu-fs-xl:  1.25rem;     /* 20px — AA-LARGE bold floor (18.66px) lives under this step */
  --wu-fs-2xl: 1.5rem;      /* 24px */
  --wu-fs-display-3: 1.75rem; /* 28px */
  --wu-fs-display-2: 2.25rem; /* 36px */
  --wu-fs-display-1: 3rem;    /* 48px */
  --wu-fs-display-hero: 4.5rem; /* 72px — the hero clamp's MAX only (home hero, app countdown) */
  /* A close/dismiss glyph is an icon drawn with a character, not display TYPE. It gets its own
     name so the display tier cannot be read off a `×`, and its value is chosen to move the five close
     buttons and the success check as little as possible (app 24 → 26 at the then-15px root,
     landing 27.2 → 26) rather than snapping an icon onto a type step. */
  --wu-icon-glyph: 1.625rem;  /* 26px */

  /* ── Tracking (T-34.4.3) — 8 steps replacing 33 authored letter-spacings ──
     The census of all 133 uppercase rules (2026-09-16) clusters here. Snap every authored value
     to the NEAREST step; ON A TIE ROUND UP — wider tracking is this house's uppercase habit and
     reads better at the 11px floor. The 0.26em step is kept because it IS the landing's
     flight-board signature (board title, manifest + tools + proof bar heads), not drift. */
  /* ⚠ -tight is the DISPLAY step, whatever the case: the shipped homepage has always set its
     UPPERCASE hero and section titles on it. An earlier comment here said "sentence case", which
     described nothing that ships — corrected 2026-09-16 against the render, not the intent. */
  --wu-track-tight:   -0.01em;  /* display headings (hero, section title) */
  --wu-track-none:     0;
  --wu-track-title:    0.03em;  /* uppercase display + view titles */
  --wu-track-tag:      0.06em;  /* badges, pills, status tags (Inter) */
  --wu-track-label:    0.1em;   /* dense table + chip labels */
  --wu-track-eyebrow:  0.14em;  /* THE eyebrow default: mono 11px 700 uppercase */
  --wu-track-wide:     0.2em;   /* section + card eyebrows, footer column heads */
  /* Named for its origin, but it is simply the widest step, and the app's 2FA code field takes it
     too (0.35em -> 0.26em) because separating six digits is the same typographic job. Kept rather
     than renamed: five of its six uses ARE the board, and a rename buys a name at the cost of
     churn across both surfaces. If a third job appears, rename it to --wu-track-widest. */
  --wu-track-board:    0.26em;  /* the landing's flight-board heads + the 2FA code field */

  /* ── Radii (DEC-41A: actions + inputs sm · nested md · cards lg · pills) ── */
  --wu-radius-xs:   4px;    /* landing --r-xs */
  --wu-radius-sm:   9px;    /* landing --radius-sm */
  --wu-radius-md:   10px;
  --wu-radius-lg:   14px;   /* landing --radius */
  --wu-radius-xl:   22px;   /* landing --radius-lg */
  --wu-radius-pill: 999px;

  /* ── Shadows ──────────────────────────────────────────────────────────── */
  --wu-shadow-md: 0 10px 30px rgba(15,27,45,0.10);   /* landing --shadow */
  --wu-shadow-lg: 0 24px 60px rgba(15,27,45,0.18);   /* landing --shadow-lg */
  /* the app's soft-instrument pair (EPIC-17): day extrusion + well, night lift + well */
  --wu-shadow-extrude:    6px 6px 16px rgba(15,27,45,0.10), -6px -6px 16px rgba(255,255,255,0.85);
  --wu-shadow-well:       inset 2px 2px 6px rgba(15,27,45,0.12), inset -2px -2px 6px rgba(255,255,255,0.9);
  --wu-shadow-lift-night: 0 8px 26px rgba(0,0,0,0.35);
  --wu-shadow-well-night: inset 0 2px 6px rgba(0,0,0,0.5);

  /* ── Space — DEFINED ONLY (4px grid) ──────────────────────────────────── */
  --wu-space-1: 4px;
  --wu-space-2: 8px;
  --wu-space-3: 12px;
  --wu-space-4: 16px;
  --wu-space-5: 20px;
  --wu-space-6: 24px;
  --wu-space-7: 32px;
  --wu-space-8: 40px;
  --wu-space-9: 48px;
  --wu-space-10: 64px;

  /* ── Widths — the register in EPIC-34-design-cohesion.md, DEFINED ONLY
     except --wu-width-page (landing --maxw). S-34.6 applies them and its test
     fails on a cap not in the register. ─────────────────────────────────── */
  --wu-width-app:     1900px;   /* .view */
  --wu-width-hero:    1240px;   /* landing home hero .wrap */
  --wu-width-hub:     1180px;   /* .calc-hub */
  --wu-width-page:    1120px;   /* landing --maxw · app footer */
  --wu-width-legal:   1060px;   /* .legal-wrap */
  --wu-width-form:    900px;    /* #view-account (DEC-42A) */
  --wu-width-archive: 780px;    /* .wn-archive */
  --wu-width-reading: 720px;    /* .legal-body · .hero-pv */
  --wu-width-toc:     232px;    /* legal TOC */
  /* dialogs: three today; S-34.6 collapses them to two */
  --wu-width-dialog-sm: 640px;  /* .sb-popover */
  --wu-width-dialog-md: 760px;  /* .pricing-modal */
  --wu-width-dialog-lg: 940px;  /* .wz-card */
}
