@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,213 @@
1
+ import React, { forwardRef, type CSSProperties, type ReactNode } from 'react';
2
+ import { PrizmaTitle } from '@incodetech/prizma-core-web/title';
3
+ import { PrizmaButton } from '@incodetech/prizma-core-web/button';
4
+ import { PrizmaTag } from '@incodetech/prizma-core-web/tag';
5
+ import { PrizmaScreenShell, type PrizmaScreenShellProps } from './ScreenShell';
6
+ import { PrizmaScreenNav } from './ScreenNav';
7
+ import type {
8
+ PrizmaScreenActionHandler,
9
+ PrizmaScreenChromeProps,
10
+ PrizmaScreenOverrides,
11
+ } from './types';
12
+ import './ScreenLayout.css';
13
+ import './FormScreen.css';
14
+
15
+ /**
16
+ * A step of the Prizma spacing scale, named rather than valued. The archetype's
17
+ * two field-stack offsets are SELECTED from this scale by the module — it can
18
+ * never introduce a number of its own, so "no module re-declares spacing" still
19
+ * holds while a section that genuinely draws a different rhythm can be matched.
20
+ */
21
+ export type PrizmaFormFieldsSpacing = '4' | '8' | '12' | '16' | '20' | '24' | '32' | '40';
22
+
23
+ export interface PrizmaFormScreenProps
24
+ extends Omit<PrizmaScreenShellProps, 'dark' | 'title' | 'children'> ,
25
+ PrizmaScreenChromeProps {
26
+ /**
27
+ * An optional block between the logo nav and the title block — the archetype
28
+ * had no slot there at all. eKYC's Figma draws a two-segment Core
29
+ * `PrizmaStepper` across the full content width on all SIX of its form frames
30
+ * (page 1 blue + grey, page 2 pale + blue, page 2 loading both green), and it
31
+ * is the only chrome that tells the two pages apart. The slot takes a
32
+ * `ReactNode` so the module supplies Core's own component: the archetype
33
+ * invents no primitive and declares no spacing of its own — both offsets live
34
+ * once in `ScreenLayout.css` (`.prizma-screen-layout__progress`). Omit it and
35
+ * nothing renders, so every existing consumer is byte-identical.
36
+ * DEVIATIONS #EK-1.
37
+ */
38
+ progress?: ReactNode;
39
+ /** Screen title (H2). */
40
+ title: string;
41
+ /** Description below the title (H5). */
42
+ subtitle?: string;
43
+ /** CTA label. Omit for keyboard-driven states with no visible CTA. */
44
+ ctaLabel?: string;
45
+ /** Disable the CTA (empty/invalid form states). */
46
+ ctaDisabled?: boolean;
47
+ /**
48
+ * Request in flight: Core's `PrizmaButton` swaps the label for its designed
49
+ * spinner. Every form module draws this — Phone Input's `verify.loading` and
50
+ * `OTP.processing` both put the spinner IN THE CTA, not in the field — so the
51
+ * slot belongs to the archetype rather than to each module (#F-32 precedent,
52
+ * DEVIATIONS #PI-5).
53
+ */
54
+ ctaLoading?: boolean;
55
+ /** Accessible / visible loading copy. No hardcoded English default. */
56
+ ctaLoadingLabel?: string;
57
+ /**
58
+ * A single standalone link below the primary, rendered as Core's
59
+ * `tertiary-link` button (full width, the same idiom as archetype A).
60
+ * For a SENTENCE carrying links inline, use `linkContent` instead — an L
61
+ * button is `width: 100%; min-height: 56px` and cannot sit inside a line of
62
+ * body text.
63
+ */
64
+ linkLabel?: string;
65
+ /**
66
+ * A composed line below the primary: body copy with inline links, e.g. Phone
67
+ * Input's "Didn't receive the code? **Resend code** or **Change phone
68
+ * number**" — plain text plus TWO separately-actionable links. Core ships no
69
+ * inline-link primitive, so the foundation provides the recipe
70
+ * (`__inline-prompt` / `__inline-link` in ScreenLayout.css) and the module
71
+ * supplies the sentence. DEVIATIONS #PI-10.
72
+ */
73
+ linkContent?: ReactNode;
74
+ /** "verified by" attribution copy for the footer tag. */
75
+ verifiedLabel: string;
76
+ /** The field stack — Core inputs (PrizmaTextField, PrizmaOtp, PrizmaDropdown…). */
77
+ children?: ReactNode;
78
+ /**
79
+ * Title block → field stack offset. Defaults to Spacing/32, the value Phone
80
+ * Input's sections draw (DEVIATIONS #PI-2), so every existing consumer is
81
+ * untouched. Data Sharing Consent's `User Consent` sections draw Spacing/24
82
+ * (27151:321: title ends 28, the disclosure starts at 52) — DEVIATIONS #DSC-1.
83
+ */
84
+ fieldsOffset?: PrizmaFormFieldsSpacing;
85
+ /**
86
+ * Gap BETWEEN rows of the field stack. Defaults to Spacing/16. Data Sharing
87
+ * Consent draws Spacing/24 between the disclosure and the first consent card
88
+ * (304 → 328) and between every card (459 → 557 → 655, each 74 tall,
89
+ * 29645:5306) — DEVIATIONS #DSC-1.
90
+ */
91
+ fieldsGap?: PrizmaFormFieldsSpacing;
92
+ /**
93
+ * Let the field stack PAN inside the column when the section draws a middle
94
+ * taller than the 844 frame: the title, the CTA and the anchored tag hold
95
+ * still while the fields scroll, and the clipped content stops Spacing/16
96
+ * above the CTA rather than running under it. Five Wave-3 modules hand-rolled
97
+ * this in their own stylesheets (CURP #CURP-1, Forms, Qualified Signature,
98
+ * eKYB, Data Sharing Consent); it is the archetype's now. DEVIATIONS #DSC-2.
99
+ */
100
+ scrollFields?: boolean;
101
+ navLabel?: string;
102
+ screenId?: string;
103
+ overrides?: PrizmaScreenOverrides;
104
+ onAction?: PrizmaScreenActionHandler;
105
+ }
106
+
107
+ /**
108
+ * Archetype E — Form / Input (GUIDELINES.md §6-E).
109
+ * Nav → title block → field stack → CTA → verified tag. Module states
110
+ * (typing / filled / loading) are separate screens sharing this identical
111
+ * layout, changing only field content.
112
+ */
113
+ export const PrizmaFormScreen = forwardRef<HTMLDivElement, PrizmaFormScreenProps>(
114
+ (
115
+ {
116
+ progress,
117
+ title,
118
+ subtitle,
119
+ ctaLabel,
120
+ ctaDisabled,
121
+ ctaLoading = false,
122
+ ctaLoadingLabel,
123
+ linkLabel,
124
+ linkContent,
125
+ verifiedLabel,
126
+ children,
127
+ fieldsOffset,
128
+ fieldsGap,
129
+ scrollFields = false,
130
+ navLabel,
131
+ screenId,
132
+ showHeader = true,
133
+ showFooter = true,
134
+ overrides,
135
+ onAction,
136
+ ...shell
137
+ },
138
+ ref,
139
+ ) => (
140
+ <PrizmaScreenShell ref={ref} {...shell}>
141
+ <PrizmaScreenNav reserved={!showHeader} logo={overrides?.logo} navLabel={navLabel} />
142
+ <div className="prizma-screen-layout__content">
143
+ {progress ? (
144
+ <div className="prizma-screen-layout__progress">{progress}</div>
145
+ ) : null}
146
+ <PrizmaTitle
147
+ variant={overrides?.align === 'left' ? 'left' : 'centered'}
148
+ title={title}
149
+ showSubtitle={Boolean(subtitle)}
150
+ subtitle={subtitle}
151
+ />
152
+ <div
153
+ className={[
154
+ 'prizma-form-screen__fields',
155
+ scrollFields ? 'prizma-form-screen__fields--scroll' : null,
156
+ ]
157
+ .filter(Boolean)
158
+ .join(' ')}
159
+ /* Custom properties only — the VALUES stay in FormScreen.css, keyed
160
+ off the Prizma spacing scale. Nothing here is a literal. */
161
+ style={
162
+ fieldsOffset || fieldsGap
163
+ ? ({
164
+ ...(fieldsOffset
165
+ ? { '--pfs-fields-offset': `var(--prizma-spacing-${fieldsOffset})` }
166
+ : null),
167
+ ...(fieldsGap
168
+ ? { '--pfs-fields-gap': `var(--prizma-spacing-${fieldsGap})` }
169
+ : null),
170
+ } as CSSProperties)
171
+ : undefined
172
+ }
173
+ >
174
+ {children}
175
+ </div>
176
+ {ctaLabel || linkLabel || linkContent ? (
177
+ <div className="prizma-screen-layout__cta prizma-form-screen__cta">
178
+ {ctaLabel ? (
179
+ <PrizmaButton
180
+ variant="primary"
181
+ size="L"
182
+ disabled={ctaDisabled}
183
+ loading={ctaLoading}
184
+ loadingLabel={ctaLoadingLabel}
185
+ onClick={() => onAction?.({ type: 'cta', screenId })}
186
+ >
187
+ {ctaLabel}
188
+ </PrizmaButton>
189
+ ) : null}
190
+ {linkLabel ? (
191
+ <PrizmaButton
192
+ variant="tertiary-link"
193
+ size="L"
194
+ onClick={() => onAction?.({ type: 'secondary', screenId })}
195
+ >
196
+ {linkLabel}
197
+ </PrizmaButton>
198
+ ) : null}
199
+ {linkContent}
200
+ </div>
201
+ ) : null}
202
+ {showFooter ? (
203
+ <div className="prizma-screen-layout__footer prizma-screen-layout__footer--pinned">
204
+ <PrizmaTag label={verifiedLabel} />
205
+ </div>
206
+ ) : null}
207
+ </div>
208
+ </PrizmaScreenShell>
209
+ ),
210
+ );
211
+ PrizmaFormScreen.displayName = 'PrizmaFormScreen';
212
+
213
+ export default PrizmaFormScreen;
@@ -0,0 +1,150 @@
1
+ import React, { forwardRef } from 'react';
2
+ import {
3
+ PrizmaDropdown,
4
+ type PrizmaDropdownOption,
5
+ } from '@incodetech/prizma-core-web/dropdown';
6
+ import { PrizmaCountryFlag, type PrizmaCountry } from '@incodetech/prizma-core-web/combined';
7
+ import { PrizmaFormScreen, type PrizmaFormScreenProps } from './FormScreen';
8
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
9
+ import type {
10
+ FormsChoiceKey,
11
+ FormsChoiceOptionSet,
12
+ FormsChoiceState,
13
+ FormsStrings,
14
+ } from './FormsStrings';
15
+ import './ScreenLayout.css';
16
+
17
+ export interface FormsChoiceScreenProps
18
+ extends Omit<
19
+ PrizmaFormScreenProps,
20
+ 'title' | 'subtitle' | 'ctaLabel' | 'verifiedLabel' | 'children' | 'navLabel'
21
+ > {
22
+ /** Module copy — this screen reads one `choice.*` slice. */
23
+ strings: FormsStrings;
24
+ /** Which choice purple section to render. Default `residence`. */
25
+ field?: FormsChoiceKey;
26
+ /** Which option list the menu carries. Default `countries`. */
27
+ optionSet?: FormsChoiceOptionSet;
28
+ /** Which treatment of that section. Default `closed`. */
29
+ state?: FormsChoiceState;
30
+ /**
31
+ * The option rows. Runtime data, never copy — the host supplies its own
32
+ * localized list, the same contract Phone Input's `countries` prop carries.
33
+ * Ignored when `optionSet` is `countries`, which is driven by `countries`.
34
+ */
35
+ options?: PrizmaDropdownOption[];
36
+ /**
37
+ * The selectable countries for the `countries` option set. Each row draws
38
+ * Core's canonical flag raster through `PrizmaDropdown.renderLeading` — the
39
+ * very use case that component's docstring names.
40
+ */
41
+ countries?: PrizmaCountry[];
42
+ /** The selected option value, where the section draws one. */
43
+ value?: string;
44
+ screenId?: string;
45
+ overrides?: PrizmaScreenOverrides;
46
+ onAction?: PrizmaScreenActionHandler;
47
+ }
48
+
49
+ /**
50
+ * Forms & Data Entry — the choice screen, built on the Form archetype
51
+ * (GUIDELINES.md §6-E, `PrizmaFormScreen`).
52
+ *
53
+ * ONE screen for eight purple sections across four parent groups —
54
+ * `forms.country` (Residence: `default` / `open`; the third frame,
55
+ * `forms.residencetyping`, needs a search query Core cannot seed — DEVIATIONS
56
+ * #FDE-6), `Forms.nationality`, `forms.select` (×2), `forms.yesNo` (×2) and the
57
+ * `forms.country` question variant (×2). Measured against the 390 frames the
58
+ * three groups draw a BYTE-IDENTICAL closed field: same title block, same
59
+ * labelled `PrizmaDropdown`, same "Select an option" trigger, same CTA. What
60
+ * separates them is (a) the label above the field and (b) what the OPEN menu
61
+ * lists — so the module carries a `field` axis and an `optionSet` axis instead
62
+ * of eight screens, and the demo enumerates the closed state ONCE per distinct
63
+ * label rather than three times identically.
64
+ *
65
+ * Three notes:
66
+ *
67
+ * 1. The section draws a VISIBLE label row, so the copy uses Core's `label`
68
+ * slot. Phone Input and Email Input ride `aria-label` because their Figma
69
+ * draws no label (DEVIATIONS #PI-4, #EI-2) — this module's does.
70
+ * 2. The open sections draw the trigger with the bold blue border. Core paints
71
+ * that on `:focus-visible` only, which a static spec state never reaches, so
72
+ * the screen uses the documentation-only `forceState="focused"` the
73
+ * component already exposes for exactly this. Nothing is re-styled.
74
+ * 3. `forceOpen` IS the open-menu spec state — a screen is one static frame,
75
+ * never a live interaction. Its missing sibling is a `searchValue`: without
76
+ * one the TYPING frame renders as `open` with an empty search bar, so that
77
+ * section is not enumerated rather than shipped as a duplicate (#FDE-6).
78
+ */
79
+ export const FormsChoiceScreen = forwardRef<HTMLDivElement, FormsChoiceScreenProps>(
80
+ (
81
+ {
82
+ strings,
83
+ field = 'residence',
84
+ optionSet = 'countries',
85
+ state = 'closed',
86
+ options,
87
+ countries,
88
+ value,
89
+ screenId = `forms-choice-${field}-${optionSet}-${state}`,
90
+ overrides,
91
+ onAction,
92
+ ...shell
93
+ },
94
+ ref,
95
+ ) => {
96
+ const copy = strings.choice[field];
97
+ const open = state === 'open';
98
+
99
+ // The `countries` set is the one Figma draws with a search bar and a flag
100
+ // per row; `generic` and `yesNo` draw a bare list.
101
+ const isCountries = optionSet === 'countries';
102
+ const countryList = countries ?? [];
103
+ const rows: PrizmaDropdownOption[] = isCountries
104
+ ? countryList.map((c) => ({ value: c.code, label: c.name }))
105
+ : (options ?? []);
106
+
107
+ return (
108
+ <PrizmaFormScreen
109
+ ref={ref}
110
+ title={copy.title}
111
+ subtitle={copy.subtitle}
112
+ ctaLabel={copy.ctaLabel}
113
+ verifiedLabel={strings.verifiedLabel}
114
+ navLabel={strings.navLabel}
115
+ screenId={screenId}
116
+ overrides={overrides}
117
+ onAction={onAction}
118
+ {...shell}
119
+ >
120
+ <PrizmaDropdown
121
+ label={copy.label}
122
+ placeholder={copy.placeholder}
123
+ options={rows}
124
+ value={value ?? null}
125
+ /* The open sections draw the focused border; Core's own
126
+ documentation-only modifier supplies it (see note 2). */
127
+ forceState={open ? 'focused' : undefined}
128
+ forceOpen={open}
129
+ searchable={isCountries}
130
+ searchPlaceholder={copy.searchPlaceholder}
131
+ clearSearchLabel={copy.clearSearchLabel}
132
+ /* Core's canonical flag raster in the option's leading slot — the
133
+ primitive Phone Input had to do without (DEVIATIONS #PI-3) and
134
+ `PrizmaDropdown.renderLeading`'s own docstring asks for. */
135
+ renderLeading={
136
+ isCountries
137
+ ? (option) => {
138
+ const match = countryList.find((c) => c.code === option.value);
139
+ return match ? <PrizmaCountryFlag country={match} /> : null;
140
+ }
141
+ : undefined
142
+ }
143
+ />
144
+ </PrizmaFormScreen>
145
+ );
146
+ },
147
+ );
148
+ FormsChoiceScreen.displayName = 'FormsChoiceScreen';
149
+
150
+ export default FormsChoiceScreen;
@@ -0,0 +1,61 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { PrizmaResultScreen, type PrizmaResultScreenProps } from './ResultScreen';
3
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
4
+ import type { FormsStrings } from './FormsStrings';
5
+ import './ScreenLayout.css';
6
+
7
+ export interface FormsErrorScreenProps
8
+ extends Omit<
9
+ PrizmaResultScreenProps,
10
+ 'status' | 'title' | 'subtitle' | 'ctaLabel' | 'verifiedLabel' | 'navLabel'
11
+ > {
12
+ /** Module copy — this screen reads the `error` slice. */
13
+ strings: FormsStrings;
14
+ screenId?: string;
15
+ overrides?: PrizmaScreenOverrides;
16
+ onAction?: PrizmaScreenActionHandler;
17
+ }
18
+
19
+ /**
20
+ * Forms & Data Entry — the error verdict, built on the Result archetype
21
+ * (GUIDELINES.md §6-F, `PrizmaResultScreen`).
22
+ *
23
+ * Figma: the purple `forms.error` section (2014:21506) — the negative status
24
+ * mark over "Something went wrong" with a single "Try again" CTA and the
25
+ * anchored tag. One button, so archetype F rather than C (its sibling
26
+ * `forms.success` draws none and stays on C — see `FormsSuccessScreen`).
27
+ *
28
+ * The module has no connectivity family: unlike Phone Input, the Forms sections
29
+ * carry ONE generic error screen and no `noConnection` variant, so there is no
30
+ * `variant` axis and no Wi-Fi glyph here. Logged so the asymmetry is not read
31
+ * as an omission (the #EI-5 precedent).
32
+ */
33
+ export const FormsErrorScreen = forwardRef<HTMLDivElement, FormsErrorScreenProps>(
34
+ (
35
+ {
36
+ strings,
37
+ screenId = 'forms-error',
38
+ overrides,
39
+ onAction,
40
+ ...shell
41
+ },
42
+ ref,
43
+ ) => (
44
+ <PrizmaResultScreen
45
+ ref={ref}
46
+ status="error"
47
+ title={strings.error.title}
48
+ subtitle={strings.error.subtitle}
49
+ ctaLabel={strings.error.ctaLabel}
50
+ verifiedLabel={strings.verifiedLabel}
51
+ navLabel={strings.navLabel}
52
+ screenId={screenId}
53
+ overrides={overrides}
54
+ onAction={onAction}
55
+ {...shell}
56
+ />
57
+ ),
58
+ );
59
+ FormsErrorScreen.displayName = 'FormsErrorScreen';
60
+
61
+ export default FormsErrorScreen;
@@ -0,0 +1,198 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { PrizmaTextField } from '@incodetech/prizma-core-web/text-field';
3
+ import { PrizmaDateField } from '@incodetech/prizma-core-web/date-field';
4
+ import { PrizmaMultiline } from '@incodetech/prizma-core-web/multiline';
5
+ import { PrizmaCombined, type PrizmaCountry } from '@incodetech/prizma-core-web/combined';
6
+ import { PrizmaFormScreen, type PrizmaFormScreenProps } from './FormScreen';
7
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
8
+ import type { FormsFieldKey, FormsFieldState, FormsStrings } from './FormsStrings';
9
+ import './ScreenLayout.css';
10
+
11
+ export interface FormsFieldScreenProps
12
+ extends Omit<
13
+ PrizmaFormScreenProps,
14
+ 'title' | 'subtitle' | 'ctaLabel' | 'verifiedLabel' | 'children' | 'navLabel'
15
+ > {
16
+ /** Module copy — this screen reads one `fields.*` slice. */
17
+ strings: FormsStrings;
18
+ /** Which single-field purple section to render. */
19
+ field: FormsFieldKey;
20
+ /** Which treatment of that section. Default `default`. */
21
+ state?: FormsFieldState;
22
+ /** The value as typed. Empty renders the placeholder. */
23
+ value?: string;
24
+ /**
25
+ * `phone` only — the dial code the combined field opens on. Runtime data,
26
+ * not copy; Core's `PrizmaCombined` ships its own list and defaults to
27
+ * Serbia, which is exactly what `forms.phoneNumber` draws.
28
+ */
29
+ country?: PrizmaCountry;
30
+ /** `phone` only — the selectable dial codes. */
31
+ countries?: PrizmaCountry[];
32
+ screenId?: string;
33
+ overrides?: PrizmaScreenOverrides;
34
+ onAction?: PrizmaScreenActionHandler;
35
+ }
36
+
37
+ /**
38
+ * Forms & Data Entry — the single-field screen, built on the Form archetype
39
+ * (GUIDELINES.md §6-E, `PrizmaFormScreen`).
40
+ *
41
+ * ONE screen for eight purple sections — `forms.idnumber`, `forms.cpf`,
42
+ * `forms.email`, `forms.phone`, `forms.text`, two of the three `forms.dob`
43
+ * sections (`forms.DOB.iconButton` draws an open month grid Core does not ship
44
+ * — DEVIATIONS #FDE-5) and the two `forms.inputerror` sections. Measured
45
+ * against the 390 frames they
46
+ * share an identical skeleton: nav → Title → Spacing/32 → ONE labelled field →
47
+ * primary CTA → tag. What changes is which Core input sits in the stack and
48
+ * what state it is in, which is exactly what GUIDELINES §6-E means by "states
49
+ * are separate screens sharing the identical layout".
50
+ *
51
+ * Four rules carried over from the Wave-3 modules that paid for them:
52
+ *
53
+ * 1. Every field is UNCONTROLLED (`defaultValue`). A screen is one static spec
54
+ * state, so no `onChange` is needed — and Core's `readOnly`, the other way
55
+ * to make a field inert, paints the DISABLED grey surface on states Figma
56
+ * draws white (DEVIATIONS #PI-6). Nothing here greys, so nothing is
57
+ * disabled either.
58
+ * 2. `focused` gets Core's OWN `--focused` modifier through
59
+ * `className` — the class its CSS already implements beside `:focus-within`.
60
+ * The input family has no `forceState` prop yet, unlike `PrizmaDropdown`
61
+ * (DEVIATIONS #PI-7); nothing is re-styled here.
62
+ * 3. `clearable` is left OFF on every state. Figma draws no clear ✕ on any of
63
+ * these sections, and on the two error sections Core could not reveal one
64
+ * anyway — its `:focus-within:not(--error)` guard makes the prop a silent
65
+ * no-op there (DEVIATIONS #CURP-3). Setting a prop that cannot paint is the
66
+ * defect that shipped on CURP.
67
+ * 4. The in-flight spinner, when a host wires one, rides the CTA
68
+ * (`ctaLoading`), never the field (DEVIATIONS #PI-5).
69
+ *
70
+ * Unlike Phone Input and Email Input, EVERY section here draws a visible label
71
+ * row above the field, so the copy uses Core's `label` slot rather than
72
+ * `aria-label` (#PI-4 / #EI-2 do not apply — see DEVIATIONS #FDE-1).
73
+ */
74
+ export const FormsFieldScreen = forwardRef<HTMLDivElement, FormsFieldScreenProps>(
75
+ (
76
+ {
77
+ strings,
78
+ field,
79
+ state = 'default',
80
+ value,
81
+ country,
82
+ countries,
83
+ screenId = `forms-field-${field}-${state}`,
84
+ overrides,
85
+ onAction,
86
+ ...shell
87
+ },
88
+ ref,
89
+ ) => {
90
+ const copy = strings.fields[field];
91
+
92
+ // The two `forms.inputerror` sections are the only ones that paint the
93
+ // negative surface, and they are also the only ones that grey the CTA —
94
+ // the canvas sticky's "optimistic rule" (the button starts enabled and
95
+ // greys only after a submit that failed validation).
96
+ const emptyError = state === 'emptyError';
97
+ const invalidError = state === 'invalidError';
98
+ const invalid = emptyError || invalidError;
99
+ const errorText = emptyError ? copy.emptyErrorText : copy.invalidErrorText;
100
+
101
+ // `forms.DOB.typing` draws the blue focus ring. Its neighbour
102
+ // `forms.DOB.iconButton` draws the same ring UNDER an open month grid, and
103
+ // Core owns no picker to open — so that section has no state here rather
104
+ // than a second focus ring wearing its name. See FormsStrings.
105
+ const focused = state === 'focused';
106
+ const focusClass = (modifier: string) => (focused ? modifier : undefined);
107
+
108
+ // The `emptyError` section draws the field with NOTHING in it — not even
109
+ // the grey placeholder every resting section shows. Passing no placeholder
110
+ // is the screen choosing content, not overriding a Core treatment.
111
+ const placeholder = emptyError ? undefined : copy.placeholder;
112
+
113
+ const renderField = () => {
114
+ switch (field) {
115
+ case 'dob':
116
+ return (
117
+ <PrizmaDateField
118
+ className={focusClass('prizma-input-datefield--focused')}
119
+ label={copy.label}
120
+ placeholder={placeholder}
121
+ defaultValue={value ?? ''}
122
+ error={invalid}
123
+ errorText={invalid ? errorText : undefined}
124
+ calendarLabel={copy.calendarLabel}
125
+ />
126
+ );
127
+ case 'phone':
128
+ return (
129
+ <PrizmaCombined
130
+ label={copy.label}
131
+ placeholder={placeholder}
132
+ defaultValue={value ?? ''}
133
+ defaultCountry={country}
134
+ countries={countries}
135
+ countryListLabel={copy.countryListLabel}
136
+ error={invalid}
137
+ errorText={invalid ? errorText : undefined}
138
+ />
139
+ );
140
+ case 'text':
141
+ return (
142
+ <PrizmaMultiline
143
+ className={focusClass('prizma-input-multiline--focused')}
144
+ label={copy.label}
145
+ placeholder={placeholder}
146
+ defaultValue={value ?? ''}
147
+ error={invalid}
148
+ errorText={invalid ? errorText : undefined}
149
+ clearable={false}
150
+ clearLabel={copy.clearLabel}
151
+ />
152
+ );
153
+ default:
154
+ return (
155
+ <PrizmaTextField
156
+ className={focusClass('prizma-input-textfield--focused')}
157
+ label={copy.label}
158
+ placeholder={placeholder}
159
+ defaultValue={value ?? ''}
160
+ /* `forms.email` is the one section with e-mail semantics; the
161
+ rest are plain text keys. */
162
+ type={field === 'email' ? 'email' : 'text'}
163
+ inputMode={field === 'email' ? 'email' : undefined}
164
+ autoComplete={field === 'email' ? 'email' : 'off'}
165
+ autoCapitalize={field === 'email' ? 'none' : undefined}
166
+ spellCheck={false}
167
+ error={invalid}
168
+ errorText={invalid ? errorText : undefined}
169
+ clearable={false}
170
+ clearLabel={copy.clearLabel}
171
+ />
172
+ );
173
+ }
174
+ };
175
+
176
+ return (
177
+ <PrizmaFormScreen
178
+ ref={ref}
179
+ title={copy.title}
180
+ subtitle={copy.subtitle}
181
+ ctaLabel={copy.ctaLabel}
182
+ ctaDisabled={invalid}
183
+ ctaLoadingLabel={copy.ctaLoadingLabel}
184
+ verifiedLabel={strings.verifiedLabel}
185
+ navLabel={strings.navLabel}
186
+ screenId={screenId}
187
+ overrides={overrides}
188
+ onAction={onAction}
189
+ {...shell}
190
+ >
191
+ {renderField()}
192
+ </PrizmaFormScreen>
193
+ );
194
+ },
195
+ );
196
+ FormsFieldScreen.displayName = 'FormsFieldScreen';
197
+
198
+ export default FormsFieldScreen;
@@ -0,0 +1,45 @@
1
+ /* Forms & Data Entry — module layout additions.
2
+ *
3
+ * ONE rule, and it declares no spacing. The content column, the 24px gutters,
4
+ * the title → fields Spacing/32, the field gaps, the CTA column and the
5
+ * anchored footer all stay the foundation's (`ScreenLayout.css`,
6
+ * `FormScreen.css`). The rule RELEASES a constraint that a purple section
7
+ * contradicts — the same idiom as Phone Input's `width: auto` on Core's
8
+ * fill-width Dropdown (#PI-1). No primitive is invented, no Core value
9
+ * repainted, no `!important`.
10
+ *
11
+ * The module's other layout need — the multi-field stacks that are taller than
12
+ * the 844 frame — is NOT here: it is the archetype's `scrollFields` prop
13
+ * (`PrizmaFormScreen`, `.prizma-form-screen__fields--scroll`), which carries
14
+ * both the `overflow-y: auto` and the Spacing/16 margin that makes the cut read
15
+ * as a cut. `FormsLongFormScreen` passes it. DEVIATIONS #DSC-2 / #CURP-1.
16
+ */
17
+
18
+ /* ── The focused row keeps its clear ✕ ───────────────────────────────────────
19
+ * `longform.focused` (9:24653) draws the e-mail row with the blue focus ring,
20
+ * the partial value AND the grey clear ✕ at the field's right edge.
21
+ *
22
+ * Core renders that button (`PrizmaTextField clearable`) but reveals it only
23
+ * under `:focus-within` (TextField.css:121) — a LIVE focus a static spec state
24
+ * can never hold. Its sibling `--focused` modifier, the documentation hook the
25
+ * screen already uses for the border, is not part of that selector, so the
26
+ * prop was a silent no-op: exactly the defect QA caught on CURP (#CURP-3).
27
+ *
28
+ * This mirrors Core's own reveal verbatim — same element, same `--show` state
29
+ * (which Core still owns: the button appears only when the field has a value),
30
+ * same disabled/error guards — swapping only the live `:focus-within` for the
31
+ * static modifier. Nothing is hand-rolled: no ✕ glyph, no box, no colour is
32
+ * declared here; only Core's `display: none` is lifted, and only on the one
33
+ * section that draws the affordance.
34
+ *
35
+ * CORE REQUEST (extends #PI-7): give the input family the `forceState` prop
36
+ * `PrizmaDropdown` already has, and let it drive the clear affordance as well
37
+ * as the border — then this rule disappears.
38
+ */
39
+ .forms-long-form--focused
40
+ .prizma-input-textfield--focused:not(.prizma-input-textfield--disabled):not(
41
+ .prizma-input-textfield--error
42
+ )
43
+ .prizma-input-textfield__clear.prizma-input-textfield__clear--show {
44
+ display: inline-flex;
45
+ }