/* Campaign art stays independent of gameplay UI and uses the same 3:2 coordinates. */
body[data-home-land]:not([data-home-land=sanctuary]) #island-art{clip-path:none;mask:none}
body[data-home-land]:not([data-home-land=sanctuary]) #bridge-layers,
body[data-home-land]:not([data-home-land=sanctuary]) .satellite,
body[data-home-land]:not([data-home-land=sanctuary]) #island .progress-art,
body[data-home-land]:not([data-home-land=sanctuary]) #island .seal-light{display:none!important}
body[data-home-land]:not([data-home-land=sanctuary]) #island{width:min(100cqw,150cqh,1150px)}
body[data-home-land]:not([data-home-land=sanctuary]) #island{translate:0% 0%;transition:scale 1.8s cubic-bezier(.22,.61,.36,1),translate 1.8s cubic-bezier(.22,.61,.36,1)}
body[data-home-land]:not([data-home-land=sanctuary]) #island.searching{scale:var(--camp-zoom,1.06);translate:var(--camp-pan,0% 0%);transform-origin:var(--camp-origin,61.8% 53.1%)}
.campaign-effects{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}
.campaign-feature{opacity:.8;transform-box:fill-box;transform-origin:center;animation:campaign-breathe 4.5s ease-in-out infinite alternate}
.campaign-feature[data-stage="3"]{animation-duration:7s}.campaign-feature[data-stage="5"]{animation-duration:5.2s}
.campaign-review{filter:drop-shadow(0 0 9px var(--land-color));animation:campaign-highlight .8s ease-in-out 3!important}
.campaign-crystal{animation:campaign-orbit 7s ease-in-out infinite alternate;transform-box:fill-box;transform-origin:center}
.campaign-ribbon{animation:campaign-ribbon 3.8s ease-in-out infinite alternate;transform-box:fill-box;transform-origin:top center}
.campaign-ripple{animation:campaign-ripple 4s ease-out infinite;transform-box:fill-box;transform-origin:center}
.campaign-home-haze{position:absolute;inset:-8% -12%;pointer-events:none;opacity:var(--land-haze,.62);transition:opacity 2.5s ease;background:radial-gradient(ellipse at 44% 22%,var(--haze-color,#b9c6a1) 0,transparent 47%),radial-gradient(ellipse at 79% 30%,var(--haze-color,#b9c6a1) 0,transparent 36%);mask-image:linear-gradient(transparent 2%,#000 16%,#000 45%,transparent 65%)}
body[data-home-land=sanctuary] .campaign-home-haze{display:none}
body[data-home-land]:not([data-home-land=sanctuary]) .island-depth-fog{display:none}
#campaign-loading{position:absolute;inset:0;display:grid;place-items:center;background:#9eb8b2e8;z-index:5;border-radius:30%;font:14px Arial;text-align:center;color:#243a30;pointer-events:auto}
#campaign-loading[hidden]{display:none}
#campaign-loading button{display:block;margin:12px auto}
.campaign-journey,.campaign-map{background:#14251f;border:1px solid #b3955a;color:#e7d7ae;padding:22px;width:min(660px,92vw);max-height:90dvh;overflow:auto;box-shadow:0 14px 60px #0007;border-radius:8px}
.campaign-journey::backdrop,.campaign-map::backdrop{background:#09130fc9}
.campaign-journey header,.campaign-map header{display:flex;align-items:center;justify-content:space-between;gap:12px}
.campaign-journey h2,.campaign-map h2{margin:4px 0 12px;font:26px Georgia}
.campaign-journey .journey-illustration{position:relative;aspect-ratio:3/2;display:grid;place-items:center;background:radial-gradient(ellipse,#52625a,#1b3028);margin:10px -8px;border:1px solid #89754c;border-radius:4px;overflow:hidden}
.journey-illustration img{width:100%;height:100%;object-fit:contain}.journey-illustration [hidden]{display:none}
.journey-copy{font:16px/1.6 Georgia}.journey-note{color:#b4bca8;font:12px/1.5 Arial}.journey-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}
.campaign-route{display:grid;gap:10px}.campaign-land-choice{text-align:left;display:grid;grid-template-columns:76px 1fr;align-items:center;gap:12px;padding:10px;background:#21332a;border:1px solid #8a754b;border-radius:5px;color:inherit;cursor:pointer;font:inherit}
.campaign-land-choice img{width:76px;height:54px;object-fit:contain}.campaign-land-choice small{display:block;margin-top:5px;color:#b7bea9;font:12px Arial}.campaign-land-choice:disabled{opacity:.5;cursor:default}.campaign-land-choice[aria-current=true]{border-color:#d2bc7a;background:#314336}
#campaign-map-button{display:block}
#world-presence{font:12px/1.4 Arial;color:#b9c8ae;padding:8px 0;border-top:1px solid #a3916833}
.campaign-restored{opacity:1}
.campaign-forge-smoke{transform-box:fill-box;transform-origin:bottom center;animation:campaign-smoke 6s ease-in-out infinite}
.campaign-beacon{animation:campaign-beacon 3.4s ease-in-out infinite alternate}
.campaign-star-orbit{transform-box:fill-box;transform-origin:center;animation:campaign-star-orbit 16s linear infinite}
.campaign-dawn-ray,.campaign-gate-glow{animation:campaign-beacon 5.5s ease-in-out infinite alternate}
.journey-copy,.journal-pages article p{white-space:pre-line}
@keyframes campaign-smoke{0%{opacity:0;translate:0 14px}25%{opacity:.23}80%{opacity:.15}100%{opacity:0;translate:10px -24px}}
@keyframes campaign-beacon{to{opacity:.45}}
@keyframes campaign-star-orbit{to{rotate:360deg}}
@media(prefers-reduced-motion:reduce){.campaign-forge-smoke,.campaign-beacon,.campaign-star-orbit,.campaign-dawn-ray,.campaign-gate-glow{animation:none!important}}
.campaign-map .map-note{font:12px/1.5 Arial;color:#b7bea9;margin:18px 0 0}
@keyframes campaign-breathe{to{opacity:.4;filter:drop-shadow(0 0 5px var(--land-color))}}
@keyframes campaign-highlight{50%{filter:drop-shadow(0 0 20px var(--land-color));opacity:1}}
@keyframes campaign-orbit{to{translate:4px -7px;rotate:4deg}}
@keyframes campaign-ribbon{to{transform:skewX(6deg)}}
@keyframes campaign-ripple{from{opacity:.7;scale:.8}to{opacity:0;scale:1.4}}
@media(max-width:650px){.campaign-journey,.campaign-map{padding:16px}.campaign-journey h2{font-size:23px}.journey-copy{font-size:15px}.campaign-land-choice{grid-template-columns:60px 1fr}.campaign-land-choice img{width:60px}.campaign-journey .journey-illustration{margin:8px 0}}
@media(prefers-reduced-motion:reduce){.campaign-feature,.campaign-crystal,.campaign-ribbon,.campaign-ripple{animation:none!important}.campaign-home-haze{transition:none}}
@media(prefers-reduced-motion:reduce){body[data-home-land]:not([data-home-land=sanctuary]) #island,body[data-home-land]:not([data-home-land=sanctuary]) #island.searching{scale:1;translate:0% 0%;transition:none}}
.water-flow{opacity:.46;animation:water-flow 6s linear infinite}.water-fall{opacity:.52;animation:water-fall 1.8s linear infinite}.water-ring{opacity:0;transform-box:fill-box;transform-origin:center;animation:water-ring 8s ease-out infinite}
@keyframes water-flow{to{stroke-dashoffset:-92}}@keyframes water-fall{to{stroke-dashoffset:-31}}@keyframes water-ring{0%,25%{opacity:0;scale:.5}35%{opacity:.42}80%,100%{opacity:0;scale:1.25}}
@media(prefers-reduced-motion:reduce){.campaign-water *{animation:none!important;opacity:.2}}
/* Surface animations use the same 1536x1024 viewBox as their painted illustration. */
.water-flow{opacity:.78;animation:water-flow 3.6s linear infinite}
.water-fall{opacity:.86;animation:water-fall 1.25s linear infinite}
.surface-glow{opacity:.13;animation:surface-glow 3s ease-in-out infinite alternate}
.pool-sheen{opacity:.06;animation:surface-glow 4.5s ease-in-out infinite alternate}
.pool-wave{opacity:.52;animation:pool-current 3.8s linear infinite}
.lava-glow{opacity:.3;animation:lava-breathe 2.6s ease-in-out infinite alternate}
.lava-flow{opacity:.85;animation-duration:2.8s}

.sun-mote{filter:drop-shadow(0 0 2px #fff1a1)}
.gateway-review{animation:gateway-review 1s ease-in-out 3;filter:drop-shadow(0 0 8px #ffefb0)}
#island-review-caption{top:82px;max-width:min(440px,80vw);padding:5px 11px;font-size:13px;background:#102019b8}
body[data-arena-land=ash] .arena-float{animation:none!important}
@keyframes pool-current{to{stroke-dashoffset:-72;transform:translateY(9px)}}
@keyframes surface-glow{to{opacity:.18}}
@keyframes lava-breathe{to{opacity:.65}}

@keyframes gateway-review{50%{opacity:.4;filter:drop-shadow(0 0 15px #ffefb0)}}
@media(max-width:650px){#island-review-caption{top:73px;font-size:12px;padding:4px 9px}}
@media(prefers-reduced-motion:reduce){.surface-glow,.pool-sheen,.pool-wave,.lava-glow,.gateway-review{animation:none!important}.gateway-review{opacity:1}}
.pool-ripple{transform-box:fill-box;transform-origin:center;animation:lake-ripple var(--ripple-period,6s) ease-in-out infinite}
.pool-reflection{opacity:.08;animation:lake-reflection 7s ease-in-out infinite alternate}
.moon-rock{animation:moon-rock-float var(--rock-period) ease-in-out infinite;will-change:transform}
@keyframes lake-ripple{0%,100%{opacity:.12;transform:scale(.85)}50%{opacity:.48;transform:scale(1.14)}}
@keyframes lake-reflection{to{opacity:.19}}
@keyframes moon-rock-float{0%,100%{transform:translateY(0)}50%{transform:translateY(calc(-1 * var(--rock-lift)))}}
@media(prefers-reduced-motion:reduce){.pool-ripple,.pool-reflection,.moon-rock{animation:none!important}.pool-ripple{opacity:.25}}

.moon-star{filter:drop-shadow(0 0 2px #d1c5ff)}.ash-mote{filter:drop-shadow(0 0 1px #c66b34)}
.moon-arena-crystal{animation:moon-rock-float var(--rock-period) ease-in-out infinite;will-change:transform}.thorn-rock{animation-name:thorn-rock-drift}
@keyframes thorn-rock-drift{0%,100%{transform:translate(0,0)}28%{transform:translate(2px,calc(var(--rock-lift)*-.7))}61%{transform:translate(-2px,calc(var(--rock-lift)*-1))}83%{transform:translate(1px,calc(var(--rock-lift)*-.3))}}
@media(prefers-reduced-motion:reduce){.moon-arena-crystal,.thorn-rock{animation:none!important}}

/* Stage review uses softly painted pools of light, with no restoration-mask outline. */
.soft-object-review{animation:soft-review-pulse 1.2s ease-in-out 2;pointer-events:none}@keyframes soft-review-pulse{0%,100%{opacity:.15}50%{opacity:1}}

.review-plane{z-index:4}.campaign-home-haze,.island-depth-fog{z-index:5}#campaign-loading{z-index:6}

.ash-window-halo{filter:blur(4px);animation:ash-halo var(--fire-period) ease-in-out infinite}.ash-window-light{filter:blur(.7px);animation:ash-window var(--fire-period) ease-in-out infinite}.ash-flame-halo{filter:blur(5px);animation:ash-halo 1.8s ease-in-out infinite}.ash-tower-flame{transform-origin:0 1px;animation:ash-fire var(--fire-period) ease-in-out infinite}.ash-chimney-smoke{filter:blur(4px);animation:ash-smoke 6.6s linear infinite}
@keyframes ash-window{0%,100%{opacity:.34}18%{opacity:.68}37%{opacity:.43}63%{opacity:.88}81%{opacity:.55}}@keyframes ash-halo{0%,100%{opacity:.12}31%{opacity:.28}54%{opacity:.16}77%{opacity:.35}}@keyframes ash-fire{0%,100%{transform:scale(.86,1) skewX(-4deg);opacity:.85}23%{transform:scale(1.06,.77) skewX(7deg);opacity:.95}58%{transform:scale(.83,1.15) skewX(-7deg);opacity:.77}81%{transform:scale(.95,.94) skewX(3deg);opacity:1}}@keyframes ash-smoke{0%{transform:translate(0,4px) scale(.45);opacity:0}18%{opacity:.19}60%{opacity:.12}100%{transform:translate(33px,-62px) scale(1.65);opacity:0}}
@media(prefers-reduced-motion:reduce){.ash-window-halo,.ash-window-light,.ash-flame-halo,.ash-tower-flame,.ash-chimney-smoke{animation:none}.ash-window-light{opacity:.5}.ash-window-halo,.ash-flame-halo{opacity:.2}.ash-chimney-smoke{opacity:.1}}

/* Dense soot drifts away instead of remaining painted above the chimney. */
.ash-chimney-smoke{filter:blur(3px)}@keyframes ash-smoke{0%{transform:translate(0,4px) scale(.6);opacity:0}14%{opacity:.56}48%{opacity:.43}74%{opacity:.25}100%{transform:translate(38px,-72px) scale(1.85);opacity:0}}

.ash-falling-debris{overflow:visible;pointer-events:none}

.ash-brazier-smoke{filter:blur(5px);animation:ash-brazier-smoke 6s linear infinite}.ash-seal-aura{animation:ash-seal-aura 4.7s ease-in-out infinite}@keyframes ash-brazier-smoke{0%{transform:translate(0,-4px) scale(.6);opacity:0}22%{opacity:.16}60%{opacity:.1}100%{transform:translate(18px,-46px) scale(1.3);opacity:0}}@keyframes ash-seal-aura{0%,100%{opacity:.45}55%{opacity:.85}}@media(prefers-reduced-motion:reduce){.ash-brazier-smoke{animation:none;opacity:.08}.ash-seal-aura{animation:none;opacity:.6}}

/* Arena braziers only gently enliven the fire already painted in the art. */
.ash-arena-fire .ash-window-halo{animation-name:ash-brazier-halo}.ash-arena-fire .ash-window-light{animation-name:ash-brazier-embers}.ash-arena-fire .ash-tower-flame{fill:#eeb767;animation-name:ash-brazier-flame}@keyframes ash-brazier-halo{0%,100%{opacity:.035}37%{opacity:.065}68%{opacity:.045}}@keyframes ash-brazier-embers{0%,100%{opacity:.06}23%{opacity:.11}51%{opacity:.075}79%{opacity:.14}}@keyframes ash-brazier-flame{0%,100%{transform:scale(.92,.88) skewX(-3deg);opacity:.18}28%{transform:scale(.88,1.05) skewX(4deg);opacity:.26}61%{transform:scale(1,.82) skewX(-5deg);opacity:.15}83%{transform:scale(.9,.96) skewX(2deg);opacity:.23}}@media(prefers-reduced-motion:reduce){.ash-arena-fire .ash-window-halo{opacity:.045}.ash-arena-fire .ash-window-light{opacity:.09}.ash-arena-fire .ash-tower-flame{opacity:.2}}

body[data-home-land]:not([data-home-land=sanctuary]) .campaign-camp-layer{z-index:2}body[data-home-land]:not([data-home-land=sanctuary]) #island>.paint-effects{z-index:3}

.lava-flow{animation-duration:10s!important;opacity:.6}.palace-soft-light{filter:blur(23px);animation:palace-soft-light 7s ease-in-out infinite}.night-keeper-mechanism{transform-origin:0 0;animation:night-keeper-mechanism 18s ease-in-out infinite}.night-keeper-glimmer{filter:blur(4px);animation:night-keeper-glimmer 6.3s ease-in-out infinite}@keyframes palace-soft-light{0%,100%{opacity:.06}50%{opacity:.15}}@keyframes night-keeper-mechanism{0%,100%{transform:rotate(-6deg) scaleX(.94)}50%{transform:rotate(7deg) scaleX(1)}}@keyframes night-keeper-glimmer{0%,100%{opacity:.025}48%{opacity:.1}}@media(prefers-reduced-motion:reduce){.palace-soft-light,.night-keeper-mechanism,.night-keeper-glimmer{animation:none}.palace-soft-light{opacity:.08}.night-keeper-glimmer{opacity:.04}}

.soft-object-review{animation:review-soft-fade 2.6s ease-in-out 1 both}body:not([data-home-land=sanctuary]) .gateway-review{animation:review-soft-fade 3s ease-in-out 1 both}@keyframes review-soft-fade{0%,100%{opacity:0}35%,60%{opacity:.65}}
body[data-arena-land=ash] #arena .lava-flow{opacity:.9;stroke-width:4.2px;animation-duration:10s!important}body[data-arena-land=ash] #arena .lava-glow{opacity:.42}
@keyframes ash-brazier-flame{0%,100%{transform:scale(.92,.88) skewX(-3deg);opacity:.32}28%{transform:scale(.88,1.05) skewX(4deg);opacity:.48}61%{transform:scale(1,.82) skewX(-5deg);opacity:.28}83%{transform:scale(.9,.96) skewX(2deg);opacity:.41}}
@media(prefers-reduced-motion:reduce){.soft-object-review,body:not([data-home-land=sanctuary]) .gateway-review{animation:none;opacity:.45}.ash-arena-fire .ash-tower-flame{opacity:.37}}

.ash-arena-fire{z-index:2}.ash-arena-fire .ash-tower-flame{fill:#ffcb73;animation-name:ash-brazier-visible-flame}@keyframes ash-brazier-visible-flame{0%,100%{transform:scale(.9,.88) skewX(-3deg);opacity:.57}28%{transform:scale(.86,1.08) skewX(5deg);opacity:.78}61%{transform:scale(1,.82) skewX(-4deg);opacity:.48}83%{transform:scale(.9,.99) skewX(2deg);opacity:.7}}@keyframes ash-brazier-smoke{0%{transform:translate(0,-8px) scale(.55);opacity:0}22%{opacity:.12}60%{opacity:.085}100%{transform:translate(20px,-58px) scale(1.3);opacity:0}}@media(prefers-reduced-motion:reduce){.ash-arena-fire .ash-tower-flame{opacity:.65}}

@keyframes review-soft-fade{0%,100%{opacity:0}35%,60%{opacity:1}}

@keyframes ash-brazier-visible-flame{0%,100%{transform:scale(.93,.9) skewX(-2deg);opacity:.15}28%{transform:scale(.9,1.02) skewX(3deg);opacity:.23}61%{transform:scale(.98,.86) skewX(-3deg);opacity:.12}83%{transform:scale(.92,.98) skewX(2deg);opacity:.2}}@media(prefers-reduced-motion:reduce){.ash-arena-fire .ash-tower-flame{opacity:.17}}

.ash-arena-fire .ash-tower-flame{fill:#ffd58b;animation-name:ash-brazier-balanced-flame}@keyframes ash-brazier-balanced-flame{0%,100%{transform:scale(.94,.92) skewX(-2deg);opacity:.32}28%{transform:scale(.91,1.03) skewX(3deg);opacity:.43}61%{transform:scale(.98,.88) skewX(-3deg);opacity:.27}83%{transform:scale(.93,.98) skewX(2deg);opacity:.37}}.ash-brazier-smoke{filter:blur(3px)}@keyframes ash-brazier-smoke{0%{transform:translate(0,-8px) scale(.55);opacity:0}22%{opacity:.23}60%{opacity:.15}100%{transform:translate(20px,-58px) scale(1.3);opacity:0}}@media(prefers-reduced-motion:reduce){.ash-arena-fire .ash-tower-flame{opacity:.35}.ash-brazier-smoke{opacity:.12}}

/* Fade both side boundaries of campaign haze; sanctuary uses its own fog. */
body[data-home-land]:not([data-home-land=sanctuary]) .campaign-home-haze{mask-image:linear-gradient(transparent 2%,#000 16%,#000 45%,transparent 65%),linear-gradient(to right,transparent 0%,#000 18%,#000 82%,transparent 100%);mask-composite:intersect}
/* Suppress faint source-image background without cutting into floating rocks. */
body[data-home-land=moon] #island-art,body[data-home-land=moon] .campaign-development,body[data-home-land=moon] .moon-rock{filter:url(#moon-alpha-clean)}
