/* Self-hosted webfonts.
 *
 * These were loaded from fonts.googleapis.com until 30 July 2026. That disclosed every pupil's IP
 * address to a third party on page load, which the DPIA's "nothing is shared beyond OpenAI" line
 * did not account for — and a ten-year-old's IP going to an ad-adjacent company because of a font
 * is not a trade anyone would knowingly make. Hosting them here removes the request entirely, and
 * let server.js tighten its CSP to font-src 'self'.
 *
 * These are the exact files Google was already serving: the latin-subset VARIABLE builds, one per
 * family, which is why a single file covers every weight. 76KB for the pair, served from the same
 * origin as everything else, so there is no preconnect and no second DNS lookup either.
 *
 * The weight RANGES match what the three pages previously requested from Google (DM Sans 400-700,
 * Nunito 700-900), so nothing renders differently. Note styles.css asks for DM Sans 800 in a few
 * places: that clamped to 700 before and clamps to 700 now — behaviour is unchanged, but if a true
 * 800 is ever wanted, widen the range below rather than adding a file.
 *
 * unicode-range is deliberately omitted. Glyph fallback happens per-character regardless, so
 * declaring a range here would only risk pushing a character we DO have (the em-dashes and curly
 * quotes this product uses everywhere) into a system font because the range was typed wrong.
 */

@font-face {
  font-family: "DM Sans";
  src: url("fonts/dm-sans-latin-var.woff2") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  /* swap: show fallback text immediately rather than blocking on the font — same as the
     &display=swap the Google URL carried. A child should never wait on a typeface. */
  font-display: swap;
}

@font-face {
  font-family: "Nunito";
  src: url("fonts/nunito-latin-var.woff2") format("woff2");
  font-weight: 700 900;
  font-style: normal;
  font-display: swap;
}
