@incodetech/prizma-core-screens 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/CaptureOverlay.css +55 -0
- package/dist/CaptureOverlay.d.ts +34 -0
- package/dist/CaptureOverlay.js +32 -0
- package/dist/CaptureScreen.d.ts +51 -0
- package/dist/CaptureScreen.js +30 -0
- package/dist/CurpConfirmScreen.d.ts +33 -0
- package/dist/CurpConfirmScreen.js +29 -0
- package/dist/CurpEnterScreen.d.ts +51 -0
- package/dist/CurpEnterScreen.js +77 -0
- package/dist/CurpGenerateScreen.d.ts +47 -0
- package/dist/CurpGenerateScreen.js +57 -0
- package/dist/CurpLayout.css +92 -0
- package/dist/CurpProcessingScreen.d.ts +32 -0
- package/dist/CurpProcessingScreen.js +29 -0
- package/dist/CurpResultScreen.d.ts +37 -0
- package/dist/CurpResultScreen.js +36 -0
- package/dist/CurpStrings.d.ts +170 -0
- package/dist/CurpStrings.js +16 -0
- package/dist/DataSharingConsentConsentScreen.d.ts +73 -0
- package/dist/DataSharingConsentConsentScreen.js +120 -0
- package/dist/DataSharingConsentLayout.css +78 -0
- package/dist/DataSharingConsentStrings.d.ts +96 -0
- package/dist/DataSharingConsentStrings.js +38 -0
- package/dist/DemoScreensEndScreen.d.ts +33 -0
- package/dist/DemoScreensEndScreen.js +27 -0
- package/dist/DemoScreensStrings.d.ts +11 -0
- package/dist/DemoScreensStrings.js +19 -0
- package/dist/DocumentCaptureCaptureScreen.d.ts +53 -0
- package/dist/DocumentCaptureCaptureScreen.js +51 -0
- package/dist/DocumentCaptureCommonIssuesScreen.d.ts +32 -0
- package/dist/DocumentCaptureCommonIssuesScreen.js +45 -0
- package/dist/DocumentCaptureConfirmImageScreen.d.ts +38 -0
- package/dist/DocumentCaptureConfirmImageScreen.js +34 -0
- package/dist/DocumentCaptureConfirmUploadScreen.d.ts +43 -0
- package/dist/DocumentCaptureConfirmUploadScreen.js +29 -0
- package/dist/DocumentCaptureGenericErrorScreen.d.ts +36 -0
- package/dist/DocumentCaptureGenericErrorScreen.js +30 -0
- package/dist/DocumentCaptureIllustration.d.ts +45 -0
- package/dist/DocumentCaptureIllustration.js +7 -0
- package/dist/DocumentCaptureLayout.css +226 -0
- package/dist/DocumentCaptureMethodSelectionScreen.d.ts +45 -0
- package/dist/DocumentCaptureMethodSelectionScreen.js +70 -0
- package/dist/DocumentCaptureNextPageScreen.d.ts +33 -0
- package/dist/DocumentCaptureNextPageScreen.js +28 -0
- package/dist/DocumentCaptureNoConnectionScreen.d.ts +28 -0
- package/dist/DocumentCaptureNoConnectionScreen.js +29 -0
- package/dist/DocumentCaptureStrings.d.ts +158 -0
- package/dist/DocumentCaptureStrings.js +21 -0
- package/dist/DocumentCaptureTutorialScreen.d.ts +36 -0
- package/dist/DocumentCaptureTutorialScreen.js +27 -0
- package/dist/EkybAddressDetailsScreen.d.ts +61 -0
- package/dist/EkybAddressDetailsScreen.js +63 -0
- package/dist/EkybBusinessDetailsScreen.d.ts +55 -0
- package/dist/EkybBusinessDetailsScreen.js +57 -0
- package/dist/EkybCountryScreen.d.ts +52 -0
- package/dist/EkybCountryScreen.js +58 -0
- package/dist/EkybErrorScreen.d.ts +30 -0
- package/dist/EkybErrorScreen.js +24 -0
- package/dist/EkybOwnersScreen.d.ts +73 -0
- package/dist/EkybOwnersScreen.js +87 -0
- package/dist/EkybProcessingScreen.d.ts +28 -0
- package/dist/EkybProcessingScreen.js +22 -0
- package/dist/EkybStrings.d.ts +200 -0
- package/dist/EkybStrings.js +27 -0
- package/dist/EkybSuccessScreen.d.ts +28 -0
- package/dist/EkybSuccessScreen.js +22 -0
- package/dist/EkycDetailsScreen.d.ts +65 -0
- package/dist/EkycDetailsScreen.js +81 -0
- package/dist/EkycErrorScreen.d.ts +32 -0
- package/dist/EkycErrorScreen.js +26 -0
- package/dist/EkycLayout.css +39 -0
- package/dist/EkycLicenseScreen.d.ts +21 -0
- package/dist/EkycLicenseScreen.js +68 -0
- package/dist/EkycProcessingScreen.d.ts +26 -0
- package/dist/EkycProcessingScreen.js +20 -0
- package/dist/EkycStrings.d.ts +112 -0
- package/dist/EkycStrings.js +34 -0
- package/dist/EkycSuccessScreen.d.ts +29 -0
- package/dist/EkycSuccessScreen.js +23 -0
- package/dist/ElectronicSignatureDrawScreen.d.ts +57 -0
- package/dist/ElectronicSignatureDrawScreen.js +53 -0
- package/dist/ElectronicSignatureErrorScreen.d.ts +31 -0
- package/dist/ElectronicSignatureErrorScreen.js +25 -0
- package/dist/ElectronicSignatureLayout.css +80 -0
- package/dist/ElectronicSignatureReviewScreen.d.ts +51 -0
- package/dist/ElectronicSignatureReviewScreen.js +36 -0
- package/dist/ElectronicSignatureStrings.d.ts +50 -0
- package/dist/ElectronicSignatureStrings.js +12 -0
- package/dist/ElectronicSignatureSuccessScreen.d.ts +30 -0
- package/dist/ElectronicSignatureSuccessScreen.js +24 -0
- package/dist/EmailInputErrorScreen.d.ts +34 -0
- package/dist/EmailInputErrorScreen.js +28 -0
- package/dist/EmailInputOtpScreen.d.ts +56 -0
- package/dist/EmailInputOtpScreen.js +82 -0
- package/dist/EmailInputProcessingScreen.d.ts +29 -0
- package/dist/EmailInputProcessingScreen.js +23 -0
- package/dist/EmailInputStrings.d.ts +130 -0
- package/dist/EmailInputStrings.js +19 -0
- package/dist/EmailInputSuccessScreen.d.ts +37 -0
- package/dist/EmailInputSuccessScreen.js +31 -0
- package/dist/EmailInputVerifyScreen.d.ts +46 -0
- package/dist/EmailInputVerifyScreen.js +55 -0
- package/dist/ErrorScreensScreen.d.ts +62 -0
- package/dist/ErrorScreensScreen.js +71 -0
- package/dist/ErrorScreensStrings.d.ts +31 -0
- package/dist/ErrorScreensStrings.js +28 -0
- package/dist/FaceCaptureCapturingScreen.d.ts +32 -0
- package/dist/FaceCaptureCapturingScreen.js +53 -0
- package/dist/FaceCaptureLayout.css +18 -0
- package/dist/FaceCaptureLoadingScreen.d.ts +32 -0
- package/dist/FaceCaptureLoadingScreen.js +30 -0
- package/dist/FaceCaptureManualCaptureScreen.d.ts +32 -0
- package/dist/FaceCaptureManualCaptureScreen.js +27 -0
- package/dist/FaceCaptureNoConnectionScreen.d.ts +30 -0
- package/dist/FaceCaptureNoConnectionScreen.js +31 -0
- package/dist/FaceCaptureResultErrorScreen.d.ts +40 -0
- package/dist/FaceCaptureResultErrorScreen.js +32 -0
- package/dist/FaceCaptureResultSuccessScreen.d.ts +25 -0
- package/dist/FaceCaptureResultSuccessScreen.js +27 -0
- package/dist/FaceCaptureStrings.d.ts +62 -0
- package/dist/FaceCaptureStrings.js +14 -0
- package/dist/FaceCaptureTutorialScreen.d.ts +29 -0
- package/dist/FaceCaptureTutorialScreen.js +20 -0
- package/dist/FaceMatchComparisonCompactScreen.d.ts +26 -0
- package/dist/FaceMatchComparisonCompactScreen.js +24 -0
- package/dist/FaceMatchComparisonScreen.d.ts +80 -0
- package/dist/FaceMatchComparisonScreen.js +81 -0
- package/dist/FaceMatchLayout.css +264 -0
- package/dist/FaceMatchResultScreen.d.ts +50 -0
- package/dist/FaceMatchResultScreen.js +52 -0
- package/dist/FaceMatchStrings.d.ts +66 -0
- package/dist/FaceMatchStrings.js +21 -0
- package/dist/FormScreen.css +78 -0
- package/dist/FormScreen.d.ts +101 -0
- package/dist/FormScreen.js +36 -0
- package/dist/FormsChoiceScreen.d.ts +66 -0
- package/dist/FormsChoiceScreen.js +63 -0
- package/dist/FormsErrorScreen.d.ts +28 -0
- package/dist/FormsErrorScreen.js +22 -0
- package/dist/FormsFieldScreen.d.ts +66 -0
- package/dist/FormsFieldScreen.js +85 -0
- package/dist/FormsLayout.css +45 -0
- package/dist/FormsLongFormScreen.d.ts +70 -0
- package/dist/FormsLongFormScreen.js +149 -0
- package/dist/FormsStrings.d.ts +181 -0
- package/dist/FormsStrings.js +36 -0
- package/dist/FormsSuccessScreen.d.ts +32 -0
- package/dist/FormsSuccessScreen.js +26 -0
- package/dist/GeolocationBrowserStepsScreen.d.ts +56 -0
- package/dist/GeolocationBrowserStepsScreen.js +95 -0
- package/dist/GeolocationErrorScreen.d.ts +43 -0
- package/dist/GeolocationErrorScreen.js +56 -0
- package/dist/GeolocationIntroScreen.d.ts +49 -0
- package/dist/GeolocationIntroScreen.js +38 -0
- package/dist/GeolocationPermissionScreen.d.ts +38 -0
- package/dist/GeolocationPermissionScreen.js +30 -0
- package/dist/GeolocationStrings.d.ts +157 -0
- package/dist/GeolocationStrings.js +28 -0
- package/dist/IdCaptureAgeVerificationScreen.d.ts +25 -0
- package/dist/IdCaptureAgeVerificationScreen.js +38 -0
- package/dist/IdCaptureAnalyzingScreen.d.ts +41 -0
- package/dist/IdCaptureAnalyzingScreen.js +30 -0
- package/dist/IdCaptureCommonIssuesScreen.d.ts +31 -0
- package/dist/IdCaptureCommonIssuesScreen.js +49 -0
- package/dist/IdCaptureDocumentErrorScreen.d.ts +37 -0
- package/dist/IdCaptureDocumentErrorScreen.js +30 -0
- package/dist/IdCaptureDocumentSelectionScreen.d.ts +41 -0
- package/dist/IdCaptureDocumentSelectionScreen.js +49 -0
- package/dist/IdCaptureFlipScreen.d.ts +31 -0
- package/dist/IdCaptureFlipScreen.js +26 -0
- package/dist/IdCaptureHoldOnScreen.d.ts +28 -0
- package/dist/IdCaptureHoldOnScreen.js +22 -0
- package/dist/IdCaptureLayout.css +111 -0
- package/dist/IdCaptureNoConnectionScreen.d.ts +28 -0
- package/dist/IdCaptureNoConnectionScreen.js +29 -0
- package/dist/IdCapturePermissionScreen.d.ts +34 -0
- package/dist/IdCapturePermissionScreen.js +45 -0
- package/dist/IdCaptureResultScreen.d.ts +59 -0
- package/dist/IdCaptureResultScreen.js +89 -0
- package/dist/IdCaptureStageScreen.d.ts +69 -0
- package/dist/IdCaptureStageScreen.js +88 -0
- package/dist/IdCaptureStrings.d.ts +199 -0
- package/dist/IdCaptureStrings.js +15 -0
- package/dist/IdCaptureTutorialScreen.d.ts +36 -0
- package/dist/IdCaptureTutorialScreen.js +30 -0
- package/dist/ListScreen.d.ts +95 -0
- package/dist/ListScreen.js +46 -0
- package/dist/LoaderScreen.d.ts +32 -0
- package/dist/LoaderScreen.js +27 -0
- package/dist/LoadersStrings.d.ts +20 -0
- package/dist/LoadersStrings.js +16 -0
- package/dist/NfcCommonIssuesScreen.d.ts +35 -0
- package/dist/NfcCommonIssuesScreen.js +48 -0
- package/dist/NfcErrorScreen.d.ts +41 -0
- package/dist/NfcErrorScreen.js +27 -0
- package/dist/NfcLayout.css +36 -0
- package/dist/NfcProcessingScreen.d.ts +28 -0
- package/dist/NfcProcessingScreen.js +22 -0
- package/dist/NfcScanningScreen.d.ts +66 -0
- package/dist/NfcScanningScreen.js +61 -0
- package/dist/NfcSettingsScreen.d.ts +53 -0
- package/dist/NfcSettingsScreen.js +57 -0
- package/dist/NfcStrings.d.ts +112 -0
- package/dist/NfcStrings.js +7 -0
- package/dist/NfcSuccessScreen.d.ts +28 -0
- package/dist/NfcSuccessScreen.js +22 -0
- package/dist/NfcSymbolScreen.d.ts +39 -0
- package/dist/NfcSymbolScreen.js +32 -0
- package/dist/NfcTryAgainScreen.d.ts +53 -0
- package/dist/NfcTryAgainScreen.js +45 -0
- package/dist/NfcTutorialScreen.d.ts +33 -0
- package/dist/NfcTutorialScreen.js +24 -0
- package/dist/PermissionsAllowScreen.d.ts +44 -0
- package/dist/PermissionsAllowScreen.js +38 -0
- package/dist/PermissionsBrowserStepsScreen.d.ts +42 -0
- package/dist/PermissionsBrowserStepsScreen.js +86 -0
- package/dist/PermissionsRequiredScreen.d.ts +37 -0
- package/dist/PermissionsRequiredScreen.js +51 -0
- package/dist/PermissionsStrings.d.ts +70 -0
- package/dist/PermissionsStrings.js +36 -0
- package/dist/PhoneInputErrorScreen.d.ts +37 -0
- package/dist/PhoneInputErrorScreen.js +47 -0
- package/dist/PhoneInputLayout.css +61 -0
- package/dist/PhoneInputOtpScreen.d.ts +37 -0
- package/dist/PhoneInputOtpScreen.js +44 -0
- package/dist/PhoneInputSnaLoadingScreen.d.ts +23 -0
- package/dist/PhoneInputSnaLoadingScreen.js +17 -0
- package/dist/PhoneInputStrings.d.ts +121 -0
- package/dist/PhoneInputStrings.js +13 -0
- package/dist/PhoneInputSuccessScreen.d.ts +23 -0
- package/dist/PhoneInputSuccessScreen.js +17 -0
- package/dist/PhoneInputVerifyScreen.d.ts +41 -0
- package/dist/PhoneInputVerifyScreen.js +71 -0
- package/dist/ProcessingScreen.d.ts +42 -0
- package/dist/ProcessingScreen.js +21 -0
- package/dist/QualifiedSignatureAcceptScreen.d.ts +71 -0
- package/dist/QualifiedSignatureAcceptScreen.js +86 -0
- package/dist/QualifiedSignatureDocumentScreen.d.ts +62 -0
- package/dist/QualifiedSignatureDocumentScreen.js +56 -0
- package/dist/QualifiedSignatureLayout.css +206 -0
- package/dist/QualifiedSignatureProcessingScreen.d.ts +46 -0
- package/dist/QualifiedSignatureProcessingScreen.js +48 -0
- package/dist/QualifiedSignatureResultScreen.d.ts +65 -0
- package/dist/QualifiedSignatureResultScreen.js +76 -0
- package/dist/QualifiedSignatureReviewScreen.d.ts +49 -0
- package/dist/QualifiedSignatureReviewScreen.js +40 -0
- package/dist/QualifiedSignatureStrings.d.ts +222 -0
- package/dist/QualifiedSignatureStrings.js +25 -0
- package/dist/QualifiedSignatureUploadScreen.d.ts +42 -0
- package/dist/QualifiedSignatureUploadScreen.js +35 -0
- package/dist/ResultScreen.d.ts +93 -0
- package/dist/ResultScreen.js +37 -0
- package/dist/ReviewScreen.d.ts +81 -0
- package/dist/ReviewScreen.js +56 -0
- package/dist/ScreenLayout.css +469 -0
- package/dist/ScreenNav.css +43 -0
- package/dist/ScreenNav.d.ts +26 -0
- package/dist/ScreenNav.js +13 -0
- package/dist/ScreenShell.css +130 -0
- package/dist/ScreenShell.d.ts +45 -0
- package/dist/ScreenShell.js +22 -0
- package/dist/TutorialScreen.d.ts +70 -0
- package/dist/TutorialScreen.js +24 -0
- package/dist/VideoSelfieCameraStepsScreen.d.ts +47 -0
- package/dist/VideoSelfieCameraStepsScreen.js +56 -0
- package/dist/VideoSelfieErrorScreen.d.ts +63 -0
- package/dist/VideoSelfieErrorScreen.js +94 -0
- package/dist/VideoSelfieFlipCameraScreen.d.ts +34 -0
- package/dist/VideoSelfieFlipCameraScreen.js +38 -0
- package/dist/VideoSelfieFlipIdScreen.d.ts +34 -0
- package/dist/VideoSelfieFlipIdScreen.js +29 -0
- package/dist/VideoSelfieIdCaptureScreen.d.ts +75 -0
- package/dist/VideoSelfieIdCaptureScreen.js +86 -0
- package/dist/VideoSelfieLayout.css +259 -0
- package/dist/VideoSelfiePermissionRequiredScreen.d.ts +35 -0
- package/dist/VideoSelfiePermissionRequiredScreen.js +45 -0
- package/dist/VideoSelfiePermissionScreen.d.ts +51 -0
- package/dist/VideoSelfiePermissionScreen.js +44 -0
- package/dist/VideoSelfieProcessingScreen.d.ts +28 -0
- package/dist/VideoSelfieProcessingScreen.js +22 -0
- package/dist/VideoSelfieRetryScreen.d.ts +31 -0
- package/dist/VideoSelfieRetryScreen.js +32 -0
- package/dist/VideoSelfieSelfieCaptureScreen.d.ts +52 -0
- package/dist/VideoSelfieSelfieCaptureScreen.js +58 -0
- package/dist/VideoSelfieSpeakScreen.d.ts +64 -0
- package/dist/VideoSelfieSpeakScreen.js +95 -0
- package/dist/VideoSelfieStrings.d.ts +196 -0
- package/dist/VideoSelfieStrings.js +14 -0
- package/dist/VideoSelfieSuccessScreen.d.ts +25 -0
- package/dist/VideoSelfieSuccessScreen.js +19 -0
- package/dist/VideoSelfieTutorialScreen.d.ts +33 -0
- package/dist/VideoSelfieTutorialScreen.js +41 -0
- package/dist/ViewfinderScreen.css +107 -0
- package/dist/ViewfinderScreen.d.ts +40 -0
- package/dist/ViewfinderScreen.js +26 -0
- package/dist/WatchlistBusinessFormScreen.d.ts +61 -0
- package/dist/WatchlistBusinessFormScreen.js +85 -0
- package/dist/WatchlistBusinessProcessingScreen.d.ts +25 -0
- package/dist/WatchlistBusinessProcessingScreen.js +19 -0
- package/dist/WatchlistBusinessStrings.d.ts +95 -0
- package/dist/WatchlistBusinessStrings.js +19 -0
- package/dist/WatchlistBusinessSuccessScreen.d.ts +29 -0
- package/dist/WatchlistBusinessSuccessScreen.js +23 -0
- package/dist/flows.d.ts +216 -0
- package/dist/flows.js +516 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.js +130 -0
- package/dist/styles.css +33 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.js +8 -0
- package/package.json +689 -0
- package/samples/camera-surface.png +0 -0
- package/samples/document-still.png +0 -0
- package/samples/document-thumbnail.png +0 -0
- package/samples/face-match-bottom.png +0 -0
- package/samples/face-match-left.png +0 -0
- package/samples/face-match-right.png +0 -0
- package/samples/id-back-blur.png +0 -0
- package/samples/id-back-dark.png +0 -0
- package/samples/id-back-glare.png +0 -0
- package/samples/id-back.png +0 -0
- package/samples/id-front-blur.png +0 -0
- package/samples/id-front-dark.png +0 -0
- package/samples/id-front-glare.png +0 -0
- package/samples/id-front.png +0 -0
- package/samples/id-passport.png +0 -0
- package/samples/selfie-glasses.png +0 -0
- package/samples/selfie-hat.png +0 -0
- package/samples/selfie-mask.png +0 -0
- package/samples/selfie.png +0 -0
- package/samples/video-selfie-camera.png +0 -0
- package/src/CaptureOverlay.css +55 -0
- package/src/CaptureOverlay.tsx +56 -0
- package/src/CaptureScreen.tsx +121 -0
- package/src/CurpConfirmScreen.tsx +75 -0
- package/src/CurpEnterScreen.tsx +149 -0
- package/src/CurpGenerateScreen.tsx +172 -0
- package/src/CurpLayout.css +92 -0
- package/src/CurpProcessingScreen.tsx +75 -0
- package/src/CurpResultScreen.tsx +80 -0
- package/src/CurpStrings.ts +178 -0
- package/src/DataSharingConsentConsentScreen.tsx +223 -0
- package/src/DataSharingConsentLayout.css +78 -0
- package/src/DataSharingConsentStrings.ts +144 -0
- package/src/DemoScreensEndScreen.tsx +56 -0
- package/src/DemoScreensStrings.ts +31 -0
- package/src/DocumentCaptureCaptureScreen.tsx +135 -0
- package/src/DocumentCaptureCommonIssuesScreen.tsx +97 -0
- package/src/DocumentCaptureConfirmImageScreen.tsx +112 -0
- package/src/DocumentCaptureConfirmUploadScreen.tsx +113 -0
- package/src/DocumentCaptureGenericErrorScreen.tsx +82 -0
- package/src/DocumentCaptureIllustration.tsx +153 -0
- package/src/DocumentCaptureLayout.css +226 -0
- package/src/DocumentCaptureMethodSelectionScreen.tsx +151 -0
- package/src/DocumentCaptureNextPageScreen.tsx +82 -0
- package/src/DocumentCaptureNoConnectionScreen.tsx +77 -0
- package/src/DocumentCaptureStrings.ts +192 -0
- package/src/DocumentCaptureTutorialScreen.tsx +79 -0
- package/src/EkybAddressDetailsScreen.tsx +200 -0
- package/src/EkybBusinessDetailsScreen.tsx +147 -0
- package/src/EkybCountryScreen.tsx +124 -0
- package/src/EkybErrorScreen.tsx +61 -0
- package/src/EkybOwnersScreen.tsx +230 -0
- package/src/EkybProcessingScreen.tsx +57 -0
- package/src/EkybStrings.ts +239 -0
- package/src/EkybSuccessScreen.tsx +54 -0
- package/src/EkycDetailsScreen.tsx +178 -0
- package/src/EkycErrorScreen.tsx +64 -0
- package/src/EkycLayout.css +39 -0
- package/src/EkycLicenseScreen.tsx +164 -0
- package/src/EkycProcessingScreen.tsx +60 -0
- package/src/EkycStrings.ts +157 -0
- package/src/EkycSuccessScreen.tsx +63 -0
- package/src/ElectronicSignatureDrawScreen.tsx +127 -0
- package/src/ElectronicSignatureErrorScreen.tsx +74 -0
- package/src/ElectronicSignatureLayout.css +80 -0
- package/src/ElectronicSignatureReviewScreen.tsx +106 -0
- package/src/ElectronicSignatureStrings.ts +67 -0
- package/src/ElectronicSignatureSuccessScreen.tsx +67 -0
- package/src/EmailInputErrorScreen.tsx +67 -0
- package/src/EmailInputOtpScreen.tsx +169 -0
- package/src/EmailInputProcessingScreen.tsx +67 -0
- package/src/EmailInputStrings.ts +166 -0
- package/src/EmailInputSuccessScreen.tsx +72 -0
- package/src/EmailInputVerifyScreen.tsx +117 -0
- package/src/ErrorScreensScreen.tsx +149 -0
- package/src/ErrorScreensStrings.ts +66 -0
- package/src/FaceCaptureCapturingScreen.tsx +99 -0
- package/src/FaceCaptureLayout.css +18 -0
- package/src/FaceCaptureLoadingScreen.tsx +65 -0
- package/src/FaceCaptureManualCaptureScreen.tsx +94 -0
- package/src/FaceCaptureNoConnectionScreen.tsx +73 -0
- package/src/FaceCaptureResultErrorScreen.tsx +86 -0
- package/src/FaceCaptureResultSuccessScreen.tsx +49 -0
- package/src/FaceCaptureStrings.ts +92 -0
- package/src/FaceCaptureTutorialScreen.tsx +77 -0
- package/src/FaceMatchComparisonCompactScreen.tsx +51 -0
- package/src/FaceMatchComparisonScreen.tsx +201 -0
- package/src/FaceMatchLayout.css +264 -0
- package/src/FaceMatchResultScreen.tsx +117 -0
- package/src/FaceMatchStrings.ts +95 -0
- package/src/FormScreen.css +78 -0
- package/src/FormScreen.tsx +213 -0
- package/src/FormsChoiceScreen.tsx +150 -0
- package/src/FormsErrorScreen.tsx +61 -0
- package/src/FormsFieldScreen.tsx +198 -0
- package/src/FormsLayout.css +45 -0
- package/src/FormsLongFormScreen.tsx +295 -0
- package/src/FormsStrings.ts +243 -0
- package/src/FormsSuccessScreen.tsx +67 -0
- package/src/GeolocationBrowserStepsScreen.tsx +173 -0
- package/src/GeolocationErrorScreen.tsx +113 -0
- package/src/GeolocationIntroScreen.tsx +100 -0
- package/src/GeolocationPermissionScreen.tsx +88 -0
- package/src/GeolocationStrings.ts +193 -0
- package/src/IdCaptureAgeVerificationScreen.tsx +84 -0
- package/src/IdCaptureAnalyzingScreen.tsx +94 -0
- package/src/IdCaptureCommonIssuesScreen.tsx +109 -0
- package/src/IdCaptureDocumentErrorScreen.tsx +92 -0
- package/src/IdCaptureDocumentSelectionScreen.tsx +100 -0
- package/src/IdCaptureFlipScreen.tsx +66 -0
- package/src/IdCaptureHoldOnScreen.tsx +51 -0
- package/src/IdCaptureLayout.css +111 -0
- package/src/IdCaptureNoConnectionScreen.tsx +68 -0
- package/src/IdCapturePermissionScreen.tsx +102 -0
- package/src/IdCaptureResultScreen.tsx +197 -0
- package/src/IdCaptureStageScreen.tsx +241 -0
- package/src/IdCaptureStrings.ts +228 -0
- package/src/IdCaptureTutorialScreen.tsx +99 -0
- package/src/ListScreen.tsx +213 -0
- package/src/LoaderScreen.tsx +69 -0
- package/src/LoadersStrings.ts +38 -0
- package/src/NfcCommonIssuesScreen.tsx +104 -0
- package/src/NfcErrorScreen.tsx +83 -0
- package/src/NfcLayout.css +36 -0
- package/src/NfcProcessingScreen.tsx +57 -0
- package/src/NfcScanningScreen.tsx +127 -0
- package/src/NfcSettingsScreen.tsx +124 -0
- package/src/NfcStrings.ts +127 -0
- package/src/NfcSuccessScreen.tsx +56 -0
- package/src/NfcSymbolScreen.tsx +85 -0
- package/src/NfcTryAgainScreen.tsx +114 -0
- package/src/NfcTutorialScreen.tsx +76 -0
- package/src/PermissionsAllowScreen.tsx +90 -0
- package/src/PermissionsBrowserStepsScreen.tsx +158 -0
- package/src/PermissionsRequiredScreen.tsx +118 -0
- package/src/PermissionsStrings.ts +129 -0
- package/src/PhoneInputErrorScreen.tsx +104 -0
- package/src/PhoneInputLayout.css +61 -0
- package/src/PhoneInputOtpScreen.tsx +126 -0
- package/src/PhoneInputSnaLoadingScreen.tsx +61 -0
- package/src/PhoneInputStrings.ts +136 -0
- package/src/PhoneInputSuccessScreen.tsx +56 -0
- package/src/PhoneInputVerifyScreen.tsx +153 -0
- package/src/ProcessingScreen.tsx +97 -0
- package/src/QualifiedSignatureAcceptScreen.tsx +198 -0
- package/src/QualifiedSignatureDocumentScreen.tsx +124 -0
- package/src/QualifiedSignatureLayout.css +206 -0
- package/src/QualifiedSignatureProcessingScreen.tsx +112 -0
- package/src/QualifiedSignatureResultScreen.tsx +146 -0
- package/src/QualifiedSignatureReviewScreen.tsx +113 -0
- package/src/QualifiedSignatureStrings.ts +256 -0
- package/src/QualifiedSignatureUploadScreen.tsx +81 -0
- package/src/ResultScreen.tsx +211 -0
- package/src/ReviewScreen.tsx +196 -0
- package/src/ScreenLayout.css +469 -0
- package/src/ScreenNav.css +43 -0
- package/src/ScreenNav.tsx +46 -0
- package/src/ScreenShell.css +130 -0
- package/src/ScreenShell.tsx +66 -0
- package/src/TutorialScreen.tsx +166 -0
- package/src/VideoSelfieCameraStepsScreen.tsx +145 -0
- package/src/VideoSelfieErrorScreen.tsx +168 -0
- package/src/VideoSelfieFlipCameraScreen.tsx +88 -0
- package/src/VideoSelfieFlipIdScreen.tsx +74 -0
- package/src/VideoSelfieIdCaptureScreen.tsx +213 -0
- package/src/VideoSelfieLayout.css +259 -0
- package/src/VideoSelfiePermissionRequiredScreen.tsx +104 -0
- package/src/VideoSelfiePermissionScreen.tsx +102 -0
- package/src/VideoSelfieProcessingScreen.tsx +68 -0
- package/src/VideoSelfieRetryScreen.tsx +92 -0
- package/src/VideoSelfieSelfieCaptureScreen.tsx +122 -0
- package/src/VideoSelfieSpeakScreen.tsx +237 -0
- package/src/VideoSelfieStrings.ts +222 -0
- package/src/VideoSelfieSuccessScreen.tsx +64 -0
- package/src/VideoSelfieTutorialScreen.tsx +129 -0
- package/src/ViewfinderScreen.css +107 -0
- package/src/ViewfinderScreen.tsx +113 -0
- package/src/WatchlistBusinessFormScreen.tsx +176 -0
- package/src/WatchlistBusinessProcessingScreen.tsx +63 -0
- package/src/WatchlistBusinessStrings.ts +121 -0
- package/src/WatchlistBusinessSuccessScreen.tsx +67 -0
- package/src/flows.ts +711 -0
- package/src/index.ts +591 -0
- package/src/styles.css +33 -0
- package/src/types.ts +69 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/* Face Match — module layout additions.
|
|
2
|
+
*
|
|
3
|
+
* ONLY what the foundation archetypes do not already own. Every value is a
|
|
4
|
+
* token (or token arithmetic); each departure from GUIDELINES.md or from the
|
|
5
|
+
* module Figma carries a numbered row in DEVIATIONS.md (Wave 2 section).
|
|
6
|
+
*
|
|
7
|
+
* The foundation supplies everything else: the shell, the nav offset, the 24px
|
|
8
|
+
* content padding, the flex middle, the CTA band recipe and the footer tag
|
|
9
|
+
* (ScreenLayout.css). Nothing there is re-declared here.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* ── Face comparison cluster (faceMatch.comparison.*) ────────────────────────
|
|
13
|
+
* The module's one genuinely new composition: two or three captured portraits
|
|
14
|
+
* as circles, each with a label callout above it, that CONVERGE into a rosette
|
|
15
|
+
* in the `matching` state.
|
|
16
|
+
*
|
|
17
|
+
* Anatomy, measured off the purple 390 sections: photo circle 160, top row gap
|
|
18
|
+
* 15 → Spacing/16 (1px, within Figma's off-grid rounding), converged vertical
|
|
19
|
+
* offset 80.25 → `2 × Spacing/40` (0.25px, sub-pixel). The converged HORIZONTAL
|
|
20
|
+
* overlap is 44 and stays a literal — approximating it to 40 was a visible 4px
|
|
21
|
+
* error per seam. DEVIATIONS.md #FM-20, #FM-21.
|
|
22
|
+
*
|
|
23
|
+
* The circles themselves are HOST-supplied content (the same contract as
|
|
24
|
+
* `camera` on the capture screens): Core has no captured-photo primitive, so
|
|
25
|
+
* this layer only masks and positions what the host passes in — no Core
|
|
26
|
+
* primitive is re-implemented. DEVIATIONS.md #FM-22. */
|
|
27
|
+
|
|
28
|
+
.face-match-cluster {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
align-items: center;
|
|
32
|
+
|
|
33
|
+
/* The disc's diameter, named once. `--matching`'s rosette and `--animated`'s
|
|
34
|
+
* convergence both have to know it, and a second literal is a second thing to
|
|
35
|
+
* forget. Still a design literal, still DEVIATIONS #FM-22 — just not repeated. */
|
|
36
|
+
--face-match-photo: 160px;
|
|
37
|
+
/* Half the distance between two neighbouring discs: what one of them has to
|
|
38
|
+
* travel to reach the pair's centre line. */
|
|
39
|
+
--face-match-half-step: calc((var(--face-match-photo) + var(--prizma-spacing-16)) / 2);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.face-match-cluster__row {
|
|
43
|
+
position: relative; /* z-index stacking context for the overlap order */
|
|
44
|
+
display: flex;
|
|
45
|
+
align-items: flex-end;
|
|
46
|
+
justify-content: center;
|
|
47
|
+
gap: var(--prizma-spacing-16); /* Figma 15 — nearest token (DEVIATIONS #FM-20) */
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Paint order of the converged rosette, per the purple `matching` sections:
|
|
51
|
+
* the lower row sits above the top row, and within a row the first photo sits
|
|
52
|
+
* above the second. */
|
|
53
|
+
.face-match-cluster__row + .face-match-cluster__row {
|
|
54
|
+
z-index: 2;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.face-match-cluster__face {
|
|
58
|
+
position: relative;
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-direction: column;
|
|
61
|
+
align-items: center;
|
|
62
|
+
/* label callout → photo. Figma draws 12px between the callout tail tip and
|
|
63
|
+
* the circle; Core's Tooltip owns the tail itself. */
|
|
64
|
+
gap: var(--prizma-spacing-12);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.face-match-cluster__row > .face-match-cluster__face:first-child {
|
|
68
|
+
z-index: 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* The photo disc. 160×160 is geometry fixed by design (the same class of
|
|
72
|
+
* literal as the capture ring's proportions — GUIDELINES §2); no token exists
|
|
73
|
+
* for component geometry. DEVIATIONS.md #FM-22. */
|
|
74
|
+
.face-match-cluster__photo {
|
|
75
|
+
flex-shrink: 0;
|
|
76
|
+
width: var(--face-match-photo);
|
|
77
|
+
height: var(--face-match-photo);
|
|
78
|
+
border-radius: var(--prizma-border-radius-full);
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
background: var(--prizma-surface-neutral-100);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.face-match-cluster__photo > img,
|
|
84
|
+
.face-match-cluster__photo > video,
|
|
85
|
+
.face-match-cluster__photo > svg {
|
|
86
|
+
display: block;
|
|
87
|
+
width: 100%;
|
|
88
|
+
height: 100%;
|
|
89
|
+
object-fit: cover;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Converged (`*.matching` / `*.threeFacesMatching`): the callouts are gone and
|
|
93
|
+
* the circles overlap.
|
|
94
|
+
*
|
|
95
|
+
* The horizontal overlap is a DESIGN LITERAL, not token arithmetic. Figma draws
|
|
96
|
+
* 44px; the spacing scale stops at 40, so `calc(-1 * Spacing/40)` would render a
|
|
97
|
+
* visibly wrong rosette (4px per seam). Geometry fixed by design and absent from
|
|
98
|
+
* the token set is hardcoded with justification — the same treatment as the
|
|
99
|
+
* 160px photo disc below and the capture ring proportions (GUIDELINES §2).
|
|
100
|
+
* DEVIATIONS.md #FM-20. */
|
|
101
|
+
.face-match-cluster--matching .face-match-cluster__row {
|
|
102
|
+
gap: 0;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.face-match-cluster--matching .face-match-cluster__face + .face-match-cluster__face {
|
|
106
|
+
margin-left: -44px; /* hardcoded — Figma converged overlap; no token (verified absent) */
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.face-match-cluster--matching .face-match-cluster__row + .face-match-cluster__row {
|
|
110
|
+
margin-top: calc(-2 * var(--prizma-spacing-40));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* ── The comparison, moving (`phase` on FaceMatchComparisonScreen) ───────────
|
|
114
|
+
*
|
|
115
|
+
* Everything above draws the comparison STILL — the frames the Figma sections
|
|
116
|
+
* are, and what the Screens grid needs. This draws the same cluster MOVING,
|
|
117
|
+
* which is the thing Face Match actually is: the module has no camera and no
|
|
118
|
+
* control, so the animation is not decoration on top of the screen, it IS the
|
|
119
|
+
* screen. A still of it can only ever be a frame of the film.
|
|
120
|
+
*
|
|
121
|
+
* WHERE THE NUMBERS COME FROM. Not from a judgement call and not from the
|
|
122
|
+
* Figma sections (they carry no motion) — from the SHIPPED WEB SDK, which has
|
|
123
|
+
* animated this module since v1 and whose constants were never written into the
|
|
124
|
+
* token SOT. `ui/src/modules/face-match/animation.css`, read 2026-09-01:
|
|
125
|
+
*
|
|
126
|
+
* ENTRANCE_DELAY 450 · ENTRANCE_DURATION 800 · TOOLTIP_DURATION 1600
|
|
127
|
+
* ANIMATION_DELAY 2850 · ANIMATION_DURATION 800 · TRANSITION_DELAY 200
|
|
128
|
+
* easing cubic-bezier(.25,.46,.45,.94)
|
|
129
|
+
*
|
|
130
|
+
* They are now `Face match/Motion/*` (core/tokens/tokens/components.json), so
|
|
131
|
+
* the SOT states what production does and a motion designer re-times the module
|
|
132
|
+
* by moving a token rather than by finding this file. DEVIATIONS #FM-26.
|
|
133
|
+
*
|
|
134
|
+
* WHY TRANSITIONS AND NOT KEYFRAMES, which is what the SDK uses. A keyframe
|
|
135
|
+
* runs once, on mount, and can never be replayed, stepped into or stepped back
|
|
136
|
+
* out of. The Lab's prototype mounts a screen ONCE for a whole run and steps its
|
|
137
|
+
* props (apps/core-lab/src/lab/prototype/types.ts), so a mount animation would
|
|
138
|
+
* play on arrival and then be gone — "Start over" would show a cluster that is
|
|
139
|
+
* simply already there. Re-expressed as three PHASES the host names, the same
|
|
140
|
+
* choreography plays forwards, backwards, from a seek and from a restart, and
|
|
141
|
+
* the export can photograph it at any instant. The timeline is identical:
|
|
142
|
+
*
|
|
143
|
+
* phase="arriving" the module has opened; the discs are still outside
|
|
144
|
+
* the screen. hold 450
|
|
145
|
+
* phase="comparing" the discs travel in (800), and once they are seated
|
|
146
|
+
* the callouts name them (800, delayed 800). hold 1600
|
|
147
|
+
* phase="converged" the callouts leave (800), and then the discs run
|
|
148
|
+
* together into one and go with them (800,
|
|
149
|
+
* delayed 800), + the module's 200 beat. hold 1800
|
|
150
|
+
*
|
|
151
|
+
* 450 + 1600 + 1800 = 3850ms to the verdict — the SDK's own figure.
|
|
152
|
+
*
|
|
153
|
+
* `--matching` (the static rosette) and `--animated` are mutually exclusive by
|
|
154
|
+
* construction: the screen emits one or the other, never both. The rosette is a
|
|
155
|
+
* FRAME OF THIS, caught partway through the last phase — which is why the
|
|
156
|
+
* moving version does not stop there. */
|
|
157
|
+
|
|
158
|
+
.face-match-cluster--animated .face-match-cluster__face {
|
|
159
|
+
will-change: transform, opacity;
|
|
160
|
+
transition:
|
|
161
|
+
transform var(--prizma-face-match-motion-photo-entrance)
|
|
162
|
+
var(--prizma-face-match-motion-photo-easing),
|
|
163
|
+
opacity var(--prizma-face-match-motion-photo-entrance)
|
|
164
|
+
var(--prizma-face-match-motion-photo-easing);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* The callouts are kept in the DOM in every phase — they have to be there to
|
|
168
|
+
* fade — so their box holds the cluster's height steady while they come and go.
|
|
169
|
+
* Half the cycle each way: the token names the whole life of the label. */
|
|
170
|
+
.face-match-cluster--animated .face-match-cluster__label {
|
|
171
|
+
transition: opacity calc(var(--prizma-face-match-motion-label-cycle) / 2)
|
|
172
|
+
var(--prizma-motion-easing-linear);
|
|
173
|
+
/* Seated last: the discs arrive first, and only then are they named. */
|
|
174
|
+
transition-delay: var(--prizma-face-match-motion-photo-entrance);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ── phase="arriving" ────────────────────────────────────────────────────────
|
|
178
|
+
* Off the sides, and — for the third face — off the bottom. 200px is the SDK's
|
|
179
|
+
* own throw: far enough that a disc is fully outside a 390 screen, near enough
|
|
180
|
+
* that it does not read as flying. A design literal, like the disc itself. */
|
|
181
|
+
|
|
182
|
+
.face-match-cluster--arriving .face-match-cluster__face,
|
|
183
|
+
.face-match-cluster--arriving .face-match-cluster__label {
|
|
184
|
+
opacity: 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.face-match-cluster--arriving
|
|
188
|
+
.face-match-cluster__row:first-child
|
|
189
|
+
> .face-match-cluster__face:first-child {
|
|
190
|
+
transform: translateX(-200px);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.face-match-cluster--arriving
|
|
194
|
+
.face-match-cluster__row:first-child
|
|
195
|
+
> .face-match-cluster__face:last-child {
|
|
196
|
+
transform: translateX(200px);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* The third face — the NFC portrait's selfie, or the second document's — comes
|
|
200
|
+
* up from below rather than in from a side, because there is no side left. */
|
|
201
|
+
.face-match-cluster--arriving
|
|
202
|
+
.face-match-cluster__row
|
|
203
|
+
+ .face-match-cluster__row
|
|
204
|
+
> .face-match-cluster__face {
|
|
205
|
+
transform: translateY(200px);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* ── phase="converged" ───────────────────────────────────────────────────────
|
|
209
|
+
* Every disc onto ONE centre, fading as it goes. Not the 44px rosette: the
|
|
210
|
+
* rosette is where this passes THROUGH at about two thirds, and stopping there
|
|
211
|
+
* would be stopping the sentence in the middle. The discs are gone by the end,
|
|
212
|
+
* which is what lets the verdict take the screen without anything being cleared
|
|
213
|
+
* away first. */
|
|
214
|
+
|
|
215
|
+
.face-match-cluster--converged .face-match-cluster__face {
|
|
216
|
+
opacity: 0;
|
|
217
|
+
/* The labels go first; the discs wait for them to finish before moving. */
|
|
218
|
+
transition-delay: calc(var(--prizma-face-match-motion-label-cycle) / 2);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.face-match-cluster--converged .face-match-cluster__label {
|
|
222
|
+
opacity: 0;
|
|
223
|
+
transition-delay: 0ms;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.face-match-cluster--converged
|
|
227
|
+
.face-match-cluster__row:first-child
|
|
228
|
+
> .face-match-cluster__face:first-child {
|
|
229
|
+
transform: translateX(var(--face-match-half-step));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.face-match-cluster--converged
|
|
233
|
+
.face-match-cluster__row:first-child
|
|
234
|
+
> .face-match-cluster__face:last-child {
|
|
235
|
+
transform: translateX(calc(-1 * var(--face-match-half-step)));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* Up by exactly its own height, which is the row above's height too (same face
|
|
239
|
+
* anatomy) — so the third disc lands concentric with the other two without this
|
|
240
|
+
* file having to know how tall a callout is. */
|
|
241
|
+
.face-match-cluster--converged
|
|
242
|
+
.face-match-cluster__row
|
|
243
|
+
+ .face-match-cluster__row
|
|
244
|
+
> .face-match-cluster__face {
|
|
245
|
+
transform: translateY(-100%);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/* The one honest thing a reduced-motion block can do here: Face Match's whole
|
|
249
|
+
* screen is the movement, so there is nothing to keep — the discs simply are
|
|
250
|
+
* where the phase says they are, and the module still reads. */
|
|
251
|
+
@media (prefers-reduced-motion: reduce) {
|
|
252
|
+
.face-match-cluster--animated .face-match-cluster__face,
|
|
253
|
+
.face-match-cluster--animated .face-match-cluster__label {
|
|
254
|
+
transition-duration: 1ms;
|
|
255
|
+
transition-delay: 0ms;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* ── Removed: the verdict snackbar row ───────────────────────────────────────
|
|
260
|
+
* `.face-match-band__snackbar` positioned the pill inside the CTA band. The
|
|
261
|
+
* verdict screens now render the `PrizmaResultScreen` archetype and the pill
|
|
262
|
+
* rides its `children` slot, where the centred column supplies the gap —
|
|
263
|
+
* DEVIATIONS #F-33.
|
|
264
|
+
*/
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaSnackbar } from '@incodetech/prizma-core-web/snackbar';
|
|
3
|
+
import { PrizmaResultScreen, type PrizmaResultScreenProps } from './ResultScreen';
|
|
4
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
5
|
+
import type {
|
|
6
|
+
FaceMatchLivenessVerdict,
|
|
7
|
+
FaceMatchResultStatus,
|
|
8
|
+
FaceMatchStrings,
|
|
9
|
+
} from './FaceMatchStrings';
|
|
10
|
+
import './ScreenLayout.css';
|
|
11
|
+
|
|
12
|
+
export interface FaceMatchResultScreenProps
|
|
13
|
+
extends Omit<
|
|
14
|
+
PrizmaResultScreenProps,
|
|
15
|
+
'status' | 'title' | 'subtitle' | 'children' | 'bandContent' | 'ctaLabel' | 'verifiedLabel' | 'navLabel'
|
|
16
|
+
> {
|
|
17
|
+
/** Module copy — this screen reads the `matched` / `notMatched` / `liveness`
|
|
18
|
+
* slices (+ shared labels). */
|
|
19
|
+
strings: FaceMatchStrings;
|
|
20
|
+
/** `matched` → the purple `faceMatch.success.*` family (positive status icon);
|
|
21
|
+
* `notMatched` → `faceMatch.error.*` (negative). Default `'matched'`. */
|
|
22
|
+
status?: FaceMatchResultStatus;
|
|
23
|
+
/**
|
|
24
|
+
* The `*.livenessSuccess` / `*.livenessFailed` halves of both families. When
|
|
25
|
+
* set, Figma adds the liveness subtitle under the title and a verdict Snackbar
|
|
26
|
+
* above the CTA; the plain `matched` / `notMatched` sections carry neither.
|
|
27
|
+
*/
|
|
28
|
+
liveness?: FaceMatchLivenessVerdict;
|
|
29
|
+
screenId?: string;
|
|
30
|
+
overrides?: PrizmaScreenOverrides;
|
|
31
|
+
onAction?: PrizmaScreenActionHandler;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Face Match — match verdict, built on the `PrizmaResultScreen` archetype
|
|
36
|
+
* (GUIDELINES.md §6-F). Figma: ALL SIX purple result sections —
|
|
37
|
+
* `faceMatch.success.{matched,livenessSuccess,livenessFailed}` and
|
|
38
|
+
* `faceMatch.error.{notMatched,livenessSuccess,livenessFailed}` — which share
|
|
39
|
+
* one identical layout and differ only by status icon, copy and the presence of
|
|
40
|
+
* the verdict Snackbar. One screen, six variants; splitting it into a success
|
|
41
|
+
* and an error component would be pure duplication.
|
|
42
|
+
*
|
|
43
|
+
* Layout measured off the purple 390 sections (CONTENT frame, 650 tall):
|
|
44
|
+
* nav 0→44 · Title vertically centered in the flexible middle · CTA band at the
|
|
45
|
+
* bottom, Button 56 + Spacing/16 + Tag. The centered block is exactly Core's
|
|
46
|
+
* `PrizmaTitle` (icon slot → Spacing/16 → H2 → Spacing/12 → H5), so nothing is
|
|
47
|
+
* re-implemented; the screen only chooses the status and supplies copy.
|
|
48
|
+
*
|
|
49
|
+
* This file used to compose the foundation shell by hand (143 lines) because no
|
|
50
|
+
* archetype offered a centered status block WITH a CTA band — the gap reported as
|
|
51
|
+
* DEVIATIONS #FM-24, now closed by `PrizmaResultScreen`. The verdict pill rides
|
|
52
|
+
* in the archetype's `bandContent` slot, so it sits INSIDE the CTA band rather
|
|
53
|
+
* than immediately above the CTA where Figma draws it (#F-33).
|
|
54
|
+
*
|
|
55
|
+
* The status marks are Core's outline bank icons via `PrizmaTitle.icon`; the
|
|
56
|
+
* module Figma still draws two-tone filled discs (DEVIATIONS.md #15, unchanged
|
|
57
|
+
* from Wave 1). The verdict pill is Core's `PrizmaSnackbar`, which always
|
|
58
|
+
* carries its state glyph — Figma's pill has none (DEVIATIONS.md #FM-23).
|
|
59
|
+
*/
|
|
60
|
+
export const FaceMatchResultScreen = forwardRef<HTMLDivElement, FaceMatchResultScreenProps>(
|
|
61
|
+
(
|
|
62
|
+
{
|
|
63
|
+
strings,
|
|
64
|
+
status = 'matched',
|
|
65
|
+
liveness,
|
|
66
|
+
screenId = liveness
|
|
67
|
+
? `face-match-${status === 'matched' ? 'matched' : 'not-matched'}-liveness-${liveness}`
|
|
68
|
+
: status === 'matched'
|
|
69
|
+
? 'face-match-matched'
|
|
70
|
+
: 'face-match-not-matched',
|
|
71
|
+
overrides,
|
|
72
|
+
onAction,
|
|
73
|
+
...shell
|
|
74
|
+
},
|
|
75
|
+
ref,
|
|
76
|
+
) => {
|
|
77
|
+
const result = status === 'matched' ? strings.matched : strings.notMatched;
|
|
78
|
+
// Figma gives the subtitle ONLY to the two liveness halves of each family;
|
|
79
|
+
// the plain `matched` / `notMatched` sections are title-only. Gated here (the
|
|
80
|
+
// same way Face Capture gates its attempts line on `exhausted`) so a host
|
|
81
|
+
// whose locale pack always carries the line still renders both designs.
|
|
82
|
+
const description = liveness ? strings.liveness.description : undefined;
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<PrizmaResultScreen
|
|
86
|
+
ref={ref}
|
|
87
|
+
status={status === 'matched' ? 'success' : 'error'}
|
|
88
|
+
title={result.title}
|
|
89
|
+
subtitle={description}
|
|
90
|
+
ctaLabel={result.ctaLabel}
|
|
91
|
+
verifiedLabel={strings.verifiedLabel}
|
|
92
|
+
navLabel={strings.navLabel}
|
|
93
|
+
screenId={screenId}
|
|
94
|
+
overrides={overrides}
|
|
95
|
+
onAction={onAction}
|
|
96
|
+
// Figma puts the verdict pill INSIDE the CTA band, Spacing/32 above the
|
|
97
|
+
// button — the band's own 16 plus the slot's 16 (FM-23).
|
|
98
|
+
bandContent={
|
|
99
|
+
liveness ? (
|
|
100
|
+
<PrizmaSnackbar
|
|
101
|
+
state={liveness === 'success' ? 'success' : 'error'}
|
|
102
|
+
contentResizing="hug"
|
|
103
|
+
>
|
|
104
|
+
{liveness === 'success'
|
|
105
|
+
? strings.liveness.successLabel
|
|
106
|
+
: strings.liveness.failedLabel}
|
|
107
|
+
</PrizmaSnackbar>
|
|
108
|
+
) : null
|
|
109
|
+
}
|
|
110
|
+
{...shell}
|
|
111
|
+
/>
|
|
112
|
+
);
|
|
113
|
+
},
|
|
114
|
+
);
|
|
115
|
+
FaceMatchResultScreen.displayName = 'FaceMatchResultScreen';
|
|
116
|
+
|
|
117
|
+
export default FaceMatchResultScreen;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Face Match module — copy contract.
|
|
2
|
+
//
|
|
3
|
+
// Every Face Match screen receives the SAME `strings: FaceMatchStrings` object
|
|
4
|
+
// (rule: all copy via props, no hardcoded English — GUIDELINES.md §9). The
|
|
5
|
+
// object is the module's locale pack: one instance drives the whole flow, which
|
|
6
|
+
// is what the FlowPlayer steps through. Sample copy lives only in previews /
|
|
7
|
+
// host apps.
|
|
8
|
+
//
|
|
9
|
+
// Authoritative screen list: the PURPLE parent sections of the Face Match Figma
|
|
10
|
+
// file (BXeJ6Q3TXahJVWEt8QoMVA, page 18:19332) — four sections, 12 variants:
|
|
11
|
+
// faceMatch.comparison initialState · matching · nfc ·
|
|
12
|
+
// firstAndSecondID · threeFacesMatching
|
|
13
|
+
// faceMatch.comparisonCompact matching
|
|
14
|
+
// faceMatch.error notMatched · livenessSuccess · livenessFailed
|
|
15
|
+
// faceMatch.success matched · livenessSuccess · livenessFailed
|
|
16
|
+
//
|
|
17
|
+
// Face Match ships NO tutorial and NO capture stage of its own: the selfie and
|
|
18
|
+
// the document images arrive from the modules upstream (Face Capture / ID
|
|
19
|
+
// Capture / NFC). That is why no Face Capture screen is reused here — see
|
|
20
|
+
// DEVIATIONS.md #FM-24.
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Which purple `faceMatch.comparison.*` photo set to render.
|
|
24
|
+
* - `selfieId` — 2 photos: the selfie and the ID portrait.
|
|
25
|
+
* - `nfc` — 3 photos: the chip portrait + the ID portrait on the
|
|
26
|
+
* top row, the selfie below.
|
|
27
|
+
* - `firstAndSecondID` — 3 photos: two ID portraits on the top row, the selfie
|
|
28
|
+
* below. Same layout as `nfc`; only the labels differ.
|
|
29
|
+
*/
|
|
30
|
+
export type FaceMatchComparisonVariant = 'selfieId' | 'nfc' | 'firstAndSecondID';
|
|
31
|
+
|
|
32
|
+
/** The two result families: `faceMatch.success.*` and `faceMatch.error.*`. */
|
|
33
|
+
export type FaceMatchResultStatus = 'matched' | 'notMatched';
|
|
34
|
+
|
|
35
|
+
/** The `*.livenessSuccess` / `*.livenessFailed` halves of both result families. */
|
|
36
|
+
export type FaceMatchLivenessVerdict = 'success' | 'failed';
|
|
37
|
+
|
|
38
|
+
/** Title + CTA of one result family. Both families share the SAME layout, so
|
|
39
|
+
* they are variants of one screen (FaceMatchResultScreen), not two screens. */
|
|
40
|
+
export interface FaceMatchResultStrings {
|
|
41
|
+
/** H2 status line ("Matched!" / "Faces do not match"). */
|
|
42
|
+
title: string;
|
|
43
|
+
/** CTA label ("Continue"). */
|
|
44
|
+
ctaLabel: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface FaceMatchStrings {
|
|
48
|
+
/** Accessible name for the logo nav region (i18n — no baked-in English). */
|
|
49
|
+
navLabel?: string;
|
|
50
|
+
/** "verified by" attribution copy for the footer tag. */
|
|
51
|
+
verifiedLabel: string;
|
|
52
|
+
|
|
53
|
+
/** faceMatch.comparison.* — one H2 for all five sections, plus the tooltip
|
|
54
|
+
* labels the variants swap above each photo. */
|
|
55
|
+
comparison: {
|
|
56
|
+
/** H2 ("Verifying identity") — identical across the five sections. */
|
|
57
|
+
title: string;
|
|
58
|
+
/** Label above the captured selfie. Used by every variant. */
|
|
59
|
+
selfieLabel: string;
|
|
60
|
+
/** Label above the ID portrait (`selfieId` and `nfc`). */
|
|
61
|
+
idLabel: string;
|
|
62
|
+
/** `nfc` only — the portrait read off the document chip. */
|
|
63
|
+
nfcLabel?: string;
|
|
64
|
+
/** `firstAndSecondID` only — first document. */
|
|
65
|
+
firstIdLabel?: string;
|
|
66
|
+
/** `firstAndSecondID` only — second document. */
|
|
67
|
+
secondIdLabel?: string;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/** faceMatch.comparisonCompact.matching — the photo-less matching state. */
|
|
71
|
+
comparisonCompact: {
|
|
72
|
+
/** H2 ("Checking your photos"). */
|
|
73
|
+
title: string;
|
|
74
|
+
/** H5 below it ("This may take a few seconds"). */
|
|
75
|
+
description?: string;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** faceMatch.success.* */
|
|
79
|
+
matched: FaceMatchResultStrings;
|
|
80
|
+
/** faceMatch.error.* */
|
|
81
|
+
notMatched: FaceMatchResultStrings;
|
|
82
|
+
|
|
83
|
+
/** The liveness verdict slice — the `*.livenessSuccess` / `*.livenessFailed`
|
|
84
|
+
* variants of BOTH result families. Figma gives those (and only those) a
|
|
85
|
+
* subtitle and a verdict Snackbar above the CTA, which is why the subtitle
|
|
86
|
+
* belongs to this slice rather than to `matched` / `notMatched`. */
|
|
87
|
+
liveness: {
|
|
88
|
+
/** H5 below the result title ("User already exists"). */
|
|
89
|
+
description?: string;
|
|
90
|
+
/** Snackbar copy on `*.livenessSuccess` ("Liveness success"). */
|
|
91
|
+
successLabel: string;
|
|
92
|
+
/** Snackbar copy on `*.livenessFailed` ("Liveness failed"). */
|
|
93
|
+
failedLabel: string;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* FormScreen — Archetype E field stack (GUIDELINES.md §6-E).
|
|
2
|
+
*
|
|
3
|
+
* Title block → field stack is Spacing/32, measured off Phone Input's purple
|
|
4
|
+
* sections (the `middle container` of every `phoneNumber.verify.*` /
|
|
5
|
+
* `phoneNumber.OTP.*` frame draws a flat 32 between the Title and
|
|
6
|
+
* `Input / Combined`). The archetype shipped Spacing/24 from the Studio-era
|
|
7
|
+
* guidelines before any module consumed it; Phone Input is the first real
|
|
8
|
+
* consumer, so the value is corrected here — in the ONE place it exists —
|
|
9
|
+
* rather than overridden per module. DEVIATIONS #PI-2.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* The two offsets are token-driven custom properties so a module whose purple
|
|
13
|
+
* section draws a different rhythm can SELECT another step of the spacing scale
|
|
14
|
+
* instead of re-declaring a value in its own stylesheet (the forbidden
|
|
15
|
+
* per-module override). The fallbacks are the measured Phone Input values, so
|
|
16
|
+
* every existing Form consumer is byte-identical.
|
|
17
|
+
*
|
|
18
|
+
* Data Sharing Consent is the first module to move them: `User Consent`
|
|
19
|
+
* (27151:321) draws a flat Spacing/24 down the whole middle column — title
|
|
20
|
+
* 0→28, disclosure at y=52 (24 below), disclosure ends 304, first consent card
|
|
21
|
+
* at 328 (24) — and the tall variant (29645:5306) repeats 24 between every
|
|
22
|
+
* card (459 → 557 → 655, each 74 tall). DEVIATIONS #DSC-1. */
|
|
23
|
+
.prizma-form-screen__fields {
|
|
24
|
+
flex: 1;
|
|
25
|
+
min-height: 0;
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
gap: var(--pfs-fields-gap, var(--prizma-spacing-16));
|
|
29
|
+
padding-top: var(--pfs-fields-offset, var(--prizma-spacing-32));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* ── Scrolling field stack ───────────────────────────────────────────────────
|
|
33
|
+
* Screens are authored at 390×844 and never reflow (DEVIATIONS #17), but some
|
|
34
|
+
* Form sections draw a middle column taller than the frame and let it pan:
|
|
35
|
+
* CURP's six labelled fields, Data Sharing Consent's disclosure + N consent
|
|
36
|
+
* cards, and the long-form / signature / eKYB sections. Without an overflow
|
|
37
|
+
* behaviour the surplus is silently clipped by `ScreenShell`'s
|
|
38
|
+
* `overflow: hidden` and paints over the sibling CTA on the way out.
|
|
39
|
+
*
|
|
40
|
+
* Five modules hand-rolled this rule in their own stylesheets; it belongs here
|
|
41
|
+
* once, driven by `scrollFields` on `PrizmaFormScreen`.
|
|
42
|
+
*
|
|
43
|
+
* The `margin-bottom` is the frame's own breathing room, and it is what makes
|
|
44
|
+
* the cut read as a cut: `29645:5306` clips the column at y=698 and starts the
|
|
45
|
+
* CTA band there with 16px of internal padding, so the sliced consent card is
|
|
46
|
+
* followed by clear surface before the button rather than the button appearing
|
|
47
|
+
* painted on the card's cut edge. It is a MARGIN, not padding — padding-bottom
|
|
48
|
+
* sits inside a scroll container's padding box and never moves the clip edge. */
|
|
49
|
+
.prizma-form-screen__fields--scroll {
|
|
50
|
+
overflow-y: auto;
|
|
51
|
+
margin-bottom: var(--prizma-spacing-16);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Rows in a scrolling stack keep their intrinsic height. A flex item defaults to
|
|
55
|
+
* `flex-shrink: 1`, so once the stack overflows the column SQUASHES every child
|
|
56
|
+
* that has no explicit floor — Qualified Signature's document row collapsed from
|
|
57
|
+
* 74px to 18px and, because `PrizmaCardDocumentContainer` is `overflow: hidden`,
|
|
58
|
+
* its 56px View button was clipped away entirely (owner-reported 2026-08-19).
|
|
59
|
+
* The identical row rendered correctly on the non-scrolling screens, which is
|
|
60
|
+
* what made it look like a Card bug rather than a layout one.
|
|
61
|
+
*
|
|
62
|
+
* Fixed here, for every child, rather than in Core: the flaw is the scroll
|
|
63
|
+
* container's, and it applies to any row a module puts in one (cards, fields,
|
|
64
|
+
* consent rows) — not just this component. DEVIATIONS #QS-1. */
|
|
65
|
+
.prizma-form-screen__fields--scroll > * {
|
|
66
|
+
flex-shrink: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* CTA column: primary, then the optional tertiary link below it. Core's
|
|
70
|
+
* `PrizmaButtonGroup` owns this primary → tertiary rhythm at Spacing/12, so the
|
|
71
|
+
* same value is used here rather than a new one (the archetype composes two
|
|
72
|
+
* Buttons directly because the group cannot forward `loadingLabel` — the open
|
|
73
|
+
* Core request logged in DEVIATIONS #F-32). */
|
|
74
|
+
.prizma-form-screen__cta {
|
|
75
|
+
display: flex;
|
|
76
|
+
flex-direction: column;
|
|
77
|
+
gap: var(--prizma-spacing-12);
|
|
78
|
+
}
|