@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.
- package/dist/BiometricConsentScreen.d.ts +95 -0
- package/dist/BiometricConsentScreen.js +91 -0
- package/dist/BiometricConsentStrings.d.ts +84 -0
- package/dist/BiometricConsentStrings.js +31 -0
- package/dist/CaptureScreen.d.ts +13 -0
- package/dist/CaptureScreen.js +2 -2
- package/dist/CurpEnterScreen.d.ts +7 -0
- package/dist/CurpEnterScreen.js +17 -3
- package/dist/CurpGenerateScreen.d.ts +8 -0
- package/dist/CurpGenerateScreen.js +28 -13
- package/dist/CurpLayout.css +8 -34
- package/dist/CurpStrings.d.ts +16 -2
- package/dist/DemoScreensLayout.css +16 -0
- package/dist/DemoScreensRedirectScreen.d.ts +6 -1
- package/dist/DemoScreensRedirectScreen.js +3 -2
- package/dist/DemoScreensStrings.d.ts +5 -0
- package/dist/DigitalIdUploadErrorScreen.d.ts +31 -0
- package/dist/DigitalIdUploadErrorScreen.js +26 -0
- package/dist/DigitalIdUploadFileTooLargeScreen.d.ts +27 -0
- package/dist/DigitalIdUploadFileTooLargeScreen.js +21 -0
- package/dist/DigitalIdUploadReviewScreen.d.ts +57 -0
- package/dist/DigitalIdUploadReviewScreen.js +44 -0
- package/dist/DigitalIdUploadStrings.d.ts +64 -0
- package/dist/DigitalIdUploadStrings.js +19 -0
- package/dist/DigitalIdUploadTutorialScreen.d.ts +28 -0
- package/dist/DigitalIdUploadTutorialScreen.js +23 -0
- package/dist/DocumentCaptureIllustration.d.ts +1 -1
- package/dist/EkybAddressDetailsScreen.d.ts +7 -0
- package/dist/EkybAddressDetailsScreen.js +25 -7
- package/dist/EkybBusinessDetailsScreen.d.ts +6 -0
- package/dist/EkybBusinessDetailsScreen.js +23 -6
- package/dist/EkybCountryScreen.d.ts +13 -5
- package/dist/EkybCountryScreen.js +41 -10
- package/dist/EkybOwnersScreen.d.ts +8 -0
- package/dist/EkybOwnersScreen.js +26 -3
- package/dist/EkybStrings.d.ts +32 -10
- package/dist/EkycCountryCatalog.d.ts +4 -1
- package/dist/EkycCountryCatalog.js +5 -3
- package/dist/EkycCountryFormScreen.d.ts +12 -3
- package/dist/EkycCountryFormScreen.js +28 -10
- package/dist/EkycDetailsScreen.d.ts +7 -0
- package/dist/EkycDetailsScreen.js +21 -4
- package/dist/EkycStrings.d.ts +14 -2
- package/dist/ElectronicSignatureLayout.css +6 -0
- package/dist/EmailInputStrings.d.ts +11 -1
- package/dist/EmailInputVerifyScreen.d.ts +7 -0
- package/dist/EmailInputVerifyScreen.js +17 -3
- package/dist/ErrorScreensScreen.d.ts +5 -2
- package/dist/ErrorScreensScreen.js +15 -4
- package/dist/ErrorScreensStrings.d.ts +17 -2
- package/dist/ErrorScreensStrings.js +18 -10
- package/dist/FaceCaptureCapturingScreen.d.ts +63 -0
- package/dist/FaceCaptureCapturingScreen.js +62 -2
- package/dist/FaceCaptureLayout.css +69 -4
- package/dist/FaceCaptureStrings.d.ts +23 -0
- package/dist/FaceMatchComparisonScreen.d.ts +3 -3
- package/dist/FaceMatchLayout.css +21 -12
- package/dist/FormScreen.css +30 -0
- package/dist/FormScreen.d.ts +28 -0
- package/dist/FormScreen.js +3 -2
- package/dist/FormsLongFormScreen.d.ts +8 -0
- package/dist/FormsLongFormScreen.js +34 -13
- package/dist/FormsStrings.d.ts +11 -1
- package/dist/GeolocationBrowserStepsScreen.d.ts +6 -2
- package/dist/GeolocationBrowserStepsScreen.js +7 -3
- package/dist/GeolocationStrings.d.ts +3 -0
- package/dist/IdCaptureLayout.css +205 -2
- package/dist/IdCaptureStageScreen.d.ts +47 -0
- package/dist/IdCaptureStageScreen.js +39 -3
- package/dist/IdCaptureStrings.d.ts +19 -0
- package/dist/ListScreen.d.ts +21 -0
- package/dist/ListScreen.js +7 -2
- package/dist/LoaderScreen.d.ts +7 -5
- package/dist/LoaderScreen.js +7 -5
- package/dist/LoadersStrings.d.ts +18 -5
- package/dist/OcrReviewErrorScreen.d.ts +30 -0
- package/dist/OcrReviewErrorScreen.js +24 -0
- package/dist/OcrReviewLayout.css +24 -0
- package/dist/OcrReviewLoadingScreen.d.ts +25 -0
- package/dist/OcrReviewLoadingScreen.js +19 -0
- package/dist/OcrReviewScreen.d.ts +76 -0
- package/dist/OcrReviewScreen.js +65 -0
- package/dist/OcrReviewStrings.d.ts +47 -0
- package/dist/OcrReviewStrings.js +17 -0
- package/dist/OcrReviewSuccessScreen.d.ts +30 -0
- package/dist/OcrReviewSuccessScreen.js +24 -0
- package/dist/PermissionsAllowScreen.d.ts +8 -11
- package/dist/PermissionsAllowScreen.js +8 -11
- package/dist/PermissionsAskScreen.d.ts +41 -0
- package/dist/PermissionsAskScreen.js +43 -0
- package/dist/PermissionsBrowserStepsScreen.d.ts +9 -2
- package/dist/PermissionsBrowserStepsScreen.js +12 -3
- package/dist/PermissionsLayout.css +47 -0
- package/dist/PermissionsStrings.d.ts +20 -9
- package/dist/PermissionsStrings.js +10 -4
- package/dist/PhoneInputLayout.css +10 -9
- package/dist/PhoneInputOtpScreen.d.ts +8 -0
- package/dist/PhoneInputOtpScreen.js +26 -19
- package/dist/PhoneInputStrings.d.ts +22 -4
- package/dist/PhoneInputVerifyScreen.d.ts +8 -0
- package/dist/PhoneInputVerifyScreen.js +36 -7
- package/dist/QualifiedSignatureAcceptScreen.js +6 -1
- package/dist/QualifiedSignatureDocumentScreen.d.ts +17 -10
- package/dist/QualifiedSignatureDocumentScreen.js +22 -17
- package/dist/QualifiedSignatureLayout.css +76 -0
- package/dist/QualifiedSignatureResultScreen.d.ts +16 -13
- package/dist/QualifiedSignatureResultScreen.js +17 -18
- package/dist/QualifiedSignatureStrings.d.ts +19 -2
- package/dist/ResultScreen.d.ts +8 -0
- package/dist/ResultScreen.js +14 -3
- package/dist/ReusabilityCredentialSelectionScreen.d.ts +95 -0
- package/dist/ReusabilityCredentialSelectionScreen.js +94 -0
- package/dist/ReusabilityLayout.css +241 -0
- package/dist/ReusabilityPrivacyPolicyScreen.d.ts +55 -0
- package/dist/ReusabilityPrivacyPolicyScreen.js +44 -0
- package/dist/ReusabilityStrings.d.ts +85 -0
- package/dist/ReusabilityStrings.js +37 -0
- package/dist/ReviewScreen.d.ts +38 -12
- package/dist/ReviewScreen.js +41 -8
- package/dist/ScreenLayout.css +382 -6
- package/dist/ScreenNav.css +8 -0
- package/dist/ScreenNav.d.ts +15 -2
- package/dist/ScreenNav.js +10 -3
- package/dist/VideoSelfieErrorScreen.js +1 -1
- package/dist/VideoSelfieIdCaptureScreen.d.ts +10 -3
- package/dist/VideoSelfieIdCaptureScreen.js +45 -14
- package/dist/VideoSelfieLayout.css +467 -34
- package/dist/VideoSelfieSelfieCaptureScreen.d.ts +44 -27
- package/dist/VideoSelfieSelfieCaptureScreen.js +65 -39
- package/dist/VideoSelfieSpeakScreen.js +19 -2
- package/dist/VideoSelfieStrings.d.ts +82 -13
- package/dist/VideoSelfieTurnHeadScreen.d.ts +51 -0
- package/dist/VideoSelfieTurnHeadScreen.js +66 -0
- package/dist/VideoSelfieTutorialScreen.d.ts +9 -0
- package/dist/VideoSelfieTutorialScreen.js +22 -5
- package/dist/VideoSelfieWaveScreen.d.ts +53 -0
- package/dist/VideoSelfieWaveScreen.js +62 -0
- package/dist/ViewfinderScreen.css +36 -0
- package/dist/WatchlistBusinessFormScreen.d.ts +11 -7
- package/dist/WatchlistBusinessFormScreen.js +27 -13
- package/dist/WatchlistBusinessStrings.d.ts +21 -7
- package/dist/flows.d.ts +8 -0
- package/dist/flows.js +17 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.js +14 -0
- package/dist/styles.css +3 -0
- package/dist/types.d.ts +3 -1
- package/package.json +79 -3
- package/samples/video-selfie-camera-wide.jpg +0 -0
- package/samples/video-selfie-room-wide.jpg +0 -0
- package/samples/video-selfie-room.png +0 -0
- package/src/BiometricConsentScreen.tsx +192 -0
- package/src/BiometricConsentStrings.ts +119 -0
- package/src/CaptureScreen.tsx +17 -0
- package/src/CurpEnterScreen.tsx +21 -4
- package/src/CurpGenerateScreen.tsx +46 -22
- package/src/CurpLayout.css +8 -34
- package/src/CurpStrings.ts +22 -2
- package/src/DemoScreensLayout.css +16 -0
- package/src/DemoScreensRedirectScreen.tsx +14 -6
- package/src/DemoScreensStrings.ts +5 -0
- package/src/DigitalIdUploadErrorScreen.tsx +83 -0
- package/src/DigitalIdUploadFileTooLargeScreen.tsx +67 -0
- package/src/DigitalIdUploadReviewScreen.tsx +119 -0
- package/src/DigitalIdUploadStrings.ts +88 -0
- package/src/DigitalIdUploadTutorialScreen.tsx +59 -0
- package/src/DocumentCaptureIllustration.tsx +1 -1
- package/src/EkybAddressDetailsScreen.tsx +32 -4
- package/src/EkybBusinessDetailsScreen.tsx +23 -5
- package/src/EkybCountryScreen.tsx +45 -7
- package/src/EkybOwnersScreen.tsx +34 -3
- package/src/EkybStrings.ts +34 -10
- package/src/EkycCountryCatalog.ts +9 -4
- package/src/EkycCountryFormScreen.tsx +51 -12
- package/src/EkycDetailsScreen.tsx +22 -1
- package/src/EkycStrings.ts +14 -2
- package/src/ElectronicSignatureLayout.css +6 -0
- package/src/EmailInputStrings.ts +12 -1
- package/src/EmailInputVerifyScreen.tsx +21 -4
- package/src/ErrorScreensScreen.tsx +15 -4
- package/src/ErrorScreensStrings.ts +37 -12
- package/src/FaceCaptureCapturingScreen.tsx +102 -13
- package/src/FaceCaptureLayout.css +69 -4
- package/src/FaceCaptureStrings.ts +24 -0
- package/src/FaceMatchComparisonScreen.tsx +3 -3
- package/src/FaceMatchLayout.css +21 -12
- package/src/FormScreen.css +30 -0
- package/src/FormScreen.tsx +34 -0
- package/src/FormsLongFormScreen.tsx +41 -13
- package/src/FormsStrings.ts +12 -1
- package/src/GeolocationBrowserStepsScreen.tsx +6 -3
- package/src/GeolocationStrings.ts +3 -0
- package/src/IdCaptureLayout.css +205 -2
- package/src/IdCaptureStageScreen.tsx +75 -0
- package/src/IdCaptureStrings.ts +19 -0
- package/src/ListScreen.tsx +58 -10
- package/src/LoaderScreen.tsx +7 -5
- package/src/LoadersStrings.ts +18 -5
- package/src/OcrReviewErrorScreen.tsx +53 -0
- package/src/OcrReviewLayout.css +24 -0
- package/src/OcrReviewLoadingScreen.tsx +48 -0
- package/src/OcrReviewScreen.tsx +190 -0
- package/src/OcrReviewStrings.ts +69 -0
- package/src/OcrReviewSuccessScreen.tsx +52 -0
- package/src/PermissionsAllowScreen.tsx +9 -10
- package/src/PermissionsAskScreen.tsx +105 -0
- package/src/PermissionsBrowserStepsScreen.tsx +11 -3
- package/src/PermissionsLayout.css +47 -0
- package/src/PermissionsStrings.ts +42 -12
- package/src/PhoneInputLayout.css +10 -9
- package/src/PhoneInputOtpScreen.tsx +23 -3
- package/src/PhoneInputStrings.ts +23 -4
- package/src/PhoneInputVerifyScreen.tsx +41 -5
- package/src/QualifiedSignatureAcceptScreen.tsx +12 -1
- package/src/QualifiedSignatureDocumentScreen.tsx +31 -19
- package/src/QualifiedSignatureLayout.css +76 -0
- package/src/QualifiedSignatureResultScreen.tsx +28 -26
- package/src/QualifiedSignatureStrings.ts +19 -2
- package/src/ResultScreen.tsx +33 -2
- package/src/ReusabilityCredentialSelectionScreen.tsx +246 -0
- package/src/ReusabilityLayout.css +241 -0
- package/src/ReusabilityPrivacyPolicyScreen.tsx +109 -0
- package/src/ReusabilityStrings.ts +127 -0
- package/src/ReviewScreen.tsx +96 -27
- package/src/ScreenLayout.css +382 -6
- package/src/ScreenNav.css +8 -0
- package/src/ScreenNav.tsx +35 -5
- package/src/VideoSelfieErrorScreen.tsx +1 -1
- package/src/VideoSelfieIdCaptureScreen.tsx +125 -31
- package/src/VideoSelfieLayout.css +467 -34
- package/src/VideoSelfieSelfieCaptureScreen.tsx +110 -57
- package/src/VideoSelfieSpeakScreen.tsx +34 -15
- package/src/VideoSelfieStrings.ts +89 -14
- package/src/VideoSelfieTurnHeadScreen.tsx +162 -0
- package/src/VideoSelfieTutorialScreen.tsx +45 -23
- package/src/VideoSelfieWaveScreen.tsx +143 -0
- package/src/ViewfinderScreen.css +36 -0
- package/src/WatchlistBusinessFormScreen.tsx +35 -16
- package/src/WatchlistBusinessStrings.ts +21 -7
- package/src/flows.ts +25 -0
- package/src/index.ts +88 -3
- package/src/styles.css +3 -0
- 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
|
|
35
|
-
|
|
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`, `…
|
|
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,
|
|
58
|
-
/*
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
57
|
-
|
|
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.
|
|
43
|
-
* 5707:54174 draws
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
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;
|