@incodetech/prizma-core-screens 0.2.4 → 0.2.12

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 (243) hide show
  1. package/dist/BiometricConsentScreen.d.ts +95 -0
  2. package/dist/BiometricConsentScreen.js +91 -0
  3. package/dist/BiometricConsentStrings.d.ts +84 -0
  4. package/dist/BiometricConsentStrings.js +31 -0
  5. package/dist/CaptureScreen.d.ts +13 -0
  6. package/dist/CaptureScreen.js +2 -2
  7. package/dist/CurpEnterScreen.d.ts +7 -0
  8. package/dist/CurpEnterScreen.js +17 -3
  9. package/dist/CurpGenerateScreen.d.ts +8 -0
  10. package/dist/CurpGenerateScreen.js +28 -13
  11. package/dist/CurpLayout.css +8 -34
  12. package/dist/CurpStrings.d.ts +16 -2
  13. package/dist/DemoScreensLayout.css +16 -0
  14. package/dist/DemoScreensRedirectScreen.d.ts +6 -1
  15. package/dist/DemoScreensRedirectScreen.js +3 -2
  16. package/dist/DemoScreensStrings.d.ts +5 -0
  17. package/dist/DigitalIdUploadErrorScreen.d.ts +31 -0
  18. package/dist/DigitalIdUploadErrorScreen.js +26 -0
  19. package/dist/DigitalIdUploadFileTooLargeScreen.d.ts +27 -0
  20. package/dist/DigitalIdUploadFileTooLargeScreen.js +21 -0
  21. package/dist/DigitalIdUploadReviewScreen.d.ts +57 -0
  22. package/dist/DigitalIdUploadReviewScreen.js +44 -0
  23. package/dist/DigitalIdUploadStrings.d.ts +64 -0
  24. package/dist/DigitalIdUploadStrings.js +19 -0
  25. package/dist/DigitalIdUploadTutorialScreen.d.ts +28 -0
  26. package/dist/DigitalIdUploadTutorialScreen.js +23 -0
  27. package/dist/DocumentCaptureIllustration.d.ts +1 -1
  28. package/dist/EkybAddressDetailsScreen.d.ts +7 -0
  29. package/dist/EkybAddressDetailsScreen.js +25 -7
  30. package/dist/EkybBusinessDetailsScreen.d.ts +6 -0
  31. package/dist/EkybBusinessDetailsScreen.js +23 -6
  32. package/dist/EkybCountryScreen.d.ts +13 -5
  33. package/dist/EkybCountryScreen.js +41 -10
  34. package/dist/EkybOwnersScreen.d.ts +8 -0
  35. package/dist/EkybOwnersScreen.js +26 -3
  36. package/dist/EkybStrings.d.ts +32 -10
  37. package/dist/EkycCountryCatalog.d.ts +4 -1
  38. package/dist/EkycCountryCatalog.js +5 -3
  39. package/dist/EkycCountryFormScreen.d.ts +12 -3
  40. package/dist/EkycCountryFormScreen.js +28 -10
  41. package/dist/EkycDetailsScreen.d.ts +7 -0
  42. package/dist/EkycDetailsScreen.js +21 -4
  43. package/dist/EkycStrings.d.ts +14 -2
  44. package/dist/ElectronicSignatureLayout.css +6 -0
  45. package/dist/EmailInputStrings.d.ts +11 -1
  46. package/dist/EmailInputVerifyScreen.d.ts +7 -0
  47. package/dist/EmailInputVerifyScreen.js +17 -3
  48. package/dist/ErrorScreensScreen.d.ts +5 -2
  49. package/dist/ErrorScreensScreen.js +15 -4
  50. package/dist/ErrorScreensStrings.d.ts +17 -2
  51. package/dist/ErrorScreensStrings.js +18 -10
  52. package/dist/FaceCaptureCapturingScreen.d.ts +63 -0
  53. package/dist/FaceCaptureCapturingScreen.js +62 -2
  54. package/dist/FaceCaptureLayout.css +69 -4
  55. package/dist/FaceCaptureStrings.d.ts +23 -0
  56. package/dist/FaceMatchComparisonScreen.d.ts +3 -3
  57. package/dist/FaceMatchLayout.css +21 -12
  58. package/dist/FormScreen.css +30 -0
  59. package/dist/FormScreen.d.ts +28 -0
  60. package/dist/FormScreen.js +3 -2
  61. package/dist/FormsLongFormScreen.d.ts +8 -0
  62. package/dist/FormsLongFormScreen.js +34 -13
  63. package/dist/FormsStrings.d.ts +11 -1
  64. package/dist/GeolocationBrowserStepsScreen.d.ts +6 -2
  65. package/dist/GeolocationBrowserStepsScreen.js +7 -3
  66. package/dist/GeolocationStrings.d.ts +3 -0
  67. package/dist/IdCaptureLayout.css +205 -2
  68. package/dist/IdCaptureStageScreen.d.ts +47 -0
  69. package/dist/IdCaptureStageScreen.js +39 -3
  70. package/dist/IdCaptureStrings.d.ts +19 -0
  71. package/dist/ListScreen.d.ts +21 -0
  72. package/dist/ListScreen.js +7 -2
  73. package/dist/LoaderScreen.d.ts +7 -5
  74. package/dist/LoaderScreen.js +7 -5
  75. package/dist/LoadersStrings.d.ts +18 -5
  76. package/dist/OcrReviewErrorScreen.d.ts +30 -0
  77. package/dist/OcrReviewErrorScreen.js +24 -0
  78. package/dist/OcrReviewLayout.css +24 -0
  79. package/dist/OcrReviewLoadingScreen.d.ts +25 -0
  80. package/dist/OcrReviewLoadingScreen.js +19 -0
  81. package/dist/OcrReviewScreen.d.ts +76 -0
  82. package/dist/OcrReviewScreen.js +65 -0
  83. package/dist/OcrReviewStrings.d.ts +47 -0
  84. package/dist/OcrReviewStrings.js +17 -0
  85. package/dist/OcrReviewSuccessScreen.d.ts +30 -0
  86. package/dist/OcrReviewSuccessScreen.js +24 -0
  87. package/dist/PermissionsAllowScreen.d.ts +8 -11
  88. package/dist/PermissionsAllowScreen.js +8 -11
  89. package/dist/PermissionsAskScreen.d.ts +41 -0
  90. package/dist/PermissionsAskScreen.js +43 -0
  91. package/dist/PermissionsBrowserStepsScreen.d.ts +9 -2
  92. package/dist/PermissionsBrowserStepsScreen.js +12 -3
  93. package/dist/PermissionsLayout.css +47 -0
  94. package/dist/PermissionsStrings.d.ts +20 -9
  95. package/dist/PermissionsStrings.js +10 -4
  96. package/dist/PhoneInputLayout.css +10 -9
  97. package/dist/PhoneInputOtpScreen.d.ts +8 -0
  98. package/dist/PhoneInputOtpScreen.js +26 -19
  99. package/dist/PhoneInputStrings.d.ts +22 -4
  100. package/dist/PhoneInputVerifyScreen.d.ts +8 -0
  101. package/dist/PhoneInputVerifyScreen.js +36 -7
  102. package/dist/QualifiedSignatureAcceptScreen.js +6 -1
  103. package/dist/QualifiedSignatureDocumentScreen.d.ts +17 -10
  104. package/dist/QualifiedSignatureDocumentScreen.js +22 -17
  105. package/dist/QualifiedSignatureLayout.css +76 -0
  106. package/dist/QualifiedSignatureResultScreen.d.ts +16 -13
  107. package/dist/QualifiedSignatureResultScreen.js +17 -18
  108. package/dist/QualifiedSignatureStrings.d.ts +19 -2
  109. package/dist/ResultScreen.d.ts +8 -0
  110. package/dist/ResultScreen.js +14 -3
  111. package/dist/ReusabilityCredentialSelectionScreen.d.ts +95 -0
  112. package/dist/ReusabilityCredentialSelectionScreen.js +94 -0
  113. package/dist/ReusabilityLayout.css +241 -0
  114. package/dist/ReusabilityPrivacyPolicyScreen.d.ts +55 -0
  115. package/dist/ReusabilityPrivacyPolicyScreen.js +44 -0
  116. package/dist/ReusabilityStrings.d.ts +85 -0
  117. package/dist/ReusabilityStrings.js +37 -0
  118. package/dist/ReviewScreen.d.ts +38 -12
  119. package/dist/ReviewScreen.js +41 -8
  120. package/dist/ScreenLayout.css +382 -6
  121. package/dist/ScreenNav.css +8 -0
  122. package/dist/ScreenNav.d.ts +15 -2
  123. package/dist/ScreenNav.js +10 -3
  124. package/dist/VideoSelfieErrorScreen.js +1 -1
  125. package/dist/VideoSelfieIdCaptureScreen.d.ts +10 -3
  126. package/dist/VideoSelfieIdCaptureScreen.js +45 -14
  127. package/dist/VideoSelfieLayout.css +467 -34
  128. package/dist/VideoSelfieSelfieCaptureScreen.d.ts +44 -27
  129. package/dist/VideoSelfieSelfieCaptureScreen.js +65 -39
  130. package/dist/VideoSelfieSpeakScreen.js +19 -2
  131. package/dist/VideoSelfieStrings.d.ts +82 -13
  132. package/dist/VideoSelfieTurnHeadScreen.d.ts +51 -0
  133. package/dist/VideoSelfieTurnHeadScreen.js +66 -0
  134. package/dist/VideoSelfieTutorialScreen.d.ts +9 -0
  135. package/dist/VideoSelfieTutorialScreen.js +22 -5
  136. package/dist/VideoSelfieWaveScreen.d.ts +53 -0
  137. package/dist/VideoSelfieWaveScreen.js +62 -0
  138. package/dist/ViewfinderScreen.css +36 -0
  139. package/dist/WatchlistBusinessFormScreen.d.ts +11 -7
  140. package/dist/WatchlistBusinessFormScreen.js +27 -13
  141. package/dist/WatchlistBusinessStrings.d.ts +21 -7
  142. package/dist/flows.d.ts +8 -0
  143. package/dist/flows.js +17 -0
  144. package/dist/index.d.ts +19 -1
  145. package/dist/index.js +14 -0
  146. package/dist/styles.css +3 -0
  147. package/dist/types.d.ts +3 -1
  148. package/package.json +79 -3
  149. package/samples/video-selfie-camera-wide.jpg +0 -0
  150. package/samples/video-selfie-room-wide.jpg +0 -0
  151. package/samples/video-selfie-room.png +0 -0
  152. package/src/BiometricConsentScreen.tsx +192 -0
  153. package/src/BiometricConsentStrings.ts +119 -0
  154. package/src/CaptureScreen.tsx +17 -0
  155. package/src/CurpEnterScreen.tsx +21 -4
  156. package/src/CurpGenerateScreen.tsx +46 -22
  157. package/src/CurpLayout.css +8 -34
  158. package/src/CurpStrings.ts +22 -2
  159. package/src/DemoScreensLayout.css +16 -0
  160. package/src/DemoScreensRedirectScreen.tsx +14 -6
  161. package/src/DemoScreensStrings.ts +5 -0
  162. package/src/DigitalIdUploadErrorScreen.tsx +83 -0
  163. package/src/DigitalIdUploadFileTooLargeScreen.tsx +67 -0
  164. package/src/DigitalIdUploadReviewScreen.tsx +119 -0
  165. package/src/DigitalIdUploadStrings.ts +88 -0
  166. package/src/DigitalIdUploadTutorialScreen.tsx +59 -0
  167. package/src/DocumentCaptureIllustration.tsx +1 -1
  168. package/src/EkybAddressDetailsScreen.tsx +32 -4
  169. package/src/EkybBusinessDetailsScreen.tsx +23 -5
  170. package/src/EkybCountryScreen.tsx +45 -7
  171. package/src/EkybOwnersScreen.tsx +34 -3
  172. package/src/EkybStrings.ts +34 -10
  173. package/src/EkycCountryCatalog.ts +9 -4
  174. package/src/EkycCountryFormScreen.tsx +51 -12
  175. package/src/EkycDetailsScreen.tsx +22 -1
  176. package/src/EkycStrings.ts +14 -2
  177. package/src/ElectronicSignatureLayout.css +6 -0
  178. package/src/EmailInputStrings.ts +12 -1
  179. package/src/EmailInputVerifyScreen.tsx +21 -4
  180. package/src/ErrorScreensScreen.tsx +15 -4
  181. package/src/ErrorScreensStrings.ts +37 -12
  182. package/src/FaceCaptureCapturingScreen.tsx +102 -13
  183. package/src/FaceCaptureLayout.css +69 -4
  184. package/src/FaceCaptureStrings.ts +24 -0
  185. package/src/FaceMatchComparisonScreen.tsx +3 -3
  186. package/src/FaceMatchLayout.css +21 -12
  187. package/src/FormScreen.css +30 -0
  188. package/src/FormScreen.tsx +34 -0
  189. package/src/FormsLongFormScreen.tsx +41 -13
  190. package/src/FormsStrings.ts +12 -1
  191. package/src/GeolocationBrowserStepsScreen.tsx +6 -3
  192. package/src/GeolocationStrings.ts +3 -0
  193. package/src/IdCaptureLayout.css +205 -2
  194. package/src/IdCaptureStageScreen.tsx +75 -0
  195. package/src/IdCaptureStrings.ts +19 -0
  196. package/src/ListScreen.tsx +58 -10
  197. package/src/LoaderScreen.tsx +7 -5
  198. package/src/LoadersStrings.ts +18 -5
  199. package/src/OcrReviewErrorScreen.tsx +53 -0
  200. package/src/OcrReviewLayout.css +24 -0
  201. package/src/OcrReviewLoadingScreen.tsx +48 -0
  202. package/src/OcrReviewScreen.tsx +190 -0
  203. package/src/OcrReviewStrings.ts +69 -0
  204. package/src/OcrReviewSuccessScreen.tsx +52 -0
  205. package/src/PermissionsAllowScreen.tsx +9 -10
  206. package/src/PermissionsAskScreen.tsx +105 -0
  207. package/src/PermissionsBrowserStepsScreen.tsx +11 -3
  208. package/src/PermissionsLayout.css +47 -0
  209. package/src/PermissionsStrings.ts +42 -12
  210. package/src/PhoneInputLayout.css +10 -9
  211. package/src/PhoneInputOtpScreen.tsx +23 -3
  212. package/src/PhoneInputStrings.ts +23 -4
  213. package/src/PhoneInputVerifyScreen.tsx +41 -5
  214. package/src/QualifiedSignatureAcceptScreen.tsx +12 -1
  215. package/src/QualifiedSignatureDocumentScreen.tsx +31 -19
  216. package/src/QualifiedSignatureLayout.css +76 -0
  217. package/src/QualifiedSignatureResultScreen.tsx +28 -26
  218. package/src/QualifiedSignatureStrings.ts +19 -2
  219. package/src/ResultScreen.tsx +33 -2
  220. package/src/ReusabilityCredentialSelectionScreen.tsx +246 -0
  221. package/src/ReusabilityLayout.css +241 -0
  222. package/src/ReusabilityPrivacyPolicyScreen.tsx +109 -0
  223. package/src/ReusabilityStrings.ts +127 -0
  224. package/src/ReviewScreen.tsx +96 -27
  225. package/src/ScreenLayout.css +382 -6
  226. package/src/ScreenNav.css +8 -0
  227. package/src/ScreenNav.tsx +35 -5
  228. package/src/VideoSelfieErrorScreen.tsx +1 -1
  229. package/src/VideoSelfieIdCaptureScreen.tsx +125 -31
  230. package/src/VideoSelfieLayout.css +467 -34
  231. package/src/VideoSelfieSelfieCaptureScreen.tsx +110 -57
  232. package/src/VideoSelfieSpeakScreen.tsx +34 -15
  233. package/src/VideoSelfieStrings.ts +89 -14
  234. package/src/VideoSelfieTurnHeadScreen.tsx +162 -0
  235. package/src/VideoSelfieTutorialScreen.tsx +45 -23
  236. package/src/VideoSelfieWaveScreen.tsx +143 -0
  237. package/src/ViewfinderScreen.css +36 -0
  238. package/src/WatchlistBusinessFormScreen.tsx +35 -16
  239. package/src/WatchlistBusinessStrings.ts +21 -7
  240. package/src/flows.ts +25 -0
  241. package/src/index.ts +88 -3
  242. package/src/styles.css +3 -0
  243. package/src/types.ts +3 -1
