/* ============================================================
   動畫：進場、彈出、搖晃、紙花、星星與密技提示
   所有裝飾動畫都尊重 prefers-reduced-motion 與設定中的「減少動畫」。
   ============================================================ */
@keyframes screen-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes dialog-in { from { opacity: 0; transform: translateY(10px) scale(0.98); } to { opacity: 1; transform: none; } }
@keyframes feedback-in { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
@keyframes is-pop { 0% { transform: scale(0.96); } 65% { transform: scale(1.02); } 100% { transform: none; } }
@keyframes is-shake { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-5px); } 40% { transform: translateX(5px); } 60% { transform: translateX(-3px); } 80% { transform: translateX(3px); } }
@keyframes is-right { 0% { box-shadow: 0 0 0 0 rgba(79,156,143,0.6); } 100% { box-shadow: 0 0 0 14px rgba(79,156,143,0); } }
@keyframes bg-swap { from { opacity: 0.08; } to { opacity: 0.18; } }
@keyframes confetti-fall {
  0% { opacity: 1; transform: translate3d(0, 0, 0) rotate(0); }
  100% { opacity: 0; transform: translate3d(var(--dx, 0), 108vh, 0) rotate(var(--rot, 360deg)); }
}
@keyframes star-in { 0% { opacity: 0; transform: scale(0.2) rotate(-22deg); } 70% { opacity: 1; transform: scale(1.14) rotate(3deg); } 100% { opacity: 1; transform: none; } }
@keyframes cheat-show {
  0% { opacity: 0; transform: translate(-50%, -50%) scale(0.92); }
  12%, 78% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
  100% { opacity: 0; transform: translate(-50%, -50%) scale(0.98); }
}
.is-pop { animation: is-pop 0.24s ease both; }
.is-shake { animation: is-shake 0.42s ease both; }
.is-right { animation: is-right 0.55s ease both; }
.is-flip { animation: is-pop 0.3s ease both; }
