/* ==========================================================================
   typography.css — brand faces (operator 2026-09-12)

   Titling / display : Sweet Sans Pro, self-hosted WOFF2 (rule 46, the
                       operator-locked primary face since 2026-05-27).
                       Replaces Archivo, which arrived with the v3 base and
                       was never part of the brand.
   Sub-font          : Doppio One, replacing IBM Plex Mono.

   Canonical @font-face block per memory/reference/visual-identity.md.
   Self-hosted fonts need `font-src 'self'` in any CSP on the surface.
   ========================================================================== */
/* Each face declares a weight RANGE, not a single weight. A request for 300 or
   600 then resolves to the nearest REAL file instead of the browser
   synthesising a fake light or bold from the outlines, which is what 346
   elements on this page were getting. */
@font-face{font-family:'Sweet Sans Pro';src:url('/fonts/SweetSansPro-Regular.woff2') format('woff2');font-weight:100 449;font-style:normal;font-display:swap}
@font-face{font-family:'Sweet Sans Pro';src:url('/fonts/SweetSansPro-Medium.woff2')  format('woff2');font-weight:450 549;font-style:normal;font-display:swap}
@font-face{font-family:'Sweet Sans Pro';src:url('/fonts/SweetSansPro-Bold.woff2')    format('woff2');font-weight:550 799;font-style:normal;font-display:swap}
@font-face{font-family:'Sweet Sans Pro';src:url('/fonts/SweetSansPro-Heavy.woff2')   format('woff2');font-weight:800 1000;font-style:normal;font-display:swap}

/* Doppio One has exactly one weight. Self-hosted (12KB, one less third-party
   request) and declared across the full range so no weight is ever faked. */
@font-face{font-family:'Doppio One';src:url('/fonts/DoppioOne-Regular.woff2') format('woff2');font-weight:100 1000;font-style:normal;font-display:swap}

:root {
  --font-display: 'Sweet Sans Pro', 'Helvetica Neue', Arial, sans-serif;
  --font-mono:    'Doppio One', 'Helvetica Neue', Arial, sans-serif;
}

/* Doppio One ships ONE weight (400). Anything asking for 300/500/600 would be
   synthesised by the browser into a faux-bold or faux-light, which looks
   wrong. Pin every former-mono weight to 400 and carry emphasis with colour
   and letter-spacing, which this design already uses heavily. */
.label, .readbar, .apr__part, .dash__k, .stat__k, .kv__k, .tier, .chip,
.term, .term-btn, .act-btn, .tree, .tree__row, .badge, .hud__k, .dash__earnk,
.phead__note, .section__note, .dash__note, .dash__hint, .spec__k, .spec__v,
code, pre, .addr__v, .ov__num, .foot__legal, .row__arch, .cell__go {
  font-weight: 400;
}

/* Addresses and figures lose column alignment in a proportional face.
   Tabular numerals restore it for digits, which is where it matters most. */
.addr__v, .stat__v, .apr__part .val, .dash__big, .spec__v, code,
.row__score, .kv__v, .hud__v, .count, .count3 {
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

/* Sweet Sans Pro ships 400/500/700/900. Anything asking for 300 or 600 gets
   synthesised by the browser, which thins or thickens the real outlines and
   looks subtly wrong next to the genuine weights. Snap to what exists. */
.lede, .muted, .hero__sub, .phead__sub, .cell__desc, .pub__desc, p {
  font-weight: 400;
}
.h2, .h3, .cell__name, .pub__name, .dash__big, .stat__v { font-weight: 700; }
.hero__title, .hero__word { font-weight: 900; }
