@keyframes fallStraight{0%{top:-70px;transform:translateY(0)}to{top:calc(100vh - 140px);transform:translateY(0)}}.falling-letter.hit{animation:.3s ease-out forwards hitBurst}@keyframes hitBurst{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.5)}to{opacity:0;transform:scale(0)}}.falling-letter.missed{animation:.8s ease-out forwards letterExplode}@keyframes letterExplode{0%{opacity:1;transform:scale(1)}20%{transform:scale(1.3)}to{opacity:0;filter:brightness(2);transform:scale(0)}}@keyframes bottomBounce{0%{transform:translateY(0)scaleY(1)scaleX(1)}30%{transform:translateY(-10px)scaleY(.85)scaleX(1.08)}60%{transform:translateY(0)scaleY(1.05)scaleX(.95)}to{transform:translateY(0)scaleY(1)scaleX(1)}}@keyframes shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-5px)}20%,40%,60%,80%{transform:translate(5px)}}@keyframes scoreFloat{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-50px)}}@keyframes errorShake{0%{opacity:1;transform:translate(0)}25%{transform:translate(-10px)}50%{transform:translate(10px)}75%{transform:translate(-5px)}to{opacity:0;transform:translate(0)}}@keyframes upwardHit{0%{opacity:1;transform:translateY(0)scale(1)}50%{opacity:1;transform:translateY(-30px)scale(1.2)}to{opacity:0;transform:translateY(-60px)scale(.8)}}@keyframes bottomMiss{0%{opacity:1;transform:translateY(0)}20%{transform:translateY(10px)}40%{transform:translateY(-5px)}60%{transform:translateY(5px)}80%{transform:translateY(-2px)}to{opacity:0;transform:translateY(0)}}@keyframes modalFadeIn{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes modalFadeOut{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}.modal.show{animation:.3s ease-out forwards modalFadeIn}.modal.hide{animation:.3s ease-out forwards modalFadeOut}@keyframes buttonPress{0%{transform:scale(1)}50%{transform:scale(.95)}to{transform:scale(1)}}.button-press{animation:.2s ease-out buttonPress}@keyframes pulse{0%,to{transform:scale(1)}50%{transform:scale(1.05)}}.pulse{animation:2s infinite pulse}@keyframes progressGrow{0%{width:0%}to{width:var(--progress-width)}}.progress-bar{animation:.5s ease-out progressGrow}@keyframes particleExplode{0%{opacity:1;transform:translate(0)scale(1)}to{transform:translate(var(--dx),var(--dy))scale(.3);opacity:0}}.particle{animation:.9s cubic-bezier(.2,.8,.2,1) forwards particleExplode}@keyframes sparkle{0%,to{opacity:0;transform:scale(0)}50%{opacity:1;transform:scale(1)}}.sparkle{animation:1.5s ease-in-out infinite sparkle}@keyframes comboFlash{0%{color:#fff;transform:scale(1)}50%{color:gold;text-shadow:0 0 20px #ffd700cc;transform:scale(1.3)}to{color:#fff;transform:scale(1)}}.combo-flash{animation:.6s ease-out comboFlash}@keyframes gameAreaFlash{0%{box-shadow:0 0 #28a74500}50%{box-shadow:0 0 30px #28a74599}to{box-shadow:0 0 #28a74500}}.game-area-flash{animation:.5s ease-out gameAreaFlash}@keyframes backgroundColorChange{0%{background-color:#0000}50%{background-color:#28a7451a}to{background-color:#0000}}.background-flash{animation:.5s ease-out backgroundColorChange}@keyframes loadingSpin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loading-spin{animation:1s linear infinite loadingSpin}@keyframes typewriter{0%{width:0}to{width:100%}}.typewriter{white-space:nowrap;animation:2s steps(40,end) typewriter;overflow:hidden}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}.float{animation:3s ease-in-out infinite float}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.rotate{animation:2s linear infinite rotate}@keyframes scaleIn{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.scale-in{animation:.3s ease-out scaleIn}@keyframes scaleOut{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(0)}}.scale-out{animation:.3s ease-out scaleOut}@keyframes slideInLeft{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}.slide-in-left{animation:.5s ease-out slideInLeft}@keyframes slideInRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-in-right{animation:.5s ease-out slideInRight}@keyframes slideInUp{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-in-up{animation:.5s ease-out slideInUp}@keyframes slideInDown{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}.slide-in-down{animation:.5s ease-out slideInDown}
