/* ── SHARED ANIMATIONS (from app.css originals) ── */
@keyframes snow-fall {
    0%   { transform: translateY(-10vh) translateX(0); opacity: 0; }
    10%  { opacity: 1; }
    100% { transform: translateY(110vh) translateX(40px); opacity: .2; }
}
@keyframes leaf-fall {
    0%   { transform: translateY(-10vh) translateX(0) rotate(0deg); opacity: 0; }
    10%  { opacity: .7; }
    100% { transform: translateY(110vh) translateX(100px) rotate(720deg); opacity: 0; }
}
@keyframes spooky-float {
    0%, 100% { transform: translateY(0) rotate(0deg); }
    50%       { transform: translateY(-30px) rotate(5deg); }
}
@keyframes bat-fly {
    0%   { transform: translateX(-120px); }
    100% { transform: translateX(110vw); }
}
@keyframes firework-launch {
    0%   { height: 0; opacity: 0; }
    50%  { height: 120px; opacity: 1; }
    100% { height: 0; opacity: 0; }
}
@keyframes firework-burst {
    0%   { transform: scale(0); opacity: 1; }
    100% { transform: scale(4); opacity: 0; }
}
@keyframes spark-burst {
    0%   { transform: translate(0,0) scale(1); opacity: 1; }
    100% { transform: translate(var(--sx), var(--sy)) scale(0); opacity: 0; }
}
@keyframes confetti-tumble {
    0%   { transform: translateY(-10vh) rotate(0deg); opacity: 1; }
    100% { transform: translateY(110vh) rotate(720deg); opacity: .3; }
}
@keyframes fog-move {
    0%   { transform: translateX(-10%); }
    100% { transform: translateX(10%); }
}
@keyframes spider-drop {
    0%, 100% { transform: translateY(-100px); }
    50%       { transform: translateY(60vh); }
}
@keyframes eye-blink {
    0%, 45%, 55%, 100% { opacity: 1; }
    50%                 { opacity: 0; }
}