/* animations.css */
/* ============================
   动画定义
   依赖：无
   ============================ */
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

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

@keyframes creepyWhisper {
  0%,
  100% {
    text-shadow: 0 0 5px var(--glow-red), 0 0 10px rgba(60, 10, 5, 0.7);
    transform: translate(0, 0);
  }
  25% {
    text-shadow: 0 0 8px var(--glow-red), 0 0 14px rgba(80, 20, 10, 0.8);
    transform: translate(0.5px, -0.5px);
  }
  50% {
    text-shadow: 0 0 6px var(--glow-red), 0 0 12px rgba(50, 5, 0, 0.6);
    transform: translate(-0.5px, 0.5px);
  }
  75% {
    text-shadow: 0 0 9px var(--glow-red), 0 0 16px rgba(70, 15, 5, 0.7);
    transform: translate(0.3px, -0.2px);
  }
}

@keyframes pulseGlow {
  0%,
  100% {
    text-shadow: 0 0 8px var(--glow-red), 0 0 20px var(--glow-amber);
  }
  50% {
    text-shadow: 0 0 16px var(--glow-red), 0 0 40px var(--glow-amber);
  }
}

@keyframes shake {
  0%,
  100% { transform: translateX(0); }
  25% { transform: translateX(-2px); }
  75% { transform: translateX(2px); }
}

.whisper-text {
  animation: creepyWhisper 2.5s infinite;
  font-style: italic;
  letter-spacing: 2px;
}

.pulse-glow {
  animation: pulseGlow 3s infinite;
}

.shake {
  animation: shake 0.4s ease-in-out;
}