/**
 * MWL Group — self-hosted fonts (latin + latin-ext subsets)
 *
 * Replaces fonts.googleapis.com <link> tags: the Google CSS endpoint is
 * unreliable for mainland-China visitors, and any failure there took all
 * icons and brand typography down with it. Files live in /assets/fonts/
 * and inherit the immutable cache header for /assets/.
 */

/* ── Bodoni Moda — display serif (logo, headings) ────────────────────────── */
@font-face {
  font-family: 'Bodoni Moda';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/bodoni-moda-400.woff2') format('woff2');
}
@font-face {
  font-family: 'Bodoni Moda';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/assets/fonts/bodoni-moda-700.woff2') format('woff2');
}
@font-face {
  font-family: 'Bodoni Moda';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/bodoni-moda-400italic.woff2') format('woff2');
}

/* ── Geist — body / UI sans ──────────────────────────────────────────────── */
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('/assets/fonts/geist-300.woff2') format('woff2');
}
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/geist-400.woff2') format('woff2');
}
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/assets/fonts/geist-500.woff2') format('woff2');
}
@font-face {
  font-family: 'Geist';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('/assets/fonts/geist-600.woff2') format('woff2');
}

/* ── Material Symbols Outlined — icon font (static wght 300 build) ───────── */
/* font-display: block hides raw ligature text ("expand_more") while loading.
 * Subset to the 16 icon ligatures actually used sitewide (347KB → 3KB).
 * Adding a NEW icon requires re-subsetting: re-download the full wght-300
 * woff2 (fonts.googleapis.com/css2?family=Material+Symbols+Outlined:...),
 * prune GSUB ligatures to the icon list via fontTools (LigatureSubst is
 * wrapped in an Extension Substitution (LookupType 7) — unwrap
 * `subtable.ExtSubTable` before filtering by output `LigGlyph` name; the
 * font's ligature feature tag has been 'rlig', not 'liga' — verify with
 * `fonttools ttx -t GSUB` before assuming), then pyftsubset --text=<icon
 * names> for final glyph-closure. Verify each icon collapses to ONE glyph
 * with `hb-shape font.ttf "<name>"` before shipping (pyftsubset's own
 * closure alone does NOT prune unused ligatures — v3→v4 shipped a broken
 * "check"/"verified" because they were added to content after the last
 * subset regen and the closure-only approach silently kept ~2/3 of all
 * 4000 Material Symbols glyphs instead of failing loudly).
 * The icon list = names scraped from the generated HTML PLUS names
 * injected at runtime by site-polish.js (textContent swaps: close,
 * expand_less, menu) — grep both. Match pruned ligatures by reconstructed
 * component sequence, NOT by result-glyph name (renamed icons keep old
 * internal names, e.g. location_on -> "place"). */
@font-face {
  font-family: 'Material Symbols Outlined';
  font-style: normal;
  font-weight: 300;
  font-display: block;
  src: url('/assets/fonts/material-symbols-outlined-300-subset-v4.woff2') format('woff2');
}
