@keyframes spin {
to { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
50% { opacity: .85; transform: translate(-50%, -50%) scale(1.05); }
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-12px); }
}
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes gradientShift {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
@keyframes glow {
0%, 100% { box-shadow: 0 0 20px rgba(91,124,250,.4); }
50% { box-shadow: 0 0 40px rgba(91,124,250,.7); }
}

.reveal {
opacity: 1;
transform: none;
}

.reveal.visible {
opacity: 1;
transform: none;
animation: fadeInUp .7s var(--ease) both;
}

.gradient-anim {
background-size: 200% 200%;
animation: gradientShift 8s ease infinite;
}

.float-anim { animation: float 6s ease-in-out infinite; }

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