/* Rizo Defense v81 — professional art direction + cohesion pass */
:root{--v81-ink:#17151b;--v81-paper:#fff3d6;--v81-panel:#1d1922;--v81-panel2:#2b2531;--v81-cyan:#31c7f4;--v81-gold:#ffd45a;--v81-heart:#ff6f87;--v81-green:#73e890}

/* One chassis language: restrained dark hardware, bright game objects. */
.defense-shell{gap:.4rem;background:radial-gradient(circle at 50% 34%,#292330 0,#141118 44%,#08070b 78%);}
.defense-stage-frame{border:2px solid #302936;border-radius:20px;background:#070609;box-shadow:0 0 0 1px #0c0a0e,inset 0 0 0 1px rgb(255 255 255/.045),0 16px 34px rgb(0 0 0/.28)}
.defense-world{border-radius:16px;box-shadow:0 0 0 2px var(--v81-ink),0 12px 28px rgb(0 0 0/.28);--road-border:#5a4939;--road-fill:#bca77b;--road-light:rgb(255 246 219/.23);--road-texture:rgb(52 40 31/.13)}
.defense-world::after{box-shadow:inset 0 0 0 1px rgb(255 255 255/.05),inset 0 0 38px rgb(4 2 8/.24)}

/* HUD objects */
.defense-command-deck{gap:.4rem;align-items:center}.defense-command-world{min-height:58px;padding:.5rem .65rem;border:1.5px solid #39313f;border-radius:16px;background:linear-gradient(#2a2430,#1d1921);box-shadow:0 3px 0 #0f0d12,0 9px 20px rgb(0 0 0/.18)}
.defense-command-mark{width:38px;height:38px;flex-basis:38px;filter:drop-shadow(0 3px 0 rgb(0 0 0/.35))}.defense-command-world small{color:#aaa0ae;font-size:.6rem;letter-spacing:.09em}.defense-command-world b{font-size:1.18rem;letter-spacing:-.025em}.defense-command-world em{color:#d7cfdb;font-size:.68rem}
.defense-hud{gap:.4rem}.defense-stat{min-width:88px;min-height:58px;padding:.2rem .55rem;border:2px solid var(--v81-ink);border-radius:21px;box-shadow:0 4px 0 var(--v81-ink),inset 0 0 0 2px rgb(255 255 255/.2),0 9px 17px rgb(0 0 0/.16)}
.defense-stat::before{content:"";position:absolute;inset:4px;border-radius:15px;border-top:1px solid rgb(255 255 255/.35);pointer-events:none}.defense-stat>b{font-family:var(--def-font-display);font-size:clamp(1.2rem,4vw,1.65rem);letter-spacing:-.055em}.defense-stat>small{font-size:.52rem;letter-spacing:.12em;opacity:.72}.defense-stat>i{width:31px;height:31px}
.defense-stat-lives{background:linear-gradient(160deg,#ff8297,#ff6580 68%,#e94f6b)}.defense-stat-cash{background:linear-gradient(160deg,#ffe776,#ffd24f 65%,#efb92d)}

/* Utility controls recede; START remains a game action. */
.defense-command-actions{gap:.36rem}.defense-command-actions button:not(.defense-wave-button){border:1.5px solid #403647;border-radius:14px;background:linear-gradient(#302936,#251f2b);box-shadow:0 3px 0 #111014,0 7px 14px rgb(0 0 0/.13);color:#f8f1fb;transition:transform .12s ease,background .12s ease,border-color .12s ease}
.defense-command-actions button:not(.defense-wave-button):active{transform:translateY(2px);box-shadow:0 1px 0 #111014}.defense-command-actions button.active,.defense-command-actions button[aria-expanded="true"]{background:linear-gradient(#5ad5fa,#2dbbe9);border-color:#182c34;color:#09161b}.defense-action-label{font-weight:850;letter-spacing:.04em}
.defense-stage-frame>.defense-wave-button{border:2px solid #14251b;border-radius:17px;background:linear-gradient(#83ef9f,#61dc83);color:#102016;box-shadow:0 5px 0 #17311f,0 12px 24px rgb(0 0 0/.22),inset 0 1px rgb(255 255 255/.38);font-family:var(--def-font-display);font-size:.92rem;letter-spacing:.01em}.defense-stage-frame>.defense-wave-button.running{background:linear-gradient(#ff8094,#ef5b74);border-color:#3a1720;box-shadow:0 5px 0 #451923,0 12px 24px rgb(0 0 0/.22)}.defense-stage-frame>.defense-wave-button.paused{background:linear-gradient(#ffe476,#ffc941);border-color:#40300e;box-shadow:0 5px 0 #5a4314,0 12px 24px rgb(0 0 0/.22)}

/* Field information behaves like glass overlays instead of desktop widgets. */
.defense-wave-banner{top:.5rem;left:.5rem;padding:.34rem .5rem;border:1.5px solid #39313e;border-radius:14px;background:rgb(18 15 22/.82);backdrop-filter:blur(8px);box-shadow:0 3px 0 rgb(10 8 12/.78),0 8px 20px rgb(0 0 0/.12)}.defense-wave-count>b{font-family:var(--def-font-display);font-size:1.18rem}.defense-phase-indicator{border:0;background:rgb(255 255 255/.045);border-radius:9px}.defense-field-feed{min-height:42px}.defense-message,.defense-live-status,.defense-boss-bar{min-height:42px;border:1.5px solid #37303d;border-radius:13px;background:rgb(25 21 29/.92);box-shadow:0 3px 0 #0f0d12,0 7px 15px rgb(0 0 0/.12)}.defense-message{padding:.42rem .62rem}.defense-message b{font-size:.72rem;letter-spacing:.035em}.defense-message span{font-size:.72rem;color:#cbc3d0}.defense-wave-preview{min-height:36px;border:1px solid #39313f;border-radius:12px;background:rgb(28 24 33/.86);box-shadow:0 2px 0 #111014}

/* Roster and inspector share the same card family. */
.defense-roster-card{border:1.5px solid #3d3444;border-radius:16px;background:linear-gradient(#302936,#241f2a);box-shadow:0 3px 0 #111014,0 8px 18px rgb(0 0 0/.15);overflow:hidden}.defense-roster-card::after{content:"";position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--pet-color,var(--field-accent));opacity:.95}.defense-roster-card .rizo-pet-shell{filter:drop-shadow(0 5px 3px rgb(0 0 0/.28))}
.defense-tower-panel,.defense-ability-tray,.defense-intel-tray,.defense-field-menu{border:1.5px solid #413647;background:linear-gradient(rgba(37,31,43,.98),rgba(24,20,29,.985));box-shadow:0 -12px 34px rgb(0 0 0/.34),inset 0 1px rgb(255 255 255/.035);backdrop-filter:blur(14px)}.defense-tower-panel.v79-tower-shop{border-radius:20px 20px 0 0}.defense-tower-panel [data-defense-sell]{min-width:58px;min-height:34px;padding:.22rem .5rem;border:1.5px solid #581c27;border-radius:10px;background:linear-gradient(#ef6377,#d94860);color:#fff;box-shadow:0 3px 0 #471722;font-size:.72rem}

/* Route no longer eats the environment. */
.defense-road-shadow{stroke-width:128}.defense-road-border{stroke-width:116}.defense-road-fill{stroke-width:103}.defense-road-edge-light{stroke-width:3.4;stroke-dasharray:12 34}.defense-road-stitch{stroke-width:3.2;stroke-dasharray:10 27}.defense-map-landmarks,.defense-obstacles{z-index:4}.defense-route-markers{z-index:5}.defense-landmark{filter:drop-shadow(0 4px 0 rgb(23 21 27/.28)) drop-shadow(0 7px 7px rgb(0 0 0/.15))}.defense-landmark span{border:1px solid rgb(23 21 27/.52);background:rgb(22 18 25/.7);color:#eee3ef;backdrop-filter:blur(5px);letter-spacing:.08em}

/* PINE BEND — authored storybook forest */
.defense-world.map-grove{--road-border:#65503a;--road-fill:#c1a97a;background:linear-gradient(#a4d0b5 0 23%,#6da274 56%,#487b50)}.defense-world.map-grove .defense-sky{opacity:1;background:linear-gradient(#b4dfcf 0 27%,transparent 62%)}.defense-world.map-grove .defense-hills{background:radial-gradient(ellipse at 18% 16%,#7fb285 0 18%,transparent 18.5%),radial-gradient(ellipse at 82% 13%,#65976d 0 22%,transparent 22.5%)}.defense-world.map-grove .defense-trees{opacity:.96;background:radial-gradient(ellipse at 5% 25%,#234c32 0 7%,transparent 7.4%),radial-gradient(ellipse at 11% 18%,#397044 0 6%,transparent 6.4%),radial-gradient(ellipse at 93% 28%,#214a31 0 8%,transparent 8.4%),radial-gradient(ellipse at 86% 18%,#3c7548 0 6.5%,transparent 6.9%),radial-gradient(ellipse at 5% 84%,#21492f 0 9%,transparent 9.4%),radial-gradient(ellipse at 95% 82%,#2a5737 0 9%,transparent 9.4%)}.defense-world.map-grove .defense-map-props{background:radial-gradient(ellipse at 8% 56%,#6a452e 0 4%,#3e2b22 4.3% 5%,transparent 5.4%),radial-gradient(ellipse at 94% 43%,#704930 0 4.6%,#422e23 4.9% 5.7%,transparent 6%),radial-gradient(circle at 12% 68%,#f46e6a 0 1.1%,transparent 1.4%),radial-gradient(circle at 16% 72%,#ffd45a 0 1%,transparent 1.3%),radial-gradient(circle at 84% 17%,#ff8c4c 0 1%,transparent 1.3%)}

/* EMBER — charcoal, iron, fire seams */
.defense-world.map-ember{--road-border:#503b34;--road-fill:#8d7060;background:linear-gradient(#76584f,#4d3b38 50%,#302728)}.defense-world.map-ember .defense-sky{opacity:1;background:linear-gradient(#93695a 0 27%,transparent 62%)}.defense-world.map-ember .defense-hills{background:radial-gradient(ellipse at 23% 18%,#6e4940 0 18%,transparent 18.5%),radial-gradient(ellipse at 77% 14%,#573b37 0 24%,transparent 24.5%)}.defense-world.map-ember .defense-map-props{background:radial-gradient(circle at 12% 17%,#f87a45 0 1.4px,transparent 2.4px),radial-gradient(circle at 85% 20%,#ffb553 0 1.3px,transparent 2.3px),radial-gradient(circle at 73% 72%,#f45c38 0 1.3px,transparent 2.3px)}.landmark-lava-crater{border-color:#4d2722;background:#211516;box-shadow:inset 0 0 0 5px #e7683a,inset 0 0 0 11px #421d1b,0 0 11px rgb(255 89 48/.18)}

/* MOON — lavender stone and silver pools */
.defense-world.map-moon{--road-border:#5a5369;--road-fill:#948ba8;background:linear-gradient(#8584a6,#5b607e 52%,#414965)}.defense-world.map-moon .defense-sky{opacity:1;background:linear-gradient(#a5a2c6 0 28%,transparent 64%)}.defense-world.map-moon .defense-hills{background:radial-gradient(ellipse at 18% 15%,#777ba1 0 18%,transparent 18.5%),radial-gradient(ellipse at 81% 13%,#65698d 0 22%,transparent 22.5%)}.defense-world.map-moon .defense-map-props{background:radial-gradient(circle at 9% 12%,rgb(255 246 210/.8) 0 1px,transparent 1.8px),radial-gradient(circle at 82% 18%,rgb(255 246 210/.7) 0 1px,transparent 1.8px),radial-gradient(circle at 92% 67%,rgb(178 220 255/.8) 0 1px,transparent 1.8px)}

/* STORM — wet steel and charge */
.defense-world.map-storm{--road-border:#42525a;--road-fill:#74858a;background:linear-gradient(#71878e,#455e65 52%,#314b52)}.defense-world.map-storm .defense-sky{opacity:1;background:linear-gradient(#7c949e 0 27%,transparent 64%)}.defense-world.map-storm .defense-hills{background:linear-gradient(166deg,transparent 0 40%,rgb(21 45 54/.2) 41% 44%,transparent 45%),radial-gradient(ellipse at 17% 17%,#557078 0 18%,transparent 18.5%),radial-gradient(ellipse at 78% 13%,#415f68 0 21%,transparent 21.5%)}.defense-world.map-storm .defense-map-props{background:radial-gradient(ellipse at 10% 70%,rgb(125 201 215/.23) 0 5%,transparent 5.4%),radial-gradient(ellipse at 86% 29%,rgb(125 201 215/.21) 0 4%,transparent 4.4%),radial-gradient(circle at 74% 62%,#aaf5ff 0 1px,transparent 2px)}.landmark-storm-coil{border-color:#304e58;background:#1c3238;box-shadow:inset 0 0 0 5px #a9dce4,inset 0 0 0 10px #29464f,0 0 10px rgb(90 215 240/.2)}

/* WHITEOUT — frosted rock, snow shelf */
.defense-world.map-blizzard{--road-border:#77939b;--road-fill:#b6c8c8;background:linear-gradient(#d0e1e3,#9dbac0 52%,#789da7)}.defense-world.map-blizzard .defense-sky{opacity:1;background:linear-gradient(#eef8f8 0 31%,transparent 68%)}.defense-world.map-blizzard .defense-hills{background:radial-gradient(ellipse at 16% 18%,#b4ced2 0 21%,transparent 21.5%),radial-gradient(ellipse at 83% 14%,#94b5bd 0 23%,transparent 23.5%)}.defense-world.map-blizzard .defense-map-props{background:radial-gradient(circle at 14% 18%,#fff 0 1px,transparent 2px),radial-gradient(circle at 62% 27%,#fff 0 1px,transparent 2px),radial-gradient(circle at 82% 73%,#fff 0 1px,transparent 2px),linear-gradient(156deg,transparent 0 72%,rgb(224 245 247/.25) 73% 75%,transparent 76%)}.landmark-ice-shelf,.landmark-snow-peak{outline:2px solid #698e96}

/* ECLIPSE — void rock and magenta fracture light */
.defense-world.map-eclipse{--road-border:#413247;--road-fill:#6f5a73;background:linear-gradient(#4b3e58,#2a2637 50%,#181822)}.defense-world.map-eclipse .defense-sky{opacity:1;background:linear-gradient(#5e4c69 0 26%,transparent 62%)}.defense-world.map-eclipse .defense-hills{background:radial-gradient(ellipse at 17% 16%,#382d45 0 20%,transparent 20.5%),radial-gradient(ellipse at 81% 13%,#30293d 0 24%,transparent 24.5%)}.defense-world.map-eclipse .defense-map-props{background:radial-gradient(circle at 22% 21%,#d86da9 0 1px,transparent 2px),radial-gradient(circle at 73% 32%,#a35c93 0 1px,transparent 2px),radial-gradient(circle at 65% 79%,#e575b4 0 1px,transparent 2px),linear-gradient(70deg,transparent 0 80%,rgb(255 117 190/.12) 80.5% 81%,transparent 81.5%)}.landmark-eclipse-obelisk,.landmark-eclipse-rift{outline:2px solid #211526}.landmark-eclipse-rift{box-shadow:inset 0 0 0 5px #8b477f,inset 0 0 0 10px #24142a,0 0 14px rgb(255 117 190/.18)}

/* Towers read by silhouette first; upgrade state is visible at a glance. */
.defense-tower .rizo-pet-shell{filter:drop-shadow(0 4px 0 rgb(23 21 27/.62)) drop-shadow(0 7px 7px rgb(0 0 0/.18))}.defense-tier-2 .defense-aura{opacity:.42;filter:blur(.5px)}.defense-tier-3 .defense-aura{opacity:.62;filter:blur(1px);box-shadow:0 0 12px var(--tower-color)}.defense-tier-4 .defense-aura{opacity:.82;filter:blur(1px);box-shadow:0 0 18px var(--tower-color),0 0 28px color-mix(in srgb,var(--tower-color) 40%,transparent)}.defense-super-power .defense-aura,.defense-super-control .defense-aura{opacity:1;box-shadow:0 0 24px var(--tower-color),0 0 42px color-mix(in srgb,var(--tower-color) 55%,transparent)}
.defense-enemy{filter:drop-shadow(0 3px 0 rgb(23 21 27/.28)) drop-shadow(0 5px 5px rgb(0 0 0/.13))}.defense-boss-bar{border-color:#594430;background:linear-gradient(90deg,rgba(39,27,30,.96),rgba(29,23,31,.96));box-shadow:0 3px 0 #17151b,0 0 20px rgb(255 212 90/.08)}

/* Lobby and menus use the same chassis language. */
.defense-world-lobby-simple{border:1.5px solid #403647;border-radius:24px;background:linear-gradient(#28222e,#17141b);box-shadow:0 20px 55px rgb(0 0 0/.38),inset 0 1px rgb(255 255 255/.04)}.defense-lobby-brand.v79{padding-bottom:.7rem;border-bottom:1px solid #403647}.defense-world-hero{overflow:hidden;border:1.5px solid #44394a;border-radius:20px;background:linear-gradient(135deg,color-mix(in srgb,var(--map-accent) 15%,#27212e),#1b171f 62%);box-shadow:0 4px 0 #0f0d12,0 10px 22px rgb(0 0 0/.15)}.defense-world-hero-map{position:relative;overflow:hidden;border-radius:16px;background:radial-gradient(circle at 45% 35%,color-mix(in srgb,var(--map-accent) 25%,#44384c),#1b171f 72%)}.defense-world-hero-map>strong{opacity:.16;filter:blur(.2px);font-size:5rem;transform:rotate(-8deg) scale(1.15)}.defense-mini-route{filter:drop-shadow(0 3px 0 rgb(0 0 0/.28));opacity:.95}.defense-world-picks{gap:.4rem}.defense-world-pick{border:1.5px solid #403647;border-radius:14px;background:linear-gradient(#2d2633,#211c26);box-shadow:0 3px 0 #0f0d12;transition:transform .12s ease,border-color .12s ease}.defense-world-pick.selected{border-color:var(--map-accent);background:linear-gradient(color-mix(in srgb,var(--map-accent) 23%,#312838),#211c26);box-shadow:0 3px 0 #0f0d12,0 0 0 2px color-mix(in srgb,var(--map-accent) 35%,transparent)}.defense-world-pick>b{color:var(--map-accent)}
.defense-field-menu-grid button,.defense-extra-grid button{border:1.5px solid #413748;border-radius:14px;background:linear-gradient(#302936,#241f2a);box-shadow:0 3px 0 #111014}.defense-sheet-title small{color:var(--v81-cyan);letter-spacing:.13em}.defense-sheet-title b{font-family:var(--def-font-display);letter-spacing:-.02em}

/* Phase 1: Pine Bend, printed terrain and responsive combat poses. */
.defense-world.map-grove{--road-border:#746044;--road-fill:#d3b88a;--road-shadow:#536849;--road-light:#edd4a4;--road-texture:#aa865d;background:#92a878 url('./assets/defense-pine-bend.svg') center/100% 100% no-repeat}
.defense-world.map-grove :is(.defense-sky,.defense-hills,.defense-trees,.defense-map-props){display:none}
.defense-world.map-grove .defense-road-shadow{stroke-width:80;opacity:.5;transform:translateY(5px)}
.defense-world.map-grove .defense-road-border{stroke-width:70}
.defense-world.map-grove .defense-road-fill{stroke-width:63}
.defense-world.map-grove .defense-road-edge-light{stroke-width:48;stroke-dasharray:none;opacity:.25}
.defense-world.map-grove .defense-road-stitch{stroke-width:2;stroke-dasharray:2 19 5 31;opacity:.65}
.defense-world.map-grove .defense-road path{vector-effect:none}
.defense-world.map-grove .defense-landmark{filter:drop-shadow(2px 5px 0 #354d3a55)}
.defense-world.map-grove .defense-build-pocket{background:#c4c38c45;border-color:#e5d8a875;box-shadow:none}
.defense-tower.firing .defense-rizo{transform-origin:50% 80%;animation:rizo-foundation-fire var(--attack-life,.21s) cubic-bezier(.16,.8,.3,1)}
@keyframes rizo-foundation-fire{0%{transform:translate(0,0) scale(1)}18%{transform:translate(var(--kick-x,0px),var(--kick-y,3px)) scale(1.12,.88)}48%{transform:translate(0,-2px) scale(.94,1.07)}76%{transform:translate(0,1px) scale(1.03,.98)}100%{transform:translate(0,0) scale(1)}}
body.reduce-motion .defense-tower.firing .defense-rizo{animation:none}
@media(prefers-reduced-motion:reduce){.defense-tower.firing .defense-rizo{animation:none}}

/* The DOM fallback shares the same ink language. */
.defense-shot{background:var(--signature-color,#fff2cf);box-shadow:none}
.defense-impact.impact-pop::after{width:25px;height:25px;border:0;border-radius:0;background:#fff2cf;clip-path:polygon(50% 0,59% 32%,85% 12%,69% 42%,100% 50%,69% 60%,85% 88%,59% 69%,50% 100%,40% 69%,12% 87%,31% 60%,0 50%,31% 41%,12% 12%,40% 31%)}
.defense-world.map-grove :is(.landmark-pine-grove,.obstacle-pine){visibility:hidden}


/* Visual nuance pass — attacks have authored weight instead of one shared bob. */
.defense-tower.firing .defense-rizo{transform-origin:50% 82%;will-change:transform}
.defense-tower.attack-classic.firing .defense-rizo{animation:rizo-nuance-snap var(--attack-life,.21s) cubic-bezier(.16,.82,.28,1)}
.defense-tower.attack-ember.firing .defense-rizo{animation:rizo-nuance-ember var(--attack-life,.23s) cubic-bezier(.12,.72,.25,1)}
.defense-tower.attack-violet.firing .defense-rizo{animation:rizo-nuance-violet var(--attack-life,.24s) cubic-bezier(.2,.8,.2,1)}
.defense-tower.attack-frost.firing .defense-rizo{animation:rizo-nuance-frost var(--attack-life,.22s) cubic-bezier(.15,.75,.22,1)}
.defense-tower.attack-obsidian.firing .defense-rizo{animation:rizo-nuance-heavy var(--attack-life,.255s) cubic-bezier(.18,.68,.22,1)}
@keyframes rizo-nuance-snap{0%{transform:translate(0,0) scale(1)}20%{transform:translate(var(--kick-x),var(--kick-y)) scale(1.08,.92)}43%{transform:translate(var(--lunge-x),var(--lunge-y)) scale(.96,1.06)}72%{transform:translate(0,-1px) scale(1.02,.99)}100%{transform:none}}
@keyframes rizo-nuance-ember{0%{transform:none}16%{transform:translate(var(--kick-x),var(--kick-y)) scale(1.13,.86) rotate(-2deg)}36%{transform:translate(var(--lunge-x),var(--lunge-y)) scale(.91,1.10) rotate(2deg)}58%{transform:translate(var(--soft-kick-x),var(--soft-kick-y)) scale(1.04,.97)}100%{transform:none}}
@keyframes rizo-nuance-violet{0%{transform:none}22%{transform:translate(var(--soft-kick-x),var(--soft-kick-y)) scale(.95,1.06) rotate(-3deg)}41%{transform:translate(var(--lunge-x),var(--lunge-y)) scale(1.07,.94) rotate(2deg)}61%{transform:translate(-1px,1px) rotate(-2deg)}76%{transform:translate(1px,-1px) rotate(1deg)}100%{transform:none}}
@keyframes rizo-nuance-frost{0%{transform:none}25%{transform:translate(var(--soft-kick-x),var(--soft-kick-y)) scale(1.07,.93)}46%{transform:translate(var(--lunge-x),var(--lunge-y)) scale(.94,1.08)}70%{transform:translate(0,-2px) scale(1.01,1.02)}100%{transform:none}}
@keyframes rizo-nuance-heavy{0%{transform:none}24%{transform:translate(var(--heavy-kick-x),var(--heavy-kick-y)) scale(1.15,.84) rotate(-3deg)}46%{transform:translate(var(--heavy-lunge-x),var(--heavy-lunge-y)) scale(.90,1.13) rotate(2deg)}68%{transform:translate(var(--soft-kick-x),var(--soft-kick-y)) scale(1.06,.95)}100%{transform:none}}

/* DOM fallback mirrors the canvas material language. */
.defense-shot.shot-ember{width:16px;height:10px;border-radius:65% 20% 65% 20%;clip-path:polygon(100% 50%,55% 0,62% 34%,0 18%,35% 50%,0 82%,62% 66%);background:#ff6536;border-color:#432018;box-shadow:-7px 0 0 -3px #ffd45a}
.defense-shot.shot-void{width:11px;height:11px;border-radius:2px;rotate:45deg;background:#a66ee8;border-color:#2b1838;box-shadow:0 0 0 2px #e6cbff66}
.defense-shot.shot-frost{width:15px;height:9px;border-radius:1px;clip-path:polygon(100% 50%,18% 100%,0 50%,18% 0);background:#dffcff;border-color:#315c66}
.defense-shot.shot-stone{width:14px;height:13px;border-radius:3px;clip-path:polygon(62% 0,100% 31%,82% 100%,15% 86%,0 28%);background:#55505b;border-color:#17151b}
.defense-impact.impact-muzzle{width:34px;height:24px;translate:-12% -50%;rotate:var(--impact-angle);animation:def-impact-v77 var(--impact-life,.14s) ease-out forwards}
.defense-impact.impact-muzzle::after{display:none}.defense-impact.impact-muzzle::before{left:8px;width:20px;height:4px;border-radius:99px;background:var(--impact-color);box-shadow:none;transform-origin:left center;clip-path:polygon(0 38%,65% 38%,48% 0,100% 50%,48% 100%,65% 62%,0 62%)}
.defense-impact.impact-muzzle.impact-variant-ember::before{height:13px;background:#ff6536;clip-path:polygon(0 42%,50% 34%,68% 0,73% 35%,100% 50%,72% 65%,66% 100%,49% 66%,0 58%)}
.defense-impact.impact-muzzle.impact-variant-violet::before{height:11px;background:#c59cff;clip-path:polygon(0 46%,35% 46%,51% 0,60% 42%,100% 50%,59% 58%,47% 100%,34% 54%,0 54%)}
.defense-impact.impact-muzzle.impact-variant-frost::before{height:12px;background:#dffcff;clip-path:polygon(0 45%,47% 45%,65% 0,70% 42%,100% 50%,70% 58%,65% 100%,47% 55%,0 55%)}
.defense-impact.impact-muzzle.impact-variant-obsidian::before{width:22px;height:12px;background:#655e62;clip-path:polygon(0 35%,30% 20%,55% 35%,75% 0,100% 50%,75% 100%,55% 65%,30% 80%,0 65%)}
.defense-impact.impact-pop::before{background:var(--impact-color);box-shadow:0 -11px 0 -3px var(--impact-color),10px -3px 0 -3px var(--impact-color),7px 9px 0 -3px var(--impact-color),-7px 9px 0 -3px var(--impact-color),-10px -3px 0 -3px var(--impact-color)}
body.reduce-motion .defense-tower.firing .defense-rizo{animation:none}
@media(prefers-reduced-motion:reduce){.defense-tower.firing .defense-rizo{animation:none}}


/* Inspection hotfix — Ember + balloon fallback polish. */
.defense-shot.shot-ember{width:18px;height:11px;border-radius:0;clip-path:polygon(100% 50%,67% 33%,58% 0,44% 31%,0 50%,44% 69%,58% 100%,67% 67%);background:linear-gradient(90deg,#241218 0 42%,#ff6a38 42% 100%);border-color:#4f271d;box-shadow:-8px 0 0 -3px #ffb25d,-12px 0 0 -5px #ffd86f}
.defense-impact.impact-ember::before{background:#ff6a38;box-shadow:0 0 0 2px #5a251a,inset 0 0 0 1px #ffd768,10px 2px 0 -5px #ff6a38,-10px 4px 0 -5px #ff6a38,0 -11px 0 -5px #ff6a38}
.defense-impact.impact-ember::after{width:34px;height:34px;border:2px solid rgba(83,40,30,.55);border-radius:50%;background:transparent}


/* Pop prestige pass — DOM fallback gets asymmetry, punch, and family-specific breakup language. */
.defense-impact.impact-pop,.defense-impact.impact-bubble{animation:def-impact-pop-rich var(--impact-life,.36s) cubic-bezier(.14,.78,.22,1) forwards;transform-origin:center center}
.defense-impact.impact-pop::before,.defense-impact.impact-bubble::before{width:10px;height:10px;border-radius:50%;background:var(--impact-color);box-shadow:0 -13px 0 -4px var(--impact-color),11px -4px 0 -4px var(--impact-color),8px 10px 0 -4px var(--impact-color),-8px 10px 0 -4px var(--impact-color),-11px -4px 0 -4px var(--impact-color)}
.defense-impact.impact-pop::after,.defense-impact.impact-bubble::after{width:28px;height:18px;border:2px solid color-mix(in srgb,var(--impact-color) 76%,#fff);border-radius:50%;background:transparent;rotate:var(--impact-angle)}
.defense-impact.impact-pop.impact-enemy-fire::before{background:#ff6a38;box-shadow:0 -14px 0 -5px #ffd768,12px -2px 0 -5px #ff6a38,8px 10px 0 -5px #ff6a38,-8px 10px 0 -5px #ffd768,-11px -3px 0 -5px #ff6a38}
.defense-impact.impact-pop.impact-enemy-storm::before{background:#ffe56b;box-shadow:12px -3px 0 -6px #fff3b0,-11px 5px 0 -6px #ffe56b,0 -13px 0 -6px #fff3b0}
.defense-impact.impact-pop.impact-enemy-shell::before,.defense-impact.impact-pop.impact-enemy-lead::before,.defense-impact.impact-pop.impact-enemy-brick::before{width:9px;height:9px;border-radius:2px;rotate:18deg}
.defense-impact.impact-bubble.impact-enemy-split::before{background:rgba(255,255,255,.72);box-shadow:0 -13px 0 -4px rgba(255,201,235,.88),11px -4px 0 -4px rgba(255,255,255,.58),8px 10px 0 -4px rgba(255,201,235,.88),-8px 10px 0 -4px rgba(255,255,255,.58),-11px -4px 0 -4px rgba(255,201,235,.88)}
@keyframes def-impact-pop-rich{0%{opacity:0;transform:translate(calc(var(--impact-bias-x,0) * -3px),calc(var(--impact-bias-y,0) * -3px)) scale(.44,.72) rotate(-12deg)}18%{opacity:1;transform:translate(0,0) scale(1.14,.90) rotate(calc(var(--impact-angle,0rad) * .45))}48%{opacity:1;transform:translate(calc(var(--impact-bias-x,0) * 4px),calc(var(--impact-bias-y,0) * 4px)) scale(1.02,1.08) rotate(calc(var(--impact-angle,0rad) * .85))}100%{opacity:0;transform:translate(calc(var(--impact-bias-x,0) * 9px),calc(var(--impact-bias-y,0) * 9px)) scale(1.78,.94) rotate(calc(var(--impact-angle,0rad) + 14deg))}}

/* Catch-pass: enemy body pop reactions now match pop family instead of sharing one reaction. */
.defense-enemy.popped.pop-heavy{animation-duration:.38s}
.defense-enemy.popped.pop-heavy .balloon-body{filter:drop-shadow(0 4px 0 rgba(20,10,20,.24))}
.defense-enemy.popped.pop-fleet{animation-duration:.28s}
.defense-enemy.popped.pop-fleet .balloon-string,.defense-enemy.popped.pop-fleet .balloon-knot{opacity:.7;transform:translate(4px,-2px) rotate(14deg)}
.defense-enemy.popped.pop-split .balloon-body{box-shadow:inset 0 0 0 2px rgba(255,255,255,.35),0 0 0 1px var(--play-halo)}
.defense-enemy.popped.pop-fire .balloon-body::after{opacity:1;background:radial-gradient(circle at 28% 82%,#fff2a6 0 6%,#ff8a3d 7% 12%,transparent 13%),radial-gradient(circle at 67% 58%,#ffd069 0 5%,#ff6b32 6% 11%,transparent 12%);animation:def-status-ember .22s steps(2,end) 2}

/* Catch-pass: DOM impact family language gets the same specificity as canvas. */
.defense-impact.impact-pop.impact-enemy-fleet::after{width:34px;height:11px;border-radius:999px;rotate:var(--impact-angle);border-color:color-mix(in srgb,var(--impact-color) 82%,#fff)}
.defense-impact.impact-pop.impact-enemy-fleet::before{width:9px;height:9px;border-radius:1px;clip-path:polygon(0 50%,42% 0,100% 50%,42% 100%);box-shadow:0 -13px 0 -4px #fff2cf,11px -4px 0 -4px var(--impact-color),8px 10px 0 -4px #fff2cf,-8px 10px 0 -4px var(--impact-color),-11px -4px 0 -4px #fff2cf}
.defense-impact.impact-pop.impact-enemy-shell::after,.defense-impact.impact-pop.impact-enemy-lead::after,.defense-impact.impact-pop.impact-enemy-brick::after{width:25px;height:25px;border-radius:4px;rotate:calc(var(--impact-angle) + 14deg)}
.defense-impact.impact-pop.impact-enemy-storm::after{width:31px;height:14px;border-radius:999px;rotate:calc(var(--impact-angle) - 10deg)}
.defense-impact.impact-bubble.impact-enemy-split::after{width:31px;height:31px;border-radius:50%;border-style:dashed;rotate:0deg}
.defense-impact.impact-pop.impact-enemy-fire::after{width:30px;height:20px;border-radius:60% 45% 60% 45%;rotate:calc(var(--impact-angle) + 6deg)}
