/* ─────────────────────────────────────────────────────────────────────────
 * v2 type layer — TWO faces, no monospace, self-hosted.
 * From the design project "Dashboard redesign request", the file every
 * Crosslink v2 canvas loads after app.css (restored 2026-09-15 at the user's ask).
 *
 *   Space Grotesk   display only — wordmark, section titles, band figures
 *   Plex Sans       everything else — prose, labels, buttons, keys, figures
 *
 * Both faces ship in app/frontend/fonts/ and are declared in app.css, so
 * nothing is fetched from a third party, which is what the privacy section
 * promises and what the CSP (font-src 'self') allows.
 *
 * Monospace is removed by REMAPPING --mono, not by deleting it: every rule and
 * every chart that still reaches for it lands on Plex Sans. Two compensations
 * carry the weight a fixed advance used to:
 *   · tabular figures page-wide, so a live number never shifts sideways
 *     (Plex Sans's default digits are already one 600-unit advance);
 *   · ligatures and contextual alternates off on keys and hashes, so a hex
 *     string reads as characters rather than shapes.
 *
 * Voice: public infrastructure, not a trading terminal. The tracked-out
 * ALL-CAPS label is the tell, so the caps come off the label roles and the
 * letter-spacing drops to near-normal. Prose steps up: 16px for anything
 * meant to be READ, 14px for labels on something else.
 * ───────────────────────────────────────────────────────────────────────── */

:root, html {
  --sans:    "Plex Sans", system-ui, sans-serif;
  --display: "Space Grotesk", "Plex Sans", system-ui, sans-serif;
  --mono:    var(--sans);

  /* the two prose roles, one step up each */
  --t-body:    1rem;        /* 16px — read this */
  --t-meta:    0.875rem;    /* 14px — labels on something else */
  --t-eyebrow: 0.8125rem;   /* 13px — section and column labels */
  --tr-label:  0.01em;      /* was .14em: the tracked-out caps look */
}

/* a figure that updates must not move the text beside it */
body { font-variant-numeric: tabular-nums; }

/* a key is a string, not a word */
.key, .hexname, .mono, code, pre {
  font-variant-ligatures: none;
  font-feature-settings: "calt" 0;
  letter-spacing: 0.01em;
}

/* labels read as labels through weight and colour, not caps and tracking.
   The canvas names the first line; the rest are the shipped build's own
   label classes, which the canvases never drew. */
.eyebrow, .netsel a, .pill, .figchip, .uptchip,
.statuschip, .copybtn, .fold .tag, .fold .toggle, .tip-head .eyebrow,
.schip, .srow.head, .rd-eyebrow, .btag, .sorthead, .st-row.st-head,
.eyebrow.wide, .card-acts button, .se-go, .rd-copy, .board-tally, .bacts, .card-scale {
  text-transform: none;
  letter-spacing: 0.01em;
}
.eyebrow { font-size: var(--t-eyebrow); font-weight: 600; color: var(--fg-2); }

/* a state chip now holds a WORD, not a mark, so it leaves the 11px mark floor */
.figchip, .uptchip, .statuschip { font-size: var(--t-eyebrow); font-weight: 500; }
.segmented button, .copybtn { font-size: var(--t-meta); }

/* controls use the everyday sans at its everyday size */
button, .segmented button, .copybtn, .search input, nav.pages a {
  font-family: var(--sans);
  letter-spacing: 0;
  text-transform: none;
}

/* Space Grotesk sets a true 700 and runs tight, so headings need less pull */
h1, h2, h3 { letter-spacing: -0.015em; }
