@aws-amplify/ui-react-liveness 3.0.5 → 3.0.6
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/esm/components/FaceLivenessDetector/LivenessCheck/LivenessCameraModule.mjs +3 -3
- package/dist/esm/components/FaceLivenessDetector/displayText.mjs +17 -12
- package/dist/esm/components/FaceLivenessDetector/shared/DefaultStartScreenComponents.mjs +2 -2
- package/dist/esm/components/FaceLivenessDetector/shared/FaceLivenessErrorModal.mjs +3 -3
- package/dist/esm/components/FaceLivenessDetector/shared/Hint.mjs +16 -17
- package/dist/esm/components/FaceLivenessDetector/shared/LivenessIconWithPopover.mjs +6 -5
- package/dist/esm/components/FaceLivenessDetector/shared/ToastWithLoader.mjs +13 -0
- package/dist/esm/components/FaceLivenessDetector/utils/getDisplayText.mjs +7 -2
- package/dist/esm/version.mjs +1 -1
- package/dist/index.js +59 -42
- package/dist/styles.css +4 -4
- package/dist/types/components/FaceLivenessDetector/displayText.d.ts +9 -4
- package/dist/types/components/FaceLivenessDetector/shared/DefaultStartScreenComponents.d.ts +3 -2
- package/dist/types/components/FaceLivenessDetector/shared/LivenessIconWithPopover.d.ts +2 -0
- package/dist/types/components/FaceLivenessDetector/shared/ToastWithLoader.d.ts +7 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +3 -3
|
@@ -125,9 +125,9 @@ const LivenessCameraModule = (props) => {
|
|
|
125
125
|
setAspectRatio(videoRef.current.videoWidth / videoRef.current.videoHeight);
|
|
126
126
|
}
|
|
127
127
|
}, [send, videoRef, isCameraReady, isMobileScreen]);
|
|
128
|
-
const
|
|
128
|
+
const photoSensitivityWarning = React__default.useMemo(() => {
|
|
129
129
|
return (React__default.createElement(View, { style: { visibility: isStartView ? 'visible' : 'hidden' } },
|
|
130
|
-
React__default.createElement(PhotosensitiveWarning, {
|
|
130
|
+
React__default.createElement(PhotosensitiveWarning, { bodyText: instructionDisplayText.photosensitivityWarningBodyText, headingText: instructionDisplayText.photosensitivityWarningHeadingText, infoText: instructionDisplayText.photosensitivityWarningInfoText, labelText: instructionDisplayText.photosensitivityWarningLabelText })));
|
|
131
131
|
}, [PhotosensitiveWarning, instructionDisplayText, isStartView]);
|
|
132
132
|
const handleMediaPlay = () => {
|
|
133
133
|
setIsCameraReady(true);
|
|
@@ -161,7 +161,7 @@ const LivenessCameraModule = (props) => {
|
|
|
161
161
|
}
|
|
162
162
|
const isRecordingOnMobile = isMobileScreen && !isStartView && !isWaitingForCamera && isRecording;
|
|
163
163
|
return (React__default.createElement(React__default.Fragment, null,
|
|
164
|
-
|
|
164
|
+
photoSensitivityWarning,
|
|
165
165
|
React__default.createElement(Flex, { className: classNames(LivenessClassNames.CameraModule, isRecordingOnMobile && `${LivenessClassNames.CameraModule}--mobile`), "data-testid": testId, gap: "zero" },
|
|
166
166
|
!isCameraReady && centeredLoader,
|
|
167
167
|
React__default.createElement(View, { as: "canvas", ref: freshnessColorRef, className: LivenessClassNames.FreshnessCanvas, hidden: true }),
|
|
@@ -15,24 +15,15 @@ const defaultErrorDisplayText = {
|
|
|
15
15
|
tryAgainText: 'Try again',
|
|
16
16
|
};
|
|
17
17
|
const defaultLivenessDisplayText = {
|
|
18
|
-
hintCenterFaceText: 'Center your face',
|
|
19
|
-
startScreenBeginCheckText: 'Start video check',
|
|
20
|
-
photosensitivyWarningHeadingText: 'Photosensitivity warning',
|
|
21
|
-
photosensitivyWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
22
|
-
photosensitivyWarningInfoText: 'Some people may experience may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
23
|
-
goodFitCaptionText: 'Good fit',
|
|
24
|
-
goodFitAltText: "Ilustration of a person's face, perfectly fitting inside of an oval.",
|
|
25
|
-
tooFarCaptionText: 'Too far',
|
|
26
|
-
tooFarAltText: "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.",
|
|
27
18
|
cameraMinSpecificationsHeadingText: 'Camera does not meet minimum specifications',
|
|
28
19
|
cameraMinSpecificationsMessageText: 'Camera must support at least 320*240 resolution and 15 frames per second.',
|
|
29
20
|
cameraNotFoundHeadingText: 'Camera is not accessible.',
|
|
30
21
|
cameraNotFoundMessageText: 'Check that a camera is connected and there is not another application using the camera. You may have to go into settings to grant camera permissions and close out all instances of your browser and retry.',
|
|
31
|
-
retryCameraPermissionsText: 'Retry',
|
|
32
|
-
waitingCameraPermissionText: 'Waiting for you to allow camera permission.',
|
|
33
22
|
a11yVideoLabelText: 'Webcam for liveness check',
|
|
34
23
|
cancelLivenessCheckText: 'Cancel Liveness check',
|
|
35
|
-
|
|
24
|
+
goodFitCaptionText: 'Good fit',
|
|
25
|
+
goodFitAltText: "Ilustration of a person's face, perfectly fitting inside of an oval.",
|
|
26
|
+
hintCenterFaceText: 'Center your face',
|
|
36
27
|
hintMoveFaceFrontOfCameraText: 'Move face in front of camera',
|
|
37
28
|
hintTooManyFacesText: 'Ensure only one face is in front of camera',
|
|
38
29
|
hintFaceDetectedText: 'Face detected',
|
|
@@ -45,6 +36,20 @@ const defaultLivenessDisplayText = {
|
|
|
45
36
|
hintIlluminationTooDarkText: 'Move to brighter area',
|
|
46
37
|
hintIlluminationNormalText: 'Lighting conditions normal',
|
|
47
38
|
hintHoldFaceForFreshnessText: 'Hold still',
|
|
39
|
+
photosensitivityWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
40
|
+
photosensitivityWarningHeadingText: 'Photosensitivity warning',
|
|
41
|
+
photosensitivityWarningInfoText: 'Some people may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
42
|
+
photosensitivityWarningLabelText: 'More information about photosensitivity',
|
|
43
|
+
photosensitivyWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
44
|
+
photosensitivyWarningHeadingText: 'Photosensitivity warning',
|
|
45
|
+
photosensitivyWarningInfoText: 'Some people may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
46
|
+
photosensitivyWarningLabelText: 'More information about photosensitivity',
|
|
47
|
+
retryCameraPermissionsText: 'Retry',
|
|
48
|
+
recordingIndicatorText: 'Rec',
|
|
49
|
+
startScreenBeginCheckText: 'Start video check',
|
|
50
|
+
tooFarCaptionText: 'Too far',
|
|
51
|
+
tooFarAltText: "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.",
|
|
52
|
+
waitingCameraPermissionText: 'Waiting for you to allow camera permission.',
|
|
48
53
|
...defaultErrorDisplayText,
|
|
49
54
|
};
|
|
50
55
|
|
|
@@ -22,12 +22,12 @@ import { LivenessClassNames } from '../types/classNames.mjs';
|
|
|
22
22
|
import { RecordingIcon } from './RecordingIcon.mjs';
|
|
23
23
|
import { LivenessIconWithPopover } from './LivenessIconWithPopover.mjs';
|
|
24
24
|
|
|
25
|
-
const DefaultPhotosensitiveWarning = ({
|
|
25
|
+
const DefaultPhotosensitiveWarning = ({ bodyText, headingText, infoText, labelText, }) => {
|
|
26
26
|
return (React__default.createElement(Flex, { className: `${ComponentClassName.Alert} ${LivenessClassNames.StartScreenWarning}`, style: { zIndex: '3' } },
|
|
27
27
|
React__default.createElement(View, { flex: "1" },
|
|
28
28
|
React__default.createElement(View, { className: ComponentClassName.AlertHeading }, headingText),
|
|
29
29
|
React__default.createElement(View, { className: ComponentClassName.AlertBody }, bodyText)),
|
|
30
|
-
React__default.createElement(LivenessIconWithPopover,
|
|
30
|
+
React__default.createElement(LivenessIconWithPopover, { labelText: labelText, headingText: headingText }, infoText)));
|
|
31
31
|
};
|
|
32
32
|
const DefaultRecordingIcon = ({ recordingIndicatorText, }) => {
|
|
33
33
|
return (React__default.createElement(View, { className: LivenessClassNames.RecordingIconContainer },
|
|
@@ -51,8 +51,8 @@ const renderToastErrorModal = (props) => {
|
|
|
51
51
|
return (React__default.createElement(React__default.Fragment, null,
|
|
52
52
|
React__default.createElement(Flex, { className: LivenessClassNames.ErrorModal },
|
|
53
53
|
React__default.createElement(AlertIcon, { ariaHidden: true, variation: "error" }),
|
|
54
|
-
React__default.createElement(Text, { className: LivenessClassNames.ErrorModalHeading }, heading)),
|
|
55
|
-
message));
|
|
54
|
+
React__default.createElement(Text, { className: LivenessClassNames.ErrorModalHeading, id: "amplify-liveness-error-heading" }, heading)),
|
|
55
|
+
React__default.createElement(Text, { id: "amplify-liveness-error-message" }, message)));
|
|
56
56
|
};
|
|
57
57
|
const renderErrorModal = ({ errorState, overrideErrorDisplayText, }) => {
|
|
58
58
|
const displayText = {
|
|
@@ -79,7 +79,7 @@ const FaceLivenessErrorModal = (props) => {
|
|
|
79
79
|
};
|
|
80
80
|
const { tryAgainText } = displayText;
|
|
81
81
|
return (React__default.createElement(Overlay, { className: LivenessClassNames.OpaqueOverlay },
|
|
82
|
-
React__default.createElement(Toast,
|
|
82
|
+
React__default.createElement(Toast, { "aria-labelledby": "amplify-liveness-error-heading", "aria-describedby": "amplify-liveness-error-message", role: "alertdialog" },
|
|
83
83
|
children,
|
|
84
84
|
React__default.createElement(Flex, { justifyContent: "center" },
|
|
85
85
|
React__default.createElement(Button, { variation: "primary", type: "button", onClick: onRetry }, tryAgainText)))));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { View } from '@aws-amplify/ui-react';
|
|
3
3
|
import '../service/machine/index.mjs';
|
|
4
4
|
import { FaceMatchState, IlluminationState } from '../service/types/liveness.mjs';
|
|
5
5
|
import '@tensorflow/tfjs-core';
|
|
@@ -18,13 +18,17 @@ import { useLivenessActor } from '../hooks/useLivenessActor.mjs';
|
|
|
18
18
|
import { createLivenessSelector, useLivenessSelector } from '../hooks/useLivenessSelector.mjs';
|
|
19
19
|
import '@aws-amplify/ui';
|
|
20
20
|
import { Toast } from './Toast.mjs';
|
|
21
|
-
import {
|
|
21
|
+
import { ToastWithLoader } from './ToastWithLoader.mjs';
|
|
22
22
|
|
|
23
23
|
const selectErrorState = createLivenessSelector((state) => state.context.errorState);
|
|
24
24
|
const selectFaceMatchState = createLivenessSelector((state) => state.context.faceMatchAssociatedParams.faceMatchState);
|
|
25
25
|
const selectIlluminationState = createLivenessSelector((state) => state.context.faceMatchAssociatedParams.illuminationState);
|
|
26
26
|
const selectIsFaceFarEnoughBeforeRecording = createLivenessSelector((state) => state.context.isFaceFarEnoughBeforeRecording);
|
|
27
27
|
const selectFaceMatchStateBeforeStart = createLivenessSelector((state) => state.context.faceMatchStateBeforeStart);
|
|
28
|
+
const defaultToast = (text, isInitial = false) => {
|
|
29
|
+
return (React.createElement(Toast, { size: "large", variation: "primary", isInitial: isInitial },
|
|
30
|
+
React.createElement(View, { "aria-live": "polite", "aria-label": text }, text)));
|
|
31
|
+
};
|
|
28
32
|
const Hint = ({ hintDisplayText }) => {
|
|
29
33
|
const [state] = useLivenessActor();
|
|
30
34
|
// NOTE: Do not change order of these selectors as the unit tests depend on this order
|
|
@@ -59,7 +63,7 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
59
63
|
};
|
|
60
64
|
const getInstructionContent = () => {
|
|
61
65
|
if (isStartView) {
|
|
62
|
-
return (
|
|
66
|
+
return defaultToast(hintDisplayText.hintCenterFaceText, true);
|
|
63
67
|
}
|
|
64
68
|
if (errorState ?? (isCheckFailed || isCheckSuccessful)) {
|
|
65
69
|
return;
|
|
@@ -67,33 +71,27 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
67
71
|
if (!isRecording) {
|
|
68
72
|
if (isCheckFaceDetectedBeforeStart) {
|
|
69
73
|
if (faceMatchStateBeforeStart === FaceMatchState.TOO_MANY) {
|
|
70
|
-
return (
|
|
74
|
+
return defaultToast(FaceMatchStateStringMap[faceMatchStateBeforeStart]);
|
|
71
75
|
}
|
|
72
|
-
return (
|
|
76
|
+
return defaultToast(hintDisplayText.hintMoveFaceFrontOfCameraText);
|
|
73
77
|
}
|
|
74
78
|
// Specifically checking for false here because initially the value is undefined and we do not want to show the instruction
|
|
75
79
|
if (isCheckFaceDistanceBeforeRecording &&
|
|
76
80
|
isFaceFarEnoughBeforeRecordingState === false) {
|
|
77
|
-
return (
|
|
81
|
+
return defaultToast(hintDisplayText.hintTooCloseText);
|
|
78
82
|
}
|
|
79
83
|
if (isNotRecording) {
|
|
80
|
-
return (React.createElement(
|
|
81
|
-
React.createElement(Flex, { className: LivenessClassNames.HintText },
|
|
82
|
-
React.createElement(Loader, null),
|
|
83
|
-
React.createElement(View, null, hintDisplayText.hintConnectingText))));
|
|
84
|
+
return (React.createElement(ToastWithLoader, { displayText: hintDisplayText.hintConnectingText }));
|
|
84
85
|
}
|
|
85
86
|
if (isUploading) {
|
|
86
|
-
return (React.createElement(
|
|
87
|
-
React.createElement(Flex, { className: LivenessClassNames.HintText },
|
|
88
|
-
React.createElement(Loader, null),
|
|
89
|
-
React.createElement(View, null, hintDisplayText.hintVerifyingText))));
|
|
87
|
+
return (React.createElement(ToastWithLoader, { displayText: hintDisplayText.hintVerifyingText }));
|
|
90
88
|
}
|
|
91
89
|
if (illuminationState && illuminationState !== IlluminationState.NORMAL) {
|
|
92
|
-
return (
|
|
90
|
+
return defaultToast(IlluminationStateStringMap[illuminationState]);
|
|
93
91
|
}
|
|
94
92
|
}
|
|
95
93
|
if (isFlashingFreshness) {
|
|
96
|
-
return (
|
|
94
|
+
return defaultToast(hintDisplayText.hintHoldFaceForFreshnessText);
|
|
97
95
|
}
|
|
98
96
|
if (isRecording && !isFlashingFreshness) {
|
|
99
97
|
// During face matching, we want to only show the TOO_CLOSE or
|
|
@@ -105,7 +103,8 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
105
103
|
faceMatchState === FaceMatchState.MATCHED) {
|
|
106
104
|
resultHintString = FaceMatchStateStringMap[faceMatchState];
|
|
107
105
|
}
|
|
108
|
-
return (React.createElement(Toast, { size: "large", variation: faceMatchState === FaceMatchState.TOO_CLOSE ? 'error' : 'primary' },
|
|
106
|
+
return (React.createElement(Toast, { size: "large", variation: faceMatchState === FaceMatchState.TOO_CLOSE ? 'error' : 'primary' },
|
|
107
|
+
React.createElement(View, { "aria-live": "polite", "aria-label": resultHintString }, resultHintString)));
|
|
109
108
|
}
|
|
110
109
|
return null;
|
|
111
110
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { Flex } from '@aws-amplify/ui-react';
|
|
2
|
+
import { Button, Flex } from '@aws-amplify/ui-react';
|
|
3
3
|
import { useThemeBreakpoint, AlertIcon } from '@aws-amplify/ui-react/internal';
|
|
4
4
|
import { LivenessClassNames } from '../types/classNames.mjs';
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ import { LivenessClassNames } from '../types/classNames.mjs';
|
|
|
7
7
|
* Copied from src/primitives/Alert/AlertIcon.tsx because we want to re-use the icon but it is not currently expored by AlertIcon.
|
|
8
8
|
* We currently don't want to make a change to the AlertIcon primitive itself and may expose the icon in the future but for now so as not to introduce cross component dependencies we have duplicated it.
|
|
9
9
|
*/
|
|
10
|
-
const LivenessIconWithPopover = ({ children }) => {
|
|
10
|
+
const LivenessIconWithPopover = ({ children, headingText, labelText }) => {
|
|
11
11
|
const breakpoint = useThemeBreakpoint();
|
|
12
12
|
const [shouldShowPopover, setShouldShowPopover] = React.useState(false);
|
|
13
13
|
const wrapperRef = React.useRef(null);
|
|
@@ -25,12 +25,13 @@ const LivenessIconWithPopover = ({ children }) => {
|
|
|
25
25
|
document.removeEventListener('mousedown', handleClickOutside);
|
|
26
26
|
};
|
|
27
27
|
}, [wrapperRef, shouldShowPopover]);
|
|
28
|
-
return (React.createElement(
|
|
29
|
-
React.createElement(
|
|
28
|
+
return (React.createElement("div", { className: LivenessClassNames.Popover, ref: wrapperRef },
|
|
29
|
+
React.createElement(Button, { "aria-controls": "photosensitivity-description", "aria-expanded": shouldShowPopover, role: "alertdialog", "aria-label": labelText, "aria-describedby": "photosensitivity-description", colorTheme: "info", id: "popover-button", onClick: () => setShouldShowPopover(!shouldShowPopover), testId: "popover-icon" },
|
|
30
|
+
React.createElement(AlertIcon, { ariaHidden: true, variation: "info" })),
|
|
30
31
|
shouldShowPopover && (React.createElement(React.Fragment, null,
|
|
31
32
|
React.createElement(Flex, { className: LivenessClassNames.PopoverAnchor }),
|
|
32
33
|
React.createElement(Flex, { className: LivenessClassNames.PopoverAnchorSecondary }),
|
|
33
|
-
React.createElement(Flex, { className: LivenessClassNames.PopoverContainer, left: isMobileScreen ? -190 : -108,
|
|
34
|
+
React.createElement(Flex, { "aria-hidden": !shouldShowPopover, "aria-label": headingText, className: LivenessClassNames.PopoverContainer, "data-testid": "popover-text", id: "photosensitivity-description", left: isMobileScreen ? -190 : -108, role: "alertdialog" }, children)))));
|
|
34
35
|
};
|
|
35
36
|
LivenessIconWithPopover.displayName = 'LivenessIconWithPopover';
|
|
36
37
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Flex, Loader, View } from '@aws-amplify/ui-react';
|
|
3
|
+
import { LivenessClassNames } from '../types/classNames.mjs';
|
|
4
|
+
import { Toast } from './Toast.mjs';
|
|
5
|
+
|
|
6
|
+
const ToastWithLoader = ({ displayText, labelText, }) => {
|
|
7
|
+
return (React.createElement(Toast, { "aria-live": "polite", "aria-label": labelText ?? displayText },
|
|
8
|
+
React.createElement(Flex, { className: LivenessClassNames.HintText },
|
|
9
|
+
React.createElement(Loader, null),
|
|
10
|
+
React.createElement(View, null, displayText))));
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { ToastWithLoader };
|
|
@@ -12,7 +12,7 @@ function getDisplayText(overrideDisplayText) {
|
|
|
12
12
|
...defaultLivenessDisplayText,
|
|
13
13
|
...overrideDisplayText,
|
|
14
14
|
};
|
|
15
|
-
const {
|
|
15
|
+
const { a11yVideoLabelText, cameraMinSpecificationsHeadingText, cameraMinSpecificationsMessageText, cameraNotFoundHeadingText, cameraNotFoundMessageText, cancelLivenessCheckText, clientHeaderText, clientMessageText, hintCanNotIdentifyText, hintCenterFaceText, hintConnectingText, hintFaceDetectedText, hintHoldFaceForFreshnessText, hintIlluminationNormalText, hintIlluminationTooBrightText, hintIlluminationTooDarkText, hintMoveFaceFrontOfCameraText, hintTooManyFacesText, hintTooCloseText, hintTooFarText, hintVerifyingText, faceDistanceHeaderText, faceDistanceMessageText, goodFitCaptionText, goodFitAltText, landscapeHeaderText, landscapeMessageText, multipleFacesHeaderText, multipleFacesMessageText, photosensitivityWarningBodyText, photosensitivityWarningHeadingText, photosensitivityWarningInfoText, photosensitivityWarningLabelText, photosensitivyWarningBodyText, photosensitivyWarningHeadingText, photosensitivyWarningInfoText, photosensitivyWarningLabelText, portraitMessageText, retryCameraPermissionsText, recordingIndicatorText, serverHeaderText, serverMessageText, startScreenBeginCheckText, timeoutHeaderText, timeoutMessageText, tooFarCaptionText, tooFarAltText, tryAgainText, waitingCameraPermissionText, } = displayText;
|
|
16
16
|
const hintDisplayText = {
|
|
17
17
|
hintMoveFaceFrontOfCameraText,
|
|
18
18
|
hintTooManyFacesText,
|
|
@@ -38,9 +38,14 @@ function getDisplayText(overrideDisplayText) {
|
|
|
38
38
|
a11yVideoLabelText,
|
|
39
39
|
};
|
|
40
40
|
const instructionDisplayText = {
|
|
41
|
-
|
|
41
|
+
photosensitivityWarningBodyText,
|
|
42
|
+
photosensitivityWarningHeadingText,
|
|
43
|
+
photosensitivityWarningInfoText,
|
|
44
|
+
photosensitivityWarningLabelText,
|
|
42
45
|
photosensitivyWarningBodyText,
|
|
46
|
+
photosensitivyWarningHeadingText,
|
|
43
47
|
photosensitivyWarningInfoText,
|
|
48
|
+
photosensitivyWarningLabelText,
|
|
44
49
|
goodFitCaptionText,
|
|
45
50
|
goodFitAltText,
|
|
46
51
|
tooFarCaptionText,
|
package/dist/esm/version.mjs
CHANGED
package/dist/index.js
CHANGED
|
@@ -771,7 +771,7 @@ class VideoRecorder {
|
|
|
771
771
|
}
|
|
772
772
|
}
|
|
773
773
|
|
|
774
|
-
const VERSION = '3.0.
|
|
774
|
+
const VERSION = '3.0.6';
|
|
775
775
|
|
|
776
776
|
const BASE_USER_AGENT = `ui-react-liveness/${VERSION}`;
|
|
777
777
|
const getLivenessUserAgent = () => {
|
|
@@ -2530,11 +2530,22 @@ const Toast = ({ variation = 'default', size = 'medium', children, isInitial = f
|
|
|
2530
2530
|
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.ToastMessage, ...(isInitial ? { color: tokens.colors.font.primary } : {}) }, children))));
|
|
2531
2531
|
};
|
|
2532
2532
|
|
|
2533
|
+
const ToastWithLoader = ({ displayText, labelText, }) => {
|
|
2534
|
+
return (React__namespace.createElement(Toast, { "aria-live": "polite", "aria-label": labelText ?? displayText },
|
|
2535
|
+
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.HintText },
|
|
2536
|
+
React__namespace.createElement(uiReact.Loader, null),
|
|
2537
|
+
React__namespace.createElement(uiReact.View, null, displayText))));
|
|
2538
|
+
};
|
|
2539
|
+
|
|
2533
2540
|
const selectErrorState = createLivenessSelector((state) => state.context.errorState);
|
|
2534
2541
|
const selectFaceMatchState$1 = createLivenessSelector((state) => state.context.faceMatchAssociatedParams.faceMatchState);
|
|
2535
2542
|
const selectIlluminationState = createLivenessSelector((state) => state.context.faceMatchAssociatedParams.illuminationState);
|
|
2536
2543
|
const selectIsFaceFarEnoughBeforeRecording = createLivenessSelector((state) => state.context.isFaceFarEnoughBeforeRecording);
|
|
2537
2544
|
const selectFaceMatchStateBeforeStart = createLivenessSelector((state) => state.context.faceMatchStateBeforeStart);
|
|
2545
|
+
const defaultToast = (text, isInitial = false) => {
|
|
2546
|
+
return (React__namespace.createElement(Toast, { size: "large", variation: "primary", isInitial: isInitial },
|
|
2547
|
+
React__namespace.createElement(uiReact.View, { "aria-live": "polite", "aria-label": text }, text)));
|
|
2548
|
+
};
|
|
2538
2549
|
const Hint = ({ hintDisplayText }) => {
|
|
2539
2550
|
const [state] = useLivenessActor();
|
|
2540
2551
|
// NOTE: Do not change order of these selectors as the unit tests depend on this order
|
|
@@ -2569,7 +2580,7 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
2569
2580
|
};
|
|
2570
2581
|
const getInstructionContent = () => {
|
|
2571
2582
|
if (isStartView) {
|
|
2572
|
-
return (
|
|
2583
|
+
return defaultToast(hintDisplayText.hintCenterFaceText, true);
|
|
2573
2584
|
}
|
|
2574
2585
|
if (errorState ?? (isCheckFailed || isCheckSuccessful)) {
|
|
2575
2586
|
return;
|
|
@@ -2577,33 +2588,27 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
2577
2588
|
if (!isRecording) {
|
|
2578
2589
|
if (isCheckFaceDetectedBeforeStart) {
|
|
2579
2590
|
if (faceMatchStateBeforeStart === FaceMatchState.TOO_MANY) {
|
|
2580
|
-
return (
|
|
2591
|
+
return defaultToast(FaceMatchStateStringMap[faceMatchStateBeforeStart]);
|
|
2581
2592
|
}
|
|
2582
|
-
return (
|
|
2593
|
+
return defaultToast(hintDisplayText.hintMoveFaceFrontOfCameraText);
|
|
2583
2594
|
}
|
|
2584
2595
|
// Specifically checking for false here because initially the value is undefined and we do not want to show the instruction
|
|
2585
2596
|
if (isCheckFaceDistanceBeforeRecording &&
|
|
2586
2597
|
isFaceFarEnoughBeforeRecordingState === false) {
|
|
2587
|
-
return (
|
|
2598
|
+
return defaultToast(hintDisplayText.hintTooCloseText);
|
|
2588
2599
|
}
|
|
2589
2600
|
if (isNotRecording) {
|
|
2590
|
-
return (React__namespace.createElement(
|
|
2591
|
-
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.HintText },
|
|
2592
|
-
React__namespace.createElement(uiReact.Loader, null),
|
|
2593
|
-
React__namespace.createElement(uiReact.View, null, hintDisplayText.hintConnectingText))));
|
|
2601
|
+
return (React__namespace.createElement(ToastWithLoader, { displayText: hintDisplayText.hintConnectingText }));
|
|
2594
2602
|
}
|
|
2595
2603
|
if (isUploading) {
|
|
2596
|
-
return (React__namespace.createElement(
|
|
2597
|
-
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.HintText },
|
|
2598
|
-
React__namespace.createElement(uiReact.Loader, null),
|
|
2599
|
-
React__namespace.createElement(uiReact.View, null, hintDisplayText.hintVerifyingText))));
|
|
2604
|
+
return (React__namespace.createElement(ToastWithLoader, { displayText: hintDisplayText.hintVerifyingText }));
|
|
2600
2605
|
}
|
|
2601
2606
|
if (illuminationState && illuminationState !== IlluminationState.NORMAL) {
|
|
2602
|
-
return (
|
|
2607
|
+
return defaultToast(IlluminationStateStringMap[illuminationState]);
|
|
2603
2608
|
}
|
|
2604
2609
|
}
|
|
2605
2610
|
if (isFlashingFreshness) {
|
|
2606
|
-
return (
|
|
2611
|
+
return defaultToast(hintDisplayText.hintHoldFaceForFreshnessText);
|
|
2607
2612
|
}
|
|
2608
2613
|
if (isRecording && !isFlashingFreshness) {
|
|
2609
2614
|
// During face matching, we want to only show the TOO_CLOSE or
|
|
@@ -2615,7 +2620,8 @@ const Hint = ({ hintDisplayText }) => {
|
|
|
2615
2620
|
faceMatchState === FaceMatchState.MATCHED) {
|
|
2616
2621
|
resultHintString = FaceMatchStateStringMap[faceMatchState];
|
|
2617
2622
|
}
|
|
2618
|
-
return (React__namespace.createElement(Toast, { size: "large", variation: faceMatchState === FaceMatchState.TOO_CLOSE ? 'error' : 'primary' },
|
|
2623
|
+
return (React__namespace.createElement(Toast, { size: "large", variation: faceMatchState === FaceMatchState.TOO_CLOSE ? 'error' : 'primary' },
|
|
2624
|
+
React__namespace.createElement(uiReact.View, { "aria-live": "polite", "aria-label": resultHintString }, resultHintString)));
|
|
2619
2625
|
}
|
|
2620
2626
|
return null;
|
|
2621
2627
|
};
|
|
@@ -2672,24 +2678,15 @@ const defaultErrorDisplayText = {
|
|
|
2672
2678
|
tryAgainText: 'Try again',
|
|
2673
2679
|
};
|
|
2674
2680
|
const defaultLivenessDisplayText = {
|
|
2675
|
-
hintCenterFaceText: 'Center your face',
|
|
2676
|
-
startScreenBeginCheckText: 'Start video check',
|
|
2677
|
-
photosensitivyWarningHeadingText: 'Photosensitivity warning',
|
|
2678
|
-
photosensitivyWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
2679
|
-
photosensitivyWarningInfoText: 'Some people may experience may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
2680
|
-
goodFitCaptionText: 'Good fit',
|
|
2681
|
-
goodFitAltText: "Ilustration of a person's face, perfectly fitting inside of an oval.",
|
|
2682
|
-
tooFarCaptionText: 'Too far',
|
|
2683
|
-
tooFarAltText: "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.",
|
|
2684
2681
|
cameraMinSpecificationsHeadingText: 'Camera does not meet minimum specifications',
|
|
2685
2682
|
cameraMinSpecificationsMessageText: 'Camera must support at least 320*240 resolution and 15 frames per second.',
|
|
2686
2683
|
cameraNotFoundHeadingText: 'Camera is not accessible.',
|
|
2687
2684
|
cameraNotFoundMessageText: 'Check that a camera is connected and there is not another application using the camera. You may have to go into settings to grant camera permissions and close out all instances of your browser and retry.',
|
|
2688
|
-
retryCameraPermissionsText: 'Retry',
|
|
2689
|
-
waitingCameraPermissionText: 'Waiting for you to allow camera permission.',
|
|
2690
2685
|
a11yVideoLabelText: 'Webcam for liveness check',
|
|
2691
2686
|
cancelLivenessCheckText: 'Cancel Liveness check',
|
|
2692
|
-
|
|
2687
|
+
goodFitCaptionText: 'Good fit',
|
|
2688
|
+
goodFitAltText: "Ilustration of a person's face, perfectly fitting inside of an oval.",
|
|
2689
|
+
hintCenterFaceText: 'Center your face',
|
|
2693
2690
|
hintMoveFaceFrontOfCameraText: 'Move face in front of camera',
|
|
2694
2691
|
hintTooManyFacesText: 'Ensure only one face is in front of camera',
|
|
2695
2692
|
hintFaceDetectedText: 'Face detected',
|
|
@@ -2702,6 +2699,20 @@ const defaultLivenessDisplayText = {
|
|
|
2702
2699
|
hintIlluminationTooDarkText: 'Move to brighter area',
|
|
2703
2700
|
hintIlluminationNormalText: 'Lighting conditions normal',
|
|
2704
2701
|
hintHoldFaceForFreshnessText: 'Hold still',
|
|
2702
|
+
photosensitivityWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
2703
|
+
photosensitivityWarningHeadingText: 'Photosensitivity warning',
|
|
2704
|
+
photosensitivityWarningInfoText: 'Some people may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
2705
|
+
photosensitivityWarningLabelText: 'More information about photosensitivity',
|
|
2706
|
+
photosensitivyWarningBodyText: 'This check flashes different colors. Use caution if you are photosensitive.',
|
|
2707
|
+
photosensitivyWarningHeadingText: 'Photosensitivity warning',
|
|
2708
|
+
photosensitivyWarningInfoText: 'Some people may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.',
|
|
2709
|
+
photosensitivyWarningLabelText: 'More information about photosensitivity',
|
|
2710
|
+
retryCameraPermissionsText: 'Retry',
|
|
2711
|
+
recordingIndicatorText: 'Rec',
|
|
2712
|
+
startScreenBeginCheckText: 'Start video check',
|
|
2713
|
+
tooFarCaptionText: 'Too far',
|
|
2714
|
+
tooFarAltText: "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.",
|
|
2715
|
+
waitingCameraPermissionText: 'Waiting for you to allow camera permission.',
|
|
2705
2716
|
...defaultErrorDisplayText,
|
|
2706
2717
|
};
|
|
2707
2718
|
|
|
@@ -2735,8 +2746,8 @@ const renderToastErrorModal = (props) => {
|
|
|
2735
2746
|
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
2736
2747
|
React__default["default"].createElement(uiReact.Flex, { className: LivenessClassNames.ErrorModal },
|
|
2737
2748
|
React__default["default"].createElement(internal.AlertIcon, { ariaHidden: true, variation: "error" }),
|
|
2738
|
-
React__default["default"].createElement(uiReact.Text, { className: LivenessClassNames.ErrorModalHeading }, heading)),
|
|
2739
|
-
message));
|
|
2749
|
+
React__default["default"].createElement(uiReact.Text, { className: LivenessClassNames.ErrorModalHeading, id: "amplify-liveness-error-heading" }, heading)),
|
|
2750
|
+
React__default["default"].createElement(uiReact.Text, { id: "amplify-liveness-error-message" }, message)));
|
|
2740
2751
|
};
|
|
2741
2752
|
const renderErrorModal = ({ errorState, overrideErrorDisplayText, }) => {
|
|
2742
2753
|
const displayText = {
|
|
@@ -2763,7 +2774,7 @@ const FaceLivenessErrorModal = (props) => {
|
|
|
2763
2774
|
};
|
|
2764
2775
|
const { tryAgainText } = displayText;
|
|
2765
2776
|
return (React__default["default"].createElement(Overlay, { className: LivenessClassNames.OpaqueOverlay },
|
|
2766
|
-
React__default["default"].createElement(Toast,
|
|
2777
|
+
React__default["default"].createElement(Toast, { "aria-labelledby": "amplify-liveness-error-heading", "aria-describedby": "amplify-liveness-error-message", role: "alertdialog" },
|
|
2767
2778
|
children,
|
|
2768
2779
|
React__default["default"].createElement(uiReact.Flex, { justifyContent: "center" },
|
|
2769
2780
|
React__default["default"].createElement(uiReact.Button, { variation: "primary", type: "button", onClick: onRetry }, tryAgainText)))));
|
|
@@ -2773,7 +2784,7 @@ const FaceLivenessErrorModal = (props) => {
|
|
|
2773
2784
|
* Copied from src/primitives/Alert/AlertIcon.tsx because we want to re-use the icon but it is not currently expored by AlertIcon.
|
|
2774
2785
|
* We currently don't want to make a change to the AlertIcon primitive itself and may expose the icon in the future but for now so as not to introduce cross component dependencies we have duplicated it.
|
|
2775
2786
|
*/
|
|
2776
|
-
const LivenessIconWithPopover = ({ children }) => {
|
|
2787
|
+
const LivenessIconWithPopover = ({ children, headingText, labelText }) => {
|
|
2777
2788
|
const breakpoint = internal.useThemeBreakpoint();
|
|
2778
2789
|
const [shouldShowPopover, setShouldShowPopover] = React__namespace.useState(false);
|
|
2779
2790
|
const wrapperRef = React__namespace.useRef(null);
|
|
@@ -2791,21 +2802,22 @@ const LivenessIconWithPopover = ({ children }) => {
|
|
|
2791
2802
|
document.removeEventListener('mousedown', handleClickOutside);
|
|
2792
2803
|
};
|
|
2793
2804
|
}, [wrapperRef, shouldShowPopover]);
|
|
2794
|
-
return (React__namespace.createElement(
|
|
2795
|
-
React__namespace.createElement(
|
|
2805
|
+
return (React__namespace.createElement("div", { className: LivenessClassNames.Popover, ref: wrapperRef },
|
|
2806
|
+
React__namespace.createElement(uiReact.Button, { "aria-controls": "photosensitivity-description", "aria-expanded": shouldShowPopover, role: "alertdialog", "aria-label": labelText, "aria-describedby": "photosensitivity-description", colorTheme: "info", id: "popover-button", onClick: () => setShouldShowPopover(!shouldShowPopover), testId: "popover-icon" },
|
|
2807
|
+
React__namespace.createElement(internal.AlertIcon, { ariaHidden: true, variation: "info" })),
|
|
2796
2808
|
shouldShowPopover && (React__namespace.createElement(React__namespace.Fragment, null,
|
|
2797
2809
|
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.PopoverAnchor }),
|
|
2798
2810
|
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.PopoverAnchorSecondary }),
|
|
2799
|
-
React__namespace.createElement(uiReact.Flex, { className: LivenessClassNames.PopoverContainer, left: isMobileScreen ? -190 : -108,
|
|
2811
|
+
React__namespace.createElement(uiReact.Flex, { "aria-hidden": !shouldShowPopover, "aria-label": headingText, className: LivenessClassNames.PopoverContainer, "data-testid": "popover-text", id: "photosensitivity-description", left: isMobileScreen ? -190 : -108, role: "alertdialog" }, children)))));
|
|
2800
2812
|
};
|
|
2801
2813
|
LivenessIconWithPopover.displayName = 'LivenessIconWithPopover';
|
|
2802
2814
|
|
|
2803
|
-
const DefaultPhotosensitiveWarning = ({
|
|
2815
|
+
const DefaultPhotosensitiveWarning = ({ bodyText, headingText, infoText, labelText, }) => {
|
|
2804
2816
|
return (React__default["default"].createElement(uiReact.Flex, { className: `${ui.ComponentClassName.Alert} ${LivenessClassNames.StartScreenWarning}`, style: { zIndex: '3' } },
|
|
2805
2817
|
React__default["default"].createElement(uiReact.View, { flex: "1" },
|
|
2806
2818
|
React__default["default"].createElement(uiReact.View, { className: ui.ComponentClassName.AlertHeading }, headingText),
|
|
2807
2819
|
React__default["default"].createElement(uiReact.View, { className: ui.ComponentClassName.AlertBody }, bodyText)),
|
|
2808
|
-
React__default["default"].createElement(LivenessIconWithPopover,
|
|
2820
|
+
React__default["default"].createElement(LivenessIconWithPopover, { labelText: labelText, headingText: headingText }, infoText)));
|
|
2809
2821
|
};
|
|
2810
2822
|
const DefaultRecordingIcon = ({ recordingIndicatorText, }) => {
|
|
2811
2823
|
return (React__default["default"].createElement(uiReact.View, { className: LivenessClassNames.RecordingIconContainer },
|
|
@@ -2914,9 +2926,9 @@ const LivenessCameraModule = (props) => {
|
|
|
2914
2926
|
setAspectRatio(videoRef.current.videoWidth / videoRef.current.videoHeight);
|
|
2915
2927
|
}
|
|
2916
2928
|
}, [send, videoRef, isCameraReady, isMobileScreen]);
|
|
2917
|
-
const
|
|
2929
|
+
const photoSensitivityWarning = React__default["default"].useMemo(() => {
|
|
2918
2930
|
return (React__default["default"].createElement(uiReact.View, { style: { visibility: isStartView ? 'visible' : 'hidden' } },
|
|
2919
|
-
React__default["default"].createElement(PhotosensitiveWarning, {
|
|
2931
|
+
React__default["default"].createElement(PhotosensitiveWarning, { bodyText: instructionDisplayText.photosensitivityWarningBodyText, headingText: instructionDisplayText.photosensitivityWarningHeadingText, infoText: instructionDisplayText.photosensitivityWarningInfoText, labelText: instructionDisplayText.photosensitivityWarningLabelText })));
|
|
2920
2932
|
}, [PhotosensitiveWarning, instructionDisplayText, isStartView]);
|
|
2921
2933
|
const handleMediaPlay = () => {
|
|
2922
2934
|
setIsCameraReady(true);
|
|
@@ -2950,7 +2962,7 @@ const LivenessCameraModule = (props) => {
|
|
|
2950
2962
|
}
|
|
2951
2963
|
const isRecordingOnMobile = isMobileScreen && !isStartView && !isWaitingForCamera && isRecording;
|
|
2952
2964
|
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
2953
|
-
|
|
2965
|
+
photoSensitivityWarning,
|
|
2954
2966
|
React__default["default"].createElement(uiReact.Flex, { className: ui.classNames(LivenessClassNames.CameraModule, isRecordingOnMobile && `${LivenessClassNames.CameraModule}--mobile`), "data-testid": testId, gap: "zero" },
|
|
2955
2967
|
!isCameraReady && centeredLoader,
|
|
2956
2968
|
React__default["default"].createElement(uiReact.View, { as: "canvas", ref: freshnessColorRef, className: LivenessClassNames.FreshnessCanvas, hidden: true }),
|
|
@@ -3111,7 +3123,7 @@ function getDisplayText(overrideDisplayText) {
|
|
|
3111
3123
|
...defaultLivenessDisplayText,
|
|
3112
3124
|
...overrideDisplayText,
|
|
3113
3125
|
};
|
|
3114
|
-
const {
|
|
3126
|
+
const { a11yVideoLabelText, cameraMinSpecificationsHeadingText, cameraMinSpecificationsMessageText, cameraNotFoundHeadingText, cameraNotFoundMessageText, cancelLivenessCheckText, clientHeaderText, clientMessageText, hintCanNotIdentifyText, hintCenterFaceText, hintConnectingText, hintFaceDetectedText, hintHoldFaceForFreshnessText, hintIlluminationNormalText, hintIlluminationTooBrightText, hintIlluminationTooDarkText, hintMoveFaceFrontOfCameraText, hintTooManyFacesText, hintTooCloseText, hintTooFarText, hintVerifyingText, faceDistanceHeaderText, faceDistanceMessageText, goodFitCaptionText, goodFitAltText, landscapeHeaderText, landscapeMessageText, multipleFacesHeaderText, multipleFacesMessageText, photosensitivityWarningBodyText, photosensitivityWarningHeadingText, photosensitivityWarningInfoText, photosensitivityWarningLabelText, photosensitivyWarningBodyText, photosensitivyWarningHeadingText, photosensitivyWarningInfoText, photosensitivyWarningLabelText, portraitMessageText, retryCameraPermissionsText, recordingIndicatorText, serverHeaderText, serverMessageText, startScreenBeginCheckText, timeoutHeaderText, timeoutMessageText, tooFarCaptionText, tooFarAltText, tryAgainText, waitingCameraPermissionText, } = displayText;
|
|
3115
3127
|
const hintDisplayText = {
|
|
3116
3128
|
hintMoveFaceFrontOfCameraText,
|
|
3117
3129
|
hintTooManyFacesText,
|
|
@@ -3137,9 +3149,14 @@ function getDisplayText(overrideDisplayText) {
|
|
|
3137
3149
|
a11yVideoLabelText,
|
|
3138
3150
|
};
|
|
3139
3151
|
const instructionDisplayText = {
|
|
3140
|
-
|
|
3152
|
+
photosensitivityWarningBodyText,
|
|
3153
|
+
photosensitivityWarningHeadingText,
|
|
3154
|
+
photosensitivityWarningInfoText,
|
|
3155
|
+
photosensitivityWarningLabelText,
|
|
3141
3156
|
photosensitivyWarningBodyText,
|
|
3157
|
+
photosensitivyWarningHeadingText,
|
|
3142
3158
|
photosensitivyWarningInfoText,
|
|
3159
|
+
photosensitivyWarningLabelText,
|
|
3143
3160
|
goodFitCaptionText,
|
|
3144
3161
|
goodFitAltText,
|
|
3145
3162
|
tooFarCaptionText,
|
package/dist/styles.css
CHANGED
|
@@ -4213,7 +4213,7 @@ html[dir=rtl] .amplify-field-group__inner-start {
|
|
|
4213
4213
|
|
|
4214
4214
|
.amplify-liveness-start-screen-warning {
|
|
4215
4215
|
color: var(--amplify-colors-blue-90);
|
|
4216
|
-
background-color: var(--amplify-colors-blue-
|
|
4216
|
+
background-color: var(--amplify-colors-blue-10);
|
|
4217
4217
|
align-items: center;
|
|
4218
4218
|
z-index: 3;
|
|
4219
4219
|
}
|
|
@@ -4255,13 +4255,12 @@ html[dir=rtl] .amplify-field-group__inner-start {
|
|
|
4255
4255
|
|
|
4256
4256
|
.amplify-liveness-popover {
|
|
4257
4257
|
position: relative;
|
|
4258
|
-
cursor: pointer;
|
|
4259
4258
|
}
|
|
4260
4259
|
|
|
4261
4260
|
.amplify-liveness-popover__anchor {
|
|
4262
4261
|
position: absolute;
|
|
4263
4262
|
top: 26px;
|
|
4264
|
-
left:
|
|
4263
|
+
left: 20px;
|
|
4265
4264
|
z-index: 3;
|
|
4266
4265
|
border-style: solid;
|
|
4267
4266
|
border-width: 0 9px 9px 9px;
|
|
@@ -4271,7 +4270,7 @@ html[dir=rtl] .amplify-field-group__inner-start {
|
|
|
4271
4270
|
.amplify-liveness-popover__anchor-secondary {
|
|
4272
4271
|
position: absolute;
|
|
4273
4272
|
top: 24px;
|
|
4274
|
-
left:
|
|
4273
|
+
left: 19px;
|
|
4275
4274
|
z-index: 2;
|
|
4276
4275
|
border-style: solid;
|
|
4277
4276
|
border-width: 0 10px 10px 10px;
|
|
@@ -4284,6 +4283,7 @@ html[dir=rtl] .amplify-field-group__inner-start {
|
|
|
4284
4283
|
color: var(--amplify-colors-font-primary);
|
|
4285
4284
|
flex-direction: row;
|
|
4286
4285
|
font-size: var(--amplify-font-sizes-xs);
|
|
4286
|
+
font-weight: var(--amplify-font-weights-normal);
|
|
4287
4287
|
padding: var(--amplify-space-small);
|
|
4288
4288
|
top: 33px;
|
|
4289
4289
|
width: 240px;
|
|
@@ -23,14 +23,19 @@ export type CameraDisplayText = {
|
|
|
23
23
|
a11yVideoLabelText?: string;
|
|
24
24
|
};
|
|
25
25
|
export type InstructionDisplayText = {
|
|
26
|
-
photosensitivyWarningHeadingText?: string;
|
|
27
|
-
photosensitivyWarningBodyText?: string;
|
|
28
|
-
photosensitivyWarningInfoText?: string;
|
|
29
26
|
goodFitCaptionText?: string;
|
|
30
27
|
goodFitAltText?: string;
|
|
28
|
+
photosensitivityWarningBodyText?: string;
|
|
29
|
+
photosensitivityWarningHeadingText?: string;
|
|
30
|
+
photosensitivityWarningInfoText?: string;
|
|
31
|
+
photosensitivityWarningLabelText?: string;
|
|
32
|
+
photosensitivyWarningBodyText?: string;
|
|
33
|
+
photosensitivyWarningHeadingText?: string;
|
|
34
|
+
photosensitivyWarningInfoText?: string;
|
|
35
|
+
photosensitivyWarningLabelText?: string;
|
|
36
|
+
startScreenBeginCheckText?: string;
|
|
31
37
|
tooFarCaptionText?: string;
|
|
32
38
|
tooFarAltText?: string;
|
|
33
|
-
startScreenBeginCheckText?: string;
|
|
34
39
|
};
|
|
35
40
|
export type StreamDisplayText = {
|
|
36
41
|
recordingIndicatorText?: string;
|
|
@@ -5,11 +5,12 @@ export interface StartScreenComponents {
|
|
|
5
5
|
PhotosensitiveWarning?: React.ComponentType;
|
|
6
6
|
}
|
|
7
7
|
interface DefaultPhotosensitiveWarningProps {
|
|
8
|
-
headingText: string;
|
|
9
8
|
bodyText: string;
|
|
9
|
+
headingText: string;
|
|
10
10
|
infoText: string;
|
|
11
|
+
labelText: string;
|
|
11
12
|
}
|
|
12
|
-
export declare const DefaultPhotosensitiveWarning: ({
|
|
13
|
+
export declare const DefaultPhotosensitiveWarning: ({ bodyText, headingText, infoText, labelText, }: DefaultPhotosensitiveWarningProps) => JSX.Element;
|
|
13
14
|
interface DefaultRecordingIconProps {
|
|
14
15
|
recordingIndicatorText: string;
|
|
15
16
|
}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "3.0.
|
|
1
|
+
export declare const VERSION = "3.0.6";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-amplify/ui-react-liveness",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.6",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/esm/index.mjs",
|
|
6
6
|
"exports": {
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"react-dom": "^16.14.0 || ^17.0 || ^18.0"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@aws-amplify/ui": "6.0.
|
|
51
|
-
"@aws-amplify/ui-react": "6.0.
|
|
50
|
+
"@aws-amplify/ui": "6.0.5",
|
|
51
|
+
"@aws-amplify/ui-react": "6.0.6",
|
|
52
52
|
"@aws-sdk/client-rekognitionstreaming": "3.398.0",
|
|
53
53
|
"@aws-sdk/util-format-url": "^3.410.0",
|
|
54
54
|
"@smithy/eventstream-serde-browser": "^2.0.4",
|