/*
 * Folio site webfonts — self-hosted.
 *
 * WHAT WAS WRONG. The site named Inter, Heebo, Assistant and IBM Plex Sans
 * Arabic across its stylesheets, and loaded them on three pages. index.html,
 * folio.html and og-image.html linked a Google Fonts stylesheet; the legal
 * documents (privacy, terms, accessibility, atlas), the answers pages and the
 * 404 page linked no webfont at all. On those nine pages every "Inter" and
 * "Heebo" was a name nothing could resolve, so each script fell through to
 * whatever the reader's machine happened to own — measured on 2026-08-10 with
 * CDP CSS.getPlatformFontsForNode against /privacy.html: every Hebrew run came
 * back `.SF Hebrew`, isCustomFont:false. That is a different typeface on every
 * reader's screen, and on a machine whose Hebrew fallback is a serif it is a
 * privacy policy set in a stock serif. That is the bug the owner photographed.
 *
 * Frank Ruhl Libre is new here. The site had no reading face at all; this is
 * the app's (src/main/doc_type.ts), brought over for the same three documents.
 *
 * WHAT THIS FILE DOES. It makes those names real, from this origin, on every
 * public page. No CDN and no external request: the site is Workers Static
 * Assets and the product's own ethos is that rendering the UI must not depend
 * on a third party answering. The CSP already allows exactly this
 * (`font-src 'self'`) — and now that nothing on the site still asks Google
 * for anything, `_headers` was tightened to match it: `font-src` dropped
 * fonts.gstatic.com and `style-src` dropped fonts.googleapis.com, since a CSP
 * allowance for a connection nothing makes is just unused attack surface.
 *
 * THE BINARIES are the app's, byte for byte, for four of the six families —
 * Frank Ruhl Libre, Heebo, Inter, Rubik — the files the desktop renderer
 * ships from src/renderer/src/assets/fonts, verified by sha256 when they
 * were copied. Reusing them rather than re-fetching means the site and the
 * app cannot drift into two different cuts of the same typeface, and it
 * inherits that directory's provenance and licence record.
 *
 * ASSISTANT AND IBM PLEX SANS ARABIC have no app copy to reuse — the desktop
 * app never bundled either family, so the site is their only home. They were
 * the reason index.html, folio.html and og-image.html still linked the
 * Google Fonts CDN after the round above: those two names lived nowhere
 * else. Measured before touching anything, CDN still reachable (CDP
 * CSS.getPlatformFontsForNode, 2026-08-10): Assistant is the DEFAULT BODY
 * face on index.html's Hebrew and English copy — every paragraph, not a
 * heading, since headings ask for Heebo first and Heebo already resolved —
 * and IBM Plex Sans Arabic is the whole-body face for both pages' Arabic
 * mode. og-image.html turned out to use neither: its own CDN link requested
 * only Heebo and Inter, already self-hosted below, so that page's CDN link
 * was dead weight from the day this file was first written; its fix is
 * simply linking this sheet instead of carrying its own. Both other families
 * are genuinely used where they were still requested, so both are
 * self-hosted here rather than dropped — verified after the change against
 * the same elements, same CDP call, same resolved family, isCustomFont:true.
 *
 * Fetched the same documented way this file's original six binaries were
 * (see src/renderer/src/assets/fonts/fonts.css's own regeneration recipe:
 * curl the CSS2 endpoint with a woff2-capable UA, keep the hebrew/latin/
 * arabic blocks, download the gstatic URLs), and not re-subset by this repo.
 * Licence verified against the google/fonts GitHub repository's own OFL.txt
 * for each family: both OFL 1.1, byte-identical licence text to what already
 * sits below, confirmed by direct comparison rather than assumed from the
 * family's reputation. Assistant's OFL carries a Reserved Font Name for a
 * component it incorporates ('Source', from Source Sans Pro); IBM Plex Sans
 * Arabic reserves its own family name ('Plex'). Neither restriction is
 * triggered by shipping the fonts unmodified under their published names,
 * which is all this file does. resources/legal/NOTICES.txt now carries both
 * copyright blocks and says plainly which two families are site-only.
 *
 * Only the subsets the site actually sets travel here: hebrew and latin for
 * the reading and chrome families (Frank Ruhl Libre, Heebo, Inter, Assistant
 * — Inter is latin-only in practice, the site never sets Hebrew text in it),
 * arabic for the two Arabic-script families (Rubik, IBM Plex Sans Arabic).
 * Everything Google offers beyond he/ar/en — latin-ext, cyrillic, greek,
 * vietnamese — is left behind, which is most of what a full family costs.
 *
 * Total cost: 354,392 bytes across twelve files, cached immutable
 * (_headers). No single visit pays for all of them — measured with the
 * network panel, not assumed from file sizes: a Hebrew-default visit to
 * index.html fetches four (Heebo and Assistant, hebrew and latin each),
 * 71,540 bytes; the same page loaded straight into Arabic fetches ten
 * (Heebo-latin, Assistant hebrew and latin, and IBM Plex Sans Arabic across
 * the weights that page's Arabic content actually asks for), 220,600 bytes;
 * loaded straight into English it fetches three (Heebo-latin, Assistant
 * hebrew and latin), 59,540 bytes.
 *
 * ONE BLOCK PER FAMILY AND SUBSET, with a weight RANGE — for the five
 * families that are variable fonts. Each serves every weight the site asks
 * for as a REAL instance instead of a synthesised bold. The ranges below are
 * measured, not assumed: each file was loaded in Chromium and its glyph
 * advance sampled at wght 100..900 through font-variation-settings, which
 * moves only on a real axis. Frank Ruhl Libre and Rubik stopped changing at
 * or below 300; Heebo and Inter answered at every step; Assistant stopped
 * changing at exactly 200 and exactly 800, matching its own declared Google
 * Fonts axis to the unit. Hence 300-900, 100-900, and 200-800.
 *
 * IBM PLEX SANS ARABIC IS THE EXCEPTION. It has no registered variable axis
 * on Google Fonts — confirmed against its own METADATA.pb (no `axes` block)
 * and by the CSS2 endpoint flatly rejecting a wght range request for it,
 * HTTP 400 "Font family not found". It ships here as four discrete static
 * weights instead of one ranged file: 400/500/600/700, the same four the CDN
 * link this replaces was already requesting, and the only four CDP found
 * actually rendering across the two pages that use it.
 *
 * (The app's own fonts.css declares its four shared files as discrete
 * 400/500/600 blocks, because 400/500/600 is the weight set the app UI uses.
 * The site's home page asks Heebo for 800, so the range form is the one that
 * keeps every site weight honest. The two forms were checked against each
 * other on the Arabic: the range declaration and a discrete 400 declaration
 * of the same binary set the same string to the same 1252.484px, so the
 * range really does instance at 400. Worth knowing because CDP reports the
 * resolved face as "Rubik Light" or "Assistant ExtraLight" either way — that
 * is the file's default named instance showing through, not the weight
 * actually being rendered.)
 *
 * The unicode-ranges for the four app-shared families are copied verbatim
 * from src/renderer/src/assets/fonts/fonts.css, which took them verbatim
 * from Google, so the two declarations of the same binary cannot disagree
 * about which codepoints each file actually carries. Assistant and IBM Plex
 * Sans Arabic have no app-side declaration to check against, so their ranges
 * are copied verbatim from Google's own CSS2 response instead — same source,
 * same method, just fetched directly since there was no app copy on hand.
 */

