/* =========================================================
   ANIMATIONS — keyframes referenced by JS-driven classes
   ========================================================= */

@keyframes floatY{
  0%,100%{transform:translateY(0);}
  50%{transform:translateY(-14px);}
}
.float{animation:floatY 6s ease-in-out infinite;}
.float-slow{animation:floatY 9s ease-in-out infinite;}
.float-delay{animation-delay:1.4s;}

@keyframes pulseGlow{
  0%,100%{opacity:.55;}
  50%{opacity:1;}
}
.pulse-glow{animation:pulseGlow 3.4s ease-in-out infinite;}

@keyframes spinSlow{
  from{transform:rotate(0deg);}
  to{transform:rotate(360deg);}
}
.spin-slow{animation:spinSlow 40s linear infinite;}

@keyframes particleDrift{
  0%{transform:translate(0,0);opacity:0;}
  10%{opacity:1;}
  90%{opacity:1;}
  100%{transform:translate(var(--dx,20px),var(--dy,-60px));opacity:0;}
}
.particle{
  animation:particleDrift var(--dur,6s) linear infinite;
  animation-delay:var(--delay,0s);
}

@keyframes ellipsisBlink{
  0%,20%{opacity:0;}
  50%{opacity:1;}
  100%{opacity:0;}
}

@keyframes shimmer{
  0%{background-position:-200% 0;}
  100%{background-position:200% 0;}
}
.skeleton{
  background:linear-gradient(90deg, var(--bg-1) 25%, var(--bg-2) 50%, var(--bg-1) 75%);
  background-size:200% 100%;
  animation:shimmer 1.6s linear infinite;
}

@keyframes softBounce{
  0%,100%{transform:translateY(0);}
  50%{transform:translateY(6px);}
}

/* count-up number utility, value swapped via JS */
.count-num{font-variant-numeric:tabular-nums;}
