/* Self-hosted web fonts — served from OUR OWN ORIGIN. No third-party request.
 *
 * WHY: these loaded from fonts.googleapis.com, which put every visitor's IP at
 * Google before any consent decision, on all 36 unauthenticated routes including
 * the public referral landing page /r/:code. Measured 2026-08-24: the stylesheet
 * request left at t+543ms, ~8s before the app's own DOMContentLoaded, so nothing
 * in React could have gated it — and nothing does, the app has no consent
 * mechanism at all. The two preconnect hints went with it: a preconnect performs
 * DNS + TCP + TLS, which IS the IP disclosure.
 *
 * SOURCE — the @fontsource packages, extracted with `npm pack`, NOT installed.
 * package.json and package-lock.json are frozen:out-of-tree for this campaign
 * (package-lock.json has 0 commits all campaign), and node_modules here is
 * hardlinked across 10 worktrees including the merge tree, so `npm install`
 * would have written into all of them.
 *   @fontsource-variable/dm-sans@5.3.0   OFL-1.1
 *   @fontsource-variable/inter@5.3.0     OFL-1.1
 *   @fontsource/ibm-plex-mono@5.3.0      OFL-1.1
 * Licence text: public/fonts/OFL.txt.
 *
 * FAMILY NAMES are rewritten from fontsource's 'DM Sans Variable' / 'Inter
 * Variable' to the plain 'DM Sans' / 'Inter' that tailwind.config.ts and
 * src/index.css already declare, so no design-system file changes.
 *
 * 🔴 THE AXIS CHOICE IS MEASURED, NOT ASSUMED, AND IT IS NOT THE SAME FOR EACH.
 * Google serves STATIC per-weight instances; these are VARIABLE fonts, so which
 * axis file you pick changes the rendered metrics. Rendered width of
 * 'Handgloves 0123' at 64px, against the Google baseline:
 *
 *   family          Google   opsz file   wght file   picked
 *   DM Sans          465        465         506       opsz
 *   Inter            527        491         527       wght
 *   IBM Plex Mono    576         —          576       static 400
 *
 * (system-ui fallback = 488px, monospace fallback = 578px — the controls.)
 * Picking opsz for both would have shipped Inter ~7% narrow, and picking wght for
 * both would have shipped DM Sans ~9% wide. Neither is visible without measuring.
 *
 * font-display: swap, NOT optional — see the note in index.html. `optional` has
 * no swap period, so on a cold load the fallback is used for the life of the page
 * even after the font arrives; measured here as DM Sans rendering at the 488px
 * fallback width with the face reporting status:"loaded".
 *
 * SUBSETS: latin + latin-ext only. Cyrillic, Greek and Vietnamese are NOT shipped
 * and fall back to a system face. Stated trade-off.
 *
 * REGENERATE: npm pack each package above, copy the latin + latin-ext woff2 for
 * the axes in the table, re-emit with the app's family names. Then RE-RUN THE
 * WIDTH PROBE — a font that fails to load still reports status:"loaded" and a
 * correct-looking computed font-family.
 */
@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-display: swap;
  font-weight: 100 1000;
  src: url('/fonts/dm-sans-latin-ext-opsz-normal.woff2') format('woff2-variations');
  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: 'DM Sans';
  font-style: normal;
  font-display: swap;
  font-weight: 100 1000;
  src: url('/fonts/dm-sans-latin-opsz-normal.woff2') format('woff2-variations');
  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: 'DM Sans';
  font-style: italic;
  font-display: swap;
  font-weight: 100 1000;
  src: url('/fonts/dm-sans-latin-ext-opsz-italic.woff2') format('woff2-variations');
  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: 'DM Sans';
  font-style: italic;
  font-display: swap;
  font-weight: 100 1000;
  src: url('/fonts/dm-sans-latin-opsz-italic.woff2') format('woff2-variations');
  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-display: swap;
  font-weight: 100 900;
  src: url('/fonts/inter-latin-ext-wght-normal.woff2') format('woff2-variations');
  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: 'Inter';
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  src: url('/fonts/inter-latin-wght-normal.woff2') format('woff2-variations');
  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-display: swap;
  font-weight: 400;
  src: url('/fonts/ibm-plex-mono-latin-ext-400-normal.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: 'IBM Plex Mono';
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src: url('/fonts/ibm-plex-mono-latin-400-normal.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;
}
