/* Pahlawan Angka v3.30.0 — regular attack variety. */
/* Dead: nothing in index.html or js/ ever creates an element with this class,
   so every .paAttackFx rule and paXTrail keyframe below draws nothing. Each
   variant's visual is its strike artwork (#heroStrike), timed by the phase
   classes. Kept as-is rather than deleted, but do not tune it expecting an
   on-screen change. */
#game #hero .paAttackFx{position:absolute;z-index:14;left:61%;top:49%;width:82px;height:44px;pointer-events:none;opacity:0;transform-origin:left center}
#game #hero.pa-attack-dash .paAttackFx{background:linear-gradient(12deg,transparent 40%,#dffaff 45%,#63d9ff 51%,transparent 57%);filter:drop-shadow(0 0 7px #3dcaff);animation:paDashTrail .58s ease-out both}
#game #hero.pa-attack-arc .paAttackFx{width:72px;height:72px;border:5px solid transparent;border-top-color:#ffe070;border-right-color:#65d7ff;border-radius:50%;filter:drop-shadow(0 0 7px #5ed7ff);animation:paArcTrail .62s ease-out both}
#game #hero.pa-attack-pulse .paAttackFx{width:58px;height:58px;border:3px solid #8be8ff;border-radius:50%;box-shadow:0 0 0 7px #326cff55,0 0 18px #65deff;animation:paPulseTrail .62s ease-out both}
body.hero-bunga #game #hero.pa-attack-sweep .paAttackFx{background:radial-gradient(ellipse,#fff7a7 0 7%,#ff91d0 10% 17%,transparent 20%),radial-gradient(ellipse at 70% 30%,#8bffb2 0 7%,transparent 10%);filter:drop-shadow(0 0 8px #ff8fc7);animation:paSweepFlora .62s ease-out both}
body.hero-bunga #game #hero.pa-attack-spiral .paAttackFx{width:68px;height:68px;border:5px dotted #ffe38c;border-radius:50%;box-shadow:inset 0 0 0 5px #6df1a844,0 0 15px #ff9bdb;animation:paSpiralFlora .64s ease-out both}
body.hero-bunga #game #hero.pa-attack-thorn .paAttackFx{width:86px;height:22px;background:linear-gradient(90deg,#4dd98a,#eaff9a 76%,transparent);clip-path:polygon(0 38%,78% 38%,78% 0,100% 50%,78% 100%,78% 62%,0 62%);filter:drop-shadow(0 0 7px #57ef8f);animation:paThornFlora .6s ease-out both}
#game #hero.pa-attack-arc.attacking .sprite{animation-name:paHeroArc!important}
/* Gelombang Operasi's ice is baked into the strike artwork, which is shown for
   the whole phase-contact window (320-620ms). The body has to stay planted at
   the enemy for all of it, plus slack: those phase classes are setTimeout-driven
   and drift later under load, while this animation runs on its own clock. Hence
   700ms rather than the shared .52s lunge — and it must still finish before
   battle.js drops .attacking at heroLead+720ms, or the transform snaps home. */
