/* ================================================================
   animations.css — All @keyframes definitions
================================================================ */

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

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

@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@keyframes fadeOut {
  from { opacity: 1; }
  to   { opacity: 0; }
}

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

@keyframes progressBar97 {
  from { width: 0%; }
  to   { width: 97%; }
}

@keyframes easterEggIn {
  from { opacity: 0; transform: translate(-50%, 20px) scale(0.95); }
  to   { opacity: 1; transform: translate(-50%, 0) scale(1); }
}

@keyframes easterEggOut {
  from { opacity: 1; transform: translate(-50%, 0) scale(1); }
  to   { opacity: 0; transform: translate(-50%, -20px) scale(0.95); }
}

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

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

@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20%       { transform: translateX(-8px); }
  40%       { transform: translateX(8px); }
  60%       { transform: translateX(-6px); }
  80%       { transform: translateX(6px); }
}

@keyframes spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

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

@keyframes glitch1 {
  0%, 100% { clip-path: inset(0 0 100% 0); transform: translate(0); }
  20%       { clip-path: inset(20% 0 60% 0); transform: translate(-4px, 2px); }
  40%       { clip-path: inset(40% 0 40% 0); transform: translate(4px, -2px); }
  60%       { clip-path: inset(60% 0 20% 0); transform: translate(-2px, 4px); }
  80%       { clip-path: inset(80% 0 0% 0); transform: translate(2px, -4px); }
}

@keyframes glitch2 {
  0%, 100% { clip-path: inset(0 0 100% 0); transform: translate(0); }
  20%       { clip-path: inset(10% 0 70% 0); transform: translate(4px, -2px); }
  40%       { clip-path: inset(30% 0 50% 0); transform: translate(-4px, 2px); }
  60%       { clip-path: inset(50% 0 30% 0); transform: translate(2px, 4px); }
  80%       { clip-path: inset(70% 0 10% 0); transform: translate(-2px, -4px); }
}

@keyframes float {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  33%       { transform: translateY(-10px) rotate(2deg); }
  66%       { transform: translateY(-5px) rotate(-2deg); }
}

@keyframes confettiFall {
  0%   { transform: translateY(-20px) rotate(0deg); opacity: 1; }
  100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }
}

@keyframes disco {
  0%   { filter: hue-rotate(0deg) brightness(1.2); }
  100% { filter: hue-rotate(360deg) brightness(1.2); }
}

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

@keyframes scrollHintBounce {
  0%, 100% { transform: translateX(-50%) translateY(0); }
  50%       { transform: translateX(-50%) translateY(6px); }
}
