@incodetech/web 2.0.0-alpha.2 → 2.0.0-alpha.3
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/asset-manifest.json +16 -16
- package/package.json +5 -2
- package/.turbo/turbo-build.log +0 -58
- package/.turbo/turbo-coverage.log +0 -23
- package/.turbo/turbo-format.log +0 -6
- package/.turbo/turbo-lint$colon$fix.log +0 -6
- package/.turbo/turbo-lint.log +0 -6
- package/.turbo/turbo-test.log +0 -1033
- package/.turbo/turbo-typecheck.log +0 -5
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/email/email.tsx.html +0 -850
- package/coverage/email/emailInput.tsx.html +0 -340
- package/coverage/email/index.html +0 -131
- package/coverage/favicon.png +0 -0
- package/coverage/flow/flow.tsx.html +0 -961
- package/coverage/flow/flowCompleted.tsx.html +0 -448
- package/coverage/flow/flowInit.ts.html +0 -367
- package/coverage/flow/flowStart.tsx.html +0 -208
- package/coverage/flow/index.html +0 -221
- package/coverage/flow/preloadFlow.ts.html +0 -598
- package/coverage/flow/unsupportedModule.tsx.html +0 -202
- package/coverage/flow/useFlowInitialization.ts.html +0 -469
- package/coverage/flow/useModuleLoader.ts.html +0 -361
- package/coverage/hooks/index.html +0 -116
- package/coverage/hooks/useManager.ts.html +0 -205
- package/coverage/index.html +0 -401
- package/coverage/permissions/boldWithArrow.tsx.html +0 -208
- package/coverage/permissions/denied.tsx.html +0 -172
- package/coverage/permissions/deniedAndroid.tsx.html +0 -253
- package/coverage/permissions/deniedDesktop.tsx.html +0 -277
- package/coverage/permissions/deniedIOS.tsx.html +0 -304
- package/coverage/permissions/deniedInstructions.tsx.html +0 -142
- package/coverage/permissions/iconWrapper.tsx.html +0 -130
- package/coverage/permissions/index.html +0 -251
- package/coverage/permissions/learnMore.tsx.html +0 -340
- package/coverage/permissions/numberedStep.tsx.html +0 -127
- package/coverage/permissions/permissions.tsx.html +0 -289
- package/coverage/phone/index.html +0 -116
- package/coverage/phone/phoneInput.tsx.html +0 -832
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/selfie/index.html +0 -131
- package/coverage/selfie/selfie.tsx.html +0 -334
- package/coverage/selfie/tutorial.tsx.html +0 -214
- package/coverage/shared/baseTutorial/baseTutorial.tsx.html +0 -250
- package/coverage/shared/baseTutorial/index.html +0 -131
- package/coverage/shared/baseTutorial/replaceBaseTutorial.ts.html +0 -289
- package/coverage/shared/button/button.tsx.html +0 -226
- package/coverage/shared/button/index.html +0 -116
- package/coverage/shared/componentRoot/incodeComponent.tsx.html +0 -121
- package/coverage/shared/componentRoot/index.html +0 -116
- package/coverage/shared/countries/countries.ts.html +0 -502
- package/coverage/shared/countries/index.html +0 -116
- package/coverage/shared/icons/chevronDown.tsx.html +0 -151
- package/coverage/shared/icons/index.html +0 -131
- package/coverage/shared/icons/successIcon.tsx.html +0 -163
- package/coverage/shared/loader/index.html +0 -116
- package/coverage/shared/loader/loadingIcon.tsx.html +0 -286
- package/coverage/shared/otpInput/index.html +0 -116
- package/coverage/shared/otpInput/otpInput.tsx.html +0 -808
- package/coverage/shared/page/index.html +0 -146
- package/coverage/shared/page/page.tsx.html +0 -358
- package/coverage/shared/page/pageUiConfig.ts.html +0 -277
- package/coverage/shared/page/verifiedByIncode.tsx.html +0 -310
- package/coverage/shared/spacer/index.html +0 -116
- package/coverage/shared/spacer/spacer.tsx.html +0 -349
- package/coverage/shared/spinner/index.html +0 -116
- package/coverage/shared/spinner/spinner.tsx.html +0 -280
- package/coverage/shared/title/index.html +0 -116
- package/coverage/shared/title/title.tsx.html +0 -121
- package/coverage/shared/uiConfig/index.html +0 -116
- package/coverage/shared/uiConfig/uiConfig.ts.html +0 -193
- package/coverage/shared/webComponent/incodeModule.ts.html +0 -172
- package/coverage/shared/webComponent/index.html +0 -131
- package/coverage/shared/webComponent/registerIncodeElement.ts.html +0 -130
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/styles/cn.tsx.html +0 -148
- package/coverage/styles/fetchTheme.ts.html +0 -349
- package/coverage/styles/index.html +0 -131
- package/dev/README.md +0 -163
- package/dev/getToken.ts +0 -36
- package/dev/headless.html +0 -875
- package/dev/index.html +0 -366
- package/dev/main-headless.tsx +0 -1332
- package/dev/main-orchestrated-flow.tsx +0 -1158
- package/dev/main-preact.tsx +0 -323
- package/dev/main-simplified.tsx +0 -123
- package/dev/main-web-component.tsx +0 -256
- package/dev/main.tsx +0 -332
- package/dev/manual.html +0 -27
- package/dev/orchestrated-flow.html +0 -64
- package/dev/simplified.html +0 -64
- package/dev/tiktok-logo.svg +0 -7
- package/src/defineCustomElement.tsx +0 -30
- package/src/email/email.test.tsx +0 -368
- package/src/email/email.tsx +0 -255
- package/src/email/emailInput.test.tsx +0 -264
- package/src/email/emailInput.tsx +0 -85
- package/src/email/styles.css +0 -59
- package/src/flow/flow.test.tsx +0 -796
- package/src/flow/flow.tsx +0 -292
- package/src/flow/flowCompleted.css +0 -30
- package/src/flow/flowCompleted.test.tsx +0 -331
- package/src/flow/flowCompleted.tsx +0 -121
- package/src/flow/flowInit.test.ts +0 -264
- package/src/flow/flowInit.ts +0 -94
- package/src/flow/flowStart.css +0 -58
- package/src/flow/flowStart.test.tsx +0 -49
- package/src/flow/flowStart.tsx +0 -41
- package/src/flow/incode-logo.svg +0 -8
- package/src/flow/index.ts +0 -7
- package/src/flow/preloadFlow.test.ts +0 -421
- package/src/flow/preloadFlow.ts +0 -171
- package/src/flow/styles.css +0 -9
- package/src/flow/unsupportedModule.css +0 -21
- package/src/flow/unsupportedModule.tsx +0 -39
- package/src/flow/useFlowInitialization.test.tsx +0 -292
- package/src/flow/useFlowInitialization.ts +0 -128
- package/src/flow/useModuleLoader.test.tsx +0 -212
- package/src/flow/useModuleLoader.ts +0 -92
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useManager.test.ts +0 -91
- package/src/hooks/useManager.ts +0 -40
- package/src/i18n/index.ts +0 -3
- package/src/i18n/instance.ts +0 -16
- package/src/i18n/setup.ts +0 -184
- package/src/i18n/useTranslation.ts +0 -42
- package/src/index.ts +0 -27
- package/src/permissions/assets/android-dots-icon.svg +0 -7
- package/src/permissions/assets/android-settings-icon.svg +0 -16
- package/src/permissions/assets/android-toggle-icon.svg +0 -20
- package/src/permissions/assets/bank-card-icon.svg +0 -14
- package/src/permissions/assets/camera-icon.svg +0 -12
- package/src/permissions/assets/camera-ios.svg +0 -53
- package/src/permissions/assets/check-icon.svg +0 -8
- package/src/permissions/assets/chrome-icon.svg +0 -43
- package/src/permissions/assets/password-icon.svg +0 -11
- package/src/permissions/assets/permissions-img.svg +0 -51
- package/src/permissions/assets/safari-icon.svg +0 -37
- package/src/permissions/assets/settings-icon.svg +0 -33
- package/src/permissions/assets/toggle-icon.svg +0 -19
- package/src/permissions/assets/warning-icon.svg +0 -6
- package/src/permissions/boldWithArrow.css +0 -9
- package/src/permissions/boldWithArrow.tsx +0 -41
- package/src/permissions/denied.css +0 -37
- package/src/permissions/denied.tsx +0 -29
- package/src/permissions/deniedAndroid.tsx +0 -56
- package/src/permissions/deniedDesktop.css +0 -9
- package/src/permissions/deniedDesktop.tsx +0 -64
- package/src/permissions/deniedIOS.tsx +0 -73
- package/src/permissions/deniedInstructions.tsx +0 -19
- package/src/permissions/iconWrapper.css +0 -9
- package/src/permissions/iconWrapper.tsx +0 -15
- package/src/permissions/learnMore.css +0 -37
- package/src/permissions/learnMore.tsx +0 -85
- package/src/permissions/numberedStep.css +0 -13
- package/src/permissions/numberedStep.tsx +0 -14
- package/src/permissions/permissions.css +0 -13
- package/src/permissions/permissions.tsx +0 -68
- package/src/phone/phone.tsx +0 -246
- package/src/phone/phoneInput.test.tsx +0 -275
- package/src/phone/phoneInput.tsx +0 -249
- package/src/phone/styles.css +0 -158
- package/src/selfie/cameraButton.css +0 -13
- package/src/selfie/cameraButton.tsx +0 -35
- package/src/selfie/capture.css +0 -57
- package/src/selfie/capture.tsx +0 -232
- package/src/selfie/errorModal.tsx +0 -218
- package/src/selfie/errorModalContent.css +0 -33
- package/src/selfie/errorModalContent.tsx +0 -44
- package/src/selfie/faceOutline.css +0 -5
- package/src/selfie/faceOutline.tsx +0 -22
- package/src/selfie/loadingBorder.css +0 -12
- package/src/selfie/loadingBorder.tsx +0 -77
- package/src/selfie/manualCaptureButton.css +0 -13
- package/src/selfie/manualCaptureButton.tsx +0 -35
- package/src/selfie/noMoreAttemptsModal.tsx +0 -44
- package/src/selfie/notification.css +0 -9
- package/src/selfie/notification.tsx +0 -36
- package/src/selfie/retryErrorModal.tsx +0 -56
- package/src/selfie/selfie.test.tsx +0 -458
- package/src/selfie/selfie.tsx +0 -83
- package/src/selfie/selfieTutorial.json +0 -2626
- package/src/selfie/styles.css +0 -1
- package/src/selfie/tutorial.test.tsx +0 -200
- package/src/selfie/tutorial.tsx +0 -43
- package/src/setup.ts +0 -33
- package/src/shared/baseTutorial/baseTutorial.css +0 -21
- package/src/shared/baseTutorial/baseTutorial.test.tsx +0 -184
- package/src/shared/baseTutorial/baseTutorial.tsx +0 -55
- package/src/shared/baseTutorial/replaceBaseTutorial.test.ts +0 -267
- package/src/shared/baseTutorial/replaceBaseTutorial.ts +0 -68
- package/src/shared/button/button.css +0 -55
- package/src/shared/button/button.test.tsx +0 -101
- package/src/shared/button/button.tsx +0 -47
- package/src/shared/componentRoot/incodeComponent.tsx +0 -12
- package/src/shared/countries/countries.test.ts +0 -75
- package/src/shared/countries/countries.ts +0 -139
- package/src/shared/countries/index.ts +0 -6
- package/src/shared/icons/chevronDown.tsx +0 -22
- package/src/shared/icons/index.ts +0 -2
- package/src/shared/icons/successIcon.css +0 -5
- package/src/shared/icons/successIcon.test.tsx +0 -40
- package/src/shared/icons/successIcon.tsx +0 -26
- package/src/shared/loader/loadingIcon.css +0 -28
- package/src/shared/loader/loadingIcon.tsx +0 -67
- package/src/shared/lottie/lottie.tsx +0 -108
- package/src/shared/otpInput/otpInput.css +0 -85
- package/src/shared/otpInput/otpInput.test.tsx +0 -356
- package/src/shared/otpInput/otpInput.tsx +0 -241
- package/src/shared/page/incode-logo.svg +0 -3
- package/src/shared/page/page.css +0 -47
- package/src/shared/page/page.test.tsx +0 -97
- package/src/shared/page/page.tsx +0 -91
- package/src/shared/page/pageUiConfig.test.ts +0 -112
- package/src/shared/page/pageUiConfig.ts +0 -64
- package/src/shared/page/verifiedByIncode.css +0 -5
- package/src/shared/page/verifiedByIncode.tsx +0 -75
- package/src/shared/spacer/spacer.css +0 -149
- package/src/shared/spacer/spacer.test.tsx +0 -143
- package/src/shared/spacer/spacer.tsx +0 -88
- package/src/shared/spinner/index.ts +0 -2
- package/src/shared/spinner/spinner.css +0 -28
- package/src/shared/spinner/spinner.test.tsx +0 -82
- package/src/shared/spinner/spinner.tsx +0 -65
- package/src/shared/title/title.css +0 -7
- package/src/shared/title/title.tsx +0 -12
- package/src/shared/uiConfig/uiConfig.ts +0 -36
- package/src/shared/webComponent/incodeModule.ts +0 -29
- package/src/shared/webComponent/registerIncodeElement.ts +0 -15
- package/src/styles/__mocks__/fetchTheme.ts +0 -19
- package/src/styles/applyTheme.ts +0 -37
- package/src/styles/cn.test.tsx +0 -57
- package/src/styles/cn.tsx +0 -21
- package/src/styles/core.css +0 -12
- package/src/styles/fetchTheme.test.ts +0 -390
- package/src/styles/fetchTheme.ts +0 -88
- package/src/styles/generatePalette.ts +0 -111
- package/src/styles/reset.css +0 -65
- package/src/styles/resolveCssVariableToHex.ts +0 -28
- package/src/styles/tailwind.css +0 -291
- package/src/styles/themeTypes.ts +0 -18
- package/src/styles/tokens/colors.css +0 -190
- package/src/styles/tokens/components.css +0 -174
- package/src/styles/tokens/index.css +0 -4
- package/src/styles/tokens/primitives.css +0 -129
- package/src/styles/tokens/semantic.css +0 -51
- package/src/svg.d.ts +0 -4
- package/src/types/assets.d.ts +0 -1
- package/src/types/custom-elements.d.ts +0 -104
- package/tsconfig.json +0 -22
- package/vite.config.ts +0 -260
- package/vitest.config.ts +0 -40
- package/vitest.setup.ts +0 -16
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { FC } from 'preact/compat';
|
|
2
|
-
import './cameraButton.css';
|
|
3
|
-
|
|
4
|
-
export const CameraButton: FC = () => {
|
|
5
|
-
return (
|
|
6
|
-
<div class="IncodeCameraButton">
|
|
7
|
-
<svg
|
|
8
|
-
width="64"
|
|
9
|
-
height="64"
|
|
10
|
-
viewBox="0 0 64 64"
|
|
11
|
-
fill="none"
|
|
12
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
13
|
-
aria-hidden="true"
|
|
14
|
-
>
|
|
15
|
-
<path
|
|
16
|
-
d="M0 32C0 14.3269 14.3269 0 32 0C49.6731 0 64 14.3269 64 32C64 49.6731 49.6731 64 32 64C14.3269 64 0 49.6731 0 32Z"
|
|
17
|
-
class="IncodeCameraButtonBackground"
|
|
18
|
-
/>
|
|
19
|
-
<path
|
|
20
|
-
fillRule="evenodd"
|
|
21
|
-
clipRule="evenodd"
|
|
22
|
-
d="M41.872 28.9792C41.872 29.6692 41.312 30.2292 40.622 30.2292C39.932 30.2292 39.372 29.6692 39.372 28.9792C39.372 28.2892 39.932 27.6808 40.622 27.6808C41.312 27.6808 41.872 28.1908 41.872 28.8808V28.9792ZM31.9987 40.7475C28.467 40.7475 25.5937 37.8742 25.5937 34.3425C25.5937 30.8108 28.467 27.9375 31.9987 27.9375C35.5303 27.9375 38.4037 30.8108 38.4037 34.3425C38.4037 37.8742 35.5303 40.7475 31.9987 40.7475ZM41.9287 23.4192C41.3237 23.3958 40.7603 23.1425 40.3553 22.7192C40.282 22.6375 39.9853 22.2692 39.2937 20.9725C38.4987 19.4858 36.9587 18.5625 35.2753 18.5625H28.7553C27.0987 18.5625 25.5703 19.4642 24.7703 20.9142C24.042 22.2325 23.7403 22.6208 23.6587 22.7108C23.2403 23.1475 22.677 23.4025 22.1037 23.4275C18.8337 23.4275 16.172 26.0875 16.167 29.3575V38.7608C16.167 42.9942 19.612 46.4392 23.8437 46.4392H40.157C44.3903 46.4392 47.8337 42.9942 47.8337 38.7608V29.3542C47.8337 26.0808 45.1703 23.4192 41.9287 23.4192Z"
|
|
23
|
-
class="IncodeCameraButtonPath"
|
|
24
|
-
/>
|
|
25
|
-
|
|
26
|
-
<path
|
|
27
|
-
fillRule="evenodd"
|
|
28
|
-
clipRule="evenodd"
|
|
29
|
-
d="M31.9987 30.4375C29.8454 30.4375 28.0938 32.1892 28.0938 34.3425C28.0938 36.4958 29.8454 38.2475 31.9987 38.2475C34.152 38.2475 35.9037 36.4958 35.9037 34.3425C35.9037 32.1892 34.152 30.4375 31.9987 30.4375Z"
|
|
30
|
-
class="IncodeCameraButtonPath"
|
|
31
|
-
/>
|
|
32
|
-
</svg>
|
|
33
|
-
</div>
|
|
34
|
-
);
|
|
35
|
-
};
|
package/src/selfie/capture.css
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
@reference "../styles/tailwind.css";
|
|
2
|
-
|
|
3
|
-
.IncodeCaptureContainer {
|
|
4
|
-
@apply flex flex-col items-center justify-start h-full relative overflow-hidden flex-1;
|
|
5
|
-
.IncodeCaptureFrame {
|
|
6
|
-
@apply w-full max-w-[335px] rounded-full aspect-square relative border-12 border-transparent;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
.IncodeCaptureVideoWrapper {
|
|
10
|
-
@apply w-[calc(100%-24px)] h-[calc(100%-24px)] rounded-full overflow-hidden top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex items-center justify-center bg-white absolute;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.IncodeCaptureVideo {
|
|
14
|
-
@apply h-full w-full absolute z-50;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.IncodeCaptureVideoElement {
|
|
18
|
-
@apply w-full h-full object-cover absolute;
|
|
19
|
-
transform: scaleX(-1);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.IncodeCaptureUploadingPage {
|
|
24
|
-
.IncodeCaptureUploadingContainer {
|
|
25
|
-
@apply flex flex-col flex-1;
|
|
26
|
-
animation: fadeInScale 0.4s ease-out;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.IncodeCaptureUploadingTitle {
|
|
30
|
-
@apply text-2xl font-bold text-center tracking-[-1px] leading-[125%] text-text-body-primary;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.IncodeCaptureUploadingPrimaryIcon {
|
|
34
|
-
@apply fill-spinner-surface-primary;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.IncodeCaptureUploadingSecondaryIcon {
|
|
38
|
-
@apply fill-spinner-surface-secondary;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@keyframes fadeInScale {
|
|
42
|
-
from {
|
|
43
|
-
opacity: 0;
|
|
44
|
-
transform: scale(0.95);
|
|
45
|
-
}
|
|
46
|
-
to {
|
|
47
|
-
opacity: 1;
|
|
48
|
-
transform: scale(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.IncodeCaptureSuccessPage {
|
|
54
|
-
.IncodeCaptureSuccessContainer {
|
|
55
|
-
@apply flex flex-col items-center flex-1;
|
|
56
|
-
}
|
|
57
|
-
}
|
package/src/selfie/capture.tsx
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import type { SelfieManager, SelfieState } from '@incodetech/core/selfie';
|
|
2
|
-
import type { FC } from 'preact/compat';
|
|
3
|
-
import { useEffect, useRef, useState } from 'preact/hooks';
|
|
4
|
-
import { useTranslation } from '@/i18n/useTranslation';
|
|
5
|
-
import { Button } from '@/shared/button/button';
|
|
6
|
-
import { SuccessIcon } from '@/shared/icons/successIcon';
|
|
7
|
-
import { LoadingIcon } from '@/shared/loader/loadingIcon';
|
|
8
|
-
import { Page } from '@/shared/page/page';
|
|
9
|
-
import { Spacer } from '@/shared/spacer/spacer';
|
|
10
|
-
import { Title } from '@/shared/title/title';
|
|
11
|
-
import { ErrorModal } from './errorModal';
|
|
12
|
-
import { FaceOutline } from './faceOutline';
|
|
13
|
-
import { type BorderState, LoadingBorder } from './loadingBorder';
|
|
14
|
-
import { ManualCaptureButton } from './manualCaptureButton';
|
|
15
|
-
import { Notification } from './notification';
|
|
16
|
-
import './capture.css';
|
|
17
|
-
|
|
18
|
-
type CaptureState = Extract<SelfieState, { status: 'capture' }>;
|
|
19
|
-
|
|
20
|
-
type CaptureProps = {
|
|
21
|
-
manager: SelfieManager;
|
|
22
|
-
state: CaptureState;
|
|
23
|
-
onFinish: () => void;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export const Capture: FC<CaptureProps> = ({ manager, state, onFinish }) => {
|
|
27
|
-
const {
|
|
28
|
-
captureStatus,
|
|
29
|
-
stream,
|
|
30
|
-
detectionStatus,
|
|
31
|
-
attemptsRemaining,
|
|
32
|
-
uploadError,
|
|
33
|
-
} = state;
|
|
34
|
-
const [isManualCapturing, setIsManualCapturing] = useState(false);
|
|
35
|
-
const { t } = useTranslation();
|
|
36
|
-
|
|
37
|
-
if (captureStatus === 'initializing') {
|
|
38
|
-
return (
|
|
39
|
-
<Page
|
|
40
|
-
className="IncodeCaptureInitializingPage"
|
|
41
|
-
title="Initializing Camera"
|
|
42
|
-
subtitle="Please wait..."
|
|
43
|
-
>
|
|
44
|
-
<div
|
|
45
|
-
style={{
|
|
46
|
-
display: 'flex',
|
|
47
|
-
justifyContent: 'center',
|
|
48
|
-
marginTop: 'auto',
|
|
49
|
-
}}
|
|
50
|
-
>
|
|
51
|
-
<Button isLoading>Initializing...</Button>
|
|
52
|
-
</div>
|
|
53
|
-
</Page>
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (captureStatus === 'detecting') {
|
|
58
|
-
if (detectionStatus === 'offline') {
|
|
59
|
-
return (
|
|
60
|
-
<Page>
|
|
61
|
-
<div class="flex flex-col items-center justify-center h-full">
|
|
62
|
-
<p class="text-text-body-primary">No internet connection</p>
|
|
63
|
-
</div>
|
|
64
|
-
</Page>
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const getBorderState = (): BorderState => {
|
|
69
|
-
if (isManualCapturing) {
|
|
70
|
-
return 'capturing';
|
|
71
|
-
}
|
|
72
|
-
if (detectionStatus === 'detecting') {
|
|
73
|
-
return 'idle';
|
|
74
|
-
}
|
|
75
|
-
if (detectionStatus === 'getReady') {
|
|
76
|
-
return 'loading';
|
|
77
|
-
}
|
|
78
|
-
if (detectionStatus === 'success') {
|
|
79
|
-
return 'success';
|
|
80
|
-
}
|
|
81
|
-
if (detectionStatus === 'error') {
|
|
82
|
-
return 'error';
|
|
83
|
-
}
|
|
84
|
-
return 'idle';
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<Page data-testid="capture-container">
|
|
89
|
-
<Spacer size={48} />
|
|
90
|
-
<div class="IncodeCaptureContainer">
|
|
91
|
-
<LoadingBorder borderState={getBorderState()} />
|
|
92
|
-
<div class="IncodeCaptureFrame">
|
|
93
|
-
<div class="IncodeCaptureVideoWrapper">
|
|
94
|
-
{stream ? (
|
|
95
|
-
<>
|
|
96
|
-
<Video stream={stream} />
|
|
97
|
-
<div class="IncodeCaptureVideo">
|
|
98
|
-
<FaceOutline />
|
|
99
|
-
</div>
|
|
100
|
-
</>
|
|
101
|
-
) : null}
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
|
|
105
|
-
<Spacer size={48} />
|
|
106
|
-
{detectionStatus ? (
|
|
107
|
-
<>
|
|
108
|
-
<Notification detectionState={detectionStatus} />
|
|
109
|
-
<Spacer size={24} />
|
|
110
|
-
</>
|
|
111
|
-
) : null}
|
|
112
|
-
{detectionStatus === 'manualCapture' ? (
|
|
113
|
-
<ManualCaptureButton
|
|
114
|
-
onClick={() => {
|
|
115
|
-
setIsManualCapturing(true);
|
|
116
|
-
manager.capture();
|
|
117
|
-
}}
|
|
118
|
-
disabled={isManualCapturing}
|
|
119
|
-
/>
|
|
120
|
-
) : null}
|
|
121
|
-
</div>
|
|
122
|
-
{uploadError ? (
|
|
123
|
-
<ErrorModal
|
|
124
|
-
error={uploadError}
|
|
125
|
-
attemptsRemaining={attemptsRemaining}
|
|
126
|
-
onTryAgain={() => {
|
|
127
|
-
manager.retryCapture();
|
|
128
|
-
setIsManualCapturing(false);
|
|
129
|
-
}}
|
|
130
|
-
onContinue={onFinish}
|
|
131
|
-
/>
|
|
132
|
-
) : null}
|
|
133
|
-
</Page>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (captureStatus === 'capturing') {
|
|
138
|
-
return (
|
|
139
|
-
<Page
|
|
140
|
-
className="IncodeCaptureCapturingPage"
|
|
141
|
-
title="Capturing"
|
|
142
|
-
subtitle="Taking photo..."
|
|
143
|
-
>
|
|
144
|
-
<div
|
|
145
|
-
style={{
|
|
146
|
-
display: 'flex',
|
|
147
|
-
justifyContent: 'center',
|
|
148
|
-
marginTop: 'auto',
|
|
149
|
-
}}
|
|
150
|
-
>
|
|
151
|
-
<Button isLoading>Capturing...</Button>
|
|
152
|
-
</div>
|
|
153
|
-
</Page>
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (captureStatus === 'uploading') {
|
|
158
|
-
return <UploadingState />;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (captureStatus === 'uploadError') {
|
|
162
|
-
return (
|
|
163
|
-
<ErrorModal
|
|
164
|
-
error={uploadError}
|
|
165
|
-
attemptsRemaining={attemptsRemaining}
|
|
166
|
-
onTryAgain={() => {
|
|
167
|
-
manager.retryCapture();
|
|
168
|
-
setIsManualCapturing(false);
|
|
169
|
-
}}
|
|
170
|
-
onContinue={onFinish}
|
|
171
|
-
/>
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (captureStatus === 'success') {
|
|
176
|
-
return (
|
|
177
|
-
<Page className="IncodeCaptureSuccessPage">
|
|
178
|
-
<div class="IncodeCaptureSuccessContainer">
|
|
179
|
-
<Spacer size={160} />
|
|
180
|
-
<SuccessIcon size={64} />
|
|
181
|
-
<Spacer size={16} />
|
|
182
|
-
<Title>{t('idv2.capture.processing.success')}</Title>
|
|
183
|
-
</div>
|
|
184
|
-
</Page>
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return null;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
type VideoProps = {
|
|
192
|
-
stream: MediaStream;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
const Video: FC<VideoProps> = ({ stream }) => {
|
|
196
|
-
const ref = useRef<HTMLVideoElement | null>(null);
|
|
197
|
-
|
|
198
|
-
useEffect(() => {
|
|
199
|
-
if (ref.current && stream) {
|
|
200
|
-
ref.current.srcObject = stream;
|
|
201
|
-
}
|
|
202
|
-
}, [stream]);
|
|
203
|
-
|
|
204
|
-
return (
|
|
205
|
-
<video
|
|
206
|
-
ref={ref}
|
|
207
|
-
autoplay
|
|
208
|
-
playsInline
|
|
209
|
-
muted
|
|
210
|
-
class="IncodeCaptureVideoElement"
|
|
211
|
-
/>
|
|
212
|
-
);
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
const UploadingState: FC = () => {
|
|
216
|
-
const { t } = useTranslation();
|
|
217
|
-
|
|
218
|
-
return (
|
|
219
|
-
<Page className="IncodeCaptureUploadingPage">
|
|
220
|
-
<div class="IncodeCaptureUploadingContainer">
|
|
221
|
-
<Spacer size={160} />
|
|
222
|
-
<div class="IncodeCaptureUploadingIconContainer">
|
|
223
|
-
<LoadingIcon size={64} />
|
|
224
|
-
</div>
|
|
225
|
-
<Spacer size={16} />
|
|
226
|
-
<h2 class="IncodeCaptureUploadingTitle">
|
|
227
|
-
{t('idv2.capture.processing.uploading')}
|
|
228
|
-
</h2>
|
|
229
|
-
</div>
|
|
230
|
-
</Page>
|
|
231
|
-
);
|
|
232
|
-
};
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import type { FC } from 'preact/compat';
|
|
2
|
-
import { useTranslation } from '@/i18n';
|
|
3
|
-
import { NoMoreAttemptsModal } from './noMoreAttemptsModal';
|
|
4
|
-
import { RetryErrorModal } from './retryErrorModal';
|
|
5
|
-
|
|
6
|
-
type FaceErrorCode =
|
|
7
|
-
| 'LIVENESS_ERROR'
|
|
8
|
-
| 'BRIGHTNESS_ERROR'
|
|
9
|
-
| 'LENSES_ERROR'
|
|
10
|
-
| 'MASK_ERROR'
|
|
11
|
-
| 'CLOSED_EYES_ERROR'
|
|
12
|
-
| 'HEAD_COVER_ERROR'
|
|
13
|
-
| 'SERVER_ERROR'
|
|
14
|
-
| 'FACE_NOT_FOUND'
|
|
15
|
-
| 'MULTIPLE_FACES'
|
|
16
|
-
| 'TOO_BLURRY_ERROR'
|
|
17
|
-
| 'TOO_DARK_ERROR'
|
|
18
|
-
| 'USER_IS_NOT_RECOGNIZED'
|
|
19
|
-
| 'SPOOF_ATTEMPT_DETECTED'
|
|
20
|
-
| 'FACE_TOO_DARK'
|
|
21
|
-
| 'LENSES_DETECTED'
|
|
22
|
-
| 'FACE_MASK_DETECTED'
|
|
23
|
-
| 'CLOSED_EYES_DETECTED'
|
|
24
|
-
| 'HEAD_COVER_DETECTED'
|
|
25
|
-
| 'FACE_CROPPING_FAILED'
|
|
26
|
-
| 'FACE_TOO_SMALL'
|
|
27
|
-
| 'FACE_TOO_BLURRY'
|
|
28
|
-
| 'BAD_PHOTO_QUALITY'
|
|
29
|
-
| 'PROCESSING_ERROR'
|
|
30
|
-
| 'BAD_REQUEST'
|
|
31
|
-
| 'NONEXISTENT_CUSTOMER'
|
|
32
|
-
| 'HINT_NOT_PROVIDED'
|
|
33
|
-
| 'SELFIE_IMAGE_LOW_QUALITY';
|
|
34
|
-
|
|
35
|
-
const defaultError = {
|
|
36
|
-
title: 'Something went wrong',
|
|
37
|
-
description: 'Please try again later',
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const errorContent: Partial<
|
|
41
|
-
Record<FaceErrorCode, { title: string; description: string }>
|
|
42
|
-
> = {
|
|
43
|
-
MASK_ERROR: {
|
|
44
|
-
title: 'notifications.mask',
|
|
45
|
-
description: 'notifications.maskDescription',
|
|
46
|
-
},
|
|
47
|
-
BRIGHTNESS_ERROR: {
|
|
48
|
-
title: 'notifications.brightness',
|
|
49
|
-
description: 'notifications.brightnessDescription',
|
|
50
|
-
},
|
|
51
|
-
LIVENESS_ERROR: {
|
|
52
|
-
title: 'notifications.spoof',
|
|
53
|
-
description: 'notifications.spoofDescription',
|
|
54
|
-
},
|
|
55
|
-
CLOSED_EYES_ERROR: {
|
|
56
|
-
title: 'notifications.closedEyes',
|
|
57
|
-
description: 'notifications.closedEyesDescription',
|
|
58
|
-
},
|
|
59
|
-
HEAD_COVER_ERROR: {
|
|
60
|
-
title: 'notifications.removeHeadwear',
|
|
61
|
-
description: 'notifications.removeHeadwearDescription',
|
|
62
|
-
},
|
|
63
|
-
LENSES_ERROR: {
|
|
64
|
-
title: 'notifications.lenses',
|
|
65
|
-
description: 'notifications.lensesDescription',
|
|
66
|
-
},
|
|
67
|
-
FACE_NOT_FOUND: {
|
|
68
|
-
title: 'notifications.faceNotFound',
|
|
69
|
-
description: 'notifications.faceNotFoundDescription',
|
|
70
|
-
},
|
|
71
|
-
MULTIPLE_FACES: {
|
|
72
|
-
title: 'notifications.multiple',
|
|
73
|
-
description: 'notifications.multipleDescription',
|
|
74
|
-
},
|
|
75
|
-
TOO_BLURRY_ERROR: defaultError,
|
|
76
|
-
TOO_DARK_ERROR: defaultError,
|
|
77
|
-
SERVER_ERROR: defaultError,
|
|
78
|
-
FACE_CROPPING_FAILED: defaultError,
|
|
79
|
-
FACE_TOO_SMALL: defaultError,
|
|
80
|
-
PROCESSING_ERROR: defaultError,
|
|
81
|
-
BAD_REQUEST: defaultError,
|
|
82
|
-
USER_IS_NOT_RECOGNIZED: {
|
|
83
|
-
title: 'notifications.accessDenied',
|
|
84
|
-
description: 'notifications.accessDeniedDescription',
|
|
85
|
-
},
|
|
86
|
-
SPOOF_ATTEMPT_DETECTED: {
|
|
87
|
-
title: 'notifications.spoof',
|
|
88
|
-
description: 'notifications.spoofDescription',
|
|
89
|
-
},
|
|
90
|
-
FACE_TOO_DARK: {
|
|
91
|
-
title: 'notifications.brightness',
|
|
92
|
-
description: 'notifications.brightnessDescription',
|
|
93
|
-
},
|
|
94
|
-
LENSES_DETECTED: {
|
|
95
|
-
title: 'notifications.lenses',
|
|
96
|
-
description: 'notifications.lensesDescription',
|
|
97
|
-
},
|
|
98
|
-
FACE_MASK_DETECTED: {
|
|
99
|
-
title: 'notifications.mask',
|
|
100
|
-
description: 'notifications.maskDescription',
|
|
101
|
-
},
|
|
102
|
-
CLOSED_EYES_DETECTED: {
|
|
103
|
-
title: 'notifications.closedEyes',
|
|
104
|
-
description: 'notifications.closedEyesDescription',
|
|
105
|
-
},
|
|
106
|
-
HEAD_COVER_DETECTED: {
|
|
107
|
-
title: 'notifications.removeHeadwear',
|
|
108
|
-
description: 'notifications.removeHeadwearDescription',
|
|
109
|
-
},
|
|
110
|
-
FACE_TOO_BLURRY: {
|
|
111
|
-
title: 'notifications.spoof',
|
|
112
|
-
description: 'notifications.spoofDescription',
|
|
113
|
-
},
|
|
114
|
-
BAD_PHOTO_QUALITY: {
|
|
115
|
-
title: 'notifications.lowQualityImage',
|
|
116
|
-
description: 'notifications.lowQualityImageDescription',
|
|
117
|
-
},
|
|
118
|
-
NONEXISTENT_CUSTOMER: {
|
|
119
|
-
title: 'notifications.nonexistentCustomer',
|
|
120
|
-
description: 'notifications.nonexistentCustomerDescription',
|
|
121
|
-
},
|
|
122
|
-
HINT_NOT_PROVIDED: {
|
|
123
|
-
title: 'notifications.hintNotProvided',
|
|
124
|
-
description: 'notifications.hintNotProvidedDescription',
|
|
125
|
-
},
|
|
126
|
-
SELFIE_IMAGE_LOW_QUALITY: {
|
|
127
|
-
title: 'notifications.selfieImageLowQuality',
|
|
128
|
-
description: 'notifications.selfieImageLowQualityDescription',
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
type ErrorModalProps = {
|
|
133
|
-
error: string | null | undefined;
|
|
134
|
-
attemptsRemaining: number;
|
|
135
|
-
onTryAgain: () => void;
|
|
136
|
-
onContinue: () => void;
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
const ERROR_CODES: FaceErrorCode[] = [
|
|
140
|
-
'LIVENESS_ERROR',
|
|
141
|
-
'BRIGHTNESS_ERROR',
|
|
142
|
-
'LENSES_ERROR',
|
|
143
|
-
'MASK_ERROR',
|
|
144
|
-
'CLOSED_EYES_ERROR',
|
|
145
|
-
'HEAD_COVER_ERROR',
|
|
146
|
-
'SERVER_ERROR',
|
|
147
|
-
'FACE_NOT_FOUND',
|
|
148
|
-
'MULTIPLE_FACES',
|
|
149
|
-
'TOO_BLURRY_ERROR',
|
|
150
|
-
'TOO_DARK_ERROR',
|
|
151
|
-
'USER_IS_NOT_RECOGNIZED',
|
|
152
|
-
'SPOOF_ATTEMPT_DETECTED',
|
|
153
|
-
'FACE_TOO_DARK',
|
|
154
|
-
'LENSES_DETECTED',
|
|
155
|
-
'FACE_MASK_DETECTED',
|
|
156
|
-
'CLOSED_EYES_DETECTED',
|
|
157
|
-
'HEAD_COVER_DETECTED',
|
|
158
|
-
'FACE_CROPPING_FAILED',
|
|
159
|
-
'FACE_TOO_SMALL',
|
|
160
|
-
'FACE_TOO_BLURRY',
|
|
161
|
-
'BAD_PHOTO_QUALITY',
|
|
162
|
-
'PROCESSING_ERROR',
|
|
163
|
-
'BAD_REQUEST',
|
|
164
|
-
'NONEXISTENT_CUSTOMER',
|
|
165
|
-
'HINT_NOT_PROVIDED',
|
|
166
|
-
'SELFIE_IMAGE_LOW_QUALITY',
|
|
167
|
-
];
|
|
168
|
-
|
|
169
|
-
const parseErrorCode = (error: string): FaceErrorCode | null => {
|
|
170
|
-
const upperError = error.toUpperCase();
|
|
171
|
-
|
|
172
|
-
if (upperError.includes('HTTP 400') || upperError.includes('BAD_REQUEST')) {
|
|
173
|
-
return 'BAD_REQUEST';
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (upperError.includes('HTTP 500') || upperError.includes('SERVER_ERROR')) {
|
|
177
|
-
return 'SERVER_ERROR';
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
for (const code of ERROR_CODES) {
|
|
181
|
-
if (upperError.includes(code)) {
|
|
182
|
-
return code;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return null;
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
export const ErrorModal: FC<ErrorModalProps> = ({
|
|
190
|
-
error,
|
|
191
|
-
attemptsRemaining,
|
|
192
|
-
onTryAgain,
|
|
193
|
-
onContinue,
|
|
194
|
-
}) => {
|
|
195
|
-
const { t } = useTranslation();
|
|
196
|
-
|
|
197
|
-
if (!error) return null;
|
|
198
|
-
|
|
199
|
-
const parsedCode = parseErrorCode(error);
|
|
200
|
-
const errorCode = parsedCode ?? (error as FaceErrorCode);
|
|
201
|
-
const { title, description } = errorContent[errorCode] ?? defaultError;
|
|
202
|
-
const noMoreAttempts = attemptsRemaining <= 0;
|
|
203
|
-
|
|
204
|
-
const titleText = t(title) ?? title;
|
|
205
|
-
|
|
206
|
-
if (noMoreAttempts) {
|
|
207
|
-
return <NoMoreAttemptsModal title={titleText} onContinue={onContinue} />;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return (
|
|
211
|
-
<RetryErrorModal
|
|
212
|
-
title={titleText}
|
|
213
|
-
description={description}
|
|
214
|
-
attemptsRemaining={attemptsRemaining}
|
|
215
|
-
onTryAgain={onTryAgain}
|
|
216
|
-
/>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
@reference "../styles/tailwind.css";
|
|
2
|
-
|
|
3
|
-
.IncodeErrorModalContent {
|
|
4
|
-
@apply fixed inset-0 z-50 flex items-center justify-center bg-white left-0 right-0 top-0 bottom-0 h-full w-full;
|
|
5
|
-
|
|
6
|
-
.IncodeErrorModalContentContainer {
|
|
7
|
-
@apply flex flex-col items-center justify-center h-full w-full min-w-[320px] px-16;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
.IncodeErrorModalContentSpacer {
|
|
11
|
-
@apply flex-1;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
.IncodeErrorModalContentIconContainer {
|
|
15
|
-
@apply flex flex-col items-center flex-1 justify-center;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.IncodeErrorModalContentTitle {
|
|
19
|
-
@apply text-2xl font-bold text-center leading-[114%] tracking-[-0.5px] text-text-body-primary;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.IncodeErrorModalContentDescription {
|
|
23
|
-
@apply text-base text-center text-text-body-secondary font-medium leading-[114%] tracking-[-0.5px];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.IncodeErrorModalContentAttemptsContainer {
|
|
27
|
-
@apply flex flex-col items-center w-full;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.IncodeErrorModalContentAttemptsText {
|
|
31
|
-
@apply text-lg text-center text-text-body-secondary font-medium leading-[114%] tracking-[-0.5px];
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { ComponentChildren } from 'preact';
|
|
2
|
-
import { Button } from '@/shared/button/button';
|
|
3
|
-
import { Page } from '@/shared/page/page';
|
|
4
|
-
import { Spacer } from '@/shared/spacer/spacer';
|
|
5
|
-
import './errorModalContent.css';
|
|
6
|
-
|
|
7
|
-
type ErrorModalContentProps = {
|
|
8
|
-
title: string;
|
|
9
|
-
description: string;
|
|
10
|
-
attemptsText: string;
|
|
11
|
-
buttonText: string;
|
|
12
|
-
icon: ComponentChildren;
|
|
13
|
-
onButtonClick: () => void;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const ErrorModalContent = ({
|
|
17
|
-
title,
|
|
18
|
-
description,
|
|
19
|
-
attemptsText,
|
|
20
|
-
buttonText,
|
|
21
|
-
icon,
|
|
22
|
-
onButtonClick,
|
|
23
|
-
}: ErrorModalContentProps) => {
|
|
24
|
-
return (
|
|
25
|
-
<div class="IncodeErrorModalContent">
|
|
26
|
-
<Page data-testid="face-capture-error-modal">
|
|
27
|
-
<div class="IncodeErrorModalContentContainer">
|
|
28
|
-
<div class="IncodeErrorModalContentIconContainer">
|
|
29
|
-
{icon}
|
|
30
|
-
<Spacer size={24} />
|
|
31
|
-
<h2 class="IncodeErrorModalContentTitle">{title}</h2>
|
|
32
|
-
<Spacer size={16} />
|
|
33
|
-
<p class="IncodeErrorModalContentDescription">{description}</p>
|
|
34
|
-
</div>
|
|
35
|
-
<div class="IncodeErrorModalContentAttemptsContainer">
|
|
36
|
-
<p class="IncodeErrorModalContentAttemptsText">{attemptsText}</p>
|
|
37
|
-
<Spacer size={24} />
|
|
38
|
-
<Button onClick={onButtonClick}>{buttonText}</Button>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
</Page>
|
|
42
|
-
</div>
|
|
43
|
-
);
|
|
44
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { FC } from 'preact/compat';
|
|
2
|
-
import './faceOutline.css';
|
|
3
|
-
|
|
4
|
-
export const FaceOutline: FC = () => {
|
|
5
|
-
return (
|
|
6
|
-
<svg
|
|
7
|
-
width="292"
|
|
8
|
-
height="272"
|
|
9
|
-
viewBox="0 0 292 272"
|
|
10
|
-
fill="none"
|
|
11
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
12
|
-
class="IncodeFaceOutline"
|
|
13
|
-
>
|
|
14
|
-
<title>Outline</title>
|
|
15
|
-
<path
|
|
16
|
-
opacity="0.8"
|
|
17
|
-
d="M145.633 8.0625C115.606 8.06268 85.6206 26.5984 76.9712 54.293L76.771 54.9492C70.4539 76.1063 75.0139 100.802 76.8687 110.58L77.3628 113.188L75.1528 114.656C66.1187 120.66 63.5861 124.089 62.8472 126.92C62.4669 128.377 62.4644 130.035 62.8003 132.412C63.1635 134.983 63.7533 137.484 64.4233 141.347L64.5142 141.841C65.5056 146.956 68.1062 152.133 71.2749 156.618C74.5527 161.257 78.2056 164.826 80.7349 166.584L82.4517 167.777V169.869C82.4517 177.866 85.3476 186.144 89.6763 194.128C93.9906 202.085 99.5748 209.473 104.623 215.646L105.526 216.751V218.178C105.526 220.891 105.68 223.73 105.801 226.9C105.92 230.011 106.003 233.347 105.828 236.771C105.475 243.652 104.077 251.044 99.7446 258.227C91.1977 272.397 72.1081 284.401 31.8677 291.776L29.936 292.124C-41.1597 304.684 -61.4563 361.617 -63.2153 392.062H145.633V400.062H-71.3638L-71.3462 396.044C-71.2048 364.597 -50.9804 298.295 28.5444 284.246L30.4448 283.904C69.9919 276.654 86.1642 265.253 92.894 254.095C96.3216 248.412 97.5261 242.442 97.8374 236.362C97.9939 233.307 97.9241 230.262 97.8071 227.206C97.7111 224.697 97.5799 222.105 97.5396 219.615C92.5931 213.5 87.048 206.064 82.644 197.941C78.308 189.944 74.9442 181.04 74.5024 171.896C71.3932 169.387 67.8531 165.638 64.7417 161.234C61.1656 156.173 57.9337 149.942 56.6587 143.353L56.5415 142.714C55.9864 139.514 55.2491 136.155 54.8784 133.531C54.4806 130.715 54.3377 127.843 55.106 124.899C56.5344 119.427 60.7885 114.886 68.5259 109.489C66.4692 98.2995 62.7062 74.0938 69.106 52.6602L69.3345 51.9092C79.2266 20.2173 112.853 0.0626788 145.633 0.0625V8.0625ZM145.635 0.0625C178.415 0.0625 212.042 20.2172 221.934 51.9092L222.163 52.6602C228.562 74.0938 224.799 98.2996 222.743 109.489C230.48 114.886 234.734 119.427 236.163 124.899C236.931 127.843 236.788 130.715 236.39 133.531C236.019 136.155 235.282 139.514 234.727 142.714L234.61 143.353C233.335 149.942 230.103 156.173 226.527 161.234C223.415 165.638 219.875 169.387 216.766 171.896C216.324 181.04 212.961 189.944 208.625 197.941C204.221 206.064 198.676 213.5 193.729 219.615C193.689 222.105 193.557 224.697 193.461 227.206C193.344 230.262 193.275 233.307 193.431 236.362C193.742 242.442 194.947 248.412 198.375 254.095C205.104 265.253 221.277 276.654 260.824 283.904L262.724 284.246C342.249 298.294 362.473 364.597 362.615 396.044L362.632 400.062H145.635V392.062H354.484C352.725 361.616 332.429 304.683 261.333 292.124L259.401 291.776C219.161 284.401 200.071 272.397 191.524 258.227C187.192 251.044 185.793 243.652 185.441 236.771C185.266 233.347 185.348 230.011 185.467 226.9C185.589 223.73 185.743 220.891 185.743 218.178V216.751L186.646 215.646C191.694 209.473 197.278 202.085 201.592 194.128C205.921 186.144 208.817 177.866 208.817 169.869V167.777L210.534 166.584C213.063 164.826 216.716 161.257 219.994 156.618C223.162 152.133 225.763 146.956 226.754 141.841L226.845 141.347C227.515 137.484 228.105 134.983 228.468 132.412C228.804 130.034 228.802 128.377 228.421 126.92C227.682 124.089 225.15 120.66 216.116 114.656L213.906 113.188L214.4 110.58C216.255 100.802 220.815 76.1064 214.498 54.9492L214.297 54.293C205.648 26.5983 175.662 8.0625 145.635 8.0625V0.0625Z"
|
|
18
|
-
fill="white"
|
|
19
|
-
/>
|
|
20
|
-
</svg>
|
|
21
|
-
);
|
|
22
|
-
};
|