v1.1.4 — Stop leaking global listeners
First result from a heap snapshot audit
`_setupEventListeners` gets called on every `_buildUI` rebuild (generate, shuffle, regen, feel change, upload). It was re-attaching global listeners (`window.resize`, `document.keydown/keyup`, `mediaDevices.devicechange`) every time — those accumulate because `document` and `window` outlive every DOM rebuild, so GC couldn't reap them.
Split globals into an idempotent `_attachGlobalListeners` guarded by `_globalListenersAttached`. Host-scoped listeners still rebind per rebuild since they're attached to fresh elements anyway.
Still hunting
Heap snapshot showed ~78k retained `` shadow-DOM nodes (internal slots + label containers). Lost DOM chains somewhere past the global-listener layer. Next pass: trace the JS retainer chain for detached option elements.