/* Self-hosted app faces. Generated from Google Fonts css2 (Chrome UA → woff2),
   latin + latin-ext subsets only.

   ⚠ WHY THESE ARE LOCAL AND NOT A <link> TO fonts.googleapis.com.
   The app used to request all four families with `display=swap`, which is a
   promise to render in a FALLBACK first and swap when the real face lands.
   Three costs, all of them real here:

   1. Glen watched it happen — "as the reports folder is opening I see my 6's
      with the rounded tops then it changes to the straight 6 version we agreed
      on." That is Arial (the `sans-serif` fallback under the DMR's
      `font-family:"Lato",sans-serif !important`) being replaced by Lato.
   2. The DMR's THREE font fitters measure text to size it. A fit that runs
      during the fallback frame measures Arial's advance widths and wrap points,
      then Lato lands and reflows underneath the answer. fitCommentsFont and
      fitAdditionsFont re-run on document.fonts.ready; the MIX fitter's ready
      pass was never wired in, so the mix band could keep a size fitted to the
      wrong typeface. With no swap there is no wrong frame to fit against.
   3. The batch PDF is rasterised from that DOM. The browser Save-as-PDF copy
      Glen sent embeds `AAAAAA+Lato-Black`, `BAAAAA+Lato-Bold`,
      `CAAAAA+Lato-Regular` — and `DAAAAA+ArialMT`. Arial is in a client's PDF.

   `font-display: block` (not swap) is the point: the browser paints nothing in
   that face until it is ready rather than painting the wrong one. Safe because
   these are same-origin and preloaded, so the block period is ~0; on a cold
   cache the absolute worst case is a 3 s invisible period before it falls back,
   which is strictly better than shipping the wrong glyphs into a signed sheet.

   ⚠ CAVEAT IS DELETED, NOT MOVED. Its last real use was removed 2026-05-27 and
   only a comment recording that survived, so the app has been fetching a 75 KB
   handwriting face on every page load for three months for nothing. Verified on
   comment-stripped source: zero references in code.

   Archivo and DM Sans are VARIABLE (one file covers every weight the app asks
   for). Lato publishes no variable font, so 400/700/900 are separate — and per
   app.html's standing note, Lato has no 500/600/800 at all: CSS weight-matching
   snaps those to 400/700/900. Do not "complete" the list. */

/* ── Archivo — display + the app-wide numeric token --np-num ── */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 100 900;
  font-display: block;
  src: url('/fonts/archivo-100-900-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 100 900;
  font-display: block;
  src: url('/fonts/archivo-100-900-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;
}

/* ── DM Sans — app body face ── */
@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 100 1000;
  font-display: block;
  src: url('/fonts/dmsans-100-1000-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'DM Sans';
  font-style: normal;
  font-weight: 100 1000;
  font-display: block;
  src: url('/fonts/dmsans-100-1000-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;
}

/* ── Lato — the DMR sheet's face (.dmr-v3 .v2sheet blanket rule) ── */
@font-face {
  font-family: 'Lato'; font-style: normal; font-weight: 400; font-display: block;
  src: url('/fonts/lato-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Lato'; font-style: normal; font-weight: 400; font-display: block;
  src: url('/fonts/lato-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: 'Lato'; font-style: normal; font-weight: 700; font-display: block;
  src: url('/fonts/lato-700-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Lato'; font-style: normal; font-weight: 700; font-display: block;
  src: url('/fonts/lato-700-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: 'Lato'; font-style: normal; font-weight: 900; font-display: block;
  src: url('/fonts/lato-900-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Lato'; font-style: normal; font-weight: 900; font-display: block;
  src: url('/fonts/lato-900-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;
}
