/* ============================================================
   Keyframe animations & reveal states
============================================================ */

@keyframes pulse {
  0% { box-shadow: 0 0 0 0 rgba(45, 212, 191, 0.55); }
  70% { box-shadow: 0 0 0 10px rgba(45, 212, 191, 0); }
  100% { box-shadow: 0 0 0 0 rgba(45, 212, 191, 0); }
}

@keyframes scrollDot {
  0% { transform: translateY(0); opacity: 1; }
  60% { transform: translateY(12px); opacity: 0; }
  100% { transform: translateY(0); opacity: 0; }
}

@keyframes ctaGrad {
  0% { background-position: 0% 0%; }
  50% { background-position: 100% 100%; }
  100% { background-position: 0% 0%; }
}

@keyframes floatPulse {
  0%, 100% { transform: translateY(0); box-shadow: 0 14px 34px -10px rgba(45,212,191,0.7); }
  50% { transform: translateY(-5px); box-shadow: 0 20px 40px -10px rgba(45,212,191,0.9); }
}

/* ============================================================
   Scroll reveal (GSAP toggles .is-inview; CSS fallback below)
============================================================ */
[data-reveal] {
  opacity: 0;
  transform: translateY(34px);
  transition: opacity .9s var(--ease), transform .9s var(--ease);
  will-change: opacity, transform;
}
[data-reveal].is-inview {
  opacity: 1;
  transform: translateY(0);
}

/* Split text lines/words handled by SplitType + GSAP; keep base hidden gracefully */
.line { overflow: hidden; }

/* Card stagger entrance */
.reveal-up {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity .8s var(--ease), transform .8s var(--ease);
  transition-delay: var(--d, 0s);
  will-change: opacity, transform;
}
.reveal-up.is-inview { opacity: 1; transform: translateY(0); }

/* Image clip reveal */
.clip-reveal { clip-path: inset(0 0 100% 0); transition: clip-path 1.1s var(--ease); }
.clip-reveal.is-inview { clip-path: inset(0 0 0% 0); }

/* Pre-JS: keep things visible if scripts fail */
.no-js [data-reveal],
.no-js .reveal-up { opacity: 1; transform: none; }

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal], .reveal-up { opacity: 1 !important; transform: none !important; }
  .clip-reveal { clip-path: none !important; }
  .badge__dot, .hero__scroll-mouse span, .float-call, .cta__bg { animation: none !important; }
}
