/* ============================================================
   TG-26 — MOTION & THE WAVES · TG-26.2 integrated edition
   Law 7: motion is mechanical. Identity / glitch moves SNAP with
   steps() timing — never ease. Entrance choreography may ease.
   Everything sits behind prefers-reduced-motion.
   GOTCHA (law since v13): never CSS-transition a colour that
   resolves from a [data-world]/[data-palette] var — Chromium
   strands the base state. Scope colour transitions to hover, or
   let the change snap.
   ============================================================ */

:root{
  /* ---- durations ---- */
  --dur-snap:.42s;     /* @kind other */ /* identity slip / misregistration */
  --dur-rise:.6s;      /* @kind other */ /* entrance choreography */
  --dur-quick:.12s;    /* @kind other */ /* hover transforms */
  --dur-shader:.45s;   /* @kind other */ /* shader cross-fade */

  /* ---- timing ---- */
  --ease-snap:steps(3,end);            /* @kind other */ /* mechanical — the slip */
  --ease-rise:cubic-bezier(.2,.7,.2,1);/* @kind other */ /* entrance only */
  --ease-shader:ease;                  /* @kind other */ /* background colour */
}

/* ---- the slip — a misregistration plate slipping and snapping back ---- */
@keyframes tg-slip{
  0%{   transform:translate(0,0); }
  33%{  transform:translate(3px,-2px); }
  66%{  transform:translate(-2px,3px); }
  100%{ transform:translate(0,0); }
}

/* ---- entrance rise — the one easing move the system permits ---- */
@keyframes tg-rise{
  from{ opacity:0; transform:translateY(12px); }
  to{   opacity:1; transform:none; }
}

@media screen and (prefers-reduced-motion:no-preference){
  .tg-slip-hover:hover{ animation:tg-slip var(--dur-snap) var(--ease-snap) 1; }
  /* misregistration plate slips when its heading is hovered */
  .tg-misreg:hover .tg-misreg-plate{ animation:tg-slip var(--dur-snap) var(--ease-snap) 1; }
  .tg-rise{ animation:tg-rise var(--dur-rise) var(--ease-rise) both; }
}


/* ============================================================
   THE WAVES — AMBIENT CEILINGS
   (ratified TG-26.1 · 02 JUL 2026 — extended TG-26.2)
   The folio's ambient layer is ONE shared signal bus (activity,
   idle, beat, scroll-slip) driving six channels: registration
   field · idle-bloom · the 0.5 Hz beat · signal-chrome · plate-
   breathing type · develop-on-arrival. ONE rAF loop, one clock —
   never per-cell timers. These tokens are the ceilings the bus
   reads (folio13/ambient.js). The live site caps intensity at
   40% (benches run 60%); idle-bloom begins 8–15s after the last
   input (benches: 3s, for demo visibility). Production ALWAYS
   honours prefers-reduced-motion — the bench override never
   ships. PRINT HAS NO WAVES.
   ============================================================ */
:root{
  --amb-cap:.4;       /* @kind other */ /* live intensity ceiling */
  --amb-idle-in:10s;  /* @kind other */ /* idle-bloom threshold (live 8–15s) */
  --amb-beat:2s;      /* @kind other */ /* the shared 0.5 Hz beat */
  --amb-deadair:75s;  /* @kind other */ /* dead-air threshold — idle lines begin (bus idleSecs); lines rotate every 4 beats */
  --amb-calm:.65;     /* @kind other */ /* route-calm multiplier — reading/project routes run ~25% net */
}
