/* Canonical theme palette — the single source of truth for every page (SPA and the standalone
   server-rendered pages: /features, /invoices, /payroll, /audit, /changelog, sign-in).
   Keyed on html[data-theme] so the app's own toggle governs, NOT the OS preference.
   Per-instance brand overrides are injected after this (see branding.theme_head / applyBrand). */
:root {
      --brand: #45235f; --brand-deep: #2f1640; --brand-bright: #7a4bb0;
      --bg: #f4f1f8; --panel: #ffffff; --panel-2: #f2edf8; --line: #e4dcef;
      --text: #251b33; --muted: #6f6680; --accent: #5a2d8a; --accent-press: #43206a;
      /* --ok and --warn were darkened in 6.70.1: at #2f9e6b and #b5790a they measured 3.37:1 and
         3.68:1 on white, failing WCAG AA for normal text, and both are used as TEXT in ~30 places.
         Hue and saturation are unchanged (152deg / 39deg) — only lightness moved, by the smallest step
         that clears 4.5:1 on the tightest surface they sit on, --panel-2 (#f2edf8), not just on white.
         Measured: --ok 5.49:1 on white / 4.77:1 on --panel-2; --warn 5.54:1 / 4.81:1.
         The dark values were already fine (7.84:1 and 9.44:1) and are untouched. */
      --ok: #237750; --warn: #8e5f08; --err: #c0392b;
      --link: #2f5fd0;
      /* Outlook availability, for the calendar's event bars and dots. Categorical rather than semantic —
         "tentative" is not a warning and "free" is not a success — so these are their own tokens instead
         of being bent into --ok/--warn. Hue is fixed per state and only lightness differs by theme.
         Light values clear 4:1 on --panel, comfortably over the 3:1 a non-text indicator needs; the old
         hardcoded values turned out to BE the dark values in three of four cases, which is what the
         audit meant by "chosen for a dark ground". Measured light: 4.16 / 4.08 / 4.53 / 4.09. */
      --cal-tentative: #a4731d; --cal-free: #428c5f; --cal-oof: #b0559e; --cal-elsewhere: #328a8a;
      --scroll: #cabbe3;
      --shadow: 0 1px 2px rgba(47,22,64,.06), 0 4px 14px rgba(47,22,64,.05);
    }
html[data-theme="dark"] {
      --brand: #c3a9ec; --brand-deep: #d6c7f4; --brand-bright: #c7a9f0;
      --bg: #14101c; --panel: #1d1727; --panel-2: #271f35; --line: #362c49;
      --text: #ece8f3; --muted: #a79fb8; --accent: #8257cf; --accent-press: #6f44bb;
      --ok: #4fc28e; --warn: #e6b85a; --err: #ff8a8a;
      --link: #9ecbff;
      /* Measured on --panel #1d1727: 7.15 / 5.25 / 4.57 / 5.58. */
      --cal-tentative: #d99a2b; --cal-free: #4a9d6b; --cal-oof: #b866a8; --cal-elsewhere: #3aa0a0;
      --scroll: #4a3d63;
      --shadow: 0 1px 2px rgba(0,0,0,.45), 0 4px 16px rgba(0,0,0,.35);
    }
