@andresxid/xid_camera_ocr_sdk_react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +223 -0
- package/dist/LICENSE-OpenCV.txt +202 -0
- package/dist/NOTICE-OpenCV.txt +43 -0
- package/dist/cv-worker.js +670 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +459 -0
- package/dist/index.d.ts +459 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/opencv.js +51 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/camera.ts","../src/core/assets.ts","../src/core/worker-protocol.ts","../src/core/cv-worker-client.ts","../src/core/geometry.ts","../src/core/cv-warp.ts","../src/core/quality.ts","../src/core/hints.ts","../src/core/reprojection.ts","../src/core/stability.ts","../src/core/XidCameraOcrSession.ts","../src/core/cv-detection.ts","../src/react/useXidCameraOcr.ts","../src/react/tips.ts","../src/react/theme.ts","../src/react/TipsCard.tsx","../src/react/XidCameraOcrView.tsx","../src/react/XidCameraOcr.tsx"],"names":["attachCamera","videoElement","constraints","defaultConstraints","stream","err","track","caps","detachCamera","t","snapshotToBlob","quality","w","h","canvas","ctx","resolve","reject","blob","sampleCanvas","sampleFrame","targetWidth","sw","sh","grabFullFrame","imageDataToJpeg","img","b","supportsTorch","getCaps","setTorch","on","PACKAGE_NAME","isUnresolvedPackageUrl","url","file","relativeToBundle","packageOpencvUrl","defaultOpencvUrl","spawnCvWorker","workerUrl","parseWorkerResponse","data","m","copyPixels","copy","toError","CVWorkerClient","options","opencvUrl","worker","promise","e","msg","p","id","opts","buffer","prior","corners","docType","longSide","reason","rejectInit","pending","build","transfer","req","ID1_RATIO","TD3_RATIO","TYPE_BOUNDARY_RATIO","HINT_TOLERANCE","CAPTURABLE_ASPECT_MIN","CAPTURABLE_ASPECT_MAX","ASPECT_SCORE_FALLOFF","orderCorners","points","cx","cy","cycle","a","start","s","k","polygonArea","sum","i","sideLengths","quad","tl","tr","br","bl","interiorAngles","out","prev","cur","next","ax","ay","bx","by","la","lb","cos","isValidQuad","minAngle","maxAngle","isConvex","sign","c","cross","rectifiedAspect","short","aspectScore","aspect","d","scoreCandidate","typeHintFromAspect","nominal","isCapturableAspect","canonicalRatioFor","type","measuredAspect","DEFAULT_WARP_LONG_SIDE","HIGH_WARP_LONG_SIDE","warpDocumentImageData","cv","source","ratio","clampAspect","shortSide","portrait","fixedLandscape","q","landscapeOut","outW","outH","src","dst","srcPts","dstPts","M","rgba","makeImageData","warpDocument","sourceCanvas","sourceImageData","warped","outCanvas","outCtx","warpedSnapshotToBlob","width","height","QUALITY_THRESHOLDS","quadRowSpans","spans","y","yc","xMin","xMax","lo","hi","x","measureQuality","gray","W","H","glarePixel","glare","count","lapSum","lapSq","lapCount","xs","xe","lx","rx","row","v","r","brightness","glareRatio","blurScore","frameArea","docFillRatio","ok","frameMeanBrightness","decideHint","TORCH_BRIGHTNESS_THRESHOLD","shouldEnableTorch","DEFAULT_TEXTS_ES","DEFAULT_TEXTS_EN","STATUS_COPY_KEYS","isStatusCopyKey","status","pick","key","overrides","resolveTexts","copyFor","hint","MIN_CAPTURE_AREA_RATIO","reprojectQuad","from","to","sx","sy","clampQuadToFrame","frame","prepareCaptureQuad","sampleQuad","sample","full","clamped","EMPTY","StabilityTracker","input","frameSize","maxMove","stillGeometry","typeHint","stableFrames","frames","SAMPLE_WIDTH","ANALYZE_FPS","WARMUP_MS","WORKER_INIT_TIMEOUT_MS","WEAK_PROVENANCE_EXTRA_FRAMES","DEFAULT_DEPS","video","isWeak","det","copyQuad","XidCameraOcrSession","deps","generation","snap","delayMs","t0","request","required","fullQuad","result","unwarped","warpErr","MIN_AREA_RATIO","MAX_AREA_RATIO","APPROX_EPSILON","BORDER_PADDING","CLAHE_CLIP","CLAHE_TILE","CANNY_SIGMA","DILATE_ITERATIONS","BORDER_TOUCH_PX","MAX_BORDER_CORNERS","BORDER_TOUCH_LIMIT","NESTED_AREA_FACTOR","NESTED_MARGIN_PX","POLARITY_MIN_DIFF","POLARITY_RING_SCALE","QUALITY_INSET_PX","MAX_REDUCIBLE_VERTICES","REDUCED_MIN_FILL","REDUCED_MAX_FILL","INDIRECT_SCORE_FACTOR","PRIOR_WEIGHT","PRIOR_D_CAP","COARSE_SCALE","MIN_COARSE_SIDE","empty","frameBrightness","detectDocumentCV","imageData","_acceptedTypes","detectInner","mats","own","small","ws","grayView","cut","best","scanScale","lowres","isNestedInCut","provenance","ys","minX","maxX","minY","maxY","insetQuad","passArea","up","hull","approx","contours","median","medianOf","box","area","reduced","pts","matPoints","quad4","reduceToQuad","rawPoints","clampPoint","fill","fullArea","borderLimit","borderCorners","spansFrame","rect","rectArea","rectangularity","score","rank","priorPenalty","shift","mat","poly","n","bestIdx","bestAdded","bestX","a0","a1","b1","b0","forwardIntersection","added","dax","day","dbx","dby","den","u","limit","margin","o","insideConvex","inner","ring","innerAndRingMeans","outer","so","sq","si","sumIn","nIn","sumRing","nRing","qs","qe","is","ie","twiceArea","winding","len","ux","uy","vx","vy","lu","lv","sinHalf","hist","acc","useXidCameraOcr","videoRef","useRef","sessionRef","setStatus","useState","setFrame","setResult","error","setError","optsRef","ensureSession","useCallback","session","f","stop","captureNow","retake","useEffect","tipsVisible","showTips","dismissed","completedOnce","useTips","setDismissed","setCompletedOnce","setPrev","nextDismissed","nextCompleted","dismiss","XCO_VARS","cssVar","name","fallback","themeToStyle","theme","style","value","borderColorFor","svgProps","LightIcon","jsxs","jsx","GlareIcon","FocusIcon","TipsCard","texts","onDismiss","items","cardStyle","listStyle","Icon","text","itemStyle","buttonStyle","useIsoLayoutEffect","useLayoutEffect","XidCameraOcrView","documentTypes","className","hideStatusOverlay","onCapture","onRetake","onStart","onDismissTips","canCapture","canRetake","canStart","isProcessing","maskId","useId","rootRef","borderBox","setBorderBox","detectedType","targetRatio","el","compute","cw","ch","maxW","maxH","ro","showCornerOverlay","accentColor","hintText","rootClass","rootStyle","videoStyle","overlayStyle","guideStyle","svgStyle","hintButtonStyle","hintStyle","shutterStyle","shutterInnerStyle","retakeStyle","loaderOverlayStyle","spinnerStyle","loaderTextStyle","ACTION_BOTTOM","DEFAULT_DOCUMENT_TYPES","swallow","XidCameraOcr","textOverrides","sessionOptions","tips","useMemo"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Camera helpers — getUserMedia + video element wiring.\n */\n\nexport async function attachCamera(\n videoElement: HTMLVideoElement,\n constraints?: MediaStreamConstraints\n): Promise<MediaStream> {\n // Constraints adaptativas: pide alta resolución pero acepta menos en mobile.\n // `aspectRatio` ideal 16:9 ayuda en mobile portrait a que el browser pida\n // un frame landscape (la cámara casi siempre es landscape nativo) y deje\n // que CSS lo enmarque con object-fit: cover.\n const defaultConstraints: MediaStreamConstraints = {\n audio: false,\n video: {\n facingMode: { ideal: 'environment' },\n width: { ideal: 1920, min: 640 },\n height: { ideal: 1080, min: 480 },\n aspectRatio: { ideal: 16 / 9 },\n },\n };\n\n // `mediaDevices` is undefined outside a secure context (plain HTTP over the LAN\n // on a phone is the classic case). Fail with an actionable message instead of\n // a TypeError.\n if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) {\n throw new Error(\n 'Camera unavailable: getUserMedia requires a secure context (HTTPS or localhost) and a browser with MediaDevices support.'\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraints ?? defaultConstraints);\n } catch (err) {\n // Fallback: device may not have rear camera or hi-res — pedir cualquier video\n if (!constraints) {\n stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: true });\n } else {\n throw err;\n }\n }\n\n videoElement.srcObject = stream;\n videoElement.muted = true;\n videoElement.playsInline = true;\n videoElement.autoplay = true;\n // Hint al browser para que enfoque continuamente (si el track lo soporta)\n const track = stream.getVideoTracks()[0];\n const caps = (track as MediaStreamTrack & { getCapabilities?: () => MediaTrackCapabilities }).getCapabilities?.();\n if (caps && 'focusMode' in caps && (caps as { focusMode?: string[] }).focusMode?.includes('continuous')) {\n track.applyConstraints({ advanced: [{ focusMode: 'continuous' } as MediaTrackConstraintSet] }).catch(() => {\n /* algunos browsers rechazan advanced constraints */\n });\n }\n await videoElement.play().catch(() => {\n /* iOS Safari requires user gesture sometimes — caller can retry */\n });\n\n return stream;\n}\n\nexport function detachCamera(videoElement: HTMLVideoElement, stream: MediaStream | null) {\n if (videoElement.srcObject === stream) {\n videoElement.srcObject = null;\n }\n stream?.getTracks().forEach((t) => t.stop());\n}\n\n/** Captura un snapshot del video y devuelve un Blob JPEG. */\nexport async function snapshotToBlob(\n videoElement: HTMLVideoElement,\n quality = 0.92\n): Promise<Blob> {\n const w = videoElement.videoWidth;\n const h = videoElement.videoHeight;\n if (!w || !h) throw new Error('Video stream not ready (videoWidth=0)');\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('2D canvas context unavailable');\n ctx.drawImage(videoElement, 0, 0, w, h);\n\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('Canvas toBlob returned null'))),\n 'image/jpeg',\n quality\n );\n });\n}\n\nlet sampleCanvas: HTMLCanvasElement | null = null;\n\n/** Downscaled RGBA frame for analysis (default 640 px wide). Reuses one canvas. */\nexport function sampleFrame(videoElement: HTMLVideoElement, targetWidth = 640): ImageData | null {\n const w = videoElement.videoWidth;\n const h = videoElement.videoHeight;\n if (!w || !h) return null;\n const sw = Math.round(targetWidth);\n const sh = Math.round((h * targetWidth) / w);\n sampleCanvas ??= document.createElement('canvas');\n if (sampleCanvas.width !== sw || sampleCanvas.height !== sh) {\n sampleCanvas.width = sw;\n sampleCanvas.height = sh;\n }\n const ctx = sampleCanvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.drawImage(videoElement, 0, 0, sw, sh);\n return ctx.getImageData(0, 0, sw, sh);\n}\n\n/** Full-resolution RGBA frame of the video (used once per capture). */\nexport function grabFullFrame(videoElement: HTMLVideoElement): ImageData | null {\n const w = videoElement.videoWidth;\n const h = videoElement.videoHeight;\n if (!w || !h) return null;\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.drawImage(videoElement, 0, 0, w, h);\n return ctx.getImageData(0, 0, w, h);\n}\n\n/** Encodes RGBA pixels as a JPEG Blob. */\nexport function imageDataToJpeg(img: ImageData, quality = 0.92): Promise<Blob> {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return Promise.reject(new Error('2D canvas context unavailable'));\n ctx.putImageData(img, 0, 0);\n return new Promise<Blob>((resolve, reject) =>\n canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('Canvas toBlob returned null'))), 'image/jpeg', quality)\n );\n}\n\ntype TorchCapabilities = MediaTrackCapabilities & { torch?: boolean };\n\nexport function supportsTorch(track: MediaStreamTrack): boolean {\n const getCaps = (track as MediaStreamTrack & { getCapabilities?: () => TorchCapabilities }).getCapabilities;\n if (typeof getCaps !== 'function') return false;\n return getCaps.call(track).torch === true;\n}\n\n/** Best-effort torch toggle. Resolves `true` when the constraint was accepted. */\nexport async function setTorch(track: MediaStreamTrack, on: boolean): Promise<boolean> {\n try {\n await track.applyConstraints({ advanced: [{ torch: on } as MediaTrackConstraintSet] });\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Asset URLs for the OpenCV worker and `opencv.js`.\n *\n * Both assets are referenced through the package's own bare specifier\n * (`PACKAGE_NAME/<file>` relative to `import.meta.url`).\n * Vite resolves such non-relative import-meta URLs through the package\n * `exports` map, also inside pre-bundled `.vite/deps` files, so consumers need\n * no `optimizeDeps` config: dev serves the real `dist/` file and build emits it\n * as an asset.\n *\n * When no bundler rewrote the literal (vitest SSR, raw ESM from a CDN), the URL\n * resolves to `<bundle dir>/@andresxid/xid_camera_ocr_sdk_react/<file>`. That\n * shape is detected and replaced by `./<file>` next to the bundle. The fallback\n * goes through a function parameter so bundlers see no second literal.\n * CJS consumers and non-Vite bundlers must host `dist/cv-worker.js` and\n * `dist/opencv.js` themselves and pass both `workerUrl` and `opencvUrl`: tsup's\n * CJS shim resolves `import.meta.url` against the document, not the bundle.\n * Without them only manual capture works. Both are also the CSP / CDN escape hatch.\n *\n * The literals below are matched by bundler regexes: keep their exact shape.\n */\n\nexport const PACKAGE_NAME = '@andresxid/xid_camera_ocr_sdk_react';\n\ntype AssetFile = 'cv-worker.js' | 'opencv.js';\n\n/** True when `url` is the literal package specifier resolved against the bundle dir. */\nexport function isUnresolvedPackageUrl(url: URL, file: AssetFile): boolean {\n return url.pathname.endsWith(`/${PACKAGE_NAME}/${file}`);\n}\n\n/** `file` resolved next to this module; non-literal so bundlers do not rewrite it. */\nfunction relativeToBundle(file: string): URL {\n return new URL(file, import.meta.url);\n}\n\nfunction packageOpencvUrl(): URL {\n return new URL('@andresxid/xid_camera_ocr_sdk_react/opencv.js', import.meta.url);\n}\n\n/** Default `opencv.js` URL (the bundled copy shipped with the package). */\nexport function defaultOpencvUrl(): string {\n const url = packageOpencvUrl();\n return isUnresolvedPackageUrl(url, 'opencv.js') ? relativeToBundle('./opencv.js').href : url.href;\n}\n\n/**\n * Spawns the OpenCV module worker. `workerUrl` (self-hosted `cv-worker.js`)\n * wins over the packaged copy; it goes through a variable so bundlers see no\n * second Worker literal.\n */\nexport function spawnCvWorker(workerUrl?: string): Worker {\n if (workerUrl !== undefined) return new Worker(workerUrl, { type: 'module' });\n // Probes the opencv.js literal for both assets: a bundler that rewrites one\n // rewrites both, and a worker-URL probe would add a second Worker literal pattern.\n if (!isUnresolvedPackageUrl(packageOpencvUrl(), 'opencv.js')) {\n return new Worker(new URL('@andresxid/xid_camera_ocr_sdk_react/cv-worker.js', import.meta.url), { type: 'module' });\n }\n return new Worker(relativeToBundle('./cv-worker.js'), { type: 'module' });\n}\n","/** Messages exchanged between `cv-worker-client.ts` (main thread) and `cv-worker.ts`. */\nimport type { Quad } from './geometry.js';\nimport type { DocumentType, FrameQuality } from './types.js';\n\n/** How long OpenCV may take to load and initialise before init fails (worker and client). */\nexport const OPENCV_READY_TIMEOUT_MS = 30_000;\n\nexport interface ImageDataLike { data: Uint8ClampedArray; width: number; height: number }\n\nexport interface CvDetectionResult {\n detected: boolean;\n documentType: DocumentType | null;\n aspectRatio: number | null;\n corners: Quad | null;\n boundingBox: { x: number; y: number; width: number; height: number } | null;\n /** Quality measured inside the quad; null when nothing was detected. */\n quality: FrameQuality | null;\n /** Whole-frame mean brightness 0–1 (for the torch decision when no quad). */\n frameBrightness: number;\n score: number | null;\n /**\n * How the winning quad was found: `direct` (a native 4-vertex contour), `reduced`\n * (a 5–6-vertex hull collapsed to a quad) or `lowres` (the half-resolution fallback\n * pass; wins over `reduced`). Non-direct winners are less precise and carry a\n * discounted `score`. Undefined when nothing was detected.\n */\n provenance?: 'direct' | 'reduced' | 'lowres';\n}\n\nexport interface InitRequest { type: 'init'; opencvUrl: string }\nexport interface AnalyzeRequest {\n type: 'analyze'; id: number; width: number; height: number; buffer: ArrayBuffer;\n /**\n * The previous frame's detected corners (TL, TR, BR, BL, analysed-frame pixels). Used to\n * rank candidates only: it never creates a detection or relaxes a filter.\n */\n prior?: Quad;\n}\n\n/** True for exactly four points with finite numeric `x` and `y` (a well-formed `prior`). */\nexport function isQuad(v: unknown): v is Quad {\n return Array.isArray(v) && v.length === 4 && v.every((p) => !!p && typeof p === 'object'\n && Number.isFinite((p as { x?: unknown }).x) && Number.isFinite((p as { y?: unknown }).y));\n}\nexport interface WarpRequest {\n type: 'warp'; id: number; width: number; height: number; buffer: ArrayBuffer;\n corners: Quad; docType: DocumentType | null; longSide: number;\n}\nexport type WorkerRequest = InitRequest | AnalyzeRequest | WarpRequest;\n\nexport type WorkerResponse =\n | { type: 'ready' }\n | { type: 'init-error'; error: string }\n | { type: 'analyze-result'; id: number; result: CvDetectionResult }\n | { type: 'warp-result'; id: number; width: number; height: number; buffer: ArrayBuffer }\n | { type: 'error'; id: number; error: string };\n\nexport function parseWorkerResponse(data: unknown): WorkerResponse | null {\n if (!data || typeof data !== 'object') return null;\n const m = data as Record<string, unknown>;\n switch (m.type) {\n case 'ready': return { type: 'ready' };\n case 'init-error': return typeof m.error === 'string' ? { type: 'init-error', error: m.error } : null;\n case 'error': return typeof m.id === 'number' && typeof m.error === 'string' ? { type: 'error', id: m.id, error: m.error } : null;\n case 'analyze-result':\n return typeof m.id === 'number' && m.result && typeof m.result === 'object'\n ? { type: 'analyze-result', id: m.id, result: m.result as CvDetectionResult }\n : null;\n case 'warp-result':\n return typeof m.id === 'number' && typeof m.width === 'number' && typeof m.height === 'number' && m.buffer instanceof ArrayBuffer\n ? { type: 'warp-result', id: m.id, width: m.width, height: m.height, buffer: m.buffer }\n : null;\n default: return null;\n }\n}\n","/**\n * CVWorkerClient — async wrapper over the OpenCV Web Worker.\n * One module worker; request/response by incremental id. No skip-if-busy:\n * the session guarantees a single frame in flight (spec §5.1).\n *\n * Pixel buffers are copied before being transferred, so the caller's frame\n * is never detached and the client never touches a transferred buffer again.\n */\nimport { defaultOpencvUrl, spawnCvWorker } from './assets.js';\nimport type { Quad } from './geometry.js';\nimport type { DocumentType } from './types.js';\nimport {\n OPENCV_READY_TIMEOUT_MS,\n parseWorkerResponse,\n type CvDetectionResult,\n type ImageDataLike,\n type WorkerRequest,\n type WorkerResponse,\n} from './worker-protocol.js';\n\nexport type { ImageDataLike } from './worker-protocol.js';\n\nexport interface CVWorkerClientOptions {\n /**\n * Main-thread deadline for `init()`: rejects even if the worker thread hangs\n * and never reports `init-error`. Default 30 s.\n */\n initTimeoutMs?: number;\n}\n\ntype RequestResponse = Extract<WorkerResponse, { type: 'analyze-result' | 'warp-result' }>;\n\ninterface Pending { resolve: (msg: RequestResponse) => void; reject: (e: Error) => void }\n\n/**\n * Default `opencv.js` URL and worker spawning live in `assets.ts`: both are\n * resolved through the package's own specifier, so Vite (dev pre-bundling\n * included) needs no SDK-specific config. Pass `opencvUrl` to self-host.\n */\nexport { defaultOpencvUrl };\n\n/** Copies exactly the bytes of the view, so the copy can be transferred safely. */\nfunction copyPixels(img: ImageDataLike): ArrayBuffer {\n const copy = new Uint8ClampedArray(img.data.byteLength);\n copy.set(img.data);\n return copy.buffer;\n}\n\nconst toError = (err: unknown): Error => (err instanceof Error ? err : new Error(String(err)));\n\nexport class CVWorkerClient {\n private readonly initTimeoutMs: number;\n private worker: Worker | null = null;\n private readyPromise: Promise<void> | null = null;\n private rejectInit: ((e: Error) => void) | null = null;\n private initTimer: ReturnType<typeof setTimeout> | null = null;\n private ready = false;\n private pending = new Map<number, Pending>();\n private nextId = 1;\n\n constructor(options: CVWorkerClientOptions = {}) {\n this.initTimeoutMs = options.initTimeoutMs ?? OPENCV_READY_TIMEOUT_MS;\n }\n\n /**\n * Spawns the worker (`workerUrl`, default: the packaged `cv-worker.js`) and loads\n * OpenCV from `opencvUrl`. While a load is pending or after it succeeded, returns\n * the same promise (different urls are ignored).\n * After any failure a later call retries with a fresh Worker.\n */\n init(opencvUrl: string = defaultOpencvUrl(), workerUrl?: string): Promise<void> {\n if (this.readyPromise) return this.readyPromise;\n let worker: Worker;\n try {\n worker = spawnCvWorker(workerUrl);\n } catch (err) {\n return Promise.reject(toError(err)); // not cached: the next init() retries\n }\n this.worker = worker;\n const promise = new Promise<void>((resolve, reject) => {\n this.rejectInit = reject;\n this.initTimer = setTimeout(\n () => this.fail(new Error(`OpenCV worker not ready within ${this.initTimeoutMs} ms`)),\n this.initTimeoutMs\n );\n worker.addEventListener('message', (e: MessageEvent<unknown>) => {\n if (this.worker !== worker) return; // late message from a terminated worker\n const msg = parseWorkerResponse(e.data);\n if (!msg) return;\n if (msg.type === 'ready') {\n this.clearInitTimer();\n this.rejectInit = null;\n this.ready = true;\n resolve();\n return;\n }\n if (msg.type === 'init-error') { this.fail(new Error(msg.error)); return; }\n const p = this.pending.get(msg.id);\n if (!p) return;\n this.pending.delete(msg.id);\n if (msg.type === 'error') p.reject(new Error(msg.error));\n else p.resolve(msg);\n });\n worker.addEventListener('error', (e: ErrorEvent) => {\n if (this.worker !== worker) return;\n this.fail(new Error(e.message || 'Worker error'));\n });\n worker.addEventListener('messageerror', (e: MessageEvent<unknown>) => {\n if (this.worker !== worker) return;\n const err = new Error('Worker message could not be deserialized');\n const id = (e.data as { id?: unknown } | null)?.id;\n const p = typeof id === 'number' ? this.pending.get(id) : undefined;\n if (typeof id === 'number' && p) {\n this.pending.delete(id);\n p.reject(err);\n return;\n }\n this.fail(err); // cannot tell which request it was: treat as a protocol failure\n });\n });\n this.readyPromise = promise;\n worker.postMessage({ type: 'init', opencvUrl } satisfies WorkerRequest);\n return promise;\n }\n\n isReady(): boolean { return this.ready && this.worker !== null; }\n\n /** `opts.prior`: the previous frame's corners, used by the detector to rank candidates. */\n async analyze(img: ImageDataLike, opts: { prior?: Quad } = {}): Promise<CvDetectionResult> {\n const buffer = copyPixels(img);\n const prior = opts.prior;\n const msg = await this.request(\n (id) => ({ type: 'analyze', id, width: img.width, height: img.height, buffer, ...(prior ? { prior } : {}) }),\n [buffer]\n );\n if (msg.type !== 'analyze-result') throw new Error(`Unexpected worker response: ${msg.type}`);\n return msg.result;\n }\n\n async warp(img: ImageDataLike, corners: Quad, docType: DocumentType | null, longSide = 1024): Promise<ImageData> {\n const buffer = copyPixels(img);\n const msg = await this.request(\n (id) => ({ type: 'warp', id, width: img.width, height: img.height, buffer, corners, docType, longSide }),\n [buffer]\n );\n if (msg.type !== 'warp-result') throw new Error(`Unexpected worker response: ${msg.type}`);\n return new ImageData(new Uint8ClampedArray(msg.buffer), msg.width, msg.height);\n }\n\n /**\n * Stops the worker and rejects every pending request. Idempotent. A pending\n * `init()` is left unsettled (callers that stop mid-load are not told it failed).\n */\n terminate(): void {\n this.rejectInit = null;\n this.shutdown(new Error('Worker terminated'));\n }\n\n /** Failure path: shuts down, then rejects a pending `init()` with the same error. */\n private fail(reason: Error): void {\n const rejectInit = this.rejectInit;\n this.rejectInit = null;\n this.shutdown(reason);\n rejectInit?.(reason);\n }\n\n private clearInitTimer(): void {\n if (this.initTimer !== null) clearTimeout(this.initTimer);\n this.initTimer = null;\n }\n\n private shutdown(reason: Error): void {\n this.clearInitTimer();\n this.worker?.terminate();\n this.worker = null;\n this.readyPromise = null;\n this.ready = false;\n const pending = [...this.pending.values()];\n this.pending.clear();\n for (const p of pending) p.reject(reason);\n }\n\n private request(\n build: (id: number) => Exclude<WorkerRequest, { type: 'init' }>,\n transfer: Transferable[]\n ): Promise<RequestResponse> {\n const worker = this.worker;\n if (!worker || !this.ready) return Promise.reject(new Error('CVWorkerClient not ready'));\n const req = build(this.nextId++);\n const promise = new Promise<RequestResponse>((resolve, reject) => this.pending.set(req.id, { resolve, reject }));\n worker.postMessage(req, transfer);\n return promise;\n }\n}\n","/**\n * Pure geometry helpers (no OpenCV, no DOM). Unit-tested in Vitest.\n * Corner order everywhere is TL, TR, BR, BL.\n */\nimport type { DocumentType } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\nexport type Quad = [Point, Point, Point, Point];\n\nexport const ID1_RATIO = 85.6 / 53.98; // 1.586 — ISO/IEC 7810 ID-1\nexport const TD3_RATIO = 125 / 88; // 1.420 — ICAO 9303 TD3\nexport const TYPE_BOUNDARY_RATIO = 1.503; // midpoint between the nominal ratios\nexport const HINT_TOLERANCE = 0.05; // ±5 % around a nominal ratio\nexport const CAPTURABLE_ASPECT_MIN = 1.25;\nexport const CAPTURABLE_ASPECT_MAX = 1.75;\nconst ASPECT_SCORE_FALLOFF = 0.25; // aspectScore reaches 0 at this distance\n\n/**\n * Orders 4 points as TL, TR, BR, BL (y-down). Sorts by angle around the centroid\n * (clockwise on screen), then rotates the cycle so TL is the point with the\n * smallest x + y (ties: smallest y). Robust to a card rotated exactly 45°.\n */\nexport function orderCorners(points: Point[]): Quad {\n if (points.length !== 4) throw new Error(`orderCorners expects 4 points, got ${points.length}`);\n const cx = (points[0].x + points[1].x + points[2].x + points[3].x) / 4;\n const cy = (points[0].y + points[1].y + points[2].y + points[3].y) / 4;\n const cycle = [...points].sort(\n (a, b) => Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx),\n );\n let start = 0;\n for (let i = 1; i < 4; i++) {\n const p = cycle[i];\n const s = cycle[start];\n if (p.x + p.y < s.x + s.y || (p.x + p.y === s.x + s.y && p.y < s.y)) start = i;\n }\n return [0, 1, 2, 3].map((k) => cycle[(start + k) % 4]) as Quad;\n}\n\n/**\n * Shoelace area (absolute, winding independent). Intentionally duplicated from the\n * evals-only `evals/geometry.ts`: the evals harness and the SDK are separate\n * package boundaries, so the SDK does not import from `evals/`.\n */\nexport function polygonArea(points: Point[]): number {\n let sum = 0;\n for (let i = 0; i < points.length; i++) {\n const a = points[i];\n const b = points[(i + 1) % points.length];\n sum += a.x * b.y - b.x * a.y;\n }\n return Math.abs(sum) / 2;\n}\n\nexport function sideLengths(quad: Quad): { top: number; right: number; bottom: number; left: number } {\n const [tl, tr, br, bl] = quad;\n return {\n top: Math.hypot(tr.x - tl.x, tr.y - tl.y),\n right: Math.hypot(br.x - tr.x, br.y - tr.y),\n bottom: Math.hypot(br.x - bl.x, br.y - bl.y),\n left: Math.hypot(bl.x - tl.x, bl.y - tl.y),\n };\n}\n\n/** Interior angle at each vertex, in degrees. Degenerate (zero-length) sides yield 0. */\nexport function interiorAngles(quad: Quad): [number, number, number, number] {\n const out = [0, 0, 0, 0] as [number, number, number, number];\n for (let i = 0; i < 4; i++) {\n const prev = quad[(i + 3) % 4];\n const cur = quad[i];\n const next = quad[(i + 1) % 4];\n const ax = prev.x - cur.x;\n const ay = prev.y - cur.y;\n const bx = next.x - cur.x;\n const by = next.y - cur.y;\n const la = Math.hypot(ax, ay);\n const lb = Math.hypot(bx, by);\n if (la === 0 || lb === 0) {\n out[i] = 0;\n continue;\n }\n const cos = Math.min(1, Math.max(-1, (ax * bx + ay * by) / (la * lb)));\n out[i] = (Math.acos(cos) * 180) / Math.PI;\n }\n return out;\n}\n\nexport function isValidQuad(quad: Quad, minAngle = 70, maxAngle = 110): boolean {\n const s = sideLengths(quad);\n if (s.top <= 0 || s.right <= 0 || s.bottom <= 0 || s.left <= 0) return false;\n if (!isConvex(quad) || polygonArea(quad) <= 0) return false;\n return interiorAngles(quad).every((a) => a >= minAngle && a <= maxAngle);\n}\n\n/** Strictly convex: the four consecutive edge cross products share one sign, none zero. */\nfunction isConvex(quad: Quad): boolean {\n let sign = 0;\n for (let i = 0; i < 4; i++) {\n const a = quad[i];\n const b = quad[(i + 1) % 4];\n const c = quad[(i + 2) % 4];\n const cross = (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);\n if (cross === 0) return false;\n const s = Math.sign(cross);\n if (sign === 0) sign = s;\n else if (s !== sign) return false;\n }\n return true;\n}\n\n/** Aspect ratio of the rectified quad: mean(long sides) / mean(short sides), ≥ 1. */\nexport function rectifiedAspect(quad: Quad): number {\n const s = sideLengths(quad);\n const w = (s.top + s.bottom) / 2;\n const h = (s.left + s.right) / 2;\n const short = Math.min(w, h);\n if (short <= 0) return 0;\n return Math.max(w, h) / short;\n}\n\n/** 1 at ID-1 or TD3, linear decay to 0 at ±ASPECT_SCORE_FALLOFF from the nearest nominal. */\nexport function aspectScore(aspect: number): number {\n if (!Number.isFinite(aspect)) return 0;\n const d = Math.min(Math.abs(aspect - ID1_RATIO), Math.abs(aspect - TD3_RATIO));\n return Math.max(0, 1 - d / ASPECT_SCORE_FALLOFF);\n}\n\nexport function scoreCandidate(c: { areaRatio: number; rectangularity: number; aspect: number }): number {\n return 0.5 * c.areaRatio + 0.3 * c.rectangularity + 0.2 * aspectScore(c.aspect);\n}\n\n/** Nearest nominal ratio within ±5 %, else OTHER. Bands: ID-1 1.507–1.665, TD3 1.349–1.491. */\nexport function typeHintFromAspect(aspect: number): DocumentType {\n const nominal = aspect >= TYPE_BOUNDARY_RATIO ? ID1_RATIO : TD3_RATIO;\n if (Math.abs(aspect - nominal) / nominal <= HINT_TOLERANCE) {\n return nominal === ID1_RATIO ? 'INE' : 'PASSPORT_MX';\n }\n return 'OTHER';\n}\n\nexport function isCapturableAspect(aspect: number): boolean {\n return aspect >= CAPTURABLE_ASPECT_MIN && aspect <= CAPTURABLE_ASPECT_MAX;\n}\n\n/** Target aspect for the warp: nominal for INE / PASSPORT_MX, measured otherwise. */\nexport function canonicalRatioFor(type: DocumentType | null, measuredAspect: number): number {\n if (type === 'INE') return ID1_RATIO;\n if (type === 'PASSPORT_MX') return TD3_RATIO;\n return measuredAspect;\n}\n","/**\n * Perspective warp with OpenCV: rectifies the document to its canonical rectangle.\n *\n * - warpDocumentImageData: ImageData in / ImageData out, worker-safe (no DOM).\n * - warpDocument / warpedSnapshotToBlob: canvas based, main thread only.\n *\n * Corners are in the full-resolution camera frame (not the analysis sample); OpenCV\n * computes the 3x3 homography and warpPerspective returns the document head-on.\n */\n\nimport { CAPTURABLE_ASPECT_MAX, CAPTURABLE_ASPECT_MIN, canonicalRatioFor, rectifiedAspect, sideLengths, type Quad } from './geometry.js';\nimport type { DocumentType } from './types.js';\nimport type { ImageDataLike } from './worker-protocol.js';\n\n/** Long side (px) of the rectified document: enough for Textract and keeps the JPEG < 500 KB. */\nexport const DEFAULT_WARP_LONG_SIDE = 1024;\n/** Long side (px) for `captureResolution: 'high'`. */\nexport const HIGH_WARP_LONG_SIDE = 1600;\n\n/**\n * Pure warp: ImageData → ImageData, no DOM dependency (runs inside the Web Worker).\n * INE / PASSPORT_MX warp to their nominal ratio; OTHER / null warp to the measured\n * rectified aspect, clamped to the capturable range so a degenerate quad cannot yield\n * a 0 px or absurd output.\n */\nexport function warpDocumentImageData(\n cv: any,\n source: ImageDataLike,\n corners: Quad,\n docType: DocumentType | null,\n longSide: number = DEFAULT_WARP_LONG_SIDE\n): ImageData {\n const ratio = clampAspect(canonicalRatioFor(docType, rectifiedAspect(corners)));\n const shortSide = Math.max(1, Math.round(longSide / ratio));\n const s = sideLengths(corners);\n const portrait = s.top + s.bottom < s.left + s.right;\n // ID-1 / TD3 are landscape documents: a portrait-held one is turned 90° (left edge becomes the\n // top) so its long edge maps to the long output side. The result may be upside down, never stretched.\n const fixedLandscape = docType === 'INE' || docType === 'PASSPORT_MX';\n const q: Quad = portrait && fixedLandscape ? [corners[3], corners[0], corners[1], corners[2]] : corners;\n // OTHER keeps its measured orientation, so a portrait page stays upright.\n const landscapeOut = !portrait || fixedLandscape;\n const outW = landscapeOut ? longSide : shortSide;\n const outH = landscapeOut ? shortSide : longSide;\n\n let src: any = null;\n let dst: any = null;\n let srcPts: any = null;\n let dstPts: any = null;\n let M: any = null;\n let rgba: any = null;\n\n try {\n src = cv.matFromImageData(source);\n dst = new cv.Mat();\n srcPts = cv.matFromArray(4, 1, cv.CV_32FC2, [\n q[0].x, q[0].y,\n q[1].x, q[1].y,\n q[2].x, q[2].y,\n q[3].x, q[3].y,\n ]);\n dstPts = cv.matFromArray(4, 1, cv.CV_32FC2, [0, 0, outW, 0, outW, outH, 0, outH]);\n M = cv.getPerspectiveTransform(srcPts, dstPts);\n cv.warpPerspective(\n src,\n dst,\n M,\n new cv.Size(outW, outH),\n cv.INTER_LINEAR,\n cv.BORDER_CONSTANT,\n new cv.Scalar(0, 0, 0, 255)\n );\n\n // RGBA input yields a CV_8UC4 output; convert anything else to RGBA.\n if (dst.channels() !== 4) {\n rgba = new cv.Mat();\n cv.cvtColor(dst, rgba, cv.COLOR_BGR2RGBA);\n }\n return makeImageData(new Uint8ClampedArray((rgba ?? dst).data), outW, outH);\n } finally {\n for (const m of [rgba, M, dstPts, srcPts, dst, src]) m?.delete();\n }\n}\n\n/** Canvas-based warp (main thread only): canvas → warpDocumentImageData → new canvas. */\nexport function warpDocument(\n cv: any,\n sourceCanvas: HTMLCanvasElement,\n corners: Quad,\n docType: DocumentType | null,\n longSide: number = DEFAULT_WARP_LONG_SIDE\n): HTMLCanvasElement {\n const ctx = sourceCanvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) throw new Error('2D canvas context unavailable');\n const sourceImageData = ctx.getImageData(0, 0, sourceCanvas.width, sourceCanvas.height);\n\n const warped = warpDocumentImageData(cv, sourceImageData, corners, docType, longSide);\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = warped.width;\n outCanvas.height = warped.height;\n const outCtx = outCanvas.getContext('2d');\n if (!outCtx) throw new Error('2D canvas context unavailable (output)');\n outCtx.putImageData(warped, 0, 0);\n\n return outCanvas;\n}\n\n/** Rectified snapshot as a JPEG Blob; without corners, a plain snapshot of the canvas. */\nexport async function warpedSnapshotToBlob(\n cv: any,\n sourceCanvas: HTMLCanvasElement,\n corners: Quad | null,\n docType: DocumentType | null,\n quality = 0.92,\n longSide: number = DEFAULT_WARP_LONG_SIDE\n): Promise<Blob> {\n const out = corners ? warpDocument(cv, sourceCanvas, corners, docType, longSide) : sourceCanvas;\n return new Promise<Blob>((resolve, reject) => {\n out.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('Canvas toBlob returned null'))),\n 'image/jpeg',\n quality\n );\n });\n}\n\nfunction clampAspect(ratio: number): number {\n if (!Number.isFinite(ratio)) return CAPTURABLE_ASPECT_MIN;\n return Math.min(CAPTURABLE_ASPECT_MAX, Math.max(CAPTURABLE_ASPECT_MIN, ratio));\n}\n\n/** DOM ImageData when available (browser / worker); a same-shaped plain object otherwise (Node). */\nfunction makeImageData(data: Uint8ClampedArray<ArrayBuffer>, width: number, height: number): ImageData {\n if (typeof globalThis.ImageData === 'function') return new ImageData(data, width, height);\n return { data, width, height, colorSpace: 'srgb' } as ImageData;\n}\n","/**\n * Frame quality measured INSIDE the detected quad (spec §5.4). Pure TS over a\n * grayscale buffer so it runs in the worker right after detection (one round\n * trip) and in Vitest without OpenCV.\n */\nimport { polygonArea, type Quad } from './geometry.js';\nimport type { FrameQuality } from './types.js';\n\nexport interface GrayFrame {\n data: Uint8Array | Uint8ClampedArray;\n width: number;\n height: number;\n}\n\nexport const QUALITY_THRESHOLDS = {\n brightnessMin: 0.18,\n brightnessMax: 0.9,\n blurMin: 60,\n glareMax: 0.04,\n fillMin: 0.25,\n glarePixel: 248,\n} as const;\n\n/**\n * Horizontal span of the (convex) quad on every row: [xStart, xEnd) clamped to\n * the frame. Rows outside the quad get xStart >= xEnd.\n */\nexport function quadRowSpans(quad: Quad, width: number, height: number): Int32Array {\n const spans = new Int32Array(height * 2);\n for (let y = 0; y < height; y++) {\n const yc = y + 0.5;\n let xMin = Infinity;\n let xMax = -Infinity;\n for (let i = 0; i < 4; i++) {\n const a = quad[i];\n const b = quad[(i + 1) % 4];\n const lo = Math.min(a.y, b.y);\n const hi = Math.max(a.y, b.y);\n if (yc < lo || yc > hi || hi === lo) continue;\n const x = a.x + ((yc - a.y) * (b.x - a.x)) / (b.y - a.y);\n if (x < xMin) xMin = x;\n if (x > xMax) xMax = x;\n }\n if (xMin === Infinity) {\n spans[y * 2] = 0;\n spans[y * 2 + 1] = 0;\n continue;\n }\n spans[y * 2] = Math.max(0, Math.ceil(xMin - 0.5));\n spans[y * 2 + 1] = Math.min(width, Math.floor(xMax + 0.5));\n }\n return spans;\n}\n\nexport function measureQuality(gray: GrayFrame, quad: Quad): FrameQuality {\n const { data, width: W, height: H } = gray;\n const spans = quadRowSpans(quad, W, H);\n const glarePixel = QUALITY_THRESHOLDS.glarePixel;\n\n let sum = 0;\n let glare = 0;\n let count = 0;\n let lapSum = 0;\n let lapSq = 0;\n let lapCount = 0;\n\n for (let y = 0; y < H; y++) {\n const xs = spans[y * 2];\n const xe = spans[y * 2 + 1];\n if (xs >= xe) continue;\n\n // Laplacian range: pixels whose whole 3×3 neighbourhood lies inside the\n // spans of rows y-1, y and y+1 (never samples outside the quad).\n let lx = 0;\n let rx = 0;\n if (y > 0 && y < H - 1) {\n lx = Math.max(xs, spans[(y - 1) * 2], spans[(y + 1) * 2]) + 1;\n rx = Math.min(xe, spans[(y - 1) * 2 + 1], spans[(y + 1) * 2 + 1]) - 1;\n }\n\n const row = y * W;\n for (let x = xs; x < xe; x++) {\n const i = row + x;\n const v = data[i];\n sum += v;\n if (v >= glarePixel) glare++;\n count++;\n if (x >= lx && x < rx) {\n const r = 4 * v - data[i - W] - data[i + W] - data[i - 1] - data[i + 1];\n lapSum += r;\n lapSq += r * r;\n lapCount++;\n }\n }\n }\n\n const brightness = count > 0 ? sum / count / 255 : 0;\n const glareRatio = count > 0 ? glare / count : 0;\n const blurScore = lapCount > 0 ? Math.max(0, lapSq / lapCount - (lapSum / lapCount) ** 2) : 0;\n const frameArea = W * H;\n const docFillRatio = frameArea > 0 ? polygonArea(quad) / frameArea : 0;\n\n const ok =\n brightness >= QUALITY_THRESHOLDS.brightnessMin &&\n brightness <= QUALITY_THRESHOLDS.brightnessMax &&\n blurScore >= QUALITY_THRESHOLDS.blurMin &&\n glareRatio <= QUALITY_THRESHOLDS.glareMax &&\n docFillRatio >= QUALITY_THRESHOLDS.fillMin;\n\n return { brightness, blurScore, glareRatio, docFillRatio, ok };\n}\n\nexport function frameMeanBrightness(gray: GrayFrame): number {\n const { data } = gray;\n if (data.length === 0) return 0;\n let sum = 0;\n for (let i = 0; i < data.length; i++) sum += data[i];\n return sum / data.length / 255;\n}\n\nexport function rgbaToGray(rgba: Uint8ClampedArray, width: number, height: number): GrayFrame {\n const data = new Uint8Array(width * height);\n for (let p = 0, i = 0; p < data.length; p++, i += 4) {\n data[p] = Math.round(0.2126 * rgba[i] + 0.7152 * rgba[i + 1] + 0.0722 * rgba[i + 2]);\n }\n return { data, width, height };\n}\n","/**\n * User-feedback decisions (pure): frame hint table, torch decision and the\n * default texts (es-MX and English) used by the component (spec §5.5).\n */\nimport { QUALITY_THRESHOLDS } from './quality.js';\nimport type { FrameHint, FrameQuality, SessionStatus } from './types.js';\n\nexport function decideHint(a: {\n detected: boolean;\n quality: FrameQuality | null;\n stableFrames: number;\n stableFramesRequired: number;\n}): FrameHint {\n if (!a.detected || !a.quality) return 'no_document';\n const q = a.quality;\n // Non-finite metrics (e.g. NaN from an empty quad mask) fail their own check.\n if (!Number.isFinite(q.docFillRatio) || q.docFillRatio < QUALITY_THRESHOLDS.fillMin) return 'too_small';\n if (!Number.isFinite(q.brightness) || q.brightness < QUALITY_THRESHOLDS.brightnessMin) return 'too_dark';\n if (!Number.isFinite(q.glareRatio) || q.glareRatio > QUALITY_THRESHOLDS.glareMax || q.brightness > QUALITY_THRESHOLDS.brightnessMax) return 'glare';\n if (!Number.isFinite(q.blurScore) || q.blurScore < QUALITY_THRESHOLDS.blurMin) return 'blurry';\n if (a.stableFrames < a.stableFramesRequired) return 'hold_still';\n return 'ready';\n}\n\nexport const TORCH_BRIGHTNESS_THRESHOLD = QUALITY_THRESHOLDS.brightnessMin;\n\nexport function shouldEnableTorch(a: {\n torchSupported: boolean;\n torchOn: boolean;\n quality: FrameQuality | null;\n frameBrightness: number;\n}): boolean {\n if (!a.torchSupported || a.torchOn) return false;\n const brightness = a.quality ? a.quality.brightness : a.frameBrightness;\n return brightness < TORCH_BRIGHTNESS_THRESHOLD;\n}\n\n/** Every user-visible text of the component. `retake`, `capture`, `tip_*` and `tips_dismiss` are UI copy that `copyFor` never returns. */\nexport type HintCopyKey =\n | FrameHint\n | 'loading_detector'\n | 'capturing'\n | 'uploading'\n | 'done'\n | 'error'\n | 'retake'\n | 'idle'\n | 'starting'\n | 'capture'\n | 'tip_light'\n | 'tip_glare'\n | 'tip_focus'\n | 'tips_dismiss';\nexport type HintCopy = Record<HintCopyKey, string>;\n\n/** Default texts (es-MX). Product copy: do not reword. */\nexport const DEFAULT_TEXTS_ES: Readonly<HintCopy> = Object.freeze({\n idle: 'Toca para activar la cámara',\n starting: 'Abriendo la cámara…',\n loading_detector: 'Preparando la cámara…',\n no_document: 'Coloca tu identificación dentro del recuadro',\n too_small: 'Acerca más tu identificación',\n too_dark: 'Hay poca luz, busca un lugar más iluminado',\n glare: 'Hay un reflejo, inclina un poco tu identificación',\n blurry: 'Espera a que la cámara enfoque',\n hold_still: 'No te muevas…',\n ready: '¡Perfecto! No te muevas',\n capturing: 'Tomando la foto…',\n uploading: 'Revisando tu identificación…',\n done: '¡Listo!',\n error: 'Algo salió mal, inténtalo de nuevo',\n detector_unavailable: 'Toma la foto con el botón blanco',\n retake: 'Tomar otra vez',\n capture: 'Tomar foto',\n tip_light: 'Busca un lugar con buena luz',\n tip_glare: 'Evita reflejos: no apuntes una lámpara directo a tu identificación',\n tip_focus: 'Espera a que la cámara enfoque; la foto se toma sola',\n tips_dismiss: 'Entendido',\n});\n\n/** English texts (the 0.4.0 copy plus the new keys). */\nexport const DEFAULT_TEXTS_EN: Readonly<HintCopy> = Object.freeze({\n idle: 'Ready to start',\n starting: 'Starting camera…',\n loading_detector: 'Loading detector…',\n no_document: 'Place the document inside the frame',\n too_small: 'Move closer to the document',\n too_dark: 'Find more light',\n glare: 'Tilt the document to avoid glare',\n blurry: 'Hold still to focus',\n hold_still: 'Hold still…',\n ready: 'Ready — hold still',\n capturing: 'Capturing…',\n uploading: 'Processing document…',\n done: 'Done',\n error: 'Something went wrong — try again',\n detector_unavailable: 'Detector unavailable — capture manually',\n retake: 'Capture again',\n capture: 'Capture now',\n tip_light: 'Find a well-lit place',\n tip_glare: \"Avoid glare: don't point a lamp straight at your ID\",\n tip_focus: 'Wait for the camera to focus; the photo is taken automatically',\n tips_dismiss: 'Got it',\n});\n\nconst STATUS_COPY_KEYS = ['loading_detector', 'capturing', 'uploading', 'done', 'error'] as const;\n\nfunction isStatusCopyKey(status: SessionStatus): status is (typeof STATUS_COPY_KEYS)[number] {\n return (STATUS_COPY_KEYS as readonly string[]).includes(status);\n}\n\n/** Resolves one key; only null/undefined overrides fall back to the default (empty string is kept). */\nfunction pick(key: HintCopyKey, overrides: Partial<HintCopy> | undefined): string {\n return overrides?.[key] ?? DEFAULT_TEXTS_ES[key];\n}\n\n/** Full text set: es-MX defaults with the given overrides applied per key. */\nexport function resolveTexts(overrides?: Partial<HintCopy>): HintCopy {\n const out: HintCopy = { ...DEFAULT_TEXTS_ES };\n for (const k of Object.keys(out) as HintCopyKey[]) out[k] = pick(k, overrides);\n return out;\n}\n\nexport function copyFor(\n status: SessionStatus,\n hint: FrameHint | undefined,\n overrides?: Partial<HintCopy>\n): string {\n if (status === 'idle' || status === 'stopped') return pick('idle', overrides);\n if (status === 'starting') return pick('starting', overrides);\n if (isStatusCopyKey(status)) return pick(status, overrides);\n return pick(hint ?? 'no_document', overrides);\n}\n","/**\n * Sample-frame → full-video-frame corner reprojection (pure). Spec §5.6: the\n * reprojected quad is clamped and validated to lie inside the frame.\n */\nimport { isValidQuad, polygonArea, type Quad } from './geometry.js';\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nconst MIN_CAPTURE_AREA_RATIO = 0.05;\n\nexport function reprojectQuad(quad: Quad, from: Size, to: Size): Quad {\n const sx = to.width / from.width;\n const sy = to.height / from.height;\n return quad.map((p) => ({ x: p.x * sx, y: p.y * sy })) as Quad;\n}\n\nexport function clampQuadToFrame(quad: Quad, frame: Size): Quad {\n return quad.map((p) => ({\n x: Math.min(frame.width, Math.max(0, p.x)),\n y: Math.min(frame.height, Math.max(0, p.y)),\n })) as Quad;\n}\n\nexport function prepareCaptureQuad(sampleQuad: Quad, sample: Size, full: Size): Quad | null {\n const clamped = clampQuadToFrame(reprojectQuad(sampleQuad, sample, full), full);\n if (!isValidQuad(clamped)) return null;\n if (polygonArea(clamped) < MIN_CAPTURE_AREA_RATIO * full.width * full.height) return null;\n return clamped;\n}\n","/**\n * Stability tracker (pure). A quad is stable when, frame after frame, every\n * corner moves ≤ 1.5 % of the frame diagonal and the type hint is unchanged.\n * Any frame without a detection resets the count (spec §5.3).\n *\n * The type hint has hysteresis: camera jitter can flick the measured aspect\n * across a band edge (INE ↔ OTHER), so a different hint is only a candidate\n * until it persists `hintSwitchFrames` consecutive frames. While pending,\n * geometry keeps counting and the committed hint is reported; on commit the\n * count restarts at 1 (the document really changed).\n */\nimport type { Quad } from './geometry.js';\nimport type { DocumentType } from './types.js';\n\nexport const DEFAULT_STABLE_FRAMES = 10;\nexport const HINT_SWITCH_FRAMES = 3;\nexport const MAX_CORNER_DISPLACEMENT_RATIO = 0.015;\n\nexport interface StabilityInput {\n quad: Quad;\n typeHint: DocumentType;\n}\n\nexport interface StabilitySnapshot {\n stableFrames: number;\n isStable: boolean;\n quad: Quad | null;\n typeHint: DocumentType | null;\n}\n\nconst EMPTY: StabilitySnapshot = { stableFrames: 0, isStable: false, quad: null, typeHint: null };\n\nexport class StabilityTracker {\n private readonly required: number;\n private readonly maxRatio: number;\n private readonly switchFrames: number;\n private current: StabilitySnapshot = EMPTY;\n private candidate: { typeHint: DocumentType; frames: number } | null = null;\n\n constructor(opts: { stableFramesRequired?: number; maxDisplacementRatio?: number; hintSwitchFrames?: number } = {}) {\n this.required = opts.stableFramesRequired ?? DEFAULT_STABLE_FRAMES;\n this.maxRatio = opts.maxDisplacementRatio ?? MAX_CORNER_DISPLACEMENT_RATIO;\n this.switchFrames = Math.max(1, opts.hintSwitchFrames ?? HINT_SWITCH_FRAMES);\n }\n\n get snapshot(): StabilitySnapshot {\n return this.current;\n }\n\n reset(): void {\n this.current = EMPTY;\n this.candidate = null;\n }\n\n update(input: StabilityInput | null, frameSize: { width: number; height: number }): StabilitySnapshot {\n if (!input) {\n this.reset();\n return this.current;\n }\n const maxMove = Math.hypot(frameSize.width, frameSize.height) * this.maxRatio;\n const prev = this.current;\n const stillGeometry =\n prev.quad !== null &&\n prev.quad.every((p, i) => Math.hypot(input.quad[i].x - p.x, input.quad[i].y - p.y) <= maxMove);\n\n let typeHint = prev.typeHint ?? input.typeHint;\n let stableFrames = stillGeometry ? prev.stableFrames + 1 : 1;\n if (input.typeHint === typeHint) {\n this.candidate = null;\n } else {\n const frames = this.candidate?.typeHint === input.typeHint ? this.candidate.frames + 1 : 1;\n this.candidate = { typeHint: input.typeHint, frames };\n if (frames >= this.switchFrames) {\n typeHint = input.typeHint;\n stableFrames = 1;\n this.candidate = null;\n }\n }\n this.current = { stableFrames, isStable: stableFrames >= this.required, quad: input.quad, typeHint };\n return this.current;\n }\n}\n","/**\n * XidCameraOcrSession — capture orchestrator. One frame in flight: the next\n * sample is taken only after the worker answers (spec §5.1). Status flow:\n * idle → starting → loading_detector → streaming ⇄ capturing → uploading → done.\n *\n * Detector failures (OpenCV load error, worker crash) are NOT fatal: the session\n * stays in `streaming` with hint `detector_unavailable`, reports `onError` once,\n * stops analysing and keeps `captureNow()` (unwarped frame). `error` is reserved\n * for camera/start failures and for a failed capture/upload, and it is sticky\n * until the next `start()`.\n *\n * No framework state: hosts observe the session through its callbacks.\n */\nimport {\n attachCamera,\n detachCamera,\n grabFullFrame,\n imageDataToJpeg,\n sampleFrame,\n setTorch,\n snapshotToBlob,\n supportsTorch,\n} from './camera.js';\nimport { CVWorkerClient } from './cv-worker-client.js';\nimport { DEFAULT_WARP_LONG_SIDE, HIGH_WARP_LONG_SIDE } from './cv-warp.js';\nimport type { Quad } from './geometry.js';\nimport { decideHint, shouldEnableTorch } from './hints.js';\nimport { prepareCaptureQuad, type Size } from './reprojection.js';\nimport { DEFAULT_STABLE_FRAMES, StabilityTracker } from './stability.js';\nimport type { DocumentType, FrameState, SessionState, XidCameraOcrSessionOptions } from './types.js';\nimport type { CvDetectionResult, ImageDataLike } from './worker-protocol.js';\n\nconst SAMPLE_WIDTH = 640;\nconst ANALYZE_FPS = 10;\nconst WARMUP_MS = 1500;\n/** Worker deadline is 30 s; the client waits longer so the worker's own `init-error` wins. */\nconst WORKER_INIT_TIMEOUT_MS = 35_000;\n/** Extra stable frames demanded when the winning quad is a geometrically weaker `reduced`/`lowres` one. */\nconst WEAK_PROVENANCE_EXTRA_FRAMES = 5;\n\ntype Callbacks = 'onFrameAnalyzed' | 'onCaptured' | 'onResult' | 'onError';\n\ntype WorkerClient = Pick<CVWorkerClient, 'init' | 'isReady' | 'analyze' | 'warp' | 'terminate'>;\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n requestVideoFrameCallback?: (cb: () => void) => number;\n cancelVideoFrameCallback?: (handle: number) => void;\n};\n\n/**\n * @internal Test seam (second constructor argument). Not part of the public,\n * documented API and may change without notice.\n */\nexport interface XidCameraOcrSessionDeps {\n createWorkerClient(opts: { initTimeoutMs: number }): WorkerClient;\n attachCamera(video: HTMLVideoElement): Promise<MediaStream>;\n detachCamera(video: HTMLVideoElement, stream: MediaStream | null): void;\n sampleFrame(video: HTMLVideoElement, targetWidth: number): ImageDataLike | null;\n grabFrame(video: HTMLVideoElement): ImageDataLike | null;\n encodeJpeg(img: ImageData, quality: number): Promise<Blob>;\n snapshotToBlob(video: HTMLVideoElement, quality: number): Promise<Blob>;\n supportsTorch(track: MediaStreamTrack): boolean;\n setTorch(track: MediaStreamTrack, on: boolean): Promise<boolean>;\n now(): number;\n}\n\nconst DEFAULT_DEPS: XidCameraOcrSessionDeps = {\n createWorkerClient: (opts) => new CVWorkerClient(opts),\n attachCamera: (video) => attachCamera(video),\n detachCamera,\n sampleFrame,\n grabFrame: grabFullFrame,\n encodeJpeg: imageDataToJpeg,\n snapshotToBlob,\n supportsTorch,\n setTorch,\n now: () => performance.now(),\n};\n\nconst isWeak = (det: CvDetectionResult): boolean => det.provenance === 'reduced' || det.provenance === 'lowres';\nconst toError = (err: unknown): Error => (err instanceof Error ? err : new Error(String(err)));\nconst copyQuad = (q: Quad): Quad => q.map((p) => ({ x: p.x, y: p.y })) as Quad;\n\nexport class XidCameraOcrSession {\n private readonly opts: Required<Omit<XidCameraOcrSessionOptions, Callbacks | 'opencvUrl' | 'workerUrl'>> &\n Pick<XidCameraOcrSessionOptions, Callbacks | 'opencvUrl' | 'workerUrl'>;\n private readonly deps: XidCameraOcrSessionDeps;\n private stream: MediaStream | null = null;\n private track: MediaStreamTrack | null = null;\n private cv: WorkerClient | null = null;\n /** Bumped by start()/stop(); any async continuation from an older generation is dropped. */\n private generation = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private frameCallback: number | null = null;\n /** The in-flight analyze request, so a manual capture never overlaps it. */\n private inFlight: Promise<unknown> | null = null;\n /** 0 = not armed yet (armed on the first analysed frame and after each capture). */\n private warmupUntil = 0;\n private capturing = false;\n /** Set once a capture has been taken; the auto-shutter stays off until the next start(). */\n private autoShutterSpent = false;\n private torchSupported = false;\n private torchOn = false;\n private torchRejected = false;\n /** True when any frame of the current stable run came from a weak (`reduced`/`lowres`) winner. */\n private weakRun = false;\n /**\n * Temporal prior for the detector: the previous analysed frame's corners and the size\n * of that frame. Cleared on a frame without detection, a frame-size change, start(),\n * stop() and after a capture.\n */\n private prior: { quad: Quad; width: number; height: number } | null = null;\n private readonly stability: StabilityTracker;\n\n state: SessionState = { status: 'idle', lastFrame: null, lastResult: null, lastError: null };\n\n constructor(options: XidCameraOcrSessionOptions, deps: Partial<XidCameraOcrSessionDeps> = {}) {\n this.opts = {\n videoElement: options.videoElement,\n documentTypes: options.documentTypes ?? ['INE', 'PASSPORT_MX'],\n autoCapture: options.autoCapture ?? true,\n stableFramesRequired: options.stableFramesRequired ?? DEFAULT_STABLE_FRAMES,\n captureQuality: options.captureQuality ?? 0.92,\n captureResolution: options.captureResolution ?? 'standard',\n opencvUrl: options.opencvUrl,\n workerUrl: options.workerUrl,\n onUpload: options.onUpload,\n onFrameAnalyzed: options.onFrameAnalyzed,\n onCaptured: options.onCaptured,\n onResult: options.onResult,\n onError: options.onError,\n };\n this.deps = { ...DEFAULT_DEPS, ...deps };\n this.stability = new StabilityTracker({ stableFramesRequired: this.opts.stableFramesRequired });\n }\n\n async start(): Promise<void> {\n if (!['idle', 'stopped', 'error'].includes(this.state.status)) {\n throw new Error(`Cannot start session from status=${this.state.status}`);\n }\n this.release(); // a restart after an error must not leak the previous camera/worker\n const generation = ++this.generation;\n this.setStatus('starting');\n this.state.lastError = null;\n try {\n const stream = await this.deps.attachCamera(this.opts.videoElement);\n if (generation !== this.generation) {\n this.deps.detachCamera(this.opts.videoElement, stream); // stopped while the camera was opening\n return;\n }\n this.stream = stream;\n this.track = stream.getVideoTracks()[0] ?? null;\n this.torchSupported = this.track ? this.deps.supportsTorch(this.track) : false;\n this.warmupUntil = 0;\n this.setStatus('loading_detector');\n const cv = this.deps.createWorkerClient({ initTimeoutMs: WORKER_INIT_TIMEOUT_MS });\n this.cv = cv;\n // Not awaited: start() resolves once the camera is live; frames begin when the detector is ready.\n cv.init(this.opts.opencvUrl, this.opts.workerUrl).then(\n () => {\n if (generation !== this.generation || this.cv !== cv) return;\n if (this.state.status === 'loading_detector') this.setStatus('streaming');\n this.scheduleNext(generation, 0);\n },\n (err) => this.detectorUnavailable(generation, cv, err)\n );\n } catch (err) {\n if (generation === this.generation) this.emitError(err);\n throw err;\n }\n }\n\n stop(): void {\n this.generation++;\n this.release();\n this.setStatus('stopped');\n }\n\n async captureNow(): Promise<void> {\n if (this.capturing) return;\n const s = this.state.status;\n if (s !== 'streaming' && s !== 'loading_detector' && !(s === 'done' && this.stream)) {\n throw new Error(`Cannot capture from status=${this.state.status}`);\n }\n const snap = this.stability.snapshot;\n const sample = this.state.lastFrame?.frameSize ?? null;\n const quad = snap.quad && sample ? this.fullFrameQuad(snap.quad, sample) : null;\n await this.doCapture(this.generation, quad ? snap.typeHint : null, quad);\n }\n\n getState(): SessionState { return { ...this.state }; }\n\n // ── loop ────────────────────────────────────────────────────────────\n\n /** Waits `delayMs`, then for the next video frame when the browser exposes rVFC. */\n private scheduleNext(generation: number, delayMs: number): void {\n this.timer = setTimeout(() => {\n this.timer = null;\n if (generation !== this.generation) return;\n const video = this.opts.videoElement as VideoWithFrameCallback;\n if (typeof video.requestVideoFrameCallback === 'function') {\n this.frameCallback = video.requestVideoFrameCallback(() => {\n this.frameCallback = null;\n void this.tick(generation);\n });\n } else {\n void this.tick(generation);\n }\n }, delayMs);\n }\n\n private async tick(generation: number): Promise<void> {\n if (generation !== this.generation) return;\n const t0 = this.deps.now();\n try {\n await this.analyzeFrame(generation);\n } catch (err) {\n if (generation === this.generation) console.warn('[xid-camera-ocr] analyzeFrame error:', err);\n }\n if (generation !== this.generation || !this.cv) return; // no detector: no no-op loop\n this.scheduleNext(generation, Math.max(0, 1000 / ANALYZE_FPS - (this.deps.now() - t0)));\n }\n\n private async analyzeFrame(generation: number): Promise<void> {\n const cv = this.cv;\n if (this.capturing || !cv?.isReady()) return;\n const img = this.deps.sampleFrame(this.opts.videoElement, SAMPLE_WIDTH);\n if (!img) return;\n const frameSize = { width: img.width, height: img.height };\n if (this.warmupUntil === 0) this.warmupUntil = this.deps.now() + WARMUP_MS;\n\n const prior = this.prior && this.prior.width === img.width && this.prior.height === img.height ? this.prior.quad : null;\n const request = cv.analyze(img, prior ? { prior } : {});\n this.inFlight = request;\n let det: CvDetectionResult;\n try {\n det = await request;\n } catch (err) {\n // The client shuts down before rejecting when the worker dies; a live worker means a one-off failure.\n if (generation === this.generation && this.cv === cv && !cv.isReady()) {\n this.detectorUnavailable(generation, cv, err);\n return;\n }\n throw err;\n } finally {\n if (this.inFlight === request) this.inFlight = null;\n }\n if (generation !== this.generation || this.capturing) return; // late result: drop it\n this.prior = det.detected && det.corners ? { quad: copyQuad(det.corners), ...frameSize } : null;\n\n const inWarmup = this.deps.now() < this.warmupUntil;\n const input = !inWarmup && det.detected && det.corners && det.documentType\n ? { quad: det.corners, typeHint: det.documentType }\n : null;\n const snap = this.stability.update(input, frameSize);\n this.weakRun = snap.stableFrames <= 1 ? input !== null && isWeak(det) : this.weakRun || isWeak(det);\n const required = this.opts.stableFramesRequired + (this.weakRun ? WEAK_PROVENANCE_EXTRA_FRAMES : 0);\n\n await this.updateTorch(generation, det);\n if (generation !== this.generation) return;\n\n const frame: FrameState = {\n detected: det.detected,\n documentType: det.documentType,\n confidence: Math.min(snap.stableFrames / required, 1),\n aspectRatio: det.aspectRatio,\n quality: det.quality,\n corners: det.corners ? copyQuad(det.corners) : null,\n frameSize,\n hint: decideHint({ detected: det.detected, quality: det.quality, stableFrames: snap.stableFrames, stableFramesRequired: required }),\n ...(this.torchSupported ? { torch: this.torchOn } : {}),\n };\n this.state.lastFrame = frame;\n this.opts.onFrameAnalyzed?.(frame);\n if (generation !== this.generation) return; // the callback may have stopped the session\n\n if (this.opts.autoCapture && !this.autoShutterSpent && snap.quad && snap.stableFrames >= required && det.quality?.ok) {\n const quad = this.fullFrameQuad(snap.quad, frameSize);\n if (!quad) {\n // Never capture a degenerate quad: start counting again instead.\n this.stability.reset();\n this.weakRun = false;\n return;\n }\n await this.doCapture(generation, snap.typeHint, quad);\n }\n }\n\n /** Non-fatal detector failure: drop the worker, stop the loop, keep the camera and manual capture. */\n private detectorUnavailable(generation: number, cv: WorkerClient, err: unknown): void {\n if (generation !== this.generation || this.cv !== cv) return;\n cv.terminate();\n this.cv = null;\n this.inFlight = null;\n this.prior = null;\n this.stability.reset();\n this.weakRun = false;\n this.autoShutterSpent = true;\n if (this.state.status === 'loading_detector') this.setStatus('streaming');\n const e = toError(err);\n this.state.lastError = e;\n const frame: FrameState = {\n detected: false, documentType: null, confidence: 0, aspectRatio: null, quality: null,\n corners: null, frameSize: null, hint: 'detector_unavailable',\n ...(this.torchSupported ? { torch: this.torchOn } : {}),\n };\n this.state.lastFrame = frame;\n this.opts.onFrameAnalyzed?.(frame);\n if (generation !== this.generation) return; // the callback may have stopped the session\n this.opts.onError?.(e);\n }\n\n private async updateTorch(generation: number, det: CvDetectionResult): Promise<void> {\n if (!this.track || this.torchRejected) return;\n if (!shouldEnableTorch({ torchSupported: this.torchSupported, torchOn: this.torchOn, quality: det.quality, frameBrightness: det.frameBrightness })) return;\n const on = await this.deps.setTorch(this.track, true);\n if (generation !== this.generation) return; // a later start() owns the torch bookkeeping now\n this.torchOn = on;\n if (!on) this.torchRejected = true; // do not retry a constraint the browser refused\n }\n\n // ── capture ─────────────────────────────────────────────────────────\n\n /** Reprojects a sample-frame quad onto the full video frame; null when degenerate. */\n private fullFrameQuad(sampleQuad: Quad, sample: Size): Quad | null {\n const v = this.opts.videoElement;\n if (!v.videoWidth || !v.videoHeight) return null;\n return prepareCaptureQuad(sampleQuad, sample, { width: v.videoWidth, height: v.videoHeight });\n }\n\n /** `fullQuad` is already in full-frame pixels; null means \"unwarped frame\". */\n private async doCapture(generation: number, typeHint: DocumentType | null, fullQuad: Quad | null): Promise<void> {\n if (this.capturing) return;\n this.capturing = true;\n this.autoShutterSpent = true;\n this.prior = null; // no frame is analysed while capturing, so this holds until the next run of frames\n this.stability.reset();\n this.weakRun = false;\n this.setStatus('capturing');\n try {\n const { blob, type } = await this.captureBlob(generation, typeHint, fullQuad);\n if (generation !== this.generation) return;\n this.opts.onCaptured?.(blob, type);\n this.setStatus('uploading');\n const result = await this.opts.onUpload(blob, type);\n if (generation !== this.generation) return;\n this.state.lastResult = result;\n this.setStatus('done');\n this.opts.onResult?.(result);\n } catch (err) {\n if (generation === this.generation) this.emitError(err);\n } finally {\n if (generation === this.generation) {\n this.stability.reset();\n this.weakRun = false;\n this.warmupUntil = this.deps.now() + WARMUP_MS;\n this.capturing = false;\n }\n }\n }\n\n private async captureBlob(generation: number, typeHint: DocumentType | null, fullQuad: Quad | null): Promise<{ blob: Blob; type: DocumentType | null }> {\n const v = this.opts.videoElement;\n const unwarped = async () => ({ blob: await this.deps.snapshotToBlob(v, this.opts.captureQuality), type: null });\n const cv = this.cv;\n if (!cv?.isReady() || !fullQuad) return unwarped();\n try {\n await this.inFlight?.catch(() => undefined); // one frame in flight, even for a manual capture\n const full = this.deps.grabFrame(v);\n if (!full || !cv.isReady()) return unwarped();\n const longSide = this.opts.captureResolution === 'high' ? HIGH_WARP_LONG_SIDE : DEFAULT_WARP_LONG_SIDE;\n const warped = await cv.warp(full, fullQuad, typeHint, longSide);\n return { blob: await this.deps.encodeJpeg(warped, this.opts.captureQuality), type: typeHint };\n } catch (warpErr) {\n if (generation !== this.generation) throw warpErr; // stopped mid-warp: nothing to fall back to\n console.warn('[xid-camera-ocr] warp failed, using plain snapshot:', warpErr);\n return unwarped();\n }\n }\n\n // ── teardown / status ───────────────────────────────────────────────\n\n /** Clears every timer and frame callback, turns the torch off, closes the camera and drops the worker. */\n private release(): void {\n this.prior = null; // start() and stop() both release: a new run starts without a prior\n if (this.timer !== null) clearTimeout(this.timer);\n this.timer = null;\n if (this.frameCallback !== null) {\n (this.opts.videoElement as VideoWithFrameCallback).cancelVideoFrameCallback?.(this.frameCallback);\n this.frameCallback = null;\n }\n if (this.track && this.torchOn) void this.deps.setTorch(this.track, false);\n this.torchOn = false;\n this.torchRejected = false;\n if (this.stream) this.deps.detachCamera(this.opts.videoElement, this.stream);\n this.stream = null;\n this.track = null;\n this.cv?.terminate();\n this.cv = null;\n this.inFlight = null;\n this.stability.reset();\n this.weakRun = false;\n this.capturing = false;\n this.autoShutterSpent = false;\n }\n\n private setStatus(status: SessionState['status']): void { this.state.status = status; }\n\n private emitError(err: unknown): void {\n const e = toError(err);\n this.state.lastError = e;\n this.setStatus('error');\n this.opts.onError?.(e);\n }\n}\n","/**\n * Document detection with OpenCV (worker side). Mat work only — geometry and\n * quality are pure modules. Every Mat is `.delete()`d in `finally`.\n * Pipeline (spec §5.2): grey → CLAHE → bilateral → auto-Canny → dilate →\n * findContours(RETR_LIST) → convex hull → approxPolyDP (ε = 2 % perimeter) → 4 convex\n * vertices, ≤ 1 corner on the frame border, angles ∈ [70°, 110°] → score\n * 0.5·area + 0.3·rectangularity + 0.2·aspect → veto a winner nested in a border-cut\n * outline → quality on the winner inset by the dilation band.\n *\n * RETR_LIST, not RETR_EXTERNAL: the zero padding draws an edge around the whole\n * frame, and RETR_EXTERNAL would return only that outer contour (area > 95 %,\n * rejected) and hide the document inside it.\n */\nimport {\n isCapturableAspect, isValidQuad, orderCorners, polygonArea, rectifiedAspect, scoreCandidate,\n typeHintFromAspect, type Point, type Quad,\n} from './geometry.js';\nimport { frameMeanBrightness, measureQuality, quadRowSpans, type GrayFrame } from './quality.js';\nimport type { DocumentType } from './types.js';\nimport type { CvDetectionResult, ImageDataLike } from './worker-protocol.js';\n\nexport type { CvDetectionResult } from './worker-protocol.js';\nexport type { Point };\n\nconst MIN_AREA_RATIO = 0.08;\nconst MAX_AREA_RATIO = 0.95;\nconst APPROX_EPSILON = 0.02;\nconst BORDER_PADDING = 8;\nconst CLAHE_CLIP = 2.0;\nconst CLAHE_TILE = 8;\nconst CANNY_SIGMA = 0.33;\nconst DILATE_ITERATIONS = 2;\n// A corner this close (px) to an analysed-frame edge \"touches\" the border. A quad with\n// more than MAX_BORDER_CORNERS such corners is a document cut by the frame (or the frame\n// itself) and is not capturable — Plan 1 baseline: 96/104 bad detections vs 1/35 good.\nconst BORDER_TOUCH_PX = 2;\nconst MAX_BORDER_CORNERS = 1;\n// BORDER_TOUCH_PX is measured from the Canny edge line. Dilation moves the inner side\n// of an edge ring up to DILATE_ITERATIONS px inwards, so a contour that follows the\n// frame border sits 2–3 px inside it; the check adds that offset back.\nconst BORDER_TOUCH_LIMIT = BORDER_TOUCH_PX + DILATE_ITERATIONS;\n// A winner strictly inside (every corner >= NESTED_MARGIN_PX from each side) a rejected\n// border-cut outline at least NESTED_AREA_FACTOR times its area is a candidate part of\n// that cut document (its photo, a printed box). The margin is two dilated edge bands, so\n// a winner that shares a side with the outline is not nested.\nconst NESTED_AREA_FACTOR = 2;\nconst NESTED_MARGIN_PX = 2 * (DILATE_ITERATIONS + 1);\n// A nested winner is vetoed when it is OTHER-shaped, or when its interior is darker than\n// a ring around it by more than POLARITY_MIN_DIFF grey levels: a photo or a printed box\n// is darker than the card it sits on, while a light ID data page lying on a surface is\n// brighter than that surface. The ring is the winner scaled by POLARITY_RING_SCALE about\n// its centroid, minus the winner.\nconst POLARITY_MIN_DIFF = 10;\nconst POLARITY_RING_SCALE = 1.1;\n// Quality is measured on the quad inset by this much: the winning contour is the outer\n// side of the dilated edge ring, DILATE_ITERATIONS px outside the edge plus 1 px of edge.\nconst QUALITY_INSET_PX = DILATE_ITERATIONS + 1;\n// Hulls that approxPolyDP leaves with 5–6 vertices (a clipped corner, a bump) are\n// reduced to a 4-gon, kept only if hull area / clamped quad area lies within\n// [REDUCED_MIN_FILL, REDUCED_MAX_FILL]: below, the quad covers background the hull does\n// not; above, the quad (pulled onto the frame border by the clamp) cuts the hull off.\nconst MAX_REDUCIBLE_VERTICES = 6;\nconst REDUCED_MIN_FILL = 0.92;\nconst REDUCED_MAX_FILL = 1 / REDUCED_MIN_FILL;\n// Reported score factor for a winner that is not a native full-resolution quad (reduced\n// hull or half-resolution pass): those quads are less precise, so a consumer gating\n// auto-capture on `score` waits for a better frame. Applied to the winner only.\nconst INDIRECT_SCORE_FACTOR = 0.85;\n/**\n * With a temporal prior (the previous frame's quad), candidates are ranked by\n * `score − PRIOR_WEIGHT · min(d, PRIOR_D_CAP)`, d = the LARGEST corner move / frame\n * diagonal (the criterion the StabilityTracker resets on), with corners matched over the\n * 4 cyclic rotations. A 1 % move costs 0.02; any move of 5 % or more costs the cap, 0.10.\n * A candidate must therefore score ≥ 0.10 better to override the prior. The cap covers\n * the 0.08–0.10 score gaps between two outlines of the same document seen on MIDV-500\n * TA14_15 in the browser (direct ↔ direct jumps of 34–44 px), so those jumps stay locked,\n * while a clearly better candidate (≥ 0.10 ahead) can never be locked out by a stale prior.\n * Ranking only: the returned score and every filter are unchanged.\n */\nexport const PRIOR_WEIGHT = 2;\nexport const PRIOR_D_CAP = 0.05;\n// Second pass on the frame downscaled by COARSE_SCALE (640 → 320 px), skipped when the\n// downscaled frame would be smaller than MIN_COARSE_SIDE on either side.\nconst COARSE_SCALE = 2;\nconst MIN_COARSE_SIDE = 64;\n\nfunction empty(frameBrightness: number): CvDetectionResult {\n return { detected: false, documentType: null, aspectRatio: null, corners: null, boundingBox: null, quality: null, frameBrightness, score: null };\n}\n\nexport interface DetectOptions {\n /** Previous frame's corners (TL, TR, BR, BL) in analysed-frame pixels; ranking only. */\n prior?: Quad;\n}\n\nexport function detectDocumentCV(cv: any, imageData: ImageDataLike, _acceptedTypes?: DocumentType[], opts: DetectOptions = {}): CvDetectionResult {\n const frame = { brightness: 0 };\n try {\n return detectInner(cv, imageData, frame, opts.prior ?? null);\n } catch (err) {\n console.warn('[xid-camera-ocr] detectDocumentCV failed:', err);\n return empty(frame.brightness);\n }\n}\n\n/** A document-sized convex quad rejected only for touching the frame border (a cut document). */\ninterface CutOutline { pts: Point[]; area: number }\n\ninterface Candidate {\n quad: Quad; score: number; aspect: number; area: number;\n /** Selection key: `score`, minus the prior-distance penalty when a prior is given. */\n rank: number;\n /** Full-frame pixels per pass pixel (1 at full resolution, COARSE_SCALE at half). */\n scale: number;\n reduced: boolean;\n}\n\n/** Per-frame OpenCV objects shared by every scale pass (all owned by detectInner). */\ninterface Workspace {\n equalized: any; filtered: any; padded: any; edges: any; dilated: any;\n kernel: any; contours: any; hierarchy: any; hull: any; approx: any; clahe: any;\n}\n\nfunction detectInner(cv: any, imageData: ImageDataLike, frame: { brightness: number }, prior: Quad | null): CvDetectionResult {\n const { width: W, height: H } = imageData;\n const mats: Array<{ delete(): void }> = [];\n const own = <T extends { delete(): void }>(m: T): T => { mats.push(m); return m; };\n try {\n const src = own(cv.matFromImageData(imageData));\n const gray = own(new cv.Mat());\n const small = own(new cv.Mat());\n const ws: Workspace = {\n equalized: own(new cv.Mat()), filtered: own(new cv.Mat()), padded: own(new cv.Mat()),\n edges: own(new cv.Mat()), dilated: own(new cv.Mat()), kernel: own(cv.Mat.ones(3, 3, cv.CV_8U)),\n contours: own(new cv.MatVector()), hierarchy: own(new cv.Mat()),\n hull: own(new cv.Mat()), approx: own(new cv.Mat()),\n clahe: own(new cv.CLAHE(CLAHE_CLIP, new cv.Size(CLAHE_TILE, CLAHE_TILE))),\n };\n\n cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY);\n frame.brightness = frameMeanBrightness(grayView(gray, W, H));\n\n const cut: CutOutline[] = [];\n let best = scanScale(cv, gray, ws, W, H, cut, prior);\n let lowres = false;\n // Half-resolution fallback when full resolution finds nothing: text and texture\n // edges vanish and soft edges sharpen, so a document outline that merged with clutter\n // (or was too blurred for Canny) at full resolution separates again. Candidates are\n // reprojected to full-resolution pixels. Fallback only, not a competing pass: when\n // both scales find the document, the full-resolution corners are more precise\n // (MIDV-500: running both and keeping the best score lowered 18 frames and turned\n // one into a wrong region).\n const sw = Math.round(W / COARSE_SCALE), sh = Math.round(H / COARSE_SCALE);\n if (!best && sw >= MIN_COARSE_SIDE && sh >= MIN_COARSE_SIDE) {\n cv.resize(gray, small, new cv.Size(sw, sh), 0, 0, cv.INTER_AREA);\n best = scanScale(cv, small, ws, W, H, cut, prior);\n lowres = best !== null;\n }\n\n // With RETR_LIST every inner contour is a candidate: when the document outline is\n // rejected because the frame cuts it, its photo or a printed box can win. Veto a\n // winner nested inside a clearly larger cut outline.\n if (best && isNestedInCut(best, cut, grayView(gray, W, H))) best = null;\n if (!best) return empty(frame.brightness);\n const provenance = lowres ? 'lowres' : best.reduced ? 'reduced' : 'direct';\n const xs = best.quad.map((p) => p.x); const ys = best.quad.map((p) => p.y);\n const minX = Math.min(...xs), maxX = Math.max(...xs), minY = Math.min(...ys), maxY = Math.max(...ys);\n return {\n detected: true,\n documentType: typeHintFromAspect(best.aspect),\n aspectRatio: best.aspect,\n corners: best.quad,\n boundingBox: { x: minX / W, y: minY / H, width: (maxX - minX) / W, height: (maxY - minY) / H },\n // Fresh view: any allocation since cvtColor may have grown (and detached) the heap.\n // The inset is in pass pixels: a half-resolution contour sits twice as far (in\n // full-frame pixels) outside the edge.\n quality: measureQuality(grayView(gray, W, H), insetQuad(best.quad, QUALITY_INSET_PX * best.scale)),\n frameBrightness: frame.brightness,\n score: provenance === 'direct' ? best.score : best.score * INDIRECT_SCORE_FACTOR,\n provenance,\n };\n } finally {\n for (const m of mats) m.delete();\n }\n}\n\n/**\n * One pass of the pipeline on a grey image of any size. Quads, areas and cut outlines\n * are returned in full-frame (W x H) pixels. Appends border-cut outlines to `cut`.\n * `prior` is in full-frame pixels; candidates are reprojected to full-frame pixels before\n * ranking (priorPenalty), so the half-resolution pass compares against the prior at the\n * same scale.\n */\nfunction scanScale(cv: any, gray: any, ws: Workspace, W: number, H: number, cut: CutOutline[], prior: Quad | null): Candidate | null {\n const w = gray.cols as number, h = gray.rows as number;\n const sx = W / w, sy = H / h;\n const passArea = w * h;\n const up = (p: Point): Point => ({ x: p.x * sx, y: p.y * sy });\n const { hull, approx, contours } = ws;\n\n ws.clahe.apply(gray, ws.equalized);\n cv.bilateralFilter(ws.equalized, ws.filtered, 9, 75, 75, cv.BORDER_DEFAULT);\n cv.copyMakeBorder(ws.filtered, ws.padded, BORDER_PADDING, BORDER_PADDING, BORDER_PADDING, BORDER_PADDING, cv.BORDER_CONSTANT, new cv.Scalar(0));\n const median = medianOf(ws.padded.data as Uint8Array);\n cv.Canny(ws.padded, ws.edges, Math.max(10, (1 - CANNY_SIGMA) * median), Math.min(255, (1 + CANNY_SIGMA) * median));\n cv.dilate(ws.edges, ws.dilated, ws.kernel, new cv.Point(-1, -1), DILATE_ITERATIONS);\n cv.findContours(ws.dilated, contours, ws.hierarchy, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE);\n\n let best: Candidate | null = null;\n for (let i = 0; i < contours.size(); i++) {\n const c = contours.get(i);\n try {\n // Exact prefilter: hull area <= bounding-box area.\n const box = cv.boundingRect(c);\n if (box.width * box.height < passArea * MIN_AREA_RATIO) continue;\n // The hull closes an edge chain broken by a finger or a shadow, and drops the\n // concave notches that would otherwise give approxPolyDP 5+ vertices.\n cv.convexHull(c, hull, false, true);\n const area = cv.contourArea(hull);\n if (area < passArea * MIN_AREA_RATIO || area > passArea * MAX_AREA_RATIO) continue;\n cv.approxPolyDP(hull, approx, APPROX_EPSILON * cv.arcLength(hull, true), true);\n if (approx.rows < 4 || approx.rows > MAX_REDUCIBLE_VERTICES || !cv.isContourConvex(approx)) continue;\n const reduced = approx.rows !== 4;\n let pts: Point[];\n if (!reduced) {\n pts = matPoints(approx, w, h);\n } else {\n // A finger over a corner or a small bump: collapse to the best 4-gon, accepted\n // only if it is a tight fit once clamped to the frame, and then only if it passes\n // the same filter as a native quad.\n const quad4 = reduceToQuad(rawPoints(approx));\n if (!quad4) continue;\n pts = quad4.map((p) => clampPoint(p, w, h));\n const fill = area / polygonArea(pts);\n if (!(fill >= REDUCED_MIN_FILL && fill <= REDUCED_MAX_FILL)) continue;\n }\n const fullArea = area * sx * sy;\n const full = pts.map(up);\n // The border tolerance is defined in pass pixels (the dilation band is per pass), so\n // it doubles in full-frame pixels at half resolution.\n const borderLimit = BORDER_TOUCH_LIMIT * sx;\n if (borderCorners(full, W, H, borderLimit) > MAX_BORDER_CORNERS) {\n if (!spansFrame(full, W, H, borderLimit)) cut.push({ pts: full, area: fullArea });\n continue;\n }\n const quad = orderCorners(full);\n if (!isValidQuad(quad)) continue;\n const rect = cv.minAreaRect(reduced ? hull : approx);\n const rectArea = rect.size.width * rect.size.height;\n const rectangularity = rectArea > 0 ? Math.min(1, area / rectArea) : 0;\n const aspect = rectifiedAspect(quad);\n if (!isCapturableAspect(aspect)) continue;\n const score = scoreCandidate({ areaRatio: area / passArea, rectangularity, aspect });\n const rank = prior ? score - priorPenalty(quad, prior, W, H) : score;\n if (!best || rank > best.rank) best = { quad, score, rank, aspect, area: fullArea, scale: sx, reduced };\n } finally {\n c.delete();\n }\n }\n return best;\n}\n\n/**\n * Ranking penalty against the prior: PRIOR_WEIGHT · min(d, PRIOR_D_CAP), d = the largest\n * index-matched corner distance over the frame diagonal, minimised over the 4 cyclic\n * rotations of the candidate's corner order (near 45° `orderCorners` may name a different\n * corner TL from one frame to the next). Exported for tests.\n */\nexport function priorPenalty(quad: Quad, prior: Quad, W: number, H: number): number {\n let best = Infinity;\n for (let shift = 0; shift < 4; shift++) {\n let maxMove = 0;\n for (let i = 0; i < 4; i++) {\n const p = quad[(i + shift) % 4];\n maxMove = Math.max(maxMove, Math.hypot(p.x - prior[i].x, p.y - prior[i].y));\n }\n best = Math.min(best, maxMove);\n }\n return PRIOR_WEIGHT * Math.min(best / Math.hypot(W, H), PRIOR_D_CAP);\n}\n\n/**\n * Grey pixels as a view over the WASM heap (no copy). `Mat.data` builds the view on\n * each access; take it right before use, never across an allocation.\n */\nfunction grayView(gray: any, width: number, height: number): GrayFrame {\n return { data: gray.data as Uint8Array, width, height };\n}\n\n/** CV_32SC2 points of a Mat with the padding removed (not clamped). */\nfunction rawPoints(mat: any): Point[] {\n const d = mat.data32S as Int32Array;\n const pts: Point[] = [];\n for (let k = 0; k < mat.rows; k++) pts.push({ x: d[k * 2] - BORDER_PADDING, y: d[k * 2 + 1] - BORDER_PADDING });\n return pts;\n}\n\nfunction clampPoint(p: Point, W: number, H: number): Point {\n return { x: Math.min(W, Math.max(0, p.x)), y: Math.min(H, Math.max(0, p.y)) };\n}\n\n/** CV_32SC2 points of a Mat, padding removed and clamped to the analysed frame. */\nfunction matPoints(mat: any, W: number, H: number): Point[] {\n return rawPoints(mat).map((p) => clampPoint(p, W, H));\n}\n\n/**\n * Reduces a convex polygon to 4 vertices by repeatedly collapsing the side whose\n * removal adds the least area: side (Pi, Pi+1) is replaced by the intersection of the\n * extended neighbouring sides. Null when no side can be collapsed (the neighbouring\n * sides diverge or are parallel).\n */\nfunction reduceToQuad(poly: Point[]): Point[] | null {\n let pts = poly;\n while (pts.length > 4) {\n const n = pts.length;\n let bestIdx = -1, bestAdded = Infinity, bestX: Point | null = null;\n for (let i = 0; i < n; i++) {\n const a0 = pts[(i + n - 1) % n], a1 = pts[i], b1 = pts[(i + 1) % n], b0 = pts[(i + 2) % n];\n const x = forwardIntersection(a0, a1, b0, b1);\n if (!x) continue;\n const added = Math.abs((x.x - a1.x) * (b1.y - a1.y) - (x.y - a1.y) * (b1.x - a1.x)) / 2;\n if (added < bestAdded) { bestAdded = added; bestIdx = i; bestX = x; }\n }\n if (bestIdx < 0 || !bestX) return null;\n const next: Point[] = [];\n for (let k = 0; k < n; k++) {\n if (k === bestIdx) next.push(bestX);\n else if (k !== (bestIdx + 1) % n) next.push(pts[k]);\n }\n pts = next;\n }\n return pts;\n}\n\n/**\n * Intersection of ray a0→a1 (beyond a1) with ray b0→b1 (beyond b1), or null when the\n * rays do not meet ahead of both end points.\n */\nfunction forwardIntersection(a0: Point, a1: Point, b0: Point, b1: Point): Point | null {\n const dax = a1.x - a0.x, day = a1.y - a0.y, dbx = b1.x - b0.x, dby = b1.y - b0.y;\n const den = dax * dby - day * dbx;\n if (Math.abs(den) < 1e-9) return null;\n const t = ((b0.x - a0.x) * dby - (b0.y - a0.y) * dbx) / den;\n const u = ((b0.x - a0.x) * day - (b0.y - a0.y) * dax) / den;\n if (t < 1 || u < 1) return null;\n return { x: a0.x + t * dax, y: a0.y + t * day };\n}\n\n/**\n * True when the quad reaches two opposite frame edges. Such an outline is a background\n * surface (a keyboard, the table) running across the frame, not a document cut on one\n * side, and it legitimately contains the document.\n */\nfunction spansFrame(pts: Point[], W: number, H: number, limit: number): boolean {\n const xs = pts.map((p) => p.x), ys = pts.map((p) => p.y);\n return (Math.min(...xs) <= limit && Math.max(...xs) >= W - limit)\n || (Math.min(...ys) <= limit && Math.max(...ys) >= H - limit);\n}\n\n/**\n * Veto for a winner that is part of a document the frame cuts (its photo, a printed\n * box). The winner must lie inside a clearly larger border-cut outline, every corner at\n * least NESTED_MARGIN_PX (scaled to the winner's pass) from each side; a winner sharing\n * a side with the outline (a document bounding a background region that runs to the\n * frame edge) is not nested. A nested winner is vetoed when it is OTHER-shaped, or when\n * it is darker than the ring around it (see POLARITY_MIN_DIFF): a real card or passport\n * lying on a cut surface (a laptop, a book) is INE/TD3-shaped and lighter than it.\n */\nfunction isNestedInCut(best: Candidate, cut: CutOutline[], gray: GrayFrame): boolean {\n const margin = NESTED_MARGIN_PX * best.scale;\n const nested = cut.some((o) => o.area >= NESTED_AREA_FACTOR * best.area\n && best.quad.every((p) => insideConvex(o.pts, p, margin)));\n if (!nested) return false;\n if (typeHintFromAspect(best.aspect) === 'OTHER') return true;\n const { inner, ring } = innerAndRingMeans(gray, insetQuad(best.quad, QUALITY_INSET_PX * best.scale), best.quad);\n return inner < ring - POLARITY_MIN_DIFF;\n}\n\n/**\n * Mean grey inside `inner`, and in the ring between `quad` and `quad` scaled by\n * POLARITY_RING_SCALE about its centroid. One pass over the outer quad's row spans.\n */\nfunction innerAndRingMeans(gray: GrayFrame, inner: Quad, quad: Quad): { inner: number; ring: number } {\n const { data, width: W, height: H } = gray;\n const cx = (quad[0].x + quad[1].x + quad[2].x + quad[3].x) / 4;\n const cy = (quad[0].y + quad[1].y + quad[2].y + quad[3].y) / 4;\n const outer = quad.map((p) => ({ x: cx + (p.x - cx) * POLARITY_RING_SCALE, y: cy + (p.y - cy) * POLARITY_RING_SCALE })) as Quad;\n const so = quadRowSpans(outer, W, H), sq = quadRowSpans(quad, W, H), si = quadRowSpans(inner, W, H);\n let sumIn = 0, nIn = 0, sumRing = 0, nRing = 0;\n for (let y = 0; y < H; y++) {\n const xs = so[y * 2], xe = so[y * 2 + 1];\n if (xs >= xe) continue;\n const qs = sq[y * 2], qe = sq[y * 2 + 1], is = si[y * 2], ie = si[y * 2 + 1];\n const row = y * W;\n for (let x = xs; x < xe; x++) {\n const v = data[row + x];\n if (x >= is && x < ie) { sumIn += v; nIn++; } else if (x < qs || x >= qe) { sumRing += v; nRing++; }\n }\n }\n return { inner: nIn > 0 ? sumIn / nIn : 0, ring: nRing > 0 ? sumRing / nRing : 0 };\n}\n\n/** Point inside a convex polygon (any winding) and at least `margin` px from every side. */\nfunction insideConvex(poly: Point[], p: Point, margin: number): boolean {\n let twiceArea = 0;\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i], b = poly[(i + 1) % poly.length];\n twiceArea += a.x * b.y - b.x * a.y;\n }\n const winding = Math.sign(twiceArea);\n if (winding === 0) return false;\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i], b = poly[(i + 1) % poly.length];\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len === 0) continue;\n const dist = (winding * ((b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x))) / len;\n if (dist < margin) return false;\n }\n return true;\n}\n\n/**\n * Moves every corner `d` px inwards from both adjacent sides (along the bisector), so\n * quality is measured inside the document and not on the dilated edge band around it.\n * The returned corners are not inset: on real frames they already sit inside the GT.\n */\nfunction insetQuad(quad: Quad, d: number): Quad {\n return quad.map((p, i) => {\n const prev = quad[(i + 3) % 4], next = quad[(i + 1) % 4];\n const ux = prev.x - p.x, uy = prev.y - p.y, vx = next.x - p.x, vy = next.y - p.y;\n const lu = Math.hypot(ux, uy), lv = Math.hypot(vx, vy);\n const bx = ux / lu + vx / lv, by = uy / lu + vy / lv;\n const lb = Math.hypot(bx, by);\n const sinHalf = Math.sin(Math.acos(Math.min(1, Math.max(-1, (ux * vx + uy * vy) / (lu * lv)))) / 2);\n const k = d / sinHalf / lb;\n return { x: p.x + bx * k, y: p.y + by * k };\n }) as Quad;\n}\n\nfunction borderCorners(pts: Point[], W: number, H: number, limit: number): number {\n let n = 0;\n for (const p of pts) {\n if (p.x <= limit || p.x >= W - limit || p.y <= limit || p.y >= H - limit) n++;\n }\n return n;\n}\n\nfunction medianOf(data: Uint8Array): number {\n const hist = new Uint32Array(256);\n for (let i = 0; i < data.length; i++) hist[data[i]]++;\n let acc = 0;\n for (let v = 0; v < 256; v++) { acc += hist[v]; if (acc >= data.length / 2) return v; }\n return 128;\n}\n","/**\n * Headless React hook: all the core behaviour, without opinionated UI.\n *\n * One capture per run: after a capture the core disables auto-shutter until\n * the next `start()`. Use `retake()` (stop + start) to arm another capture.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n XidCameraOcrSession,\n type DocumentType,\n type ExtractResult,\n type FrameState,\n type SessionState,\n type XidCameraOcrSessionOptions,\n} from '../core/index.js';\n\nexport interface UseXidCameraOcrOptions\n extends Omit<XidCameraOcrSessionOptions, 'videoElement'> {\n /** When `true`, starts the stream automatically on mount. Default `true`. */\n autoStart?: boolean;\n}\n\nexport interface UseXidCameraOcrReturn {\n videoRef: React.RefObject<HTMLVideoElement>;\n status: SessionState['status'];\n frame: FrameState | null;\n result: ExtractResult | null;\n error: Error | null;\n start: () => Promise<void>;\n stop: () => void;\n captureNow: () => Promise<void>;\n /** Stops the current run and starts a new one (re-arms the auto-shutter). */\n retake: () => Promise<void>;\n}\n\nexport function useXidCameraOcr(options: UseXidCameraOcrOptions): UseXidCameraOcrReturn {\n const videoRef = useRef<HTMLVideoElement>(null);\n const sessionRef = useRef<XidCameraOcrSession | null>(null);\n\n const [status, setStatus] = useState<SessionState['status']>('idle');\n const [frame, setFrame] = useState<FrameState | null>(null);\n const [result, setResult] = useState<ExtractResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const optsRef = useRef(options);\n optsRef.current = options;\n\n const ensureSession = useCallback((): XidCameraOcrSession => {\n if (sessionRef.current) return sessionRef.current;\n if (!videoRef.current) throw new Error('videoRef not attached yet');\n const session: XidCameraOcrSession = new XidCameraOcrSession({\n videoElement: videoRef.current,\n documentTypes: optsRef.current.documentTypes,\n autoCapture: optsRef.current.autoCapture,\n stableFramesRequired: optsRef.current.stableFramesRequired,\n captureQuality: optsRef.current.captureQuality,\n captureResolution: optsRef.current.captureResolution,\n opencvUrl: optsRef.current.opencvUrl,\n workerUrl: optsRef.current.workerUrl,\n onUpload: (blob, type) => optsRef.current.onUpload(blob, type),\n onFrameAnalyzed: (f) => {\n setFrame(f);\n // Mirror the core status instead of re-deriving it; ignore stale sessions.\n if (sessionRef.current === session) setStatus(session.getState().status);\n optsRef.current.onFrameAnalyzed?.(f);\n },\n onCaptured: (blob, type) => {\n setStatus('capturing');\n optsRef.current.onCaptured?.(blob, type);\n },\n onResult: (r) => {\n setResult(r);\n setStatus('done');\n optsRef.current.onResult?.(r);\n },\n onError: (err) => {\n setError(err);\n // Mirror the core: a detector failure is non-fatal (status stays `streaming`\n // with hint `detector_unavailable`, so the shutter stays usable).\n if (sessionRef.current === session) setStatus(session.getState().status);\n optsRef.current.onError?.(err);\n },\n });\n sessionRef.current = session;\n return session;\n }, []);\n\n const start = useCallback(async () => {\n const s = ensureSession();\n await s.start();\n // StrictMode double-mount / unmount while pending: only the current session writes.\n if (sessionRef.current === s) setStatus(s.getState().status);\n }, [ensureSession]);\n\n const stop = useCallback(() => {\n sessionRef.current?.stop();\n setStatus('stopped');\n }, []);\n\n const captureNow = useCallback(async () => {\n await sessionRef.current?.captureNow();\n }, []);\n\n const retake = useCallback(async () => {\n stop();\n setResult(null);\n setError(null);\n setFrame(null);\n await start();\n }, [stop, start]);\n\n useEffect(() => {\n // Cleanup is always registered: a session started manually (autoStart: false)\n // must also release the camera on unmount.\n if (options.autoStart !== false && videoRef.current) {\n start().catch(() => {\n /* already reported through onError */\n });\n }\n return () => {\n sessionRef.current?.stop();\n sessionRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { videoRef, status, frame, result, error, start, stop, captureNow, retake };\n}\n\nexport type { DocumentType };\n","/**\n * Visibility rules for the capture tips card. Shown while the camera starts\n * (until the first successful capture) and again after every error, unless the\n * user dismissed it or `showTips` is off.\n */\nimport { useCallback, useState } from 'react';\nimport type { SessionStatus } from '../core/types.js';\n\nexport interface TipsState {\n status: SessionStatus;\n showTips: boolean;\n dismissed: boolean;\n completedOnce: boolean;\n}\n\nexport function tipsVisible({ status, showTips, dismissed, completedOnce }: TipsState): boolean {\n return (\n showTips &&\n !dismissed &&\n (status === 'error' ||\n (!completedOnce && (status === 'starting' || status === 'loading_detector')))\n );\n}\n\nexport function useTips(\n status: SessionStatus,\n showTips: boolean\n): { visible: boolean; dismiss(): void } {\n const [dismissed, setDismissed] = useState(false);\n const [completedOnce, setCompletedOnce] = useState(status === 'done');\n const [prev, setPrev] = useState(status);\n\n // Derive state from the status transition during render (no flash of stale tips).\n let nextDismissed = dismissed;\n let nextCompleted = completedOnce;\n if (prev !== status) {\n setPrev(status);\n if (status === 'error') {\n nextDismissed = false;\n setDismissed(false);\n }\n if (status === 'done') {\n nextCompleted = true;\n setCompletedOnce(true);\n }\n }\n\n const dismiss = useCallback(() => setDismissed(true), []);\n return {\n visible: tipsVisible({\n status,\n showTips,\n dismissed: nextDismissed,\n completedOnce: nextCompleted,\n }),\n dismiss,\n };\n}\n","/**\n * Theme variables for the `<XidCameraOcr />` component.\n *\n * The component reads every colour, font and radius as `var(--xco-*, <default>)`\n * and writes a variable only when the `theme` prop sets it, so the stylesheet\n * defaults below are the single source of truth for the fallbacks.\n */\nimport type { FrameState, SessionStatus } from '../core/types.js';\n\nexport type XcoThemeKey =\n | 'accent'\n | 'warning'\n | 'danger'\n | 'background'\n | 'mask'\n | 'hintBg'\n | 'hintFg'\n | 'buttonBg'\n | 'buttonFg'\n | 'shutter'\n | 'overlayBg'\n | 'overlayFg'\n | 'fontFamily'\n | 'radius';\n\nexport type XidCameraOcrTheme = Partial<Record<XcoThemeKey, string>>;\n\nexport const XCO_VARS: Readonly<Record<XcoThemeKey, { name: `--xco-${string}`; fallback: string }>> = {\n accent: { name: '--xco-accent', fallback: '#22c55e' },\n warning: { name: '--xco-warning', fallback: '#eab308' },\n danger: { name: '--xco-danger', fallback: '#ef4444' },\n background: { name: '--xco-background', fallback: '#000' },\n mask: { name: '--xco-mask', fallback: 'rgba(0,0,0,0.4)' },\n hintBg: { name: '--xco-hint-bg', fallback: 'rgba(0,0,0,0.7)' },\n hintFg: { name: '--xco-hint-fg', fallback: 'white' },\n buttonBg: { name: '--xco-button-bg', fallback: 'rgba(255,255,255,0.92)' },\n buttonFg: { name: '--xco-button-fg', fallback: '#111' },\n shutter: { name: '--xco-shutter', fallback: 'rgba(255,255,255,0.9)' },\n overlayBg: { name: '--xco-overlay-bg', fallback: 'rgba(0,0,0,0.78)' },\n overlayFg: { name: '--xco-overlay-fg', fallback: 'white' },\n fontFamily: { name: '--xco-font-family', fallback: 'system-ui, -apple-system, sans-serif' },\n radius: { name: '--xco-radius', fallback: '12px' },\n};\n\n/** `var(--xco-<key>, <default>)` for use in inline styles. */\nexport function cssVar(key: XcoThemeKey): string {\n const { name, fallback } = XCO_VARS[key];\n return `var(${name}, ${fallback})`;\n}\n\n/**\n * Maps a theme object to CSS custom properties. Keys that are unknown, or whose\n * value is undefined, null or empty, are skipped so the stylesheet default applies.\n */\nexport function themeToStyle(theme?: XidCameraOcrTheme): Record<string, string> {\n const style: Record<string, string> = {};\n if (!theme) return style;\n for (const key of Object.keys(theme) as XcoThemeKey[]) {\n if (!Object.prototype.hasOwnProperty.call(XCO_VARS, key)) continue;\n const value = theme[key];\n if (typeof value !== 'string' || value === '') continue;\n style[XCO_VARS[key].name] = value;\n }\n return style;\n}\n\n/** Border and corner colour for the document overlay (0.4.0 decision table). */\nexport function borderColorFor(status: SessionStatus, frame: FrameState | null): string {\n if (status === 'done') return cssVar('accent');\n if (status === 'error') return cssVar('danger');\n if (status === 'uploading' || status === 'capturing') return cssVar('accent');\n if (frame?.detected) {\n return frame.confidence >= 1 ? cssVar('accent') : cssVar('warning');\n }\n return cssVar('danger');\n}\n","/** Dismissible card with three capture tips (inline SVG icons, no images). */\nimport type { HintCopy } from '../core/index.js';\nimport { cssVar } from './theme.js';\n\nexport interface TipsCardProps {\n texts: HintCopy;\n onDismiss(): void;\n}\n\nconst svgProps = {\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': 'true',\n focusable: 'false',\n style: { flex: '0 0 auto' },\n} as const;\n\nconst LightIcon = () => (\n <svg {...svgProps}>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n);\n\nconst GlareIcon = () => (\n <svg {...svgProps}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"M14 5l-6 14M18 5l-6 14\" />\n </svg>\n);\n\nconst FocusIcon = () => (\n <svg {...svgProps}>\n <path d=\"M4 8V5a1 1 0 0 1 1-1h3M16 4h3a1 1 0 0 1 1 1v3M20 16v3a1 1 0 0 1-1 1h-3M8 20H5a1 1 0 0 1-1-1v-3\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n </svg>\n);\n\nexport function TipsCard({ texts, onDismiss }: TipsCardProps) {\n const items = [\n { Icon: LightIcon, text: texts.tip_light },\n { Icon: GlareIcon, text: texts.tip_glare },\n { Icon: FocusIcon, text: texts.tip_focus },\n ];\n return (\n <div className=\"xco-tips\" style={cardStyle}>\n <ul style={listStyle}>\n {items.map(({ Icon, text }) => (\n <li key={text} style={itemStyle}>\n <Icon />\n <span>{text}</span>\n </li>\n ))}\n </ul>\n <button type=\"button\" className=\"xco-tips-dismiss\" onClick={onDismiss} style={buttonStyle}>\n {texts.tips_dismiss}\n </button>\n </div>\n );\n}\n\nconst cardStyle: React.CSSProperties = {\n position: 'absolute',\n top: 'calc(16px + env(safe-area-inset-top, 0px))',\n left: '50%',\n transform: 'translateX(-50%)',\n boxSizing: 'border-box',\n width: 'calc(100% - 32px)',\n maxWidth: 360,\n padding: 16,\n background: cssVar('overlayBg'),\n color: cssVar('overlayFg'),\n borderRadius: cssVar('radius'),\n fontFamily: cssVar('fontFamily'),\n fontSize: 15,\n lineHeight: 1.35,\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n pointerEvents: 'auto',\n zIndex: 5,\n};\n\nconst listStyle: React.CSSProperties = {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n};\n\nconst itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n};\n\nconst buttonStyle: React.CSSProperties = {\n alignSelf: 'flex-end',\n minHeight: 44,\n padding: '10px 20px',\n borderRadius: cssVar('radius'),\n background: cssVar('buttonBg'),\n color: cssVar('buttonFg'),\n border: 'none',\n fontFamily: cssVar('fontFamily'),\n fontSize: 15,\n fontWeight: 600,\n cursor: 'pointer',\n WebkitTapHighlightColor: 'transparent',\n};\n","/**\n * <XidCameraOcrView /> — presentational camera UI. Props in, no session.\n *\n * Layout strategy:\n * - The root takes width:100% / height:100% of the host container and is\n * position:relative. The video and the overlays are absolute.\n * - The video renders with object-fit: cover (it always fills the container).\n * - When OpenCV detects the 4 document corners, an SVG polygon is drawn ON TOP\n * of the video with the same viewBox as the analysis frame and\n * preserveAspectRatio=\"slice\", so it matches the video pixel for pixel.\n * - As a fallback (OpenCV not loaded yet or nothing detected), the classic\n * guide rectangle is drawn (ResizeObserver + document aspect ratio).\n * - The hint banner wraps and respects safe-area-inset-bottom (iPhone notch);\n * the shutter and retake actions sit above it.\n *\n * Every colour, font and radius is read as `var(--xco-*, <default>)`. SVG colours\n * go in `style` because `var()` does not work in SVG presentation attributes.\n */\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport {\n copyFor,\n ID1_RATIO,\n TD3_RATIO,\n type DocumentType,\n type FrameState,\n type HintCopy,\n} from '../core/index.js';\nimport type { SessionStatus } from '../core/types.js';\nimport { TipsCard } from './TipsCard.js';\nimport { borderColorFor, cssVar, themeToStyle, type XidCameraOcrTheme } from './theme.js';\n\nexport interface XidCameraOcrViewProps {\n videoRef: React.RefObject<HTMLVideoElement>;\n status: SessionStatus;\n frame: FrameState | null;\n texts: HintCopy;\n documentTypes: DocumentType[];\n theme?: XidCameraOcrTheme;\n className?: string;\n style?: React.CSSProperties;\n hideStatusOverlay?: boolean;\n tipsVisible: boolean;\n onCapture(): void;\n onRetake(): void;\n onStart(): void;\n onDismissTips(): void;\n}\n\nconst useIsoLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport function XidCameraOcrView({\n videoRef,\n status,\n frame,\n texts,\n documentTypes,\n theme,\n className,\n style,\n hideStatusOverlay,\n tipsVisible,\n onCapture,\n onRetake,\n onStart,\n onDismissTips,\n}: XidCameraOcrViewProps) {\n const canCapture = status === 'streaming' || status === 'loading_detector';\n const canRetake = status === 'done' || status === 'error';\n const canStart = status === 'idle' || status === 'stopped';\n const isProcessing = status === 'capturing' || status === 'uploading';\n\n const maskId = 'xco-doc-mask-' + useId().replace(/[^A-Za-z0-9_-]/g, '');\n const rootRef = useRef<HTMLDivElement>(null);\n const [borderBox, setBorderBox] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n\n // Target aspect ratio: last detected document, else the first accepted type\n const detectedType = frame?.documentType;\n const targetRatio =\n detectedType === 'PASSPORT_MX'\n ? TD3_RATIO\n : detectedType === 'INE'\n ? ID1_RATIO\n : documentTypes[0] === 'PASSPORT_MX'\n ? TD3_RATIO\n : ID1_RATIO;\n\n // Recompute the fallback overlay box whenever the container resizes\n useIsoLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n\n const compute = () => {\n const cw = el.clientWidth;\n const ch = el.clientHeight;\n const maxW = cw * 0.85;\n const maxH = ch * 0.7;\n let w = maxW;\n let h = w / targetRatio;\n if (h > maxH) {\n h = maxH;\n w = h * targetRatio;\n }\n setBorderBox({ width: w, height: h });\n };\n\n compute();\n const ro = new ResizeObserver(compute);\n ro.observe(el);\n return () => ro.disconnect();\n }, [targetRatio]);\n\n const showCornerOverlay = !!(frame?.corners && frame?.frameSize);\n const accentColor = borderColorFor(status, frame);\n const hintText = copyFor(status, frame?.hint, texts);\n const rootClass = className ? `xid-camera-ocr ${className}` : 'xid-camera-ocr';\n\n return (\n <div\n ref={rootRef}\n className={rootClass}\n data-status={status}\n data-hint={frame?.hint ?? ''}\n style={{ ...rootStyle, ...themeToStyle(theme), ...style }}\n >\n {/* Global spinner keyframes */}\n <style>{`@keyframes xco-spin { to { transform: rotate(360deg); } }`}</style>\n <video ref={videoRef} playsInline muted autoPlay style={videoStyle} />\n\n {/* Dark mask + guide rectangle (while there are no OpenCV corners) */}\n {!hideStatusOverlay && !showCornerOverlay && (\n <div style={overlayStyle}>\n <div\n className=\"xco-guide\"\n style={{\n ...guideStyle,\n width: borderBox.width,\n height: borderBox.height,\n borderColor: accentColor,\n }}\n />\n </div>\n )}\n\n {/* SVG overlay with the 4 corners detected by OpenCV.\n viewBox = analysis frame size; preserveAspectRatio=\"xMidYMid slice\"\n replicates the <video>'s object-fit: cover. */}\n {!hideStatusOverlay && showCornerOverlay && frame && frame.corners && frame.frameSize && (\n <svg\n style={svgStyle}\n viewBox={`0 0 ${frame.frameSize.width} ${frame.frameSize.height}`}\n preserveAspectRatio=\"xMidYMid slice\"\n >\n <defs>\n <mask id={maskId}>\n <rect\n x=\"0\"\n y=\"0\"\n width={frame.frameSize.width}\n height={frame.frameSize.height}\n fill=\"white\"\n />\n <polygon\n points={frame.corners.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"black\"\n />\n </mask>\n </defs>\n {/* Dark mask over everything that is NOT the document */}\n <rect\n x=\"0\"\n y=\"0\"\n width={frame.frameSize.width}\n height={frame.frameSize.height}\n style={{ fill: cssVar('mask') }}\n mask={`url(#${maskId})`}\n />\n {/* Outlined polygon over the detected corners */}\n <polygon\n points={frame.corners.map((p) => `${p.x},${p.y}`).join(' ')}\n style={{ fill: 'none', stroke: accentColor }}\n strokeWidth={Math.max(2, frame.frameSize.width * 0.006)}\n strokeLinejoin=\"round\"\n />\n {/* Corner markers */}\n {frame.corners.map((p, i) => (\n <circle\n key={i}\n cx={p.x}\n cy={p.y}\n r={Math.max(4, frame.frameSize!.width * 0.012)}\n style={{ fill: accentColor }}\n />\n ))}\n </svg>\n )}\n\n {!hideStatusOverlay &&\n (canStart ? (\n <button type=\"button\" className=\"xco-hint\" onClick={onStart} style={hintButtonStyle}>\n {hintText}\n </button>\n ) : (\n <p className=\"xco-hint\" style={hintStyle} role=\"status\" aria-live=\"polite\">\n {hintText}\n </p>\n ))}\n\n {/* Floating manual-capture shutter */}\n {!hideStatusOverlay && canCapture && (\n <button\n type=\"button\"\n className=\"xco-shutter\"\n onClick={onCapture}\n aria-label={texts.capture}\n style={shutterStyle}\n >\n <span style={shutterInnerStyle} />\n </button>\n )}\n\n {/* Retake action after done/error */}\n {!hideStatusOverlay && canRetake && (\n <button\n type=\"button\"\n className=\"xco-retake\"\n onClick={onRetake}\n aria-label={texts.retake}\n style={retakeStyle}\n >\n {texts.retake}\n </button>\n )}\n\n {/* Loader overlay: covers the camera with a backdrop while processing */}\n {!hideStatusOverlay && isProcessing && (\n <div className=\"xco-loader\" style={loaderOverlayStyle} aria-busy=\"true\" aria-live=\"polite\">\n <div style={spinnerStyle} />\n <p style={loaderTextStyle}>{copyFor(status, undefined, texts)}</p>\n </div>\n )}\n\n {tipsVisible && !hideStatusOverlay && <TipsCard texts={texts} onDismiss={onDismissTips} />}\n </div>\n );\n}\n\nconst ACTION_BOTTOM = 'calc(104px + env(safe-area-inset-bottom, 0px))';\n\nconst rootStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n background: cssVar('background'),\n fontFamily: cssVar('fontFamily'),\n touchAction: 'none',\n};\n\nconst videoStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n};\n\nconst svgStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n};\n\nconst overlayStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n};\n\nconst guideStyle: React.CSSProperties = {\n borderRadius: cssVar('radius'),\n borderWidth: 4,\n borderStyle: 'solid',\n boxShadow: `0 0 0 9999px ${cssVar('mask')}`,\n transition: 'border-color 200ms ease-in-out, width 200ms ease-in-out, height 200ms ease-in-out',\n};\n\nconst loaderOverlayStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 20,\n background: cssVar('overlayBg'),\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n pointerEvents: 'auto',\n zIndex: 10,\n};\n\nconst spinnerStyle: React.CSSProperties = {\n width: 56,\n height: 56,\n borderRadius: '50%',\n border: '5px solid rgba(255, 255, 255, 0.18)',\n borderTopColor: cssVar('accent'),\n animation: 'xco-spin 0.85s linear infinite',\n};\n\nconst loaderTextStyle: React.CSSProperties = {\n color: cssVar('overlayFg'),\n fontFamily: cssVar('fontFamily'),\n fontSize: 15,\n fontWeight: 500,\n margin: 0,\n textAlign: 'center',\n padding: '0 24px',\n};\n\nconst shutterStyle: React.CSSProperties = {\n position: 'absolute',\n bottom: ACTION_BOTTOM,\n left: '50%',\n transform: 'translateX(-50%)',\n width: 68,\n height: 68,\n borderRadius: '50%',\n background: 'rgba(255,255,255,0.18)',\n border: `4px solid ${cssVar('shutter')}`,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n WebkitTapHighlightColor: 'transparent',\n padding: 0,\n};\n\nconst shutterInnerStyle: React.CSSProperties = {\n width: 52,\n height: 52,\n borderRadius: '50%',\n background: 'white',\n display: 'block',\n};\n\nconst retakeStyle: React.CSSProperties = {\n position: 'absolute',\n bottom: ACTION_BOTTOM,\n left: '50%',\n transform: 'translateX(-50%)',\n minHeight: 44,\n padding: '10px 20px',\n borderRadius: 22,\n background: cssVar('buttonBg'),\n color: cssVar('buttonFg'),\n border: 'none',\n fontFamily: cssVar('fontFamily'),\n fontSize: 15,\n fontWeight: 600,\n cursor: 'pointer',\n pointerEvents: 'auto',\n WebkitTapHighlightColor: 'transparent',\n};\n\nconst hintStyle: React.CSSProperties = {\n position: 'absolute',\n bottom: 'calc(16px + env(safe-area-inset-bottom, 0px))',\n left: '50%',\n transform: 'translateX(-50%)',\n boxSizing: 'border-box',\n width: 'max-content',\n maxWidth: 'calc(100% - 32px)',\n background: cssVar('hintBg'),\n color: cssVar('hintFg'),\n padding: '10px 16px',\n borderRadius: cssVar('radius'),\n fontFamily: cssVar('fontFamily'),\n fontSize: 16,\n lineHeight: 1.35,\n margin: 0,\n whiteSpace: 'normal',\n textAlign: 'center',\n};\n\nconst hintButtonStyle: React.CSSProperties = {\n ...hintStyle,\n border: 'none',\n minHeight: 44,\n cursor: 'pointer',\n pointerEvents: 'auto',\n WebkitTapHighlightColor: 'transparent',\n};\n","/**\n * <XidCameraOcr /> — container: wires `useXidCameraOcr` to the presentational\n * `<XidCameraOcrView />`, resolving `texts` over the es-MX defaults.\n *\n * One capture per run: after `done` (or an `error`) the shutter becomes a\n * Retake action that stops the session and starts a new run. If the detector\n * is unavailable the status stays `streaming` (hint `detector_unavailable`),\n * so the shutter stays visible for a manual, unwarped capture.\n */\nimport { useMemo } from 'react';\nimport { resolveTexts, type DocumentType, type HintCopy } from '../core/index.js';\nimport type { XidCameraOcrTheme } from './theme.js';\nimport { useXidCameraOcr, type UseXidCameraOcrOptions } from './useXidCameraOcr.js';\nimport { useTips } from './tips.js';\nimport { XidCameraOcrView } from './XidCameraOcrView.js';\n\nexport interface XidCameraOcrProps extends UseXidCameraOcrOptions {\n className?: string;\n style?: React.CSSProperties;\n hideStatusOverlay?: boolean;\n /** Per-key override of the es-MX default texts. */\n texts?: Partial<HintCopy>;\n /** Theme variables written to the root as `--xco-*` custom properties. */\n theme?: XidCameraOcrTheme;\n /** Show the capture tips card. Default `true`. */\n showTips?: boolean;\n}\n\nconst DEFAULT_DOCUMENT_TYPES: DocumentType[] = ['INE', 'PASSPORT_MX'];\n\nconst swallow = () => {\n /* the error is reported through the session's onError */\n};\n\nexport function XidCameraOcr({\n className,\n style,\n hideStatusOverlay,\n texts: textOverrides,\n theme,\n showTips,\n ...sessionOptions\n}: XidCameraOcrProps) {\n const { videoRef, status, frame, start, captureNow, retake } = useXidCameraOcr(sessionOptions);\n const tips = useTips(status, showTips ?? true);\n const texts = useMemo(() => resolveTexts(textOverrides), [textOverrides]);\n\n const canCapture = status === 'streaming' || status === 'loading_detector';\n const canRetake = status === 'done' || status === 'error';\n\n const onCapture = () => {\n if (!canCapture) return;\n void captureNow().catch(swallow);\n };\n const onRetake = () => {\n if (!canRetake) return;\n void retake().catch(swallow);\n };\n const onStart = () => {\n void start().catch(swallow);\n };\n\n return (\n <XidCameraOcrView\n videoRef={videoRef}\n status={status}\n frame={frame}\n texts={texts}\n documentTypes={sessionOptions.documentTypes ?? DEFAULT_DOCUMENT_TYPES}\n theme={theme}\n className={className}\n style={style}\n hideStatusOverlay={hideStatusOverlay}\n tipsVisible={tips.visible}\n onCapture={onCapture}\n onRetake={onRetake}\n onStart={onStart}\n onDismissTips={tips.dismiss}\n />\n );\n}\n"]}
|