/* ==========================================================================
   Motion primitives — GSAP drives the "reveal" state via .is-visible;
   these rules define the base hidden state + transition.
   ========================================================================== */

.reveal-up{
  opacity:0;
  transform:translateY(28px);
}
.reveal-up.is-visible{
  opacity:1;
  transform:translateY(0);
  transition:opacity .8s var(--ease-out), transform .8s var(--ease-out);
}

[data-hero-in]{ opacity:0; }

.js-ready .reveal-up{ transition:opacity .8s var(--ease-out), transform .8s var(--ease-out); }

/* magnetic buttons — JS sets --mx/--my */
[data-magnetic]{
  transform:translate(var(--mx, 0), var(--my, 0));
  transition:transform .35s var(--ease-out);
}

/* ---------------- Reduced motion ---------------- */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:0.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:0.01ms !important;
    scroll-behavior:auto !important;
  }
  .reveal-up{ opacity:1; transform:none; }
  [data-hero-in]{ opacity:1; }
  .hero-canvas{ display:none; }
  .scroll-cue{ display:none; }
  [data-magnetic]{ transform:none !important; }
}
