/* Self-hosted web fonts — downloaded from Google Fonts 2026-07-30.
   latin + latin-ext subsets only; all three families are VARIABLE, so one file
   per family/style/subset covers every weight the site uses (Google served the
   same bytes four times over under four different weight declarations).

   TWO PROBLEMS THIS FIXES:

   1. Google LLC received every visitor's IP address on every page load, on all
      four pages, whether or not they accepted the cookie banner. It was honestly
      disclosed in the privacy policy's "who we share your data with" list but
      had no row and no lawful basis in the processing table. Self-hosting
      removes the recipient entirely, which is a better answer than documenting
      it better.

   2. The stylesheet was loaded with the media="print" onload trick, so first
      paint was GUARANTEED to use a fallback face and then swap — with no metric
      overrides anywhere in the build, every swap reflowed the text. CLS is a
      lifetime metric, so it scored whenever it landed. The fallback faces below
      carry real metrics read out of the font binaries with fontTools (hhea
      ascent/descent over unitsPerEm), so the fallback occupies the same vertical
      space as the real face and the swap is invisible.

   Regenerate: re-request the same css2 URL with a modern browser UA, keep the
   latin and latin-ext blocks, and re-read the metrics — do not hand-edit these
   percentages. */

/* ---------- real faces ---------- */

@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url(/assets/fonts/fraunces-normal-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: 'Fraunces';
  font-style: normal;
  font-weight: 300 600;
  font-display: swap;
  src: url(/assets/fonts/fraunces-normal-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'Instrument Sans';
  font-style: normal;
  font-weight: 400 600;
  font-display: swap;
  src: url(/assets/fonts/instrument-sans-normal-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: 'Instrument Sans';
  font-style: normal;
  font-weight: 400 600;
  font-display: swap;
  src: url(/assets/fonts/instrument-sans-normal-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Instrument Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/instrument-sans-italic-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: 'Instrument Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/instrument-sans-italic-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-normal-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: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url(/assets/fonts/jetbrains-mono-normal-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ---------- metric-matched fallbacks ----------
   Percentages are hhea.ascent / hhea.descent over unitsPerEm, read directly from
   each woff2 with fontTools. size-adjust brings the fallback's average lowercase
   advance onto the real face's, so line breaks land in the same places before
   and after the swap and the text block does not change height. */

@font-face {
  font-family: 'Fraunces Fallback';
  src: local('Georgia'), local('Times New Roman'), local('Times');
  ascent-override: 97.80%;
  descent-override: 25.50%;
  line-gap-override: 0%;
  size-adjust: 119.58%;   /* Fraunces avg lowercase advance 59.79% em vs Georgia ~50% */
}
@font-face {
  font-family: 'Instrument Sans Fallback';
  src: local('Arial'), local('Helvetica Neue'), local('Helvetica');
  ascent-override: 97.00%;
  descent-override: 25.00%;
  line-gap-override: 0%;
  size-adjust: 100.94%;   /* Instrument Sans avg lowercase advance 52.49% em vs Arial ~52% */
}
@font-face {
  font-family: 'JetBrains Mono Fallback';
  src: local('Courier New'), local('Courier');
  ascent-override: 102.00%;
  descent-override: 30.00%;
  line-gap-override: 0%;
  size-adjust: 100.00%;   /* both monospace at 60% em */
}
