/* Keyframes shared across the app. */
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes fade-out { from { opacity: 1; } to { opacity: 0; } }
@keyframes view-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
@keyframes drop-in { from { opacity: 0; transform: translateY(-14px) scale(0.96); } to { opacity: 1; transform: none; } }
@keyframes sheet-up { from { transform: translateY(100%); } to { transform: none; } }
@keyframes sheet-down { from { transform: none; } to { transform: translateY(100%); } }
@keyframes pop { from { opacity: 0; transform: scale(0.2); } to { opacity: 1; transform: scale(1); } }
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-3px); } }
@keyframes breathe { 0%, 100% { opacity: 0.55; } 50% { opacity: 1; } }
@keyframes pulse { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.06); opacity: 0.8; } }
@keyframes glow { 0%, 100% { opacity: 0.8; transform: scale(1); } 50% { opacity: 1; transform: scale(1.06); } }
@keyframes dot { 0%, 100% { opacity: 0.25; transform: translateY(0); } 40% { opacity: 1; transform: translateY(-3px); } }
@keyframes grow-x { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-6px) rotate(-2deg); }
  40% { transform: translateX(6px) rotate(2deg); }
  60% { transform: translateX(-4px) rotate(-1deg); }
  80% { transform: translateX(4px) rotate(1deg); }
}
@keyframes flame {
  0%, 100% { transform: scale(1, 1) rotate(-2deg); }
  25% { transform: scale(0.94, 1.08) rotate(2deg); }
  50% { transform: scale(1.04, 0.96) rotate(-1deg); }
  75% { transform: scale(0.97, 1.05) rotate(3deg); }
}
@keyframes ember {
  0% { opacity: 0; transform: translate(0, 0) scale(0.6); }
  10% { opacity: 0.9; }
  60% { opacity: 0.6; }
  100% { opacity: 0; transform: translate(26px, -78vh) scale(0.2); }
}
@keyframes twinkle { 0%, 100% { opacity: 0.95; } 50% { opacity: 0.45; } }
@keyframes moon-rise { from { opacity: 0; transform: translate(40px, 60px) scale(0.7); } to { opacity: 1; transform: none; } }
@keyframes sun-rise { from { opacity: 0; transform: translateY(160px); } to { opacity: 1; transform: none; } }
@keyframes speak-pulse {
  0% { box-shadow: 0 0 0 2px var(--ink-1), 0 0 0 4.500px var(--gold-4), 0 0 0 5px rgba(236, 208, 143, 0.65); }
  100% { box-shadow: 0 0 0 2px var(--ink-1), 0 0 0 4.500px var(--gold-4), 0 0 0 22px rgba(236, 208, 143, 0); }
}
@keyframes fan-in {
  from { opacity: 0; transform: translate(0, 60px) rotate(0deg) scale(0.8); }
  to { opacity: 1; transform: translate(var(--x), var(--y)) rotate(var(--r)); }
}
@keyframes deal-out {
  0% { opacity: 0; transform: translate(0, 0) rotate(0deg) scale(0.9); }
  18% { opacity: 1; }
  100% { opacity: 0; transform: translate(var(--dx), var(--dy)) rotate(var(--rot)) scale(0.7); }
}
@keyframes card-land {
  from { opacity: 0; transform: translateY(-46px) rotate(-7deg) scale(1.12); }
  to { opacity: 1; transform: none; }
}
@keyframes announce-veil { 0% { opacity: 0; } 12%, 78% { opacity: 1; } 100% { opacity: 0; } }
@keyframes announce-band {
  0% { opacity: 0; transform: scale(1.18); letter-spacing: 0.3em; }
  16% { opacity: 1; transform: scale(1); }
  80% { opacity: 1; transform: scale(1); }
  100% { opacity: 0; transform: scale(0.97); }
}
@keyframes rule-grow { 0% { transform: scaleX(0); } 22%, 80% { transform: scaleX(1); } 100% { transform: scaleX(0.3); opacity: 0; } }
@keyframes token-flip {
  0% { opacity: 0; transform: rotateY(90deg) scale(0.6); }
  60% { opacity: 1; transform: rotateY(-12deg) scale(1.08); }
  100% { opacity: 1; transform: none; }
}
@keyframes stamp {
  0% { opacity: 0; transform: scale(2.4) rotate(-12deg); }
  60% { opacity: 1; transform: scale(0.94) rotate(-4deg); }
  100% { opacity: 1; transform: scale(1) rotate(-4deg); }
}
@keyframes shuffle {
  0%, 100% { transform: translateX(0) rotate(0deg); }
  50% { transform: translateX(calc(var(--i) * -34px)) translateY(-8px) rotate(calc(var(--i) * -6deg)); }
}
@keyframes tally-out { 0% { transform: scale(1); } 40% { transform: scale(1.04); } 100% { transform: scale(1); } }
@keyframes banner-in { from { opacity: 0; transform: scale(0.86) translateY(-10px); } to { opacity: 1; transform: none; } }
@keyframes reveal-in { from { opacity: 0; transform: rotateY(80deg) scale(0.8); } to { opacity: 1; transform: none; } }
@keyframes clue-in { from { opacity: 0; transform: translateX(-12px); } to { opacity: 1; transform: none; } }
@keyframes chip-flip { 0% { transform: rotateY(90deg) scale(0.7); } 100% { transform: none; } }
@keyframes zz { 0% { opacity: 0; transform: translate(-4px, 8px); } 40% { opacity: 0.9; } 100% { opacity: 0; transform: translate(8px, -12px); } }
