/* ============================================================
   動畫：轉場、回饋、星星、彩帶與密技
   ============================================================ */
@keyframes screen-in {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes feedback-in {
  from { opacity: 0; transform: translateY(-4px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes star-pop {
  0% { opacity: 0; transform: scale(.4) rotate(-16deg); }
  70% { opacity: 1; transform: scale(1.12) rotate(3deg); }
  100% { opacity: 1; transform: scale(1) rotate(0); }
}
@keyframes confetti-fall {
  0% { transform: translate3d(0, -20px, 0) rotate(0); opacity: 1; }
  100% { transform: translate3d(0, calc(100dvh - var(--footer-h) + 30px), 0) rotate(var(--spin, 360deg)); opacity: .15; }
}
@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-5px); }
  40% { transform: translateX(4px); }
  60% { transform: translateX(-3px); }
  80% { transform: translateX(2px); }
}
@keyframes nudge {
  0%, 100% { transform: translateX(0); }
  30% { transform: translateX(4px); }
  60% { transform: translateX(-3px); }
}
@keyframes glow-correct {
  0% { box-shadow: 0 0 0 0 rgba(233, 196, 106, .45); }
  55% { box-shadow: 0 0 0 8px rgba(233, 196, 106, 0); }
  100% { box-shadow: 0 16px 44px rgba(10, 5, 18, .22); }
}
@keyframes cheat-in {
  from { opacity: 0; transform: translateY(14px) scale(.96); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes pulse-soft {
  0%, 100% { opacity: .75; }
  50% { opacity: 1; }
}
