@font-face{font-family:'DM Sans Variable';font-style:normal;font-display:swap;font-weight:100 1000;src:url('/assets/dm-sans-latin.woff2') format('woff2-variations');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}
:root{--font-sans:'DM Sans Variable','DM Sans',system-ui,sans-serif}

/* GENERATED by scripts/build.mjs from theme.css — do not edit by hand.
   theme.css (Tailwind v4, CSS-first) is the source of truth. This is the
   plain-CSS mirror, for surfaces that do not run Tailwind. */

:root {
  /* --- Scout Blue --------------------------------------------------------- */
  --color-scout-blue-600: #0077b3;  /* 4.90:1 on white — PASSES AA small text.
                                       An earlier requirement for #005A8C was overly
                                       cautious; links may use this directly. */
  --color-scout-blue-700: #005a8c;  /* 7.39:1 — hover, and text on tinted fills */
  --color-scout-blue-400: #21b2fc;  /* 2.11:1 — DECORATIVE ONLY. Never text,
                                       never a border that carries meaning. */

  /* --- neutrals: cool ramp ---------------------------------------
     Surfaces and borders are slate-tinted; text is neutral grey. That is the
     brand as specified, not an accident. */
  --color-white: #ffffff;
  --color-slate-50: #f5f7fa;   /* muted surface */
  --color-slate-200: #e2e8f0;  /* the hairline */
  --color-slate-400: #94a3b8;  /* 2.56:1 — decoration and disabled only */
  --color-slate-450: #8595a9;  /* 3.06:1 — the 1.4.11 floor for a control
                                  boundary. Cool-ramp successor to #949494. */
  --color-slate-500: #64748b;  /* 4.76:1 — the AA floor for small text */
  --color-grey-600: #666666;   /* 5.74:1 — body copy */
  --color-grey-800: #333333;   /* 12.63:1 — headlines and figures */
  --color-grey-100: #ececec;   /* neutral, not slate: this is a media void,
                                  not part of the chrome */

  /* --- status: fill and text are DIFFERENT COLOURS ------------------------
     These hexes are fill colours. Measured on white they are:
       #10B981 2.57:1   #F59E0B 2.15:1   #EF4444 3.76:1
     All three fail AA for text; the first two fail 3:1 for graphics too. So
     each status ships a `-fill` (the brand hex, for bars, dots and icons ON a
     tinted ground) and a text-safe partner. */
  --color-emerald-500: #10b981;  /* success fill */
  --color-emerald-700: #047857;  /* 5.48:1 — success text */
  --color-amber-500: #f59e0b;    /* warning fill; also the star gold */
  --color-amber-700: #b45309;    /* 5.02:1 — warning text */
  --color-red-500: #ef4444;      /* error fill */
  --color-red-700: #b91c1c;      /* 6.47:1 — destructive text */

  /* --- rating hues — DATA ONLY, unchanged --------------------------------
     Five tiers. ScoreBar is the named domain
     signature and these values are already AA-safe as text on white. */
  --color-rating-green-600: #1f7a4d;   /* tier 5 */
  --color-rating-green-500: #4f9d69;   /* tier 4 */
  --color-rating-amber-600: #b08307;   /* tier 3 */
  --color-rating-orange-600: #c2660f;  /* tier 2 */
  --color-rating-red-600: #b3261e;     /* tier 1 */

  /* --- dark-surface ramp, unused until dark mode ships -------------------- */
  --color-ink-900: #121212;
  --color-ink-800: #1b1b1b;
  --color-ink-700: #2a2a2a;
  --color-ink-600: #3a3a3a;
}
:root {
  /* --- surfaces ----------------------------------------------------------
     surface-raised is identical to surface in light mode, and that is correct:
     this system separates planes with a hairline, not a tint and not a shadow.
     In dark mode they diverge, which is why they are two tokens. */
  --color-surface: var(--color-white);
  --color-surface-muted: var(--color-slate-50);    /* alternating sections, app ground */
  --color-surface-raised: var(--color-white);      /* the card plane */
  --color-surface-sunken: var(--color-grey-100);   /* media / image voids */
  --color-surface-inverse: var(--color-grey-800);  /* inverted chips, step markers */

  /* --- text: three levels, by ROLE not by shade --------------------------- */
  --color-text-primary: var(--color-grey-800);     /* headlines, figures, strong copy */
  --color-text-secondary: var(--color-grey-600);   /* body copy — the reading colour */
  --color-text-muted: var(--color-slate-500);      /* eyebrows, table heads, captions */
  --color-text-inverse: var(--color-white);

  /* --- brand & action ----------------------------------------------------
     primary is the action colour: links, focus rings, category icons, item
     indicators. It is NOT the solid button — see --color-cta below. */
  --color-primary: var(--color-scout-blue-600);
  --color-primary-hover: var(--color-scout-blue-700);
  --color-primary-subtle: color-mix(in oklab, var(--color-scout-blue-600) 10%, transparent);
  --color-primary-contrast: var(--color-white);    /* text ON primary — 4.90:1 */
  --color-accent: var(--color-scout-blue-400);     /* decorative only, never text */

  /* The solid commit button is INK, not the action blue. Blue navigates, black
     commits. 12.63:1 with white on top — the strongest pairing in the system,
     which is what a single page-level commitment should be. */
  --color-cta: var(--color-grey-800);
  --color-cta-hover: color-mix(in oklab, var(--color-grey-800) 88%, white);
  --color-cta-contrast: var(--color-white);

  /* --- borders ------------------------------------------------------------ */
  --color-border: var(--color-slate-200);          /* hairlines, dividers, cards */
  --color-border-strong: var(--color-slate-450);   /* inputs, secondary button — 3.06:1 */
  --color-border-focus: var(--color-scout-blue-600);

  /* --- rating scale: the score bars, as a system --------------------------
     Thresholds are product policy and live in code (ratingOf), not here:
       5 excellent  >= 4.5      2 fair      >= 1.5
       4 very-good  >= 3.5      1 poor      >  0
       3 good       >= 2.5      - neutral   <= 0 / invalid
     Stars are NOT tier-coloured — they are always --color-star. Tier colour
     belongs to the aggregate figure, the bar fill and the tier badge. */
  --color-rating-excellent: var(--color-rating-green-600);
  --color-rating-very-good: var(--color-rating-green-500);
  --color-rating-good: var(--color-rating-amber-600);
  --color-rating-fair: var(--color-rating-orange-600);
  --color-rating-poor: var(--color-rating-red-600);
  --color-rating-neutral: var(--color-slate-400);  /* no rating / invalid */
  --color-rating-empty: var(--color-slate-200);    /* the unfilled track */
  --color-star: var(--color-amber-500);            /* the gold. One value, all tiers. */

  /* --- status: fill + text pairs -----------------------------------------
     Rule: `-fill` may never carry text. `-text` may never flood a surface.
     Status is never colour-only — always icon + text (WCAG 1.4.1). */
  --color-success: var(--color-emerald-700);
  --color-success-fill: var(--color-emerald-500);
  --color-success-subtle: color-mix(in oklab, var(--color-emerald-500) 12%, transparent);
  --color-warning: var(--color-amber-700);
  --color-warning-fill: var(--color-amber-500);
  --color-warning-subtle: color-mix(in oklab, var(--color-amber-500) 14%, transparent);
  --color-destructive: var(--color-red-700);
  --color-destructive-fill: var(--color-red-500);
  --color-destructive-hover: color-mix(in oklab, var(--color-red-700) 88%, black);
  --color-destructive-subtle: color-mix(in oklab, var(--color-red-500) 10%, transparent);

  /* --- type: roles, not just sizes ---------------------------------------
     Each size carries its own line-height and tracking, so one utility
     reproduces a style exactly. Shared by ALL densities: a dashboard is not a
     different typeface at a different scale, it is the same voice speaking in
     shorter sentences. */
  --font-sans: 'DM Sans', system-ui, sans-serif;
  /* No editorial serif. Playfair Display and Source Serif 4 were declared here
     and never loaded, so they shipped as Georgia while reading as a decision.
     Cut 2026-08-07. When /business/ needs an editorial voice, add ONE family
     together with its @font-face in the same commit — not before. */
  --font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;

  --text-caption: 0.625rem;      /* 10px — data sources, timestamps */
  --text-caption--line-height: 1.5;
  --text-caption--letter-spacing: 0.06em;
  --text-eyebrow: 0.6875rem;     /* 11px — section eyebrows, table heads */
  --text-eyebrow--line-height: 1.4;
  --text-eyebrow--letter-spacing: 0.12em;
  --text-meta: 0.8125rem;        /* 13px — step numbers, dense metadata */
  --text-meta--line-height: 1.4;
  --text-sm: 0.875rem;           /* 14px — table body, dense lists */
  --text-sm--line-height: 1.55;
  --text-ui: 0.9375rem;          /* 15px — buttons, links, controls */
  --text-ui--line-height: 1.6;
  --text-base: 1rem;
  --text-base--line-height: 1.65;
  --text-lead: 1.0625rem;        /* 17px — body-large, pull statements */
  --text-lead--line-height: 1.45;
  --text-h4: 1.125rem;
  --text-h4--line-height: 1.4;
  --text-h3: 1.25rem;
  --text-h3--line-height: 1.35;
  --text-h3--letter-spacing: -0.01em;
  --text-h2: clamp(1.75rem, 4vw, 2.25rem);
  --text-h2--line-height: 1.2;
  --text-h2--letter-spacing: -0.02em;
  --text-h1: clamp(2rem, 5vw, 2.75rem);
  --text-h1--line-height: 1.15;
  --text-h1--letter-spacing: -0.025em;
  --text-display: clamp(2.5rem, 6vw, 3.5rem);  /* hero only, comfortable density */
  --text-display--line-height: 1.05;
  --text-display--letter-spacing: -0.03em;

  --tracking-caps: 0.06em;
  --tracking-eyebrow: 0.12em;

  /* --- spacing: base scale ----------------------------------------------- */
  --spacing: 0.25rem;               /* 4px step */

  /* --- DENSITY -----------------------------------------------------------
     Three modes. The named spacings below hold the DEFAULT (product) values;
     [data-density] re-points them further down. Components never branch on
     surface — they use the names and inherit the mode.

       compact       feedback; dense dashboard panels
       default       app, business
       comfortable   www, /business/ marketing

     --spacing-density-* is the single base unit for each mode, exposed for callers that want to derive their own rhythm. */
  --spacing-density-compact: 0.75rem;
  --spacing-density-default: 1rem;
  --spacing-density-comfortable: 1.5rem;

  --spacing-section: 2rem;          /* vertical rhythm between page sections */
  --spacing-section-loose: 3rem;    /* hero and closing sections */
  --spacing-section-tight: 1.5rem;
  --spacing-block: 1rem;            /* card / callout / panel padding */
  --spacing-block-tight: 0.75rem;   /* toolbars, sidebars, list items */
  --spacing-stack: 0.75rem;         /* gap between related blocks */
  --spacing-row: 0.5rem;            /* table row padding-block */

  /* Control heights. `touch` is the floor on anything a finger hits — the
     feedback app is used on 4G after a race, by tired people. `sm` is
     desktop-only: keyboard-and-mouse dashboards, never mobile. */
  --control-height-sm: 2rem;        /* 32px — desktop dashboard controls */
  --control-height-md: 2.75rem;     /* 44px — the mobile floor */
  --control-height-lg: 3rem;        /* 48px — marketing CTAs */
  /* Spacing-scale aliases so `min-h-control-md` etc. exist as utilities.
     --control-height-* is the canonical name, and the name the specs cite;
     these three exist purely so no component needs `min-h-[2.75rem]`. */
  --spacing-control-sm: var(--control-height-sm);
  --spacing-control-md: var(--control-height-md);
  --spacing-control-lg: var(--control-height-lg);
  --spacing-touch: 2.75rem;         /* 44px — minimum hit target, always */
  --spacing-header: 4.5rem;         /* 72px marketing header */
  --spacing-header-app: 3.5rem;     /* 56px app header */

  /* --- icons: Lucide only, currentColor ---------------------------------- */
  --icon-size-sm: 1rem;             /* 16px — inline with text-sm */
  --icon-size-md: 1.25rem;          /* 20px — buttons, list rows */
  --icon-size-lg: 1.5rem;           /* 24px — section and category markers */
  --icon-stroke: 1.75;              /* Lucide default is 2; 1.75 sits better
                                       against DM Sans at small sizes */

  /* --- measures: text never spans the viewport --------------------------- */
  --container-page: 1200px;          /* marketing page */
  --container-app: 1440px;           /* dashboard shell — data wants room */
  --container-prose: 36rem;
  --container-narrow: 42rem;
  --container-form: 28rem;

  /* --- radii: one soft, small corner ------------------------------------- */
  --radius-sm: 2px;   /* nested items: menu rows, segmented controls */
  --radius-md: 4px;   /* the system's real radius — cards, buttons, inputs */
  --radius-lg: 8px;   /* dialogs, sheets, toasts */
  --radius-xl: 12px;  /* locale switcher trigger chip — softer than controls */
  --radius-2xl: 16px; /* locale switcher panel — floating, not a bordered menu */
  --radius-full: 9999px;

  /* --- elevation: the system is flat. Floating layers only. --------------
     --shadow-card is `none` BY DECISION, not by omission: a card is separated
     from its ground by a hairline. The name exists so conformant markup
     resolves instead of failing silently. */
  --shadow-card: none;
  --shadow-popover: 0 1px 2px rgb(51 51 51 / 0.06), 0 4px 12px rgb(51 51 51 / 0.08);
  --shadow-overlay: 0 1px 2px rgb(51 51 51 / 0.06), 0 8px 24px rgb(51 51 51 / 0.10);
  /* Widgets sit on an unknown host background and cannot rely on a hairline
     reading against it — this is the one place elevation is load-bearing. */
  --shadow-widget: 0 0 0 1px rgb(51 51 51 / 0.08), 0 2px 8px rgb(51 51 51 / 0.08);

  /* --- layers: one ordered scale, no ad-hoc z-index ----------------------
     Every stacking decision in the system is one of these six. A raw `z-50` in
     a component is a bug — it cannot be reasoned about against the others.
     Gaps of 100 leave room for a host page's own layers to interleave.

     Toast sits ABOVE modal on purpose: "saved", "failed to save" and
     "connection lost" must reach the user while a dialog is open. */
  --z-index-base: 0;
  --z-index-sticky: 100;     /* sticky table heads, app header */
  --z-index-dropdown: 200;   /* select, menu, popover, combobox */
  --z-index-overlay: 300;    /* the scrim behind a dialog */
  --z-index-modal: 400;      /* dialog, sheet, drawer */
  --z-index-toast: 500;
  --z-index-tooltip: 600;

  /* --- breakpoints ------------------------------------------------------- */
  --breakpoint-sm: 30rem;
  --breakpoint-md: 48rem;   /* 768px — the one real breakpoint */
  --breakpoint-lg: 64rem;
  --breakpoint-xl: 80rem;

  /* --- motion: functional, never decorative ------------------------------
     Two curves and three durations. `exit` is faster than `enter` — leaving
     should feel immediate, arriving should feel placed. Nothing in this system
     animates transform except the sheet and the spinner. */
  --default-transition-duration: 150ms;
  --default-transition-timing-function: ease;
  --ease-enter: cubic-bezier(0.2, 0, 0, 1);
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);
  --duration-fast: 120ms;    /* state change on a control */
  --duration-base: 150ms;    /* the default */
  --duration-slow: 220ms;    /* a layer entering or leaving */
}
[data-density="compact"] {
  --spacing-section: 1.5rem;
  --spacing-section-loose: 2rem;
  --spacing-section-tight: 1rem;
  --spacing-block: 0.75rem;
  --spacing-block-tight: 0.5rem;
  --spacing-stack: 0.5rem;
  --spacing-row: 0.375rem;
}
[data-density="default"] {
  --spacing-section: 2rem;
  --spacing-section-loose: 3rem;
  --spacing-section-tight: 1.5rem;
  --spacing-block: 1rem;
  --spacing-block-tight: 0.75rem;
  --spacing-stack: 0.75rem;
  --spacing-row: 0.5rem;
}
[data-density="comfortable"] {
  --spacing-section: 3.5rem;
  --spacing-section-loose: 5rem;
  --spacing-section-tight: 2rem;
  --spacing-block: 1.5rem;
  --spacing-block-tight: 1rem;
  --spacing-stack: 1rem;
  --spacing-row: 0.625rem;
}
.dark {
  --color-surface: var(--color-ink-900);
  --color-surface-muted: var(--color-ink-800);
  --color-surface-raised: var(--color-ink-800);
  --color-surface-sunken: var(--color-ink-700);
  --color-surface-inverse: var(--color-white);

  --color-text-primary: var(--color-white);
  --color-text-secondary: var(--color-slate-200);
  --color-text-muted: var(--color-slate-400);
  --color-text-inverse: var(--color-grey-800);

  --color-primary: var(--color-scout-blue-400);
  --color-primary-hover: var(--color-white);
  --color-primary-contrast: var(--color-grey-800);
  --color-accent: var(--color-scout-blue-400);
  --color-cta: var(--color-white);
  --color-cta-hover: color-mix(in oklab, var(--color-white) 88%, black);
  --color-cta-contrast: var(--color-grey-800);

  --color-border: var(--color-ink-700);
  --color-border-strong: var(--color-ink-600);
  --color-border-focus: var(--color-scout-blue-400);

  /* Rating hues hold their meaning; only track and neutral follow the surface. */
  --color-rating-empty: var(--color-ink-700);
  --color-rating-neutral: var(--color-slate-500);
}
/* font is self-hosted by the docs site; upstream @import kept for reference:
   @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400;1,9..40,600;1,9..40,700&display=swap'); */

