/* Self-hosted webfonts — mirrored from Google Fonts, served from origin.
 *
 * Why these are not loaded from fonts.googleapis.com any more:
 *
 *  1. sw.js ignores cross-origin requests (`url.origin !== location.origin`),
 *     so Google Fonts were never cached. The installed PWA and offline.html
 *     fell back to system monospace with the network gone, which on a
 *     CRT-terminal aesthetic is the whole look collapsing. Files under
 *     /static/ are cached cache-first.
 *  2. It lets both Google origins leave the CSP. style-src already carries
 *     'unsafe-inline', so it is the loosest directive in the policy; the
 *     googleapis URL serves a *stylesheet*, and a compromised response there
 *     is CSS injection -- attribute-selector exfiltration, overlay, UI-redress.
 *  3. It removes an IP/user-agent disclosure to a third party, which the
 *     privacy policy had to declare and German case law (LG Muenchen I,
 *     January 2022) treats as a GDPR problem for dynamic embedding.
 *  4. No dependency on Google being reachable.
 *
 * All three faces are SIL OFL 1.1, which permits redistribution and REQUIRES
 * the licence travel with the fonts: see OFL.txt in this directory.
 *
 * unicode-range is kept exactly as Google served it, so a page still fetches
 * only the subsets it needs. font-display: swap is kept to avoid invisible
 * text, though the swap window is far shorter now that these are same-origin
 * and service-worker cached.
 */

/* runic */
@font-face {
  font-family: 'Noto Sans Runic';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/noto-sans-runic-runic.woff2') format('woff2');
  unicode-range: U+16A0-16F8;
}

/* latin-ext */
@font-face {
  font-family: 'Noto Sans Runic';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/noto-sans-runic-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;
}

/* latin */
@font-face {
  font-family: 'Noto Sans Runic';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/noto-sans-runic-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;
}

/* vietnamese */
@font-face {
  font-family: 'VT323';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/vt323-vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}

/* latin-ext */
@font-face {
  font-family: 'VT323';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/vt323-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;
}

/* latin */
@font-face {
  font-family: 'VT323';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/vt323-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;
}

/* latin */
@font-face {
  font-family: 'Share Tech Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/static/fonts/share-tech-mono-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;
}

/* Box drawing and block elements, plus the space -- a 4KB subset of DejaVu Sans
 * Mono 2.37, made with fontTools' pyftsubset (U+0020, U+2500-259F).
 *
 * The ASCII marks are built from these, and none of the faces above has a
 * single one of them: Share Tech Mono is Latin only. So every █ and ═ in the
 * logo used to be drawn by whatever the device calls `monospace`, beside
 * spaces drawn by Share Tech Mono. On a Linux desktop that is DejaVu Sans Mono,
 * and the logo looked as intended; a phone substitutes its own font -- iOS can
 * reach a proportional symbol face -- and the columns drift out of true. Serving
 * the glyphs from here draws them the same on every device.
 *
 * Its unicode-range carries the space so that a mark set in this face alone
 * (.nr-sigil) spaces on the same 0.602em grid its blocks do. Behind Share Tech
 * Mono, as in the logo, Share Tech Mono still answers for the space.
 *
 * Bitstream Vera licence, which requires the notice travel with the font: see
 * DEJAVU-LICENSE.txt in this directory. */
@font-face {
  font-family: 'Psibyl Glyphs';
  font-style: normal;
  font-weight: 400;
  font-display: block;
  src: url('/static/fonts/dejavu-sans-mono-glyphs.woff2') format('woff2');
  unicode-range: U+0020, U+2500-259F;
}

/* The @ in the avatar at the rail's foot, alone (owner, 2026-10-06): an 844-
 * byte subset of DejaVu Sans Bold 2.37, U+0040 only. A one-off: neither of
 * the faces above draws an @ that holds up inside a 28px circle -- VT323's is
 * tall and narrow, Share Tech Mono's thin -- and this one is wide, round and
 * heavy. Same licence as the subset above (DEJAVU-LICENSE.txt). */
@font-face {
  font-family: 'Psibyl At';
  font-style: normal;
  font-weight: 700;
  font-display: block;
  src: url('/static/fonts/dejavu-sans-bold-at.woff2') format('woff2');
  unicode-range: U+0040;
}
