@keyframes buttonShine { 0%,68%{transform:translateX(-76%) rotate(6deg)} 84%,100%{transform:translateX(76%) rotate(6deg)} }
@keyframes hardPulse { 0%,100%{transform:scale(1);filter:brightness(1)} 50%{transform:scale(1.05);filter:brightness(1.15)} }
@keyframes selectedBallBreath { 0%,100%{transform:translateY(0) scale(1)} 50%{transform:translateY(-1.5px) scale(1.008)} }
@keyframes targetGlow { 0%,100%{filter:drop-shadow(0 5px 6px rgba(0,0,0,.2)) drop-shadow(0 0 0 rgba(92,244,194,0))} 50%{filter:drop-shadow(0 5px 6px rgba(0,0,0,.2)) drop-shadow(0 0 9px rgba(92,244,194,.56))} }
@keyframes pourLeft { 0%{transform:translateX(-50%) rotate(0)} 28%{transform:translateX(-50%) translateY(-2px) rotate(-.8deg)} 58%{transform:translateX(-50%) translateY(-3px) rotate(-2.6deg)} 82%{transform:translateX(-50%) translateY(-1px) rotate(-.7deg)} 100%{transform:translateX(-50%) rotate(0)} }
@keyframes pourRight { 0%{transform:translateX(-50%) rotate(0)} 28%{transform:translateX(-50%) translateY(-2px) rotate(.8deg)} 58%{transform:translateX(-50%) translateY(-3px) rotate(2.6deg)} 82%{transform:translateX(-50%) translateY(-1px) rotate(.7deg)} 100%{transform:translateX(-50%) rotate(0)} }
@keyframes receive { 0%,25%{transform:translateX(-50%) scale(1)} 66%{transform:translateX(-50%) translateY(1px) scale(.996,1.004)} 100%{transform:translateX(-50%) scale(1)} }
@keyframes landed { 0%{transform:translateX(-50%) scale(1)} 42%{transform:translateX(-50%) translateY(1px) scale(1.004,.995)} 72%{transform:translateX(-50%) translateY(-.5px) scale(.998,1.002)} 100%{transform:translateX(-50%) scale(1)} }
@keyframes ballLand { 0%{transform:translateX(-50%) translateY(-4px) scale(1.012)} 46%{transform:translateX(-50%) translateY(1px) scale(1.016,.984)} 74%{transform:translateX(-50%) translateY(-.6px) scale(.997,1.004)} 100%{transform:translateX(-50%) translateY(0) scale(1)} }
@keyframes tubeComplete { 0%{transform:translateX(-50%) scale(1)} 36%{transform:translateX(-50%) translateY(-5px) scale(1.028)} 62%{transform:translateX(-50%) translateY(.5px) scale(.993)} 82%{transform:translateX(-50%) translateY(-1px) scale(1.006)} 100%{transform:translateX(-50%) scale(1)} }
@keyframes completeGlow { 0%{filter:drop-shadow(0 5px 6px rgba(0,0,0,.2))} 36%{filter:drop-shadow(0 0 14px rgba(255,236,123,.85)) drop-shadow(0 0 26px rgba(255,202,62,.28))} 100%{filter:drop-shadow(0 5px 6px rgba(0,0,0,.2))} }
@keyframes tubeEnter { 0%{opacity:0;transform:translateY(13px) scale(.965);filter:blur(1.5px)} 62%{opacity:1;transform:translateY(-2px) scale(1.006);filter:blur(0)} 100%{opacity:1;transform:translateY(0) scale(1);filter:blur(0)} }
@keyframes chapterReveal { 0%{opacity:0;transform:translate(-50%,-50%) scale(.86)} 17%{opacity:1;transform:translate(-50%,-50%) scale(1.025)} 27%,72%{opacity:1;transform:translate(-50%,-50%) scale(1)} 100%{opacity:0;transform:translate(-50%,-55%) scale(.97)} }
.chapter-intro.show { animation:chapterReveal 1.65s cubic-bezier(.2,.86,.2,1); }
@keyframes victoryCardIn { 0%{transform:translateY(22px) scale(.92);opacity:.25} 60%{transform:translateY(-4px) scale(1.012);opacity:1} 100%{transform:translateY(0) scale(1);opacity:1} }
@keyframes trophyIn { 0%{transform:scale(.68) translateY(-12px);opacity:0} 58%{transform:scale(1.055) translateY(1px);opacity:1} 78%{transform:scale(.985)} 100%{transform:scale(1);opacity:1} }
@keyframes starPop { 0%{transform:scale(.45) rotate(-18deg);opacity:.15} 68%{transform:scale(1.18) rotate(5deg);opacity:1} 100%{transform:scale(1) rotate(0);opacity:1} }
.modal.show .victory-stars span { animation:starPop .42s cubic-bezier(.16,1.1,.22,1) both; }
.modal.show .victory-stars span:nth-child(1){animation-delay:.2s}.modal.show .victory-stars span:nth-child(2){animation-delay:.29s}.modal.show .victory-stars span:nth-child(3){animation-delay:.38s}
@keyframes raysRotate { to{transform:translateX(-50%) rotate(360deg)} }
@keyframes confettiFall { 0%{transform:translate3d(0,-20px,0) rotate(0) scale(var(--scale));opacity:0} 8%{opacity:1} 100%{transform:translate3d(var(--drift),105vh,0) rotate(var(--spin)) scale(var(--scale));opacity:.9} }
@keyframes sparkFly { 0%{transform:translate(0,0) scale(.5);opacity:0} 18%{opacity:1} 100%{transform:translate(var(--sx),var(--sy)) scale(.1);opacity:0} }
@keyframes screenFlash { 0%{opacity:0} 22%{opacity:.72} 100%{opacity:0} }
.screen-flash.go { animation:screenFlash .62s ease-out; }
@media (prefers-reduced-motion:reduce) { *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important} }