@@ -31,8 +31,9 @@ export const DemoScreensRedirectScreen = forwardRef(({ strings, stage = 'qr', sm
31
31
  { code: 'RS', name: 'Serbia', dialCode: '+381', flag: '' },
32
32
  ].find(c => c.code === r.countryCode);
33
33
  const subtitle = sms ? r.subtitle : desktop ? r.subtitleQrDesktop : r.subtitleQrOnly;
34
- const verdict = stage === 'sent' || stage === 'resend' || stage === 'resent' || stage === 'tooMany';
35
- return (_jsxs(PrizmaScreenShell, { ref: ref, "data-screen-id": screenId, className: ['demo-screens-redirect', className ?? ''].filter(Boolean).join(' '), ...shell, children: [stage === 'resent' ? (_jsx("div", { className: "demo-screens-toast demo-screens-toast--desktop", children: _jsx(PrizmaSnackbar, { state: "success", children: r.sent.resentSnackbar }) })) : null, _jsxs("div", { className: "demo-screens-redirect__card", children: [_jsx(PrizmaScreenNav, { logo: overrides?.logo, navLabel: strings.navLabel }), _jsxs("div", { className: "prizma-screen-layout__content demo-screens-redirect__content", children: [_jsx(PrizmaTitle, { variant: "centered", title: r.title, showSubtitle: true, subtitle: subtitle }), sms ? (_jsxs("div", { className: "demo-screens-tabs", role: "tablist", children: [_jsx("button", { type: "button", role: "tab", "aria-selected": !onSms, className: ['demo-screens-tabs__tab', !onSms ? 'demo-screens-tabs__tab--active' : ''].join(' '), onClick: () => onAction?.({ type: 'secondary', screenId }), children: r.tabs.qr }), _jsx("button", { type: "button", role: "tab", "aria-selected": onSms, className: ['demo-screens-tabs__tab', onSms ? 'demo-screens-tabs__tab--active' : ''].join(' '), onClick: () => onAction?.({ type: 'tertiary', screenId }), children: r.tabs.sms })] })) : null, stage === 'qr' ? (_jsxs("div", { className: "demo-screens-redirect__leg", children: [sms ? _jsx("p", { className: "demo-screens-redirect__hint", children: r.qrHint }) : null, _jsx("div", { className: "demo-screens-redirect__qr", "aria-label": r.tabs.qr, children: qr })] })) : null, stage === 'sms' || stage === 'smsFilled' ? (_jsxs("div", { className: "demo-screens-redirect__leg demo-screens-redirect__leg--form", children: [_jsx("p", { className: "demo-screens-redirect__hint", children: r.smsHint }), _jsx(PrizmaCombined, { "aria-label": r.phoneLabel, placeholder: r.phonePlaceholder, defaultValue: stage === 'smsFilled' ? r.phoneValue : '', defaultCountry: country, showRequiredMarker: false }, stage), _jsx(PrizmaButton, { variant: "primary", size: "L", disabled: stage !== 'smsFilled', onClick: () => onAction?.({ type: 'cta', screenId }), children: r.sendLabel })] })) : null, verdict ? (_jsxs("div", { className: "demo-screens-redirect__leg demo-screens-redirect__leg--verdict", children: [stage === 'tooMany' ? (_jsx(PrizmaTitle, { variant: "centered", title: r.tooMany.title, showSubtitle: true, subtitle: r.tooMany.subtitle, icon: { type: 'status', status: 'error' } })) : (_jsx(PrizmaTitle, { variant: "centered", title: r.sent.title, showSubtitle: true, subtitle: `${r.sent.toPrefix} ${country?.dialCode ?? ''} ${r.phoneValue}`.trim(), icon: { type: 'status', status: 'success' } })), stage === 'tooMany' ? (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", onClick: () => onAction?.({ type: 'tertiary', screenId }), children: r.tooMany.changeLabel })) : stage === 'sent' || stage === 'resent' ? (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", disabled: true, children: r.sent.resendIn })) : (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", onClick: () => onAction?.({ type: 'cta', screenId }), children: r.sent.resend }))] })) : null] }), _jsxs("div", { className: "prizma-screen-layout__band demo-screens-redirect__band", children: [desktop && !verdict ? (_jsxs(_Fragment, { children: [_jsx(PrizmaDisclaimer, { text: r.orLabel }), _jsx("div", { className: "prizma-screen-layout__band__ctas", children: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: r.desktopLabel }) })] })) : null, _jsx("div", { className: "prizma-screen-layout__band__tag", children: _jsx(PrizmaTag, { label: strings.verifiedLabel }) })] })] })] }));
34
+ const invalid = stage === 'invalidUuid';
35
+ const verdict = stage === 'sent' || stage === 'resend' || stage === 'resent' || stage === 'tooMany' || invalid;
36
+ return (_jsxs(PrizmaScreenShell, { ref: ref, "data-screen-id": screenId, className: ['demo-screens-redirect', className ?? ''].filter(Boolean).join(' '), ...shell, children: [stage === 'resent' ? (_jsx("div", { className: "demo-screens-toast demo-screens-toast--desktop", children: _jsx(PrizmaSnackbar, { state: "success", children: r.sent.resentSnackbar }) })) : null, _jsxs("div", { className: "demo-screens-redirect__card", children: [_jsx(PrizmaScreenNav, { logo: overrides?.logo, navLabel: strings.navLabel }), _jsxs("div", { className: "prizma-screen-layout__content demo-screens-redirect__content", children: [invalid ? null : _jsx(PrizmaTitle, { variant: "centered", title: r.title, showSubtitle: true, subtitle: subtitle }), sms && !invalid ? (_jsxs("div", { className: "demo-screens-tabs", role: "tablist", children: [_jsx("button", { type: "button", role: "tab", "aria-selected": !onSms, className: ['demo-screens-tabs__tab', !onSms ? 'demo-screens-tabs__tab--active' : ''].join(' '), onClick: () => onAction?.({ type: 'secondary', screenId }), children: r.tabs.qr }), _jsx("button", { type: "button", role: "tab", "aria-selected": onSms, className: ['demo-screens-tabs__tab', onSms ? 'demo-screens-tabs__tab--active' : ''].join(' '), onClick: () => onAction?.({ type: 'tertiary', screenId }), children: r.tabs.sms })] })) : null, stage === 'qr' ? (_jsxs("div", { className: "demo-screens-redirect__leg", children: [sms ? _jsx("p", { className: "demo-screens-redirect__hint", children: r.qrHint }) : null, _jsx("div", { className: "demo-screens-redirect__qr", "aria-label": r.tabs.qr, children: qr })] })) : null, stage === 'sms' || stage === 'smsFilled' ? (_jsxs("div", { className: "demo-screens-redirect__leg demo-screens-redirect__leg--form", children: [_jsx("p", { className: "demo-screens-redirect__hint", children: r.smsHint }), _jsx(PrizmaCombined, { "aria-label": r.phoneLabel, placeholder: r.phonePlaceholder, defaultValue: stage === 'smsFilled' ? r.phoneValue : '', defaultCountry: country, showRequiredMarker: false }, stage), _jsx(PrizmaButton, { variant: "primary", size: "L", disabled: stage !== 'smsFilled', onClick: () => onAction?.({ type: 'cta', screenId }), children: r.sendLabel })] })) : null, verdict ? (_jsxs("div", { className: "demo-screens-redirect__leg demo-screens-redirect__leg--verdict", children: [invalid ? (_jsx(PrizmaTitle, { variant: "centered", title: r.invalidUuid.title, showSubtitle: true, subtitle: r.invalidUuid.subtitle, icon: { type: 'status', status: 'error' } })) : stage === 'tooMany' ? (_jsx(PrizmaTitle, { variant: "centered", title: r.tooMany.title, showSubtitle: true, subtitle: r.tooMany.subtitle, icon: { type: 'status', status: 'error' } })) : (_jsx(PrizmaTitle, { variant: "centered", title: r.sent.title, showSubtitle: true, subtitle: `${r.sent.toPrefix} ${country?.dialCode ?? ''} ${r.phoneValue}`.trim(), icon: { type: 'status', status: 'success' } })), invalid ? null : stage === 'tooMany' ? (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", onClick: () => onAction?.({ type: 'tertiary', screenId }), children: r.tooMany.changeLabel })) : stage === 'sent' || stage === 'resent' ? (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", disabled: true, children: r.sent.resendIn })) : (_jsx(PrizmaButton, { variant: "tertiary-link", size: "L", onClick: () => onAction?.({ type: 'cta', screenId }), children: r.sent.resend }))] })) : null] }), _jsxs("div", { className: "prizma-screen-layout__band demo-screens-redirect__band", children: [desktop && !verdict ? (_jsxs(_Fragment, { children: [_jsx(PrizmaDisclaimer, { text: r.orLabel }), _jsx("div", { className: "prizma-screen-layout__band__ctas", children: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: r.desktopLabel }) })] })) : null, _jsx("div", { className: "prizma-screen-layout__band__tag", children: _jsx(PrizmaTag, { label: strings.verifiedLabel }) })] })] })] }));
36
37
  });
37
38
  DemoScreensRedirectScreen.displayName = 'DemoScreensRedirectScreen';
38
39
  export default DemoScreensRedirectScreen;
@@ -150,6 +150,11 @@ export interface DemoScreensStrings {
150
150
  subtitle: string;
151
151
  changeLabel: string;
152
152
  };
153
+ /** The link's UUID was rejected: the same copy for Flows and Workflows. */
154
+ invalidUuid: {
155
+ title: string;
156
+ subtitle: string;
157
+ };
153
158
  };
154
159
  /** WEB · `demo_2` — the front door: language, the wordmark, one CTA. */
155
160
  start: {
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { type PrizmaReviewScreenProps } from './ReviewScreen';
3
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
4
+ import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
5
+ import './ScreenLayout.css';
6
+ export interface DigitalIdUploadErrorScreenProps extends Omit<PrizmaReviewScreenProps, 'stage' | 'title' | 'subtitle' | 'successTitle' | 'analyzingLabel' | 'primaryLabel' | 'secondaryLabel' | 'verifiedLabel' | 'children'> {
7
+ /** Module copy — this screen reads the `error` slice. */
8
+ strings: DigitalIdUploadStrings;
9
+ screenId?: string;
10
+ overrides?: PrizmaScreenOverrides;
11
+ onAction?: PrizmaScreenActionHandler;
12
+ }
13
+ /**
14
+ * Digital ID Upload — the uploaded file was rejected, built on the
15
+ * `PrizmaReviewScreen` archetype's `error` stage (GUIDELINES.md §6-H). Figma:
16
+ * `Upload Digital ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section,
17
+ * `Error` frame (node 25874:11957).
18
+ *
19
+ * Kept separate from `DigitalIdUploadReviewScreen` (the confirm flow) rather
20
+ * than folded into it as a fourth stage of that wrapper — same split Document
21
+ * Capture draws between its confirm screens and
22
+ * `DocumentCaptureGenericErrorScreen`, even though here both wrappers happen
23
+ * to share the same archetype under the hood. The media is
24
+ * `PrizmaCaptureDigitalId state="error"` (red 4px border) — the same managed
25
+ * component every other stage uses, not a bespoke verdict illustration — and
26
+ * the header/footer are hidden exactly like `analyzing`/`success`
27
+ * (`centeredWhenNoNav`, since this Figma frame draws the identical symmetric
28
+ * header/media/CTA skeleton).
29
+ */
30
+ export declare const DigitalIdUploadErrorScreen: React.ForwardRefExoticComponent<DigitalIdUploadErrorScreenProps & React.RefAttributes<HTMLDivElement>>;
31
+ export default DigitalIdUploadErrorScreen;
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
5
+ import { PrizmaReviewScreen } from './ReviewScreen';
6
+ import './ScreenLayout.css';
7
+ /**
8
+ * Digital ID Upload — the uploaded file was rejected, built on the
9
+ * `PrizmaReviewScreen` archetype's `error` stage (GUIDELINES.md §6-H). Figma:
10
+ * `Upload Digital ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section,
11
+ * `Error` frame (node 25874:11957).
12
+ *
13
+ * Kept separate from `DigitalIdUploadReviewScreen` (the confirm flow) rather
14
+ * than folded into it as a fourth stage of that wrapper — same split Document
15
+ * Capture draws between its confirm screens and
16
+ * `DocumentCaptureGenericErrorScreen`, even though here both wrappers happen
17
+ * to share the same archetype under the hood. The media is
18
+ * `PrizmaCaptureDigitalId state="error"` (red 4px border) — the same managed
19
+ * component every other stage uses, not a bespoke verdict illustration — and
20
+ * the header/footer are hidden exactly like `analyzing`/`success`
21
+ * (`centeredWhenNoNav`, since this Figma frame draws the identical symmetric
22
+ * header/media/CTA skeleton).
23
+ */
24
+ export const DigitalIdUploadErrorScreen = forwardRef(({ strings, screenId = 'digital-id-upload-error', showHeader = false, showFooter = false, overrides, onAction, ...shell }, ref) => (_jsx(PrizmaReviewScreen, { ref: ref, stage: "error", title: strings.error.title, subtitle: strings.error.subtitle, primaryLabel: strings.error.ctaLabel, centeredWhenNoNav: true, verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, showHeader: showHeader, showFooter: showFooter, screenId: screenId, overrides: overrides, onAction: onAction, ...shell, children: _jsx(PrizmaCaptureDigitalId, { state: "error" }) })));
25
+ DigitalIdUploadErrorScreen.displayName = 'DigitalIdUploadErrorScreen';
26
+ export default DigitalIdUploadErrorScreen;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { type PrizmaResultScreenProps } from './ResultScreen';
3
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
4
+ import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
5
+ import './ScreenLayout.css';
6
+ export interface DigitalIdUploadFileTooLargeScreenProps extends Omit<PrizmaResultScreenProps, 'status' | 'title' | 'subtitle' | 'ctaLabel' | 'verifiedLabel' | 'navLabel'> {
7
+ /** Module copy — this screen reads the `fileTooLarge` slice. */
8
+ strings: DigitalIdUploadStrings;
9
+ screenId?: string;
10
+ overrides?: PrizmaScreenOverrides;
11
+ onAction?: PrizmaScreenActionHandler;
12
+ }
13
+ /**
14
+ * Digital ID Upload — the selected file exceeds the size limit, built on the
15
+ * `PrizmaResultScreen` archetype (GUIDELINES.md §6-F). Figma: `Upload Digital
16
+ * ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section, `File Limit Error`
17
+ * frame (node 26083:3981).
18
+ *
19
+ * Unlike `DigitalIdUploadErrorScreen` (the rejected-document verdict, built on
20
+ * the Review archetype because it reuses `PrizmaCaptureDigitalId`), this
21
+ * screen never had a file to show — the size check runs before anything
22
+ * uploads — so Figma draws the plain F recipe: status icon + title + subtitle
23
+ * centred in the full height, one CTA pinned near the bottom. No media slot,
24
+ * no card, nothing to reuse from the capture component.
25
+ */
26
+ export declare const DigitalIdUploadFileTooLargeScreen: React.ForwardRefExoticComponent<DigitalIdUploadFileTooLargeScreenProps & React.RefAttributes<HTMLDivElement>>;
27
+ export default DigitalIdUploadFileTooLargeScreen;
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { PrizmaResultScreen } from './ResultScreen';
5
+ import './ScreenLayout.css';
6
+ /**
7
+ * Digital ID Upload — the selected file exceeds the size limit, built on the
8
+ * `PrizmaResultScreen` archetype (GUIDELINES.md §6-F). Figma: `Upload Digital
9
+ * ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section, `File Limit Error`
10
+ * frame (node 26083:3981).
11
+ *
12
+ * Unlike `DigitalIdUploadErrorScreen` (the rejected-document verdict, built on
13
+ * the Review archetype because it reuses `PrizmaCaptureDigitalId`), this
14
+ * screen never had a file to show — the size check runs before anything
15
+ * uploads — so Figma draws the plain F recipe: status icon + title + subtitle
16
+ * centred in the full height, one CTA pinned near the bottom. No media slot,
17
+ * no card, nothing to reuse from the capture component.
18
+ */
19
+ export const DigitalIdUploadFileTooLargeScreen = forwardRef(({ strings, screenId = 'digital-id-upload-file-too-large', showHeader = false, showFooter = false, overrides, onAction, ...shell }, ref) => (_jsx(PrizmaResultScreen, { ref: ref, status: "error", title: strings.fileTooLarge.title, subtitle: strings.fileTooLarge.subtitle, ctaLabel: strings.fileTooLarge.ctaLabel, verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, showHeader: showHeader, showFooter: showFooter, screenId: screenId, overrides: overrides, onAction: onAction, ...shell })));
20
+ DigitalIdUploadFileTooLargeScreen.displayName = 'DigitalIdUploadFileTooLargeScreen';
21
+ export default DigitalIdUploadFileTooLargeScreen;
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { type PrizmaReviewScreenProps } from './ReviewScreen';
3
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
4
+ import type { DigitalIdUploadConfirmStage, DigitalIdUploadStrings } from './DigitalIdUploadStrings';
5
+ import './ScreenLayout.css';
6
+ export interface DigitalIdUploadReviewScreenProps extends Omit<PrizmaReviewScreenProps, 'title' | 'subtitle' | 'successTitle' | 'analyzingLabel' | 'primaryLabel' | 'secondaryLabel' | 'verifiedLabel' | 'children' | 'stage'> {
7
+ /** Module copy — this screen reads the `review` slice. */
8
+ strings: DigitalIdUploadStrings;
9
+ /** Which stage of the confirm flow to render. Default `review`. */
10
+ stage?: DigitalIdUploadConfirmStage;
11
+ /** The uploaded file's name, shown under the card on `review` only. Not
12
+ * copy — it is runtime data from the picker, so it stays out of
13
+ * `strings` (same contract as `DocumentCaptureConfirmUploadScreen`). */
14
+ filename?: string;
15
+ /** Loading-bar progress on `analyzing`, 0–100. */
16
+ progress?: number;
17
+ screenId?: string;
18
+ overrides?: PrizmaScreenOverrides;
19
+ onAction?: PrizmaScreenActionHandler;
20
+ }
21
+ /**
22
+ * Digital ID Upload — review / analyzing / success, built on the
23
+ * `PrizmaReviewScreen` archetype (GUIDELINES.md §6-H). Figma: `Upload Digital
24
+ * ID` file (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section —
25
+ * `Review Document` / `Analyzing` / `Success` (nodes 25351:14725/6/7).
26
+ *
27
+ * The media stage is Core's `PrizmaCaptureDigitalId` across all three stages
28
+ * — its own state enum (`review` / `analyzing` / `success`) maps directly
29
+ * onto the archetype's stage axis, so it already owns the border treatment
30
+ * (neutral on review, green 4px on analyzing/success), the scan-flash sweep
31
+ * and the filename row. Nothing is hand-built here, unlike
32
+ * `DocumentCaptureConfirmUploadScreen`'s bespoke file-card — Core ships a
33
+ * purpose-built component for this module.
34
+ *
35
+ * Header/footer visibility is genuinely per-stage in this Figma (logo nav +
36
+ * verified tag show on `review`, both are absent on `analyzing` and
37
+ * `success`) — not a layout choice this file invents, just the existing
38
+ * `showHeader`/`showFooter` chrome knobs (owner rule 2026-08-18: header and
39
+ * footer are independently controlled) applied per stage.
40
+ *
41
+ * Always opts into the archetype's `centeredWhenNoNav` — it only takes effect
42
+ * while the nav is hidden (`analyzing`/`success` here), where this Figma
43
+ * draws the header + media as one group centred with equal space above and
44
+ * below it, not a pinned header (see ReviewScreen.tsx for the mechanics).
45
+ * `review` always shows its own nav, so the flag is a no-op there, and the
46
+ * default `false` leaves Document Capture's existing analyzing/success
47
+ * screens byte-for-byte unchanged (neither ever hides the nav here).
48
+ *
49
+ * GAP (report, not workaround — README rule 2): Figma's `Success` section
50
+ * also shows a subtitle ("Let's continue") under the success title, but the
51
+ * shared `PrizmaReviewScreen` archetype only renders a subtitle on
52
+ * `stage="review"` — every other current consumer's success state has none.
53
+ * Left unset here pending an owner call on whether to extend the shared
54
+ * archetype with a `successSubtitle` slot.
55
+ */
56
+ export declare const DigitalIdUploadReviewScreen: React.ForwardRefExoticComponent<DigitalIdUploadReviewScreenProps & React.RefAttributes<HTMLDivElement>>;
57
+ export default DigitalIdUploadReviewScreen;
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
5
+ import { PrizmaReviewScreen } from './ReviewScreen';
6
+ import './ScreenLayout.css';
7
+ /**
8
+ * Digital ID Upload — review / analyzing / success, built on the
9
+ * `PrizmaReviewScreen` archetype (GUIDELINES.md §6-H). Figma: `Upload Digital
10
+ * ID` file (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section —
11
+ * `Review Document` / `Analyzing` / `Success` (nodes 25351:14725/6/7).
12
+ *
13
+ * The media stage is Core's `PrizmaCaptureDigitalId` across all three stages
14
+ * — its own state enum (`review` / `analyzing` / `success`) maps directly
15
+ * onto the archetype's stage axis, so it already owns the border treatment
16
+ * (neutral on review, green 4px on analyzing/success), the scan-flash sweep
17
+ * and the filename row. Nothing is hand-built here, unlike
18
+ * `DocumentCaptureConfirmUploadScreen`'s bespoke file-card — Core ships a
19
+ * purpose-built component for this module.
20
+ *
21
+ * Header/footer visibility is genuinely per-stage in this Figma (logo nav +
22
+ * verified tag show on `review`, both are absent on `analyzing` and
23
+ * `success`) — not a layout choice this file invents, just the existing
24
+ * `showHeader`/`showFooter` chrome knobs (owner rule 2026-08-18: header and
25
+ * footer are independently controlled) applied per stage.
26
+ *
27
+ * Always opts into the archetype's `centeredWhenNoNav` — it only takes effect
28
+ * while the nav is hidden (`analyzing`/`success` here), where this Figma
29
+ * draws the header + media as one group centred with equal space above and
30
+ * below it, not a pinned header (see ReviewScreen.tsx for the mechanics).
31
+ * `review` always shows its own nav, so the flag is a no-op there, and the
32
+ * default `false` leaves Document Capture's existing analyzing/success
33
+ * screens byte-for-byte unchanged (neither ever hides the nav here).
34
+ *
35
+ * GAP (report, not workaround — README rule 2): Figma's `Success` section
36
+ * also shows a subtitle ("Let's continue") under the success title, but the
37
+ * shared `PrizmaReviewScreen` archetype only renders a subtitle on
38
+ * `stage="review"` — every other current consumer's success state has none.
39
+ * Left unset here pending an owner call on whether to extend the shared
40
+ * archetype with a `successSubtitle` slot.
41
+ */
42
+ export const DigitalIdUploadReviewScreen = forwardRef(({ strings, stage = 'review', filename, progress = 45, showHeader = stage === 'review', showFooter = stage === 'review', screenId = `digital-id-upload-${stage}`, overrides, onAction, ...shell }, ref) => (_jsx(PrizmaReviewScreen, { ref: ref, stage: stage, title: strings.review.title, subtitle: strings.review.subtitle, successTitle: strings.review.successTitle, analyzingLabel: strings.review.analyzingLabel, centeredWhenNoNav: true, progress: progress, primaryLabel: strings.review.ctaLabel, secondaryLabel: strings.review.replaceLabel, verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, showHeader: showHeader, showFooter: showFooter, screenId: screenId, overrides: overrides, onAction: onAction, ...shell, children: _jsx(PrizmaCaptureDigitalId, { state: stage, filename: filename }) })));
43
+ DigitalIdUploadReviewScreen.displayName = 'DigitalIdUploadReviewScreen';
44
+ export default DigitalIdUploadReviewScreen;
@@ -0,0 +1,64 @@
1
+ /** The three stages the confirm flow's screen shares — matches
2
+ * `PrizmaReviewScreen`'s own `PrizmaReviewStage` (ReviewScreen.tsx). Kept as
3
+ * a separate module-scoped type rather than importing it, same convention as
4
+ * `DocumentCaptureConfirmStage` (DocumentCaptureStrings.ts). */
5
+ export type DigitalIdUploadConfirmStage = 'review' | 'analyzing' | 'success';
6
+ export interface DigitalIdUploadStrings {
7
+ /** Accessible name for the logo nav region (i18n — no baked-in English). */
8
+ navLabel?: string;
9
+ /** "verified by" attribution copy for the footer tag. */
10
+ verifiedLabel: string;
11
+ /** `Tutorial Screen` (node 25351:14722). */
12
+ tutorial: {
13
+ title: string;
14
+ subtitle?: string;
15
+ /** "Upload PDF" */
16
+ ctaLabel: string;
17
+ };
18
+ /** `Review Document` / `Analyzing` / `Success` (nodes
19
+ * 25351:14725/14726/14727) — one screen, three stages. */
20
+ review: {
21
+ /** `review` title ("Review document"). */
22
+ title: string;
23
+ /** `review` description. Figma draws no subtitle on `analyzing` or
24
+ * `success` — the shared `PrizmaReviewScreen` archetype already only
25
+ * shows one on `review`, so this needs no per-stage handling here. */
26
+ subtitle?: string;
27
+ /** Loading-bar caption on `analyzing` ("Analyzing.."). */
28
+ analyzingLabel: string;
29
+ /** H2 on `success` ("Successfully processed!"). */
30
+ successTitle: string;
31
+ /** Secondary CTA on `review` ("Replace file"). */
32
+ replaceLabel: string;
33
+ /** Primary CTA on `review` / `success` ("Continue"). */
34
+ ctaLabel: string;
35
+ };
36
+ /** `Errors` section, `Error` frame (node 25874:11957) — the uploaded file
37
+ * itself was rejected (wrong document type). Built on the SAME
38
+ * `PrizmaReviewScreen` archetype as `review`, stage `"error"`: the card
39
+ * reuses `PrizmaCaptureDigitalId state="error"` (red 4px border), not a
40
+ * generic archetype-F verdict screen (DigitalIdUploadErrorScreen.tsx). */
41
+ error: {
42
+ /** "ID type is not accepted" */
43
+ title: string;
44
+ /** "Please try scanning a different document" */
45
+ subtitle?: string;
46
+ /** "Scan your ID" */
47
+ ctaLabel: string;
48
+ };
49
+ /** `Errors` section, `File Limit Error` frame (node 26083:3981) — the file
50
+ * was never uploaded at all (client-side size check), so there is no
51
+ * rejected document to show. Built on Archetype F (`PrizmaResultScreen`,
52
+ * ResultScreen.tsx) rather than the review archetype `error` uses above —
53
+ * Figma centres the status + title + subtitle in the full available
54
+ * height with no media stage at all, exactly F's shape, not H's
55
+ * header-above-a-card one (DigitalIdUploadFileTooLargeScreen.tsx). */
56
+ fileTooLarge: {
57
+ /** "File is too large" */
58
+ title: string;
59
+ /** "The selected file is larger than 5 MB, please upload a smaller one" */
60
+ subtitle?: string;
61
+ /** "Choose another file" */
62
+ ctaLabel: string;
63
+ };
64
+ }
@@ -0,0 +1,19 @@
1
+ // Digital ID Upload module — copy contract.
2
+ //
3
+ // Every Digital ID Upload screen receives the SAME `strings:
4
+ // DigitalIdUploadStrings` object (rule: all copy via props, no hardcoded
5
+ // English — GUIDELINES.md §9).
6
+ //
7
+ // Authoritative screens: the "Web Happy Path - Light Mode" purple section of
8
+ // the Upload Digital ID Figma file (wxFsHRvllern4VnjRqM4JO, node 25351:14721)
9
+ // — covers `tutorial` and the `review` / `analyzing` / `success` stages of
10
+ // the confirm flow — plus TWO separate `Errors` sections: node 25874:11955
11
+ // (`ID type is not accepted`) and node 26083:3981 (`File Limit Error`, "File
12
+ // is too large"). Three frames of the happy-path section are NOT part of
13
+ // this contract: `1-1-1-how to verify` (a verification-method chooser shared
14
+ // with ID Capture — see IdCaptureDocumentSelectionScreen.tsx, which is one
15
+ // row short of this Figma's version), a native iOS file-browser frame (OS
16
+ // chrome, DEVIATIONS.md #DC-20 precedent), and `1-18-1-id-hold-on` (ID
17
+ // Capture's own server-side-wait screen — dropped from this module by
18
+ // product decision, not a gap to fill).
19
+ export {};
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { type PrizmaTutorialScreenProps } from './TutorialScreen';
3
+ import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
4
+ import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
5
+ import './ScreenLayout.css';
6
+ export interface DigitalIdUploadTutorialScreenProps extends Omit<PrizmaTutorialScreenProps, 'title' | 'subtitle' | 'ctaLabel' | 'illustration' | 'verifiedLabel' | 'navLabel'> {
7
+ /** Module copy — this screen reads the `tutorial` slice (+ shared labels). */
8
+ strings: DigitalIdUploadStrings;
9
+ screenId?: string;
10
+ overrides?: PrizmaScreenOverrides;
11
+ onAction?: PrizmaScreenActionHandler;
12
+ }
13
+ /**
14
+ * Digital ID Upload — tutorial, built on the `PrizmaTutorialScreen` archetype
15
+ * (GUIDELINES.md §6-A). Figma: `Upload Digital ID` file
16
+ * (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section, `Tutorial
17
+ * Screen` (node 25351:14722).
18
+ *
19
+ * The illustration slot is Core's own `PrizmaCaptureDigitalId` in its
20
+ * `tutorial` state — the Figma file names this exact instance "Capture /
21
+ * Digital ID" (node 26161:10686, Figma description: "Incode specific
22
+ * component for Digital ID module experience"), the same managed component
23
+ * already shipped as `core/platforms/web/src/CaptureDigitalId.tsx`. No module
24
+ * illustration is drawn here — the component owns its own tutorial artwork
25
+ * (`PrizmaIllustrationDigitalId`).
26
+ */
27
+ export declare const DigitalIdUploadTutorialScreen: React.ForwardRefExoticComponent<DigitalIdUploadTutorialScreenProps & React.RefAttributes<HTMLDivElement>>;
28
+ export default DigitalIdUploadTutorialScreen;
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
5
+ import { PrizmaTutorialScreen } from './TutorialScreen';
6
+ import './ScreenLayout.css';
7
+ /**
8
+ * Digital ID Upload — tutorial, built on the `PrizmaTutorialScreen` archetype
9
+ * (GUIDELINES.md §6-A). Figma: `Upload Digital ID` file
10
+ * (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section, `Tutorial
11
+ * Screen` (node 25351:14722).
12
+ *
13
+ * The illustration slot is Core's own `PrizmaCaptureDigitalId` in its
14
+ * `tutorial` state — the Figma file names this exact instance "Capture /
15
+ * Digital ID" (node 26161:10686, Figma description: "Incode specific
16
+ * component for Digital ID module experience"), the same managed component
17
+ * already shipped as `core/platforms/web/src/CaptureDigitalId.tsx`. No module
18
+ * illustration is drawn here — the component owns its own tutorial artwork
19
+ * (`PrizmaIllustrationDigitalId`).
20
+ */
21
+ export const DigitalIdUploadTutorialScreen = forwardRef(({ strings, screenId = 'digital-id-upload-tutorial', overrides, onAction, ...shell }, ref) => (_jsx(PrizmaTutorialScreen, { ref: ref, title: strings.tutorial.title, subtitle: strings.tutorial.subtitle, ctaLabel: strings.tutorial.ctaLabel, illustration: _jsx(PrizmaCaptureDigitalId, { state: "tutorial" }), verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, screenId: screenId, overrides: overrides, onAction: onAction, ...shell })));
22
+ DigitalIdUploadTutorialScreen.displayName = 'DigitalIdUploadTutorialScreen';
23
+ export default DigitalIdUploadTutorialScreen;
@@ -6,7 +6,7 @@ import './DocumentCaptureLayout.css';
6
6
  *
7
7
  * WHY IT LIVES IN THE MODULE LAYER: `prizma-core-web` ships
8
8
  * `PrizmaIllustrationSelfie`, `…IdTutorial`, `…IdIntro`, `…IdFlip`,
9
- * `…IdHint`, `…IdFeedback`, `…NfcScan`, `…NfcIssue`, `…Geolocation`,
9
+ * `…IdHint`, `…IdFeedback`, `…NfcScan`, `…Geolocation`,
10
10
  * `…DigitalId` and `…Avatar` — there is NO document / proof-of-address
11
11
  * illustration. GUIDELINES.md §10 is the standing asset rule for that gap
12
12
  * ("Illustrations…: inline SVG React components (Figma-sourced), tintable via
@@ -56,6 +56,13 @@ export interface EkybAddressDetailsScreenProps extends Omit<PrizmaFormScreenProp
56
56
  * segment 2 solid, segment 3 grey) is Core's `PrizmaStepper` at
57
57
  * `currentState={2}`, composed into the archetype's `progress` slot. This is
58
58
  * step 2 of 3.
59
+ *
60
+ * `emptyError` is Continue pressed with the fields still empty (Elena,
61
+ * 2026-09-30, GUIDELINES §6-E empty-submit rule; precedent `FormsFieldScreen`'s
62
+ * `emptyError`): every field renders empty, the five REQUIRED ones (State
63
+ * included) in Core's `error` state with `requiredError` and no placeholder,
64
+ * Address line 2 unflagged (optional, DEVIATIONS #EKC-6's rule), and Continue
65
+ * disabled. `empty` keeps Continue enabled so the press can happen.
59
66
  */
60
67
  export declare const EkybAddressDetailsScreen: React.ForwardRefExoticComponent<EkybAddressDetailsScreenProps & React.RefAttributes<HTMLDivElement>>;
61
68
  export default EkybAddressDetailsScreen;
@@ -46,22 +46,40 @@ import './ScreenLayout.css';
46
46
  * segment 2 solid, segment 3 grey) is Core's `PrizmaStepper` at
47
47
  * `currentState={2}`, composed into the archetype's `progress` slot. This is
48
48
  * step 2 of 3.
49
+ *
50
+ * `emptyError` is Continue pressed with the fields still empty (Elena,
51
+ * 2026-09-30, GUIDELINES §6-E empty-submit rule; precedent `FormsFieldScreen`'s
52
+ * `emptyError`): every field renders empty, the five REQUIRED ones (State
53
+ * included) in Core's `error` state with `requiredError` and no placeholder,
54
+ * Address line 2 unflagged (optional, DEVIATIONS #EKC-6's rule), and Continue
55
+ * disabled. `empty` keeps Continue enabled so the press can happen.
49
56
  */
50
- export const EkybAddressDetailsScreen = forwardRef(({ strings, state = 'empty', values, states = [], screenId = `ekyb-address-${state}`, className, overrides, onAction, ...shell }, ref) => {
57
+ export const EkybAddressDetailsScreen = forwardRef(({ strings, state = 'empty', values: valuesProp, states = [], screenId = `ekyb-address-${state}`, ctaDisabled, className, overrides, onAction, ...shell }, ref) => {
51
58
  const copy = strings.address;
59
+ const emptyError = state === 'emptyError';
60
+ const values = emptyError ? undefined : valuesProp;
61
+ // Core's own error treatment, spread AFTER each required field's own
62
+ // placeholder so the error state shows none (the `FormsFieldScreen`
63
+ // precedent). Address line 2 never receives it.
64
+ const missing = emptyError
65
+ ? { error: true, errorText: strings.requiredError, placeholder: undefined }
66
+ : {};
52
67
  return (_jsxs(PrizmaFormScreen, { ref: ref, className: ['ekyb-address', className].filter(Boolean).join(' '),
53
68
  /* The archetype's own scrolling field stack — the six-field column is
54
69
  548 tall against a middle that cannot be. No module CSS. */
55
70
  scrollFields: true,
56
71
  /* Step 2 of 3. `showIcons={false}`: the eKYB bar is a bare 5px rail. */
57
- progress: _jsx(PrizmaStepper, { steps: 3, currentState: 2, showIcons: false, "aria-label": strings.stepperLabel }), title: copy.title, subtitle: copy.subtitle, ctaLabel: copy.ctaLabel, linkContent: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: strings.backLabel }), verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, screenId: screenId, overrides: { align: overrides?.align ?? 'left', logo: overrides?.logo }, onAction: onAction,
58
- /* Exploration ekyb-desktop: on a wide frame only State + Postal code
59
- share a row (Figma 6407:43637); the four text fields above span the
60
- column. On the phone nothing changes. */
61
- responsive: true, ...shell, children: [_jsx(PrizmaTextField, { label: copy.street.label, placeholder: copy.street.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.street ?? '' }), _jsx(PrizmaTextField, { label: copy.houseNumber.label, placeholder: copy.houseNumber.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.houseNumber ?? '' }), _jsx(PrizmaTextField, { label: copy.addressLine2.label, placeholder: copy.addressLine2.placeholder, autoComplete: "off", defaultValue: values?.addressLine2 ?? '' }), _jsx(PrizmaTextField, { label: copy.city.label, placeholder: copy.city.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.city ?? '' }), _jsxs(PrizmaFormRow, { children: [_jsx(PrizmaDropdown, { label: copy.state.label, placeholder: copy.state.placeholder, required: true, requiredHint: strings.requiredHint, options: states,
72
+ progress: _jsx(PrizmaStepper, { steps: 3, currentState: 2, showIcons: false, "aria-label": strings.stepperLabel }), title: copy.title, subtitle: copy.subtitle, ctaLabel: copy.ctaLabel,
73
+ /* Disabled only after the empty submit; `empty` keeps it enabled. */
74
+ ctaDisabled: emptyError || ctaDisabled, linkContent: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: strings.backLabel }), verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, screenId: screenId, overrides: { align: overrides?.align ?? 'left', logo: overrides?.logo }, onAction: onAction,
75
+ /* Exploration ekyb-desktop: on a wide frame the fields pair up in
76
+ three rows, Street + House number, Address line 2 + City (Elena,
77
+ 2026-09-28), and State + Postal code (Figma 6407:43637). On the
78
+ phone nothing changes. */
79
+ responsive: true, ...shell, children: [_jsxs(PrizmaFormRow, { children: [_jsx(PrizmaTextField, { label: copy.street.label, placeholder: copy.street.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.street ?? '' }), _jsx(PrizmaTextField, { label: copy.houseNumber.label, placeholder: copy.houseNumber.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.houseNumber ?? '' })] }), _jsxs(PrizmaFormRow, { children: [_jsx(PrizmaTextField, { label: copy.addressLine2.label, placeholder: copy.addressLine2.placeholder, autoComplete: "off", defaultValue: values?.addressLine2 ?? '' }), _jsx(PrizmaTextField, { label: copy.city.label, placeholder: copy.city.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.city ?? '' })] }), _jsxs(PrizmaFormRow, { children: [_jsx(PrizmaDropdown, { label: copy.state.label, placeholder: copy.state.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, options: states,
62
80
  /* Both sections draw the placeholder unless the host supplies a
63
81
  value — see the docstring note on 6340:38197. */
64
- defaultValue: values?.state ?? null }), _jsx(PrizmaTextField, { label: copy.postalCode.label, placeholder: copy.postalCode.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.postalCode ?? '' })] })] }));
82
+ defaultValue: values?.state ?? null }), _jsx(PrizmaTextField, { label: copy.postalCode.label, placeholder: copy.postalCode.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.postalCode ?? '' })] })] }));
65
83
  });
66
84
  EkybAddressDetailsScreen.displayName = 'EkybAddressDetailsScreen';
67
85
  export default EkybAddressDetailsScreen;
@@ -50,6 +50,12 @@ export interface EkybBusinessDetailsScreenProps extends Omit<PrizmaFormScreenPro
50
50
  * bar is at `currentState="Start"`: segment 1 filled, segments 2 and 3 grey,
51
51
  * exactly what 5919:68599 renders. Both offsets around it live in
52
52
  * `ScreenLayout.css`, never here.
53
+ *
54
+ * `emptyError` is Continue pressed with the fields still empty (Elena,
55
+ * 2026-09-30, GUIDELINES §6-E empty-submit rule; precedent `FormsFieldScreen`'s
56
+ * `emptyError`): both REQUIRED fields render empty in Core's `error` state with
57
+ * `requiredError` under them, and Continue is disabled. `empty` keeps Continue
58
+ * enabled so the press can happen.
53
59
  */
54
60
  export declare const EkybBusinessDetailsScreen: React.ForwardRefExoticComponent<EkybBusinessDetailsScreenProps & React.RefAttributes<HTMLDivElement>>;
55
61
  export default EkybBusinessDetailsScreen;
@@ -4,7 +4,7 @@ import { forwardRef } from 'react';
4
4
  import { PrizmaTextField } from '@incodetech/prizma-core-web/text-field';
5
5
  import { PrizmaButton } from '@incodetech/prizma-core-web/button';
6
6
  import { PrizmaStepper } from '@incodetech/prizma-core-web/stepper';
7
- import { PrizmaFormScreen, PrizmaFormRow } from './FormScreen';
7
+ import { PrizmaFormScreen } from './FormScreen';
8
8
  import './ScreenLayout.css';
9
9
  /**
10
10
  * eKYB — step 1 of the wizard, the company's identity, built on the Form
@@ -42,19 +42,36 @@ import './ScreenLayout.css';
42
42
  * bar is at `currentState="Start"`: segment 1 filled, segments 2 and 3 grey,
43
43
  * exactly what 5919:68599 renders. Both offsets around it live in
44
44
  * `ScreenLayout.css`, never here.
45
+ *
46
+ * `emptyError` is Continue pressed with the fields still empty (Elena,
47
+ * 2026-09-30, GUIDELINES §6-E empty-submit rule; precedent `FormsFieldScreen`'s
48
+ * `emptyError`): both REQUIRED fields render empty in Core's `error` state with
49
+ * `requiredError` under them, and Continue is disabled. `empty` keeps Continue
50
+ * enabled so the press can happen.
45
51
  */
46
- export const EkybBusinessDetailsScreen = forwardRef(({ strings, state = 'empty', values, screenId = `ekyb-business-${state}`, overrides, onAction, ...shell }, ref) => {
52
+ export const EkybBusinessDetailsScreen = forwardRef(({ strings, state = 'empty', values: valuesProp, screenId = `ekyb-business-${state}`, ctaDisabled, overrides, onAction, ...shell }, ref) => {
47
53
  const copy = strings.business;
48
- return (_jsx(PrizmaFormScreen, { ref: ref,
54
+ const emptyError = state === 'emptyError';
55
+ const values = emptyError ? undefined : valuesProp;
56
+ // Core's own error treatment, spread onto the REQUIRED fields only; the
57
+ // error state shows no placeholder (the `FormsFieldScreen` precedent).
58
+ const missing = emptyError
59
+ ? { error: true, errorText: strings.requiredError, placeholder: undefined }
60
+ : {};
61
+ return (_jsxs(PrizmaFormScreen, { ref: ref,
49
62
  /* Step 1 of 3. `showIcons={false}` because the eKYB frames draw the bar
50
63
  as a bare 5px rail with no glyph row. */
51
- progress: _jsx(PrizmaStepper, { steps: 3, currentState: "Start", showIcons: false, "aria-label": strings.stepperLabel }), title: copy.title, subtitle: copy.subtitle, ctaLabel: copy.ctaLabel, linkContent: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: strings.backLabel }), verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, screenId: screenId,
64
+ progress: _jsx(PrizmaStepper, { steps: 3, currentState: "Start", showIcons: false, "aria-label": strings.stepperLabel }), title: copy.title, subtitle: copy.subtitle, ctaLabel: copy.ctaLabel,
65
+ /* Disabled only after the empty submit; `empty` keeps it enabled. */
66
+ ctaDisabled: emptyError || ctaDisabled, linkContent: _jsx(PrizmaButton, { variant: "secondary", size: "L", onClick: () => onAction?.({ type: 'secondary', screenId }), children: strings.backLabel }), verifiedLabel: strings.verifiedLabel, navLabel: strings.navLabel, screenId: screenId,
52
67
  /* Left-aligned title block, the alignment every eKYB frame draws; a host
53
68
  `align` still wins (#GEO-2). */
54
69
  overrides: { align: overrides?.align ?? 'left', logo: overrides?.logo }, onAction: onAction,
55
70
  /* Exploration ekyb-desktop: on a tablet or desktop frame the two
56
- fields share a row; on the phone nothing changes. */
57
- responsive: true, ...shell, children: _jsxs(PrizmaFormRow, { children: [_jsx(PrizmaTextField, { label: copy.businessName.label, placeholder: copy.businessName.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.businessName ?? '' }), _jsx(PrizmaTextField, { label: copy.taxId.label, placeholder: copy.taxId.placeholder, required: true, requiredHint: strings.requiredHint, autoComplete: "off", defaultValue: values?.taxId ?? '' })] }) }));
71
+ fields stay on two rows, each spanning the column (Elena,
72
+ 2026-09-28); `responsive` still pairs Continue and Back. On the
73
+ phone nothing changes. */
74
+ responsive: true, ...shell, children: [_jsx(PrizmaTextField, { label: copy.businessName.label, placeholder: copy.businessName.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.businessName ?? '' }), _jsx(PrizmaTextField, { label: copy.taxId.label, placeholder: copy.taxId.placeholder, required: true, requiredHint: strings.requiredHint, ...missing, autoComplete: "off", defaultValue: values?.taxId ?? '' })] }));
58
75
  });
59
76
  EkybBusinessDetailsScreen.displayName = 'EkybBusinessDetailsScreen';
60
77
  export default EkybBusinessDetailsScreen;
@@ -39,14 +39,22 @@ export interface EkybCountryScreenProps extends Omit<PrizmaFormScreenProps, 'tit
39
39
  * live interaction) — the same mechanism Phone Input's `countryCode` and
40
40
  * CURP's `Gene.dropdown` sections use. The search bar Figma draws inside the
41
41
  * menu is Core's own `searchable`.
42
- * 3. The closed field and the menu row are DIFFERENT faces of one option:
43
- * 5707:54174 draws "🇺🇸 United States" in the field while the rows read
44
- * "🇺🇸 +1 United States". That is Core's `PrizmaDropdownOption.fieldLabel`,
45
- * so nothing is hand-composed. The flag travels inside the label text
46
- * because Core still ships no country-flag primitive (#PI-3).
42
+ * 3. Menu rows and the closed field read the same flag + "United States",
43
+ * no dial code. Figma 5707:54174 draws the rows with Phone Input's "+1"
44
+ * prefixes, dropped by the owner (Elena, 2026-09-28) because a country of
45
+ * registration has no phone prefix. The flag is Core's raster in the
46
+ * dropdown's leading slot, not an emoji in the label (Elena, 2026-10-23;
47
+ * #PI-3, the WatchlistBusinessFormScreen precedent).
47
48
  *
48
49
  * This page is the only eKYB form page with NO "Back" secondary and NO Stepper —
49
50
  * it is step 0, before the three-step wizard starts.
51
+ *
52
+ * `emptyError` is Continue pressed with no country chosen (Elena, 2026-09-30,
53
+ * GUIDELINES §6-E empty-submit rule; precedent `FormsFieldScreen`'s
54
+ * `emptyError`): the dropdown renders empty, with no placeholder, in Core's
55
+ * `error` state with `requiredError` under it, and Continue is disabled. The
56
+ * field draws no `*`, but it is the page's only input and the flow cannot go on
57
+ * without it, so it is treated as required. `empty` keeps Continue enabled.
50
58
  */
51
59
  export declare const EkybCountryScreen: React.ForwardRefExoticComponent<EkybCountryScreenProps & React.RefAttributes<HTMLDivElement>>;
52
60
  export default EkybCountryScreen;