@checktiv/sdk-web 1.4.0 → 1.6.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.
Files changed (47) hide show
  1. package/README.md +81 -0
  2. package/dist/agents/AGENTS.md +2 -1
  3. package/dist/agents/manifest.json +1 -1
  4. package/dist/{api-CkHzWaTo.d.ts → api-DWWQGjxL.d.ts} +23 -3
  5. package/dist/capture-ui.css +1 -1
  6. package/dist/capture-ui.d.ts +5 -4
  7. package/dist/capture-ui.js +3 -3
  8. package/dist/capture.d.ts +3 -3
  9. package/dist/capture.js +2 -2
  10. package/dist/challenge.js +2 -4
  11. package/dist/chunk-7F7ZMYB7.js +7 -0
  12. package/dist/{chunk-ZXE45FN5.js → chunk-CGSNIVQF.js} +2 -2
  13. package/dist/chunk-D23CFGJB.js +13 -0
  14. package/dist/chunk-EYSE7JJ4.js +5 -0
  15. package/dist/chunk-JRJRXR7Q.js +7 -0
  16. package/dist/{chunk-ACQKQLL2.js → chunk-KK66RKPI.js} +2 -2
  17. package/dist/{chunk-6U53T32A.js → chunk-NHNGQ5BB.js} +3 -4
  18. package/dist/chunk-OC5N6W7T.js +3 -0
  19. package/dist/chunk-S2OOEDJS.js +3 -0
  20. package/dist/chunk-TORKYG3K.js +6 -0
  21. package/dist/chunk-YPYFPHOH.js +9 -0
  22. package/dist/collect-user-info.d.ts +64 -0
  23. package/dist/collect-user-info.js +9 -0
  24. package/dist/{controller-CFL3mA5e.d.ts → controller-e63nkNGE.d.ts} +1 -1
  25. package/dist/{copy-Dfmk11S_.d.ts → copy-CC_mrlVV.d.ts} +1 -1
  26. package/dist/custom-form.d.ts +3 -3
  27. package/dist/custom-form.js +5 -3
  28. package/dist/fraud.d.ts +3 -3
  29. package/dist/fraud.js +5 -3
  30. package/dist/idv/cross-device.d.ts +6 -4
  31. package/dist/idv/cross-device.js +5 -5
  32. package/dist/idv.css +1 -1
  33. package/dist/idv.d.ts +3 -3
  34. package/dist/idv.js +9 -7
  35. package/dist/{index-Ch6p6GHo.d.ts → index-B9Gc_xWl.d.ts} +6 -4
  36. package/dist/index.d.ts +7 -6
  37. package/dist/index.js +6 -3
  38. package/dist/{machine-CuZalPFX.d.ts → machine-DZPN-A44.d.ts} +5 -1
  39. package/dist/react.d.ts +5 -4
  40. package/dist/react.js +9 -5
  41. package/dist/workspace.d.ts +3 -3
  42. package/dist/workspace.js +1 -1
  43. package/package.json +7 -3
  44. package/dist/chunk-2ZXL5RVX.js +0 -10
  45. package/dist/chunk-5AQCMTZV.js +0 -6
  46. package/dist/chunk-5MNNRYD5.js +0 -7
  47. package/dist/chunk-7NIKMJFJ.js +0 -6
