@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,52 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaResultScreen, type PrizmaResultScreenProps } from './ResultScreen';
|
|
3
|
+
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
4
|
+
import type { OcrReviewStrings } from './OcrReviewStrings';
|
|
5
|
+
import './ScreenLayout.css';
|
|
6
|
+
|
|
7
|
+
export interface OcrReviewSuccessScreenProps
|
|
8
|
+
extends Omit<
|
|
9
|
+
PrizmaResultScreenProps,
|
|
10
|
+
'status' | 'title' | 'ctaLabel' | 'verifiedLabel' | 'navLabel'
|
|
11
|
+
> {
|
|
12
|
+
/** Module copy — this screen reads the `success` slice. */
|
|
13
|
+
strings: OcrReviewStrings;
|
|
14
|
+
screenId?: string;
|
|
15
|
+
overrides?: PrizmaScreenOverrides;
|
|
16
|
+
onAction?: PrizmaScreenActionHandler;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* OCR Review — "Identity successfully verified", built on Archetype F
|
|
21
|
+
* (GUIDELINES.md §6-F, `PrizmaResultScreen`). Figma: `OCR Success` (31084:18796),
|
|
22
|
+
* the "Processed successfully?" decision's "Yes" branch — status mark + title
|
|
23
|
+
* alone, no CTA drawn (the frame hands off straight to the next module).
|
|
24
|
+
*
|
|
25
|
+
* Nav and footer tag are left at the archetype's DEFAULT (shown), matching
|
|
26
|
+
* every other module's success screen (`EkycSuccessScreen`, `EkybSuccessScreen`,
|
|
27
|
+
* `NfcSuccessScreen`, `FormsSuccessScreen`, …) — none of them hide header or
|
|
28
|
+
* footer. The Figma frame itself draws neither, but copying that as a
|
|
29
|
+
* per-screen override was wrong: hiding BOTH with no CTA band to balance it
|
|
30
|
+
* left nothing reserved at the bottom, so the status + title sat noticeably
|
|
31
|
+
* lower than the centred position every sibling success screen keeps (Mili,
|
|
32
|
+
* 2026-10-12 — checked against the system's own screens, not re-derived from
|
|
33
|
+
* the frame).
|
|
34
|
+
*/
|
|
35
|
+
export const OcrReviewSuccessScreen = forwardRef<HTMLDivElement, OcrReviewSuccessScreenProps>(
|
|
36
|
+
({ strings, screenId = 'ocr-review-success', overrides, onAction, ...shell }, ref) => (
|
|
37
|
+
<PrizmaResultScreen
|
|
38
|
+
ref={ref}
|
|
39
|
+
status="success"
|
|
40
|
+
title={strings.success.title}
|
|
41
|
+
verifiedLabel={strings.verifiedLabel}
|
|
42
|
+
navLabel={strings.navLabel}
|
|
43
|
+
screenId={screenId}
|
|
44
|
+
overrides={overrides}
|
|
45
|
+
onAction={onAction}
|
|
46
|
+
{...shell}
|
|
47
|
+
/>
|
|
48
|
+
),
|
|
49
|
+
);
|
|
50
|
+
OcrReviewSuccessScreen.displayName = 'OcrReviewSuccessScreen';
|
|
51
|
+
|
|
52
|
+
export default OcrReviewSuccessScreen;
|
|
@@ -13,6 +13,7 @@ export interface PermissionsAllowScreenProps
|
|
|
13
13
|
| 'glyph'
|
|
14
14
|
| 'ctaLabel'
|
|
15
15
|
| 'linkLabel'
|
|
16
|
+
| 'linkPosition'
|
|
16
17
|
| 'verifiedLabel'
|
|
17
18
|
| 'navLabel'
|
|
18
19
|
> {
|
|
@@ -42,16 +43,13 @@ export interface PermissionsAllowScreenProps
|
|
|
42
43
|
* `showHeader={false}` keeps the section's logo-free chrome (the flow has not
|
|
43
44
|
* started) with the nav row still reserved.
|
|
44
45
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* it — F needs a `ctaOrder` slot alongside the `ctaOrientation` it already
|
|
53
|
-
* has, exactly as Geolocation escalated for the same reason. Borrowing
|
|
54
|
-
* `bandContent` to fake the position is the workaround #VS-17 rejected.
|
|
46
|
+
* "Quit process" sits ABOVE "Allow permission", as the frame draws it, through
|
|
47
|
+
* archetype F's `linkPosition="above"` (DEVIATIONS #GEN-3). Its sibling
|
|
48
|
+
* `PermissionsRequiredScreen` (archetype G) already renders that order.
|
|
49
|
+
*
|
|
50
|
+
* One thing Figma draws that this screen does not, reported rather than worked
|
|
51
|
+
* around: **the filled amber disc.** Core renders the canonical OUTLINE warning
|
|
52
|
+
* mark (icon-outline sweep, DEVIATIONS #15).
|
|
55
53
|
*/
|
|
56
54
|
export const PermissionsAllowScreen = forwardRef<
|
|
57
55
|
HTMLDivElement,
|
|
@@ -76,6 +74,7 @@ export const PermissionsAllowScreen = forwardRef<
|
|
|
76
74
|
subtitle={strings.allow.subtitle}
|
|
77
75
|
ctaLabel={strings.allow.ctaLabel}
|
|
78
76
|
linkLabel={strings.allow.quitLabel}
|
|
77
|
+
linkPosition="above"
|
|
79
78
|
verifiedLabel={strings.verifiedLabel}
|
|
80
79
|
navLabel={strings.navLabel}
|
|
81
80
|
screenId={screenId}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { PrizmaBottomSheetContent } from '@incodetech/prizma-core-web/bottom-sheet';
|
|
3
|
+
import { PrizmaModalContent } from '@incodetech/prizma-core-web/modal';
|
|
4
|
+
import { PrizmaScreenShell, type PrizmaScreenShellProps } from './ScreenShell';
|
|
5
|
+
import type { PrizmaScreenActionHandler } from './types';
|
|
6
|
+
import type { PermissionsStrings } from './PermissionsStrings';
|
|
7
|
+
import './ScreenLayout.css';
|
|
8
|
+
import './PermissionsLayout.css';
|
|
9
|
+
|
|
10
|
+
export interface PermissionsAskScreenProps extends Omit<
|
|
11
|
+
PrizmaScreenShellProps,
|
|
12
|
+
'dark' | 'title' | 'children'
|
|
13
|
+
> {
|
|
14
|
+
/** Family copy — this screen reads the `ask` slice. */
|
|
15
|
+
strings: PermissionsStrings;
|
|
16
|
+
/**
|
|
17
|
+
* How the ask is presented. `sheet` (default) is the phone frame's bottom
|
|
18
|
+
* sheet. `dialog` is Core's centred Modal, for a desktop browser window: a
|
|
19
|
+
* sheet pinned to the bottom of a wide window reads as a phone screen pasted
|
|
20
|
+
* on the page (Camila, 2026-10-07). Same copy, same two choices.
|
|
21
|
+
*/
|
|
22
|
+
presentation?: 'sheet' | 'dialog';
|
|
23
|
+
screenId?: string;
|
|
24
|
+
onAction?: PrizmaScreenActionHandler;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Permissions — the pre-permission sheet, "Allow camera access".
|
|
29
|
+
*
|
|
30
|
+
* Figma: `1-3-1-id-permission-modal` (qGJjfL4O0JSjz1x4tOjJn8), the first frame
|
|
31
|
+
* of all three full-flow boards (Web 3:620, iOS 3:7788, Android 4:11304). It is
|
|
32
|
+
* the SDK's own sheet, not the browser's prompt: Core's Bottom Sheet `dialog`
|
|
33
|
+
* (handle, title, supporting line) carrying a horizontal Button Group with
|
|
34
|
+
* "Don't allow" (secondary) left of "Allow" (primary), which is
|
|
35
|
+
* `horizontal-v1`'s order. "Allow" is what raises the real OS prompt.
|
|
36
|
+
*
|
|
37
|
+
* On desktop (`presentation="dialog"`) the same ask is Core's Modal `default`
|
|
38
|
+
* variant, centred over the scrim the way NFC's settings dialog is: Core
|
|
39
|
+
* renders the card and its Button Group (its own `vertical-v1` default, Allow
|
|
40
|
+
* over Don't allow), the screen adds only the scrim and the centring. No close
|
|
41
|
+
* icon: the two buttons are the only answers the ask has.
|
|
42
|
+
*
|
|
43
|
+
* Nothing is drawn behind the sheet: every board shows the sheet over an empty
|
|
44
|
+
* frame, so the screen is the scrim alone. Same scrim + panel split as
|
|
45
|
+
* Document Capture's method sheet (#DC-30).
|
|
46
|
+
*/
|
|
47
|
+
export const PermissionsAskScreen = forwardRef<HTMLDivElement, PermissionsAskScreenProps>(
|
|
48
|
+
(
|
|
49
|
+
{
|
|
50
|
+
strings,
|
|
51
|
+
presentation = 'sheet',
|
|
52
|
+
screenId = presentation === 'dialog' ? 'permissions-ask-dialog' : 'permissions-ask',
|
|
53
|
+
onAction,
|
|
54
|
+
...shell
|
|
55
|
+
},
|
|
56
|
+
ref,
|
|
57
|
+
) => (
|
|
58
|
+
<PrizmaScreenShell
|
|
59
|
+
ref={ref}
|
|
60
|
+
data-screen-id={screenId}
|
|
61
|
+
// A dialog dims the whole browser window, not a column of it. Hosts that
|
|
62
|
+
// frame screens (Core Lab's desktop card) read this to let the screen
|
|
63
|
+
// span the window.
|
|
64
|
+
data-pcs-overlay={presentation === 'dialog' ? 'window' : undefined}
|
|
65
|
+
{...shell}
|
|
66
|
+
>
|
|
67
|
+
<div className="permissions-sheet-scrim" aria-hidden="true" />
|
|
68
|
+
{presentation === 'dialog' ? (
|
|
69
|
+
<div className="permissions-dialog-panel">
|
|
70
|
+
<PrizmaModalContent
|
|
71
|
+
title={strings.ask.title}
|
|
72
|
+
subtitle={strings.ask.subtitle}
|
|
73
|
+
showCloseIcon={false}
|
|
74
|
+
buttonGroupProps={{
|
|
75
|
+
primaryLabel: strings.ask.allowLabel,
|
|
76
|
+
secondaryLabel: strings.ask.denyLabel,
|
|
77
|
+
onPrimaryClick: () => onAction?.({ type: 'cta', screenId }),
|
|
78
|
+
onSecondaryClick: () => onAction?.({ type: 'secondary', screenId }),
|
|
79
|
+
}}
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
) : (
|
|
83
|
+
<div className="permissions-sheet-panel">
|
|
84
|
+
<PrizmaBottomSheetContent
|
|
85
|
+
variant="dialog"
|
|
86
|
+
ariaLabel={strings.ask.title}
|
|
87
|
+
title={strings.ask.title}
|
|
88
|
+
subtitle={strings.ask.subtitle}
|
|
89
|
+
buttonGroupProps={{
|
|
90
|
+
orientation: 'horizontal-v1',
|
|
91
|
+
primaryLabel: strings.ask.allowLabel,
|
|
92
|
+
secondaryLabel: strings.ask.denyLabel,
|
|
93
|
+
showTertiary: false,
|
|
94
|
+
onPrimaryClick: () => onAction?.({ type: 'cta', screenId }),
|
|
95
|
+
onSecondaryClick: () => onAction?.({ type: 'secondary', screenId }),
|
|
96
|
+
}}
|
|
97
|
+
/>
|
|
98
|
+
</div>
|
|
99
|
+
)}
|
|
100
|
+
</PrizmaScreenShell>
|
|
101
|
+
),
|
|
102
|
+
);
|
|
103
|
+
PermissionsAskScreen.displayName = 'PermissionsAskScreen';
|
|
104
|
+
|
|
105
|
+
export default PermissionsAskScreen;
|
|
@@ -29,6 +29,7 @@ import './ScreenLayout.css';
|
|
|
29
29
|
* both forbidden (rule 1, GUIDELINES §10), so each row takes the nearest
|
|
30
30
|
* canonical glyph:
|
|
31
31
|
*
|
|
32
|
+
* addressBar → IconTextAi the address bar's page / site control
|
|
32
33
|
* settings → IconLock site settings sit behind the address-bar lock
|
|
33
34
|
* browser → IconTextAi Safari's "AA" is the address-bar text control
|
|
34
35
|
* menu → IconNumberedList the ⋮ overflow opens a menu list
|
|
@@ -45,6 +46,7 @@ import './ScreenLayout.css';
|
|
|
45
46
|
* glyphs or bless the substitutions — one decision covers both families.
|
|
46
47
|
*/
|
|
47
48
|
const STEP_ICONS: Record<PermissionsStepKind, ReactNode> = {
|
|
49
|
+
addressBar: <IconTextAi size="m" />,
|
|
48
50
|
settings: <IconLock size="m" />,
|
|
49
51
|
browser: <IconTextAi size="m" />,
|
|
50
52
|
menu: <IconNumberedList size="m" />,
|
|
@@ -83,15 +85,22 @@ export interface PermissionsBrowserStepsScreenProps
|
|
|
83
85
|
*
|
|
84
86
|
* Figma: `1-4-2-id` of the `Permissions` section, plus the four
|
|
85
87
|
* `Android browsers` frames of the Web full-flow board (4:8159 — Chrome,
|
|
86
|
-
* Firefox, Samsung Internet, Opera).
|
|
88
|
+
* Firefox, Samsung Internet, Opera). The browser set and every step path are
|
|
89
|
+
* Geolocation's (`GeolocationBrowserStepsScreen`), nine browsers, with the
|
|
90
|
+
* camera in place of the location. ONE screen for all of them: they draw the
|
|
87
91
|
* identical skeleton — title block → a step list filling the middle → the
|
|
88
92
|
* refresh CTA — and differ only in the rows, because re-enabling the camera is
|
|
89
|
-
* a different journey in each browser.
|
|
93
|
+
* a different journey in each browser. Nine files would have been nine chances
|
|
90
94
|
* to drift.
|
|
91
95
|
*
|
|
92
96
|
* The rows are Core's `PrizmaCardListCommonIssues` verbatim; only the leading
|
|
93
97
|
* glyph is chosen here, from the canonical bank (see `STEP_ICONS`).
|
|
94
98
|
*
|
|
99
|
+
* No subtitle: none of the frames draws the browser name under the title,
|
|
100
|
+
* and the same call was made for Geolocation's step lists (owner call, Elena
|
|
101
|
+
* 2026-09-30). `label` stays in the strings as the section's identifier for
|
|
102
|
+
* hosts and catalogs; the screen itself shows title + steps.
|
|
103
|
+
*
|
|
95
104
|
* The title block is LEFT-aligned for this whole family. Every frame starts the
|
|
96
105
|
* two-line headline flush at the gutter over left-led step rows; a centred
|
|
97
106
|
* headline above a left-aligned list reads as a mistake. The screen therefore
|
|
@@ -133,7 +142,6 @@ export const PermissionsBrowserStepsScreen = forwardRef<
|
|
|
133
142
|
ref={ref}
|
|
134
143
|
showHeader={showHeader}
|
|
135
144
|
title={strings.browserSteps.title}
|
|
136
|
-
subtitle={slice?.label}
|
|
137
145
|
ctaLabel={strings.browserSteps.ctaLabel}
|
|
138
146
|
verifiedLabel={strings.verifiedLabel}
|
|
139
147
|
navLabel={strings.navLabel}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* Permissions — the pre-permission sheet (`PermissionsAskScreen`).
|
|
2
|
+
*
|
|
3
|
+
* Same idiom as Document Capture's method sheet (DEVIATIONS #DC-30): Core's
|
|
4
|
+
* `PrizmaBottomSheetContent` owns the panel (handle, radius, padding, title,
|
|
5
|
+
* button group); the screen owns the scrim, because the safe presenter portals
|
|
6
|
+
* to `document.body` and would escape the 390 × 844 frame. The scrim drinks
|
|
7
|
+
* Core's own `Surface/Overlay` token. No animation: a screen is one static
|
|
8
|
+
* spec state. */
|
|
9
|
+
.permissions-sheet-scrim {
|
|
10
|
+
position: absolute;
|
|
11
|
+
inset: 0;
|
|
12
|
+
z-index: 1;
|
|
13
|
+
background: var(--prizma-surface-overlay);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.permissions-sheet-panel {
|
|
17
|
+
position: absolute;
|
|
18
|
+
left: 0;
|
|
19
|
+
right: 0;
|
|
20
|
+
bottom: 0;
|
|
21
|
+
z-index: 2;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* The frame's `System UI Bottom Bar` (34) sits INSIDE the sheet. Core reserves
|
|
25
|
+
* it as `env(safe-area-inset-bottom, var(--prizma-sheet-size-safe-area))`, but
|
|
26
|
+
* a browser defines the inset as 0 on a flat screen, so the fallback never
|
|
27
|
+
* applies and the CTAs drop to 12px off the frame's bottom. Screens in this
|
|
28
|
+
* package reserve device chrome as fixed values (`--pcs-status-bar`), so the
|
|
29
|
+
* sheet takes Core's own Sheet/Size/Safe-area token directly here. */
|
|
30
|
+
.permissions-sheet-panel .prizma-bottom-sheet__safe-area {
|
|
31
|
+
height: var(--prizma-sheet-size-safe-area);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Desktop: the same ask as Core's centred Modal (`presentation="dialog"`).
|
|
35
|
+
* Same split as NFC's settings dialog: Core's `PrizmaModalContent` is the card
|
|
36
|
+
* (width 100% up to its own Modal/Size/Max-width), this only centres it with
|
|
37
|
+
* the Spacing/12 gutter. */
|
|
38
|
+
.permissions-dialog-panel {
|
|
39
|
+
position: absolute;
|
|
40
|
+
inset: 0;
|
|
41
|
+
z-index: 2;
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
justify-content: center;
|
|
45
|
+
padding-inline: var(--prizma-spacing-12);
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
}
|
|
@@ -12,20 +12,26 @@
|
|
|
12
12
|
// is the ID Capture-flavoured copy of the same skeleton; it stays where it is so
|
|
13
13
|
// nothing that imports it breaks (DEVIATIONS #IDC-26).
|
|
14
14
|
//
|
|
15
|
-
// The section's seven frames collapse onto
|
|
15
|
+
// The section's seven frames collapse onto FOUR built screens:
|
|
16
16
|
//
|
|
17
|
+
// 1-3-1-id-permission-modal → PermissionsAskScreen (the sheet)
|
|
17
18
|
// 1-3-2-id → PermissionsRequiredScreen (reason rows)
|
|
18
19
|
// 1-3-2-id-allow-camera → PermissionsAllowScreen (subtitle)
|
|
19
20
|
// 1-4-2-id (+ 4 Android siblings) → PermissionsBrowserStepsScreen
|
|
20
21
|
//
|
|
21
|
-
// The other
|
|
22
|
+
// The other three are OS chrome and are NOT built:
|
|
22
23
|
//
|
|
23
|
-
// 1-3-1-id-permission-modal the browser's own "Allow camera access" sheet
|
|
24
24
|
// 1-4-1-id the iOS "…Would Like to Access the Camera" alert
|
|
25
25
|
// 1-3-2-id-quit-process an iOS confirm alert layered over 1-3-2-id
|
|
26
26
|
// 1-3-2-id-allow-camera-quit the same alert layered over the allow screen
|
|
27
27
|
//
|
|
28
|
-
//
|
|
28
|
+
// `1-3-1-id-permission-modal` was on this list until 2026-10-07. It is not the
|
|
29
|
+
// browser's prompt: it is the SDK's own camera pre-permission sheet (the SDK
|
|
30
|
+
// release notes call it "the camera permission sheet", shown by every module
|
|
31
|
+
// that asks for the camera), drawn with Core's Bottom Sheet dialog and Button
|
|
32
|
+
// Group. So it is built, from those two components (DEVIATIONS #GEN-1).
|
|
33
|
+
//
|
|
34
|
+
// None of the remaining three is a Prizma surface: their chrome does not exist in Core and
|
|
29
35
|
// rebuilding it would mean inventing primitives and shipping platform rasters,
|
|
30
36
|
// both forbidden (rule 1, GUIDELINES §10). Same call as Document Capture's iOS
|
|
31
37
|
// action sheets (#DC-20) and Geolocation's system alert. Core Lab draws them as
|
|
@@ -49,18 +55,30 @@ export interface PermissionsReasonRow {
|
|
|
49
55
|
}
|
|
50
56
|
|
|
51
57
|
/**
|
|
52
|
-
* Which browser's "turn it back on" journey to show.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
58
|
+
* Which browser's "turn it back on" journey to show. The SAME nine browsers,
|
|
59
|
+
* keys and order as Geolocation's (`GeolocationBrowser`), because a refused
|
|
60
|
+
* camera and a refused location are the same journey through the same browser
|
|
61
|
+
* settings; only the permission's name changes (Camila, 2026-10-07). The
|
|
62
|
+
* Permissions Figma draws five of them (`1-4-2-id` for Safari plus the four
|
|
63
|
+
* `Android browsers` frames, 4:8159); the other four follow Geolocation.
|
|
57
64
|
*/
|
|
58
65
|
export type PermissionsBrowser =
|
|
59
66
|
| 'safariIos'
|
|
67
|
+
| 'chromeIos'
|
|
68
|
+
| 'firefoxIos'
|
|
69
|
+
| 'operaIos'
|
|
60
70
|
| 'chromeAndroid'
|
|
61
71
|
| 'firefoxAndroid'
|
|
72
|
+
| 'operaAndroid'
|
|
62
73
|
| 'samsungAndroid'
|
|
63
|
-
| '
|
|
74
|
+
| 'unrecognizedAndroid'
|
|
75
|
+
// Desktop browsers. Not in Geolocation's set: a phone's lists send the user
|
|
76
|
+
// to the Settings app on an iPhone, which means nothing on a computer, so the
|
|
77
|
+
// desktop flow carries its own four (2026-10-07).
|
|
78
|
+
| 'chromeDesktop'
|
|
79
|
+
| 'edgeDesktop'
|
|
80
|
+
| 'firefoxDesktop'
|
|
81
|
+
| 'safariMac';
|
|
64
82
|
|
|
65
83
|
/**
|
|
66
84
|
* Step kind → canonical bank glyph, resolved in
|
|
@@ -73,6 +91,7 @@ export type PermissionsBrowser =
|
|
|
73
91
|
* than inventing a second one.
|
|
74
92
|
*/
|
|
75
93
|
export type PermissionsStepKind =
|
|
94
|
+
| 'addressBar'
|
|
76
95
|
| 'settings'
|
|
77
96
|
| 'browser'
|
|
78
97
|
| 'menu'
|
|
@@ -90,7 +109,7 @@ export interface PermissionsStep {
|
|
|
90
109
|
|
|
91
110
|
export interface PermissionsBrowserSteps {
|
|
92
111
|
/** Names the browser under the headline. Figma labels the section, not the
|
|
93
|
-
* screen; the label keeps
|
|
112
|
+
* screen; the label keeps nine otherwise near-identical cards apart. */
|
|
94
113
|
label: string;
|
|
95
114
|
steps: PermissionsStep[];
|
|
96
115
|
}
|
|
@@ -101,6 +120,17 @@ export interface PermissionsStrings {
|
|
|
101
120
|
/** "verified by" attribution copy for the footer tag. */
|
|
102
121
|
verifiedLabel: string;
|
|
103
122
|
|
|
123
|
+
/** `1-3-1-id-permission-modal` — the pre-permission sheet, the very first
|
|
124
|
+
* ask. Its "Allow" is what raises the real OS prompt. */
|
|
125
|
+
ask: {
|
|
126
|
+
title: string;
|
|
127
|
+
subtitle?: string;
|
|
128
|
+
/** Primary — raises the OS prompt. */
|
|
129
|
+
allowLabel: string;
|
|
130
|
+
/** Secondary — declines; the flow moves on to `required`. */
|
|
131
|
+
denyLabel: string;
|
|
132
|
+
};
|
|
133
|
+
|
|
104
134
|
/** `1-3-2-id` — the permission was refused and the flow explains why it needs it. */
|
|
105
135
|
required: {
|
|
106
136
|
title: string;
|
|
@@ -112,7 +142,7 @@ export interface PermissionsStrings {
|
|
|
112
142
|
ctaLabel: string;
|
|
113
143
|
};
|
|
114
144
|
|
|
115
|
-
/** `1-3-2-id-allow-camera` — the
|
|
145
|
+
/** `1-3-2-id-allow-camera` — the softer ask after the REAL OS prompt was refused. */
|
|
116
146
|
allow: {
|
|
117
147
|
title: string;
|
|
118
148
|
subtitle?: string;
|
|
@@ -19,6 +19,14 @@ export interface PhoneInputOtpScreenProps
|
|
|
19
19
|
value?: string;
|
|
20
20
|
/** How many digits the code carries. Default 6. */
|
|
21
21
|
length?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Seconds left before the code can be resent. While it is above 0 (and the
|
|
24
|
+
* copy carries `otp.resendCountdownLabel`), the resend line becomes one
|
|
25
|
+
* disabled link, "Resend code in 30s", exactly as Figma draws
|
|
26
|
+
* `phoneNumber.OTP.typing`. The host owns the timer; the screen only draws
|
|
27
|
+
* the number it is given.
|
|
28
|
+
*/
|
|
29
|
+
resendIn?: number;
|
|
22
30
|
screenId?: string;
|
|
23
31
|
overrides?: PrizmaScreenOverrides;
|
|
24
32
|
onAction?: PrizmaScreenActionHandler;
|
|
@@ -47,13 +55,16 @@ export const PhoneInputOtpScreen = forwardRef<HTMLDivElement, PhoneInputOtpScree
|
|
|
47
55
|
state = 'typing',
|
|
48
56
|
value,
|
|
49
57
|
length = 6,
|
|
58
|
+
resendIn,
|
|
50
59
|
screenId = `phone-input-otp-${state}`,
|
|
51
60
|
overrides,
|
|
52
61
|
onAction,
|
|
53
62
|
...shell
|
|
54
63
|
},
|
|
55
64
|
ref,
|
|
56
|
-
) =>
|
|
65
|
+
) => {
|
|
66
|
+
const counting = (resendIn ?? 0) > 0 && Boolean(strings.otp.resendCountdownLabel);
|
|
67
|
+
return (
|
|
57
68
|
<PrizmaFormScreen
|
|
58
69
|
ref={ref}
|
|
59
70
|
title={strings.otp.title}
|
|
@@ -70,8 +81,16 @@ export const PhoneInputOtpScreen = forwardRef<HTMLDivElement, PhoneInputOtpScree
|
|
|
70
81
|
than `linkLabel` (a full-width 56px button cannot sit inside a line of
|
|
71
82
|
body text, and one button could not tell the two actions apart —
|
|
72
83
|
DEVIATIONS #PI-10). */
|
|
84
|
+
/* While the resend timer runs, the line is ONE disabled link (Figma
|
|
85
|
+
`OTP.typing`: Tertiary / Link · Disabled), not the composed sentence. */
|
|
86
|
+
linkLabel={
|
|
87
|
+
counting
|
|
88
|
+
? strings.otp.resendCountdownLabel!.replace('{{time}}', String(resendIn))
|
|
89
|
+
: undefined
|
|
90
|
+
}
|
|
91
|
+
linkDisabled={counting}
|
|
73
92
|
linkContent={
|
|
74
|
-
strings.otp.resendPrompt ? (
|
|
93
|
+
!counting && strings.otp.resendPrompt ? (
|
|
75
94
|
<p className="prizma-screen-layout__inline-prompt">
|
|
76
95
|
{strings.otp.resendPrompt}{' '}
|
|
77
96
|
{strings.otp.resendLabel ? (
|
|
@@ -119,7 +138,8 @@ export const PhoneInputOtpScreen = forwardRef<HTMLDivElement, PhoneInputOtpScree
|
|
|
119
138
|
errorText={state === 'error' ? strings.otp.errorText : undefined}
|
|
120
139
|
/>
|
|
121
140
|
</PrizmaFormScreen>
|
|
122
|
-
|
|
141
|
+
);
|
|
142
|
+
},
|
|
123
143
|
);
|
|
124
144
|
PhoneInputOtpScreen.displayName = 'PhoneInputOtpScreen';
|
|
125
145
|
|
package/src/PhoneInputStrings.ts
CHANGED
|
@@ -50,8 +50,9 @@ export type PhoneInputOtpState = 'typing' | 'filled' | 'processing' | 'error';
|
|
|
50
50
|
export type PhoneInputErrorVariant = 'tryAgain' | 'unknown' | 'noNetwork';
|
|
51
51
|
|
|
52
52
|
/** One selectable country in the dial-code dropdown. Runtime data, not copy —
|
|
53
|
-
* the host supplies its own list
|
|
54
|
-
*
|
|
53
|
+
* the host supplies its own list. The screen draws the flag from Core's
|
|
54
|
+
* raster bank by `value` (`PrizmaCountryFlag`, DEVIATIONS #PI-3); `flag` is
|
|
55
|
+
* only the emoji fallback for a country outside the bank. */
|
|
55
56
|
export interface PhoneInputCountry {
|
|
56
57
|
/** Stable value, e.g. an ISO 3166-1 alpha-2 code. */
|
|
57
58
|
value: string;
|
|
@@ -59,7 +60,7 @@ export interface PhoneInputCountry {
|
|
|
59
60
|
dialCode: string;
|
|
60
61
|
/** Country name for the open menu row. */
|
|
61
62
|
label: string;
|
|
62
|
-
/** Emoji
|
|
63
|
+
/** Emoji fallback, e.g. `🇷🇸`, drawn only when the bank has no raster. */
|
|
63
64
|
flag?: string;
|
|
64
65
|
}
|
|
65
66
|
|
|
@@ -127,6 +128,13 @@ export interface PhoneInputStrings {
|
|
|
127
128
|
resendSeparator?: string;
|
|
128
129
|
/** Second link — returns to phone entry. Emits `tertiary`. */
|
|
129
130
|
changeNumberLabel?: string;
|
|
131
|
+
/**
|
|
132
|
+
* While the resend timer runs, the resend line is replaced by ONE disabled
|
|
133
|
+
* link: "Resend code in {{time}}s" (Figma `phoneNumber.OTP.typing`). The
|
|
134
|
+
* `{{time}}` placeholder is the SDK's own (`otp.resendCountdown`) and is
|
|
135
|
+
* filled with the screen's `resendIn` seconds.
|
|
136
|
+
*/
|
|
137
|
+
resendCountdownLabel?: string;
|
|
130
138
|
/** Primary CTA. */
|
|
131
139
|
ctaLabel: string;
|
|
132
140
|
/** Accessible / visible busy copy while the code is checked (`processing`). */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { forwardRef } from 'react';
|
|
2
2
|
import { PrizmaTextField } from '@incodetech/prizma-core-web/text-field';
|
|
3
3
|
import { PrizmaDropdown } from '@incodetech/prizma-core-web/dropdown';
|
|
4
|
+
import { PrizmaCountryFlag } from '@incodetech/prizma-core-web/combined';
|
|
4
5
|
import { PrizmaFormScreen, type PrizmaFormScreenProps } from './FormScreen';
|
|
5
6
|
import type { PrizmaScreenActionHandler, PrizmaScreenOverrides } from './types';
|
|
6
7
|
import type {
|
|
@@ -83,10 +84,13 @@ export const PhoneInputVerifyScreen = forwardRef<HTMLDivElement, PhoneInputVerif
|
|
|
83
84
|
const options = countries.map((c) => ({
|
|
84
85
|
value: c.value,
|
|
85
86
|
// The open menu row reads flag + dial code + country name
|
|
86
|
-
// ("
|
|
87
|
-
// ("
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
// ("+381 Serbia" after the flag); the closed field keeps only flag +
|
|
88
|
+
// dial code ("+381") through Core's `fieldLabel`, as Figma draws it.
|
|
89
|
+
// The flag is not text: it rides the leading slot below (DEVIATIONS
|
|
90
|
+
// #PI-3), so it is Core's raster on every OS instead of an emoji that
|
|
91
|
+
// Windows draws as the letters "RS".
|
|
92
|
+
label: [c.dialCode, c.label].join(' '),
|
|
93
|
+
fieldLabel: c.dialCode,
|
|
90
94
|
}));
|
|
91
95
|
|
|
92
96
|
// Figma treats the states as three distinct field treatments, not one:
|
|
@@ -133,6 +137,22 @@ export const PhoneInputVerifyScreen = forwardRef<HTMLDivElement, PhoneInputVerif
|
|
|
133
137
|
searchPlaceholder={strings.verify.countrySearchPlaceholder}
|
|
134
138
|
/* The `countryCode` section IS the open-menu spec state. */
|
|
135
139
|
forceOpen={state === 'countryCode'}
|
|
140
|
+
/* Core's canonical flag raster in the closed field and every menu
|
|
141
|
+
row, the WatchlistBusinessFormScreen precedent. A country
|
|
142
|
+
outside the bank falls back to its `flag` emoji. */
|
|
143
|
+
renderLeading={(option) => {
|
|
144
|
+
const match = countries.find((c) => c.value === option.value);
|
|
145
|
+
return match ? (
|
|
146
|
+
<PrizmaCountryFlag
|
|
147
|
+
country={{
|
|
148
|
+
code: match.value,
|
|
149
|
+
name: match.label,
|
|
150
|
+
dialCode: match.dialCode,
|
|
151
|
+
flag: match.flag ?? '',
|
|
152
|
+
}}
|
|
153
|
+
/>
|
|
154
|
+
) : null;
|
|
155
|
+
}}
|
|
136
156
|
disabled={busy}
|
|
137
157
|
/>
|
|
138
158
|
<PrizmaTextField
|
|
@@ -55,16 +55,19 @@ export interface QualifiedSignatureDocumentScreenProps
|
|
|
55
55
|
*
|
|
56
56
|
* Archetype G is the fit: its `__list` middle is "content filling the space
|
|
57
57
|
* between the title block and the CTA band", which is exactly what a document
|
|
58
|
-
* page is, and
|
|
58
|
+
* page is, and the band carries only the "Back" secondary (delta 1). The
|
|
59
59
|
* body is allowed to scroll inside that middle — one module rule RELEASING an
|
|
60
60
|
* overflow constraint, declaring no spacing or size, the same idiom as CURP's
|
|
61
61
|
* taller-than-844 form (DEVIATIONS #CURP-1).
|
|
62
62
|
*
|
|
63
63
|
* THREE deltas from the frames:
|
|
64
|
-
* 1. Both sections draw a back chevron at the nav's left.
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
64
|
+
* 1. Both sections draw a back chevron at the nav's left. These are viewers
|
|
65
|
+
* the user opened from the accept screen, so they need a way back (owner
|
|
66
|
+
* call 2026-09-29). It ships as a full-width SECONDARY "Back" button in the
|
|
67
|
+
* CTA band instead, emitting `secondary` (owner call 2026-10-08): the person
|
|
68
|
+
* reads and returns to sign, and a real button at the thumb is easier to
|
|
69
|
+
* find than a chevron. "Back" over "Done" because nothing is finished here;
|
|
70
|
+
* the signature still waits on the accept screen. The nav stays logo-only.
|
|
68
71
|
* `terms` replacing the logo row with a chevron + heading bar is still not
|
|
69
72
|
* followed — the title stays the archetype's H2 below the nav.
|
|
70
73
|
* 2. `viewdoc` draws NO heading. GUIDELINES §4 is explicit that every screen has
|
|
@@ -100,14 +103,13 @@ export const QualifiedSignatureDocumentScreen = forwardRef<
|
|
|
100
103
|
) => {
|
|
101
104
|
const copy = variant === 'terms' ? strings.document.terms : strings.document.document;
|
|
102
105
|
|
|
103
|
-
|
|
104
106
|
return (
|
|
105
107
|
<PrizmaListScreen
|
|
106
108
|
ref={ref}
|
|
107
109
|
title={copy.title}
|
|
108
110
|
verifiedLabel={strings.verifiedLabel}
|
|
109
111
|
navLabel={strings.navLabel}
|
|
110
|
-
|
|
112
|
+
secondaryCtaLabel={strings.document.backLabel}
|
|
111
113
|
screenId={screenId}
|
|
112
114
|
overrides={overrides}
|
|
113
115
|
onAction={onAction}
|