/* oz-fonts.css — the venue's own typefaces, served by the venue.
 *
 * Owner, 24 Aug: *"واحد صاحبي فتح الموقع من على Brave Browser وكل الموقع كان
 * بايظ، الفوتر كبير جداً وبايظ والألوان وحشة."*
 *
 * Every page loaded Orbitron, Rajdhani and Cairo from `fonts.googleapis.com`,
 * and BRAVE BLOCKS THAT BY DEFAULT — it is one of the requests its shields stop
 * as a fingerprinting vector, with no setting most people ever touch. So his
 * friend got a site with none of its three typefaces.
 *
 * That alone explains what he described. 310 declarations in this codebase said
 * `font-family:'Orbitron'` with NOTHING after the comma, so when Orbitron is
 * unavailable the browser falls all the way to its DEFAULT — a serif, at
 * different metrics — for every heading, every number, and the whole footer.
 * A site drawn in Times at Orbitron's sizes is exactly "the footer is enormous
 * and the colours look wrong": nothing about the colours changed, but a display
 * face swapped for a book face makes a dark theme look like a broken document.
 *
 * IT IS NOT ONLY BRAVE. Any privacy extension, any network that blocks Google,
 * and any slow DNS produces the same page. A venue whose site depends on a
 * third party to look like itself is a venue that does not control its own
 * brand (§3.7).
 *
 * THE FILES ARE OURS ALREADY. The player app has bundled all nine since it
 * shipped — same families, same weights, already licensed (all three are Open
 * Font License). Nothing was downloaded to build this; the files were copied
 * out of `occupy_player/assets/fonts/`.
 *
 * WHAT IS AND IS NOT SHIPPED, and why:
 *   Orbitron  — all three weights. 17KB each, and it is the brand.
 *   Cairo     — all three. Arabic is not optional here, and 91KB is fair.
 *   Rajdhani  — ONE weight, synthesised across 400–700. Each file is 363KB,
 *               because Rajdhani carries Devanagari the venue will never use,
 *               and three of them would be a megabyte of body text nobody
 *               looks at. One real weight beats a megabyte.
 *
 * 696KB in total, once, and the service worker keeps it.
 *
 * 18 SEP 2026 — 194KB NOW, AND WHY. A first visit to the homepage measured
 * 1.56MB, and Rajdhani alone was 354KB of it, sent uncompressed (the server
 * does not gzip fonts). The note above already knew why: Devanagari. It was
 * never REMOVED. The WOFF files are those same fonts, with two changes and
 * no others: Rajdhani subset to Latin + punctuation (362,824 -> 20,980
 * bytes), and all seven moved into WOFF, which compresses inside the file
 * so the server's missing gzip stops mattering. Orbitron and Cairo keep
 * EVERY glyph (208 and 822, unchanged) — Cairo's Arabic is not negotiable.
 * The TTF fallback was tried and REMOVED the same hour: tests/fonts.test.js
 * requires every file a src names to be precached, and a fallback the
 * offline copy does not hold is exactly the failure it guards — in the
 * arena, with no signal. WOFF has worked in every browser since 2011.
 * tests/fontweight.test.js opens the files and holds all of this.
 */

/* ---- Orbitron: display, numerals, the HUD ---- */
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Orbitron-Bold.woff2') format('woff2'), url('assets/fonts/Orbitron-Bold.woff') format('woff');
  font-weight: 700;
  font-style: normal;
  /* Text is readable in the fallback while the file arrives, rather than
     invisible. An arena's wifi is the first thing to go. */
  font-display: swap;
}
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Orbitron-ExtraBold.woff2') format('woff2'), url('assets/fonts/Orbitron-ExtraBold.woff') format('woff');
  font-weight: 800;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Orbitron-Black.woff2') format('woff2'), url('assets/fonts/Orbitron-Black.woff') format('woff');
  font-weight: 900;
  font-style: normal;
  font-display: swap;
}

