4b65572f6f
- Use BarcodeDetector API (Chrome/Edge/Android) as primary QR scanner; it uses native OS-level decoding which is far more reliable than jsQR for Prismatic's QR codes. Falls back to jsQR (attemptBoth) on Safari/Firefox. - Keep MediaStream alive between modal opens so the browser does not re-prompt for camera permission on each scan within the same page session. Stream is released after 2 min of idle (IDLE_RELEASE_MS) or on page unload. - stopCamera() split into stopQrLoop() (cancel rAF only) and releaseCamera() (stop tracks + null srcObject); modal hide now calls stopQrLoop, not releaseCamera. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>