@@ -0,0 +1,3 @@
1
+ var ERROR_TABLE={origin_not_allowed:{recoverable:false,recovery:"contact_operator",message:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console."},token_expired:{recoverable:true,recovery:"retry",message:"The session token expired. The SDK is refreshing it; if this persists, mint a new token from your backend."},session_expired:{recoverable:false,recovery:"refresh_session",message:"The verification session is no longer valid. Start a new verification from your backend."},wrong_token_type:{recoverable:false,recovery:"contact_operator",message:"This verification could not start. Contact the site operator."},protocol_mismatch:{recoverable:false,recovery:"contact_operator",message:"The SDK version is out of date. Update to the latest published version."},camera_denied:{recoverable:true,recovery:"cross_device",message:"Camera access was blocked. Allow camera access, or continue on another device."},camera_unsupported:{recoverable:true,recovery:"cross_device",message:"Your camera does not meet the minimum resolution needed for capture. Try another device, or continue on your phone."},cv_gate_failed:{recoverable:true,recovery:"retry",message:"We could not read the image clearly. Try again with better lighting and a steady hand."},upload_failed:{recoverable:true,recovery:"retry",message:"The upload did not complete. Check the connection and try again."},sdk_load_failed:{recoverable:true,recovery:"cross_device",message:"Verification could not start on this device. Try again, or continue on another device."},biometric_unsupported:{recoverable:false,recovery:"contact_operator",message:"This capture is not supported on this page. Contact the site operator."},isolation_required:{recoverable:false,recovery:"contact_operator",message:"This page configuration is not supported. Contact the site operator."}};Object.keys(ERROR_TABLE).filter(key=>key in ERROR_TABLE);function createChecktivError(code){const entry=ERROR_TABLE[code];return {code,...entry}}function mapHttpStatusToError(status){if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===429)return "upload_failed";if(status>=500)return "upload_failed";return "session_expired"}
2
+
3
+ export { createChecktivError, mapHttpStatusToError };
@@ -0,0 +1,3 @@
1
+ function createTokenManager(source,sessionId){const mint=reason=>typeof source==="string"?Promise.resolve(source):source({sessionId:sessionId(),reason});let cached=null;let pending=null;return {get(){if(cached!==null)return cached;const p=mint("initial");cached=p;void p.catch(()=>{if(cached===p)cached=null;});return p},refresh(reason){if(pending!==null)return pending;const p=mint(reason);pending=p;cached=p;void p.then(()=>{if(pending===p)pending=null;},()=>{if(pending===p)pending=null;if(cached===p)cached=null;});return p}}}async function withTokenRetry(tokens,fn,isUnauthorized){const first=await tokens.get();let result;let error;try{result=await fn(first);}catch(err){error=err;}if(error===void 0&&result!==void 0&&!isUnauthorized(result,void 0)){return result}if(error!==void 0&&!isUnauthorized(void 0,error)){throw error}const fresh=await tokens.refresh("401");return fn(fresh)}
2
+
3
+ export { createTokenManager, withTokenRetry };
@@ -0,0 +1,6 @@
1
+ import { external_exports } from './chunk-NHNGQ5BB.js';
2
+ import { IDV_DOCUMENT_TYPES, isTwoSidedDocumentType } from './chunk-IQKHRPJR.js';
3
+
4
+ var behaviorTraitsSchema=external_exports.object({webdriver:external_exports.boolean(),maxTouchPoints:external_exports.number().int().min(0).max(512),timezone:external_exports.string().max(64).nullable(),pluginCount:external_exports.number().int().min(0).max(256),deviceModelHint:external_exports.string().max(120).nullable()}).strict();var behaviorStepSchema=external_exports.object({stepId:external_exports.string().max(80),seconds:external_exports.number().min(0).max(86400),pasteCount:external_exports.number().int().min(0).max(1e4)}).strict();var behaviorSurfaceEnum=external_exports.enum(["parent","embed"]);var behaviorCapturedPayloadSchema=external_exports.object({steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema,segments:external_exports.array(external_exports.object({surface:behaviorSurfaceEnum,steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict()).max(4).optional()}).strict();behaviorCapturedPayloadSchema.extend({ingress:external_exports.enum(["hosted","embedded"]).optional(),stepId:external_exports.string().max(128).optional()}).strict();var REGION_IDS=["us","eu"];var SystemModes=["live","test"];var DataRegions=REGION_IDS;var CURRENT_PROTOCOL_VERSION=1;var LivenessAwsRegions=["us-east-1","eu-west-1"];({us:LivenessAwsRegions[0],eu:LivenessAwsRegions[1]});external_exports.uuid();external_exports.email().toLowerCase();external_exports.object({createdAt:external_exports.iso.datetime(),updatedAt:external_exports.iso.datetime()});var dataRegionEnum=external_exports.enum(DataRegions);var dataModeEnum=external_exports.enum(SystemModes);external_exports.object({orgId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum});external_exports.object({orgId:external_exports.string().min(1),actorId:external_exports.string().min(1),mode:dataModeEnum,region:dataRegionEnum,traceId:external_exports.string().optional()});var canonicalOriginSchema=external_exports.string().min(1).refine(v=>{if(v.includes("*"))return false;try{return new URL(v).origin===v}catch{return false}},"must be a canonical origin (scheme and host[:port], no path / query / fragment / credentials / wildcard)");canonicalOriginSchema.refine(v=>{try{return new URL(v).protocol==="https:"}catch{return false}},"must be a canonical https-only origin (scheme https: and host[:port], no path / query / fragment / credentials / wildcard)");var MAX_FIELDS_PER_SCREEN=8;var MAX_RULES_PER_SCREEN=10;var MAX_LOCALES=5;var MAX_LABEL_LEN=600;var bcp47LocaleSchema=external_exports.string().regex(/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$/,"must be a BCP-47 locale tag");var bcp47I18nLabelSchema=external_exports.record(bcp47LocaleSchema,external_exports.string().max(MAX_LABEL_LEN)).refine(map=>Object.keys(map).length<=MAX_LOCALES,{message:`at most ${MAX_LOCALES} locales per label`});var FORM_FIELD_TYPES=["short_text","long_text","number","email","phone","date","single_select","multi_select","boolean","file_upload","content_heading","content_paragraph"];var RESERVED_SLUGS=new Set(["__proto__","constructor","prototype"]);var formFieldSlugSchema=external_exports.string().regex(/^[a-z][a-z0-9_]{0,63}$/,"must be a lowercase slug").refine(s=>!RESERVED_SLUGS.has(s),{message:"reserved slug is not allowed"});var formFieldValidationSchema=external_exports.object({minLength:external_exports.number().int().nonnegative().optional(),maxLength:external_exports.number().int().positive().optional(),min:external_exports.number().optional(),max:external_exports.number().optional(),minSelections:external_exports.number().int().nonnegative().optional(),maxSelections:external_exports.number().int().positive().optional()}).strict();var formFieldOptionSchema=external_exports.object({value:external_exports.string().min(1).max(200),label:bcp47I18nLabelSchema}).strict();var formFieldSchema=external_exports.object({id:formFieldSlugSchema,type:external_exports.enum(FORM_FIELD_TYPES),label:bcp47I18nLabelSchema,helpText:bcp47I18nLabelSchema.optional(),required:external_exports.boolean().default(false),validation:formFieldValidationSchema.optional(),options:external_exports.array(formFieldOptionSchema).max(50).optional()}).strict();var formRuleOpEnum=external_exports.enum(["eq","neq","in"]);var formRuleActionEnum=external_exports.enum(["flag_for_review","notify_email"]);var formRuleValueSchema=external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean(),external_exports.array(external_exports.union([external_exports.string(),external_exports.number(),external_exports.boolean()]))]);var formRuleSchema=external_exports.object({id:formFieldSlugSchema,when:external_exports.object({fieldId:formFieldSlugSchema,op:formRuleOpEnum,value:formRuleValueSchema}).strict(),actions:external_exports.array(formRuleActionEnum).min(1),notifyOrgMemberIds:external_exports.array(external_exports.string().min(1)).max(25).optional()}).strict();var customFormScreenConfigSchema=external_exports.object({supportedLocales:external_exports.array(bcp47LocaleSchema).min(1).max(MAX_LOCALES),fields:external_exports.array(formFieldSchema).min(1).max(MAX_FIELDS_PER_SCREEN),rules:external_exports.array(formRuleSchema).max(MAX_RULES_PER_SCREEN).default([])}).strict();var hexColorSchema=external_exports.string().regex(/^#[0-9a-fA-F]{6}$/,"Must be a 6-digit hex color, e.g. #2563eb");var colorModeSchema=external_exports.enum(["auto","light","dark"]);external_exports.object({primaryColor:hexColorSchema,secondaryColor:hexColorSchema.nullable().default(null),colorMode:colorModeSchema.default("auto")});var organizationBrandingSchema=external_exports.object({brandName:external_exports.string().min(1).max(120).optional(),primaryColor:hexColorSchema.optional(),secondaryColor:hexColorSchema.nullable().optional(),colorMode:colorModeSchema.optional(),logoUrl:external_exports.url().optional()});organizationBrandingSchema.omit({logoUrl:true});var checkTypeEnum=external_exports.enum(["collect_user_info","watchlist","background_us_criminal","background_global","id_verification","custom_form"]);var testHintEnum=external_exports.enum(["pass","review","fail","doc_quality"]);var providerTypeEnum=external_exports.enum(["internal","external"]);var providerEnum=external_exports.enum(["autohost_ocr","autohost_adverse_media","autohost_background","autohost_sex_offender","autohost_watchlist","autohost_esign","internal","microblink","regula","certn","checkr","maxmind","twilio","aws_rekognition"]);var STEP_ID_REGEX=/^step_[0-9A-Za-z_-]{1,64}$/;var ADDRESS_TEXT_REGEX=/^[^\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069<>]+$/;var safeAddressText=max=>external_exports.string().min(1).max(max).regex(ADDRESS_TEXT_REGEX,"invalid characters");external_exports.object({line1:safeAddressText(120),line2:safeAddressText(120).optional(),city:safeAddressText(80),region:safeAddressText(80).optional(),postalCode:external_exports.string().max(20).regex(/^[A-Za-z0-9 \-]*$/).optional(),country:external_exports.string().length(2).regex(/^[A-Z]{2}$/),placeId:external_exports.string().max(255).regex(/^[A-Za-z0-9_\-:]+$/).optional(),formatted:safeAddressText(500).optional()});var applicantSkipPolicySchema=external_exports.object({minAttemptsBeforeShown:external_exports.number().int().nonnegative().default(0),requireReason:external_exports.boolean().default(false)}).loose();var i18nLabelSchema=external_exports.record(external_exports.string(),external_exports.string());var stepConditionSchema=external_exports.object({field:external_exports.string(),operator:external_exports.enum(["eq","neq","in","not_in"]),value:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())])}).optional();var workflowStepSchema=external_exports.object({checkType:checkTypeEnum,isRequired:external_exports.boolean().default(true),order:external_exports.number().int(),maxAttempts:external_exports.number().int().default(3),condition:stepConditionSchema,label:external_exports.string().optional()});external_exports.array(workflowStepSchema).min(1);external_exports.object({id:external_exports.string().regex(STEP_ID_REGEX).optional(),checkType:checkTypeEnum,isRequired:external_exports.boolean(),order:external_exports.number().int(),provider:providerEnum,providerType:providerTypeEnum,maxAttempts:external_exports.number().int(),label:external_exports.string().optional(),config:external_exports.record(external_exports.string(),external_exports.unknown()).optional(),gatesProgression:external_exports.boolean().default(false),preSatisfied:external_exports.boolean().optional()});var baseStepFields={id:external_exports.string().regex(STEP_ID_REGEX),order:external_exports.number().int().nonnegative(),isRequired:external_exports.boolean().default(true),applicantSkippable:external_exports.boolean().default(false),applicantSkipPolicy:applicantSkipPolicySchema.optional(),maxAttempts:external_exports.number().int().positive().default(3),label:i18nLabelSchema.optional(),description:i18nLabelSchema.optional(),dependsOn:external_exports.array(external_exports.string()).optional(),condition:external_exports.unknown().nullable().optional()};var backgroundConfigSchema=external_exports.object({jurisdictionScope:external_exports.enum(["us","eu","global"]).default("global"),recordTypesIncluded:external_exports.array(external_exports.enum(["criminal","sex_offender","adverse_media"])).min(1).default(["criminal"])}).default({jurisdictionScope:"global",recordTypesIncluded:["criminal"]});var watchlistConfigSchema=external_exports.object({lists:external_exports.array(external_exports.enum(["pep","ofac","eu","un"])).default([]),confidenceThreshold:external_exports.number().min(0).max(1).default(.8)}).default({lists:[],confidenceThreshold:.8});var COLLECT_USER_INFO_FIELDS=["email","phone","dob","address"];var collectUserInfoConfigSchema=external_exports.object({fields:external_exports.preprocess(raw=>{if(!Array.isArray(raw))return raw;return raw.filter(v=>v!=="name")},external_exports.array(external_exports.enum(COLLECT_USER_INFO_FIELDS))).default(["email","phone"]),captureStructuredName:external_exports.boolean().default(false)}).default({fields:["email","phone"],captureStructuredName:false});var idvDocumentTypeEnum=external_exports.enum(IDV_DOCUMENT_TYPES);var idVerificationConfigSchema=external_exports.object({documentTypes:idvDocumentTypeEnum.array().min(1).default([...IDV_DOCUMENT_TYPES]),biometricMode:external_exports.enum(["none","selfie","liveness"]).default("none"),requireMrzMatch:external_exports.boolean().default(false),requireExpiryValid:external_exports.boolean().default(true),requireNameMatch:external_exports.boolean().default(false),documentAuthenticity:external_exports.boolean().default(false),minAge:external_exports.number().int().min(0).max(150).optional()}).strict().default({documentTypes:[...IDV_DOCUMENT_TYPES],biometricMode:"none",requireMrzMatch:false,requireExpiryValid:true,requireNameMatch:false,documentAuthenticity:false});var watchlistStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("watchlist"),config:watchlistConfigSchema});var backgroundUsCriminalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_us_criminal"),config:backgroundConfigSchema});var backgroundGlobalStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("background_global"),config:backgroundConfigSchema});var collectUserInfoStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("collect_user_info"),config:collectUserInfoConfigSchema});var idVerificationStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("id_verification"),config:idVerificationConfigSchema});var customFormScreenStepSchema=external_exports.object({...baseStepFields,type:external_exports.literal("custom_form"),config:customFormScreenConfigSchema});external_exports.discriminatedUnion("type",[watchlistStepSchema,backgroundUsCriminalStepSchema,backgroundGlobalStepSchema,collectUserInfoStepSchema,idVerificationStepSchema,customFormScreenStepSchema]);var captureBrandTokensSchema=external_exports.object({primary:hexColorSchema,primaryHover:hexColorSchema,onPrimary:hexColorSchema,secondary:hexColorSchema,onSecondary:hexColorSchema,ring:hexColorSchema}).strict();var captureThemeSchema=external_exports.object({colorMode:external_exports.enum(["light","dark"]),brandTokens:captureBrandTokensSchema.nullable().default(null)}).strict();var captureDocumentSideEnum=external_exports.enum(["front","back"]);var captureDocumentGroupEnum=external_exports.enum(["unknown","dl","id","passport","passport-card","visa"]);var captureErrorCodeEnum=external_exports.enum(["cv_gate_failed","upload_failed","sdk_load_failed","token_expired","biometric_unsupported","camera_unsupported","selfie_camera_denied","liveness_camera_denied","liveness_timeout","liveness_server_error","liveness_runtime_error","liveness_cancelled","protocol_mismatch"]);external_exports.enum(["no_face","multiple_faces","too_dark","move_closer","not_centered","hold_still","ready"]);var selfiePromptMapSchema=external_exports.object({no_face:external_exports.string().min(1).max(120).optional(),multiple_faces:external_exports.string().min(1).max(120).optional(),too_dark:external_exports.string().min(1).max(120).optional(),move_closer:external_exports.string().min(1).max(120).optional(),not_centered:external_exports.string().min(1).max(120).optional(),hold_still:external_exports.string().min(1).max(120).optional(),ready:external_exports.string().min(1).max(120).optional()}).strict();var selfieChromeCopySchema=external_exports.object({shutterLabel:external_exports.string().min(1).max(80).optional(),shutterHint:external_exports.string().min(1).max(120).optional(),confirm:external_exports.string().min(1).max(80).optional(),retake:external_exports.string().min(1).max(80).optional()}).strict();var captureInitMessageSchema=external_exports.object({type:external_exports.literal("capture:init"),captureToken:external_exports.string().min(1),config:idVerificationConfigSchema,locale:external_exports.string().min(2).max(35),theme:captureThemeSchema,mode:dataModeEnum.optional(),testHint:testHintEnum.optional(),protocolVersion:external_exports.number().int().min(1).optional(),beginScanPrompt:external_exports.string().min(1).max(200).optional(),beginScanLabel:external_exports.string().min(1).max(80).optional(),selfiePromptMap:selfiePromptMapSchema.optional(),selfieChromeCopy:selfieChromeCopySchema.optional()}).strict();external_exports.object({data:external_exports.object({captureToken:external_exports.string().min(1),embedOrigin:canonicalOriginSchema,runIndex:external_exports.number().int().min(0),expiresAt:external_exports.iso.datetime({offset:true}),embedContextToken:external_exports.string().min(1),mode:dataModeEnum.optional(),testHint:testHintEnum.optional()}).strict()}).strict();var captureReadyMessageSchema=external_exports.object({type:external_exports.literal("capture:ready")}).strict();var captureDocumentCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:document-complete"),side:captureDocumentSideEnum,r2Key:external_exports.string().min(1)}).strict();var captureSelfieCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-complete"),r2Key:external_exports.string().min(1)}).strict();var captureCoachingMessageSchema=external_exports.object({type:external_exports.literal("capture:coaching"),state:external_exports.string().min(1).max(120),attemptIndex:external_exports.number().int().min(0)}).strict();var captureSelfieCvRejectMessageSchema=external_exports.object({type:external_exports.literal("capture:selfie-cv-reject"),retryReason:external_exports.string().min(1).max(120).optional(),attemptIndex:external_exports.number().int().min(0)}).strict();var captureErrorMessageSchema=external_exports.object({type:external_exports.literal("capture:error"),code:captureErrorCodeEnum}).strict();var captureBiometricCameraLiveMessageSchema=external_exports.object({type:external_exports.literal("capture:biometric_camera_live"),timestamp:external_exports.number().optional()}).strict();var idvR2KeysSchema=external_exports.object({front:external_exports.string().min(1),back:external_exports.string().min(1).optional(),selfie:external_exports.string().min(1).optional()}).strict();var captureAllCompleteMessageSchema=external_exports.object({type:external_exports.literal("capture:all-complete"),r2Keys:idvR2KeysSchema,documentGroup:captureDocumentGroupEnum.optional()}).strict();external_exports.object({stepId:external_exports.string().min(1),runIndex:external_exports.number().int().min(0),r2Keys:idvR2KeysSchema,traceId:external_exports.string().optional()}).strict();external_exports.object({stepId:external_exports.string().min(1).optional()}).strict();var idvLivenessStsCredentialsSchema=external_exports.object({accessKeyId:external_exports.string().min(1),secretAccessKey:external_exports.string().min(1),sessionToken:external_exports.string().min(1),expiration:external_exports.string().min(1)}).strict();var livenessAwsRegionEnum=external_exports.enum(LivenessAwsRegions);external_exports.object({awsSessionId:external_exports.string().min(1),awsRegion:livenessAwsRegionEnum,credentials:idvLivenessStsCredentialsSchema}).strict();var captureBehaviorMessageSchema=external_exports.object({type:external_exports.literal("capture:behavior"),steps:external_exports.array(behaviorStepSchema).max(50),traits:behaviorTraitsSchema}).strict();var captureFromIframeMessageSchema=external_exports.discriminatedUnion("type",[captureReadyMessageSchema,captureDocumentCompleteMessageSchema,captureSelfieCompleteMessageSchema,captureCoachingMessageSchema,captureSelfieCvRejectMessageSchema,captureErrorMessageSchema,captureAllCompleteMessageSchema,captureBehaviorMessageSchema,captureBiometricCameraLiveMessageSchema]);external_exports.discriminatedUnion("type",[captureInitMessageSchema]);var idvCvGateRetryReasonEnum=external_exports.enum(["no_face_detected","multiple_faces","low_confidence","no_id_document","image_read_failed"]);external_exports.object({ok:external_exports.boolean(),retryReason:idvCvGateRetryReasonEnum.optional()}).strict();external_exports.enum(["front","back","selfie"]);function reducer(state,action){switch(action.type){case "mint_ok":return {kind:"waiting_for_init",captureToken:action.captureToken,embedOrigin:action.embedOrigin,runIndex:action.runIndex};case "mint_failed":return {kind:"mint_error"};case "iframe_ready":if(state.kind==="waiting_for_init"){return {kind:"ready",embedOrigin:state.embedOrigin,runIndex:state.runIndex}}return state;case "phase":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:action.phase,coaching:null,lastCvRejectReason:action.phase==="selfie"&&state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:isBiometricPhase(action.phase)}}return state;case "coaching":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:"coaching",coaching:action.coaching,lastCvRejectReason:state.kind==="capturing"?state.lastCvRejectReason:null,biometricLoading:state.kind==="capturing"?state.biometricLoading:false}}return state;case "selfie_cv_reject":if(state.kind==="ready"||state.kind==="capturing"){return {kind:"capturing",embedOrigin:state.embedOrigin,runIndex:state.runIndex,phase:state.kind==="capturing"?state.phase:"selfie",coaching:state.kind==="capturing"?state.coaching:null,lastCvRejectReason:action.reason,biometricLoading:false}}return state;case "biometric_camera_live":if(state.kind==="capturing"){return {...state,biometricLoading:false}}return state;case "submitting":return {kind:"submitting"};case "submit_failed":return {kind:"submit_error"};case "submit_pending":return {kind:"submit_pending"};case "capture_superseded":return {kind:"capture_superseded"};case "token_expired":return {kind:"token_expired"};case "capture_error":return {kind:"capture_error",errorKind:action.errorKind};default:return state}}function nextCapturePhaseAfterDocument(side,documentTypes,biometricMode){if(side==="front"&&documentTypes.some(isTwoSidedDocumentType))return "document_back";if(biometricMode==="liveness")return "liveness";if(biometricMode==="selfie")return "selfie";return "uploading"}function isBiometricPhase(phase){return phase==="selfie"||phase==="liveness"}var RETRY_REASON_COACHING={no_face_detected:"hold_steady",multiple_faces:"hold_steady",low_confidence:"move_closer",no_id_document:"hold_steady",image_read_failed:"hold_steady"};function coachingKindForState(state){const retryParsed=idvCvGateRetryReasonEnum.safeParse(state);if(retryParsed.success)return RETRY_REASON_COACHING[retryParsed.data];switch(state){case "camera-too-far":return "move_closer";case "camera-too-close":case "document-too-close-to-frame-edge":return "move_farther";case "glare-detected":return "reduce_glare";case "too-dark":case "lighting-too-dark":return "too_dark";case "wrong-side":return "wrong_side";case "selfie_move_closer":return "move_closer";case "selfie_too_dark":return "too_dark";case "selfie_no_face":case "selfie_multiple_faces":case "selfie_not_centered":return "hold_steady";default:return "hold_steady"}}function createCaptureController(deps){let state={kind:"minting"};const stateListeners=new Set;const eventListeners=new Map;let captureToken=null;let pinnedOrigin=null;let runIndex=null;let started=false;let destroyed=false;let cancelled=false;let submitStarted=false;let messageListener=null;function setState(next){state=next;for(const listener of stateListeners)listener(state);}function dispatch(action){setState(reducer(state,action));}function emit(event){const listeners=eventListeners.get(event.type);if(listeners===void 0)return;for(const listener of listeners)listener(event);}function postInit(){if(destroyed||captureToken===null||pinnedOrigin===null)return false;const iframe=deps.getIframe();if(iframe===null||iframe.contentWindow===null)return false;const init={type:"capture:init",captureToken,...deps.initPayload()};iframe.contentWindow.postMessage(init,pinnedOrigin);return true}function handleMessage(msg){switch(msg.type){case "capture:ready":{const posted=postInit();if(posted&&state.kind==="waiting_for_init"){dispatch({type:"iframe_ready"});}return}case "capture:coaching":{dispatch({type:"coaching",coaching:coachingKindForState(msg.state)});deps.onCoaching?.(msg.state,msg.attemptIndex);return}case "capture:selfie-cv-reject":{const reason=msg.retryReason??null;dispatch({type:"selfie_cv_reject",reason});emit({type:"selfie-cv-reject",attemptIndex:msg.attemptIndex,reason});return}case "capture:document-complete":{const{config}=deps.initPayload();dispatch({type:"phase",phase:nextCapturePhaseAfterDocument(msg.side,config.documentTypes,config.biometricMode)});return}case "capture:selfie-complete":{dispatch({type:"phase",phase:"uploading"});return}case "capture:error":{if(msg.code==="token_expired"){dispatch({type:"token_expired"});return}dispatch({type:"capture_error",errorKind:msg.code});return}case "capture:all-complete":{void submitCapture(msg.r2Keys);return}case "capture:behavior":{deps.onBehaviorSegment?.({steps:msg.steps,traits:msg.traits});return}case "capture:biometric_camera_live":{dispatch({type:"biometric_camera_live"});return}default:{const _exhaustive=msg;return _exhaustive}}}async function submitCapture(r2Keys){if(submitStarted)return;submitStarted=true;if(runIndex===null){dispatch({type:"submit_failed"});return}if(deps.onBeforeSubmit){try{await deps.onBeforeSubmit();}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return}dispatch({type:"submitting"});let result;try{result=await deps.submit(runIndex,r2Keys);}catch{if(!destroyed)dispatch({type:"submit_failed"});return}if(destroyed)return;if(result.ok){emit({type:"all-complete",runIndex});return}if(result.reason==="token_expired"){dispatch({type:"token_expired"});return}if(result.reason==="signal_pending"){dispatch({type:"submit_pending"});return}if(result.reason==="capture_superseded"){dispatch({type:"capture_superseded"});return}dispatch({type:"submit_failed"});}function onWindowMessage(event){if(destroyed||pinnedOrigin===null)return;if(event.origin!==pinnedOrigin)return;if(event.source!==null&&event.source!==deps.getIframe()?.contentWindow)return;const parsed=captureFromIframeMessageSchema.safeParse(event.data);if(!parsed.success)return;handleMessage(parsed.data);}return {start(){if(destroyed||started)return;started=true;void(async()=>{try{const minted=await deps.mintToken();if(cancelled||destroyed)return;captureToken=minted.captureToken;pinnedOrigin=minted.embedOrigin;runIndex=minted.runIndex;messageListener=onWindowMessage;window.addEventListener("message",messageListener);dispatch({type:"mint_ok",...minted});}catch{if(cancelled||destroyed)return;dispatch({type:"mint_failed"});}})();},on(type,cb){let listeners=eventListeners.get(type);if(listeners===void 0){listeners=new Set;eventListeners.set(type,listeners);}listeners.add(cb);return ()=>{listeners?.delete(cb);}},subscribe(cb){stateListeners.add(cb);cb(state);return ()=>{stateListeners.delete(cb);}},handleReady(){if(destroyed)return;postInit();},destroy(){if(destroyed)return;destroyed=true;cancelled=true;if(messageListener!==null){window.removeEventListener("message",messageListener);messageListener=null;}}}}
5
+
6
+ export { CURRENT_PROTOCOL_VERSION, coachingKindForState, createCaptureController, isBiometricPhase, nextCapturePhaseAfterDocument, reducer };
@@ -0,0 +1,9 @@
1
+ import { parsePublishableKey, createWorkingTokenSource, createWorkingTokenManager } from './chunk-EYSE7JJ4.js';
2
+ import { resolveSession, warnWrongTokenPlane } from './chunk-7F7ZMYB7.js';
3
+ import { assertNever } from './chunk-UBQTPS5J.js';
4
+ import { withTokenRetry } from './chunk-S2OOEDJS.js';
5
+ import { stepSubmitPath, dataPlaneHeaders, resolveApiBaseOrigin } from './chunk-KK66RKPI.js';
6
+
7
+ var ERROR_MESSAGES={not_collect_step:"The current step does not collect user info. Mount the verification journey to continue.",validation_failed:"The submitted information was rejected. Check the required fields and try again.",token_expired:"The verification session expired. Create a new session so fetchToken returns a fresh client token, then try again.",origin_not_allowed:"This origin is not allowed for the publishable key. Add it to the allowed origins list in the Checktiv console.",rate_limited:"Too many requests. Wait a moment and try again.",service_unavailable:"The service is temporarily unavailable. Try again in a few seconds.",session_expired:"The verification session is no longer valid. Start a new verification from your backend.",wrong_token_type:"This verification could not start. Make sure fetchToken returns the client token, the same one you pass to Checktiv.mount().",network_error:"The request could not be completed. Check the connection and try again."};function fail(code){return {ok:false,code,message:ERROR_MESSAGES[code]}}function mapSubmitStatus(status){if(status===400||status===422)return "validation_failed";if(status===401)return "token_expired";if(status===403)return "origin_not_allowed";if(status===404)return "session_expired";if(status===429)return "rate_limited";if(status>=500)return "service_unavailable";return "session_expired"}function buildSubmitBody(input){const body={legalName:input.legalName};if(input.name!==void 0)body.name=input.name;if(input.email!==void 0)body.email=input.email;if(input.phone!==void 0)body.phone=input.phone;if(input.dateOfBirth!==void 0)body.dateOfBirth=input.dateOfBirth;if(input.address!==void 0)body.address=input.address;return body}function buildContext(session,fetchImpl){const scope="publishableKey"in session?{...parsePublishableKey(session.publishableKey),publishableKey:session.publishableKey}:{region:session.region,mode:session.mode,publishableKey:void 0};const apiBaseOrigin=resolveApiBaseOrigin(session.apiBase,scope.region,scope.mode);let clientTokenPromise=null;const getClientToken=()=>{if(clientTokenPromise!==null)return clientTokenPromise;const p=session.fetchToken();clientTokenPromise=p;void p.catch(()=>{if(clientTokenPromise===p)clientTokenPromise=null;});return p};const mintWorkingToken=createWorkingTokenSource(apiBaseOrigin,getClientToken,scope.publishableKey,fetchImpl);const tokens=createWorkingTokenManager(mintWorkingToken);let sessionId="";const ctx={region:scope.region,mode:scope.mode,publishableKey:scope.publishableKey,apiBaseOrigin,locale:"en",betas:[],tokens,getSessionId:()=>sessionId,setSessionId:id=>{sessionId=id;}};return {ctx,tokens}}function collectUserInfo(opts){const{session}=opts;const fetchImpl=session.fetchImpl??fetch;const{ctx,tokens}=buildContext(session,fetchImpl);return {async submit(input){try{const resolution=await resolveSession(ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return fail("wrong_token_type");case "unresolved":return fail("session_expired");case "nothing_to_render":return fail("not_collect_step");case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return fail("not_collect_step")}const body=buildSubmitBody(input);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(resolved.sessionId,resolved.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(body)}),result=>result?.status===401);}catch{return fail("network_error")}if(res.ok)return {ok:true};return fail(mapSubmitStatus(res.status))}finally{tokens.stop();}},async describe(){const fresh=buildContext(session,fetchImpl);try{const resolution=await resolveSession(fresh.ctx,fetchImpl);switch(resolution.kind){case "wrong_token":warnWrongTokenPlane();return {ok:false,code:"wrong_token_type"};case "unresolved":return {ok:false,code:"session_expired"};case "nothing_to_render":return {ok:false,code:"not_collect_step"};case "ok":break;default:return assertNever(resolution)}const resolved=resolution.session;if(resolved.stepType!=="collect_user_info"){return {ok:false,code:"not_collect_step"}}const config=resolved.collectUserInfoConfig;if(config===void 0){return {ok:true,fields:[],captureStructuredName:false}}return {ok:true,fields:config.fields,captureStructuredName:config.captureStructuredName}}finally{fresh.tokens.stop();}}}}
8
+
9
+ export { collectUserInfo };
@@ -0,0 +1,64 @@
1
+ import { A as ChecktivInitScope } from './api-DWWQGjxL.js';
2
+ import './machine-DZPN-A44.js';
3
+ import './copy-CC_mrlVV.js';
4
+ import './copy-DCeQ4JKx.js';
5
+
6
+ declare const COLLECT_USER_INFO_FIELDS: readonly ["email", "phone", "dob", "address"];
7
+ type CollectUserInfoField = (typeof COLLECT_USER_INFO_FIELDS)[number];
8
+
9
+ interface CollectUserInfoName {
10
+ first: string;
11
+ middle?: string;
12
+ last: string;
13
+ }
14
+ interface CollectUserInfoAddress {
15
+ line1: string;
16
+ line2?: string;
17
+ city: string;
18
+ region?: string;
19
+ postalCode?: string;
20
+ country: string;
21
+ placeId?: string;
22
+ formatted?: string;
23
+ }
24
+ interface CollectUserInfoSubmitInput {
25
+ legalName: string;
26
+ email?: string;
27
+ phone?: string;
28
+ dateOfBirth?: string;
29
+ address?: CollectUserInfoAddress;
30
+ name?: CollectUserInfoName;
31
+ }
32
+ interface CollectUserInfoConfig {
33
+ fields: CollectUserInfoField[];
34
+ captureStructuredName: boolean;
35
+ }
36
+ type CollectUserInfoSession = ChecktivInitScope & {
37
+ fetchToken: () => Promise<string>;
38
+ apiBase?: string;
39
+ fetchImpl?: typeof fetch;
40
+ };
41
+ interface CollectUserInfoOptions {
42
+ session: CollectUserInfoSession;
43
+ }
44
+ type CollectUserInfoSubmitErrorCode = 'not_collect_step' | 'validation_failed' | 'token_expired' | 'origin_not_allowed' | 'rate_limited' | 'service_unavailable' | 'session_expired' | 'wrong_token_type' | 'network_error';
45
+ type CollectUserInfoSubmitResult = {
46
+ ok: true;
47
+ } | {
48
+ ok: false;
49
+ code: CollectUserInfoSubmitErrorCode;
50
+ message: string;
51
+ };
52
+ type CollectUserInfoConfigResult = ({
53
+ ok: true;
54
+ } & CollectUserInfoConfig) | {
55
+ ok: false;
56
+ code: CollectUserInfoSubmitErrorCode;
57
+ };
58
+ interface CollectUserInfoCollector {
59
+ submit(input: CollectUserInfoSubmitInput): Promise<CollectUserInfoSubmitResult>;
60
+ describe(): Promise<CollectUserInfoConfigResult>;
61
+ }
62
+ declare function collectUserInfo(opts: CollectUserInfoOptions): CollectUserInfoCollector;
63
+
64
+ export { type CollectUserInfoAddress, type CollectUserInfoCollector, type CollectUserInfoConfig, type CollectUserInfoConfigResult, type CollectUserInfoName, type CollectUserInfoOptions, type CollectUserInfoSession, type CollectUserInfoSubmitErrorCode, type CollectUserInfoSubmitInput, type CollectUserInfoSubmitResult, collectUserInfo };
@@ -0,0 +1,9 @@
1
+ export { collectUserInfo } from './chunk-YPYFPHOH.js';
2
+ import './chunk-EYSE7JJ4.js';
3
+ import './chunk-7F7ZMYB7.js';
4
+ import './chunk-UBQTPS5J.js';
5
+ import './chunk-S2OOEDJS.js';
6
+ import './chunk-KK66RKPI.js';
7
+ import './chunk-IQKHRPJR.js';
8
+ import './chunk-QFA3K5ZV.js';
9
+ import './chunk-AIK7CDV6.js';
@@ -1,4 +1,4 @@
1
- import { f as CaptureState, I as IdvR2Keys, g as CaptureInitMessage, a as CaptureBehaviorMessage } from './machine-CuZalPFX.js';
1
+ import { f as CaptureState, I as IdvR2Keys, g as CaptureInitMessage, a as CaptureBehaviorMessage } from './machine-DZPN-A44.js';
2
2
 
