/* ════════════════════════════════════════════════════════════════════════════
   type.css — THE SITE-WIDE TYPE SCALE
   Session 8 · Phase 1 · Agent P2

   This file is deliberately TOKENS ONLY. It declares no selector other than
   `:root`, sets no property on any element, and redefines no name that any
   other sheet already owns. That is what lets base.html link it between
   theme.css and the per-page sheets without touching the documented load order
   `style.css → theme.css → per-page sheets → app.css`: a sheet that overrides
   nothing has nothing to win or lose from its position.

   WHO USES IT TODAY: the four auth templates, through static/auth.css. Nothing
   else. The rest of the product is still on style.css's --fs-* and polish.css's
   --m-fs-* scales, and those two are NOT touched here — a global swap is a
   deliberate rollout, not a side effect of adding a login page.

   WHO USES IT NEXT: Phase 2's site-wide rollout. Adopt these names; do not
   redefine them locally, or the scale forks the way the palette did.

   ⚑ THE SCALE IS FIXED. Six steps, whole pixels, no fractional values and no
   clamp() in the token itself — the previous scales produced 11.52 / 13.92 /
   14.72 / 15.04 / 15.36 / 16.48 / 16.96 / 20.8px, which is what a vw-based
   clamp does to a token when six sheets each nudge it. Fluid sizing belongs at
   the call site (see .kp-h1 in auth.css), never in the token.
   ════════════════════════════════════════════════════════════════════════════ */

:root {

  /* ── The scale ──────────────────────────────────────────────────────────── */
  --font-xs:   13px;   /* labels, legal, meta, the show/hide toggle           */
  --font-sm:   15px;   /* secondary copy, helper text, small print            */
  --font-body: 17px;   /* body copy, inputs, buttons — the default            */
  --font-lg:   22px;   /* sub-heads, pull quotes                              */
  --font-xl:   32px;   /* section headings                                    */
  --font-xxl:  48px;   /* page headline, the largest step there is            */

  /* ── Rhythm ─────────────────────────────────────────────────────────────── */
  /* Headlines tighten; body opens up. Applying --ls-head to body text is the
     usual way this pair gets misused — it is for --font-lg and above only. */
  --lh-head: 1.2;
  --lh-body: 1.6;
  --ls-head: -0.02em;

  /* ── The family ─────────────────────────────────────────────────────────── */
  /* Geist, SIL Open Font License, by Vercel. Served from Google Fonts — see the
     single <link> in base.html, which asks for weights 400 and 600 and NOTHING
     ELSE. Asking for a third weight in CSS does not produce it; the browser
     synthesises a fake bold instead, which is why the rule is two weights.

     ⚑ FALLBACK. fonts.googleapis.com is an external host and it can fail:
     blocked by a network, blocked by an extension, or simply slow. `display=swap`
     means the page paints IMMEDIATELY in the first available fallback and swaps
     when (if) Geist lands — it never blocks and it never shows invisible text.
     The chain below is entirely system UI sans-serif and is ordered so that the
     first hit on every platform is a neutral grotesque with similar metrics:
     San Francisco on macOS/iOS, Segoe UI Variable then Segoe UI on Windows,
     Roboto on Android/ChromeOS, Helvetica/Arial elsewhere. The generic
     `sans-serif` is last and is the only thing standing between a broken CDN
     and the browser default — which is why `serif` is NOT in this list. If
     Geist never arrives the page is a system-font page, not a Times page. */
  --font-geist:
    'Geist',
    -apple-system, BlinkMacSystemFont,
    'Segoe UI Variable Text', 'Segoe UI',
    Roboto, 'Helvetica Neue', Helvetica, Arial,
    'Noto Sans', sans-serif;
}
