/* Plus Jakarta Sans — SELF-HOSTED (no Google Fonts, no CDN).
 *
 * Replaces the runtime Google Fonts stylesheet the app used to link
 * (their css2 API, `family=Plus+Jakarta+Sans:wght@300;400;500;600;700`).
 * Same family, same five weights, same `font-display: swap`, same
 * unicode-ranges — copied verbatim from the CSS Google served for that exact
 * request (v12 of the family, fetched with a modern-Chrome UA), so text
 * renders identically to the CDN build this replaces.
 *
 * NOTE ON THE PROSE ABOVE: Google's two font host names are deliberately NOT
 * spelled out anywhere in this file, so that grepping a built dist/ for them
 * is a clean zero-hit check rather than one that trips over a comment. Keep
 * it that way when editing.
 *
 * WHY: the app is a PWA + a Capacitor/WKWebView native bundle. A third-party
 * font request is a render-blocking dependency on someone else's uptime, a
 * per-visitor DNS/TLS handshake with Google, and dead weight in a native
 * bundle that is supposed to be self-contained. Serving them from /static
 * also means the service worker's cache-first rule for /static/* (public/sw.js)
 * picks them up, so they survive offline launches.
 *
 * ── The files ──────────────────────────────────────────────────────────────
 * Google ships Plus Jakarta Sans as a VARIABLE font: one woff2 per unicode
 * subset, carrying the whole 200–800 weight axis. That is why all five
 * @font-face blocks for a given subset point at the SAME file — the browser
 * downloads it once and instances it at each pinned weight. Two subsets are
 * bundled:
 *
 *   plus-jakarta-sans-latin.woff2      27 KB  (basic latin + punctuation +
 *                                              the ↑ ↓ arrows the coach uses)
 *   plus-jakarta-sans-latin-ext.woff2  21 KB  (accented/extended latin — food
 *                                              and exercise names, user names)
 *
 * Google also offers `vietnamese` and `cyrillic-ext` subsets. They are
 * deliberately NOT bundled: the app ships English-only copy, and any stray
 * character in those ranges falls back to the system sans exactly as it would
 * have if the subset had never been requested.
 *
 * ── The weights ────────────────────────────────────────────────────────────
 * 300 / 400 / 500 / 600 / 700 -- the exact set the old CDN request asked for
 * (`wght@300;400;500;600;700`, with no `ital` axis), and the five that
 * public/static/app.css declares in bulk (15 / 12 / 51 / 89 / 94 rules).
 *
 * app.css also carries 5 `font-weight: 800` rules, 2 `font-weight: 900`, and
 * 5 `font-style: italic`; app.js adds 19 inline 800s and 1 inline italic.
 * None of those has a real face. 800 and 900 resolve to the 700 face plus the
 * browser's synthetic bolding, and italic to a synthetic oblique.
 *
 * That is PARITY, not a loss. Verified against the pre-lane source rather than
 * asserted: at commit 8ef4df1 BOTH request sites -- the app.css @import and the
 * <link> in src/index.tsx -- carried `wght@300;400;500;600;700` and no `ital`,
 * so Google was never asked for an 800, a 900 or an italic face and never
 * shipped one. Every synthesised weight and slant on screen today was
 * synthesised on the CDN too.
 *
 * (A future option: collapse each subset to ONE @font-face with
 * `font-weight: 200 800` and let the variable axis serve a true 800 -- these
 * files carry the whole axis, so it costs no bytes. That is a rendering
 * change, so it belongs in a deliberate UI pass, not in a hosting swap.)
 *
 * ── The glyphs: what renders here, and what falls through ───────────────────
 * Audited by measurement, not assumption: every non-ASCII codepoint the app
 * can print was extracted from comment-stripped app.js / index.tsx / api.ts /
 * sw.js (including ones written as \uXXXX escapes), then checked against BOTH
 * the @font-face unicode-range below AND the cmap decoded out of the shipped
 * woff2. 40 distinct codepoints; 23 render from Plus Jakarta Sans.
 *
 * The other 17 fall through to the next family in `--font-sans` (app.css):
 * -apple-system / 'SF Pro Text' / system-ui / sans-serif. They are:
 *
 *   → U+2192   ─ U+2500   ✓ U+2713   ₂ U+2082   ≈ U+2248   ═ U+2550
 *   ⚠ U+26A0   U+FE0F     ▲ U+25B2   ▼ U+25BC   ○ U+25CB   ❌ U+274C
 *   ✅ U+2705   ✦ U+2726   ✕ U+2715   ≤ U+2264   U+202F
 *
 * Sixteen of them sit outside every unicode-range Google declared for this
 * family and have no glyph in either shipped file. U+202F (narrow no-break
 * space) is the one that IS inside the declared latin range but has no glyph
 * in Google's own latin file -- a hole in the upstream subset, invisible
 * anyway, and identical under the CDN.
 *
 * ALL 17 behaved exactly this way before. The CSS below is the CSS Google
 * served, so the ranges are unchanged, and the woff2 are Google's own files,
 * so the coverage is unchanged. Same ranges + same files = same fallback. This
 * is documented parity, not a regression, and nothing here needs a bigger
 * subset: the arrows, ticks, warnings and box-drawing characters the coach
 * prints have always come from the system sans.
 *
 * The two subsets deliberately not bundled (see above) cost nothing here
 * either: not one of the 40 codepoints falls in the vietnamese or
 * cyrillic-ext ranges.
 *
 * Licence: Plus Jakarta Sans is SIL Open Font License 1.1 (Tokotype).
 * https://github.com/tokotype/PlusJakartaSans
 */

/* ── latin-ext ──────────────────────────────────────────────────────────── */
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ── latin ──────────────────────────────────────────────────────────────── */
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/static/fonts/plus-jakarta-sans-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;
}
