/* Veterans in Project Management — web fonts, self-hosted.
   Loaded first in base.njk, ahead of tokens.css, which is where
   --font-sans and --font-mono name these families.

   WHY THIS FILE EXISTS. Until 2026-08-27 base.njk pulled a
   stylesheet from fonts.googleapis.com, which fetched the faces
   from fonts.gstatic.com. That cost three things: a third party
   saw every visitor's IP and Referer on every page view, which
   /privacy/ then had to disclose; two extra origins had to be
   allowed in any Content-Security-Policy; and two preconnects
   bought back some of the latency the extra hops cost in the
   first place.

   THE FILES WERE ALREADY HERE. guides.css has served the PDF
   renderer from /assets/fonts/ since the guides were built, so
   self-hosting the site was a swap rather than a subset-and-
   download. Those are the static instances from IBM's own release
   (github.com/IBM/plex v6.4.1, OFL 1.1).

   KEEP THEM STATIC. A variable file silently turns the printed
   guides back into pictures of words — see the comment above the
   same declarations in guides.css, where that was diagnosed.

   THE DUPLICATION WITH guides.css IS DELIBERATE. A guide page
   loads both files and the browser dedupes by src, so the cost is
   a few hundred bytes; the alternative is guides.css depending on
   a file the PDF renderer doesn't check, and build-guides.mjs
   fails the build when guides.css can't stand on its own.

   FILENAMES ARE PART OF THE CACHE CONTRACT. The Worker serves
   everything under /assets/fonts/ with a one-year immutable
   Cache-Control, so a face may never be swapped in place — a
   replacement gets a new filename. See serveFontsImmutable in
   src/worker/index.js. */

@font-face {
  font-family: "IBM Plex Sans";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-sans-400.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Sans";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-sans-500.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Sans";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-sans-600.woff2") format("woff2");
}

/* Mono 400 is declared even though the Google link only ever
   asked for 500 and 600. The file is already on disk, and a
   weight that is used but not declared gets synthesised by the
   browser, which is a heavier, blurrier version of the same
   glyphs appearing in one place and not another. */
@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-mono-400.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-mono-500.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/assets/fonts/ibm-plex-mono-600.woff2") format("woff2");
}
