/* ==========================================================================
   Motion: initial states for scroll reveals (driven by GSAP in animations.js),
   keyframes and reduced-motion fallbacks.
   Reveal elements are hidden only when JS + motion are available (html.motion);
   animations.js removes the gate if GSAP fails to load, so content never strands.
   ========================================================================== */

.motion [data-reveal] { opacity: 0; }
.motion [data-split] { opacity: 0; }
.motion.anim-off [data-reveal], .motion.anim-off [data-split] { opacity: 1; }

@keyframes marquee { to { transform: translateX(-100%); } }
@keyframes pulse-ring { 0% { transform: scale(.9); opacity: 1; } 100% { transform: scale(1.35); opacity: 0; } }
@keyframes float-y { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-12px); } }
@keyframes bounce-in {
  0% { transform: scale(.3); opacity: 0; } 50% { transform: scale(1.08); opacity: 1; }
  70% { transform: scale(.94); } 100% { transform: scale(1); }
}

@media (prefers-reduced-motion: reduce) {
  /* Keep colour/opacity feedback; drop looping and travelling motion. */
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; }
  .btn, .btn__label, .btn__arrow, .case__img img, .post__img img, .related__media img, .hero__card-media img, .svc-card, .feature-card__icon .icon, .step__icon > .icon, .svc-card__icon .icon { transition: none !important; }
  .marquee__group { animation: none; }
  .marquee { overflow-x: auto; }
}
