/* fh-theme-fonts.css, split out of fh-theme.css on August 19, 2026.

   WHY THIS IS A SEPARATE FILE, AND IT IS NOT TIDINESS.
   fh-theme.css can be switched off, because every rule in it is gated behind
   :root[data-fh-theme="on"] and removing that attribute turns the whole stylesheet inert.
   @font-face CANNOT BE GATED THAT WAY. It is not a style rule and it does not sit inside a
   selector, so a font block in that file would keep firing with the theme "off" and every page
   would silently change typeface anyway. Five of the nine blocks below redefine family names the
   existing pages already ask for by name, so that is not a small effect:

     Inter          -> Geist        named by 26 files
     Archivo        -> Geist        named by 26 files
     IBM Plex Mono  -> JetBrains    named by 20 files
     Fraunces       -> Literata     named by 19 files
     Saira          -> Oswald       named by  2 files

   Keeping them here means the off switch is a real off switch: link this file and the fonts
   change, do not link it and they do not, independently of the theme attribute.

   KNOWN GAP, recorded rather than fixed: the Saira alias declares weight 600 only, so the two
   files that ask for Saira at another weight get it synthesized and read heavier than intended.
   Those two pages are worth editing directly rather than papering over it here.

   Geist, Literata, JetBrains Mono and Oswald are under the SIL Open Font License 1.1, recorded in
   fonts/FONT-LICENSES.txt.

   PERF-2, October 1, 2026: font-display is OPTIONAL, not swap, and the text no longer jumps.
   Under swap, text drew in a system face and was redrawn in Geist the moment the file arrived,
   so every line on the page moved, on any open where the font was not already decoded. Under
   optional the browser waits about 100 ms for the file; if it has it (the service worker keeps
   all four files, so on every open after the first it does), the page draws in Geist and never
   anything else. If it does not, that one page is drawn in the fallback below for its whole life
   and the next page gets Geist. Nothing ever swaps under the reader. The census numbers that
   settled optional over fallback are in the PERF-2 STATUS file.

   THE FALLBACKS ARE MEASURED, so the rare page drawn in one sits where Geist would have. Each
   face below is a system font (Arial, Roboto on Android, Courier New, Georgia, Noto Serif,
   Roboto Condensed) resized so its average letter width equals the brand face's, with the
   brand face's own ascent and descent, so a line wraps at the same word and stands at the same
   height. The figures were measured in Chromium on October 1, 2026 from the four files in
   fonts/ and from metric twins of the system fonts (Liberation Sans for Arial, Liberation Mono
   for Courier New, Gelasio for Georgia), over a 190-character sample of this product's own
   words, and the method is in the STATUS file so they can be measured again. Weight matters:
   Geist bold is wider than Geist regular by a different amount than Roboto bold is wider than
   Roboto, so the bold faces carry their own figures. 'Arial Narrow' has no metric twin to
   measure and is left as it was. */

/* Local fonts copied from the sibling Main-Site repository.
   Geist, Literata, JetBrains Mono, and Oswald are distributed under the
   SIL Open Font License 1.1. font-display: optional (PERF-2, above). */

@font-face{
  font-family:'FH Sans';
  src:url('fonts/geist-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:100 900;
  font-display:optional;
}
@font-face{
  font-family:'FH Serif';
  src:url('fonts/literata-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:200 900;
  font-display:optional;
}
@font-face{
  font-family:'FH Mono';
  src:url('fonts/jetbrains-mono-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:100 800;
  font-display:optional;
}
@font-face{
  font-family:'FH Condensed';
  src:url('fonts/oswald-latin-600-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:600;
  font-display:optional;
}

/* Existing pages name these Google-hosted families directly. These aliases let
   the additive theme satisfy those declarations with the local files. */

@font-face{
  font-family:'Inter';
  src:url('fonts/geist-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:100 900;
  font-display:optional;
}
@font-face{
  font-family:'Archivo';
  src:url('fonts/geist-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:100 900;
  font-display:optional;
}
@font-face{
  font-family:'IBM Plex Mono';
  src:url('fonts/jetbrains-mono-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:100 800;
  font-display:optional;
}
@font-face{
  font-family:'Fraunces';
  src:url('fonts/literata-latin-wght-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:200 900;
  font-display:optional;
}
@font-face{
  font-family:'Saira';
  src:url('fonts/oswald-latin-600-normal.woff2') format('woff2');
  font-style:normal;
  font-weight:600;
  font-display:optional;
}

/* THE MEASURED FALLBACKS (PERF-2). No url() in any of these: each is a system font the phone
   already has, resized to the brand face. A face whose local font is missing is skipped by the
   browser and the next name in the stack is tried, which is why Android's Roboto has faces of
   its own after the Arial ones. The stacks in fh-theme.css name them in that order. */
@font-face{ font-family:'FH Sans Fallback'; src:local('Arial'), local('ArialMT'), local('Liberation Sans'), local('LiberationSans');
  font-weight:400; size-adjust:102.39%; ascent-override:98.16%; descent-override:28.81%; line-gap-override:0%; }
@font-face{ font-family:'FH Sans Fallback'; src:local('Arial Bold'), local('Arial-BoldMT'), local('Liberation Sans Bold'), local('LiberationSans-Bold');
  font-weight:700; size-adjust:102.22%; ascent-override:98.31%; descent-override:28.86%; line-gap-override:0%; }
@font-face{ font-family:'FH Sans Fallback Android'; src:local('Roboto'), local('Roboto-Regular'), local('Roboto Regular');
  font-weight:400; size-adjust:102.71%; ascent-override:97.85%; descent-override:28.72%; line-gap-override:0%; }
@font-face{ font-family:'FH Sans Fallback Android'; src:local('Roboto Bold'), local('Roboto-Bold');
  font-weight:700; size-adjust:108.07%; ascent-override:93.00%; descent-override:27.30%; line-gap-override:0%; }
@font-face{ font-family:'FH Mono Fallback'; src:local('Courier New'), local('CourierNewPSMT'), local('Liberation Mono'), local('LiberationMono'), local('Roboto Mono'), local('RobotoMono-Regular');
  font-weight:400; size-adjust:99.98%; ascent-override:102.02%; descent-override:30.00%; line-gap-override:0%; }
@font-face{ font-family:'FH Serif Fallback'; src:local('Georgia'), local('Gelasio');
  font-weight:400; size-adjust:105.61%; ascent-override:111.44%; descent-override:29.16%; line-gap-override:0%; }
@font-face{ font-family:'FH Serif Fallback'; src:local('Georgia Bold'), local('Georgia-Bold'), local('Gelasio Bold'), local('Gelasio-Bold');
  font-weight:700; size-adjust:97.24%; ascent-override:121.04%; descent-override:31.67%; line-gap-override:0%; }
@font-face{ font-family:'FH Serif Fallback Android'; src:local('Noto Serif'), local('NotoSerif'), local('NotoSerif-Regular');
  font-weight:400; size-adjust:98.58%; ascent-override:119.40%; descent-override:31.24%; line-gap-override:0%; }
@font-face{ font-family:'FH Condensed Fallback Android'; src:local('Roboto Condensed SemiBold'), local('RobotoCondensed-SemiBold'), local('Roboto Condensed');
  font-weight:600; size-adjust:100.03%; ascent-override:119.26%; descent-override:28.89%; line-gap-override:0%; }
