/* Cover and scene animations (web/covers.js). All stop under prefers-reduced-motion. */
.kb { animation: kb 24s ease-in-out infinite alternate; transform-box: fill-box; transform-origin: 50% 40%; }
@keyframes kb { from { transform: scale(1) translate(0, 0); } to { transform: scale(1.09) translate(-6px, 4px); } }
.pan { animation: pan 26s ease-in-out infinite alternate; transform-box: fill-box; transform-origin: center; }
@keyframes pan { from { transform: scale(1.06) translateX(-9px); } to { transform: scale(1.06) translateX(9px); } }
.breathe { animation: breathe 9s ease-in-out infinite; transform-box: fill-box; transform-origin: 50% 45%; }
@keyframes breathe { 50% { transform: scale(1.06); } }
.sheen { animation: sheen 7s ease-in-out infinite; }
@keyframes sheen { 0%, 30% { transform: rotate(18deg) translateX(0); } 100% { transform: rotate(18deg) translateX(700px); } }
.dust { animation: dust 14s ease-in-out infinite alternate; }
@keyframes dust { to { transform: translate(18px, -26px); opacity: .15; } }
.tw { animation: tw 3.2s ease-in-out infinite; }
@keyframes tw { 50% { opacity: .15; } }
.fl { animation: fl 2.6s ease-in-out infinite; }
@keyframes fl { 0%, 100% { opacity: 1; } 40% { opacity: .78; } 60% { opacity: .95; } 80% { opacity: .7; } }
.pulse { animation: pulse 7s ease-in-out infinite; transform-box: fill-box; transform-origin: center; }
@keyframes pulse { 50% { transform: scale(1.12); opacity: .8; } }
.dr { animation: dr 12s ease-in-out infinite alternate; }
@keyframes dr { to { transform: translateX(14px); } }
.wave { animation: wave 3.4s ease-in-out infinite; }
@keyframes wave { 50% { transform: translateX(8px); opacity: .25; } }
.bob { animation: bob 3s ease-in-out infinite; }
@keyframes bob { 50% { transform: translateY(4px) rotate(-3deg); } }
.sway { animation: sway 1.1s ease-in-out infinite alternate; }
@keyframes sway { from { transform: rotate(-6deg); } to { transform: rotate(6deg); } }
.rise { animation: rise 6s linear infinite; opacity: 0; }
@keyframes rise { 0% { transform: translateY(0); opacity: 0; } 15% { opacity: .9; } 100% { transform: translateY(-220px) translateX(12px); opacity: 0; } }
.snow { animation: snow 7s linear infinite; }
@keyframes snow { to { transform: translateY(420px) translateX(-20px); } }
.rain { animation: rain .9s linear infinite; }
@keyframes rain { to { transform: translate(-12px, 60px); opacity: 0; } }
.fall { animation: fall 1.2s linear infinite; }
@keyframes fall { 50% { opacity: .15; } }
.fly { animation: fly 5s ease-in-out infinite; }
@keyframes fly { 0%, 100% { opacity: 0; transform: translate(0, 0); } 30%, 70% { opacity: 1; } 50% { transform: translate(10px, -14px); } }
.bolt { animation: bolt 5s steps(1) infinite; }
@keyframes bolt { 0%, 8%, 12%, 100% { opacity: 0; } 9%, 11% { opacity: 1; } }
.thread { stroke-dasharray: 520; stroke-dashoffset: 520; animation: thread 6s ease-out infinite; }
@keyframes thread { 60%, 100% { stroke-dashoffset: 0; } }
.spin { animation: spin 4s ease-in-out infinite; }
@keyframes spin { 50% { transform: translateY(14px); } }
.tilt { animation: tilt 5s ease-in-out infinite alternate; }
@keyframes tilt { from { transform: rotate(-4deg); } to { transform: rotate(5deg); } }
@media (prefers-reduced-motion: reduce) { svg * { animation: none !important; } }
