@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.
Files changed (497) hide show
  1. package/README.md +74 -0
  2. package/dist/CaptureOverlay.css +55 -0
  3. package/dist/CaptureOverlay.d.ts +34 -0
  4. package/dist/CaptureOverlay.js +32 -0
  5. package/dist/CaptureScreen.d.ts +51 -0
  6. package/dist/CaptureScreen.js +30 -0
  7. package/dist/CurpConfirmScreen.d.ts +33 -0
  8. package/dist/CurpConfirmScreen.js +29 -0
  9. package/dist/CurpEnterScreen.d.ts +51 -0
  10. package/dist/CurpEnterScreen.js +77 -0
  11. package/dist/CurpGenerateScreen.d.ts +47 -0
  12. package/dist/CurpGenerateScreen.js +57 -0
  13. package/dist/CurpLayout.css +92 -0
  14. package/dist/CurpProcessingScreen.d.ts +32 -0
  15. package/dist/CurpProcessingScreen.js +29 -0
  16. package/dist/CurpResultScreen.d.ts +37 -0
  17. package/dist/CurpResultScreen.js +36 -0
  18. package/dist/CurpStrings.d.ts +170 -0
  19. package/dist/CurpStrings.js +16 -0
  20. package/dist/DataSharingConsentConsentScreen.d.ts +73 -0
  21. package/dist/DataSharingConsentConsentScreen.js +120 -0
  22. package/dist/DataSharingConsentLayout.css +78 -0
  23. package/dist/DataSharingConsentStrings.d.ts +96 -0
  24. package/dist/DataSharingConsentStrings.js +38 -0
  25. package/dist/DemoScreensEndScreen.d.ts +33 -0
  26. package/dist/DemoScreensEndScreen.js +27 -0
  27. package/dist/DemoScreensStrings.d.ts +11 -0
  28. package/dist/DemoScreensStrings.js +19 -0
  29. package/dist/DocumentCaptureCaptureScreen.d.ts +53 -0
  30. package/dist/DocumentCaptureCaptureScreen.js +51 -0
  31. package/dist/DocumentCaptureCommonIssuesScreen.d.ts +32 -0
  32. package/dist/DocumentCaptureCommonIssuesScreen.js +45 -0
  33. package/dist/DocumentCaptureConfirmImageScreen.d.ts +38 -0
  34. package/dist/DocumentCaptureConfirmImageScreen.js +34 -0
  35. package/dist/DocumentCaptureConfirmUploadScreen.d.ts +43 -0
  36. package/dist/DocumentCaptureConfirmUploadScreen.js +29 -0
  37. package/dist/DocumentCaptureGenericErrorScreen.d.ts +36 -0
  38. package/dist/DocumentCaptureGenericErrorScreen.js +30 -0
  39. package/dist/DocumentCaptureIllustration.d.ts +45 -0
  40. package/dist/DocumentCaptureIllustration.js +7 -0
  41. package/dist/DocumentCaptureLayout.css +226 -0
  42. package/dist/DocumentCaptureMethodSelectionScreen.d.ts +45 -0
  43. package/dist/DocumentCaptureMethodSelectionScreen.js +70 -0
  44. package/dist/DocumentCaptureNextPageScreen.d.ts +33 -0
  45. package/dist/DocumentCaptureNextPageScreen.js +28 -0
  46. package/dist/DocumentCaptureNoConnectionScreen.d.ts +28 -0
  47. package/dist/DocumentCaptureNoConnectionScreen.js +29 -0
  48. package/dist/DocumentCaptureStrings.d.ts +158 -0
  49. package/dist/DocumentCaptureStrings.js +21 -0
  50. package/dist/DocumentCaptureTutorialScreen.d.ts +36 -0
  51. package/dist/DocumentCaptureTutorialScreen.js +27 -0
  52. package/dist/EkybAddressDetailsScreen.d.ts +61 -0
  53. package/dist/EkybAddressDetailsScreen.js +63 -0
  54. package/dist/EkybBusinessDetailsScreen.d.ts +55 -0
  55. package/dist/EkybBusinessDetailsScreen.js +57 -0
  56. package/dist/EkybCountryScreen.d.ts +52 -0
  57. package/dist/EkybCountryScreen.js +58 -0
  58. package/dist/EkybErrorScreen.d.ts +30 -0
  59. package/dist/EkybErrorScreen.js +24 -0
  60. package/dist/EkybOwnersScreen.d.ts +73 -0
  61. package/dist/EkybOwnersScreen.js +87 -0
  62. package/dist/EkybProcessingScreen.d.ts +28 -0
  63. package/dist/EkybProcessingScreen.js +22 -0
  64. package/dist/EkybStrings.d.ts +200 -0
  65. package/dist/EkybStrings.js +27 -0
  66. package/dist/EkybSuccessScreen.d.ts +28 -0
  67. package/dist/EkybSuccessScreen.js +22 -0
  68. package/dist/EkycDetailsScreen.d.ts +65 -0
  69. package/dist/EkycDetailsScreen.js +81 -0
  70. package/dist/EkycErrorScreen.d.ts +32 -0
  71. package/dist/EkycErrorScreen.js +26 -0
  72. package/dist/EkycLayout.css +39 -0
  73. package/dist/EkycLicenseScreen.d.ts +21 -0
  74. package/dist/EkycLicenseScreen.js +68 -0
  75. package/dist/EkycProcessingScreen.d.ts +26 -0
  76. package/dist/EkycProcessingScreen.js +20 -0
  77. package/dist/EkycStrings.d.ts +112 -0
  78. package/dist/EkycStrings.js +34 -0
  79. package/dist/EkycSuccessScreen.d.ts +29 -0
  80. package/dist/EkycSuccessScreen.js +23 -0
  81. package/dist/ElectronicSignatureDrawScreen.d.ts +57 -0
  82. package/dist/ElectronicSignatureDrawScreen.js +53 -0
  83. package/dist/ElectronicSignatureErrorScreen.d.ts +31 -0
  84. package/dist/ElectronicSignatureErrorScreen.js +25 -0
  85. package/dist/ElectronicSignatureLayout.css +80 -0
  86. package/dist/ElectronicSignatureReviewScreen.d.ts +51 -0
  87. package/dist/ElectronicSignatureReviewScreen.js +36 -0
  88. package/dist/ElectronicSignatureStrings.d.ts +50 -0
  89. package/dist/ElectronicSignatureStrings.js +12 -0
  90. package/dist/ElectronicSignatureSuccessScreen.d.ts +30 -0
  91. package/dist/ElectronicSignatureSuccessScreen.js +24 -0
  92. package/dist/EmailInputErrorScreen.d.ts +34 -0
  93. package/dist/EmailInputErrorScreen.js +28 -0
  94. package/dist/EmailInputOtpScreen.d.ts +56 -0
  95. package/dist/EmailInputOtpScreen.js +82 -0
  96. package/dist/EmailInputProcessingScreen.d.ts +29 -0
  97. package/dist/EmailInputProcessingScreen.js +23 -0
  98. package/dist/EmailInputStrings.d.ts +130 -0
  99. package/dist/EmailInputStrings.js +19 -0
  100. package/dist/EmailInputSuccessScreen.d.ts +37 -0
  101. package/dist/EmailInputSuccessScreen.js +31 -0
  102. package/dist/EmailInputVerifyScreen.d.ts +46 -0
  103. package/dist/EmailInputVerifyScreen.js +55 -0
  104. package/dist/ErrorScreensScreen.d.ts +62 -0
  105. package/dist/ErrorScreensScreen.js +71 -0
  106. package/dist/ErrorScreensStrings.d.ts +31 -0
  107. package/dist/ErrorScreensStrings.js +28 -0
  108. package/dist/FaceCaptureCapturingScreen.d.ts +32 -0
  109. package/dist/FaceCaptureCapturingScreen.js +53 -0
  110. package/dist/FaceCaptureLayout.css +18 -0
  111. package/dist/FaceCaptureLoadingScreen.d.ts +32 -0
  112. package/dist/FaceCaptureLoadingScreen.js +30 -0
  113. package/dist/FaceCaptureManualCaptureScreen.d.ts +32 -0
  114. package/dist/FaceCaptureManualCaptureScreen.js +27 -0
  115. package/dist/FaceCaptureNoConnectionScreen.d.ts +30 -0
  116. package/dist/FaceCaptureNoConnectionScreen.js +31 -0
  117. package/dist/FaceCaptureResultErrorScreen.d.ts +40 -0
  118. package/dist/FaceCaptureResultErrorScreen.js +32 -0
  119. package/dist/FaceCaptureResultSuccessScreen.d.ts +25 -0
  120. package/dist/FaceCaptureResultSuccessScreen.js +27 -0
  121. package/dist/FaceCaptureStrings.d.ts +62 -0
  122. package/dist/FaceCaptureStrings.js +14 -0
  123. package/dist/FaceCaptureTutorialScreen.d.ts +29 -0
  124. package/dist/FaceCaptureTutorialScreen.js +20 -0
  125. package/dist/FaceMatchComparisonCompactScreen.d.ts +26 -0
  126. package/dist/FaceMatchComparisonCompactScreen.js +24 -0
  127. package/dist/FaceMatchComparisonScreen.d.ts +80 -0
  128. package/dist/FaceMatchComparisonScreen.js +81 -0
  129. package/dist/FaceMatchLayout.css +264 -0
  130. package/dist/FaceMatchResultScreen.d.ts +50 -0
  131. package/dist/FaceMatchResultScreen.js +52 -0
  132. package/dist/FaceMatchStrings.d.ts +66 -0
  133. package/dist/FaceMatchStrings.js +21 -0
  134. package/dist/FormScreen.css +78 -0
  135. package/dist/FormScreen.d.ts +101 -0
  136. package/dist/FormScreen.js +36 -0
  137. package/dist/FormsChoiceScreen.d.ts +66 -0
  138. package/dist/FormsChoiceScreen.js +63 -0
  139. package/dist/FormsErrorScreen.d.ts +28 -0
  140. package/dist/FormsErrorScreen.js +22 -0
  141. package/dist/FormsFieldScreen.d.ts +66 -0
  142. package/dist/FormsFieldScreen.js +85 -0
  143. package/dist/FormsLayout.css +45 -0
  144. package/dist/FormsLongFormScreen.d.ts +70 -0
  145. package/dist/FormsLongFormScreen.js +149 -0
  146. package/dist/FormsStrings.d.ts +181 -0
  147. package/dist/FormsStrings.js +36 -0
  148. package/dist/FormsSuccessScreen.d.ts +32 -0
  149. package/dist/FormsSuccessScreen.js +26 -0
  150. package/dist/GeolocationBrowserStepsScreen.d.ts +56 -0
  151. package/dist/GeolocationBrowserStepsScreen.js +95 -0
  152. package/dist/GeolocationErrorScreen.d.ts +43 -0
  153. package/dist/GeolocationErrorScreen.js +56 -0
  154. package/dist/GeolocationIntroScreen.d.ts +49 -0
  155. package/dist/GeolocationIntroScreen.js +38 -0
  156. package/dist/GeolocationPermissionScreen.d.ts +38 -0
  157. package/dist/GeolocationPermissionScreen.js +30 -0
  158. package/dist/GeolocationStrings.d.ts +157 -0
  159. package/dist/GeolocationStrings.js +28 -0
  160. package/dist/IdCaptureAgeVerificationScreen.d.ts +25 -0
  161. package/dist/IdCaptureAgeVerificationScreen.js +38 -0
  162. package/dist/IdCaptureAnalyzingScreen.d.ts +41 -0
  163. package/dist/IdCaptureAnalyzingScreen.js +30 -0
  164. package/dist/IdCaptureCommonIssuesScreen.d.ts +31 -0
  165. package/dist/IdCaptureCommonIssuesScreen.js +49 -0
  166. package/dist/IdCaptureDocumentErrorScreen.d.ts +37 -0
  167. package/dist/IdCaptureDocumentErrorScreen.js +30 -0
  168. package/dist/IdCaptureDocumentSelectionScreen.d.ts +41 -0
  169. package/dist/IdCaptureDocumentSelectionScreen.js +49 -0
  170. package/dist/IdCaptureFlipScreen.d.ts +31 -0
  171. package/dist/IdCaptureFlipScreen.js +26 -0
  172. package/dist/IdCaptureHoldOnScreen.d.ts +28 -0
  173. package/dist/IdCaptureHoldOnScreen.js +22 -0
  174. package/dist/IdCaptureLayout.css +111 -0
  175. package/dist/IdCaptureNoConnectionScreen.d.ts +28 -0
  176. package/dist/IdCaptureNoConnectionScreen.js +29 -0
  177. package/dist/IdCapturePermissionScreen.d.ts +34 -0
  178. package/dist/IdCapturePermissionScreen.js +45 -0
  179. package/dist/IdCaptureResultScreen.d.ts +59 -0
  180. package/dist/IdCaptureResultScreen.js +89 -0
  181. package/dist/IdCaptureStageScreen.d.ts +69 -0
  182. package/dist/IdCaptureStageScreen.js +88 -0
  183. package/dist/IdCaptureStrings.d.ts +199 -0
  184. package/dist/IdCaptureStrings.js +15 -0
  185. package/dist/IdCaptureTutorialScreen.d.ts +36 -0
  186. package/dist/IdCaptureTutorialScreen.js +30 -0
  187. package/dist/ListScreen.d.ts +95 -0
  188. package/dist/ListScreen.js +46 -0
  189. package/dist/LoaderScreen.d.ts +32 -0
  190. package/dist/LoaderScreen.js +27 -0
  191. package/dist/LoadersStrings.d.ts +20 -0
  192. package/dist/LoadersStrings.js +16 -0
  193. package/dist/NfcCommonIssuesScreen.d.ts +35 -0
  194. package/dist/NfcCommonIssuesScreen.js +48 -0
  195. package/dist/NfcErrorScreen.d.ts +41 -0
  196. package/dist/NfcErrorScreen.js +27 -0
  197. package/dist/NfcLayout.css +36 -0
  198. package/dist/NfcProcessingScreen.d.ts +28 -0
  199. package/dist/NfcProcessingScreen.js +22 -0
  200. package/dist/NfcScanningScreen.d.ts +66 -0
  201. package/dist/NfcScanningScreen.js +61 -0
  202. package/dist/NfcSettingsScreen.d.ts +53 -0
  203. package/dist/NfcSettingsScreen.js +57 -0
  204. package/dist/NfcStrings.d.ts +112 -0
  205. package/dist/NfcStrings.js +7 -0
  206. package/dist/NfcSuccessScreen.d.ts +28 -0
  207. package/dist/NfcSuccessScreen.js +22 -0
  208. package/dist/NfcSymbolScreen.d.ts +39 -0
  209. package/dist/NfcSymbolScreen.js +32 -0
  210. package/dist/NfcTryAgainScreen.d.ts +53 -0
  211. package/dist/NfcTryAgainScreen.js +45 -0
  212. package/dist/NfcTutorialScreen.d.ts +33 -0
  213. package/dist/NfcTutorialScreen.js +24 -0
  214. package/dist/PermissionsAllowScreen.d.ts +44 -0
  215. package/dist/PermissionsAllowScreen.js +38 -0
  216. package/dist/PermissionsBrowserStepsScreen.d.ts +42 -0
  217. package/dist/PermissionsBrowserStepsScreen.js +86 -0
  218. package/dist/PermissionsRequiredScreen.d.ts +37 -0
  219. package/dist/PermissionsRequiredScreen.js +51 -0
  220. package/dist/PermissionsStrings.d.ts +70 -0
  221. package/dist/PermissionsStrings.js +36 -0
  222. package/dist/PhoneInputErrorScreen.d.ts +37 -0
  223. package/dist/PhoneInputErrorScreen.js +47 -0
  224. package/dist/PhoneInputLayout.css +61 -0
  225. package/dist/PhoneInputOtpScreen.d.ts +37 -0
  226. package/dist/PhoneInputOtpScreen.js +44 -0
  227. package/dist/PhoneInputSnaLoadingScreen.d.ts +23 -0
  228. package/dist/PhoneInputSnaLoadingScreen.js +17 -0
  229. package/dist/PhoneInputStrings.d.ts +121 -0
  230. package/dist/PhoneInputStrings.js +13 -0
  231. package/dist/PhoneInputSuccessScreen.d.ts +23 -0
  232. package/dist/PhoneInputSuccessScreen.js +17 -0
  233. package/dist/PhoneInputVerifyScreen.d.ts +41 -0
  234. package/dist/PhoneInputVerifyScreen.js +71 -0
  235. package/dist/ProcessingScreen.d.ts +42 -0
  236. package/dist/ProcessingScreen.js +21 -0
  237. package/dist/QualifiedSignatureAcceptScreen.d.ts +71 -0
  238. package/dist/QualifiedSignatureAcceptScreen.js +86 -0
  239. package/dist/QualifiedSignatureDocumentScreen.d.ts +62 -0
  240. package/dist/QualifiedSignatureDocumentScreen.js +56 -0
  241. package/dist/QualifiedSignatureLayout.css +206 -0
  242. package/dist/QualifiedSignatureProcessingScreen.d.ts +46 -0
  243. package/dist/QualifiedSignatureProcessingScreen.js +48 -0
  244. package/dist/QualifiedSignatureResultScreen.d.ts +65 -0
  245. package/dist/QualifiedSignatureResultScreen.js +76 -0
  246. package/dist/QualifiedSignatureReviewScreen.d.ts +49 -0
  247. package/dist/QualifiedSignatureReviewScreen.js +40 -0
  248. package/dist/QualifiedSignatureStrings.d.ts +222 -0
  249. package/dist/QualifiedSignatureStrings.js +25 -0
  250. package/dist/QualifiedSignatureUploadScreen.d.ts +42 -0
  251. package/dist/QualifiedSignatureUploadScreen.js +35 -0
  252. package/dist/ResultScreen.d.ts +93 -0
  253. package/dist/ResultScreen.js +37 -0
  254. package/dist/ReviewScreen.d.ts +81 -0
  255. package/dist/ReviewScreen.js +56 -0
  256. package/dist/ScreenLayout.css +469 -0
  257. package/dist/ScreenNav.css +43 -0
  258. package/dist/ScreenNav.d.ts +26 -0
  259. package/dist/ScreenNav.js +13 -0
  260. package/dist/ScreenShell.css +130 -0
  261. package/dist/ScreenShell.d.ts +45 -0
  262. package/dist/ScreenShell.js +22 -0
  263. package/dist/TutorialScreen.d.ts +70 -0
  264. package/dist/TutorialScreen.js +24 -0
  265. package/dist/VideoSelfieCameraStepsScreen.d.ts +47 -0
  266. package/dist/VideoSelfieCameraStepsScreen.js +56 -0
  267. package/dist/VideoSelfieErrorScreen.d.ts +63 -0
  268. package/dist/VideoSelfieErrorScreen.js +94 -0
  269. package/dist/VideoSelfieFlipCameraScreen.d.ts +34 -0
  270. package/dist/VideoSelfieFlipCameraScreen.js +38 -0
  271. package/dist/VideoSelfieFlipIdScreen.d.ts +34 -0
  272. package/dist/VideoSelfieFlipIdScreen.js +29 -0
  273. package/dist/VideoSelfieIdCaptureScreen.d.ts +75 -0
  274. package/dist/VideoSelfieIdCaptureScreen.js +86 -0
  275. package/dist/VideoSelfieLayout.css +259 -0
  276. package/dist/VideoSelfiePermissionRequiredScreen.d.ts +35 -0
  277. package/dist/VideoSelfiePermissionRequiredScreen.js +45 -0
  278. package/dist/VideoSelfiePermissionScreen.d.ts +51 -0
  279. package/dist/VideoSelfiePermissionScreen.js +44 -0
  280. package/dist/VideoSelfieProcessingScreen.d.ts +28 -0
  281. package/dist/VideoSelfieProcessingScreen.js +22 -0
  282. package/dist/VideoSelfieRetryScreen.d.ts +31 -0
  283. package/dist/VideoSelfieRetryScreen.js +32 -0
  284. package/dist/VideoSelfieSelfieCaptureScreen.d.ts +52 -0
  285. package/dist/VideoSelfieSelfieCaptureScreen.js +58 -0
  286. package/dist/VideoSelfieSpeakScreen.d.ts +64 -0
  287. package/dist/VideoSelfieSpeakScreen.js +95 -0
  288. package/dist/VideoSelfieStrings.d.ts +196 -0
  289. package/dist/VideoSelfieStrings.js +14 -0
  290. package/dist/VideoSelfieSuccessScreen.d.ts +25 -0
  291. package/dist/VideoSelfieSuccessScreen.js +19 -0
  292. package/dist/VideoSelfieTutorialScreen.d.ts +33 -0
  293. package/dist/VideoSelfieTutorialScreen.js +41 -0
  294. package/dist/ViewfinderScreen.css +107 -0
  295. package/dist/ViewfinderScreen.d.ts +40 -0
  296. package/dist/ViewfinderScreen.js +26 -0
  297. package/dist/WatchlistBusinessFormScreen.d.ts +61 -0
  298. package/dist/WatchlistBusinessFormScreen.js +85 -0
  299. package/dist/WatchlistBusinessProcessingScreen.d.ts +25 -0
  300. package/dist/WatchlistBusinessProcessingScreen.js +19 -0
  301. package/dist/WatchlistBusinessStrings.d.ts +95 -0
  302. package/dist/WatchlistBusinessStrings.js +19 -0
  303. package/dist/WatchlistBusinessSuccessScreen.d.ts +29 -0
  304. package/dist/WatchlistBusinessSuccessScreen.js +23 -0
  305. package/dist/flows.d.ts +216 -0
  306. package/dist/flows.js +516 -0
  307. package/dist/index.d.ts +145 -0
  308. package/dist/index.js +130 -0
  309. package/dist/styles.css +33 -0
  310. package/dist/types.d.ts +56 -0
  311. package/dist/types.js +8 -0
  312. package/package.json +689 -0
  313. package/samples/camera-surface.png +0 -0
  314. package/samples/document-still.png +0 -0
  315. package/samples/document-thumbnail.png +0 -0
  316. package/samples/face-match-bottom.png +0 -0
  317. package/samples/face-match-left.png +0 -0
  318. package/samples/face-match-right.png +0 -0
  319. package/samples/id-back-blur.png +0 -0
  320. package/samples/id-back-dark.png +0 -0
  321. package/samples/id-back-glare.png +0 -0
  322. package/samples/id-back.png +0 -0
  323. package/samples/id-front-blur.png +0 -0
  324. package/samples/id-front-dark.png +0 -0
  325. package/samples/id-front-glare.png +0 -0
  326. package/samples/id-front.png +0 -0
  327. package/samples/id-passport.png +0 -0
  328. package/samples/selfie-glasses.png +0 -0
  329. package/samples/selfie-hat.png +0 -0
  330. package/samples/selfie-mask.png +0 -0
  331. package/samples/selfie.png +0 -0
  332. package/samples/video-selfie-camera.png +0 -0
  333. package/src/CaptureOverlay.css +55 -0
  334. package/src/CaptureOverlay.tsx +56 -0
  335. package/src/CaptureScreen.tsx +121 -0
  336. package/src/CurpConfirmScreen.tsx +75 -0
  337. package/src/CurpEnterScreen.tsx +149 -0
  338. package/src/CurpGenerateScreen.tsx +172 -0
  339. package/src/CurpLayout.css +92 -0
  340. package/src/CurpProcessingScreen.tsx +75 -0
  341. package/src/CurpResultScreen.tsx +80 -0
  342. package/src/CurpStrings.ts +178 -0
  343. package/src/DataSharingConsentConsentScreen.tsx +223 -0
  344. package/src/DataSharingConsentLayout.css +78 -0
  345. package/src/DataSharingConsentStrings.ts +144 -0
  346. package/src/DemoScreensEndScreen.tsx +56 -0
  347. package/src/DemoScreensStrings.ts +31 -0
  348. package/src/DocumentCaptureCaptureScreen.tsx +135 -0
  349. package/src/DocumentCaptureCommonIssuesScreen.tsx +97 -0
  350. package/src/DocumentCaptureConfirmImageScreen.tsx +112 -0
  351. package/src/DocumentCaptureConfirmUploadScreen.tsx +113 -0
  352. package/src/DocumentCaptureGenericErrorScreen.tsx +82 -0
  353. package/src/DocumentCaptureIllustration.tsx +153 -0
  354. package/src/DocumentCaptureLayout.css +226 -0
  355. package/src/DocumentCaptureMethodSelectionScreen.tsx +151 -0
  356. package/src/DocumentCaptureNextPageScreen.tsx +82 -0
  357. package/src/DocumentCaptureNoConnectionScreen.tsx +77 -0
  358. package/src/DocumentCaptureStrings.ts +192 -0
  359. package/src/DocumentCaptureTutorialScreen.tsx +79 -0
  360. package/src/EkybAddressDetailsScreen.tsx +200 -0
  361. package/src/EkybBusinessDetailsScreen.tsx +147 -0
  362. package/src/EkybCountryScreen.tsx +124 -0
  363. package/src/EkybErrorScreen.tsx +61 -0
  364. package/src/EkybOwnersScreen.tsx +230 -0
  365. package/src/EkybProcessingScreen.tsx +57 -0
  366. package/src/EkybStrings.ts +239 -0
  367. package/src/EkybSuccessScreen.tsx +54 -0
  368. package/src/EkycDetailsScreen.tsx +178 -0
  369. package/src/EkycErrorScreen.tsx +64 -0
  370. package/src/EkycLayout.css +39 -0
  371. package/src/EkycLicenseScreen.tsx +164 -0
  372. package/src/EkycProcessingScreen.tsx +60 -0
  373. package/src/EkycStrings.ts +157 -0
  374. package/src/EkycSuccessScreen.tsx +63 -0
  375. package/src/ElectronicSignatureDrawScreen.tsx +127 -0
  376. package/src/ElectronicSignatureErrorScreen.tsx +74 -0
  377. package/src/ElectronicSignatureLayout.css +80 -0
  378. package/src/ElectronicSignatureReviewScreen.tsx +106 -0
  379. package/src/ElectronicSignatureStrings.ts +67 -0
  380. package/src/ElectronicSignatureSuccessScreen.tsx +67 -0
  381. package/src/EmailInputErrorScreen.tsx +67 -0
  382. package/src/EmailInputOtpScreen.tsx +169 -0
  383. package/src/EmailInputProcessingScreen.tsx +67 -0
  384. package/src/EmailInputStrings.ts +166 -0
  385. package/src/EmailInputSuccessScreen.tsx +72 -0
  386. package/src/EmailInputVerifyScreen.tsx +117 -0
  387. package/src/ErrorScreensScreen.tsx +149 -0
  388. package/src/ErrorScreensStrings.ts +66 -0
  389. package/src/FaceCaptureCapturingScreen.tsx +99 -0
  390. package/src/FaceCaptureLayout.css +18 -0
  391. package/src/FaceCaptureLoadingScreen.tsx +65 -0
  392. package/src/FaceCaptureManualCaptureScreen.tsx +94 -0
  393. package/src/FaceCaptureNoConnectionScreen.tsx +73 -0
  394. package/src/FaceCaptureResultErrorScreen.tsx +86 -0
  395. package/src/FaceCaptureResultSuccessScreen.tsx +49 -0
  396. package/src/FaceCaptureStrings.ts +92 -0
  397. package/src/FaceCaptureTutorialScreen.tsx +77 -0
  398. package/src/FaceMatchComparisonCompactScreen.tsx +51 -0
  399. package/src/FaceMatchComparisonScreen.tsx +201 -0
  400. package/src/FaceMatchLayout.css +264 -0
  401. package/src/FaceMatchResultScreen.tsx +117 -0
  402. package/src/FaceMatchStrings.ts +95 -0
  403. package/src/FormScreen.css +78 -0
  404. package/src/FormScreen.tsx +213 -0
  405. package/src/FormsChoiceScreen.tsx +150 -0
  406. package/src/FormsErrorScreen.tsx +61 -0
  407. package/src/FormsFieldScreen.tsx +198 -0
  408. package/src/FormsLayout.css +45 -0
  409. package/src/FormsLongFormScreen.tsx +295 -0
  410. package/src/FormsStrings.ts +243 -0
  411. package/src/FormsSuccessScreen.tsx +67 -0
  412. package/src/GeolocationBrowserStepsScreen.tsx +173 -0
  413. package/src/GeolocationErrorScreen.tsx +113 -0
  414. package/src/GeolocationIntroScreen.tsx +100 -0
  415. package/src/GeolocationPermissionScreen.tsx +88 -0
  416. package/src/GeolocationStrings.ts +193 -0
  417. package/src/IdCaptureAgeVerificationScreen.tsx +84 -0
  418. package/src/IdCaptureAnalyzingScreen.tsx +94 -0
  419. package/src/IdCaptureCommonIssuesScreen.tsx +109 -0
  420. package/src/IdCaptureDocumentErrorScreen.tsx +92 -0
  421. package/src/IdCaptureDocumentSelectionScreen.tsx +100 -0
  422. package/src/IdCaptureFlipScreen.tsx +66 -0
  423. package/src/IdCaptureHoldOnScreen.tsx +51 -0
  424. package/src/IdCaptureLayout.css +111 -0
  425. package/src/IdCaptureNoConnectionScreen.tsx +68 -0
  426. package/src/IdCapturePermissionScreen.tsx +102 -0
  427. package/src/IdCaptureResultScreen.tsx +197 -0
  428. package/src/IdCaptureStageScreen.tsx +241 -0
  429. package/src/IdCaptureStrings.ts +228 -0
  430. package/src/IdCaptureTutorialScreen.tsx +99 -0
  431. package/src/ListScreen.tsx +213 -0
  432. package/src/LoaderScreen.tsx +69 -0
  433. package/src/LoadersStrings.ts +38 -0
  434. package/src/NfcCommonIssuesScreen.tsx +104 -0
  435. package/src/NfcErrorScreen.tsx +83 -0
  436. package/src/NfcLayout.css +36 -0
  437. package/src/NfcProcessingScreen.tsx +57 -0
  438. package/src/NfcScanningScreen.tsx +127 -0
  439. package/src/NfcSettingsScreen.tsx +124 -0
  440. package/src/NfcStrings.ts +127 -0
  441. package/src/NfcSuccessScreen.tsx +56 -0
  442. package/src/NfcSymbolScreen.tsx +85 -0
  443. package/src/NfcTryAgainScreen.tsx +114 -0
  444. package/src/NfcTutorialScreen.tsx +76 -0
  445. package/src/PermissionsAllowScreen.tsx +90 -0
  446. package/src/PermissionsBrowserStepsScreen.tsx +158 -0
  447. package/src/PermissionsRequiredScreen.tsx +118 -0
  448. package/src/PermissionsStrings.ts +129 -0
  449. package/src/PhoneInputErrorScreen.tsx +104 -0
  450. package/src/PhoneInputLayout.css +61 -0
  451. package/src/PhoneInputOtpScreen.tsx +126 -0
  452. package/src/PhoneInputSnaLoadingScreen.tsx +61 -0
  453. package/src/PhoneInputStrings.ts +136 -0
  454. package/src/PhoneInputSuccessScreen.tsx +56 -0
  455. package/src/PhoneInputVerifyScreen.tsx +153 -0
  456. package/src/ProcessingScreen.tsx +97 -0
  457. package/src/QualifiedSignatureAcceptScreen.tsx +198 -0
  458. package/src/QualifiedSignatureDocumentScreen.tsx +124 -0
  459. package/src/QualifiedSignatureLayout.css +206 -0
  460. package/src/QualifiedSignatureProcessingScreen.tsx +112 -0
  461. package/src/QualifiedSignatureResultScreen.tsx +146 -0
  462. package/src/QualifiedSignatureReviewScreen.tsx +113 -0
  463. package/src/QualifiedSignatureStrings.ts +256 -0
  464. package/src/QualifiedSignatureUploadScreen.tsx +81 -0
  465. package/src/ResultScreen.tsx +211 -0
  466. package/src/ReviewScreen.tsx +196 -0
  467. package/src/ScreenLayout.css +469 -0
  468. package/src/ScreenNav.css +43 -0
  469. package/src/ScreenNav.tsx +46 -0
  470. package/src/ScreenShell.css +130 -0
  471. package/src/ScreenShell.tsx +66 -0
  472. package/src/TutorialScreen.tsx +166 -0
  473. package/src/VideoSelfieCameraStepsScreen.tsx +145 -0
  474. package/src/VideoSelfieErrorScreen.tsx +168 -0
  475. package/src/VideoSelfieFlipCameraScreen.tsx +88 -0
  476. package/src/VideoSelfieFlipIdScreen.tsx +74 -0
  477. package/src/VideoSelfieIdCaptureScreen.tsx +213 -0
  478. package/src/VideoSelfieLayout.css +259 -0
  479. package/src/VideoSelfiePermissionRequiredScreen.tsx +104 -0
  480. package/src/VideoSelfiePermissionScreen.tsx +102 -0
  481. package/src/VideoSelfieProcessingScreen.tsx +68 -0
  482. package/src/VideoSelfieRetryScreen.tsx +92 -0
  483. package/src/VideoSelfieSelfieCaptureScreen.tsx +122 -0
  484. package/src/VideoSelfieSpeakScreen.tsx +237 -0
  485. package/src/VideoSelfieStrings.ts +222 -0
  486. package/src/VideoSelfieSuccessScreen.tsx +64 -0
  487. package/src/VideoSelfieTutorialScreen.tsx +129 -0
  488. package/src/ViewfinderScreen.css +107 -0
  489. package/src/ViewfinderScreen.tsx +113 -0
  490. package/src/WatchlistBusinessFormScreen.tsx +176 -0
  491. package/src/WatchlistBusinessProcessingScreen.tsx +63 -0
  492. package/src/WatchlistBusinessStrings.ts +121 -0
  493. package/src/WatchlistBusinessSuccessScreen.tsx +67 -0
  494. package/src/flows.ts +711 -0
  495. package/src/index.ts +591 -0
  496. package/src/styles.css +33 -0
  497. package/src/types.ts +69 -0
