/* Packaged fonts — Aether never loads a font from a CDN.
 *
 * A generated client document must reproduce identically forever, so its fonts
 * ship with the repo (static/fonts/, OFL-licensed — see the OFL-*.txt files
 * beside them). woff2 first for size, ttf as the fallback for any renderer
 * without Brotli. Loaded by both the browser and WeasyPrint, whose URL fetcher
 * resolves /static/* off local disk.
 *
 * SEC-3: this is also the app shell's font source — every adviser, portal and
 * licensee page links this file instead of Google Fonts, so `font-src 'self'`
 * holds. One consequence worth knowing: a face added here for a document is
 * immediately available to the UI, and a face removed from here takes both
 * with it. The packaged set is Geist 400/500/600/700 (+400 italic — the app
 * voice since Aether Ember), Space Grotesk 500/600/700, DM Sans 400/500/600/
 * 700 (+italic), DM Mono 400, and the five theme display faces (themes-1,
 * EMBER-F8): Instrument Serif 400 (+italic), Manrope variable 200-800, Libre
 * Caslon Text variable 400-700 (+italic), Archivo variable wght 100-900 x
 * wdth 62-125%, Figtree variable 300-900. Every binary's sha256 is pinned in
 * its PROVENANCE-<Family>.txt and tests/fonts-provenance.test.js refuses a
 * binary nobody pinned (EMBER-F6).
 *
 * Geist is the voice of GENERATED DOCUMENTS too since 2026-09-02 (Reid: "I
 * just want to get rid of the old font"), so backend/documents/renderer/
 * tokens.py names it alongside the app, and renderer/charts.py and
 * renderer/components.py derive their SVG font attributes from that token
 * rather than naming a face here. That ruling REVISED R130 clause 3, which had
 * kept Space Grotesk and DM Sans as the document faces.
 *
 * Note precisely what changed and what did not, because the two halves are
 * easy to collapse into one. The ruling changed which face new documents USE.
 * It did not change why the retired faces stay DECLARED here: Space Grotesk
 * and DM Sans now carry no shell and no new document, and they are still
 * un-retirable, because every stored document live-links this file and PDFs
 * re-render from frozen html_content on demand — delete a face and you
 * restyle documents that were already issued. Reid accepted the mirror image
 * of that in the same ruling ("don't worry about existing published docs not
 * updating, no one uses them"), so an already-published document picking up a
 * live font change is expected, not a bug to scope around. Both halves are
 * pinned by backend/tests/documents/test_documents_palette_decision.py.
 *
 * Geist provenance is pinned in static/fonts/PROVENANCE-Geist.txt
 * (vercel/geist-font v1.7.2, sha256 per binary) — verify against it rather
 * than re-downloading.
 *
 * DM Mono is locally modified: its default zero is slashed and the font ships
 * no plain alternate (no `zero`/ss GSUB feature exists to toggle), so the
 * capital O outline was transplanted into the `zero` glyph (same 600 advance)
 * in BOTH DMMono-Regular files — SOA refresh decision 9, "no slashed zeros".
 * Space Grotesk's and DM Sans's zeros are plain as shipped. Do not "upgrade"
 * DMMono-Regular.* from upstream without re-applying the transplant; the
 * name-table version string carries an "Aether:" marker a test can check.
 * font-feature-settings is NOT the fix here, and a same-family digit
 * unicode-range overlay is not either: WeasyPrint 69 picks the @font-face for
 * a whole text run from its first character, so "$1,050" keeps the base face.
 * The Google Fonts links also requested Space Grotesk 300/400, DM Sans 300 and
 * DM Mono 500; no rule in static/css or static/portal/css pairs those weights
 * with --font-display or --font-mono, and the seven `font-weight: 300` rules on
 * --font-body already fell back to 400 because adviser/_base.html never
 * requested DM Sans 300. tests/security-headers-static.test.js holds that line. */

@font-face { font-family: 'Geist'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('/static/fonts/Geist-Regular.woff2') format('woff2'), url('/static/fonts/Geist-Regular.ttf') format('truetype'); }
@font-face { font-family: 'Geist'; font-weight: 400; font-style: italic; font-display: swap;
  src: url('/static/fonts/Geist-Italic.woff2') format('woff2'), url('/static/fonts/Geist-Italic.ttf') format('truetype'); }
@font-face { font-family: 'Geist'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('/static/fonts/Geist-Medium.woff2') format('woff2'), url('/static/fonts/Geist-Medium.ttf') format('truetype'); }
@font-face { font-family: 'Geist'; font-weight: 600; font-style: normal; font-display: swap;
  src: url('/static/fonts/Geist-SemiBold.woff2') format('woff2'), url('/static/fonts/Geist-SemiBold.ttf') format('truetype'); }
