@opexa/portal-components 0.0.665 → 0.0.668
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/client/hooks/useCamera.d.ts +1 -1
- package/dist/client/hooks/useCamera.js +21 -65
- package/dist/components/Account/Account.lazy.d.ts +2 -0
- package/dist/components/Account/Account.lazy.js +1 -1
- package/dist/components/Account/AccountTrigger.d.ts +3 -1
- package/dist/components/Account/AccountTrigger.js +2 -2
- package/dist/components/AccountInfo/AccountInfo.d.ts +2 -0
- package/dist/components/AccountInfo/AccountInfo.js +5 -5
- package/dist/components/KYC/KYCDefault/KYCDefault.js +2 -2
- package/dist/components/RegisterBiometrics/RegisterBiometrics.js +3 -1
- package/dist/components/shared/IdFrontImageField/IdFrontImageField.client.js +1 -1
- package/dist/images/placeholder-avatar-2.png +0 -0
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ export interface CameraData {
|
|
|
12
12
|
export interface UseCameraReturn<T extends string = never> {
|
|
13
13
|
open(): Promise<void>;
|
|
14
14
|
close(): Promise<void>;
|
|
15
|
-
snap():
|
|
15
|
+
snap(): CameraData | null;
|
|
16
16
|
reopen(): Promise<void>;
|
|
17
17
|
reset(): Promise<void>;
|
|
18
18
|
data: CameraData | null;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { isBoolean } from 'lodash-es';
|
|
2
2
|
import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
-
import invariant from 'tiny-invariant';
|
|
4
3
|
import { useMediaQuery } from 'usehooks-ts';
|
|
5
4
|
export function useCamera(options = {}) {
|
|
6
5
|
const videoRef = useRef(null);
|
|
@@ -90,76 +89,33 @@ export function useCamera(options = {}) {
|
|
|
90
89
|
resolve();
|
|
91
90
|
});
|
|
92
91
|
}, []);
|
|
93
|
-
const snap = useCallback(
|
|
94
|
-
setData(null);
|
|
95
|
-
setError(null);
|
|
96
|
-
setSnapping(true);
|
|
92
|
+
const snap = useCallback(() => {
|
|
97
93
|
const video = videoRef.current;
|
|
94
|
+
if (!video)
|
|
95
|
+
return null;
|
|
98
96
|
const canvas = document.createElement('canvas');
|
|
99
97
|
const context = canvas.getContext('2d');
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
video.currentTime = 1;
|
|
98
|
+
if (!context)
|
|
99
|
+
return null;
|
|
103
100
|
canvas.width = video.videoWidth;
|
|
104
101
|
canvas.height = video.videoHeight;
|
|
105
|
-
context.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return setError({
|
|
114
|
-
name: 'CameraError',
|
|
115
|
-
message: "'canvas.toBlob' failed to create blob",
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
const url = canvas.toDataURL('image/jpeg', 1);
|
|
119
|
-
const file = new File([blob], `${crypto.randomUUID()}.jpeg`, {
|
|
120
|
-
type: 'image/jpeg',
|
|
121
|
-
endings: 'native',
|
|
122
|
-
lastModified: Date.now(),
|
|
123
|
-
});
|
|
124
|
-
const image = new Image();
|
|
125
|
-
image.src = url;
|
|
126
|
-
image.alt = '';
|
|
127
|
-
image.width = canvas.width;
|
|
128
|
-
image.height = canvas.height;
|
|
129
|
-
if (!image.complete || image.naturalWidth === 0) {
|
|
130
|
-
await new Promise((resolve, reject) => {
|
|
131
|
-
image.onload = () => resolve();
|
|
132
|
-
image.onerror = () => reject();
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
const data = {
|
|
136
|
-
url,
|
|
137
|
-
file,
|
|
138
|
-
image,
|
|
139
|
-
};
|
|
140
|
-
if (!options.transform) {
|
|
141
|
-
setData(data);
|
|
142
|
-
setSnapping(false);
|
|
143
|
-
resolve(data);
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
const transformResult = await options.transform({
|
|
147
|
-
...data,
|
|
148
|
-
video,
|
|
149
|
-
canvas,
|
|
150
|
-
});
|
|
151
|
-
if (transformResult.ok) {
|
|
152
|
-
setData(transformResult.data);
|
|
153
|
-
resolve(transformResult.data);
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
setError(transformResult.error);
|
|
157
|
-
resolve(null);
|
|
158
|
-
}
|
|
159
|
-
setSnapping(false);
|
|
160
|
-
}, 'image/jpeg', 1);
|
|
102
|
+
context.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
103
|
+
const url = canvas.toDataURL('image/jpeg', 0.9);
|
|
104
|
+
const arr = atob(url.split(',')[1]);
|
|
105
|
+
const u8arr = new Uint8Array(arr.length);
|
|
106
|
+
for (let i = 0; i < arr.length; i++)
|
|
107
|
+
u8arr[i] = arr.charCodeAt(i);
|
|
108
|
+
const file = new File([u8arr], `${crypto.randomUUID()}.jpeg`, {
|
|
109
|
+
type: 'image/jpeg',
|
|
161
110
|
});
|
|
162
|
-
|
|
111
|
+
const image = new Image();
|
|
112
|
+
image.src = url;
|
|
113
|
+
image.width = canvas.width;
|
|
114
|
+
image.height = canvas.height;
|
|
115
|
+
const data = { url, file, image };
|
|
116
|
+
setData(data);
|
|
117
|
+
return data;
|
|
118
|
+
}, []);
|
|
163
119
|
const reset = useCallback(() => {
|
|
164
120
|
setData(null);
|
|
165
121
|
setError(null);
|
|
@@ -51,5 +51,7 @@ export interface AccountProps {
|
|
|
51
51
|
notificationsEnabled?: boolean;
|
|
52
52
|
/** @default true */
|
|
53
53
|
shouldShowAccountStatus?: boolean;
|
|
54
|
+
/** Avatar image source */
|
|
55
|
+
avatar?: string;
|
|
54
56
|
}
|
|
55
57
|
export declare function Account(props: AccountProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -92,7 +92,7 @@ function Profile() {
|
|
|
92
92
|
return 'danger';
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
|
-
return (_jsxs("div", { className: "flex shrink-0 items-center gap-lg", children: [_jsx(Image, { src: avatarPlaceholder, alt: "", width: 48, height: 48, className: "size-12" }), _jsxs("div", { className: "grow", children: [_jsx("p", { className: "font-semibold text-text-secondary-700 leading-tight", children: account?.name }), _jsxs("div", { className: "flex", children: [_jsxs("p", { className: "grow items-center text-text-tertiary-600 leading-tight", children: ["ID: ", account?.id] }), accountProps.shouldShowAccountStatus && (_jsxs(Badge.Root, { colorScheme: getVerificationColorScheme(account?.verificationStatus), className: "self-start", children: [_jsx(Badge.Indicator, {}), _jsx(Badge.Label, { children: capitalize(account?.verificationStatus || '') })] }))] })] })] }));
|
|
95
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-lg", children: [_jsx(Image, { src: accountProps.avatar || avatarPlaceholder, alt: "", width: 48, height: 48, className: "size-12" }), _jsxs("div", { className: "grow", children: [_jsx("p", { className: "font-semibold text-text-secondary-700 leading-tight", children: account?.name }), _jsxs("div", { className: "flex", children: [_jsxs("p", { className: "grow items-center text-text-tertiary-600 leading-tight", children: ["ID: ", account?.id] }), accountProps.shouldShowAccountStatus && (_jsxs(Badge.Root, { colorScheme: getVerificationColorScheme(account?.verificationStatus), className: "self-start", children: [_jsx(Badge.Indicator, {}), _jsx(Badge.Label, { children: capitalize(account?.verificationStatus || '') })] }))] })] })] }));
|
|
96
96
|
}
|
|
97
97
|
function Links({ router, classNames, }) {
|
|
98
98
|
const accountProps = useAccountPropsContext();
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ComponentPropsWithRef } from 'react';
|
|
2
2
|
export interface AccountTriggerProps extends ComponentPropsWithRef<'button'> {
|
|
3
3
|
asChild?: boolean;
|
|
4
|
+
/** Avatar image source */
|
|
5
|
+
avatar?: string;
|
|
4
6
|
}
|
|
5
|
-
export declare function AccountTrigger({ asChild, children, ...props }: AccountTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function AccountTrigger({ asChild, children, avatar, ...props }: AccountTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -8,7 +8,7 @@ import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
|
|
|
8
8
|
import { XIcon } from '../../icons/XIcon.js';
|
|
9
9
|
import avatarPlaceholder from '../../images/placeholder-avatar.png';
|
|
10
10
|
import { IconButton } from '../../ui/IconButton/index.js';
|
|
11
|
-
export function AccountTrigger({ asChild, children, ...props }) {
|
|
11
|
+
export function AccountTrigger({ asChild, children, avatar, ...props }) {
|
|
12
12
|
const desktop = useMediaQuery('(min-width: 1024px)', {
|
|
13
13
|
defaultValue: true,
|
|
14
14
|
});
|
|
@@ -22,5 +22,5 @@ export function AccountTrigger({ asChild, children, ...props }) {
|
|
|
22
22
|
return (_jsx(ark.button, { type: "button", "aria-label": "Toggle account menu", "data-open": disclosure.open ? 'open' : 'closed', ...props, onClick: (e) => {
|
|
23
23
|
disclosure.setOpen(!disclosure.open);
|
|
24
24
|
return props.onClick?.(e);
|
|
25
|
-
}, asChild: !children ? true : asChild, children: children ?? (_jsx(IconButton, { id: "opexa-powerplay:account-trigger", size: "sm", colorScheme: "gray", children: !desktop && disclosure.open ? (_jsx(XIcon, {})) : (_jsx(Image, { src: avatarPlaceholder, alt: "", width: 64, height: 64, className: "size-10" })) })) }));
|
|
25
|
+
}, asChild: !children ? true : asChild, children: children ?? (_jsx(IconButton, { id: "opexa-powerplay:account-trigger", size: "sm", colorScheme: "gray", children: !desktop && disclosure.open ? (_jsx(XIcon, {})) : (_jsx(Image, { src: avatar || avatarPlaceholder, alt: "", width: 64, height: 64, className: "size-10" })) })) }));
|
|
26
26
|
}
|
|
@@ -25,7 +25,7 @@ import { FacebookIcon } from '../../icons/FacebookIcon.js';
|
|
|
25
25
|
import { GoogleIcon } from '../../icons/GoogleIcon.js';
|
|
26
26
|
import { LinkBroken02Icon } from '../../icons/LinkBroken02Icon.js';
|
|
27
27
|
import { XIcon } from '../../icons/XIcon.js';
|
|
28
|
-
import
|
|
28
|
+
import avatarPlaceholder from '../../images/placeholder-avatar.png';
|
|
29
29
|
import { Button } from '../../ui/Button/index.js';
|
|
30
30
|
import { Dialog } from '../../ui/Dialog/index.js';
|
|
31
31
|
import { Field } from '../../ui/Field/index.js';
|
|
@@ -41,9 +41,9 @@ const accountSchema = z.object({
|
|
|
41
41
|
.regex(/^[a-zA-Z0-9]+$/, 'Username can only contain letters and numbers'),
|
|
42
42
|
});
|
|
43
43
|
export function AccountInfo(props) {
|
|
44
|
-
return (_jsxs("div", { className: twMerge('space-y-3xl', props.className), children: [_jsx(ProfileInfo, {}), _jsx(ContactInfo, {}), _jsx(PersonalInfo, { shouldShowBranchCode: props.shouldShowBranchCode, branchCodes: props.branchCodes }), _jsx(SSO, { google: props.googleSso, facebook: props.facebookSso })] }));
|
|
44
|
+
return (_jsxs("div", { className: twMerge('space-y-3xl', props.className), children: [_jsx(ProfileInfo, { avatar: props.avatar }), _jsx(ContactInfo, {}), _jsx(PersonalInfo, { shouldShowBranchCode: props.shouldShowBranchCode, branchCodes: props.branchCodes }), _jsx(SSO, { google: props.googleSso, facebook: props.facebookSso })] }));
|
|
45
45
|
}
|
|
46
|
-
function ProfileInfo() {
|
|
46
|
+
function ProfileInfo({ avatar }) {
|
|
47
47
|
const [edit, setEdit] = useState(false);
|
|
48
48
|
const accountQuery = useAccountQuery();
|
|
49
49
|
const account = accountQuery.data;
|
|
@@ -74,7 +74,7 @@ function ProfileInfo() {
|
|
|
74
74
|
},
|
|
75
75
|
resolver: zodResolver(accountSchema),
|
|
76
76
|
});
|
|
77
|
-
return (_jsxs("div", { children: [_jsx("h2", { className: "font-semibold text-sm text-text-secondary-700", children: "Profile Info" }), _jsx("div", { className: "mt-5 rounded-xl border border-border-secondary bg-bg-primary-alt", children: _jsx("div", { className: "border-border-secondary px-4 py-5", children: _jsxs("div", { className: "flex items-start gap-xl", children: [_jsx(Image, { src: avatar, alt: "", width: 80, height: 80, className: "mt-2 size-14 shrink-0 rounded-md object-cover" }), edit ? (_jsxs("form", { onSubmit: form.handleSubmit((data) => {
|
|
77
|
+
return (_jsxs("div", { children: [_jsx("h2", { className: "font-semibold text-sm text-text-secondary-700", children: "Profile Info" }), _jsx("div", { className: "mt-5 rounded-xl border border-border-secondary bg-bg-primary-alt", children: _jsx("div", { className: "border-border-secondary px-4 py-5", children: _jsxs("div", { className: "flex items-start gap-xl", children: [_jsx(Image, { src: avatar || avatarPlaceholder, alt: "", width: 80, height: 80, className: "mt-2 size-14 shrink-0 rounded-md object-cover" }), edit ? (_jsxs("form", { onSubmit: form.handleSubmit((data) => {
|
|
78
78
|
mutate({
|
|
79
79
|
name: data.name,
|
|
80
80
|
});
|
|
@@ -147,7 +147,7 @@ function PersonalInfo(props) {
|
|
|
147
147
|
? data.birthDay
|
|
148
148
|
: undefined,
|
|
149
149
|
});
|
|
150
|
-
}), children: [_jsxs("div", { className: "px-4 py-5 lg:px-3xl lg:py-5", children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.realName, readOnly: !!account?.realName, children: [_jsx(Field.Label, { children: "Full name" }), _jsx(Field.Input, { ...form.register('realName') }), _jsx(Field.ErrorText, { children: form.formState.errors.realName?.message })] }), _jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Date of birth" }), _jsx(Field.Input, { type: "date", ...form.register('birthDay') }), _jsx(Field.ErrorText, { children: form.formState.errors.birthDay?.message })] }), props.shouldShowBranchCode && (_jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Branch Code" }), _jsx(Field.Input, { type: "text", disabled: true, value: displayBranchName ?? account?.branchCode ?? '' })] }))] }), form.formState.isDirty && (_jsxs("div", { className: "flex justify-end gap-lg border-border-secondary border-t px-xl py-lg lg:px-3xl lg:py-xl", children: [_jsx(Button, { size: "sm", variant: "outline", fullWidth: false, disabled: updateAccountMutation.isPending, onClick: () => form.reset(), children: "Cancel" }), _jsx(Button, { type: "submit", size: "sm", fullWidth: false, disabled: !form.formState.isValid || updateAccountMutation.isPending, children: "Save Changes" })] }))] })] }));
|
|
150
|
+
}), children: [_jsxs("div", { className: "px-4 py-5 lg:px-3xl lg:py-5", children: [_jsxs(Field.Root, { invalid: !!form.formState.errors.realName, readOnly: !!account?.realName, children: [_jsx(Field.Label, { children: "Full name" }), _jsx(Field.Input, { ...form.register('realName') }), _jsx(Field.ErrorText, { children: form.formState.errors.realName?.message })] }), _jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Date of birth" }), _jsx(Field.Input, { type: "date", ...form.register('birthDay'), className: twMerge('h-full py-2.5', account?.birthDay && 'pointer-events-none') }), _jsx(Field.ErrorText, { children: form.formState.errors.birthDay?.message })] }), props.shouldShowBranchCode && (_jsxs(Field.Root, { className: "mt-6", invalid: !!form.formState.errors.birthDay, readOnly: !!account?.birthDay, children: [_jsx(Field.Label, { children: "Branch Code" }), _jsx(Field.Input, { type: "text", disabled: true, value: displayBranchName ?? account?.branchCode ?? '' })] }))] }), form.formState.isDirty && (_jsxs("div", { className: "flex justify-end gap-lg border-border-secondary border-t px-xl py-lg lg:px-3xl lg:py-xl", children: [_jsx(Button, { size: "sm", variant: "outline", fullWidth: false, disabled: updateAccountMutation.isPending, onClick: () => form.reset(), children: "Cancel" }), _jsx(Button, { type: "submit", size: "sm", fullWidth: false, disabled: !form.formState.isValid || updateAccountMutation.isPending, children: "Save Changes" })] }))] })] }));
|
|
151
151
|
}
|
|
152
152
|
function ContactInfo() {
|
|
153
153
|
const localeInfo = useLocaleInfo();
|
|
@@ -20,7 +20,7 @@ export function KYCDefault(props) {
|
|
|
20
20
|
const kyc = useKYCDefault(props?.isSkippable ?? false);
|
|
21
21
|
const { isLoading: sessionLoading } = useSessionQuery();
|
|
22
22
|
const isDialogOpen = !globalStore.kycReminder.open && globalStore.kyc.open && !sessionLoading;
|
|
23
|
-
return (_jsxs(_Fragment, { children: [_jsx(KYCDefaultContext, { value: kyc, children: _jsx(Dialog.Root, { open:
|
|
23
|
+
return (_jsxs(_Fragment, { children: [_jsx(KYCDefaultContext, { value: kyc, children: _jsx(Dialog.Root, { open: true, onOpenChange: (details) => {
|
|
24
24
|
globalStore.kyc.setOpen(details.open);
|
|
25
|
-
}, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: kyc.reset, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { children: _jsx(Dialog.Content, { className: "mx-auto min-h-full w-full overflow-y-auto bg-bg-primary-alt lg:min-h-auto lg:w-fit", children: _jsxs("div", { className: "flex h-dvh w-full flex-col overflow-y-auto p-3xl sm:h-fit sm:overflow-auto lg:w-[400px]", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 100, className: "mx-auto mb-5 block h-7.5 w-auto", draggable: false }), _jsx(Indicator, {}), kyc.step === 1 && _jsx(IdentityVerification, {}), kyc.step === 2 && _jsx(PersonalInformation, {})] }) }) })] }) }) }), _jsx(KYCReminder, { ...props })] }));
|
|
25
|
+
}, lazyMount: true, unmountOnExit: true, closeOnEscape: false, closeOnInteractOutside: false, onExitComplete: kyc.reset, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, {}), _jsx(Dialog.Positioner, { className: "fixed top-[57px]", children: _jsx(Dialog.Content, { className: "mx-auto min-h-full w-full overflow-y-auto bg-bg-primary-alt lg:min-h-auto lg:w-fit", children: _jsxs("div", { className: "mt-[calc(var(--safe-area-inset-top)*3)] flex h-dvh w-full flex-col overflow-y-auto p-3xl sm:h-fit sm:overflow-auto lg:w-[400px]", children: [_jsx(Image, { src: props.logo, alt: "", width: 200, height: 100, className: "mx-auto mb-5 block h-7.5 w-auto", draggable: false }), _jsx(Indicator, {}), kyc.step === 1 && _jsx(IdentityVerification, {}), kyc.step === 2 && _jsx(PersonalInformation, {})] }) }) })] }) }) }), _jsx(KYCReminder, { ...props })] }));
|
|
26
26
|
}
|
|
@@ -30,7 +30,9 @@ export function RegisterBiometrics() {
|
|
|
30
30
|
Capacitor.isNativePlatform() &&
|
|
31
31
|
!responsibleGamingReminder.open &&
|
|
32
32
|
!kycModals.kyc.open &&
|
|
33
|
-
!kycModals.kycReminder.open, children: _jsx(Portal, { children: _jsx(Dialog.Positioner, { className: "flex items-center", children: _jsxs(Dialog.Content, { className: "flex w-full min-w-[320px] max-w-md flex-col gap-4 rounded-lg border-border-brand bg-bg-secondary p-6 shadow-lg", children: [_jsx(Dialog.CloseTrigger, {
|
|
33
|
+
!kycModals.kycReminder.open, children: _jsx(Portal, { children: _jsx(Dialog.Positioner, { className: "flex items-center", children: _jsxs(Dialog.Content, { className: "flex w-full min-w-[320px] max-w-md flex-col gap-4 rounded-lg border-border-brand bg-bg-secondary p-6 shadow-lg", children: [_jsx(Dialog.CloseTrigger, { onClick: () => {
|
|
34
|
+
registerBiometricStore.setOpen(false);
|
|
35
|
+
}, children: _jsx(XIcon, {}) }), _jsx("h2", { className: "mt-4 w-full text-center font-bold text-2xl text-brand-500", children: "Register Biometric" }), _jsx("p", { className: "mt-2 grow text-center text-[#999]", children: "Would you like to setup biometric authentication?" }), _jsxs("div", { className: "flex gap-4 p-2", children: [_jsx(Button, { onClick: async () => {
|
|
34
36
|
if (!account)
|
|
35
37
|
return;
|
|
36
38
|
const ok = await performBiometricVerification({
|
|
@@ -103,5 +103,5 @@ function Video() {
|
|
|
103
103
|
const y = (rootRect.height - guideRect.height) / 2;
|
|
104
104
|
return (_jsxs("div", { ref: rootRef, className: twMerge('relative h-auto w-full overflow-hidden', !context.camera.data && !context.camera.error && !context.camera.loading
|
|
105
105
|
? 'block'
|
|
106
|
-
: 'hidden'), children: [_jsx("video", { ...context.camera.videoProps }), _jsx("div", { className: "pointer-events-none absolute top-
|
|
106
|
+
: 'hidden'), children: [_jsx("video", { ...context.camera.videoProps }), _jsx("div", { className: "pointer-events-none absolute top-0 right-0 left-0 z-20 bg-black/60 backdrop-blur-sm", style: { height: `${pxToRem(y)}rem` } }), _jsx("div", { className: "pointer-events-none absolute right-0 bottom-0 left-0 z-20 bg-black/60 backdrop-blur-sm", style: { height: `${pxToRem(y)}rem` } }), _jsx("div", { className: "pointer-events-none absolute left-0 z-20 bg-black/60 backdrop-blur-sm", style: { top: y, bottom: y, width: `${pxToRem(x)}rem` } }), _jsx("div", { className: "pointer-events-none absolute right-0 z-20 bg-black/60 backdrop-blur-sm", style: { top: y, bottom: y, width: `${pxToRem(x)}rem` } }), _jsx("div", { ref: context.guideRef, className: "-translate-x-1/2 -translate-y-1/2 pointer-events-none absolute top-1/2 left-1/2 z-10 aspect-[85.6/53.98] w-[calc(100%-1rem)] max-w-[24.688rem] border-4 border-utility-warning-700 border-dashed transition-all duration-200" })] }));
|
|
107
107
|
}
|
|
Binary file
|