/* Marketing page layer. Tokens come from tokens.css (mirrored from theme.css).
   This file declares no colour, type or measure of its own.
   Do not copy docs.css here — that chrome is not the design system. */

:root {
  --header-height: 72px;
}

*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  margin: 0;
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: 1.6;
  color: var(--color-text-primary);
  background-color: var(--color-surface);
}

img {
  max-width: 100%;
  height: auto;
  display: block;
  object-fit: contain;
}

a {
  color: inherit;
  text-decoration: none;
}

a:hover {
  color: var(--color-primary);
}

ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

h1, h2, h3, p {
  margin: 0;
}

:focus-visible {
  outline: 2px solid var(--color-border-focus);
  outline-offset: 2px;
}

.skip {
  position: absolute;
  left: 12px;
  top: 12px;
  z-index: var(--z-index-tooltip);
  padding: 8px 12px;
  background: var(--color-surface);
  color: var(--color-text-primary);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  transform: translateY(-160%);
}

.skip:focus {
  transform: none;
}

.container {
  width: 100%;
  max-width: var(--container-page);
  margin: 0 auto;
  padding-left: max(1rem, env(safe-area-inset-left, 0px));
  padding-right: max(1rem, env(safe-area-inset-right, 0px));
}

@media (min-width: 768px) {
  .container {
    padding-left: max(1.5rem, env(safe-area-inset-left, 0px));
    padding-right: max(1.5rem, env(safe-area-inset-right, 0px));
  }
}

