@incodetech/prizma-core-screens 0.2.7 → 0.2.14
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/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/DigitalIdDeviceWalletsDocumentSelectionScreen.d.ts +34 -0
- package/dist/DigitalIdDeviceWalletsDocumentSelectionScreen.js +47 -0
- package/dist/DigitalIdDeviceWalletsResultScreen.d.ts +28 -0
- package/dist/DigitalIdDeviceWalletsResultScreen.js +23 -0
- package/dist/DigitalIdDeviceWalletsStrings.d.ts +55 -0
- package/dist/DigitalIdDeviceWalletsStrings.js +19 -0
- package/dist/DigitalIdProvidersDocumentSelectionScreen.d.ts +31 -0
- package/dist/DigitalIdProvidersDocumentSelectionScreen.js +37 -0
- package/dist/DigitalIdProvidersErrorScreen.d.ts +33 -0
- package/dist/DigitalIdProvidersErrorScreen.js +33 -0
- package/dist/DigitalIdProvidersLayout.css +59 -0
- package/dist/DigitalIdProvidersRedirectScreen.d.ts +24 -0
- package/dist/DigitalIdProvidersRedirectScreen.js +18 -0
- package/dist/DigitalIdProvidersStrings.d.ts +72 -0
- package/dist/DigitalIdProvidersStrings.js +15 -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/EkybCountryScreen.d.ts +6 -6
- package/dist/EkybCountryScreen.js +20 -7
- package/dist/EkybStrings.d.ts +6 -1
- 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/FormScreen.css +14 -0
- package/dist/FormScreen.d.ts +28 -0
- package/dist/FormScreen.js +3 -2
- package/dist/IdCaptureLayout.css +165 -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 +19 -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/PhoneInputOtpScreen.d.ts +8 -0
- package/dist/PhoneInputOtpScreen.js +26 -19
- package/dist/PhoneInputStrings.d.ts +11 -3
- package/dist/PhoneInputVerifyScreen.js +21 -5
- package/dist/QualifiedSignatureDocumentScreen.d.ts +8 -5
- package/dist/QualifiedSignatureDocumentScreen.js +9 -6
- package/dist/QualifiedSignatureResultScreen.d.ts +16 -13
- package/dist/QualifiedSignatureResultScreen.js +17 -18
- package/dist/QualifiedSignatureStrings.d.ts +11 -4
- 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/VideoSelfieErrorScreen.js +1 -1
- package/dist/VideoSelfieIdCaptureScreen.js +1 -1
- package/dist/VideoSelfieLayout.css +304 -2
- package/dist/VideoSelfieSelfieCaptureScreen.js +1 -1
- package/dist/VideoSelfieSpeakScreen.js +1 -1
- package/dist/VideoSelfieStrings.d.ts +4 -1
- package/dist/VideoSelfieTurnHeadScreen.js +14 -11
- package/dist/VideoSelfieTutorialScreen.d.ts +9 -0
- package/dist/VideoSelfieTutorialScreen.js +10 -1
- package/dist/VideoSelfieWaveScreen.js +1 -1
- package/dist/ViewfinderScreen.css +36 -0
- package/dist/flows.d.ts +8 -0
- package/dist/flows.js +17 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +17 -0
- package/dist/styles.css +4 -0
- package/package.json +94 -3
- package/samples/video-selfie-camera-wide.jpg +0 -0
- package/samples/video-selfie-room-wide.jpg +0 -0
- package/src/BiometricConsentScreen.tsx +192 -0
- package/src/BiometricConsentStrings.ts +119 -0
- package/src/CaptureScreen.tsx +17 -0
- package/src/DemoScreensLayout.css +16 -0
- package/src/DemoScreensRedirectScreen.tsx +14 -6
- package/src/DemoScreensStrings.ts +5 -0
- package/src/DigitalIdDeviceWalletsDocumentSelectionScreen.tsx +108 -0
- package/src/DigitalIdDeviceWalletsResultScreen.tsx +76 -0
- package/src/DigitalIdDeviceWalletsStrings.ts +80 -0
- package/src/DigitalIdProvidersDocumentSelectionScreen.tsx +112 -0
- package/src/DigitalIdProvidersErrorScreen.tsx +104 -0
- package/src/DigitalIdProvidersLayout.css +59 -0
- package/src/DigitalIdProvidersRedirectScreen.tsx +65 -0
- package/src/DigitalIdProvidersStrings.ts +98 -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/EkybCountryScreen.tsx +23 -6
- package/src/EkybStrings.ts +6 -1
- 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/FormScreen.css +14 -0
- package/src/FormScreen.tsx +34 -0
- package/src/IdCaptureLayout.css +165 -2
- package/src/IdCaptureStageScreen.tsx +75 -0
- package/src/IdCaptureStrings.ts +19 -0
- package/src/ListScreen.tsx +48 -9
- 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/PhoneInputOtpScreen.tsx +23 -3
- package/src/PhoneInputStrings.ts +11 -3
- package/src/PhoneInputVerifyScreen.tsx +24 -4
- package/src/QualifiedSignatureDocumentScreen.tsx +9 -7
- package/src/QualifiedSignatureResultScreen.tsx +28 -26
- package/src/QualifiedSignatureStrings.ts +11 -4
- 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/VideoSelfieErrorScreen.tsx +1 -1
- package/src/VideoSelfieIdCaptureScreen.tsx +9 -1
- package/src/VideoSelfieLayout.css +304 -2
- package/src/VideoSelfieSelfieCaptureScreen.tsx +9 -1
- package/src/VideoSelfieSpeakScreen.tsx +9 -1
- package/src/VideoSelfieStrings.ts +4 -2
- package/src/VideoSelfieTurnHeadScreen.tsx +25 -14
- package/src/VideoSelfieTutorialScreen.tsx +11 -0
- package/src/VideoSelfieWaveScreen.tsx +9 -1
- package/src/ViewfinderScreen.css +36 -0
- package/src/flows.ts +25 -0
- package/src/index.ts +116 -3
- package/src/styles.css +4 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Digital ID Providers — copy contract.
|
|
2
|
+
//
|
|
3
|
+
// Every Digital ID Providers screen receives the SAME `strings:
|
|
4
|
+
// DigitalIdProvidersStrings` object (rule: all copy via props, no hardcoded
|
|
5
|
+
// English — GUIDELINES.md §9).
|
|
6
|
+
//
|
|
7
|
+
// Authoritative screens: `Digital ID Providers - Latest Designs` Figma file
|
|
8
|
+
// (q0wiyQkLXxGQ2jkPEutxR8) — the chooser `Document Chooser` (27753:8099) and its
|
|
9
|
+
// full provider list (27703:4895), and the section `🪪 Digital ID Verification
|
|
10
|
+
// Flow - 🌐 Web - Full flow` (27707:9237): Redirecting, the provider's own pages
|
|
11
|
+
// (OS chrome, not built), success and five errors. Web only: the providers
|
|
12
|
+
// redirect out of the browser to the provider's site and back (Web SDK,
|
|
13
|
+
// `digitalIdRedirect`). These screens sit in the Digital IDs module beside the
|
|
14
|
+
// device wallets (`DigitalIdDeviceWallets*`), and share its success screen.
|
|
15
|
+
|
|
16
|
+
/** The five ways a provider run can fail (`27707:9338`). */
|
|
17
|
+
export type DigitalIdProvidersErrorState =
|
|
18
|
+
| 'unavailable'
|
|
19
|
+
| 'consent-denied'
|
|
20
|
+
| 'timed-out'
|
|
21
|
+
| 'not-accepted'
|
|
22
|
+
| 'expired';
|
|
23
|
+
|
|
24
|
+
/** One provider row on the chooser. `id` is what `onOptionSelect` reports. */
|
|
25
|
+
export interface DigitalIdProvidersOption {
|
|
26
|
+
id: string;
|
|
27
|
+
/** "iDIN", "itsme", "CA DMV Wallet"… */
|
|
28
|
+
label: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** What the person picked: a physical document, or a provider by its id. */
|
|
32
|
+
export type DigitalIdProvidersSelection =
|
|
33
|
+
| { kind: 'id' }
|
|
34
|
+
| { kind: 'passport' }
|
|
35
|
+
| { kind: 'provider'; providerId: string };
|
|
36
|
+
|
|
37
|
+
export interface DigitalIdProvidersStrings {
|
|
38
|
+
/** Accessible name for the logo nav region (i18n — no baked-in English). */
|
|
39
|
+
navLabel?: string;
|
|
40
|
+
/** "verified by" attribution copy for the footer tag. */
|
|
41
|
+
verifiedLabel: string;
|
|
42
|
+
|
|
43
|
+
/** `Document Chooser` (27753:8099). */
|
|
44
|
+
documentSelection: {
|
|
45
|
+
/** "Select how to verify" — the module's one chooser title (owner call,
|
|
46
|
+
* 2026-10-28; the frame says "Verify your identity"). */
|
|
47
|
+
title: string;
|
|
48
|
+
/** "Viewing options for" — before the country. */
|
|
49
|
+
countryLabel: string;
|
|
50
|
+
/** ISO code of the country the options are for, e.g. "US" (the flag). */
|
|
51
|
+
countryCode: string;
|
|
52
|
+
/** The country as shown, e.g. "US". */
|
|
53
|
+
countryName: string;
|
|
54
|
+
/** "Use your ID" */
|
|
55
|
+
idSectionLabel: string;
|
|
56
|
+
/** "Identity Card" */
|
|
57
|
+
idLabel: string;
|
|
58
|
+
/** "Passport" */
|
|
59
|
+
passportLabel: string;
|
|
60
|
+
/** "Digital ID verification" */
|
|
61
|
+
providersSectionLabel: string;
|
|
62
|
+
/** The providers the flow offers, in order. */
|
|
63
|
+
providers: DigitalIdProvidersOption[];
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** `Redirecting` (1-18-1-id-hold-on, 27707:9281). */
|
|
67
|
+
redirecting: {
|
|
68
|
+
/** "Redirecting for verification…" */
|
|
69
|
+
title: string;
|
|
70
|
+
/** "You'll be redirected to complete verification" */
|
|
71
|
+
subtitle?: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/** `Errors` (27707:9338), one slice per state. */
|
|
75
|
+
errors: Record<
|
|
76
|
+
DigitalIdProvidersErrorState,
|
|
77
|
+
{
|
|
78
|
+
title: string;
|
|
79
|
+
subtitle?: string;
|
|
80
|
+
/** "Try again", or "Scan ID" when the provider is unavailable. */
|
|
81
|
+
ctaLabel: string;
|
|
82
|
+
/** "Choose another method" — one wording on every error (owner call,
|
|
83
|
+
* 2026-10-28; the frame says "Change verification method" on two). */
|
|
84
|
+
secondaryCtaLabel: string;
|
|
85
|
+
}
|
|
86
|
+
>;
|
|
87
|
+
|
|
88
|
+
/** The accepted-documents card on `not-accepted` and `expired`. */
|
|
89
|
+
acceptedDocuments: {
|
|
90
|
+
/** ISO code for the flag, e.g. "IN". */
|
|
91
|
+
countryCode: string;
|
|
92
|
+
/** "India" */
|
|
93
|
+
country: string;
|
|
94
|
+
/** Emoji fallback when the flag is outside Core's raster bank. */
|
|
95
|
+
flag?: string;
|
|
96
|
+
documents: string[];
|
|
97
|
+
};
|
|
98
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
|
|
3
|
+
import { PrizmaReviewScreen, type PrizmaReviewScreenProps } from './ReviewScreen';
|
|
4
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
5
|
+
import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
|
|
6
|
+
import './ScreenLayout.css';
|
|
7
|
+
|
|
8
|
+
export interface DigitalIdUploadErrorScreenProps
|
|
9
|
+
extends Omit<
|
|
10
|
+
PrizmaReviewScreenProps,
|
|
11
|
+
| 'stage'
|
|
12
|
+
| 'title'
|
|
13
|
+
| 'subtitle'
|
|
14
|
+
| 'successTitle'
|
|
15
|
+
| 'analyzingLabel'
|
|
16
|
+
| 'primaryLabel'
|
|
17
|
+
| 'secondaryLabel'
|
|
18
|
+
| 'verifiedLabel'
|
|
19
|
+
| 'children'
|
|
20
|
+
> {
|
|
21
|
+
/** Module copy — this screen reads the `error` slice. */
|
|
22
|
+
strings: DigitalIdUploadStrings;
|
|
23
|
+
screenId?: string;
|
|
24
|
+
overrides?: PrizmaScreenOverrides;
|
|
25
|
+
onAction?: PrizmaScreenActionHandler;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Digital ID Upload — the uploaded file was rejected, built on the
|
|
30
|
+
* `PrizmaReviewScreen` archetype's `error` stage (GUIDELINES.md §6-H). Figma:
|
|
31
|
+
* `Upload Digital ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section,
|
|
32
|
+
* `Error` frame (node 25874:11957).
|
|
33
|
+
*
|
|
34
|
+
* Kept separate from `DigitalIdUploadReviewScreen` (the confirm flow) rather
|
|
35
|
+
* than folded into it as a fourth stage of that wrapper — same split Document
|
|
36
|
+
* Capture draws between its confirm screens and
|
|
37
|
+
* `DocumentCaptureGenericErrorScreen`, even though here both wrappers happen
|
|
38
|
+
* to share the same archetype under the hood. The media is
|
|
39
|
+
* `PrizmaCaptureDigitalId state="error"` (red 4px border) — the same managed
|
|
40
|
+
* component every other stage uses, not a bespoke verdict illustration — and
|
|
41
|
+
* the header/footer are hidden exactly like `analyzing`/`success`
|
|
42
|
+
* (`centeredWhenNoNav`, since this Figma frame draws the identical symmetric
|
|
43
|
+
* header/media/CTA skeleton).
|
|
44
|
+
*/
|
|
45
|
+
export const DigitalIdUploadErrorScreen = forwardRef<
|
|
46
|
+
HTMLDivElement,
|
|
47
|
+
DigitalIdUploadErrorScreenProps
|
|
48
|
+
>(
|
|
49
|
+
(
|
|
50
|
+
{
|
|
51
|
+
strings,
|
|
52
|
+
screenId = 'digital-id-upload-error',
|
|
53
|
+
showHeader = false,
|
|
54
|
+
showFooter = false,
|
|
55
|
+
overrides,
|
|
56
|
+
onAction,
|
|
57
|
+
...shell
|
|
58
|
+
},
|
|
59
|
+
ref,
|
|
60
|
+
) => (
|
|
61
|
+
<PrizmaReviewScreen
|
|
62
|
+
ref={ref}
|
|
63
|
+
stage="error"
|
|
64
|
+
title={strings.error.title}
|
|
65
|
+
subtitle={strings.error.subtitle}
|
|
66
|
+
primaryLabel={strings.error.ctaLabel}
|
|
67
|
+
centeredWhenNoNav
|
|
68
|
+
verifiedLabel={strings.verifiedLabel}
|
|
69
|
+
navLabel={strings.navLabel}
|
|
70
|
+
showHeader={showHeader}
|
|
71
|
+
showFooter={showFooter}
|
|
72
|
+
screenId={screenId}
|
|
73
|
+
overrides={overrides}
|
|
74
|
+
onAction={onAction}
|
|
75
|
+
{...shell}
|
|
76
|
+
>
|
|
77
|
+
<PrizmaCaptureDigitalId state="error" />
|
|
78
|
+
</PrizmaReviewScreen>
|
|
79
|
+
),
|
|
80
|
+
);
|
|
81
|
+
DigitalIdUploadErrorScreen.displayName = 'DigitalIdUploadErrorScreen';
|
|
82
|
+
|
|
83
|
+
export default DigitalIdUploadErrorScreen;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaResultScreen, type PrizmaResultScreenProps } from './ResultScreen';
|
|
3
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
4
|
+
import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
|
|
5
|
+
import './ScreenLayout.css';
|
|
6
|
+
|
|
7
|
+
export interface DigitalIdUploadFileTooLargeScreenProps
|
|
8
|
+
extends Omit<
|
|
9
|
+
PrizmaResultScreenProps,
|
|
10
|
+
'status' | 'title' | 'subtitle' | 'ctaLabel' | 'verifiedLabel' | 'navLabel'
|
|
11
|
+
> {
|
|
12
|
+
/** Module copy — this screen reads the `fileTooLarge` slice. */
|
|
13
|
+
strings: DigitalIdUploadStrings;
|
|
14
|
+
screenId?: string;
|
|
15
|
+
overrides?: PrizmaScreenOverrides;
|
|
16
|
+
onAction?: PrizmaScreenActionHandler;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Digital ID Upload — the selected file exceeds the size limit, built on the
|
|
21
|
+
* `PrizmaResultScreen` archetype (GUIDELINES.md §6-F). Figma: `Upload Digital
|
|
22
|
+
* ID` file (wxFsHRvllern4VnjRqM4JO), `Errors` section, `File Limit Error`
|
|
23
|
+
* frame (node 26083:3981).
|
|
24
|
+
*
|
|
25
|
+
* Unlike `DigitalIdUploadErrorScreen` (the rejected-document verdict, built on
|
|
26
|
+
* the Review archetype because it reuses `PrizmaCaptureDigitalId`), this
|
|
27
|
+
* screen never had a file to show — the size check runs before anything
|
|
28
|
+
* uploads — so Figma draws the plain F recipe: status icon + title + subtitle
|
|
29
|
+
* centred in the full height, one CTA pinned near the bottom. No media slot,
|
|
30
|
+
* no card, nothing to reuse from the capture component.
|
|
31
|
+
*/
|
|
32
|
+
export const DigitalIdUploadFileTooLargeScreen = forwardRef<
|
|
33
|
+
HTMLDivElement,
|
|
34
|
+
DigitalIdUploadFileTooLargeScreenProps
|
|
35
|
+
>(
|
|
36
|
+
(
|
|
37
|
+
{
|
|
38
|
+
strings,
|
|
39
|
+
screenId = 'digital-id-upload-file-too-large',
|
|
40
|
+
showHeader = false,
|
|
41
|
+
showFooter = false,
|
|
42
|
+
overrides,
|
|
43
|
+
onAction,
|
|
44
|
+
...shell
|
|
45
|
+
},
|
|
46
|
+
ref,
|
|
47
|
+
) => (
|
|
48
|
+
<PrizmaResultScreen
|
|
49
|
+
ref={ref}
|
|
50
|
+
status="error"
|
|
51
|
+
title={strings.fileTooLarge.title}
|
|
52
|
+
subtitle={strings.fileTooLarge.subtitle}
|
|
53
|
+
ctaLabel={strings.fileTooLarge.ctaLabel}
|
|
54
|
+
verifiedLabel={strings.verifiedLabel}
|
|
55
|
+
navLabel={strings.navLabel}
|
|
56
|
+
showHeader={showHeader}
|
|
57
|
+
showFooter={showFooter}
|
|
58
|
+
screenId={screenId}
|
|
59
|
+
overrides={overrides}
|
|
60
|
+
onAction={onAction}
|
|
61
|
+
{...shell}
|
|
62
|
+
/>
|
|
63
|
+
),
|
|
64
|
+
);
|
|
65
|
+
DigitalIdUploadFileTooLargeScreen.displayName = 'DigitalIdUploadFileTooLargeScreen';
|
|
66
|
+
|
|
67
|
+
export default DigitalIdUploadFileTooLargeScreen;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
|
|
3
|
+
import { PrizmaReviewScreen, type PrizmaReviewScreenProps } from './ReviewScreen';
|
|
4
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
5
|
+
import type {
|
|
6
|
+
DigitalIdUploadConfirmStage,
|
|
7
|
+
DigitalIdUploadStrings,
|
|
8
|
+
} from './DigitalIdUploadStrings';
|
|
9
|
+
import './ScreenLayout.css';
|
|
10
|
+
|
|
11
|
+
export interface DigitalIdUploadReviewScreenProps
|
|
12
|
+
extends Omit<
|
|
13
|
+
PrizmaReviewScreenProps,
|
|
14
|
+
| 'title'
|
|
15
|
+
| 'subtitle'
|
|
16
|
+
| 'successTitle'
|
|
17
|
+
| 'analyzingLabel'
|
|
18
|
+
| 'primaryLabel'
|
|
19
|
+
| 'secondaryLabel'
|
|
20
|
+
| 'verifiedLabel'
|
|
21
|
+
| 'children'
|
|
22
|
+
| 'stage'
|
|
23
|
+
> {
|
|
24
|
+
/** Module copy — this screen reads the `review` slice. */
|
|
25
|
+
strings: DigitalIdUploadStrings;
|
|
26
|
+
/** Which stage of the confirm flow to render. Default `review`. */
|
|
27
|
+
stage?: DigitalIdUploadConfirmStage;
|
|
28
|
+
/** The uploaded file's name, shown under the card on `review` only. Not
|
|
29
|
+
* copy — it is runtime data from the picker, so it stays out of
|
|
30
|
+
* `strings` (same contract as `DocumentCaptureConfirmUploadScreen`). */
|
|
31
|
+
filename?: string;
|
|
32
|
+
/** Loading-bar progress on `analyzing`, 0–100. */
|
|
33
|
+
progress?: number;
|
|
34
|
+
screenId?: string;
|
|
35
|
+
overrides?: PrizmaScreenOverrides;
|
|
36
|
+
onAction?: PrizmaScreenActionHandler;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Digital ID Upload — review / analyzing / success, built on the
|
|
41
|
+
* `PrizmaReviewScreen` archetype (GUIDELINES.md §6-H). Figma: `Upload Digital
|
|
42
|
+
* ID` file (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section —
|
|
43
|
+
* `Review Document` / `Analyzing` / `Success` (nodes 25351:14725/6/7).
|
|
44
|
+
*
|
|
45
|
+
* The media stage is Core's `PrizmaCaptureDigitalId` across all three stages
|
|
46
|
+
* — its own state enum (`review` / `analyzing` / `success`) maps directly
|
|
47
|
+
* onto the archetype's stage axis, so it already owns the border treatment
|
|
48
|
+
* (neutral on review, green 4px on analyzing/success), the scan-flash sweep
|
|
49
|
+
* and the filename row. Nothing is hand-built here, unlike
|
|
50
|
+
* `DocumentCaptureConfirmUploadScreen`'s bespoke file-card — Core ships a
|
|
51
|
+
* purpose-built component for this module.
|
|
52
|
+
*
|
|
53
|
+
* Header/footer visibility is genuinely per-stage in this Figma (logo nav +
|
|
54
|
+
* verified tag show on `review`, both are absent on `analyzing` and
|
|
55
|
+
* `success`) — not a layout choice this file invents, just the existing
|
|
56
|
+
* `showHeader`/`showFooter` chrome knobs (owner rule 2026-08-18: header and
|
|
57
|
+
* footer are independently controlled) applied per stage.
|
|
58
|
+
*
|
|
59
|
+
* Always opts into the archetype's `centeredWhenNoNav` — it only takes effect
|
|
60
|
+
* while the nav is hidden (`analyzing`/`success` here), where this Figma
|
|
61
|
+
* draws the header + media as one group centred with equal space above and
|
|
62
|
+
* below it, not a pinned header (see ReviewScreen.tsx for the mechanics).
|
|
63
|
+
* `review` always shows its own nav, so the flag is a no-op there, and the
|
|
64
|
+
* default `false` leaves Document Capture's existing analyzing/success
|
|
65
|
+
* screens byte-for-byte unchanged (neither ever hides the nav here).
|
|
66
|
+
*
|
|
67
|
+
* GAP (report, not workaround — README rule 2): Figma's `Success` section
|
|
68
|
+
* also shows a subtitle ("Let's continue") under the success title, but the
|
|
69
|
+
* shared `PrizmaReviewScreen` archetype only renders a subtitle on
|
|
70
|
+
* `stage="review"` — every other current consumer's success state has none.
|
|
71
|
+
* Left unset here pending an owner call on whether to extend the shared
|
|
72
|
+
* archetype with a `successSubtitle` slot.
|
|
73
|
+
*/
|
|
74
|
+
export const DigitalIdUploadReviewScreen = forwardRef<
|
|
75
|
+
HTMLDivElement,
|
|
76
|
+
DigitalIdUploadReviewScreenProps
|
|
77
|
+
>(
|
|
78
|
+
(
|
|
79
|
+
{
|
|
80
|
+
strings,
|
|
81
|
+
stage = 'review',
|
|
82
|
+
filename,
|
|
83
|
+
progress = 45,
|
|
84
|
+
showHeader = stage === 'review',
|
|
85
|
+
showFooter = stage === 'review',
|
|
86
|
+
screenId = `digital-id-upload-${stage}`,
|
|
87
|
+
overrides,
|
|
88
|
+
onAction,
|
|
89
|
+
...shell
|
|
90
|
+
},
|
|
91
|
+
ref,
|
|
92
|
+
) => (
|
|
93
|
+
<PrizmaReviewScreen
|
|
94
|
+
ref={ref}
|
|
95
|
+
stage={stage}
|
|
96
|
+
title={strings.review.title}
|
|
97
|
+
subtitle={strings.review.subtitle}
|
|
98
|
+
successTitle={strings.review.successTitle}
|
|
99
|
+
analyzingLabel={strings.review.analyzingLabel}
|
|
100
|
+
centeredWhenNoNav
|
|
101
|
+
progress={progress}
|
|
102
|
+
primaryLabel={strings.review.ctaLabel}
|
|
103
|
+
secondaryLabel={strings.review.replaceLabel}
|
|
104
|
+
verifiedLabel={strings.verifiedLabel}
|
|
105
|
+
navLabel={strings.navLabel}
|
|
106
|
+
showHeader={showHeader}
|
|
107
|
+
showFooter={showFooter}
|
|
108
|
+
screenId={screenId}
|
|
109
|
+
overrides={overrides}
|
|
110
|
+
onAction={onAction}
|
|
111
|
+
{...shell}
|
|
112
|
+
>
|
|
113
|
+
<PrizmaCaptureDigitalId state={stage} filename={filename} />
|
|
114
|
+
</PrizmaReviewScreen>
|
|
115
|
+
),
|
|
116
|
+
);
|
|
117
|
+
DigitalIdUploadReviewScreen.displayName = 'DigitalIdUploadReviewScreen';
|
|
118
|
+
|
|
119
|
+
export default DigitalIdUploadReviewScreen;
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
|
|
20
|
+
/** The three stages the confirm flow's screen shares — matches
|
|
21
|
+
* `PrizmaReviewScreen`'s own `PrizmaReviewStage` (ReviewScreen.tsx). Kept as
|
|
22
|
+
* a separate module-scoped type rather than importing it, same convention as
|
|
23
|
+
* `DocumentCaptureConfirmStage` (DocumentCaptureStrings.ts). */
|
|
24
|
+
export type DigitalIdUploadConfirmStage = 'review' | 'analyzing' | 'success';
|
|
25
|
+
|
|
26
|
+
export interface DigitalIdUploadStrings {
|
|
27
|
+
/** Accessible name for the logo nav region (i18n — no baked-in English). */
|
|
28
|
+
navLabel?: string;
|
|
29
|
+
/** "verified by" attribution copy for the footer tag. */
|
|
30
|
+
verifiedLabel: string;
|
|
31
|
+
|
|
32
|
+
/** `Tutorial Screen` (node 25351:14722). */
|
|
33
|
+
tutorial: {
|
|
34
|
+
title: string;
|
|
35
|
+
subtitle?: string;
|
|
36
|
+
/** "Upload PDF" */
|
|
37
|
+
ctaLabel: string;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** `Review Document` / `Analyzing` / `Success` (nodes
|
|
41
|
+
* 25351:14725/14726/14727) — one screen, three stages. */
|
|
42
|
+
review: {
|
|
43
|
+
/** `review` title ("Review document"). */
|
|
44
|
+
title: string;
|
|
45
|
+
/** `review` description. Figma draws no subtitle on `analyzing` or
|
|
46
|
+
* `success` — the shared `PrizmaReviewScreen` archetype already only
|
|
47
|
+
* shows one on `review`, so this needs no per-stage handling here. */
|
|
48
|
+
subtitle?: string;
|
|
49
|
+
/** Loading-bar caption on `analyzing` ("Analyzing.."). */
|
|
50
|
+
analyzingLabel: string;
|
|
51
|
+
/** H2 on `success` ("Successfully processed!"). */
|
|
52
|
+
successTitle: string;
|
|
53
|
+
/** Secondary CTA on `review` ("Replace file"). */
|
|
54
|
+
replaceLabel: string;
|
|
55
|
+
/** Primary CTA on `review` / `success` ("Continue"). */
|
|
56
|
+
ctaLabel: string;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/** `Errors` section, `Error` frame (node 25874:11957) — the uploaded file
|
|
60
|
+
* itself was rejected (wrong document type). Built on the SAME
|
|
61
|
+
* `PrizmaReviewScreen` archetype as `review`, stage `"error"`: the card
|
|
62
|
+
* reuses `PrizmaCaptureDigitalId state="error"` (red 4px border), not a
|
|
63
|
+
* generic archetype-F verdict screen (DigitalIdUploadErrorScreen.tsx). */
|
|
64
|
+
error: {
|
|
65
|
+
/** "ID type is not accepted" */
|
|
66
|
+
title: string;
|
|
67
|
+
/** "Please try scanning a different document" */
|
|
68
|
+
subtitle?: string;
|
|
69
|
+
/** "Scan your ID" */
|
|
70
|
+
ctaLabel: string;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/** `Errors` section, `File Limit Error` frame (node 26083:3981) — the file
|
|
74
|
+
* was never uploaded at all (client-side size check), so there is no
|
|
75
|
+
* rejected document to show. Built on Archetype F (`PrizmaResultScreen`,
|
|
76
|
+
* ResultScreen.tsx) rather than the review archetype `error` uses above —
|
|
77
|
+
* Figma centres the status + title + subtitle in the full available
|
|
78
|
+
* height with no media stage at all, exactly F's shape, not H's
|
|
79
|
+
* header-above-a-card one (DigitalIdUploadFileTooLargeScreen.tsx). */
|
|
80
|
+
fileTooLarge: {
|
|
81
|
+
/** "File is too large" */
|
|
82
|
+
title: string;
|
|
83
|
+
/** "The selected file is larger than 5 MB, please upload a smaller one" */
|
|
84
|
+
subtitle?: string;
|
|
85
|
+
/** "Choose another file" */
|
|
86
|
+
ctaLabel: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaCaptureDigitalId } from '@incodetech/prizma-core-web/capture-digital-id';
|
|
3
|
+
import { PrizmaTutorialScreen, type PrizmaTutorialScreenProps } from './TutorialScreen';
|
|
4
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
5
|
+
import type { DigitalIdUploadStrings } from './DigitalIdUploadStrings';
|
|
6
|
+
import './ScreenLayout.css';
|
|
7
|
+
|
|
8
|
+
export interface DigitalIdUploadTutorialScreenProps
|
|
9
|
+
extends Omit<
|
|
10
|
+
PrizmaTutorialScreenProps,
|
|
11
|
+
'title' | 'subtitle' | 'ctaLabel' | 'illustration' | 'verifiedLabel' | 'navLabel'
|
|
12
|
+
> {
|
|
13
|
+
/** Module copy — this screen reads the `tutorial` slice (+ shared labels). */
|
|
14
|
+
strings: DigitalIdUploadStrings;
|
|
15
|
+
screenId?: string;
|
|
16
|
+
overrides?: PrizmaScreenOverrides;
|
|
17
|
+
onAction?: PrizmaScreenActionHandler;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Digital ID Upload — tutorial, built on the `PrizmaTutorialScreen` archetype
|
|
22
|
+
* (GUIDELINES.md §6-A). Figma: `Upload Digital ID` file
|
|
23
|
+
* (wxFsHRvllern4VnjRqM4JO), "Web Happy Path - Light Mode" section, `Tutorial
|
|
24
|
+
* Screen` (node 25351:14722).
|
|
25
|
+
*
|
|
26
|
+
* The illustration slot is Core's own `PrizmaCaptureDigitalId` in its
|
|
27
|
+
* `tutorial` state — the Figma file names this exact instance "Capture /
|
|
28
|
+
* Digital ID" (node 26161:10686, Figma description: "Incode specific
|
|
29
|
+
* component for Digital ID module experience"), the same managed component
|
|
30
|
+
* already shipped as `core/platforms/web/src/CaptureDigitalId.tsx`. No module
|
|
31
|
+
* illustration is drawn here — the component owns its own tutorial artwork
|
|
32
|
+
* (`PrizmaIllustrationDigitalId`).
|
|
33
|
+
*/
|
|
34
|
+
export const DigitalIdUploadTutorialScreen = forwardRef<
|
|
35
|
+
HTMLDivElement,
|
|
36
|
+
DigitalIdUploadTutorialScreenProps
|
|
37
|
+
>(
|
|
38
|
+
(
|
|
39
|
+
{ strings, screenId = 'digital-id-upload-tutorial', overrides, onAction, ...shell },
|
|
40
|
+
ref,
|
|
41
|
+
) => (
|
|
42
|
+
<PrizmaTutorialScreen
|
|
43
|
+
ref={ref}
|
|
44
|
+
title={strings.tutorial.title}
|
|
45
|
+
subtitle={strings.tutorial.subtitle}
|
|
46
|
+
ctaLabel={strings.tutorial.ctaLabel}
|
|
47
|
+
illustration={<PrizmaCaptureDigitalId state="tutorial" />}
|
|
48
|
+
verifiedLabel={strings.verifiedLabel}
|
|
49
|
+
navLabel={strings.navLabel}
|
|
50
|
+
screenId={screenId}
|
|
51
|
+
overrides={overrides}
|
|
52
|
+
onAction={onAction}
|
|
53
|
+
{...shell}
|
|
54
|
+
/>
|
|
55
|
+
),
|
|
56
|
+
);
|
|
57
|
+
DigitalIdUploadTutorialScreen.displayName = 'DigitalIdUploadTutorialScreen';
|
|
58
|
+
|
|
59
|
+
export default DigitalIdUploadTutorialScreen;
|
|
@@ -7,7 +7,7 @@ import './DocumentCaptureLayout.css';
|
|
|
7
7
|
*
|
|
8
8
|
* WHY IT LIVES IN THE MODULE LAYER: `prizma-core-web` ships
|
|
9
9
|
* `PrizmaIllustrationSelfie`, `…IdTutorial`, `…IdIntro`, `…IdFlip`,
|
|
10
|
-
* `…IdHint`, `…IdFeedback`, `…NfcScan`, `…
|
|
10
|
+
* `…IdHint`, `…IdFeedback`, `…NfcScan`, `…Geolocation`,
|
|
11
11
|
* `…DigitalId` and `…Avatar` — there is NO document / proof-of-address
|
|
12
12
|
* illustration. GUIDELINES.md §10 is the standing asset rule for that gap
|
|
13
13
|
* ("Illustrations…: inline SVG React components (Figma-sourced), tintable via
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { forwardRef } from 'react';
|
|
2
2
|
import { PrizmaDropdown } from '@incodetech/prizma-core-web/dropdown';
|
|
3
|
+
import { PrizmaCountryFlag } from '@incodetech/prizma-core-web/combined';
|
|
3
4
|
import { PrizmaFormScreen, type PrizmaFormScreenProps } from './FormScreen';
|
|
4
5
|
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
5
6
|
import type { EkybCountryState, EkybOption, EkybStrings } from './EkybStrings';
|
|
@@ -55,12 +56,12 @@ export interface EkybCountryScreenProps
|
|
|
55
56
|
* live interaction) — the same mechanism Phone Input's `countryCode` and
|
|
56
57
|
* CURP's `Gene.dropdown` sections use. The search bar Figma draws inside the
|
|
57
58
|
* menu is Core's own `searchable`.
|
|
58
|
-
* 3. Menu rows and the closed field read the same "
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
59
|
+
* 3. Menu rows and the closed field read the same flag + "United States",
|
|
60
|
+
* no dial code. Figma 5707:54174 draws the rows with Phone Input's "+1"
|
|
61
|
+
* prefixes, dropped by the owner (Elena, 2026-09-28) because a country of
|
|
62
|
+
* registration has no phone prefix. The flag is Core's raster in the
|
|
63
|
+
* dropdown's leading slot, not an emoji in the label (Elena, 2026-10-23;
|
|
64
|
+
* #PI-3, the WatchlistBusinessFormScreen precedent).
|
|
64
65
|
*
|
|
65
66
|
* This page is the only eKYB form page with NO "Back" secondary and NO Stepper —
|
|
66
67
|
* it is step 0, before the three-step wizard starts.
|
|
@@ -135,6 +136,22 @@ export const EkybCountryScreen = forwardRef<HTMLDivElement, EkybCountryScreenPro
|
|
|
135
136
|
clearSearchLabel={copy.clearSearchLabel}
|
|
136
137
|
/* The `dropdown` section IS the open-menu spec state. */
|
|
137
138
|
forceOpen={state === 'dropdown'}
|
|
139
|
+
/* Core's canonical flag raster in the closed field and every menu
|
|
140
|
+
row (see note 3). A country outside the bank falls back to its
|
|
141
|
+
`flag` emoji. */
|
|
142
|
+
renderLeading={(option) => {
|
|
143
|
+
const match = countries.find((c) => c.value === option.value);
|
|
144
|
+
return match ? (
|
|
145
|
+
<PrizmaCountryFlag
|
|
146
|
+
country={{
|
|
147
|
+
code: match.value,
|
|
148
|
+
name: match.label,
|
|
149
|
+
dialCode: '',
|
|
150
|
+
flag: match.flag ?? '',
|
|
151
|
+
}}
|
|
152
|
+
/>
|
|
153
|
+
) : null;
|
|
154
|
+
}}
|
|
138
155
|
/>
|
|
139
156
|
</PrizmaFormScreen>
|
|
140
157
|
);
|
package/src/EkybStrings.ts
CHANGED
|
@@ -98,8 +98,13 @@ export interface EkybOption {
|
|
|
98
98
|
label: string;
|
|
99
99
|
/** Compact face for the CLOSED field when it differs from the menu row —
|
|
100
100
|
* Core's own `PrizmaDropdownOption.fieldLabel`. The eKYB country list
|
|
101
|
-
* does not need it: rows and field both read "
|
|
101
|
+
* does not need it: rows and field both read "United States" after the
|
|
102
|
+
* flag. */
|
|
102
103
|
fieldLabel?: string;
|
|
104
|
+
/** Country menus only: the emoji fallback for a `value` outside Core's
|
|
105
|
+
* flag raster bank. The country screen draws the bank's flag by `value`,
|
|
106
|
+
* so this never travels inside `label`. */
|
|
107
|
+
flag?: string;
|
|
103
108
|
}
|
|
104
109
|
|
|
105
110
|
/** The values the business-identity page carries. Runtime data, never copy. */
|
|
@@ -38,7 +38,7 @@ export interface ErrorScreensScreenProps
|
|
|
38
38
|
* Error screens — the session-level failures, built on the Result archetype
|
|
39
39
|
* (GUIDELINES.md §6-F, `PrizmaResultScreen`).
|
|
40
40
|
*
|
|
41
|
-
* ONE screen for all
|
|
41
|
+
* ONE screen for all four generic sections. They draw the identical skeleton —
|
|
42
42
|
* a centred mark + title + supporting line over a CTA band — and differ only in
|
|
43
43
|
* copy, in which mark leads, and in what the band carries:
|
|
44
44
|
*
|
|
@@ -46,8 +46,11 @@ export interface ErrorScreensScreenProps
|
|
|
46
46
|
* - `noConnection` — Wi-Fi glyph, "Refresh"
|
|
47
47
|
* - `unsupportedBrowser` — canonical negative mark, the session URL above
|
|
48
48
|
* "Copy link", with "Continue anyways" under it
|
|
49
|
+
* - `somethingWentWrong` — canonical negative mark, "Try again" when the copy
|
|
50
|
+
* carries a CTA, "Quit process" under it when it
|
|
51
|
+
* carries a quit label; a dead end when it has neither
|
|
49
52
|
*
|
|
50
|
-
* Chrome is CONSTANT. All
|
|
53
|
+
* Chrome is CONSTANT. All the frames are drawn without the logo header and
|
|
51
54
|
* without the verified tag; both are kept here, because the owner rule of
|
|
52
55
|
* 2026-08-18 (#F-30, #F-34) makes the chrome the same on every screen so
|
|
53
56
|
* nothing shifts between states, and every module's connectivity screen must
|
|
@@ -91,11 +94,19 @@ export const ErrorScreensScreen = forwardRef<HTMLDivElement, ErrorScreensScreenP
|
|
|
91
94
|
) => {
|
|
92
95
|
const unsupported = variant === 'unsupportedBrowser';
|
|
93
96
|
const noConnection = variant === 'noConnection';
|
|
97
|
+
const generic = variant === 'somethingWentWrong';
|
|
94
98
|
const copy = unsupported
|
|
95
99
|
? strings.unsupportedBrowser
|
|
96
100
|
: noConnection
|
|
97
101
|
? strings.noConnection
|
|
98
|
-
:
|
|
102
|
+
: generic
|
|
103
|
+
? strings.somethingWentWrong
|
|
104
|
+
: strings.sessionExpired;
|
|
105
|
+
const linkLabel = unsupported
|
|
106
|
+
? strings.unsupportedBrowser.continueLabel
|
|
107
|
+
: generic
|
|
108
|
+
? strings.somethingWentWrong.quitLabel
|
|
109
|
+
: undefined;
|
|
99
110
|
|
|
100
111
|
return (
|
|
101
112
|
<PrizmaResultScreen
|
|
@@ -133,7 +144,7 @@ export const ErrorScreensScreen = forwardRef<HTMLDivElement, ErrorScreensScreenP
|
|
|
133
144
|
: undefined
|
|
134
145
|
}
|
|
135
146
|
ctaLabel={copy.ctaLabel}
|
|
136
|
-
linkLabel={
|
|
147
|
+
linkLabel={linkLabel}
|
|
137
148
|
verifiedLabel={strings.verifiedLabel}
|
|
138
149
|
navLabel={strings.navLabel}
|
|
139
150
|
screenId={screenId}
|