/* ============================================================================
   fonts.css — SELF-HOSTED webfonts. No network calls, ever.

   WHY THIS FILE EXISTS
   The app's pitch is "your signature never leaves your device". Loading these
   three families from fonts.googleapis.com / fonts.gstatic.com handed every
   visitor's IP address to Google on first paint — the last third-party call in
   an otherwise airtight privacy story. The .woff2 files now live in app/fonts/
   and are served from the same origin as everything else. There is no https://
   URL anywhere in this file and there must never be one; app/assets.spike.mjs
   asserts that and fails the build if one reappears.

   (This does NOT make the app work offline — there is deliberately no service
   worker; see the note at the foot of app.js. It makes the app contact no
   third party, which is a different and, for this product, more valuable
   property.)

   WHY A SEPARATE FILE (not style.css)
   contrast.spike.mjs parses style.css rule-by-rule and proves every text
   pairing against WCAG. Keeping @font-face blocks out of that file means the
   contrast prover's input is byte-identical to before this change — trivially
   unaffected rather than probably-unaffected. Loaded BEFORE style.css in
   index.html so the faces are declared before --f-ui/--f-disp/--f-mono use
   them.

   PROVENANCE
   Source:   Google Fonts CSS API v2, fetched with a desktop Chrome
             User-Agent (a bare curl gets legacy .ttf, not .woff2):
             https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600&family=Instrument+Serif:ital@0;1&family=IBM+Plex+Mono:wght@400;500&display=swap
   Families: Outfit (VARIABLE, wght 100-900 — Google serves one file for the
             300/400/500/600 the UI asks for, so it is vendored once and
             declared across its real axis), Instrument Serif (400 + 400
             italic), IBM Plex Mono (400/500).
   Subset:   LATIN ONLY. The UI is English; cyrillic, cyrillic-ext,
             vietnamese and latin-ext were deliberately not shipped.
   Ranges:   the upstream 'unicode-range' descriptors are intentionally NOT
             reproduced. One file per face now carries that face entirely, so
             a range could only cause a glyph to fall back silently.
   License:  all three families are under the SIL Open Font License 1.1.
             Vendoring is permitted; the licence ships with them in
             app/fonts/OFL.txt. Do not delete it.

   Family names below are load-bearing: style.css's --f-ui / --f-disp /
   --f-mono reference 'Outfit', 'Instrument Serif' and 'IBM Plex Mono' by
   those exact strings, with system fallback stacks behind them.
   ========================================================================= */

@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-400-latin.woff2') format('woff2');
}

@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-500-latin.woff2') format('woff2');
}

@font-face {
  font-family: 'Instrument Serif';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/instrument-serif-400-italic-latin.woff2') format('woff2');
}

@font-face {
  font-family: 'Instrument Serif';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/instrument-serif-400-latin.woff2') format('woff2');
}

@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('fonts/outfit-variable-latin.woff2') format('woff2');
}
