/* Visual effects pack (visual-fx.js). Fixed pooled nodes; transform/opacity/clip-path only. */
.vfx-layer{position:absolute;inset:0;pointer-events:none;z-index:11}
.vfx-ash{position:absolute;display:block;opacity:0;
 -webkit-mask:var(--vfx-mask) center bottom/contain no-repeat;mask:var(--vfx-mask) center bottom/contain no-repeat}
.vfx-mote{position:absolute;display:block;opacity:0;border-radius:0;will-change:transform,opacity}
.vfx-ash[hidden],.vfx-mote[hidden]{display:none}
/* 2. hit impact */
.vfx-streak{position:absolute;display:block;width:1.1rem;height:2px;margin:-1px 0 0 -.55rem;opacity:0;z-index:19;pointer-events:none;will-change:transform,opacity;
 background:linear-gradient(90deg,transparent,#ffd9a0 35%,#fff6e0 60%,transparent)}
.vfx-streak.vfx-critical{width:1.9rem;height:3px;margin:-1.5px 0 0 -.95rem;background:linear-gradient(90deg,transparent,#ffb347 30%,#fff3c4 62%,transparent)}
.vfx-ring{position:absolute;display:block;border-radius:50%;border:2px solid #ffd27a;box-shadow:0 0 0 1px #7a2c0a66;opacity:0;z-index:19;pointer-events:none;will-change:transform,opacity}
.vfx-glow{position:absolute;display:block;border-radius:50%;opacity:0;z-index:18;pointer-events:none;will-change:transform,opacity;
 background:radial-gradient(closest-side,#fff1c8cc,#ffb0478c 38%,#ff6a1a33 62%,transparent 72%)}
.vfx-streak[hidden],.vfx-ring[hidden],.vfx-glow[hidden]{display:none}
/* damage numbers with more character: critical in struck gold with a dark-red edge, normal in ivory */
.app-frame #battlefield .combat-number.float-damage:not(.crit):not(.boss-damage){color:#f4ead6;text-shadow:0 2px 0 #000,0 0 .3em #000c}
.app-frame #battlefield .combat-number.float-damage.crit:not(.boss-damage){color:#ffcf5a;font-weight:900;letter-spacing:.01em;
 text-shadow:0 2px 0 #4a1400,1px 0 0 #4a1400,-1px 0 0 #4a1400,0 -1px 0 #4a1400,0 0 .45em #ff7a1a99}
.app-frame #battlefield .combat-number.crit[data-caption]::before{color:#ffe7a8;border-color:#b5701f;background:#3a1505e6;letter-spacing:.14em}
/* 3. vitality: edge vignettes over the whole frame (opacity only) and heal motes */
.vfx-edge{position:absolute;inset:0;z-index:45;pointer-events:none;opacity:0;will-change:opacity}
.vfx-danger{background:radial-gradient(ellipse 78% 74% at 50% 50%,transparent 64%,rgb(150 8 14 / .42) 86%,rgb(120 0 8 / .8) 100%)}
.vfx-mend{background:radial-gradient(ellipse 78% 74% at 50% 50%,transparent 62%,rgb(70 170 90 / .3) 86%,rgb(60 150 80 / .55) 100%)}
.vfx-heal-mote{position:absolute;display:block;width:5px;height:5px;margin:-2px 0 0 -2px;opacity:0;pointer-events:none;will-change:transform,opacity;
 background:radial-gradient(closest-side,#f2ffd8,#8fe07a 55%,transparent 75%);border-radius:50%}
.vfx-heal-mote:nth-child(3n){width:7px;height:7px;background:radial-gradient(closest-side,#fff7cf,#ffd76a 55%,transparent 75%)}
.vfx-edge[hidden],.vfx-heal-mote[hidden]{display:none}
