/* ============================================================================
   Loxodon — internal-type.css   ·   body-typeface layer
   ----------------------------------------------------------------------------
   Sets IBM Plex Sans as the internal body face and IBM Plex Mono as the
   monospace, keeping Satoshi on all display/chrome type: headings, the
   uppercase overline, nav, buttons, badges, table heads and form controls.

   Load AFTER admin.css (and, when the HTML reports land, BEFORE report.css) —
   admin/templates/base.html:
     <link rel="stylesheet" href="{{ url_for('static', path='/admin.css') }}">
     <link rel="stylesheet" href="{{ url_for('static', path='/internal-type.css') }}">

   Order is load-bearing twice over: `body{font-family}` and the `--mono`
   token are both redeclared here at the same specificity admin.css uses, so
   whichever stylesheet comes last wins. Link this one first and the swap
   silently does nothing.

   admin.css stays byte-identical to the production stylesheet — the swap lives
   entirely here, so it can be reverted by removing one <link>.

   Faces: IBM Plex Sans Var / Mono Var (variable, wght 100–700), self-hosted
   from the IBM/plex repo split woff2 subsets (github.com/IBM/plex,
   packages/plex-{sans,mono}-variable/fonts/split/woff2/, renamed to drop the
   spaces; SIL OFL 1.1, licence text alongside them in static/fonts/).
   Latin1 + Latin2 + Pi for the roman, Latin1 for the italic — Pi carries
   the arrows (→ U+2192), maths signs and ≈ ≤ ≥ that report prose uses
   constantly, so it is not optional.
   Total ~271 KB, all served from origin (the admin sends
   Content-Security-Policy: default-src 'self').
   ============================================================================ */

/* ---- IBM Plex Sans Var — roman ------------------------------------------- */
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-stretch:85% 100%;font-display:swap;src:url('/static/fonts/IBMPlexSansVar-Roman-Latin1.woff2') format('woff2');unicode-range:U+0000,U+000D,U+0020-007E,U+00A0-00FF,U+0131,U+0152-0153,U+02C6,U+02DA,U+02DC,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2039-203A,U+2044,U+20AC,U+2122,U+2212,U+FB01-FB02}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-stretch:85% 100%;font-display:swap;src:url('/static/fonts/IBMPlexSansVar-Roman-Latin2.woff2') format('woff2');unicode-range:U+0100-0101,U+0104-0130,U+0132-0151,U+0154-017F,U+018F,U+0192,U+01A0-01A1,U+01AF-01B0,U+01FA-01FF,U+0218-021B,U+0237,U+0259,U+1E80-1E85,U+1E9E,U+20A1,U+20A4,U+20A6,U+20A8-20AA,U+20AD-20AE,U+20B1-20B2,U+20B4-20B5,U+20B8-20BA,U+20BD,U+20BF}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:100 700;font-stretch:85% 100%;font-display:swap;src:url('/static/fonts/IBMPlexSansVar-Roman-Pi.woff2') format('woff2');unicode-range:U+0E3F,U+2000-200D,U+2015,U+2028-2029,U+202F,U+2032-2033,U+2070,U+2074-2079,U+2080-2089,U+2113,U+2116,U+2126,U+212E,U+2150-2151,U+2153-215E,U+2190-2199,U+21A9-21AA,U+21B0-21B3,U+21B6-21B7,U+21BA-21BB,U+21C4,U+21C6,U+2202,U+2206,U+220F,U+2211,U+2215,U+221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+25CA,U+2713,U+274C,U+2B0E-2B11,U+FEFF,U+FFFD}
/* ---- IBM Plex Sans Var — italic (<em> in notices and empty states) ------- */
@font-face{font-family:'IBM Plex Sans';font-style:italic;font-weight:100 700;font-stretch:85% 100%;font-display:swap;src:url('/static/fonts/IBMPlexSansVar-Italic-Latin1.woff2') format('woff2');unicode-range:U+0000,U+000D,U+0020-007E,U+00A0-00FF,U+0131,U+0152-0153,U+02C6,U+02DA,U+02DC,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2039-203A,U+2044,U+20AC,U+2122,U+2212,U+FB01-FB02}
/* ---- IBM Plex Mono Var --------------------------------------------------- */
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:100 700;font-display:swap;src:url('/static/fonts/IBMPlexMonoVar-Roman-Latin1.woff2') format('woff2');unicode-range:U+0000,U+000D,U+0020-007E,U+00A0-00FF,U+0131,U+0152-0153,U+02C6,U+02DA,U+02DC,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2039-203A,U+2044,U+20AC,U+2122,U+2212,U+FB01-FB02}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:100 700;font-display:swap;src:url('/static/fonts/IBMPlexMonoVar-Roman-Pi.woff2') format('woff2');unicode-range:U+0E3F,U+2000-200D,U+2015,U+2028-2029,U+202F,U+2032-2033,U+2070,U+2074-2079,U+2080-2089,U+2113,U+2116,U+2126,U+212E,U+2150-2151,U+2153-215E,U+2190-2199,U+21A9-21AA,U+21B0-21B3,U+21B6-21B7,U+21BA-21BB,U+21C4,U+21C6,U+2202,U+2206,U+220F,U+2211,U+2215,U+221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+25CA,U+2713,U+274C,U+2B0E-2B11,U+FEFF,U+FFFD}

/* ---- Tokens --------------------------------------------------------------
   --sans stays Satoshi (display/chrome) so every existing rule in admin.css
   that references it keeps working. --body is new; --mono is redirected. */
:root{
  --body:'IBM Plex Sans',system-ui,-apple-system,'Segoe UI',sans-serif;
  --mono:'IBM Plex Mono',ui-monospace,'SF Mono',Menlo,Consolas,monospace;
}

/* ---- Body face ----------------------------------------------------------- */
body{font-family:var(--body)}

/* ---- Satoshi retained: display type and chrome --------------------------- */
h1,h2,h3,h4,h5,h6,
nav,nav a,nav strong,
button,a[role="button"],input[type=submit],
th,legend,label,
.overline,.badge,.pill,
.severity-ok,.severity-info,.severity-low,.severity-medium,.severity-high,.severity-warning,.severity-critical,
/* Pills the UI kit did not model: .severity-quarantined is an admin-only
   state (admin.css), .severity-unknown is the Weekly Check block's
   "could not evaluate" state (issue #422), and .badge-superuser is an
   account fact wearing the pill geometry. All chrome; without them they
   would inherit Plex and be the only pills in the app not set in Satoshi. */
.severity-quarantined,.severity-unknown,.badge-superuser,
.tally .n,.tally .k,.metric .l,.figure .l,.check-name,.spark-axis,
.trend,.finding-head .scope,.index .r{font-family:var(--sans)}

/* Form controls read as chrome, not prose. */
input[type=text],input[type=email],input[type=password],input[type=number],
input[type=file],select,textarea{font-family:var(--sans)}

/* ---- Optical corrections -------------------------------------------------
   Plex Sans sets a little wider and a little larger on the x-height than
   Satoshi at the same nominal size; these three keep line lengths and the
   vertical rhythm where they were. */
body{font-size:14.5px;line-height:1.62}
small{font-size:12px}
.metric .v,.tally .n{letter-spacing:-.01em}
