/* Spendthrift design tokens, generated, do not hand-edit */
:root{
  --space-0: 0px;
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 48px;
  --space-8: 64px;
  --space-9: 96px;
  --size-caption: 13px;
  --size-body: 16px;
  --size-title: 20px;
  --size-display: 31px;
  --size-display-lg: 39px;
  --line-caption: 18px;
  --line-body: 24px;
  --line-title: 28px;
  --line-display: 38px;
  --line-display-lg: 46px;
  --radius-none: 0px;
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 12px;
  --radius-pill: 999px;
  --radius-icon-squircle: 22.37%;
  --duration-instant: 0ms;
  --duration-fast: 120ms;
  --duration-base: 200ms;
  --duration-slow: 320ms;
  /* job 10 section 2: chart-draw motion, 400 to 700ms by that section's
     own instruction, which neither existing duration reaches. One new
     token rather than a hand-written value, pending the same ratification
     as every other addition this stream has proposed. Reuses
     --easing-standard rather than adding a curve: it is already an
     ease-out shape (fast start, slow settle). */
  --duration-draw: 550ms;
  --easing-standard: cubic-bezier(0.2, 0, 0, 1);
  --easing-exit: cubic-bezier(0.3, 0, 1, 1);
  --brand-19: #041A10;
  --brand-27: #0E2F21;
  --brand-35: #1B4533;
  --brand-43: #2B5C48;
  --brand-51: #3D745E;
  --brand-59: #558C75;
  --brand-67: #70A48F;
  --brand-75: #8DBBA9;
  --brand-83: #ADD3C4;
  --brand-91: #CEEBE0;
  --brand-99: #F8FFFD;
  /* job 7, section 22.2 rule 3: a fixed brand-NN fill that must carry
     text needs fixed text too, chosen once per shade so the pair clears
     4.5:1 on its own and neither theme can break it. Same pattern as
     the existing --group-N-on tokens; computed from the fixed hex
     above, never hand-picked. */
  --brand-43-on: #FFFFFF;
  --brand-51-on: #FFFFFF;
  --brand-59-on: #000000;
  --brand-67-on: #000000;
  --brand-75-on: #000000;
  --brand-83-on: #000000;
  --surface-19: #0F1713;
  --surface-27: #1F2B25;
  --surface-35: #314039;
  --surface-43: #44564D;
  --surface-51: #596D64;
  --surface-59: #70847B;
  --surface-67: #889C94;
  --surface-75: #A3B4AD;
  --surface-83: #BECDC7;
  --surface-91: #DBE6E2;
  --surface-99: #F8FFFD;
  --negative-19: #300003;
  --negative-27: #500209;
  --negative-35: #730612;
  --negative-43: #990C1B;
  --negative-51: #C30121;
  --negative-59: #EA122E;
  --negative-67: #FD5152;
  --negative-75: #FE8882;
  --negative-83: #FDB3AD;
  --negative-91: #FFD8D5;
  --negative-99: #FFF5F3;
  --caution-19: #1A1400;
  --caution-27: #302701;
  --caution-35: #473B03;
  --caution-43: #605005;
  --caution-51: #79660A;
  --caution-59: #957D06;
  --caution-67: #B0950B;
  --caution-75: #CDAE05;
  --caution-83: #EAC71A;
  --caution-91: #FEE271;
  --caution-99: #FFFEE5;
  --neutral-0: #000000;
  --neutral-19: #151515;
  --neutral-27: #272728;
  --neutral-35: #3C3C3C;
  --neutral-43: #515151;
  --neutral-51: #676768;
  --neutral-59: #7E7E7F;
  --neutral-67: #969697;
  --neutral-75: #AFAFB0;
  --neutral-83: #C9C9C9;
  --neutral-91: #E3E3E3;
  --neutral-99: #FDFDFE;
  --neutral-100: #FFFFFF;
  /* job 17: the compact chart system's quiet mark. Measured at 4.00 to
     1 on the light card ground and 4.50 to 1 on the dark one, the one
     grey that clears both, so it is fixed here rather than flipping
     with the theme blocks below. */
  --mark-quiet: var(--neutral-59);
  --group-1-fill: #20C4DE;  --group-1-on: #0E2F21;
  --group-2-fill: #0DA2E3;  --group-2-on: #0E2F21;
  --group-3-fill: #2B62C4;  --group-3-on: #FFFFFF;
  --group-4-fill: #6552BF;  --group-4-on: #FFFFFF;
  --group-5-fill: #8844A9;  --group-5-on: #FFFFFF;
  --group-6-fill: #A03886;  --group-6-on: #FFFFFF;
}

