/* Keyframes + reveal states. Kept intentionally lean (no loader / cursor / WebGL). */

@keyframes av-marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

@keyframes av-drift {
  0% { transform: translate(0, 0) rotate(0deg); }
  50% { transform: translate(24px, -30px) rotate(3deg); }
  100% { transform: translate(0, 0) rotate(0deg); }
}

@keyframes av-blob {
  0% { transform: translate(-10%, -10%) scale(1); }
  50% { transform: translate(12%, 8%) scale(1.15); }
  100% { transform: translate(-10%, -10%) scale(1); }
}

@keyframes av-ripple-btn {
  from { transform: scale(0); opacity: .35; }
  to { transform: scale(2.6); opacity: 0; }
}

@keyframes av-fade-up {
  from { opacity: 0; transform: translateY(36px); }
  to { opacity: 1; transform: translateY(0); }
}

/*
 * [data-reveal] elements are hidden by inline style set from
 * js/modules/reveal.js (so content stays visible if JS never runs),
 * then transitioned in via IntersectionObserver. See that module for the
 * 6-second failsafe that force-shows everything if observation stalls.
 */
[data-reveal] {
  transition: opacity var(--dur-slow) var(--ease-out), transform var(--dur-slow) var(--ease-out);
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}