#game #hero.pa-attack-pulse.attacking .sprite{animation-name:paHeroPulse!important;animation-duration:700ms!important}
body.hero-bunga #game #hero.pa-attack-spiral.attacking .sprite{animation-name:paHeroSpiral!important}body.hero-bunga #game #hero.pa-attack-thorn.attacking .sprite{animation-name:paHeroThorn!important}
@keyframes paDashTrail{0%,22%{opacity:0;transform:translate(-18px,7px) scale(.35)}42%{opacity:1}100%{opacity:0;transform:translate(72px,-5px) scale(1.2)}}@keyframes paArcTrail{0%,20%{opacity:0;transform:translate(-12px,18px) rotate(-80deg) scale(.4)}44%{opacity:1}100%{opacity:0;transform:translate(52px,-28px) rotate(65deg) scale(1.15)}}@keyframes paPulseTrail{0%,24%{opacity:0;transform:translate(-8px,4px) scale(.15)}48%{opacity:1}100%{opacity:0;transform:translate(62px,1px) scale(1.5)}}
@keyframes paSweepFlora{0%,20%{opacity:0;transform:translate(-12px,12px) rotate(-25deg) scale(.3)}45%{opacity:1}100%{opacity:0;transform:translate(67px,-18px) rotate(55deg) scale(1.25)}}@keyframes paSpiralFlora{0%,20%{opacity:0;transform:translate(-5px,8px) rotate(0) scale(.2)}48%{opacity:1}100%{opacity:0;transform:translate(58px,-9px) rotate(250deg) scale(1.2)}}@keyframes paThornFlora{0%,25%{opacity:0;transform:translate(-18px,5px) scaleX(.15)}48%{opacity:1}100%{opacity:0;transform:translate(72px,-3px) scaleX(1.18)}}
@keyframes paHeroArc{0%{transform:translate(0)}28%{transform:translate(-4px,5px)}58%{transform:translate(48px,-12px) rotate(-3deg)}100%{transform:translate(0)}}@keyframes paHeroPulse{0%{transform:translate(0)}12%{transform:translateX(-9px) scale(.97)}42%{transform:translateX(var(--pa-pulse-dash-x,34px)) scale(1.04)}93%{transform:translateX(var(--pa-pulse-dash-x,34px)) scale(1.02)}100%{transform:translate(0)}}@keyframes paHeroSpiral{0%{transform:translate(0)}30%{transform:translate(-4px,-3px) rotate(-2deg)}60%{transform:translate(38px,-8px) rotate(4deg)}100%{transform:translate(0)}}@keyframes paHeroThorn{0%{transform:translate(0)}32%{transform:translate(-8px,1px)}58%{transform:translate(50px,0) scaleX(1.04)}100%{transform:translate(0)}}
@media(prefers-reduced-motion:reduce){#game #hero.pa-attack-variant .paAttackFx{animation-duration:.3s!important}#game #hero.pa-attack-variant.attacking .sprite{animation:none!important}}

/* Three distinct readable phases: stance -> movement -> actual strike. */
#game #hero .hero-frame-strike{top:auto!important;bottom:0!important;height:var(--pa-hero-h)!important;width:auto!important;max-width:none!important;object-fit:contain!important;object-position:center bottom!important;opacity:0!important;transform-origin:50% 100%!important}
#game #hero.phase-movement .hero-frame-anticipation{opacity:0!important}
#game #hero.phase-movement .hero-frame-attack{opacity:0!important}
#game #hero.phase-movement .hero-frame-follow-through{visibility:visible!important;opacity:1!important}
#game #hero.phase-movement .hero-frame-strike{opacity:0!important}
#game #hero.phase-contact:not(.charging-finisher) .hero-frame-attack{opacity:0!important}
#game #hero.phase-contact:not(.charging-finisher) .hero-frame-strike{visibility:visible!important;opacity:1!important}
#game #hero.charging-finisher.phase-contact .hero-frame-attack{opacity:1!important}
#game #hero.charging-finisher.phase-contact .hero-frame-strike{opacity:0!important}
#game #hero .hero-frame-strike{left:calc(50% + var(--pa-contact-shift-x,0px))!important;transform:translateX(-50%) scale(var(--pa-contact-scale,1))!important;transform-origin:50% 100%!important}

/* DEV Attack Lab */
.paAttackLab{position:fixed;inset:0;z-index:260;display:none;place-items:center;padding:16px}.paAttackLab.show{display:grid}.paAttackLabShade{position:absolute;inset:0;background:rgba(2,8,20,.88);backdrop-filter:blur(8px)}.paAttackLabPanel{position:relative;width:min(620px,100%);max-height:94dvh;overflow:auto;padding:18px;border:1px solid #3d5f8d;border-radius:24px;background:linear-gradient(180deg,#122743,#081526);box-shadow:0 24px 70px #000b;color:#fff}.paAttackLabHead{display:flex;align-items:center;justify-content:space-between}.paAttackLabHead small{font-size:10px;font-weight:950;letter-spacing:.12em;color:#f3c955}.paAttackLabHead h2{margin:3px 0 0}.paAttackLabHead>button{width:42px;height:42px;border:1px solid #456083;border-radius:14px;background:#12213a;color:#fff;font-size:28px}.paAttackLabControls{display:grid;grid-template-columns:auto auto 1fr;gap:7px;margin:15px 0}.paAttackLabControls button,.paAttackLabControls select,.paAttackLabSteps button{border:1px solid #3a5579;border-radius:12px;background:#0d1d34;color:#dce8fb;font:inherit;font-weight:850;padding:10px}.paAttackLabControls button.active{border-color:#f0bd39;background:#3e3215;color:#ffe479}.paAttackLabStage{position:relative;height:min(42dvh,330px);display:grid;place-items:center;overflow:hidden;border:1px solid #29486f;border-radius:18px;background:radial-gradient(circle at 50% 58%,#1c4265,#081626 72%)}.paAttackLabGround{position:absolute;left:12%;right:12%;bottom:9%;height:12px;border-radius:50%;background:radial-gradient(ellipse,#000a,transparent 72%)}.paAttackLabStage img{position:absolute;bottom:9%;width:88%;height:86%;object-fit:contain;object-position:center bottom;filter:drop-shadow(0 8px 7px #000b);transition:opacity .08s,transform .16s}.paAttackLabStage img[data-step="movement"]{transform:translateX(7%)}.paAttackLabStage img[data-step="strike"]{transform:translateX(10%)}.paAttackLabSteps{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:10px 0}.paAttackLabSteps button{display:flex;flex-direction:column;align-items:center;gap:3px}.paAttackLabSteps b{display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:#f0bd39;color:#172033}.paAttackLabSteps span{font-size:10px}.paAttackLabPlay{width:100%}.paAttackLabPanel>p{margin:10px 0 0;text-align:center;color:#b8c7df;font-size:12px}
@media(max-width:480px){.paAttackLabPanel{padding:14px}.paAttackLabControls{grid-template-columns:1fr 1fr}.paAttackLabControls select{grid-column:1/-1}.paAttackLabStage{height:36dvh}}
.paAttackLabStage img[data-step="strike"]{transform:translateX(10%) scale(var(--pa-lab-contact-scale,1));transform-origin:50% 100%}
.paAttackLab.bunga-two-phase .paAttackLabSteps{grid-template-columns:repeat(2,1fr)}
.paAttackLab.bunga-two-phase [data-lab-step="movement"]{display:none}
