@andresxid/xid_camera_ocr_sdk_react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +223 -0
- package/dist/LICENSE-OpenCV.txt +202 -0
- package/dist/NOTICE-OpenCV.txt +43 -0
- package/dist/cv-worker.js +670 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +459 -0
- package/dist/index.d.ts +459 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/opencv.js +51 -0
- package/package.json +79 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +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
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|