/* ==========================================================================
   AMBIENT ANIMATIONS
   Continuous/looping motion lives in pure CSS (cheap, GPU-friendly).
   One-time orchestrated sequences (hero timeline, scroll reveals, the arc
   sweep, dial counters) are driven by GSAP in js/animations.js so they can
   be sequenced and staggered — see that file. Initial hidden states for
   scroll-reveal elements are also set from JS (not here), so the page still
   reads correctly with CSS alone if a script fails to load.
   ========================================================================== */

@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-16px); }
}

@keyframes floatY-sm {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-8px); }
}

@keyframes spinSlow {
  to { transform: rotate(360deg); }
}

@keyframes pulseRing {
  0%   { transform: scale(0.9); opacity: 0.55; }
  70%  { transform: scale(1.9); opacity: 0; }
  100% { transform: scale(1.9); opacity: 0; }
}

@keyframes pulseDot {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.45; }
}

.anim-float { animation: floatY 7s var(--ease-in-out) infinite; }
.anim-float-sm { animation: floatY-sm 5.5s var(--ease-in-out) infinite; }
.anim-float-delay { animation-delay: -2.4s; }
.anim-spin-slow { animation: spinSlow 60s linear infinite; }

.live-dot { position: relative; width: 8px; height: 8px; border-radius: 50%; background: #3FBE72; flex-shrink: 0; }
.live-dot::after {
  content: '';
  position: absolute; inset: 0;
  border-radius: 50%;
  background: #3FBE72;
  animation: pulseRing 2.2s ease-out infinite;
}
.live-dot__core { animation: pulseDot 2.2s ease-in-out infinite; }

@media (prefers-reduced-motion: reduce) {
  .anim-float, .anim-float-sm, .anim-spin-slow, .live-dot::after, .live-dot__core {
    animation: none !important;
  }
}
