/* GENERATED from kduce-solutions.json by scripts/build.mjs. Do not edit — rerun the generator. */
:root{
  /* accentHover defaulting to accent meant "hover does nothing" on any config that omitted it.
     Darkening toward ink gives a real state change and stays on-brand. */
  --primary:#17272b; --accent:#e08a2e;
  --accent-hover:#b96b1e;
  --accent-2:#e08a2e;
  /* ink-2 / paper-2 / line are DERIVED from ink+paper when a config omits them, so a palette
     stays internally consistent instead of being eight hand-typed hexes that drift apart. The
     old --ink-2 fallback was a literal #5a6b64 — a green-grey — so every blue- or oxblood-branded
     business that omitted ink2 got green secondary text. A config value still wins outright. */
  --ink:#172126; --ink-2:#5a666b;
  --paper:#ffffff; --paper-2:#f4f1eb;
  --line:#ddd8d0;
  /* text that sits ON an accent fill. Defaulting this to --ink was wrong in BOTH directions:
     a dark-theme business inherits light ink and gets white-on-neon, and a business whose accent
     was darkened to pass as text on paper (fa53c8d did this to five configs) gets near-black ink
     on a near-black fill. Measured on the primary marketing CTA before this change: halcyon
     2.12:1, brightwash 2.51:1, palm-beauty 2.64:1. The only config that passed was the one that
     set onAccent by hand. So pick it by luminance instead of inheriting a token meant for paper. */
  --on-accent:#000000;
  /* the same label, re-solved against --accent-hover. Every accent fill repaints to the
     hover colour but kept --on-accent, so a darkened hover dropped 6 of 12 businesses
     below AA on hover while all 12 passed at rest. See scripts/contrast.mjs. */
  --on-accent-hover:#000000;
  /* One accent hex cannot serve three surfaces, and the whole portfolio proves it: an accent
     dark enough to clear AA as text on paper lands at 1.9-4.1:1 on the dark primary, and one
     bright enough for the dark lands at 2.4-3.6:1 on paper. So each surface gets its own token,
     SOLVED to a measured 4.5:1 by scripts/contrast.mjs rather than set to a fixed colour-mix
     percentage that happened to clear the configs present the day it was written. A fixed 50%
     mix left palm-beauty's rail buttons at 1.93:1; solving hits 4.51:1 on the same input.
     Both stay overridable per config (accentOnDark / accentOnPaper). */
  --accent-on-dark:#e08a2e;
  /* accent used AS TEXT on paper or on a 16% accent tint (.tag/.pill/.chip). Solved against the
     harder of those two surfaces. On a dark-theme config this correctly resolves lighter, not
     darker — it tracks the config's own paper, not an assumption that paper is white. */
  --accent-on-paper:#90591e;
  /* accent as text over a PHOTO. Solved against the hero plate at its worst case —
     --primary over WHITE — because a photo can be any luminance and the plate is the
     only part of that stack the generator controls. See heroPlate() in contrast.mjs. */
  --accent-on-hero:#ffbf63;
  --hero-plate:92.0%;
  --font:'Archivo Narrow', system-ui, sans-serif; --body-font:'Inter', system-ui, sans-serif;
  /* A third type role, for machine-readable data: event keys, record ids, status codes.
     A system stack rather than a loaded face — it costs no request, and the point is that
     these strings are literal identifiers, not prose. */
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
}