/* Header — 72px, hairline, no shadow, no blur */
.site-header {
  position: sticky;
  top: 0;
  z-index: var(--z-index-sticky);
  height: var(--header-height);
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
}

.site-header__inner {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}

.site-header__brand {
  display: flex;
  align-items: center;
  flex: none;
}

.site-header__brand:hover {
  color: inherit;
}

.site-header__nav {
  display: none;
  align-items: center;
  gap: 0.25rem;
}

.site-header__link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 0.75rem;
  font-size: var(--text-ui);
  font-weight: 500;
  color: var(--color-text-secondary);
}

.site-header__link:hover {
  color: var(--color-text-primary);
}

.site-header__cta {
  flex: none;
}

@media (min-width: 768px) {
  .site-header__nav {
    display: flex;
    margin-left: auto;
    margin-right: 1rem;
  }
}

.eyebrow {
  font-size: var(--text-eyebrow);
  font-weight: 500;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--color-text-muted);
  line-height: 1.4;
}

.display {
  font-size: var(--text-display);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.03em;
  max-width: 20ch;
  hyphens: none;
  overflow-wrap: normal;
}

.display em {
  font-style: italic;
  font-weight: 400;
}

.section-heading {
  font-size: var(--text-h2);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.02em;
  text-wrap: balance;
  max-width: 22ch;
}

.section-heading em {
  font-style: italic;
  font-weight: 400;
}

.lead {
  font-size: var(--text-lead);
  line-height: 1.55;
  color: var(--color-text-secondary);
  max-width: 36rem;
  text-wrap: pretty;
}

.body-text {
  font-size: var(--text-base);
  line-height: 1.65;
  color: var(--color-text-secondary);
  max-width: 36rem;
  text-wrap: pretty;
}

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0.625rem 1.25rem;
  font-size: var(--text-ui);
  font-weight: 600;
  font-family: inherit;
  border-radius: var(--radius-md);
  border: 1px solid transparent;
  transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease;
  cursor: pointer;
  text-align: center;
}

.btn--primary {
  color: var(--color-cta-contrast);
  background: var(--color-cta);
  border-color: var(--color-cta);
}

.btn--primary:hover {
  background: var(--color-cta-hover);
  border-color: var(--color-cta-hover);
  color: var(--color-cta-contrast);
}

.btn--lg {
  min-height: 48px;
  padding: 0.75rem 1.5rem;
  font-size: var(--text-base);
}

.btn--text {
  color: var(--color-primary);
  background: transparent;
  border: none;
  padding: 0;
  min-height: 44px;
  font-weight: 500;
}

.btn--text:hover {
  color: var(--color-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem 1.25rem;
  margin-top: 1.5rem;
}

.section[id] {
  scroll-margin-top: var(--header-height);
}

.section {
  padding-block: var(--spacing-section-tight);
}

@media (min-width: 768px) {
  .section {
    padding-block: var(--spacing-section);
  }
}

.section--loose {
  padding-block: var(--spacing-section-tight);
}

@media (min-width: 768px) {
  .section--loose {
    padding-block: var(--spacing-section-loose);
  }
}

.section--muted {
  background: var(--color-surface-muted);
}

.section--inverse {
  background: var(--color-surface-inverse);
  color: var(--color-text-inverse);
}

.section--inverse .eyebrow {
  color: inherit;
  opacity: 0.7;
}

.section--inverse .lead,
.section--inverse .body-text {
  color: inherit;
  opacity: 0.86;
}

.section--inverse .btn--primary {
  background: var(--color-surface);
  border-color: var(--color-surface);
  color: var(--color-text-primary);
}

.section--inverse .btn--primary:hover {
  background: var(--color-surface-muted);
  border-color: var(--color-surface-muted);
  color: var(--color-text-primary);
}

.section--inverse .btn--text {
  color: inherit;
}

.section--border {
  border-top: 1px solid var(--color-border);
}

.hero {
  display: flex;
  align-items: center;
}

@media (min-width: 768px) {
  .hero {
    min-height: calc(100svh - var(--header-height));
  }
}

.hero .eyebrow {
  margin-bottom: 1rem;
}

.hero .display {
  margin-bottom: 1.25rem;
}

.stat-card {
  max-width: 36rem;
  padding: 0 0 0 1.25rem;
  border-left: 3px solid var(--color-primary);
}

.stat-card__text {
  font-size: var(--text-lead);
  font-weight: 600;
  line-height: 1.45;
  color: var(--color-text-primary);
}

.stat-card__source {
  margin-top: 0.75rem;
  font-size: var(--text-caption);
  font-weight: 500;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--color-text-muted);
  line-height: 1.5;
}

.proof-band {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
  padding-block: 1.5rem;
  border-top: 1px solid var(--color-border);
  border-bottom: 1px solid var(--color-border);
}

.proof-band__item {
  font-size: var(--text-sm);
  line-height: 1.55;
  color: var(--color-text-secondary);
}

@media (min-width: 768px) {
  .proof-band {
    grid-template-columns: repeat(3, 1fr);
    gap: 1.5rem;
  }
}

.steps {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
  margin-top: 1.25rem;
  padding: 0;
  max-width: 36rem;
}

.step {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 1rem;
  align-items: start;
}

.step__num {
  flex-shrink: 0;
  width: 1.75rem;
  height: 1.75rem;
  display: grid;
  place-items: center;
  font-size: var(--text-meta);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  background: var(--color-surface-inverse);
  color: var(--color-text-inverse);
  border-radius: 9999px;
}

