/* =============================================================================
   @font-face declarations — self-hosted webfonts
   -----------------------------------------------------------------------------
   This file exists separately from tokens.css on purpose. tokens.css is 100%
   custom-property declarations with no at-rules, and that purity is what makes
   it readable as *the* palette-and-type file. Loading mechanics belong here;
   the names those files resolve to stay in tokens.css as --font-sans and
   --font-label.

   Linked from _partials/head.html BEFORE tokens.css.

   ## Two rules for this file

   1. **Filenames carry a version — `.v1`, `.v2` — and are never edited in
      place.** `/assets/fonts/` is served `immutable, max-age=1yr` (vercel.json),
      which is only honest because a given URL's bytes never change. Re-subset a
      face, change a unicode-range, swap a foundry cut → bump to `.v2` and update
      the src below. Overwriting a `.v1` file strands every returning visitor on
      the old bytes for a year.

   2. **A face must never be referenced before its file is deployed.** Vercel
      applies cache headers to 404s too, so a browser that requests a missing
      font path caches the failure for the full year and cannot be talked out of
      it. Binaries and the @font-face rule that names them ship in the same
      deploy, never separate ones. See docs/adr/0002-deployment-and-crawling-policy.md
      (why /assets/fonts/ is the one immutable path).

   ## What is here, and what is deliberately not

   Only weights 400 and 700 ship: those are the only values any rule in
   assets/css/ asks for (the composite `font:` shorthands in tokens.css use 700
   for display/label and 400 for body). The Google Fonts <link> this replaced
   requested 400;500;600;700;800 — three of those five were never used.

   Italics are declared but are not a cost to pages that don't use them: a
   browser only downloads a @font-face file when a glyph actually needs it.
   They exist because markdown blog posts emit <em>, and without a real italic
   the browser synthesises a slanted roman.

   Subset: Latin + Latin Extended (Spanish/Portuguese-ready for future LatAm
   content) plus U+2190-2193, because the site uses → and no standard Google
   subset includes it. Regenerate with the recorded command in
   docs/font-licences.md.
   ========================================================================== */

/* --- Plus Jakarta Sans — body and display ---------------------------------
   SIL Open Font License 1.1. Free to self-host; the OFL copyright and licence
   strings are retained inside each .woff2 (pyftsubset drops them by default,
   so they are kept explicitly — that retention is an OFL condition, not a
   nicety). Self-hosted rather than pulled from Google Fonts so the site makes
   no third-party request for a font: one less connection on first paint, and
   no visitor IP handed to Google before the page has rendered. */

@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: normal;
	font-weight: 400;
	font-display: swap;
	src: url("/assets/fonts/plus-jakarta-sans-400.v1.woff2") format("woff2");
}

@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: italic;
	font-weight: 400;
	font-display: swap;
	src: url("/assets/fonts/plus-jakarta-sans-400-italic.v1.woff2")
		format("woff2");
}

@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url("/assets/fonts/plus-jakarta-sans-700.v1.woff2") format("woff2");
}

@font-face {
	font-family: "Plus Jakarta Sans";
	font-style: italic;
	font-weight: 700;
	font-display: swap;
	src: url("/assets/fonts/plus-jakarta-sans-700-italic.v1.woff2")
		format("woff2");
}

/* --- Eurostile — labels and eyebrows ---------------------------------------
   Shipped 2026-08-12 on an explicit owner decision, after the supplied files
   failed metadata inspection. Read docs/font-licences.md before touching this
   block: the licence rests on a purchase record held outside this repo, not on
   anything verifiable in the files themselves. If that record turns out not to
   exist, this is the block to delete — --font-label in tokens.css falls back to
   --font-sans on its own, so removing it degrades rather than breaks.

   Bold only. --font-label is only ever used at weight 700 (see the --label-*
   shorthands in tokens.css), so the Medium cut that came with it is not built
   and not shipped — which also keeps the more doubtful of the two files out of
   the deploy.

   The subset deliberately preserves the OS/2 fsType bits and the name records
   exactly as supplied. fsType on this file declares restricted embedding;
   rewriting it to something more permissive would be editing a permissions
   flag to suit ourselves, which is a materially worse position than serving
   the font under a licence we believe we hold.

   Coverage note: this face lacks ·, → and €. Neither · nor → is rendered in a
   label today (both appear only in body copy or HTML comments), and browsers
   fall back per-glyph rather than per-element, so a stray one degrades to
   Plus Jakarta Sans for that character alone. Watch for it if label copy ever
   grows a bullet separator or an arrow. Accented Latin *is* present, so
   Spanish and Portuguese label copy is fine. */

@font-face {
	font-family: "Eurostile";
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url("/assets/fonts/eurostile-700.v1.woff2") format("woff2");
}
