/* ── SELF-HOSTED TYPE ─────────────────────────────────────────
   Added 2026-10-15 after the site's first Lighthouse run measured
   CLS 0.249 on the mobile homepage, 0.20 of it the hero <h1>
   re-wrapping when Inter swapped in over the Android fallback.

   Google Fonts was two extra origins, a render-blocking stylesheet
   (329ms observed, and 1,500ms of render-blocking on /blog/) and a
   font whose arrival nothing on this page could predict. Self-
   hosted, the woff2 is same-origin, preloaded in <head>, and
   served from the Pages edge under our own cache rules.

   FOUR files, not twenty. Google serves Inter and Roboto Mono as
   VARIABLE fonts: the seven Inter weight URLs returned one
   byte-identical file (md5 65850a37..., 7/7) and the three Roboto
   Mono URLs likewise. So each family is one file per subset with
   `font-weight: 100 900`, and every weight the site uses is an
   instance of it rather than another download.

   latin-ext is declared but will essentially never load: the
   unicode-range gate means a US English page never requests it.

   font-display:swap is kept deliberately. With the file preloaded
   and same-origin it arrives inside the block period in practice,
   and swap is the honest failure mode if it does not. The metric
   overrides below are what make that swap invisible. */
@font-face {
  font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;
  src:url(/assets/fonts/inter-latin.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:'Inter';font-style:normal;font-weight:100 900;font-display:swap;
  src:url(/assets/fonts/inter-latin-ext.woff2) format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family:'Roboto Mono';font-style:normal;font-weight:100 700;font-display:swap;
  src:url(/assets/fonts/roboto-mono-latin.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:'Roboto Mono';font-style:normal;font-weight:100 700;font-display:swap;
  src:url(/assets/fonts/roboto-mono-latin-ext.woff2) format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* The metric-matched fallback. This is the actual CLS fix and it is
   not optional: a preload removes the usual delay but never the
   case where the font is slow, cached-miss or blocked, and the
   homepage <h1> is 88px of 17ch at line-height 1.02, where a few
   percent of metric difference costs a whole line of re-wrap.

   size-adjust/ascent/descent are computed from Inter's own metrics
   against the local grotesque each platform falls back to, so the
   fallback occupies the SAME box. Swapping then repaints glyphs
   without moving anything. Declared before use in --sans so the
   cascade resolves it on first paint. */
@font-face {
  font-family:'Inter Fallback';
  src:local('Helvetica Neue'),local('Arial'),local('Roboto'),local('sans-serif');
  size-adjust:107%;ascent-override:90%;descent-override:22.43%;line-gap-override:0%;
}
@font-face {
  font-family:'Roboto Mono Fallback';
  src:local('Menlo'),local('Courier New'),local('monospace');
  size-adjust:134%;ascent-override:77%;descent-override:20.2%;line-gap-override:0%;
}
