/* ==================== TYPE.CSS ====================
   The two faces, defined once, for every page in the tool.

   Written 2026-09-19, after the type audit (5b7040d) got the repo down to
   three vendored families but left each page naming them itself. The stacks
   were then written out by hand in index.html, pages.css and
   site_planner.html, with a comment in pages.css asking whoever edited one
   to remember the others. Nobody did: the label role was Oswald on the home
   page, Oswald in the planner, and the SYSTEM MONO STACK on about.html and
   contact.html — so the smallest type on the marketing site was SF Mono on
   a Mac, Consolas on Windows, and a condensed grotesque on the page next to
   it. The tool pages had a fourth answer: uppercase Inter at whatever
   tracking that rule was written with (0.04em, 0.06em, 0.08em).

   This file is the one place the faces are named. A page links it and uses
   the tokens; it does not spell a family out again.

   THE TWO FACES, AND THE THIRD ROLE THAT IS NOT ONE

   --font-sans   Inter. Everything read as prose: page and app chrome,
                 panels, dialogs, body copy, and the labels drawn onto the
                 plan itself (drawn text stays Inter — user call
                 2026-09-19; the plan is read, not annotated like a sheet).

   --label       Oswald. The annotation role: eyebrows, section titles,
                 tool buttons, meta labels, table headers, every small
                 uppercase caption. A condensed grotesque, because that is
                 what a drawing's title block is lettered in.

   FIGURES ARE A PROPERTY, NOT A FAMILY (2026-09-21, user call)

   There used to be a third family here: IBM Plex Mono, for "digits that
   hold a column". It is gone, and the 23 things that used it are on Inter
   with `font-variant-numeric: tabular-nums`, which is what actually makes
   digits hold a column — every numeral advancing the same width. A
   monospace face gives you that as a side effect of monospacing the
   LETTERS too, which nothing here needed: a count badge, a key cap, a
   share-link field, the cut/fill readouts and a JSON dump.

   17.3 KB and a third family for a property Inter already ships. Use
   `font-variant-numeric: tabular-nums` on anything whose digits change in
   place; there is no --mono to reach for.

   --label-tracking is a token because the number belongs to the FACE, not
   to any one rule. Oswald sits closer together by construction and closes
   up into a word at 10-11px without the extra air. 0.18em everywhere
   (user call 2026-09-19); the planner's rail was on 0.16em and the
   marketing pages on 0.18em, which is the same face and the same role
   answering twice.

   The stacks behind each family are the swap-period fallback only. Both
   are vendored under /vendor and served from this origin, so a page that
   uses a role must also link that family's sheet:

       /vendor/inter-5.3.0.css          --font-sans
       /vendor/oswald-5.2.8.css         --label

   THE PDF IS INTER TOO (2026-09-21, user call)

   It was Helvetica until then — not a choice, just what jsPDF gives you for
   free, because a PDF reader is required to carry the 14 core fonts and the
   file only has to name one. That made the export the one artifact a user
   hands to somebody else that was not set in this product's typeface.

   Inter has to travel INSIDE the document, so it is fetched at export time
   rather than page load, from WinAnsi subsets built by
   `scripts/make-pdf-font.py` (~18 KB a weight against ~310 KB for the full
   face — the same coverage Helvetica had). If that fetch fails the export
   falls back to Helvetica and still produces a document. `npm run
   inspect:pdf` drives the real export both ways and reads the bytes that
   come out: which face each Tf operator selects, and whether the file
   actually carries it.

   `npm run inspect:type` loads every page in Chromium and asserts that no
   element resolves to anything outside these two — a rule that reaches for
   a monospace now lands on the UA system stack, and the check fails the
   page. Run it after touching any font rule.

   THE SAME STACKS OUTSIDE CSS

   Text drawn on a canvas or written into an SVG cannot read a custom
   property: ctx.font takes a string, and an exported .svg opened on its own
   has no :root to resolve var() against. Those call sites therefore spell
   the stack out — but they spell out EXACTLY the strings below, and
   `npm run inspect:type --static` fails the build on any other spelling.
   Family names are single-quoted for a reason: a name in double quotes
   survives CSS fine, but the same string has to pass through an SVG
   attribute on its way into an export.

   Served from /public/, so the path is root-absolute (/styles/type.css) and
   Vite copies it verbatim.
   ==================================================== */

:root {
    --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
    --label: 'Oswald', 'Inter', system-ui, sans-serif;
    --label-tracking: 0.18em;
}

/* Form controls and code do not inherit the page's face. A browser gives an
   <input>, <button>, <select> and <textarea> its own UA default — Arial on
   Chromium — and <code>/<kbd>/<pre> the UA monospace, whatever the page
   around them is set in. Every one of those is a place a page drifts
   without a single rule being written wrong: on 2026-09-19 the rendered
   pass found 13 Arial controls on admin.html (including the shared auth
   modal's fields and buttons, which appear on every page), 15 more on
   parking_tester.html, and contact.html's honeypot field.

   `inherit`, not var(--font-sans), so a control inside a panel that sets
   its own face keeps that face. A page that wants a control in a different
   role overrides it in its own sheet, which loads after this one. */
input, button, select, textarea { font-family: inherit; }

/* Code keeps the page's face and takes tabular figures, since the mono
   family went (2026-09-21). What it must NOT keep is the UA monospace it
   falls back to otherwise — that is a system stack, and a system stack is
   a different typeface on every machine, which is the drift this whole
   sheet exists to end. */
code, kbd, samp, pre { font-family: var(--font-sans); font-variant-numeric: tabular-nums; }
