.campaign-screen{position:fixed;inset:0;z-index:2200;overflow:auto;color:#e9f8ff;background:#02090e;font-family:Arial,Helvetica,sans-serif}
.campaign-screen.hidden{display:none}
.campaign-map-art{position:absolute;inset:0;background:linear-gradient(90deg,rgba(1,8,14,.48),rgba(1,8,14,.12) 47%,rgba(1,8,14,.68)),var(--chapter-art,url('/static/assets/campaign/signal-zero-map.png')) center/cover no-repeat;filter:saturate(.85)}
.campaign-screen::after{content:'';position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 130px 60px #02090eb8;border:1px solid #50cbed44}
.campaign-map-header,.campaign-sites,.campaign-dossier,.campaign-map-footer{position:relative;z-index:2}
.campaign-map-header{display:flex;justify-content:space-between;align-items:start;padding:3vh 4vw 0;text-shadow:0 3px 12px #000}
.campaign-map-header small,.campaign-dossier small,.campaign-map-footer{letter-spacing:.23em;color:#94d6e9;font-weight:700}
.campaign-map-header h1{font:700 clamp(34px,4.7vw,74px)/1 Georgia,serif;letter-spacing:.11em;margin:8px 0;color:#f2fcff}
.campaign-map-header p{font-size:clamp(12px,1.1vw,16px);color:#b6d3dd;margin:7px 0}
.campaign-map-header button{background:#071b27bb;border:1px solid #8bd8ee;color:#e6faff;border-radius:50%;width:45px;height:45px;font-size:24px;cursor:pointer}
.campaign-chapters{position:absolute;z-index:3;top:22%;left:4%;display:flex;gap:10px}.campaign-chapters button{padding:8px 16px;background:#061923e8;border:1px solid #6ea2af;color:#c1dce6;letter-spacing:.12em;font-weight:800;cursor:pointer}.campaign-chapters button.selected{border-color:#e8d8af;color:#fff;box-shadow:0 0 16px #a8d7db88}
.campaign-sites{position:absolute;left:3.8%;width:60%;top:31%;display:flex;gap:1.2vw;justify-content:space-between;align-items:center}
.campaign-route{position:absolute;left:8%;width:52%;top:53%;height:4px;background:linear-gradient(90deg,#ef535e,#6eec9c,#e95067);box-shadow:0 0 18px #5cd9ed;z-index:1;transform:rotate(-7deg)}
.campaign-route span{position:absolute;top:-6px;width:16px;height:16px;border-radius:50%;background:#dbfcff;box-shadow:0 0 15px #8eedff}.campaign-route span:nth-child(1){left:0}.campaign-route span:nth-child(2){left:50%}.campaign-route span:nth-child(3){right:0}
.campaign-site{width:30%;min-height:200px;padding:0;display:flex;flex-direction:column;text-align:left;background:#05131be9;color:#e7f6f9;border:2px solid var(--site-color);border-radius:9px;box-shadow:0 12px 28px #000e,0 0 16px color-mix(in srgb,var(--site-color),transparent 60%);overflow:hidden;cursor:pointer;transition:transform .18s,box-shadow .18s}
.campaign-site:hover,.campaign-site.selected{transform:translateY(-9px);box-shadow:0 18px 35px #000e,0 0 25px var(--site-color)}
.campaign-site.locked{filter:grayscale(.85);opacity:.69}
.campaign-site img{width:100%;aspect-ratio:1.8;object-fit:cover;display:block}.campaign-site-index{position:absolute;margin:8px 10px;padding:4px 7px;background:#06131bda;border:1px solid #a7eaff;color:#d9faff;font-weight:900}.campaign-site-name{padding:10px 10px 4px;font:700 clamp(12px,1.2vw,17px) Georgia,serif}.campaign-site-state{padding:2px 10px 12px;color:var(--site-color);font-size:10px;letter-spacing:.16em;font-weight:900}
.campaign-dossier{position:absolute;right:3%;top:25%;width:30%;max-height:66vh;overflow:auto;padding:24px;background:linear-gradient(145deg,#081c26ef,#030b11f0);border:1px solid var(--site-color);border-radius:12px;box-shadow:0 0 42px #000d,0 0 28px color-mix(in srgb,var(--site-color),transparent 70%)}
.campaign-dossier h2{font:700 clamp(24px,2.4vw,38px) Georgia,serif;margin:10px 0;color:#f2fbff}.campaign-location{color:var(--site-color);letter-spacing:.15em;text-transform:uppercase;font-size:11px}.campaign-brief{line-height:1.55;color:#cfdee4;font-size:clamp(12px,1vw,15px)}.campaign-dossier-line{border-top:1px solid #a9e2f13a;padding:10px 0;display:grid;gap:5px}.campaign-dossier-line span{font-size:10px;letter-spacing:.2em;color:#94c7d5}.campaign-dossier-line strong{font-size:13px;line-height:1.4}.campaign-dossier .primary{width:100%;margin-top:12px;padding:12px;border:1px solid var(--site-color);background:linear-gradient(#286178,#092738);color:#fff;font-weight:900;letter-spacing:.1em;cursor:pointer}.campaign-dossier .primary:disabled{opacity:.45;cursor:not-allowed}
.campaign-map-footer{position:absolute;bottom:3%;left:4%;right:4%;display:flex;justify-content:space-between;font-size:10px;text-shadow:0 2px 5px #000}
.campaign-briefing{position:fixed;inset:0;z-index:3;background:#02090e;display:grid;grid-template-columns:55% 45%}.campaign-briefing-art{background-position:center;background-size:cover}.campaign-briefing-copy{padding:clamp(28px,5vw,90px);display:flex;flex-direction:column;justify-content:center;gap:18px;background:linear-gradient(115deg,#07121e,#081b23)}.campaign-briefing-copy small{letter-spacing:.22em;color:#99dded}.campaign-briefing-copy h2{font:700 clamp(30px,3.6vw,58px) Georgia,serif;margin:0}.campaign-briefing-copy p{font:18px/1.7 Georgia,serif;color:#c8dce5}.campaign-briefing-copy strong{color:#b8f4ff;letter-spacing:.08em}.campaign-briefing-copy>div{display:flex;gap:16px}.campaign-briefing-copy button{padding:12px 20px;background:#102a35;border:1px solid #6cb6c9;color:#fff;cursor:pointer}
body.game-mode.campaign-mode #game{background-image:linear-gradient(180deg,rgba(0,0,0,.35),rgba(0,0,0,.08) 42%,rgba(0,0,0,.48)),var(--campaign-board)!important;background-size:cover!important;background-position:center!important}
body.game-mode.campaign-mode #battleScenery{display:none!important}
body.game-mode.campaign-mode .location-card{background:#061016dd!important;border-color:#a2d8e3!important;color:#e5f7fc!important}
body.game-mode.campaign-mode #campaignObjective{position:absolute;z-index:100;top:8.5%;left:1.2%;width:310px;display:grid;gap:3px;padding:9px 13px;background:#04131de8;border:1px solid #9cddec;border-radius:5px;box-shadow:0 0 18px #000c;color:#edfcff;pointer-events:none}
#campaignObjective small{font-size:9px;letter-spacing:.12em;color:#86d1e2}#campaignObjective strong{font-size:12px;letter-spacing:.07em}#campaignObjective span{padding:4px 8px;border:1px solid #a5e9f1;background:#0f4050;color:#fff;font-weight:900}
body.game-mode.campaign-mode #opponentBoard{gap:12px!important}
.campaign-structures{display:flex;gap:6px;justify-content:center;align-items:center;flex:0 0 auto;position:relative;z-index:90}
.campaign-structure{width:clamp(56px,5.7vw,84px);height:132px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;background:linear-gradient(120deg,#0c2f2b,#102322 55%,#03100d);border:2px solid #a7f8bc;border-radius:18px 18px 10px 10px;box-shadow:inset 0 0 23px #51f78966,0 0 12px #70fca977;color:#effff3;cursor:pointer;white-space:nowrap;font-size:11px;transition:transform .15s,filter .15s}
.campaign-structure .structure-glass{position:relative;display:block;width:38px;height:58px;border:3px solid #c8e8d9;border-top-width:7px;border-bottom-width:7px;border-radius:11px 11px 7px 7px;background:linear-gradient(0deg,#45ec76cc 0 45%,#42dfb522 46%,#03251d77 100%);box-shadow:inset 0 0 10px #74ffae,0 0 13px #58d98e;overflow:hidden}.campaign-structure .structure-glass::before{content:'';position:absolute;inset:5px 10px 7px 4px;border-left:2px solid #ffffffaa;border-radius:50%}.campaign-structure .structure-glass::after{content:'';position:absolute;left:5px;right:5px;top:28px;height:2px;background:#c1ffde;box-shadow:0 0 7px #80ffb8}.campaign-structure .structure-glass i{position:absolute;left:11px;top:22px;width:13px;height:21px;border-radius:60% 40% 70% 30%;background:#103c28;box-shadow:0 0 9px #b8ff7c;transform:rotate(-24deg)}.campaign-structure strong{font-size:11px}.campaign-structure span:last-child{color:#d5ffe1;font-weight:800}.campaign-structure:hover,.campaign-structure.drop-hover{transform:translateY(-7px) scale(1.06);filter:brightness(1.3)}.campaign-structure.destroyed{opacity:.35;filter:grayscale(1);cursor:default;box-shadow:none}
/* Mission 2: textured containment vats retain their independent hit targets and HP. */
.campaign-structures-containment_lab .campaign-structure{width:clamp(68px,6.4vw,96px);height:146px;gap:2px;border-color:#689f8c;background:repeating-linear-gradient(140deg,#0c2423 0 5px,#17312c 6px 7px,#0b1c1c 8px 12px);box-shadow:inset 0 0 18px #71d99b44,0 8px 18px #0009}
.campaign-structures-containment_lab .structure-glass{width:70px;height:98px;border:0;border-radius:0;background:url('/static/assets/containment-vat-41b.png') center / contain no-repeat;box-shadow:none;overflow:visible;filter:drop-shadow(0 0 9px #5be59a99)}
.campaign-structures-containment_lab .structure-glass::before{content:'';position:absolute;inset:13px 15px 11px;border:0;border-radius:50%;background:radial-gradient(circle,#bbff9266,transparent 65%);box-shadow:none;transform:none;pointer-events:none}
.campaign-structures-containment_lab .structure-glass::after{display:none}
.campaign-structures-containment_lab .structure-glass i{display:none}
.campaign-structures-containment_lab .campaign-structure.damaged{border-color:#d7a665;box-shadow:inset 0 0 17px #e8aa6b55,0 0 12px #da7e4388}
.campaign-structures-containment_lab .campaign-structure.damaged .structure-glass{filter:drop-shadow(0 0 9px #e8a85b);opacity:.8}
.campaign-structures-containment_lab .campaign-structure.damaged .structure-glass::after{display:block;content:'';position:absolute;inset:12px 21px 18px 18px;width:auto;height:auto;background:linear-gradient(125deg,transparent 35%,#f4f5b9cc 36% 38%,transparent 39%),linear-gradient(28deg,transparent 58%,#edfae3aa 59% 61%,transparent 62%);box-shadow:none;pointer-events:none}
.campaign-structures-containment_lab .campaign-structure.destroyed{opacity:.68;filter:grayscale(.8);border-color:#744c45;background:#150f0f;box-shadow:none}
.campaign-structures-containment_lab .campaign-structure.destroyed .structure-glass{filter:grayscale(1) drop-shadow(0 0 4px #b24f3c);transform:rotate(7deg)}
body.game-mode.campaign-mode #opponentBoard .board-figure{flex-shrink:1!important;min-width:72px!important}
@media(max-width:900px){.campaign-sites{top:22%;width:92%;left:4%}.campaign-dossier{top:53%;left:4%;right:4%;width:auto;max-height:37vh}.campaign-site{min-height:145px}.campaign-map-footer{display:none}.campaign-briefing{display:block}.campaign-briefing-art{height:35vh}.campaign-briefing-copy{height:65vh;padding:24px}.campaign-briefing-copy p{font-size:15px}}
@media(max-height:800px){.campaign-site{min-height:150px}.campaign-site img{aspect-ratio:2.3}.campaign-dossier{padding:14px}.campaign-brief{font-size:12px!important}.campaign-dossier-line{padding:7px 0}body.game-mode.campaign-mode #campaignObjective{top:8.8%;gap:2px;width:290px}}
@media(prefers-reduced-motion:reduce){.campaign-site,.campaign-structure{transition:none}}

/* Nexus: short, server-state-driven cinematics. No continuous particle loop. */
.nexus-cinematic{position:fixed;inset:0;z-index:118;overflow:hidden;color:#fff;pointer-events:none}
.nexus-intro{display:grid;place-items:center;background:radial-gradient(circle at 50% 40%,#721920b8,#070306ed 67%);pointer-events:auto;animation:nexus-veil-in .35s ease-out both}
.nexus-intro.leaving{opacity:0;transition:opacity .26s ease-out;pointer-events:none}
.nexus-intro-core{position:relative;display:grid;justify-items:center;text-align:center;width:min(72vw,650px);padding:14px 20px 62px;text-shadow:0 3px 20px #000}
.nexus-intro-core::before{content:'';position:absolute;top:8%;left:27%;width:46%;aspect-ratio:1;border:2px solid #ff534d88;border-radius:50%;box-shadow:0 0 50px #ff2e3e99,inset 0 0 54px #ff451e77;animation:nexus-pulse 1.5s ease-in-out 1}
.nexus-intro-kicker{font:700 12px Arial,sans-serif;letter-spacing:.28em;color:#ffd1a6;z-index:1}
.nexus-intro-core img{position:relative;width:min(38vw,300px);aspect-ratio:1;object-fit:cover;margin:18px 0;clip-path:polygon(16% 0,84% 0,100% 16%,100% 84%,84% 100%,16% 100%,0 84%,0 16%);border:2px solid #ff9169;box-shadow:0 0 40px #ff332d88;animation:nexus-rise .75s cubic-bezier(.2,.8,.2,1) both}
.nexus-intro-core h2{font:700 clamp(29px,3.6vw,62px)/1.05 Georgia,serif;letter-spacing:.08em;margin:2px 0;color:#fff0dd}
.nexus-intro-core p{font:700 14px Arial,sans-serif;letter-spacing:.25em;color:#ffbd9c;margin:14px 0}
#nexusIntroSkip{position:absolute;right:3vw;bottom:4vh;padding:12px 18px;background:#0b0a0bcc;border:1px solid #ffd1aa;color:#fff;font:700 12px Arial,sans-serif;letter-spacing:.12em;cursor:pointer;pointer-events:auto;z-index:2}
.nexus-phase-flash{display:grid;place-items:center;background:radial-gradient(circle,#e1233377 0%,#500b1840 37%,transparent 70%);animation:nexus-phase-enter 1.7s ease-out both}
.nexus-phase-ring{position:absolute;width:min(63vw,590px);aspect-ratio:1;border:5px solid #ff66528a;border-radius:50%;box-shadow:0 0 80px #ff271c,inset 0 0 80px #ff271c;animation:nexus-ring 1.4s ease-out both}
.nexus-phase-copy{position:relative;display:grid;gap:8px;text-align:center;text-shadow:0 3px 22px #210002}
.nexus-phase-copy small{color:#ffe5be;letter-spacing:.3em;font:700 12px Arial,sans-serif}
.nexus-phase-copy strong{font:700 clamp(46px,6vw,110px) Georgia,serif;color:#ffe8dc;letter-spacing:.12em}
.nexus-phase-copy span{font:700 clamp(15px,1.7vw,22px) Georgia,serif;color:#ffb4ab}
body.nexus-phase-two #campaignObjective{border-color:#ff7474!important;box-shadow:0 0 22px #ff333666!important}
body.nexus-phase-two #opponentHero .cin-hero-avatar{box-shadow:0 0 30px #ec292b99!important}
body.nexus-phase-pulse #game{box-shadow:inset 0 0 120px #e7243466}
.nexus-attack-wave{position:fixed;z-index:115;width:75px;height:75px;border:3px solid #8dff898c;border-radius:50%;box-shadow:0 0 23px #a0fd6b,inset 0 0 19px #ff534a;transform:translate(-50%,-50%) scale(.25);animation:nexus-hit .7s ease-out both;pointer-events:none}
.nexus-attack-wave.enraged{border-color:#ff4938;box-shadow:0 0 34px #ff291d,inset 0 0 18px #d3f458}
.nexus-attack-target{filter:brightness(1.25) saturate(1.35)}
.nexus-collapse{display:grid;place-items:center;background:radial-gradient(circle,#b72932a8,#100609e8 57%,#020204ef);animation:nexus-veil-in .25s ease-out both}
.nexus-collapse img{width:min(50vw,460px);aspect-ratio:1;object-fit:cover;filter:brightness(1.8) saturate(1.5);animation:nexus-extinguish 1.16s ease-in both}
.nexus-collapse span{position:absolute;bottom:13vh;font:700 clamp(23px,3vw,45px) Georgia,serif;letter-spacing:.18em;text-shadow:0 0 18px #ff5444}
.winner-overlay.victory:has(.nexus-rewards) .winner-box{border-color:#e6ba78;box-shadow:0 0 42px #c9904b55}
.nexus-rewards .nexus-reward{background:linear-gradient(145deg,#162822,#0c1518)!important;border:1px solid #b8bd88!important;animation:nexus-reward-in .4s ease-out both}
.nexus-rewards .nexus-reward:nth-child(2){animation-delay:.07s}.nexus-rewards .nexus-reward:nth-child(3){animation-delay:.14s}.nexus-rewards .nexus-reward:nth-child(4){animation-delay:.21s}
.nexus-rewards .nexus-reward strong{font-size:clamp(15px,1.35vw,22px);color:#f4e8c4}
@keyframes nexus-veil-in{from{opacity:0}to{opacity:1}}
@keyframes nexus-pulse{0%{transform:scale(.75);opacity:.35}55%{transform:scale(1.12);opacity:1}100%{transform:scale(1.3);opacity:0}}
@keyframes nexus-rise{from{opacity:0;transform:translateY(40px) scale(.82);filter:brightness(.2)}to{opacity:1;transform:none;filter:brightness(1)}}
@keyframes nexus-phase-enter{0%{opacity:0}20%{opacity:1}65%{opacity:1}100%{opacity:0}}
@keyframes nexus-ring{from{transform:scale(.22);opacity:1}to{transform:scale(1.7);opacity:0}}
@keyframes nexus-hit{0%{opacity:1;transform:translate(-50%,-50%) scale(.2)}75%{opacity:.8}100%{opacity:0;transform:translate(-50%,-50%) scale(2.7)}}
@keyframes nexus-extinguish{0%{opacity:1;filter:brightness(2) saturate(1.5);transform:scale(1)}65%{opacity:1;filter:brightness(.6) saturate(.5);transform:scale(1.08)}100%{opacity:0;filter:brightness(0);transform:scale(.92)}}
@keyframes nexus-reward-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@media(max-height:800px){.nexus-intro-core{padding-bottom:20px}.nexus-intro-core img{width:min(31vh,230px);margin:9px}.nexus-intro-core h2{font-size:clamp(26px,3vw,43px)}.nexus-intro-core p{margin:8px}}
@media(max-width:800px){.nexus-intro-core{width:90vw}.nexus-intro-core img{width:min(52vw,240px)}#nexusIntroSkip{right:3vw;bottom:2vh}}
@media(prefers-reduced-motion:reduce){.nexus-intro,.nexus-intro-core::before,.nexus-intro-core img,.nexus-phase-flash,.nexus-phase-ring,.nexus-attack-wave,.nexus-collapse,.nexus-collapse img,.nexus-rewards .nexus-reward{animation:none!important}}
body.visual-effects-reduced .nexus-intro,body.visual-effects-reduced .nexus-intro-core::before,body.visual-effects-reduced .nexus-intro-core img,body.visual-effects-reduced .nexus-phase-flash,body.visual-effects-reduced .nexus-phase-ring,body.visual-effects-reduced .nexus-attack-wave,body.visual-effects-reduced .nexus-collapse,body.visual-effects-reduced .nexus-collapse img,body.visual-effects-reduced .nexus-rewards .nexus-reward{animation:none!important}
/* Chapter II: compact server-backed objective tokens; backgrounds never capture input. */
.campaign-structures-helios_ruins .campaign-structure{width:clamp(90px,8vw,135px);background:linear-gradient(140deg,#123443,#071820);border-color:#82ddf5;box-shadow:inset 0 0 20px #68c4e244,0 0 13px #7ad2ec88}
.campaign-structures-helios_ruins .structure-glass,.campaign-structures-omega_reactor .structure-glass,.campaign-structures-devourer .structure-glass{display:grid;place-items:center;border-width:2px}
.campaign-structures-helios_ruins .structure-glass::before,.campaign-structures-omega_reactor .structure-glass::before,.campaign-structures-devourer .structure-glass::before{position:static;border:0;font:700 32px/1 Georgia,serif;transform:none}
.campaign-structures-helios_ruins .structure-glass::after,.campaign-structures-omega_reactor .structure-glass::after,.campaign-structures-devourer .structure-glass::after{display:none}
.campaign-structures-helios_ruins .structure-glass i,.campaign-structures-omega_reactor .structure-glass i,.campaign-structures-devourer .structure-glass i{display:none}
.campaign-structures-helios_ruins .structure-glass::before{content:'▰';color:#b6eafb;text-shadow:0 0 12px #5ccbea}
.campaign-structures-omega_reactor .campaign-structure{background:linear-gradient(140deg,#3d2816,#151d18);border-color:#ffa762;box-shadow:inset 0 0 20px #ff972a55,0 0 13px #ffa75d88}
.campaign-structures-omega_reactor .structure-glass::before{content:'ϟ';color:#ffe7a1;text-shadow:0 0 12px #ff9d43}
.campaign-structures-omega_reactor .campaign-structure.active{border-color:#f4ff9d;box-shadow:0 0 25px #fbec6f,inset 0 0 20px #ffa52a}
.campaign-structures-devourer .campaign-structure{background:linear-gradient(140deg,#3b151f,#15251b);border-color:#e47371;box-shadow:inset 0 0 20px #d53d5c66,0 0 13px #fc6b5488}
.campaign-structures-devourer .structure-glass::before{content:'◉';color:#ffb9a5;text-shadow:0 0 12px #ff4343}
.campaign-structures-devourer .structure-glass{border-radius:50%;background:radial-gradient(circle,#ff5e4d,#46151a 65%,#17251b)}
.campaign-structures-helios_ruins .structure-glass{border-radius:5px;background:linear-gradient(#273e48,#0d2530)}
.campaign-structures-omega_reactor .structure-glass{background:linear-gradient(#ffc15e,#3b3925,#378463)}
.devourer-cinematic .nexus-intro-core img{aspect-ratio:16/9;object-fit:cover;width:min(48vw,520px)}
.devourer-phase .nexus-phase-ring{border-color:#9bdc7d;box-shadow:0 0 75px #d84c48,inset 0 0 70px #8fea78}
body[data-campaign-mission="helios_ruins"] #campaignObjective{border-color:#8cdaea}
body[data-campaign-mission="omega_reactor"] #campaignObjective{border-color:#ffaf72}
body[data-campaign-mission="devourer"] #campaignObjective{border-color:#ec7879}
/* The transparent fixed hand wrapper can overlap the hero power at 1600×900. */
body.game-mode.campaign-mode .hand-wrap{pointer-events:none!important}
body.game-mode.campaign-mode .hand-wrap .hand,body.game-mode.campaign-mode .hand-wrap .card{pointer-events:auto!important}
@media(max-width:900px){.campaign-chapters{top:17%;left:4%}.campaign-chapters button{font-size:10px;padding:6px 10px}}
@media(max-height:800px){.campaign-chapters{top:18%}.campaign-sites{top:29%}}
