@keyframes pop-in { from { opacity: 0; transform: translateY(6px) scale(.98); } to { opacity: 1; transform: none; } }
@keyframes card-in { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: none; } }
@keyframes toast-in { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } }

.card, .chapter, .deck-meta { animation: pop-in .22s ease-out both; }
/* 中央卡文字的入场动画只在卡册首次整页挂载时播放。
   切卡走 js/main.js 的 syncDeckDom 原地更新，节点不销毁，动画不会重放，避免闪一下。 */
#app.deck-fresh .fan-card[data-pos="center"] .fc-target,
#app.deck-fresh .fan-card[data-pos="center"] .fc-zh { animation: card-in .3s ease-out both; }
.toast { animation: toast-in .18s ease-out both; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
}
body.reduce-motion *, body.reduce-motion *::before, body.reduce-motion *::after {
  animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important;
}
