/* Self-hosted web fonts for the TradingVox marketing site.

   Why this file exists: base.html previously pulled fonts from
   https://fonts.googleapis.com via a render-blocking <link rel="stylesheet">.
   That costs a cross-origin DNS + TLS + HTTP round trip *before* the browser
   even learns which woff2 files it needs, then a second round trip to
   fonts.gstatic.com to fetch them — two serialised hops on the critical path,
   which shows up directly as delayed First Contentful Paint / LCP. Serving the
   woff2 files from our own origin removes both hops: the fonts are same-origin,
   share the already-warm connection, and can be preloaded from base.html.

   The family names below MUST stay byte-for-byte identical to the three
   families declared in tokens.css (--font-display / --font-mono / --font-body).
   Renaming one here silently drops the whole site to the system fallback.

   Subsets: latin + latin-ext only. Cyrillic, Greek and Vietnamese are
   deliberately not shipped — this is an English-only site and those subsets are
   the bulk of the byte weight. The unicode-range blocks are copied verbatim
   from Google's own CSS so the browser still only downloads the subset a page
   actually needs (latin-ext is normally never fetched).

   All faces are variable fonts declared with a font-weight *range*, so every
   weight token in tokens.css (--fw-body 500, --fw-emphasis 600, --fw-strong
   700, --fw-display 800) resolves out of a single file per subset.

   Coverage of each file:
     manrope-var-*.woff2               wght 400..800   (body copy — highest traffic)
     bricolage-grotesque-var-*.woff2   wght 600..800, opsz 12..96 (h1/h2 only)
     jetbrains-mono-var-*.woff2        wght 400..500   (mono eyebrows, labels, numerals)

   Bricolage Grotesque keeps its variable `opsz` axis; browsers apply it
   automatically via the default `font-optical-sizing: auto`, so no extra
   declaration is needed. Its `font-stretch: 100%` matches Google's CSS (the
   file carries a single width instance).

   Paths are relative (`../fonts/...`) on purpose: the URL resolves against this
   stylesheet's own location, so it works identically under Django's `{% static %}`
   in DEBUG and under WhiteNoise's hashed ManifestStaticFilesStorage in
   production, without needing template-rendered CSS.

   These binaries are committed build artifacts, regenerated by re-fetching
   https://fonts.googleapis.com/css2?... with a modern Chrome User-Agent and
   downloading the latin / latin-ext woff2 targets listed in its `src:`
   descriptors.

   DO NOT write a literal `url` token followed by parentheses inside a comment
   in this — or any other — collected stylesheet. Django's HashedFilesMixin
   post-processes *.css with a plain regex and does NOT parse CSS, so it matches
   inside comments too, then tries to resolve whatever sits between those
   parentheses as a real file. One illustrative example of that token in this
   very comment took collectstatic down with
   `MissingFileError: 'marketing/css/...'` and broke the Docker image build
   (2026-09-14). It fails at BUILD time only — DEBUG uses no manifest storage,
   so nothing surfaces locally. tests/test_static_css_references.py guards it.
*/

/* ---------------------------------------------------------------------------
   Manrope — --font-body. Body copy, nav, buttons, forms: the LCP-critical face.
   --------------------------------------------------------------------------- */
@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../fonts/manrope-var-latin.101877a7a906.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;
}

@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../fonts/manrope-var-latin-ext.623714ac1d99.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;
}

/* ---------------------------------------------------------------------------
   Bricolage Grotesque — --font-display. h1/h2 headlines only.
   --------------------------------------------------------------------------- */
@font-face {
  font-family: 'Bricolage Grotesque';
  font-style: normal;
  font-weight: 600 800;
  font-stretch: 100%;
  font-display: swap;
  src: url("../fonts/bricolage-grotesque-var-latin.c47ac31e5437.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;
}

@font-face {
  font-family: 'Bricolage Grotesque';
  font-style: normal;
  font-weight: 600 800;
  font-stretch: 100%;
  font-display: swap;
  src: url("../fonts/bricolage-grotesque-var-latin-ext.b21945eb5067.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;
}

/* ---------------------------------------------------------------------------
   JetBrains Mono — --font-mono. Uppercase eyebrows, labels, timestamps, numerals.
   --------------------------------------------------------------------------- */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url("../fonts/jetbrains-mono-var-latin.570751c5f8b4.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;
}

@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url("../fonts/jetbrains-mono-var-latin-ext.e6155c5cfacf.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;
}
