/*
  Self-hosted from Google Fonts, latin subset, 19 August 2026.

  The live Shopify site pulled these from fonts.shopifycdn.com. Nothing here
  requests a third-party host: no external request to block, no visitor IP
  handed to anyone, and the page still renders if a CDN is down.

  ⚠ ONE FILE PER FAMILY, NOT ONE PER WEIGHT. Both of these are VARIABLE fonts.
  Google's css2 API describes them as a separate @font-face per requested
  weight, but every one of those blocks points at the same file — the first cut
  of this folder had jost-400.woff2 and jost-700.woff2 byte-identical, and three
  identical copies of DM Sans. Served that way a browser downloads the same file
  two or three times, because the URLs differ. The `font-weight` RANGE below is
  what makes one file cover every weight.
*/

@font-face {
  font-family: 'Jost';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url(/fonts/jost-variable.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;
}

/*
  🔴 DM SANS IS SHOPIFY'S CUT, NOT GOOGLE'S — AND THAT IS DELIBERATE.

  Google redrew DM Sans in 2022. The variable file its API serves today is
  about 9% WIDER than the DM Sans the live site loads from
  /cdn/fonts/dm_sans/dmsans_n4.…woff2, at the same declared size.

  Measured, not guessed: "BELT STANCHIONS" at 48px renders 383px in Shopify's
  cut and 420px in Google's variable. The live banner heading measures 382px.
  Every heading on the rebuild was running long, and on a page whose headings
  are set in caps inside a shrink-to-fit box, that changes the width of the box
  itself. Caught 19 August 2026 by rendering both files side by side.

  So this file is the one the live site serves, pulled from the store's own
  CDN while it is still up. Both DM Sans and Jost are SIL Open Font License,
  so hosting it here is fine.

  ⚠ ONE WEIGHT, 400, BECAUSE THAT IS ALL THE LIVE SITE LOADS. The theme sets
  --font-heading-weight: 400 and declares no DM Sans bold at all, so a bold
  heading is synthesised by the browser there and here alike. Do not "fix" this
  by adding a 700 file — it would make our headings heavier than the live ones.

  ⚠ Jost was checked the same way and needs no swap: Google's variable and
  Shopify's static cut render within a pixel of each other.
*/
@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/fonts/dm-sans-400.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;
}

/*
  ── The metric-matched stand-in for DM Sans ───────────────────────────────

  🔴 WHAT IT IS FOR: the heading is drawn before DM Sans arrives, and when the
  real face lands the text RE-WRAPS. On the live site at 1440px the <h1> went
  from 217px tall to 153px — one whole line gone — and the button under it
  jumped 36px. This face makes the stand-in occupy the same width, so the swap
  changes the letterforms and nothing else.

  ⚠ THE NUMBERS ARE MEASURED, NOT COPIED FROM A BLOG POST. Rendered in Chrome
  through canvas `measureText`, the full heading string at 100px, weight 400:

      DM Sans        2154.4px
      Arial          2343.8px   → DM Sans is 91.92% of it
      system-ui (SF) 2158.5px   → 99.81%

  🔴 AND NOTE HOW SMALL THAT SECOND NUMBER IS. San Francisco is only 0.19%
  wider than DM Sans and it STILL cost a whole line, because the heading ends
  right on a wrap boundary. Do not dismiss a fraction of a percent here.

  ⚠ `local('Arial')` ON PURPOSE, and it is a real trade-off. There is no way to
  aim `local()` at the generic `system-ui`, so this face pins the stand-in to a
  font that actually has a name. Arial is present on macOS, iOS and Windows. On
  Android it is not, every `local()` fails, the whole face is skipped and the
  stack falls through to `ui-sans-serif` unadjusted — so an Android visitor on
  a slow connection can still see the re-wrap. Preloading the real file is what
  covers that case; this covers the case where the preload is still in flight.

  ⚠ The overrides are divided by the size-adjust because they resolve against
  the ADJUSTED em: 99 / 0.9192 = 107.7, 31 / 0.9192 = 33.7.
*/
@font-face {
  font-family: 'DM Sans Fallback';
  font-style: normal;
  font-weight: 400;
  src: local('Arial'), local('Helvetica Neue'), local('Liberation Sans');
  size-adjust: 91.92%;
  ascent-override: 107.7%;
  descent-override: 33.7%;
  line-gap-override: 0%;
}
