/* DM Sans — variable font, weights 300–700 */
@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/fonts/dm-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: 'DM Sans';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/fonts/dm-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;
}

/* Syne — variable font, weights 400–800 */
@font-face {
  font-family: 'Syne';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url('/fonts/syne-greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'Syne';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url('/fonts/syne-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: 'Syne';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url('/fonts/syne-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;
}

/* 'Syne G' -- one glyph, the g (RDDW-134, redrawn RDDW-142). Syne's
   lowercase g ends in a cut stub at the heavy weights; on a phone it reads
   as half a letter ("Satisfying", "games", "Drag"). Syne has no alternate
   g (no ss/cv/salt feature changes it), so every Syne stack names 'Syne G'
   first: it covers U+0067 only, and every other character falls through
   to 'Syne'.
   RDDW-134 took the g from DM Sans (<=700) and Rubik (800). Both are drawn
   at normal width, so beside Syne's extended letters the g looked narrow
   and foreign (Daniel's iPhone, 26 Sep 2026: "weird, doesn't match").
   Since RDDW-142 it is the g of Anybody (Etcetera Type Co., SIL OFL 1.1)
   at width 125%: an extended grotesque whose g is as wide and as heavy as
   Syne's a/e/s and ends in a full round hook. The file is the Google Fonts
   one-glyph subset (Anybody v13, text=g, wdth 125, wght 400-800), 1.6 KB,
   loaded only where a Syne g is on screen. */
/* The size follows Syne's weight (measured 26 Sep 2026 at 100 px): Syne's
   x-height is 51 at every weight, Anybody's g stands 60 tall. Under 750 --
   the 700 headings ("Danger zone", "Satisfying Physics") -- Syne's letters
   are ~64 wide and the g was 75: size-adjust 85% makes it 51 tall, 64 wide,
   with a 20-unit descender like Syne's p and q. At 800 Syne widens to ~100
   and the g keeps its full size (the home hero). One file, two faces. */
@font-face {
  font-family: 'Syne G';
  font-style: normal;
  font-weight: 400 749;
  font-stretch: 125%;
  font-display: swap;
  size-adjust: 85%;
  src: url('/fonts/syne-g-anybody.woff2') format('woff2');
  unicode-range: U+0067;
}
@font-face {
  font-family: 'Syne G';
  font-style: normal;
  font-weight: 750 800;
  font-stretch: 125%;
  font-display: swap;
  src: url('/fonts/syne-g-anybody.woff2') format('woff2');
  unicode-range: U+0067;
}

/* ==========================================================================
   Hebrew faces (RDDW-43).

   Syne and DM Sans carry no Hebrew glyphs at all, so every Hebrew string
   fell back to whatever face the visitor's device shipped, and a mixed line
   ("RDD-Labs הוא סטודיו") set the Latin in DM Sans beside Hebrew in a
   system face. Rubik (display) and Heebo (body) were both drawn with Hebrew
   as a first-class script and ship a matched Latin, so under dir="rtl" the
   whole page -- Latin runs included -- switches to them and no line shows a
   seam. The brand wordmarks stay in Syne on purpose (see controls.css).

   Both are variable and SIL OFL, self-hosted like the faces above, and split
   by unicode-range: an English visitor downloads none of these, a Hebrew
   visitor downloads the two Hebrew subsets plus the Latin ones actually
   used on the page. Files are the Google Fonts static subsets
   (Rubik v31, Heebo v28).
   ========================================================================== */

/* Rubik — variable, weights 300–900 */
@font-face {
  font-family: 'Rubik';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('/fonts/rubik-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: 'Rubik';
  font-style: normal;
  font-weight: 300 900;
  font-display: swap;
  src: url('/fonts/rubik-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 — variable, weights 100–900 */
@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;
}
