{"version":3,"file":"index.esm.mjs","sources":["../src/utilities/isBarcodeDetectorSupported.ts","../src/hooks/useCamera.ts","../src/assets/base64Beep.ts","../src/utilities/createScannerError.ts","../src/hooks/useScanner.ts","../src/misc/defaultComponents.ts","../src/misc/defaultConstraints.ts","../src/misc/defaultStyles.ts","../src/misc/overlays.ts","../src/utilities/isDateObject.ts","../src/utilities/isNullOrUndefined.ts","../src/utilities/isObject.ts","../src/utilities/isPrimitive.ts","../src/utilities/deepEqual.ts","../src/assets/CameraOffIcon.tsx","../src/assets/CameraOnIcon.tsx","../src/components/OnOff.tsx","../src/assets/TorchOffIcon.tsx","../src/assets/TorchOnIcon.tsx","../src/components/Torch.tsx","../src/assets/ZoomInIcon.tsx","../src/assets/ZoomOutIcon.tsx","../src/components/Zoom.tsx","../src/components/Finder.tsx","../src/components/Scanner.tsx","../src/hooks/useDevices.ts"],"sourcesContent":["// Captured at module-evaluation time, before any side-effect imports\n// elsewhere in the package can install a polyfill. The package itself uses\n// `barcode-detector/ponyfill` (polyfill-free) so this stays accurate; if a\n// consumer separately installs `barcode-detector/polyfill` before importing\n// this library, this snapshot can still be a false positive — document that\n// edge case in the README.\nconst HAS_NATIVE_BARCODE_DETECTOR =\n\ttypeof window !== 'undefined' && 'BarcodeDetector' in window;\n\nexport function isBarcodeDetectorSupported(): boolean {\n\treturn HAS_NATIVE_BARCODE_DETECTOR;\n}\n","import 'webrtc-adapter';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { IStartCamera, IStartTaskResult, IStopTaskResult } from '../types';\n\ntype TaskResult = IStartTaskResult | IStopTaskResult;\n\nexport interface IUseCameraOptions {\n\t/** Maximum time (ms) to wait for the video element to start playing. */\n\tstartTimeoutMs?: number;\n\t/** Delay (ms) after `play()` before reading capabilities/settings. */\n\tsettleDelayMs?: number;\n}\n\nconst DEFAULT_START_TIMEOUT_MS = 3000;\nconst DEFAULT_SETTLE_DELAY_MS = 500;\n\nexport default function useCamera(options: IUseCameraOptions = {}) {\n\tconst {\n\t\tstartTimeoutMs = DEFAULT_START_TIMEOUT_MS,\n\t\tsettleDelayMs = DEFAULT_SETTLE_DELAY_MS,\n\t} = options;\n\n\tconst taskQueue = useRef<Promise<TaskResult>>(\n\t\tPromise.resolve({ type: 'stop', data: {} }),\n\t);\n\tconst currentStream = useRef<MediaStream | null>(null);\n\tconst currentVideoTrack = useRef<MediaStreamTrack | null>(null);\n\n\tconst [capabilities, setCapabilities] = useState<MediaTrackCapabilities>({});\n\tconst [settings, setSettings] = useState<MediaTrackSettings>({});\n\n\tconst runStartTask = useCallback(\n\t\tasync (\n\t\t\tvideoEl: HTMLVideoElement,\n\t\t\tconstraints: MediaTrackConstraints,\n\t\t): Promise<IStartTaskResult> => {\n\t\t\tif (!window.isSecureContext) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP.',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (navigator?.mediaDevices?.getUserMedia === undefined) {\n\t\t\t\tthrow new Error('this browser has no Stream API support');\n\t\t\t}\n\n\t\t\tconst stream = await navigator.mediaDevices.getUserMedia({\n\t\t\t\taudio: false,\n\t\t\t\tvideo: constraints,\n\t\t\t});\n\n\t\t\tvideoEl.srcObject = stream;\n\n\t\t\t// Race play() against a timeout. Some cameras legitimately take a\n\t\t\t// while to start (multi-cam phones, USB webcams initializing); the\n\t\t\t// timeout exists so a fully wedged play() doesn't hang the caller.\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\ttry {\n\t\t\t\tawait Promise.race([\n\t\t\t\t\tvideoEl.play(),\n\t\t\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\t\t\ttimeoutId = setTimeout(\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\t`Loading camera stream timed out after ${startTimeoutMs} ms.`,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tstartTimeoutMs,\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t} finally {\n\t\t\t\tif (timeoutId !== undefined) clearTimeout(timeoutId);\n\t\t\t}\n\n\t\t\t// Some browsers (notably mobile Safari) report stale track settings\n\t\t\t// immediately after play(); this short wait lets capabilities settle.\n\t\t\tif (settleDelayMs > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, settleDelayMs));\n\t\t\t}\n\n\t\t\tconst [track] = stream.getVideoTracks();\n\n\t\t\tsetSettings(track.getSettings());\n\t\t\tsetCapabilities(track.getCapabilities?.() ?? {});\n\n\t\t\tcurrentStream.current = stream;\n\t\t\tcurrentVideoTrack.current = track;\n\n\t\t\treturn {\n\t\t\t\ttype: 'start',\n\t\t\t\tdata: { videoEl, stream, constraints },\n\t\t\t};\n\t\t},\n\t\t[startTimeoutMs, settleDelayMs],\n\t);\n\n\tconst runStopTask = useCallback(\n\t\tasync (\n\t\t\tvideoEl: HTMLVideoElement,\n\t\t\tstream: MediaStream,\n\t\t): Promise<IStopTaskResult> => {\n\t\t\tvideoEl.srcObject = null;\n\t\t\tvideoEl.removeAttribute('src');\n\t\t\tvideoEl.load();\n\n\t\t\tfor (const track of stream.getTracks()) {\n\t\t\t\tstream.removeTrack(track);\n\t\t\t\ttrack.stop();\n\t\t\t}\n\n\t\t\tcurrentStream.current = null;\n\t\t\tcurrentVideoTrack.current = null;\n\n\t\t\tsetSettings({});\n\n\t\t\treturn { type: 'stop', data: {} };\n\t\t},\n\t\t[],\n\t);\n\n\tconst startCamera = useCallback(\n\t\tasync (\n\t\t\tvideoEl: HTMLVideoElement,\n\t\t\t{ constraints, restart = false }: IStartCamera,\n\t\t) => {\n\t\t\tlet startError: unknown = null;\n\n\t\t\ttaskQueue.current = taskQueue.current\n\t\t\t\t.then((prevTaskResult) => {\n\t\t\t\t\tif (prevTaskResult.type === 'start') {\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tvideoEl: prevVideoEl,\n\t\t\t\t\t\t\t\tstream: prevStream,\n\t\t\t\t\t\t\t\tconstraints: prevConstraints,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} = prevTaskResult;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!restart &&\n\t\t\t\t\t\t\tvideoEl === prevVideoEl &&\n\t\t\t\t\t\t\tconstraints === prevConstraints\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn prevTaskResult;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn runStopTask(prevVideoEl, prevStream).then(() =>\n\t\t\t\t\t\t\trunStartTask(videoEl, constraints),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn runStartTask(videoEl, constraints);\n\t\t\t\t})\n\t\t\t\t.catch((error): IStopTaskResult => {\n\t\t\t\t\tstartError = error;\n\t\t\t\t\treturn { type: 'stop', data: {} };\n\t\t\t\t});\n\n\t\t\tconst taskResult = await taskQueue.current;\n\n\t\t\tif (startError) throw startError;\n\n\t\t\tif (taskResult.type === 'stop') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Something went wrong with the camera task queue (start task).',\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[runStartTask, runStopTask],\n\t);\n\n\tconst stopCamera = useCallback(async () => {\n\t\ttaskQueue.current = taskQueue.current.then((prevTaskResult) => {\n\t\t\tif (prevTaskResult.type === 'stop') {\n\t\t\t\treturn prevTaskResult;\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\tdata: { videoEl, stream },\n\t\t\t} = prevTaskResult;\n\n\t\t\treturn runStopTask(videoEl, stream);\n\t\t});\n\n\t\tconst taskResult = await taskQueue.current;\n\n\t\tif (taskResult.type === 'start') {\n\t\t\tthrow new Error(\n\t\t\t\t'Something went wrong with the camera task queue (stop task).',\n\t\t\t);\n\t\t}\n\t}, [runStopTask]);\n\n\tconst updateConstraints = useCallback(\n\t\tasync (newConstraints: MediaTrackConstraints) => {\n\t\t\t// Route through the task queue so updates can't race with start/stop.\n\t\t\t// On failure, preserve the previous start-task result so stopCamera()\n\t\t\t// can still tear down the live stream — synthesizing a fake `stop`\n\t\t\t// result here would corrupt the queue and orphan the camera hardware.\n\t\t\tlet updateError: unknown = null;\n\n\t\t\ttaskQueue.current = taskQueue.current.then(\n\t\t\t\tasync (prevTaskResult): Promise<TaskResult> => {\n\t\t\t\t\tconst videoTrack = currentVideoTrack.current;\n\n\t\t\t\t\tif (!videoTrack || prevTaskResult.type !== 'start') {\n\t\t\t\t\t\tupdateError = new Error('No active video track found.');\n\n\t\t\t\t\t\treturn prevTaskResult;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Mobile browsers can't mix ImageCapture (torch) and non-ImageCapture\n\t\t\t\t\t\t// (zoom) constraints. If the zoom is being applied while the torch is on,\n\t\t\t\t\t\t// disable the torch first and sync the React state so the UI reflects it.\n\t\t\t\t\t\tif (newConstraints.advanced?.[0]?.zoom) {\n\t\t\t\t\t\t\tconst caps = videoTrack.getCapabilities();\n\n\t\t\t\t\t\t\tif (caps.torch) {\n\t\t\t\t\t\t\t\tawait videoTrack.applyConstraints({\n\t\t\t\t\t\t\t\t\tadvanced: [{ torch: false }],\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsetSettings(videoTrack.getSettings());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait videoTrack.applyConstraints(newConstraints);\n\n\t\t\t\t\t\tsetCapabilities(videoTrack.getCapabilities());\n\t\t\t\t\t\tsetSettings(videoTrack.getSettings());\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tupdateError = err;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn prevTaskResult;\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tawait taskQueue.current;\n\n\t\t\tif (updateError) throw updateError;\n\t\t},\n\t\t[],\n\t);\n\n\tconst flush = useCallback(async () => {\n\t\ttry {\n\t\t\tawait taskQueue.current;\n\t\t} catch {\n\t\t\t// Already settled; error path doesn't matter for flush.\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t// Best-effort cleanup. Tasks already in the queue will still run;\n\t\t\t// callers that need deterministic teardown should await stopCamera()\n\t\t\t// (and optionally flush()) before unmounting.\n\t\t\tvoid stopCamera();\n\t\t};\n\t}, [stopCamera]);\n\n\treturn {\n\t\tcapabilities,\n\t\tsettings,\n\t\tstartCamera,\n\t\tstopCamera,\n\t\tupdateConstraints,\n\t\tflush,\n\t\tgetStream: () => currentStream.current,\n\t};\n}\n","export const base64Beep =\n\t'data:audio/mp3;base64,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';\n","import type { IScannerError, ScannerErrorKind } from '../types';\n\nconst NAME_TO_KIND: Record<string, ScannerErrorKind> = {\n\tNotAllowedError: 'permission-denied',\n\tPermissionDeniedError: 'permission-denied',\n\tNotFoundError: 'no-camera',\n\tDevicesNotFoundError: 'no-camera',\n\tNotReadableError: 'in-use',\n\tTrackStartError: 'in-use',\n\tOverconstrainedError: 'overconstrained',\n\tConstraintNotSatisfiedError: 'overconstrained',\n\tAbortError: 'aborted',\n\tSecurityError: 'security',\n\tTypeError: 'type-error',\n};\n\nexport function createScannerError(cause: unknown): IScannerError {\n\tif (cause instanceof DOMException || cause instanceof Error) {\n\t\tconst name = (cause as { name?: string }).name ?? '';\n\t\tconst message = cause.message ?? String(cause);\n\n\t\tif (message.includes('secure context')) {\n\t\t\treturn { kind: 'insecure-context', message, cause };\n\t\t}\n\n\t\tif (message.includes('Stream API')) {\n\t\t\treturn { kind: 'unsupported', message, cause };\n\t\t}\n\n\t\tconst kind = NAME_TO_KIND[name] ?? 'unknown';\n\n\t\treturn { kind, message, cause };\n\t}\n\n\treturn {\n\t\tkind: 'unknown',\n\t\tmessage: typeof cause === 'string' ? cause : 'Unknown scanner error',\n\t\tcause,\n\t};\n}\n","import {\n\tBarcodeDetector,\n\ttype BarcodeFormat,\n\ttype DetectedBarcode,\n} from 'barcode-detector/ponyfill';\nimport { type RefObject, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { base64Beep } from '../assets/base64Beep';\nimport type { IScannerError, IUseScannerState } from '../types';\nimport { createScannerError } from '../utilities/createScannerError';\n\ninterface IUseScannerProps {\n\tvideoElementRef: RefObject<HTMLVideoElement | null>;\n\tonScan: (result: DetectedBarcode[]) => void;\n\tonFound: (result: DetectedBarcode[]) => void;\n\tonError?: (error: IScannerError) => void;\n\tformats?: BarcodeFormat[];\n\tsound?: boolean | string;\n\tallowMultiple?: boolean;\n\tretryDelay?: number;\n\tscanDelay?: number;\n}\n\nconst EMPTY_FORMATS: BarcodeFormat[] = [];\n\nexport default function useScanner(props: IUseScannerProps) {\n\tconst {\n\t\tvideoElementRef,\n\t\tonScan,\n\t\tonFound,\n\t\tonError,\n\t\tretryDelay = 100,\n\t\tscanDelay = 0,\n\t\tformats = EMPTY_FORMATS,\n\t\tallowMultiple = false,\n\t\tsound = true,\n\t}: IUseScannerProps = props;\n\n\t// Stable key so a new array reference with identical contents doesn't\n\t// rebuild the detector every render.\n\tconst formatsKey = useMemo(() => [...formats].sort().join('|'), [formats]);\n\n\tconst barcodeDetectorRef = useRef<BarcodeDetector | null>(null);\n\tconst audioRef = useRef<HTMLAudioElement | null>(null);\n\tconst animationFrameIdRef = useRef<number | null>(null);\n\n\tif (typeof window !== 'undefined' && barcodeDetectorRef.current === null) {\n\t\tbarcodeDetectorRef.current = new BarcodeDetector({ formats });\n\t}\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: formatsKey is the stable identity for `formats`\n\tuseEffect(() => {\n\t\tif (typeof window === 'undefined') return;\n\n\t\tbarcodeDetectorRef.current = new BarcodeDetector({ formats });\n\t}, [formatsKey]);\n\n\tuseEffect(() => {\n\t\tif (typeof window === 'undefined' || !sound) {\n\t\t\taudioRef.current = null;\n\n\t\t\treturn;\n\t\t}\n\n\t\taudioRef.current = new Audio(\n\t\t\ttypeof sound === 'string' ? sound : base64Beep,\n\t\t);\n\n\t\treturn () => {\n\t\t\taudioRef.current?.pause();\n\t\t\taudioRef.current = null;\n\t\t};\n\t}, [sound]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: videoElementRef is a stable ref object; we intentionally read .current at execution time\n\tconst processFrame = useCallback(\n\t\t(state: IUseScannerState) => async (timeNow: number) => {\n\t\t\tconst detector = barcodeDetectorRef.current;\n\t\t\tif (\n\t\t\t\tvideoElementRef.current === null ||\n\t\t\t\tvideoElementRef.current.readyState <= 1 ||\n\t\t\t\tdetector === null\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { lastScan, contentBefore, lastScanHadContent } = state;\n\n\t\t\tif (timeNow - lastScan < retryDelay) {\n\t\t\t\tanimationFrameIdRef.current = window.requestAnimationFrame(\n\t\t\t\t\tprocessFrame(state),\n\t\t\t\t);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet detectedCodes: DetectedBarcode[];\n\n\t\t\ttry {\n\t\t\t\tdetectedCodes = await detector.detect(videoElementRef.current);\n\t\t\t} catch (err) {\n\t\t\t\t// Detector rejections (polyfill WASM init failures, OOM, corrupt\n\t\t\t\t// frames, etc.) would otherwise kill the RAF loop silently. Surface\n\t\t\t\t// the failure via onError and stop scanning so the caller can\n\t\t\t\t// remount or recover deliberately.\n\t\t\t\tonError?.(createScannerError(err));\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst anyNewCodesDetected = detectedCodes.some(\n\t\t\t\t(code: DetectedBarcode) => !contentBefore.has(code.rawValue),\n\t\t\t);\n\n\t\t\tconst currentScanHasContent = detectedCodes.length > 0;\n\n\t\t\tlet lastOnScan = state.lastOnScan;\n\t\t\tconst scanDelayPassed = timeNow - lastOnScan >= scanDelay;\n\n\t\t\tif (\n\t\t\t\tanyNewCodesDetected ||\n\t\t\t\t(allowMultiple && currentScanHasContent && scanDelayPassed)\n\t\t\t) {\n\t\t\t\tif (sound && audioRef.current?.paused) {\n\t\t\t\t\taudioRef.current\n\t\t\t\t\t\t.play()\n\t\t\t\t\t\t.catch((error) => console.error('Error playing the sound', error));\n\t\t\t\t}\n\n\t\t\t\tlastOnScan = timeNow;\n\t\t\t\tonScan(detectedCodes);\n\t\t\t}\n\n\t\t\tif (currentScanHasContent || lastScanHadContent) {\n\t\t\t\tonFound(detectedCodes);\n\t\t\t}\n\n\t\t\tconst newContentBefore = anyNewCodesDetected\n\t\t\t\t? new Set(detectedCodes.map((code: DetectedBarcode) => code.rawValue))\n\t\t\t\t: contentBefore;\n\n\t\t\tconst newState: IUseScannerState = {\n\t\t\t\tlastScan: timeNow,\n\t\t\t\tlastOnScan,\n\t\t\t\tlastScanHadContent: currentScanHasContent,\n\t\t\t\tcontentBefore: newContentBefore,\n\t\t\t};\n\n\t\t\tanimationFrameIdRef.current = window.requestAnimationFrame(\n\t\t\t\tprocessFrame(newState),\n\t\t\t);\n\t\t},\n\t\t[onScan, onFound, onError, retryDelay, allowMultiple, scanDelay, sound],\n\t);\n\n\tconst startScanning = useCallback(() => {\n\t\tif (typeof window === 'undefined') return;\n\n\t\tconst current = performance.now();\n\n\t\tconst initialState: IUseScannerState = {\n\t\t\tlastScan: current,\n\t\t\tlastOnScan: current,\n\t\t\tcontentBefore: new Set<string>(),\n\t\t\tlastScanHadContent: false,\n\t\t};\n\n\t\tanimationFrameIdRef.current = window.requestAnimationFrame(\n\t\t\tprocessFrame(initialState),\n\t\t);\n\t}, [processFrame]);\n\n\tconst stopScanning = useCallback(() => {\n\t\tif (animationFrameIdRef.current !== null) {\n\t\t\twindow.cancelAnimationFrame(animationFrameIdRef.current);\n\t\t\tanimationFrameIdRef.current = null;\n\t\t}\n\t}, []);\n\n\treturn {\n\t\tstartScanning,\n\t\tstopScanning,\n\t};\n}\n","import type { IScannerComponents } from '../types';\n\nexport const defaultComponents: IScannerComponents = {\n\tfinder: true,\n\ttorch: true,\n\ttracker: undefined,\n\tonOff: false,\n\tzoom: false,\n};\n","export const defaultConstraints: MediaTrackConstraints = {\n\tfacingMode: 'environment',\n\twidth: { min: 640, ideal: 720, max: 1920 },\n\theight: { min: 640, ideal: 720, max: 1080 },\n};\n","import type { IScannerStyles } from '../types';\n\nexport const defaultStyles: IScannerStyles = {\n\tcontainer: {\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\tposition: 'relative',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\toverflow: 'hidden',\n\t\taspectRatio: '1/1',\n\t},\n\tvideo: {\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\tobjectFit: 'cover',\n\t\toverflow: 'hidden',\n\t},\n};\n","import type { IDetectedBarcode } from '../types';\n\n/**\n * Tracker overlay that draws an outline connecting the four corner points\n * of every detected barcode.\n */\nexport function outline(\n\tdetectedCodes: IDetectedBarcode[],\n\tctx: CanvasRenderingContext2D,\n) {\n\tfor (const detectedCode of detectedCodes) {\n\t\tconst [firstPoint, ...otherPoints] = detectedCode.cornerPoints;\n\n\t\tctx.lineWidth = 2;\n\t\tctx.strokeStyle = 'yellow';\n\n\t\tctx.beginPath();\n\t\tctx.moveTo(firstPoint.x, firstPoint.y);\n\n\t\tfor (const { x, y } of otherPoints) {\n\t\t\tctx.lineTo(x, y);\n\t\t}\n\n\t\tctx.lineTo(firstPoint.x, firstPoint.y);\n\t\tctx.closePath();\n\t\tctx.stroke();\n\t}\n}\n\n/**\n * Tracker overlay that draws an axis-aligned bounding box around each barcode.\n */\nexport function boundingBox(\n\tdetectedCodes: IDetectedBarcode[],\n\tctx: CanvasRenderingContext2D,\n) {\n\tfor (const detectedCode of detectedCodes) {\n\t\tconst {\n\t\t\tboundingBox: { x, y, width, height },\n\t\t} = detectedCode;\n\n\t\tctx.lineWidth = 2;\n\t\tctx.strokeStyle = 'yellow';\n\t\tctx.strokeRect(x, y, width, height);\n\t}\n}\n\ninterface IParsedSegments {\n\tlines: string[];\n\tparsedLines: Array<\n\t\tArray<{ text: string; color: 'black' | 'blue' | 'green' }>\n\t>;\n}\n\nconst PROPERTY_RE = /\"([^\"]+)\":/g;\nconst VALUE_RE = /:\\s*(\"[^\"]*\"|\\d+|true|false|null)/g;\n\nconst TEXT_CACHE = new Map<string, IParsedSegments>();\nconst TEXT_CACHE_LIMIT = 32;\n\nfunction parseRawValue(rawValue: string): IParsedSegments {\n\tconst cached = TEXT_CACHE.get(rawValue);\n\n\tif (cached !== undefined) return cached;\n\n\tlet formatted: string;\n\n\ttry {\n\t\tformatted = JSON.stringify(JSON.parse(rawValue), null, 2);\n\t} catch {\n\t\tformatted = rawValue;\n\t}\n\n\tconst lines = formatted.split('\\n');\n\tconst parsedLines = lines.map((line) => {\n\t\tconst segments: Array<{ text: string; color: 'black' | 'blue' | 'green' }> =\n\t\t\t[];\n\t\tconst propertyMatches = [...line.matchAll(PROPERTY_RE)];\n\t\tconst valueMatches = [...line.matchAll(VALUE_RE)];\n\t\tlet lastIndex = 0;\n\n\t\tpropertyMatches.forEach((match, matchIndex) => {\n\t\t\tconst property = match[0].replace(':', '');\n\t\t\tconst matchIdx = match.index ?? 0;\n\t\t\tconst beforeProperty = line.substring(lastIndex, matchIdx);\n\n\t\t\tif (beforeProperty.length > 0) {\n\t\t\t\tsegments.push({ text: beforeProperty, color: 'black' });\n\t\t\t}\n\n\t\t\tsegments.push({ text: property, color: 'blue' });\n\t\t\tsegments.push({ text: ': ', color: 'black' });\n\t\t\tlastIndex = matchIdx + property.length;\n\n\t\t\tif (matchIndex < valueMatches.length) {\n\t\t\t\tconst valueMatch = valueMatches[matchIndex];\n\t\t\t\tconst valueIdx = valueMatch.index ?? 0;\n\t\t\t\tconst beforeValue = line.substring(lastIndex, valueIdx);\n\n\t\t\t\tif (beforeValue.length > 0) {\n\t\t\t\t\tsegments.push({ text: beforeValue, color: 'black' });\n\t\t\t\t}\n\n\t\t\t\tconst value = valueMatch[0].match(/:\\s*(.*)/)?.[1] ?? '';\n\n\t\t\t\tsegments.push({ text: value, color: 'green' });\n\t\t\t\tlastIndex = valueIdx + valueMatch[0].length;\n\t\t\t}\n\t\t});\n\n\t\tconst remaining = line.substring(lastIndex);\n\n\t\tif (remaining.length > 0) {\n\t\t\tsegments.push({ text: remaining, color: 'black' });\n\t\t}\n\n\t\treturn segments;\n\t});\n\n\tconst parsed: IParsedSegments = { lines, parsedLines };\n\n\tif (TEXT_CACHE.size >= TEXT_CACHE_LIMIT) {\n\t\tconst firstKey = TEXT_CACHE.keys().next().value;\n\n\t\tif (firstKey !== undefined) TEXT_CACHE.delete(firstKey);\n\t}\n\n\tTEXT_CACHE.set(rawValue, parsed);\n\n\treturn parsed;\n}\n\n/**\n * Tracker overlay that draws the barcode's `rawValue` centered on the detected\n * region, with JSON-aware syntax highlighting when the value parses as JSON.\n *\n * Parsed output is cached per `rawValue` (bounded LRU, 32 entries) so each\n * frame only re-runs the JSON parse + regex split when a new value appears.\n */\nexport function centerText(\n\tdetectedCodes: IDetectedBarcode[],\n\tctx: CanvasRenderingContext2D,\n) {\n\tfor (const detectedCode of detectedCodes) {\n\t\tconst { boundingBox, rawValue } = detectedCode;\n\t\tconst centerX = boundingBox.x + boundingBox.width / 2;\n\t\tconst centerY = boundingBox.y + boundingBox.height / 2;\n\t\tconst fontSize = Math.max(12, (50 * boundingBox.width) / ctx.canvas.width);\n\t\tconst lineHeight = fontSize;\n\n\t\tctx.font = `${fontSize}px sans-serif`;\n\t\tctx.textAlign = 'left';\n\n\t\tconst { lines, parsedLines } = parseRawValue(rawValue);\n\n\t\tconst textWidth = Math.max(\n\t\t\t...lines.map((line) => ctx.measureText(line).width),\n\t\t);\n\t\tconst textHeight = lines.length * lineHeight;\n\t\tconst padding = 10;\n\t\tconst rectX = centerX - textWidth / 2 - padding;\n\t\tconst rectY = centerY - textHeight / 2 - padding;\n\t\tconst rectWidth = textWidth + padding * 2;\n\t\tconst rectHeight = textHeight + padding;\n\t\tconst radius = 8;\n\n\t\tctx.beginPath();\n\t\tctx.moveTo(rectX + radius, rectY);\n\t\tctx.lineTo(rectX + rectWidth - radius, rectY);\n\t\tctx.quadraticCurveTo(\n\t\t\trectX + rectWidth,\n\t\t\trectY,\n\t\t\trectX + rectWidth,\n\t\t\trectY + radius,\n\t\t);\n\t\tctx.lineTo(rectX + rectWidth, rectY + rectHeight - radius);\n\t\tctx.quadraticCurveTo(\n\t\t\trectX + rectWidth,\n\t\t\trectY + rectHeight,\n\t\t\trectX + rectWidth - radius,\n\t\t\trectY + rectHeight,\n\t\t);\n\t\tctx.lineTo(rectX + radius, rectY + rectHeight);\n\t\tctx.quadraticCurveTo(\n\t\t\trectX,\n\t\t\trectY + rectHeight,\n\t\t\trectX,\n\t\t\trectY + rectHeight - radius,\n\t\t);\n\t\tctx.lineTo(rectX, rectY + radius);\n\t\tctx.quadraticCurveTo(rectX, rectY, rectX + radius, rectY);\n\t\tctx.closePath();\n\t\tctx.fillStyle = 'rgba(255, 255, 0, 0.9)';\n\t\tctx.fill();\n\n\t\tparsedLines.forEach((segments, index) => {\n\t\t\tconst y =\n\t\t\t\tcenterY + index * lineHeight - ((lines.length - 1) * lineHeight) / 2;\n\t\t\tlet currentX = centerX - textWidth / 2;\n\n\t\t\tfor (const { text, color } of segments) {\n\t\t\t\tctx.fillStyle = color;\n\t\t\t\tctx.fillText(text, currentX, y);\n\t\t\t\tcurrentX += ctx.measureText(text).width;\n\t\t\t}\n\t\t});\n\t}\n}\n","export default (value: unknown): value is Date => value instanceof Date;\n","export default (value: unknown): value is null | undefined => value == null;\n","import isDateObject from './isDateObject';\nimport isNullOrUndefined from './isNullOrUndefined';\n\nexport const isObjectType = (value: unknown) => typeof value === 'object';\n\nexport default <T extends object>(value: unknown): value is T =>\n\t!isNullOrUndefined(value) &&\n\t!Array.isArray(value) &&\n\tisObjectType(value) &&\n\t!isDateObject(value);\n","import isNullOrUndefined from './isNullOrUndefined';\nimport { isObjectType } from './isObject';\n\ntype Primitive = null | undefined | string | number | boolean | symbol | bigint;\n\nexport default (value: unknown): value is Primitive =>\n\tisNullOrUndefined(value) || !isObjectType(value);\n","import isDateObject from './isDateObject';\nimport isObject from './isObject';\nimport isPrimitive from './isPrimitive';\n\nexport default function deepEqual(object1: unknown, object2: unknown): boolean {\n\tif (isPrimitive(object1) || isPrimitive(object2)) {\n\t\treturn object1 === object2;\n\t}\n\n\tif (isDateObject(object1) && isDateObject(object2)) {\n\t\treturn object1.getTime() === object2.getTime();\n\t}\n\n\tif (Array.isArray(object1) && Array.isArray(object2)) {\n\t\tif (object1.length !== object2.length) return false;\n\n\t\tfor (let i = 0; i < object1.length; i++) {\n\t\t\tif (!deepEqual(object1[i], object2[i])) return false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tif (!isObject(object1) || !isObject(object2)) return false;\n\n\tconst obj1 = object1 as Record<string, unknown>;\n\tconst obj2 = object2 as Record<string, unknown>;\n\n\tconst keys1 = Object.keys(obj1);\n\tconst keys2 = Object.keys(obj2);\n\n\tif (keys1.length !== keys2.length) return false;\n\n\tconst keys2Set = new Set(keys2);\n\n\tfor (const key of keys1) {\n\t\tif (!keys2Set.has(key)) return false;\n\n\t\t// React refs are compared by props identity downstream; their\n\t\t// internal `.current` mutates without a re-render, so skipping\n\t\t// avoids false positives when comparing props/constraints.\n\t\tif (key === 'ref') continue;\n\n\t\tconst val1 = obj1[key];\n\t\tconst val2 = obj2[key];\n\n\t\tconst bothObjects = isObject(val1) && isObject(val2);\n\t\tconst bothArrays = Array.isArray(val1) && Array.isArray(val2);\n\t\tconst bothDates = isDateObject(val1) && isDateObject(val2);\n\n\t\tif (bothObjects || bothArrays || bothDates) {\n\t\t\tif (!deepEqual(val1, val2)) return false;\n\t\t} else if (val1 !== val2) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n","import type { CSSProperties } from 'react';\n\ninterface ICameraOffProps {\n\tdisabled?: boolean;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nexport default function CameraOffIcon(props: ICameraOffProps) {\n\tconst { disabled = false, className, style } = props;\n\n\tconst mergedStyle: CSSProperties = {\n\t\tstroke: disabled ? 'grey' : 'yellow',\n\t\tfill: 'none',\n\t\tstrokeLinejoin: 'round',\n\t\tstrokeLinecap: 'round',\n\t\tstrokeWidth: 1.5,\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergedStyle}\n\t\t\twidth=\"28px\"\n\t\t\theight=\"28px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path d=\"M3 3L6.00007 6.00007M21 21L19.8455 19.8221M9.74194 4.06811C9.83646 4.04279 9.93334 4.02428 10.0319 4.01299C10.1453 4 10.2683 4 10.5141 4H13.5327C13.7786 4 13.9015 4 14.015 4.01299C14.6068 4.08078 15.1375 4.40882 15.4628 4.90782C15.5252 5.00345 15.5802 5.11345 15.6901 5.33333C15.7451 5.44329 15.7726 5.49827 15.8037 5.54609C15.9664 5.79559 16.2318 5.95961 16.5277 5.9935C16.5844 6 16.6459 6 16.7688 6H17.8234C18.9435 6 19.5036 6 19.9314 6.21799C20.3077 6.40973 20.6137 6.71569 20.8055 7.09202C21.0234 7.51984 21.0234 8.0799 21.0234 9.2V15.3496M19.8455 19.8221C19.4278 20 18.8702 20 17.8234 20H6.22344C5.10333 20 4.54328 20 4.11546 19.782C3.73913 19.5903 3.43317 19.2843 3.24142 18.908C3.02344 18.4802 3.02344 17.9201 3.02344 16.8V9.2C3.02344 8.0799 3.02344 7.51984 3.24142 7.09202C3.43317 6.71569 3.73913 6.40973 4.11546 6.21799C4.51385 6.015 5.0269 6.00103 6.00007 6.00007M19.8455 19.8221L14.5619 14.5619M14.5619 14.5619C14.0349 15.4243 13.0847 16 12 16C10.3431 16 9 14.6569 9 13C9 11.9153 9.57566 10.9651 10.4381 10.4381M14.5619 14.5619L10.4381 10.4381M10.4381 10.4381L6.00007 6.00007\" />\n\t\t</svg>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\ninterface ICameraOnProps {\n\tdisabled?: boolean;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nexport default function CameraOnIcon(props: ICameraOnProps) {\n\tconst { disabled = false, className, style } = props;\n\n\tconst mergedStyle: CSSProperties = {\n\t\tstroke: disabled ? 'grey' : 'yellow',\n\t\tfill: 'none',\n\t\tstrokeLinejoin: 'round',\n\t\tstrokeLinecap: 'round',\n\t\tstrokeWidth: 1.5,\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergedStyle}\n\t\t\twidth=\"28px\"\n\t\t\theight=\"28px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path d=\"M12 16C13.6569 16 15 14.6569 15 13C15 11.3431 13.6569 10 12 10C10.3431 10 9 11.3431 9 13C9 14.6569 10.3431 16 12 16Z\" />\n\t\t\t<path d=\"M3 16.8V9.2C3 8.0799 3 7.51984 3.21799 7.09202C3.40973 6.71569 3.71569 6.40973 4.09202 6.21799C4.51984 6 5.0799 6 6.2 6H7.25464C7.37758 6 7.43905 6 7.49576 5.9935C7.79166 5.95961 8.05705 5.79559 8.21969 5.54609C8.25086 5.49827 8.27836 5.44328 8.33333 5.33333C8.44329 5.11342 8.49827 5.00346 8.56062 4.90782C8.8859 4.40882 9.41668 4.08078 10.0085 4.01299C10.1219 4 10.2448 4 10.4907 4H13.5093C13.7552 4 13.8781 4 13.9915 4.01299C14.5833 4.08078 15.1141 4.40882 15.4394 4.90782C15.5017 5.00345 15.5567 5.11345 15.6667 5.33333C15.7216 5.44329 15.7491 5.49827 15.7803 5.54609C15.943 5.79559 16.2083 5.95961 16.5042 5.9935C16.561 6 16.6224 6 16.7454 6H17.8C18.9201 6 19.4802 6 19.908 6.21799C20.2843 6.40973 20.5903 6.71569 20.782 7.09202C21 7.51984 21 8.0799 21 9.2V16.8C21 17.9201 21 18.4802 20.782 18.908C20.5903 19.2843 20.2843 19.5903 19.908 19.782C19.4802 20 18.9201 20 17.8 20H6.2C5.0799 20 4.51984 20 4.09202 19.782C3.71569 19.5903 3.40973 19.2843 3.21799 18.908C3 18.4802 3 17.9201 3 16.8Z\" />\n\t\t</svg>\n\t);\n}\n","import { type CSSProperties, useEffect, useRef, useState } from 'react';\n\nimport CameraOffIcon from '../assets/CameraOffIcon';\nimport CameraOnIcon from '../assets/CameraOnIcon';\n\ninterface IOnOffProps {\n\tscanning: boolean;\n\tstartScanning: (deviceId?: string | undefined) => void;\n\tstopScanning: () => void;\n}\n\nconst buttonStyle: CSSProperties = {\n\tbottom: 85,\n\tright: 8,\n\tposition: 'absolute',\n\tzIndex: 2,\n\tbackground: 'transparent',\n\tborder: 0,\n\tpadding: 4,\n\tmargin: 0,\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n};\n\nexport default function OnOff(props: IOnOffProps) {\n\tconst { scanning, startScanning, stopScanning } = props;\n\n\tconst [buttonDisabled, setButtonDisabled] = useState(false);\n\tconst timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n\t\t};\n\t}, []);\n\n\tfunction toggleScanning() {\n\t\tif (buttonDisabled) return;\n\n\t\tsetButtonDisabled(true);\n\n\t\tif (scanning) {\n\t\t\tstopScanning();\n\t\t} else {\n\t\t\tstartScanning();\n\t\t}\n\n\t\tif (timeoutRef.current !== null) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t}\n\n\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\tsetButtonDisabled(false);\n\t\t\ttimeoutRef.current = null;\n\t\t}, 1000);\n\t}\n\n\tconst label = scanning ? 'Turn camera off' : 'Turn camera on';\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={label}\n\t\t\taria-pressed={scanning}\n\t\t\tdisabled={buttonDisabled}\n\t\t\tonClick={toggleScanning}\n\t\t\tstyle={{\n\t\t\t\t...buttonStyle,\n\t\t\t\tcursor: buttonDisabled ? 'default' : 'pointer',\n\t\t\t}}\n\t\t>\n\t\t\t{scanning ? (\n\t\t\t\t<CameraOffIcon disabled={buttonDisabled} />\n\t\t\t) : (\n\t\t\t\t<CameraOnIcon disabled={buttonDisabled} />\n\t\t\t)}\n\t\t</button>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\ninterface ITorchOffProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nexport default function TorchOffIcon(props: ITorchOffProps) {\n\tconst { className, style } = props;\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\twidth=\"30px\"\n\t\t\theight=\"30px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tclassName={className}\n\t\t\tstyle={style}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeWidth={0.2}\n\t\t\t\tstroke=\"yellow\"\n\t\t\t\tfill=\"yellow\"\n\t\t\t\td=\"M14.516 15.158l.714.714-4.595 6.14-.75-.364L12.337 13H6.978L8.22 8.861l.803.803L8.322 12h3.036l1.793 1.792-1.475 5.16zm5.984 4.05L4.793 3.5l.707-.707 3.492 3.492L10.278 2h7.972l-5.025 7h7.149l-3.71 4.957 4.543 4.543zM12.707 10l3.243 3.243L18.376 10zM9.795 7.088l2.079 2.079L16.3 3h-5.278z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\ninterface ITorchOnProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nexport default function TorchOnIcon(props: ITorchOnProps) {\n\tconst { className, style } = props;\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\twidth=\"30px\"\n\t\t\theight=\"30px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tclassName={className}\n\t\t\tstyle={style}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeWidth={0.2}\n\t\t\t\tstroke=\"yellow\"\n\t\t\t\tfill=\"yellow\"\n\t\t\t\td=\"M13.225 9l5.025-7h-7.972l-3.3 11h5.359l-2.452 8.648.75.364L20.374 9zm.438 3H8.322l2.7-9H16.3l-5.025 7h7.101l-6.7 8.953z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\nimport TorchOffIcon from '../assets/TorchOffIcon';\nimport TorchOnIcon from '../assets/TorchOnIcon';\n\ninterface ITorchProps {\n\tscanning: boolean;\n\tstatus: boolean;\n\ttorchToggle: (value: boolean) => void;\n}\n\nconst buttonStyle: CSSProperties = {\n\tbottom: 35,\n\tright: 8,\n\tposition: 'absolute',\n\tzIndex: 2,\n\tbackground: 'transparent',\n\tborder: 0,\n\tpadding: 4,\n\tmargin: 0,\n\tcursor: 'pointer',\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n};\n\nexport default function Torch(props: ITorchProps) {\n\tconst { status, scanning, torchToggle } = props;\n\n\tif (!scanning) return null;\n\n\tconst label = status ? 'Turn flashlight off' : 'Turn flashlight on';\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={label}\n\t\t\taria-pressed={status}\n\t\t\tonClick={() => torchToggle(!status)}\n\t\t\tstyle={buttonStyle}\n\t\t>\n\t\t\t{status ? <TorchOffIcon /> : <TorchOnIcon />}\n\t\t</button>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\ninterface IZoomInProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tdisabled?: boolean;\n}\n\nexport default function ZoomInIcon(props: IZoomInProps) {\n\tconst { className, disabled = false, style } = props;\n\n\tconst mergedStyle: CSSProperties = {\n\t\tstroke: disabled ? 'grey' : 'yellow',\n\t\tfill: disabled ? 'grey' : 'yellow',\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\twidth=\"30px\"\n\t\t\theight=\"30px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergedStyle}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeWidth={0.3}\n\t\t\t\td=\"M16.279,17.039c-1.396,1.209 -3.216,1.941 -5.206,1.941c-4.393,0 -7.96,-3.567 -7.96,-7.96c-0,-4.393 3.567,-7.96 7.96,-7.96c4.393,0 7.96,3.567 7.96,7.96c-0,2.044 -0.772,3.909 -2.04,5.319l0.165,0.165c1.194,1.194 2.388,2.388 3.583,3.582c0.455,0.456 -0.252,1.163 -0.707,0.708l-3.755,-3.755Zm1.754,-6.019c-0,-3.841 -3.119,-6.96 -6.96,-6.96c-3.842,0 -6.96,3.119 -6.96,6.96c-0,3.841 3.118,6.96 6.96,6.96c3.841,0 6.96,-3.119 6.96,-6.96Zm-7.46,0.5l-1.5,0c-0.645,0 -0.643,-1 -0,-1l1.5,0l-0,-1.5c-0,-0.645 1,-0.643 1,0l-0,1.5l1.5,0c0.645,0 0.643,1 -0,1l-1.5,0l-0,1.5c-0,0.645 -1,0.643 -1,0l-0,-1.5Z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\ninterface IZoomOutProps {\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\tdisabled?: boolean;\n}\n\nexport default function ZoomOutIcon(props: IZoomOutProps) {\n\tconst { className, disabled = false, style } = props;\n\n\tconst mergedStyle: CSSProperties = {\n\t\tstroke: disabled ? 'grey' : 'yellow',\n\t\tfill: disabled ? 'grey' : 'yellow',\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\twidth=\"30px\"\n\t\t\theight=\"30px\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tclassName={className}\n\t\t\tstyle={mergedStyle}\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<path\n\t\t\t\tstrokeWidth={0.3}\n\t\t\t\td=\"M16.279,17.039c-1.396,1.209 -3.216,1.941 -5.206,1.941c-4.393,0 -7.96,-3.567 -7.96,-7.96c-0,-4.393 3.567,-7.96 7.96,-7.96c4.393,0 7.96,3.567 7.96,7.96c-0,2.044 -0.772,3.909 -2.04,5.319l0.165,0.165c1.194,1.194 2.388,2.388 3.583,3.582c0.455,0.456 -0.252,1.163 -0.707,0.708l-3.755,-3.755Zm1.754,-6.019c-0,-3.841 -3.119,-6.96 -6.96,-6.96c-3.842,0 -6.96,3.119 -6.96,6.96c-0,3.841 3.118,6.96 6.96,6.96c3.841,0 6.96,-3.119 6.96,-6.96Zm-4.96,-0.5c0.645,0 0.643,1 -0,1l-4,0c-0.645,0 -0.643,-1 -0,-1l4,0Z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import { type CSSProperties, Fragment } from 'react';\n\nimport ZoomInIcon from '../assets/ZoomInIcon';\nimport ZoomOutIcon from '../assets/ZoomOutIcon';\n\ninterface IZoomProps {\n\tscanning: boolean;\n\tcapabilities: { min: number; max: number; step: number };\n\tvalue: number;\n\tonZoom: (value: number) => void;\n}\n\nconst zoomOutButtonStyle: CSSProperties = {\n\tbottom: 130,\n\tright: 8,\n\tposition: 'absolute',\n\tzIndex: 2,\n\tbackground: 'transparent',\n\tborder: 0,\n\tpadding: 4,\n\tmargin: 0,\n\tcursor: 'pointer',\n\tdisplay: 'inline-flex',\n\talignItems: 'center',\n\tjustifyContent: 'center',\n};\n\nconst zoomInButtonStyle: CSSProperties = {\n\t...zoomOutButtonStyle,\n\tbottom: 180,\n};\n\nexport default function Zoom(props: IZoomProps) {\n\tconst { scanning, capabilities, onZoom, value } = props;\n\n\tif (!scanning) return null;\n\n\tconst step = capabilities.step > 0 ? capabilities.step : 1;\n\n\tfunction handleZoomIn() {\n\t\tonZoom(Math.min(value + step, capabilities.max));\n\t}\n\n\tfunction handleZoomOut() {\n\t\tonZoom(Math.max(value - step, capabilities.min));\n\t}\n\n\tconst atMin = value <= capabilities.min;\n\tconst atMax = value >= capabilities.max;\n\n\treturn (\n\t\t<Fragment>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\tdisabled={atMin}\n\t\t\t\tonClick={handleZoomOut}\n\t\t\t\tstyle={{\n\t\t\t\t\t...zoomOutButtonStyle,\n\t\t\t\t\tcursor: atMin ? 'default' : 'pointer',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ZoomOutIcon disabled={atMin} />\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\tdisabled={atMax}\n\t\t\t\tonClick={handleZoomIn}\n\t\t\t\tstyle={{\n\t\t\t\t\t...zoomInButtonStyle,\n\t\t\t\t\tcursor: atMax ? 'default' : 'pointer',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ZoomInIcon disabled={atMax} />\n\t\t\t</button>\n\t\t</Fragment>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\nimport OnOff from './OnOff';\nimport Torch from './Torch';\nimport Zoom from './Zoom';\n\nconst styles: Record<string, CSSProperties> = {\n\tfullContainer: {\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\tposition: 'relative',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\toverflow: 'hidden',\n\t},\n\tinnerContainer: {\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tposition: 'relative',\n\t},\n\toverlay: {\n\t\tposition: 'absolute',\n\t\ttop: 0,\n\t\tright: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\tpointerEvents: 'none',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t},\n\tborderBox: {\n\t\tposition: 'relative',\n\t\twidth: '70%',\n\t\taspectRatio: '1 / 1',\n\t\tborder: '2px dashed rgba(239, 68, 68, 0.4)',\n\t\tborderRadius: '0.5rem',\n\t},\n\tcornerTopLeft: {\n\t\tposition: 'absolute',\n\t\twidth: '15%',\n\t\theight: '15%',\n\t\tborder: '4px solid #ef4444',\n\t\ttop: 0,\n\t\tleft: 0,\n\t\tborderBottomColor: 'transparent',\n\t\tborderRightColor: 'transparent',\n\t\tborderTopLeftRadius: '0.5rem',\n\t},\n\tcornerTopRight: {\n\t\tposition: 'absolute',\n\t\twidth: '15%',\n\t\theight: '15%',\n\t\tborder: '4px solid #ef4444',\n\t\ttop: 0,\n\t\tright: 0,\n\t\tborderBottomColor: 'transparent',\n\t\tborderLeftColor: 'transparent',\n\t\tborderTopRightRadius: '0.5rem',\n\t},\n\tcornerBottomLeft: {\n\t\tposition: 'absolute',\n\t\twidth: '15%',\n\t\theight: '15%',\n\t\tborder: '4px solid #ef4444',\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\tborderTopColor: 'transparent',\n\t\tborderRightColor: 'transparent',\n\t\tborderBottomLeftRadius: '0.5rem',\n\t},\n\tcornerBottomRight: {\n\t\tposition: 'absolute',\n\t\twidth: '15%',\n\t\theight: '15%',\n\t\tborder: '4px solid #ef4444',\n\t\tbottom: 0,\n\t\tright: 0,\n\t\tborderTopColor: 'transparent',\n\t\tborderLeftColor: 'transparent',\n\t\tborderBottomRightRadius: '0.5rem',\n\t},\n};\n\ninterface IFinderProps {\n\tscanning: boolean;\n\tcapabilities: MediaTrackCapabilities;\n\tonOff?: boolean;\n\tstartScanning: (deviceId?: string | undefined) => void;\n\tstopScanning: () => void;\n\ttorch?: {\n\t\tstatus: boolean;\n\t\ttoggle: (value: boolean) => void;\n\t};\n\tzoom?: {\n\t\tvalue: number;\n\t\tonChange: (value: number) => void;\n\t};\n}\n\nexport default function Finder(props: IFinderProps) {\n\tconst {\n\t\tscanning,\n\t\tcapabilities,\n\t\tonOff,\n\t\ttorch,\n\t\tzoom,\n\t\tstartScanning,\n\t\tstopScanning,\n\t} = props;\n\n\treturn (\n\t\t<div style={styles.fullContainer}>\n\t\t\t<div style={styles.innerContainer}>\n\t\t\t\t<div style={styles.overlay}>\n\t\t\t\t\t<div style={styles.borderBox}>\n\t\t\t\t\t\t<div style={styles.cornerTopLeft}></div>\n\t\t\t\t\t\t<div style={styles.cornerTopRight}></div>\n\t\t\t\t\t\t<div style={styles.cornerBottomLeft}></div>\n\t\t\t\t\t\t<div style={styles.cornerBottomRight}></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t{onOff && (\n\t\t\t\t\t<OnOff\n\t\t\t\t\t\tscanning={scanning}\n\t\t\t\t\t\tstartScanning={startScanning}\n\t\t\t\t\t\tstopScanning={stopScanning}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{torch && capabilities.torch && (\n\t\t\t\t\t<Torch\n\t\t\t\t\t\tscanning={scanning}\n\t\t\t\t\t\tstatus={torch.status}\n\t\t\t\t\t\ttorchToggle={torch.toggle}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{zoom && capabilities.zoom && (\n\t\t\t\t\t<Zoom\n\t\t\t\t\t\tscanning={scanning}\n\t\t\t\t\t\tcapabilities={capabilities.zoom}\n\t\t\t\t\t\tvalue={zoom.value}\n\t\t\t\t\t\tonZoom={zoom.onChange}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { BarcodeFormat } from 'barcode-detector';\nimport {\n\ttype CSSProperties,\n\tforwardRef,\n\ttype ReactNode,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport useCamera from '../hooks/useCamera';\nimport useScanner from '../hooks/useScanner';\nimport { defaultComponents, defaultConstraints, defaultStyles } from '../misc';\nimport type {\n\tIDetectedBarcode,\n\tIPoint,\n\tIScannerClassNames,\n\tIScannerComponents,\n\tIScannerError,\n\tIScannerHandle,\n\tIScannerStyles,\n\tTrackFunction,\n} from '../types';\nimport { createScannerError } from '../utilities/createScannerError';\nimport deepEqual from '../utilities/deepEqual';\nimport Finder from './Finder';\n\nexport interface IScannerProps {\n\t/** Called when one or more barcodes are detected. */\n\tonScan: (detectedCodes: IDetectedBarcode[]) => void;\n\t/** Called when the scanner can't start the camera or detection fails. */\n\tonError?: (error: IScannerError) => void;\n\t/** Media track constraints applied to the camera stream. */\n\tconstraints?: MediaTrackConstraints;\n\t/** Barcode formats to detect. Defaults to all supported formats. */\n\tformats?: BarcodeFormat[];\n\t/** Pause the scanner and display a frozen frame of the last video frame. */\n\tpaused?: boolean;\n\t/** Custom content to render over the scanner. */\n\tchildren?: ReactNode;\n\t/** Built-in UI components and tracker. Top-level `tracker` overrides `components.tracker`. */\n\tcomponents?: IScannerComponents;\n\t/** Custom tracker overlay function. Convenience alias for `components.tracker`. */\n\ttracker?: TrackFunction;\n\t/** Inline CSS for the container and video. */\n\tstyles?: IScannerStyles;\n\t/** Class names for the container and video. */\n\tclassNames?: IScannerClassNames;\n\t/** Allow the same barcode to trigger `onScan` repeatedly. */\n\tallowMultiple?: boolean;\n\t/** Minimum delay (ms) between `onScan` calls when `allowMultiple` is true. */\n\tscanDelay?: number;\n\t/** Minimum delay (ms) between detection attempts. */\n\tretryDelay?: number;\n\t/** Play a beep on a successful scan, or a custom sound URL/data URI. */\n\tsound?: boolean | string;\n\t/** Max time (ms) to wait for the camera to start. Default 3000. */\n\tstartTimeoutMs?: number;\n\t/** Delay (ms) after `play()` before reading capabilities. Default 500. */\n\tsettleDelayMs?: number;\n}\n\nconst overlayStyle: CSSProperties = {\n\tposition: 'absolute',\n\twidth: '100%',\n\theight: '100%',\n};\n\nconst pauseFrameStyleBase: CSSProperties = {\n\tposition: 'absolute',\n\twidth: '100%',\n\theight: '100%',\n};\n\nconst trackingLayerStyle: CSSProperties = {\n\tposition: 'absolute',\n\twidth: '100%',\n\theight: '100%',\n};\n\nfunction clearCanvas(canvas: HTMLCanvasElement | null) {\n\tif (canvas === null) return;\n\n\tconst ctx = canvas.getContext('2d');\n\n\tif (ctx === null) return;\n\n\tctx.clearRect(0, 0, canvas.width, canvas.height);\n}\n\nfunction drawTracking(\n\tdetectedCodes: IDetectedBarcode[],\n\tvideoEl: HTMLVideoElement | null,\n\ttrackingEl: HTMLCanvasElement | null,\n\ttracker: TrackFunction | undefined,\n) {\n\tif (trackingEl === null || videoEl === null) return;\n\n\tif (detectedCodes.length === 0 || tracker === undefined) {\n\t\tclearCanvas(trackingEl);\n\n\t\treturn;\n\t}\n\n\tconst displayWidth = videoEl.offsetWidth;\n\tconst displayHeight = videoEl.offsetHeight;\n\tconst resolutionWidth = videoEl.videoWidth;\n\tconst resolutionHeight = videoEl.videoHeight;\n\n\tif (resolutionWidth === 0 || resolutionHeight === 0) {\n\t\tclearCanvas(trackingEl);\n\n\t\treturn;\n\t}\n\n\tconst largerRatio = Math.max(\n\t\tdisplayWidth / resolutionWidth,\n\t\tdisplayHeight / resolutionHeight,\n\t);\n\tconst uncutWidth = resolutionWidth * largerRatio;\n\tconst uncutHeight = resolutionHeight * largerRatio;\n\n\tconst xScalar = uncutWidth / resolutionWidth;\n\tconst yScalar = uncutHeight / resolutionHeight;\n\tconst xOffset = (displayWidth - uncutWidth) / 2;\n\tconst yOffset = (displayHeight - uncutHeight) / 2;\n\n\tconst scale = ({ x, y }: IPoint): IPoint => ({\n\t\tx: Math.floor(x * xScalar),\n\t\ty: Math.floor(y * yScalar),\n\t});\n\n\tconst translate = ({ x, y }: IPoint): IPoint => ({\n\t\tx: Math.floor(x + xOffset),\n\t\ty: Math.floor(y + yOffset),\n\t});\n\n\tconst adjustedCodes = detectedCodes.map((detectedCode) => {\n\t\tconst { boundingBox, cornerPoints } = detectedCode;\n\n\t\tconst { x, y } = translate(scale({ x: boundingBox.x, y: boundingBox.y }));\n\t\tconst { x: width, y: height } = scale({\n\t\t\tx: boundingBox.width,\n\t\t\ty: boundingBox.height,\n\t\t});\n\n\t\treturn {\n\t\t\t...detectedCode,\n\t\t\tcornerPoints: cornerPoints.map((point) => translate(scale(point))),\n\t\t\tboundingBox: DOMRectReadOnly.fromRect({ x, y, width, height }),\n\t\t};\n\t});\n\n\ttrackingEl.width = displayWidth;\n\ttrackingEl.height = displayHeight;\n\n\tconst ctx = trackingEl.getContext('2d');\n\tif (ctx === null) return;\n\n\ttracker(adjustedCodes, ctx);\n}\n\nexport const Scanner = forwardRef<IScannerHandle, IScannerProps>(\n\tfunction Scanner(props, ref) {\n\t\tconst {\n\t\t\tonScan,\n\t\t\tconstraints,\n\t\t\tformats = ['any' as BarcodeFormat],\n\t\t\tpaused = false,\n\t\t\tcomponents,\n\t\t\ttracker: trackerProp,\n\t\t\tchildren,\n\t\t\tstyles,\n\t\t\tclassNames,\n\t\t\tallowMultiple,\n\t\t\tscanDelay,\n\t\t\tretryDelay,\n\t\t\tonError,\n\t\t\tsound,\n\t\t\tstartTimeoutMs,\n\t\t\tsettleDelayMs,\n\t\t} = props;\n\n\t\tconst videoRef = useRef<HTMLVideoElement>(null);\n\t\tconst pauseFrameRef = useRef<HTMLCanvasElement>(null);\n\t\tconst trackingLayerRef = useRef<HTMLCanvasElement>(null);\n\n\t\t// Normalize once: when a deviceId is present, the default `facingMode`\n\t\t// is stripped so the comparison below has a stable shape. Doing this\n\t\t// in the memo (instead of after-the-fact inside the effect) keeps\n\t\t// `normalizedConstraints` and `constraintsCached` referentially in sync\n\t\t// and prevents an infinite render loop when the parent flips\n\t\t// `constraints` from undefined to `{ deviceId }` after mount.\n\t\tconst normalizedConstraints = useMemo(() => {\n\t\t\tconst merged: MediaTrackConstraints = {\n\t\t\t\t...defaultConstraints,\n\t\t\t\t...constraints,\n\t\t\t};\n\n\t\t\tif (constraints?.deviceId) {\n\t\t\t\tdelete merged.facingMode;\n\t\t\t}\n\n\t\t\treturn merged;\n\t\t}, [constraints]);\n\n\t\tconst mergedComponents = useMemo(\n\t\t\t() => ({ ...defaultComponents, ...components }),\n\t\t\t[components],\n\t\t);\n\n\t\tconst effectiveTracker = trackerProp ?? mergedComponents.tracker;\n\n\t\tconst [isMounted, setIsMounted] = useState(false);\n\t\tconst [isCameraActive, setIsCameraActive] = useState(false);\n\t\tconst [constraintsCached, setConstraintsCached] = useState(\n\t\t\tnormalizedConstraints,\n\t\t);\n\n\t\tconst camera = useCamera({ startTimeoutMs, settleDelayMs });\n\n\t\tconst cameraRef = useRef(camera);\n\t\tconst onScanRef = useRef(onScan);\n\t\tconst onErrorRef = useRef(onError);\n\t\tconst trackerRef = useRef<TrackFunction | undefined>(effectiveTracker);\n\n\t\tuseEffect(() => {\n\t\t\tcameraRef.current = camera;\n\t\t}, [camera]);\n\n\t\tuseEffect(() => {\n\t\t\tonScanRef.current = onScan;\n\t\t}, [onScan]);\n\n\t\tuseEffect(() => {\n\t\t\tonErrorRef.current = onError;\n\t\t}, [onError]);\n\n\t\tuseEffect(() => {\n\t\t\ttrackerRef.current = effectiveTracker;\n\t\t}, [effectiveTracker]);\n\n\t\t// Stable onScan/onFound/onError callbacks so identity churn from inline\n\t\t// props doesn't tear down and restart the scanning loop on every render.\n\t\tconst stableOnScan = useCallback((codes: IDetectedBarcode[]) => {\n\t\t\tonScanRef.current?.(codes);\n\t\t}, []);\n\n\t\tconst stableOnError = useCallback((error: IScannerError) => {\n\t\t\tonErrorRef.current?.(error);\n\t\t}, []);\n\n\t\tconst onFoundCallback = useCallback((detectedCodes: IDetectedBarcode[]) => {\n\t\t\tdrawTracking(\n\t\t\t\tdetectedCodes,\n\t\t\t\tvideoRef.current,\n\t\t\t\ttrackingLayerRef.current,\n\t\t\t\ttrackerRef.current,\n\t\t\t);\n\t\t}, []);\n\n\t\tconst effectiveRetryDelay =\n\t\t\tretryDelay ?? (effectiveTracker === undefined ? 500 : 33);\n\n\t\tconst { startScanning, stopScanning } = useScanner({\n\t\t\tvideoElementRef: videoRef,\n\t\t\tonScan: stableOnScan,\n\t\t\tonFound: onFoundCallback,\n\t\t\tonError: stableOnError,\n\t\t\tformats,\n\t\t\tretryDelay: effectiveRetryDelay,\n\t\t\tscanDelay,\n\t\t\tallowMultiple,\n\t\t\tsound,\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\tsetIsMounted(true);\n\n\t\t\treturn () => {\n\t\t\t\tsetIsMounted(false);\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (!deepEqual(normalizedConstraints, constraintsCached)) {\n\t\t\t\tsetConstraintsCached(normalizedConstraints);\n\t\t\t}\n\t\t}, [normalizedConstraints, constraintsCached]);\n\n\t\tconst cameraSettings = useMemo(() => {\n\t\t\treturn {\n\t\t\t\tconstraints: constraintsCached,\n\t\t\t\tshouldStream: isMounted && !paused,\n\t\t\t};\n\t\t}, [constraintsCached, isMounted, paused]);\n\n\t\tconst onCameraChange = useCallback(async () => {\n\t\t\tconst videoEl = videoRef.current;\n\t\t\tconst canvasEl = pauseFrameRef.current;\n\n\t\t\tif (videoEl === null || canvasEl === null) return;\n\n\t\t\tconst ctx = canvasEl.getContext('2d');\n\n\t\t\tif (ctx === null) return;\n\n\t\t\ttry {\n\t\t\t\tif (cameraSettings.shouldStream) {\n\t\t\t\t\tawait cameraRef.current.stopCamera();\n\n\t\t\t\t\tsetIsCameraActive(false);\n\n\t\t\t\t\tawait cameraRef.current.startCamera(videoEl, {\n\t\t\t\t\t\tconstraints: cameraSettings.constraints,\n\t\t\t\t\t});\n\n\t\t\t\t\tsetIsCameraActive(true);\n\t\t\t\t} else {\n\t\t\t\t\tif (videoEl.videoWidth > 0 && videoEl.videoHeight > 0) {\n\t\t\t\t\t\tcanvasEl.width = videoEl.videoWidth;\n\t\t\t\t\t\tcanvasEl.height = videoEl.videoHeight;\n\t\t\t\t\t\tctx.drawImage(\n\t\t\t\t\t\t\tvideoEl,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tvideoEl.videoWidth,\n\t\t\t\t\t\t\tvideoEl.videoHeight,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait cameraRef.current.stopCamera();\n\n\t\t\t\t\tsetIsCameraActive(false);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tsetIsCameraActive(false);\n\n\t\t\t\tonErrorRef.current?.(createScannerError(error));\n\t\t\t}\n\t\t}, [cameraSettings]);\n\n\t\tuseEffect(() => {\n\t\t\tvoid onCameraChange();\n\t\t}, [onCameraChange]);\n\n\t\tconst shouldScan = useMemo(() => {\n\t\t\treturn cameraSettings.shouldStream && isCameraActive;\n\t\t}, [cameraSettings.shouldStream, isCameraActive]);\n\n\t\tuseEffect(() => {\n\t\t\tif (shouldScan) {\n\t\t\t\tclearCanvas(pauseFrameRef.current);\n\t\t\t\tclearCanvas(trackingLayerRef.current);\n\t\t\t\tstartScanning();\n\t\t\t}\n\n\t\t\treturn () => {\n\t\t\t\tstopScanning();\n\t\t\t};\n\t\t}, [shouldScan, startScanning, stopScanning]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tgetVideoElement: () => videoRef.current,\n\t\t\t\tgetStream: () => cameraRef.current.getStream(),\n\t\t\t}),\n\t\t\t[],\n\t\t);\n\n\t\tconst containerStyle = useMemo(\n\t\t\t() => ({ ...defaultStyles.container, ...styles?.container }),\n\t\t\t[styles?.container],\n\t\t);\n\n\t\tconst videoStyle = useMemo<CSSProperties>(\n\t\t\t() => ({\n\t\t\t\t...defaultStyles.video,\n\t\t\t\t...styles?.video,\n\t\t\t\tvisibility: paused ? 'hidden' : 'visible',\n\t\t\t}),\n\t\t\t[styles?.video, paused],\n\t\t);\n\n\t\tconst pauseFrameStyle = useMemo<CSSProperties>(\n\t\t\t() => ({\n\t\t\t\t...pauseFrameStyleBase,\n\t\t\t\tdisplay: paused ? 'block' : 'none',\n\t\t\t}),\n\t\t\t[paused],\n\t\t);\n\n\t\treturn (\n\t\t\t<div style={containerStyle} className={classNames?.container}>\n\t\t\t\t<video\n\t\t\t\t\tref={videoRef}\n\t\t\t\t\tstyle={videoStyle}\n\t\t\t\t\tclassName={classNames?.video}\n\t\t\t\t\tautoPlay\n\t\t\t\t\tmuted\n\t\t\t\t\tplaysInline\n\t\t\t\t/>\n\t\t\t\t<canvas ref={pauseFrameRef} style={pauseFrameStyle} />\n\t\t\t\t<canvas ref={trackingLayerRef} style={trackingLayerStyle} />\n\t\t\t\t<div style={overlayStyle}>\n\t\t\t\t\t{mergedComponents.finder && (\n\t\t\t\t\t\t<Finder\n\t\t\t\t\t\t\tscanning={isCameraActive}\n\t\t\t\t\t\t\tcapabilities={camera.capabilities}\n\t\t\t\t\t\t\tonOff={mergedComponents.onOff}\n\t\t\t\t\t\t\tzoom={\n\t\t\t\t\t\t\t\tmergedComponents.zoom && camera.settings.zoom\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tvalue: camera.settings.zoom,\n\t\t\t\t\t\t\t\t\t\t\tonChange: async (value) => {\n\t\t\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t\t\tawait camera.updateConstraints({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...constraintsCached,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tadvanced: [{ zoom: value }],\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tonErrorRef.current?.(createScannerError(error));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttorch={\n\t\t\t\t\t\t\t\tmergedComponents.torch\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tstatus: camera.settings.torch ?? false,\n\t\t\t\t\t\t\t\t\t\t\ttoggle: async (value) => {\n\t\t\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t\t\tawait camera.updateConstraints({\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...constraintsCached,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tadvanced: [{ torch: value }],\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tonErrorRef.current?.(createScannerError(error));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstartScanning={async () => await onCameraChange()}\n\t\t\t\t\t\t\tstopScanning={async () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tawait camera.stopCamera();\n\t\t\t\t\t\t\t\t\tclearCanvas(trackingLayerRef.current);\n\t\t\t\t\t\t\t\t\tsetIsCameraActive(false);\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\tonErrorRef.current?.(createScannerError(error));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { useCallback, useEffect, useState } from 'react';\n\n/**\n * Returns the list of available video input devices.\n *\n * The list is fetched on mount and refreshed whenever the browser fires a\n * `devicechange` event (e.g., when a camera is plugged in or unplugged, or\n * when the user grants/revokes camera permission). Errors from\n * `enumerateDevices()` produce an empty list rather than throwing.\n *\n * Device labels are only populated after the user has granted camera\n * permission to the origin. Before that, the list still contains the devices\n * but each `label` is an empty string.\n */\nexport function useDevices(): MediaDeviceInfo[] {\n\tconst [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n\n\tconst getDevices = useCallback(async (): Promise<MediaDeviceInfo[]> => {\n\t\tif (\n\t\t\ttypeof navigator === 'undefined' ||\n\t\t\t!navigator.mediaDevices?.enumerateDevices\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\n\t\ttry {\n\t\t\tconst all = await navigator.mediaDevices.enumerateDevices();\n\n\t\t\treturn all.filter((d) => d.kind === 'videoinput');\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\n\t\tconst update = async () => {\n\t\t\tconst next = await getDevices();\n\n\t\t\tif (!cancelled) setDevices(next);\n\t\t};\n\n\t\tvoid update();\n\n\t\tif (\n\t\t\ttypeof navigator !== 'undefined' &&\n\t\t\tnavigator.mediaDevices?.addEventListener\n\t\t) {\n\t\t\tnavigator.mediaDevices.addEventListener('devicechange', update);\n\n\t\t\treturn () => {\n\t\t\t\tcancelled = true;\n\t\t\t\tnavigator.mediaDevices.removeEventListener('devicechange', update);\n\t\t\t};\n\t\t}\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [getDevices]);\n\n\treturn devices;\n}\n"],"names":["_jsx","_jsxs","buttonStyle"],"mappings":"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"}