.step__title {
  font-weight: 600;
  color: var(--color-text-primary);
  margin-bottom: 0.25rem;
}

.step__body {
  font-size: var(--text-ui);
  line-height: 1.6;
  color: var(--color-text-secondary);
}

.rule-list {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-top: 1rem;
  max-width: 36rem;
}

.rule-list li {
  font-size: var(--text-base);
  line-height: 1.6;
  color: var(--color-text-secondary);
  padding-left: 1rem;
  border-left: 2px solid var(--color-border);
}

.two-col {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
  margin-top: 1.5rem;
}

@media (min-width: 768px) {
  .two-col {
    grid-template-columns: 1fr 1fr;
    align-items: start;
  }
}

/* Debrief specimen — media lives on surface-sunken, never a 3D mock */
.debrief {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: 1.5rem;
}

.debrief__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
  margin-bottom: 1.25rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--color-border);
}

.debrief__title {
  font-size: var(--text-h4);
  font-weight: 600;
}

.debrief__sub {
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
}

.score {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.75rem 0.875rem;
  align-items: center;
  padding-block: 0.625rem;
}

.score + .score {
  border-top: 1px solid var(--color-border);
}

.score__icon {
  color: var(--color-primary);
  display: grid;
  place-items: center;
}

.score__icon svg {
  width: 20px;
  height: 20px;
  stroke-width: 1.75;
}

.score__label {
  font-size: var(--text-sm);
  font-weight: 600;
}

.score__row {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  grid-column: 2;
}

.score__track {
  flex: 1;
  height: 8px;
  border-radius: 9999px;
  background: var(--color-rating-empty);
  overflow: hidden;
}

.score__fill {
  height: 100%;
  border-radius: 9999px;
}

