/* Motion utilities. Trigger by class/state; no game logic here. */
:root{--mm-deal:500ms;--mm-feedback:360ms;--mm-reveal:900ms;--mm-ease:cubic-bezier(.2,.7,.2,1)}
.mm-deal{animation:mm-deal var(--mm-deal) var(--mm-ease) both}
.mm-commit{animation:mm-commit 350ms ease-out both}
.mm-invalid{animation:mm-invalid var(--mm-feedback) ease-out both}
.mm-avatar-idle{animation:mm-breathe 4s ease-in-out infinite;transform-origin:50% 90%}
.mm-turn-indicator{animation:mm-turn 2s ease-in-out infinite}
.mm-joker-reveal{animation:mm-reveal var(--mm-reveal) var(--mm-ease) both}
.mm-foliage{animation:mm-sway 7s ease-in-out infinite;transform-origin:50% 100%}
.mm-flip{perspective:900px}
.mm-flip-inner{position:relative;aspect-ratio:5/7;transition:transform 350ms var(--mm-ease);transform-style:preserve-3d}
.mm-flip.is-face-up .mm-flip-inner{transform:rotateY(180deg)}
.mm-flip-front,.mm-flip-back{position:absolute;inset:0;width:100%;height:100%;backface-visibility:hidden}
.mm-flip-front{transform:rotateY(180deg)}
.mm-sprite-reveal{width:256px;height:256px;background-image:url("sprites/joker-reveal.png");animation:mm-sprite 800ms steps(7) both}
@keyframes mm-deal{from{opacity:0;transform:translate(var(--mm-from-x,-24px),var(--mm-from-y,20px)) rotate(-6deg) scale(.9)}to{opacity:1;transform:translate(0,0) rotate(0) scale(1)}}
@keyframes mm-commit{0%{transform:scale(1)}50%{transform:scale(1.025)}100%{transform:scale(1)}}
@keyframes mm-invalid{0%,100%{transform:translateX(0)}25%{transform:translateX(-6px)}75%{transform:translateX(6px)}}
@keyframes mm-breathe{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
@keyframes mm-turn{0%,100%{opacity:.65}50%{opacity:1}}
@keyframes mm-reveal{from{opacity:0;transform:rotate(-7deg) scale(.86)}to{opacity:1;transform:rotate(0) scale(1)}}
@keyframes mm-sway{0%,100%{transform:rotate(-1deg)}50%{transform:rotate(1deg)}}
@keyframes mm-sprite{from{background-position:0 0}to{background-position:-1792px 0}}
@media(prefers-reduced-motion:reduce){
 [class*="mm-"]{animation:none!important;transition:none!important}
 .mm-sprite-reveal{background-position:-1792px 0}
}
