@arcblock/did-connect-react 3.4.14 → 3.5.0
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/standalone/did-connect-react.css +1 -0
- package/dist/standalone/index.js +133700 -0
- package/lib/Connect/components/login-item/connect-choose-list.js +111 -111
- package/lib/Connect/components/login-item/connect-provider-list.js +180 -180
- package/lib/Connect/components/login-item/mobile-login-item.js +56 -56
- package/lib/Connect/components/login-item/passkey-login-item.js +27 -29
- package/lib/Connect/components/login-item/web-login-item.js +31 -29
- package/lib/Connect/connect.js +202 -197
- package/lib/Connect/contexts/state.js +19 -17
- package/lib/Connect/hooks/provider-list.js +33 -33
- package/lib/Connect/plugins/email/list-item.js +14 -14
- package/lib/Connect/plugins/email/placeholder.js +77 -76
- package/lib/package.json.js +1 -1
- package/package.json +14 -9
- package/.aigne/doc-smith/config.yaml +0 -85
- package/.aigne/doc-smith/history.yaml +0 -6
- package/.aigne/doc-smith/output/structure-plan.json +0 -204
- package/.aigne/doc-smith/translation-cache.yaml +0 -11
- package/.aigne/doc-smith/upload-cache.yaml +0 -213
- package/docs/_sidebar.md +0 -18
- package/docs/advanced-authentication-methods.ja.md +0 -261
- package/docs/advanced-authentication-methods.md +0 -261
- package/docs/advanced-authentication-methods.zh-TW.md +0 -261
- package/docs/advanced-authentication-methods.zh.md +0 -261
- package/docs/advanced-utilities.ja.md +0 -132
- package/docs/advanced-utilities.md +0 -132
- package/docs/advanced-utilities.zh-TW.md +0 -132
- package/docs/advanced-utilities.zh.md +0 -132
- package/docs/advanced.ja.md +0 -95
- package/docs/advanced.md +0 -95
- package/docs/advanced.zh-TW.md +0 -95
- package/docs/advanced.zh.md +0 -95
- package/docs/api-reference.ja.md +0 -178
- package/docs/api-reference.md +0 -178
- package/docs/api-reference.zh-TW.md +0 -178
- package/docs/api-reference.zh.md +0 -178
- package/docs/assets/diagram/core-components-session-provider-01.ja.jpg +0 -0
- package/docs/assets/diagram/core-components-session-provider-01.jpg +0 -0
- package/docs/assets/diagram/core-components-session-provider-01.zh-TW.jpg +0 -0
- package/docs/assets/diagram/core-components-session-provider-01.zh.jpg +0 -0
- package/docs/assets/diagram/did-connect-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/did-connect-diagram-0.jpg +0 -0
- package/docs/assets/diagram/did-connect-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/did-connect-diagram-0.zh.jpg +0 -0
- package/docs/assets/diagram/overview-01.ja.jpg +0 -0
- package/docs/assets/diagram/overview-01.jpg +0 -0
- package/docs/assets/diagram/overview-01.zh-TW.jpg +0 -0
- package/docs/assets/diagram/overview-01.zh.jpg +0 -0
- package/docs/assets/diagram/use-connect-diagram-0.ja.jpg +0 -0
- package/docs/assets/diagram/use-connect-diagram-0.jpg +0 -0
- package/docs/assets/diagram/use-connect-diagram-0.zh-TW.jpg +0 -0
- package/docs/assets/diagram/use-connect-diagram-0.zh.jpg +0 -0
- package/docs/core-components-did-connect.ja.md +0 -166
- package/docs/core-components-did-connect.md +0 -166
- package/docs/core-components-did-connect.zh-TW.md +0 -166
- package/docs/core-components-did-connect.zh.md +0 -166
- package/docs/core-components-session-provider.ja.md +0 -197
- package/docs/core-components-session-provider.md +0 -197
- package/docs/core-components-session-provider.zh-TW.md +0 -197
- package/docs/core-components-session-provider.zh.md +0 -197
- package/docs/core-components.ja.md +0 -16
- package/docs/core-components.md +0 -16
- package/docs/core-components.zh-TW.md +0 -16
- package/docs/core-components.zh.md +0 -16
- package/docs/getting-started.ja.md +0 -138
- package/docs/getting-started.md +0 -138
- package/docs/getting-started.zh-TW.md +0 -138
- package/docs/getting-started.zh.md +0 -138
- package/docs/hooks-use-connect.ja.md +0 -178
- package/docs/hooks-use-connect.md +0 -178
- package/docs/hooks-use-connect.zh-TW.md +0 -178
- package/docs/hooks-use-connect.zh.md +0 -178
- package/docs/hooks-use-did.ja.md +0 -107
- package/docs/hooks-use-did.md +0 -107
- package/docs/hooks-use-did.zh-TW.md +0 -107
- package/docs/hooks-use-did.zh.md +0 -107
- package/docs/hooks-use-oauth-passkey.ja.md +0 -188
- package/docs/hooks-use-oauth-passkey.md +0 -188
- package/docs/hooks-use-oauth-passkey.zh-TW.md +0 -188
- package/docs/hooks-use-oauth-passkey.zh.md +0 -188
- package/docs/hooks.ja.md +0 -23
- package/docs/hooks.md +0 -23
- package/docs/hooks.zh-TW.md +0 -23
- package/docs/hooks.zh.md +0 -23
- package/docs/overview.ja.md +0 -119
- package/docs/overview.md +0 -119
- package/docs/overview.zh-TW.md +0 -119
- package/docs/overview.zh.md +0 -119
- package/docs/ui-components-address.ja.md +0 -121
- package/docs/ui-components-address.md +0 -121
- package/docs/ui-components-address.zh-TW.md +0 -121
- package/docs/ui-components-address.zh.md +0 -121
- package/docs/ui-components-avatar.ja.md +0 -65
- package/docs/ui-components-avatar.md +0 -65
- package/docs/ui-components-avatar.zh-TW.md +0 -65
- package/docs/ui-components-avatar.zh.md +0 -65
- package/docs/ui-components-button.ja.md +0 -99
- package/docs/ui-components-button.md +0 -99
- package/docs/ui-components-button.zh-TW.md +0 -99
- package/docs/ui-components-button.zh.md +0 -99
- package/docs/ui-components-logo.ja.md +0 -52
- package/docs/ui-components-logo.md +0 -52
- package/docs/ui-components-logo.zh-TW.md +0 -52
- package/docs/ui-components-logo.zh.md +0 -52
- package/docs/ui-components.ja.md +0 -57
- package/docs/ui-components.md +0 -57
- package/docs/ui-components.zh-TW.md +0 -57
- package/docs/ui-components.zh.md +0 -57
- package/glossary.md +0 -1
- package/src/Address/index.jsx +0 -2
- package/src/Avatar/index.jsx +0 -2
- package/src/Button/Button.stories.jsx +0 -7
- package/src/Button/index.jsx +0 -21
- package/src/Connect/Connect.stories.jsx +0 -34
- package/src/Connect/assets/locale.js +0 -149
- package/src/Connect/assets/login-bg.png +0 -0
- package/src/Connect/assets/login-slogan.js +0 -7
- package/src/Connect/components/action-button.jsx +0 -22
- package/src/Connect/components/app-tips.jsx +0 -156
- package/src/Connect/components/auto-height.jsx +0 -38
- package/src/Connect/components/back-button.jsx +0 -24
- package/src/Connect/components/connect-status.jsx +0 -259
- package/src/Connect/components/did-connect-title.jsx +0 -107
- package/src/Connect/components/download-tips.jsx +0 -55
- package/src/Connect/components/loading.jsx +0 -25
- package/src/Connect/components/login-item/connect-choose-list.jsx +0 -317
- package/src/Connect/components/login-item/connect-provider-list.jsx +0 -462
- package/src/Connect/components/login-item/login-method-item.jsx +0 -139
- package/src/Connect/components/login-item/mobile-login-item.jsx +0 -181
- package/src/Connect/components/login-item/passkey-login-item.jsx +0 -54
- package/src/Connect/components/login-item/wallet-login-options.jsx +0 -129
- package/src/Connect/components/login-item/web-login-item.jsx +0 -157
- package/src/Connect/components/mask-overlay.jsx +0 -32
- package/src/Connect/components/refresh-overlay.jsx +0 -52
- package/src/Connect/components/switch-app.jsx +0 -69
- package/src/Connect/connect.jsx +0 -617
- package/src/Connect/contexts/state.jsx +0 -234
- package/src/Connect/fallback-connect.jsx +0 -47
- package/src/Connect/fullpage.jsx +0 -3
- package/src/Connect/hooks/auth-url.js +0 -31
- package/src/Connect/hooks/method-list.js +0 -121
- package/src/Connect/hooks/page-show.js +0 -24
- package/src/Connect/hooks/provider-list.js +0 -165
- package/src/Connect/hooks/security.js +0 -40
- package/src/Connect/hooks/token.js +0 -627
- package/src/Connect/hooks/use-apps.js +0 -69
- package/src/Connect/hooks/use-quick-connect.js +0 -119
- package/src/Connect/index.jsx +0 -21
- package/src/Connect/landing-page.jsx +0 -3
- package/src/Connect/plugins/email/index.jsx +0 -85
- package/src/Connect/plugins/email/list-item.jsx +0 -34
- package/src/Connect/plugins/email/placeholder.jsx +0 -365
- package/src/Connect/plugins/index.js +0 -2
- package/src/Connect/use-connect.jsx +0 -321
- package/src/Connect/with-blocklet.jsx +0 -26
- package/src/Connect/with-bridge-call.jsx +0 -138
- package/src/Federated/context.jsx +0 -93
- package/src/Federated/index.jsx +0 -1
- package/src/Logo/index.jsx +0 -2
- package/src/OAuth/bind-conflict-alert.jsx +0 -37
- package/src/OAuth/context.jsx +0 -407
- package/src/OAuth/guest.svg +0 -20
- package/src/OAuth/index.jsx +0 -1
- package/src/OAuth/passport-switcher.jsx +0 -2
- package/src/Passkey/actions.jsx +0 -217
- package/src/Passkey/constants.js +0 -2
- package/src/Passkey/context.jsx +0 -395
- package/src/Passkey/dialog.jsx +0 -401
- package/src/Passkey/icon.jsx +0 -10
- package/src/Passkey/index.jsx +0 -2
- package/src/Service/index.jsx +0 -96
- package/src/Session/assets/did-spaces-guide-cover.svg +0 -1
- package/src/Session/assets/did-spaces-guide-icon.svg +0 -7
- package/src/Session/context.jsx +0 -7
- package/src/Session/did-spaces-guide.jsx +0 -173
- package/src/Session/handler.jsx +0 -98
- package/src/Session/hooks/use-federated.js +0 -91
- package/src/Session/hooks/use-mobile.jsx +0 -6
- package/src/Session/hooks/use-protected-routes.js +0 -16
- package/src/Session/hooks/use-session-token.js +0 -400
- package/src/Session/hooks/use-verify.jsx +0 -76
- package/src/Session/index.jsx +0 -1789
- package/src/Session/libs/constants.js +0 -17
- package/src/Session/libs/did-spaces.js +0 -38
- package/src/Session/libs/federated.js +0 -82
- package/src/Session/libs/index.js +0 -5
- package/src/Session/libs/locales.js +0 -160
- package/src/Session/libs/login-mobile.js +0 -80
- package/src/Session/window-focus-aware.jsx +0 -28
- package/src/SessionManager/index.jsx +0 -2
- package/src/Storage/engine/cookie.js +0 -25
- package/src/Storage/engine/local-storage.js +0 -57
- package/src/Storage/index.js +0 -25
- package/src/User/index.js +0 -4
- package/src/User/use-did.js +0 -80
- package/src/User/wrap-did.jsx +0 -18
- package/src/WebWalletSWKeeper/index.jsx +0 -3
- package/src/components/PassportSwitcher.jsx +0 -160
- package/src/constant.js +0 -27
- package/src/error.js +0 -6
- package/src/hooks/use-locale.jsx +0 -6
- package/src/index.js +0 -32
- package/src/locales/en.jsx +0 -15
- package/src/locales/index.jsx +0 -13
- package/src/locales/zh.jsx +0 -15
- package/src/types.d.ts +0 -355
- package/src/utils.js +0 -413
- package/vite.config.mjs +0 -29
package/src/Passkey/dialog.jsx
DELETED
|
@@ -1,401 +0,0 @@
|
|
|
1
|
-
import PropTypes from 'prop-types';
|
|
2
|
-
import { useImperativeHandle, useState } from 'react';
|
|
3
|
-
import styled from '@emotion/styled';
|
|
4
|
-
import {
|
|
5
|
-
Alert,
|
|
6
|
-
Box,
|
|
7
|
-
Button,
|
|
8
|
-
CircularProgress,
|
|
9
|
-
Dialog,
|
|
10
|
-
DialogActions,
|
|
11
|
-
DialogContent,
|
|
12
|
-
DialogTitle,
|
|
13
|
-
Stack,
|
|
14
|
-
TextField,
|
|
15
|
-
} from '@mui/material';
|
|
16
|
-
import isEmail from 'validator/lib/isEmail';
|
|
17
|
-
import { Icon } from '@iconify/react';
|
|
18
|
-
import passKeyRoundedIcon from '@iconify-icons/material-symbols/passkey-rounded';
|
|
19
|
-
import { useMemoizedFn } from 'ahooks';
|
|
20
|
-
import Toast from '@arcblock/ux/lib/Toast';
|
|
21
|
-
import Typography from '@arcblock/ux/lib/Typography';
|
|
22
|
-
import { getCookieOptions } from '@arcblock/ux/lib/Util';
|
|
23
|
-
import trim from 'lodash/trim';
|
|
24
|
-
import base64 from 'base64-url';
|
|
25
|
-
import Cookie from 'js-cookie';
|
|
26
|
-
import noop from 'lodash/noop';
|
|
27
|
-
|
|
28
|
-
import { usePasskey } from './context';
|
|
29
|
-
import { getWebAuthnErrorMessage } from '../utils';
|
|
30
|
-
import { VERIFY_CODE_LENGTH } from './constants';
|
|
31
|
-
|
|
32
|
-
function PasskeyDialog({ ref, extraParams = {}, createMode = 'connect', action, onSuccess = noop, onError = noop }) {
|
|
33
|
-
const { api, locale, t, loginPasskey, logoutPasskey, passkeyState, connectPasskey } = usePasskey();
|
|
34
|
-
const isEmailRequired = createMode === 'register';
|
|
35
|
-
const [isEmailVerified, setIsEmailVerified] = useState(false);
|
|
36
|
-
const isFullScreen = window.innerWidth < 600;
|
|
37
|
-
const handleOpenDialog = useMemoizedFn(() => {
|
|
38
|
-
passkeyState.openDialog = true;
|
|
39
|
-
passkeyState.error = '';
|
|
40
|
-
passkeyState.creatingStatus = '';
|
|
41
|
-
passkeyState.verifyingStatus = '';
|
|
42
|
-
const initialEmail = passkeyState.email;
|
|
43
|
-
setIsEmailVerified(initialEmail && isEmailRequired ? !isEmail(initialEmail) : false);
|
|
44
|
-
});
|
|
45
|
-
const handleCloseDialog = useMemoizedFn(() => {
|
|
46
|
-
passkeyState.openDialog = false;
|
|
47
|
-
passkeyState.error = '';
|
|
48
|
-
passkeyState.creatingStatus = '';
|
|
49
|
-
passkeyState.verifyingStatus = '';
|
|
50
|
-
const initialEmail = passkeyState.email;
|
|
51
|
-
setIsEmailVerified(initialEmail && isEmailRequired ? !isEmail(initialEmail) : false);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const handleSendCode = useMemoizedFn(async (e) => {
|
|
55
|
-
e.preventDefault();
|
|
56
|
-
if (isEmailRequired && !isEmail(passkeyState.email)) {
|
|
57
|
-
setIsEmailVerified(true);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
setIsEmailVerified(false);
|
|
61
|
-
passkeyState.loading = true;
|
|
62
|
-
try {
|
|
63
|
-
await api.post(`../kyc/email/send?locale=${locale}`, { email: passkeyState.email });
|
|
64
|
-
passkeyState.sent = true;
|
|
65
|
-
Toast.success(t('codeSentSuccess'));
|
|
66
|
-
} catch (error) {
|
|
67
|
-
Toast.error(error.message);
|
|
68
|
-
document.getElementById('email-input')?.focus();
|
|
69
|
-
} finally {
|
|
70
|
-
passkeyState.loading = false;
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const handleVerifyPasskey = useMemoizedFn(async (credentialId = '') => {
|
|
75
|
-
try {
|
|
76
|
-
passkeyState.verifying = true;
|
|
77
|
-
passkeyState.error = '';
|
|
78
|
-
if (!credentialId) {
|
|
79
|
-
passkeyState.verifyingStatus = '';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const result = await loginPasskey({
|
|
83
|
-
...extraParams,
|
|
84
|
-
action,
|
|
85
|
-
credentialId,
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
const cookieOptions = getCookieOptions({ expireInDays: 7 });
|
|
89
|
-
Cookie.remove('connected_did', cookieOptions);
|
|
90
|
-
Cookie.remove('connected_pk', cookieOptions);
|
|
91
|
-
Cookie.remove('connected_wallet_os', cookieOptions);
|
|
92
|
-
|
|
93
|
-
passkeyState.verifying = false;
|
|
94
|
-
if (result?.sessionToken) {
|
|
95
|
-
passkeyState.verifyingStatus = 'succeed';
|
|
96
|
-
onSuccess({ ...result, encrypted: false }, (val) => val);
|
|
97
|
-
}
|
|
98
|
-
} catch (err) {
|
|
99
|
-
console.error('Failed to verify passkey', err);
|
|
100
|
-
const errorMessage = getWebAuthnErrorMessage(err, t('verifyPasskeyFailed'));
|
|
101
|
-
passkeyState.verifying = false;
|
|
102
|
-
passkeyState.error = errorMessage;
|
|
103
|
-
passkeyState.verifyingStatus = 'error';
|
|
104
|
-
await logoutPasskey();
|
|
105
|
-
onError(new Error(errorMessage));
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
const handleCreatePasskey = useMemoizedFn(async () => {
|
|
110
|
-
if (isEmailRequired && !isEmail(passkeyState.email)) {
|
|
111
|
-
setIsEmailVerified(true);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
setIsEmailVerified(false);
|
|
115
|
-
passkeyState.creating = true;
|
|
116
|
-
passkeyState.error = '';
|
|
117
|
-
passkeyState.creatingStatus = '';
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
const result = await connectPasskey({
|
|
121
|
-
...extraParams,
|
|
122
|
-
action,
|
|
123
|
-
purpose: isEmailRequired ? 'register' : 'connect',
|
|
124
|
-
email: isEmailRequired ? base64.encode(passkeyState.email) : '',
|
|
125
|
-
});
|
|
126
|
-
if (!result) {
|
|
127
|
-
// 用户取消的操作
|
|
128
|
-
passkeyState.error = t('cancelAuth');
|
|
129
|
-
passkeyState.creatingStatus = 'error';
|
|
130
|
-
passkeyState.creating = false;
|
|
131
|
-
passkeyState.verifying = false;
|
|
132
|
-
passkeyState.verifyingStatus = '';
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
passkeyState.creating = false;
|
|
136
|
-
passkeyState.openDialog = false;
|
|
137
|
-
passkeyState.creatingStatus = 'succeed';
|
|
138
|
-
|
|
139
|
-
if (createMode === 'connect') {
|
|
140
|
-
onSuccess({ ...result, encrypted: false }, (val) => val);
|
|
141
|
-
} else if (result?.credentialId) {
|
|
142
|
-
handleVerifyPasskey(result.credentialId);
|
|
143
|
-
}
|
|
144
|
-
} catch (err) {
|
|
145
|
-
console.error('Failed to create passkey', err);
|
|
146
|
-
passkeyState.creating = false;
|
|
147
|
-
passkeyState.error = getWebAuthnErrorMessage(err, t('createPasskeyFailed'));
|
|
148
|
-
passkeyState.creatingStatus = 'error';
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
const handleVerifyCode = useMemoizedFn(async (e) => {
|
|
153
|
-
if (e) e.preventDefault();
|
|
154
|
-
passkeyState.loading = true;
|
|
155
|
-
try {
|
|
156
|
-
await api.post(`../kyc/email/verify?locale=${locale}`, { code: passkeyState.code });
|
|
157
|
-
passkeyState.verified = true;
|
|
158
|
-
handleCreatePasskey();
|
|
159
|
-
} catch (error) {
|
|
160
|
-
Toast.error(error.message);
|
|
161
|
-
passkeyState.verified = false;
|
|
162
|
-
document.getElementById(`code-input-${trim(passkeyState.code).length - 1}`)?.focus();
|
|
163
|
-
} finally {
|
|
164
|
-
passkeyState.loading = false;
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
useImperativeHandle(ref, () => {
|
|
169
|
-
return {
|
|
170
|
-
open: handleOpenDialog,
|
|
171
|
-
close: handleCloseDialog,
|
|
172
|
-
handleVerifyCode,
|
|
173
|
-
};
|
|
174
|
-
}, [handleOpenDialog, handleCloseDialog, handleVerifyCode]);
|
|
175
|
-
|
|
176
|
-
const renderActions = () => {
|
|
177
|
-
return (
|
|
178
|
-
<>
|
|
179
|
-
<Button onClick={handleCloseDialog} sx={{ color: 'text.secondary' }}>
|
|
180
|
-
{t('cancel')}
|
|
181
|
-
</Button>
|
|
182
|
-
{isEmailRequired && (
|
|
183
|
-
<Button
|
|
184
|
-
variant="contained"
|
|
185
|
-
onClick={
|
|
186
|
-
// eslint-disable-next-line no-nested-ternary
|
|
187
|
-
passkeyState.verified ? handleCreatePasskey : passkeyState.sent ? handleVerifyCode : handleSendCode
|
|
188
|
-
}
|
|
189
|
-
disabled={
|
|
190
|
-
passkeyState.verifying ||
|
|
191
|
-
passkeyState.creating ||
|
|
192
|
-
!passkeyState.email ||
|
|
193
|
-
(passkeyState.sent && trim(passkeyState.code).length !== VERIFY_CODE_LENGTH)
|
|
194
|
-
}>
|
|
195
|
-
{(passkeyState.loading || passkeyState.creating) && <CircularProgress size={16} sx={{ mr: 1 }} />}
|
|
196
|
-
{/* eslint-disable-next-line no-nested-ternary */}
|
|
197
|
-
{passkeyState.verified ? t('createPasskey') : passkeyState.sent ? t('verifyButton') : t('sendCodeButton')}
|
|
198
|
-
</Button>
|
|
199
|
-
)}
|
|
200
|
-
{!isEmailRequired && (
|
|
201
|
-
<Button
|
|
202
|
-
variant="contained"
|
|
203
|
-
color="primary"
|
|
204
|
-
onClick={handleCreatePasskey}
|
|
205
|
-
disabled={
|
|
206
|
-
passkeyState.loading ||
|
|
207
|
-
passkeyState.creating ||
|
|
208
|
-
(isEmailRequired && (!passkeyState.email || !passkeyState.verified))
|
|
209
|
-
}
|
|
210
|
-
startIcon={
|
|
211
|
-
(passkeyState.loading || passkeyState.creating) && (
|
|
212
|
-
<CircularProgress size={16} sx={{ mr: 1 }} color="inherit" />
|
|
213
|
-
)
|
|
214
|
-
}>
|
|
215
|
-
{passkeyState.loading || passkeyState.creating ? t('creatingPasskey') : t('createPasskey')}
|
|
216
|
-
</Button>
|
|
217
|
-
)}
|
|
218
|
-
</>
|
|
219
|
-
);
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
return (
|
|
223
|
-
<StyledDialog
|
|
224
|
-
open={passkeyState.openDialog}
|
|
225
|
-
onClose={handleCloseDialog}
|
|
226
|
-
fullWidth
|
|
227
|
-
maxWidth="sm"
|
|
228
|
-
fullScreen={isFullScreen}>
|
|
229
|
-
<StyledDialogTitle>
|
|
230
|
-
<KeyIcon>
|
|
231
|
-
<Icon icon={passKeyRoundedIcon} fontSize={24} color="initial" />
|
|
232
|
-
</KeyIcon>
|
|
233
|
-
{t('createPasskey')}
|
|
234
|
-
</StyledDialogTitle>
|
|
235
|
-
<StyledDialogContent>
|
|
236
|
-
<Typography variant="body1">{t('createPasskeyDesc1')}</Typography>
|
|
237
|
-
<Typography variant="body1">{t('createPasskeyDesc2')}</Typography>
|
|
238
|
-
{passkeyState.error && <Alert severity="error">{passkeyState.error}</Alert>}
|
|
239
|
-
{isEmailRequired && (
|
|
240
|
-
<Form>
|
|
241
|
-
{!passkeyState.sent && (
|
|
242
|
-
<TextField
|
|
243
|
-
type="email"
|
|
244
|
-
id="email-input"
|
|
245
|
-
size="medium"
|
|
246
|
-
placeholder={t('emailPlaceholder')}
|
|
247
|
-
sx={{ width: '100%', '.MuiFormHelperText-root': { ml: 0 } }}
|
|
248
|
-
value={passkeyState.email}
|
|
249
|
-
onChange={(e) => {
|
|
250
|
-
passkeyState.email = e.target.value;
|
|
251
|
-
setIsEmailVerified(!isEmail(passkeyState.email));
|
|
252
|
-
}}
|
|
253
|
-
disabled={passkeyState.loading || passkeyState.creating}
|
|
254
|
-
required
|
|
255
|
-
error={isEmailVerified}
|
|
256
|
-
helperText={isEmailVerified ? t('emailInvalid') : ''}
|
|
257
|
-
/>
|
|
258
|
-
)}
|
|
259
|
-
{passkeyState.sent && !passkeyState.verified && (
|
|
260
|
-
<Stack
|
|
261
|
-
direction="column"
|
|
262
|
-
sx={{
|
|
263
|
-
justifyContent: 'center',
|
|
264
|
-
alignItems: 'center',
|
|
265
|
-
mb: 2,
|
|
266
|
-
}}>
|
|
267
|
-
<Typography variant="body2">{t('codeSentMessage', { email: passkeyState.email })}</Typography>
|
|
268
|
-
<Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between', gap: 2, mt: 0 }}>
|
|
269
|
-
{Array(VERIFY_CODE_LENGTH)
|
|
270
|
-
.fill('')
|
|
271
|
-
.map((_, index) => (
|
|
272
|
-
<TextField
|
|
273
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
274
|
-
key={`code-input-${index}`}
|
|
275
|
-
value={trim(passkeyState.code[index]) || ''}
|
|
276
|
-
type="number"
|
|
277
|
-
margin="none"
|
|
278
|
-
onChange={(e) => {
|
|
279
|
-
const newCode = passkeyState.code.split('');
|
|
280
|
-
newCode[index] = e.target.value;
|
|
281
|
-
passkeyState.code = newCode.join('');
|
|
282
|
-
if (e.target.value && index < 5) {
|
|
283
|
-
document.getElementById(`code-input-${index + 1}`)?.focus();
|
|
284
|
-
}
|
|
285
|
-
}}
|
|
286
|
-
onKeyDown={(e) => {
|
|
287
|
-
if (e.key === 'Backspace' && !trim(passkeyState.code[index]) && index > 0) {
|
|
288
|
-
document.getElementById(`code-input-${index - 1}`)?.focus();
|
|
289
|
-
}
|
|
290
|
-
}}
|
|
291
|
-
disabled={passkeyState.loading}
|
|
292
|
-
required
|
|
293
|
-
id={`code-input-${index}`}
|
|
294
|
-
autoComplete="off"
|
|
295
|
-
slotProps={{
|
|
296
|
-
htmlInput: {
|
|
297
|
-
maxLength: 1,
|
|
298
|
-
style: { textAlign: 'center', fontSize: '1.5rem' },
|
|
299
|
-
autoComplete: 'off',
|
|
300
|
-
},
|
|
301
|
-
}}
|
|
302
|
-
/>
|
|
303
|
-
))}
|
|
304
|
-
</Box>
|
|
305
|
-
</Stack>
|
|
306
|
-
)}
|
|
307
|
-
</Form>
|
|
308
|
-
)}
|
|
309
|
-
{isFullScreen && (
|
|
310
|
-
<Box sx={{ display: 'flex', justifyContent: 'flex-end', alignItems: 'center', mt: 2 }}>{renderActions()}</Box>
|
|
311
|
-
)}
|
|
312
|
-
</StyledDialogContent>
|
|
313
|
-
{!isFullScreen && <StyledDialogActions>{renderActions()}</StyledDialogActions>}
|
|
314
|
-
</StyledDialog>
|
|
315
|
-
);
|
|
316
|
-
}
|
|
317
|
-
PasskeyDialog.propTypes = {
|
|
318
|
-
extraParams: PropTypes.object,
|
|
319
|
-
createMode: PropTypes.string,
|
|
320
|
-
action: PropTypes.string.isRequired,
|
|
321
|
-
onSuccess: PropTypes.func,
|
|
322
|
-
onError: PropTypes.func,
|
|
323
|
-
ref: PropTypes.any.isRequired,
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
export default PasskeyDialog;
|
|
327
|
-
|
|
328
|
-
const StyledDialog = styled(Dialog)`
|
|
329
|
-
.MuiDialog-paper {
|
|
330
|
-
border-radius: 12px;
|
|
331
|
-
max-width: 440px;
|
|
332
|
-
}
|
|
333
|
-
`;
|
|
334
|
-
|
|
335
|
-
const StyledDialogTitle = styled(DialogTitle)`
|
|
336
|
-
text-align: center;
|
|
337
|
-
padding: 24px 24px 16px;
|
|
338
|
-
font-size: 20px;
|
|
339
|
-
font-weight: 600;
|
|
340
|
-
`;
|
|
341
|
-
|
|
342
|
-
const StyledDialogContent = styled(DialogContent)`
|
|
343
|
-
padding: 0 24px;
|
|
344
|
-
|
|
345
|
-
.MuiTypography-body1 {
|
|
346
|
-
font-size: 14px;
|
|
347
|
-
line-height: 1.5;
|
|
348
|
-
margin-bottom: 16px;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
.MuiTextField-root {
|
|
352
|
-
margin-top: 16px;
|
|
353
|
-
width: 100%;
|
|
354
|
-
}
|
|
355
|
-
`;
|
|
356
|
-
|
|
357
|
-
const StyledDialogActions = styled(DialogActions)`
|
|
358
|
-
text-align: center;
|
|
359
|
-
padding: 16px 24px 24px;
|
|
360
|
-
|
|
361
|
-
.MuiButton-root {
|
|
362
|
-
text-transform: none;
|
|
363
|
-
font-size: 14px;
|
|
364
|
-
border-radius: 6px;
|
|
365
|
-
padding: 6px 16px;
|
|
366
|
-
}
|
|
367
|
-
`;
|
|
368
|
-
|
|
369
|
-
const KeyIcon = styled('div')`
|
|
370
|
-
width: 48px;
|
|
371
|
-
height: 48px;
|
|
372
|
-
margin: 0 auto 16px;
|
|
373
|
-
background-color: #f6f8fa;
|
|
374
|
-
border-radius: 50%;
|
|
375
|
-
display: flex;
|
|
376
|
-
align-items: center;
|
|
377
|
-
justify-content: center;
|
|
378
|
-
|
|
379
|
-
svg {
|
|
380
|
-
width: 32px;
|
|
381
|
-
height: 32px;
|
|
382
|
-
}
|
|
383
|
-
`;
|
|
384
|
-
|
|
385
|
-
const Form = styled.div`
|
|
386
|
-
display: flex;
|
|
387
|
-
flex-direction: column;
|
|
388
|
-
align-items: center;
|
|
389
|
-
justify-content: center;
|
|
390
|
-
width: 100%;
|
|
391
|
-
gap: 24px;
|
|
392
|
-
|
|
393
|
-
input[type='number']::-webkit-inner-spin-button,
|
|
394
|
-
input[type='number']::-webkit-outer-spin-button {
|
|
395
|
-
-webkit-appearance: none;
|
|
396
|
-
margin: 0;
|
|
397
|
-
}
|
|
398
|
-
div.Mui-focused input {
|
|
399
|
-
caret-color: ${(props) => props.theme.palette.primary.main};
|
|
400
|
-
}
|
|
401
|
-
`;
|
package/src/Passkey/icon.jsx
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default function PasskeyIcon(props) {
|
|
2
|
-
return (
|
|
3
|
-
<svg xmlns="http://www.w3.org/2000/svg" width={24} height={24} viewBox="0 0 24 24" {...props}>
|
|
4
|
-
<path
|
|
5
|
-
fill="currentColor"
|
|
6
|
-
d="M3 20v-2.8q0-.85.438-1.562T4.6 14.55q1.55-.775 3.15-1.162T11 13q.5 0 1 .038t1 .112q-.1 1.45.525 2.738T15.35 18v2zm16 3l-1.5-1.5v-4.65q-1.1-.325-1.8-1.237T15 13.5q0-1.45 1.025-2.475T18.5 10t2.475 1.025T22 13.5q0 1.125-.638 2t-1.612 1.25L21 18l-1.5 1.5L21 21zm-8-11q-1.65 0-2.825-1.175T7 8t1.175-2.825T11 4t2.825 1.175T15 8t-1.175 2.825T11 12m7.5 2q.425 0 .713-.288T19.5 13t-.288-.712T18.5 12t-.712.288T17.5 13t.288.713t.712.287"
|
|
7
|
-
/>
|
|
8
|
-
</svg>
|
|
9
|
-
);
|
|
10
|
-
}
|
package/src/Passkey/index.jsx
DELETED
package/src/Service/index.jsx
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { joinURL } from 'ufo';
|
|
2
|
-
import { createAxios } from '../utils';
|
|
3
|
-
|
|
4
|
-
async function renewRefreshToken(refreshToken, { authServicePrefix, serviceHost }) {
|
|
5
|
-
if (!refreshToken) {
|
|
6
|
-
throw new Error('Refresh token not found');
|
|
7
|
-
}
|
|
8
|
-
const refreshApi = createAxios({
|
|
9
|
-
baseURL: serviceHost,
|
|
10
|
-
timeout: 10 * 1000,
|
|
11
|
-
secure: true,
|
|
12
|
-
headers: {
|
|
13
|
-
authorization: `Bearer ${encodeURIComponent(refreshToken)}`,
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
const { data } = await refreshApi.post(joinURL(authServicePrefix, '/refreshSession'));
|
|
17
|
-
return data;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default function createService(
|
|
21
|
-
{
|
|
22
|
-
refreshTokenStorage,
|
|
23
|
-
sessionTokenStorage,
|
|
24
|
-
serviceHost,
|
|
25
|
-
authServicePrefix,
|
|
26
|
-
onRefreshTokenError,
|
|
27
|
-
onRefreshTokenSuccess,
|
|
28
|
-
},
|
|
29
|
-
options = {}
|
|
30
|
-
) {
|
|
31
|
-
let refreshingTokenRequest = null;
|
|
32
|
-
const service = createAxios({
|
|
33
|
-
baseURL: serviceHost,
|
|
34
|
-
timeout: 30 * 1000,
|
|
35
|
-
...options,
|
|
36
|
-
});
|
|
37
|
-
const { getToken: getSessionToken, setToken: setSessionToken, removeToken: removeSessionToken } = sessionTokenStorage;
|
|
38
|
-
const { getToken: getRefreshToken, setToken: setRefreshToken, removeToken: removeRefreshToken } = refreshTokenStorage;
|
|
39
|
-
|
|
40
|
-
service.interceptors.request.use(
|
|
41
|
-
async (config) => {
|
|
42
|
-
if (sessionTokenStorage.engine === 'ls') {
|
|
43
|
-
const token = getSessionToken();
|
|
44
|
-
if (token) {
|
|
45
|
-
config.headers.authorization = `Bearer ${encodeURIComponent(token)}`;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
if (refreshingTokenRequest) {
|
|
49
|
-
await refreshingTokenRequest;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return config;
|
|
53
|
-
},
|
|
54
|
-
(error) => Promise.reject(error)
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
service.interceptors.response.use(
|
|
58
|
-
(response) => response,
|
|
59
|
-
async (error) => {
|
|
60
|
-
const originalRequest = error.config;
|
|
61
|
-
if (!originalRequest) {
|
|
62
|
-
return Promise.reject(error);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
originalRequest.headers = { ...originalRequest?.headers };
|
|
66
|
-
// FIXME: @zhanghan 在某次 createTokenFn 的时候,出现了 401 导致 did-connect 页面展示了 `Refresh token not found` 错误
|
|
67
|
-
if (error?.response?.status === 401 && !originalRequest._retry) {
|
|
68
|
-
originalRequest._retry = true;
|
|
69
|
-
if (!refreshingTokenRequest) {
|
|
70
|
-
refreshingTokenRequest = renewRefreshToken(getRefreshToken(), { serviceHost, authServicePrefix });
|
|
71
|
-
}
|
|
72
|
-
try {
|
|
73
|
-
const tokenData = await refreshingTokenRequest;
|
|
74
|
-
setSessionToken(tokenData.nextToken);
|
|
75
|
-
setRefreshToken(tokenData.nextRefreshToken);
|
|
76
|
-
if (typeof onRefreshTokenSuccess === 'function') {
|
|
77
|
-
onRefreshTokenSuccess(tokenData);
|
|
78
|
-
}
|
|
79
|
-
return service(originalRequest);
|
|
80
|
-
} catch (error2) {
|
|
81
|
-
removeSessionToken();
|
|
82
|
-
removeRefreshToken();
|
|
83
|
-
if (typeof onRefreshTokenError === 'function') {
|
|
84
|
-
onRefreshTokenError();
|
|
85
|
-
}
|
|
86
|
-
return Promise.reject(error2);
|
|
87
|
-
} finally {
|
|
88
|
-
refreshingTokenRequest = null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return Promise.reject(error);
|
|
92
|
-
}
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
return service;
|
|
96
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg viewBox="0 0 440 167" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><rect width="440" height="167" rx="8" fill="url(#b)"/><g style="mix-blend-mode:overlay" opacity=".4" clip-path="url(#c)"><mask id="d" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="-183" width="441" height="395"><path d="M220.481 167.765v-43.661h-43.808v43.661h43.808zm0 43.661v-43.661h-43.808v43.661h43.808zm-43.808-43.661v-43.661h-43.808v43.661h43.808zm-43.808 0v-43.661H89.057v43.661h43.808zm-43.808 0v-43.661H45.25v43.661h43.808zm-43.807 0v-43.661H1.442v43.661H45.25zm131.423 43.661v-43.661h-43.808v43.661h43.808zm-43.808 0v-43.661H89.057v43.661h43.808zm-43.808 0v-43.661H45.25v43.661h43.808zm-43.807 0v-43.661H1.442v43.661H45.25zm219.039-43.661v-43.661h-43.808v43.661h43.808zm0 43.661v-43.661h-43.808v43.661h43.808zm43.807-43.661v-43.661h-43.807v43.661h43.807zm0 43.661v-43.661h-43.807v43.661h43.807zm43.808-43.661v-43.661h-43.808v43.661h43.808zm0 43.661v-43.661h-43.808v43.661h43.808zm43.808-43.661v-43.661h-43.808v43.661h43.808zm0 43.661v-43.661h-43.808v43.661h43.808zm43.808-43.661v-43.661h-43.808v43.661h43.808zm0 43.661v-43.661h-43.808v43.661h43.808zm-219.039-87.322v-43.66h-43.808v43.66h43.808zm-43.808 0v-43.66h-43.808v43.66h43.808zm-43.808 0v-43.66H89.057v43.66h43.808zm-43.808 0v-43.66H45.25v43.66h43.808zm-43.807 0v-43.66H1.442v43.66H45.25zm219.039 0v-43.66h-43.808v43.66h43.808zm43.807 0v-43.66h-43.807v43.66h43.807zm43.808 0v-43.66h-43.808v43.66h43.808zm43.808 0v-43.66h-43.808v43.66h43.808zm43.808 0v-43.66h-43.808v43.66h43.808zm-219.039-43.66V36.781h-43.808v43.661h43.808zm-43.808 0V36.781h-43.808v43.661h43.808zm-43.808 0V36.781H89.057v43.661h43.808zm-43.808 0V36.781H45.25v43.661h43.808zm-43.807 0V36.781H1.442v43.661H45.25zm87.615-43.662v-43.66H89.057v43.66h43.808zm0-43.66V-50.54H89.057v43.66h43.808zm0-43.661v-43.66H89.057v43.66h43.808zm0-43.66v-43.662H89.057V-94.2h43.808zm0-43.662v-43.66H89.057v43.66h43.808zM176.673-6.878V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808zM89.058 36.782v-43.66H45.25v43.66h43.808zm0-43.66V-50.54H45.25v43.66h43.808zm0-43.661v-43.66H45.25v43.66h43.808zm0-43.66v-43.662H45.25V-94.2h43.808zm0-43.662v-43.66H45.25v43.66h43.808zM45.25 36.782v-43.66H1.442v43.66H45.25zm0-43.66V-50.54H1.442v43.66H45.25zm0-43.661v-43.66H1.442v43.66H45.25zm0-43.66v-43.662H1.442V-94.2H45.25zm0-43.662v-43.66H1.442v43.66H45.25zM264.289 80.443v-43.66h-43.808v43.66h43.808zm43.807 0v-43.66h-43.807v43.66h43.807zm43.808 0v-43.66h-43.808v43.66h43.808zm43.808 0v-43.66h-43.808v43.66h43.808zm43.808 0v-43.66h-43.808v43.66h43.808zm-219.039-43.66V-6.879h-43.808v43.66h43.808zm0-43.661V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808zM176.673 36.782v-43.66h-43.808v43.66h43.808zm87.616 0v-43.66h-43.808v43.66h43.808zm0-43.66V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808zm43.807 174.643v-43.66h-43.807v43.66h43.807zm0-43.66V-50.54h-43.807v43.66h43.807zm0-43.661v-43.66h-43.807v43.66h43.807zm0-43.66v-43.662h-43.807V-94.2h43.807zm0-43.662v-43.66h-43.807v43.66h43.807zm43.808 174.643v-43.66h-43.808v43.66h43.808zm0-43.66V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808zm43.808 174.643v-43.66h-43.808v43.66h43.808zm0-43.66V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808zM439.52 36.782v-43.66h-43.808v43.66h43.808zm0-43.66V-50.54h-43.808v43.66h43.808zm0-43.661v-43.66h-43.808v43.66h43.808zm0-43.66v-43.662h-43.808V-94.2h43.808zm0-43.662v-43.66h-43.808v43.66h43.808z" fill="#070707" fill-opacity=".4" style="fill:color(display-p3 .0275 .0275 .0275);fill-opacity:.4"/><path d="M220.481 167.765v-43.661m0 43.661h-43.808m43.808 0v43.661m0-43.661h43.808m-43.808-43.661h-43.808m43.808 0h43.808m-43.808 0v-43.66m-43.808 87.321v-43.661m0 43.661v43.661m0-43.661h-43.808m87.616 43.661h-43.808m43.808 0h43.808m0-43.661v-43.661m0 43.661v43.661m0-43.661h43.807m-131.423-43.661h-43.808m43.808 0v-43.66m87.616 43.66h43.807m-43.807 0v-43.66m-43.808 0h-43.808m43.808 0h43.808m-43.808 0V36.781m-87.616 87.322v43.661m0-43.661H89.057m43.808 0v-43.66m43.808 0h-43.808m43.808 0V36.781m0 174.644h-43.808m0-43.661H89.057m43.808 0v43.661m131.424 0h43.807m-175.231 0H89.057m0-87.322v43.661m0-43.661H45.25m43.808 0v-43.66m43.807 0H89.057m43.808 0V36.781M89.057 167.766H45.25m43.808 0v43.661M45.25 124.104v43.661m0-43.661H1.442m43.808 0v-43.66m43.808 0H45.25m43.808 0V36.781M45.25 167.766H1.442m43.808 0v43.661m43.808 0H45.25M1.442 124.104v43.661m0-43.661v-43.66m43.808 0H1.442m43.808 0V36.781M1.442 167.766v43.661H45.25M1.442 80.443v-43.66m306.654 130.982v-43.661m0 43.661v43.661m0-43.661h43.808m-43.808-43.661h43.808m-43.808 0v-43.66m-43.807 0h43.807m-43.807 0V36.781m43.807 174.644h43.808m0-43.661v-43.661m0 43.661v43.661m0-43.661h43.808m-43.808-43.661h43.808m-43.808 0v-43.66m-43.808 0h43.808m-43.808 0V36.781m43.808 174.644h43.808m0-43.661v-43.661m0 43.661v43.661m0-43.661h43.808m-43.808-43.661h43.808m-43.808 0v-43.66m-43.808 0h43.808m-43.808 0V36.781m43.808 174.644h43.808v-43.661m0 0v-43.661m0 0v-43.66m-43.808 0h43.808m-43.808 0V36.781m43.808 43.661v-43.66m-219.039 0h-43.808m43.808 0h43.808m-43.808 0V-6.879m-43.808 43.66h-43.808m43.808 0v-43.66m-43.808 43.66H89.057m43.808 0v-43.66m-43.808 43.66H45.25m43.808 0v-43.66M45.25 36.782H1.442m43.808 0v-43.66M1.442 36.782v-43.66m262.847 43.66h43.807m-43.807 0v-43.66m43.807 43.66h43.808m-43.808 0v-43.66m43.808 43.66h43.808m-43.808 0v-43.66m43.808 43.66h43.808m-43.808 0v-43.66m43.808 43.66v-43.66m-219.039 0h-43.808m43.808 0V-50.54m0 43.66h43.808m-87.616 0h-43.808m43.808 0v-43.66M132.865-6.88H89.057m43.808 0v-43.66M89.057-6.879v-43.66m0 43.66H45.25m0 0v-43.66m0 43.66H1.442m0 0v-43.66m131.423 0H89.057m43.808 0v-43.66m0 43.66h43.808m-87.615 0v-43.66m0 43.66H45.25m87.615-43.66H89.057m43.808 0v-43.662m0 43.661h43.808m0 43.661v-43.66m0 43.66h43.808M89.058-94.199v-43.662m0 43.661H45.25m0 43.661v-43.66m0 43.66H1.442m131.423-87.322H89.057m43.808 0v-43.66m0 43.66h43.808m0 43.661v-43.661m0 43.661h43.808M89.058-137.86v-43.66m0 43.66H45.25m0 43.661v-43.661m0 43.661H1.442m131.423-87.321H89.057m43.808 0h43.808m0 43.66v-43.66m0 43.66h43.808M89.058-181.52H45.25m0 43.66v-43.66m0 43.66H1.442m175.231-43.66h43.808m-175.231 0H1.442v43.66M220.48-50.539v-43.66m0 43.66h43.808m-43.808-43.66v-43.662m0 43.661h43.808m-43.808-43.661v-43.66m0 43.66h43.808m-43.808-43.66h43.808M1.442-50.539v-43.66m0 0v-43.662M264.289-6.878V-50.54m0 43.66h43.807m0 0v-43.66m0 43.66h43.808m0 0v-43.66m0 43.66h43.808m0 0v-43.66m0 43.66h43.808m0 0v-43.66m-175.231 0V-94.2m0 43.66h43.807M264.289-94.2v-43.662m0 43.661h43.807m-43.807-43.661v-43.66m0 43.66h43.807m-43.807-43.66h43.807m0 130.982V-94.2m0 43.66h43.808M308.096-94.2v-43.662m0 43.661h43.808m-43.808-43.661v-43.66m0 43.66h43.808m-43.808-43.66h43.808m0 130.982V-94.2m0 43.66h43.808M351.904-94.2v-43.662m0 43.661h43.808m-43.808-43.661v-43.66m0 43.66h43.808m-43.808-43.66h43.808m0 130.982V-94.2m0 43.66h43.808M395.712-94.2v-43.662m0 43.661h43.808m-43.808-43.661v-43.66m0 43.66 43.808.001m-43.808-43.661h43.808v43.661m0 87.321V-94.2m0 0v-43.661" stroke="#151515" style="stroke:color(display-p3 .0824 .0824 .0824);stroke-opacity:1"/><path d="M307.866 80.213V37.012H264.52v43.201h43.346zm-87.615 43.661V80.673h-43.347v43.201h43.347zm-43.808-87.322v-43.2h-43.347v43.2h43.347z" fill="#070707" fill-opacity=".4" style="fill:color(display-p3 .0275 .0275 .0275);fill-opacity:.4"/></mask><g mask="url(#d)"><path d="M-53.203-8.946c0-163.462 125.32-295.974 279.909-295.974 154.59 0 279.909 132.512 279.909 295.974S381.296 287.028 226.706 287.028c-154.589 0-279.909-132.512-279.909-295.974z" fill="url(#e)"/></g></g><g filter="url(#f)"><rect x="32" y="44" width="101" height="72" rx="12" fill="#fff" fill-opacity=".32" style="fill:#fff;fill-opacity:.32"/><rect x="32.5" y="44.5" width="100" height="71" rx="11.5" stroke="#fff" style="stroke:#fff;stroke-opacity:1"/></g><g filter="url(#g)"><rect x="294" y="44" width="101" height="72" rx="12" fill="#fff" fill-opacity=".32" style="fill:#fff;fill-opacity:.32"/><rect x="294.5" y="44.5" width="100" height="71" rx="11.5" stroke="#fff" style="stroke:#fff;stroke-opacity:1"/></g><path fill-rule="evenodd" clip-rule="evenodd" d="M313.2 74.671c0-.812.659-1.471 1.472-1.471h15.368a2.522 2.522 0 0 1 2.522 2.522v8.21a2.522 2.522 0 0 1-2.522 2.521h-15.435a1.405 1.405 0 0 1-1.405-1.404H312a2.605 2.605 0 0 0 2.605 2.604h15.435a3.722 3.722 0 0 0 3.722-3.722v-8.209A3.722 3.722 0 0 0 330.04 72h-15.368A2.672 2.672 0 0 0 312 74.671h1.2zm12.912 1.968c-.526-.303-1.148-.454-1.867-.454h-2.511v7.217h2.511c.719 0 1.341-.148 1.867-.443a3.113 3.113 0 0 0 1.241-1.248c.295-.536.443-1.168.443-1.897 0-.735-.148-1.374-.443-1.917a3.097 3.097 0 0 0-1.241-1.258zm-.231 4.959c-.391.426-.949.639-1.674.639h-1.174V77.35h1.174c.725 0 1.283.22 1.674.66.391.44.587 1.041.587 1.804 0 .756-.196 1.35-.587 1.784zm-6.76-5.413h1.299v7.217h-1.299v-7.217zm-2.669.454c-.526-.303-1.148-.454-1.867-.454h-2.511v7.217h2.511c.719 0 1.341-.148 1.867-.443a3.114 3.114 0 0 0 1.241-1.248c.295-.536.443-1.168.443-1.897 0-.735-.148-1.374-.443-1.917a3.096 3.096 0 0 0-1.241-1.258zm-.231 4.959c-.391.426-.949.639-1.674.639h-1.174V77.35h1.174c.725 0 1.283.22 1.674.66.391.44.587 1.041.587 1.804 0 .756-.196 1.35-.587 1.784zm13.538-2.7a.726.726 0 1 0 0-1.452.726.726 0 0 0 0 1.453zm0 3.392a.726.726 0 1 0 0-1.452.726.726 0 0 0 0 1.452zm13.014-6.236a.563.563 0 0 0 .141-.172l.351-.694a3.423 3.423 0 0 0-1.193-.756 4.048 4.048 0 0 0-1.496-.268c-.485 0-.916.078-1.294.234a2.869 2.869 0 0 0-.957.611 2.587 2.587 0 0 0-.586.873c-.135.33-.202.671-.202 1.024 0 .44.065.811.195 1.113.131.298.304.548.519.75.216.197.461.357.735.48.274.124.555.234.842.33l.842.269c.274.087.519.192.735.316.215.123.388.277.519.46.13.183.195.42.195.708 0 .257-.043.49-.128.701-.085.21-.209.392-.371.543a1.648 1.648 0 0 1-.586.344 2.502 2.502 0 0 1-.795.116 2.56 2.56 0 0 1-.93-.15 4.007 4.007 0 0 1-.653-.33 7.973 7.973 0 0 1-.459-.337c-.121-.101-.229-.152-.323-.152a.357.357 0 0 0-.195.055.571.571 0 0 0-.142.138l-.411.7c.18.198.382.377.606.537.23.156.474.29.735.405.26.11.537.195.829.255.292.064.593.096.903.096.516 0 .977-.08 1.381-.24.409-.166.752-.39 1.031-.674.278-.284.49-.616.633-.997.149-.38.223-.788.223-1.223 0-.408-.068-.751-.202-1.03a2.157 2.157 0 0 0-.519-.716 2.921 2.921 0 0 0-.735-.488 7.943 7.943 0 0 0-.842-.336 66.569 66.569 0 0 0-.842-.289 4.08 4.08 0 0 1-.735-.323 1.758 1.758 0 0 1-.525-.447c-.131-.174-.196-.394-.196-.66 0-.206.036-.396.108-.57a1.28 1.28 0 0 1 .33-.46c.144-.133.321-.236.533-.31a2.19 2.19 0 0 1 .747-.116c.301 0 .56.039.775.116.216.074.4.159.553.255.157.091.287.176.391.254.103.073.195.11.276.11a.312.312 0 0 0 .189-.055zm4.059 6.975c-.247-.114-.479-.316-.694-.604v-3.306c.238-.32.496-.568.775-.742.283-.174.615-.261.997-.261.261 0 .494.048.701.144.206.092.379.238.519.44.143.197.251.453.323.77.076.311.115.69.115 1.134 0 .847-.167 1.493-.499 1.938-.328.44-.793.66-1.395.66-.31 0-.591-.058-.842-.172zm-.303-5.298a4.13 4.13 0 0 0-.459.474l-.114-.776c-.045-.18-.16-.269-.344-.269h-.788v9.326h1.314v-3.03c.229.247.489.44.781.577.292.137.643.206 1.052.206.458 0 .869-.092 1.233-.275a2.73 2.73 0 0 0 .93-.77 3.49 3.49 0 0 0 .586-1.147c.139-.445.209-.926.209-1.443a5.63 5.63 0 0 0-.189-1.533 3.318 3.318 0 0 0-.519-1.12 2.218 2.218 0 0 0-.815-.688 2.353 2.353 0 0 0-1.058-.233c-.243 0-.472.03-.687.09a2.544 2.544 0 0 0-.6.24 2.76 2.76 0 0 0-.532.37zm9.555 3.312a9.45 9.45 0 0 0-1.362.131 3.601 3.601 0 0 0-.909.261c-.234.11-.402.24-.506.392a.84.84 0 0 0-.155.495c0 .174.027.325.081.453a.946.946 0 0 0 .229.31.98.98 0 0 0 .344.171c.13.037.272.055.425.055a2.292 2.292 0 0 0 1.03-.233c.149-.078.29-.172.425-.282.135-.11.267-.236.398-.378v-1.375zm-3.855-2.907a3.92 3.92 0 0 1 1.24-.831 3.869 3.869 0 0 1 1.476-.275c.391 0 .737.066 1.037.2.301.127.555.308.762.542.207.234.362.513.465.838.108.326.162.686.162 1.08v4.453h-.587a.572.572 0 0 1-.296-.062.47.47 0 0 1-.162-.247l-.141-.612a6.414 6.414 0 0 1-.519.44 3.635 3.635 0 0 1-.539.323 2.74 2.74 0 0 1-.593.2 3.313 3.313 0 0 1-.701.068c-.27 0-.523-.037-.761-.11a1.746 1.746 0 0 1-.614-.35 1.672 1.672 0 0 1-.417-.585 2.083 2.083 0 0 1-.149-.818c0-.275.072-.538.216-.79.148-.256.386-.486.714-.687.333-.202.764-.367 1.294-.495.535-.128 1.19-.202 1.968-.22v-.508c0-.527-.11-.921-.331-1.183-.22-.26-.543-.391-.97-.391-.287 0-.53.036-.728.11a2.775 2.775 0 0 0-.505.247c-.139.087-.263.167-.371.24a.55.55 0 0 1-.323.11.382.382 0 0 1-.236-.075.657.657 0 0 1-.155-.179l-.236-.433zm11.577.454a.776.776 0 0 0 .121-.124l.351-.495a3.16 3.16 0 0 0-.998-.68c-.372-.16-.804-.24-1.293-.24-.521 0-.984.091-1.388.274a2.878 2.878 0 0 0-1.025.75 3.235 3.235 0 0 0-.626 1.133c-.14.44-.209.92-.209 1.437 0 .568.078 1.077.236 1.526.157.444.37.82.64 1.127.274.306.595.54.963.7.373.16.773.241 1.2.241.247 0 .489-.02.727-.062.243-.041.474-.105.695-.192.22-.087.426-.2.619-.337.198-.137.376-.305.533-.502l-.378-.494a.286.286 0 0 0-.249-.124.37.37 0 0 0-.249.11 3.674 3.674 0 0 1-.303.227 2.41 2.41 0 0 1-.459.233 2.024 2.024 0 0 1-.7.103 1.88 1.88 0 0 1-.796-.165 1.674 1.674 0 0 1-.606-.494 2.42 2.42 0 0 1-.384-.805 4.049 4.049 0 0 1-.135-1.092c0-.394.043-.75.128-1.065.086-.317.209-.585.371-.805.166-.22.373-.389.62-.508.247-.12.532-.179.856-.179.247 0 .453.03.619.09.171.055.315.116.432.185.121.064.22.126.296.186a.412.412 0 0 0 .229.082.268.268 0 0 0 .162-.041zm6.189 1.285c0-.266-.038-.51-.115-.735a1.633 1.633 0 0 0-.323-.584 1.486 1.486 0 0 0-.526-.385 1.746 1.746 0 0 0-.714-.138c-.553 0-.988.163-1.307.488-.315.326-.515.777-.6 1.354h3.585zm1.085 3.271c-.162.193-.348.36-.56.502-.211.138-.435.25-.673.337a4.031 4.031 0 0 1-.742.192 4.607 4.607 0 0 1-.748.062c-.471 0-.909-.08-1.314-.24a3.012 3.012 0 0 1-1.044-.715 3.377 3.377 0 0 1-.687-1.169c-.162-.467-.243-1.003-.243-1.608 0-.485.074-.937.222-1.354a3.32 3.32 0 0 1 .634-1.1 2.973 2.973 0 0 1 1.017-.734c.4-.18.849-.269 1.348-.269.418 0 .802.072 1.152.213.355.138.661.34.917.605.256.266.456.594.599.983.149.39.223.834.223 1.333 0 .207-.023.346-.068.42-.045.068-.128.103-.249.103h-4.488c.014.417.072.78.176 1.092.103.307.244.564.424.77.184.206.402.36.654.46.251.101.532.152.842.152.292 0 .544-.035.755-.103a3.86 3.86 0 0 0 .552-.22 4.41 4.41 0 0 0 .391-.227.55.55 0 0 1 .283-.103c.108 0 .191.041.249.124l.378.494zm5.435-4.652a.416.416 0 0 0 .114-.13l.29-.489a2.8 2.8 0 0 0-.943-.605 3.26 3.26 0 0 0-1.227-.22c-.395 0-.748.058-1.058.172-.305.11-.563.26-.775.447a1.987 1.987 0 0 0-.478.653 1.92 1.92 0 0 0-.162.776c0 .303.05.56.149.77.103.211.235.39.397.536.166.147.355.268.566.365.211.096.427.18.647.254.22.073.436.142.647.206.211.064.397.14.559.227.166.087.299.192.398.316.103.119.155.27.155.453 0 .143-.027.278-.081.406a.963.963 0 0 1-.249.344 1.238 1.238 0 0 1-.411.233 1.877 1.877 0 0 1-.587.083 2.16 2.16 0 0 1-.674-.09 2.791 2.791 0 0 1-.458-.206 5.92 5.92 0 0 1-.323-.213.456.456 0 0 0-.263-.096.378.378 0 0 0-.216.055.383.383 0 0 0-.134.144l-.31.516c.269.247.604.45 1.004.611.399.16.835.24 1.307.24.422 0 .797-.056 1.125-.171a2.34 2.34 0 0 0 .822-.474 1.94 1.94 0 0 0 .506-.715c.116-.28.175-.582.175-.907 0-.284-.052-.525-.155-.722a1.532 1.532 0 0 0-.398-.501 2.11 2.11 0 0 0-.559-.35 6.066 6.066 0 0 0-.64-.255 20.592 20.592 0 0 0-.64-.206 4.374 4.374 0 0 1-.56-.227 1.363 1.363 0 0 1-.397-.296.638.638 0 0 1-.148-.433.851.851 0 0 1 .337-.674 1.13 1.13 0 0 1 .39-.198 1.7 1.7 0 0 1 .519-.076c.229 0 .427.025.593.076.166.05.31.105.431.164.126.06.232.115.317.165.09.05.171.076.243.076a.313.313 0 0 0 .155-.034z" fill="#3B82F6" style="fill:color(display-p3 .2314 .5098 .9647);fill-opacity:1"/><circle cx="83" cy="116" r="12.5" fill="#25C99B" stroke="#fff" style="fill:color(display-p3 .1451 .7882 .6078);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path d="M89.486 115.191a6.552 6.552 0 0 0-5.654-5.599 6.555 6.555 0 0 0-6.889 3.98m-.404-3.236v3.236h3.236m-3.237 3.237a6.551 6.551 0 0 0 5.654 5.599 6.555 6.555 0 0 0 6.889-3.98m.404 3.236v-3.236H86.25" stroke="#fff" style="stroke:#fff;stroke-opacity:1" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><circle cx="345" cy="116" r="12.5" fill="#25C99B" stroke="#fff" style="fill:color(display-p3 .1451 .7882 .6078);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path fill-rule="evenodd" clip-rule="evenodd" d="M344.65 109.176a.699.699 0 0 0-.928 0 7.963 7.963 0 0 1-5.638 1.99.699.699 0 0 0-.704.502 9.35 9.35 0 0 0 .837 7.254 9.352 9.352 0 0 0 5.793 4.446c.116.03.237.03.353-.001.114-.029.229-.061.344-.096a.7.7 0 1 0-.402-1.341l-.119.035a7.976 7.976 0 0 1-2.672-1.342 7.974 7.974 0 0 1-3.062-5.404 7.974 7.974 0 0 1 .139-2.646 9.362 9.362 0 0 0 5.595-1.964 9.361 9.361 0 0 0 5.594 1.964 7.952 7.952 0 0 1-.054 3.697.7.7 0 1 0 1.357.345 9.365 9.365 0 0 0-.091-4.947.7.7 0 0 0-.704-.502 7.96 7.96 0 0 1-5.638-1.99zm3.887 11.595v2.64a.7.7 0 0 0 1.4 0v-2.64l.97.97a.699.699 0 1 0 .99-.99l-2.165-2.165a.7.7 0 0 0-.99 0l-2.165 2.165a.7.7 0 0 0 .99.99l.97-.97z" fill="#fff" style="fill:#fff;fill-opacity:1"/><path d="M59.725 80.496V84h-1.14v-3.504l-3.312-5.064h1.356l2.569 4.08 2.508-4.08H63l-3.276 5.064zm3.362.408c0 .376.048.712.144 1.008.104.288.244.532.42.732.176.192.38.34.612.444a1.881 1.881 0 0 0 1.5 0c.24-.104.448-.252.624-.444.176-.2.312-.444.408-.732a3.03 3.03 0 0 0 .156-1.008c0-.376-.052-.708-.156-.996a2.082 2.082 0 0 0-.408-.744 1.749 1.749 0 0 0-.624-.456 1.881 1.881 0 0 0-1.5 0 1.779 1.779 0 0 0-.612.456 2.23 2.23 0 0 0-.42.744c-.096.288-.144.62-.144.996zm-1.08 0c0-.456.064-.88.192-1.272.128-.4.32-.744.576-1.032.256-.296.572-.528.948-.696a3.148 3.148 0 0 1 1.296-.252c.496 0 .928.084 1.296.252.376.168.692.4.948.696.256.288.448.632.576 1.032.128.392.192.816.192 1.272 0 .456-.064.88-.192 1.272s-.32.736-.576 1.032a2.75 2.75 0 0 1-.948.684c-.368.16-.8.24-1.296.24-.488 0-.92-.08-1.296-.24a2.75 2.75 0 0 1-.948-.684 2.966 2.966 0 0 1-.576-1.032 4.075 4.075 0 0 1-.192-1.272zM74.249 84h-.96v-.984h-.023c-.217.384-.493.668-.829.852-.335.176-.731.264-1.188.264-.407 0-.748-.052-1.02-.156a1.677 1.677 0 0 1-.66-.468 1.8 1.8 0 0 1-.36-.708 4.149 4.149 0 0 1-.096-.924v-4.08h1.02v4.2c0 .384.113.688.337.912.224.224.531.336.924.336.311 0 .58-.048.803-.144a1.51 1.51 0 0 0 .576-.408c.153-.176.264-.38.337-.612.08-.24.12-.5.12-.78v-3.504h1.02V84zm1.376-6.204h.96v1.308h.024c.248-.504.552-.876.912-1.116.36-.24.816-.352 1.368-.336v1.08c-.408 0-.756.056-1.044.168-.288.112-.52.276-.696.492-.176.216-.304.48-.384.792a4.17 4.17 0 0 0-.12 1.056V84h-1.02v-6.204zm8.44 5.244h1.896c.128 0 .288-.008.48-.024.192-.024.396-.072.612-.144.216-.08.428-.192.636-.336.216-.144.408-.34.576-.588.168-.248.304-.556.408-.924.112-.376.168-.828.168-1.356 0-.512-.052-.968-.156-1.368a2.48 2.48 0 0 0-.492-1.032 2.049 2.049 0 0 0-.876-.648c-.36-.152-.804-.228-1.332-.228h-1.92v6.648zm-1.14-7.608h2.94c1.32 0 2.336.336 3.048 1.008.712.672 1.068 1.696 1.068 3.072 0 .72-.08 1.36-.24 1.92a3.634 3.634 0 0 1-.744 1.404 3.254 3.254 0 0 1-1.284.864c-.52.2-1.136.3-1.848.3h-2.94v-8.568zm13.658 8.544c-.176.104-.42.156-.732.156-.264 0-.476-.072-.636-.216-.152-.152-.228-.396-.228-.732-.28.336-.608.58-.984.732a3.265 3.265 0 0 1-1.2.216c-.28 0-.548-.032-.804-.096a1.859 1.859 0 0 1-.648-.3 1.508 1.508 0 0 1-.444-.528 1.897 1.897 0 0 1-.156-.804c0-.352.06-.64.18-.864a1.54 1.54 0 0 1 .468-.54c.2-.144.424-.252.672-.324.256-.072.516-.132.78-.18.28-.056.544-.096.792-.12.256-.032.48-.072.672-.12.192-.056.344-.132.456-.228.112-.104.168-.252.168-.444 0-.224-.044-.404-.132-.54a.81.81 0 0 0-.324-.312 1.261 1.261 0 0 0-.444-.144 3.232 3.232 0 0 0-.48-.036c-.432 0-.792.084-1.08.252-.288.16-.444.468-.468.924h-1.02c.016-.384.096-.708.24-.972s.336-.476.576-.636c.24-.168.512-.288.816-.36a4.42 4.42 0 0 1 .996-.108c.28 0 .556.02.828.06.28.04.532.124.756.252.224.12.404.292.54.516.136.224.204.516.204.876v3.192c0 .24.012.416.036.528.032.112.128.168.288.168.088 0 .192-.02.312-.06v.792zm-1.656-3.18a1.332 1.332 0 0 1-.504.216c-.208.04-.428.076-.66.108-.224.024-.452.056-.684.096-.232.032-.44.088-.624.168a1.16 1.16 0 0 0-.456.348c-.112.144-.168.344-.168.6 0 .168.032.312.096.432.072.112.16.204.264.276.112.072.24.124.384.156.144.032.296.048.456.048.336 0 .624-.044.864-.132.24-.096.436-.212.588-.348.152-.144.264-.296.336-.456.072-.168.108-.324.108-.468v-1.044zm2.52-3h1.02v.84h.025c.168-.344.432-.592.792-.744.36-.16.756-.24 1.188-.24.48 0 .896.088 1.248.264.36.176.656.416.888.72.24.296.42.64.54 1.032.12.392.18.808.18 1.248 0 .44-.06.856-.18 1.248a2.87 2.87 0 0 1-.528 1.032 2.45 2.45 0 0 1-.888.684c-.352.168-.764.252-1.236.252-.152 0-.324-.016-.516-.048a2.856 2.856 0 0 1-.552-.156 2.43 2.43 0 0 1-.528-.288 1.774 1.774 0 0 1-.408-.468h-.024v3.192h-1.02v-8.568zm4.801 3.048c0-.288-.04-.568-.12-.84a2.124 2.124 0 0 0-.348-.744 1.638 1.638 0 0 0-.6-.516 1.786 1.786 0 0 0-.852-.192c-.344 0-.636.068-.876.204-.24.136-.436.316-.588.54a2.256 2.256 0 0 0-.336.744c-.064.28-.096.564-.096.852 0 .304.036.6.108.888.072.28.184.528.336.744.16.216.364.392.612.528.248.128.548.192.9.192s.644-.068.876-.204c.24-.136.432-.316.576-.54a2.35 2.35 0 0 0 .312-.768c.064-.288.096-.584.096-.888zm2.193-3.048h1.02v.84h.024c.168-.344.432-.592.792-.744.36-.16.756-.24 1.188-.24.48 0 .896.088 1.248.264.36.176.656.416.888.72.24.296.42.64.54 1.032.12.392.18.808.18 1.248 0 .44-.06.856-.18 1.248a2.87 2.87 0 0 1-.528 1.032 2.45 2.45 0 0 1-.888.684c-.352.168-.764.252-1.236.252-.152 0-.324-.016-.516-.048a2.856 2.856 0 0 1-.552-.156 2.43 2.43 0 0 1-.528-.288 1.774 1.774 0 0 1-.408-.468h-.024v3.192h-1.02v-8.568zm4.8 3.048c0-.288-.04-.568-.12-.84a2.124 2.124 0 0 0-.348-.744 1.638 1.638 0 0 0-.6-.516 1.786 1.786 0 0 0-.852-.192c-.344 0-.636.068-.876.204-.24.136-.436.316-.588.54a2.256 2.256 0 0 0-.336.744c-.064.28-.096.564-.096.852 0 .304.036.6.108.888.072.28.184.528.336.744.16.216.364.392.612.528.248.128.548.192.9.192s.644-.068.876-.204c.24-.136.432-.316.576-.54a2.35 2.35 0 0 0 .312-.768c.064-.288.096-.584.096-.888z" fill="#3B82F6" style="fill:color(display-p3 .2314 .5098 .9647);fill-opacity:1"/><path d="m290.5 83-5-2.887v5.774l5-2.887zm-151.5.5h1.01v-1H139v1zm5.05 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1zm6.06 0h2.02v-1h-2.02v1z" fill="#030712" style="fill:color(display-p3 .0118 .0275 .0706);fill-opacity:1"/><circle cx="254" cy="83" r="15.5" fill="#25C99B" stroke="#fff" style="fill:color(display-p3 .1451 .7882 .6078);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path fill-rule="evenodd" clip-rule="evenodd" d="M249.8 82.6a1.4 1.4 0 1 1-2.8 0 1.4 1.4 0 0 1 2.8 0zm5.6 0a1.4 1.4 0 1 1-2.8 0 1.4 1.4 0 0 1 2.8 0zm4.2 1.4a1.4 1.4 0 1 0 0-2.8 1.4 1.4 0 0 0 0 2.8z" fill="#fff" style="fill:#fff;fill-opacity:1"/><circle cx="227" cy="83" r="15.5" fill="#3B82F6" stroke="#fff" style="fill:color(display-p3 .2314 .5098 .9647);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path d="m230 81 4.553-2.276a1 1 0 0 1 1.447.894v6.764a1 1 0 0 1-1.447.894L230 85v-4zm-12-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-8a2 2 0 0 1-2-2v-8z" fill="#3B82F6" style="fill:color(display-p3 .2314 .5098 .9647);fill-opacity:1"/><path d="m230 81 4.553-2.276a1 1 0 0 1 1.447.894v6.764a1 1 0 0 1-1.447.894L230 85v-4zm-12-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-8a2 2 0 0 1-2-2v-8z" stroke="#fff" style="stroke:#fff;stroke-opacity:1" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><circle cx="200" cy="83" r="15.5" fill="#25C99B" stroke="#fff" style="fill:color(display-p3 .1451 .7882 .6078);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path d="M202 74v4a.998.998 0 0 0 1 1h4m-5-5h-7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V79m-5-5 5 5m-9 5-1 2 1 2m4-4 1 2-1 2" stroke="#fff" style="stroke:#fff;stroke-opacity:1" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><circle cx="173" cy="83" r="15.5" fill="#3B82F6" stroke="#fff" style="fill:color(display-p3 .2314 .5098 .9647);fill-opacity:1;stroke:#fff;stroke-opacity:1"/><path d="M175.667 79.444h.009M165 86.555l4.444-4.444c.825-.794 1.842-.794 2.667 0l4.445 4.444m-1.778-1.777.889-.89c.825-.793 1.841-.793 2.666 0L181 86.556m-16-8.888A2.667 2.667 0 0 1 167.667 75h10.666A2.666 2.666 0 0 1 181 77.667v10.666A2.667 2.667 0 0 1 178.333 91h-10.666A2.666 2.666 0 0 1 165 88.333V77.667z" stroke="#fff" style="stroke:#fff;stroke-opacity:1" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="a"><path fill="#fff" style="fill:#fff;fill-opacity:1" d="M0 0h440v167H0z"/></clipPath><clipPath id="c"><path fill="#fff" style="fill:#fff;fill-opacity:1" transform="rotate(90 311 129)" d="M0 0h394v439H0z"/></clipPath><filter id="f" x="28" y="40" width="109" height="80" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feGaussianBlur in="BackgroundImageFix" stdDeviation="2"/><feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_6169_38"/><feBlend in="SourceGraphic" in2="effect1_backgroundBlur_6169_38" result="shape"/></filter><filter id="g" x="290" y="40" width="109" height="80" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feGaussianBlur in="BackgroundImageFix" stdDeviation="2"/><feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_6169_38"/><feBlend in="SourceGraphic" in2="effect1_backgroundBlur_6169_38" result="shape"/></filter><radialGradient id="e" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-279.909 0 0 -295.974 226.706 -8.946)"><stop stop-color="#F6FAFF" style="stop-color:color(display-p3 .963 .9821 1);stop-opacity:1"/><stop offset="1" stop-color="#8EC7FF" stop-opacity="0" style="stop-color:none;stop-opacity:0"/></radialGradient><linearGradient id="b" x1="440" y1="15" x2="0" y2="159.5" gradientUnits="userSpaceOnUse"><stop stop-color="#A2B7FF" style="stop-color:color(display-p3 .6353 .7189 .9997);stop-opacity:1"/><stop offset=".634" stop-color="#E7F4FC" style="stop-color:color(display-p3 .9059 .9569 .9882);stop-opacity:1"/><stop offset="1" stop-color="#8BC0FF" style="stop-color:color(display-p3 .5451 .7547 1);stop-opacity:1"/></linearGradient></defs></svg>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<g id="icon">
|
|
3
|
-
<path id="Union" fill-rule="evenodd" clip-rule="evenodd"
|
|
4
|
-
d="M14 8C14 11.3137 11.3137 14 8 14C4.68629 14 2 11.3137 2 8C2 4.68629 4.68629 2 8 2C11.3137 2 14 4.68629 14 8ZM15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1C11.866 1 15 4.13401 15 8ZM10.6585 6.75529C10.852 6.55827 10.8491 6.2417 10.6521 6.04821C10.4551 5.85472 10.1385 5.85759 9.94501 6.05461L7.16878 8.88151L5.95903 7.64968C5.76554 7.45266 5.44897 7.4498 5.25195 7.64329C5.05493 7.83678 5.05207 8.15335 5.24556 8.35037L6.81204 9.94545C6.90606 10.0412 7.0346 10.0951 7.16878 10.0951C7.30296 10.0951 7.4315 10.0412 7.52552 9.94545L10.6585 6.75529Z"
|
|
5
|
-
fill="#3B82F6" style="fill:#3B82F6;fill:color(display-p3 0.2314 0.5098 0.9647);fill-opacity:1;" />
|
|
6
|
-
</g>
|
|
7
|
-
</svg>
|