.score__value {
  min-width: 2.25rem;
  text-align: right;
  font-size: var(--text-sm);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

.debrief__caption {
  margin-top: 1rem;
  font-size: var(--text-caption);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.faq-list {
  display: flex;
  flex-direction: column;
  margin-top: 1.25rem;
  max-width: 40rem;
  border-top: 1px solid var(--color-border);
}

.faq {
  border-bottom: 1px solid var(--color-border);
}

.faq > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-height: 52px;
  padding: 0.75rem 0;
  font-size: var(--text-ui);
  font-weight: 500;
  color: var(--color-text-primary);
  cursor: pointer;
  list-style: none;
}

.faq > summary::-webkit-details-marker {
  display: none;
}

.faq__ico {
  flex: none;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  color: var(--color-text-muted);
}

.faq__ico svg {
  width: 18px;
  height: 18px;
}

.faq__ico svg:last-child {
  display: none;
}

.faq[open] .faq__ico svg:first-child {
  display: none;
}

.faq[open] .faq__ico svg:last-child {
  display: block;
}

.faq__body {
  margin: 0;
  padding: 0 0 1.125rem;
  font-size: var(--text-base);
  line-height: 1.65;
  color: var(--color-text-secondary);
  max-width: 36rem;
}

.site-footer {
  padding-block: 2.5rem;
  border-top: 1px solid var(--color-border);
  background: var(--color-surface);
}

.site-footer__note {
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  max-width: 36rem;
}

.site-footer__note a {
  color: var(--color-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.footer-heading {
  font-size: var(--text-eyebrow);
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  margin-bottom: 1rem;
}

.stack-lg > * + * {
  margin-top: 1.25rem;
}

.request-form {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  margin-top: 2rem;
  max-width: 28rem;
}

.request-form .field {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  font-size: var(--text-sm);
  font-weight: 500;
}

.request-form .field input {
  min-height: 44px;
  padding: 0.625rem 0.75rem;
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  background: var(--color-surface);
  color: var(--color-text-primary);
  font-family: inherit;
  font-size: var(--text-base);
}

.request-form .field input:hover {
  border-color: var(--color-text-primary);
}

.request-form .check {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  min-height: 44px;
  font-size: var(--text-sm);
  font-weight: 400;
  line-height: 1.45;
}

.request-form .check input {
  width: 1.25rem;
  height: 1.25rem;
  margin-top: 0.15rem;
  flex: none;
  accent-color: var(--color-cta);
}

.request-form .check a {
  color: var(--color-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.section--inverse .request-form .field,
.section--inverse .request-form .check {
  color: inherit;
}

.section--inverse .request-form .check a {
  color: inherit;
}

.theme-block + .theme-block {
  margin-top: 1.25rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--color-border);
}

/* Side nav shell template — Sporting Scouter organiser frame (page.css only) */
.sn {
  position: relative;
  display: flex;
  min-height: 100vh;
  max-width: 100vw;
  background: var(--color-surface-muted);
  --sn-width: 256px;
  --sn-rail: 64px;
}
.sn__scrim {
  display: none;
  position: fixed;
  inset: 0;
  z-index: calc(var(--z-index-dropdown) - 1);
  background: color-mix(in srgb, var(--color-text-primary) 45%, transparent);
}
.sn[data-sn-mobile="true"] .sn__scrim:not([hidden]) { display: block; }
.sn__rail {
  width: var(--sn-width);
  flex: none;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  border-right: 1px solid var(--color-border);
  background: var(--color-surface);
  transition: width var(--duration-base, 150ms) ease, transform var(--duration-base, 150ms) ease;
}
.sn--collapsed .sn__rail { width: var(--sn-rail); }
.sn--collapsed .sn__t,
.sn--collapsed .sn__brandname,
.sn--collapsed .sn__orgtxt,
.sn--collapsed .sn__chev,
.sn--collapsed .sn__count,
.sn--collapsed .sn__seclbl,
.sn--collapsed .sn__group-hd .sn__chev { display: none; }
.sn--collapsed .sn__rule { opacity: 0; }
.sn--collapsed .sn__row,
.sn--collapsed .sn__org,
.sn--collapsed .sn__brand { justify-content: center; }
.sn--collapsed .sn__head {
  flex-direction: column;
  align-items: stretch;
  padding-right: 0;
  gap: 0;
}
.sn--collapsed .sn__brand {
  flex: none;
  padding: 10px 0;
}
.sn--collapsed .sn__head-collapse {
  width: 100%;
  min-height: 40px;
  margin-left: 0;
  border-top: 1px solid var(--color-border);
  border-radius: 0;
}
.sn__rail-inner { display: flex; flex-direction: column; min-height: 0; flex: 1; min-width: 0; height: 100%; }
.sn__head {
  flex: none;
  display: flex;
  align-items: stretch;
  gap: 4px;
  border-bottom: 1px solid var(--color-border);
  padding-right: 4px;
}
.sn__brand {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 56px;
  padding: 8px 12px;
  border: 0;
  background: none;
  font: inherit;
  text-align: left;
  text-decoration: none;
  color: inherit;
  min-width: 0;
}
.sn__brand:hover { color: inherit; }
.sn__brand:focus-visible {
  outline: 2px solid var(--color-border-focus);
  outline-offset: -2px;
}
.sn__brandmark {
  flex: none;
  display: block;
  width: 16px;
  height: 22px;
  object-fit: contain;
}
.sn__brandname { font-size: var(--text-sm); font-weight: 600; line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sn__org {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 56px;
  padding: 8px 10px;
  border: 0;
  background: none;
  font: inherit;
  text-align: left;
  cursor: pointer;
  color: inherit;
  min-width: 0;
}
.sn__org:hover { background: var(--color-surface-muted); }
.sn__orgmark {
  flex: none;
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-surface-muted);
}
.sn__orgtxt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; text-align: left; }
.sn__orgname { font-size: var(--text-sm); font-weight: 600; line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sn__orgmeta {
  font-size: var(--text-eyebrow);
  line-height: 1.2;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: var(--tracking-eyebrow);
}
.sn__head-collapse {
  flex: none;
  align-self: center;
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: var(--radius-sm);
  background: none;
  cursor: pointer;
  color: var(--color-text-muted);
}
.sn__head-collapse:hover { background: var(--color-surface-muted); color: var(--color-text-primary); }
.sn[data-sn-mobile="true"] .sn__head-collapse { display: none; }
.sn__act { flex: none; padding: 4px 8px 0; }
.sn__rule {
  flex: none;
  height: 1px;
  margin: 8px 12px 4px;
  background: var(--color-border);
}
.sn__scroll { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 4px 8px 12px; }
.sn__nav { display: block; }
.sn__seclbl {
  padding: 14px 10px 4px;
  font-size: var(--text-eyebrow);
  font-weight: 600;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.sn__group { margin-top: 2px; }
.sn__group--nested { margin-top: 0; }
.sn__group-hd {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: 40px;
  padding: 0 10px;
  border: 0;
  background: none;
  font: inherit;
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--color-text-secondary);
  cursor: pointer;
  border-radius: var(--radius-sm);
  text-align: left;
}
.sn__group-hd--nav { font-weight: 600; color: var(--color-text-primary); min-height: 44px; }
.sn__group-hd .sn__ico { flex: none; }
.sn__group-hd--nav .sn__ico { color: var(--color-text-secondary); }
.sn__group-hd:hover .sn__ico { color: var(--color-text-secondary); }
.sn__group-hd--nested {
  font-weight: 500;
  color: var(--color-text-secondary);
  min-height: 36px;
  font-size: var(--text-meta);
}
.sn__group-hd:hover { background: var(--color-surface-muted); }
.sn__group-hd--closed .sn__chev { transform: rotate(180deg); }
.sn__chev { margin-left: auto; display: flex; color: var(--color-text-muted); transition: transform var(--duration-base, 150ms) ease; flex: none; }
.sn__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.sn__list--sub { padding-left: 8px; }
.sn__list--depth-2 {
  padding-left: 0;
  margin-left: 10px;
  border-left: 1px solid var(--color-border);
  padding-top: 2px;
  padding-bottom: 2px;
}
.sn__list--depth-3 {
  padding-left: 0;
  margin-left: 10px;
  border-left: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
  padding-top: 2px;
  padding-bottom: 2px;
}
.sn__list--depth-2 > li,
.sn__list--depth-3 > li { padding-left: 8px; }
.sn__list[hidden] { display: none; }
.sn__org-meta-nav--end {
  margin-bottom: 6px;
  padding-bottom: 4px;
  border-bottom: 1px solid color-mix(in srgb, var(--color-border) 65%, transparent);
}
.sn__foot .sn__row:not(.sn__row--user) { min-height: 36px; }
.sn__list--depth-2 .sn__row,
.sn__list--depth-3 .sn__row {
  min-height: 36px;
  padding-left: 8px;
  font-size: var(--text-meta);
}
.sn__list--depth-2 .sn__row--current,
.sn__list--depth-3 .sn__row--current {
  font-size: var(--text-sm);
}
.sn__row {
  position: relative;
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-height: 44px;
  padding: 0 10px;
  border: 0;
  background: none;
  border-radius: var(--radius-sm);
  font: inherit;
  font-size: var(--text-sm);
  color: var(--color-text-secondary);
  text-decoration: none;
  text-align: left;
  cursor: pointer;
}
.sn__row:hover { background: var(--color-surface-muted); color: var(--color-text-primary); }
.sn__row--current,
.sn__row[aria-current="page"] {
  background: var(--color-surface-muted);
  color: var(--color-text-primary);
  font-weight: 600;
  box-shadow: inset 2px 0 0 var(--color-primary);
}
.sn__ico { flex: none; display: flex; width: 20px; justify-content: center; color: var(--color-text-muted); }
.sn__row:hover .sn__ico,
.sn__row--current .sn__ico { color: var(--color-text-secondary); }
.sn__count {
  margin-left: auto;
  font-size: var(--text-meta);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-muted);
}
.sn__count--warn { color: var(--color-warning-fill); font-weight: 600; }
.sn__foot { flex: none; border-top: 1px solid var(--color-border); padding: 8px; display: flex; flex-direction: column; gap: 2px; background: var(--color-surface); }
.sn__foot-locale {
  flex: none;
  display: block;
  width: 100%;
  position: relative;
  overflow: visible;
}
.sn__foot-locale summary.sn__row {
  list-style: none;
}
.sn__foot-locale summary.sn__row::-webkit-details-marker { display: none; }
.sn__foot-locale summary.sn__row .sn__t {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sn__foot-locale[open] summary.sn__row {
  background: var(--color-surface-muted);
  color: var(--color-text-primary);
}
.sn__foot-locale[open] summary.sn__row .sn__ico { color: var(--color-text-secondary); }

/* Locale switcher panel (trigger uses sn__row in shell foot) */
.ls.ls { position: relative; display: inline-block; flex-shrink: 0; }
.ls .ls__trigger {
  display: inline-flex;
  width: max-content;
  min-height: var(--spacing-touch);
  cursor: pointer;
  list-style: none;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
  border-radius: var(--radius-xl);
  background: var(--color-surface-muted);
  padding: 10px 12px;
  font-size: var(--text-sm);
  font-weight: 500;
  color: var(--color-text-primary);
}
.ls .ls__trigger::-webkit-details-marker { display: none; }
.ls .ls__trigger:focus { outline: none; }
.ls .ls__trigger:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: 2px; }
.ls .ls__icon { flex: none; color: var(--color-text-muted); }
.ls .ls__label { white-space: nowrap; }
.ls .ls__panel {
  position: absolute;
  z-index: var(--z-index-dropdown);
  min-width: 14rem;
  width: max-content;
  max-width: calc(100vw - 2rem);
  border-radius: var(--radius-2xl);
  background: var(--color-surface);
  padding: 8px 0;
  box-shadow: var(--shadow-popover);
}
.ls .ls__list { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; }
.ls .ls__link {
  display: block;
  padding: 10px 16px;
  font-size: var(--text-sm);
  color: var(--color-text-primary);
  text-decoration: none;
}
.ls .ls__link:hover { background: var(--color-surface-muted); }
.ls .ls__link:focus { outline: none; }
.ls .ls__link:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: -2px; }
.ls .ls__link--current { font-weight: 500; }
.ls.ls--up .ls__panel { bottom: 100%; left: 0; margin-bottom: 6px; }
.ls.ls--down .ls__panel { top: 100%; left: 0; margin-top: 6px; }
.ls.ls--align-end .ls__panel { left: auto; right: 0; }
.sn__row--user { align-items: center; }
.sn__row--user .sn__t { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sn__avatar {
  flex: none;
  width: 28px;
  height: 28px;
  border-radius: var(--radius-full);
  border: 1px solid var(--color-border);
  background: var(--color-surface-muted);
  color: var(--color-text-muted);
  display: grid;
  place-items: center;
}
.sn__resize { width: 6px; flex: none; cursor: col-resize; touch-action: none; background: transparent; align-self: stretch; }
.sn__resize:hover,
.sn__resize:focus-visible { background: var(--color-border); }
.sn__main-col { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 100vh; }
.sn__mobbar {
  display: none;
  align-items: center;
  gap: 10px;
  min-height: 56px;
  padding: 0 12px 0 16px;
  border-bottom: 1px solid var(--color-border);
  background: var(--color-surface);
  position: sticky;
  top: 0;
  z-index: var(--z-index-sticky);
}
.sn[data-sn-mobile="true"] .sn__mobbar {
  display: flex;
  align-items: center;
  min-height: 56px;
  padding: 8px 12px 8px 16px;
}
.sn[data-sn-mobile="true"] .sn__resize { display: none; }
.sn__mobbrand {
  flex: none;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
  max-width: min(46vw, 11rem);
  color: inherit;
  text-decoration: none;
}
.sn__mobbrand:hover { color: inherit; }
.sn__mobbrand:focus-visible {
  outline: 2px solid var(--color-border-focus);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
.sn__mobbrand .sn__brandname {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sn[data-sn-mobile="true"] .sn__mobbrand .sn__brandname { display: none; }
.sn[data-sn-mobile="true"] .sn__mobbrand { max-width: none; gap: 0; }
.sn__burger {
  flex: none;
  width: 44px;
  height: 44px;
  margin-left: auto;
  display: grid;
  place-items: center;
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  background: var(--color-surface);
  cursor: pointer;
  color: var(--color-text-primary);
}

.sn__crumb {
  margin: 0;
  flex: 1;
  min-width: 0;
  font-size: var(--text-sm);
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
  color: var(--color-text-secondary);
}
.sn[data-sn-mobile="true"] .sn__crumb {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  white-space: normal;
  overflow: visible;
  text-overflow: unset;
  line-height: 1.25;
}
.sn[data-sn-mobile="true"] .sn__crumb-event {
  display: block;
  max-width: 100%;
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--color-text-primary);
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sn[data-sn-mobile="true"] .sn__crumb-edition {
  display: block;
  width: 100%;
  font-size: var(--text-meta);
  font-weight: 500;
  color: var(--color-text-muted);
  text-align: center;
}
.sn[data-sn-view="org"] .sn__crumb-edition { display: none; }
.sn[data-sn-view="org"] .sn__crumb-event {
  font-size: var(--text-sm);
  font-weight: 600;
  white-space: normal;
  overflow: visible;
  text-overflow: unset;
}
.sn[data-sn-view="org"] .sn__wtabs { display: none; }
.sn[data-sn-view="org"] .sn__workspace-hd { padding-bottom: 0; border-bottom: 0; }
.sn[data-sn-mobile="true"][data-sn-view="org"] .sn__workspace-hd { display: none; }
.sn__main { flex: 1; min-width: 0; background: var(--color-surface); }
.sn__main-inner {
  padding: 24px 20px 48px;
  max-width: var(--container-page);
}
@media (min-width: 768px) {
  .sn__main-inner { padding: 32px 40px 64px; }
}
.sn__eyebrow {
  font-size: var(--text-eyebrow);
  font-weight: 600;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.sn__title { margin: 8px 0 0; font-size: var(--text-h2); font-weight: 600; letter-spacing: -0.02em; line-height: 1.2; }
.sn__lead { margin: 12px 0 0; max-width: 36rem; font-size: var(--text-sm); line-height: 1.6; color: var(--color-text-secondary); }
.sn__stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  margin-top: 28px;
  background: var(--color-border);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  overflow: hidden;
}
@media (max-width: 479px) {
  .sn__stats { grid-template-columns: minmax(0, 1fr); }
}
.sn__stat { background: var(--color-surface); padding: 16px 18px; }
.sn__stat-val { font-size: var(--text-h3); font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
.sn__stat-lbl {
  margin-top: 4px;
  font-size: var(--text-eyebrow);
  font-weight: 500;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--color-text-muted);
}
.sn__panel {
  margin-top: 28px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-surface);
  padding: 16px 18px;
}
.sn__panel-h { margin: 0; font-size: var(--text-ui); font-weight: 600; }
.sn__feed { list-style: none; margin: 12px 0 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.sn__feed li { display: flex; flex-direction: column; gap: 2px; padding-bottom: 12px; border-bottom: 1px solid var(--color-border); }
.sn__feed li:last-child { border-bottom: 0; padding-bottom: 0; }
.sn__feed-title { font-size: var(--text-sm); font-weight: 600; }
.sn__feed-meta { font-size: var(--text-meta); color: var(--color-text-muted); }
.sn__workspace-hd {
  flex: none;
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
  padding: 16px 20px 0;
}
@media (min-width: 768px) {
  .sn__workspace-hd { padding: 20px 40px 0; }
}
.sn__wctx {
  margin: 0 0 4px;
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--color-text-primary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.sn[data-sn-mobile="true"] .sn__wctx { display: none; }
.sn[data-sn-mobile="true"] .sn__workspace-hd { padding-top: 0; }
.sn__wtabs {
  display: flex;
  gap: 20px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: thin;
  -webkit-overflow-scrolling: touch;
}
@media (max-width: 767px) {
  .sn__wtabs { gap: 14px; }
  .sn__wtab { font-size: var(--text-meta); padding: 12px 0 8px; }
}
.sn__wtab {
  flex: none;
  border: 0;
  background: none;
  padding: 14px 0 10px;
  color: var(--color-text-secondary);
  font: 500 var(--text-ui)/1.6 var(--font-sans);
  text-decoration: none;
  box-shadow: inset 0 -2px 0 transparent;
  cursor: pointer;
}
.sn__wtab:hover { color: var(--color-text-primary); }
.sn__wtab--current,
.sn__wtab[aria-selected="true"] {
  color: var(--color-text-primary);
  font-weight: 600;
  box-shadow: inset 0 -2px 0 var(--color-text-primary);
}
.sn__wsub {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  padding: 0 0 12px;
  border-top: 1px solid var(--color-border);
  margin-top: -1px;
  padding-top: 10px;
}
.sn__wsub[hidden] { display: none; }
.sn__wsub-tab {
  flex: none;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-full);
  background: transparent;
  padding: 0 12px;
  min-height: var(--control-height-sm);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--color-text-secondary);
  font: 500 var(--text-meta)/1 var(--font-sans);
  text-decoration: none;
  cursor: pointer;
}
.sn__wsub-tab--current,
.sn__wsub-tab[aria-selected="true"] {
  background: var(--color-surface-muted);
  color: var(--color-text-primary);
  font-weight: 600;
}
.sn__wsub-badge {
  font-size: var(--text-caption);
  font-weight: 600;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: var(--tracking-eyebrow);
}
.sn svg { display: block; }

@media (max-width: 767px) {
  .sn { flex-direction: column; }
  .sn__rail {
    position: fixed;
    top: 0;
    left: 0;
    z-index: var(--z-index-dropdown);
    width: min(100%, 320px);
    max-width: 100%;
    min-height: 100vh;
    max-height: 100vh;
    box-shadow: var(--shadow-popover);
    transform: translateX(-105%);
  }
  .sn__rail[hidden] { display: none; }
  .sn--drawer-open .sn__rail { transform: translateX(0); }
  .sn--drawer-open .sn__rail[hidden] { display: flex; }
  .sn__main-col { min-height: 0; width: 100%; }
}

/* Login template — inverse form panel + cover. Tokens only. */
.auth {
  height: 100dvh;
  min-height: 100dvh;
  display: flex;
  padding: var(--spacing-block-tight);
  background: var(--color-surface);
  color: var(--color-text-primary);
  color-scheme: light;
  overflow: hidden;
}

.auth__frame {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-xl);
  background: var(--color-surface);
  overflow: auto;
}

.auth__panel {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-section-tight);
  min-height: calc(100dvh - (var(--spacing-block-tight) * 2));
  padding: var(--spacing-section-tight);
  padding-left: max(var(--spacing-section-tight), env(safe-area-inset-left, 0px));
  padding-right: max(var(--spacing-section-tight), env(safe-area-inset-right, 0px));
  padding-bottom: max(var(--spacing-section-tight), env(safe-area-inset-bottom, 0px));
}

.auth__brand {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-stack);
  align-self: flex-start;
  font-size: var(--text-ui);
  font-weight: 600;
  line-height: 1.2;
  color: var(--color-text-primary);
}

.auth__brand:hover {
  color: var(--color-text-primary);
}

.auth__brand img {
  width: 15px;
  height: 20px;
  flex: none;
}

.auth__body {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  width: 100%;
  max-width: var(--container-form);
}

.auth__title {
  font-size: var(--text-h2);
  font-weight: 600;
  line-height: var(--text-h2--line-height);
  letter-spacing: var(--text-h2--letter-spacing);
}

.auth__lead {
  margin-top: var(--spacing-stack);
  font-size: var(--text-sm);
  line-height: var(--text-sm--line-height);
  color: var(--color-text-muted);
}

.auth__form {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-block);
  margin-top: var(--spacing-section-tight);
}

