/* Self-hosted fonts (2026-09-11; converted to subset WOFF2 2026-09-18).
   Loading from fonts.googleapis.com sends every visitor's IP address to Google
   before any consent — a German court held that unlawful under the GDPR
   (LG München, 3 O 17493/20). Same families the app uses, both under the SIL
   Open Font License (see fonts/OFL-*.txt).

   WHY WOFF2, AND WHY SUBSET (2026-09-18)
   ──────────────────────────────────────
   These were shipping as raw .ttf: 1.59 MB across seven files, with Inter
   alone accounting for 1.34 MB. TTF is uncompressed, and the Inter TTFs carry
   full Cyrillic, Greek and Vietnamese coverage that this site never renders.

       raw TTF                1,590 KB
       WOFF2, full coverage     560 KB
       WOFF2, Latin subset      215 KB   ← what ships now, an 86% cut

   That is the single largest thing on the critical path for a first-time
   visitor, it lands directly on Largest Contentful Paint, and Core Web Vitals
   is a ranking signal — so this is an SEO change as much as a speed one. It
   matters most on the mobile data connections this app's first market is
   actually on.

   THE SUBSET RANGE — and what would break it
   ──────────────────────────────────────────
   Latin, Latin-1 Supplement, Latin Extended-A, General Punctuation, Currency
   Symbols, plus ™ ↔ − and the replacement character. That covers English and
   every Western European language, curly quotes, en/em dashes, ellipses, and
   $ € £ ¥ KES.

   IT DOES NOT COVER Cyrillic, Greek, Arabic, Hebrew, CJK or Vietnamese. If
   this site is ever translated into one of those, regenerate with that range
   added or those characters will render in a fallback font. To regenerate:

       pip install fonttools brotli
       pyftsubset Inter_400Regular.ttf \
         --unicodes=U+0000-00FF,U+0100-017F,U+2000-206F,U+20A0-20BF,U+2122,U+2190-2193,U+2212,U+FEFF,U+FFFD \
         --flavor=woff2 --layout-features='*' --no-hinting --desubroutinize \
         --output-file=Inter_400Regular.woff2

   The original .ttf files live in _src/fonts-ttf-source/ as the regeneration
   source. They are deliberately OUT of the deployed tree: nothing references
   them, and 1.6 MB of dead weight should not ship.

   font-display: swap on every face: text paints immediately in the fallback
   and re-renders when the webfont lands. Never `block`, which is a blank
   headline on a slow connection. */

@font-face { font-family: 'Fraunces'; font-weight: 500; font-style: normal; font-display: swap; src: url('fonts/Fraunces_500Medium.woff2') format('woff2'); }
@font-face { font-family: 'Fraunces'; font-weight: 600; font-style: normal; font-display: swap; src: url('fonts/Fraunces_600SemiBold.woff2') format('woff2'); }
@font-face { font-family: 'Fraunces'; font-weight: 700; font-style: normal; font-display: swap; src: url('fonts/Fraunces_700Bold.woff2') format('woff2'); }
@font-face { font-family: 'Inter';    font-weight: 400; font-style: normal; font-display: swap; src: url('fonts/Inter_400Regular.woff2')  format('woff2'); }
@font-face { font-family: 'Inter';    font-weight: 500; font-style: normal; font-display: swap; src: url('fonts/Inter_500Medium.woff2')   format('woff2'); }
@font-face { font-family: 'Inter';    font-weight: 600; font-style: normal; font-display: swap; src: url('fonts/Inter_600SemiBold.woff2') format('woff2'); }
@font-face { font-family: 'Inter';    font-weight: 700; font-style: normal; font-display: swap; src: url('fonts/Inter_700Bold.woff2')     format('woff2'); }
