/* ==========================================================================
   adminless.ai, self-hosted type (promoted from the mockup, 2026-09-14).

   The mockup pulled Fraunces, IBM Plex Sans and IBM Plex Mono from
   fonts.googleapis.com. The family spec forbids that on the shipped sites
   ("self-hosted WOFF2, no Google Fonts requests, the legal page sells
   privacy", LANDING_PAGES.md), and a company card that names a privacy
   product must not hand every visitor's IP to a third party on first paint.
   So the faces are served from this site's own /fonts/ directory.

   Only the `latin` and `latin-ext` subsets are shipped. The mockup's request
   also carried `vietnamese`, plus seven display families belonging to type
   presets that no longer exist on this page (Instrument Serif, Inter, Inter
   Tight, Newsreader, Playfair Display, Source Sans 3, Source Serif 4), the
   baked preset is `fraunces`, so those are gone with the picker.

   The subsets, the unicode-ranges and the weight ranges below are the exact
   ones Google's own css2 response declares for these faces, so the split
   points still line up with the bytes in each file.

   ⚠ THE FIVE `latin` FILES ARE SUBSETS, THE `latin-ext` FILES ARE NOT (SEO and
   performance pass, 2026-09-15). Every latin face was cut with pyftsubset to
   the glyphs this card renders (printable ASCII plus nbsp, the middle dot, the
   en dash, both quote pairs, the ellipsis, the arrow and the tick), and its
   variable axes were pinned to the range the CSS asks for: Fraunces keeps only
   opsz 25 to 38, which is the card's two display sizes, and its wght plus
   Plex Sans's wght are pinned at 400, which is the only weight either face is
   ever set at here. 219KB of preloaded woff2 became 69KB.

   MEASURED, because the second half of that is not free: the glyph cut alone
   renders PIXEL-IDENTICAL (full-page PNG diff at 1440x900 and 375, zero
   differing pixels), while baking the axes moves 754 pixels at 1440 and 291
   at 375, all of them inside the h1 and the door names and all of them
   antialiasing on outlines the browser used to interpolate itself. No line
   re-wraps, no box moves, no height changes. Keeping the axes whole instead
   of baking them would put the preloaded set back at 143KB rather than 69KB;
   that is the trade, and it was taken on Jake's "subset to the glyphs,
   weights and axes actually used".

   So a `font-weight: 500` on a latin character now synthesises rather than
   interpolating, and a font-size outside 25-38px clamps to the nearest end of
   the opsz range. Both are deliberate: if either becomes wrong, re-cut from
   the originals (Google Fonts, same subsets) rather than widening a range
   here, because the file no longer carries what the range would promise.
   The four latin-ext files are untouched full faces: no character on this page
   falls in their unicode-range, so a browser never fetches one, and leaving
   them whole is the difference between a fallback and a tofu the day one does.

   Weights: Fraunces 400, Plex Sans 400, Plex Mono 400 and 500 (two static
   faces, Plex Mono has no variable release).

   `font-display: swap` with the five above-the-fold latin faces preloaded
   from index.html: the page is one screen, so every face is needed on first
   paint and a same-origin preload lands them in the first round trip. swap
   is the fallback of last resort, not the expected path.
   ========================================================================== */

/* --- Fraunces (display: the h1, the door names) --------------------------- */

@font-face {
  font-family: Fraunces;
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/fraunces-var-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;
}
@font-face {
  font-family: Fraunces;
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url("fonts/fraunces-var-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;
}

/* the h1's second half is set in the accent italic, so the italic file is as
   load-bearing as the upright one */
@font-face {
  font-family: Fraunces;
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/fraunces-italic-var-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;
}
@font-face {
  font-family: Fraunces;
  font-style: italic;
  font-weight: 400 500;
  font-display: swap;
  src: url("fonts/fraunces-italic-var-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;
}

/* --- IBM Plex Sans (body: the sub-line, the door lines, the promise) ------ */

@font-face {
  font-family: "IBM Plex Sans";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/plex-sans-var-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;
}
@font-face {
  font-family: "IBM Plex Sans";
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url("fonts/plex-sans-var-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;
}

/* --- IBM Plex Mono (labels: wordmark, eyebrows, hostnames, footer) -------- */

@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/plex-mono-400-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;
}
@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/plex-mono-400-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: "IBM Plex Mono";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("fonts/plex-mono-500-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;
}
@font-face {
  font-family: "IBM Plex Mono";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("fonts/plex-mono-500-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;
}