.auth__field {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-row);
  min-width: 0;
}

.auth__label {
  font-size: var(--text-sm);
  font-weight: 500;
  line-height: var(--text-sm--line-height);
  color: var(--color-text-primary);
}

.auth__req {
  margin-inline-start: var(--spacing);
  color: var(--color-destructive);
}

.auth__vh {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.auth__control {
  width: 100%;
  min-height: var(--control-height-md);
  padding: 0.625rem 0.75rem;
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: var(--text-base--line-height);
  color: var(--color-text-primary);
  background: transparent;
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
}

.auth__control::placeholder {
  color: var(--color-text-muted);
}

.auth__control:hover {
  border-color: var(--color-text-primary);
}

.auth__control:focus-visible {
  border-color: var(--color-border-focus);
}

.auth__submit {
  width: 100%;
}

.auth__foot {
  margin: 0;
  font-size: var(--text-sm);
  line-height: var(--text-sm--line-height);
  color: var(--color-text-muted);
}

.auth__signup {
  color: var(--color-primary);
  font-weight: 500;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.auth__signup:hover {
  color: var(--color-primary-hover);
}

.auth__legal {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  margin-top: var(--spacing-stack);
  font-size: var(--text-meta);
  line-height: var(--text-meta--line-height);
}

.auth__legal a {
  color: var(--color-text-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.auth__legal a:hover {
  color: var(--color-primary);
}

.auth__legal-sep {
  padding-inline: var(--spacing-stack);
  color: var(--color-text-muted);
  user-select: none;
}

.auth__media {
  display: none;
}

@media (min-width: 768px) {
  .auth__frame {
    flex-direction: row;
  }

  .auth__panel {
    flex: 5 1 0;
    min-height: 0;
  }

  .auth__frame {
    overflow: hidden;
  }

  .auth__media {
    display: flex;
    flex: 6 1 0;
    min-width: 0;
    min-height: 0;
    padding: var(--spacing-block);
  }

  .auth__cover {
    position: relative;
    flex: 1;
    min-width: 0;
    min-height: 0;
    margin: 0;
    border-radius: var(--radius-xl);
    overflow: hidden;
    background: var(--color-surface-sunken);
  }

  .auth__cover img {
    width: 100%;
    height: 100%;
    min-height: 0;
    max-width: none;
    object-fit: cover;
    object-position: center;
  }

  .auth__scrim {
    position: absolute;
    inset: 0;
    background: linear-gradient(
      to top,
      color-mix(in oklab, var(--color-surface) 82%, transparent) 0%,
      color-mix(in oklab, var(--color-surface) 36%, transparent) 42%,
      transparent 68%
    );
  }

  .auth__message {
    position: absolute;
    inset-inline: 0;
    inset-block-end: 0;
    margin: 0;
    padding: var(--spacing-section-tight);
    color: var(--color-text-primary);
  }

  .auth__message-title {
    margin: 0;
    font-size: var(--text-h2);
    font-weight: 700;
    line-height: var(--text-h2--line-height);
    letter-spacing: var(--text-h2--letter-spacing);
    max-width: 16ch;
  }

  .auth__message-title em {
    font-style: italic;
    font-weight: 400;
  }

  .auth__message-lead {
    margin: var(--spacing-stack) 0 0;
    font-size: var(--text-sm);
    line-height: var(--text-sm--line-height);
    max-width: 28ch;
    color: var(--color-text-secondary);
  }
}

/* --- dashboard home template ---------------------------------------------------
   Plain-CSS mirrors of the recipes this template composes: card, button (the existing
   .btn), table, badge, progressBar and scoreBar, plus the page's own layout. Tokens only:
   no hex, no rgb(). Rating colours exist only as --color-rating-* custom properties.
   Small text never takes a status colour (the status text tokens do not meet AA on the dark
   ground), so a badge shows its tone as a tinted fill and a border, with ink text. */
.dh { display: flex; flex-direction: column; gap: 24px; max-width: 72rem }
.dh-view[hidden] { display: none }
.dh-view { display: flex; flex-direction: column; gap: 24px }
.dh-view > .sn__title { margin: 0 }
.dh-view > .sn__lead { margin: -12px 0 0 }
.dh-view > h1[tabindex="-1"]:focus { outline: none }

/* The demo switcher: chrome of this model page, not part of the dashboard. */
.dh-demo { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-bottom: 16px; border-bottom: 1px solid var(--color-border) }
.dh-demo__lbl { margin-right: 4px; font-size: var(--text-eyebrow); font-weight: 500; letter-spacing: var(--tracking-eyebrow); text-transform: uppercase; color: var(--color-text-muted) }
.dh-demo__btn { min-height: 44px; padding: 0 14px; border: 1px solid var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text-primary); font: inherit; font-size: var(--text-sm); font-weight: 500; cursor: pointer }
.dh-demo__btn[aria-pressed="true"] { background: var(--color-surface-inverse); border-color: var(--color-surface-inverse); color: var(--color-text-inverse) }
.dh-demo__btn:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: 2px }

.dh-grid { display: grid; gap: 24px; grid-template-columns: minmax(0, 1fr) }
@media (min-width: 1024px) { .dh-grid--aside { grid-template-columns: minmax(0, 1fr) 20rem } }
.dh-col { display: flex; flex-direction: column; gap: 24px; min-width: 0 }

/* card() */
.dh-card { display: flex; flex-direction: column; gap: var(--spacing-stack); min-width: 0; padding: var(--spacing-block); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface-raised) }
.dh-card > .stg { margin: 0 }
.dh-card__head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px }
.dh-card__title { margin: 0; font-size: var(--text-lead); font-weight: 600; line-height: 1.45; color: var(--color-text-primary) }
.dh-hero { gap: 12px }
.dh-hero__title { margin: 0; max-width: 40rem; font-size: var(--text-h3); font-weight: 600; line-height: 1.35; color: var(--color-text-primary) }
.dh-eyebrow { margin: 0; font-size: var(--text-eyebrow); font-weight: 500; letter-spacing: var(--tracking-eyebrow); text-transform: uppercase; color: var(--color-text-muted) }
.dh-small { margin: 0; font-size: var(--text-sm); line-height: 1.55; color: var(--color-text-secondary); text-wrap: pretty }
.dh-muted { color: var(--color-text-muted) }
.dh-list { margin: 0; padding-left: 18px; list-style: disc; font-size: var(--text-sm); line-height: 1.7; color: var(--color-text-secondary) }
.dh-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px }
.dh-link { color: var(--color-primary); font-size: var(--text-sm); font-weight: 500; text-decoration: none }
.dh-link:hover { text-decoration: underline }
.dh-link:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: 2px; border-radius: 2px }
@media (pointer: coarse) {
  .dh-link { display: inline-flex; align-items: center; min-height: 44px }
}