3
3
  type CaptureEvent = {
4
4
  type: 'selfie-cv-reject';
@@ -1,4 +1,4 @@
1
- import { b as CoachingKind, d as CaptureErrorKind, e as CapturePhase } from './machine-CuZalPFX.js';
1
+ import { b as CoachingKind, d as CaptureErrorKind, e as CapturePhase } from './machine-DZPN-A44.js';
2
2
 
3
3
  type TerminalKind = 'mint_error' | 'submit_error' | 'token_expired' | 'capture_superseded';
4
4
  interface MountCopy {
@@ -1,4 +1,4 @@
1
- export { E as ChecktivCustomFormEvent, H as CustomFormCopy, J as CustomFormFieldCopy, K as CustomFormHandle, L as CustomFormMountOptions, N as createCustomForm } from './api-CkHzWaTo.js';
2
- import './machine-CuZalPFX.js';
3
- import './copy-Dfmk11S_.js';
1
+ export { H as ChecktivCustomFormEvent, J as CustomFormCopy, K as CustomFormFieldCopy, L as CustomFormHandle, N as CustomFormMountOptions, O as createCustomForm } from './api-DWWQGjxL.js';
2
+ import './machine-DZPN-A44.js';
3
+ import './copy-CC_mrlVV.js';
4
4
  import './copy-DCeQ4JKx.js';
@@ -1,13 +1,15 @@
1
1
  import { registerModule } from './chunk-GFHNOZVO.js';
2
+ import { createChecktivError, mapHttpStatusToError } from './chunk-OC5N6W7T.js';
3
+ import { warnWrongTokenPlane, isRecord, isJourneyPlaneBody } from './chunk-7F7ZMYB7.js';
2
4
  import { assertNever } from './chunk-UBQTPS5J.js';
3
- import { warnWrongTokenPlane, withTokenRetry, isRecord, isJourneyPlaneBody, createChecktivError, mapHttpStatusToError } from './chunk-7NIKMJFJ.js';
5
+ import { withTokenRetry } from './chunk-S2OOEDJS.js';
6
+ import { SESSIONS_ME_PATH, dataPlaneHeaders, stepSubmitPath, formUploadUrlPath } from './chunk-KK66RKPI.js';
4
7
  import { u } from './chunk-HV2QKVJX.js';
5
8
  import { R, k, S } from './chunk-XOGHMNBX.js';
6
9
  import './chunk-IQKHRPJR.js';
7
- import { SESSIONS_ME_PATH, dataPlaneHeaders, stepSubmitPath, formUploadUrlPath } from './chunk-ACQKQLL2.js';
8
10
  import './chunk-QFA3K5ZV.js';
9
11
  import './chunk-AIK7CDV6.js';
10
12
 
11
- function describedBy(props){const ids=[];if(props.copy?.helpText!==void 0)ids.push(`${props.id}-help`);if(props.error!==void 0)ids.push(`${props.id}-error`);return ids.length>0?ids.join(" "):void 0}function ariaInvalid(props){return props.error!==void 0?"true":void 0}function labelText(props){return props.copy?.label??props.field.id}function labelIdFor(controlId){return `${controlId}-label`}function FieldShell(props,control){const help=props.copy?.helpText;return u("div",{class:"checktiv-cf-field",children:[u("label",{id:labelIdFor(props.id),for:props.id,class:"checktiv-cf-label",children:labelText(props)}),help!==void 0?u("p",{id:`${props.id}-help`,class:"checktiv-cf-help",children:help}):null,control,props.error!==void 0?u("p",{id:`${props.id}-error`,class:"checktiv-cf-error",role:"alert",children:props.error}):null]})}function asText(value){return typeof value==="string"?value:""}function asInputValue(value){return typeof value==="number"?String(value):asText(value)}function inputTypeFor(type){switch(type){case "email":return "email";case "phone":return "tel";case "date":return "date";case "number":return "number";default:return "text"}}function renderTextLike(props){const{field}=props;const onInput=e=>{const target=e.target;if(field.type==="number"){const input=target;props.onChange(input.value===""||Number.isNaN(input.valueAsNumber)?void 0:input.valueAsNumber);return}props.onChange(target.value);};if(field.type==="long_text"){return FieldShell(props,u("textarea",{id:props.id,name:field.id,required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}return FieldShell(props,u("input",{id:props.id,name:field.id,type:inputTypeFor(field.type),required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}function renderBoolean(props){const yesId=`${props.id}-yes`;const noId=`${props.id}-no`;return FieldShell(props,u("fieldset",{class:"checktiv-cf-radiogroup",role:"radiogroup","aria-labelledby":labelIdFor(props.id),"aria-required":props.field.required?"true":void 0,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:[u("label",{for:yesId,class:"checktiv-cf-radio-option",children:[u("input",{id:yesId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===true,onChange:e=>{if(e.target.checked)props.onChange(true);}}),props.booleanYes]}),u("label",{for:noId,class:"checktiv-cf-radio-option",children:[u("input",{id:noId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===false,onChange:e=>{if(e.target.checked)props.onChange(false);}}),props.booleanNo]})]}))}function optionLabel(props,value){return props.copy?.options?.[value]??value}function renderSingleSelect(props){const options=props.field.options??[];return FieldShell(props,u("select",{id:props.id,name:props.field.id,required:props.field.required,class:"checktiv-cf-select",value:asText(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>props.onChange(e.target.value),children:[u("option",{value:"",children:""}),options.map(o=>u("option",{value:o.value,children:optionLabel(props,o.value)}))]}))}function renderMultiSelect(props){const options=props.field.options??[];const selected=Array.isArray(props.value)?props.value:[];const toggle=(value,checked)=>{const next=checked?[...selected,value]:selected.filter(v=>v!==value);props.onChange(next);};return FieldShell(props,u("div",{class:"checktiv-cf-multiselect",role:"group","aria-labelledby":labelIdFor(props.id),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:options.map(o=>u("label",{class:"checktiv-cf-option",children:[u("input",{type:"checkbox",name:props.field.id,value:o.value,checked:selected.includes(o.value),onChange:e=>toggle(o.value,e.target.checked)}),optionLabel(props,o.value)]}))}))}function renderFileUpload(props){return FieldShell(props,u("input",{id:props.id,name:props.field.id,type:"file",class:"checktiv-cf-file",required:props.field.required,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>{const files=e.target.files;props.onFile(files&&files.length>0?files[0]:null);}}))}function renderContent(props){const text=props.copy?.label??props.field.id;return props.field.type==="content_heading"?u("h2",{class:"checktiv-cf-heading",children:text}):u("p",{class:"checktiv-cf-paragraph",children:text})}function renderField(props){switch(props.field.type){case "short_text":case "long_text":case "email":case "phone":case "date":case "number":return renderTextLike(props);case "boolean":return renderBoolean(props);case "single_select":return renderSingleSelect(props);case "multi_select":return renderMultiSelect(props);case "file_upload":return renderFileUpload(props);case "content_heading":case "content_paragraph":return renderContent(props);default:{const _exhaustive=props.field.type;return _exhaustive}}}var CLIENT_PHONE_RE=/^\+?[0-9 ().-]{6,24}$/;var CLIENT_EMAIL_RE=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function isEmptyAnswer(answer){if(answer===void 0)return true;if(typeof answer==="string")return answer.length===0;if(Array.isArray(answer))return answer.length===0;return false}function validateField(field,answer){const requiredIfEmpty=()=>isEmptyAnswer(answer)?field.required?"required":void 0:void 0;switch(field.type){case "short_text":case "long_text":case "date":case "file_upload":return requiredIfEmpty();case "boolean":return field.required&&answer===void 0?"required":void 0;case "email":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_EMAIL_RE.test(answer)?"invalid_email":void 0}case "phone":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_PHONE_RE.test(answer)?"invalid_phone":void 0}case "number":{if(isEmptyAnswer(answer))return field.required?"required":void 0;if(typeof answer!=="number")return void 0;const min=field.validation?.min;const max=field.validation?.max;if(min!==void 0&&answer<min)return "out_of_range";if(max!==void 0&&answer>max)return "out_of_range";return void 0}case "single_select":{if(isEmptyAnswer(answer))return field.required?"required":void 0;const options=field.options??[];if(typeof answer==="string"&&options.length>0){return options.some(o=>o.value===answer)?void 0:"invalid_option"}return void 0}case "multi_select":{const selected=Array.isArray(answer)?answer:[];if(selected.length===0)return field.required?"required":void 0;const min=field.validation?.minSelections;const max=field.validation?.maxSelections;if(min!==void 0&&selected.length<min)return "out_of_range";if(max!==void 0&&selected.length>max)return "out_of_range";return void 0}case "content_heading":case "content_paragraph":return void 0;default:return assertNever(field.type)}}function collectAnswers(answers){const blob={};for(const[fieldId,value]of answers){if(value===void 0)continue;if(typeof value==="string"&&value.length===0)continue;blob[fieldId]=value;}return blob}function isRecord2(v){return typeof v==="object"&&v!==null}function parseUploadTarget(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const uploadUrl=d.upload_url;const r2Key=d.r2_key;if(typeof uploadUrl!=="string"||uploadUrl.length===0)return null;if(typeof r2Key!=="string"||r2Key.length===0)return null;return {uploadUrl,r2Key}}function extensionOf(fileName){const dot=fileName.lastIndexOf(".");if(dot<0||dot===fileName.length-1)return "";return fileName.slice(dot+1).toLowerCase()}async function uploadFormFile(ctx,fetchImpl,stepId,fieldId,file){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+formUploadUrlPath(stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({fieldId,ext:extensionOf(file.name),contentLength:file.size})}),result=>result?.status===401);}catch{return null}if(!res.ok)return null;let body;try{body=await res.json();}catch{return null}const target=parseUploadTarget(body);if(target===null)return null;let putRes;try{putRes=await fetchImpl(target.uploadUrl,{method:"PUT",headers:{"content-type":file.type||"application/octet-stream"},body:file});}catch{return null}if(!putRes.ok)return null;return target.r2Key}var FALLBACK={submit:"Continue",requiredError:"This field is required.",invalidPhoneError:"Enter a valid phone number.",invalidEmailError:"Enter a valid email address.",invalidDateError:"Enter a valid date.",invalidOptionError:"Choose one of the available options.",outOfRangeError:"That value is outside the allowed range.",invalidFormatError:"That value is not in the expected format.",invalidError:"That value is not valid.",validationError:"Some answers could not be accepted. Review your entries and try again.",uploadError:"That file could not be uploaded. Choose the file and try again.",submitError:"Something went wrong submitting the form. Please try again.",booleanYes:"Yes",booleanNo:"No"};function resolveCopy(copy){return {submit:copy?.submit??FALLBACK.submit,requiredError:copy?.requiredError??FALLBACK.requiredError,invalidPhoneError:copy?.invalidPhoneError??FALLBACK.invalidPhoneError,invalidEmailError:copy?.invalidEmailError??FALLBACK.invalidEmailError,invalidDateError:copy?.invalidDateError??FALLBACK.invalidDateError,invalidOptionError:copy?.invalidOptionError??FALLBACK.invalidOptionError,outOfRangeError:copy?.outOfRangeError??FALLBACK.outOfRangeError,invalidFormatError:copy?.invalidFormatError??FALLBACK.invalidFormatError,invalidError:copy?.invalidError??FALLBACK.invalidError,validationError:copy?.validationError??FALLBACK.validationError,uploadError:copy?.uploadError??FALLBACK.uploadError,submitError:copy?.submitError??FALLBACK.submitError,booleanYes:copy?.booleanYes??FALLBACK.booleanYes,booleanNo:copy?.booleanNo??FALLBACK.booleanNo}}function messageForReason(chrome,reason){const byReason={required:chrome.requiredError,invalid_phone:chrome.invalidPhoneError,invalid_email:chrome.invalidEmailError,invalid_date:chrome.invalidDateError,invalid_option:chrome.invalidOptionError,out_of_range:chrome.outOfRangeError,invalid_format:chrome.invalidFormatError,invalid:chrome.invalidError};return byReason[reason]}var CUSTOM_FORM_FIELD_ERROR_REASONS=["required","invalid_phone","invalid_email","invalid_date","invalid_option","out_of_range","invalid_format","invalid"];var REASON_SET=new Set(CUSTOM_FORM_FIELD_ERROR_REASONS);function isCustomFormFieldErrorReason(value){return REASON_SET.has(value)}function createCustomFormErrorEvent(code){return {type:"checktiv.custom_form.error",error:createChecktivError(code)}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}async function resolveSessionIdentity(ctx,fetchImpl){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token)}),result=>result?.status===401);}catch{return {kind:"unresolved"}}if(!res.ok)return {kind:"unresolved"};let body;try{body=await res.json();}catch{return {kind:"unresolved"}}if(!isRecord(body))return {kind:"unresolved"};const data=body.data;if(isRecord(data)){const sessionId=data.session_id;const stepId=data.step_id;if(typeof sessionId==="string"&&sessionId.length>0&&typeof stepId==="string"&&stepId.length>0){ctx.setSessionId(sessionId);return {kind:"ok",identity:{sessionId,stepId}}}}return isJourneyPlaneBody(body)?{kind:"wrong_token"}:{kind:"unresolved"}}async function parseFieldErrors(res){let body;try{body=await res.json();}catch{return null}if(typeof body!=="object"||body===null)return null;const fieldErrors=body.fieldErrors;if(typeof fieldErrors!=="object"||fieldErrors===null)return null;const out=new Map;for(const[fieldId,reason]of Object.entries(fieldErrors)){if(typeof reason==="string"&&isCustomFormFieldErrorReason(reason)){out.set(fieldId,reason);}}return out}function noopHandle(){return {destroy:()=>void 0}}function createCustomForm(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("custom_form"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;const chrome=resolveCopy(opts.copy);const answers=new Map;const pendingFiles=new Map;const errors=new Map;let formError=null;let identity=null;let submitting=false;let cancelled=false;const PENDING_FILE_SENTINEL="\0pending-file";const clearFieldError=fieldId=>{const clearedField=errors.delete(fieldId);const clearedForm=formError!==null;formError=null;if(clearedField||clearedForm)paint();};const focusField=fieldId=>{element.querySelector(`[name="${fieldId}"]`)?.focus();};const validateAll=()=>{errors.clear();let firstInvalid=null;for(const field of opts.config.fields){const answer=pendingFiles.has(field.id)?PENDING_FILE_SENTINEL:answers.get(field.id);const reason=validateField(field,answer);if(reason!==void 0){errors.set(field.id,reason);if(firstInvalid===null)firstInvalid=field.id;}}return firstInvalid};const applyServerFieldErrors=fieldErrors=>{errors.clear();formError=null;const knownFieldIds=new Set(opts.config.fields.map(f=>f.id));for(const[fieldId,reason]of fieldErrors){if(knownFieldIds.has(fieldId))errors.set(fieldId,reason);}if(errors.size===0)formError=chrome.validationError;paint();const first=opts.config.fields.find(f=>errors.has(f.id));if(first!==void 0)focusField(first.id);};const paint=()=>{if(cancelled)return;R(k(S,null,[...opts.config.fields.map(field=>{const reason=errors.get(field.id);return renderField({field,copy:opts.copy?.fields?.[field.id],value:answers.get(field.id),id:`checktiv-cf-${field.id}`,error:reason!==void 0?messageForReason(chrome,reason):void 0,booleanYes:chrome.booleanYes,booleanNo:chrome.booleanNo,onChange:next=>{answers.set(field.id,next);if(field.type==="multi_select"||field.type==="boolean"||field.type==="single_select"){const clearedField=errors.delete(field.id);const clearedForm=formError!==null;formError=null;if(field.type==="multi_select"||clearedField||clearedForm)paint();}},onBlur:()=>clearFieldError(field.id),onFile:file=>{if(file===null){pendingFiles.delete(field.id);answers.delete(field.id);}else {pendingFiles.set(field.id,file);}clearFieldError(field.id);}})}),formError!==null?k("p",{class:"checktiv-cf-error",role:"alert",id:"checktiv-cf-form-error"},formError):null,k("button",{type:"submit",class:"checktiv-cf-submit",disabled:opts.preview===true,onClick:e=>{e.preventDefault();if(opts.preview===true)return;void onSubmit();}},chrome.submit)]),element);};async function onSubmit(){if(submitting||cancelled)return;formError=null;const firstInvalid=validateAll();if(firstInvalid!==null){paint();focusField(firstInvalid);return}if(identity===null){emit(createCustomFormErrorEvent("session_expired"));return}const session=identity;submitting=true;for(const[fieldId,file]of pendingFiles){const key=await uploadFormFile(ctx,fetchImpl,session.stepId,fieldId,file);if(cancelled)return;if(key===null){emit(createCustomFormErrorEvent("upload_failed"));submitting=false;return}answers.set(fieldId,key);}pendingFiles.clear();const blob=collectAnswers(answers);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(session.sessionId,session.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(blob)}),result=>result?.status===401);}catch(err){console.warn("[Checktiv] custom_form submit request failed.",err);submitting=false;return}if(cancelled)return;if(!res.ok){if(res.status===422){const fieldErrors=await parseFieldErrors(res);if(cancelled)return;if(fieldErrors!==null&&fieldErrors.size>0){applyServerFieldErrors(fieldErrors);}else {formError=chrome.validationError;paint();}submitting=false;return}if(res.status===400){formError=chrome.validationError;paint();submitting=false;return}emit(createCustomFormErrorEvent(mapHttpStatusToError(res.status)));submitting=false;return}emit({type:"checktiv.custom_form.submitted",sessionId:session.sessionId});}if(opts.preview===true){paint();emit({type:"checktiv.custom_form.ready"});return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}void(async()=>{try{if(opts.session!==void 0){identity=opts.session;}else {const resolution=await resolveSessionIdentity(ctx,fetchImpl);if(cancelled)return;switch(resolution.kind){case "ok":identity=resolution.identity;break;case "wrong_token":warnWrongTokenPlane();emit(createCustomFormErrorEvent("wrong_token_type"));return;case "unresolved":emit(createCustomFormErrorEvent("session_expired"));return;default:return assertNever(resolution)}}if(cancelled)return;paint();emit({type:"checktiv.custom_form.ready"});}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("custom_form") setup failed.',err);emit(createCustomFormErrorEvent("sdk_load_failed"));}})();return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}registerModule("custom_form",createCustomForm);
13
+ function describedBy(props){const ids=[];if(props.copy?.helpText!==void 0)ids.push(`${props.id}-help`);if(props.error!==void 0)ids.push(`${props.id}-error`);return ids.length>0?ids.join(" "):void 0}function ariaInvalid(props){return props.error!==void 0?"true":void 0}function labelText(props){return props.copy?.label??props.field.id}function labelIdFor(controlId){return `${controlId}-label`}function FieldShell(props,control){const help=props.copy?.helpText;return u("div",{class:"checktiv-cf-field",children:[u("label",{id:labelIdFor(props.id),for:props.id,class:"checktiv-cf-label",children:labelText(props)}),help!==void 0?u("p",{id:`${props.id}-help`,class:"checktiv-cf-help",children:help}):null,control,props.error!==void 0?u("p",{id:`${props.id}-error`,class:"checktiv-cf-error",role:"alert",children:props.error}):null]})}function asText(value){return typeof value==="string"?value:""}function asInputValue(value){return typeof value==="number"?String(value):asText(value)}function inputTypeFor(type){switch(type){case "email":return "email";case "phone":return "tel";case "date":return "date";case "number":return "number";default:return "text"}}function renderTextLike(props){const{field}=props;const onInput=e=>{const target=e.target;if(field.type==="number"){const input=target;props.onChange(input.value===""||Number.isNaN(input.valueAsNumber)?void 0:input.valueAsNumber);return}props.onChange(target.value);};if(field.type==="long_text"){return FieldShell(props,u("textarea",{id:props.id,name:field.id,required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}return FieldShell(props,u("input",{id:props.id,name:field.id,type:inputTypeFor(field.type),required:field.required,class:"checktiv-cf-input",value:asInputValue(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onInput,onBlur:props.onBlur}))}function renderBoolean(props){const yesId=`${props.id}-yes`;const noId=`${props.id}-no`;return FieldShell(props,u("fieldset",{class:"checktiv-cf-radiogroup",role:"radiogroup","aria-labelledby":labelIdFor(props.id),"aria-required":props.field.required?"true":void 0,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:[u("label",{for:yesId,class:"checktiv-cf-radio-option",children:[u("input",{id:yesId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===true,onChange:e=>{if(e.target.checked)props.onChange(true);}}),props.booleanYes]}),u("label",{for:noId,class:"checktiv-cf-radio-option",children:[u("input",{id:noId,name:props.field.id,type:"radio",class:"checktiv-cf-radio",checked:props.value===false,onChange:e=>{if(e.target.checked)props.onChange(false);}}),props.booleanNo]})]}))}function optionLabel(props,value){return props.copy?.options?.[value]??value}function renderSingleSelect(props){const options=props.field.options??[];return FieldShell(props,u("select",{id:props.id,name:props.field.id,required:props.field.required,class:"checktiv-cf-select",value:asText(props.value),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>props.onChange(e.target.value),children:[u("option",{value:"",children:""}),options.map(o=>u("option",{value:o.value,children:optionLabel(props,o.value)}))]}))}function renderMultiSelect(props){const options=props.field.options??[];const selected=Array.isArray(props.value)?props.value:[];const toggle=(value,checked)=>{const next=checked?[...selected,value]:selected.filter(v=>v!==value);props.onChange(next);};return FieldShell(props,u("div",{class:"checktiv-cf-multiselect",role:"group","aria-labelledby":labelIdFor(props.id),"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),children:options.map(o=>u("label",{class:"checktiv-cf-option",children:[u("input",{type:"checkbox",name:props.field.id,value:o.value,checked:selected.includes(o.value),onChange:e=>toggle(o.value,e.target.checked)}),optionLabel(props,o.value)]}))}))}function renderFileUpload(props){return FieldShell(props,u("input",{id:props.id,name:props.field.id,type:"file",class:"checktiv-cf-file",required:props.field.required,"aria-invalid":ariaInvalid(props),"aria-describedby":describedBy(props),onChange:e=>{const files=e.target.files;props.onFile(files&&files.length>0?files[0]:null);}}))}function renderContent(props){const text=props.copy?.label??props.field.id;return props.field.type==="content_heading"?u("h2",{class:"checktiv-cf-heading",children:text}):u("p",{class:"checktiv-cf-paragraph",children:text})}function renderField(props){switch(props.field.type){case "short_text":case "long_text":case "email":case "phone":case "date":case "number":return renderTextLike(props);case "boolean":return renderBoolean(props);case "single_select":return renderSingleSelect(props);case "multi_select":return renderMultiSelect(props);case "file_upload":return renderFileUpload(props);case "content_heading":case "content_paragraph":return renderContent(props);default:{const _exhaustive=props.field.type;return _exhaustive}}}var CLIENT_PHONE_RE=/^\+?[0-9 ().-]{6,24}$/;var CLIENT_EMAIL_RE=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function isEmptyAnswer(answer){if(answer===void 0)return true;if(typeof answer==="string")return answer.length===0;if(Array.isArray(answer))return answer.length===0;return false}function validateField(field,answer){const requiredIfEmpty=()=>isEmptyAnswer(answer)?field.required?"required":void 0:void 0;switch(field.type){case "short_text":case "long_text":case "date":case "file_upload":return requiredIfEmpty();case "boolean":return field.required&&answer===void 0?"required":void 0;case "email":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_EMAIL_RE.test(answer)?"invalid_email":void 0}case "phone":{if(isEmptyAnswer(answer))return field.required?"required":void 0;return typeof answer==="string"&&!CLIENT_PHONE_RE.test(answer)?"invalid_phone":void 0}case "number":{if(isEmptyAnswer(answer))return field.required?"required":void 0;if(typeof answer!=="number")return void 0;const min=field.validation?.min;const max=field.validation?.max;if(min!==void 0&&answer<min)return "out_of_range";if(max!==void 0&&answer>max)return "out_of_range";return void 0}case "single_select":{if(isEmptyAnswer(answer))return field.required?"required":void 0;const options=field.options??[];if(typeof answer==="string"&&options.length>0){return options.some(o=>o.value===answer)?void 0:"invalid_option"}return void 0}case "multi_select":{const selected=Array.isArray(answer)?answer:[];if(selected.length===0)return field.required?"required":void 0;const min=field.validation?.minSelections;const max=field.validation?.maxSelections;if(min!==void 0&&selected.length<min)return "out_of_range";if(max!==void 0&&selected.length>max)return "out_of_range";return void 0}case "content_heading":case "content_paragraph":return void 0;default:return assertNever(field.type)}}function collectAnswers(answers){const blob={};for(const[fieldId,value]of answers){if(value===void 0)continue;if(typeof value==="string"&&value.length===0)continue;blob[fieldId]=value;}return blob}function isRecord2(v){return typeof v==="object"&&v!==null}function parseUploadTarget(body){if(!isRecord2(body)||!isRecord2(body.data))return null;const d=body.data;const uploadUrl=d.upload_url;const r2Key=d.r2_key;if(typeof uploadUrl!=="string"||uploadUrl.length===0)return null;if(typeof r2Key!=="string"||r2Key.length===0)return null;return {uploadUrl,r2Key}}function extensionOf(fileName){const dot=fileName.lastIndexOf(".");if(dot<0||dot===fileName.length-1)return "";return fileName.slice(dot+1).toLowerCase()}async function uploadFormFile(ctx,fetchImpl,stepId,fieldId,file){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+formUploadUrlPath(stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({fieldId,ext:extensionOf(file.name),contentLength:file.size})}),result=>result?.status===401);}catch{return null}if(!res.ok)return null;let body;try{body=await res.json();}catch{return null}const target=parseUploadTarget(body);if(target===null)return null;let putRes;try{putRes=await fetchImpl(target.uploadUrl,{method:"PUT",headers:{"content-type":file.type||"application/octet-stream"},body:file});}catch{return null}if(!putRes.ok)return null;return target.r2Key}var FALLBACK={submit:"Continue",requiredError:"This field is required.",invalidPhoneError:"Enter a valid phone number.",invalidEmailError:"Enter a valid email address.",invalidDateError:"Enter a valid date.",invalidOptionError:"Choose one of the available options.",outOfRangeError:"That value is outside the allowed range.",invalidFormatError:"That value is not in the expected format.",invalidError:"That value is not valid.",validationError:"Some answers could not be accepted. Review your entries and try again.",uploadError:"That file could not be uploaded. Choose the file and try again.",submitError:"Something went wrong submitting the form. Please try again.",booleanYes:"Yes",booleanNo:"No"};function resolveCopy(copy){return {submit:copy?.submit??FALLBACK.submit,requiredError:copy?.requiredError??FALLBACK.requiredError,invalidPhoneError:copy?.invalidPhoneError??FALLBACK.invalidPhoneError,invalidEmailError:copy?.invalidEmailError??FALLBACK.invalidEmailError,invalidDateError:copy?.invalidDateError??FALLBACK.invalidDateError,invalidOptionError:copy?.invalidOptionError??FALLBACK.invalidOptionError,outOfRangeError:copy?.outOfRangeError??FALLBACK.outOfRangeError,invalidFormatError:copy?.invalidFormatError??FALLBACK.invalidFormatError,invalidError:copy?.invalidError??FALLBACK.invalidError,validationError:copy?.validationError??FALLBACK.validationError,uploadError:copy?.uploadError??FALLBACK.uploadError,submitError:copy?.submitError??FALLBACK.submitError,booleanYes:copy?.booleanYes??FALLBACK.booleanYes,booleanNo:copy?.booleanNo??FALLBACK.booleanNo}}function messageForReason(chrome,reason){const byReason={required:chrome.requiredError,invalid_phone:chrome.invalidPhoneError,invalid_email:chrome.invalidEmailError,invalid_date:chrome.invalidDateError,invalid_option:chrome.invalidOptionError,out_of_range:chrome.outOfRangeError,invalid_format:chrome.invalidFormatError,invalid:chrome.invalidError};return byReason[reason]}var CUSTOM_FORM_FIELD_ERROR_REASONS=["required","invalid_phone","invalid_email","invalid_date","invalid_option","out_of_range","invalid_format","invalid"];var REASON_SET=new Set(CUSTOM_FORM_FIELD_ERROR_REASONS);function isCustomFormFieldErrorReason(value){return REASON_SET.has(value)}function createCustomFormErrorEvent(code){return {type:"checktiv.custom_form.error",error:createChecktivError(code)}}function resolveTarget(target){if(typeof target!=="string")return target;if(typeof document==="undefined")return null;return document.querySelector(target)}async function resolveSessionIdentity(ctx,fetchImpl){let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token)}),result=>result?.status===401);}catch{return {kind:"unresolved"}}if(!res.ok)return {kind:"unresolved"};let body;try{body=await res.json();}catch{return {kind:"unresolved"}}if(!isRecord(body))return {kind:"unresolved"};if(isRecord(body.data)&&body.data.renderable===false){return {kind:"unresolved"}}const data=body.data;if(isRecord(data)){const sessionId=data.session_id;const stepId=data.step_id;if(typeof sessionId==="string"&&sessionId.length>0&&typeof stepId==="string"&&stepId.length>0){ctx.setSessionId(sessionId);return {kind:"ok",identity:{sessionId,stepId}}}}return isJourneyPlaneBody(body)?{kind:"wrong_token"}:{kind:"unresolved"}}async function parseFieldErrors(res){let body;try{body=await res.json();}catch{return null}if(typeof body!=="object"||body===null)return null;const fieldErrors=body.fieldErrors;if(typeof fieldErrors!=="object"||fieldErrors===null)return null;const out=new Map;for(const[fieldId,reason]of Object.entries(fieldErrors)){if(typeof reason==="string"&&isCustomFormFieldErrorReason(reason)){out.set(fieldId,reason);}}return out}function noopHandle(){return {destroy:()=>void 0}}function createCustomForm(ctx,opts){const element=resolveTarget(opts.target);if(element===null){console.warn('[Checktiv] mount("custom_form"): no target element found. Pass an element or a selector that resolves.');return noopHandle()}const emit=e=>opts.onEvent?.(e);const fetchImpl=opts.fetchImpl??fetch;const chrome=resolveCopy(opts.copy);const answers=new Map;const pendingFiles=new Map;const errors=new Map;let formError=null;let identity=null;let submitting=false;let cancelled=false;const PENDING_FILE_SENTINEL="\0pending-file";const clearFieldError=fieldId=>{const clearedField=errors.delete(fieldId);const clearedForm=formError!==null;formError=null;if(clearedField||clearedForm)paint();};const focusField=fieldId=>{element.querySelector(`[name="${fieldId}"]`)?.focus();};const validateAll=()=>{errors.clear();let firstInvalid=null;for(const field of opts.config.fields){const answer=pendingFiles.has(field.id)?PENDING_FILE_SENTINEL:answers.get(field.id);const reason=validateField(field,answer);if(reason!==void 0){errors.set(field.id,reason);if(firstInvalid===null)firstInvalid=field.id;}}return firstInvalid};const applyServerFieldErrors=fieldErrors=>{errors.clear();formError=null;const knownFieldIds=new Set(opts.config.fields.map(f=>f.id));for(const[fieldId,reason]of fieldErrors){if(knownFieldIds.has(fieldId))errors.set(fieldId,reason);}if(errors.size===0)formError=chrome.validationError;paint();const first=opts.config.fields.find(f=>errors.has(f.id));if(first!==void 0)focusField(first.id);};const paint=()=>{if(cancelled)return;R(k(S,null,[...opts.config.fields.map(field=>{const reason=errors.get(field.id);return renderField({field,copy:opts.copy?.fields?.[field.id],value:answers.get(field.id),id:`checktiv-cf-${field.id}`,error:reason!==void 0?messageForReason(chrome,reason):void 0,booleanYes:chrome.booleanYes,booleanNo:chrome.booleanNo,onChange:next=>{answers.set(field.id,next);if(field.type==="multi_select"||field.type==="boolean"||field.type==="single_select"){const clearedField=errors.delete(field.id);const clearedForm=formError!==null;formError=null;if(field.type==="multi_select"||clearedField||clearedForm)paint();}},onBlur:()=>clearFieldError(field.id),onFile:file=>{if(file===null){pendingFiles.delete(field.id);answers.delete(field.id);}else {pendingFiles.set(field.id,file);}clearFieldError(field.id);}})}),formError!==null?k("p",{class:"checktiv-cf-error",role:"alert",id:"checktiv-cf-form-error"},formError):null,k("button",{type:"submit",class:"checktiv-cf-submit",disabled:opts.preview===true,onClick:e=>{e.preventDefault();if(opts.preview===true)return;void onSubmit();}},chrome.submit)]),element);};async function onSubmit(){if(submitting||cancelled)return;formError=null;const firstInvalid=validateAll();if(firstInvalid!==null){paint();focusField(firstInvalid);return}if(identity===null){emit(createCustomFormErrorEvent("session_expired"));return}const session=identity;submitting=true;for(const[fieldId,file]of pendingFiles){const key=await uploadFormFile(ctx,fetchImpl,session.stepId,fieldId,file);if(cancelled)return;if(key===null){emit(createCustomFormErrorEvent("upload_failed"));submitting=false;return}answers.set(fieldId,key);}pendingFiles.clear();const blob=collectAnswers(answers);let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(ctx.apiBaseOrigin+stepSubmitPath(session.sessionId,session.stepId),{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify(blob)}),result=>result?.status===401);}catch(err){console.warn("[Checktiv] custom_form submit request failed.",err);submitting=false;return}if(cancelled)return;if(!res.ok){if(res.status===422){const fieldErrors=await parseFieldErrors(res);if(cancelled)return;if(fieldErrors!==null&&fieldErrors.size>0){applyServerFieldErrors(fieldErrors);}else {formError=chrome.validationError;paint();}submitting=false;return}if(res.status===400){formError=chrome.validationError;paint();submitting=false;return}emit(createCustomFormErrorEvent(mapHttpStatusToError(res.status)));submitting=false;return}emit({type:"checktiv.custom_form.submitted",sessionId:session.sessionId});}if(opts.preview===true){paint();emit({type:"checktiv.custom_form.ready"});return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}void(async()=>{try{if(opts.session!==void 0){identity=opts.session;}else {const resolution=await resolveSessionIdentity(ctx,fetchImpl);if(cancelled)return;switch(resolution.kind){case "ok":identity=resolution.identity;break;case "wrong_token":warnWrongTokenPlane();emit(createCustomFormErrorEvent("wrong_token_type"));return;case "unresolved":emit(createCustomFormErrorEvent("session_expired"));return;default:return assertNever(resolution)}}if(cancelled)return;paint();emit({type:"checktiv.custom_form.ready"});}catch(err){if(cancelled)return;console.warn('[Checktiv] mount("custom_form") setup failed.',err);emit(createCustomFormErrorEvent("sdk_load_failed"));}})();return {destroy(){if(cancelled)return;cancelled=true;R(null,element);}}}registerModule("custom_form",createCustomForm);
12
14
 
13
15
  export { createCustomForm };
package/dist/fraud.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { f as ChecktivFraudEvent, F as FraudHandle, i as FraudMountOptions, O as createFraud } from './api-CkHzWaTo.js';
2
- import './machine-CuZalPFX.js';
3
- import './copy-Dfmk11S_.js';
1
+ export { f as ChecktivFraudEvent, F as FraudHandle, i as FraudMountOptions, Q as createFraud } from './api-DWWQGjxL.js';
2
+ import './machine-DZPN-A44.js';
3
+ import './copy-CC_mrlVV.js';
4
4
  import './copy-DCeQ4JKx.js';
package/dist/fraud.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import { registerModule } from './chunk-GFHNOZVO.js';
2
+ import { createChecktivError } from './chunk-OC5N6W7T.js';
3
+ import { resolveSession, warnWrongTokenPlane } from './chunk-7F7ZMYB7.js';
2
4
  import { assertNever } from './chunk-UBQTPS5J.js';
3
- import { resolveSession, createChecktivError, warnWrongTokenPlane, withTokenRetry } from './chunk-7NIKMJFJ.js';
5
+ import { withTokenRetry } from './chunk-S2OOEDJS.js';
6
+ import { TELEMETRY_PATH, dataPlaneHeaders } from './chunk-KK66RKPI.js';
4
7
  import './chunk-IQKHRPJR.js';
5
- import { TELEMETRY_PATH, dataPlaneHeaders } from './chunk-ACQKQLL2.js';
6
8
  import './chunk-QFA3K5ZV.js';
7
9
  import { __publicField } from './chunk-AIK7CDV6.js';
8
10
 
9
- var MAX_STEPS=50;var MAX_STEP_SECONDS=86400;var MAX_STEP_PASTE_COUNT=1e4;var MAX_STEP_ID_LEN=80;function defaultNow(){return typeof performance!=="undefined"&&typeof performance.now==="function"?performance.now():Date.now()}var BehavioralTracker=class{constructor(now=defaultNow){__publicField(this,"steps",new Map);__publicField(this,"activeStepId",null);__publicField(this,"now");this.now=now;}get currentStepId(){return this.activeStepId}enter(rawStepId){const stepId=this.boundStepId(rawStepId);if(stepId===null)return;this.closeActiveInterval();const existing=this.steps.get(stepId);if(existing){existing.enteredAtMs=this.now();}else {this.steps.set(stepId,{stepId,enteredAtMs:this.now(),accumulatedMs:0,pasteCount:0});}this.activeStepId=stepId;}recordPaste(rawStepId){const target=rawStepId===void 0?this.activeStepId:this.boundStepId(rawStepId);if(target===null)return;const existing=this.steps.get(target);if(existing){if(existing.pasteCount<MAX_STEP_PASTE_COUNT)existing.pasteCount+=1;return}this.steps.set(target,{stepId:target,enteredAtMs:null,accumulatedMs:0,pasteCount:1});}snapshot(){this.closeActiveInterval();if(this.activeStepId!==null){const active=this.steps.get(this.activeStepId);if(active)active.enteredAtMs=this.now();}const out=[];for(const acc of this.steps.values()){if(out.length>=MAX_STEPS)break;out.push({stepId:acc.stepId,seconds:this.boundSeconds(acc.accumulatedMs),pasteCount:acc.pasteCount});}return out}closeActiveInterval(){if(this.activeStepId===null)return;const active=this.steps.get(this.activeStepId);if(!active||active.enteredAtMs===null)return;const delta=this.now()-active.enteredAtMs;if(delta>0)active.accumulatedMs+=delta;active.enteredAtMs=null;}boundStepId(rawStepId){if(typeof rawStepId!=="string")return null;const trimmed=rawStepId.trim();if(trimmed.length===0)return null;return trimmed.length>MAX_STEP_ID_LEN?trimmed.slice(0,MAX_STEP_ID_LEN):trimmed}boundSeconds(ms){const seconds=ms/1e3;if(!Number.isFinite(seconds)||seconds<0)return 0;return seconds>MAX_STEP_SECONDS?MAX_STEP_SECONDS:seconds}};var DEVICE_MODEL_HINT_MAX=120;function readBoundedString(value,max){if(typeof value!=="string")return null;const trimmed=value.trim();if(trimmed.length===0)return null;return trimmed.length>max?trimmed.slice(0,max):trimmed}function readTimezone(){try{const tz=Intl.DateTimeFormat().resolvedOptions().timeZone;return readBoundedString(tz,64)}catch{return null}}function readMaxTouchPoints(nav){const raw=nav.maxTouchPoints;if(typeof raw!=="number"||!Number.isFinite(raw))return 0;const floored=Math.floor(raw);if(floored<0)return 0;return floored>512?512:floored}function readPluginCount(nav){const plugins=nav.plugins;const len=plugins&&typeof plugins.length==="number"?plugins.length:0;if(!Number.isFinite(len)||len<0)return 0;return len>256?256:Math.floor(len)}function readDeviceModelHint(nav){const uaData=nav.userAgentData;if(typeof uaData!=="object"||uaData===null)return null;return readBoundedString(uaData.platform,DEVICE_MODEL_HINT_MAX)}function readBehaviorTraits(nav=navigator){return {webdriver:nav.webdriver===true,maxTouchPoints:readMaxTouchPoints(nav),timezone:readTimezone(),pluginCount:readPluginCount(nav),deviceModelHint:readDeviceModelHint(nav)}}var BEHAVIOR_CAPTURED_EVENT="kyc.fraud.behavior_captured";var MAX_SEGMENTS=4;var MAX_SEGMENT_STEPS=50;var DEFAULT_SUBMIT_TIMEOUT_MS=2500;function defaultSleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}function createGatedTransport(inner,opts){const sleep=opts.sleep??defaultSleep;return {async postTelemetry(events){for(let attempt=0;attempt<=opts.maxRetries;attempt+=1){if(attempt>0)await sleep(opts.retryDelayMs).catch(()=>{});try{const res=await inner.postTelemetry(events);if(res.ok)return}catch{}}console.warn("[fraud-agent] flush failed");}}}function withTimeout(promise,ms){return new Promise(resolve=>{let settled=false;const done=()=>{if(settled)return;settled=true;resolve();};const timer=setTimeout(done,ms);void promise.finally(()=>{clearTimeout(timer);done();});})}function boundSegmentSteps(steps){return steps.length>MAX_SEGMENT_STEPS?steps.slice(0,MAX_SEGMENT_STEPS):steps}function createFraudAgent(options){const{transport,sessionId,pasteListenerTarget,now,submitTimeoutMs=DEFAULT_SUBMIT_TIMEOUT_MS}=options;const tracker=new BehavioralTracker(now);let parentTraits=null;const traits=()=>parentTraits??(parentTraits=readBehaviorTraits());const embedSegments=[];const pasteTarget=pasteListenerTarget===void 0?typeof document!=="undefined"?document:null:pasteListenerTarget;const onPasteEvent=()=>{tracker.recordPaste();};if(pasteTarget){pasteTarget.addEventListener("paste",onPasteEvent,{capture:true,passive:true});}function buildPayload(){const steps=tracker.snapshot();const parentTraitsValue=traits();const payload={steps,traits:parentTraitsValue};if(embedSegments.length>0){payload.segments=[{surface:"parent",steps,traits:parentTraitsValue},...embedSegments.slice(0,MAX_SEGMENTS-1).map(seg=>({surface:"embed",steps:boundSegmentSteps(seg.steps),traits:seg.traits}))];}return payload}return {onStepEnter(stepId){tracker.enter(stepId);},onPaste(stepId){tracker.recordPaste(stepId);},mergeEmbedSegment(segment){if(embedSegments.length>=MAX_SEGMENTS-1)return;embedSegments.push({steps:boundSegmentSteps(segment.steps),traits:segment.traits});},async onSubmit(){if(sessionId===void 0)return;const payload=buildPayload();const activeStepId=tracker.currentStepId;const post=(async()=>{try{await transport.postTelemetry([{event:BEHAVIOR_CAPTURED_EVENT,sessionId,...activeStepId!==null?{stepId:activeStepId}:{},ts:Date.now(),payload}]);}catch{}})();await withTimeout(post,submitTimeoutMs);},dispose(){if(pasteTarget){pasteTarget.removeEventListener("paste",onPasteEvent,{capture:true});}}}}var TELEMETRY_FLUSH_MAX_RETRIES=1;var TELEMETRY_FLUSH_RETRY_DELAY_MS=400;function createTelemetryTransport(ctx,fetchImpl){const url=ctx.apiBaseOrigin+TELEMETRY_PATH;return {postTelemetry(events){return withTokenRetry(ctx.tokens,token=>fetchImpl(url,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({events})}),result=>result?.status===401)}}}function createFraud(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const transport=createGatedTransport(createTelemetryTransport(ctx,fetchImpl),{maxRetries:TELEMETRY_FLUSH_MAX_RETRIES,retryDelayMs:TELEMETRY_FLUSH_RETRY_DELAY_MS});let destroyed=false;let agent=null;void Promise.resolve().then(async()=>{const granted=await opts.onConsent();if(destroyed||!granted)return;const resolution=await resolveSession(ctx,fetchImpl);if(destroyed)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();opts.onEvent?.({type:"checktiv.fraud.error",error:createChecktivError("wrong_token_type")});return;case "unresolved":opts.onEvent?.({type:"checktiv.fraud.error",error:createChecktivError("session_expired")});return;default:return assertNever(resolution)}agent=createFraudAgent({transport,sessionId:session.sessionId});opts.onEvent?.({type:"checktiv.fraud.started"});}).catch(()=>{});return {destroy(){destroyed=true;agent?.dispose();agent=null;}}}registerModule("fraud",createFraud);
11
+ var MAX_STEPS=50;var MAX_STEP_SECONDS=86400;var MAX_STEP_PASTE_COUNT=1e4;var MAX_STEP_ID_LEN=80;function defaultNow(){return typeof performance!=="undefined"&&typeof performance.now==="function"?performance.now():Date.now()}var BehavioralTracker=class{constructor(now=defaultNow){__publicField(this,"steps",new Map);__publicField(this,"activeStepId",null);__publicField(this,"now");this.now=now;}get currentStepId(){return this.activeStepId}enter(rawStepId){const stepId=this.boundStepId(rawStepId);if(stepId===null)return;this.closeActiveInterval();const existing=this.steps.get(stepId);if(existing){existing.enteredAtMs=this.now();}else {this.steps.set(stepId,{stepId,enteredAtMs:this.now(),accumulatedMs:0,pasteCount:0});}this.activeStepId=stepId;}recordPaste(rawStepId){const target=rawStepId===void 0?this.activeStepId:this.boundStepId(rawStepId);if(target===null)return;const existing=this.steps.get(target);if(existing){if(existing.pasteCount<MAX_STEP_PASTE_COUNT)existing.pasteCount+=1;return}this.steps.set(target,{stepId:target,enteredAtMs:null,accumulatedMs:0,pasteCount:1});}snapshot(){this.closeActiveInterval();if(this.activeStepId!==null){const active=this.steps.get(this.activeStepId);if(active)active.enteredAtMs=this.now();}const out=[];for(const acc of this.steps.values()){if(out.length>=MAX_STEPS)break;out.push({stepId:acc.stepId,seconds:this.boundSeconds(acc.accumulatedMs),pasteCount:acc.pasteCount});}return out}closeActiveInterval(){if(this.activeStepId===null)return;const active=this.steps.get(this.activeStepId);if(!active||active.enteredAtMs===null)return;const delta=this.now()-active.enteredAtMs;if(delta>0)active.accumulatedMs+=delta;active.enteredAtMs=null;}boundStepId(rawStepId){if(typeof rawStepId!=="string")return null;const trimmed=rawStepId.trim();if(trimmed.length===0)return null;return trimmed.length>MAX_STEP_ID_LEN?trimmed.slice(0,MAX_STEP_ID_LEN):trimmed}boundSeconds(ms){const seconds=ms/1e3;if(!Number.isFinite(seconds)||seconds<0)return 0;return seconds>MAX_STEP_SECONDS?MAX_STEP_SECONDS:seconds}};var DEVICE_MODEL_HINT_MAX=120;function readBoundedString(value,max){if(typeof value!=="string")return null;const trimmed=value.trim();if(trimmed.length===0)return null;return trimmed.length>max?trimmed.slice(0,max):trimmed}function readTimezone(){try{const tz=Intl.DateTimeFormat().resolvedOptions().timeZone;return readBoundedString(tz,64)}catch{return null}}function readMaxTouchPoints(nav){const raw=nav.maxTouchPoints;if(typeof raw!=="number"||!Number.isFinite(raw))return 0;const floored=Math.floor(raw);if(floored<0)return 0;return floored>512?512:floored}function readPluginCount(nav){const plugins=nav.plugins;const len=plugins&&typeof plugins.length==="number"?plugins.length:0;if(!Number.isFinite(len)||len<0)return 0;return len>256?256:Math.floor(len)}function readDeviceModelHint(nav){const uaData=nav.userAgentData;if(typeof uaData!=="object"||uaData===null)return null;return readBoundedString(uaData.platform,DEVICE_MODEL_HINT_MAX)}function readBehaviorTraits(nav=navigator){return {webdriver:nav.webdriver===true,maxTouchPoints:readMaxTouchPoints(nav),timezone:readTimezone(),pluginCount:readPluginCount(nav),deviceModelHint:readDeviceModelHint(nav)}}var BEHAVIOR_CAPTURED_EVENT="kyc.fraud.behavior_captured";var MAX_SEGMENTS=4;var MAX_SEGMENT_STEPS=50;var DEFAULT_SUBMIT_TIMEOUT_MS=2500;function defaultSleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}function createGatedTransport(inner,opts){const sleep=opts.sleep??defaultSleep;return {async postTelemetry(events){for(let attempt=0;attempt<=opts.maxRetries;attempt+=1){if(attempt>0)await sleep(opts.retryDelayMs).catch(()=>{});try{const res=await inner.postTelemetry(events);if(res.ok)return}catch{}}console.warn("[fraud-agent] flush failed");}}}function withTimeout(promise,ms){return new Promise(resolve=>{let settled=false;const done=()=>{if(settled)return;settled=true;resolve();};const timer=setTimeout(done,ms);void promise.finally(()=>{clearTimeout(timer);done();});})}function boundSegmentSteps(steps){return steps.length>MAX_SEGMENT_STEPS?steps.slice(0,MAX_SEGMENT_STEPS):steps}function createFraudAgent(options){const{transport,sessionId,pasteListenerTarget,now,submitTimeoutMs=DEFAULT_SUBMIT_TIMEOUT_MS}=options;const tracker=new BehavioralTracker(now);let parentTraits=null;const traits=()=>parentTraits??(parentTraits=readBehaviorTraits());const embedSegments=[];const pasteTarget=pasteListenerTarget===void 0?typeof document!=="undefined"?document:null:pasteListenerTarget;const onPasteEvent=()=>{tracker.recordPaste();};if(pasteTarget){pasteTarget.addEventListener("paste",onPasteEvent,{capture:true,passive:true});}function buildPayload(){const steps=tracker.snapshot();const parentTraitsValue=traits();const payload={steps,traits:parentTraitsValue};if(embedSegments.length>0){payload.segments=[{surface:"parent",steps,traits:parentTraitsValue},...embedSegments.slice(0,MAX_SEGMENTS-1).map(seg=>({surface:"embed",steps:boundSegmentSteps(seg.steps),traits:seg.traits}))];}return payload}return {onStepEnter(stepId){tracker.enter(stepId);},onPaste(stepId){tracker.recordPaste(stepId);},mergeEmbedSegment(segment){if(embedSegments.length>=MAX_SEGMENTS-1)return;embedSegments.push({steps:boundSegmentSteps(segment.steps),traits:segment.traits});},async onSubmit(){if(sessionId===void 0)return;const payload=buildPayload();const activeStepId=tracker.currentStepId;const post=(async()=>{try{await transport.postTelemetry([{event:BEHAVIOR_CAPTURED_EVENT,sessionId,...activeStepId!==null?{stepId:activeStepId}:{},ts:Date.now(),payload}]);}catch{}})();await withTimeout(post,submitTimeoutMs);},dispose(){if(pasteTarget){pasteTarget.removeEventListener("paste",onPasteEvent,{capture:true});}}}}var TELEMETRY_FLUSH_MAX_RETRIES=1;var TELEMETRY_FLUSH_RETRY_DELAY_MS=400;function createTelemetryTransport(ctx,fetchImpl){const url=ctx.apiBaseOrigin+TELEMETRY_PATH;return {postTelemetry(events){return withTokenRetry(ctx.tokens,token=>fetchImpl(url,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:JSON.stringify({events})}),result=>result?.status===401)}}}function createFraud(ctx,opts){const fetchImpl=opts.fetchImpl??fetch;const transport=createGatedTransport(createTelemetryTransport(ctx,fetchImpl),{maxRetries:TELEMETRY_FLUSH_MAX_RETRIES,retryDelayMs:TELEMETRY_FLUSH_RETRY_DELAY_MS});let destroyed=false;let agent=null;void Promise.resolve().then(async()=>{const granted=await opts.onConsent();if(destroyed||!granted)return;const resolution=await resolveSession(ctx,fetchImpl);if(destroyed)return;let session;switch(resolution.kind){case "ok":session=resolution.session;break;case "wrong_token":warnWrongTokenPlane();opts.onEvent?.({type:"checktiv.fraud.error",error:createChecktivError("wrong_token_type")});return;case "unresolved":opts.onEvent?.({type:"checktiv.fraud.error",error:createChecktivError("session_expired")});return;case "nothing_to_render":return;default:return assertNever(resolution)}agent=createFraudAgent({transport,sessionId:session.sessionId});opts.onEvent?.({type:"checktiv.fraud.started"});}).catch(()=>{});return {destroy(){destroyed=true;agent?.dispose();agent=null;}}}registerModule("fraud",createFraud);
10
12
 
11
13
  export { createFraud };
@@ -1,8 +1,8 @@
1
- import { A as SubstrateContext, h as CrossDeviceHandoffHook, g as ChecktivIdvEvent } from '../api-CkHzWaTo.js';
1
+ import { S as SdkCrossDeviceStatusResponse } from '../machine-DZPN-A44.js';
2
+ import { B as SubstrateContext, h as CrossDeviceHandoffHook, g as ChecktivIdvEvent } from '../api-DWWQGjxL.js';
2
3
  import { C as CrossDeviceCopy } from '../copy-DCeQ4JKx.js';
3
4
  import { CrossDevicePanelProps, CrossDeviceHandle } from '../cross-device.js';
4
- import '../machine-CuZalPFX.js';
5
- import '../copy-Dfmk11S_.js';
5
+ import '../copy-CC_mrlVV.js';
6
6
 
7
7
  interface ManagedCrossDeviceParams {
8
8
  ctx: SubstrateContext;
@@ -48,11 +48,13 @@ interface CrossDeviceOverlayOptions {
48
48
  interface CrossDeviceOverlayHandle {
49
49
  setCompleting(): void;
50
50
  destroy(): void;
51
+ isCapped(): boolean;
52
+ restartPoll(): void;
51
53
  }
52
54
  declare function openCrossDeviceOverlay(opts: CrossDeviceOverlayOptions): CrossDeviceOverlayHandle;
53
55
  declare function parseHandoffMintUrl(body: unknown): string | null;
54
56
  declare function createHandoffMintHook(ctx: SubstrateContext, fetchImpl: typeof fetch): CrossDeviceHandoffHook;
55
- declare function classifyCrossDeviceCompletion(body: unknown, originalStepId: string): CrossDeviceCompletion;
57
+ declare function classifyCrossDeviceCompletion(status: SdkCrossDeviceStatusResponse | null, originalStepId: string): CrossDeviceCompletion;
56
58
  declare function checkSessionCompletion(ctx: SubstrateContext, fetchImpl: typeof fetch, originalStepId: string, signal: AbortSignal): Promise<CrossDeviceCompletion>;
57
59
  declare function openManagedCrossDevice(params: ManagedCrossDeviceParams): CrossDeviceOverlayHandle;
58
60
 
@@ -1,10 +1,10 @@
1
- import { registerCrossDeviceOpener, createChecktivErrorEvent } from '../chunk-ZXE45FN5.js';
2
- import { withTokenRetry, createChecktivError, parseSessionData } from '../chunk-7NIKMJFJ.js';
3
- import '../chunk-IQKHRPJR.js';
4
- import { SESSIONS_ME_PATH, dataPlaneHeaders } from '../chunk-ACQKQLL2.js';
1
+ import { registerCrossDeviceOpener, createChecktivErrorEvent } from '../chunk-CGSNIVQF.js';
2
+ import { createChecktivError } from '../chunk-OC5N6W7T.js';
3
+ import { withTokenRetry } from '../chunk-S2OOEDJS.js';
4
+ import { SESSIONS_ME_PATH, dataPlaneHeaders, SESSIONS_CROSS_DEVICE_STATUS_PATH } from '../chunk-KK66RKPI.js';
5
5
  import '../chunk-QFA3K5ZV.js';
6
6
  import '../chunk-AIK7CDV6.js';
7
7
 
8
- var SESSIONS_HANDOFF_MINT_PATH=`${SESSIONS_ME_PATH}/handoff`;var CROSS_DEVICE_POLL_INTERVAL_MS=2500;var CROSS_DEVICE_POLL_TOTAL_CAP_MS=5*60*1e3;var CROSS_DEVICE_REMINT_CAP=3;var defaultChunkImporter=()=>import('../cross-device.js');function preloadCrossDeviceChunk(importer=defaultChunkImporter){try{void importer().catch(()=>{});}catch{}}function openCrossDeviceOverlay(opts){const{target,onOpenCrossDevice,copy,isMobile,emit,onClose,chunkImporter=defaultChunkImporter,poll}=opts;const childContainer=document.createElement("div");target.appendChild(childContainer);let destroyed=false;let remintCount=0;let onCloseFired=false;const invokeOnClose=()=>{if(onCloseFired)return;onCloseFired=true;onClose?.();};const panelOnClose=onClose?invokeOnClose:void 0;let chunkHandle=null;let isCompleting=false;let currentUrl=null;let pollGen=0;let pollTimeout=null;let pollAbort=null;let pollStart=0;const markCompleting=()=>{isCompleting=true;if(chunkHandle!==null&&currentUrl!==null){chunkHandle.update({url:currentUrl,copy,isMobile,completing:true,onBack:panelOnClose,onRefreshLink:void 0,onRetry:panelOnClose});}};const stopPoll=()=>{pollGen+=1;if(pollTimeout!==null){clearTimeout(pollTimeout);pollTimeout=null;}if(pollAbort!==null){pollAbort.abort();pollAbort=null;}};const startPoll=()=>{if(poll===void 0)return;const intervalMs=poll.intervalMs??CROSS_DEVICE_POLL_INTERVAL_MS;const totalCapMs=poll.totalCapMs??CROSS_DEVICE_POLL_TOTAL_CAP_MS;stopPoll();const gen=pollGen;pollStart=Date.now();const scheduleNext=()=>{if(gen!==pollGen||destroyed)return;pollTimeout=setTimeout(runTick,intervalMs);};const runTick=()=>{if(Date.now()-pollStart>=totalCapMs){stopPoll();poll.onCapped?.();return}void(async()=>{const controller=new AbortController;pollAbort=controller;let outcome;try{outcome=await poll.checkCompletion(controller.signal);}catch{scheduleNext();return}if(gen!==pollGen||destroyed)return;if(outcome==="advanced"){stopPoll();markCompleting();poll.onComplete();return}if(outcome==="terminal"){stopPoll();poll.onTerminal?.();return}scheduleNext();})();};pollTimeout=setTimeout(runTick,intervalMs);};const renderUnavailable=()=>{emit({type:"checktiv.idv.cross_device_unavailable"});chunkHandle?.update({url:"",copy,isMobile,completing:false,onBack:panelOnClose,onRetry:panelOnClose});};const rerender=url=>{if(typeof url!=="string"||url.length===0){renderUnavailable();return}currentUrl=url;chunkHandle?.update({url,copy,isMobile,completing:isCompleting,onBack:panelOnClose,onRefreshLink:makeRefreshHandler(),onRetry:panelOnClose});};function makeRefreshHandler(currentUrl2){if(remintCount>=CROSS_DEVICE_REMINT_CAP){return void 0}return ()=>{if(destroyed)return;if(remintCount>=CROSS_DEVICE_REMINT_CAP)return;void(async()=>{remintCount+=1;let result;try{result=await onOpenCrossDevice();}catch(err){console.warn("[Checktiv] cross-device: refresh hook rejected unexpectedly.",err);if(destroyed)return;renderUnavailable();return}if(destroyed)return;if(result.kind==="unavailable"){renderUnavailable();return}rerender(result.url);})();}}function mountPanel(chunkModule,mintResult){if(destroyed)return;const okUrl=mintResult.kind==="ok"?mintResult.url:void 0;if(mintResult.kind==="unavailable"||typeof okUrl!=="string"||okUrl.length===0){emit({type:"checktiv.idv.cross_device_unavailable"});chunkHandle=chunkModule.mountCrossDevice(childContainer,{url:"",copy,isMobile,completing:false,onBack:panelOnClose,onRetry:panelOnClose});return}emit({type:"checktiv.idv.cross_device_opened"});currentUrl=okUrl;chunkHandle=chunkModule.mountCrossDevice(childContainer,{url:okUrl,copy,isMobile,completing:isCompleting,onBack:panelOnClose,onRefreshLink:makeRefreshHandler(),onRetry:panelOnClose});}function renderDoubleFaultFallback(){if(destroyed)return;childContainer.textContent="";const msg=document.createElement("div");msg.setAttribute("data-testid","cross-device-double-fault");const text=copy.unavailableMessage;if(text){const p=document.createElement("p");p.textContent=text;msg.appendChild(p);}if(onClose){const btn=document.createElement("button");btn.type="button";btn.setAttribute("data-testid","cross-device-double-fault-retry");const retryLabel=copy.mobileTryAgainLabel??"Try again";btn.textContent=retryLabel;btn.addEventListener("click",invokeOnClose);msg.appendChild(btn);}childContainer.appendChild(msg);}startPoll();void(async()=>{let chunkResult;try{chunkResult=await chunkImporter();}catch(err){console.warn("[Checktiv] cross-device: failed to load the cross-device chunk.",err);emit(createErrorEvent("sdk_load_failed"));renderDoubleFaultFallback();return}if(destroyed)return;const mintResult=await onOpenCrossDevice().catch(err=>{console.warn("[Checktiv] cross-device: onOpenCrossDevice hook threw unexpectedly.",err);return {kind:"unavailable"}});if(destroyed)return;try{mountPanel(chunkResult,mintResult);}catch(err){console.warn("[Checktiv] cross-device: failed to mount the cross-device panel.",err);emit(createErrorEvent("sdk_load_failed"));renderDoubleFaultFallback();}})();return {setCompleting(){if(destroyed)return;markCompleting();},destroy(){if(destroyed)return;destroyed=true;stopPoll();invokeOnClose();if(chunkHandle!==null){chunkHandle.destroy();chunkHandle=null;}childContainer.remove();}}}function isRecord(v){return typeof v==="object"&&v!==null}function isHttpsUrl(value){if(typeof value!=="string"||value.length===0)return false;try{return new URL(value).protocol==="https:"}catch{return false}}function parseHandoffMintUrl(body){if(!isRecord(body))return null;const handoffUrl=body.handoffUrl;return isHttpsUrl(handoffUrl)?handoffUrl:null}function createHandoffMintHook(ctx,fetchImpl){const origin=ctx.apiBaseOrigin;return async()=>{let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_HANDOFF_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:"{}"}),result=>result?.status===401);}catch{return {kind:"unavailable"}}if(!res.ok)return {kind:"unavailable"};let body;try{body=await res.json();}catch{return {kind:"unavailable"}}const url=parseHandoffMintUrl(body);return url===null?{kind:"unavailable"}:{kind:"ok",url}}}function classifyCrossDeviceCompletion(body,originalStepId){const data=parseSessionData(body);if(data===null)return "terminal";return data.stepId!==originalStepId?"advanced":"pending"}async function checkSessionCompletion(ctx,fetchImpl,originalStepId,signal){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_ME_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token),signal}),result=>result?.status===401);}catch{return "pending"}if(res.status===401)return "terminal";if(!res.ok)return "pending";let body;try{body=await res.json();}catch{return "pending"}return classifyCrossDeviceCompletion(body,originalStepId)}function openManagedCrossDevice(params){const{ctx,fetchImpl,target,stepId,sessionId,copy,isMobile,emit,onClose,chunkImporter}=params;const onOpenCrossDevice=params.onOpenCrossDevice??createHandoffMintHook(ctx,fetchImpl);return openCrossDeviceOverlay({target,onOpenCrossDevice,copy,isMobile,emit,onClose,...chunkImporter!==void 0?{chunkImporter}:{},poll:{checkCompletion:signal=>checkSessionCompletion(ctx,fetchImpl,stepId,signal),onComplete:()=>emit({type:"checktiv.idv.submitted",sessionId}),onCapped:()=>emit({type:"checktiv.idv.cross_device_capped"}),onTerminal:()=>emit(createChecktivErrorEvent("session_expired"))}})}registerCrossDeviceOpener(openManagedCrossDevice);function createErrorEvent(code){return {type:"checktiv.idv.error",error:createChecktivError(code)}}
8
+ var SESSIONS_HANDOFF_MINT_PATH=`${SESSIONS_ME_PATH}/handoff`;var CROSS_DEVICE_POLL_INTERVAL_MS=2500;var CROSS_DEVICE_POLL_TOTAL_CAP_MS=15*60*1e3;var CROSS_DEVICE_REMINT_CAP=3;var defaultChunkImporter=()=>import('../cross-device.js');function preloadCrossDeviceChunk(importer=defaultChunkImporter){try{void importer().catch(()=>{});}catch{}}function openCrossDeviceOverlay(opts){const{target,onOpenCrossDevice,copy,isMobile,emit,onClose,chunkImporter=defaultChunkImporter,poll}=opts;const childContainer=document.createElement("div");target.appendChild(childContainer);let destroyed=false;let remintCount=0;let capped=false;let onCloseFired=false;const invokeOnClose=()=>{if(onCloseFired)return;onCloseFired=true;onClose?.();};const dismissOverlay=()=>{if(!onCloseFired){emit({type:"checktiv.idv.cross_device_closed"});}invokeOnClose();};const panelOnClose=onClose?dismissOverlay:void 0;let chunkHandle=null;let isCompleting=false;let currentUrl=null;let pollGen=0;let pollTimeout=null;let pollAbort=null;let capTimeout=null;const markCompleting=()=>{isCompleting=true;if(chunkHandle!==null&&currentUrl!==null){chunkHandle.update({url:currentUrl,copy,isMobile,completing:true,onBack:panelOnClose,onRefreshLink:void 0,onRetry:panelOnClose});}};const stopPoll=()=>{pollGen+=1;if(pollTimeout!==null){clearTimeout(pollTimeout);pollTimeout=null;}if(capTimeout!==null){clearTimeout(capTimeout);capTimeout=null;}if(pollAbort!==null){pollAbort.abort();pollAbort=null;}};const startPoll=()=>{if(poll===void 0)return;const intervalMs=poll.intervalMs??CROSS_DEVICE_POLL_INTERVAL_MS;const totalCapMs=poll.totalCapMs??CROSS_DEVICE_POLL_TOTAL_CAP_MS;stopPoll();const gen=pollGen;capTimeout=setTimeout(()=>{if(gen!==pollGen||destroyed)return;stopPoll();capped=true;poll.onCapped?.();},totalCapMs);const scheduleNext=()=>{if(gen!==pollGen||destroyed)return;pollTimeout=setTimeout(runTick,intervalMs);};const runTick=()=>{void(async()=>{const controller=new AbortController;pollAbort=controller;let outcome;try{outcome=await poll.checkCompletion(controller.signal);}catch{scheduleNext();return}if(gen!==pollGen||destroyed)return;if(outcome==="advanced"){stopPoll();markCompleting();poll.onComplete();return}if(outcome==="terminal"){stopPoll();poll.onTerminal?.();return}scheduleNext();})();};pollTimeout=setTimeout(runTick,intervalMs);};const renderUnavailable=()=>{emit({type:"checktiv.idv.cross_device_unavailable"});chunkHandle?.update({url:"",copy,isMobile,completing:false,onBack:panelOnClose,onRetry:panelOnClose});};const rerender=url=>{if(typeof url!=="string"||url.length===0){renderUnavailable();return}currentUrl=url;chunkHandle?.update({url,copy,isMobile,completing:isCompleting,onBack:panelOnClose,onRefreshLink:makeRefreshHandler(),onRetry:panelOnClose});};function makeRefreshHandler(currentUrl2){if(remintCount>=CROSS_DEVICE_REMINT_CAP){return void 0}return ()=>{if(destroyed)return;if(remintCount>=CROSS_DEVICE_REMINT_CAP)return;void(async()=>{remintCount+=1;let result;try{result=await onOpenCrossDevice();}catch(err){console.warn("[Checktiv] cross-device: refresh hook rejected unexpectedly.",err);if(destroyed)return;renderUnavailable();return}if(destroyed)return;if(result.kind==="unavailable"){renderUnavailable();return}rerender(result.url);})();}}function mountPanel(chunkModule,mintResult){if(destroyed)return;const okUrl=mintResult.kind==="ok"?mintResult.url:void 0;if(mintResult.kind==="unavailable"||typeof okUrl!=="string"||okUrl.length===0){emit({type:"checktiv.idv.cross_device_unavailable"});chunkHandle=chunkModule.mountCrossDevice(childContainer,{url:"",copy,isMobile,completing:false,onBack:panelOnClose,onRetry:panelOnClose});return}emit({type:"checktiv.idv.cross_device_opened"});currentUrl=okUrl;chunkHandle=chunkModule.mountCrossDevice(childContainer,{url:okUrl,copy,isMobile,completing:isCompleting,onBack:panelOnClose,onRefreshLink:makeRefreshHandler(),onRetry:panelOnClose});}function renderDoubleFaultFallback(){if(destroyed)return;childContainer.textContent="";const msg=document.createElement("div");msg.setAttribute("data-testid","cross-device-double-fault");const text=copy.unavailableMessage;if(text){const p=document.createElement("p");p.textContent=text;msg.appendChild(p);}if(onClose){const btn=document.createElement("button");btn.type="button";btn.setAttribute("data-testid","cross-device-double-fault-retry");const retryLabel=copy.mobileTryAgainLabel??"Try again";btn.textContent=retryLabel;btn.addEventListener("click",dismissOverlay);msg.appendChild(btn);}childContainer.appendChild(msg);}startPoll();void(async()=>{let chunkResult;try{chunkResult=await chunkImporter();}catch(err){console.warn("[Checktiv] cross-device: failed to load the cross-device chunk.",err);emit(createErrorEvent("sdk_load_failed"));renderDoubleFaultFallback();return}if(destroyed)return;const mintResult=await onOpenCrossDevice().catch(err=>{console.warn("[Checktiv] cross-device: onOpenCrossDevice hook threw unexpectedly.",err);return {kind:"unavailable"}});if(destroyed)return;try{mountPanel(chunkResult,mintResult);}catch(err){console.warn("[Checktiv] cross-device: failed to mount the cross-device panel.",err);emit(createErrorEvent("sdk_load_failed"));renderDoubleFaultFallback();}})();return {setCompleting(){if(destroyed)return;markCompleting();},isCapped(){return destroyed?false:capped},restartPoll(){if(destroyed)return;capped=false;startPoll();},destroy(){if(destroyed)return;destroyed=true;stopPoll();invokeOnClose();if(chunkHandle!==null){chunkHandle.destroy();chunkHandle=null;}childContainer.remove();}}}function isRecord(v){return typeof v==="object"&&v!==null}function isHttpsUrl(value){if(typeof value!=="string"||value.length===0)return false;try{return new URL(value).protocol==="https:"}catch{return false}}function parseHandoffMintUrl(body){if(!isRecord(body))return null;const handoffUrl=body.handoffUrl;return isHttpsUrl(handoffUrl)?handoffUrl:null}function createHandoffMintHook(ctx,fetchImpl){const origin=ctx.apiBaseOrigin;return async()=>{let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_HANDOFF_MINT_PATH,{method:"POST",headers:dataPlaneHeaders(ctx,token,{withJsonBody:true}),body:"{}"}),result=>result?.status===401);}catch{return {kind:"unavailable"}}if(!res.ok)return {kind:"unavailable"};let body;try{body=await res.json();}catch{return {kind:"unavailable"}}const url=parseHandoffMintUrl(body);return url===null?{kind:"unavailable"}:{kind:"ok",url}}}function parseCrossDeviceStatus(body){if(typeof body!=="object"||body===null)return null;const b=body;if(typeof b.advanced!=="boolean")return null;if(b.currentStepId!==null&&typeof b.currentStepId!=="string")return null;return {advanced:b.advanced,currentStepId:b.currentStepId}}function classifyCrossDeviceCompletion(status,originalStepId){if(status===null)return "pending";if(status.advanced===true)return "advanced";if(status.currentStepId!==null&&status.currentStepId!==originalStepId)return "advanced";return "pending"}async function checkSessionCompletion(ctx,fetchImpl,originalStepId,signal){const origin=ctx.apiBaseOrigin;let res;try{res=await withTokenRetry(ctx.tokens,token=>fetchImpl(origin+SESSIONS_CROSS_DEVICE_STATUS_PATH,{method:"GET",headers:dataPlaneHeaders(ctx,token),signal}),result=>result?.status===401);}catch{return "pending"}if(res.status===401)return "terminal";if(!res.ok)return "pending";let parsed;try{parsed=parseCrossDeviceStatus(await res.json());}catch{return "pending"}return classifyCrossDeviceCompletion(parsed,originalStepId)}function openManagedCrossDevice(params){const{ctx,fetchImpl,target,stepId,sessionId,copy,isMobile,emit,onClose,chunkImporter}=params;const onOpenCrossDevice=params.onOpenCrossDevice??createHandoffMintHook(ctx,fetchImpl);return openCrossDeviceOverlay({target,onOpenCrossDevice,copy,isMobile,emit,onClose,...chunkImporter!==void 0?{chunkImporter}:{},poll:{checkCompletion:signal=>checkSessionCompletion(ctx,fetchImpl,stepId,signal),onComplete:()=>emit({type:"checktiv.idv.submitted",sessionId}),onCapped:()=>emit({type:"checktiv.idv.cross_device_capped"}),onTerminal:()=>emit(createChecktivErrorEvent("session_expired"))}})}registerCrossDeviceOpener(openManagedCrossDevice);function createErrorEvent(code){return {type:"checktiv.idv.error",error:createChecktivError(code)}}
9
9
 