/* Frank Ruhl Libre — the reading face. Hebrew first, then latin, so a Latin
   word inside a Hebrew paragraph ("Folio", "iPad", an email address) is set by
   the same typeface as the sentence around it instead of falling out of the
   reading face mid-line. */
@font-face {
  font-family: 'Frank Ruhl Libre';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('/fonts/frank-ruhl-libre-hebrew.woff2') format('woff2');
  unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
@font-face {
  font-family: 'Frank Ruhl Libre';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('/fonts/frank-ruhl-libre-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;
}

/* Heebo — the Hebrew chrome face the site already names everywhere, and the
   reading face's first fallback. */
@font-face {
  font-family: 'Heebo';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/fonts/heebo-hebrew.woff2') format('woff2');
  unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
@font-face {
  font-family: 'Heebo';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/fonts/heebo-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;
}

/* Inter — latin only, which is all the site ever asks it for. It leads the
   answers pages' stack and stands behind the wordmark rule in brand.css, and
   until now it resolved on no page that did not link the Google stylesheet. */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/fonts/inter-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;
}

/* Rubik — arabic, and it is here because of a measured regression, not for
   symmetry. Giving the site a real Inter changed where Arabic LANDS: with no
   family in the stack matching, the browser had been picking Arabic out of its
   own last-resort fallback and getting the platform's modern .SF Arabic; once
   Inter matched the element, Arabic came out of INTER's fallback cascade
   instead, and on /answers-ar.html that measured as Geeza Pro — the older,
   worse face. This is the same trap the app's font census caught (owner's
   ruling, 2026-08-09: one OFL family whose Arabic is drawn with its Latin, so
   an Arabic UI never has to borrow the platform's Geeza Pro), and it is fixed
   the same way. Naming Rubik in the Arabic position of the site's stacks turns
   a regression into the one thing Arabic never had here: a face this origin
   actually serves.

   Arabic only. Rubik's hebrew and latin subsets stay in the app, where Rubik
   leads a whole UI; here Heebo and Inter already hold those scripts. */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('/fonts/rubik-arabic.woff2') format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}

/* Assistant — the default body face on index.html's Hebrew and English
   copy (home.css's unqualified `body` rule and its `html[lang="en"] body`
   override both lead with it; only Arabic mode swaps to IBM Plex Sans
   Arabic first). Hebrew first, then latin, for the same reason Frank Ruhl
   Libre orders its two subsets that way: an embedded Latin word ("Moodle",
   "Mac") inside a Hebrew sentence stays on the sentence's own face instead
   of breaking to Heebo or system-ui mid-word. Variable — its own axis,
   200-800, is Google's declared range for this family and was confirmed by
   sampling glyph advance across the full wght scale: flat at and below 200,
   flat at and above 800, moving continuously in between. */
@font-face {
  font-family: 'Assistant';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('/fonts/assistant-hebrew.woff2') format('woff2');
  unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
}
@font-face {
  font-family: 'Assistant';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url('/fonts/assistant-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;
}

/* IBM Plex Sans Arabic — the whole-body face for index.html's and
   folio.html's Arabic mode (home.css's `html[lang="ar"] body`, folio.css's
   `[lang="ar"] body, [lang="ar"] .tour`). Arabic subset only: Rubik above
   already carries this site's Hebrew and Latin, so Plex only ever needs to
   cover the one script neither of those two do. NOT a variable font on
   Google Fonts (see this file's header) — four discrete static weights
   instead of one ranged block, matching exactly what the CDN link this
   replaces was requesting. */
@font-face {
  font-family: 'IBM Plex Sans Arabic';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/fonts/plex-arabic-400.woff2') format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
@font-face {
  font-family: 'IBM Plex Sans Arabic';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/fonts/plex-arabic-500.woff2') format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
@font-face {
  font-family: 'IBM Plex Sans Arabic';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('/fonts/plex-arabic-600.woff2') format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
@font-face {
  font-family: 'IBM Plex Sans Arabic';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/fonts/plex-arabic-700.woff2') format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
