/**
 * fonts.css
 * Self-hosted replacement for the Google Fonts CDN link every page used
 * to load directly (28 pages each duplicating the same external
 * <link> tags). Site-wide performance audit found this was the single
 * biggest render-blocking cost repeated on every page — an external
 * DNS lookup + connection + stylesheet fetch before first paint, on
 * every single page load. Self-hosting removes all of that, matching
 * this project's existing philosophy of self-hosting every other
 * dependency (Leaflet, pdf.js, JSZip, CodeMirror, etc.) rather than
 * relying on a CDN.
 *
 * Both files are the real Google Fonts variable-font binaries (latin
 * subset only — this site is English-only content, so the cyrillic/
 * greek/vietnamese subsets Google's CSS also serves were deliberately
 * left out), so weights 400-800 for Inter and 400-800 for JetBrains
 * Mono all come from ONE file each rather than five separate files per
 * family — verified via fonttools: Inter's wght axis is 100-900,
 * JetBrains Mono's is 400-800.
 */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('fonts/inter-latin-variable.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 800;
  /* "optional" (not "swap") is deliberate here: JetBrains Mono is a
     secondary font (search bar, code/input fields) that is NOT
     preloaded, so swapping it in after the fallback has already
     rendered was measured to cause a real layout shift — Lighthouse
     traced a 0.42 CLS score directly to this font swap reflowing the
     shared search input, which pushed everything below it (verified:
     removing the swap eliminated the shift). "optional" tells the
     browser to use this font only if it's already cached fast enough
     to use for the very first paint, and to just stay on the fallback
     otherwise — never swapping mid-render, so it can never cause a
     shift after the page has already displayed text. */
  font-display: optional;
  src: url('fonts/jetbrains-mono-latin-variable.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
