/* Feedback stays attached to the world; interface controls retain their own layer. */
#combat-vfx{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:3;contain:strict}#combat-vfx[hidden]{display:none!important}
body .attack-warning{border:1.5px solid #ffc19b;background:radial-gradient(ellipse,transparent 45%,#eb765627 72%,#ff946546 100%);box-shadow:0 0 0 3px #e7683920,inset 0 0 14px #f8733d18;opacity:calc(.48 + var(--charge,0)*.5)}
body .attack-warning::before{content:"";position:absolute;inset:8%;border:1px dashed #ffd8b88c;border-radius:50%;transform:scale(calc(.28 + var(--charge,0)*.72));opacity:calc(.3 + var(--charge,0)*.6)}
body .attack-warning::after{content:"";position:absolute;left:50%;top:50%;width:5px;height:5px;border-radius:50%;background:#ffe2ba;box-shadow:0 0 8px #ff925c;transform:translate(-50%,-50%)}
@media(prefers-reduced-motion:reduce){body .attack-warning::before{transform:scale(.92)}body .attack-warning{transition:none}}

/* The combat bars already identify the player; keep the impact area unobstructed. */
body.in-battle #label{display:none!important}
/* Zones des sorts (18/10/2026) : pastille de forme (barre, infobulle, grimoire) */
.rv-zone-ico polygon{fill:#ffffff14;stroke:#ffffff38;stroke-width:.6}
.rv-zone-ico polygon.on{fill:#ffb35c;stroke:#ffe2b0}
.is-ally .rv-zone-ico polygon.on{fill:#6fe0a0;stroke:#d8ffe6}
.is-single .rv-zone-ico polygon.on{fill:#e9d9b0;stroke:#fff}
.spell-slot .spell-zone{position:absolute;left:-5px;top:-6px;z-index:3;display:grid;place-items:center;width:18px;height:18px;border-radius:50%;background:#1a120ae8;border:1px solid #ffb35c;box-shadow:0 1px 3px #000a;pointer-events:auto}
.spell-slot .spell-zone.is-ally{border-color:#6fe0a0}
.rv-zone-block{display:flex;gap:10px;align-items:center;margin:8px 0;padding:8px 10px;border-radius:10px;background:#2a1c0e66;border:1px solid #ffb35c66}
.rv-zone-block.is-ally{border-color:#6fe0a066;background:#0e2a1c55}.rv-zone-block.is-single{border-color:#ffffff22;background:#ffffff08}
.rv-zone-block b{display:block;color:#ffd79a;font-size:13px}.rv-zone-block.is-ally b{color:#9df0c0}.rv-zone-block.is-single b{color:#efe2c4}
.rv-zone-block p{margin:2px 0 0;font-size:12px;line-height:1.35;color:#e8dcc2}
#rv-spell-tip .rv-zone-block{margin:6px 0 4px;padding:6px 8px}
.rv-zone-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 7px 1px 3px;border-radius:999px;border:1px solid #ffb35c88;background:#1a120acc;font-size:11px;color:#ffd79a}
.rv-zone-chip.is-ally{border-color:#6fe0a088;color:#9df0c0}.rv-zone-chip i{font-style:normal;opacity:.8}
.rv-zone-block>svg.rv-zone-ico{width:38px!important;height:38px!important;flex:none}
.spell-slot .spell-zone svg.rv-zone-ico{width:14px!important;height:14px!important}
.rv-zone-chip svg.rv-zone-ico{width:16px!important;height:16px!important}
/* Coups fatals annoncés (19/10/2026, combat-ui.js fatalPaint) : zone rouge qui pulse et se remplit pendant l'annonce (1,3 s),
   ⚠ + nom du sort au-dessus du monstre ; contour plus vif quand le joueur est dedans. Mouvement réduit : ni pulsation ni rebond. */
.fatal-zone{position:absolute;z-index:2;transform:translate(-50%,-50%);border-radius:50%;pointer-events:none;border:3px solid #ff3b2f;background:radial-gradient(ellipse,#ff2d1f47 0,#ff2d1f66 55%,#ff2d1fb3 100%);box-shadow:0 0 0 2px #ffffff2e,0 0 26px 6px #ff2d1f8c,inset 0 0 20px #ff5a3c80;opacity:calc(.8 + var(--charge,0)*.2);animation:rv-fatal-pulse .42s ease-in-out infinite alternate}
.fatal-zone>i{position:absolute;inset:0;border-radius:50%;background:radial-gradient(ellipse,#ff6a3ce6 0,#ff2d1fb3 58%,transparent 71%);transform:scale(var(--charge,0));opacity:.6}
.fatal-zone::after{content:"";position:absolute;inset:-10px;border-radius:50%;border:2px dashed #ffb4a3cc}
.fatal-zone.is-inside{box-shadow:0 0 0 3px #fff3,0 0 34px 10px #ff2d1fb3,inset 0 0 24px #ff5a3cb3}
.fatal-zone.is-inside::after{border-color:#ffe9a8;border-style:solid;border-width:2px;inset:-8px}
.fatal-callout{position:absolute;z-index:6;transform:translate(-50%,-100%);display:flex;align-items:center;gap:7px;padding:4px 11px 4px 5px;border-radius:999px;border:1.5px solid #ff6a4d;background:linear-gradient(180deg,#5c0d07f2,#2c0603f2);color:#fff1e8;box-shadow:0 0 0 2px #ff2d1f55,0 6px 16px #000a;pointer-events:none;white-space:nowrap;animation:rv-fatal-pop .22s ease-out both}
.fatal-callout::after{content:"";position:absolute;left:50%;bottom:-5px;width:9px;height:9px;transform:translateX(-50%) rotate(45deg);background:#2c0603;border-right:1.5px solid #ff6a4d;border-bottom:1.5px solid #ff6a4d}
.fatal-ico{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:radial-gradient(circle at 50% 35%,#ffe066,#ff8a1f);color:#3b0a02;font:900 15px/1 var(--font-ui,sans-serif);box-shadow:0 0 10px #ffb02e}
.fatal-txt{display:grid;line-height:1.1}.fatal-txt b{font:800 13.5px/1.15 var(--font-display,Georgia,serif);letter-spacing:.2px}.fatal-txt small{font-size:10.5px;color:#ffc9b8}
.fatal-callout.is-inside{border-color:#fff1a8}.fatal-callout.is-inside .fatal-txt small{color:#fff1a8;font-weight:700}
@keyframes rv-fatal-pulse{from{filter:brightness(.92)}to{filter:brightness(1.3)}}
@keyframes rv-fatal-pop{from{transform:translate(-50%,-80%) scale(.7);opacity:0}to{transform:translate(-50%,-100%) scale(1);opacity:1}}
@media(max-width:640px){.fatal-txt b{font-size:12.5px}.fatal-txt small{display:none}.fatal-callout{padding:3px 9px 3px 4px}.fatal-ico{width:21px;height:21px;font-size:13px}}
@media(prefers-reduced-motion:reduce){.fatal-zone,.fatal-callout{animation:none}.fatal-zone>i{transform:none;opacity:calc(var(--charge,0)*.5)}}

/* ---- Lisibilité du combat (28/10/2026) : curseur de visée, barres de vie, états ---- */
body[data-aim=ok] #world,body[data-aim=sel] #world{cursor:crosshair}
body[data-aim=bad] #world{cursor:not-allowed}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate{background:#150e09f4!important;border-width:2px!important;box-shadow:0 2px 9px #000d,0 0 0 1px #000a!important;min-width:100px}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>b{font-size:13.5px!important;text-shadow:0 1px 0 #000,0 0 4px #000!important}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-bar{height:11px;min-width:96px;border-radius:6px;background:#000c;box-shadow:inset 0 0 0 1.5px #000,0 0 0 1px #ffffff38}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-bar>i{border-radius:5px;box-shadow:inset 0 1px 0 #ffffff66}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-mana{height:5px;min-width:96px}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>small{font-size:12px!important;font-weight:800!important;color:#fff7e6!important;text-shadow:0 1px 0 #000,0 0 3px #000}
/* alliés, compagnons, invocations : cadre bleu et barre verte bien visibles ; toi : cadre doré */
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.ally{border-color:#6bc1ff!important;background:#0c1620f4!important}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.ally>.fp-bar>i{background:linear-gradient(#9cf58f,#2f9a2d)}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.self{border-color:#f2cf62!important}
/* cible actuelle : liseré doré épais + légère mise en avant */
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.auto-target{border-color:#ffd468!important;box-shadow:0 0 0 2px #ffd468,0 0 14px #ffd46899,0 2px 9px #000d!important}
/* plaques compactes (plus de 3 combattants) : barre toujours épaisse */
html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate>.fp-bar{height:8px;min-width:60px;width:60px}
/* téléphone (390 px) : texte et barres un peu plus grands */
@media (max-width:700px){html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>b{font-size:13px!important}html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-bar{height:10px;min-width:84px}html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate>.fp-bar{height:8px;min-width:54px;width:54px}html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>small{font-size:11.5px!important}}
/* cible choisie / cible valide pour le sort sélectionné / cible sans ligne de vue */
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.is-focus{border-color:#ffd468!important;box-shadow:0 0 0 2px #ffd468,0 0 14px #ffd46899,0 2px 9px #000d!important}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.valid-target:not(.ally){border-color:#8be39a!important;box-shadow:0 0 0 2px #8be39a99,0 2px 9px #000d!important}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.no-sight{border-style:dashed!important;opacity:.82}
/* plaques compactes : nom et PV réapparaissent au survol (sans écriture DOM) */
html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate:hover{z-index:7;min-width:104px}
html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate:hover>b,html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate:hover>small{display:block!important}
html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate:hover>.fp-bar{width:auto;min-width:96px;height:11px}
/* ---- 2e passe lisibilité (28/10/2026) : icônes d'états, cadre des invocations ---- */
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-st{display:block;margin-top:2px;font-size:13px;line-height:1.1;letter-spacing:2px;text-shadow:0 1px 1px #000,0 0 3px #000}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate>.fp-st[hidden]{display:none!important}
html body #combat-effects.fp-compact .monster-tag.in-fight.fight-plate.fight-plate>.fp-st{font-size:11px;margin-top:1px;letter-spacing:1px}
html body #combat-effects .monster-tag.in-fight.fight-plate.fight-plate.ally:not(.self){border-color:#6bc1ff!important;box-shadow:0 0 0 2px #6bc1ff66,0 0 10px #6bc1ff88,0 2px 9px #000d!important}
/* perf (2e passe) : animations qui forçaient un recalcul de style à chaque image : jauge de mana (régénération continue) sans transition ; anneau de cible fixe en mode Économie */
#fight-mana-fill{transition:none!important}
html[data-gfx=eco] #combat-target-ring{animation:none!important}/* mode Économie : anneau fixe (l'animation CSS de l'anneau force un recalcul de style à chaque image) */
/* les chiffres passent au-dessus des plaques de vie (sauf en mode Économie : l'empilement supplémentaire coûte cher au rendu logiciel) */
html:not([data-gfx=eco]) #combat-vfx{z-index:5}
