/* ═══════════════════════════════════════════
   ANIMATIONS — 所有 @keyframes 集中管理
   要修改任何动画时间/效果，只来此文件
   ═══════════════════════════════════════════ */

@keyframes twinkle{0%{opacity:.06;transform:scale(.6)}100%{opacity:.9;transform:scale(1.3)}}
@keyframes screenShake{0%,100%{transform:translate(0,0)}10%{transform:translate(-1.5px,1px)}20%{transform:translate(2px,-1px)}30%{transform:translate(-1px,2px)}40%{transform:translate(1.5px,-1.5px)}50%{transform:translate(-2px,1px)}60%{transform:translate(1px,2px)}70%{transform:translate(-1.5px,-1px)}80%{transform:translate(2px,1px)}90%{transform:translate(-1px,-2px)}}
@keyframes bgBreath{0%,100%{opacity:.55}50%{opacity:.85}}
@keyframes mistDrift{0%{transform:translate(0,0) scale(1);opacity:var(--mo)}25%{transform:translate(var(--dx1),var(--dy1)) scale(1.15);opacity:calc(var(--mo)*1.6)}50%{transform:translate(calc(var(--dx1)*0.5),var(--dy2)) scale(.96)}75%{transform:translate(var(--dx2),calc(var(--dy2)*0.6)) scale(1.08);opacity:calc(var(--mo)*.8)}100%{transform:translate(0,0) scale(1);opacity:var(--mo)}}
@keyframes orbRise{0%{transform:translateY(0) scale(0);opacity:0}8%{opacity:1}88%{opacity:.25}100%{transform:translateY(-62vh) scale(.25);opacity:0}}
@keyframes shimmerFloat{0%{transform:translate(0,10px) scale(0);opacity:0}12%{opacity:1;transform:translate(var(--sx),0) scale(1)}80%{opacity:.4}100%{transform:translate(calc(var(--sx)*2.5),-40px) scale(0);opacity:0}}
@keyframes energyRingPulse{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:.4}50%{transform:translate(-50%,-50%) scale(1.08);opacity:.9}}
@keyframes rainFall{0%{transform:translateY(-10px);opacity:0}8%{opacity:.6}88%{opacity:.3}100%{transform:translateY(105vh);opacity:0}}
@keyframes musicPulse{0%,100%{box-shadow:0 0 6px rgba(201,168,76,.25)}50%{box-shadow:0 0 20px rgba(201,168,76,.6)}}
@keyframes vizBar{0%{height:2px}100%{height:var(--vh)}}
@keyframes float{0%,100%{transform:translateY(0) rotate(0)}50%{transform:translateY(-14px) rotate(4deg)}}
@keyframes elGlow{0%{transform:scale(.95)}100%{transform:scale(1.06)}}
@keyframes rpPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.4)}}
@keyframes cardShuffle{0%{transform:var(--base-t)}30%{transform:var(--fly-t)}100%{transform:var(--base-t)}}
@keyframes pileJoin{0%{transform:translateX(var(--jx)) translateY(var(--jy))}100%{transform:translateX(0) translateY(0)}}
@keyframes orbitRingSpin{from{transform:rotateX(68deg) rotateZ(0)}to{transform:rotateX(68deg) rotateZ(360deg)}}
@keyframes backGlow{0%{filter:drop-shadow(0 0 4px rgba(201,168,76,.4))}100%{filter:drop-shadow(0 0 20px rgba(201,168,76,1))}}
@keyframes artPulse{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-2px) scale(1.04)}}
@keyframes lightSweep{0%{transform:translateX(-120%)}100%{transform:translateX(120%)}}
@keyframes drawnPulse{0%,100%{box-shadow:0 0 20px rgba(201,168,76,.4)}50%{box-shadow:0 0 42px rgba(201,168,76,.72),0 0 80px rgba(201,168,76,.26)}}
@keyframes dmAppear{from{transform:scale(0) rotate(-10deg);opacity:0}to{transform:scale(1) rotate(0);opacity:1}}
@keyframes crystalPulse{0%,100%{box-shadow:0 0 36px rgba(100,50,200,.58),0 0 75px rgba(100,50,200,.28)}50%{box-shadow:0 0 55px rgba(100,50,200,.88),0 0 110px rgba(100,50,200,.48)}}
@keyframes spinY{from{transform:translate(-50%,-50%) rotate(0)}to{transform:translate(-50%,-50%) rotate(360deg)}}
@keyframes pulse{0%,100%{opacity:.5}50%{opacity:1}}
@keyframes dots{0%,100%{opacity:0}50%{opacity:1}}
@keyframes particleFly{0%{transform:translate(0,0) scale(0) rotate(0);opacity:1}100%{transform:translate(var(--tx),var(--ty)) scale(var(--sc)) rotate(var(--rot));opacity:0}}
@keyframes screenFlash{0%{opacity:0}28%{opacity:1}100%{opacity:0}}
@keyframes vibrate{0%,100%{transform:translate(0,0) rotate(0)}20%{transform:translate(-2px,1px) rotate(-1deg)}40%{transform:translate(2px,-1px) rotate(1deg)}60%{transform:translate(-1px,2px) rotate(-.5deg)}80%{transform:translate(1px,-2px) rotate(.5deg)}}
@keyframes spin360{from{transform:rotate(0)}to{transform:rotate(360deg)}}
@keyframes fadeIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}
@keyframes dotBounce{0%,80%,100%{transform:translateY(0);opacity:.35}40%{transform:translateY(-7px);opacity:1}}
@keyframes apSlideIn{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:translateX(0)}}
