@keyframes pulseSweep {
  0% { background-position: 0% 50%; }
  100% { background-position: 100% 50%; }
}

@keyframes dropIn {
  from { opacity: 0; transform: translateY(-10px) scale(0.975); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.3; }
}

@keyframes railHeat {
  0%, 100% { background-position: 0% 0%; }
  50% { background-position: 0% 100%; }
}

@keyframes railRise {
  0% { background-position: 0% 150%; }
  100% { background-position: 0% -50%; }
}

@keyframes railGlow {
  0%, 100% {
    opacity: 0.6;
    box-shadow: 2px 0 10px rgba(168,85,255,0.3);
  }
  50% {
    opacity: 1;
    box-shadow: 2px 0 22px rgba(168,85,255,0.6);
  }
}

@keyframes railPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

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

@keyframes logoBreathe {
  0%, 100% { filter: drop-shadow(0 0 14px rgba(0,245,200,0.4)); }
  50% { filter: drop-shadow(0 0 28px rgba(0,245,200,0.7)) drop-shadow(0 0 50px rgba(79,124,255,0.25)); }
}

@keyframes stampIn {
  from { opacity: 0; transform: scale(0.4) rotate(-20deg); }
  to { opacity: 1; transform: scale(1) rotate(0deg); }
}

@keyframes voteRipple {
  from {
    opacity: 0.62;
    transform: translate(-50%, -50%) scale(0);
  }
  to {
    opacity: 0;
    transform: translate(-50%, -50%) scale(16);
  }
}

@keyframes coreMarkSpin {
  from { transform: rotate(0deg) scale(0.96); }
  to { transform: rotate(360deg) scale(1); }
}

@keyframes freshFill {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

.card-drop,
.meta-drop-in {
  animation: dropIn 350ms cubic-bezier(0.34,1.2,0.64,1) both;
}

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