/* Six UV-mapped faces per vanilla cuboid; transform hierarchies match the
   Bedrock skeleton. No procedural replacement textures or stretched sprites. */
.mc-character, .mc-tnt {
  /* Move the outer wrapper with transforms. Opacity/filter animations on this
     perspective container can flatten its faces in Chromium. */
  position: absolute;
  pointer-events: none;
  user-select: none;
  perspective: 1200px;
  perspective-origin: 50% 40%;
  transform-style: preserve-3d;
  overflow: visible;
}
.mc-camera {
  position: absolute;
  inset: 0;
  transform: rotateX(-8deg);
  transform-origin: 50% var(--mc-ground);
  transform-style: preserve-3d;
}
.mc-model {
  position: absolute;
  width: 0;
  height: 0;
  left: 50%;
  top: var(--mc-ground);
  transform-origin: 0 0;
  transform-style: preserve-3d;
}
.mc-bone, .mc-cube, .mc-carried-tnt, .mc-pickaxe {
  position: absolute;
  transform-style: preserve-3d;
}
.mc-bone {
  width: 0;
  height: 0;
  transform-origin: 0 0;
  transform: translateZ(var(--mc-bone-z, 0px));
}
.mc-face {
  position: absolute;
  left: 0;
  top: 0;
  transform-origin: 50% 50%;
  backface-visibility: hidden;
}
.mc-face-texture {
  position: absolute;
  inset: 0;
  background-repeat: no-repeat;
  image-rendering: pixelated;
}
/* Filter the pixels, not a solid overlay: skin overlays retain their alpha. */
.mc-face-front .mc-face-texture { filter: brightness(1); }
.mc-face-right .mc-face-texture { filter: brightness(.77); }
.mc-face-left .mc-face-texture { filter: brightness(.86); }
.mc-face-back .mc-face-texture { filter: brightness(.73); }
.mc-face-top .mc-face-texture { filter: brightness(1.08); }
.mc-face-bottom .mc-face-texture { filter: brightness(.60); }
.mc-floor-shadow {
  position: absolute;
  width: var(--mc-shadow-width, 70%);
  height: 8%;
  left: 50%;
  top: calc(var(--mc-ground) - 3%);
  transform: translateX(-50%);
  background: radial-gradient(ellipse, #0006, #0002 50%, transparent 72%);
  border-radius: 50%;
}
.mc-pickaxe { display: none; transform-origin: 0 0; }
.mc-item-face {
  position: absolute;
  background-size: 100% 100%;
  background-repeat: no-repeat;
  image-rendering: pixelated;
  backface-visibility: hidden;
}
.mc-carried-tnt { display: none; left: 0; top: 0; width: 0; height: 0; }
.mc-character[data-pose="mine"] .mc-pickaxe { display: block; }
.mc-character:is([data-pose="carry"], [data-pose="place"]) .mc-carried-tnt { display: block; }
.mc-character[data-carrying="false"] .mc-carried-tnt { display: none; }

/* Walking follows the actual joint pivots. Diagonal creeper feet, and the
   human's opposite arm and leg, alternate rather than sliding as a sprite. */
.mc-character:is([data-pose="walk"], [data-pose="carry"]) .mc-bone:is([data-bone="rightLeg"], [data-bone="leg0"], [data-bone="leg3"]) {
  animation: mc-stride var(--mc-step-duration, 850ms) ease-in-out infinite;
}
.mc-character:is([data-pose="walk"], [data-pose="carry"]) .mc-bone:is([data-bone="leftLeg"], [data-bone="leg1"], [data-bone="leg2"]) {
  animation: mc-stride var(--mc-step-duration, 850ms) ease-in-out infinite;
  animation-delay: calc(var(--mc-step-duration, 850ms) * -.5);
}
.mc-character[data-pose="walk"] .mc-bone[data-bone="leftArm"] { animation: mc-arm-stride var(--mc-step-duration, 850ms) ease-in-out infinite; }
.mc-character[data-pose="walk"] .mc-bone[data-bone="rightArm"] {
  animation: mc-arm-stride var(--mc-step-duration, 850ms) ease-in-out infinite;
  animation-delay: calc(var(--mc-step-duration, 850ms) * -.5);
}
.mc-character[data-pose="idle"] .mc-bone[data-bone="rightArm"] { transform: translateZ(var(--mc-bone-z)) rotateZ(2deg); }
.mc-character[data-pose="idle"] .mc-bone[data-bone="leftArm"] { transform: translateZ(var(--mc-bone-z)) rotateZ(-2deg); }

.mc-character[data-pose="mine"] .mc-bone[data-bone="rightArm"] { animation: mc-pickaxe-swing 900ms ease-in-out infinite; }
.mc-character[data-pose="mine"] .mc-bone[data-bone="leftArm"] { transform: translateZ(var(--mc-bone-z)) rotateX(18deg) rotateZ(-8deg); }
.mc-character[data-pose="mine"] .mc-bone[data-bone="head"] { transform: translateZ(var(--mc-bone-z)) rotateX(-9deg); }
.mc-character[data-pose="mine"] .mc-bone[data-bone="rightLeg"] { transform: translateZ(var(--mc-bone-z)) rotateX(7deg); }
.mc-character[data-pose="mine"] .mc-bone[data-bone="leftLeg"] { transform: translateZ(var(--mc-bone-z)) rotateX(-7deg); }
.mc-character[data-pose="carry"] .mc-bone[data-bone="rightArm"] { transform: translateZ(var(--mc-bone-z)) rotateX(70deg) rotateZ(-7deg); }
.mc-character[data-pose="carry"] .mc-bone[data-bone="leftArm"] { transform: translateZ(var(--mc-bone-z)) rotateX(70deg) rotateZ(7deg); }
.mc-character[data-pose="place"] .mc-bone[data-bone="waist"] { animation: mc-place-bend 900ms ease-in-out both; }
.mc-character[data-pose="place"] .mc-bone[data-bone="rightArm"] { animation: mc-place-arm 900ms ease-in-out both; }
.mc-character[data-pose="place"] .mc-bone[data-bone="leftArm"] { animation: mc-place-arm 900ms ease-in-out both; }
.mc-character[data-pose="place"] .mc-carried-tnt { animation: mc-place-block 900ms ease-in-out both; }

@keyframes mc-stride {
  0%, 100% { transform: translateZ(var(--mc-bone-z)) rotateX(-28deg); }
  50% { transform: translateZ(var(--mc-bone-z)) rotateX(28deg); }
}
@keyframes mc-arm-stride {
  0%, 100% { transform: translateZ(var(--mc-bone-z)) rotateX(-23deg); }
  50% { transform: translateZ(var(--mc-bone-z)) rotateX(23deg); }
}
@keyframes mc-pickaxe-swing {
  0%, 100% { transform: translateZ(var(--mc-bone-z)) rotateX(148deg) rotateZ(3deg); }
  30% { transform: translateZ(var(--mc-bone-z)) rotateX(157deg) rotateZ(3deg); }
  55% { transform: translateZ(var(--mc-bone-z)) rotateX(62deg) rotateZ(3deg); }
  70% { transform: translateZ(var(--mc-bone-z)) rotateX(73deg) rotateZ(3deg); }
}
@keyframes mc-place-bend {
  0%, 100% { transform: translateZ(var(--mc-bone-z)) rotateX(0deg); }
  60% { transform: translateZ(var(--mc-bone-z)) rotateX(-58deg); }
}
@keyframes mc-place-arm {
  0%, 100% { transform: translateZ(var(--mc-bone-z)) rotateX(70deg); }
  60% { transform: translateZ(var(--mc-bone-z)) rotateX(66deg); }
}
@keyframes mc-place-block {
  0% { transform: translateY(0) translateZ(0); }
  60%, 100% { transform: translateY(calc(var(--mc-unit) * 13)) translateZ(calc(var(--mc-unit) * .75)); }
}
@media (prefers-reduced-motion: reduce) {
  .mc-character .mc-bone, .mc-character .mc-carried-tnt { animation: none !important; }
}
