:root {
  /* Ground and text */
  --plaster: #F2F0ED;
  --ink: #14110F;
  --pitch: #131110;
  --bone: #F0EBE3;

  /* Extra band grounds, so no two adjacent sections share a background.
     Each is a per-component override of --ground below (see
     src/styles/components.css), not a second [data-band] state: dark
     bands still carry data-band="dark" and light bands still carry
     data-band="light", so the nav theme observer classifies every one of
     them correctly without any change to nav-theme.ts.
     Ratios below are computed by tests/unit/contrast.test.ts, not
     eyeballed; see that file for the full set and the numbers.
     --char: a lifted dark for Process, visibly distinct from --pitch, but
     only lifted as far as --ditra can go and still clear 4.5:1 against it
     (the process stage numerals need that); the numerals themselves are
     re-pointed at --bone on this band instead (see .c-process in
     components.css), since --ditra alone can't clear both "visibly
     lifted" and 4.5:1 at once.
     --shell: a warm off-white for Selected work, slightly deeper than
     --plaster.
     --grout: a cooler, greyer light tint for the quote form, distinct
     from both --plaster and --shell by hue rather than by depth alone. */
  --char: #2A241F;
  --shell: #EDE8E1;
  --grout: #E7E8E2;

  /* Accents */
  --ditra: #E2571E;
  --ditra-deep: #A83C10;
  --brass: #D9A441;
  --concrete: #6B665B;

  /* Type */
  --font-display: 'Archivo', system-ui, sans-serif;
  --font-body: 'Archivo', system-ui, sans-serif;
  --font-mono: 'IBM Plex Mono', ui-monospace, monospace;

  --step--1: clamp(0.83rem, 0.8rem + 0.15vw, 0.9rem);
  --step-0: clamp(1rem, 0.96rem + 0.2vw, 1.09rem);
  --step-1: clamp(1.2rem, 1.1rem + 0.5vw, 1.5rem);
  --step-2: clamp(1.5rem, 1.3rem + 1vw, 2.2rem);
  --step-3: clamp(2rem, 1.5rem + 2.5vw, 3.6rem);
  --step-4: clamp(2.8rem, 1.6rem + 6vw, 7rem);

  /* Space */
  --space-2xs: 0.25rem;
  --space-xs: 0.5rem;
  --space-s: 1rem;
  --space-m: 1.75rem;
  --space-l: 3rem;
  --space-xl: 5rem;
  --space-2xl: 8rem;

  /* The fixed header's height. Every fragment target reserves it as
     scroll-margin-top (global.css) so a native jump does not land with the
     section's first line under the bar. The smooth path measures the bar
     instead of reading this and writes the measured value back here, so
     this default only has to hold until that runs, and without
     JavaScript. Deliberately a little generous: the bar measures 70px at
     desktop and 66px where the links collapse into the menu button, and
     landing slightly low is invisible where landing high puts the
     section's first line behind the bar. */
  --nav-h: 5rem;

  /* Motion */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --dur-fast: 0.28s;
  --dur-base: 0.45s;

  /* Band theming. Sections override these two to invert. */
  --ground: var(--plaster);
  --on-ground: var(--ink);
  --on-ground-dim: var(--concrete);
  --accent-text: var(--ditra-deep);
}

[data-band='dark'] {
  --ground: var(--pitch);
  --on-ground: var(--bone);
  --on-ground-dim: #A49C92;
  --accent-text: var(--ditra);
}
