/* All movement is cosmetic. Board positions, projectiles and resource values remain rule-owned. */
.td-motion-enabled .td-motion-layer{position:absolute;inset:0;z-index:5;overflow:hidden;pointer-events:none;contain:layout style paint}
.td-motion-enabled .td-motion-fx{position:absolute;display:block;pointer-events:none;transform:translate(-50%,-50%);color:var(--motion-color,#ffe3a0);animation-duration:var(--motion-duration,.65s);animation-timing-function:ease-out;animation-fill-mode:both;will-change:transform,opacity}
.td-motion-enabled .td-unit>.td-sprite,.td-motion-enabled .td-enemy>.td-enemy-sprite{transform-origin:50% 82%;backface-visibility:hidden}
/* Replace the old whole-node bob, so animations never overwrite entity positioning. */
.td-motion-enabled .td-entities .td-enemy{animation:none!important}
.td-motion-enabled[data-motion-state=running] .td-unit[data-motion-stance=idle]>.td-sprite{animation:tdm-breathe 3.2s ease-in-out infinite}
.td-motion-enabled[data-motion-state=running] .td-unit:nth-child(3n)>.td-sprite{animation-delay:-1.1s}
.td-motion-enabled[data-motion-state=running] .td-unit[data-motion-model=glm]>.td-sprite{animation-duration:3.8s}
.td-motion-enabled[data-motion-state=running] .td-unit[data-motion-stance=charging]>.td-sprite{animation:tdm-charge .28s ease-in both}
.td-motion-enabled[data-motion-state=running] .td-unit[data-motion-stance=fusing]>.td-sprite{animation:tdm-fuse .26s ease-in-out infinite}
.td-motion-enabled[data-motion-state=running] .td-enemy[data-motion-stance=moving]>.td-enemy-sprite{animation:tdm-step .64s ease-in-out infinite}
.td-motion-enabled[data-motion-state=running] .td-enemy.noise[data-motion-stance=moving]>.td-enemy-sprite{animation-duration:.38s}
.td-motion-enabled[data-motion-state=running] .td-enemy.context[data-motion-stance=moving]>.td-enemy-sprite{animation-duration:.92s}
.td-motion-enabled[data-motion-state=running] .td-enemy.boss[data-motion-stance=moving]>.td-enemy-sprite{animation-duration:1.15s}
.td-motion-enabled[data-motion-state=running] .td-enemy.slowed[data-motion-stance=moving]>.td-enemy-sprite{animation-duration:1.2s}
.td-motion-enabled .td-unit[data-motion-action=plant]>.td-sprite{animation:tdm-plant .4s cubic-bezier(.2,.8,.3,1.3) both!important}
.td-motion-enabled .td-unit[data-motion-action=attack]>.td-sprite{animation:tdm-recoil .48s ease-out both!important}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=gemini]>.td-sprite{animation-name:tdm-twin-cast!important}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=deepseek]>.td-sprite{animation-name:tdm-tide-cast!important}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=qwen]>.td-sprite{animation-name:tdm-fan-cast!important}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=kimi]>.td-sprite{animation-name:tdm-flute-cast!important}
.td-motion-enabled .td-unit[data-motion-action=produce]>.td-sprite{animation:tdm-produce .7s ease-in-out both!important}
.td-motion-enabled .td-unit[data-motion-action=heal]>.td-sprite{animation:tdm-heal .6s ease-out both!important}
.td-motion-enabled .td-unit[data-motion-action=skill]>.td-sprite{animation:tdm-skill .7s ease-out both!important}
.td-motion-enabled .td-unit[data-motion-action=skill][data-motion-skill=claude]>.td-sprite{animation-name:tdm-guard!important}
.td-motion-enabled .td-unit[data-motion-action=skill][data-motion-skill=kimi]>.td-sprite{animation-name:tdm-flute-cast!important}
.td-motion-enabled .td-unit[data-motion-action=skill][data-motion-skill=qwen]>.td-sprite{animation-name:tdm-fan-cast!important}
.td-motion-enabled .td-unit[data-motion-action=skill][data-motion-skill=glm]>.td-sprite{animation-name:tdm-produce!important}
.td-motion-enabled .td-enemy[data-motion-action=bite]>.td-enemy-sprite{animation:tdm-bite .38s ease-in-out both!important}
.td-motion-enabled [data-motion-hurt=true]>.td-sprite,.td-motion-enabled [data-motion-hurt=true]>.td-enemy-sprite{filter:brightness(1.18) sepia(.15) drop-shadow(1px 0 2px #ff8790)!important}
.td-motion-enabled .td-token[data-motion-action=appear]>span{display:inline-block;animation:tdm-sun-appear .65s ease-out both!important}
.td-motion-enabled .td-motion-muzzle{width:23px;height:17px;clip-path:polygon(0 32%,45% 34%,67% 0,66% 34%,100% 50%,65% 64%,66% 100%,43% 66%,0 67%);background:currentColor;animation-name:tdm-muzzle;filter:drop-shadow(0 0 4px currentColor)}
.td-motion-enabled .td-motion-twin{width:24px;height:24px;border-top:2px solid currentColor;border-bottom:2px solid currentColor;border-radius:50%;animation-name:tdm-twin}
.td-motion-enabled .td-motion-ripple,.td-motion-enabled .td-motion-slow{width:36px;height:36px;border:2px solid currentColor;border-radius:50%;animation-name:tdm-ring;box-shadow:inset 0 0 0 4px #9cddff16}
.td-motion-enabled .td-motion-ripple:after,.td-motion-enabled .td-motion-slow:after{content:'';position:absolute;inset:6px;border:1px solid currentColor;border-radius:50%;opacity:.5}
.td-motion-enabled .td-motion-fan{width:46px;height:46px;border:2px solid currentColor;border-left-color:transparent;border-bottom-color:transparent;border-radius:50%;animation-name:tdm-fan-air}
.td-motion-enabled .td-motion-note{font-size:24px;font-weight:750;text-shadow:0 0 10px #d6b7ff88;animation-name:tdm-note}
.td-motion-enabled .td-motion-hit{width:25px;height:25px;background:currentColor;clip-path:polygon(50% 0,61% 37%,100% 50%,62% 61%,50% 100%,39% 63%,0 50%,38% 39%);animation-name:tdm-hit;color:#ffe3c8}
.td-motion-enabled .td-motion-plant,.td-motion-enabled .td-motion-produce,.td-motion-enabled .td-motion-skill{width:46px;height:18px;border:1.5px solid currentColor;border-radius:50%;box-shadow:0 0 14px color-mix(in srgb,currentColor 30%,transparent);animation-name:tdm-ground-ring;margin-top:22px}
.td-motion-enabled .td-motion-produce{color:#ffe29e;width:54px;height:28px;border-width:2px;box-shadow:0 0 16px #ffe2a044}
.td-motion-enabled .td-motion-heal{font-size:24px;font-weight:750;text-shadow:0 0 7px #a8ffd066;animation-name:tdm-heal-cross}
.td-motion-enabled .td-motion-shield{width:13%;height:25%;min-width:60px;min-height:70px;border:2px solid currentColor;border-radius:45% 45% 50% 50%;background:linear-gradient(150deg,#ffd3a817,transparent 65%);box-shadow:inset 0 0 14px #ffcf9d22,0 0 10px #ffcf9d22;animation-name:tdm-shield}
.td-motion-enabled .td-motion-shield:before{content:'';position:absolute;inset:7px;border:1px solid currentColor;border-radius:inherit;opacity:.4}
.td-motion-enabled .td-motion-blast{width:33.333%;height:60%;border:3px solid #ffe4a5;border-radius:50%;background:radial-gradient(ellipse,#fff2bd73 0 8%,#ffd08c1a 25%,transparent 64%);box-shadow:inset 0 0 24px #ffd79e55,0 0 18px #ffbd7133;animation-name:tdm-blast}
.td-motion-enabled .td-motion-blast-sparks{width:6px;height:6px;border-radius:50%;background:#fff1b4;box-shadow:-27px -19px #ffdca4,22px -25px #ffe9c4,39px 4px #f5b581,17px 29px #fff1b4,-31px 23px #ffcc90,-42px -3px #ffe9c4;animation-name:tdm-sparks}
.td-motion-enabled .td-motion-pop{width:6px;height:6px;background:currentColor;border-radius:2px;box-shadow:-10px -7px currentColor,12px -6px currentColor,8px 10px currentColor,-8px 9px currentColor;animation-name:tdm-pop}
.td-motion-enabled .td-motion-collect{font-size:15px;font-weight:800;white-space:nowrap;color:#fff1b0;text-shadow:0 2px 3px #382515,0 0 9px #ffd97899;animation-name:tdm-collect}
.td-motion-enabled .td-motion-collect-trail{width:7px;height:7px;border-radius:50%;background:#fff0b2;box-shadow:0 0 8px 3px #ffcd6c66,7px 12px 0 -2px #ffe6a7,-3px 23px 0 -2px #ffe6a755;animation-name:tdm-collect-trail}
@keyframes tdm-breathe{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-1.6px) scale(1.012,1.018)}}
@keyframes tdm-charge{to{transform:translateX(-2px) rotate(-3deg) scale(.98,1.02);filter:brightness(1.12)}}
@keyframes tdm-step{0%,100%{transform:translateY(0) rotate(-1.7deg)}50%{transform:translateY(-2px) rotate(1.7deg)}}
@keyframes tdm-fuse{0%,100%{transform:rotate(-2deg);filter:brightness(1.02)}50%{transform:rotate(2deg) scale(1.04);filter:brightness(1.2) drop-shadow(0 0 4px #ffd57c)}}
@keyframes tdm-plant{0%{transform:translateY(-13px) scale(.82);opacity:.5}65%{transform:translateY(2px) scale(1.06,.96)}100%{transform:none;opacity:1}}
@keyframes tdm-recoil{0%{transform:translateX(-2px) rotate(-3deg)}24%{transform:translateX(-5px) rotate(-6deg) scale(.98,1.02)}55%{transform:translateX(1px) rotate(2deg)}100%{transform:none}}
@keyframes tdm-twin-cast{0%,100%{transform:none}25%{transform:translateX(-3px) rotate(-6deg)}55%{transform:translateX(1px) rotate(4deg)}75%{transform:rotate(-2deg)}}
@keyframes tdm-tide-cast{0%,100%{transform:none}30%{transform:translateY(-3px) rotate(-4deg)}60%{transform:translateX(2px) rotate(3deg)}}
@keyframes tdm-fan-cast{0%,100%{transform:none}25%{transform:rotate(-8deg) translateX(-2px)}55%{transform:rotate(7deg) translateX(2px)}80%{transform:rotate(-2deg)}}
@keyframes tdm-flute-cast{0%,100%{transform:none}30%{transform:translateY(-3px) rotate(-3deg)}65%{transform:translateY(-1px) rotate(2deg)}}
@keyframes tdm-produce{0%,100%{transform:none;filter:brightness(1)}30%{transform:translateY(-4px) scale(1.04);filter:brightness(1.18)}65%{transform:translateY(1px) scale(1.02,.98)}}
@keyframes tdm-heal{0%,100%{filter:brightness(1)}40%{filter:brightness(1.18) drop-shadow(0 0 3px #a8ffd0)}}
@keyframes tdm-skill{0%,100%{transform:none;filter:brightness(1)}35%{transform:translateY(-4px) rotate(-2deg) scale(1.035);filter:brightness(1.16)}70%{transform:translateY(-1px)}}
@keyframes tdm-guard{0%,100%{transform:none}35%{transform:translateY(-1px) scale(1.035,1.015)}70%{transform:rotate(2deg)}}
@keyframes tdm-bite{0%,100%{transform:none}35%{transform:translateX(-6px) rotate(-7deg) scale(1.04,.97)}65%{transform:translateX(-2px) rotate(2deg)}}
@keyframes tdm-sun-appear{0%{transform:scale(.5) rotate(-25deg);opacity:.4}55%{transform:scale(1.18) rotate(8deg)}100%{transform:none;opacity:1}}
@keyframes tdm-muzzle{0%{transform:translate(-50%,-50%) scale(.3);opacity:0}20%{opacity:.9}100%{transform:translate(10%,-50%) scale(1.2);opacity:0}}
@keyframes tdm-twin{0%{transform:translate(-50%,-50%) scale(.4);opacity:.8}100%{transform:translate(30%,-50%) scale(1.4);opacity:0}}
@keyframes tdm-ring{0%{transform:translate(-50%,-50%) scale(.4);opacity:.8}100%{transform:translate(-50%,-50%) scale(1.7);opacity:0}}
@keyframes tdm-fan-air{0%{transform:translate(-50%,-50%) rotate(-30deg) scale(.3);opacity:.8}100%{transform:translate(15%,-50%) rotate(25deg) scale(1.15);opacity:0}}
@keyframes tdm-note{0%{transform:translate(-50%,-35%) rotate(-10deg);opacity:0}20%{opacity:.95}100%{transform:translate(150%,-130%) rotate(12deg);opacity:0}}
@keyframes tdm-hit{0%{transform:translate(-50%,-50%) scale(.3);opacity:1}100%{transform:translate(-50%,-50%) scale(1.15) rotate(25deg);opacity:0}}
@keyframes tdm-ground-ring{0%{transform:translate(-50%,-50%) scale(.4);opacity:.8}100%{transform:translate(-50%,-50%) scale(1.65);opacity:0}}
@keyframes tdm-heal-cross{0%{transform:translate(-50%,-50%) scale(.5);opacity:0}30%{opacity:.9}100%{transform:translate(-50%,-180%) scale(1);opacity:0}}
@keyframes tdm-shield{0%{transform:translate(-50%,-50%) scale(.8);opacity:0}25%{opacity:.65}100%{transform:translate(-50%,-50%) scale(1.13);opacity:0}}
@keyframes tdm-blast{0%{transform:translate(-50%,-50%) scale(.05);opacity:0}20%{opacity:.85}75%{transform:translate(-50%,-50%) scale(.95);opacity:.25}100%{transform:translate(-50%,-50%) scale(1);opacity:0}}
@keyframes tdm-sparks{0%{transform:translate(-50%,-50%) scale(.1);opacity:1}100%{transform:translate(-50%,-50%) scale(1.7) rotate(10deg);opacity:0}}
@keyframes tdm-pop{0%{transform:translate(-50%,-50%) scale(.3);opacity:.85}100%{transform:translate(-50%,-70%) scale(2) rotate(25deg);opacity:0}}
@keyframes tdm-collect{0%{transform:translate(-50%,-50%) scale(.85);opacity:0}20%{opacity:1}70%{opacity:1}100%{transform:translate(-50%,-240%) scale(1.05);opacity:0}}
@keyframes tdm-collect-trail{0%{transform:translate(-50%,-50%);opacity:.8}100%{transform:translate(-170%,-650%) scale(.3);opacity:0}}
/* Global pause, game pause and accessibility preferences never affect simulation rules. */
.td-motion-enabled[data-motion-state=paused] .td-sprite,.td-motion-enabled[data-motion-state=paused] .td-enemy-sprite,.td-motion-enabled[data-motion-state=paused] .td-motion-fx,.td-motion-enabled[data-motion-state=paused] .td-token>span{animation-play-state:paused!important}
.motion-paused .td-motion-enabled *,.page-hidden .td-motion-enabled *{animation-play-state:paused!important}
.motion-paused .td-motion-enabled .td-motion-fx,.page-hidden .td-motion-enabled .td-motion-fx,.td-motion-enabled[data-motion-state=paused] .td-motion-fx{visibility:hidden}
.td-motion-enabled[data-effects=reduced] .td-unit>.td-sprite,.td-motion-enabled[data-effects=reduced] .td-enemy>.td-enemy-sprite,.td-motion-enabled[data-motion-level=reduced] .td-unit>.td-sprite,.td-motion-enabled[data-motion-level=reduced] .td-enemy>.td-enemy-sprite,.td-motion-enabled[data-effects=reduced] .td-token>span,.td-motion-enabled[data-motion-level=reduced] .td-token>span{animation:none!important;transform:none!important}
.td-motion-enabled[data-motion-level=reduced] .td-motion-fx,.td-motion-enabled[data-effects=reduced] .td-motion-fx{animation:none!important;will-change:auto}
.td-motion-enabled[data-motion-level=reduced] .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage),.td-motion-enabled[data-effects=reduced] .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage){display:none}
.td-motion-enabled[data-motion-level=reduced] .td-motion-collect{transform:translate(-50%,-100%);font-size:13px;text-shadow:0 1px 2px #241b11}
@media(prefers-reduced-motion:reduce){.td-motion-enabled .td-sprite,.td-motion-enabled .td-enemy-sprite,.td-motion-enabled .td-motion-fx,.td-motion-enabled .td-token>span{animation:none!important;will-change:auto}.td-motion-enabled .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage){display:none}.td-motion-enabled .td-motion-collect{transform:translate(-50%,-100%)}}
/* Community references are costumes for real rule events, never invented rewards or service actions. */
.td-motion-enabled .td-unit>.td-sprite{position:relative}
.td-motion-enabled .td-unit[data-motion-shield=true]>.td-sprite:before{content:'';position:absolute;inset:9% 12% 7%;border:1px solid #a1ecc794;border-radius:46% 46% 50% 50%;box-shadow:inset 0 0 10px #a1ecc715,0 0 7px #d9e5a523;pointer-events:none}
.td-motion-enabled .td-unit[data-motion-stance=fusing]>.td-sprite:after,.td-motion-enabled .td-unit[data-motion-stance=rice-break]>.td-sprite:after,.td-motion-enabled .td-unit[data-motion-stance=cat-break]>.td-sprite:after,.td-motion-enabled .td-unit[data-motion-boost=true]>.td-sprite:after{position:absolute;top:-4%;right:5%;border:1px solid #f0d7ab70;border-radius:7px;background:#233040eb;color:#fff0bb;padding:1px 5px;font-size:15px;font-weight:750;line-height:1.4;pointer-events:none}
.td-motion-enabled .td-unit[data-motion-stance=fusing]>.td-sprite:after{content:'?';transform:rotate(7deg)}
.td-motion-enabled .td-unit[data-motion-stance=rice-break]>.td-sprite:after{content:'摸鱼';font-size:9px;top:auto;bottom:12%;right:-3%;color:#cceeff;border-color:#96dbed88}
.td-motion-enabled .td-unit[data-motion-stance=cat-break]>.td-sprite:after{content:'…';color:#dbddff;border-color:#b6c2ff80}
.td-motion-enabled .td-unit[data-motion-boost=true]>.td-sprite:after{content:'↑';color:#e6caff;border-color:#d4b4ff80;top:12%;right:0;font-size:12px}
.td-motion-enabled[data-motion-state=running][data-motion-level=full] .td-unit[data-motion-stance=rice-break]>.td-sprite{animation:tdm-rice-break 1s ease-in-out both!important}
.td-motion-enabled[data-motion-state=running][data-motion-level=full] .td-unit[data-motion-stance=cat-break]>.td-sprite{animation:tdm-cat-break .8s ease-in-out both!important}
.td-motion-enabled .td-unit[data-motion-charged=true]>.td-sprite{filter:drop-shadow(0 0 3px #bdeaff55)}
.td-motion-enabled .td-enemy[data-motion-stance=stunned]>.td-enemy-sprite{animation:none!important;filter:saturate(.65)}
.td-motion-enabled .td-enemy[data-motion-stance=stunned]{outline:1px solid #edbc9d99;outline-offset:1px}
/* These are the engine's actual moving projectiles. CSS changes their shape, never their path. */
.td-motion-enabled .td-shot[data-shot-type=deepseek]{width:11px;height:10px;background:#fff9e5!important;border:1px solid #d6e8ee;border-radius:48% 48% 32% 32%;box-shadow:0 0 5px #b3e6ff88}
.td-motion-enabled .td-shot[data-shot-type=deepseek]:after{content:'';position:absolute;bottom:-1px;left:3px;width:4px;height:4px;background:#3c6971;border-radius:1px}
.td-motion-enabled .td-shot[data-shot-type=deepseek][data-rice-charged=true]{width:14px;height:13px;box-shadow:-6px 0 5px #c1eeff77,-12px 0 7px #b4e8ff33}
.td-motion-enabled .td-motion-dragon-shield{width:60px;height:66px;border:2px solid #c9efb1;border-radius:45% 45% 50% 50%;background:linear-gradient(140deg,#c6f7c625,transparent 60%);box-shadow:0 0 12px #9be7c333,inset 0 0 9px #f5e5a622;animation-name:tdm-shield}
.td-motion-enabled .td-motion-dragon-wings{width:96px;height:58px;animation-name:tdm-dragon-wings;margin-top:-5px}
.td-motion-enabled .td-motion-dragon-wings:before,.td-motion-enabled .td-motion-dragon-wings:after{content:'';position:absolute;left:0;top:0;width:50%;height:100%;background:linear-gradient(140deg,#fff0bcdd,#8de8bfb3);clip-path:polygon(100% 68%,65% 8%,0 0,12% 48%,38% 36%,49% 80%,73% 60%,100% 100%)}
.td-motion-enabled .td-motion-dragon-wings:after{left:50%;transform:scaleX(-1)}
.td-motion-enabled .td-motion-guard-hit{width:52px;height:52px;border:2px solid #daf6b1;border-left-color:transparent;border-bottom-color:transparent;border-radius:50%;animation-name:tdm-ring}
.td-motion-enabled .td-motion-rice-bowl{font-size:25px;line-height:1;animation-name:tdm-rice-bowl;margin-left:-14px;margin-top:-19px;filter:drop-shadow(0 2px 3px #07172666)}
.td-motion-enabled .td-motion-rice-shot{font-size:19px;line-height:1;animation-name:tdm-rice-shot}
.td-motion-enabled .td-motion-tail-wave{width:70px;height:48px;border:3px solid #c4efff;border-left-color:transparent;border-bottom-color:transparent;border-radius:50%;box-shadow:5px -3px 0 -2px #82dcff88;animation-name:tdm-tail-wave}
.td-motion-enabled .td-motion-cat-paw{font-size:12px;line-height:1;font-weight:750;color:#d9dbff;animation-name:tdm-cat-paw;margin-top:-20px;margin-left:19px}
.td-motion-enabled .td-motion-cat-paw:before{content:'';position:absolute;left:-17px;top:0;width:13px;height:10px;background:#d0c9ff;border-radius:50% 50% 45% 45%;transform:rotate(-15deg)}
.td-motion-enabled .td-motion-cat-paw:after{content:'';position:absolute;left:-20px;top:-5px;width:4px;height:5px;background:#d0c9ff;border-radius:50%;box-shadow:5px -3px #d0c9ff,10px -3px #d0c9ff,14px 1px #d0c9ff}
.td-motion-enabled .td-motion-ban-lock{width:51px;height:50px;border:2px solid #eead99;border-radius:8px;background:repeating-linear-gradient(90deg,transparent 0 9px,#eead9924 9px 11px);animation-name:tdm-ban-lock}
.td-motion-enabled .td-motion-ban-stamp{width:36px;height:36px;display:grid;place-items:center;border:3px double #ffc0a6;border-radius:3px;background:#783b36da;color:#ffdfca;font-size:22px;font-weight:850;line-height:1;box-shadow:0 2px 8px #2b172b55;animation-name:tdm-ban-stamp;margin-top:-16px;margin-left:13px}
.td-motion-enabled .td-motion-verify-ring{width:64px;height:64px;border:1px dashed #eed9ac;border-radius:50%;box-shadow:inset 0 0 0 6px #ffe6a70b;animation-name:tdm-verify-ring}
.td-motion-enabled .td-motion-verify-ring:before,.td-motion-enabled .td-motion-verify-ring:after{content:'';position:absolute;background:#ffdf9e;opacity:.8}
.td-motion-enabled .td-motion-verify-ring:before{left:0;top:50%;width:100%;height:1px}
.td-motion-enabled .td-motion-verify-ring:after{left:50%;top:0;width:1px;height:100%}
.td-motion-enabled .td-motion-axe-slash{width:80px;height:80px;animation-name:tdm-axe-slash}
.td-motion-enabled .td-motion-axe-slash:before,.td-motion-enabled .td-motion-axe-slash:after{content:'';position:absolute;left:0;top:44%;width:100%;height:9%;background:linear-gradient(90deg,transparent,#ffefc4 45%,#fff8e3 55%,transparent);transform:rotate(43deg);clip-path:polygon(0 70%,88% 0,100% 50%,10% 100%)}
.td-motion-enabled .td-motion-axe-slash:after{transform:rotate(-43deg)}
.td-motion-enabled .td-motion-tea-ticket{padding:4px 7px 4px 20px;border:1px dashed #ffdbb6;border-radius:5px;background:#765345f0;color:#ffe8d2;font-size:9px;font-weight:750;white-space:nowrap;animation-name:tdm-tea-ticket;margin-top:-12px}
.td-motion-enabled .td-motion-tea-ticket:before{content:'🧋';position:absolute;left:2px;top:1px;font-size:15px}
.td-motion-enabled .td-motion-fox-link{width:32px;height:32px;border:1px solid #e0bdff77;border-radius:50%;display:grid;place-items:center;background:#916bad22;color:#e8cfff;font-size:20px;font-weight:800;animation-name:tdm-fox-link;margin-left:22px}
@keyframes tdm-rice-break{0%{transform:none}25%,75%{transform:translateY(4px) rotate(-7deg) scale(1.035,.94)}100%{transform:translateY(2px) rotate(-2deg)}}
@keyframes tdm-cat-break{0%,100%{transform:none}30%,65%{transform:rotate(10deg) translateY(-1px)}80%{transform:rotate(-3deg)}}
@keyframes tdm-dragon-wings{0%{transform:translate(-50%,-40%) scale(.35,.7);opacity:0}25%{opacity:.7}55%{transform:translate(-50%,-55%) scale(1);opacity:.5}100%{transform:translate(-50%,-65%) scale(1.12,.9);opacity:0}}
@keyframes tdm-rice-bowl{0%{transform:translate(-50%,-15%) scale(.45);opacity:0}20%,70%{transform:translate(-50%,-50%) scale(1);opacity:1}100%{transform:translate(-50%,-60%) scale(.9);opacity:0}}
@keyframes tdm-rice-shot{0%{transform:translate(-50%,-50%) scale(.5);opacity:0}20%{opacity:1}100%{transform:translate(175%,-65%) scale(1);opacity:0}}
@keyframes tdm-tail-wave{0%{transform:translate(-65%,-50%) rotate(-25deg) scale(.25);opacity:0}25%{opacity:.85}100%{transform:translate(35%,-50%) rotate(15deg) scale(1.15);opacity:0}}
@keyframes tdm-cat-paw{0%{transform:translate(-50%,-25%) rotate(-16deg) scale(.5);opacity:0}25%,65%{transform:translate(-50%,-65%) rotate(9deg) scale(1);opacity:.95}100%{transform:translate(-50%,-80%) rotate(-5deg);opacity:0}}
@keyframes tdm-ban-lock{0%{transform:translate(-50%,-50%) scale(1.3);opacity:0}25%{transform:translate(-50%,-50%) scale(1);opacity:.7}100%{transform:translate(-50%,-50%) scale(.96);opacity:0}}
@keyframes tdm-ban-stamp{0%{transform:translate(-50%,-100%) rotate(-16deg) scale(1.5);opacity:0}25%,65%{transform:translate(-50%,-50%) rotate(-8deg) scale(1);opacity:.95}100%{transform:translate(-50%,-60%) rotate(-8deg) scale(.95);opacity:0}}
@keyframes tdm-verify-ring{0%{transform:translate(-50%,-50%) rotate(0) scale(1);opacity:.35}70%{opacity:.7}100%{transform:translate(-50%,-50%) rotate(80deg) scale(.8);opacity:0}}
@keyframes tdm-axe-slash{0%{transform:translate(-50%,-50%) scale(.2) rotate(-8deg);opacity:0}25%{opacity:1}100%{transform:translate(-50%,-50%) scale(1.6) rotate(8deg);opacity:0}}
@keyframes tdm-tea-ticket{0%{transform:translate(-50%,-20%) rotate(-12deg) scale(.6);opacity:0}25%,65%{transform:translate(-50%,-85%) rotate(5deg) scale(1);opacity:1}100%{transform:translate(-50%,-160%) rotate(0) scale(.95);opacity:0}}
@keyframes tdm-fox-link{0%{transform:translate(-50%,-35%) scale(.5);opacity:0}25%{opacity:.8}100%{transform:translate(-50%,-150%) scale(1.15);opacity:0}}
/* New accents share the same bounded lifetime and accessibility gates as the base layer. */
.td-motion-enabled[data-motion-level=reduced] .td-motion-fx,.td-motion-enabled[data-effects=reduced] .td-motion-fx{animation:none!important;will-change:auto}
.td-motion-enabled[data-motion-level=reduced] .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage),.td-motion-enabled[data-effects=reduced] .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage){display:none!important}
@media(prefers-reduced-motion:reduce){.td-motion-enabled .td-motion-fx{animation:none!important;will-change:auto}.td-motion-enabled .td-motion-fx:not(.td-motion-collect):not(.td-motion-damage){display:none!important}}

@media(prefers-reduced-motion:reduce){.td-motion-enabled[data-motion-state=running][data-motion-level=full] .td-unit[data-motion-stance]>.td-sprite{animation:none!important}}

/* Articulated paper-doll regions reuse the original atlas. The actor, HP bar and
   simulation-owned left/top are never transformed by these local limb actions. */
.td-motion-enabled [data-motion-rig=true]{position:relative;background-image:none!important}
.td-motion-enabled .td-motion-part{position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none;background-image:var(--td-art);background-size:400% 200%;background-position:inherit;background-repeat:no-repeat;transform-origin:50% 75%;backface-visibility:hidden}
.td-motion-enabled .td-enemy-sprite>.td-motion-part{background-image:var(--td-enemy-art);background-size:200% 200%}
.td-motion-enabled .td-motion-part-body{clip-path:polygon(0 49%,66% 49%,66% 68%,100% 68%,100% 83%,0 83%)}
.td-motion-enabled .td-motion-part-head{clip-path:polygon(0 0,100% 0,100% 33%,66% 33%,66% 49.3%,0 49.3%);transform-origin:52% 48%}
.td-motion-enabled .td-motion-part-arm{clip-path:polygon(65.7% 32.8%,100% 32.8%,100% 68.3%,65.7% 68.3%);transform-origin:67% 54%}
.td-motion-enabled .td-motion-part-back-foot{clip-path:inset(82.7% 50% 0 0);transform-origin:45% 83%}
.td-motion-enabled .td-motion-part-front-foot{clip-path:inset(82.7% 0 0 49.7%);transform-origin:57% 83%}
.td-motion-enabled .td-enemy-sprite>.td-motion-part-head{clip-path:inset(0 0 55%);transform-origin:53% 44%}
.td-motion-enabled .td-enemy-sprite>.td-motion-part-arm{clip-path:inset(44.7% 58% 29% 0);transform-origin:40% 50%}
.td-motion-enabled .td-enemy-sprite>.td-motion-part-body{clip-path:polygon(42% 45%,100% 45%,100% 78%,0 78%,0 70.7%,42% 70.7%)}
.td-motion-enabled .td-enemy-sprite>.td-motion-part-back-foot{clip-path:inset(77.7% 48% 0 0);transform-origin:45% 78%}
.td-motion-enabled .td-enemy-sprite>.td-motion-part-front-foot{clip-path:inset(77.7% 0 0 51.7%);transform-origin:62% 78%}
.td-motion-enabled .td-unit>.td-sprite,.td-motion-enabled .td-enemy>.td-enemy-sprite{transition:translate .14s ease-out}
.td-motion-enabled .td-unit[data-motion-recoil=left]>.td-sprite{translate:-5px 0}
.td-motion-enabled .td-enemy[data-motion-recoil=right]>.td-enemy-sprite{translate:6px 0}
/* Wind-up, release, overshoot and recovery are separate poses rather than a scale pulse. */
.td-motion-enabled .td-unit[data-motion-action=attack] .td-motion-part-arm{animation:tdm-cast-arm .52s cubic-bezier(.2,.75,.25,1) both}
.td-motion-enabled .td-unit[data-motion-action=attack] .td-motion-part-head{animation:tdm-cast-head .52s ease-in-out both}
.td-motion-enabled .td-unit[data-motion-action=attack] .td-motion-part-body{animation:tdm-cast-body .52s ease-in-out both}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=gemini] .td-motion-part-arm{animation-name:tdm-double-arm}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=deepseek] .td-motion-part-arm{animation-name:tdm-wave-arm}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=qwen] .td-motion-part-arm{animation-name:tdm-fan-arm}
.td-motion-enabled .td-unit[data-motion-action=attack][data-motion-model=kimi] .td-motion-part-head{animation-name:tdm-flute-head}
.td-motion-enabled .td-unit[data-motion-action=skill] .td-motion-part-arm,.td-motion-enabled .td-unit[data-motion-action=produce] .td-motion-part-arm{animation:tdm-offer-arm .7s ease-in-out both}
.td-motion-enabled .td-unit[data-motion-stance=rice-break] .td-motion-part-head{animation:tdm-rest-head 1s ease-in-out both}
.td-motion-enabled .td-unit[data-motion-stance=cat-break] .td-motion-part-head{animation:tdm-look-away .8s ease-in-out both}
.td-motion-enabled .td-enemy{--stride:.64s}
.td-motion-enabled .td-enemy.noise{--stride:.38s}
.td-motion-enabled .td-enemy.context{--stride:.92s}
.td-motion-enabled .td-enemy.boss{--stride:1.15s}
.td-motion-enabled .td-enemy.slowed{--stride:1.2s}
.td-motion-enabled .td-enemy[data-motion-stance=moving] .td-motion-part-back-foot{animation:tdm-leg-back var(--stride) linear infinite}
.td-motion-enabled .td-enemy[data-motion-stance=moving] .td-motion-part-front-foot{animation:tdm-leg-front var(--stride) linear infinite}
.td-motion-enabled .td-enemy[data-motion-stance=moving] .td-motion-part-arm{animation:tdm-walk-arm var(--stride) ease-in-out infinite}
.td-motion-enabled .td-enemy[data-motion-stance=moving] .td-motion-part-head{animation:tdm-walk-head var(--stride) ease-in-out infinite}
.td-motion-enabled .td-enemy[data-motion-action=bite] .td-motion-part-head{animation:tdm-bite-head .38s ease-in-out both}
.td-motion-enabled .td-enemy[data-motion-action=bite] .td-motion-part-arm{animation:tdm-grab-arm .38s ease-out both}
.td-motion-enabled .td-enemy[data-motion-stance=stunned] .td-motion-part{animation:none!important}
/* A small trail belongs to the actual moving projectile, never a second fake projectile. */
.td-motion-enabled .td-shot:before{content:'';position:absolute;right:70%;top:25%;height:50%;width:23px;border-radius:100%;background:linear-gradient(90deg,transparent,currentColor);opacity:.5;pointer-events:none}
.td-motion-enabled .td-shot[data-shot-type=qwen]{border-radius:2px 60% 60% 2px;scale:1.25 .7}
.td-motion-enabled .td-shot[data-shot-type=kimi]{box-shadow:0 0 0 3px #e4c5ff30,0 0 10px #e4c5ff}
.td-motion-enabled .td-motion-damage{font-size:clamp(14px,1.5vw,19px);font-weight:900;line-height:1;white-space:nowrap;color:#fff9df;text-shadow:-1px -1px 0 #633318,1px -1px 0 #633318,-1px 1px 0 #633318,1px 2px 0 #633318,0 3px 4px #46280980;margin-top:14px;z-index:3;font-variant-numeric:tabular-nums;animation-name:tdm-damage-number}
.td-motion-enabled .td-motion-impact{width:36px;height:36px;border:2px solid #fff8ce;border-radius:50%;background:radial-gradient(circle,#fff4b477,transparent 60%);animation-name:tdm-impact-ring}
.td-motion-enabled .td-motion-impact-ray{position:absolute;top:45%;left:45%;height:3px;width:13px;border-radius:100%;background:#fff5be;box-shadow:0 0 4px #e19237;transform:rotate(var(--ray-angle)) translateX(14px);transform-origin:left center}
.td-motion-enabled .td-motion-defeat{width:10.4%;max-width:80px;aspect-ratio:1;transform-origin:50% 90%;animation-name:tdm-collapse;filter:drop-shadow(0 3px 2px #342c2f55)}
.td-motion-enabled .td-motion-defeat[data-motion-model=boss]{width:14%;max-width:110px}
.td-motion-enabled .td-motion-defeat>.td-motion-corpse{width:100%;height:100%;position:relative;animation:none!important;transition:none;filter:saturate(.6)}
.td-motion-enabled .td-motion-defeat .td-motion-part{animation:none!important}
.td-motion-enabled .td-motion-fragments{width:1px;height:1px;margin-top:13px;animation-name:tdm-fragments-fade}
.td-motion-enabled .td-motion-fragment{position:absolute;display:block;width:7px;height:7px;border:1px solid #f4d6ff;background:#a077bd;box-shadow:0 1px 1px #503b5966;animation:tdm-fragment .62s ease-out both}
.td-motion-enabled .td-motion-fragment:nth-child(even){background:#e5cbef;width:4px;height:4px}
@keyframes tdm-cast-arm{0%{transform:rotate(0)}18%{transform:rotate(16deg) translate(-2px,3px)}38%{transform:rotate(-20deg) translate(4px,-1px)}58%{transform:rotate(-12deg) translate(2px,0)}78%{transform:rotate(4deg)}100%{transform:none}}
@keyframes tdm-cast-head{0%,100%{transform:none}22%{transform:rotate(-5deg) translateY(1px)}45%{transform:rotate(4deg) translateX(1px)}70%{transform:rotate(-1deg)}}
@keyframes tdm-cast-body{0%,100%{transform:none}20%{transform:rotate(-2deg) translateX(-1px)}42%{transform:rotate(2deg) translateX(1px)}70%{transform:rotate(-.5deg)}}
@keyframes tdm-double-arm{0%,100%{transform:none}20%{transform:rotate(13deg)}36%{transform:rotate(-15deg) translateX(3px)}52%{transform:rotate(5deg)}68%{transform:rotate(-19deg) translateX(3px)}86%{transform:rotate(3deg)}}
@keyframes tdm-wave-arm{0%,100%{transform:none}24%{transform:rotate(20deg) translateY(3px)}48%{transform:rotate(-24deg) translate(3px,-2px)}70%{transform:rotate(-10deg) translateX(1px)}}
@keyframes tdm-fan-arm{0%,100%{transform:none}24%{transform:rotate(23deg) translateX(-2px)}43%{transform:rotate(-32deg) translate(3px,-1px)}68%{transform:rotate(-12deg)}84%{transform:rotate(5deg)}}
@keyframes tdm-flute-head{0%,100%{transform:none}25%{transform:rotate(-6deg) translateY(2px)}48%{transform:rotate(-2deg) translateY(1px)}68%{transform:rotate(-5deg) translateY(2px)}}
@keyframes tdm-offer-arm{0%,100%{transform:none}30%,60%{transform:rotate(-18deg) translate(1px,-4px)}80%{transform:rotate(3deg)}}
@keyframes tdm-rest-head{0%{transform:none}28%,75%{transform:rotate(9deg) translateY(4px)}100%{transform:rotate(4deg) translateY(2px)}}
@keyframes tdm-look-away{0%,100%{transform:none}25%,65%{transform:rotate(-12deg) translateX(-2px)}80%{transform:rotate(4deg)}}
@keyframes tdm-leg-back{0%,100%{transform:rotate(9deg) translateX(1px)}25%{transform:rotate(0) translate(-1px,-2px)}50%{transform:rotate(-10deg) translateX(-2px)}75%{transform:rotate(0) translateY(1px)}}
@keyframes tdm-leg-front{0%,100%{transform:rotate(-9deg) translateX(-2px)}25%{transform:rotate(0) translateY(1px)}50%{transform:rotate(9deg) translateX(1px)}75%{transform:rotate(0) translate(-1px,-2px)}}
@keyframes tdm-walk-arm{0%,100%{transform:rotate(-6deg)}50%{transform:rotate(5deg) translateY(-1px)}}
@keyframes tdm-walk-head{0%,100%{transform:rotate(-2deg)}50%{transform:rotate(2deg) translateY(1px)}}
@keyframes tdm-bite-head{0%,100%{transform:none}24%{transform:rotate(7deg) translate(2px,-2px)}48%{transform:rotate(-13deg) translate(-4px,2px)}66%{transform:rotate(-7deg) translate(-2px,1px)}82%{transform:rotate(3deg)}}
@keyframes tdm-grab-arm{0%,100%{transform:none}22%{transform:rotate(12deg)}47%,60%{transform:rotate(-14deg) translateX(-5px)}80%{transform:rotate(-4deg)}}
@keyframes tdm-damage-number{0%{transform:translate(5%,-15%) scale(.8);opacity:0}18%{transform:translate(15%,-35%) scale(1.12);opacity:1}40%{transform:translate(20%,-45%) scale(1)}75%{opacity:1}100%{transform:translate(30%,-65%);opacity:0}}
@keyframes tdm-impact-ring{0%{transform:translate(-50%,-50%) scale(.18);opacity:1}32%{opacity:1}100%{transform:translate(-50%,-50%) scale(1.35);opacity:0}}
@keyframes tdm-collapse{0%{transform:translate(-50%,-52%) rotate(0);opacity:1}18%{transform:translate(-43%,-59%) rotate(11deg);opacity:1}50%{transform:translate(-35%,-35%) rotate(38deg) scaleY(.88);opacity:1}75%{transform:translate(-25%,-8%) rotate(72deg) scaleY(.65);opacity:.65}100%{transform:translate(-15%,5%) rotate(80deg) scale(.82,.35);opacity:0}}
@keyframes tdm-fragments-fade{0%,70%{opacity:1}100%{opacity:0}}
@keyframes tdm-fragment{0%{transform:translate(0,0) rotate(0);opacity:0}15%{opacity:1}45%{transform:translate(var(--fragment-x),var(--fragment-y)) rotate(var(--fragment-turn));opacity:1}100%{transform:translate(calc(var(--fragment-x) * 1.5),18px) rotate(calc(var(--fragment-turn) * 2));opacity:0}}
/* Entrance settles the sprite only; rule-owned position and life bars never bounce.
   Late rules deliberately override locomotion, including articulated limb loops. */
.td-motion-enabled .td-enemy[data-motion-action=arrive]>.td-enemy-sprite{animation:tdm-arrive .5s cubic-bezier(.2,.7,.3,1) both!important}
.td-motion-enabled .td-enemy[data-motion-action=arrive][data-motion-model=boss]>.td-enemy-sprite{animation:tdm-boss-arrive .85s ease-out both!important}
.td-motion-enabled .td-enemy[data-motion-action=arrive] .td-motion-part{animation:none!important}
.td-motion-enabled .td-enemy[data-motion-rage=true]{--stride:.72s}
.td-motion-enabled[data-motion-state=running] .td-enemy[data-motion-rage=true][data-motion-stance=moving]>.td-enemy-sprite{animation-duration:.72s}
.td-motion-enabled .td-enemy[data-motion-rage=true]>.td-enemy-sprite{filter:drop-shadow(0 2px 3px #a9313d99)}
.td-motion-enabled .td-enemy.slowed[data-motion-rage=true]{--stride:1.2s}
.td-motion-enabled[data-motion-state=running] .td-enemy.slowed[data-motion-rage=true][data-motion-stance=moving]>.td-enemy-sprite{animation-duration:1.2s}
.td-motion-enabled .td-enemy>.td-enemy-sprite{position:relative}
/* A small chest plate identifies armor without obscuring the original face or HP. */
.td-motion-enabled .td-enemy[data-motion-armor=intact]>.td-enemy-sprite:after,.td-motion-enabled .td-enemy[data-motion-armor=exposed]>.td-enemy-sprite:after{content:'';position:absolute;left:36%;top:53%;width:28%;height:23%;border:2px solid #d6e9f4;border-radius:25% 25% 45% 45%;background:linear-gradient(130deg,#d9eff4bb,#496580bb);box-shadow:0 1px 3px #253d5d77;pointer-events:none}
.td-motion-enabled .td-enemy[data-motion-model=boss][data-motion-armor=intact]>.td-enemy-sprite:after{border-color:#f4bdce;background:linear-gradient(130deg,#edbdd3bb,#80446dbb);border-radius:15% 15% 50% 50%}
.td-motion-enabled .td-enemy[data-motion-armor=exposed]>.td-enemy-sprite:after{background:transparent;border-style:dashed;opacity:.55;clip-path:polygon(0 0,42% 0,25% 50%,55% 42%,36% 100%,0 100%,0 0,100% 0,100% 100%,68% 100%,80% 35%,55% 45%,65% 0)}
.td-motion-enabled .td-motion-arrival,.td-motion-enabled .td-motion-boss-arrival,.td-motion-enabled .td-motion-rage{width:52px;height:17px;margin-top:29px;border:2px solid #bce6d5;border-radius:50%;background:#8ccab11a;animation-name:tdm-arrival-ring}
.td-motion-enabled .td-motion-boss-arrival{width:88px;height:28px;border:3px double #eeb7ce;box-shadow:0 0 0 5px #5f29461a}
.td-motion-enabled .td-motion-rage{width:80px;height:25px;border-color:#d95862;border-style:dashed;background:transparent}
.td-motion-enabled .td-motion-armor-break{width:35px;height:24px;margin-top:12px;border-left:7px solid #d0e7ee;border-right:7px solid #a1bdcf;border-radius:4px;animation-name:tdm-armor-break}
.td-motion-enabled .td-motion-rescue-trail{height:13%;transform:translateY(-50%);border-top:1px solid #e1f6b177;border-bottom:1px solid #e1f6b177;background:linear-gradient(90deg,transparent,#e7ffc722 70%,#fff8bb77);clip-path:polygon(0 30%,96% 0,100% 50%,96% 100%,0 70%);animation:none;will-change:width}
@keyframes tdm-arrive{0%{transform:translateX(8px) scale(.94,1.04);opacity:.35}45%{transform:translateX(2px) scale(1.035,.95);opacity:1}75%{transform:scale(.99,1.015)}100%{transform:none}}
@keyframes tdm-boss-arrive{0%{transform:translateY(-10px) scale(.98,1.02);opacity:.5}32%{transform:translateY(3px) scale(1.08,.9);opacity:1}55%{transform:translateY(-2px) scale(.98,1.025)}80%{transform:translateY(1px) scale(1.015,.985)}100%{transform:none}}
@keyframes tdm-arrival-ring{0%{transform:translate(-50%,-50%) scale(.45);opacity:0}30%{opacity:.85}100%{transform:translate(-50%,-50%) scale(1.4);opacity:0}}
@keyframes tdm-armor-break{0%{transform:translate(-50%,-50%) scale(.7);opacity:0}20%{opacity:1}100%{transform:translate(-50%,35%) scale(1.6) rotate(18deg);opacity:0}}
/* Gates come last so independently articulated pieces obey the same controls. */
.td-motion-enabled[data-motion-state=paused] .td-motion-part{animation-play-state:paused!important}
.td-motion-enabled[data-motion-level=reduced] .td-motion-part,.td-motion-enabled[data-effects=reduced] .td-motion-part{animation:none!important;transform:none!important}
.td-motion-enabled[data-motion-level=reduced] .td-sprite,.td-motion-enabled[data-motion-level=reduced] .td-enemy-sprite,.td-motion-enabled[data-effects=reduced] .td-sprite,.td-motion-enabled[data-effects=reduced] .td-enemy-sprite{translate:none!important;transition:none!important}
.td-motion-enabled[data-motion-level=reduced] .td-motion-damage,.td-motion-enabled[data-effects=reduced] .td-motion-damage{display:block!important;animation:none!important;animation-name:none!important;transform:translate(-50%,-100%);font-size:14px}
.td-motion-enabled[data-motion-level=reduced] .td-shot:before,.td-motion-enabled[data-effects=reduced] .td-shot:before{display:none}
@media(prefers-reduced-motion:reduce){.td-motion-enabled .td-motion-part{animation:none!important;transform:none!important}.td-motion-enabled .td-sprite,.td-motion-enabled .td-enemy-sprite{translate:none!important;transition:none!important}.td-motion-enabled .td-motion-damage{display:block!important;animation:none!important;transform:translate(-50%,-100%);font-size:14px}.td-motion-enabled .td-shot:before{display:none}}