/* ---- AND THE DIGITS INSIDE IT COME FROM RAJDHANI ----
 *
 * Owner, 6 Sep 2026, picking option 3 of three rendered samples: *"غيره في كل
 * الموقع"*.
 *
 * ORBITRON DRAWS A SLASHED ZERO. It is a display face and the slash is
 * deliberate there, the way a gauge or a terminal draws one. On a price, a
 * points balance or a KDA it reads as a box with a line through it, and the
 * venue's numbers are the thing customers actually squint at.
 *
 * It is not a switch. `Orbitron-Bold.ttf` carries GPOS:kern and GPOS:mark and
 * NO GSUB TABLE AT ALL, so there is no `zero` or `ss01` feature to turn off and
 * no weight that draws it plain. Verified by reading the font's own table
 * directory rather than trusting a note that said so.
 *
 * WHY HERE AND NOT IN THE PAGES. 373 rules across 25 files say
 * `font-family:'Orbitron'`, and roughly half of them land on a number. Editing
 * them one at a time would mean deciding 373 times whether a thing is a
 * heading or a value, getting some of them wrong, and leaving the next rule
 * anyone writes free to bring the slash back. Declared here, every rule that
 * already exists and every rule anyone writes later gets Rajdhani digits, and
 * the whole change is this block plus one line on each Orbitron face.
 *
 * TWO THINGS ABOUT THE SHAPE, both learned by getting them wrong:
 *
 *   ONE FACE PER WEIGHT, not one face declared `font-weight: 400 900`. With a
 *     span, this face won the weight match for the whole family and the digits
 *     came out in the fallback instead of Rajdhani. Measured: 210.0px for
 *     "0123456" against Rajdhani's 203.5px.
 *   AND THE ORBITRON FACES KEEP THEIR FULL COVERAGE. My first version also
 *     restricted them to everything-but-digits, which is the tidy-looking half
 *     of the idea and it cost the site its display face entirely: the three
 *     Orbitron files stopped being fetched at all and every heading fell back
 *     to a serif. Later declaration is enough to win the overlap; the earlier
 *     faces do not need narrowing, and narrowing them broke them.
 *
 * 24 SEP 2026 — A REAL BOLD, AND EVERY DIGIT ON THE SITE FROM ONE FACE.
 * Owner, on the booking page: «الخط شكله وحش في الأرقام شوية بولد وشوية عادي
 * وسيء». Measured there: digits in THREE faces at FOUR weights — Rajdhani
 * SemiBold standing in for Orbitron 900 (the big headcount, which read THIN at
 * 60px), Cairo's own digits at 400 to 800 (the count buttons, the bill), and
 * Arial (a button whose font rule was invalid, see tests/fontshorthand). So:
 *   · Orbitron's digits (700/800/900) come from Rajdhani BOLD, a real file cut
 *     to the same 214 characters as the SemiBold one (20.9KB), so a big number
 *     is as heavy as a small one;
 *   · Cairo's digits, comma, point and colon come from Rajdhani too (below the
 *     Cairo faces), SemiBold at 600 and Bold at 700 and 800 — so a price in an
 *     Arabic sentence and the same price in a heading are one shape;
 *   · Rajdhani itself is SemiBold to 600 and Bold from 700.
 */
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039;
}
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 800;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039;
}
@font-face {
  font-family: 'Orbitron';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 900;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039;
}

/* WOFF2 FIRST (5 Oct 2026). The eight WOFF1 faces (Cairo 600/700/800, Orbitron
   700/800/900, Rajdhani 600/700) are served as WOFF2, made from the same files with
   fontTools and brotli (the owner's OK, «نزل اللي انت عايزه طلاما مفيد»): the same
   glyphs, counted (822, 208, 215), and a quarter smaller; Cairo, the heaviest,
   47 KB to 34 KB each. The WOFF stays second in each src, for a browser without
   WOFF2; the service worker keeps the WOFF2. */
