/* ==========================================================================
   EQ Construction — Animation keyframes & GSAP-adjacent utility classes
   Most motion is driven by GSAP/ScrollTrigger in JS; this file holds
   pure-CSS keyframes and small helper states.
   ========================================================================== */

@keyframes eqFadeUp{
  from{ opacity:0; transform:translateY(28px); }
  to{ opacity:1; transform:translateY(0); }
}
@keyframes eqFadeIn{
  from{ opacity:0; }
  to{ opacity:1; }
}
@keyframes eqScaleIn{
  from{ opacity:0; transform:scale(0.94); }
  to{ opacity:1; transform:scale(1); }
}
@keyframes eqSpin{
  to{ transform:rotate(360deg); }
}
@keyframes eqFloat{
  0%, 100%{ transform:translateY(0); }
  50%{ transform:translateY(-14px); }
}
@keyframes eqPulseDot{
  0%, 100%{ opacity:1; transform:scale(1); }
  50%{ opacity:0.4; transform:scale(0.8); }
}

/* No-JS / reduced-motion fallback: reveal everything statically */
.no-js [data-reveal],
.no-js .hero__heading .line span{
  opacity:1 !important;
  transform:none !important;
}

/* Slow continuous drift used behind hero art */
.hero-art .blueprint{ animation:eqFloat 14s ease-in-out infinite; }
.hero-art .blueprint.two{ animation-duration:18s; animation-delay:-4s; }

/* Cursor-follow tilt targets get a smooth transform transition when JS not driving */
[data-tilt]{ transition:transform 0.4s var(--ease-out); }

/* Marquee-style horizontal loop (used for trust strip / logos, if added later) */
@keyframes eqMarquee{
  from{ transform:translateX(0); }
  to{ transform:translateX(-50%); }
}
.marquee-track{
  display:flex;
  width:max-content;
  animation:eqMarquee 28s linear infinite;
}

/* Loading dot pulse used inside preloader percentage */
.preloader__pct .dot{ animation:eqPulseDot 1.2s ease-in-out infinite; }
