Scan-Feedback entfernt + dontInvert zurück
All checks were successful
Pin to IPFS / pin (push) Successful in 12s

This commit is contained in:
Ole 2026-06-14 18:25:00 +02:00
parent 570606b6db
commit f3f43ae68e
2 changed files with 2 additions and 22 deletions

14
app.js
View file

@ -82,7 +82,6 @@
/* ─── Camera ─── */ /* ─── Camera ─── */
let camStream = null; let camStream = null;
let camRaf = null; let camRaf = null;
let camVideoEl = null;
async function camStart(videoId) { async function camStart(videoId) {
await camStop(); await camStop();
@ -103,7 +102,6 @@
} }
camStream = stream; camStream = stream;
const v = $(videoId); const v = $(videoId);
camVideoEl = v;
v.srcObject = stream; v.srcObject = stream;
v.setAttribute('playsinline', ''); v.setAttribute('playsinline', '');
v.classList.add('active'); v.classList.add('active');
@ -116,7 +114,6 @@
} }
function camStop() { function camStop() {
if (camVideoEl) { camVideoEl.classList.remove('scan-active', 'scan-done'); camVideoEl = null; }
if (camRaf) { cancelAnimationFrame(camRaf); camRaf = null; } if (camRaf) { cancelAnimationFrame(camRaf); camRaf = null; }
if (camStream) { camStream.getTracks().forEach(t => t.stop()); camStream = null; } if (camStream) { camStream.getTracks().forEach(t => t.stop()); camStream = null; }
} }
@ -126,7 +123,6 @@
const c = $(canvasId); const c = $(canvasId);
const ctx = c.getContext('2d', { willReadFrequently: true }); const ctx = c.getContext('2d', { willReadFrequently: true });
let lastScan = 0; let lastScan = 0;
v.classList.add('scan-active');
const detect = barcodeDetector const detect = barcodeDetector
? async () => { ? async () => {
@ -137,7 +133,7 @@
c.width = v.videoWidth; c.height = v.videoHeight; c.width = v.videoWidth; c.height = v.videoHeight;
ctx.drawImage(v, 0, 0); ctx.drawImage(v, 0, 0);
const img = ctx.getImageData(0, 0, c.width, c.height); const img = ctx.getImageData(0, 0, c.width, c.height);
const code = jsQR(img.data, img.width, img.height, { inversionAttempts: 'attemptBoth' }); const code = jsQR(img.data, img.width, img.height, { inversionAttempts: 'dontInvert' });
return code ? code.data : null; return code ? code.data : null;
}; };
@ -150,13 +146,7 @@
if (raw) { if (raw) {
const bytes = decode45(raw); const bytes = decode45(raw);
const p = await unpack(bytes); const p = await unpack(bytes);
if (p.v === 1) { if (p.v === 1) { callback(p, raw); return; }
v.classList.remove('scan-active');
v.classList.add('scan-done');
setTimeout(() => v.classList.remove('scan-done'), 600);
callback(p, raw);
return;
}
} }
} catch (_) {} } catch (_) {}
camRaf = requestAnimationFrame(tick); camRaf = requestAnimationFrame(tick);

View file

@ -192,15 +192,6 @@ h3 {
max-width: 320px; max-width: 320px;
border-radius: var(--radius); border-radius: var(--radius);
border: 2px solid var(--border); border: 2px solid var(--border);
transition: border-color 0.15s, box-shadow 0.15s;
}
video.scan-active {
border-color: #ff4444 !important;
box-shadow: 0 0 12px rgba(255,68,68,0.4);
}
video.scan-done {
border-color: #44ff44 !important;
box-shadow: 0 0 12px rgba(68,255,68,0.4);
} }
/* Protocol status */ /* Protocol status */
@ -350,7 +341,6 @@ video.scan-done {
border-radius: var(--radius); border-radius: var(--radius);
display: none; display: none;
margin: 8px auto; margin: 8px auto;
transition: border-color 0.15s, box-shadow 0.15s;
} }
#host-camera.active { #host-camera.active {
display: block; display: block;