/* ==========================================================================
   ANIMATIONS — keyframes & scroll-triggered classes
   ========================================================================== */

@keyframes blink { 50% { opacity: 0; } }

@keyframes avatarSpin { to { transform: rotate(360deg); } }
@keyframes avatarPulse {
  0%, 100% { box-shadow: 0 0 22px rgba(0,212,255,.5), inset 0 0 22px rgba(0,212,255,.2); }
  50% { box-shadow: 0 0 34px rgba(0,212,255,.75), inset 0 0 30px rgba(0,212,255,.3); }
}

@keyframes scrollDot {
  0% { opacity: 1; top: 8px; }
  70% { opacity: 0; }
  100% { opacity: 0; top: 22px; }
}

@keyframes dotPulse {
  0%, 100% { box-shadow: 0 0 6px var(--color-neon-blue); transform: scale(1); }
  50% { box-shadow: 0 0 16px var(--color-neon-blue); transform: scale(1.25); }
}

@keyframes konamiFade {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes drawerFadeIn {
  from { opacity: 0; transform: translateX(30px); }
  to { opacity: 1; transform: translateX(0); }
}

/* ---------- Scroll reveal ---------- */
.fade-in-up {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity .7s cubic-bezier(.16,.8,.3,1), transform .7s cubic-bezier(.16,.8,.3,1);
}
.fade-in-up.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* stagger children within a grid when parent becomes visible */
.cards-grid .mini-card.is-visible,
.cards-grid .neon-card.is-visible,
.cards-grid .lang-card.is-visible { transition-delay: calc(var(--stagger, 0) * 70ms); }

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