@@ -0,0 +1,130 @@
1
+ /* ScreenShell — root of every SDK screen.
2
+ *
3
+ * Tokens only (no :root block here — the consumer imports
4
+ * @incodetech/prizma-core-tokens/css once). Design reference 390×844; the
5
+ * shell fills whatever box the host gives it and exposes a size container so
6
+ * descendants scale with `cqw` capped at reference pixels.
7
+ */
8
+
9
+ .prizma-screen-shell {
10
+ display: flex;
11
+ flex-direction: column;
12
+ position: relative;
13
+ width: 100%;
14
+ height: 100%;
15
+ overflow: hidden;
16
+ background: var(--prizma-surface-neutral-0);
17
+ font-family: var(--prizma-body-family);
18
+ color: var(--prizma-text-body-800-primary);
19
+ container-type: size;
20
+ container-name: pcs-screen;
21
+ /* The shell must be the containing block for `position: fixed` descendants —
22
+ * Core's PrizmaNavigation pins itself to the viewport (correct on a real
23
+ * device, wrong inside an embedded screen frame) — and must clip descendant
24
+ * painting (the CaptureOverlay scrim is a 2000px box-shadow). `contain:
25
+ * layout paint` does both without forcing a composited layer the way
26
+ * `transform` would. */
27
+ contain: layout paint;
28
+ }
29
+
30
+ /* Camera viewfinder screens — always a dark stage regardless of theme.
31
+ * The camera surface itself is supplied by the screen (image or live feed). */
32
+ .prizma-screen-shell--dark {
33
+ background: var(--prizma-surface-neutral-900-static);
34
+ color: var(--prizma-text-body-0-static);
35
+ }
36
+
37
+ /* -------------------------------------------------------------------------
38
+ A theme PIN is a MODE pin, not a BRAND reset.
39
+
40
+ The finding (Core Lab explorations canvas, 2026-08-31). Two cards, same
41
+ `themeSeed` #7C3AED: `face-capture-tutorial` went fully purple, but on
42
+ `face-capture-capturing-alignFace` the footer tag — the brand badge and the
43
+ Incode wordmark — stayed #0054FF. Nothing in Tag or Logo is hardcoded: Tag
44
+ binds Icon/Brand/500 Static, Logo binds Surface/Brand/500, and both DID
45
+ re-skin on the tutorial. What differs is the pin.
46
+
47
+ A scoped brand (Core Lab's per-card seed, and equally a host that scopes
48
+ `applyPrizmaTheme`'s output to a subtree instead of `:root`) is delivered as
49
+ inherited CSS custom properties on an ANCESTOR. `theme` above stamps
50
+ `data-prizma-theme` on THIS element — and `@incodetech/prizma-core-tokens/
51
+ themes/light.css` is the FULL token set, not a delta the way themes/dark.css
52
+ is, because it has to be able to out-cascade an ancestor's dark. So the pin
53
+ re-declared all 48 brand-derived vars on the exact element the seed was
54
+ inheriting through, and everything below it fell back to canonical blue.
55
+ Only the tag showed it on that screen because PrizmaSelfieCapture paints no
56
+ brand ink at all — on a pinned screen carrying a Button the CTA was blue too.
57
+
58
+ The fix: hand the brand back to the scope above, for the light pin only
59
+ (dark.css is a delta and never touches these). Custom properties accept the
60
+ CSS-wide keywords, so `inherit` reaches past the pin's own declaration, and
61
+ `.prizma-screen-shell[data-prizma-theme='light']` (0,2,0) outranks the
62
+ sheet's `[data-prizma-theme='light']` (0,1,0) regardless of import order.
63
+
64
+ ONLY the tokens whose derived value is IDENTICAL in the light and dark maps
65
+ are listed (core/theming/derive.mjs — the `*Static` family plus
66
+ textAccentBrand / borderBrand500 / iconBrand500Static, and the component
67
+ tokens that are pure aliases of those). That is what makes `inherit` safe:
68
+ the ancestor carries whichever map its own mode resolved in, and for these
69
+ the two maps agree, so a purple card inside a DARK board still lands the
70
+ right purple on a light-pinned stage. Without a seed above, they inherit the
71
+ canonical value and this block is a no-op.
72
+
73
+ ⚠️ Known gap, deliberately left: the mode-DEPENDENT brand tokens
74
+ (surfaceBrand50, textAccentOnBrand, textLink*, borderBrandOnNeutral,
75
+ iconBrandOnNeutral, and their aliases — halos, snackbar neutral, links) keep
76
+ the pin's canonical value. They are AA-gated against the mode's background
77
+ or flip ramp stop, so inheriting a dark-derived value onto a light-pinned
78
+ stage would either invert them or silently drop Core's contrast guarantee.
79
+ Fixing those properly needs the scope above to publish BOTH maps; that is a
80
+ theming-contract change, not a stylesheet one.
81
+
82
+ ⚠️ PARITY: this is the WEB half only. Android and iOS ship the same pinned-
83
+ light capture screens and the same scoped-theme story, so the same bug is
84
+ very likely there under whatever their pin mechanism is. Flagged for those
85
+ owners — not touched here (core/ is source of truth for three platforms and
86
+ the ports are Cami's lane).
87
+ ------------------------------------------------------------------------- */
88
+ .prizma-screen-shell[data-prizma-theme='light'] {
89
+ /* Semantics whose light and dark stops are the same colour. */
90
+ --prizma-surface-brand-400-static: inherit;
91
+ --prizma-surface-brand-500-static: inherit;
92
+ --prizma-surface-brand-600-static: inherit;
93
+ --prizma-surface-brand-700-static: inherit;
94
+ --prizma-text-accent-brand: inherit;
95
+ --prizma-border-brand-500: inherit;
96
+ --prizma-icon-brand-500-static: inherit;
97
+
98
+ /* Component tokens that are pure aliases of the seven above
99
+ (COMPONENT_ALIASES in core/theming/derive.mjs). */
100
+ --prizma-button-primary-border-default: inherit;
101
+ --prizma-button-primary-border-hover: inherit;
102
+ --prizma-button-primary-border-pressed: inherit;
103
+ --prizma-button-primary-surface-default: inherit;
104
+ --prizma-button-primary-surface-hover: inherit;
105
+ --prizma-button-primary-surface-pressed: inherit;
106
+ --prizma-button-secondary-border-default: inherit;
107
+ --prizma-button-secondary-border-hover: inherit;
108
+ --prizma-button-secondary-border-pressed: inherit;
109
+ --prizma-button-secondary-text-default: inherit;
110
+ --prizma-button-secondary-text-hover: inherit;
111
+ --prizma-button-secondary-text-pressed: inherit;
112
+ --prizma-button-tertiary-text-default: inherit;
113
+ --prizma-button-spinner-secondary-arc: inherit;
114
+ --prizma-checkbox-surface-selected: inherit;
115
+ --prizma-radio-button-surface-selected: inherit;
116
+ --prizma-toggle-switch-surface-primary-on: inherit;
117
+ --prizma-illustration-surface-accent: inherit;
118
+ --prizma-illustration-ring-start: inherit;
119
+
120
+ /* Mode-flipping in the canonical map, but a LIGHT pin means the LIGHT stop —
121
+ which for each of these IS ramp 500, i.e. the Static sibling re-inherited
122
+ just above. Reading it back through var() is what keeps the Logo wordmark
123
+ the seed's brand instead of the dark map's #ffffff-on-white.
124
+ surfaceBrand500 light 500 / dark #ffffff (Logo, Stepper past-active)
125
+ surfaceBrandIndicator light 500 / dark 400 (+ its two aliases) */
126
+ --prizma-surface-brand-500: var(--prizma-surface-brand-500-static);
127
+ --prizma-surface-brand-indicator: var(--prizma-surface-brand-500-static);
128
+ --prizma-spinner-surface-primary: var(--prizma-surface-brand-500-static);
129
+ --prizma-loading-bar-fill-in-flight: var(--prizma-surface-brand-500-static);
130
+ }
@@ -0,0 +1,66 @@
1
+ import React, { forwardRef, type ComponentPropsWithoutRef } from 'react';
2
+ import './ScreenShell.css';
3
+
4
+ export interface PrizmaScreenShellProps extends ComponentPropsWithoutRef<'div'> {
5
+ /** Camera-viewfinder screens render a full-bleed dark stage instead of the
6
+ * neutral surface. Default `false`. Implies `theme="dark"`. */
7
+ dark?: boolean;
8
+ /**
9
+ * PIN the token theme for this screen's subtree, regardless of the app's
10
+ * theme. Stamps `data-prizma-theme`, which the generated theme sheets select
11
+ * on ANY element (`[data-prizma-theme='dark']`, not `:root[...]`), so the pin
12
+ * scopes cleanly to one screen.
13
+ *
14
+ * Why screens need this: Core's capture components paint every ink with
15
+ * **Static** tokens because "the capture screen stays WHITE in both modes —
16
+ * light is needed for the shot" (owner decision 2026-07-14, documented in
17
+ * `SelfieCapture.css`). If the surrounding shell were allowed to flip, the
18
+ * app's dark mode would put a light-oriented stage — dark shutter, secondary
19
+ * feedback text — on a black background. Camera viewfinders are the mirror
20
+ * case: their inks are white-on-dark Static, so they pin dark.
21
+ *
22
+ * Leave undefined on ordinary screens: they should follow the app.
23
+ *
24
+ * ⚠️ A pin is a MODE pin, not a BRAND reset — and it used to be both, because
25
+ * `themes/light.css` is the full token set. A host that scopes a brand to a
26
+ * subtree (Core Lab's per-card `themeSeed`; equally `applyPrizmaTheme`'s
27
+ * output scoped to something narrower than `:root`) saw its brand die on
28
+ * every pinned screen: the "verified by incode" tag stayed Incode blue on the
29
+ * face-capture capturing screen while the unpinned tutorial beside it went
30
+ * fully purple. `ScreenShell.css` hands the brand back — read the block at
31
+ * the bottom of that file before changing this prop, including the known gap
32
+ * and the Android / iOS parity flag.
33
+ */
34
+ theme?: 'light' | 'dark';
35
+ }
36
+
37
+ /**
38
+ * ScreenShell — the root wrapper of every SDK screen.
39
+ *
40
+ * Responsive contract: the 390×844 Figma frame is the DESIGN REFERENCE, not a
41
+ * hardcoded size. The shell fills its container (host owns the outer size /
42
+ * aspect) and declares itself a CSS container (`pcs-screen`), so descendant
43
+ * geometry scales in `cqw` units capped at the reference pixel value —
44
+ * see GUIDELINES.md §1 and the archetype CSS.
45
+ */
46
+ export const PrizmaScreenShell = forwardRef<HTMLDivElement, PrizmaScreenShellProps>(
47
+ ({ dark = false, theme, className, children, ...rest }, ref) => (
48
+ <div
49
+ ref={ref}
50
+ data-prizma-theme={theme ?? (dark ? 'dark' : undefined)}
51
+ className={[
52
+ 'prizma-screen-shell',
53
+ dark ? 'prizma-screen-shell--dark' : '',
54
+ className ?? '',
55
+ ]
56
+ .filter(Boolean)
57
+ .join(' ')}
58
+ {...rest}
59
+ >
60
+ {children}
61
+ </div>
62
+ ),
63
+ );
64
+ PrizmaScreenShell.displayName = 'PrizmaScreenShell';
65
+
66
+ export default PrizmaScreenShell;
@@ -0,0 +1,166 @@
1
+ import React, { forwardRef, type ReactNode } from 'react';
2
+ import { PrizmaTitle } from '@incodetech/prizma-core-web/title';
3
+ import { PrizmaDisclaimer } from '@incodetech/prizma-core-web/disclaimer';
4
+ import { PrizmaButton } from '@incodetech/prizma-core-web/button';
5
+ import { PrizmaTag } from '@incodetech/prizma-core-web/tag';
6
+ import { PrizmaScreenShell, type PrizmaScreenShellProps } from './ScreenShell';
7
+ import { PrizmaScreenNav } from './ScreenNav';
8
+ import type {
9
+ PrizmaScreenActionHandler,
10
+ PrizmaScreenChromeProps,
11
+ PrizmaScreenOverrides,
12
+ } from './types';
13
+ import './ScreenLayout.css';
14
+
15
+ export interface PrizmaTutorialScreenProps
16
+ extends Omit<PrizmaScreenShellProps, 'dark' | 'title'> ,
17
+ PrizmaScreenChromeProps {
18
+ /**
19
+ * An optional block between the logo nav and the content — a journey stepper.
20
+ * Video Selfie draws Core's `PrizmaStepper` on EVERY screen of the flow, not
21
+ * just its camera stages, and it is the only chrome that tells the steps
22
+ * apart; the archetypes had a slot on E alone, so the rest of the module shed
23
+ * it (owner-reported 2026-08-19). Takes a `ReactNode` so the module supplies
24
+ * Core's own component — no primitive invented, and both offsets live once in
25
+ * `ScreenLayout.css` (`.prizma-screen-layout__progress`). Omit it and nothing
26
+ * renders, so every existing consumer is byte-identical. DEVIATIONS #VS-4.
27
+ */
28
+ progress?: ReactNode;
29
+ /** Screen title (H2). */
30
+ title: string;
31
+ /** Description below the title (H5). */
32
+ subtitle?: string;
33
+ /** Hint copy 28px above the CTA ("Stay still…"). */
34
+ disclaimer?: string;
35
+ /** Primary CTA label. Optional: some tutorial-shaped screens (Face Match's
36
+ * comparison views) carry no CTA at all. */
37
+ ctaLabel?: string;
38
+ /** The primary CTA shows Core's designed loading treatment — the `*.loading`
39
+ * half of Face Capture's and ID Capture's tutorial sections. */
40
+ ctaLoading?: boolean;
41
+ /** Accessible/visible loading copy for the primary CTA (`PrizmaButton`'s own
42
+ * `loadingLabel`; no hardcoded English anywhere). */
43
+ ctaLoadingLabel?: string;
44
+ /** Secondary CTA rendered ABOVE the primary — a second filled action. */
45
+ secondaryCtaLabel?: string;
46
+ /**
47
+ * Tertiary underlined LINK below the primary — Document Capture's "Skip this
48
+ * step" (tutorial / method selection) and "All pages captured" (next page).
49
+ * A link, not a button: Figma draws Core's `tertiary-link` composite there.
50
+ */
51
+ linkLabel?: string;
52
+ /** "verified by" attribution copy for the footer tag. */
53
+ verifiedLabel: string;
54
+ /** Centerpiece illustration (inline SVG component / Core Illustration*). */
55
+ illustration?: ReactNode;
56
+ /**
57
+ * A shell-level layer painted OVER the whole screen — Document Capture's
58
+ * method-selection sheet (scrim + `PrizmaBottomSheetContent`), which Figma
59
+ * presents on top of the dimmed tutorial. It cannot ride in the content
60
+ * column: it is absolutely positioned against the shell (DEVIATIONS #DC-30).
61
+ */
62
+ overlay?: ReactNode;
63
+ /** Accessible name for the nav region. */
64
+ navLabel?: string;
65
+ /** Stable id reported in actions, e.g. `face-capture-tutorial`. */
66
+ screenId?: string;
67
+ overrides?: PrizmaScreenOverrides;
68
+ onAction?: PrizmaScreenActionHandler;
69
+ }
70
+
71
+ /**
72
+ * Archetype A — Tutorial / Instruction (GUIDELINES.md §6-A).
73
+ * Nav → title block → illustration (flex-1) → disclaimer → CTA → verified tag.
74
+ *
75
+ * CTA band order is the family's designed one: disclaimer → secondary → primary
76
+ * → tertiary link (the link sits BELOW the primary on every tutorial-shaped
77
+ * section — Document Capture's "Skip this step" / "All pages captured"). The
78
+ * stack is the foundation's flat Spacing/16 (DEVIATIONS #8); Core's own
79
+ * `PrizmaButtonGroup` would put 12 between the slots but cannot forward
80
+ * `loadingLabel`, which the loading tutorials need — DEVIATIONS #F-32.
81
+ */
82
+ export const PrizmaTutorialScreen = forwardRef<HTMLDivElement, PrizmaTutorialScreenProps>(
83
+ (
84
+ {
85
+ progress,
86
+ title,
87
+ subtitle,
88
+ disclaimer,
89
+ ctaLabel,
90
+ ctaLoading = false,
91
+ ctaLoadingLabel,
92
+ secondaryCtaLabel,
93
+ linkLabel,
94
+ verifiedLabel,
95
+ illustration,
96
+ overlay,
97
+ navLabel,
98
+ screenId,
99
+ showHeader = true,
100
+ showFooter = true,
101
+ overrides,
102
+ onAction,
103
+ ...shell
104
+ },
105
+ ref,
106
+ ) => (
107
+ <PrizmaScreenShell ref={ref} {...shell}>
108
+ <PrizmaScreenNav reserved={!showHeader} logo={overrides?.logo} navLabel={navLabel} />
109
+ {progress ? (
110
+ <div className="prizma-screen-layout__progress">{progress}</div>
111
+ ) : null}
112
+ <div className="prizma-screen-layout__content">
113
+ <PrizmaTitle
114
+ variant={overrides?.align === 'left' ? 'left' : 'centered'}
115
+ title={title}
116
+ showSubtitle={Boolean(subtitle)}
117
+ subtitle={subtitle}
118
+ />
119
+ <div className="prizma-screen-layout__flex">{illustration}</div>
120
+ {/* CTA band — Core's flat Spacing/16 recipe; the disclaimer's own
121
+ padding supplies the designed 28px text→CTA gap (DEVIATIONS #8). */}
122
+ <div className="prizma-screen-layout__band">
123
+ {disclaimer ? <PrizmaDisclaimer text={disclaimer} /> : null}
124
+ {secondaryCtaLabel ? (
125
+ <PrizmaButton
126
+ variant="secondary"
127
+ size="L"
128
+ onClick={() => onAction?.({ type: 'secondary', screenId })}
129
+ >
130
+ {secondaryCtaLabel}
131
+ </PrizmaButton>
132
+ ) : null}
133
+ {ctaLabel ? (
134
+ <PrizmaButton
135
+ variant="primary"
136
+ size="L"
137
+ loading={ctaLoading}
138
+ loadingLabel={ctaLoadingLabel}
139
+ onClick={() => onAction?.({ type: 'cta', screenId })}
140
+ >
141
+ {ctaLabel}
142
+ </PrizmaButton>
143
+ ) : null}
144
+ {linkLabel ? (
145
+ <PrizmaButton
146
+ variant="tertiary-link"
147
+ size="L"
148
+ onClick={() => onAction?.({ type: 'secondary', screenId })}
149
+ >
150
+ {linkLabel}
151
+ </PrizmaButton>
152
+ ) : null}
153
+ {showFooter ? (
154
+ <div className="prizma-screen-layout__band__tag">
155
+ <PrizmaTag label={verifiedLabel} />
156
+ </div>
157
+ ) : null}
158
+ </div>
159
+ </div>
160
+ {overlay}
161
+ </PrizmaScreenShell>
162
+ ),
163
+ );
164
+ PrizmaTutorialScreen.displayName = 'PrizmaTutorialScreen';
165
+
166
+ export default PrizmaTutorialScreen;
@@ -0,0 +1,145 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { PrizmaListItem } from '@incodetech/prizma-core-web/list';
3
+ import { PrizmaListScreen, type PrizmaListScreenProps } from './ListScreen';
4
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
5
+ import type { VideoSelfieStepsOs, VideoSelfieStrings } from './VideoSelfieStrings';
6
+ import './ScreenLayout.css';
7
+ import './VideoSelfieLayout.css';
8
+
9
+ export interface VideoSelfieCameraStepsScreenProps
10
+ extends Omit<
11
+ PrizmaListScreenProps,
12
+ | 'status'
13
+ | 'title'
14
+ | 'subtitle'
15
+ | 'children'
16
+ | 'ctaLabel'
17
+ | 'secondaryCtaLabel'
18
+ | 'linkLabel'
19
+ | 'verifiedLabel'
20
+ | 'navLabel'
21
+ > {
22
+ /** Module copy — this screen reads the `permission.steps` slice. */
23
+ strings: VideoSelfieStrings;
24
+ /** Which device variant of the section to render: `2.5 - ios` (default) or
25
+ * `2.6 - android`. They are different screens, not translations. */
26
+ os?: VideoSelfieStepsOs;
27
+ screenId?: string;
28
+ overrides?: PrizmaScreenOverrides;
29
+ onAction?: PrizmaScreenActionHandler;
30
+ }
31
+
32
+ /**
33
+ * Video Selfie — the OS settings walk-through, built on the List archetype
34
+ * (GUIDELINES.md §6-G). Figma: purple section `video selfie - permissions
35
+ * 2.5 - camera access instructions`, which holds TWO Incode-drawn symbols:
36
+ * `2.5 - ios camera access instructions` and
37
+ * `2.6 - android camera access instructions`. Both are built here, selected by
38
+ * `os` — unlike `2.1` and `2.4` of the same group, which are OS chrome and are
39
+ * deliberately not built.
40
+ *
41
+ * Same family as `GeolocationBrowserStepsScreen`: a title block over a step
42
+ * list and a "Retry" CTA, LEFT-aligned throughout — a centred headline above a
43
+ * left-led numbered list reads as a mistake. The screen only picks which of the
44
+ * archetype's OWN alignment variants this family uses; a host that passes
45
+ * `overrides.align` still wins.
46
+ *
47
+ * What Figma draws that no single Core list models: TWO labelled sections in
48
+ * the middle. On iOS the second is a plain remark with no steps at all; on
49
+ * Android it is a SECOND five-step numbered list followed by a closing note
50
+ * ("Remember, the specific steps might vary…"). Both numbered lists are Core's
51
+ * Core `PrizmaListItem` (`number`) rows verbatim; the section labels and the two
52
+ * kinds of note are plain content typography in `VideoSelfieLayout.css`. The
53
+ * offset above the whole block is the archetype's `__list` Spacing/24 —
54
+ * nothing about it is re-declared.
55
+ *
56
+ * Neither device frame draws the verified tag (both end at the CTA), so
57
+ * `showFooter` defaults to `true` (owner rule #PI-8/#F-34 — the chrome is
58
+ * constant), as on the other two permission
59
+ * sections.
60
+ */
61
+ export const VideoSelfieCameraStepsScreen = forwardRef<
62
+ HTMLDivElement,
63
+ VideoSelfieCameraStepsScreenProps
64
+ >(
65
+ (
66
+ {
67
+ strings,
68
+ os = 'ios',
69
+ screenId = `video-selfie-permission-steps-${os}`,
70
+ showHeader = true,
71
+ showFooter = true,
72
+ overrides,
73
+ onAction,
74
+ ...shell
75
+ },
76
+ ref,
77
+ ) => {
78
+ const slice = strings.permission.steps[os];
79
+ /* Family default, not a local re-declaration: the archetype already owns a
80
+ left variant, so the screen only picks which of ITS variants applies. */
81
+ const alignedOverrides: PrizmaScreenOverrides = {
82
+ ...overrides,
83
+ align: overrides?.align ?? 'left',
84
+ };
85
+
86
+ return (
87
+ <PrizmaListScreen
88
+ /* Two five-step lists + a closing note exceed the 844 frame — Figma's
89
+ own frame is 1041 tall. Pan the middle instead of overlapping the
90
+ CTA and the tag (#VS-12). */
91
+ scrollList
92
+ ref={ref}
93
+ showHeader={showHeader}
94
+ showFooter={showFooter}
95
+ title={slice.title}
96
+ subtitle={slice.subtitle}
97
+ ctaLabel={slice.ctaLabel}
98
+ verifiedLabel={strings.verifiedLabel}
99
+ navLabel={strings.navLabel}
100
+ screenId={screenId}
101
+ overrides={alignedOverrides}
102
+ onAction={onAction}
103
+ {...shell}
104
+ >
105
+ <div className="video-selfie-steps">
106
+ {/* Core's `number` item is the 40×40 SQUIRCLE Figma draws (List.css:
107
+ "40×40 squircle with stroke 2 INSIDE"). `PrizmaList variant="circles"`
108
+ maps to `number-circled`, a full round, and the wrapper offers no
109
+ variant reaching the squircle — so the rows are composed directly,
110
+ the way the tutorial composes `icon-m` (#VS-8). CORE REQUEST: a
111
+ `numbers` wrapper variant mapping to the plain `number` item.
112
+ DEVIATIONS #VS-16. */}
113
+ <h3 className="video-selfie-steps__heading">{slice.microphoneTitle}</h3>
114
+ <ol className="video-selfie-steps__rows">
115
+ {slice.microphoneSteps.map((step, i) => (
116
+ <li key={i}>
117
+ <PrizmaListItem variant="number" number={i + 1} label={step} />
118
+ </li>
119
+ ))}
120
+ </ol>
121
+ <h3 className="video-selfie-steps__heading">{slice.recordingTitle}</h3>
122
+ {/* Android (`2.6`) draws a second numbered list where iOS (`2.5`)
123
+ draws a one-line remark — the states must not render alike. */}
124
+ {slice.recordingSteps ? (
125
+ <ol className="video-selfie-steps__rows">
126
+ {slice.recordingSteps.map((step, i) => (
127
+ <li key={i}>
128
+ <PrizmaListItem variant="number" number={i + 1} label={step} />
129
+ </li>
130
+ ))}
131
+ </ol>
132
+ ) : slice.recordingNote ? (
133
+ <p className="video-selfie-steps__note">{slice.recordingNote}</p>
134
+ ) : null}
135
+ {slice.closingNote ? (
136
+ <p className="video-selfie-steps__note">{slice.closingNote}</p>
137
+ ) : null}
138
+ </div>
139
+ </PrizmaListScreen>
140
+ );
141
+ },
142
+ );
143
+ VideoSelfieCameraStepsScreen.displayName = 'VideoSelfieCameraStepsScreen';
144
+
145
+ export default VideoSelfieCameraStepsScreen;
@@ -0,0 +1,168 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { IconWifiOff } from '@incodetech/prizma-core-icons';
3
+ import { PrizmaResultScreen, type PrizmaResultScreenProps } from './ResultScreen';
4
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
5
+ import type { VideoSelfieStrings } from './VideoSelfieStrings';
6
+ import './ScreenLayout.css';
7
+
8
+ /** Which purple section of group 14 to render (the retry list is its own
9
+ * screen — it is a List, not a Result). */
10
+ export type VideoSelfieErrorVariant =
11
+ | 'processingFailed'
12
+ | 'stepError'
13
+ | 'moduleError'
14
+ | 'noConnection';
15
+
16
+ export interface VideoSelfieErrorScreenProps
17
+ extends Omit<
18
+ PrizmaResultScreenProps,
19
+ | 'status'
20
+ | 'title'
21
+ | 'subtitle'
22
+ | 'glyph'
23
+ | 'children'
24
+ | 'bandContent'
25
+ | 'ctaLabel'
26
+ | 'secondaryCtaLabel'
27
+ | 'verifiedLabel'
28
+ | 'navLabel'
29
+ > {
30
+ /** Module copy — this screen reads the `errors` slice. */
31
+ strings: VideoSelfieStrings;
32
+ /** Which purple section to render. Default `processingFailed`. */
33
+ variant?: VideoSelfieErrorVariant;
34
+ screenId?: string;
35
+ overrides?: PrizmaScreenOverrides;
36
+ onAction?: PrizmaScreenActionHandler;
37
+ }
38
+
39
+ /**
40
+ * Video Selfie — the generic errors, built on the Result archetype
41
+ * (GUIDELINES.md §6-F). Figma: purple sections `general errors 14.0 -
42
+ * processing failed`, `14.2 - step error`, `14.3 - module error` and
43
+ * `14.4 - no connection`.
44
+ *
45
+ * Four verdicts, one skeleton: a centred mark over the title, a Retry CTA, and
46
+ * — on the two that offer a way out — a "Quit process" link. Every state
47
+ * renders differently: `processingFailed` alone carries the supporting line,
48
+ * `stepError` is the only one drawn on the dark camera surface, `moduleError`
49
+ * adds the quit link, and `noConnection` swaps the status mark for the Wi-Fi
50
+ * glyph.
51
+ *
52
+ * **Chrome (owner rule, restated 2026-08-19).** All four keep the logo header
53
+ * and the verified tag even though Figma draws them bare — the same call
54
+ * `#PI-8` / `#F-34` made, so the module's connectivity and error screens read
55
+ * identically to every other module's and nothing shifts between states.
56
+ *
57
+ * **Theme.** `stepError` is the one section the camera is still open behind, and
58
+ * Figma draws it white-on-black; it pins `theme="dark"` through Core's own
59
+ * theme switch, so every token-bound child flips THROUGH the design system
60
+ * (DEVIATIONS #DC-32) rather than around it. `noConnection` deliberately does
61
+ * NOT pin: `#F-34`'s whole point is that a module's connectivity screen looks
62
+ * like every other module's.
63
+ *
64
+ * **Reported gap — CONFIRMED DEFECT, blocked on the archetype.** Archetype F
65
+ * has no tertiary-link slot: G has `linkLabel` and pins it above the pair, A and
66
+ * E pin theirs below, F has none. The quit link therefore rides in F's
67
+ * `bandContent` slot (Core's `tertiary-link` button, never a hand-rolled
68
+ * anchor), which `PrizmaResultScreen` renders ABOVE the CTA row — and `14.3` and
69
+ * `14.4` both draw "Retry" first with "Quit process" underlined BELOW it. QA
70
+ * re-confirmed the inversion against both frames on 2026-08-19.
71
+ *
72
+ * It is NOT worked around here. The fix is one slot in the archetype — F needs
73
+ * A's `linkLabel`, rendered AFTER the button stack (mirroring
74
+ * `TutorialScreen.tsx:129`), with `bandContent` left to its intended Snackbar
75
+ * use. `ResultScreen.*` is owned by the foundation, so this module reports it
76
+ * (`archetypeGaps`) instead of editing it (GUIDELINES rule 2). The moment the
77
+ * slot lands, both variants move to `linkLabel={copy.quitLabel}` and the
78
+ * `bandContent` block below is deleted.
79
+ *
80
+ * Figma also draws the journey stepper on `14.1`, `14.2` and `14.4`. Archetype
81
+ * F has no slot for it and this module does not hand-roll one — reported.
82
+ */
83
+ export const VideoSelfieErrorScreen = forwardRef<
84
+ HTMLDivElement,
85
+ VideoSelfieErrorScreenProps
86
+ >(
87
+ (
88
+ {
89
+ strings,
90
+ variant = 'processingFailed',
91
+ screenId = `video-selfie-error-${variant}`,
92
+ overrides,
93
+ onAction,
94
+ ...shell
95
+ },
96
+ ref,
97
+ ) => {
98
+ const slice = strings.errors;
99
+ const copy =
100
+ variant === 'processingFailed'
101
+ ? {
102
+ title: slice.processingFailed.title,
103
+ subtitle: slice.processingFailed.subtitle,
104
+ ctaLabel: slice.processingFailed.ctaLabel,
105
+ quitLabel: undefined as string | undefined,
106
+ }
107
+ : variant === 'stepError'
108
+ ? {
109
+ title: slice.stepError.title,
110
+ subtitle: undefined,
111
+ ctaLabel: slice.stepError.ctaLabel,
112
+ quitLabel: undefined as string | undefined,
113
+ }
114
+ : variant === 'moduleError'
115
+ ? {
116
+ title: slice.moduleError.title,
117
+ subtitle: undefined,
118
+ ctaLabel: slice.moduleError.ctaLabel,
119
+ quitLabel: slice.moduleError.quitLabel,
120
+ }
121
+ : {
122
+ title: slice.noConnection.title,
123
+ subtitle: undefined,
124
+ ctaLabel: slice.noConnection.ctaLabel,
125
+ quitLabel: slice.noConnection.quitLabel,
126
+ };
127
+
128
+ return (
129
+ <PrizmaResultScreen
130
+ ref={ref}
131
+ theme={variant === 'stepError' ? 'dark' : undefined}
132
+ status={variant === 'noConnection' ? 'none' : 'error'}
133
+ glyph={
134
+ variant === 'noConnection' ? (
135
+ <span
136
+ className={[
137
+ 'prizma-screen-layout__glyph',
138
+ 'prizma-screen-layout__glyph--negative',
139
+ overrides?.align === 'left' ? 'prizma-screen-layout__glyph--left' : '',
140
+ ]
141
+ .filter(Boolean)
142
+ .join(' ')}
143
+ >
144
+ <IconWifiOff size="l" />
145
+ </span>
146
+ ) : undefined
147
+ }
148
+ title={copy.title}
149
+ subtitle={copy.subtitle}
150
+ /* The archetype's own tertiary slot, which renders BELOW the button
151
+ stack — `14.3`/`14.4` draw "Retry" first with "Quit process"
152
+ underneath. This used to borrow `bandContent`, which paints ABOVE
153
+ the buttons and put the link on the wrong side (#VS-17). */
154
+ linkLabel={copy.quitLabel}
155
+ ctaLabel={copy.ctaLabel}
156
+ verifiedLabel={strings.verifiedLabel}
157
+ navLabel={strings.navLabel}
158
+ screenId={screenId}
159
+ overrides={overrides}
160
+ onAction={onAction}
161
+ {...shell}
162
+ />
163
+ );
164
+ },
165
+ );
166
+ VideoSelfieErrorScreen.displayName = 'VideoSelfieErrorScreen';
167
+
168
+ export default VideoSelfieErrorScreen;