/*! ============================================================================
 *  HELM Web Fonts — self-hosted @font-face
 *  ----------------------------------------------------------------------------
 *  Pair this with helm-tokens.css. The .woff2 files ship in ./woff2/ alongside
 *  this sheet — they are IN THE REPO, not fetched. Nothing here reaches a CDN.
 *
 *  OPEN (OFL — free to self-host):  Montserrat, Sora, JetBrains Mono
 *  COMMERCIAL (licensed — web license held by Neighbourly):  Lufga, headings
 *
 *  --font-heading is "Lufga","Montserrat",…: headings render in Lufga; a
 *  weight or glyph Lufga lacks falls through to Montserrat. Nothing breaks.
 *
 *  WHY SELF-HOSTED, NOT fonts.googleapis.com. The platform CSP (DATUM
 *  NblyContentSecurityPolicy, Web profile) sends style-src 'self' 'unsafe-inline'
 *  and font-src 'self' data:. A <link> to fonts.googleapis.com is refused by
 *  style-src and its woff2 on fonts.gstatic.com by font-src, so the page renders
 *  in a fallback face with NOTHING in any server log — the browser enforces it
 *  and reports it only in its own console. Declaring the two Google origins in
 *  Security:Csp:* would work and is the wrong trade: it widens the policy on
 *  every page and calls out to a third party on every pageview. The files are
 *  200KB; vendoring them costs nothing and keeps the surface as narrow as the
 *  default policy intends.
 *
 *  VARIABLE FONTS, ONE FILE PER SUBSET. All three families are variable on
 *  Google Fonts: every weight of a family resolves to the SAME woff2 (verified
 *  by hash — the five "weights" of Montserrat downloaded as five identical
 *  files). So each family ships as one file per unicode subset with a
 *  font-weight RANGE, not one file per weight. A fixed `font-weight: 500` here
 *  would still render, but it would pin the variable axis and lose every other
 *  weight the tokens ask for.
 *
 *  Subset: Latin + Latin-ext, with Google's own unicode-range values. The
 *  ranges matter: without them a browser uses the latin file for every
 *  codepoint and renders tofu for anything outside it instead of falling
 *  through to the next family in the stack. Latin covers French/Canadian
 *  accents; latin-ext covers the European manufacturer and ingredient names
 *  that turn up in a drug file. font-display:swap on everything.
 * ========================================================================== */

/* ---- Montserrat · body (and the heading fallback) · weight 100–900 ---- */
@font-face{font-family:"Montserrat";font-style:normal;font-weight:100 900;font-display:swap;src:url("./woff2/montserrat-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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:"Montserrat";font-style:normal;font-weight:100 900;font-display:swap;src:url("./woff2/montserrat-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;}

/* ---- JetBrains Mono · code / DINs / identifiers · weight 100–800 ---- */
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:100 800;font-display:swap;src:url("./woff2/jetbrainsmono-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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:100 800;font-display:swap;src:url("./woff2/jetbrainsmono-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;}

/* ---- Sora · Creative-brand headings · weight 100–800 ---- */
@font-face{font-family:"Sora";font-style:normal;font-weight:100 800;font-display:swap;src:url("./woff2/sora-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-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:"Sora";font-style:normal;font-weight:100 800;font-display:swap;src:url("./woff2/sora-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;}

/* ---- Lufga · headings / titles (--font-heading) · weights 600, 700, 800 · COMMERCIAL ----
 * © Adam Ladd (ladd-design.com), purchase-only; used under Neighbourly's web license. These .woff2
 * files are for HELM's own hosts only — do not copy them into another product or a public repo.
 * STATIC, not variable: one file per weight, each subset to Latin + Latin-ext (one file, both ranges —
 * ~24 KB each), kerning and OpenType features kept. Built from the foundry TTFs with:
 *   pyftsubset Lufga<Weight>.ttf --unicodes="<the range below>" --layout-features='*' --flavor=woff2
 * The kit asks for 600 (--fw-medium) and 800 (--fw-bold); 700 is there for app headings that use it. A
 * heading at any other weight does NOT fall back to Montserrat: the browser substitutes the nearest Lufga
 * file it has (a 400 or 500 heading renders at 600), so add the weight here rather than rely on that.
 * -------------------------------------------------------------------------------------------- */
@font-face{font-family:"Lufga";font-style:normal;font-weight:600;font-display:swap;src:url("./woff2/lufga-600.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,U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:"Lufga";font-style:normal;font-weight:700;font-display:swap;src:url("./woff2/lufga-700.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,U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
@font-face{font-family:"Lufga";font-style:normal;font-weight:800;font-display:swap;src:url("./woff2/lufga-800.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,U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+20A0-20AB,U+20AD-20C4,U+2113,U+2C60-2C7F,U+A720-A7FF;}
