/* tokens.css — the bridge to services.espycrux.com/design/v1.css
   Nothing else in this project reads an --espy-* token directly.
   Tokens arrive as unwrapped HSL triples ("210 13% 6%"), so we wrap them here.
   Every var() carries a fallback equal to the value we would have used anyway,
   so an unreachable design service leaves iShowcase rendering as it does now. */

:root {
  --t-bg:        var(--espy-bg,        210 13%  6%);
  --t-fg:        var(--espy-fg,        210  9% 91%);
  --t-card:      var(--espy-card,      210 12% 10%);
  --t-muted:     var(--espy-muted,     220 14%  4%);
  --t-muted-fg:  var(--espy-muted-fg,  210  6% 57%);
  --t-border:    var(--espy-border,    210 12% 17%);
  --t-signal:    var(--espy-signal,     34 69% 61%);
  --t-signal-fg: var(--espy-signal-fg, 220 13%  9%);

  --c-bg:          hsl(var(--t-bg));
  --c-bg-raised:   hsl(var(--t-card));
  --c-bg-sunken:   hsl(var(--t-muted));
  --c-line:        hsl(var(--t-border));
  --c-line-strong: hsl(var(--t-border) / .72);
  --c-fg:          hsl(var(--t-fg));
  --c-fg-dim:      hsl(var(--t-muted-fg));
  --c-signal:      hsl(var(--t-signal));
  --c-signal-ink:  hsl(var(--t-signal-fg));

  /* derived — the contract has no token for these */
  --c-fg-faint:  hsl(var(--t-fg) / .55);
  --c-veil:      hsl(var(--t-bg) / .82);
  --c-frame:     color-mix(in oklab, hsl(var(--t-muted)) 92%, hsl(var(--t-fg)));

  --surface-border: var(--espy-surface-border, 1px solid hsl(var(--t-border)));
  --surface-shadow: var(--espy-surface-shadow, none);

  --font-display: var(--espy-font-display, "Inter Tight", system-ui, -apple-system, sans-serif);
  --font-body:    var(--espy-font-body,    system-ui, -apple-system, "Segoe UI", Roboto, sans-serif);
  --font-mono:    var(--espy-font-mono,    ui-monospace, "SF Mono", Menlo, monospace);

  --display-weight:    var(--espy-display-weight, 600);
  --display-tracking:  var(--espy-display-tracking, -0.02em);
  --display-leading:   var(--espy-display-leading, 1.05);
  --display-transform: var(--espy-display-transform, none);

  --meta-tracking:  var(--espy-meta-tracking, 0.14em);
  --meta-transform: var(--espy-meta-transform, uppercase);

  --radius: var(--espy-radius, 2px);

  --step--1: clamp(0.78rem, 0.76rem + 0.10vw, 0.84rem);
  --step-0:  clamp(0.95rem, 0.92rem + 0.16vw, 1.05rem);
  --step-1:  clamp(1.20rem, 1.10rem + 0.50vw, 1.50rem);
  --step-2:  clamp(1.60rem, 1.35rem + 1.20vw, 2.40rem);
  --step-3:  clamp(2.20rem, 1.60rem + 3.00vw, 4.40rem);

  --s-1: 0.25rem;  --s-2: 0.5rem;  --s-3: 0.75rem; --s-4: 1rem;
  --s-5: 1.5rem;   --s-6: 2rem;    --s-7: 3rem;    --s-8: 5rem;

  --gutter: clamp(1rem, 4vw, 3rem);
  --measure: 62ch;

  --dur-fast: 140ms;
  --dur:      280ms;
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}
