/* tokens.css — Kean Can Cleaning Service
   Linked FIRST on every page (PAGE-CONTRACT §8). Single home of colour, type and spacing.
   Lifted from designs/1-gleam/index.html :root. The --zh stack is deliberately absent:
   the engagement went English-only on 2026-09-01. */

:root{
  /* palette */
  --teal:#099F93;
  --teal-deep:#076B63;
  --teal-ink:#0B3D38;
  --lime:#D6E01F;
  --lime-soft:#F2F5CB;
  --paper:#FFFFFF;
  --mist:#F2F8F7;
  --ink:#17332F;
  --ink-soft:#5A716D;
  --line:#DCE8E6;

  /* form */
  --radius:14px;
  --wrap:1160px;
  --measure:40em;
  --measure-read:45em;

  /* type — system fallbacks are complete, so a blocked font CDN degrades, never stalls */
  --disp:"Bricolage Grotesque","Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  --body:"Hanken Grotesk","Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;

  /* spacing */
  --space:8px;
  --section:84px;
  --gut:24px;
}

@media (max-width:860px){
  :root{ --section:56px; }
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation:none!important;transition:none!important}
}
body{font-family:var(--body);color:var(--ink);background:var(--paper);
     line-height:1.6;font-size:16.5px;-webkit-font-smoothing:antialiased}
img{max-width:100%;display:block}
a{color:var(--teal-deep)}
a:focus-visible,button:focus-visible,summary:focus-visible{
  outline:3px solid var(--teal);outline-offset:3px;border-radius:4px}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 var(--gut)}
.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------- reveal: RETIRED 2026-09-01 ----------
   The concept hid every band behind `.reveal{opacity:0}` and revealed it with an
   IntersectionObserver. Inverting it behind `html.js` fixed the no-JS case, but the rendered
   page still came back with whole sections BLANK whenever the observer had not fired for
   content outside the capture viewport -- screenshots, print and PDF included. A scroll
   animation is not worth a class of failure that makes sections disappear, so there is no
   hiding rule at all. `.reveal` remains in the markup as an inert hook. */
