.horde-walker[data-entering] .game-hit-zone {
  pointer-events: none;
}

.horde-walker[data-grappling] {
  visibility: hidden;
}

.horde-melee-layer {
  position: absolute;
  z-index: 8;
  bottom: -12px;
  left: 50%;
  width: min(700px, 100%, 108dvh);
  height: auto;
  aspect-ratio: 640 / 430;
  transform: translateX(-50%);
  pointer-events: none;
}

.rack-stacked .horde-melee-layer { bottom: max(44px, calc(var(--dock-clearance, 82px) - 14px)); }

.horde-melee-layer[data-melee-hand="left"] { --melee-facing: -1; }
.horde-melee-layer[data-melee-hand="right"] { --melee-facing: 1; }

.horde-melee-art { filter: drop-shadow(0 7px 13px #030703dc); }
.horde-melee-pose {
  transform-box: view-box;
  transform-origin: 320px 405px;
  animation: horde-grapple 1.4s ease-in-out infinite alternate;
}
.horde-melee-grip {
  transform-box: view-box;
  transform: rotate(calc(var(--swing) * 13deg));
  transition: transform .24s cubic-bezier(.2,.73,.38,1), opacity .18s;
}
.horde-melee-grip.grip-left { --swing: -1; --grab-delay: 0s; transform-origin: 242px 381px; }
.horde-melee-grip.grip-right { --swing: 1; --grab-delay: .12s; transform-origin: 400px 381px; }
.horde-melee-art .horde-melee-grip { opacity: calc(1 - var(--melee-weakness, 0)); }
.horde-melee-eyes { opacity: 0; fill: #ffd274; filter: drop-shadow(0 0 4px #ff943c); }

.horde-melee-label { fill: none; stroke: #c4f67c; stroke-width: 1; opacity: .88; }
.horde-melee-warning {
  fill: #d7f5a9;
  stroke: #101b10;
  stroke-width: 4;
  paint-order: stroke fill;
  font: 850 12px var(--mono);
  letter-spacing: .14em;
  text-anchor: middle;
}
.horde-melee-layer[data-melee-state="lunge"] .horde-melee-label { animation: horde-label-in .62s ease both; }
.horde-melee-layer[data-melee-state="fall"] .horde-melee-label { opacity: 0; }
.horde-melee-layer[data-melee-state="windup"] .horde-melee-label { stroke: #ffb967; }
.horde-melee-layer[data-melee-state="windup"] .horde-melee-warning { fill: #ffcf8e; }

.horde-melee-punch { display: none; transform-box: view-box; transform-origin: 320px 248px; }
.horde-melee-punch.punch-left { --punch-swing: -1; }
.horde-melee-punch.punch-right { --punch-swing: 1; }
.horde-melee-swipe {
  fill: none;
  stroke: #daec99;
  stroke-width: 1.5;
  stroke-linecap: round;
  opacity: .45;
  filter: drop-shadow(0 0 5px #afef63);
}
.horde-melee-layer[data-melee-state="lunge"] .horde-melee-pose { animation: horde-leap .62s cubic-bezier(.19,.62,.32,1) both; }
.horde-melee-layer[data-melee-state="lunge"] .horde-melee-grip { animation: horde-grab .48s var(--grab-delay) cubic-bezier(.24,.72,.32,1) both; }
.horde-melee-layer[data-melee-state="fall"] .horde-melee-pose { animation: horde-fall .63s ease-in both; }
.horde-melee-layer:is([data-melee-state="lunge"], [data-melee-state="fall"]) .game-hit-zone { pointer-events: none; }
.horde-melee-layer[data-melee-state="windup"] .horde-melee-pose {
  animation: horde-windup .42s cubic-bezier(.18,.69,.22,1) both;
}
.horde-melee-layer[data-melee-state="windup"] .horde-melee-eyes { opacity: .85; }
.horde-melee-layer[data-melee-state="windup"][data-melee-hand="left"] .grip-left,
.horde-melee-layer[data-melee-state="windup"][data-melee-hand="right"] .grip-right {
  transform: translate(calc(var(--swing) * 21px), -13px) rotate(calc(var(--swing) * -17deg)) scale(.89);
}
.horde-melee-layer[data-melee-state="strike"] .horde-melee-pose {
  animation: horde-body-strike .32s ease-out both;
}
.horde-melee-layer[data-melee-state="strike"] .horde-melee-grip {
  transform: translate(calc(var(--swing) * -24px), 6px) rotate(calc(var(--swing) * 10deg));
  transition-duration: .08s;
}
.horde-melee-layer[data-melee-state="strike"][data-melee-hand="left"] .grip-left,
.horde-melee-layer[data-melee-state="strike"][data-melee-hand="right"] .grip-right { visibility: hidden; }
.horde-melee-layer[data-melee-state="strike"][data-melee-hand="left"] .punch-left,
.horde-melee-layer[data-melee-state="strike"][data-melee-hand="right"] .punch-right {
  display: inline;
  animation: horde-punch .32s cubic-bezier(.13,.65,.36,1) both;
}

@keyframes horde-grapple {
  from { transform: translate(-2px, 4px) rotate(-1.1deg); }
  to { transform: translate(3px, -5px) rotate(1.3deg) scale(1.018); }
}
@keyframes horde-leap {
  0% { transform: translate(-15px, 156px) scale(.72) rotate(-8deg); opacity: 0; }
  40% { transform: translate(-7px, 43px) scale(.94) rotate(-3deg); opacity: 1; }
  66% { transform: translate(5px, -19px) scale(1.065) rotate(2deg); }
  84% { transform: translate(3px, 8px) scale(.99) rotate(1deg); }
  100% { transform: translate(-2px, 4px) rotate(-1.1deg); opacity: 1; }
}
@keyframes horde-grab {
  0% { transform: translate(calc(var(--swing) * 24px), 39px) rotate(calc(var(--swing) * -23deg)) scale(.85); }
  59% { transform: translate(calc(var(--swing) * 7px), -19px) rotate(calc(var(--swing) * 23deg)) scale(1.12); }
  82% { transform: translate(0, 5px) rotate(calc(var(--swing) * 16deg)); }
  100% { transform: rotate(calc(var(--swing) * 13deg)); }
}
@keyframes horde-label-in {
  0%, 55% { opacity: 0; }
  100% { opacity: .88; }
}
@keyframes horde-windup {
  from { transform: none; }
  to { transform: translate(calc(var(--melee-facing) * 13px), 11px) rotate(calc(var(--melee-facing) * 5deg)) scale(.98); }
}
@keyframes horde-body-strike {
  0% { transform: translate(calc(var(--melee-facing) * -12px), -5px) rotate(calc(var(--melee-facing) * -5deg)); }
  23% { transform: translate(calc(var(--melee-facing) * -19px), -15px) rotate(calc(var(--melee-facing) * -7deg)) scale(1.045); }
  100% { transform: none; }
}
@keyframes horde-punch {
  0% { transform: translate(calc(var(--punch-swing) * 40px), 55px) scale(.94); opacity: .85; }
  21% { transform: translate(calc(var(--punch-swing) * -15px), -7px) scale(1.29); opacity: 1; }
  55% { transform: translate(calc(var(--punch-swing) * -5px), 13px) scale(1.15); opacity: 1; }
  100% { transform: translate(calc(var(--punch-swing) * 56px), 64px) scale(.91); opacity: 0; visibility: hidden; }
}
@keyframes horde-fall {
  0% { transform: none; }
  20% { transform: translate(7px, -16px) rotate(7deg) scale(1.025); }
  48% { transform: translate(-18px, 33px) rotate(-12deg) scale(.94); }
  100% { transform: translate(-74px, 195px) rotate(-25deg) scale(.73); opacity: 0; }
}

.zombie-collapse {
  transform-box: view-box;
  transform-origin: 0 0;
}

[data-defeated="true"] .zombie-collapse {
  animation: zombie-collapse .62s ease-in both;
}

.zombie-gait {
  animation: zombie-gait var(--stride) ease-in-out infinite alternate;
  animation-delay: var(--stride-delay);
}

.zombie-gait [data-injured] {
  filter: brightness(var(--zombie-injury, 1));
}

.zombie-leg,
.zombie-arm {
  transform-box: view-box;
  rotate: var(--zombie-lean, 0deg);
  animation: zombie-step var(--stride) ease-in-out infinite alternate;
  animation-delay: var(--stride-delay);
}

.zombie-leg { transform-origin: 0 -15px; }
.zombie-arm { transform-origin: 0 -26px; }
.zombie-leg.rear,
.zombie-arm.front { animation-direction: alternate-reverse; }

@keyframes zombie-gait {
  from { transform: translateY(-.8px) rotate(-1deg); }
  to { transform: translateY(.7px) rotate(3deg); }
}

@keyframes zombie-step {
  from { transform: rotate(var(--zombie-swing-start, -13deg)); }
  to { transform: rotate(var(--zombie-swing-end, 16deg)); }
}

@keyframes zombie-collapse {
  0% { transform: rotate(0deg); opacity: 1; }
  62% { transform: translateX(6px) rotate(84deg) scaleY(.72); opacity: .88; }
  100% { transform: translate(6px, 2px) rotate(90deg) scaleY(.4); opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
  [data-defeated="true"] .zombie-collapse { opacity: 0; }
  .horde-melee-layer[data-melee-state="fall"] { opacity: 0; }
  .horde-melee-layer .horde-melee-grip { transform: none !important; }
}
