VIEWER RUNTIME v5 β FINAL
==========================
Root cause of VFX not rendering:
VFXManager.init() is called inside DOMContentLoaded.
The viewer's bootViewer() runs as an async IIFE BEFORE DOMContentLoaded.
So when activateVFX calls resumeVFX(), renderer/clock/scene are all undefined.
The animate() loop crashes silently β nothing renders.
Fix: waitForVFXReady() polls VFXManager._initialized (set by DOMContentLoaded)
before any VFX calls. All VFX activation now waits for this gate.
VFX audio fix: ArrayBuffers die in JSON. exportFullProject uploads them to R2
and stores vfxAudioUrl / windAudioUrl (strings) in the snapshot instead.
Rewind fix: _rewindCooldown prevents the bubble timer from firing during rewind.
-->