@@ -67,6 +67,7 @@ let lastTime = 0
6767let resizeObs = null
6868let visibilityObs = null
6969let isVisible = false
70+ let lightboxOpen = false
7071let sceneReady = false
7172let nextSpawn = 0
7273let skyFrame = 0
@@ -487,9 +488,13 @@ function startLoop() {
487488function stopLoop () {
488489 if (animFrame) { cancelAnimationFrame (animFrame); animFrame = 0 }
489490}
491+ function onLightboxChange (e ) {
492+ lightboxOpen = e .detail .open
493+ if (! lightboxOpen && isVisible) startLoop ()
494+ }
490495function tick (time ) {
491496 animFrame = 0
492- if (! isVisible) return
497+ if (! isVisible || lightboxOpen ) return
493498 const dt = lastTime ? Math .min ((time - lastTime) / 16 , 3 ) : 1
494499 lastTime = time
495500 const w = container .value ? .offsetWidth || 800
@@ -921,7 +926,7 @@ function tick(time) {
921926 if (spores .value .length ) triggerRef (spores)
922927 if (wxParticles .value .length && weather .value .type !== ' clear' ) triggerRef (wxParticles)
923928
924- if (isVisible) animFrame = requestAnimationFrame (tick)
929+ if (isVisible && ! lightboxOpen ) animFrame = requestAnimationFrame (tick)
925930}
926931
927932// ── Drag ──
@@ -992,6 +997,7 @@ onMounted(() => {
992997 // stopLoop happens naturally: tick() checks isVisible before scheduling next frame
993998 }, { rootMargin: ' 100px' }) // start slightly before entering viewport
994999 if (container .value ) visibilityObs .observe (container .value )
1000+ window .addEventListener (' lightbox-change' , onLightboxChange)
9951001})
9961002onUnmounted (() => {
9971003 if (resizeObs) resizeObs .disconnect ()
@@ -1001,6 +1007,7 @@ onUnmounted(() => {
10011007 window .removeEventListener (' pointermove' , onMove)
10021008 window .removeEventListener (' pointerup' , onUp)
10031009 window .removeEventListener (' resize' , onResizeThrottled)
1010+ window .removeEventListener (' lightbox-change' , onLightboxChange)
10041011})
10051012
10061013// ── Helpers ──
0 commit comments