
/* === 卡片入场 === */
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(30px); }
  to { opacity: 1; transform: translateY(0); }
}

/* === 选课成功波纹 === */
@keyframes rippleSuccess {
  0% { box-shadow: 0 0 0 0 rgba(0, 181, 120, 0.4); }
  100% { box-shadow: 0 0 0 20px rgba(0, 181, 120, 0); }
}

/* === 名额紧张闪烁 === */
@keyframes pulseGlow {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

/* === 时间冲突闪烁 === */
@keyframes conflictFlash {
  0%, 100% { border-color: var(--color-danger); }
  50% { border-color: transparent; }
}

/* === 按钮涟漪 === */
@keyframes ripple {
  to { transform: scale(4); opacity: 0; }
}

/* === 撒花下落 === */
@keyframes confettiFall {
  0% { transform: translateY(-100%) rotate(0deg); opacity: 1; }
  100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }
}

/* === 霓虹脉冲 === */
@keyframes neonPulse {
  0%, 100% { text-shadow: 0 0 7px currentColor, 0 0 10px currentColor; }
  50% { text-shadow: 0 0 7px currentColor, 0 0 10px currentColor, 0 0 42px currentColor, 0 0 82px currentColor; }
}

/* === 无限滚动 === */
@keyframes marquee {
  0% { transform: translateX(100%); }
  100% { transform: translateX(-100%); }
}

/* === 数字翻转 === */
@keyframes flipIn {
  0% { transform: rotateX(90deg); opacity: 0; }
  100% { transform: rotateX(0deg); opacity: 1; }
}

