/* Self-hosted, and that is a product decision rather than a performance one.
 *
 * subhadipmitra@: The security page on this site says no data reaches us and
 * that this deployment's outbound connections are enumerable. Meanwhile every
 * visitor's browser called fonts.googleapis.com in order to read it — a third
 * party learning who reads our security posture, on the page making the claim.
 * A security reviewer notices that, and they are right to.
 *
 * Self-hosting also lets the CSP in `_headers` forbid third-party style and
 * font origins outright, so the claim is enforced by a header rather than by
 * our good intentions.
 *
 * Latin only: `latin-ext` roughly doubles the payload for glyphs this site does
 * not set. Add it back the day a page needs them.
 *
 * ## Two families, not three (September 2026)
 *
 * Spectral, the serif that carried headings, is no longer declared here. The
 * redesign sets display and reading text in one sans so the page reads as one
 * engineered system rather than as a document with a marketing voice. The
 * Spectral files stay in assets/fonts/ because scripts/build-pdfs.py copies
 * that directory and _pdf/_print.css still sets PDF headings in it.
 *
 * Regenerate with `scripts/fetch-fonts.sh`.
 */

/* IBM Plex Sans ships from Google's API as ONE variable file — the 400, 500
 * and 600 downloads were byte-identical, as Libre Franklin's were — so it is
 * declared once with a weight range (40 KB) rather than three times. The
 * italic is a separate static cut and is used only in reading text. Nothing
 * lighter than 400 is used anywhere: a hairline headline is the one thing this
 * design refuses. */
@font-face{
  font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-display:swap;
  src:url('/assets/fonts/plex-sans-var.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'IBM Plex Sans';font-style:italic;font-weight:400;font-display:swap;
  src:url('/assets/fonts/plex-sans-400-italic.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}

/* IBM Plex Mono is a static cut; each weight is its own file. */
@font-face{
  font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;
  src:url('/assets/fonts/plex-mono-400.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;
  src:url('/assets/fonts/plex-mono-500.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;
  src:url('/assets/fonts/plex-mono-600.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
