/*
 * Lexend, self-hosted. Nothing here reaches out to Google.
 *
 * ONE family, ONE variable file per subset, covering the whole 100-900 weight
 * axis. That is the entire typographic stack of this site.
 *
 * ## Why local
 *
 * fonts.googleapis.com and fonts.gstatic.com were two extra origins, and a
 * production HAR (DebugBear, 2026-09-28) measured the cost: the stylesheet
 * spent dns 285ms + connect 442ms = 727ms before its first byte was requested,
 * and fonts.gstatic.com could not even be discovered until that stylesheet had
 * been fetched AND parsed -- so its own 372ms handshake began cold at ~2.9s and
 * the first woff2 was not requested until 3077ms. From this origin they arrive
 * on a connection that is already open.
 *
 * It also removes a silent failure path: LiteSpeed Cache's "Load Google Fonts
 * Asynchronously" had rewritten the <link> into Google's WebFont Loader behind
 * `if (typeof WebFont === "object")`, so if that script was slow or blocked the
 * font never loaded and nothing said so. LiteSpeed skips its optimisations for
 * logged-in users, which is the best explanation anyone has for the original
 * "logged-out visitors see unstyled text" report.
 *
 * And it stops sending every visitor's IP to Google on every page view.
 *
 * > This only pays once the server stops sending `no-store`. Every static asset
 * > is served `public, max-age=31536000,no-cache, no-store, must-revalidate`
 * > and the restrictive half wins, so nothing is cached at all; Google served
 * > its fonts `public, max-age=31536000` clean. Until that header is fixed
 * > these files are re-fetched on every page view where Google's were cached
 * > for a year. That fix is the prerequisite, not an extra.
 *
 * ## The files are Google's own, byte for byte
 *
 * Downloaded from fonts.gstatic.com and renamed; not re-subsetted, not
 * re-built. Metrics and hinting are exactly what Google serves.
 *
 * KEEP THE unicode-range DECLARATIONS. They are what makes a browser fetch
 * latin-ext only when a page actually uses its glyphs. Delete them and every
 * page downloads both files -- silently doubling the font bytes.
 *
 * Polish needs both subsets: o-acute lives in latin, but a-ogonek, l-stroke,
 * z-dot and the rest are all latin-ext. Google's devanagari subset is excluded.
 *
 * ## Variable, and why that matters here
 *
 * `font-weight: 100 900` on one face means every weight the CSS asks for is
 * served from this one file -- there is no per-weight list to keep in sync with
 * the stylesheets, and no weight can be "missing" and silently fall back to a
 * neighbour. That is the main reason this site is on Lexend rather than
 * Poppins, which has no variable build anywhere (Google's metadata carries no
 * `axes`, and @fontsource-variable/poppins is not published) and needed eight
 * separate static faces to cover the same range.
 *
 * Licence: SIL OFL 1.1 -- see OFL-lexend.txt, which the licence requires to
 * travel with the files. Note the Reserved Font Name: the family must keep the
 * name "Lexend". Renaming the FILES is fine and is what was done here.
 *
 * assets/fonts/_manifest.json records where each file came from.
 */


/* latin */
@font-face {
  font-family: 'Lexend';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/lexend-100-900-normal-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;
}

/* latin-ext */
@font-face {
  font-family: 'Lexend';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('../fonts/lexend-100-900-normal-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;
}
