diff --git a/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-linux.png b/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-linux.png
index 6effb2938..ffbd8dd3b 100644
Binary files a/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-linux.png and b/e2e/busy-screen.e2e.ts-snapshots/Should-hide-spinner-1-Google-Chrome-linux.png differ
diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png
index adad223a2..7bd7c921e 100644
Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-display-a-mirrored-video-1-Google-Chrome-linux.png differ
diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-linux.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-linux.png
index 13054c114..7ef95c199 100644
Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-linux.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-code-value-with-camera-1-Google-Chrome-linux.png differ
diff --git a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png
index a1d87a5b4..58c5b3ed8 100644
Binary files a/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png and b/e2e/qr-code-reader.e2e.ts-snapshots/Read-QR-throws-error-Google-Chrome-linux.png differ
diff --git a/package-lock.json b/package-lock.json
index 597b17cc2..4bae54ab5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,9 +9,9 @@
"version": "10.0.0",
"license": "Apache-2.0",
"dependencies": {
+ "barcode-detector": "^3.1.1",
"decimal.js": "^10.6.0",
"dompurify": "^3.3.1",
- "html5-qrcode": "^2.3.8",
"marked": "^9.1.0",
"qr-creator": "^1.0.0"
},
@@ -2232,6 +2232,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/emscripten": {
+ "version": "1.41.5",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz",
+ "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==",
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -3108,6 +3114,15 @@
"license": "MIT",
"peer": true
},
+ "node_modules/barcode-detector": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-3.1.1.tgz",
+ "integrity": "sha512-ghWlEAV93ZCUniO7Co3ih/01XPm+U30CV+NoPbO6Chj5lZzHydDAqKlrBEd+37TkoR+QTH3tnnwd8k8epGTfIg==",
+ "license": "MIT",
+ "dependencies": {
+ "zxing-wasm": "3.0.1"
+ }
+ },
"node_modules/base64-arraybuffer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
@@ -5174,11 +5189,6 @@
"node": ">=18"
}
},
- "node_modules/html5-qrcode": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz",
- "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ=="
- },
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
@@ -8024,6 +8034,18 @@
"url": "https://opencollective.com/synckit"
}
},
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/tapable": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
@@ -8306,6 +8328,21 @@
"node": ">=4"
}
},
+ "node_modules/type-fest": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz",
+ "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==",
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -9100,6 +9137,19 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/zxing-wasm": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-3.0.1.tgz",
+ "integrity": "sha512-3CLj6iaGkpqPWXAB4pIWkFOR63MwqGekpMzaROFKto4dFowiPmLlC56KoMoOSXzqOCOpI5DAvMdB8ku2va6fUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/emscripten": "^1.41.5",
+ "type-fest": "^5.4.4"
+ },
+ "peerDependencies": {
+ "@types/emscripten": ">=1.39.6"
+ }
}
},
"dependencies": {
@@ -10257,6 +10307,11 @@
"integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
"dev": true
},
+ "@types/emscripten": {
+ "version": "1.41.5",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz",
+ "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q=="
+ },
"@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -10822,6 +10877,14 @@
"dev": true,
"peer": true
},
+ "barcode-detector": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-3.1.1.tgz",
+ "integrity": "sha512-ghWlEAV93ZCUniO7Co3ih/01XPm+U30CV+NoPbO6Chj5lZzHydDAqKlrBEd+37TkoR+QTH3tnnwd8k8epGTfIg==",
+ "requires": {
+ "zxing-wasm": "3.0.1"
+ }
+ },
"base64-arraybuffer": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
@@ -12187,11 +12250,6 @@
"whatwg-encoding": "^3.1.1"
}
},
- "html5-qrcode": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz",
- "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ=="
- },
"http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
@@ -14015,6 +14073,11 @@
"@pkgr/core": "^0.2.9"
}
},
+ "tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="
+ },
"tapable": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
@@ -14194,6 +14257,14 @@
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
+ "type-fest": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz",
+ "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==",
+ "requires": {
+ "tagged-tag": "^1.0.0"
+ }
+ },
"typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -14639,6 +14710,15 @@
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"dev": true,
"peer": true
+ },
+ "zxing-wasm": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-3.0.1.tgz",
+ "integrity": "sha512-3CLj6iaGkpqPWXAB4pIWkFOR63MwqGekpMzaROFKto4dFowiPmLlC56KoMoOSXzqOCOpI5DAvMdB8ku2va6fUg==",
+ "requires": {
+ "@types/emscripten": "^1.41.5",
+ "type-fest": "^5.4.4"
+ }
}
}
}
diff --git a/package.json b/package.json
index d36e616c0..4afcb2a41 100644
--- a/package.json
+++ b/package.json
@@ -71,9 +71,9 @@
"vitest": "^3.2.4"
},
"dependencies": {
+ "barcode-detector": "^3.1.1",
"decimal.js": "^10.6.0",
"dompurify": "^3.3.1",
- "html5-qrcode": "^2.3.8",
"marked": "^9.1.0",
"qr-creator": "^1.0.0"
},
diff --git a/src/lib/components/QRCodeReader.svelte b/src/lib/components/QRCodeReader.svelte
index db7c0c1d1..645fb09f3 100644
--- a/src/lib/components/QRCodeReader.svelte
+++ b/src/lib/components/QRCodeReader.svelte
@@ -1,5 +1,5 @@
-
+
+
+
+
+
diff --git a/src/routes/(split)/components/qr-code-reader/+page.md b/src/routes/(split)/components/qr-code-reader/+page.md
index 64ae114e9..767df32c6 100644
--- a/src/routes/(split)/components/qr-code-reader/+page.md
+++ b/src/routes/(split)/components/qr-code-reader/+page.md
@@ -32,7 +32,7 @@ If used in a modal, prefer the wrapper ``.
## Library
-This component uses the library [jsQR](https://github.com/cozmo/jsQR).
+This component uses [barcode-detector](https://github.com/Sec-ant/barcode-detector) — a [Barcode Detection API](https://developer.mozilla.org/en-US/docs/Web/API/BarcodeDetector) polyfill powered by ZXing C++ WebAssembly — for QR code decoding, with native camera access via `getUserMedia`.
## Events