/* ============ Keyframes + reduced-motion / no-fx handling ============ */

@keyframes badgePulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.5); opacity: 0.6; }
}

@keyframes scrollDot {
  0% { transform: translate(-50%, 0); opacity: 1; }
  70% { transform: translate(-50%, 12px); opacity: 0; }
  100% { transform: translate(-50%, 0); opacity: 0; }
}

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

/* Idle bob for hero particles (GSAP adds mouse parallax on top via wrapper) */
.particle { animation: floatBob 4.2s ease-in-out infinite; }
.particle:nth-child(2n) { animation-duration: 5.4s; animation-delay: 0.6s; }
.particle:nth-child(3n) { animation-duration: 6.2s; animation-delay: 1.1s; }

/* Signature SVG initial states are set from JS (progressive enhancement:
   with no JS everything is fully visible). */

/* ---------- Reduced motion / ?nofx ---------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.001s !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001s !important;
  }
}
html.no-fx { scroll-behavior: auto; }
html.no-fx .particle { animation: none; }
html.no-fx .hero__badge-dot { animation: none; }
html.no-fx .hero__scroll-hint { display: none; }
html.no-fx .reveal-frame::after { display: none; }
