/* Hero radar contacts (elements created by /assets/threats.js). */
.hero .threats{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none;overflow:visible}
.threats .tgt{animation:tgt-in .5s cubic-bezier(.2,.8,.2,1) both}
.threats .tgt.out,.threats .trk.out{animation:tgt-out .8s ease both}
.threats .tgt-box{fill:none;stroke:var(--warn,#ff5a4e);stroke-width:1.4}
.threats .tgt-core{fill:var(--warn,#ff5a4e)}
.threats .tgt-ring{fill:none;stroke:rgba(255,90,78,.55);stroke-width:1;transform-box:fill-box;transform-origin:center;animation:tgt-ping 1.6s ease-out infinite}
.threats .tgt-tag{fill:rgba(255,167,159,.95);font:11px "IBM Plex Mono",monospace;letter-spacing:.12em}
.threats .trk{animation:tgt-in .6s ease both}
.threats .trk circle{fill:#8fb3d9;stroke:rgba(11,14,18,.8);stroke-width:1}
.threats .trk.ally circle{fill:#7fb2d6;stroke:rgba(11,14,18,.8)}
.threats .ally-tag{fill:rgba(160,198,226,.9);font:10.5px "IBM Plex Mono",monospace;letter-spacing:.12em}
.threats .emp{fill:none;stroke:rgba(228,240,252,.95);stroke-width:2.5}
.threats .emp-glow{fill:none;stroke:rgba(143,179,217,.35);stroke-width:18}
.hero.emp-flicker canvas{animation:emp-flicker .7s steps(1) both}
@keyframes emp-flicker{0%{filter:brightness(2.2)}15%{filter:brightness(.4)}30%{filter:brightness(1.8)}45%{filter:brightness(.6)}60%{filter:brightness(1.3)}100%{filter:none}}
@keyframes tgt-in{from{opacity:0}to{opacity:1}}
@keyframes tgt-out{from{opacity:1}to{opacity:0}}
@keyframes tgt-ping{0%{transform:scale(.4);opacity:.9}100%{transform:scale(1.7);opacity:0}}
@media (prefers-reduced-motion:reduce){.threats *{animation:none!important}.hero.emp-flicker canvas{animation:none}}
.threats .fr-tag{fill:rgba(184,204,228,.5);font:9.5px "IBM Plex Mono",monospace;letter-spacing:.1em}
/* Theater dressing, MANET mesh, EW flights, live count */
.threats .corr{fill:none;stroke:rgba(232,236,241,.07);stroke-width:1}
.threats .sector{fill:none;stroke:rgba(143,179,217,.22);stroke-width:1;stroke-dasharray:6 7}
.threats .th-lbl{fill:rgba(143,179,217,.45);font:10px "IBM Plex Mono",monospace;letter-spacing:.24em}
.threats .th-hud{fill:rgba(232,236,241,.55);font:10.5px "IBM Plex Mono",monospace;letter-spacing:.14em}
.threats .mnt-hex{fill:rgba(11,14,18,.8);stroke:#d8a957;stroke-width:1.3}
.threats .mnt-tag{fill:rgba(216,169,87,.85);font:10px "IBM Plex Mono",monospace;letter-spacing:.1em}
.threats .mnt.jam{animation:mnt-jam .25s steps(2) infinite}
.threats .mlink{stroke:rgba(216,169,87,.4);stroke-width:1;stroke-dasharray:3 5;animation:tgt-in .6s ease both}
.threats .mpulse{fill:#f0c47a}
.threats .ew-chev{fill:rgba(232,236,241,.9);stroke:none}
.threats .ew-tag{fill:rgba(232,236,241,.75);font:9.5px "IBM Plex Mono",monospace;letter-spacing:.1em}
.threats .ew-trail{stroke:rgba(232,236,241,.35);stroke-width:1.4;stroke-linecap:round}
.threats .jam-cone{fill:rgba(232,236,241,.05);stroke:rgba(232,236,241,.18);stroke-width:1;stroke-dasharray:2 4;animation:jam-pulse .5s ease-in-out infinite alternate}
.threats .tgt.jammed{animation:tgt-jam .18s steps(2) infinite}
@keyframes jam-pulse{from{opacity:.45}to{opacity:1}}
@keyframes tgt-jam{0%{opacity:1}50%{opacity:.25}100%{opacity:.8}}
@keyframes mnt-jam{0%{opacity:1}50%{opacity:.2}}
/* AEW (own cyan radar, drawn on the hero canvas): contacts it paints flash cyan briefly */
.threats .tgt.aew-hit .tgt-box{stroke:#5ee2e2;animation:aew-hit .9s ease-out both}
.threats .tgt.aew-hit .tgt-tag{fill:rgba(170,240,240,.95)}
@keyframes aew-hit{0%{stroke-width:2.6}100%{stroke-width:1.4}}
