/* =========================================================
   Animations — reveal on scroll, hover lift, floating, counters
   ========================================================= */

/* Reveal (set by IntersectionObserver in animations.js) */
[data-reveal] {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s cubic-bezier(.22,1,.36,1), transform .7s cubic-bezier(.22,1,.36,1);
  will-change: opacity, transform;
}
[data-reveal="left"]  { transform: translateX(-32px); }
[data-reveal="right"] { transform: translateX(32px); }
[data-reveal="zoom"]  { transform: scale(.94); }
[data-reveal].is-visible { opacity: 1; transform: none; }

/* Stagger children */
[data-stagger] > * { transition-delay: calc(var(--i, 0) * 80ms); }

/* Hover lift utility */
.hover-lift { transition: transform .25s ease, box-shadow .25s ease; }
.hover-lift:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }

/* Floating icons */
@keyframes floaty { 0%,100% { transform: translateY(0);} 50% { transform: translateY(-8px);} }
.float-slow { animation: floaty 6s ease-in-out infinite; }
.float-med  { animation: floaty 4s ease-in-out infinite; }
.float-fast { animation: floaty 3s ease-in-out infinite; }

/* Pulse */
@keyframes softPulse { 0%,100% { box-shadow: 0 0 0 0 rgba(0,194,168,.5);} 50% { box-shadow: 0 0 0 14px rgba(0,194,168,0);} }
.pulse { animation: softPulse 2.4s ease-out infinite; }

/* Progress bar */
.progress { height: 8px; background: rgba(11,114,133,.1); border-radius: 999px; overflow: hidden; }
.progress > span { display: block; height: 100%; background: var(--grad-primary); width: 0; transition: width 1.2s ease; }

/* Gradient text */
.text-gradient {
  background: var(--grad-primary);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}

/* Marquee (client strip fallback) */
@keyframes marquee { from { transform: translateX(0);} to { transform: translateX(-50%);} }
.marquee { overflow: hidden; }
.marquee-track { display: flex; gap: 3rem; width: max-content; animation: marquee 30s linear infinite; }
.marquee:hover .marquee-track { animation-play-state: paused; }