@font-face { font-family: 'Geist'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('/static/fonts/Geist-Bold.woff2') format('woff2'), url('/static/fonts/Geist-Bold.ttf') format('truetype'); }

@font-face { font-family: 'Space Grotesk'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('/static/fonts/SpaceGrotesk-Medium.woff2') format('woff2'), url('/static/fonts/SpaceGrotesk-Medium.ttf') format('truetype'); }
@font-face { font-family: 'Space Grotesk'; font-weight: 600; font-style: normal; font-display: swap;
  src: url('/static/fonts/SpaceGrotesk-SemiBold.woff2') format('woff2'), url('/static/fonts/SpaceGrotesk-SemiBold.ttf') format('truetype'); }
@font-face { font-family: 'Space Grotesk'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('/static/fonts/SpaceGrotesk-Bold.woff2') format('woff2'), url('/static/fonts/SpaceGrotesk-Bold.ttf') format('truetype'); }

@font-face { font-family: 'DM Sans'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('/static/fonts/DMSans-Regular.woff2') format('woff2'), url('/static/fonts/DMSans-Regular.ttf') format('truetype'); }
@font-face { font-family: 'DM Sans'; font-weight: 400; font-style: italic; font-display: swap;
  src: url('/static/fonts/DMSans-Italic.woff2') format('woff2'), url('/static/fonts/DMSans-Italic.ttf') format('truetype'); }
@font-face { font-family: 'DM Sans'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('/static/fonts/DMSans-Medium.woff2') format('woff2'), url('/static/fonts/DMSans-Medium.ttf') format('truetype'); }
@font-face { font-family: 'DM Sans'; font-weight: 600; font-style: normal; font-display: swap;
  src: url('/static/fonts/DMSans-SemiBold.woff2') format('woff2'), url('/static/fonts/DMSans-SemiBold.ttf') format('truetype'); }
@font-face { font-family: 'DM Sans'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('/static/fonts/DMSans-Bold.woff2') format('woff2'), url('/static/fonts/DMSans-Bold.ttf') format('truetype'); }

@font-face { font-family: 'DM Mono'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('/static/fonts/DMMono-Regular.woff2') format('woff2'), url('/static/fonts/DMMono-Regular.ttf') format('truetype'); }

/* Theme display faces (themes-1). Variable faces declare their weight range so
 * one file serves every weight a theme asks for; Archivo also carries a width
 * axis (Gantry: condensed labels, wide headlines via --display-stretch). */
@font-face { font-family: 'Instrument Serif'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('/static/fonts/InstrumentSerif-Regular.woff2') format('woff2'), url('/static/fonts/InstrumentSerif-Regular.ttf') format('truetype'); }
@font-face { font-family: 'Instrument Serif'; font-weight: 400; font-style: italic; font-display: swap;
  src: url('/static/fonts/InstrumentSerif-Italic.woff2') format('woff2'), url('/static/fonts/InstrumentSerif-Italic.ttf') format('truetype'); }
@font-face { font-family: 'Manrope'; font-weight: 200 800; font-style: normal; font-display: swap;
  src: url('/static/fonts/Manrope[wght].woff2') format('woff2'), url('/static/fonts/Manrope[wght].ttf') format('truetype'); }
@font-face { font-family: 'Libre Caslon Text'; font-weight: 400 700; font-style: normal; font-display: swap;
  src: url('/static/fonts/LibreCaslonText[wght].woff2') format('woff2'), url('/static/fonts/LibreCaslonText[wght].ttf') format('truetype'); }
@font-face { font-family: 'Libre Caslon Text'; font-weight: 400 700; font-style: italic; font-display: swap;
  src: url('/static/fonts/LibreCaslonText-Italic[wght].woff2') format('woff2'), url('/static/fonts/LibreCaslonText-Italic[wght].ttf') format('truetype'); }
@font-face { font-family: 'Archivo'; font-weight: 100 900; font-stretch: 62% 125%; font-style: normal; font-display: swap;
  src: url('/static/fonts/Archivo[wdth,wght].woff2') format('woff2'), url('/static/fonts/Archivo[wdth,wght].ttf') format('truetype'); }
@font-face { font-family: 'Figtree'; font-weight: 300 900; font-style: normal; font-display: swap;
  src: url('/static/fonts/Figtree[wght].woff2') format('woff2'), url('/static/fonts/Figtree[wght].ttf') format('truetype'); }
