/* One recorded action, one bounded effect. Contact stays at 56% (local effects: 16%).
   Only illustrations move; names, health values and controls stay in place. */
.arena49 .board-combat[data-combat-animation] .combat-mini:is(.actor,.target)>.combat-portrait{
  animation:none!important;transform:none;filter:none;
}
.board-combat .combat-portrait>.art{transform-origin:50% 82%;backface-visibility:hidden}
.board-combat[data-fx-motion218=swing] .combat-mini.actor>.combat-portrait>.art{
  animation:combat-swing218 var(--fx-time) linear both;
}
.board-combat[data-fx-motion218=thrust] .combat-mini.actor>.combat-portrait>.art{
  animation:combat-thrust218 var(--fx-time) linear both;
}
.board-combat[data-fx-motion218=heavy] .combat-mini.actor>.combat-portrait>.art{
  animation:combat-heavy-windup218 var(--fx-time) linear both;
}
.board-combat[data-fx-motion218=shot] .combat-mini.actor>.combat-portrait>.art{
  animation:combat-release218 var(--fx-time) ease-out both;
}
.board-combat[data-fx-motion218=cast] .combat-mini.actor>.combat-portrait>.art{
  animation:combat-channel218 var(--fx-time) ease-in-out both;
}
.board-combat[data-fx-damage=true] .combat-mini.target>.combat-portrait>.art{
  animation:combat-recoil218 var(--fx-time) linear both;
}
.board-combat[data-fx-damage=true][data-fx-weight=heavy] .combat-mini.target>.combat-portrait>.art{
  animation-name:combat-heavy-recoil218;
}
.board-combat .combat-mini:is(.actor,.target){isolation:isolate}
.board-combat .combat-mini:is(.actor,.target)::after{
  content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:12;
  box-shadow:inset 0 0 0 1px var(--fx-color),inset 0 0 14px color-mix(in srgb,var(--fx-color) 30%,transparent);
  opacity:0;animation:combat-rim218 var(--fx-time) ease-out both;
}
.board-combat .combat-mini.actor::after{animation-name:combat-actor-rim218}
.board-combat[data-fx-local=true] .combat-mini.target::after{animation:combat-local-rim218 var(--fx-time) ease-out both}
/* Finer source gestures and an illuminated casting seal, below the face. */
.combat-scene[data-combat-animation] .fx-origin218{
  width:clamp(32px,50%,68px);height:auto;aspect-ratio:1;top:64%;
  filter:drop-shadow(0 0 3px var(--fx-color));animation:combat-prepare218 var(--fx-time) ease-out both;
}
.combat-scene[data-combat-animation] .fx-origin218[data-origin-style218=sigil]{width:clamp(42px,80%,112px);top:69%}
.combat-scene .fx-sigil218{transform-origin:50px 62px;animation:combat-sigil218 var(--fx-time) ease-out both}
.combat-scene .fx-charge-core218{transform-origin:50px 48px;animation:combat-charge218 var(--fx-time) ease-in both}
.combat-scene .fx-charge-rise218{animation:combat-charge-rise218 var(--fx-time) ease-out both}
/* Trail decorations follow the projectile's own transform. No extra timers. */
.combat-scene .fx-projectile{animation-name:combat-flight218;animation-timing-function:linear;width:34px;height:34px}
.combat-scene [data-fx-projectile=arrow] .fx-projectile,.combat-scene [data-fx-projectile=bolt] .fx-projectile{
  width:58px;height:23px;animation-name:combat-arrow-flight218;
}
.combat-scene .fx-projectile-tail{left:-115%;width:145%;height:2px;background:linear-gradient(90deg,transparent,var(--fx-color) 80%,#f3ffff);opacity:.55;filter:none}
.combat-scene .fx-flight-wisp218{
  position:absolute;left:-75%;top:28%;width:85%;height:38%;border:1px solid transparent;
  border-top-color:var(--fx-color);border-radius:50%;opacity:.4;transform:rotate(-9deg);pointer-events:none;
}
.combat-scene .fx-flight-wisp-second218{top:42%;left:-110%;width:110%;transform:rotate(7deg);opacity:.22}
.combat-scene :is([data-fx-projectile=arrow],[data-fx-projectile=bolt]) .fx-flight-wisp218{display:none}
/* Target marks show the material response, rather than a second oversized weapon. */
.combat-scene .fx-impact218{filter:none}
.combat-scene .fx-impact218 .fx-strike{filter:drop-shadow(0 0 2px var(--fx-color))}
.combat-scene .fx-hit-cut218{transform:rotate(-12deg);transform-origin:50px 50px}
.combat-scene .fx-hit-cut218 .fx-cut{animation-name:combat-cut218}
.combat-scene .fx-hit-cut218 .fx-cut-second{animation-name:combat-cross-cut218}
.combat-scene .fx-pierce218{transform-origin:50px 50px;animation:combat-pierce218 var(--fx-time) ease-out both}
.combat-scene .fx-crater218{transform-origin:50px 55px;animation:combat-crater218 var(--fx-time) ease-out both}
.combat-scene .fx-impact218 :is(.fx-impact-ring218,.fx-support-ring218,.fx-impact-glint218){position:absolute;display:block;pointer-events:none}
.combat-scene .fx-impact-ring218{
  inset:18%;border-radius:50%;border:1px solid var(--fx-color);opacity:0;
  animation:combat-impact-ring218 var(--fx-time) ease-out both;
}
.combat-scene .fx-impact-glint218{
  inset:33%;background:linear-gradient(135deg,transparent 37%,#fff6dd 49%,transparent 61%);
  clip-path:polygon(50% 0,58% 40%,100% 50%,60% 57%,50% 100%,43% 60%,0 50%,40% 43%);
  opacity:0;animation:combat-glint218 var(--fx-time) linear both;
}
.combat-scene[data-fx-weight=normal] .fx-impact-ring218{display:none}
.combat-scene[data-combat-animation=hammer] .fx-impact-ring218{border-width:2px}
.combat-scene .fx-support-ring218{
  inset:15% 3%;border:1px solid var(--fx-color);border-radius:50%;opacity:0;
  box-shadow:inset 0 0 8px color-mix(in srgb,var(--fx-color) 20%,transparent);
  animation:combat-support-ring218 var(--fx-time) ease-out both;
}
.combat-scene[data-fx-local=true] .fx-support-ring218{animation-name:combat-local-support218}
.combat-scene .fx-shards .fx-particle{animation-name:combat-shard218}
.combat-scene .fx-armor-break>.fx-svg{animation:combat-shield-collapse218 var(--fx-time) ease-out both;transform-origin:50% 50%}
.combat-scene .fx-impact218 .fx-impact-aura{mix-blend-mode:normal;opacity:.65}
/* A small trailing bar makes lost health legible without moving the text. */
.board-combat .battle-health{position:relative}
.board-combat .combat-health-trail218{
  display:block;position:absolute;inset:0 auto 0 0;height:100%;background:#efc47c;
  animation:combat-health218 calc(var(--fx-time) * .32) ease-out calc(var(--fx-contact) + var(--fx-time) * .08) both;
}
.board-combat .battle-health>i{position:relative;z-index:1}
.board-combat[data-combat-animation] .effect-numbers{
  animation:combat-number218 var(--fx-value-duration) cubic-bezier(.2,.85,.25,1) var(--fx-contact) both;
}
.board-combat .effect-numbers [data-effect-stat=hp][data-effect-value^="-"]{color:#ffe1cd}
.board-combat .effect-numbers [data-effect-stat=shield]{color:#bcecff}
.board-combat .effect-numbers [data-effect-value^="+"]{color:#baf3cd}
.board-combat .combat-fall216{animation:combat-fall218 var(--fx-value-duration) ease-out var(--fx-contact) both}
/* Two woven strands and two small pulses connect the recorded pact partners. */
.board-combat .combat-pact-thread216{height:0;background:none;box-shadow:none;animation:combat-thread218 var(--fx-time) linear both}
.board-combat .combat-thread-weave218{position:absolute;left:0;top:-10px;width:100%;height:20px;overflow:visible;filter:drop-shadow(0 0 2px #e8bc60)}
.board-combat .combat-thread-weave218 path{stroke:#ebc577;stroke-width:1.3;stroke-dasharray:.10 .025;animation:combat-weave218 var(--fx-time) linear both}
.board-combat .combat-thread-weave218 path+path{stroke:#fff1c7;stroke-width:.8;stroke-dasharray:.065 .025;animation-direction:reverse}
.board-combat .combat-pact-thread216 b,.board-combat .combat-thread-echo218{
  position:absolute;display:block;left:0;top:-3px;width:6px;height:6px;border-radius:50%;
  background:#fff7dc;box-shadow:0 0 7px 2px #e6bd70;animation:combat-thread-pulse218 var(--fx-time) linear both;
}
.board-combat .combat-thread-echo218{width:4px;height:4px;top:-2px;animation-name:combat-thread-echo218}
/* Short holds give a hit weight; they do not pause playback or delay the next event. */
@keyframes combat-swing218{0%,100%{transform:none}24%{transform:translate(calc(var(--board-dx,12px) * -.28),calc(var(--board-dy,0px) * -.28)) rotate(calc(var(--board-lean218,1deg) * -1)) scale(.98)}50%{transform:translate(calc(var(--board-dx,12px) * .6),calc(var(--board-dy,0px) * .6)) rotate(var(--board-lean218,1deg))}56%,62%{transform:translate(var(--board-dx,12px),var(--board-dy,0px)) rotate(var(--board-lean218,1deg)) scale(1.04)}82%{transform:translate(calc(var(--board-dx,12px) * -.08),0)}}
@keyframes combat-thrust218{0%,30%,100%{transform:none}42%{transform:translate(calc(var(--board-dx,12px) * -.18),calc(var(--board-dy,0px) * -.18)) scale(.99)}56%,60%{transform:translate(var(--board-dx,12px),var(--board-dy,0px)) scale(1.055)}74%{transform:translate(calc(var(--board-dx,12px) * .12),calc(var(--board-dy,0px) * .12))}}
@keyframes combat-heavy-windup218{0%,100%{transform:none}20%,38%{transform:translate(calc(var(--board-dx,12px) * -.3),-5px) rotate(calc(var(--board-lean218,2deg) * -1)) scale(.96)}56%,64%{transform:translate(var(--board-dx,12px),var(--board-dy,0px)) rotate(var(--board-lean218,2deg)) scale(1.05)}80%{transform:translate(calc(var(--board-dx,12px) * .15),2px) scale(1.01)}}
@keyframes combat-release218{0%,100%{transform:none}22%{transform:translate(calc(var(--board-dx,12px) * -.14),0) scale(1.025)}30%{transform:translate(calc(var(--board-dx,12px) * -.22),1px) scale(.985)}46%,80%{transform:none}}
@keyframes combat-channel218{0%,100%{transform:none;filter:brightness(1)}22%{transform:translateY(-2px) scale(1.025);filter:brightness(1.1)}36%{transform:translateY(1px);filter:brightness(1.03)}65%{transform:none;filter:brightness(1)}}
@keyframes combat-recoil218{0%,55%,100%{transform:none;filter:brightness(1)}56%,63%{transform:translate(var(--board-hit-x,4px),var(--board-hit-y,1px)) scale(.99);filter:brightness(1.18)}72%{transform:translate(calc(var(--board-hit-x,4px) * -.3),0);filter:brightness(1)}84%{transform:translate(calc(var(--board-hit-x,4px) * .12),0)}}
@keyframes combat-heavy-recoil218{0%,55%,100%{transform:none;filter:brightness(1)}56%,65%{transform:translate(calc(var(--board-hit-x,4px) * 1.65),calc(var(--board-hit-y,1px) * 1.65)) scale(.965);filter:brightness(1.24)}74%{transform:translate(calc(var(--board-hit-x,4px) * -.45),-1px) scale(1.01);filter:brightness(1)}86%{transform:translate(calc(var(--board-hit-x,4px) * .18),1px)}}
@keyframes combat-prepare218{0%{opacity:0;scale:.72}12%,23%{opacity:.85;scale:1}29%{opacity:1;scale:1.08}39%,100%{opacity:0;scale:.85}}
@keyframes combat-sigil218{0%{transform:scale(.65);opacity:.2}25%{transform:scale(1);opacity:1}40%,100%{transform:scale(1.18);opacity:0}}
@keyframes combat-charge218{0%{transform:scale(.45);opacity:0}22%{transform:scale(.95);opacity:.8}30%{transform:scale(.65);opacity:1}40%,100%{transform:scale(.3);opacity:0}}
@keyframes combat-charge-rise218{0%{opacity:0;transform:translateY(10px)}22%{opacity:.7}40%,100%{opacity:0;transform:translateY(-10px)}}
@keyframes combat-flight218{0%,26%{opacity:0;transform:translate(-50%,-50%) scale(.6)}28%{opacity:1;transform:translate(-50%,-50%) scale(.8)}42%{opacity:1;transform:translate(calc(var(--fx-distance218,200px) * .5 - 50%),calc(-50% - var(--fx-lift))) scale(1)}56%{opacity:1;transform:translate(calc(var(--fx-distance218,200px) - 50%),-50%) scale(.8)}60%,100%{opacity:0;transform:translate(calc(var(--fx-distance218,200px) - 50%),-50%) scale(.3)}}
@keyframes combat-arrow-flight218{0%,26%{opacity:0;transform:translate(-50%,-50%) rotate(-6deg)}28%{opacity:1;transform:translate(-50%,-50%) rotate(-6deg)}42%{opacity:1;transform:translate(calc(var(--fx-distance218,200px) * .5 - 50%),calc(-50% - var(--fx-lift))) rotate(0deg)}56%{opacity:1;transform:translate(calc(var(--fx-distance218,200px) - 50%),-50%) rotate(7deg)}59%,100%{opacity:0;transform:translate(calc(var(--fx-distance218,200px) - 50%),-50%) rotate(7deg)}}
@keyframes combat-cut218{0%,47%{opacity:0;transform:rotate(-28deg) scale(.6)}56%{opacity:.95;transform:rotate(0) scale(1.04)}68%{opacity:.3;transform:rotate(12deg) scale(1.1)}80%,100%{opacity:0;transform:rotate(18deg) scale(1.12)}}
@keyframes combat-cross-cut218{0%,50%{opacity:0;scale:.65}59%{opacity:.95;scale:1}72%,100%{opacity:0;scale:1.12}}
@keyframes combat-pierce218{0%,54%{opacity:0;scale:.5}57%{opacity:1;scale:1.08}72%,100%{opacity:0;scale:1.15}}
@keyframes combat-crater218{0%,55%{opacity:0;scale:.7}58%{opacity:1;scale:1}85%,100%{opacity:0;scale:1.12}}
@keyframes combat-impact-ring218{0%,55%{opacity:0;transform:scale(.2)}57%{opacity:.8;transform:scale(.45)}89%,100%{opacity:0;transform:scale(1.7)}}
@keyframes combat-glint218{0%,55%{opacity:0;scale:.4}57%{opacity:.85;scale:1.15}66%,100%{opacity:0;scale:.7}}
@keyframes combat-support-ring218{0%,55%{opacity:0;transform:translateY(15px) scale(.7,.35)}62%{opacity:.75}96%,100%{opacity:0;transform:translateY(-24px) scale(1.1,.55)}}
@keyframes combat-local-support218{0%{opacity:0;transform:translateY(15px) scale(.7,.35)}16%{opacity:.75}90%,100%{opacity:0;transform:translateY(-24px) scale(1.1,.55)}}
@keyframes combat-shard218{0%,56%{opacity:0;transform:translate(0,0) rotate(0)}59%{opacity:1;transform:translate(calc(var(--dx) * .2),calc(var(--dy) * .2)) rotate(calc(var(--spin) * .2))}76%{opacity:.75;transform:translate(calc(var(--dx) * .8),calc(var(--dy) * .7)) rotate(calc(var(--spin) * .7))}100%{opacity:0;transform:translate(var(--dx),calc(var(--dy) + 22px)) rotate(var(--spin))}}
@keyframes combat-shield-collapse218{0%,56%{opacity:1;scale:1}61%{opacity:1;scale:1.025}78%,100%{opacity:0;scale:.7}}
@keyframes combat-health218{from{width:var(--health-from)}to{width:var(--health-to)}}
@keyframes combat-number218{0%{opacity:0;transform:translateY(6px) scale(.88)}24%{opacity:1;transform:translateY(-2px) scale(1.06)}55%,100%{opacity:1;transform:none}}
@keyframes combat-fall218{from{opacity:1;filter:grayscale(0)}to{opacity:.45;filter:grayscale(1)}}
@keyframes combat-rim218{0%,55%{opacity:0}57%,65%{opacity:.9}100%{opacity:0}}
@keyframes combat-actor-rim218{0%{opacity:0}18%,30%{opacity:.75}56%,100%{opacity:0}}
@keyframes combat-local-rim218{0%{opacity:0}16%,30%{opacity:.75}100%{opacity:0}}
@keyframes combat-thread218{0%,12%{opacity:0}24%,65%{opacity:.9}100%{opacity:0}}
@keyframes combat-weave218{from{stroke-dashoffset:.4}to{stroke-dashoffset:0}}
@keyframes combat-thread-pulse218{0%,22%{left:0;opacity:0}27%{left:0;opacity:1}56%{left:100%;opacity:1}70%,100%{left:100%;opacity:0}}
@keyframes combat-thread-echo218{0%,30%{left:0;opacity:0}35%{left:0;opacity:.8}62%{left:100%;opacity:.8}78%,100%{left:100%;opacity:0}}
/* Fast playback keeps the main hit, with fewer small decorations. */
.combat-scene[data-fx-speed=fast] .fx-particle:nth-child(n+7),.combat-scene[data-fx-speed=fast] .fx-flight-wisp218,.board-combat[data-fx-speed=fast] .combat-thread-echo218{display:none}
/* Stopped recordings show final values immediately and never replay a burst. */
:is([data-playing=false] .board-combat,.board-combat[data-static216=true],.motion-reduced137 .board-combat) :is(.combat-fx-origin,.combat-fx-travel,.combat-fx-impact,.combat-pact-thread216){display:none!important}
:is([data-playing=false] .board-combat,.board-combat[data-static216=true],.motion-reduced137 .board-combat) .combat-mini::after{display:none!important}
:is([data-playing=false] .board-combat,.board-combat[data-static216=true],.motion-reduced137 .board-combat) :is(.combat-portrait>.art,.combat-health-trail218,.effect-numbers,.combat-fall216){animation:none!important;transform:none}
@media(prefers-reduced-motion:reduce){
 .board-combat :is(.combat-fx-origin,.combat-fx-travel,.combat-fx-impact,.combat-pact-thread216),.board-combat .combat-mini::after{display:none!important}
 .board-combat :is(.combat-portrait>.art,.combat-health-trail218,.effect-numbers,.combat-fall216){animation:none!important;transform:none}
 .combat-scene :is(.fx-impact-ring218,.fx-support-ring218,.fx-impact-glint218,.fx-flight-wisp218){display:none!important}
}
