/* Stable 220px scene. Complete sprites, no rectangular masks or distorted parts. */
.flow-stage-0 .flow-art{position:relative}
.slam-hub{position:absolute;left:50%;bottom:0;width:220px;height:220px;transform:translateX(-50%);pointer-events:none;overflow:visible;z-index:4}
.slam-scene{display:block;width:100%;height:100%;overflow:visible}
.flow-stage-0 .flow-art[data-slam-ready="true"]>img{visibility:hidden}
.flow-stage-0 .flow-art[data-slam-ready="true"]:has(.slam-hub[data-slam="complete"])>img{visibility:visible}
.slam-hub[data-slam="complete"]{visibility:hidden}
.slam-upper{transform:translateY(-550px);opacity:0;transform-origin:627px 850px}
.slam-base{transform-origin:627px 1060px}
.slam-strands{opacity:.3}
.slam-current{stroke-dashoffset:0}
.slam-finished{opacity:0}
.slam-hub[data-slam="running"] .slam-finished{animation:slam-finished 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-construction{animation:slam-construction 1.4s linear var(--slam-offset,0ms) both}
.slam-charge,.slam-wave,.slam-flash,.slam-sparks{opacity:0;transform-origin:627px 860px}
.slam-hub[data-slam="running"] .slam-upper{animation:slam-upper 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-base{animation:slam-base 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-strands{animation:slam-strands 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-current{animation:slam-current 1s linear infinite}
.slam-hub[data-slam="running"] .slam-charge{animation:slam-charge 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-wave{animation:slam-wave 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-flash{animation:slam-flash 1.4s linear var(--slam-offset,0ms) both}
.slam-hub[data-slam="running"] .slam-sparks{animation:slam-sparks 1.4s linear var(--slam-offset,0ms) both}
.slam-paused *{animation-play-state:paused!important}
/* Complete chip moves intact; no clipping, masks, sliced images or scaling to reveal it. */
@keyframes slam-upper{0%{transform:translateY(-550px);opacity:0;filter:url(#gwx-slam-directional-blur);animation-timing-function:cubic-bezier(.65,0,1,.38)}3%{opacity:1}17.857%{transform:translateY(0) scaleY(.985);opacity:1;filter:none}21.43%{transform:translateY(-20px)}25.71%{transform:translateY(0)}39.286%{transform:translateY(0);opacity:1}100%{transform:translateY(0);opacity:1;filter:none}}
@keyframes slam-base{0%,17.85%{transform:scaleY(1)}19.3%{transform:scaleY(.987)}23%{transform:translateY(-3px)}25.71%,100%{transform:translateY(0) scaleY(1)}}
@keyframes slam-strands{0%{opacity:.35}17.85%{opacity:1}18%,100%{opacity:0}}
@keyframes slam-current{to{stroke-dashoffset:-72}}
@keyframes slam-charge{0%{opacity:.08;transform:scale(.7)}17.85%{opacity:.25;transform:scale(1)}18%,100%{opacity:0}}
@keyframes slam-wave{0%,17.85%{opacity:0;transform:scale(.3)}17.857%{opacity:.85;transform:scale(.3)}30%{opacity:.24;transform:scale(1.22)}39.286%,100%{opacity:0;transform:scale(1.4)}}
@keyframes slam-flash{0%,17.85%{opacity:0}17.857%{opacity:1}23%,100%{opacity:0}}
@keyframes slam-sparks{0%,17.85%{opacity:0;transform:translateY(0)}17.857%{opacity:.9}35%{opacity:0;transform:translateY(-70px)}100%{opacity:0}}
/* One approved assembled composition powers on at contact. Its registered
   image is identical to the persistent artwork, so completion cannot jump. */
@keyframes slam-finished{0%,17.85%{opacity:0}17.857%{opacity:.15}25%,100%{opacity:1}}
@keyframes slam-construction{0%,17.857%{opacity:1}25%,100%{opacity:0}}
@media(prefers-reduced-motion:reduce){.slam-hub{visibility:hidden}.flow-stage-0 .flow-art[data-slam-ready="true"]>img{visibility:visible}}

.slam-air{opacity:0;transform-origin:627px 860px}
.slam-hub[data-slam="running"] .slam-air{animation:slam-air 1.4s linear var(--slam-offset,0ms) both}
@keyframes slam-air{0%,17.85%{opacity:0;transform:scale(.7)}17.857%{opacity:.6;transform:scale(.7)}27%{opacity:.25;transform:scale(1.12)}39.286%,100%{opacity:0;transform:scale(1.24)}}

.slam-wake{opacity:0;filter:blur(6px)}
.slam-hub[data-slam="running"] .slam-wake{animation:slam-wake 1.4s linear var(--slam-offset,0ms) both}
@keyframes slam-wake{0%{opacity:0;transform:translateY(-550px);animation-timing-function:cubic-bezier(.65,0,1,.38)}6%{opacity:.35}17.857%{opacity:0;transform:translateY(0)}100%{opacity:0;transform:translateY(0)}}


/* Lightweight gradient volumes and six finite streaks; no particle emitter loop. */
.slam-volume,.slam-particles{opacity:0}
.slam-hub[data-slam="running"] .slam-volume,.slam-hub[data-slam="running"] .slam-particles{animation:slam-wake 1.4s linear var(--slam-offset,0ms) both}

/* Outward globe trails occupy the viewport; the original globe/orbits stay fixed. */
.ecosystem .world-branches{left:var(--world-screen-left,calc(50% - 50vw));right:auto;width:var(--world-screen-width,100vw);overflow:visible}
.ecosystem .world-branches .world-branch-stream{top:-100px;height:calc(100% + 100px);width:100%;overflow:hidden}
