@voltom.io/sdk 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1,2 @@
1
+ /*! Copyright (c) 2026 VOLTOM. All rights reserved. Proprietary software. See LICENSE at https://voltom.io/license. */
2
+ import{$ as e,G as t,H as n,J as r,K as i,Q as a,U as o,W as s,X as c,Y as l,Z as u,a as d,ct as f,dt as p,et as m,nt as h,q as g,rt as _,tt as v,v as y,w as b}from"./faceMatch.shared-D6B1I2T0.js";import{_ as x,a as S,c as C,d as w,f as T,g as E,h as D,i as O,l as k,m as A,n as ee,o as j,p as M,s as N,t as P,u as F,v as I,y as L}from"./presentation-BrCGZT1u.js";var{analyzeDocumentFrame:R,hasValidDocumentSideData:z,validateDocumentBack:B}=A,te=({view:e,display:n,isActive:r,notifyCapturesChanged:i,getVerifyHardOptions:a})=>{let s=e.ref,u=async({frame:c,session:l,state:u,options:d})=>{let f=performance.now(),p=!!u.captures.documentFront,m=d.requiredDocumentStableFrames,h=null,g=null;try{h=await R({frame:c,prepareForMatch:p||u.documentStableFrames+1>=d.requiredDocumentStableFrames,options:{...a({configuration:d}),alignment:u.matchOptions.alignment,requiresFace:!p}});let{orientation:e,detection:f,face:_}=h;if(!r({flow:`document`,session:l,state:u}))return!1;let v=p?B({current:h,front:u.documentFrontSignature}):null;g=p?L({front:u.documentFrontSignature,current:h.signature}):null;let y=u.document?{...u.document,ocr:u.document.document_front}:void 0,b=z({analysis:h,isBack:p,front:y}),x=(p?v?.valid===!0:h.valid)&&b,S=e?e.rotation:null;S!==u.documentOrientation&&(u.documentStableFrames=0),u.documentOrientation=S,u.documentStableFrames=x?u.documentStableFrames+1:0,d.showDocumentOverlay?await N({documentFaceBoxColor:d.documentFaceBoxColor,documentFaceMeshColor:d.documentFaceMeshColor,documentBoxColor:d.documentBoxColor,element:s.mesh,detection:f,face:_,height:c.height,ocrLines:d.showTextOverlay?h.text.lines:[],ocrToSource:d.showTextOverlay?h.documentToSource:null,overlayColor:d.documentOverlayColor,textColor:d.textColor,width:c.width}):o({element:s.mesh});let C=U({analysis:h,dataValid:b,isBack:p,minFaceAreaRatio:d.minDocumentFaceAreaRatio,rejectionReasons:v?v.reasons:h.failureReasons,valid:x,stable:u.documentStableFrames>=m});if(n.feedback.value={flow:`document`,...C},u.documentStableFrames<m)return!1;let w=await t({frame:c});return r({flow:`document`,session:l,state:u})?p?(V({analysis:h,isBack:!0,state:u}),u.captures.documentBack=w,i({state:u}),!0):!h.embeddings||!h.images?!1:(V({analysis:h,isBack:!1,state:u}),u.documentFaceEmbeddings=h.embeddings,u.documentFrontSignature=h.signature,u.preparedCaptures.documentFront=h.images,u.captures.documentFront=w,i({state:u}),!0):!1}finally{h&&r({flow:`document`,session:l,state:u})&&e.collectDocumentDebug({analysis:h,sideComparison:g,isBack:p,processingTimeMilliseconds:performance.now()-f,state:u})}};return{runDocumentLoop:async({session:e,state:t,options:i})=>{for(;r({flow:`document`,session:e,state:t});){if(await c({video:s.video}),!r({flow:`document`,session:e,state:t}))return;let a=await createImageBitmap(s.video);try{let r=await l({frame:a});try{if(await u({frame:r,session:e,state:t,options:i})){t.flow=null,n.debug.value=[];return}}finally{r.close()}}finally{a.close()}}}}},V=({analysis:e,isBack:t,state:n})=>{if(!e.ocr)throw Error(m.CAPTURES_INCOMPLETE);let r={ocr:e.ocr,codes:e.codes};if(t){if(!n.document)throw Error(m.CAPTURES_INCOMPLETE);let t=b({classification:n.document,front:{ocr:n.document.document_front,codes:n.document.codes},back:r});n.document={...n.document,...t,document_back:e.ocr}}else{if(!e.documentKind)throw Error(m.DOCUMENT_NOT_RECOGNIZED);let t={document:e.documentKind,europeanDrivingLicense:e.europeanDrivingLicense,identity:e.identity},i=b({classification:t,front:r});n.identity=e.identity,n.document={...t,...i,document_front:e.ocr,document_back:null}}n.documentCodes=n.document.codes},H=({rejection:e})=>e===`coverage_low`?`DOCUMENT_BOX_TOO_SMALL`:e===`coverage_high`?`DOCUMENT_BOX_TOO_LARGE`:e===`edge_proximity`?`DOCUMENT_BOX_NEAR_EDGE`:e===`opposite_edges`?`DOCUMENT_BOX_TOUCHES_EDGES`:e===`aspect_ratio`?`DOCUMENT_NOT_SUPPORTED`:`DOCUMENT_SHAPE_INVALID`,U=({analysis:e,dataValid:t,isBack:n,minFaceAreaRatio:r,rejectionReasons:i,valid:a,stable:o})=>{let s=`front`;n?s=`back`:e.documentKind===`passport`&&(s=`passport`);let c=Object.keys(e.documentAnalysis.diagnostics.rejected)[0];return c?{target:s,code:H({rejection:c})}:e.detection?e.documentAnalysis.isBlurry?{target:s,code:`DOCUMENT_BLURRY`}:n&&i.includes(m.DOCUMENT_BACK_CONTAINS_FACE)?{target:s,code:`DOCUMENT_BACK_HAS_FACE`}:n&&i.includes(m.DOCUMENT_BACK_NOT_DISTINCT)?{target:s,code:`DOCUMENT_BACK_SAME_AS_FRONT`}:!n&&!e.face?{target:s,code:`DOCUMENT_FRONT_FACE_NOT_DETECTED`}:!n&&!e.faceContained?{target:s,code:`DOCUMENT_FRONT_FACE_NOT_CONTAINED`}:!n&&!e.alignment.faceAreaValid&&e.alignment.faceAreaRatio<r?{target:s,code:`DOCUMENT_FRONT_FACE_TOO_SMALL`}:!n&&(!e.alignment.faceAreaValid||!e.alignment.faceDimensionsValid)?{target:s,code:`DOCUMENT_FRONT_FACE_SIZE_INVALID`}:!n&&(!e.alignment.textParallel||e.alignment.textSide===`unknown`||e.alignment.faceAdjacentTextLineCount<2)?{target:s,code:`DOCUMENT_FRONT_LAYOUT_INVALID`}:!e.text.text||e.text.lines.length<2?{target:s,code:`DOCUMENT_TEXT_NOT_READABLE`}:!n&&!e.documentKind?{target:s,code:`DOCUMENT_NOT_RECOGNIZED`}:t?a?o?{target:s,code:null}:{target:s,code:`DOCUMENT_STABILITY_REQUIRED`}:{target:s,code:`DOCUMENT_VALIDATION_FAILED`}:{target:s,code:`DOCUMENT_CODE_NOT_READABLE`}:{target:s,code:`DOCUMENT_NOT_DETECTED`}},W=`https://api.voltom.io`,G=({apiUrl:e})=>{let t=e??W;return t.endsWith(`/`)?t.slice(0,-1):t},K=async({apiUrl:e,path:t,method:n=`POST`,body:r,clientKey:i,fallback:a=m.INVALID_SERVICE_RESPONSE,signal:o})=>{let s={};i&&(s.authorization=`Bearer ${i}`),r&&(s[`content-type`]=`application/json`);let c;try{c=await fetch(`${G({apiUrl:e})}${t}`,{method:n,headers:s,body:r,signal:o})}catch(e){throw o?.aborted?Error(m.VERIFICATION_CANCELLED,{cause:e}):Error(m.NETWORK_ERROR,{cause:e})}if(c.status===413)throw Error(m.REQUEST_TOO_LARGE);let l;try{l=await c.json()}catch(e){throw Error(c.status>=500?m.SERVICE_UNAVAILABLE:a,{cause:e})}if(!c.ok){let e=typeof l==`object`&&l&&`code`in l&&typeof l.code==`string`?l.code:c.status>=500?m.SERVICE_UNAVAILABLE:a;throw Error(e)}return l},q=async({clientKey:e,apiUrl:t,signal:n})=>{await K({apiUrl:t,path:`/auth/me`,method:`GET`,clientKey:e,fallback:m.INVALID_CLIENT_KEY,signal:n})},J=({apiUrl:e})=>{if(typeof navigator<`u`&&typeof navigator.sendBeacon==`function`)try{navigator.sendBeacon(`${G({apiUrl:e})}/script-loads`)}catch{return}},ne=async({clientKey:e,apiUrl:t,endpoint:n,documentBack:r,documentFront:a,faces:o=[],options:s,picture:c,poses:l=[],sourceIds:u=[],threshold:d,signal:f})=>{if(!e)throw Error(m.CLIENT_KEY_REQUIRED);let p=JSON.stringify({documentFront:a?await i({image:a}):void 0,documentBack:r?await i({image:r}):void 0,picture:c?await i({image:c}):void 0,faces:await Promise.all(o.map(e=>i({image:e}))),options:s,poses:l.map(e=>k[e]),source_ids:u,threshold:d});return f?.throwIfAborted(),await K({apiUrl:t,path:n,body:p,clientKey:e,signal:f})},re=async({flow:e,startedAt:t,executionMs:n,outcome:r,result:a,error:o,captures:s,preparedCaptures:c,picture:l,clientKey:u,apiUrl:d,language:f,codes:p,signal:h})=>{let g=[...F.map(e=>({field:k[e],capture:s[e],prepared:c[e]})),{field:e===`document`||e===`match_id`?`document_front`:`picture`,capture:e===`document`||e===`match_id`?s.documentFront:l,prepared:e===`document`||e===`match_id`?c.documentFront:c.picture},...e===`document`||e===`match_id`?[{field:`document_back`,capture:s.documentBack,prepared:c.documentBack}]:[]].flatMap(e=>e.capture?[{field:e.field,capture:e.capture,prepared:e.prepared}]:[]);if(!g.length)throw Error(m.CAPTURES_INCOMPLETE);let _={};for(let{field:e,capture:t,prepared:n}of g){h?.throwIfAborted();let r=e;_[r]=await i({image:t}),n&&(_[`${r}_rgb`]=await i({image:n.rgb}),_[`${r}_greyscale`]=await i({image:n.greyscale}))}let y=JSON.stringify({language:f,started_at:t.toISOString(),execution_ms:n,outcome:r,match:a?.matched??null,score:a?.score??null,threshold:a?.threshold??null,error:o?v({error:o}):a?.reason??void 0,codes:p,captures:_}),b={human:`human`,document:`document`,match_id:`id`,match_picture:`picture`}[e];return await K({apiUrl:d,path:`/verification/${b}/fast`,clientKey:u,body:y,fallback:m.VERIFICATION_SAVE_FAILED,signal:h})},{loadDocumentBoxDetector:ie,detectDocumentOrientation:ae}=T,{detectPictureFaces:Y,loadFaceDetector:oe}=M,{loadFaceMatch:se,warmupFaceMatch:ce}=E,{loadTextDetector:X}=x,Z=({options:e,view:t,display:n})=>{let i=t.ref,s=[...w],c=({language:e})=>e??a(),l=()=>({identity:null,flow:null,session:0,faceSequence:[...s],faceCaptureConfiguration:null,documentCaptureConfiguration:null,poseIndex:0,poseStableFrames:0,documentStableFrames:0,documentOrientation:null,documentFaceEmbeddings:null,documentFrontSignature:null,documentCodes:[],matchOptions:{alignment:e.alignment,threshold:e.threshold},captures:{},preparedCaptures:{},faceEmbeddings:{},previousPoseBackgroundSignature:null,faceMatchOptions:null,hardHumanVerificationId:null,hardDocumentVerificationId:null,cameraActive:!1,cameraSize:n.cameraSize,cameraFacingMode:n.cameraFacingMode}),u=({active:e,state:t})=>{t.cameraActive!==e&&(t.cameraActive=e,i.root.dispatchEvent(new CustomEvent(`voltom:camera-change`,{detail:{active:e}})))},d=({state:e})=>{r({video:i.video}),u({active:!1,state:e}),e.cameraSize.value=null,e.cameraFacingMode.value=null,n.feedback.value=null},f=({state:e})=>({identity:e.identity,document:e.document,captures:{...e.captures},documentCodes:[...e.documentCodes],preparedCaptures:{...e.preparedCaptures}}),p=({state:e})=>{let t=f({state:e});i.root.dispatchEvent(new CustomEvent(`voltom:captures-change`,{detail:t}))},_=({state:t,options:n=e})=>{t.faceSequence=F({options:n}),t.poseIndex=0,t.poseStableFrames=0;let r=t.preparedCaptures.documentFront;t.preparedCaptures=r?{documentFront:r}:{},t.faceEmbeddings={},t.previousPoseBackgroundSignature=null,t.faceMatchOptions=null,t.hardHumanVerificationId=null,t.faceCaptureConfiguration=null;let{documentFront:i,documentBack:a}=t.captures;t.captures={...i?{documentFront:i}:{},...a?{documentBack:a}:{}}},b=({state:e})=>{e.documentStableFrames=0,e.documentOrientation=null,e.documentFaceEmbeddings=null,e.documentFrontSignature=null,e.identity=null,e.documentCodes=[],delete e.document,e.hardDocumentVerificationId=null,e.documentCaptureConfiguration=null,delete e.preparedCaptures.documentFront;let t={...e.captures};delete t.documentFront,delete t.documentBack,e.captures=t},x=({state:e})=>{e.session+=1,e.flow=null,d({state:e}),o({element:i.mesh}),n.debug.value=[]},k=({state:e})=>{x({state:e}),p({state:e}),n.error.value=null},A=({state:e})=>{let t=i.video.videoWidth,n=i.video.videoHeight;t&&n&&(e.cameraSize.value={width:t,height:n})},M=async({facingMode:e,state:t})=>{d({state:t});let n=t.session,a=await g({facingMode:e,video:i.video});if(t.session!==n)throw r({video:i.video}),$();t.cameraFacingMode.value=a,A({state:t}),u({active:!0,state:t})},N=({flow:e,session:t,state:n})=>n.flow===e&&n.session===t,P=({state:e})=>e.faceSequence[e.poseIndex]??`faceStraight`,F=({options:e})=>j({mode:e.mode,poses:e.poses,posesCount:e.posesCount,randomize:e.randomizeFaceSequence??!1}),L=({options:e})=>JSON.stringify({mode:e.mode,poses:e.poses,posesCount:e.posesCount,randomizeFaceSequence:e.randomizeFaceSequence,faceDetector:e.faceDetector,alignment:e.alignment,threshold:e.threshold,language:e.language,maxPitch:e.maxPitch,minPitch:e.minPitch,maxYaw:e.maxYaw,minYaw:e.minYaw,maxRoll:e.maxRoll,requiredFaceStableFrames:e.requiredFaceStableFrames}),R=({options:e})=>JSON.stringify({ocrEngine:e.ocrEngine,language:e.language,minDocumentFaceAreaRatio:e.minDocumentFaceAreaRatio,maxDocumentFaceAreaRatio:e.maxDocumentFaceAreaRatio,minDocumentFaceWidthRatio:e.minDocumentFaceWidthRatio,maxDocumentFaceWidthRatio:e.maxDocumentFaceWidthRatio,minDocumentFaceHeightRatio:e.minDocumentFaceHeightRatio,maxDocumentFaceHeightRatio:e.maxDocumentFaceHeightRatio,minDocumentBoxRatio:e.minDocumentBoxRatio,maxDocumentTextAngleDifference:e.maxDocumentTextAngleDifference,requiredDocumentStableFrames:e.requiredDocumentStableFrames}),z=({state:e,options:t})=>e.faceCaptureConfiguration===L({options:t})&&S({captures:e.captures,state:e}),B=({state:e,options:t})=>{let n=e.document,r=n!==void 0&&n.document!==`passport`,i=!(!e.captures.documentFront||r&&!e.captures.documentBack),a=e.documentCaptureConfiguration===R({options:t});return!!(n?.valid&&i&&a)},V=({configuration:e})=>{let t=Object.fromEntries(Object.keys(y).map(t=>[t,e[t]]));return t.language=c({language:e.language}),t},H=async({configuration:e,endpoint:t,state:n,picture:r,sourceIds:i=[],signal:a})=>{let o=S({captures:n.captures,state:n})?O({captures:n.captures,state:n}):null;return await ne({clientKey:e.clientKey,apiUrl:e.apiUrl,endpoint:t,documentBack:r?void 0:n.captures.documentBack,documentFront:r?void 0:n.captures.documentFront,faces:o?.faces,options:V({configuration:e}),picture:r,poses:o?.poses,sourceIds:i,threshold:e.threshold,signal:a})},U=async t=>await re({...t,clientKey:e.clientKey,apiUrl:e.apiUrl,language:c({language:e.language}),signal:t.signal}),W={options:e,view:t,display:n,isActive:N,notifyCapturesChanged:p,getVerifyHardOptions:V},{runFaceLoop:G}=ee(W),{runDocumentLoop:K}=te(W),q=async({state:e,options:t})=>{x({state:e}),_({state:e,options:t}),e.faceCaptureConfiguration=L({options:t}),e.matchOptions={alignment:t.alignment,threshold:t.threshold},e.faceMatchOptions={...e.matchOptions},p({state:e});let r=e.session;e.flow=`face`;try{if(n.feedback.value={flow:`face`,pose:P({state:e}),code:null},await M({facingMode:`user`,state:e}),n.feedback.value={flow:`face`,pose:P({state:e}),code:null},await G({session:r,state:e,options:t}),e.session!==r)throw $();if(!S({captures:e.captures,state:e}))throw Error(m.CAPTURES_INCOMPLETE);let a={...e.captures};return d({state:e}),o({element:i.mesh}),a}finally{e.session===r&&(n.feedback.value=null)}},J=async({state:t,options:r=e})=>{x({state:t}),b({state:t}),t.documentCaptureConfiguration=R({options:r}),t.matchOptions={alignment:r.alignment,threshold:r.threshold},p({state:t});let a=t.session;t.flow=`document`;try{if(!N({flow:`document`,session:a,state:t})||(await M({facingMode:`environment`,state:t}),n.feedback.value={flow:`document`,code:null,target:`front`},await K({session:a,state:t,options:r}),t.session!==a))throw $();if(!t.captures.documentFront||!t.document)throw Error(m.CAPTURES_INCOMPLETE);if(t.document.document!==`passport`&&(t.documentStableFrames=0,t.documentOrientation=null,t.flow=`document`,n.feedback.value={flow:`document`,code:null,target:`back`},await K({session:a,state:t,options:r}),t.session!==a))throw $();if(!t.document.valid)throw Error(m.DOCUMENT_VALIDATION_FAILED);let e={...t.captures};return d({state:t}),o({element:i.mesh}),e}finally{t.session===a&&(n.feedback.value=null,o({element:i.mesh}))}},Z=async({state:e,options:t,signal:r})=>{n.error.value=null,z({state:e,options:t})||await q({state:e,options:t}),r?.throwIfAborted(),B({state:e,options:t})||await J({state:e,options:t}),r?.throwIfAborted();let i=e.captures.documentFront;if(!i||!e.documentFaceEmbeddings)throw Error(m.CAPTURES_INCOMPLETE);let a=e.session;n.activity.value=`matching`;let o=O({captures:e.captures,state:e}),s=o.poses.indexOf(`faceStraight`);if(s<0)throw Error(m.INVALID_POSES);let c=await E.matchFaceWithDocument({document:i,documentFaceEmbeddings:e.documentFaceEmbeddings,referenceFaceEmbeddings:o.embeddings[s],options:t,reference:o.faces[s]});if(e.session!==a)throw $();return p({state:e}),{matched:c.matched,score:c.score,reason:c.matched?null:m.FACE_MISMATCH,threshold:t.threshold,...f({state:e})}},Q=async()=>{let t=e.capabilities.some(e=>e===`verifyDocument`||e===`matchID`),n=[ie(),oe({faceDetector:e.faceDetector}),se(),...t?[D(),X({engine:`tiny`,language:`latin`}),X({engine:e.ocrEngine,language:c({language:e.language})}),I()]:[],...e.showFaceOverlay||e.showDocumentOverlay?[C()]:[]];await Promise.all(n);let r=document.createElement(`canvas`);r.width=640,r.height=480;let i=await createImageBitmap(r);try{let e=[Y(i),T.detectDocumentBox(i),ce()];t&&e.push(ae({frame:i,boundingRect:{x:0,y:0,width:i.width,height:i.height}})),await Promise.all(e)}finally{i.close()}},$=()=>new DOMException(m.VERIFICATION_CANCELLED,`AbortError`);return{createState:l,stop:k,syncCameraSize:A,captureResult:f,resetFaceFlow:_,resetDocumentFlow:b,hasCompatibleFaceCaptures:z,hasCompatibleDocumentCapture:B,notifyCapturesChanged:p,startFaceFlow:q,startDocumentFlow:J,startFlow:Z,startPictureFlow:async({picture:e,state:t,options:r,signal:i})=>{n.error.value=null,i?.throwIfAborted();let a=await E.imageBitmap({blob:e});try{let e=await Y(a,{forMatch:!0});if(i?.throwIfAborted(),!e.length)throw Error(m.NO_USABLE_CANDIDATES)}finally{a.close()}let o=t.faceCaptureConfiguration===L({options:r});z({state:t,options:r})&&o||await q({state:t,options:r}),i?.throwIfAborted();let s=O({captures:t.captures,state:t}),c=await E.imageBitmap({blob:e});try{let[e]=await Y(c,{forMatch:!0});i?.throwIfAborted();let n=e?E.prepareFace({alignment:r.alignment,face:e,frame:c}):null,a=n?await E.preparedFaceArtifacts({face:n}):null;i?.throwIfAborted(),a&&(t.preparedCaptures.picture=a.images)}finally{c.close()}let l=t.session;n.activity.value=`matching`;let u={...await E.matchPictureWithFaces({options:r,picture:e,references:s.faces,referenceFaceEmbeddings:s.embeddings}),threshold:r.threshold};if(i?.throwIfAborted(),t.session!==l)throw $();return{matched:u.matched,score:u.score,reason:u.matched?null:m.FACE_MISMATCH,threshold:u.threshold,...f({state:t})}},submitHardVerification:H,submitFastVerification:U,initializeModels:Q,showError:({error:e,state:t})=>{v({error:e})!==m.VERIFICATION_CANCELLED&&x({state:t}),h(()=>{n.activity.value=null,v({error:e})===m.VERIFICATION_CANCELLED?n.retry.value=null:n.error.value=e})}}},Q={...y,faceDetector:`standard`,apiUrl:`https://api.voltom.io`,language:void 0,clientKey:``,mode:`fast`,threshold:d,posesCount:5,randomizeFaceSequence:!1,requiredFaceStableFrames:2,requiredDocumentStableFrames:2,showDocumentOverlay:!0,showFaceOverlay:!0,showTextOverlay:!0,faceOverlayColor:`transparent`,faceMeshColor:`#22c55e`,documentOverlayColor:`transparent`,documentBoxColor:`#38bdf8`,documentFaceBoxColor:`#38bdf8`,documentFaceMeshColor:`#22c55e`,textColor:`#38bdf8`,debug:!1,capabilities:[`verifyHuman`,`verifyDocument`,`matchID`,`matchPicture`]},$=class{options;view;root;useUi;videoElement;resizeListener;display=P();translator;flows;state;lastPicture;preparation=null;preparationController=null;prepared=!1;disposed=!1;operationController=null;subscriptions=new Set;uiAttached=!1;notifyStatus({status:e}){this.root.dispatchEvent(new CustomEvent(`voltom:${e}`))}showSpinner({message:e=this.translator.translate(`checkingFaceMatch`)}={}){this.display.activity.value={message:e}}hideSpinner(){this.display.activity.value=null}async runWithSpinner({task:e,message:t}){this.showSpinner({message:t});try{return await e()}finally{this.hideSpinner()}}constructor(e){let{root:t,video:n,ui:r,...i}=e,a=r??!!t;if(a&&!t||!a&&!n)throw Error(m.INVALID_OPTIONS);if(!i.clientKey)throw Error(m.CLIENT_KEY_REQUIRED);if(this.options=Object.freeze({...Q,...i,capabilities:Object.freeze([...i.capabilities??Q.capabilities]),poses:Array.isArray(i.poses)?Object.freeze([...i.poses]):i.poses}),this.root=t??document.createElement(`div`),this.useUi=a,this.videoElement=n??document.createElement(`video`),this.translator=u({language:this.options.language}),this.view={ref:{root:this.root,camera:document.createElement(`div`),video:this.videoElement,mesh:document.createElement(`canvas`)},collectFaceDebug:()=>{},collectDocumentDebug:()=>{}},this.flows=Z({options:this.options,view:this.view,display:this.display}),this.lastPicture=null,i.mode!==void 0&&i.mode!==`fast`&&i.mode!==`hard`)throw Error(m.INVALID_OPTIONS);this.state=this.flows.createState(),this.resizeListener=()=>this.flows.syncCameraSize({state:this.state}),this.videoElement.addEventListener(`resize`,this.resizeListener)}async prepare(){if(this.disposed)throw Error(m.SDK_NOT_READY);if(this.preparation)return this.preparation;let t=new AbortController;this.preparationController=t;let n=(async()=>{await e({language:this.options.language}),await this.attachUi(),await this.runWithSpinner({task:async()=>{if(await q({clientKey:this.options.clientKey,apiUrl:this.options.apiUrl,signal:t.signal}),await J({apiUrl:this.options.apiUrl}),await this.flows.initializeModels(),t.signal.throwIfAborted(),this.disposed)throw Error(m.SDK_NOT_READY)},message:this.translator.translate(`preparingModels`)})})();this.preparation=n;try{await n,this.prepared=!0,this.preparationController===t&&(this.preparationController=null)}catch(e){throw this.preparation===n&&(this.preparation=null),this.preparationController===t&&(this.preparationController=null),e}}async attachUi(){if(!this.useUi||this.uiAttached)return;let{createVerificationView:e}=await import(`./view-usv6rHIE.js`);if(this.disposed)throw Error(m.SDK_NOT_READY);let t=e({root:this.root,options:this.options,display:this.display});this.videoElement.removeEventListener(`resize`,this.resizeListener),Object.assign(this.view.ref,t.ref),this.view.collectFaceDebug=t.collectFaceDebug,this.view.collectDocumentDebug=t.collectDocumentDebug,this.videoElement=this.view.ref.video,this.videoElement.addEventListener(`resize`,this.resizeListener),this.uiAttached=!0}async submitHardVerification(e){let t=e.endpoint===`/verification/document/hard`?this.translator.translate(`checkingDocument`):void 0;return await this.runWithSpinner({task:()=>this.flows.submitHardVerification({...e,signal:e.signal??this.operationController?.signal}),message:t})}async submitFastVerification(e){return await this.runWithSpinner({task:()=>this.flows.submitFastVerification({...e,signal:e.signal??this.operationController?.signal})})}async caniuse(){return await n()}async runOperation({retry:e,task:t,onError:n,capability:r,settings:i}){if(this.disposed||!this.prepared)throw Error(m.SDK_NOT_READY);if(!this.options.capabilities.includes(r))throw Error(m.SDK_CAPABILITY_NOT_CONFIGURED);if(this.operationController)throw Error(m.INVALID_OPTIONS);let{signal:a,...o}=i,s=Object.freeze({...this.options,...o,poses:Array.isArray(o.poses)?Object.freeze([...o.poses]):o.poses??this.options.poses}),c=new AbortController;this.operationController=c;let l=()=>c.abort();a?.addEventListener(`abort`,l,{once:!0}),a?.aborted&&l(),c.signal.addEventListener(`abort`,()=>this.flows.stop({state:this.state}),{once:!0}),this.notifyStatus({status:`in-progress`}),h(()=>{this.display.retry.value=e,this.display.error.value=null,this.display.debugEnabled.value=s.debug,s.debug||(this.display.debug.value=[])});try{return c.signal.throwIfAborted(),await t({options:s,signal:c.signal})}catch(e){let t=c.signal.aborted?Error(m.VERIFICATION_CANCELLED,{cause:e}):e;throw n&&await n({error:t,options:s,signal:c.signal}),this.disposed||this.flows.showError({error:t,state:this.state}),t}finally{this.notifyStatus({status:`ready`}),a?.removeEventListener(`abort`,l),this.display.debugEnabled.value=this.options.debug,this.operationController===c&&(this.operationController=null)}}async verifyHuman(e={}){return await this.verifyCapture({flow:`human`,...e})}async verifyDocument(e={}){return await this.verifyCapture({flow:`document`,...e})}async verifyCapture({flow:e,...t}){let n=new Date,r=performance.now(),i=({options:t})=>{e===`human`?this.flows.resetFaceFlow({state:this.state,options:t}):this.flows.resetDocumentFlow({state:this.state}),this.flows.notifyCapturesChanged({state:this.state})};return await this.runOperation({capability:e===`human`?`verifyHuman`:`verifyDocument`,settings:t,retry:()=>this.verifyCapture({flow:e,...t,signal:void 0}),onError:async({error:t,options:n})=>{(e===`human`?this.state.faceCaptureConfiguration!==null:this.state.documentCaptureConfiguration!==null)&&v({error:t})!==m.VERIFICATION_CANCELLED&&i({options:n})},task:async({options:t,signal:a})=>{if(a.throwIfAborted(),await(e===`human`?this.flows.startFaceFlow:this.flows.startDocumentFlow)({state:this.state,options:t}),a.throwIfAborted(),t.mode===`hard`){let n=await this.submitHardVerification({configuration:t,endpoint:`/verification/${e}/hard`,state:this.state}),r=e===`human`?`hardHumanVerificationId`:`hardDocumentVerificationId`;return this.state[r]=n.verificationId,n.outcome!==`completed`||n.matched!==!0?(this.state[r]=null,i({options:t}),n):(this.display.retry.value=null,n)}let o=await this.recordFastVerification({flow:e,startedAt:n,performanceStartedAt:r,outcome:`completed`,result:{matched:!0,score:null,threshold:t.threshold},codes:e===`document`?this.state.documentCodes:[]});return this.display.retry.value=null,o}})}async ensureHumanVerification({options:e,signal:t}){if(t?.throwIfAborted(),this.flows.hasCompatibleFaceCaptures({state:this.state,options:e})||await this.flows.startFaceFlow({state:this.state,options:e}),t?.throwIfAborted(),this.state.hardHumanVerificationId)return null;let n=await this.submitHardVerification({configuration:e,endpoint:`/verification/human/hard`,state:this.state}),r=n.outcome===`completed`&&n.matched===!0;return this.state.hardHumanVerificationId=r?n.verificationId:null,r?null:n}async recordFastVerification({performanceStartedAt:e,...t}){return await this.submitFastVerification({...t,executionMs:Math.round(performance.now()-e),captures:this.state.captures,preparedCaptures:this.state.preparedCaptures,signal:t.signal??this.operationController?.signal})}shouldRecordFailure({submissionStarted:e,options:t,error:n,signal:r}){let i=v({error:n});return!e&&!r?.aborted&&t.mode!==`hard`&&i!==m.VERIFICATION_CANCELLED&&i!==m.VERIFICATION_SAVE_FAILED}async matchID(e={}){let t=new Date,n=performance.now(),r=!1;return await this.runOperation({capability:`matchID`,settings:e,retry:()=>this.matchID({...e,signal:void 0}),task:async({options:e,signal:i})=>{if(i.throwIfAborted(),e.mode===`hard`){let t=await this.ensureHumanVerification({options:e,signal:i});if(t)return t;if(i.throwIfAborted(),this.flows.hasCompatibleDocumentCapture({state:this.state,options:e})||await this.flows.startDocumentFlow({state:this.state,options:e}),!this.state.hardDocumentVerificationId){i.throwIfAborted();let t=await this.submitHardVerification({configuration:e,endpoint:`/verification/document/hard`,state:this.state});if(this.state.hardDocumentVerificationId=t.verificationId,t.outcome!==`completed`||t.matched!==!0)return this.state.hardDocumentVerificationId=null,t}let n=await this.submitHardVerification({configuration:e,endpoint:`/verification/id/hard`,state:this.state,sourceIds:[this.state.hardHumanVerificationId,this.state.hardDocumentVerificationId]});return n.outcome!==`completed`||n.matched!==!0||(this.display.retry.value=null),n}this.display.error.value=null;let a=await this.flows.startFlow({state:this.state,options:e,signal:i});i.throwIfAborted(),r=!0;let o=await this.recordFastVerification({flow:`match_id`,startedAt:t,performanceStartedAt:n,outcome:`completed`,result:a,codes:this.state.documentCodes});return this.display.retry.value=null,o},onError:async({error:e,options:i,signal:a})=>{if(this.shouldRecordFailure({submissionStarted:r,options:i,error:e,signal:a})){let r=await this.recordFastVerification({flow:`match_id`,startedAt:t,performanceStartedAt:n,outcome:`failed`,error:e,codes:this.state.documentCodes});e instanceof Error&&Object.assign(e,{verificationId:r.verificationId})}}})}async matchPicture(e,t={}){let n=new Date,r=performance.now(),i=!1,a;return this.lastPicture=e,await this.runOperation({capability:`matchPicture`,settings:t,retry:async()=>{this.lastPicture&&await this.matchPicture(this.lastPicture,{...t,signal:void 0})},task:async({options:t,signal:o})=>{if(o.throwIfAborted(),a=await s({blob:e}),o.throwIfAborted(),t.mode===`hard`&&!this.state.hardHumanVerificationId){let e=await this.ensureHumanVerification({options:t,signal:o});if(e)return e}let c=await this.flows.startPictureFlow({picture:a,state:this.state,options:t,signal:o});o.throwIfAborted();let l;if(t.mode===`hard`){if(l=await this.submitHardVerification({configuration:t,endpoint:`/verification/picture/hard`,state:this.state,picture:a,sourceIds:[this.state.hardHumanVerificationId]}),l.outcome!==`completed`||l.matched!==!0)return l}else i=!0,l=await this.recordFastVerification({flow:`match_picture`,startedAt:n,performanceStartedAt:r,outcome:`completed`,result:c,codes:[],picture:a});return this.display.retry.value=null,l},onError:async({error:e,options:t,signal:o})=>{this.shouldRecordFailure({submissionStarted:i,options:t,error:e,signal:o})&&await this.recordFastVerification({flow:`match_picture`,startedAt:n,performanceStartedAt:r,outcome:`failed`,error:e,codes:[],picture:a})}})}stop(){this.operationController?.abort(new DOMException(m.VERIFICATION_CANCELLED,`AbortError`)),this.flows.stop({state:this.state}),this.display.retry.value=null,this.notifyStatus({status:`ready`})}dispose(){if(!this.disposed){this.disposed=!0,this.preparationController?.abort(),this.stop();for(let e of this.subscriptions)e();this.subscriptions.clear(),this.videoElement.removeEventListener(`resize`,this.resizeListener),f(null,this.root),this.state.captures={},this.state.preparedCaptures={},this.state.faceEmbeddings={},this.state.documentCodes=[],this.state.identity=null,this.state.hardHumanVerificationId=null,this.state.hardDocumentVerificationId=null,this.state.faceCaptureConfiguration=null,this.state.documentCaptureConfiguration=null,delete this.state.document,this.lastPicture=null}}forgetHuman(){if(this.disposed)throw Error(m.SDK_NOT_READY);this.flows.resetFaceFlow({state:this.state}),this.display.error.value=null,this.flows.notifyCapturesChanged({state:this.state})}forgetDocument(){if(this.disposed)throw Error(m.SDK_NOT_READY);this.flows.resetDocumentFlow({state:this.state}),this.display.error.value=null,this.flows.notifyCapturesChanged({state:this.state})}getState(){return{activity:this.display.activity.value,error:this.display.error.value,retryAvailable:this.display.retry.value!==null,feedback:this.display.feedback.value,debug:this.display.debug.value}}subscribe(e){if(this.disposed)throw Error(m.SDK_NOT_READY);let t=_(()=>e(this.getState()));return this.subscriptions.add(t),()=>{t(),this.subscriptions.delete(t)}}};p({moduleUrl:import.meta.url});var le=$;export{le as default};
@@ -0,0 +1,3 @@
1
+ /*! Copyright (c) 2026 VOLTOM. All rights reserved. Proprietary software. See LICENSE at https://voltom.io/license. */
2
+ import{N as e,Q as t,Z as n,ct as r,et as i,lt as a,ot as o,st as s}from"./faceMatch.shared-D6B1I2T0.js";import{r as c}from"./presentation-BrCGZT1u.js";import{n as l,t as u}from"./feedback-Cs09W_hs.js";import{n as d,t as f}from"./DebugPanel-BJqGy2Dp.js";var p={documentTargets:{front:`frameDocument`,back:`frameDocumentBack`,passport:`framePassport`},rejections:{FACE_NOT_DETECTED:`faceNotFound`,FACE_IN_POLYGON:`faceInPolygon`,FACE_TOO_SMALL:`faceTooSmall`,FACE_CENTER_MOVE_LEFT:`faceCenterMoveLeft`,FACE_CENTER_MOVE_RIGHT:`faceCenterMoveRight`,FACE_CENTER_MOVE_UP:`faceCenterMoveUp`,FACE_CENTER_MOVE_DOWN:`faceCenterMoveDown`,FACE_STABILITY_REQUIRED:`stayStill`,DOCUMENT_NOT_DETECTED:`documentNotDetected`,DOCUMENT_BOX_TOO_SMALL:`documentBoxTooSmall`,DOCUMENT_BOX_TOO_LARGE:`documentBoxTooLarge`,DOCUMENT_BOX_NEAR_EDGE:`documentBoxNearEdge`,DOCUMENT_BOX_TOUCHES_EDGES:`documentBoxTouchesEdges`,DOCUMENT_SHAPE_INVALID:`documentShapeInvalid`,DOCUMENT_NOT_SUPPORTED:`documentNotSupported`,DOCUMENT_BLURRY:`documentBlurry`,DOCUMENT_FRONT_FACE_NOT_DETECTED:`faceNotVisibleInDocument`,DOCUMENT_FRONT_FACE_NOT_CONTAINED:`faceNotVisibleInDocument`,DOCUMENT_FRONT_FACE_TOO_SMALL:`documentPhotoTooSmall`,DOCUMENT_FRONT_FACE_SIZE_INVALID:`documentAlignmentInvalid`,DOCUMENT_FRONT_LAYOUT_INVALID:`documentAlignmentInvalid`,DOCUMENT_TEXT_NOT_READABLE:`documentNotReadable`,DOCUMENT_NOT_RECOGNIZED:`invalidDocument`,DOCUMENT_CODE_NOT_READABLE:`passportMrzNotReadable`,DOCUMENT_BACK_HAS_FACE:`documentBackHasFace`,DOCUMENT_BACK_SAME_AS_FRONT:`documentBackSameAsFront`,DOCUMENT_STABILITY_REQUIRED:`holdDocumentStill`,DOCUMENT_VALIDATION_FAILED:`documentValidationFailed`}},m=({target:e})=>p.documentTargets[e],h=({code:e})=>e in p.rejections?p.rejections[e]:l({code:e}),g=`/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
3
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-border-style:solid;--tw-leading:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-font-weight:initial}}}@layer components{[data-voltom-root]{width:100%;min-height:0;max-width:var(--container-5xl,64rem);gap:calc(var(--spacing,.25rem) * 3);padding-block:env(safe-area-inset-top);color:var(--color-slate-100,oklch(96.8% .007 247.896));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;flex-direction:column;margin-inline:auto;display:flex;position:relative;overflow:visible}[data-voltom-camera]{background-color:var(--color-black,#000);width:100%;aspect-ratio:var(--voltom-camera-ratio,4 / 3);flex-shrink:0;margin-inline:auto;position:relative;overflow:hidden;container-type:size}[data-voltom-camera]>video,[data-voltom-mesh],[data-voltom-overlay]{object-fit:contain;width:100%;height:100%;position:absolute;inset:0}[data-voltom-mesh],[data-voltom-overlay]{object-fit:fill}[data-voltom-mesh],[data-voltom-overlay],[data-voltom-guide],[data-voltom-challenge],[data-voltom-result],[data-voltom-spinner],[data-voltom-feedback]{pointer-events:none}[data-voltom-feedback]{z-index:10;justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 3);padding-inline:calc(var(--spacing,.25rem) * 4);text-align:center;flex-direction:column;display:flex;position:absolute;inset:0}[data-voltom-camera][data-mirrored]>video,[data-voltom-camera][data-mirrored] [data-voltom-mesh]{--tw-scale-x:calc(100% * -1);scale:var(--tw-scale-x) var(--tw-scale-y)}[data-voltom-guide]{z-index:10;color:var(--color-white,#fff);position:absolute}[data-voltom-guide]:not([data-voltom-guide-mode]){display:none}[data-voltom-guide-mode=document]{border-style:var(--tw-border-style);--tw-border-style:dashed;border-style:dashed;border-width:2px;border-color:var(--color-white,#fff);height:90cqh;margin:auto;display:block;inset:0}[data-voltom-guide-mode=document][data-voltom-guide-orientation=landscape]{aspect-ratio:4/3}[data-voltom-guide-mode=document][data-voltom-guide-orientation=portrait]{aspect-ratio:3/4}[data-voltom-guide-mode=face]{aspect-ratio:3/4;height:80cqh;margin:auto;display:block;inset:0}@media (width<=639px){[data-voltom-guide-mode=face]{height:60cqh}}[data-voltom-guide] svg{width:100%;height:100%}[data-voltom-guide] path,[data-voltom-guide] circle,[data-voltom-guide] ellipse{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px;stroke-dasharray:6 6}[data-voltom-debug]{pointer-events:none;bottom:calc(var(--spacing,.25rem) * 3);left:calc(var(--spacing,.25rem) * 3);z-index:10;border-radius:var(--radius-md,.375rem);border-style:var(--tw-border-style);border-width:1px;border-color:#ffffff1a;width:220px;position:absolute}@supports (color:color-mix(in lab, red, red)){[data-voltom-debug]{border-color:color-mix(in oklab, var(--color-white,#fff) 10%, transparent)}}[data-voltom-debug]{background-color:#020618bf}@supports (color:color-mix(in lab, red, red)){[data-voltom-debug]{background-color:color-mix(in oklab, var(--color-slate-950,oklch(12.9% .042 264.695)) 75%, transparent)}}[data-voltom-debug]{padding-inline:calc(var(--spacing,.25rem) * 3);padding-block:calc(var(--spacing,.25rem) * 2);font-family:var(--font-mono,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);--tw-leading:calc(var(--spacing,.25rem) * 4);font-size:10px;line-height:calc(var(--spacing,.25rem) * 4);color:var(--color-slate-400,oklch(70.4% .04 256.788));--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}@media (width>=40rem){[data-voltom-debug]{font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)))}}[data-voltom-debug] [data-valid=true]{color:var(--color-emerald-300,oklch(84.5% .143 164.978))}[data-voltom-debug] [data-valid=false]{color:var(--color-rose-300,oklch(81% .117 11.638))}[data-voltom-overlay][data-idle]{background-color:#020618b3;place-items:center;display:grid}@supports (color:color-mix(in lab, red, red)){[data-voltom-overlay][data-idle]{background-color:color-mix(in oklab, var(--color-slate-950,oklch(12.9% .042 264.695)) 70%, transparent)}}[data-voltom-overlay][data-idle]:before{border-radius:var(--radius-md,.375rem);border-style:var(--tw-border-style);border-width:1px;border-color:#53eafd80}@supports (color:color-mix(in lab, red, red)){[data-voltom-overlay][data-idle]:before{border-color:color-mix(in oklab, var(--color-cyan-300,oklch(86.5% .127 207.078)) 50%, transparent)}}[data-voltom-overlay][data-idle]:before{background-color:#020618cc}@supports (color:color-mix(in lab, red, red)){[data-voltom-overlay][data-idle]:before{background-color:color-mix(in oklab, var(--color-slate-950,oklch(12.9% .042 264.695)) 80%, transparent)}}[data-voltom-overlay][data-idle]:before{padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 3);text-align:center;font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)));color:var(--color-cyan-300,oklch(86.5% .127 207.078));--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);content:attr(data-voltom-overlay-label)}:root[data-theme=light] [data-voltom-overlay][data-idle]:before{border-color:var(--color-white,#fff);color:var(--color-white,#fff)}@media (prefers-color-scheme:light){:root:not([data-theme]) [data-voltom-overlay][data-idle]:before{border-color:var(--color-white,#fff);color:var(--color-white,#fff)}}[data-voltom-overlay][data-error]:before{content:none}[data-voltom-challenge]{top:calc(var(--spacing,.25rem) * 5);z-index:10;--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);width:max-content;max-width:calc(100vw - 2rem);translate:var(--tw-translate-x) var(--tw-translate-y);justify-content:center;align-items:center;column-gap:calc(var(--spacing,.25rem) * 2);border-radius:var(--radius-3xl,1.5rem);background-color:var(--color-black,#000);padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 2);color:var(--color-white,#fff);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);flex-wrap:wrap;display:flex;position:absolute;left:50%}[data-voltom-challengeText]{text-align:center;font-size:var(--text-lg,1.125rem);line-height:var(--tw-leading,var(--text-lg--line-height,calc(1.75 / 1.125)));--tw-font-weight:var(--font-weight-semibold,600);font-weight:var(--font-weight-semibold,600);display:block}@media (width>=40rem){[data-voltom-challengeText]{font-size:var(--text-lg,1.125rem);line-height:var(--tw-leading,var(--text-lg--line-height,calc(1.75 / 1.125)))}}[data-voltom-challengeArrow]{font-size:var(--text-3xl,1.875rem);line-height:var(--tw-leading,var(--text-3xl--line-height,calc(2.25 / 1.875)));--tw-leading:1;color:var(--color-white,#fff);justify-content:center;align-items:center;line-height:1;display:flex}[data-voltom-challenge=faceStraight] [data-voltom-challengeArrow]{font-size:var(--text-4xl,2.25rem);line-height:var(--tw-leading,var(--text-4xl--line-height,calc(2.5 / 2.25)));margin-top:-5px}[data-voltom-challenge]:where([data-voltom-challenge=faceUp],[data-voltom-challenge=faceDown],[data-voltom-challenge=faceLeft],[data-voltom-challenge=faceRight],[data-voltom-challenge=faceTiltLeft],[data-voltom-challenge=faceTiltRight]) [data-voltom-challengeArrow]{font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)))}[data-voltom-challenge=faceWinkLeft] [data-voltom-challengeArrow]{margin-top:calc(var(--spacing,.25rem) * -1)}[data-voltom-challenge=faceSmile] [data-voltom-challengeArrow]{margin-top:calc(var(--spacing,.25rem) * -3)}[data-voltom-challenge=document] [data-voltom-challengeArrow]{font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)));margin-top:2px}[data-voltom-spinner]{z-index:20;justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 3);background-color:#020618e6;flex-direction:column;display:flex;position:absolute;inset:0}@supports (color:color-mix(in lab, red, red)){[data-voltom-spinner]{background-color:color-mix(in oklab, var(--color-slate-950,oklch(12.9% .042 264.695)) 90%, transparent)}}[data-voltom-spinner]{text-align:center;font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)));--tw-font-weight:var(--font-weight-semibold,600);font-weight:var(--font-weight-semibold,600);color:var(--color-slate-200,oklch(92.9% .013 255.508));--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}[data-voltom-spinner]:before{width:calc(var(--spacing,.25rem) * 8);height:calc(var(--spacing,.25rem) * 8);animation:var(--animate-spin,spin 1s linear infinite);border-style:var(--tw-border-style);border-width:4px;border-color:#ffffff4d;border-radius:2147483647px;display:block}@supports (color:color-mix(in lab, red, red)){[data-voltom-spinner]:before{border-color:color-mix(in oklab, var(--color-white,#fff) 30%, transparent)}}[data-voltom-spinner]:before{border-top-color:var(--color-cyan-300,oklch(86.5% .127 207.078))}@media (prefers-reduced-motion:reduce){[data-voltom-spinner]:before{animation:none}}[data-voltom-spinner]:before{content:""}[data-voltom-result]{pointer-events:auto;border-radius:var(--radius-md,.375rem);width:fit-content;max-width:100%;padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 2);font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)));--tw-font-weight:var(--font-weight-semibold,600);font-weight:var(--font-weight-semibold,600);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}[data-voltom-retry]{pointer-events:auto;border-radius:var(--radius-md,.375rem);border-style:var(--tw-border-style);border-width:1px;border-color:#fff3}@supports (color:color-mix(in lab, red, red)){[data-voltom-retry]{border-color:color-mix(in oklab, var(--color-white,#fff) 20%, transparent)}}[data-voltom-retry]{background-color:#0f172be6}@supports (color:color-mix(in lab, red, red)){[data-voltom-retry]{background-color:color-mix(in oklab, var(--color-slate-900,oklch(20.8% .042 265.755)) 90%, transparent)}}[data-voltom-retry]{padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 3);font-size:var(--text-xl,1.25rem);line-height:var(--tw-leading,var(--text-xl--line-height,calc(1.75 / 1.25)));--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700);color:var(--color-white,#fff);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){[data-voltom-retry]{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black,#000) 30%, transparent) var(--tw-shadow-alpha), transparent)}}[data-voltom-retry]{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s))}@media (hover:hover){[data-voltom-retry]:hover{background-color:var(--color-slate-800,oklch(27.9% .041 260.031))}}[data-voltom-result].is-success{border-style:var(--tw-border-style);border-width:1px;border-color:#05df7280}@supports (color:color-mix(in lab, red, red)){[data-voltom-result].is-success{border-color:color-mix(in oklab, var(--color-green-400,oklch(79.2% .209 151.711)) 50%, transparent)}}[data-voltom-result].is-success{background-color:#002c22e6}@supports (color:color-mix(in lab, red, red)){[data-voltom-result].is-success{background-color:color-mix(in oklab, var(--color-emerald-950,oklch(26.2% .051 172.552)) 90%, transparent)}}[data-voltom-result].is-success{color:var(--color-green-400,oklch(79.2% .209 151.711))}[data-voltom-result].is-failure{border-style:var(--tw-border-style);border-width:1px;border-color:#ff656880}@supports (color:color-mix(in lab, red, red)){[data-voltom-result].is-failure{border-color:color-mix(in oklab, var(--color-red-400,oklch(70.4% .191 22.216)) 50%, transparent)}}[data-voltom-result].is-failure{background-color:#4d0218e6}@supports (color:color-mix(in lab, red, red)){[data-voltom-result].is-failure{background-color:color-mix(in oklab, var(--color-rose-950,oklch(27.1% .105 12.094)) 90%, transparent)}}[data-voltom-result].is-failure{color:var(--color-red-400,oklch(70.4% .191 22.216))}}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-font-weight{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}`,_=({className:e,display:t,elements:r,options:i})=>{let[s,c]=o(!0),{translate:l,translateError:p}=n({language:i.language}),_=t.feedback.value,v=t.activity.value,y=v&&v!==`matching`?v.message:``,b=v===`matching`?l(`checkingFaceMatch`):y,x=t.error.value,S=t.cameraSize.value,C=_&&_.flow===`face`?_.pose:void 0,w=C?u({pose:C}):null,T=l(`lookStraight`);w&&(T=l(w.primary)),_&&_.flow===`document`&&(T=l(m({target:_.target})));let E=(_?.code?l(h({code:_.code})):``)||T,D=S&&S.width<S.height?`portrait`:`landscape`;return d(a,{children:[d(`style`,{"data-voltom-styles":``,children:g}),d(`div`,{className:e,ref:r.camera,"data-voltom":``,"data-voltom-camera":``,"data-mirrored":t.cameraFacingMode.value===`user`?``:void 0,style:{"--voltom-camera-ratio":S?`${S.width} / ${S.height}`:void 0},children:[d(`video`,{ref:r.video,"data-voltom-video":``,playsInline:!0,muted:!0,autoPlay:!0,onPlaying:()=>c(!1),onEmptied:()=>c(!0)}),d(`canvas`,{ref:r.mesh,"data-voltom-mesh":``}),d(`div`,{"data-voltom-overlay":``,"data-voltom-overlay-label":l(`readyToStart`),"data-idle":s?``:void 0,"data-error":x?``:void 0}),d(`div`,{"data-voltom-guide":``,"aria-hidden":`true`,"data-voltom-guide-mode":_?.flow,"data-voltom-guide-orientation":_?.flow===`document`?D:void 0,"data-voltom-guide-pose":C,children:C&&d(`svg`,{viewBox:`0 0 75 100`,focusable:`false`,children:d(`ellipse`,{cx:`37.5`,cy:`50`,rx:`33`,ry:`46`})})}),d(f,{kind:`voltom`,entries:t.debug.value}),d(`div`,{"data-voltom-spinner":``,className:v?void 0:`hidden`,role:`status`,"aria-label":b,children:y}),d(`div`,{"data-voltom-challenge":C??(_?`document`:void 0),className:_?void 0:`hidden`,children:[d(`span`,{"data-voltom-challengeArrow":``,children:w?w.arrow:`▭`}),d(`span`,{"data-voltom-challengeText":``,role:`status`,"aria-live":`polite`,children:E})]}),d(`div`,{"data-voltom-feedback":``,children:[d(`div`,{"data-voltom-result":``,className:x?`is-failure`:`hidden`,role:`status`,children:x?p({error:x}):``}),d(`button`,{"data-voltom-retry":``,className:x&&t.retry.value?void 0:`hidden`,type:`button`,"aria-label":l(`retry`),onClick:async()=>{let e=t.retry.value;if(t.error.value=null,e)try{await e()}catch{return}},children:l(`retry`)})]})]})]})},v=({root:n,options:a,display:o})=>{let l=({language:e})=>e??t(),u=({state:e})=>e.faceSequence[e.poseIndex]??`faceStraight`,f=0,p=({entries:e,state:t})=>{if(!o.debugEnabled.value||!t.flow)return;let n=performance.now();n-f<100||(f=n,o.debug.value=e)},m=()=>o.cameraSize.value?`${o.cameraSize.value.width}x${o.cameraSize.value.height}`:`—`,h=()=>{let t=e(),n=t.threading.startsWith(`multi`)?`multi`:`single`;return[{label:`Inference`,value:t.inference},{label:`Threading`,value:n}]},g=({face:e,faceInPolygon:t,processingTimeMilliseconds:n,state:r})=>{let i=e?e.pitch:null,s=e?e.yaw:null,d=e?e.roll:null,f=e?c({face:e,name:`mouthSmileLeft`}):0,g=e?c({face:e,name:`mouthSmileRight`}):0,_=e?c({face:e,name:`eyeBlinkLeft`}):0,v=e?c({face:e,name:`eyeBlinkRight`}):0,y=i!==null&&i>=a.minPitch&&i<=a.maxPitch,b=s!==null&&s>=a.minYaw&&s<=a.maxYaw,x=u({state:r}),S=d!==null&&(x===`faceTiltLeft`?d>a.maxRoll:x===`faceTiltRight`?d<-a.maxRoll:Math.abs(d)<=a.maxRoll),C=e=>e===null?`—`:e.toFixed(2),w=(e,t)=>`${e.toFixed(2)}|${t.toFixed(2)}`;p({state:r,entries:[{label:`Flow`,value:`FACE`},...h(),{label:`Face`,valid:!!e&&!t,value:e?t?`In polygon`:`Yes`:`No`},{label:`Pitch`,valid:y,value:C(i)},{label:`Yaw`,valid:b,value:C(s)},{label:`Roll`,valid:S,value:C(d)},{label:`Smile`,valid:f>=.5&&g>=.5,value:w(f,g)},{label:`Wink left`,valid:_>=.5&&v<=.35&&_>=v+.25,value:w(_,v)},{label:`Stable frames`,valid:r.poseStableFrames>0,value:`${r.poseStableFrames}/${a.requiredFaceStableFrames}`},{label:`Language`,value:l({language:a.language})},{label:`Camera`,value:m()},{label:`Facing mode`,value:o.cameraFacingMode.value??`—`},{label:`Frame time`,value:`${n.toFixed(0)} ms`}]})},v=({analysis:e,sideComparison:t,isBack:n,processingTimeMilliseconds:r,state:i})=>{let{orientation:s,alignment:c,documentKind:u,face:d,faceContained:f,detection:g}=e,{diagnostics:_,isBlurry:v,sharpness:y}=e.documentAnalysis,b=e.text.text,x={label:`Stable frames`,valid:i.documentStableFrames>0,value:`${i.documentStableFrames}/${a.requiredDocumentStableFrames}`},S=_?Object.keys(_.rejected)[0]:void 0,C=[{label:`Sharpness`,valid:v===null?void 0:!v,value:y===null?`—`:String(Math.round(y))},{label:`Rectangle`,valid:g?!0:!S&&void 0,value:g?`yes`:S??`no`},{label:`Orientation`,value:s?`${s.rotation}°`:`—`}],w=[{label:`Text`,valid:!!b,value:b?`yes`:`no`},{label:`Document type`,value:u??``},{label:`Distinct from front`,valid:t?.distinct,value:t?t.distinct?`yes`:`no`:`—`}],T=[{label:`Face`,valid:!!d,value:d?`yes`:`no`},{label:`Face contained`,valid:f,value:f?`yes`:`no`},{label:`Face area`,valid:c.faceAreaValid,value:`${(c.faceAreaRatio*100).toFixed(2)}%`},{label:`Face size`,valid:c.faceDimensionsValid,value:c.faceDimensionsValid?`yes`:`no`},{label:`Text`,valid:!!b,value:b?`yes`:`no`},{label:`Text parallel`,valid:c.textParallel,value:c.textParallel?`yes`:`no`},{label:`Text beside face`,valid:c.faceAdjacentTextLineCount>=2,value:String(c.faceAdjacentTextLineCount)},{label:`Document type`,value:u??``}];p({state:i,entries:[{label:`Flow`,value:n?`DOCUMENT BACK`:`DOCUMENT FRONT`},...h(),...C,...n?w:T,x,{label:`Language`,value:l({language:a.language})},{label:`Camera`,value:m()},{label:`Facing mode`,value:o.cameraFacingMode.value??`—`},{label:`Frame time`,value:`${r.toFixed(0)} ms`}]})},y={camera:s(),video:s(),mesh:s()};if(n.replaceChildren(),n.dataset.voltomRoot=``,r(d(_,{display:o,elements:y,options:a}),n),!y.camera.current||!y.video.current||!y.mesh.current)throw Error(i.UI_ELEMENT_NOT_FOUND);return{ref:{root:n,camera:y.camera.current,video:y.video.current,mesh:y.mesh.current},collectFaceDebug:g,collectDocumentDebug:v}};export{v as createVerificationView};
@@ -0,0 +1,2 @@
1
+ /*! Copyright (c) 2026 VOLTOM. All rights reserved. Proprietary software. See LICENSE at https://voltom.io/license. */
2
+ import{J as e,at as t,ct as n,et as r,g as i,h as a,lt as o,p as s,st as c}from"./faceMatch.shared-D6B1I2T0.js";import{n as l}from"./presentation-Jz2euuHa.js";import{n as u,t as d}from"./DebugPanel-BJqGy2Dp.js";var f=`[data-facekey-dialog]{width:100%;max-width:none;height:100dvh;max-height:none;padding:max(24px, env(safe-area-inset-top)) 24px max(24px, env(safe-area-inset-bottom));color:#f5f5f7;background:#050608;border:0;margin:0;position:fixed;inset:0;overflow-y:auto}[data-facekey-dialog]::backdrop{background:#050608}[data-facekey-dialog][open]{flex-direction:column;justify-content:center;align-items:center;gap:24px;display:flex}[data-facekey-dialog] [data-facekey-title]{letter-spacing:-.7px;margin:0;font-size:28px;font-weight:600}[data-facekey-dialog] [data-facekey-camera]{aspect-ratio:1;width:min(70vw,290px,44dvh);position:relative}[data-facekey-dialog] [data-facekey-camera] video{object-fit:cover;background:#13161b;border-radius:50%;width:100%;height:100%}[data-facekey-dialog] [data-facekey-camera][data-mirrored] video{transform:scaleX(-1)}[data-facekey-dialog] [data-facekey-camera] svg{width:calc(100% + 28px);height:calc(100% + 28px);position:absolute;inset:-14px;overflow:visible}[data-facekey-dialog] [data-facekey-debug]{z-index:1;color:#94a3b8;pointer-events:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#020617bf;border:1px solid #ffffff1a;border-radius:6px;width:min(220px,100% - 16px);padding:8px 10px;font:10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;position:absolute;bottom:8px;right:8px;box-shadow:0 4px 14px #00000059}[data-facekey-dialog] [data-facekey-debug].hidden{display:none}[data-facekey-dialog] [data-facekey-debug] [data-valid=true]{color:#6ee7b7}[data-facekey-dialog] [data-facekey-debug] [data-valid=false]{color:#fda4af}@media (width>=640px){[data-facekey-dialog] [data-facekey-debug]{font-size:12px}}@media (width>=768px){[data-facekey-dialog] [data-facekey-debug]{inset:50% auto auto calc(100% + 16px);transform:translateY(-50%)}}@media (width<=600px){[data-facekey-dialog] [data-facekey-debug]{top:max(8px, env(safe-area-inset-top));position:fixed;bottom:auto;left:8px;right:auto}}[data-facekey-dialog] [data-facekey-progress] circle{fill:none;stroke:#292d35;stroke-width:2px;stroke-linecap:round;transition:stroke .3s}[data-facekey-dialog] [data-facekey-progress] circle[data-complete]{stroke:#67e8a5}[data-facekey-dialog] [data-facekey-camera]>[data-facekey-check]{opacity:0;pointer-events:none;width:112px;height:112px;margin:auto;inset:0}[data-facekey-dialog] [data-facekey-check] circle{fill:#0a1711;stroke:#67e8a5;stroke-width:2px}[data-facekey-dialog] [data-facekey-check] path{fill:none;stroke:#67e8a5;stroke-width:5px;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1px}[data-facekey-dialog][data-state=processing] [data-facekey-progress]{animation:1s ease-in-out infinite alternate facekey-pulse}[data-facekey-dialog][data-state=failure] [data-facekey-progress] circle,[data-facekey-dialog] [data-facekey-camera][data-feedback=mismatch] [data-facekey-progress] circle{stroke:#ff6961}[data-facekey-dialog] [data-facekey-camera][data-shake]{animation:.42s ease-in-out facekey-shake}[data-facekey-dialog] [data-facekey-camera][data-feedback=match] video{opacity:.35}[data-facekey-dialog] [data-facekey-camera][data-feedback=match] [data-facekey-check]{animation:.42s ease-out both facekey-check-appear}[data-facekey-dialog] [data-facekey-camera][data-feedback=match] [data-facekey-check] path{animation:.24s ease-out 60ms both facekey-check-draw}[data-facekey-dialog] [data-facekey-status]{text-align:center;max-width:320px;min-height:48px;margin:0;font-size:21px;line-height:1.4}[data-facekey-dialog] [data-facekey-cancel]{color:#67e8a5;background:0 0;border:1px solid #67e8a5;border-radius:9px;padding:12px 20px;font-size:16px}[data-facekey-dialog] [data-facekey-cancel]:focus-visible{outline:none}@keyframes facekey-shake{0%,to{transform:translate(0)}15%,45%{transform:translate(-12px)}30%,60%{transform:translate(12px)}75%{transform:translate(-6px)}90%{transform:translate(4px)}}@keyframes facekey-check-appear{0%{opacity:0;transform:scale(.7)}65%{opacity:1;transform:scale(1.06)}to{opacity:1;transform:scale(1)}}@keyframes facekey-check-draw{0%{stroke-dashoffset:1px}to{stroke-dashoffset:0}}@keyframes facekey-pulse{to{opacity:.35}}@media (width<=600px){[data-facekey-dialog] [data-facekey-camera]{width:min(80vw,310px,47dvh)}}@media (prefers-reduced-motion:reduce){[data-facekey-dialog] *,[data-facekey-dialog] :before,[data-facekey-dialog] :after{transition:none;animation:none}[data-facekey-dialog] [data-facekey-camera][data-feedback=match] [data-facekey-check]{opacity:1}[data-facekey-dialog] [data-facekey-camera][data-feedback=match] [data-facekey-check] path{stroke-dashoffset:0}}`,p=({value:e})=>e===null?`—`:e.toFixed(2),m=({className:n,display:s,dialogRef:c,videoRef:p,options:m,onStop:h})=>{t(()=>{let t=c.current,n=p.current;if(!t||!n)throw Error(r.UI_ELEMENT_NOT_FOUND);let i=document.activeElement instanceof HTMLElement?document.activeElement:null,a=document.body.style.overflow;return document.body.style.overflow=`hidden`,t.showModal(),()=>{e({video:n}),t.open&&t.close(),document.body.style.overflow=a,i&&i.focus()}},[]);let g=s.phase.value,_=s.operation.value,{completed:v,total:y}=s.progress.value,b=100/y-(y===1?0:2),x=s.feedback.value,S;x&&(S=x.matched?`match`:`mismatch`);let C=s.instruction.value,w=`Preparing camera`;if((g===`checking`||g===`processing`)&&(w=`Checking your face`),g===`success`&&(w=`Done`),g===`failure`){let e=s.error.value;w=`Face not recognized`,e!==null&&(w=e instanceof Error?e.message:`FaceKey failed`)}if(g===`capturing`&&C){let{rejection:e,pose:t,retry:n}=C;w={FACE_NOT_DETECTED:`Keep one face in view`,FACE_IN_POLYGON:`Not a real human. Show your real face.`,FACE_TOO_SMALL:`Move closer`,FACE_NOT_CENTERED:`Center your face in the circle`}[e??``]??n??l({pose:t,rejection:e,language:m.language})}let T=[...s.debug.value],E=s.match.value;if(T.length&&E){let e=_===`enroll`?a:i,t=E.reason??`unavailable`;E.score!==null&&(t=`${E.score.toFixed(4)} / ${e}`),E.reference&&(t=`Reference`),T.push({label:_===`enroll`?`Similarity`:`Server score`,valid:E.accepted,value:t})}return u(o,{children:[u(`style`,{"data-facekey-styles":``,children:f}),u(`dialog`,{className:n,ref:c,"data-facekey-dialog":``,"data-state":g===`checking`?`capturing`:g,"aria-labelledby":`facekey-title`,"aria-describedby":`facekey-status`,onCancel:e=>{e.preventDefault(),h()},children:[u(`h2`,{id:`facekey-title`,"data-facekey-title":``,children:_===`enroll`?`Set up FaceKey`:`Unlock with FaceKey`}),u(`div`,{"data-facekey-camera":``,"data-mirrored":s.facingMode.value===`user`?``:void 0,"data-feedback":S,"data-shake":x&&!x.matched&&x.animating&&s.failures.value%3==0?``:void 0,children:[u(`video`,{ref:p,playsInline:!0,muted:!0,autoPlay:!0,"aria-label":`Camera preview`}),u(`svg`,{"data-facekey-ring":``,viewBox:`0 0 100 100`,role:`progressbar`,"aria-label":`Face capture progress`,"aria-valuemin":0,"aria-valuemax":y,"aria-valuenow":v,children:u(`g`,{"data-facekey-progress":``,transform:`rotate(-90 50 50)`,children:Array.from({length:y},(e,t)=>u(`circle`,{cx:`50`,cy:`50`,r:`50`,pathLength:`100`,"stroke-dasharray":`${b} ${100-b}`,"stroke-dashoffset":-t*100/y,"data-complete":t<v?``:void 0},t))})}),u(`svg`,{"data-facekey-check":``,viewBox:`0 0 100 100`,"aria-hidden":`true`,children:[u(`circle`,{cx:`50`,cy:`50`,r:`44`}),u(`path`,{d:`M29 51 43 65 72 36`,pathLength:`1`})]}),u(d,{kind:`facekey`,entries:T})]}),u(`p`,{id:`facekey-status`,"data-facekey-status":``,role:`status`,"aria-live":`polite`,children:w}),u(`button`,{type:`button`,"data-facekey-cancel":``,autoFocus:!0,onClick:h,children:`Cancel`})]})]})},h=({options:e,display:t,events:i,onStop:a})=>{let o=c(),l=c(),d=null,f=0;return{get dialog(){return o.current},requiredVideo:()=>{if(!l.current)throw Error(r.INVALID_OPTIONS);return l.current},open:()=>{if(d)throw Error(r.INVALID_OPTIONS);d=document.createElement(`div`),d.dataset.facekeyRoot=``,document.body.append(d),f=0,n(u(m,{display:t,dialogRef:o,videoRef:l,options:e,onStop:a}),d),i.dispatchEvent(new CustomEvent(`facekey:open`,{detail:o.current}))},close:()=>{d&&(n(null,d),d.remove(),d=null,i.dispatchEvent(new Event(`facekey:close`)))},collectCaptureDebug:({centered:e,face:n,faceInPolygon:r,faces:i,force:a=!1,frame:c,framing:l,operation:u,pose:d,poseRejection:m,reason:h,stable:g})=>{let _=n?n.boundingRect.height/Math.min(c.width,c.height):null,v=n?.blendshapes.mouthSmileLeft??null,y=n?.blendshapes.mouthSmileRight??null,b=!(!n||m),x=[{label:`Flow`,value:u.toUpperCase()},{label:`Pose`,value:d},{label:`Faces`,valid:i.length===1,value:String(i.length)},{label:`Human`,valid:!!n&&!r,value:n?r?`In polygon`:`Yes`:`No face`},{label:`Height`,valid:!l,value:_===null?`—`:`${(_*100).toFixed(0)}% / ${s*100}%`},{label:`Centered`,valid:e,value:e?`Yes`:`No`},{label:`Pitch`,value:p({value:n?.pitch??null})},{label:`Yaw`,value:p({value:n?.yaw??null})},{label:`Roll`,value:p({value:n?.roll??null})},{label:`Pose valid`,valid:b,value:m??`Yes`}];d===`faceSmile`&&x.push({label:`Smile`,valid:v!==null&&y!==null&&v>=.5&&y>=.5,value:`${p({value:v})}|${p({value:y})}`}),x.push({label:`Stable`,valid:g>0,value:`${g}/3`}),h&&x.push({label:`Reason`,valid:!1,value:h});let S=performance.now();!t.debugEnabled.value||!o.current?.open||!a&&S-f<100||(f=S,t.debug.value=x)}}};export{h as createFaceKeyView};
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@voltom.io/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "files": [
6
+ "LICENSE",
7
+ "dist/sdk/*.js",
8
+ "dist/sdk/verify.d.ts",
9
+ "dist/sdk/facekey.d.ts",
10
+ "dist/sdk/verify/global.d.ts",
11
+ "dist/sdk/facekey/global.d.ts"
12
+ ],
13
+ "type": "module",
14
+ "imports": {
15
+ "#sdk/*": {
16
+ "types": "./dist/sdk/*.d.ts",
17
+ "default": "./src/*"
18
+ }
19
+ },
20
+ "exports": {
21
+ "./verify": {
22
+ "types": "./dist/sdk/verify.d.ts",
23
+ "import": "./dist/sdk/verify.js",
24
+ "default": "./dist/sdk/verify.js"
25
+ },
26
+ "./facekey": {
27
+ "types": "./dist/sdk/facekey.d.ts",
28
+ "import": "./dist/sdk/facekey.js",
29
+ "default": "./dist/sdk/facekey.js"
30
+ },
31
+ "./verify/global": {
32
+ "types": "./dist/sdk/verify/global.d.ts"
33
+ },
34
+ "./facekey/global": {
35
+ "types": "./dist/sdk/facekey/global.d.ts"
36
+ }
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "test": "vitest run",
43
+ "test:ui": "HEADED=1 vitest run --ui",
44
+ "dev": "vite dev --logLevel silent",
45
+ "build": "vite build",
46
+ "start": "NODE_ENV=production node src/server.ts"
47
+ },
48
+ "dependencies": {
49
+ "@fastify/static": "^10.1.8",
50
+ "@preact/signals": "^2.11.4",
51
+ "analysis": "workspace:*",
52
+ "fastify": "^5.12.7",
53
+ "preact": "^11.1.0",
54
+ "types": "workspace:*"
55
+ },
56
+ "devDependencies": {
57
+ "@tailwindcss/vite": "^4.3.3",
58
+ "@typescript/typescript6": "^6.0.2",
59
+ "rollup-plugin-visualizer": "^7.1.1",
60
+ "tailwindcss": "^4.3.3",
61
+ "vite": "^8.3.5",
62
+ "vite-plugin-compression2": "^2.5.3",
63
+ "vite-plugin-dts": "^5.1.2"
64
+ }
65
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.