@chekinapp/ui 0.0.99 → 0.0.100
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/index.cjs +93 -65
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +124 -96
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8834,7 +8834,7 @@ var VALUE_PART = 1;
|
|
|
8834
8834
|
var getSidebarState = (stateName) => document.cookie.split("; ").find((row) => row.startsWith(`${stateName}=`))?.split("=")[VALUE_PART] === "true";
|
|
8835
8835
|
|
|
8836
8836
|
// src/signature-canvas/SignatureCanvas.tsx
|
|
8837
|
-
import { forwardRef as forwardRef41, useEffect as useEffect29, useRef as useRef21 } from "react";
|
|
8837
|
+
import { forwardRef as forwardRef41, useEffect as useEffect29, useRef as useRef21, useState as useState32, useCallback as useCallback24 } from "react";
|
|
8838
8838
|
import { Trans, useTranslation as useTranslation17 } from "react-i18next";
|
|
8839
8839
|
import ReactSignatureCanvas from "react-signature-pad-wrapper";
|
|
8840
8840
|
|
|
@@ -8852,21 +8852,37 @@ var sign_finger_default = SvgSignFinger;
|
|
|
8852
8852
|
|
|
8853
8853
|
// src/signature-canvas/SignatureCanvas.tsx
|
|
8854
8854
|
import { jsx as jsx107, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
8855
|
-
var CANVAS_PROPS = {
|
|
8856
|
-
width: "250px",
|
|
8857
|
-
height: "174px"
|
|
8858
|
-
};
|
|
8859
8855
|
var SIGNATURE_PROPS = {
|
|
8860
8856
|
penColor: "#161643",
|
|
8861
8857
|
minWidth: 1.5,
|
|
8862
8858
|
maxWidth: 1.5,
|
|
8863
8859
|
dotSize: 1
|
|
8864
8860
|
};
|
|
8861
|
+
var ASPECT_RATIO = 330 / 190;
|
|
8865
8862
|
var SignatureCanvas = forwardRef41(
|
|
8866
8863
|
({ onClear, hasSignature, onEnd, onEnable, className, enabled }, ref) => {
|
|
8867
8864
|
const { t } = useTranslation17();
|
|
8868
8865
|
const internalRef = useRef21(null);
|
|
8866
|
+
const containerRef = useRef21(null);
|
|
8869
8867
|
const combinedRef = useCombinedRef(ref, internalRef);
|
|
8868
|
+
const [size, setSize] = useState32({ width: 330, height: 190 });
|
|
8869
|
+
const calculateSize = useCallback24((containerWidth) => {
|
|
8870
|
+
const width = Math.min(containerWidth, 646);
|
|
8871
|
+
const height = Math.round(width / ASPECT_RATIO);
|
|
8872
|
+
setSize({ width, height });
|
|
8873
|
+
}, []);
|
|
8874
|
+
useEffect29(() => {
|
|
8875
|
+
const container = containerRef.current;
|
|
8876
|
+
if (!container) return;
|
|
8877
|
+
const observer = new ResizeObserver((entries) => {
|
|
8878
|
+
const entry = entries[0];
|
|
8879
|
+
if (entry) {
|
|
8880
|
+
calculateSize(entry.contentRect.width);
|
|
8881
|
+
}
|
|
8882
|
+
});
|
|
8883
|
+
observer.observe(container);
|
|
8884
|
+
return () => observer.disconnect();
|
|
8885
|
+
}, [calculateSize]);
|
|
8870
8886
|
useEffect29(() => {
|
|
8871
8887
|
if (!onEnd) return;
|
|
8872
8888
|
const signPad = internalRef.current?.instance;
|
|
@@ -8875,73 +8891,85 @@ var SignatureCanvas = forwardRef41(
|
|
|
8875
8891
|
signPad?.removeEventListener("endStroke", onEnd);
|
|
8876
8892
|
};
|
|
8877
8893
|
}, [onEnd]);
|
|
8878
|
-
return /* @__PURE__ */ jsxs66(
|
|
8879
|
-
|
|
8880
|
-
|
|
8881
|
-
|
|
8882
|
-
|
|
8883
|
-
|
|
8884
|
-
|
|
8885
|
-
"
|
|
8886
|
-
"cursor-pointer select-none"
|
|
8887
|
-
),
|
|
8888
|
-
onClick: onEnable,
|
|
8889
|
-
"data-testid": "signature-placeholder",
|
|
8890
|
-
children: [
|
|
8891
|
-
/* @__PURE__ */ jsx107(SvgIcon, { as: sign_finger_default, size: 41, className: "w-[37px] opacity-[0.55]" }),
|
|
8892
|
-
/* @__PURE__ */ jsx107(
|
|
8893
|
-
"span",
|
|
8894
|
-
{
|
|
8895
|
-
className: cn(
|
|
8896
|
-
"mx-auto mt-2 max-w-[154px] break-words text-center text-sm font-medium uppercase",
|
|
8897
|
-
"text-[var(--signature-canvas-placeholder-text)] opacity-[0.55]"
|
|
8898
|
-
),
|
|
8899
|
-
children: /* @__PURE__ */ jsx107(Trans, { i18nKey: "signature_placeholder_text" })
|
|
8900
|
-
}
|
|
8901
|
-
)
|
|
8902
|
-
]
|
|
8903
|
-
}
|
|
8904
|
-
),
|
|
8905
|
-
/* @__PURE__ */ jsx107(
|
|
8906
|
-
"div",
|
|
8907
|
-
{
|
|
8908
|
-
className: cn(
|
|
8909
|
-
"inline-flex h-[174px] w-[250px] cursor-pointer justify-center rounded border",
|
|
8910
|
-
"border-[var(--signature-canvas-border)] shadow-[var(--signature-canvas-shadow)]",
|
|
8911
|
-
"box-border max-[320px]:overflow-hidden"
|
|
8912
|
-
),
|
|
8913
|
-
children: /* @__PURE__ */ jsx107(
|
|
8914
|
-
ReactSignatureCanvas,
|
|
8894
|
+
return /* @__PURE__ */ jsxs66(
|
|
8895
|
+
"div",
|
|
8896
|
+
{
|
|
8897
|
+
ref: containerRef,
|
|
8898
|
+
className: cn("relative flex w-full flex-col items-center", className),
|
|
8899
|
+
children: [
|
|
8900
|
+
!enabled && /* @__PURE__ */ jsxs66(
|
|
8901
|
+
"button",
|
|
8915
8902
|
{
|
|
8916
|
-
|
|
8917
|
-
|
|
8918
|
-
|
|
8919
|
-
|
|
8903
|
+
type: "button",
|
|
8904
|
+
className: cn(
|
|
8905
|
+
"absolute left-1/2 top-0 z-10 flex -translate-x-1/2 flex-col items-center",
|
|
8906
|
+
"justify-center rounded-xl border-2 border-[var(--signature-canvas-border)] bg-transparent",
|
|
8907
|
+
"cursor-pointer select-none"
|
|
8908
|
+
),
|
|
8909
|
+
style: { width: size.width, height: size.height },
|
|
8910
|
+
onClick: onEnable,
|
|
8911
|
+
"data-testid": "signature-placeholder",
|
|
8912
|
+
children: [
|
|
8913
|
+
/* @__PURE__ */ jsx107(SvgIcon, { as: sign_finger_default, size: 41, className: "w-[37px] opacity-55" }),
|
|
8914
|
+
/* @__PURE__ */ jsx107(
|
|
8915
|
+
"span",
|
|
8916
|
+
{
|
|
8917
|
+
className: cn(
|
|
8918
|
+
"mx-auto mt-4 max-w-[200px] break-words text-center text-base font-medium",
|
|
8919
|
+
"text-[var(--signature-canvas-placeholder-text)] opacity-55"
|
|
8920
|
+
),
|
|
8921
|
+
children: /* @__PURE__ */ jsx107(Trans, { i18nKey: "tap_here_to_sign" })
|
|
8922
|
+
}
|
|
8923
|
+
)
|
|
8924
|
+
]
|
|
8920
8925
|
}
|
|
8921
|
-
)
|
|
8922
|
-
|
|
8923
|
-
|
|
8924
|
-
/* @__PURE__ */ jsx107(
|
|
8925
|
-
"div",
|
|
8926
|
-
{
|
|
8927
|
-
className: cn("text-right", {
|
|
8928
|
-
invisible: !enabled || !hasSignature
|
|
8929
|
-
}),
|
|
8930
|
-
children: /* @__PURE__ */ jsx107(
|
|
8931
|
-
Button,
|
|
8926
|
+
),
|
|
8927
|
+
/* @__PURE__ */ jsx107(
|
|
8928
|
+
"div",
|
|
8932
8929
|
{
|
|
8933
|
-
variant: "link",
|
|
8934
8930
|
className: cn(
|
|
8935
|
-
"
|
|
8936
|
-
"
|
|
8931
|
+
"inline-flex cursor-pointer justify-center rounded-xl border-2",
|
|
8932
|
+
"border-[var(--signature-canvas-border)] bg-[var(--signature-canvas-bg)]",
|
|
8933
|
+
{ hidden: !enabled }
|
|
8937
8934
|
),
|
|
8938
|
-
|
|
8939
|
-
children:
|
|
8935
|
+
style: { width: size.width, height: size.height },
|
|
8936
|
+
children: /* @__PURE__ */ jsx107(
|
|
8937
|
+
ReactSignatureCanvas,
|
|
8938
|
+
{
|
|
8939
|
+
ref: combinedRef,
|
|
8940
|
+
"data-testid": "canvas",
|
|
8941
|
+
options: SIGNATURE_PROPS,
|
|
8942
|
+
canvasProps: {
|
|
8943
|
+
style: { width: `${size.width}px`, height: `${size.height}px` }
|
|
8944
|
+
}
|
|
8945
|
+
}
|
|
8946
|
+
)
|
|
8947
|
+
}
|
|
8948
|
+
),
|
|
8949
|
+
/* @__PURE__ */ jsx107(
|
|
8950
|
+
"div",
|
|
8951
|
+
{
|
|
8952
|
+
className: cn("w-full text-right", {
|
|
8953
|
+
invisible: !enabled || !hasSignature
|
|
8954
|
+
}),
|
|
8955
|
+
style: { maxWidth: size.width },
|
|
8956
|
+
children: /* @__PURE__ */ jsx107(
|
|
8957
|
+
Button,
|
|
8958
|
+
{
|
|
8959
|
+
variant: "link",
|
|
8960
|
+
className: cn(
|
|
8961
|
+
"ml-auto mt-2 h-[30px] min-w-[70px] select-none rounded-sm px-2 py-0.5 text-right",
|
|
8962
|
+
"text-xs uppercase hover:opacity-[0.88] active:opacity-100"
|
|
8963
|
+
),
|
|
8964
|
+
onClick: onClear,
|
|
8965
|
+
children: t("clear")
|
|
8966
|
+
}
|
|
8967
|
+
)
|
|
8940
8968
|
}
|
|
8941
8969
|
)
|
|
8942
|
-
|
|
8943
|
-
|
|
8944
|
-
|
|
8970
|
+
]
|
|
8971
|
+
}
|
|
8972
|
+
);
|
|
8945
8973
|
}
|
|
8946
8974
|
);
|
|
8947
8975
|
SignatureCanvas.displayName = "SignatureCanvas";
|
|
@@ -9965,11 +9993,11 @@ function TimelineDescription({ className, asChild, ...props }) {
|
|
|
9965
9993
|
import { Toaster, toast as toast2 } from "sonner";
|
|
9966
9994
|
|
|
9967
9995
|
// src/toaster/useUpdateToast.ts
|
|
9968
|
-
import { useCallback as
|
|
9996
|
+
import { useCallback as useCallback26, useRef as useRef22 } from "react";
|
|
9969
9997
|
import { toast } from "sonner";
|
|
9970
9998
|
function useUpdateToast({ id }) {
|
|
9971
9999
|
const toastIdRef = useRef22("");
|
|
9972
|
-
const getToastOptions =
|
|
10000
|
+
const getToastOptions = useCallback26(
|
|
9973
10001
|
(options) => ({
|
|
9974
10002
|
id: toastIdRef.current,
|
|
9975
10003
|
dismissible: false,
|
|
@@ -10314,7 +10342,7 @@ function UploadedFilesList({
|
|
|
10314
10342
|
}
|
|
10315
10343
|
|
|
10316
10344
|
// src/vertical-tabs/VerticalTabs.tsx
|
|
10317
|
-
import { useState as
|
|
10345
|
+
import { useState as useState34 } from "react";
|
|
10318
10346
|
import { jsx as jsx133, jsxs as jsxs81 } from "react/jsx-runtime";
|
|
10319
10347
|
function getKey(index, key) {
|
|
10320
10348
|
return `${key || "step"}_${index}`;
|
|
@@ -10326,7 +10354,7 @@ function VerticalTabs({
|
|
|
10326
10354
|
className
|
|
10327
10355
|
}) {
|
|
10328
10356
|
const defaultValue = getKey(0, stepKey);
|
|
10329
|
-
const [value, setValue] =
|
|
10357
|
+
const [value, setValue] = useState34(defaultValue);
|
|
10330
10358
|
const hasImages = steps.every((step) => step.images?.length);
|
|
10331
10359
|
return /* @__PURE__ */ jsxs81(
|
|
10332
10360
|
"div",
|
|
@@ -10485,7 +10513,7 @@ function VideoModal({
|
|
|
10485
10513
|
}
|
|
10486
10514
|
|
|
10487
10515
|
// src/video-player/VideoPlayer.tsx
|
|
10488
|
-
import { useEffect as useEffect33, useRef as useRef24, useState as
|
|
10516
|
+
import { useEffect as useEffect33, useRef as useRef24, useState as useState35 } from "react";
|
|
10489
10517
|
import { useTranslation as useTranslation22 } from "react-i18next";
|
|
10490
10518
|
import {
|
|
10491
10519
|
Loader2 as Loader23,
|
|
@@ -10512,15 +10540,15 @@ function VideoPlayer({
|
|
|
10512
10540
|
const videoRef = useRef24(null);
|
|
10513
10541
|
const iframeRef = useRef24(null);
|
|
10514
10542
|
const containerRef = useRef24(null);
|
|
10515
|
-
const [isPlaying, setIsPlaying] =
|
|
10516
|
-
const [isMuted, setIsMuted] =
|
|
10517
|
-
const [currentTime, setCurrentTime] =
|
|
10518
|
-
const [duration, setDuration] =
|
|
10519
|
-
const [isFullScreenMode, setIsFullScreenMode] =
|
|
10520
|
-
const [isLoading, setIsLoading] =
|
|
10521
|
-
const [videoSource, setVideoSource] =
|
|
10522
|
-
const [youtubeEmbedUrl, setYoutubeEmbedUrl] =
|
|
10523
|
-
const [vimeoEmbedUrl, setVimeoEmbedUrl] =
|
|
10543
|
+
const [isPlaying, setIsPlaying] = useState35(false);
|
|
10544
|
+
const [isMuted, setIsMuted] = useState35(false);
|
|
10545
|
+
const [currentTime, setCurrentTime] = useState35(0);
|
|
10546
|
+
const [duration, setDuration] = useState35(0);
|
|
10547
|
+
const [isFullScreenMode, setIsFullScreenMode] = useState35(isFullScreen);
|
|
10548
|
+
const [isLoading, setIsLoading] = useState35(true);
|
|
10549
|
+
const [videoSource, setVideoSource] = useState35("file");
|
|
10550
|
+
const [youtubeEmbedUrl, setYoutubeEmbedUrl] = useState35("");
|
|
10551
|
+
const [vimeoEmbedUrl, setVimeoEmbedUrl] = useState35("");
|
|
10524
10552
|
useClickEscape({ enabled: isFullScreenMode, onClick: onClose });
|
|
10525
10553
|
useEffect33(() => {
|
|
10526
10554
|
const youtubeRegex = /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/;
|
|
@@ -10804,11 +10832,11 @@ function VideoPlayer({
|
|
|
10804
10832
|
import {
|
|
10805
10833
|
forwardRef as forwardRef54,
|
|
10806
10834
|
memo as memo7,
|
|
10807
|
-
useCallback as
|
|
10835
|
+
useCallback as useCallback28,
|
|
10808
10836
|
useImperativeHandle,
|
|
10809
10837
|
useMemo as useMemo7,
|
|
10810
10838
|
useRef as useRef25,
|
|
10811
|
-
useState as
|
|
10839
|
+
useState as useState36
|
|
10812
10840
|
} from "react";
|
|
10813
10841
|
import { isFirefox, isMobile as isMobile2 } from "react-device-detect";
|
|
10814
10842
|
import ReactWebcam from "react-webcam";
|
|
@@ -10863,7 +10891,7 @@ async function compressImage(image) {
|
|
|
10863
10891
|
}
|
|
10864
10892
|
|
|
10865
10893
|
// src/webcam/useErrorHandler.ts
|
|
10866
|
-
import { useCallback as
|
|
10894
|
+
import { useCallback as useCallback27 } from "react";
|
|
10867
10895
|
import { useTranslation as useTranslation23 } from "react-i18next";
|
|
10868
10896
|
import { isSafari as isSafari2 } from "react-device-detect";
|
|
10869
10897
|
|
|
@@ -11029,7 +11057,7 @@ var GET_USER_MEDIA_ERROR = "getUserMedia is not implemented in this browser";
|
|
|
11029
11057
|
function useErrorHandler({ onError }) {
|
|
11030
11058
|
const { t } = useTranslation23();
|
|
11031
11059
|
const handleError = useEvent(onError);
|
|
11032
|
-
const handleUserMediaError =
|
|
11060
|
+
const handleUserMediaError = useCallback27(
|
|
11033
11061
|
(error) => {
|
|
11034
11062
|
console.error(error);
|
|
11035
11063
|
let errorText = "";
|
|
@@ -11124,10 +11152,10 @@ var Webcam = memo7(
|
|
|
11124
11152
|
onError,
|
|
11125
11153
|
...props
|
|
11126
11154
|
}, ref) => {
|
|
11127
|
-
const [minScreenshotHeight, setMinScreenshotHeight] =
|
|
11128
|
-
const [minScreenshotWidth, setMinScreenshotWidth] =
|
|
11129
|
-
const [useReducedConstraints, setUseReducedConstraints] =
|
|
11130
|
-
const [numberOfCameras, setNumberOfCameras] =
|
|
11155
|
+
const [minScreenshotHeight, setMinScreenshotHeight] = useState36();
|
|
11156
|
+
const [minScreenshotWidth, setMinScreenshotWidth] = useState36();
|
|
11157
|
+
const [useReducedConstraints, setUseReducedConstraints] = useState36(false);
|
|
11158
|
+
const [numberOfCameras, setNumberOfCameras] = useState36(0);
|
|
11131
11159
|
const constraints = useMemo7(() => {
|
|
11132
11160
|
if (videoConstraints) {
|
|
11133
11161
|
return videoConstraints;
|
|
@@ -11159,7 +11187,7 @@ var Webcam = memo7(
|
|
|
11159
11187
|
onError(errorDetails);
|
|
11160
11188
|
}
|
|
11161
11189
|
});
|
|
11162
|
-
const handleUserMediaErrorWithFallback =
|
|
11190
|
+
const handleUserMediaErrorWithFallback = useCallback28(
|
|
11163
11191
|
(error) => {
|
|
11164
11192
|
if (error instanceof DOMException && error.name === "OverconstrainedError" && !useReducedConstraints && !videoConstraints) {
|
|
11165
11193
|
console.warn("Camera constraints failed, trying reduced constraints:", error);
|
|
@@ -11209,7 +11237,7 @@ var Webcam = memo7(
|
|
|
11209
11237
|
...webcamRef.current
|
|
11210
11238
|
})
|
|
11211
11239
|
);
|
|
11212
|
-
const handleUserMediaSuccess =
|
|
11240
|
+
const handleUserMediaSuccess = useCallback28(
|
|
11213
11241
|
(stream) => {
|
|
11214
11242
|
if (!isMobile2) {
|
|
11215
11243
|
const track = stream.getVideoTracks()[0];
|
|
@@ -11300,17 +11328,17 @@ Webcam.displayName = "Webcam";
|
|
|
11300
11328
|
|
|
11301
11329
|
// src/mobile-webcam/MobileWebcam.tsx
|
|
11302
11330
|
import { Camera, ChevronLeft as ChevronLeft4 } from "lucide-react";
|
|
11303
|
-
import { forwardRef as forwardRef55, useCallback as
|
|
11331
|
+
import { forwardRef as forwardRef55, useCallback as useCallback30 } from "react";
|
|
11304
11332
|
import { createPortal } from "react-dom";
|
|
11305
11333
|
import { useTranslation as useTranslation25 } from "react-i18next";
|
|
11306
11334
|
|
|
11307
11335
|
// src/mobile-webcam/DeviceCamera/DeviceCamera.tsx
|
|
11308
|
-
import { useCallback as
|
|
11336
|
+
import { useCallback as useCallback29 } from "react";
|
|
11309
11337
|
import { useTranslation as useTranslation24 } from "react-i18next";
|
|
11310
11338
|
import { jsx as jsx137, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
11311
11339
|
function DeviceCamera({ onChange, facingMode, className }) {
|
|
11312
11340
|
const { t } = useTranslation24();
|
|
11313
|
-
const handleNativeScreenshot =
|
|
11341
|
+
const handleNativeScreenshot = useCallback29(
|
|
11314
11342
|
(event) => {
|
|
11315
11343
|
const file = event.target.files?.[0];
|
|
11316
11344
|
onChange(file ? compressImage(file) : void 0);
|
|
@@ -11326,7 +11354,7 @@ function DeviceCamera({ onChange, facingMode, className }) {
|
|
|
11326
11354
|
),
|
|
11327
11355
|
children: [
|
|
11328
11356
|
/* @__PURE__ */ jsx137("div", { children: t("camera_errors.experiencing_camera_issues") }),
|
|
11329
|
-
/* @__PURE__ */ jsxs85("label", { className: "text-[16px] font-semibold uppercase leading-6
|
|
11357
|
+
/* @__PURE__ */ jsxs85("label", { className: "text-[16px] font-semibold uppercase leading-6", children: [
|
|
11330
11358
|
t("open_devices_camera"),
|
|
11331
11359
|
/* @__PURE__ */ jsx137(
|
|
11332
11360
|
"input",
|
|
@@ -11358,7 +11386,7 @@ var MobileWebcam = forwardRef55(
|
|
|
11358
11386
|
({ onScreenshot, onBack, title, text, disabled, className, ...props }, ref) => {
|
|
11359
11387
|
const rootElement = getDocument()?.body;
|
|
11360
11388
|
const { t } = useTranslation25();
|
|
11361
|
-
const handleNativeScreenshot =
|
|
11389
|
+
const handleNativeScreenshot = useCallback30(
|
|
11362
11390
|
(photo) => onScreenshot({ isNative: true, photo }),
|
|
11363
11391
|
[onScreenshot]
|
|
11364
11392
|
);
|
|
@@ -18056,7 +18084,7 @@ AirbnbPhoneField.displayName = "AirbnbPhoneField";
|
|
|
18056
18084
|
import * as React72 from "react";
|
|
18057
18085
|
import { ChevronDown as ChevronDown6, Search as Search3 } from "lucide-react";
|
|
18058
18086
|
import { useVirtualizer as useVirtualizer3 } from "@tanstack/react-virtual";
|
|
18059
|
-
import { useCallback as
|
|
18087
|
+
import { useCallback as useCallback50 } from "react";
|
|
18060
18088
|
import { jsx as jsx179, jsxs as jsxs119 } from "react/jsx-runtime";
|
|
18061
18089
|
var ROW_HEIGHT = 48;
|
|
18062
18090
|
var DESKTOP_LIST_HEIGHT = 280;
|
|
@@ -18135,7 +18163,7 @@ var AirbnbSearchableSelectInternal = ({
|
|
|
18135
18163
|
isDisabled: !open || isMobile3
|
|
18136
18164
|
});
|
|
18137
18165
|
const handleOnOpenChange = useEvent(onOpenChange);
|
|
18138
|
-
const setSelectOpen =
|
|
18166
|
+
const setSelectOpen = useCallback50(
|
|
18139
18167
|
(nextOpen, options2) => {
|
|
18140
18168
|
setOpen(nextOpen);
|
|
18141
18169
|
handleOnOpenChange?.(nextOpen);
|