/* ---- Cairo: every Arabic string on the site ---- */
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Cairo-SemiBold.woff2') format('woff2'), url('assets/fonts/Cairo-SemiBold.woff') format('woff');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Cairo-Bold.woff2') format('woff2'), url('assets/fonts/Cairo-Bold.woff') format('woff');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Cairo-ExtraBold.woff2') format('woff2'), url('assets/fonts/Cairo-ExtraBold.woff') format('woff');
  font-weight: 800;
  font-style: normal;
  font-display: swap;
}
/* Cairo REGULAR (27 Sep 2026): reading text is 400 (DESIGN.md), and until
   now there was no 400 on disk, so every Arabic paragraph was drawn in the
   600 face, a shade too heavy for long text. Google's own three subsets,
   woff2, fetched once and served from here (the owner's OK, «نزّلهم»).
   They cover the whole font between them, so nothing falls through. */
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Cairo-Regular-arabic.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  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: 'Cairo';
  src: url('assets/fonts/Cairo-Regular-latin-ext.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  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: 'Cairo';
  src: url('assets/fonts/Cairo-Regular-latin.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  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;
}
/* ...AND THE NUMBERS INSIDE ARABIC come from Rajdhani, the site's one number
   face (see the note above). One face per weight, as the Orbitron digits
   learned; later than the Cairo faces, so they win the overlap. */
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Rajdhani-SemiBold.woff2') format('woff2'), url('assets/fonts/Rajdhani-SemiBold.woff') format('woff');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039, U+002C, U+002E, U+003A;
}
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Rajdhani-SemiBold.woff2') format('woff2'), url('assets/fonts/Rajdhani-SemiBold.woff') format('woff');
  font-weight: 600;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039, U+002C, U+002E, U+003A;
}
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039, U+002C, U+002E, U+003A;
}
@font-face {
  font-family: 'Cairo';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 800;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0030-0039, U+002C, U+002E, U+003A;
}

/* ---- Rajdhani: English body text ----
 *
 * One file for the whole range. A static face declared across 400–700 lets the
 * browser synthesise the heavier ones — slightly less crisp than a real bold,
 * and worth it against 730KB of Devanagari this venue will never render.
 */
@font-face {
  font-family: 'Rajdhani';
  src: url('assets/fonts/Rajdhani-SemiBold.woff2') format('woff2'), url('assets/fonts/Rajdhani-SemiBold.woff') format('woff');
  font-weight: 400 600;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Rajdhani';
  src: url('assets/fonts/Rajdhani-Bold.woff2') format('woff2'), url('assets/fonts/Rajdhani-Bold.woff') format('woff');
  font-weight: 700 900;
  font-style: normal;
  font-display: swap;
}

/* ---- Changa: section headlines, both languages (27 Sep 2026) ----
 *
 * Seven Arabic display faces were set in the site's real headlines on the
 * real canvas and compared by eye. Changa is a compact Kufi with a squared,
 * engineered stroke; it gives a headline a voice without shouting, and it
 * stays on two lines on a phone where the wide Kufis take three. Bold only:
 * it is a headline face and nothing else. Its digits are its own; a
 * headline's number is part of the headline, not a score. */
@font-face {
  font-family: 'Changa';
  src: url('assets/fonts/Changa-Bold-arabic.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  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: 'Changa';
  src: url('assets/fonts/Changa-Bold-latin-ext.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  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: 'Changa';
  src: url('assets/fonts/Changa-Bold-latin.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  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;
}

/* ---- AND A FALLBACK THAT IS NOT TIMES ----
 *
 * Belt and braces. Even self-hosted, a file can 404 after a bad deploy, and a
 * bare `font-family:'Orbitron'` would put the whole site in a serif again. This
 * gives the three families a sane stack at the root, so anything that inherits
 * lands on a system sans rather than on the browser's default book face.
 *
 * It does NOT replace the per-declaration fallbacks — those are in the pages,
 * because a rule that sets `font-family` overrides this one entirely. This is
 * what catches everything that never sets one at all.
 */
:root {
  --oz-sans: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  --oz-display: 'Orbitron', var(--oz-sans);
  --oz-body: 'Rajdhani', var(--oz-sans);
  --oz-arabic: 'Cairo', var(--oz-sans);
  --oz-headline: 'Changa', 'Cairo', var(--oz-sans);
}
