@andresxid/xid_camera_ocr_sdk_react 0.1.0 → 0.2.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 +23 -1
- package/LICENSE +9 -0
- package/README.md +51 -18
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -4
- package/dist/index.d.ts +17 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
Manual capture by default and a shutter that can live anywhere.
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Behavior change (BREAKING-ish): `autoCapture` now defaults to `false`; the user takes the photo. Pass `autoCapture: true` to restore the auto-shutter.
|
|
10
|
+
- The guide rectangle and dark mask are always shown while the camera is live. The SVG overlay that drew the detected OpenCV corners is removed; detection still runs for the quality hints and the rectified output. Cropping to the guide is not implemented.
|
|
11
|
+
- Default texts no longer promise automatic capture. es-MX: `ready` "¡Perfecto! Toma la foto", `hold_still` "Mantén la cámara quieta", `tip_focus` "Espera a que la cámara enfoque y luego toca el botón". English: `ready` "Perfect! Take the photo", `hold_still` "Hold the camera steady", `tip_focus` "Wait for the camera to focus, then tap the button".
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- `hideShutter` prop to hide the built-in shutter button.
|
|
16
|
+
- `<XidCameraOcr />` accepts a `ref` typed by the new exported `XidCameraOcrHandle` (`capture()`, `retake()`, `start()`).
|
|
17
|
+
- `onStatusChange` prop, called with the initial status and on every change.
|
|
18
|
+
|
|
19
|
+
## 0.1.1
|
|
20
|
+
|
|
21
|
+
Public release under the XID proprietary license (LICENSE file added). No code changes.
|
|
22
|
+
|
|
3
23
|
## 0.1.0
|
|
4
24
|
|
|
25
|
+
Published 2026-10-29 (restricted).
|
|
26
|
+
|
|
5
27
|
Initial release of `@andresxid/xid_camera_ocr_sdk_react`, forked from `@andresxid/extract-sdk-*` 0.4.0.
|
|
6
28
|
|
|
7
29
|
### Added
|
|
@@ -11,7 +33,7 @@ Initial release of `@andresxid/xid_camera_ocr_sdk_react`, forked from `@andresxi
|
|
|
11
33
|
- Tips card (`showTips`, default on) shown during `starting`/`loading_detector` before the first completed capture, hidden on `streaming`, dismissible with its button, and shown again on every `error` even if dismissed earlier.
|
|
12
34
|
- Zero-config Vite 5.4+, 6 and 7 (no `optimizeDeps` or `worker` setting), proven by the packed-tarball consumer matrix.
|
|
13
35
|
- `workerUrl` option (with `opencvUrl`) so CJS and non-Vite consumers can self-host `cv-worker.js` and `opencv.js`.
|
|
14
|
-
- Full demo (`examples/full-demo`) with a
|
|
36
|
+
- Full demo (`examples/full-demo`) with a signing backend.
|
|
15
37
|
|
|
16
38
|
### Removed
|
|
17
39
|
|
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Copyright (c) 2026 XID. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software is the proprietary property of XID. It is made publicly available on npm solely so that XID customers and authorized integrators can integrate XID identity-verification services.
|
|
4
|
+
|
|
5
|
+
Use, installation and integration are permitted only together with XID services under an agreement with XID, or with XID's written permission. No other right or license is granted. In particular, you may not copy, modify, redistribute, sublicense or reverse engineer this software, or use it with non-XID services.
|
|
6
|
+
|
|
7
|
+
THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. XID IS NOT LIABLE FOR ANY DAMAGES ARISING FROM ITS USE.
|
|
8
|
+
|
|
9
|
+
Third-party components keep their own licenses. OpenCV.js is distributed under the Apache License 2.0; see dist/LICENSE-OpenCV.txt and dist/NOTICE-OpenCV.txt.
|
package/README.md
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
# @andresxid/xid_camera_ocr_sdk_react
|
|
2
2
|
|
|
3
|
-
React component and headless hook that capture an identity document in the browser: camera, on-device OpenCV edge detection, quality
|
|
3
|
+
React component and headless hook that capture an identity document in the browser: camera, on-device OpenCV edge detection, quality hints and a manual shutter (an optional auto-shutter is available). It returns a rectified JPEG to your `onUpload` callback and knows nothing about your backend.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
The package is published as restricted. Add a token to your project `.npmrc` (keep the real token in the `NPM_TOKEN` environment variable, never in the file):
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
|
|
11
|
-
```
|
|
12
|
-
|
|
13
7
|
```bash
|
|
14
|
-
|
|
8
|
+
npm install @andresxid/xid_camera_ocr_sdk_react
|
|
15
9
|
```
|
|
16
10
|
|
|
17
11
|
Peer dependencies: `react >=18` and `react-dom >=18`. There are no runtime dependencies. The library supports Node >= 18 (the full demo and the Vite consumer harness need Node >= 20.19 because they run Vite 7).
|
|
@@ -42,6 +36,43 @@ export function Capture() {
|
|
|
42
36
|
|
|
43
37
|
Need your own UI? `useXidCameraOcr(options)` is the headless hook. It returns `videoRef`, `status`, `frame`, `result`, `error`, `start`, `stop`, `captureNow` and `retake`; attach `videoRef` to a `<video playsInline muted>` and render whatever you like. `XidCameraOcrSession` is the framework-free class underneath both.
|
|
44
38
|
|
|
39
|
+
## Manual capture and custom shutter
|
|
40
|
+
|
|
41
|
+
The user takes the photo. A fixed guide rectangle with a dark mask is always shown while the camera is live; the detector keeps running only for the quality hints (`blurry`, `glare`, `too_dark`, `too_small`, `no_document`) and to rectify the output when a document is found. The photo is not cropped to the guide. To capture automatically, pass `autoCapture: true`.
|
|
42
|
+
|
|
43
|
+
To put the shutter anywhere, hide the built-in one and drive the component through its `ref`:
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import { useRef, useState } from 'react';
|
|
47
|
+
import { XidCameraOcr, type XidCameraOcrHandle } from '@andresxid/xid_camera_ocr_sdk_react';
|
|
48
|
+
|
|
49
|
+
export function Capture() {
|
|
50
|
+
const camera = useRef<XidCameraOcrHandle>(null);
|
|
51
|
+
const [ready, setReady] = useState(false);
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<div style={{ position: 'relative', height: 480 }}>
|
|
55
|
+
<XidCameraOcr
|
|
56
|
+
ref={camera}
|
|
57
|
+
hideShutter
|
|
58
|
+
onStatusChange={(status) => setReady(status === 'streaming')}
|
|
59
|
+
onUpload={upload}
|
|
60
|
+
/>
|
|
61
|
+
<button
|
|
62
|
+
type="button"
|
|
63
|
+
disabled={!ready}
|
|
64
|
+
onClick={() => camera.current?.capture()}
|
|
65
|
+
style={{ position: 'absolute', right: 16, bottom: 16 }}
|
|
66
|
+
>
|
|
67
|
+
Take photo
|
|
68
|
+
</button>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`XidCameraOcrHandle` has `capture(): Promise<void>` (same as the built-in shutter; ignored unless the camera is live), `retake(): void` (same as the built-in retake; ignored unless the run is `done` or `error`) and `start(): Promise<void>`. Errors behave like the built-in buttons: they are not thrown and reach `onError`. `hideShutter` hides only the shutter; the retake button stays.
|
|
75
|
+
|
|
45
76
|
## Backend pattern
|
|
46
77
|
|
|
47
78
|
The browser never holds a credential. It posts the JPEG to **your** backend, and your backend signs and forwards the request as `multipart/form-data` with the file in the `document` field:
|
|
@@ -140,18 +171,18 @@ import { XidCameraOcr, DEFAULT_TEXTS_EN } from '@andresxid/xid_camera_ocr_sdk_re
|
|
|
140
171
|
| `too_dark` | Hay poca luz, busca un lugar más iluminado |
|
|
141
172
|
| `glare` | Hay un reflejo, inclina un poco tu identificación |
|
|
142
173
|
| `blurry` | Espera a que la cámara enfoque |
|
|
143
|
-
| `hold_still` |
|
|
144
|
-
| `ready` | ¡Perfecto!
|
|
174
|
+
| `hold_still` | Mantén la cámara quieta |
|
|
175
|
+
| `ready` | ¡Perfecto! Toma la foto |
|
|
145
176
|
| `capturing` | Tomando la foto… |
|
|
146
177
|
| `uploading` | Revisando tu identificación… |
|
|
147
178
|
| `done` | ¡Listo! |
|
|
148
179
|
| `error` | Algo salió mal, inténtalo de nuevo |
|
|
149
|
-
| `detector_unavailable` | Toma la foto con el botón
|
|
180
|
+
| `detector_unavailable` | Toma la foto con el botón |
|
|
150
181
|
| `retake` | Tomar otra vez |
|
|
151
182
|
| `capture` | Tomar foto |
|
|
152
183
|
| `tip_light` | Busca un lugar con buena luz |
|
|
153
184
|
| `tip_glare` | Evita reflejos: no apuntes una lámpara directo a tu identificación |
|
|
154
|
-
| `tip_focus` | Espera a que la cámara enfoque
|
|
185
|
+
| `tip_focus` | Espera a que la cámara enfoque y luego toca el botón |
|
|
155
186
|
| `tips_dismiss` | Entendido |
|
|
156
187
|
|
|
157
188
|
The tips card (`tip_light`, `tip_glare`, `tip_focus`, `tips_dismiss`) shows while the camera starts or the detector loads (`starting`, `loading_detector`) before the first completed capture, and hides once the status is `streaming`. The user can dismiss it with its button, but it returns on every `error` even if it was dismissed earlier. Hide it entirely with `showTips={false}`.
|
|
@@ -168,9 +199,9 @@ The tips card (`tip_light`, `tip_glare`, `tip_focus`, `tips_dismiss`) shows whil
|
|
|
168
199
|
| `onResult` | `(result) => void` | | After `onUpload` resolves |
|
|
169
200
|
| `onError` | `(err: Error) => void` | | Camera, detector or upload failure |
|
|
170
201
|
| `autoStart` | `boolean` | `true` | Start the stream on mount |
|
|
171
|
-
| `autoCapture` | `boolean` | `
|
|
202
|
+
| `autoCapture` | `boolean` | `false` | Opt-in auto-shutter on a stable, good frame. By default the user takes the photo with the shutter |
|
|
172
203
|
| `documentTypes` | `DocumentType[]` | `['INE', 'PASSPORT_MX']` | Sizes the fallback guide; does not filter detection |
|
|
173
|
-
| `stableFramesRequired` | `number` | `10` | Stable frames before auto-capture |
|
|
204
|
+
| `stableFramesRequired` | `number` | `10` | Stable frames before auto-capture (only with `autoCapture: true`) |
|
|
174
205
|
| `captureQuality` | `number` | `0.92` | JPEG quality, 0 to 1 |
|
|
175
206
|
| `captureResolution` | `'standard' \| 'high'` | `'standard'` | Long side 1024 px or 1600 px |
|
|
176
207
|
| `opencvUrl` | `string` | packaged `opencv.js` | Self-hosted `dist/opencv.js`; required with `workerUrl` for CJS and non-Vite bundlers (see Known limitations) |
|
|
@@ -178,7 +209,9 @@ The tips card (`tip_light`, `tip_glare`, `tip_focus`, `tips_dismiss`) shows whil
|
|
|
178
209
|
| `theme` | `XidCameraOcrTheme` | `{}` | See Theming |
|
|
179
210
|
| `texts` | `Partial<HintCopy>` | es-MX defaults | See Texts |
|
|
180
211
|
| `showTips` | `boolean` | `true` | Tips card |
|
|
181
|
-
| `
|
|
212
|
+
| `hideShutter` | `boolean` | `false` | Hides the built-in shutter button; capture with your own button through the `ref` handle |
|
|
213
|
+
| `onStatusChange` | `(status: SessionStatus) => void` | | Called with the initial status and on every change; enable your own button when it is `streaming` |
|
|
214
|
+
| `hideStatusOverlay` | `boolean` | `false` | Hides everything drawn over the video: guide rectangle and mask, hint banner (including the tap-to-start button), shutter, retake button, loader and tips card |
|
|
182
215
|
| `className`, `style` | | | On the root `xid-camera-ocr` element |
|
|
183
216
|
|
|
184
217
|
## Status lifecycle
|
|
@@ -187,7 +220,7 @@ The tips card (`tip_light`, `tip_glare`, `tip_focus`, `tips_dismiss`) shows whil
|
|
|
187
220
|
|
|
188
221
|
- `stopped` is reached after `stop()`.
|
|
189
222
|
- One capture per run: after `done` or `error`, `retake()` stops and restarts the run to arm the shutter again.
|
|
190
|
-
- If OpenCV cannot load, the status stays `streaming` with the frame hint `detector_unavailable`: auto-capture is off but the manual shutter still works.
|
|
223
|
+
- If OpenCV cannot load, the status stays `streaming` with the frame hint `detector_unavailable`: auto-capture (if enabled) is off but the manual shutter still works.
|
|
191
224
|
|
|
192
225
|
## Vite
|
|
193
226
|
|
|
@@ -213,11 +246,11 @@ Why each directive:
|
|
|
213
246
|
|
|
214
247
|
## Known limitations
|
|
215
248
|
|
|
216
|
-
- **Detection quality (0.4.0 gate not met).** The detector was inherited from 0.4.0 and has not been improved here. On the detection eval, hand-occlusion IoU is 0.492 against a 0.90 threshold and clutter IoU is 0.534 against 0.80. The false-positive rate is unmeasured. Keep the manual shutter reachable and
|
|
249
|
+
- **Detection quality (0.4.0 gate not met).** The detector was inherited from 0.4.0 and has not been improved here. On the detection eval, hand-occlusion IoU is 0.492 against a 0.90 threshold and clutter IoU is 0.534 against 0.80. The false-positive rate is unmeasured. Keep the manual shutter reachable and detection only drives the quality hints and the rectified output, so do not rely on it to find the document.
|
|
217
250
|
- **Phone validation.** Phone validation (iOS Safari / Android Chrome) is in progress; results will be published in a later release.
|
|
218
251
|
- **CJS build needs `workerUrl` and `opencvUrl`.** The CJS bundle resolves `import.meta.url` against the document, not the package. CJS consumers must serve `dist/cv-worker.js` and `dist/opencv.js` from their own origin (copy them from `node_modules/@andresxid/xid_camera_ocr_sdk_react/dist/`) and pass both URLs; otherwise the detector cannot start and only manual capture works. ESM consumers on Vite need nothing.
|
|
219
252
|
- **Non-Vite bundlers are untested** (webpack, Rollup alone, esbuild, Next.js). Host `dist/cv-worker.js` and `dist/opencv.js` yourself and pass both `workerUrl` and `opencvUrl`; otherwise only manual capture works.
|
|
220
253
|
|
|
221
254
|
## License
|
|
222
255
|
|
|
223
|
-
|
|
256
|
+
Proprietary — © XID. See LICENSE. Use is permitted only with XID services under an agreement with XID. OpenCV.js is Apache-2.0 (notice in `dist/`).
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var gt=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,C=gt();async function de(e,t){let r={audio:false,video:{facingMode:{ideal:"environment"},width:{ideal:1920,min:640},height:{ideal:1080,min:480},aspectRatio:{ideal:1.7777777777777777}}};if(typeof navigator>"u"||!navigator.mediaDevices?.getUserMedia)throw new Error("Camera unavailable: getUserMedia requires a secure context (HTTPS or localhost) and a browser with MediaDevices support.");let n;try{n=await navigator.mediaDevices.getUserMedia(t??r);}catch(s){if(!t)n=await navigator.mediaDevices.getUserMedia({audio:false,video:true});else throw s}e.srcObject=n,e.muted=true,e.playsInline=true,e.autoplay=true;let o=n.getVideoTracks()[0],i=o.getCapabilities?.();return i&&"focusMode"in i&&i.focusMode?.includes("continuous")&&o.applyConstraints({advanced:[{focusMode:"continuous"}]}).catch(()=>{}),await e.play().catch(()=>{}),n}function pe(e,t){e.srcObject===t&&(e.srcObject=null),t?.getTracks().forEach(r=>r.stop());}async function me(e,t=.92){let r=e.videoWidth,n=e.videoHeight;if(!r||!n)throw new Error("Video stream not ready (videoWidth=0)");let o=document.createElement("canvas");o.width=r,o.height=n;let i=o.getContext("2d");if(!i)throw new Error("2D canvas context unavailable");return i.drawImage(e,0,0,r,n),new Promise((s,a)=>{o.toBlob(l=>l?s(l):a(new Error("Canvas toBlob returned null")),"image/jpeg",t);})}var N=null;function he(e,t=640){let r=e.videoWidth,n=e.videoHeight;if(!r||!n)return null;let o=Math.round(t),i=Math.round(n*t/r);N??=document.createElement("canvas"),(N.width!==o||N.height!==i)&&(N.width=o,N.height=i);let s=N.getContext("2d",{willReadFrequently:true});return s?(s.drawImage(e,0,0,o,i),s.getImageData(0,0,o,i)):null}function Fe(e){let t=e.videoWidth,r=e.videoHeight;if(!t||!r)return null;let n=document.createElement("canvas");n.width=t,n.height=r;let o=n.getContext("2d",{willReadFrequently:true});return o?(o.drawImage(e,0,0,t,r),o.getImageData(0,0,t,r)):null}function Pe(e,t=.92){let r=document.createElement("canvas");r.width=e.width,r.height=e.height;let n=r.getContext("2d");return n?(n.putImageData(e,0,0),new Promise((o,i)=>r.toBlob(s=>s?o(s):i(new Error("Canvas toBlob returned null")),"image/jpeg",t))):Promise.reject(new Error("2D canvas context unavailable"))}function ye(e){let t=e.getCapabilities;return typeof t!="function"?false:t.call(e).torch===true}async function fe(e,t){try{return await e.applyConstraints({advanced:[{torch:t}]}),!0}catch{return false}}var xt="@andresxid/xid_camera_ocr_sdk_react";function Ie(e,t){return e.pathname.endsWith(`/${xt}/${t}`)}function De(e){return new URL(e,C)}function Oe(){return new URL("@andresxid/xid_camera_ocr_sdk_react/opencv.js",C)}function be(){let e=Oe();return Ie(e,"opencv.js")?De("./opencv.js").href:e.href}function He(e){return e!==void 0?new Worker(e,{type:"module"}):Ie(Oe(),"opencv.js")?new Worker(De("./cv-worker.js"),{type:"module"}):new Worker(new URL("@andresxid/xid_camera_ocr_sdk_react/cv-worker.js",C),{type:"module"})}function Le(e){if(!e||typeof e!="object")return null;let t=e;switch(t.type){case "ready":return {type:"ready"};case "init-error":return typeof t.error=="string"?{type:"init-error",error:t.error}:null;case "error":return typeof t.id=="number"&&typeof t.error=="string"?{type:"error",id:t.id,error:t.error}:null;case "analyze-result":return typeof t.id=="number"&&t.result&&typeof t.result=="object"?{type:"analyze-result",id:t.id,result:t.result}:null;case "warp-result":return typeof t.id=="number"&&typeof t.width=="number"&&typeof t.height=="number"&&t.buffer instanceof ArrayBuffer?{type:"warp-result",id:t.id,width:t.width,height:t.height,buffer:t.buffer}:null;default:return null}}function Ue(e){let t=new Uint8ClampedArray(e.data.byteLength);return t.set(e.data),t.buffer}var Ct=e=>e instanceof Error?e:new Error(String(e)),j=class{initTimeoutMs;worker=null;readyPromise=null;rejectInit=null;initTimer=null;ready=false;pending=new Map;nextId=1;constructor(t={}){this.initTimeoutMs=t.initTimeoutMs??3e4;}init(t=be(),r){if(this.readyPromise)return this.readyPromise;let n;try{n=He(r);}catch(i){return Promise.reject(Ct(i))}this.worker=n;let o=new Promise((i,s)=>{this.rejectInit=s,this.initTimer=setTimeout(()=>this.fail(new Error(`OpenCV worker not ready within ${this.initTimeoutMs} ms`)),this.initTimeoutMs),n.addEventListener("message",a=>{if(this.worker!==n)return;let l=Le(a.data);if(!l)return;if(l.type==="ready"){this.clearInitTimer(),this.rejectInit=null,this.ready=true,i();return}if(l.type==="init-error"){this.fail(new Error(l.error));return}let c=this.pending.get(l.id);c&&(this.pending.delete(l.id),l.type==="error"?c.reject(new Error(l.error)):c.resolve(l));}),n.addEventListener("error",a=>{this.worker===n&&this.fail(new Error(a.message||"Worker error"));}),n.addEventListener("messageerror",a=>{if(this.worker!==n)return;let l=new Error("Worker message could not be deserialized"),c=a.data?.id,d=typeof c=="number"?this.pending.get(c):void 0;if(typeof c=="number"&&d){this.pending.delete(c),d.reject(l);return}this.fail(l);});});return this.readyPromise=o,n.postMessage({type:"init",opencvUrl:t}),o}isReady(){return this.ready&&this.worker!==null}async analyze(t,r={}){let n=Ue(t),o=r.prior,i=await this.request(s=>({type:"analyze",id:s,width:t.width,height:t.height,buffer:n,...o?{prior:o}:{}}),[n]);if(i.type!=="analyze-result")throw new Error(`Unexpected worker response: ${i.type}`);return i.result}async warp(t,r,n,o=1024){let i=Ue(t),s=await this.request(a=>({type:"warp",id:a,width:t.width,height:t.height,buffer:i,corners:r,docType:n,longSide:o}),[i]);if(s.type!=="warp-result")throw new Error(`Unexpected worker response: ${s.type}`);return new ImageData(new Uint8ClampedArray(s.buffer),s.width,s.height)}terminate(){this.rejectInit=null,this.shutdown(new Error("Worker terminated"));}fail(t){let r=this.rejectInit;this.rejectInit=null,this.shutdown(t),r?.(t);}clearInitTimer(){this.initTimer!==null&&clearTimeout(this.initTimer),this.initTimer=null;}shutdown(t){this.clearInitTimer(),this.worker?.terminate(),this.worker=null,this.readyPromise=null,this.ready=false;let r=[...this.pending.values()];this.pending.clear();for(let n of r)n.reject(t);}request(t,r){let n=this.worker;if(!n||!this.ready)return Promise.reject(new Error("CVWorkerClient not ready"));let o=t(this.nextId++),i=new Promise((s,a)=>this.pending.set(o.id,{resolve:s,reject:a}));return n.postMessage(o,r),i}};var D=1.585772508336421,H=125/88,wt=1.503,Rt=.05,re=1.25,ge=1.75,Tt=.25;function xe(e){if(e.length!==4)throw new Error(`orderCorners expects 4 points, got ${e.length}`);let t=(e[0].x+e[1].x+e[2].x+e[3].x)/4,r=(e[0].y+e[1].y+e[2].y+e[3].y)/4,n=[...e].sort((i,s)=>Math.atan2(i.y-r,i.x-t)-Math.atan2(s.y-r,s.x-t)),o=0;for(let i=1;i<4;i++){let s=n[i],a=n[o];(s.x+s.y<a.x+a.y||s.x+s.y===a.x+a.y&&s.y<a.y)&&(o=i);}return [0,1,2,3].map(i=>n[(o+i)%4])}function L(e){let t=0;for(let r=0;r<e.length;r++){let n=e[r],o=e[(r+1)%e.length];t+=n.x*o.y-o.x*n.y;}return Math.abs(t)/2}function ne(e){let[t,r,n,o]=e;return {top:Math.hypot(r.x-t.x,r.y-t.y),right:Math.hypot(n.x-r.x,n.y-r.y),bottom:Math.hypot(n.x-o.x,n.y-o.y),left:Math.hypot(o.x-t.x,o.y-t.y)}}function vt(e){let t=[0,0,0,0];for(let r=0;r<4;r++){let n=e[(r+3)%4],o=e[r],i=e[(r+1)%4],s=n.x-o.x,a=n.y-o.y,l=i.x-o.x,c=i.y-o.y,d=Math.hypot(s,a),p=Math.hypot(l,c);if(d===0||p===0){t[r]=0;continue}let m=Math.min(1,Math.max(-1,(s*l+a*c)/(d*p)));t[r]=Math.acos(m)*180/Math.PI;}return t}function oe(e,t=70,r=110){let n=ne(e);return n.top<=0||n.right<=0||n.bottom<=0||n.left<=0||!kt(e)||L(e)<=0?false:vt(e).every(o=>o>=t&&o<=r)}function kt(e){let t=0;for(let r=0;r<4;r++){let n=e[r],o=e[(r+1)%4],i=e[(r+2)%4],s=(o.x-n.x)*(i.y-o.y)-(o.y-n.y)*(i.x-o.x);if(s===0)return false;let a=Math.sign(s);if(t===0)t=a;else if(a!==t)return false}return true}function z(e){let t=ne(e),r=(t.top+t.bottom)/2,n=(t.left+t.right)/2,o=Math.min(r,n);return o<=0?0:Math.max(r,n)/o}function Mt(e){if(!Number.isFinite(e))return 0;let t=Math.min(Math.abs(e-D),Math.abs(e-H));return Math.max(0,1-t/Tt)}function Qe(e){return .5*e.areaRatio+.3*e.rectangularity+.2*Mt(e.aspect)}function ae(e){let t=e>=wt?D:H;return Math.abs(e-t)/t<=Rt?t===D?"INE":"PASSPORT_MX":"OTHER"}function Se(e){return e>=re&&e<=ge}function Ne(e,t){return e==="INE"?D:e==="PASSPORT_MX"?H:t}var V=1024,qe=1600;function Be(e,t,r,n,o=V){let i=_t(Ne(n,z(r))),s=Math.max(1,Math.round(o/i)),a=ne(r),l=a.top+a.bottom<a.left+a.right,c=n==="INE"||n==="PASSPORT_MX",d=l&&c?[r[3],r[0],r[1],r[2]]:r,p=!l||c,m=p?o:s,u=p?s:o,x=null,S=null,y=null,g=null,h=null,f=null;try{return x=e.matFromImageData(t),S=new e.Mat,y=e.matFromArray(4,1,e.CV_32FC2,[d[0].x,d[0].y,d[1].x,d[1].y,d[2].x,d[2].y,d[3].x,d[3].y]),g=e.matFromArray(4,1,e.CV_32FC2,[0,0,m,0,m,u,0,u]),h=e.getPerspectiveTransform(y,g),e.warpPerspective(x,S,h,new e.Size(m,u),e.INTER_LINEAR,e.BORDER_CONSTANT,new e.Scalar(0,0,0,255)),S.channels()!==4&&(f=new e.Mat,e.cvtColor(S,f,e.COLOR_BGR2RGBA)),At(new Uint8ClampedArray((f??S).data),m,u)}finally{for(let k of [f,h,g,y,S,x])k?.delete();}}function Xe(e,t,r,n,o=V){let i=t.getContext("2d",{willReadFrequently:true});if(!i)throw new Error("2D canvas context unavailable");let s=i.getImageData(0,0,t.width,t.height),a=Be(e,s,r,n,o),l=document.createElement("canvas");l.width=a.width,l.height=a.height;let c=l.getContext("2d");if(!c)throw new Error("2D canvas context unavailable (output)");return c.putImageData(a,0,0),l}async function Et(e,t,r,n,o=.92,i=V){let s=r?Xe(e,t,r,n,i):t;return new Promise((a,l)=>{s.toBlob(c=>c?a(c):l(new Error("Canvas toBlob returned null")),"image/jpeg",o);})}function _t(e){return Number.isFinite(e)?Math.min(ge,Math.max(re,e)):re}function At(e,t,r){return typeof globalThis.ImageData=="function"?new ImageData(e,t,r):{data:e,width:t,height:r,colorSpace:"srgb"}}var A={brightnessMin:.18,brightnessMax:.9,blurMin:60,glareMax:.04,fillMin:.25,glarePixel:248};function G(e,t,r){let n=new Int32Array(r*2);for(let o=0;o<r;o++){let i=o+.5,s=1/0,a=-1/0;for(let l=0;l<4;l++){let c=e[l],d=e[(l+1)%4],p=Math.min(c.y,d.y),m=Math.max(c.y,d.y);if(i<p||i>m||m===p)continue;let u=c.x+(i-c.y)*(d.x-c.x)/(d.y-c.y);u<s&&(s=u),u>a&&(a=u);}if(s===1/0){n[o*2]=0,n[o*2+1]=0;continue}n[o*2]=Math.max(0,Math.ceil(s-.5)),n[o*2+1]=Math.min(t,Math.floor(a+.5));}return n}function Ce(e,t){let{data:r,width:n,height:o}=e,i=G(t,n,o),s=A.glarePixel,a=0,l=0,c=0,d=0,p=0,m=0;for(let f=0;f<o;f++){let k=i[f*2],M=i[f*2+1];if(k>=M)continue;let _=0,E=0;f>0&&f<o-1&&(_=Math.max(k,i[(f-1)*2],i[(f+1)*2])+1,E=Math.min(M,i[(f-1)*2+1],i[(f+1)*2+1])-1);let R=f*n;for(let v=k;v<M;v++){let F=R+v,P=r[F];if(a+=P,P>=s&&l++,c++,v>=_&&v<E){let w=4*P-r[F-n]-r[F+n]-r[F-1]-r[F+1];d+=w,p+=w*w,m++;}}}let u=c>0?a/c/255:0,x=c>0?l/c:0,S=m>0?Math.max(0,p/m-(d/m)**2):0,y=n*o,g=y>0?L(t)/y:0,h=u>=A.brightnessMin&&u<=A.brightnessMax&&S>=A.blurMin&&x<=A.glareMax&&g>=A.fillMin;return {brightness:u,blurScore:S,glareRatio:x,docFillRatio:g,ok:h}}function We(e){let{data:t}=e;if(t.length===0)return 0;let r=0;for(let n=0;n<t.length;n++)r+=t[n];return r/t.length/255}function we(e){if(!e.detected||!e.quality)return "no_document";let t=e.quality;return !Number.isFinite(t.docFillRatio)||t.docFillRatio<A.fillMin?"too_small":!Number.isFinite(t.brightness)||t.brightness<A.brightnessMin?"too_dark":!Number.isFinite(t.glareRatio)||t.glareRatio>A.glareMax||t.brightness>A.brightnessMax?"glare":!Number.isFinite(t.blurScore)||t.blurScore<A.blurMin?"blurry":e.stableFrames<e.stableFramesRequired?"hold_still":"ready"}var Ft=A.brightnessMin;function je(e){return !e.torchSupported||e.torchOn?false:(e.quality?e.quality.brightness:e.frameBrightness)<Ft}var Re=Object.freeze({idle:"Toca para activar la c\xE1mara",starting:"Abriendo la c\xE1mara\u2026",loading_detector:"Preparando la c\xE1mara\u2026",no_document:"Coloca tu identificaci\xF3n dentro del recuadro",too_small:"Acerca m\xE1s tu identificaci\xF3n",too_dark:"Hay poca luz, busca un lugar m\xE1s iluminado",glare:"Hay un reflejo, inclina un poco tu identificaci\xF3n",blurry:"Espera a que la c\xE1mara enfoque",hold_still:"No te muevas\u2026",ready:"\xA1Perfecto! No te muevas",capturing:"Tomando la foto\u2026",uploading:"Revisando tu identificaci\xF3n\u2026",done:"\xA1Listo!",error:"Algo sali\xF3 mal, int\xE9ntalo de nuevo",detector_unavailable:"Toma la foto con el bot\xF3n blanco",retake:"Tomar otra vez",capture:"Tomar foto",tip_light:"Busca un lugar con buena luz",tip_glare:"Evita reflejos: no apuntes una l\xE1mpara directo a tu identificaci\xF3n",tip_focus:"Espera a que la c\xE1mara enfoque; la foto se toma sola",tips_dismiss:"Entendido"}),Pt=Object.freeze({idle:"Ready to start",starting:"Starting camera\u2026",loading_detector:"Loading detector\u2026",no_document:"Place the document inside the frame",too_small:"Move closer to the document",too_dark:"Find more light",glare:"Tilt the document to avoid glare",blurry:"Hold still to focus",hold_still:"Hold still\u2026",ready:"Ready \u2014 hold still",capturing:"Capturing\u2026",uploading:"Processing document\u2026",done:"Done",error:"Something went wrong \u2014 try again",detector_unavailable:"Detector unavailable \u2014 capture manually",retake:"Capture again",capture:"Capture now",tip_light:"Find a well-lit place",tip_glare:"Avoid glare: don't point a lamp straight at your ID",tip_focus:"Wait for the camera to focus; the photo is taken automatically",tips_dismiss:"Got it"}),It=["loading_detector","capturing","uploading","done","error"];function Dt(e){return It.includes(e)}function Y(e,t){return t?.[e]??Re[e]}function Te(e){let t={...Re};for(let r of Object.keys(t))t[r]=Y(r,e);return t}function ie(e,t,r){return e==="idle"||e==="stopped"?Y("idle",r):e==="starting"?Y("starting",r):Dt(e)?Y(e,r):Y(t??"no_document",r)}var Ot=.05;function Ht(e,t,r){let n=r.width/t.width,o=r.height/t.height;return e.map(i=>({x:i.x*n,y:i.y*o}))}function Lt(e,t){return e.map(r=>({x:Math.min(t.width,Math.max(0,r.x)),y:Math.min(t.height,Math.max(0,r.y))}))}function ze(e,t,r){let n=Lt(Ht(e,t,r),r);return !oe(n)||L(n)<Ot*r.width*r.height?null:n}var Ve={stableFrames:0,isStable:false,quad:null,typeHint:null},$=class{required;maxRatio;switchFrames;current=Ve;candidate=null;constructor(t={}){this.required=t.stableFramesRequired??10,this.maxRatio=t.maxDisplacementRatio??.015,this.switchFrames=Math.max(1,t.hintSwitchFrames??3);}get snapshot(){return this.current}reset(){this.current=Ve,this.candidate=null;}update(t,r){if(!t)return this.reset(),this.current;let n=Math.hypot(r.width,r.height)*this.maxRatio,o=this.current,i=o.quad!==null&&o.quad.every((l,c)=>Math.hypot(t.quad[c].x-l.x,t.quad[c].y-l.y)<=n),s=o.typeHint??t.typeHint,a=i?o.stableFrames+1:1;if(t.typeHint===s)this.candidate=null;else {let l=this.candidate?.typeHint===t.typeHint?this.candidate.frames+1:1;this.candidate={typeHint:t.typeHint,frames:l},l>=this.switchFrames&&(s=t.typeHint,a=1,this.candidate=null);}return this.current={stableFrames:a,isStable:a>=this.required,quad:t.quad,typeHint:s},this.current}};var Qt=640,Nt=10,Ge=1500,qt=35e3,Bt=5,Xt={createWorkerClient:e=>new j(e),attachCamera:e=>de(e),detachCamera:pe,sampleFrame:he,grabFrame:Fe,encodeJpeg:Pe,snapshotToBlob:me,supportsTorch:ye,setTorch:fe,now:()=>performance.now()},Ye=e=>e.provenance==="reduced"||e.provenance==="lowres",$e=e=>e instanceof Error?e:new Error(String(e)),Ke=e=>e.map(t=>({x:t.x,y:t.y})),K=class{opts;deps;stream=null;track=null;cv=null;generation=0;timer=null;frameCallback=null;inFlight=null;warmupUntil=0;capturing=false;autoShutterSpent=false;torchSupported=false;torchOn=false;torchRejected=false;weakRun=false;prior=null;stability;state={status:"idle",lastFrame:null,lastResult:null,lastError:null};constructor(t,r={}){this.opts={videoElement:t.videoElement,documentTypes:t.documentTypes??["INE","PASSPORT_MX"],autoCapture:t.autoCapture??true,stableFramesRequired:t.stableFramesRequired??10,captureQuality:t.captureQuality??.92,captureResolution:t.captureResolution??"standard",opencvUrl:t.opencvUrl,workerUrl:t.workerUrl,onUpload:t.onUpload,onFrameAnalyzed:t.onFrameAnalyzed,onCaptured:t.onCaptured,onResult:t.onResult,onError:t.onError},this.deps={...Xt,...r},this.stability=new $({stableFramesRequired:this.opts.stableFramesRequired});}async start(){if(!["idle","stopped","error"].includes(this.state.status))throw new Error(`Cannot start session from status=${this.state.status}`);this.release();let t=++this.generation;this.setStatus("starting"),this.state.lastError=null;try{let r=await this.deps.attachCamera(this.opts.videoElement);if(t!==this.generation){this.deps.detachCamera(this.opts.videoElement,r);return}this.stream=r,this.track=r.getVideoTracks()[0]??null,this.torchSupported=this.track?this.deps.supportsTorch(this.track):!1,this.warmupUntil=0,this.setStatus("loading_detector");let n=this.deps.createWorkerClient({initTimeoutMs:qt});this.cv=n,n.init(this.opts.opencvUrl,this.opts.workerUrl).then(()=>{t!==this.generation||this.cv!==n||(this.state.status==="loading_detector"&&this.setStatus("streaming"),this.scheduleNext(t,0));},o=>this.detectorUnavailable(t,n,o));}catch(r){throw t===this.generation&&this.emitError(r),r}}stop(){this.generation++,this.release(),this.setStatus("stopped");}async captureNow(){if(this.capturing)return;let t=this.state.status;if(t!=="streaming"&&t!=="loading_detector"&&!(t==="done"&&this.stream))throw new Error(`Cannot capture from status=${this.state.status}`);let r=this.stability.snapshot,n=this.state.lastFrame?.frameSize??null,o=r.quad&&n?this.fullFrameQuad(r.quad,n):null;await this.doCapture(this.generation,o?r.typeHint:null,o);}getState(){return {...this.state}}scheduleNext(t,r){this.timer=setTimeout(()=>{if(this.timer=null,t!==this.generation)return;let n=this.opts.videoElement;typeof n.requestVideoFrameCallback=="function"?this.frameCallback=n.requestVideoFrameCallback(()=>{this.frameCallback=null,this.tick(t);}):this.tick(t);},r);}async tick(t){if(t!==this.generation)return;let r=this.deps.now();try{await this.analyzeFrame(t);}catch(n){t===this.generation&&console.warn("[xid-camera-ocr] analyzeFrame error:",n);}t!==this.generation||!this.cv||this.scheduleNext(t,Math.max(0,1e3/Nt-(this.deps.now()-r)));}async analyzeFrame(t){let r=this.cv;if(this.capturing||!r?.isReady())return;let n=this.deps.sampleFrame(this.opts.videoElement,Qt);if(!n)return;let o={width:n.width,height:n.height};this.warmupUntil===0&&(this.warmupUntil=this.deps.now()+Ge);let i=this.prior&&this.prior.width===n.width&&this.prior.height===n.height?this.prior.quad:null,s=r.analyze(n,i?{prior:i}:{});this.inFlight=s;let a;try{a=await s;}catch(u){if(t===this.generation&&this.cv===r&&!r.isReady()){this.detectorUnavailable(t,r,u);return}throw u}finally{this.inFlight===s&&(this.inFlight=null);}if(t!==this.generation||this.capturing)return;this.prior=a.detected&&a.corners?{quad:Ke(a.corners),...o}:null;let c=!(this.deps.now()<this.warmupUntil)&&a.detected&&a.corners&&a.documentType?{quad:a.corners,typeHint:a.documentType}:null,d=this.stability.update(c,o);this.weakRun=d.stableFrames<=1?c!==null&&Ye(a):this.weakRun||Ye(a);let p=this.opts.stableFramesRequired+(this.weakRun?Bt:0);if(await this.updateTorch(t,a),t!==this.generation)return;let m={detected:a.detected,documentType:a.documentType,confidence:Math.min(d.stableFrames/p,1),aspectRatio:a.aspectRatio,quality:a.quality,corners:a.corners?Ke(a.corners):null,frameSize:o,hint:we({detected:a.detected,quality:a.quality,stableFrames:d.stableFrames,stableFramesRequired:p}),...this.torchSupported?{torch:this.torchOn}:{}};if(this.state.lastFrame=m,this.opts.onFrameAnalyzed?.(m),t===this.generation&&this.opts.autoCapture&&!this.autoShutterSpent&&d.quad&&d.stableFrames>=p&&a.quality?.ok){let u=this.fullFrameQuad(d.quad,o);if(!u){this.stability.reset(),this.weakRun=false;return}await this.doCapture(t,d.typeHint,u);}}detectorUnavailable(t,r,n){if(t!==this.generation||this.cv!==r)return;r.terminate(),this.cv=null,this.inFlight=null,this.prior=null,this.stability.reset(),this.weakRun=false,this.autoShutterSpent=true,this.state.status==="loading_detector"&&this.setStatus("streaming");let o=$e(n);this.state.lastError=o;let i={detected:false,documentType:null,confidence:0,aspectRatio:null,quality:null,corners:null,frameSize:null,hint:"detector_unavailable",...this.torchSupported?{torch:this.torchOn}:{}};this.state.lastFrame=i,this.opts.onFrameAnalyzed?.(i),t===this.generation&&this.opts.onError?.(o);}async updateTorch(t,r){if(!this.track||this.torchRejected||!je({torchSupported:this.torchSupported,torchOn:this.torchOn,quality:r.quality,frameBrightness:r.frameBrightness}))return;let n=await this.deps.setTorch(this.track,true);t===this.generation&&(this.torchOn=n,n||(this.torchRejected=true));}fullFrameQuad(t,r){let n=this.opts.videoElement;return !n.videoWidth||!n.videoHeight?null:ze(t,r,{width:n.videoWidth,height:n.videoHeight})}async doCapture(t,r,n){if(!this.capturing){this.capturing=true,this.autoShutterSpent=true,this.prior=null,this.stability.reset(),this.weakRun=false,this.setStatus("capturing");try{let{blob:o,type:i}=await this.captureBlob(t,r,n);if(t!==this.generation)return;this.opts.onCaptured?.(o,i),this.setStatus("uploading");let s=await this.opts.onUpload(o,i);if(t!==this.generation)return;this.state.lastResult=s,this.setStatus("done"),this.opts.onResult?.(s);}catch(o){t===this.generation&&this.emitError(o);}finally{t===this.generation&&(this.stability.reset(),this.weakRun=false,this.warmupUntil=this.deps.now()+Ge,this.capturing=false);}}}async captureBlob(t,r,n){let o=this.opts.videoElement,i=async()=>({blob:await this.deps.snapshotToBlob(o,this.opts.captureQuality),type:null}),s=this.cv;if(!s?.isReady()||!n)return i();try{await this.inFlight?.catch(()=>{});let a=this.deps.grabFrame(o);if(!a||!s.isReady())return i();let l=this.opts.captureResolution==="high"?qe:V,c=await s.warp(a,n,r,l);return {blob:await this.deps.encodeJpeg(c,this.opts.captureQuality),type:r}}catch(a){if(t!==this.generation)throw a;return console.warn("[xid-camera-ocr] warp failed, using plain snapshot:",a),i()}}release(){this.prior=null,this.timer!==null&&clearTimeout(this.timer),this.timer=null,this.frameCallback!==null&&(this.opts.videoElement.cancelVideoFrameCallback?.(this.frameCallback),this.frameCallback=null),this.track&&this.torchOn&&this.deps.setTorch(this.track,false),this.torchOn=false,this.torchRejected=false,this.stream&&this.deps.detachCamera(this.opts.videoElement,this.stream),this.stream=null,this.track=null,this.cv?.terminate(),this.cv=null,this.inFlight=null,this.stability.reset(),this.weakRun=false,this.capturing=false,this.autoShutterSpent=false;}setStatus(t){this.state.status=t;}emitError(t){let r=$e(t);this.state.lastError=r,this.setStatus("error"),this.opts.onError?.(r);}};var Je=.08,Wt=.95,jt=.02,q=8,zt=2,Ze=8,et=.33,se=2,Vt=2,Gt=1,Yt=Vt+se,$t=2,Kt=2*(se+1),Jt=10,tt=1.1,at=se+1,Zt=6,it=.92,er=1/it,tr=.85,rr=2,nr=.05,rt=2,nt=64;function st(e){return {detected:false,documentType:null,aspectRatio:null,corners:null,boundingBox:null,quality:null,frameBrightness:e,score:null}}function or(e,t,r,n={}){let o={brightness:0};try{return ar(e,t,o,n.prior??null)}catch(i){return console.warn("[xid-camera-ocr] detectDocumentCV failed:",i),st(o.brightness)}}function ar(e,t,r,n){let{width:o,height:i}=t,s=[],a=l=>(s.push(l),l);try{let l=a(e.matFromImageData(t)),c=a(new e.Mat),d=a(new e.Mat),p={equalized:a(new e.Mat),filtered:a(new e.Mat),padded:a(new e.Mat),edges:a(new e.Mat),dilated:a(new e.Mat),kernel:a(e.Mat.ones(3,3,e.CV_8U)),contours:a(new e.MatVector),hierarchy:a(new e.Mat),hull:a(new e.Mat),approx:a(new e.Mat),clahe:a(new e.CLAHE(zt,new e.Size(Ze,Ze)))};e.cvtColor(l,c,e.COLOR_RGBA2GRAY),r.brightness=We(ve(c,o,i));let m=[],u=ot(e,c,p,o,i,m,n),x=!1,S=Math.round(o/rt),y=Math.round(i/rt);if(!u&&S>=nt&&y>=nt&&(e.resize(c,d,new e.Size(S,y),0,0,e.INTER_AREA),u=ot(e,d,p,o,i,m,n),x=u!==null),u&&dr(u,m,ve(c,o,i))&&(u=null),!u)return st(r.brightness);let g=x?"lowres":u.reduced?"reduced":"direct",h=u.quad.map(R=>R.x),f=u.quad.map(R=>R.y),k=Math.min(...h),M=Math.max(...h),_=Math.min(...f),E=Math.max(...f);return {detected:!0,documentType:ae(u.aspect),aspectRatio:u.aspect,corners:u.quad,boundingBox:{x:k/o,y:_/i,width:(M-k)/o,height:(E-_)/i},quality:Ce(ve(c,o,i),ut(u.quad,at*u.scale)),frameBrightness:r.brightness,score:g==="direct"?u.score:u.score*tr,provenance:g}}finally{for(let l of s)l.delete();}}function ot(e,t,r,n,o,i,s){let a=t.cols,l=t.rows,c=n/a,d=o/l,p=a*l,m=h=>({x:h.x*c,y:h.y*d}),{hull:u,approx:x,contours:S}=r;r.clahe.apply(t,r.equalized),e.bilateralFilter(r.equalized,r.filtered,9,75,75,e.BORDER_DEFAULT),e.copyMakeBorder(r.filtered,r.padded,q,q,q,q,e.BORDER_CONSTANT,new e.Scalar(0));let y=yr(r.padded.data);e.Canny(r.padded,r.edges,Math.max(10,(1-et)*y),Math.min(255,(1+et)*y)),e.dilate(r.edges,r.dilated,r.kernel,new e.Point(-1,-1),se),e.findContours(r.dilated,S,r.hierarchy,e.RETR_LIST,e.CHAIN_APPROX_SIMPLE);let g=null;for(let h=0;h<S.size();h++){let f=S.get(h);try{let k=e.boundingRect(f);if(k.width*k.height<p*Je)continue;e.convexHull(f,u,!1,!0);let M=e.contourArea(u);if(M<p*Je||M>p*Wt||(e.approxPolyDP(u,x,jt*e.arcLength(u,!0),!0),x.rows<4||x.rows>Zt||!e.isContourConvex(x)))continue;let _=x.rows!==4,E;if(!_)E=sr(x,a,l);else {let W=lr(lt(x));if(!W)continue;E=W.map(Q=>ct(Q,a,l));let U=M/L(E);if(!(U>=it&&U<=er))continue}let R=M*c*d,v=E.map(m),F=Yt*c;if(hr(v,n,o,F)>Gt){ur(v,n,o,F)||i.push({pts:v,area:R});continue}let P=xe(v);if(!oe(P))continue;let w=e.minAreaRect(_?u:x),O=w.size.width*w.size.height,ee=O>0?Math.min(1,M/O):0,B=z(P);if(!Se(B))continue;let X=Qe({areaRatio:M/p,rectangularity:ee,aspect:B}),te=s?X-ir(P,s,n,o):X;(!g||te>g.rank)&&(g={quad:P,score:X,rank:te,aspect:B,area:R,scale:c,reduced:_});}finally{f.delete();}}return g}function ir(e,t,r,n){let o=1/0;for(let i=0;i<4;i++){let s=0;for(let a=0;a<4;a++){let l=e[(a+i)%4];s=Math.max(s,Math.hypot(l.x-t[a].x,l.y-t[a].y));}o=Math.min(o,s);}return rr*Math.min(o/Math.hypot(r,n),nr)}function ve(e,t,r){return {data:e.data,width:t,height:r}}function lt(e){let t=e.data32S,r=[];for(let n=0;n<e.rows;n++)r.push({x:t[n*2]-q,y:t[n*2+1]-q});return r}function ct(e,t,r){return {x:Math.min(t,Math.max(0,e.x)),y:Math.min(r,Math.max(0,e.y))}}function sr(e,t,r){return lt(e).map(n=>ct(n,t,r))}function lr(e){let t=e;for(;t.length>4;){let r=t.length,n=-1,o=1/0,i=null;for(let a=0;a<r;a++){let l=t[(a+r-1)%r],c=t[a],d=t[(a+1)%r],p=t[(a+2)%r],m=cr(l,c,p,d);if(!m)continue;let u=Math.abs((m.x-c.x)*(d.y-c.y)-(m.y-c.y)*(d.x-c.x))/2;u<o&&(o=u,n=a,i=m);}if(n<0||!i)return null;let s=[];for(let a=0;a<r;a++)a===n?s.push(i):a!==(n+1)%r&&s.push(t[a]);t=s;}return t}function cr(e,t,r,n){let o=t.x-e.x,i=t.y-e.y,s=n.x-r.x,a=n.y-r.y,l=o*a-i*s;if(Math.abs(l)<1e-9)return null;let c=((r.x-e.x)*a-(r.y-e.y)*s)/l,d=((r.x-e.x)*i-(r.y-e.y)*o)/l;return c<1||d<1?null:{x:e.x+c*o,y:e.y+c*i}}function ur(e,t,r,n){let o=e.map(s=>s.x),i=e.map(s=>s.y);return Math.min(...o)<=n&&Math.max(...o)>=t-n||Math.min(...i)<=n&&Math.max(...i)>=r-n}function dr(e,t,r){let n=Kt*e.scale;if(!t.some(a=>a.area>=$t*e.area&&e.quad.every(l=>mr(a.pts,l,n))))return false;if(ae(e.aspect)==="OTHER")return true;let{inner:i,ring:s}=pr(r,ut(e.quad,at*e.scale),e.quad);return i<s-Jt}function pr(e,t,r){let{data:n,width:o,height:i}=e,s=(r[0].x+r[1].x+r[2].x+r[3].x)/4,a=(r[0].y+r[1].y+r[2].y+r[3].y)/4,l=r.map(y=>({x:s+(y.x-s)*tt,y:a+(y.y-a)*tt})),c=G(l,o,i),d=G(r,o,i),p=G(t,o,i),m=0,u=0,x=0,S=0;for(let y=0;y<i;y++){let g=c[y*2],h=c[y*2+1];if(g>=h)continue;let f=d[y*2],k=d[y*2+1],M=p[y*2],_=p[y*2+1],E=y*o;for(let R=g;R<h;R++){let v=n[E+R];R>=M&&R<_?(m+=v,u++):(R<f||R>=k)&&(x+=v,S++);}}return {inner:u>0?m/u:0,ring:S>0?x/S:0}}function mr(e,t,r){let n=0;for(let i=0;i<e.length;i++){let s=e[i],a=e[(i+1)%e.length];n+=s.x*a.y-a.x*s.y;}let o=Math.sign(n);if(o===0)return false;for(let i=0;i<e.length;i++){let s=e[i],a=e[(i+1)%e.length],l=Math.hypot(a.x-s.x,a.y-s.y);if(l===0)continue;if(o*((a.x-s.x)*(t.y-s.y)-(a.y-s.y)*(t.x-s.x))/l<r)return false}return true}function ut(e,t){return e.map((r,n)=>{let o=e[(n+3)%4],i=e[(n+1)%4],s=o.x-r.x,a=o.y-r.y,l=i.x-r.x,c=i.y-r.y,d=Math.hypot(s,a),p=Math.hypot(l,c),m=s/d+l/p,u=a/d+c/p,x=Math.hypot(m,u),S=Math.sin(Math.acos(Math.min(1,Math.max(-1,(s*l+a*c)/(d*p))))/2),y=t/S/x;return {x:r.x+m*y,y:r.y+u*y}})}function hr(e,t,r,n){let o=0;for(let i of e)(i.x<=n||i.x>=t-n||i.y<=n||i.y>=r-n)&&o++;return o}function yr(e){let t=new Uint32Array(256);for(let n=0;n<e.length;n++)t[e[n]]++;let r=0;for(let n=0;n<256;n++)if(r+=t[n],r>=e.length/2)return n;return 128}function Me(e){let t=react.useRef(null),r=react.useRef(null),[n,o]=react.useState("idle"),[i,s]=react.useState(null),[a,l]=react.useState(null),[c,d]=react.useState(null),p=react.useRef(e);p.current=e;let m=react.useCallback(()=>{if(r.current)return r.current;if(!t.current)throw new Error("videoRef not attached yet");let g=new K({videoElement:t.current,documentTypes:p.current.documentTypes,autoCapture:p.current.autoCapture,stableFramesRequired:p.current.stableFramesRequired,captureQuality:p.current.captureQuality,captureResolution:p.current.captureResolution,opencvUrl:p.current.opencvUrl,workerUrl:p.current.workerUrl,onUpload:(h,f)=>p.current.onUpload(h,f),onFrameAnalyzed:h=>{s(h),r.current===g&&o(g.getState().status),p.current.onFrameAnalyzed?.(h);},onCaptured:(h,f)=>{o("capturing"),p.current.onCaptured?.(h,f);},onResult:h=>{l(h),o("done"),p.current.onResult?.(h);},onError:h=>{d(h),r.current===g&&o(g.getState().status),p.current.onError?.(h);}});return r.current=g,g},[]),u=react.useCallback(async()=>{let g=m();await g.start(),r.current===g&&o(g.getState().status);},[m]),x=react.useCallback(()=>{r.current?.stop(),o("stopped");},[]),S=react.useCallback(async()=>{await r.current?.captureNow();},[]),y=react.useCallback(async()=>{x(),l(null),d(null),s(null),await u();},[x,u]);return react.useEffect(()=>(e.autoStart!==false&&t.current&&u().catch(()=>{}),()=>{r.current?.stop(),r.current=null;}),[]),{videoRef:t,status:n,frame:i,result:a,error:c,start:u,stop:x,captureNow:S,retake:y}}function gr({status:e,showTips:t,dismissed:r,completedOnce:n}){return t&&!r&&(e==="error"||!n&&(e==="starting"||e==="loading_detector"))}function dt(e,t){let[r,n]=react.useState(false),[o,i]=react.useState(e==="done"),[s,a]=react.useState(e),l=r,c=o;s!==e&&(a(e),e==="error"&&(l=false,n(false)),e==="done"&&(c=true,i(true)));let d=react.useCallback(()=>n(true),[]);return {visible:gr({status:e,showTips:t,dismissed:l,completedOnce:c}),dismiss:d}}var ce={accent:{name:"--xco-accent",fallback:"#22c55e"},warning:{name:"--xco-warning",fallback:"#eab308"},danger:{name:"--xco-danger",fallback:"#ef4444"},background:{name:"--xco-background",fallback:"#000"},mask:{name:"--xco-mask",fallback:"rgba(0,0,0,0.4)"},hintBg:{name:"--xco-hint-bg",fallback:"rgba(0,0,0,0.7)"},hintFg:{name:"--xco-hint-fg",fallback:"white"},buttonBg:{name:"--xco-button-bg",fallback:"rgba(255,255,255,0.92)"},buttonFg:{name:"--xco-button-fg",fallback:"#111"},shutter:{name:"--xco-shutter",fallback:"rgba(255,255,255,0.9)"},overlayBg:{name:"--xco-overlay-bg",fallback:"rgba(0,0,0,0.78)"},overlayFg:{name:"--xco-overlay-fg",fallback:"white"},fontFamily:{name:"--xco-font-family",fallback:"system-ui, -apple-system, sans-serif"},radius:{name:"--xco-radius",fallback:"12px"}};function b(e){let{name:t,fallback:r}=ce[e];return `var(${t}, ${r})`}function pt(e){let t={};if(!e)return t;for(let r of Object.keys(e)){if(!Object.prototype.hasOwnProperty.call(ce,r))continue;let n=e[r];typeof n!="string"||n===""||(t[ce[r].name]=n);}return t}function mt(e,t){return e==="done"?b("accent"):e==="error"?b("danger"):e==="uploading"||e==="capturing"?b("accent"):t?.detected?t.confidence>=1?b("accent"):b("warning"):b("danger")}var _e={width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",style:{flex:"0 0 auto"}},xr=()=>jsxRuntime.jsxs("svg",{..._e,children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.jsx("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"})]}),Sr=()=>jsxRuntime.jsxs("svg",{..._e,children:[jsxRuntime.jsx("rect",{x:"3",y:"5",width:"18",height:"14",rx:"2"}),jsxRuntime.jsx("path",{d:"M14 5l-6 14M18 5l-6 14"})]}),Cr=()=>jsxRuntime.jsxs("svg",{..._e,children:[jsxRuntime.jsx("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"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"2"})]});function ht({texts:e,onDismiss:t}){let r=[{Icon:xr,text:e.tip_light},{Icon:Sr,text:e.tip_glare},{Icon:Cr,text:e.tip_focus}];return jsxRuntime.jsxs("div",{className:"xco-tips",style:wr,children:[jsxRuntime.jsx("ul",{style:Rr,children:r.map(({Icon:n,text:o})=>jsxRuntime.jsxs("li",{style:Tr,children:[jsxRuntime.jsx(n,{}),jsxRuntime.jsx("span",{children:o})]},o))}),jsxRuntime.jsx("button",{type:"button",className:"xco-tips-dismiss",onClick:t,style:vr,children:e.tips_dismiss})]})}var wr={position:"absolute",top:"calc(16px + env(safe-area-inset-top, 0px))",left:"50%",transform:"translateX(-50%)",boxSizing:"border-box",width:"calc(100% - 32px)",maxWidth:360,padding:16,background:b("overlayBg"),color:b("overlayFg"),borderRadius:b("radius"),fontFamily:b("fontFamily"),fontSize:15,lineHeight:1.35,display:"flex",flexDirection:"column",gap:12,pointerEvents:"auto",zIndex:5},Rr={listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},Tr={display:"flex",alignItems:"center",gap:12},vr={alignSelf:"flex-end",minHeight:44,padding:"10px 20px",borderRadius:b("radius"),background:b("buttonBg"),color:b("buttonFg"),border:"none",fontFamily:b("fontFamily"),fontSize:15,fontWeight:600,cursor:"pointer",WebkitTapHighlightColor:"transparent"};var Fr=typeof window>"u"?react.useEffect:react.useLayoutEffect;function yt({videoRef:e,status:t,frame:r,texts:n,documentTypes:o,theme:i,className:s,style:a,hideStatusOverlay:l,tipsVisible:c,onCapture:d,onRetake:p,onStart:m,onDismissTips:u}){let x=t==="streaming"||t==="loading_detector",S=t==="done"||t==="error",y=t==="idle"||t==="stopped",g=t==="capturing"||t==="uploading",h="xco-doc-mask-"+react.useId().replace(/[^A-Za-z0-9_-]/g,""),f=react.useRef(null),[k,M]=react.useState({width:0,height:0}),_=r?.documentType,E=_==="PASSPORT_MX"?H:_==="INE"?D:o[0]==="PASSPORT_MX"?H:D;Fr(()=>{let w=f.current;if(!w)return;let O=()=>{let B=w.clientWidth,X=w.clientHeight,te=B*.85,W=X*.7,U=te,Q=U/E;Q>W&&(Q=W,U=Q*E),M({width:U,height:Q});};O();let ee=new ResizeObserver(O);return ee.observe(w),()=>ee.disconnect()},[E]);let R=!!(r?.corners&&r?.frameSize),v=mt(t,r),F=ie(t,r?.hint,n),P=s?`xid-camera-ocr ${s}`:"xid-camera-ocr";return jsxRuntime.jsxs("div",{ref:f,className:P,"data-status":t,"data-hint":r?.hint??"",style:{...Pr,...pt(i),...a},children:[jsxRuntime.jsx("style",{children:"@keyframes xco-spin { to { transform: rotate(360deg); } }"}),jsxRuntime.jsx("video",{ref:e,playsInline:true,muted:true,autoPlay:true,style:Ir}),!l&&!R&&jsxRuntime.jsx("div",{style:Or,children:jsxRuntime.jsx("div",{className:"xco-guide",style:{...Hr,width:k.width,height:k.height,borderColor:v}})}),!l&&R&&r&&r.corners&&r.frameSize&&jsxRuntime.jsxs("svg",{style:Dr,viewBox:`0 0 ${r.frameSize.width} ${r.frameSize.height}`,preserveAspectRatio:"xMidYMid slice",children:[jsxRuntime.jsx("defs",{children:jsxRuntime.jsxs("mask",{id:h,children:[jsxRuntime.jsx("rect",{x:"0",y:"0",width:r.frameSize.width,height:r.frameSize.height,fill:"white"}),jsxRuntime.jsx("polygon",{points:r.corners.map(w=>`${w.x},${w.y}`).join(" "),fill:"black"})]})}),jsxRuntime.jsx("rect",{x:"0",y:"0",width:r.frameSize.width,height:r.frameSize.height,style:{fill:b("mask")},mask:`url(#${h})`}),jsxRuntime.jsx("polygon",{points:r.corners.map(w=>`${w.x},${w.y}`).join(" "),style:{fill:"none",stroke:v},strokeWidth:Math.max(2,r.frameSize.width*.006),strokeLinejoin:"round"}),r.corners.map((w,O)=>jsxRuntime.jsx("circle",{cx:w.x,cy:w.y,r:Math.max(4,r.frameSize.width*.012),style:{fill:v}},O))]}),!l&&(y?jsxRuntime.jsx("button",{type:"button",className:"xco-hint",onClick:m,style:Xr,children:F}):jsxRuntime.jsx("p",{className:"xco-hint",style:bt,role:"status","aria-live":"polite",children:F})),!l&&x&&jsxRuntime.jsx("button",{type:"button",className:"xco-shutter",onClick:d,"aria-label":n.capture,style:Nr,children:jsxRuntime.jsx("span",{style:qr})}),!l&&S&&jsxRuntime.jsx("button",{type:"button",className:"xco-retake",onClick:p,"aria-label":n.retake,style:Br,children:n.retake}),!l&&g&&jsxRuntime.jsxs("div",{className:"xco-loader",style:Lr,"aria-busy":"true","aria-live":"polite",children:[jsxRuntime.jsx("div",{style:Ur}),jsxRuntime.jsx("p",{style:Qr,children:ie(t,void 0,n)})]}),c&&!l&&jsxRuntime.jsx(ht,{texts:n,onDismiss:u})]})}var ft="calc(104px + env(safe-area-inset-bottom, 0px))",Pr={position:"relative",width:"100%",height:"100%",overflow:"hidden",background:b("background"),fontFamily:b("fontFamily"),touchAction:"none"},Ir={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",display:"block"},Dr={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Or={position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none"},Hr={borderRadius:b("radius"),borderWidth:4,borderStyle:"solid",boxShadow:`0 0 0 9999px ${b("mask")}`,transition:"border-color 200ms ease-in-out, width 200ms ease-in-out, height 200ms ease-in-out"},Lr={position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:20,background:b("overlayBg"),backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",pointerEvents:"auto",zIndex:10},Ur={width:56,height:56,borderRadius:"50%",border:"5px solid rgba(255, 255, 255, 0.18)",borderTopColor:b("accent"),animation:"xco-spin 0.85s linear infinite"},Qr={color:b("overlayFg"),fontFamily:b("fontFamily"),fontSize:15,fontWeight:500,margin:0,textAlign:"center",padding:"0 24px"},Nr={position:"absolute",bottom:ft,left:"50%",transform:"translateX(-50%)",width:68,height:68,borderRadius:"50%",background:"rgba(255,255,255,0.18)",border:`4px solid ${b("shutter")}`,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"auto",WebkitTapHighlightColor:"transparent",padding:0},qr={width:52,height:52,borderRadius:"50%",background:"white",display:"block"},Br={position:"absolute",bottom:ft,left:"50%",transform:"translateX(-50%)",minHeight:44,padding:"10px 20px",borderRadius:22,background:b("buttonBg"),color:b("buttonFg"),border:"none",fontFamily:b("fontFamily"),fontSize:15,fontWeight:600,cursor:"pointer",pointerEvents:"auto",WebkitTapHighlightColor:"transparent"},bt={position:"absolute",bottom:"calc(16px + env(safe-area-inset-bottom, 0px))",left:"50%",transform:"translateX(-50%)",boxSizing:"border-box",width:"max-content",maxWidth:"calc(100% - 32px)",background:b("hintBg"),color:b("hintFg"),padding:"10px 16px",borderRadius:b("radius"),fontFamily:b("fontFamily"),fontSize:16,lineHeight:1.35,margin:0,whiteSpace:"normal",textAlign:"center"},Xr={...bt,border:"none",minHeight:44,cursor:"pointer",pointerEvents:"auto",WebkitTapHighlightColor:"transparent"};var jr=["INE","PASSPORT_MX"],Ae=()=>{};function zr({className:e,style:t,hideStatusOverlay:r,texts:n,theme:o,showTips:i,...s}){let{videoRef:a,status:l,frame:c,start:d,captureNow:p,retake:m}=Me(s),u=dt(l,i??true),x=react.useMemo(()=>Te(n),[n]),S=l==="streaming"||l==="loading_detector",y=l==="done"||l==="error",g=()=>{S&&p().catch(Ae);},h=()=>{y&&m().catch(Ae);},f=()=>{d().catch(Ae);};return jsxRuntime.jsx(yt,{videoRef:a,status:l,frame:c,texts:x,documentTypes:s.documentTypes??jr,theme:o,className:e,style:t,hideStatusOverlay:r,tipsVisible:u.visible,onCapture:g,onRetake:h,onStart:f,onDismissTips:u.dismiss})}exports.CVWorkerClient=j;exports.DEFAULT_TEXTS_EN=Pt;exports.DEFAULT_TEXTS_ES=Re;exports.ID1_RATIO=D;exports.QUALITY_THRESHOLDS=A;exports.StabilityTracker=$;exports.TD3_RATIO=H;exports.XCO_VARS=ce;exports.XidCameraOcr=zr;exports.XidCameraOcrSession=K;exports.attachCamera=de;exports.copyFor=ie;exports.decideHint=we;exports.defaultOpencvUrl=be;exports.detachCamera=pe;exports.detectDocumentCV=or;exports.isCapturableAspect=Se;exports.measureQuality=Ce;exports.orderCorners=xe;exports.rectifiedAspect=z;exports.resolveTexts=Te;exports.sampleFrame=he;exports.setTorch=fe;exports.snapshotToBlob=me;exports.supportsTorch=ye;exports.typeHintFromAspect=ae;exports.useXidCameraOcr=Me;exports.warpDocument=Xe;exports.warpDocumentImageData=Be;exports.warpedSnapshotToBlob=Et;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');var xt=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,C=xt();async function ce(e,t){let r={audio:false,video:{facingMode:{ideal:"environment"},width:{ideal:1920,min:640},height:{ideal:1080,min:480},aspectRatio:{ideal:1.7777777777777777}}};if(typeof navigator>"u"||!navigator.mediaDevices?.getUserMedia)throw new Error("Camera unavailable: getUserMedia requires a secure context (HTTPS or localhost) and a browser with MediaDevices support.");let n;try{n=await navigator.mediaDevices.getUserMedia(t??r);}catch(s){if(!t)n=await navigator.mediaDevices.getUserMedia({audio:false,video:true});else throw s}e.srcObject=n,e.muted=true,e.playsInline=true,e.autoplay=true;let a=n.getVideoTracks()[0],i=a.getCapabilities?.();return i&&"focusMode"in i&&i.focusMode?.includes("continuous")&&a.applyConstraints({advanced:[{focusMode:"continuous"}]}).catch(()=>{}),await e.play().catch(()=>{}),n}function ue(e,t){e.srcObject===t&&(e.srcObject=null),t?.getTracks().forEach(r=>r.stop());}async function de(e,t=.92){let r=e.videoWidth,n=e.videoHeight;if(!r||!n)throw new Error("Video stream not ready (videoWidth=0)");let a=document.createElement("canvas");a.width=r,a.height=n;let i=a.getContext("2d");if(!i)throw new Error("2D canvas context unavailable");return i.drawImage(e,0,0,r,n),new Promise((s,o)=>{a.toBlob(l=>l?s(l):o(new Error("Canvas toBlob returned null")),"image/jpeg",t);})}var Q=null;function pe(e,t=640){let r=e.videoWidth,n=e.videoHeight;if(!r||!n)return null;let a=Math.round(t),i=Math.round(n*t/r);Q??=document.createElement("canvas"),(Q.width!==a||Q.height!==i)&&(Q.width=a,Q.height=i);let s=Q.getContext("2d",{willReadFrequently:true});return s?(s.drawImage(e,0,0,a,i),s.getImageData(0,0,a,i)):null}function _e(e){let t=e.videoWidth,r=e.videoHeight;if(!t||!r)return null;let n=document.createElement("canvas");n.width=t,n.height=r;let a=n.getContext("2d",{willReadFrequently:true});return a?(a.drawImage(e,0,0,t,r),a.getImageData(0,0,t,r)):null}function Ae(e,t=.92){let r=document.createElement("canvas");r.width=e.width,r.height=e.height;let n=r.getContext("2d");return n?(n.putImageData(e,0,0),new Promise((a,i)=>r.toBlob(s=>s?a(s):i(new Error("Canvas toBlob returned null")),"image/jpeg",t))):Promise.reject(new Error("2D canvas context unavailable"))}function me(e){let t=e.getCapabilities;return typeof t!="function"?false:t.call(e).torch===true}async function he(e,t){try{return await e.applyConstraints({advanced:[{torch:t}]}),!0}catch{return false}}var St="@andresxid/xid_camera_ocr_sdk_react";function Fe(e,t){return e.pathname.endsWith(`/${St}/${t}`)}function Pe(e){return new URL(e,C)}function Oe(){return new URL("@andresxid/xid_camera_ocr_sdk_react/opencv.js",C)}function ye(){let e=Oe();return Fe(e,"opencv.js")?Pe("./opencv.js").href:e.href}function Ie(e){return e!==void 0?new Worker(e,{type:"module"}):Fe(Oe(),"opencv.js")?new Worker(Pe("./cv-worker.js"),{type:"module"}):new Worker(new URL("@andresxid/xid_camera_ocr_sdk_react/cv-worker.js",C),{type:"module"})}function De(e){if(!e||typeof e!="object")return null;let t=e;switch(t.type){case "ready":return {type:"ready"};case "init-error":return typeof t.error=="string"?{type:"init-error",error:t.error}:null;case "error":return typeof t.id=="number"&&typeof t.error=="string"?{type:"error",id:t.id,error:t.error}:null;case "analyze-result":return typeof t.id=="number"&&t.result&&typeof t.result=="object"?{type:"analyze-result",id:t.id,result:t.result}:null;case "warp-result":return typeof t.id=="number"&&typeof t.width=="number"&&typeof t.height=="number"&&t.buffer instanceof ArrayBuffer?{type:"warp-result",id:t.id,width:t.width,height:t.height,buffer:t.buffer}:null;default:return null}}function He(e){let t=new Uint8ClampedArray(e.data.byteLength);return t.set(e.data),t.buffer}var wt=e=>e instanceof Error?e:new Error(String(e)),j=class{initTimeoutMs;worker=null;readyPromise=null;rejectInit=null;initTimer=null;ready=false;pending=new Map;nextId=1;constructor(t={}){this.initTimeoutMs=t.initTimeoutMs??3e4;}init(t=ye(),r){if(this.readyPromise)return this.readyPromise;let n;try{n=Ie(r);}catch(i){return Promise.reject(wt(i))}this.worker=n;let a=new Promise((i,s)=>{this.rejectInit=s,this.initTimer=setTimeout(()=>this.fail(new Error(`OpenCV worker not ready within ${this.initTimeoutMs} ms`)),this.initTimeoutMs),n.addEventListener("message",o=>{if(this.worker!==n)return;let l=De(o.data);if(!l)return;if(l.type==="ready"){this.clearInitTimer(),this.rejectInit=null,this.ready=true,i();return}if(l.type==="init-error"){this.fail(new Error(l.error));return}let c=this.pending.get(l.id);c&&(this.pending.delete(l.id),l.type==="error"?c.reject(new Error(l.error)):c.resolve(l));}),n.addEventListener("error",o=>{this.worker===n&&this.fail(new Error(o.message||"Worker error"));}),n.addEventListener("messageerror",o=>{if(this.worker!==n)return;let l=new Error("Worker message could not be deserialized"),c=o.data?.id,d=typeof c=="number"?this.pending.get(c):void 0;if(typeof c=="number"&&d){this.pending.delete(c),d.reject(l);return}this.fail(l);});});return this.readyPromise=a,n.postMessage({type:"init",opencvUrl:t}),a}isReady(){return this.ready&&this.worker!==null}async analyze(t,r={}){let n=He(t),a=r.prior,i=await this.request(s=>({type:"analyze",id:s,width:t.width,height:t.height,buffer:n,...a?{prior:a}:{}}),[n]);if(i.type!=="analyze-result")throw new Error(`Unexpected worker response: ${i.type}`);return i.result}async warp(t,r,n,a=1024){let i=He(t),s=await this.request(o=>({type:"warp",id:o,width:t.width,height:t.height,buffer:i,corners:r,docType:n,longSide:a}),[i]);if(s.type!=="warp-result")throw new Error(`Unexpected worker response: ${s.type}`);return new ImageData(new Uint8ClampedArray(s.buffer),s.width,s.height)}terminate(){this.rejectInit=null,this.shutdown(new Error("Worker terminated"));}fail(t){let r=this.rejectInit;this.rejectInit=null,this.shutdown(t),r?.(t);}clearInitTimer(){this.initTimer!==null&&clearTimeout(this.initTimer),this.initTimer=null;}shutdown(t){this.clearInitTimer(),this.worker?.terminate(),this.worker=null,this.readyPromise=null,this.ready=false;let r=[...this.pending.values()];this.pending.clear();for(let n of r)n.reject(t);}request(t,r){let n=this.worker;if(!n||!this.ready)return Promise.reject(new Error("CVWorkerClient not ready"));let a=t(this.nextId++),i=new Promise((s,o)=>this.pending.set(a.id,{resolve:s,reject:o}));return n.postMessage(a,r),i}};var I=1.585772508336421,H=125/88,Rt=1.503,Tt=.05,ee=1.25,fe=1.75,vt=.25;function be(e){if(e.length!==4)throw new Error(`orderCorners expects 4 points, got ${e.length}`);let t=(e[0].x+e[1].x+e[2].x+e[3].x)/4,r=(e[0].y+e[1].y+e[2].y+e[3].y)/4,n=[...e].sort((i,s)=>Math.atan2(i.y-r,i.x-t)-Math.atan2(s.y-r,s.x-t)),a=0;for(let i=1;i<4;i++){let s=n[i],o=n[a];(s.x+s.y<o.x+o.y||s.x+s.y===o.x+o.y&&s.y<o.y)&&(a=i);}return [0,1,2,3].map(i=>n[(a+i)%4])}function L(e){let t=0;for(let r=0;r<e.length;r++){let n=e[r],a=e[(r+1)%e.length];t+=n.x*a.y-a.x*n.y;}return Math.abs(t)/2}function te(e){let[t,r,n,a]=e;return {top:Math.hypot(r.x-t.x,r.y-t.y),right:Math.hypot(n.x-r.x,n.y-r.y),bottom:Math.hypot(n.x-a.x,n.y-a.y),left:Math.hypot(a.x-t.x,a.y-t.y)}}function kt(e){let t=[0,0,0,0];for(let r=0;r<4;r++){let n=e[(r+3)%4],a=e[r],i=e[(r+1)%4],s=n.x-a.x,o=n.y-a.y,l=i.x-a.x,c=i.y-a.y,d=Math.hypot(s,o),p=Math.hypot(l,c);if(d===0||p===0){t[r]=0;continue}let m=Math.min(1,Math.max(-1,(s*l+o*c)/(d*p)));t[r]=Math.acos(m)*180/Math.PI;}return t}function re(e,t=70,r=110){let n=te(e);return n.top<=0||n.right<=0||n.bottom<=0||n.left<=0||!Et(e)||L(e)<=0?false:kt(e).every(a=>a>=t&&a<=r)}function Et(e){let t=0;for(let r=0;r<4;r++){let n=e[r],a=e[(r+1)%4],i=e[(r+2)%4],s=(a.x-n.x)*(i.y-a.y)-(a.y-n.y)*(i.x-a.x);if(s===0)return false;let o=Math.sign(s);if(t===0)t=o;else if(o!==t)return false}return true}function z(e){let t=te(e),r=(t.top+t.bottom)/2,n=(t.left+t.right)/2,a=Math.min(r,n);return a<=0?0:Math.max(r,n)/a}function Mt(e){if(!Number.isFinite(e))return 0;let t=Math.min(Math.abs(e-I),Math.abs(e-H));return Math.max(0,1-t/vt)}function Le(e){return .5*e.areaRatio+.3*e.rectangularity+.2*Mt(e.aspect)}function ne(e){let t=e>=Rt?I:H;return Math.abs(e-t)/t<=Tt?t===I?"INE":"PASSPORT_MX":"OTHER"}function ge(e){return e>=ee&&e<=fe}function Ue(e,t){return e==="INE"?I:e==="PASSPORT_MX"?H:t}var V=1024,Qe=1600;function qe(e,t,r,n,a=V){let i=At(Ue(n,z(r))),s=Math.max(1,Math.round(a/i)),o=te(r),l=o.top+o.bottom<o.left+o.right,c=n==="INE"||n==="PASSPORT_MX",d=l&&c?[r[3],r[0],r[1],r[2]]:r,p=!l||c,m=p?a:s,u=p?s:a,x=null,S=null,y=null,b=null,h=null,f=null;try{return x=e.matFromImageData(t),S=new e.Mat,y=e.matFromArray(4,1,e.CV_32FC2,[d[0].x,d[0].y,d[1].x,d[1].y,d[2].x,d[2].y,d[3].x,d[3].y]),b=e.matFromArray(4,1,e.CV_32FC2,[0,0,m,0,m,u,0,u]),h=e.getPerspectiveTransform(y,b),e.warpPerspective(x,S,h,new e.Size(m,u),e.INTER_LINEAR,e.BORDER_CONSTANT,new e.Scalar(0,0,0,255)),S.channels()!==4&&(f=new e.Mat,e.cvtColor(S,f,e.COLOR_BGR2RGBA)),Ft(new Uint8ClampedArray((f??S).data),m,u)}finally{for(let T of [f,h,b,y,S,x])T?.delete();}}function Ne(e,t,r,n,a=V){let i=t.getContext("2d",{willReadFrequently:true});if(!i)throw new Error("2D canvas context unavailable");let s=i.getImageData(0,0,t.width,t.height),o=qe(e,s,r,n,a),l=document.createElement("canvas");l.width=o.width,l.height=o.height;let c=l.getContext("2d");if(!c)throw new Error("2D canvas context unavailable (output)");return c.putImageData(o,0,0),l}async function _t(e,t,r,n,a=.92,i=V){let s=r?Ne(e,t,r,n,i):t;return new Promise((o,l)=>{s.toBlob(c=>c?o(c):l(new Error("Canvas toBlob returned null")),"image/jpeg",a);})}function At(e){return Number.isFinite(e)?Math.min(fe,Math.max(ee,e)):ee}function Ft(e,t,r){return typeof globalThis.ImageData=="function"?new ImageData(e,t,r):{data:e,width:t,height:r,colorSpace:"srgb"}}var M={brightnessMin:.18,brightnessMax:.9,blurMin:60,glareMax:.04,fillMin:.25,glarePixel:248};function G(e,t,r){let n=new Int32Array(r*2);for(let a=0;a<r;a++){let i=a+.5,s=1/0,o=-1/0;for(let l=0;l<4;l++){let c=e[l],d=e[(l+1)%4],p=Math.min(c.y,d.y),m=Math.max(c.y,d.y);if(i<p||i>m||m===p)continue;let u=c.x+(i-c.y)*(d.x-c.x)/(d.y-c.y);u<s&&(s=u),u>o&&(o=u);}if(s===1/0){n[a*2]=0,n[a*2+1]=0;continue}n[a*2]=Math.max(0,Math.ceil(s-.5)),n[a*2+1]=Math.min(t,Math.floor(o+.5));}return n}function xe(e,t){let{data:r,width:n,height:a}=e,i=G(t,n,a),s=M.glarePixel,o=0,l=0,c=0,d=0,p=0,m=0;for(let f=0;f<a;f++){let T=i[f*2],R=i[f*2+1];if(T>=R)continue;let k=0,v=0;f>0&&f<a-1&&(k=Math.max(T,i[(f-1)*2],i[(f+1)*2])+1,v=Math.min(R,i[(f-1)*2+1],i[(f+1)*2+1])-1);let w=f*n;for(let E=T;E<R;E++){let F=w+E,_=r[F];if(o+=_,_>=s&&l++,c++,E>=k&&E<v){let O=4*_-r[F-n]-r[F+n]-r[F-1]-r[F+1];d+=O,p+=O*O,m++;}}}let u=c>0?o/c/255:0,x=c>0?l/c:0,S=m>0?Math.max(0,p/m-(d/m)**2):0,y=n*a,b=y>0?L(t)/y:0,h=u>=M.brightnessMin&&u<=M.brightnessMax&&S>=M.blurMin&&x<=M.glareMax&&b>=M.fillMin;return {brightness:u,blurScore:S,glareRatio:x,docFillRatio:b,ok:h}}function Xe(e){let{data:t}=e;if(t.length===0)return 0;let r=0;for(let n=0;n<t.length;n++)r+=t[n];return r/t.length/255}function Se(e){if(!e.detected||!e.quality)return "no_document";let t=e.quality;return !Number.isFinite(t.docFillRatio)||t.docFillRatio<M.fillMin?"too_small":!Number.isFinite(t.brightness)||t.brightness<M.brightnessMin?"too_dark":!Number.isFinite(t.glareRatio)||t.glareRatio>M.glareMax||t.brightness>M.brightnessMax?"glare":!Number.isFinite(t.blurScore)||t.blurScore<M.blurMin?"blurry":e.stableFrames<e.stableFramesRequired?"hold_still":"ready"}var Pt=M.brightnessMin;function Be(e){return !e.torchSupported||e.torchOn?false:(e.quality?e.quality.brightness:e.frameBrightness)<Pt}var Ce=Object.freeze({idle:"Toca para activar la c\xE1mara",starting:"Abriendo la c\xE1mara\u2026",loading_detector:"Preparando la c\xE1mara\u2026",no_document:"Coloca tu identificaci\xF3n dentro del recuadro",too_small:"Acerca m\xE1s tu identificaci\xF3n",too_dark:"Hay poca luz, busca un lugar m\xE1s iluminado",glare:"Hay un reflejo, inclina un poco tu identificaci\xF3n",blurry:"Espera a que la c\xE1mara enfoque",hold_still:"Mant\xE9n la c\xE1mara quieta",ready:"\xA1Perfecto! Toma la foto",capturing:"Tomando la foto\u2026",uploading:"Revisando tu identificaci\xF3n\u2026",done:"\xA1Listo!",error:"Algo sali\xF3 mal, int\xE9ntalo de nuevo",detector_unavailable:"Toma la foto con el bot\xF3n",retake:"Tomar otra vez",capture:"Tomar foto",tip_light:"Busca un lugar con buena luz",tip_glare:"Evita reflejos: no apuntes una l\xE1mpara directo a tu identificaci\xF3n",tip_focus:"Espera a que la c\xE1mara enfoque y luego toca el bot\xF3n",tips_dismiss:"Entendido"}),Ot=Object.freeze({idle:"Ready to start",starting:"Starting camera\u2026",loading_detector:"Loading detector\u2026",no_document:"Place the document inside the frame",too_small:"Move closer to the document",too_dark:"Find more light",glare:"Tilt the document to avoid glare",blurry:"Hold still to focus",hold_still:"Hold the camera steady",ready:"Perfect! Take the photo",capturing:"Capturing\u2026",uploading:"Processing document\u2026",done:"Done",error:"Something went wrong \u2014 try again",detector_unavailable:"Detector unavailable \u2014 capture manually",retake:"Capture again",capture:"Capture now",tip_light:"Find a well-lit place",tip_glare:"Avoid glare: don't point a lamp straight at your ID",tip_focus:"Wait for the camera to focus, then tap the button",tips_dismiss:"Got it"}),It=["loading_detector","capturing","uploading","done","error"];function Dt(e){return It.includes(e)}function Y(e,t){return t?.[e]??Ce[e]}function we(e){let t={...Ce};for(let r of Object.keys(t))t[r]=Y(r,e);return t}function ae(e,t,r){return e==="idle"||e==="stopped"?Y("idle",r):e==="starting"?Y("starting",r):Dt(e)?Y(e,r):Y(t??"no_document",r)}var Ht=.05;function Lt(e,t,r){let n=r.width/t.width,a=r.height/t.height;return e.map(i=>({x:i.x*n,y:i.y*a}))}function Ut(e,t){return e.map(r=>({x:Math.min(t.width,Math.max(0,r.x)),y:Math.min(t.height,Math.max(0,r.y))}))}function We(e,t,r){let n=Ut(Lt(e,t,r),r);return !re(n)||L(n)<Ht*r.width*r.height?null:n}var je={stableFrames:0,isStable:false,quad:null,typeHint:null},K=class{required;maxRatio;switchFrames;current=je;candidate=null;constructor(t={}){this.required=t.stableFramesRequired??10,this.maxRatio=t.maxDisplacementRatio??.015,this.switchFrames=Math.max(1,t.hintSwitchFrames??3);}get snapshot(){return this.current}reset(){this.current=je,this.candidate=null;}update(t,r){if(!t)return this.reset(),this.current;let n=Math.hypot(r.width,r.height)*this.maxRatio,a=this.current,i=a.quad!==null&&a.quad.every((l,c)=>Math.hypot(t.quad[c].x-l.x,t.quad[c].y-l.y)<=n),s=a.typeHint??t.typeHint,o=i?a.stableFrames+1:1;if(t.typeHint===s)this.candidate=null;else {let l=this.candidate?.typeHint===t.typeHint?this.candidate.frames+1:1;this.candidate={typeHint:t.typeHint,frames:l},l>=this.switchFrames&&(s=t.typeHint,o=1,this.candidate=null);}return this.current={stableFrames:o,isStable:o>=this.required,quad:t.quad,typeHint:s},this.current}};var qt=640,Nt=10,ze=1500,Xt=35e3,Bt=5,Wt={createWorkerClient:e=>new j(e),attachCamera:e=>ce(e),detachCamera:ue,sampleFrame:pe,grabFrame:_e,encodeJpeg:Ae,snapshotToBlob:de,supportsTorch:me,setTorch:he,now:()=>performance.now()},Ve=e=>e.provenance==="reduced"||e.provenance==="lowres",Ge=e=>e instanceof Error?e:new Error(String(e)),Ye=e=>e.map(t=>({x:t.x,y:t.y})),$=class{opts;deps;stream=null;track=null;cv=null;generation=0;timer=null;frameCallback=null;inFlight=null;warmupUntil=0;capturing=false;autoShutterSpent=false;torchSupported=false;torchOn=false;torchRejected=false;weakRun=false;prior=null;stability;state={status:"idle",lastFrame:null,lastResult:null,lastError:null};constructor(t,r={}){this.opts={videoElement:t.videoElement,documentTypes:t.documentTypes??["INE","PASSPORT_MX"],autoCapture:t.autoCapture??false,stableFramesRequired:t.stableFramesRequired??10,captureQuality:t.captureQuality??.92,captureResolution:t.captureResolution??"standard",opencvUrl:t.opencvUrl,workerUrl:t.workerUrl,onUpload:t.onUpload,onFrameAnalyzed:t.onFrameAnalyzed,onCaptured:t.onCaptured,onResult:t.onResult,onError:t.onError},this.deps={...Wt,...r},this.stability=new K({stableFramesRequired:this.opts.stableFramesRequired});}async start(){if(!["idle","stopped","error"].includes(this.state.status))throw new Error(`Cannot start session from status=${this.state.status}`);this.release();let t=++this.generation;this.setStatus("starting"),this.state.lastError=null;try{let r=await this.deps.attachCamera(this.opts.videoElement);if(t!==this.generation){this.deps.detachCamera(this.opts.videoElement,r);return}this.stream=r,this.track=r.getVideoTracks()[0]??null,this.torchSupported=this.track?this.deps.supportsTorch(this.track):!1,this.warmupUntil=0,this.setStatus("loading_detector");let n=this.deps.createWorkerClient({initTimeoutMs:Xt});this.cv=n,n.init(this.opts.opencvUrl,this.opts.workerUrl).then(()=>{t!==this.generation||this.cv!==n||(this.state.status==="loading_detector"&&this.setStatus("streaming"),this.scheduleNext(t,0));},a=>this.detectorUnavailable(t,n,a));}catch(r){throw t===this.generation&&this.emitError(r),r}}stop(){this.generation++,this.release(),this.setStatus("stopped");}async captureNow(){if(this.capturing)return;let t=this.state.status;if(t!=="streaming"&&t!=="loading_detector"&&!(t==="done"&&this.stream))throw new Error(`Cannot capture from status=${this.state.status}`);let r=this.stability.snapshot,n=this.state.lastFrame?.frameSize??null,a=r.quad&&n?this.fullFrameQuad(r.quad,n):null;await this.doCapture(this.generation,a?r.typeHint:null,a);}getState(){return {...this.state}}scheduleNext(t,r){this.timer=setTimeout(()=>{if(this.timer=null,t!==this.generation)return;let n=this.opts.videoElement;typeof n.requestVideoFrameCallback=="function"?this.frameCallback=n.requestVideoFrameCallback(()=>{this.frameCallback=null,this.tick(t);}):this.tick(t);},r);}async tick(t){if(t!==this.generation)return;let r=this.deps.now();try{await this.analyzeFrame(t);}catch(n){t===this.generation&&console.warn("[xid-camera-ocr] analyzeFrame error:",n);}t!==this.generation||!this.cv||this.scheduleNext(t,Math.max(0,1e3/Nt-(this.deps.now()-r)));}async analyzeFrame(t){let r=this.cv;if(this.capturing||!r?.isReady())return;let n=this.deps.sampleFrame(this.opts.videoElement,qt);if(!n)return;let a={width:n.width,height:n.height};this.warmupUntil===0&&(this.warmupUntil=this.deps.now()+ze);let i=this.prior&&this.prior.width===n.width&&this.prior.height===n.height?this.prior.quad:null,s=r.analyze(n,i?{prior:i}:{});this.inFlight=s;let o;try{o=await s;}catch(u){if(t===this.generation&&this.cv===r&&!r.isReady()){this.detectorUnavailable(t,r,u);return}throw u}finally{this.inFlight===s&&(this.inFlight=null);}if(t!==this.generation||this.capturing)return;this.prior=o.detected&&o.corners?{quad:Ye(o.corners),...a}:null;let c=!(this.deps.now()<this.warmupUntil)&&o.detected&&o.corners&&o.documentType?{quad:o.corners,typeHint:o.documentType}:null,d=this.stability.update(c,a);this.weakRun=d.stableFrames<=1?c!==null&&Ve(o):this.weakRun||Ve(o);let p=this.opts.stableFramesRequired+(this.weakRun?Bt:0);if(await this.updateTorch(t,o),t!==this.generation)return;let m={detected:o.detected,documentType:o.documentType,confidence:Math.min(d.stableFrames/p,1),aspectRatio:o.aspectRatio,quality:o.quality,corners:o.corners?Ye(o.corners):null,frameSize:a,hint:Se({detected:o.detected,quality:o.quality,stableFrames:d.stableFrames,stableFramesRequired:p}),...this.torchSupported?{torch:this.torchOn}:{}};if(this.state.lastFrame=m,this.opts.onFrameAnalyzed?.(m),t===this.generation&&this.opts.autoCapture&&!this.autoShutterSpent&&d.quad&&d.stableFrames>=p&&o.quality?.ok){let u=this.fullFrameQuad(d.quad,a);if(!u){this.stability.reset(),this.weakRun=false;return}await this.doCapture(t,d.typeHint,u);}}detectorUnavailable(t,r,n){if(t!==this.generation||this.cv!==r)return;r.terminate(),this.cv=null,this.inFlight=null,this.prior=null,this.stability.reset(),this.weakRun=false,this.autoShutterSpent=true,this.state.status==="loading_detector"&&this.setStatus("streaming");let a=Ge(n);this.state.lastError=a;let i={detected:false,documentType:null,confidence:0,aspectRatio:null,quality:null,corners:null,frameSize:null,hint:"detector_unavailable",...this.torchSupported?{torch:this.torchOn}:{}};this.state.lastFrame=i,this.opts.onFrameAnalyzed?.(i),t===this.generation&&this.opts.onError?.(a);}async updateTorch(t,r){if(!this.track||this.torchRejected||!Be({torchSupported:this.torchSupported,torchOn:this.torchOn,quality:r.quality,frameBrightness:r.frameBrightness}))return;let n=await this.deps.setTorch(this.track,true);t===this.generation&&(this.torchOn=n,n||(this.torchRejected=true));}fullFrameQuad(t,r){let n=this.opts.videoElement;return !n.videoWidth||!n.videoHeight?null:We(t,r,{width:n.videoWidth,height:n.videoHeight})}async doCapture(t,r,n){if(!this.capturing){this.capturing=true,this.autoShutterSpent=true,this.prior=null,this.stability.reset(),this.weakRun=false,this.setStatus("capturing");try{let{blob:a,type:i}=await this.captureBlob(t,r,n);if(t!==this.generation)return;this.opts.onCaptured?.(a,i),this.setStatus("uploading");let s=await this.opts.onUpload(a,i);if(t!==this.generation)return;this.state.lastResult=s,this.setStatus("done"),this.opts.onResult?.(s);}catch(a){t===this.generation&&this.emitError(a);}finally{t===this.generation&&(this.stability.reset(),this.weakRun=false,this.warmupUntil=this.deps.now()+ze,this.capturing=false);}}}async captureBlob(t,r,n){let a=this.opts.videoElement,i=async()=>({blob:await this.deps.snapshotToBlob(a,this.opts.captureQuality),type:null}),s=this.cv;if(!s?.isReady()||!n)return i();try{await this.inFlight?.catch(()=>{});let o=this.deps.grabFrame(a);if(!o||!s.isReady())return i();let l=this.opts.captureResolution==="high"?Qe:V,c=await s.warp(o,n,r,l);return {blob:await this.deps.encodeJpeg(c,this.opts.captureQuality),type:r}}catch(o){if(t!==this.generation)throw o;return console.warn("[xid-camera-ocr] warp failed, using plain snapshot:",o),i()}}release(){this.prior=null,this.timer!==null&&clearTimeout(this.timer),this.timer=null,this.frameCallback!==null&&(this.opts.videoElement.cancelVideoFrameCallback?.(this.frameCallback),this.frameCallback=null),this.track&&this.torchOn&&this.deps.setTorch(this.track,false),this.torchOn=false,this.torchRejected=false,this.stream&&this.deps.detachCamera(this.opts.videoElement,this.stream),this.stream=null,this.track=null,this.cv?.terminate(),this.cv=null,this.inFlight=null,this.stability.reset(),this.weakRun=false,this.capturing=false,this.autoShutterSpent=false;}setStatus(t){this.state.status=t;}emitError(t){let r=Ge(t);this.state.lastError=r,this.setStatus("error"),this.opts.onError?.(r);}};var Ke=.08,jt=.95,zt=.02,q=8,Vt=2,$e=8,Je=.33,oe=2,Gt=2,Yt=1,Kt=Gt+oe,$t=2,Jt=2*(oe+1),Zt=10,Ze=1.1,nt=oe+1,er=6,at=.92,tr=1/at,rr=.85,nr=2,ar=.05,et=2,tt=64;function ot(e){return {detected:false,documentType:null,aspectRatio:null,corners:null,boundingBox:null,quality:null,frameBrightness:e,score:null}}function or(e,t,r,n={}){let a={brightness:0};try{return ir(e,t,a,n.prior??null)}catch(i){return console.warn("[xid-camera-ocr] detectDocumentCV failed:",i),ot(a.brightness)}}function ir(e,t,r,n){let{width:a,height:i}=t,s=[],o=l=>(s.push(l),l);try{let l=o(e.matFromImageData(t)),c=o(new e.Mat),d=o(new e.Mat),p={equalized:o(new e.Mat),filtered:o(new e.Mat),padded:o(new e.Mat),edges:o(new e.Mat),dilated:o(new e.Mat),kernel:o(e.Mat.ones(3,3,e.CV_8U)),contours:o(new e.MatVector),hierarchy:o(new e.Mat),hull:o(new e.Mat),approx:o(new e.Mat),clahe:o(new e.CLAHE(Vt,new e.Size($e,$e)))};e.cvtColor(l,c,e.COLOR_RGBA2GRAY),r.brightness=Xe(Re(c,a,i));let m=[],u=rt(e,c,p,a,i,m,n),x=!1,S=Math.round(a/et),y=Math.round(i/et);if(!u&&S>=tt&&y>=tt&&(e.resize(c,d,new e.Size(S,y),0,0,e.INTER_AREA),u=rt(e,d,p,a,i,m,n),x=u!==null),u&&pr(u,m,Re(c,a,i))&&(u=null),!u)return ot(r.brightness);let b=x?"lowres":u.reduced?"reduced":"direct",h=u.quad.map(w=>w.x),f=u.quad.map(w=>w.y),T=Math.min(...h),R=Math.max(...h),k=Math.min(...f),v=Math.max(...f);return {detected:!0,documentType:ne(u.aspect),aspectRatio:u.aspect,corners:u.quad,boundingBox:{x:T/a,y:k/i,width:(R-T)/a,height:(v-k)/i},quality:xe(Re(c,a,i),lt(u.quad,nt*u.scale)),frameBrightness:r.brightness,score:b==="direct"?u.score:u.score*rr,provenance:b}}finally{for(let l of s)l.delete();}}function rt(e,t,r,n,a,i,s){let o=t.cols,l=t.rows,c=n/o,d=a/l,p=o*l,m=h=>({x:h.x*c,y:h.y*d}),{hull:u,approx:x,contours:S}=r;r.clahe.apply(t,r.equalized),e.bilateralFilter(r.equalized,r.filtered,9,75,75,e.BORDER_DEFAULT),e.copyMakeBorder(r.filtered,r.padded,q,q,q,q,e.BORDER_CONSTANT,new e.Scalar(0));let y=fr(r.padded.data);e.Canny(r.padded,r.edges,Math.max(10,(1-Je)*y),Math.min(255,(1+Je)*y)),e.dilate(r.edges,r.dilated,r.kernel,new e.Point(-1,-1),oe),e.findContours(r.dilated,S,r.hierarchy,e.RETR_LIST,e.CHAIN_APPROX_SIMPLE);let b=null;for(let h=0;h<S.size();h++){let f=S.get(h);try{let T=e.boundingRect(f);if(T.width*T.height<p*Ke)continue;e.convexHull(f,u,!1,!0);let R=e.contourArea(u);if(R<p*Ke||R>p*jt||(e.approxPolyDP(u,x,zt*e.arcLength(u,!0),!0),x.rows<4||x.rows>er||!e.isContourConvex(x)))continue;let k=x.rows!==4,v;if(!k)v=lr(x,o,l);else {let U=cr(it(x));if(!U)continue;v=U.map(gt=>st(gt,o,l));let D=R/L(v);if(!(D>=at&&D<=tr))continue}let w=R*c*d,E=v.map(m),F=Kt*c;if(yr(E,n,a,F)>Yt){dr(E,n,a,F)||i.push({pts:E,area:w});continue}let _=be(E);if(!re(_))continue;let O=e.minAreaRect(k?u:x),N=O.size.width*O.size.height,le=N>0?Math.min(1,R/N):0,X=z(_);if(!ge(X))continue;let B=Le({areaRatio:R/p,rectangularity:le,aspect:X}),W=s?B-sr(_,s,n,a):B;(!b||W>b.rank)&&(b={quad:_,score:B,rank:W,aspect:X,area:w,scale:c,reduced:k});}finally{f.delete();}}return b}function sr(e,t,r,n){let a=1/0;for(let i=0;i<4;i++){let s=0;for(let o=0;o<4;o++){let l=e[(o+i)%4];s=Math.max(s,Math.hypot(l.x-t[o].x,l.y-t[o].y));}a=Math.min(a,s);}return nr*Math.min(a/Math.hypot(r,n),ar)}function Re(e,t,r){return {data:e.data,width:t,height:r}}function it(e){let t=e.data32S,r=[];for(let n=0;n<e.rows;n++)r.push({x:t[n*2]-q,y:t[n*2+1]-q});return r}function st(e,t,r){return {x:Math.min(t,Math.max(0,e.x)),y:Math.min(r,Math.max(0,e.y))}}function lr(e,t,r){return it(e).map(n=>st(n,t,r))}function cr(e){let t=e;for(;t.length>4;){let r=t.length,n=-1,a=1/0,i=null;for(let o=0;o<r;o++){let l=t[(o+r-1)%r],c=t[o],d=t[(o+1)%r],p=t[(o+2)%r],m=ur(l,c,p,d);if(!m)continue;let u=Math.abs((m.x-c.x)*(d.y-c.y)-(m.y-c.y)*(d.x-c.x))/2;u<a&&(a=u,n=o,i=m);}if(n<0||!i)return null;let s=[];for(let o=0;o<r;o++)o===n?s.push(i):o!==(n+1)%r&&s.push(t[o]);t=s;}return t}function ur(e,t,r,n){let a=t.x-e.x,i=t.y-e.y,s=n.x-r.x,o=n.y-r.y,l=a*o-i*s;if(Math.abs(l)<1e-9)return null;let c=((r.x-e.x)*o-(r.y-e.y)*s)/l,d=((r.x-e.x)*i-(r.y-e.y)*a)/l;return c<1||d<1?null:{x:e.x+c*a,y:e.y+c*i}}function dr(e,t,r,n){let a=e.map(s=>s.x),i=e.map(s=>s.y);return Math.min(...a)<=n&&Math.max(...a)>=t-n||Math.min(...i)<=n&&Math.max(...i)>=r-n}function pr(e,t,r){let n=Jt*e.scale;if(!t.some(o=>o.area>=$t*e.area&&e.quad.every(l=>hr(o.pts,l,n))))return false;if(ne(e.aspect)==="OTHER")return true;let{inner:i,ring:s}=mr(r,lt(e.quad,nt*e.scale),e.quad);return i<s-Zt}function mr(e,t,r){let{data:n,width:a,height:i}=e,s=(r[0].x+r[1].x+r[2].x+r[3].x)/4,o=(r[0].y+r[1].y+r[2].y+r[3].y)/4,l=r.map(y=>({x:s+(y.x-s)*Ze,y:o+(y.y-o)*Ze})),c=G(l,a,i),d=G(r,a,i),p=G(t,a,i),m=0,u=0,x=0,S=0;for(let y=0;y<i;y++){let b=c[y*2],h=c[y*2+1];if(b>=h)continue;let f=d[y*2],T=d[y*2+1],R=p[y*2],k=p[y*2+1],v=y*a;for(let w=b;w<h;w++){let E=n[v+w];w>=R&&w<k?(m+=E,u++):(w<f||w>=T)&&(x+=E,S++);}}return {inner:u>0?m/u:0,ring:S>0?x/S:0}}function hr(e,t,r){let n=0;for(let i=0;i<e.length;i++){let s=e[i],o=e[(i+1)%e.length];n+=s.x*o.y-o.x*s.y;}let a=Math.sign(n);if(a===0)return false;for(let i=0;i<e.length;i++){let s=e[i],o=e[(i+1)%e.length],l=Math.hypot(o.x-s.x,o.y-s.y);if(l===0)continue;if(a*((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x))/l<r)return false}return true}function lt(e,t){return e.map((r,n)=>{let a=e[(n+3)%4],i=e[(n+1)%4],s=a.x-r.x,o=a.y-r.y,l=i.x-r.x,c=i.y-r.y,d=Math.hypot(s,o),p=Math.hypot(l,c),m=s/d+l/p,u=o/d+c/p,x=Math.hypot(m,u),S=Math.sin(Math.acos(Math.min(1,Math.max(-1,(s*l+o*c)/(d*p))))/2),y=t/S/x;return {x:r.x+m*y,y:r.y+u*y}})}function yr(e,t,r,n){let a=0;for(let i of e)(i.x<=n||i.x>=t-n||i.y<=n||i.y>=r-n)&&a++;return a}function fr(e){let t=new Uint32Array(256);for(let n=0;n<e.length;n++)t[e[n]]++;let r=0;for(let n=0;n<256;n++)if(r+=t[n],r>=e.length/2)return n;return 128}function ve(e){let t=react.useRef(null),r=react.useRef(null),[n,a]=react.useState("idle"),[i,s]=react.useState(null),[o,l]=react.useState(null),[c,d]=react.useState(null),p=react.useRef(e);p.current=e;let m=react.useCallback(()=>{if(r.current)return r.current;if(!t.current)throw new Error("videoRef not attached yet");let b=new $({videoElement:t.current,documentTypes:p.current.documentTypes,autoCapture:p.current.autoCapture,stableFramesRequired:p.current.stableFramesRequired,captureQuality:p.current.captureQuality,captureResolution:p.current.captureResolution,opencvUrl:p.current.opencvUrl,workerUrl:p.current.workerUrl,onUpload:(h,f)=>p.current.onUpload(h,f),onFrameAnalyzed:h=>{s(h),r.current===b&&a(b.getState().status),p.current.onFrameAnalyzed?.(h);},onCaptured:(h,f)=>{a("capturing"),p.current.onCaptured?.(h,f);},onResult:h=>{l(h),a("done"),p.current.onResult?.(h);},onError:h=>{d(h),r.current===b&&a(b.getState().status),p.current.onError?.(h);}});return r.current=b,b},[]),u=react.useCallback(async()=>{let b=m();await b.start(),r.current===b&&a(b.getState().status);},[m]),x=react.useCallback(()=>{r.current?.stop(),a("stopped");},[]),S=react.useCallback(async()=>{await r.current?.captureNow();},[]),y=react.useCallback(async()=>{x(),l(null),d(null),s(null),await u();},[x,u]);return react.useEffect(()=>(e.autoStart!==false&&t.current&&u().catch(()=>{}),()=>{r.current?.stop(),r.current=null;}),[]),{videoRef:t,status:n,frame:i,result:o,error:c,start:u,stop:x,captureNow:S,retake:y}}function xr({status:e,showTips:t,dismissed:r,completedOnce:n}){return t&&!r&&(e==="error"||!n&&(e==="starting"||e==="loading_detector"))}function ct(e,t){let[r,n]=react.useState(false),[a,i]=react.useState(e==="done"),[s,o]=react.useState(e),l=r,c=a;s!==e&&(o(e),e==="error"&&(l=false,n(false)),e==="done"&&(c=true,i(true)));let d=react.useCallback(()=>n(true),[]);return {visible:xr({status:e,showTips:t,dismissed:l,completedOnce:c}),dismiss:d}}var se={accent:{name:"--xco-accent",fallback:"#22c55e"},warning:{name:"--xco-warning",fallback:"#eab308"},danger:{name:"--xco-danger",fallback:"#ef4444"},background:{name:"--xco-background",fallback:"#000"},mask:{name:"--xco-mask",fallback:"rgba(0,0,0,0.4)"},hintBg:{name:"--xco-hint-bg",fallback:"rgba(0,0,0,0.7)"},hintFg:{name:"--xco-hint-fg",fallback:"white"},buttonBg:{name:"--xco-button-bg",fallback:"rgba(255,255,255,0.92)"},buttonFg:{name:"--xco-button-fg",fallback:"#111"},shutter:{name:"--xco-shutter",fallback:"rgba(255,255,255,0.9)"},overlayBg:{name:"--xco-overlay-bg",fallback:"rgba(0,0,0,0.78)"},overlayFg:{name:"--xco-overlay-fg",fallback:"white"},fontFamily:{name:"--xco-font-family",fallback:"system-ui, -apple-system, sans-serif"},radius:{name:"--xco-radius",fallback:"12px"}};function g(e){let{name:t,fallback:r}=se[e];return `var(${t}, ${r})`}function ut(e){let t={};if(!e)return t;for(let r of Object.keys(e)){if(!Object.prototype.hasOwnProperty.call(se,r))continue;let n=e[r];typeof n!="string"||n===""||(t[se[r].name]=n);}return t}function dt(e,t){return e==="done"?g("accent"):e==="error"?g("danger"):e==="uploading"||e==="capturing"?g("accent"):t?.detected?t.confidence>=1?g("accent"):g("warning"):g("danger")}var Ee={width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",style:{flex:"0 0 auto"}},Sr=()=>jsxRuntime.jsxs("svg",{...Ee,children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.jsx("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"})]}),Cr=()=>jsxRuntime.jsxs("svg",{...Ee,children:[jsxRuntime.jsx("rect",{x:"3",y:"5",width:"18",height:"14",rx:"2"}),jsxRuntime.jsx("path",{d:"M14 5l-6 14M18 5l-6 14"})]}),wr=()=>jsxRuntime.jsxs("svg",{...Ee,children:[jsxRuntime.jsx("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"}),jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"2"})]});function pt({texts:e,onDismiss:t}){let r=[{Icon:Sr,text:e.tip_light},{Icon:Cr,text:e.tip_glare},{Icon:wr,text:e.tip_focus}];return jsxRuntime.jsxs("div",{className:"xco-tips",style:Rr,children:[jsxRuntime.jsx("ul",{style:Tr,children:r.map(({Icon:n,text:a})=>jsxRuntime.jsxs("li",{style:vr,children:[jsxRuntime.jsx(n,{}),jsxRuntime.jsx("span",{children:a})]},a))}),jsxRuntime.jsx("button",{type:"button",className:"xco-tips-dismiss",onClick:t,style:kr,children:e.tips_dismiss})]})}var Rr={position:"absolute",top:"calc(16px + env(safe-area-inset-top, 0px))",left:"50%",transform:"translateX(-50%)",boxSizing:"border-box",width:"calc(100% - 32px)",maxWidth:360,padding:16,background:g("overlayBg"),color:g("overlayFg"),borderRadius:g("radius"),fontFamily:g("fontFamily"),fontSize:15,lineHeight:1.35,display:"flex",flexDirection:"column",gap:12,pointerEvents:"auto",zIndex:5},Tr={listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:10},vr={display:"flex",alignItems:"center",gap:12},kr={alignSelf:"flex-end",minHeight:44,padding:"10px 20px",borderRadius:g("radius"),background:g("buttonBg"),color:g("buttonFg"),border:"none",fontFamily:g("fontFamily"),fontSize:15,fontWeight:600,cursor:"pointer",WebkitTapHighlightColor:"transparent"};var Fr=typeof window>"u"?react.useEffect:react.useLayoutEffect;function ht({videoRef:e,status:t,frame:r,texts:n,documentTypes:a,theme:i,className:s,style:o,hideStatusOverlay:l,hideShutter:c,tipsVisible:d,onCapture:p,onRetake:m,onStart:u,onDismissTips:x}){let S=t==="streaming"||t==="loading_detector",y=t==="done"||t==="error",b=t==="idle"||t==="stopped",h=t==="capturing"||t==="uploading",f=react.useRef(null),[T,R]=react.useState({width:0,height:0}),k=r?.documentType,v=k==="PASSPORT_MX"?H:k==="INE"?I:a[0]==="PASSPORT_MX"?H:I;Fr(()=>{let _=f.current;if(!_)return;let O=()=>{let le=_.clientWidth,X=_.clientHeight,B=le*.85,W=X*.7,U=B,D=U/v;D>W&&(D=W,U=D*v),R({width:U,height:D});};O();let N=new ResizeObserver(O);return N.observe(_),()=>N.disconnect()},[v]);let w=dt(t,r),E=ae(t,r?.hint,n),F=s?`xid-camera-ocr ${s}`:"xid-camera-ocr";return jsxRuntime.jsxs("div",{ref:f,className:F,"data-status":t,"data-hint":r?.hint??"",style:{...Pr,...ut(i),...o},children:[jsxRuntime.jsx("style",{children:"@keyframes xco-spin { to { transform: rotate(360deg); } }"}),jsxRuntime.jsx("video",{ref:e,playsInline:true,muted:true,autoPlay:true,style:Or}),!l&&jsxRuntime.jsx("div",{style:Ir,children:jsxRuntime.jsx("div",{className:"xco-guide",style:{...Dr,width:T.width,height:T.height,borderColor:w}})}),!l&&(b?jsxRuntime.jsx("button",{type:"button",className:"xco-hint",onClick:u,style:Xr,children:E}):jsxRuntime.jsx("p",{className:"xco-hint",style:ft,role:"status","aria-live":"polite",children:E})),!l&&!c&&S&&jsxRuntime.jsx("button",{type:"button",className:"xco-shutter",onClick:p,"aria-label":n.capture,style:Qr,children:jsxRuntime.jsx("span",{style:qr})}),!l&&y&&jsxRuntime.jsx("button",{type:"button",className:"xco-retake",onClick:m,"aria-label":n.retake,style:Nr,children:n.retake}),!l&&h&&jsxRuntime.jsxs("div",{className:"xco-loader",style:Hr,"aria-busy":"true","aria-live":"polite",children:[jsxRuntime.jsx("div",{style:Lr}),jsxRuntime.jsx("p",{style:Ur,children:ae(t,void 0,n)})]}),d&&!l&&jsxRuntime.jsx(pt,{texts:n,onDismiss:x})]})}var yt="calc(104px + env(safe-area-inset-bottom, 0px))",Pr={position:"relative",width:"100%",height:"100%",overflow:"hidden",background:g("background"),fontFamily:g("fontFamily"),touchAction:"none"},Or={position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",display:"block"},Ir={position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none"},Dr={borderRadius:g("radius"),borderWidth:4,borderStyle:"solid",boxShadow:`0 0 0 9999px ${g("mask")}`,transition:"border-color 200ms ease-in-out, width 200ms ease-in-out, height 200ms ease-in-out"},Hr={position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:20,background:g("overlayBg"),backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",pointerEvents:"auto",zIndex:10},Lr={width:56,height:56,borderRadius:"50%",border:"5px solid rgba(255, 255, 255, 0.18)",borderTopColor:g("accent"),animation:"xco-spin 0.85s linear infinite"},Ur={color:g("overlayFg"),fontFamily:g("fontFamily"),fontSize:15,fontWeight:500,margin:0,textAlign:"center",padding:"0 24px"},Qr={position:"absolute",bottom:yt,left:"50%",transform:"translateX(-50%)",width:68,height:68,borderRadius:"50%",background:"rgba(255,255,255,0.18)",border:`4px solid ${g("shutter")}`,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"auto",WebkitTapHighlightColor:"transparent",padding:0},qr={width:52,height:52,borderRadius:"50%",background:"white",display:"block"},Nr={position:"absolute",bottom:yt,left:"50%",transform:"translateX(-50%)",minHeight:44,padding:"10px 20px",borderRadius:22,background:g("buttonBg"),color:g("buttonFg"),border:"none",fontFamily:g("fontFamily"),fontSize:15,fontWeight:600,cursor:"pointer",pointerEvents:"auto",WebkitTapHighlightColor:"transparent"},ft={position:"absolute",bottom:"calc(16px + env(safe-area-inset-bottom, 0px))",left:"50%",transform:"translateX(-50%)",boxSizing:"border-box",width:"max-content",maxWidth:"calc(100% - 32px)",background:g("hintBg"),color:g("hintFg"),padding:"10px 16px",borderRadius:g("radius"),fontFamily:g("fontFamily"),fontSize:16,lineHeight:1.35,margin:0,whiteSpace:"normal",textAlign:"center"},Xr={...ft,border:"none",minHeight:44,cursor:"pointer",pointerEvents:"auto",WebkitTapHighlightColor:"transparent"};var Gr=["INE","PASSPORT_MX"],Me=()=>{},bt=react.forwardRef(function({className:t,style:r,hideStatusOverlay:n,texts:a,theme:i,showTips:s,hideShutter:o,onStatusChange:l,...c},d){let{videoRef:p,status:m,frame:u,start:x,captureNow:S,retake:y}=ve(c),b=ct(m,s??true),h=react.useMemo(()=>we(a),[a]),f=m==="streaming"||m==="loading_detector",T=m==="done"||m==="error",R=async()=>{f&&await S().catch(Me);},k=()=>{T&&y().catch(Me);},v=async()=>{await x().catch(Me);};react.useImperativeHandle(d,()=>({capture:R,retake:k,start:v}));let w=react.useRef(l);return w.current=l,react.useEffect(()=>{w.current?.(m);},[m]),jsxRuntime.jsx(ht,{videoRef:p,status:m,frame:u,texts:h,documentTypes:c.documentTypes??Gr,theme:i,className:t,style:r,hideStatusOverlay:n,hideShutter:o,tipsVisible:b.visible,onCapture:()=>{R();},onRetake:k,onStart:()=>{v();},onDismissTips:b.dismiss})});bt.displayName="XidCameraOcr";exports.CVWorkerClient=j;exports.DEFAULT_TEXTS_EN=Ot;exports.DEFAULT_TEXTS_ES=Ce;exports.ID1_RATIO=I;exports.QUALITY_THRESHOLDS=M;exports.StabilityTracker=K;exports.TD3_RATIO=H;exports.XCO_VARS=se;exports.XidCameraOcr=bt;exports.XidCameraOcrSession=$;exports.attachCamera=ce;exports.copyFor=ae;exports.decideHint=Se;exports.defaultOpencvUrl=ye;exports.detachCamera=ue;exports.detectDocumentCV=or;exports.isCapturableAspect=ge;exports.measureQuality=xe;exports.orderCorners=be;exports.rectifiedAspect=z;exports.resolveTexts=we;exports.sampleFrame=pe;exports.setTorch=he;exports.snapshotToBlob=de;exports.supportsTorch=me;exports.typeHintFromAspect=ne;exports.useXidCameraOcr=ve;exports.warpDocument=Ne;exports.warpDocumentImageData=qe;exports.warpedSnapshotToBlob=_t;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|