/* semantic, light */
:root{
  --bg: #FFFFFF;
  --bg-raised: #F8FFFD;
  --bg-sunken: #DBE6E2;
  /* Owner's rule, 2 September 2026: text is black. Our green is for
     money you have and for income, and for nothing else. Ink was the
     brand green (#1B4533), which meant every word on the site wore the
     colour reserved for a balance; the branding stream folds this into
     the generated system. Dark stays #E3E3E3. */
  --ink: #151515;
  /* a neutral raised surface for a callout or a selected control, so a
     pill is light grey in light mode rather than brand tinted */
  --surface-callout: #E3E3E3;
  --ink-muted: #676768;
  --ink-inverse: #FFFFFF;
  --hairline: #C9C9C9;
  --hairline-strong: #969697;
  --brand: #1B4533;
  --on-brand: #FFFFFF;
  --brand-quiet: #CEEBE0;
  --positive: #1B4533;
  --on-positive: #FFFFFF;
  --caution: #EAC71A;
  --on-caution: #0E2F21;
  --negative: #C30121;
  --on-negative: #FFFFFF;
  --focus: #3D745E;
  --overlay: rgba(0,0,0,0.32);
  /* job 11 section 3: a chart's empty progress track (the groove a bar
     or ribbon fills into), distinct from --brand-quiet because it is
     neutral rather than brand-tinted. Fourteen boards had this as a
     literal #E4EFE9, which read correctly in light and did not exist
     in dark. */
  --track: #E4EFE9;
  /* job 17: the compact chart's faint intermediate gridline and dashed
     period boundaries, a plain neutral rather than the brand-tinted
     --track, since a gridline is structure and never data. */
  --chart-grid: var(--neutral-91);
  /* job 18, section 28.1: charts sit on white, never on --bg-raised's
     tint. No existing token was white in light and the raised neutral
     rung in dark, so this is new rather than a swap. */
  --canvas-ground: #FFFFFF;
}

@media (prefers-color-scheme: dark){ :root{
  --bg: #000000;
  --bg-raised: #151515;
  --bg-sunken: #000000;
  --ink: #E3E3E3;
  --ink-muted: #969697;
  --ink-inverse: #000000;
  --hairline: #272728;
  --hairline-strong: #515151;
  --brand: #70A48F;
  --on-brand: #000000;
  --brand-quiet: #0E2F21;
  --positive: #70A48F;
  --on-positive: #000000;
  --caution: #EAC71A;
  --on-caution: #0E2F21;
  --negative: #FD5152;
  --on-negative: #000000;
  --focus: #8DBBA9;
  --overlay: rgba(0,0,0,0.60);
  --track: #272728;
  --chart-grid: var(--neutral-27);
  --canvas-ground: #151515;
  --surface-callout: #272728;
} }

:root[data-theme="dark"]{
  --bg: #000000;
  --bg-raised: #151515;
  --bg-sunken: #000000;
  --ink: #E3E3E3;
  --ink-muted: #969697;
  --ink-inverse: #000000;
  --hairline: #272728;
  --hairline-strong: #515151;
  --brand: #70A48F;
  --on-brand: #000000;
  --brand-quiet: #0E2F21;
  --positive: #70A48F;
  --on-positive: #000000;
  --caution: #EAC71A;
  --on-caution: #0E2F21;
  --negative: #FD5152;
  --on-negative: #000000;
  --focus: #8DBBA9;
  --overlay: rgba(0,0,0,0.60);
  --track: #272728;
  --chart-grid: var(--neutral-27);
  --canvas-ground: #151515;
  --surface-callout: #272728;
}

/* ---- PENDING ADDITION, not yet folded into the generator ----
   Section 12 of CLAUDE.md: the measured layout spec, taken from the
   owner's own demo at a 1440 viewport. Two new display steps (the site
   had nothing between display-lg at 39px and nothing larger), a
   body-lg for a hero tagline, and space-10 for the heading-to-media gap
   the existing space scale (capping at space-9, 96px) does not reach.
   Leading TIGHTENS as size grows, the opposite of the steps above this
   block: display-xl runs at exactly 1.0, display-2xl at 1.07, against
   display-lg's own 1.18. This is deliberate, not a rounding slip, and
   the branding stream should fold these into the generated system
   rather than this file being hand-edited again. card-title (30/35)
   added 1 Sep 2026: section 12 measures a card title at 30/35 and
   .spine-card-title had been running at --size-title (20px) instead,
   a second, uncoordinated type system living beside this one.
   display-2xl (the 90/97 hero wordmark role) removed 1 Sep 2026: it sat
   unused since the hero wordmark is set from the brand lockup SVG, never
   as text, so the role had no caller. Re-add it if a page ever sets the
   wordmark as text at that size; until then an orphan token is how a
   second type system starts. */
:root {
  --size-display-xl:  clamp(34px, 2.5vw + 24px, 60px);  --line-display-xl:  1.0;
  --size-body-lg:     18px;                             --line-body-lg:     27px;
  --size-card-title:  30px;                             --line-card-title:  35px;
  --space-10:         128px;
}

/* job 18 section 6c: three more site-layer additions that were declared in
   site.css instead of here with the other thirty three (section 29.1).
   Moved, values unchanged: the radius scale topped out too small for the
   announcement system's canvases, and the four type steps had nothing at
   hero scale. */
:root {
  --radius-canvas: 32px;
  --size-hero: 44px;
  --line-hero: 1.02;
}
@media (min-width: 40rem) { :root { --size-hero: 64px; } }
@media (min-width: 64rem) { :root { --size-hero: 92px; } }
