/* ============================================================
   ONEXUS 2026 — motion.css
   JS-gated animation states, will-change policy, reduced-motion.
   Rule: NOTHING is hidden by CSS unless <html> has class "js"
   (added by main.js). No JS → fully visible static site.
   ============================================================ */

/* ---------- scroll reveals (IntersectionObserver adds .is-in) ----------
   Gated on html.js so a JS-off load never hides content. */
html.js [data-reveal] {
  opacity: 0; transform: translateY(26px);
  transition: opacity .8s var(--ease-out), transform .8s var(--ease-out);
}
html.js [data-reveal].is-in { opacity: 1; transform: none; }

/* ---------- will-change: only on composited scroll-driven layers ---------- */
.hwrap.is-h .hwrap__track,
[data-parallax] { will-change: transform; }

/* ---------- reduced motion: everything static & visible ---------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto !important; }
  html.js [data-reveal] { opacity: 1; transform: none; transition: none; }
  .ticker__track { animation: none; }
  .dot-live { animation: none; }
  .panel__code code::after { animation: none; }
  .hero__title .term-cursor { animation: none; opacity: 0; }
  .k-type { font-variation-settings: 'wght' 500; letter-spacing: -0.035em; }
  .card, .card::before, .card__glow, .btn { transition: none; }
  .phase, .phase::before { transition: none; }
  .int, .int::after { transition: none; }
  .foot__col a, .foot__social a, .founder__social a, .contact-mail,
  .about, .about__idx, .phase, .wordmark__name { transition: none; }
  .foot__col a:hover, .foot__social a:hover, .founder__social a:hover, .contact-mail:hover { background-size: 0% 1px; }
}

/* cursor is a pointer-only enhancement (hidden on touch — see site.css) */
@media (pointer: coarse) {
  html.js [data-reveal] { transform: translateY(14px); } /* smaller slide on touch */
}