/* Webfonts — revised 2026-08-31 to the site brief's §2.

   The brief settles a question the old pairing got wrong. Her 27 Aug note said
   "heading font of salt", and Salt's heading face is a humanist SANS, not a serif.
   So Newsreader is out of the display slot. Her four words for the whole direction
   — friendly, organized, modern, approachable — are a sans brief throughout.

   Display: CABIN. The brief names an Optima / Avenir Next / Gill Sans stack. All
   three are commercially licensed and cannot be self-hosted under her CSP. Cabin is
   the OFL face in that lineage — it is drawn from Gill Sans and Edward Johnston's
   humanist skeleton — so it is the honest substitute rather than a lookalike. Set at
   regular-to-medium weight with near-normal tracking, exactly as the brief asks.

   Body: PLUS JAKARTA SANS. The concrete mechanism behind "friendly, approachable" —
   it is the face Pastel Geometry specifies, and it is where that warmth actually
   lives. Geometric and round where Cabin is humanist and narrow, so the two read as
   a real pair rather than two versions of the same sans.

   The system stack still sits behind both, and the brief's Optima/Avenir/Gill names
   are kept in it so production degrades toward her actual reference rather than
   toward Arial.

   Considered and rejected: one family throughout (Plus Jakarta Sans at two weights).
   It satisfies Swiss's "one sans" rule and is a legitimate option — but PJS alone is
   more geometric than the humanist heading she pointed at.

   SELF-HOSTED, 2026-09-22. Until now this file pulled both faces with an @import from
   fonts.googleapis.com -- which style-src does not allow, and whose font files font-src
   'self' would have blocked anyway. So the site had been rendering in the fallback stack
   since launch: Optima or system-ui for headings, system-ui for body. Everything the
   client reviewed and approved, she approved in the fallbacks.

   The files are served from /assets/site/fonts now, so font-src 'self' is already
   correct and the CSP is untouched. Both faces are OFL; the licences ship beside them.

   They are VARIABLE fonts. Google returns one file per family and subset with a weight
   axis inside it, and had served the same bytes four times over under four different
   weight URLs -- 14 downloads that were 6 distinct files. One @font-face per family,
   style and subset, with the axis declared as a range, is the same typography for
   117KB instead of 309KB. A visitor reading English loads the two latin files, about
   55KB; unicode-range means latin-ext arrives only if a character needs it.

   Weights are those the site actually uses, checked rather than assumed: Cabin is never
   asked for above 500, and the only italic on the site is body text, so Cabin italic is
   not shipped at all.

   ONE RULE IF THESE ARE EVER REPLACED: change the filename. These URLs sit inside a
   stylesheet, and site_asset_urls() stamps href and src in HTML -- it cannot reach in
   here. The files go out behind max-age=14400 with no version string, so overwriting one
   in place means Cloudflare serves the old face for up to four hours against new markup.
   That is exactly how the token sheets broke in September. A new filename is a new URL
   and has no such window. */
/* Cabin normal, latin */
@font-face{font-family:"Cabin";font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/cabin-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}

/* Cabin normal, latin-ext */
@font-face{font-family:"Cabin";font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/cabin-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}

/* Plus Jakarta Sans normal, latin */
@font-face{font-family:"Plus Jakarta Sans";font-style:normal;font-weight:200 800;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/plus-jakarta-sans-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}

/* Plus Jakarta Sans normal, latin-ext */
@font-face{font-family:"Plus Jakarta Sans";font-style:normal;font-weight:200 800;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/plus-jakarta-sans-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}

/* Plus Jakarta Sans italic, latin */
@font-face{font-family:"Plus Jakarta Sans";font-style:italic;font-weight:200 800;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/plus-jakarta-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}

/* Plus Jakarta Sans italic, latin-ext */
@font-face{font-family:"Plus Jakarta Sans";font-style:italic;font-weight:200 800;font-stretch:100%;font-display:swap;
  src:url("/assets/site/fonts/plus-jakarta-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}