/* button(): the secondary variant, which page.css does not have (a bare .btn has no border and no fill) */
.btn--secondary { color: var(--color-text-primary); background: transparent; border-color: var(--color-border-strong) }
.btn--secondary:hover { border-color: var(--color-text-primary) }
.btn--secondary:active { background: var(--color-surface-muted) }

/* progressBar() */
.dh-progress { height: 8px; overflow: hidden; border-radius: 9999px; background: var(--color-surface-sunken) }
.dh-progress > i { display: block; height: 100%; border-radius: inherit; background: var(--color-primary) }

/* table(): eyebrow head, hairline rows, numeric columns right-aligned and tabular */
.dh-table-wrap { overflow-x: auto }
.dh-table-wrap:focus-visible { outline: 2px solid var(--color-border-focus); outline-offset: 2px }
.dh-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm) }
.dh-table th { padding: var(--spacing-row) 12px; text-align: left; vertical-align: bottom; white-space: nowrap; font-size: var(--text-eyebrow); font-weight: 600; letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--color-text-muted); border-bottom: 1px solid var(--color-border) }
.dh-table td { padding: var(--spacing-row) 12px; vertical-align: top; color: var(--color-text-secondary); border-bottom: 1px solid var(--color-border) }
.dh-table tr:last-child td { border-bottom: 0 }
.dh-table .dh-n { text-align: right; font-variant-numeric: tabular-nums }
.dh-sub { display: none; margin-top: 2px; font-size: var(--text-meta); color: var(--color-text-muted) }
@media (max-width: 639px) {
  .dh-sub { display: block }
  .dh-col-company { display: none }
}

/* badge(): a label, always uppercase */
.dh-badge { display: inline-flex; align-items: center; padding: 4px 8px; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface-muted); font-size: var(--text-eyebrow); font-weight: 500; letter-spacing: var(--tracking-caps); text-transform: uppercase; white-space: nowrap; color: var(--color-text-primary) }
.dh-badge--success { background: var(--color-success-subtle); border-color: var(--color-success-fill) }
.dh-badge--destructive { background: var(--color-destructive-subtle); border-color: var(--color-destructive-fill) }

/* scoreBar() cell: the fill takes the tier of the figure beside it, never a hand-picked colour */
.dh-rate { display: inline-flex; align-items: center; gap: 12px }
.dh-bar { display: inline-block; width: 96px; height: 8px; overflow: hidden; border-radius: 9999px; background: var(--color-rating-empty) }
.dh-bar > i { display: block; height: 100%; border-radius: 9999px }
.dh-bar--excellent > i { background: var(--color-rating-excellent) }
.dh-bar--very-good > i { background: var(--color-rating-very-good) }
.dh-bar--good > i { background: var(--color-rating-good) }
.dh-bar--fair > i { background: var(--color-rating-fair) }
.dh-bar--poor > i { background: var(--color-rating-poor) }
.dh-num { font-weight: 600; font-variant-numeric: tabular-nums; color: var(--color-text-primary) }

