/* ==========================================================================
   Boundless
   --------------------------------------------------------------------------
   The palette is sampled from the app icon: a glowing infinity mark over a
   diagonal indigo, violet, blue, teal wash. Every gradient on this site
   traces back to those four stops so the site and the app read as one thing.

   Dark is the default because the app is a reader and readers live in dark
   rooms. Light is a full peer, not an afterthought.
   ========================================================================== */

/* Self-hosted, not linked from Google's own CDN: this site's CSP pins
   font-src to 'self', so this typeface has to be served from here or not
   exist at all. One file, a variable font covering the full weight axis
   (confirmed by Google's own CSS serving the identical file for every
   weight from 400 through 800, just re-labelled), a single @font-face
   with a weight range registers all of it under one family name, rather
   than needing a separate file and rule per weight actually used. */
@font-face {
  font-family: 'Boundless Display';
  /* ?v=1: server.js's static-asset middleware only sends the long-lived
     immutable cache header to requests carrying a ?v= query string, so this
     rarely-changing file needs one by hand. Whoever replaces the actual
     .woff2 file in the future has to bump this number too, or returning
     visitors keep getting served the old cached font for up to a year. */
  src: url('/fonts/BricolageGrotesque-Variable.woff2?v=1') format('woff2-variations');
  font-weight: 300 800;
  font-style: normal;
  font-display: swap;
}

/* Six bespoke display-name fonts, self-hosted for the same CSP reason
   Boundless Display is above: font-src 'self' means self-hosted or not at
   all. Sourced from Google Fonts, all six SIL Open Font License 1.1, chosen
   to read as genuinely different materials rather than six weight tricks on
   one family (those still exist too, see .name-styled[data-name-font=
   'bold'|'condensed'|'wide'|'italic'|'smallcaps'] in community.css): a poster
   stencil, a rounded warm sans, a soft old-style serif, a script that stays
   legible small, a characterful monospace, and a thick poster gothic in the
   same visual register as manga and webtoon titling.

   One static instance per font rather than a variable range, since a name
   is drawn at one weight, never animated between two: shipping the whole
   variable axis to use one point on it would be paying for range nothing
   here reads. Two @font-face rules per font, not one, both under the same
   font-family, split by unicode-range exactly the way Google's own css2
   endpoint splits them: a browser only fetches the "latin" file for a
   name made of plain ASCII letters, and only reaches for the larger
   "latin-ext" file (accented Latin: é, ñ, ř and the rest) the moment a
   character actually needs one. Fetched, never rendered from Google's own
   CDN, for the same font-src 'self' reason as Boundless Display; the two
   unicode-range values below are copied from Google's own css2 response
   rather than approximated, so the split still lands on the correct
   character exactly where Google's own web fonts do. */
@font-face {
  font-family: 'Bungee';
  src: url('/fonts/Bungee-Regular-latin.woff2?v=1') 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;
}
@font-face {
  font-family: 'Bungee';
  src: url('/fonts/Bungee-Regular-latin-ext.woff2?v=1') 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: 'Fredoka Bespoke';
  src: url('/fonts/Fredoka-SemiBold-latin.woff2?v=1') format('woff2');
  font-weight: 600;
  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;
}
@font-face {
  font-family: 'Fredoka Bespoke';
  src: url('/fonts/Fredoka-SemiBold-latin-ext.woff2?v=1') format('woff2');
  font-weight: 600;
  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: 'Fraunces Bespoke';
  src: url('/fonts/Fraunces-Display-latin.woff2?v=1') format('woff2');
  font-weight: 600;
  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;
}
@font-face {
  font-family: 'Fraunces Bespoke';
  src: url('/fonts/Fraunces-Display-latin-ext.woff2?v=1') format('woff2');
  font-weight: 600;
  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: 'Caveat Bespoke';
  src: url('/fonts/Caveat-SemiBold-latin.woff2?v=1') format('woff2');
  font-weight: 600;
  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;
}
@font-face {
  font-family: 'Caveat Bespoke';
  src: url('/fonts/Caveat-SemiBold-latin-ext.woff2?v=1') format('woff2');
  font-weight: 600;
  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: 'Space Mono Bespoke';
  src: url('/fonts/SpaceMono-Bold-latin.woff2?v=1') 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;
}
@font-face {
  font-family: 'Space Mono Bespoke';
  src: url('/fonts/SpaceMono-Bold-latin-ext.woff2?v=1') 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: 'Dela Gothic One';
  src: url('/fonts/DelaGothicOne-Regular-latin.woff2?v=1') 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;
}
@font-face {
  font-family: 'Dela Gothic One';
  src: url('/fonts/DelaGothicOne-Regular-latin-ext.woff2?v=1') 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;
}

/* Three more, and these three are not a Google Fonts cut at all: real
   variable-font source files (Fraunces and Recursive, both already above
   in their tamer instances) pinned with fontTools' varLib.instancer at
   axis coordinates neither ships as a named style anywhere, so the actual
   letterform outlines here exist nowhere else. Built, not picked.

   Fraunces Wonk: opsz 144 (its own max, the most extreme ink traps the
   design has), wght 900 (black), SOFT 100 (max, blobby rounded terminals),
   WONK 1 (max, the quirky alternate forms). Fraunces ships wght 600 above
   for the tame "Fraunces" style; this is the same design pushed to every
   one of its four axes at once, the same source file, an entirely
   different face.

   Recursive Wild and Recursive Mono Casual both instance the same
   Recursive source at two deliberately opposite corners of its five-axis
   space (MONO, CASL, wght, slnt, CRSV), chosen to read as two unrelated
   fonts rather than two variations on one theme: Wild leans into CASL 1
   (fully casual/handwritten forms), wght 1000, slnt -15 (leaning) and CRSV
   1 (cursive joins) for something loose and slanted; Mono Casual instead
   sets MONO 1 (fixed-width) alongside CASL 1 for a typewritten-but-loose
   hybrid neither pure state reaches alone. */
@font-face {
  font-family: 'Fraunces Wonk';
  src: url('/fonts/FrauncesWonk-latin.woff2?v=1') format('woff2');
  font-weight: 900;
  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;
}
@font-face {
  font-family: 'Fraunces Wonk';
  src: url('/fonts/FrauncesWonk-latin-ext.woff2?v=1') format('woff2');
  font-weight: 900;
  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: 'Recursive Wild';
  src: url('/fonts/RecursiveWild-latin.woff2?v=1') format('woff2');
  font-weight: 1000;
  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;
}
@font-face {
  font-family: 'Recursive Wild';
  src: url('/fonts/RecursiveWild-latin-ext.woff2?v=1') format('woff2');
  font-weight: 1000;
  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: 'Recursive Mono Casual';
  src: url('/fonts/RecursiveMonoCasual-latin.woff2?v=1') format('woff2');
  font-weight: 800;
  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;
}
@font-face {
  font-family: 'Recursive Mono Casual';
  src: url('/fonts/RecursiveMonoCasual-latin-ext.woff2?v=1') format('woff2');
  font-weight: 800;
  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;
}