10
10
  export { CROSS_DEVICE_POLL_INTERVAL_MS, CROSS_DEVICE_POLL_TOTAL_CAP_MS, CROSS_DEVICE_REMINT_CAP, checkSessionCompletion, classifyCrossDeviceCompletion, createHandoffMintHook, openCrossDeviceOverlay, openManagedCrossDevice, parseHandoffMintUrl, preloadCrossDeviceChunk };
package/dist/idv.css CHANGED
@@ -1 +1 @@
1
- .idv-capture-frame{display:block;width:100%;max-width:28rem;aspect-ratio:3 / 4;margin:0 auto;border:0;border-radius:0.5rem;background:transparent}.idv-capture-frame--biometric{aspect-ratio:auto;height:min(70dvh,var(--idv-capture-max-height, 520px))}@media(orientation:landscape){.idv-capture-frame,.idv-capture-frame--biometric{aspect-ratio:auto;height:min(55dvh,var(--idv-capture-landscape-max-height, 380px));width:auto}}.idv-capture-active{position:relative}.idv-capture-skeleton{position:absolute;top:0;left:50%;transform:translateX(-50%);z-index:1;width:100%;max-width:28rem;height:min(70dvh,var(--idv-capture-max-height, 520px));border-radius:0.5rem;overflow:hidden;background:#e5e7eb}.idv-capture-skeleton[data-color-mode=dark]{background:#1f2937}.idv-capture-skeleton::before{content:"";position:absolute;inset:0;background:linear-gradient(100deg,transparent 30%,rgba(255,255,255,0.22) 50%,transparent 70%);background-size:200% 100%;animation:idv-capture-skeleton-sweep 1.4s ease-in-out infinite}@keyframes idv-capture-skeleton-sweep{from{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.idv-capture-skeleton::before{animation:none}}@media(orientation:landscape){.idv-capture-skeleton{height:min(55dvh,var(--idv-capture-landscape-max-height, 380px))}}:root{--idv-capture-max-height: 520px;--idv-capture-landscape-max-height: 380px}@media(pointer:coarse)and (max-width:640px),(pointer:coarse)and (max-height:640px){.idv-capture-immersive{position:fixed;inset:0;z-index:2147483000;display:flex;flex-direction:column;height:100dvh;overflow:hidden;box-sizing:border-box;background:#111827}.idv-capture-immersive .idv-capture-frame,.idv-capture-immersive .idv-capture-frame--biometric{flex:1 1 auto;min-height:0;width:100%;height:auto;max-width:none;aspect-ratio:auto;border-radius:0}.idv-capture-immersive .idv-capture-cv-reject,.idv-capture-immersive .idv-capture-status{flex:0 0 auto}.idv-capture-immersive .idv-capture-status{margin:0;text-align:center;color:#f3f4f6;line-height:1.4;padding:0.75rem 1rem calc(0.75rem + env(safe-area-inset-bottom))}.idv-capture-immersive .idv-capture-skeleton{position:absolute;inset:0;transform:none;width:100%;max-width:none;height:auto;background:#1f2937}.idv-capture-immersive .idv-capture-sentinel{position:absolute;width:0;height:0;overflow:hidden}}
1
+ .idv-capture-frame{display:block;width:100%;max-width:var(--idv-capture-max-width, 28rem);aspect-ratio:3 / 4;margin:0 auto;border:0;border-radius:0.5rem;background:transparent}.idv-capture-frame--biometric{aspect-ratio:auto;height:min(70dvh,var(--idv-capture-max-height, 520px))}@media(orientation:landscape)and (pointer:coarse){.idv-capture-frame,.idv-capture-frame--biometric{aspect-ratio:auto;height:min(55dvh,var(--idv-capture-landscape-max-height, 380px));width:auto}}@media(pointer:fine)and (min-width:768px){.idv-capture-frame,.idv-capture-frame--biometric{max-width:var(--idv-capture-max-width, 34rem)}}@media(pointer:fine)and (orientation:landscape){.idv-capture-frame{max-height:min(70dvh,560px)}.idv-capture-frame--biometric{height:min(70dvh,560px)}}.idv-capture-active{position:relative}.idv-capture-skeleton{position:absolute;top:0;left:50%;transform:translateX(-50%);z-index:1;width:100%;max-width:var(--idv-capture-max-width, 28rem);height:min(70dvh,var(--idv-capture-max-height, 520px));border-radius:0.5rem;overflow:hidden;background:#e5e7eb}.idv-capture-skeleton[data-color-mode=dark]{background:#1f2937}.idv-capture-skeleton::before{content:"";position:absolute;inset:0;background:linear-gradient(100deg,transparent 30%,rgba(255,255,255,0.22) 50%,transparent 70%);background-size:200% 100%;animation:idv-capture-skeleton-sweep 1.4s ease-in-out infinite}@keyframes idv-capture-skeleton-sweep{from{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.idv-capture-skeleton::before{animation:none}}.idv-capture-skeleton--document{aspect-ratio:3 / 4;height:auto}.idv-capture-skeleton--standalone{position:static;transform:none;margin:0 auto}@media(orientation:landscape)and (pointer:coarse){.idv-capture-skeleton{height:min(55dvh,var(--idv-capture-landscape-max-height, 380px))}}@media(pointer:fine)and (min-width:768px){.idv-capture-skeleton{max-width:var(--idv-capture-max-width, 34rem);height:min(70dvh,560px)}}:root{--idv-capture-max-height: 520px;--idv-capture-landscape-max-height: 380px}.idv-capture-root{display:contents}.idv-capture-status{margin:0.75rem 0 0;text-align:center;color:#6b7280;font-size:0.875rem;line-height:1.4}.idv-capture-error{margin:0.75rem auto 1.25rem;max-width:22rem;text-align:center}.idv-capture-error p{margin:0 0 0.75rem;color:#374151;font-size:0.9375rem;line-height:1.5}.idv-capture-retry{display:inline-block;padding:0.5rem 1rem;font:inherit;font-size:0.875rem;font-weight:500;color:#374151;background:transparent;border:1px solid #d1d5db;border-radius:0.375rem;cursor:pointer}.idv-capture-retry:hover{background:#f3f4f6;border-color:#9ca3af}.idv-capture-retry:focus-visible{outline:2px solid #6b7280;outline-offset:2px}.idv-capture-cv-reject{text-align:center;color:#6b7280;font-size:0.8125rem;line-height:1.4;padding:0.5rem 0.75rem;background:#f9fafb;border:1px solid #e5e7eb;border-radius:0.375rem}[data-color-mode=dark] .idv-capture-status{color:#9ca3af}[data-color-mode=dark] .idv-capture-error p{color:#d1d5db}[data-color-mode=dark] .idv-capture-retry{color:#e5e7eb;background:transparent;border-color:#4b5563}[data-color-mode=dark] .idv-capture-retry:hover{background:#1f2937;border-color:#6b7280}[data-color-mode=dark] .idv-capture-cv-reject{color:#d1d5db;background:#1f2937;border-color:#374151}@media(pointer:coarse)and (max-width:640px),(pointer:coarse)and (max-height:640px){.idv-capture-immersive{position:fixed;inset:0;z-index:2147483000;display:flex;flex-direction:column;height:100dvh;overflow:hidden;box-sizing:border-box;background:#111827}.idv-capture-immersive .idv-capture-frame,.idv-capture-immersive .idv-capture-frame--biometric{flex:1 1 auto;min-height:0;width:100%;height:auto;max-width:none;aspect-ratio:auto;border-radius:0}.idv-capture-immersive .idv-capture-cv-reject,.idv-capture-immersive .idv-capture-status{flex:0 0 auto}.idv-capture-immersive .idv-capture-cv-reject{background:transparent;border:0;border-radius:0;color:#f3f4f6;padding:0.5rem 1rem;font-size:0.8125rem}.idv-capture-immersive .idv-capture-status{margin:0;text-align:center;color:#f3f4f6;line-height:1.4;font-size:0.875rem;padding:0.75rem 1rem calc(0.75rem + env(safe-area-inset-bottom))}.idv-capture-immersive .idv-capture-skeleton{position:absolute;inset:0;transform:none;width:100%;max-width:none;height:auto;background:#1f2937}.idv-capture-immersive .idv-capture-sentinel{position:absolute;width:0;height:0;overflow:hidden}}
package/dist/idv.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import './machine-CuZalPFX.js';
2
- import './copy-Dfmk11S_.js';
3
- export { h as CrossDeviceHandoffHook, l as IdvHandle, m as IdvMountOptions, B as REMINT_READY_TIMEOUT_MS, D as createIdv } from './api-CkHzWaTo.js';
1
+ import './machine-DZPN-A44.js';
2
+ import './copy-CC_mrlVV.js';
3
+ export { h as CrossDeviceHandoffHook, l as IdvHandle, m as IdvMountOptions, D as REMINT_READY_TIMEOUT_MS, E as createIdv } from './api-DWWQGjxL.js';
4
4
  import './copy-DCeQ4JKx.js';