/* Needs attention */
.dh-queue { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none }
.dh-queue > li { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; padding: 12px 0; border-bottom: 1px solid var(--color-border); font-size: var(--text-sm); color: var(--color-text-secondary) }
.dh-queue > li:last-child { border-bottom: 0 }
.dh-queue__text { min-width: 0; flex: 1 1 18rem }
.dh-queue__text b { color: var(--color-text-primary); font-weight: 600 }
.dh-queue__act { display: inline-flex; align-items: center; gap: 12px }

/* One company: the gauge beside the stats */
.dh-glance { display: flex; flex-wrap: wrap; align-items: center; gap: 24px 32px }
.dh-glance__gauge { display: grid; justify-items: center; gap: 8px }
.dh-glance > .stg { flex: 1 1 18rem; margin: 0 }

/* The utility the shared mirrors (steps, stat) rely on; the docs bundle has its own. */
.visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0 }

/* Shared mirrors: plain-CSS copies of recipes that BOTH the docs site (app.css) and the template pages
   (page.css) need. Each block mirrors a recipe in ui/src/primitives/ or lib/; change them together. */

/* --- gauge ---------------------------------------------------------------- */
.gg__row.gg__row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 34px }
.gg__cell.gg__cell { display: grid; justify-items: center; gap: 10px }
.gg__lbl.gg__lbl { font-weight: 500; font-size: var(--text-caption); letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--color-text-muted) }
.gg.gg { display: block; overflow: visible }
.gg .gg__track { fill: none; stroke: var(--color-border) }
.gg .gg__arc { fill: none; stroke-linecap: round; transform: rotate(-90deg); transform-origin: 50% 50% }
/* Mirrors the recipe: the ring animates only when motion is allowed, and never longer than --duration-base. */
@media (prefers-reduced-motion: no-preference) {
  .gg .gg__arc { transition: stroke-dasharray var(--duration-base) var(--ease-enter), stroke var(--duration-base) var(--ease-enter) }
}
.gg[width="96"] circle { stroke-width: 8 }
.gg[width="64"] circle { stroke-width: 6 }
.gg[width="40"] circle { stroke-width: 4 }
.gg .gg__val { text-anchor: middle; font-family: var(--font-sans); font-size: 20px; font-weight: 600; letter-spacing: -.02em; fill: var(--color-text-primary) }
.gg .gg__val--md { font-size: 17px }
.gg .gg__val--sm { font-size: 13px }
.gg .gg__val--none { fill: var(--color-text-muted) }
.gg .gg__cap { text-anchor: middle; font-family: var(--font-sans); font-size: 8px; font-weight: 500; letter-spacing: .12em; fill: var(--color-text-muted) }
.gg__live.gg__live { display: flex; flex-wrap: wrap; align-items: center; gap: 32px }
.gg__ctl.gg__ctl { display: grid; gap: 8px }
.gg__ctl-lbl.gg__ctl-lbl { font-weight: 500; font-size: var(--text-eyebrow); letter-spacing: var(--tracking-eyebrow); text-transform: uppercase; color: var(--color-text-muted) }
.gg__ctl.gg__ctl input { width: 240px; accent-color: var(--color-primary) }

/* --- stat ------------------------------------------------------------------
   Mirrors ui/src/primitives/stat.ts. The reference site cannot use the
   recipe's Tailwind classes, so each rule is the same decision in plain CSS:
   change the recipe and this block together. */
.stg { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1px; margin: 16px 0 0; padding: 0; overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-border) }
.stg--1 { grid-template-columns: minmax(0, 1fr) }
@media (min-width: 480px) { .stg--2, .stg--4 { grid-template-columns: repeat(2, minmax(0, 1fr)) } }
@media (min-width: 1024px) {
  .stg--3 { grid-template-columns: repeat(3, minmax(0, 1fr)) }
  .stg--4 { grid-template-columns: repeat(4, minmax(0, 1fr)) }
}
.st { display: flex; flex-direction: column; gap: 4px; min-width: 0; background: var(--color-surface-raised); padding: var(--spacing-block) }
.st dt, .st dd { margin: 0 }
.st__label { font-size: var(--text-eyebrow); line-height: var(--text-eyebrow--line-height); font-weight: 500; text-transform: uppercase; letter-spacing: var(--tracking-eyebrow); color: var(--color-text-muted) }
.st__value { font-size: var(--text-h2); line-height: var(--text-h2--line-height); letter-spacing: var(--text-h2--letter-spacing); font-weight: 600; font-variant-numeric: tabular-nums; color: var(--color-text-primary) }
.st__value--sm { font-size: var(--text-h3); line-height: var(--text-h3--line-height); letter-spacing: var(--text-h3--letter-spacing) }
.st__value--lg { font-size: var(--text-h1); line-height: var(--text-h1--line-height); letter-spacing: var(--text-h1--letter-spacing) }
.st__value--muted { color: var(--color-text-muted) }
.st__delta { display: inline-flex; align-items: center; gap: 4px; font-size: var(--text-sm); line-height: 1.55; font-weight: 500; font-variant-numeric: tabular-nums; color: var(--color-text-primary) }
.st__icon { display: inline-flex; flex-shrink: 0 }
.st__icon--positive { color: var(--color-success) }
.st__icon--negative { color: var(--color-destructive) }
.st__icon--neutral { color: var(--color-text-muted) }
.st__note { font-size: var(--text-sm); line-height: 1.55; color: var(--color-text-muted); text-wrap: pretty }
.st__msg { font-size: var(--text-sm); line-height: 1.55; color: var(--color-text-primary) }
.st__action { margin-top: 4px; font-size: var(--text-sm) }
.st__skel { display: block; border-radius: var(--radius-sm); background: var(--color-surface-sunken) }
/* One value line tall: the same type step as .st__value, and 1lh for the height, so a cell does not shift when the figure loads. */
.st__skel--value { width: 80px; font-size: var(--text-h2); line-height: var(--text-h2--line-height); height: 1lh }
.st__skel--note { width: 128px; height: 16px }
@media (prefers-reduced-motion: no-preference) {
  .st__skel { animation: st-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite }
}
@keyframes st-pulse { 50% { opacity: 0.5 } }

/* --- steps: progress states --------------------------------------------------
   Mirrors ui/src/primitives/steps.ts at markerStyle outline, size sm. The list is
   doubled (.stp.stp) so it outranks the prose defaults of .main ol and .main li. */
.stp.stp { display: grid; gap: 12px; margin: 16px 0 0; padding: 0; list-style: none; max-width: 34rem }
.stp__item.stp__item { display: flex; align-items: flex-start; gap: 12px; margin: 0 }
.stp__marker { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 24px; height: 24px; border-radius: 9999px; border: 1px solid var(--color-border-strong); background: transparent; color: var(--color-text-primary); font-size: var(--text-caption); font-weight: 600; font-variant-numeric: tabular-nums }
.stp__marker--current { box-shadow: 0 0 0 2px var(--color-surface), 0 0 0 4px var(--color-border-focus) }
.stp__marker--done { background: var(--color-success); border-color: var(--color-success); color: var(--color-text-inverse) }
.stp__marker--locked { border-style: dashed; background: transparent; color: var(--color-text-muted) }
.stp__content { display: flex; flex-direction: column; gap: 4px; min-width: 0 }
.stp__title { font-size: var(--text-ui); font-weight: 600; color: var(--color-text-primary) }
.stp__item--done .stp__title { color: var(--color-text-secondary) }
.stp__item--locked .stp__title { color: var(--color-text-muted) }
.stp__reason { font-size: var(--text-sm); line-height: 1.55; color: var(--color-text-muted); text-wrap: pretty }
.stp__time { margin-left: auto; flex-shrink: 0; font-size: var(--text-sm); color: var(--color-text-muted); font-variant-numeric: tabular-nums }

/* The gauge row's narrow-screen gap: it sat in a shared @media block of docs.css. */
@media (max-width: 767px) {
  .gg__row.gg__row { gap: 24px }
}
