/* ---------- fonts ---------- */
/* DM Sans variable (wght 100-1000 in one file) — public-site font, ported from cleanwheels.online */
@font-face{font-family:'DM Sans';src:url('../assets/fonts/dm-sans-latin-variable.woff2') format('woff2');font-weight:100 1000;font-display:swap}
/* Inter kept ONLY for /admin (admin.css --a-sans references these faces) */
@font-face{font-family:'Inter';src:url('../assets/fonts/inter-latin-400-normal.woff2') format('woff2');font-weight:400;font-display:swap}
@font-face{font-family:'Inter';src:url('../assets/fonts/inter-latin-600-normal.woff2') format('woff2');font-weight:600;font-display:swap}
@font-face{font-family:'Inter';src:url('../assets/fonts/inter-latin-800-normal.woff2') format('woff2');font-weight:800;font-display:swap}
/* JetBrains Mono @font-face lives in admin.css — only admin's function-first UI uses it */

/* ---------- tokens: Midnight Blue (ported from the live Framer site) ----------
   DARK IS THE DEFAULT. The site loads near-black with electric-blue accents for everyone,
   matching cleanwheels.online. Light is opt-in only: the toggle (js/theme.js) stamps
   data-theme="light" on <html> and persists it in localStorage('cw-theme'); the inline
   head snippet re-stamps it before first paint. There is no prefers-color-scheme branch
   any more — a stored "dark" value simply matches these defaults. */
:root{
  --bg:#080808;--card:#141414;--ink:#ffffff;--muted:rgba(255,255,255,.62);--line:rgba(255,255,255,.12);
  --onyx:#161616;--onyx-line:rgba(255,255,255,.16);
  --accent:#0055ff;--link:#0099ff;--lime:#e6f300;
  --g1:#00d1ff;--g2:#0099ff;--g3:#0055ff;--g4:#0033cc;
  --grad:linear-gradient(90deg,var(--g1),var(--g2));
  --sunset:radial-gradient(130% 130% at 15% 0%,var(--g1) 0%,var(--g2) 35%,var(--g3) 72%,var(--g4) 105%);
  --radius:20px;
  --sans:'DM Sans',system-ui,-apple-system,sans-serif;
  --pad:clamp(20px,5vw,64px);
  --shadow-sm:0 10px 30px rgba(0,0,0,.45);
  --shadow-md:0 20px 48px rgba(0,0,0,.55);
  --topbar-bg:rgba(8,8,8,.78);
}
:root[data-theme=light]{
  --bg:#f5f7fa;--card:#ffffff;--ink:#0b0d12;--muted:#5b6472;--line:#e6e9f0;
  --onyx:#0b0d12;--onyx-line:transparent;
  --link:#0044cc;
  --grad:linear-gradient(90deg,var(--g3),var(--g4));
  --shadow-sm:0 10px 30px rgba(0,60,180,.10);
  --shadow-md:0 20px 48px rgba(0,60,180,.16);
  --topbar-bg:rgba(245,247,250,.85);
}
/* /admin opts out of the public theme entirely (no theme snippet, no toggle): it renders
   with its own --a-* palette (admin.css) plus these pinned pre-retheme literals for the
   few shared tokens/primitives it consumes, so the public retheme cannot shift it. */
body.admin{
  --bg:#faf9fb;--card:#ffffff;--ink:#111318;--muted:#6f6a78;--line:#f0ecf3;
  --onyx:#111318;--onyx-line:transparent;
  --sans:'Inter',system-ui,-apple-system,sans-serif;
}

/* ---------- reset ---------- */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:16px;line-height:1.6;
  letter-spacing:-.01em;-webkit-font-smoothing:antialiased;overflow-x:hidden}
img,svg{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}

/* ---------- shared primitives ---------- */
.grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
.label{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.label--dim{opacity:.7}
.display{font-weight:800;letter-spacing:-.025em;line-height:1.08}
h2.display{font-size:clamp(1.7rem,5.5vw,2.4rem)}
.stat{font-size:13px;color:var(--muted)}
.stat b{color:var(--ink);font-weight:700}
.section{padding:clamp(56px,12vw,120px) var(--pad);position:relative;max-width:1100px;margin:0 auto}

/* pill buttons — electric-blue CTA, like the live site */
.btn{display:inline-flex;align-items:center;gap:.5em;font-size:14px;font-weight:700;
  padding:15px 26px;border-radius:99px;background:var(--accent);color:#fff;
  box-shadow:0 10px 30px rgba(0,85,255,.28);transition:transform .2s ease,box-shadow .2s ease}
.btn:active{transform:scale(.97)}
.btn--solid{background:var(--accent);color:#fff}
.btn--light{background:#fff;color:#0b0d12;box-shadow:none}
.sheen{display:none}

/* theme toggle (landing .topbar and wizard .wiz-top) — dark default shows the sun */
.theme-toggle{width:34px;height:34px;border-radius:99px;border:1.5px solid var(--line);
  background:var(--card);display:flex;align-items:center;justify-content:center;
  font-size:14px;line-height:1;flex-shrink:0;transition:transform .2s ease,border-color .2s ease}
.theme-toggle:active{transform:scale(.92)}
.theme-toggle .moon{display:none}
:root[data-theme=light] .theme-toggle .moon{display:block}
:root[data-theme=light] .theme-toggle .sun{display:none}

/* scroll-reveal initial states (activated by reveal.js adding .in) */
[data-reveal]{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease}
[data-reveal].in{opacity:1;transform:none}
[data-reveal="fade"]{transform:none}
@media (prefers-reduced-motion:reduce){
  [data-reveal]{opacity:1;transform:none;transition:none}
}
