/* ==========================================================================
   Connect.MediaMileage — Animations
   Lightweight scroll-reveal (IntersectionObserver driven) + keyframes
   ========================================================================== */

[data-animate] {
  opacity: 0;
  transition: opacity 0.8s cubic-bezier(0.22, 1, 0.36, 1), transform 0.8s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: opacity, transform;
}
[data-animate="fade-up"] { transform: translateY(28px); }
[data-animate="fade-left"] { transform: translateX(-32px); }
[data-animate="fade-right"] { transform: translateX(32px); }
[data-animate="zoom-in"] { transform: scale(0.94); }

[data-animate].in-view {
  opacity: 1;
  transform: translate(0, 0) scale(1);
}

/* Stagger children via inline --d custom property (set in HTML) */
[data-animate] { transition-delay: var(--d, 0ms); }

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

@keyframes pulseDot {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.4; transform: scale(0.85); }
}
.pulse-dot { animation: pulseDot 1.8s ease-in-out infinite; }

@keyframes drawLine {
  from { stroke-dashoffset: var(--len, 300); }
  to { stroke-dashoffset: 0; }
}
.chart-line { stroke-dasharray: var(--len, 300); stroke-dashoffset: var(--len, 300); animation: drawLine 1.6s var(--ease, ease) forwards 0.3s; }

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

/* Mobile menu icon rotation handled inline via .hamburger classes in style.css */

/* Marquee-free industry image zoom & card lifts are defined in style.css using transitions,
   kept here only for keyframe-driven effects to separate "structure" (style.css) from "motion" (animations.css) */

@keyframes fadeInScale {
  from { opacity: 0; transform: scale(0.92); }
  to { opacity: 1; transform: scale(1); }
}
.dash-anim { animation: fadeInScale 0.9s cubic-bezier(0.22,1,0.36,1) 0.2s both; }
