.board-frame.impact-shake{animation:boardImpact .34s cubic-bezier(.2,.8,.3,1)}
.sq.impact{z-index:3;animation:cellFlash .5s ease-out}
.sq.impact::after{content:"";position:absolute;z-index:5;inset:7%;border:3px solid #fff7c7;border-radius:50%;pointer-events:none;animation:impactRing .55s ease-out forwards;box-shadow:0 0 16px #ffe28e,0 0 34px #f2bd55}
.sq.impact .disc{animation:discSlam .38s cubic-bezier(.08,.88,.18,1.35) both}
.sq.flip-cw .disc,.sq.flip-ccw .disc{backface-visibility:hidden;animation-duration:.54s;animation-timing-function:cubic-bezier(.3,.05,.25,1.35);animation-fill-mode:both;animation-delay:var(--flip-delay,0ms)}
.sq.flip-cw .disc{animation-name:discFlipCw}.sq.flip-ccw .disc{animation-name:discFlipCcw}
.board-flare{position:absolute;z-index:10;width:12px;height:12px;border-radius:50%;pointer-events:none;background:#fff;transform:translate(-50%,-50%);animation:flare .48s ease-out forwards;box-shadow:0 0 12px 5px #fff6b8,0 0 32px 14px #e9bd6577}
@keyframes discSlam{0%{transform:translateY(-48px) scale(1.28);filter:brightness(2.2);opacity:.2}55%{transform:translateY(3px) scale(.92);filter:brightness(1.35)}75%{transform:translateY(-3px) scale(1.04)}100%{transform:none;filter:none;opacity:1}}
@keyframes discFlipCw{0%{transform:rotateY(0) scale(1)}42%{transform:rotateY(90deg) scale(.78);filter:brightness(1.8)}58%{transform:rotateY(270deg) scale(.78);filter:brightness(1.8)}100%{transform:rotateY(360deg) scale(1);filter:none}}
@keyframes discFlipCcw{0%{transform:rotateY(0) scale(1)}42%{transform:rotateY(-90deg) scale(.78);filter:brightness(1.8)}58%{transform:rotateY(-270deg) scale(.78);filter:brightness(1.8)}100%{transform:rotateY(-360deg) scale(1);filter:none}}
@keyframes impactRing{0%{transform:scale(.12);opacity:1;border-width:5px}70%{opacity:.7}100%{transform:scale(1.75);opacity:0;border-width:1px}}
@keyframes cellFlash{0%{filter:brightness(2)}100%{filter:none}}
@keyframes boardImpact{0%{transform:none}18%{transform:translateY(3px) scale(.996)}40%{transform:translateY(-2px) scale(1.002)}65%{transform:translateY(1px)}100%{transform:none}}
@keyframes flare{0%{transform:translate(-50%,-50%) scale(.25);opacity:1}100%{transform:translate(-50%,-50%) scale(7);opacity:0}}
@media(prefers-reduced-motion:reduce){.board-frame.impact-shake,.sq.impact,.sq.impact .disc,.sq.flip-cw .disc,.sq.flip-ccw .disc,.board-flare{animation-duration:.01ms!important;animation-delay:0ms!important}}
