/* Upward — generated from tokens.json v2.1. Do not hand-edit. */
/* Self-hosted from ./fonts — run: node fetch-fonts.mjs to refresh. */
@font-face {
  font-family: 'Caveat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/caveat-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Caveat';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/caveat-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/nunito-sans-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/nunito-sans-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/nunito-sans-600-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/nunito-sans-600-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/plus-jakarta-sans-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/plus-jakarta-sans-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url('fonts/plus-jakarta-sans-800-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Plus Jakarta Sans';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url('fonts/plus-jakarta-sans-800-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root {
  --navy: #1B2B4B;
  --navy-deep: #0F1C3A;
  --paper: #F6F8FC;
  --paper-wash: #ECF0F8;
  --white: #FFFFFF;
  --ink-soft: #5A647C;
  --teal: #007A96;
  --teal-bright: #00B4D8;
  --teal-light: #74D3E8;
  --violet: #5B34B8;
  --violet-light: #A78BFA;
  --green: #267A38;
  --green-bright: #4CBB6A;
  --signal-red: #D7263D;
  --signal-amber: #E8A317;
  --signal-amber-deep: #8A6200;
  --cream: #F1EBE0;
  --brick: #A63D28;
  --copper: #2F6F62;

  /* channels, for any colour that needs an alpha — never retype a hex */
  --navy-rgb: 27 43 75;
  --navy-deep-rgb: 15 28 58;
  --paper-rgb: 246 248 252;
  --paper-wash-rgb: 236 240 248;
  --white-rgb: 255 255 255;
  --ink-soft-rgb: 90 100 124;
  --teal-rgb: 0 122 150;
  --teal-bright-rgb: 0 180 216;
  --teal-light-rgb: 116 211 232;
  --violet-rgb: 91 52 184;
  --violet-light-rgb: 167 139 250;
  --green-rgb: 38 122 56;
  --green-bright-rgb: 76 187 106;
  --signal-red-rgb: 215 38 61;
  --signal-amber-rgb: 232 163 23;
  --signal-amber-deep-rgb: 138 98 0;
  --cream-rgb: 241 235 224;
  --brick-rgb: 166 61 40;
  --copper-rgb: 47 111 98;

  /* semantic aliases — the light canvas */
  --bg: var(--paper);
  --surface: var(--white);
  --fg: var(--navy);
  --muted: var(--ink-soft);
  --accent: var(--teal);
  --accent-bright: var(--teal-bright);
  --analysis: var(--violet);
  --affirm: var(--green);
  --caution: var(--signal-amber-deep);
  --warm: var(--signal-amber-deep);
  --alert: var(--signal-red);

  /* type */
  --font-display: 'Plus Jakarta Sans', system-ui, sans-serif;
  --font-body: 'Nunito Sans', system-ui, sans-serif;
  --font-accent: 'Caveat', 'Segoe Script', cursive;
  --font-packaging: 'Plus Jakarta Sans', system-ui, sans-serif;
  --font-mono: 'JetBrains Mono', ui-monospace, monospace;

  /* scale */
  --size-display: 64px;
  --size-h1: 44px;
  --size-h2: 32px;
  --size-h3: 24px;
  --size-body: 18px;
  --size-small: 15px;
  --size-kicker: 15px;
  --size-caption: 13px;

  /* motion */
  --ease: cubic-bezier(0.2, 0.7, 0.2, 1);

  /* 16:9 safe geometry */
  --action-safe: 3%;
  --title-safe: 5%;
}

/* Dark surfaces swap roles — they never hand-invert colours.
   Put .on-dark on any navy-deep panel, card, thumbnail or mood scene and
   --fg, --muted, --affirm and --caution resolve to the values that hold up
   there. Every pair below is verified in tokens.contrast_checks. */
.on-dark {
  --bg: var(--navy-deep);
  --surface: var(--navy);
  --fg: var(--white);
  --muted: var(--teal-light);
  --accent: var(--teal-light);
  --accent-bright: var(--teal-bright);
  --analysis: var(--violet-light);
  --affirm: var(--green-bright);
  --caution: var(--signal-amber);
  --warm: var(--signal-amber);
  --alert: var(--signal-red);
  color: var(--fg);
}

/* And back again. A white card inside a dark hero is a light canvas that
   happens to sit on a dark one — without this it inherits the dark aliases and
   a green tick turns into the bright green that gate 7 forbids on white. */
.on-light {
  --bg: var(--paper);
  --surface: var(--white);
  --fg: var(--navy);
  --muted: var(--ink-soft);
  --accent: var(--teal);
  --accent-bright: var(--teal-bright);
  --analysis: var(--violet);
  --affirm: var(--green);
  --caution: var(--signal-amber-deep);
  --warm: var(--signal-amber-deep);
  --alert: var(--signal-red);
  color: var(--fg);
}

/* The canvas is never flat white. */
.upward-canvas {
  background:
    radial-gradient(120% 80% at 100% 0%, rgba(0,122,150,.08), transparent 60%),
    radial-gradient(100% 90% at 0% 100%, rgba(27,43,75,.05), transparent 60%),
    linear-gradient(180deg, var(--white), var(--paper-wash));
}

/* The dark mood variant (§9.8). Lit navy, never near-black. */
.upward-canvas-dark {
  background:
    radial-gradient(110% 80% at 100% 0%, rgba(0,180,216,.14), transparent 60%),
    linear-gradient(180deg, var(--navy), var(--navy-deep));
}
