/**
 * brand-tokens.css — the ONE definition of the marketing site's design tokens.
 *
 * Before this file, the palette was re-declared inline in every page's <style>
 * :root — 13 pages on this branch, perfectly consistent and therefore invisibly
 * fragile. This is the colour half of the same problem brand-header.css solved
 * for markup.
 *
 * Names are SEMANTIC and match apps/operator's exactly, so a cross-surface
 * token-parity manifest can key on roles without a per-surface alias map.
 *
 * PARSER CONTRACT: one :root block, one `--name: value;` per line, no nesting,
 * no @media. A coordinating session consumes this file as web's canonical token
 * source. Do not restructure it.
 *
 * Every colour token is accounted for below — five pinned, five divergent.
 *
 * PINNED to operator (identical values — a parity manifest may assert these):
 *   --color-primary       #1D4A82
 *   --color-primary-fg    #FFFFFF
 *   --color-primary-hover #123661
 *   --color-subtle-fg     #6B5E4A
 *   --color-mint          #4DFFC3
 *
 * DIVERGES from operator, deliberately. Web runs a cooler, whiter surface;
 * operator runs warm paper. All five follow from that one decision:
 *   --color-foreground #0A1628  vs #1C1B1A  web ink is cooler
 *                               (brand-system.md § Shared brand palette)
 *   --color-background #FFFFFF  vs #FFFBF5  web ground is pure white
 *   --color-surface    #F4F3EF  vs #FFF5E8  neutral, not peach
 *   --color-muted-fg   #1C2E44  vs #6A5C48  cool, matching the cooler ink
 *   --color-border     #E2E8F0  vs #E7E2D6  web is COOL, operator is warm, and
 *                               that is now deliberate — see the note below
 *
 * Contrast measured against #FFFFFF (this file's own --color-background).
 * apps/web is NOT covered by validate-token-contrast.ts G-12b, so these are
 * hand-computed and are the only record:
 *   --color-primary     8.92:1  AAA
 *   --color-foreground 18.13:1  AAA
 *   --color-muted-fg   13.78:1  AAA
 *   --color-subtle-fg   6.32:1  AA at any size
 *   --color-mint        1.28:1  DECORATIVE ONLY — never a non-text UI marker
 *
 * --color-border was #E2E0DA, and this block used to instruct the reader to
 * "pin it to operator's value in RESTYLE-1 rather than carrying a divergence
 * nobody chose". That instruction was wrong, and worth recording why so it is
 * not reinstated. It read the gap as a 2% rounding difference between two warm
 * greys — but every OTHER row above had deliberately gone COOL to follow the
 * cooler ink and the white ground, and the border was the one that did not.
 * Warm hairlines were correct on the old #F5EFE2 paper; on white with a navy
 * accent they read muddy, which is exactly how it was reported. Measured:
 * #E2E0DA is +8 warm (R−B) against ink at −30.
 *
 * THE TRADE, measured, because the hue argument above is only half of it:
 * #E2E8F0 is also LIGHTER than #E2E0DA (relative luminance 0.8017 vs 0.7454),
 * so every hairline lost about 7% of already-minimal contrast.
 *   vs #FFFFFF (--color-background)  1.32:1 -> 1.23:1
 *   vs #F4F3EF (--color-surface)     1.19:1 -> 1.11:1
 * Correct for decoration and accepted deliberately. NOT correct where the token
 * is carrying structure — privacy.html's dashed table row separators and the
 * legal documents' section rules are doing real work at 1.23:1, tracked in
 * #6788, which will likely add a second role rather than move this value.
 * Recorded here because this block claims to be the only record of these
 * numbers, and the first version of it reasoned about hue and never measured
 * luminance at all.
 *
 * #E2E8F0 is admin's border, and admin is the right reference rather than
 * operator: it is the surface this palette's chassis actually resembles —
 * white ground, cool ink, hairline grid. Adopting it makes web self-consistent
 * AND removes a value rather than adding one. Operator stays warm on purpose;
 * it runs warm paper, so a warm hairline is right there. Admin and operator do
 * not agree with each other either (#6743).
 *
 * --color-subtle-fg was #8B8A84 in the wireframes. That value measures 3.46:1
 * and FAILS AA for normal text; it was used at 11.5–12.5px. #6B5E4A is the
 * value the marketing site already used, and is also operator's, so reverting
 * fixed the contrast and pinned the role in one move. Do not "modernise" it
 * back to a cool grey without measuring.
 */

/* Inter 4.1, self-hosted. See assets/fonts/PROVENANCE.md for source and
   checksum. Two variable files cover 100-900; the browser fetches the italic
   file only when italic glyphs render, so a page with no italic pays 344KB,
   not 723KB.

   font-display: swap — text paints immediately in the fallback and reflows
   when Inter arrives. On a marketing page, readable-then-reflowed beats
   invisible-then-correct. */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/assets/fonts/InterVariable.woff2') format('woff2-variations');
}

@font-face {
  font-family: 'Inter';
  font-style: italic;
  font-weight: 100 900;
  font-display: swap;
  src: url('/assets/fonts/InterVariable-Italic.woff2') format('woff2-variations');
}

:root {
  --color-primary: #1D4A82;
  --color-primary-hover: #123661;
  --color-primary-fg: #FFFFFF;
  --color-foreground: #0A1628;
  --color-muted-fg: #1C2E44;
  --color-subtle-fg: #6B5E4A;
  --color-background: #FFFFFF;
  --color-surface: #F4F3EF;
  --color-border: #E2E8F0;
  --color-mint: #4DFFC3;
  --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
}
