@avenue-ticketing/ui 0.5.0 → 0.7.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/react/checkbox.js +2 -4
- package/dist/react/checkbox.js.map +1 -1
- package/dist/react/dropdown.d.ts +8 -0
- package/dist/react/dropdown.js +121 -68
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/table-view/column-menu.js +65 -28
- package/dist/react/table-view/column-menu.js.map +1 -1
- package/dist/react/table-view/index.js +67 -32
- package/dist/react/table-view/index.js.map +1 -1
- package/package.json +6 -1
package/dist/react/checkbox.js
CHANGED
|
@@ -66,9 +66,7 @@ var Checkbox = React.forwardRef(
|
|
|
66
66
|
...rest
|
|
67
67
|
}, ref) => {
|
|
68
68
|
const isControlled = checkedProp !== void 0;
|
|
69
|
-
const [uncontrolledChecked, setUncontrolledChecked] = useState(
|
|
70
|
-
defaultChecked
|
|
71
|
-
);
|
|
69
|
+
const [uncontrolledChecked, setUncontrolledChecked] = useState(defaultChecked);
|
|
72
70
|
const checked = isControlled ? checkedProp : uncontrolledChecked;
|
|
73
71
|
const ariaChecked = indeterminate ? "mixed" : checked ? true : false;
|
|
74
72
|
return /* @__PURE__ */ jsx(
|
|
@@ -109,7 +107,7 @@ var Checkbox = React.forwardRef(
|
|
|
109
107
|
className: cn(
|
|
110
108
|
"flex size-5 shrink-0 items-center justify-center rounded-[4px] border",
|
|
111
109
|
!disabled && (indeterminate ? "border-primary bg-primary text-background" : checked ? "border-primary bg-primary text-background" : "border-primary/20 bg-background"),
|
|
112
|
-
disabled && (indeterminate ? "border-
|
|
110
|
+
disabled && (indeterminate ? "border-transparent bg-primary/45 text-primary-foreground" : checked ? "border-transparent bg-primary/45 text-primary-foreground" : "border-primary/10 bg-muted/25")
|
|
113
111
|
),
|
|
114
112
|
children: indeterminate ? /* @__PURE__ */ jsx(
|
|
115
113
|
"span",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/checkbox.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,IAAM,sBAAA,GAAyB,EAAA;AAC/B,IAAM,qBAAA,GAAwB,GAAA;AAE9B,SAAS,yBAAA,GAA4B;AACnC,EAAA,MAAM,OAAA,GAAU,OAA2B,IAAI,CAAA;AAE/C,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,mBAAmB,UAAA,EAAY;AACxD,IAAA,MAAM,GAAA,GAAM,KAAK,cAAA,EAAe;AAChC,IAAA,IAAI,OAAO,CAAA,EAAG;AAEd,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,CAAA,EAAG,GAAG,CAAA,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,CAAA,EAAG,GAAG,CAAA,CAAA;AAEpC,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACtC,MAAA,IAAA,CAAK,MAAM,gBAAA,GAAmB,GAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA;AAAA,MAChB,CAAC,EAAE,gBAAA,EAAkB,GAAA,IAAO,EAAE,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACnD;AAAA,QACE,QAAA,EAAU,qBAAA;AAAA,QACV,KAAA,EAAO,sBAAA;AAAA,QACP,MAAA,EAAQ,+BAAA;AAAA,QACR,IAAA,EAAM;AAAA;AACR,KACF;AACA,IAAA,OAAO,MAAM,KAAK,MAAA,EAAO;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,kCAAA;AAAA,MACV,OAAA,EAAQ,WAAA;AAAA,MACR,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,MAAA,EAAO,gBAAA;AAAA,UACP,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ;AAaA,IAAM,QAAA,GAAiB,KAAA,CAAA,UAAA;AAAA,EACrB,CACE;AAAA,IACE,OAAA,EAAS,WAAA;AAAA,IACT,cAAA,GAAiB,KAAA;AAAA,IACjB,eAAA;AAAA,IACA,aAAA,GAAgB,KAAA;AAAA,IAChB,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,eAAe,WAAA,KAAgB,MAAA;AACrC,IAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/checkbox.tsx"],"names":[],"mappings":"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","file":"checkbox.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\nfunction CheckboxAnimatedCheckMark() {\n const lineRef = useRef<SVGPolylineElement>(null);\n\n useLayoutEffect(() => {\n const poly = lineRef.current;\n if (!poly || typeof poly.getTotalLength !== \"function\") return;\n const len = poly.getTotalLength();\n if (len <= 0) return;\n\n poly.style.strokeDasharray = `${len}`;\n poly.style.strokeDashoffset = `${len}`;\n\n if (typeof poly.animate !== \"function\") {\n poly.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = poly.animate(\n [{ strokeDashoffset: len }, { strokeDashoffset: 0 }],\n {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n },\n );\n return () => anim.cancel();\n }, []);\n\n return (\n <svg\n className=\"size-4 shrink-0 overflow-visible\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <polyline\n ref={lineRef}\n points=\"4 12 9 17 20 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<\n React.ComponentProps<\"button\">,\n \"type\" | \"role\" | \"aria-checked\" | \"children\"\n> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (next: boolean) => void;\n // tri-state: same frame as checked; center shows a visible “blank” (inner surface)\n indeterminate?: boolean;\n};\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n indeterminate = false,\n disabled = false,\n className,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const isControlled = checkedProp !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] =\n useState(defaultChecked);\n const checked = isControlled ? checkedProp : uncontrolledChecked;\n const ariaChecked: boolean | \"mixed\" = indeterminate\n ? \"mixed\"\n : checked\n ? true\n : false;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"checkbox\"\n data-slot=\"checkbox\"\n data-state={\n indeterminate ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"\n }\n disabled={disabled}\n aria-checked={ariaChecked}\n className={cn(\n \"ring-offset-background focus-visible:ring-primary/40 inline-flex shrink-0 items-center justify-center rounded-md border border-transparent p-0 outline-none select-none\",\n \"focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (disabled) return;\n if (isControlled) {\n onCheckedChange?.(!checked);\n return;\n }\n setUncontrolledChecked((prev) => {\n const next = !prev;\n onCheckedChange?.(next);\n return next;\n });\n }}\n {...rest}\n >\n <span className=\"pointer-events-none\">\n <span\n aria-hidden\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-[4px] border\",\n !disabled &&\n (indeterminate\n ? \"border-primary bg-primary text-background\"\n : checked\n ? \"border-primary bg-primary text-background\"\n : \"border-primary/20 bg-background\"),\n disabled &&\n (indeterminate\n ? \"border-transparent bg-primary/45 text-primary-foreground\"\n : checked\n ? \"border-transparent bg-primary/45 text-primary-foreground\"\n : \"border-primary/10 bg-muted/25\"),\n )}\n >\n {indeterminate ? (\n <span\n className=\"size-2.5 shrink-0 rounded-[2px] border border-primary/20 bg-background\"\n aria-hidden\n />\n ) : checked ? (\n <CheckboxAnimatedCheckMark />\n ) : null}\n </span>\n </span>\n </button>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n"]}
|
package/dist/react/dropdown.d.ts
CHANGED
|
@@ -105,8 +105,16 @@ interface DropdownRadioItemProps extends Omit<DropdownItemProps, "icon"> {
|
|
|
105
105
|
value: string;
|
|
106
106
|
}
|
|
107
107
|
declare const DropdownRadioItem: React__default.FC<DropdownRadioItemProps>;
|
|
108
|
+
/**
|
|
109
|
+
* `openOnHover` (default `true`) controls whether moving a mouse onto the
|
|
110
|
+
* `DropdownSubTrigger` (or off the `DropdownSubContent`) opens / closes the
|
|
111
|
+
* sub. Set to `false` for menus rendered inside a scrollable container, where
|
|
112
|
+
* rows passing under a stationary cursor would otherwise toggle the sub on
|
|
113
|
+
* every scroll tick. Click, Enter, ArrowRight always open regardless.
|
|
114
|
+
*/
|
|
108
115
|
declare const DropdownSub: React__default.FC<{
|
|
109
116
|
children: React__default.ReactNode;
|
|
117
|
+
openOnHover?: boolean;
|
|
110
118
|
}>;
|
|
111
119
|
declare const DropdownSubTrigger: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
112
120
|
icon?: React__default.ReactNode;
|
package/dist/react/dropdown.js
CHANGED
|
@@ -124,9 +124,7 @@ var Checkbox = React3.forwardRef(
|
|
|
124
124
|
...rest
|
|
125
125
|
}, ref) => {
|
|
126
126
|
const isControlled = checkedProp !== void 0;
|
|
127
|
-
const [uncontrolledChecked, setUncontrolledChecked] = useState(
|
|
128
|
-
defaultChecked
|
|
129
|
-
);
|
|
127
|
+
const [uncontrolledChecked, setUncontrolledChecked] = useState(defaultChecked);
|
|
130
128
|
const checked = isControlled ? checkedProp : uncontrolledChecked;
|
|
131
129
|
const ariaChecked = indeterminate ? "mixed" : checked ? true : false;
|
|
132
130
|
return /* @__PURE__ */ jsx(
|
|
@@ -167,7 +165,7 @@ var Checkbox = React3.forwardRef(
|
|
|
167
165
|
className: cn(
|
|
168
166
|
"flex size-5 shrink-0 items-center justify-center rounded-[4px] border",
|
|
169
167
|
!disabled && (indeterminate ? "border-primary bg-primary text-background" : checked ? "border-primary bg-primary text-background" : "border-primary/20 bg-background"),
|
|
170
|
-
disabled && (indeterminate ? "border-
|
|
168
|
+
disabled && (indeterminate ? "border-transparent bg-primary/45 text-primary-foreground" : checked ? "border-transparent bg-primary/45 text-primary-foreground" : "border-primary/10 bg-muted/25")
|
|
171
169
|
),
|
|
172
170
|
children: indeterminate ? /* @__PURE__ */ jsx(
|
|
173
171
|
"span",
|
|
@@ -200,6 +198,22 @@ function resolveDropdownMobileSheet(mobileOptions) {
|
|
|
200
198
|
};
|
|
201
199
|
}
|
|
202
200
|
var DROPDOWN_SUB_CONTENT_ATTR = "data-dropdown-sub-content";
|
|
201
|
+
var DROPDOWN_PANEL_SHADOW = "shadow-[0_12px_32px_-8px_rgba(0,0,0,0.18),0_2px_6px_-2px_rgba(0,0,0,0.06)] dark:shadow-[0_12px_32px_-8px_rgba(0,0,0,0.55),0_2px_6px_-2px_rgba(0,0,0,0.35)]";
|
|
202
|
+
var DROPDOWN_PANEL_SCROLL = "[&_*]:[scrollbar-width:none] [&_*::-webkit-scrollbar]:hidden [&_*]:overscroll-contain";
|
|
203
|
+
function preventMenuWheelChain(menu, e) {
|
|
204
|
+
let el = e.target;
|
|
205
|
+
while (el && menu.contains(el)) {
|
|
206
|
+
const oy = getComputedStyle(el).overflowY;
|
|
207
|
+
if ((oy === "auto" || oy === "scroll") && el.scrollHeight > el.clientHeight) {
|
|
208
|
+
const atTop = el.scrollTop <= 0;
|
|
209
|
+
const atBottom = el.scrollTop + el.clientHeight >= el.scrollHeight;
|
|
210
|
+
if (e.deltaY < 0 && !atTop || e.deltaY > 0 && !atBottom) return;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
el = el.parentElement;
|
|
214
|
+
}
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
}
|
|
203
217
|
var DROPDOWN_SHEET_MENU_TEXT = "max-[1024px]:text-base";
|
|
204
218
|
var DROPDOWN_SHEET_MENU_SHORTCUT = "max-[1024px]:text-sm";
|
|
205
219
|
var DROPDOWN_SHEET_MENU_LABEL_TEXT = "max-[1024px]:text-sm";
|
|
@@ -290,10 +304,12 @@ function computePos(trigger, menu, side, align, offset, pad) {
|
|
|
290
304
|
return { top, left, side: effectiveSide };
|
|
291
305
|
}
|
|
292
306
|
function useIsMobile(breakpoint = 1025) {
|
|
293
|
-
const [isMobile, setIsMobile] = useState(
|
|
307
|
+
const [isMobile, setIsMobile] = useState(() => {
|
|
308
|
+
if (typeof window === "undefined") return false;
|
|
309
|
+
return window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;
|
|
310
|
+
});
|
|
294
311
|
useEffect(() => {
|
|
295
312
|
const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);
|
|
296
|
-
setIsMobile(mq.matches);
|
|
297
313
|
const handler = (e) => setIsMobile(e.matches);
|
|
298
314
|
mq.addEventListener("change", handler);
|
|
299
315
|
return () => mq.removeEventListener("change", handler);
|
|
@@ -452,6 +468,7 @@ function DropdownMobileBottomSheetPortal({
|
|
|
452
468
|
onRequestClose,
|
|
453
469
|
menuRef,
|
|
454
470
|
portalZClassName = "z-50",
|
|
471
|
+
isSubPortal = false,
|
|
455
472
|
children,
|
|
456
473
|
className,
|
|
457
474
|
style,
|
|
@@ -463,6 +480,7 @@ function DropdownMobileBottomSheetPortal({
|
|
|
463
480
|
/* @__PURE__ */ jsxs(
|
|
464
481
|
"div",
|
|
465
482
|
{
|
|
483
|
+
...isSubPortal ? { [DROPDOWN_SUB_CONTENT_ATTR]: "" } : {},
|
|
466
484
|
className: cn(
|
|
467
485
|
"fixed inset-0 flex items-end justify-center p-0",
|
|
468
486
|
portalZClassName
|
|
@@ -489,8 +507,9 @@ function DropdownMobileBottomSheetPortal({
|
|
|
489
507
|
...panelProps,
|
|
490
508
|
ref: menuRef,
|
|
491
509
|
className: cn(
|
|
492
|
-
"bg-background border-primary/
|
|
510
|
+
"bg-background border-primary/8 relative z-10 flex w-full max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] flex-col overflow-hidden shadow-2xl outline-none",
|
|
493
511
|
"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t",
|
|
512
|
+
DROPDOWN_PANEL_SCROLL,
|
|
494
513
|
sheetExtraClassName,
|
|
495
514
|
className
|
|
496
515
|
),
|
|
@@ -567,25 +586,25 @@ var DropdownContent = ({
|
|
|
567
586
|
const [pos, setPos] = useState({ top: -9999, left: -9999, side });
|
|
568
587
|
const [triggerW, setTriggerW] = useState(0);
|
|
569
588
|
const menuRef = useRef(null);
|
|
570
|
-
const resolvedMobile =
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
);
|
|
574
|
-
const slideOffsetPx = useMemo(
|
|
575
|
-
() => slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,
|
|
576
|
-
[slideEntranceOffsetPxProp]
|
|
577
|
-
);
|
|
578
|
-
const closeDuration = isMobile && resolvedMobile.sheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
|
|
579
|
-
const closeMenu = useCallback(() => setOpen(false), [setOpen]);
|
|
589
|
+
const resolvedMobile = resolveDropdownMobileSheet(mobileOptions);
|
|
590
|
+
const isMobileSheet = isMobile && resolvedMobile.sheet;
|
|
591
|
+
const slideOffsetPx = slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX;
|
|
580
592
|
useEffect(() => {
|
|
581
593
|
if (open) {
|
|
582
594
|
setShouldRender(true);
|
|
583
|
-
|
|
584
|
-
setIsAnimating(false);
|
|
585
|
-
const timer = setTimeout(() => setShouldRender(false), closeDuration);
|
|
586
|
-
return () => clearTimeout(timer);
|
|
595
|
+
return;
|
|
587
596
|
}
|
|
588
|
-
|
|
597
|
+
if (!isMobileSheet) {
|
|
598
|
+
setShouldRender(false);
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
setIsAnimating(false);
|
|
602
|
+
const t = setTimeout(
|
|
603
|
+
() => setShouldRender(false),
|
|
604
|
+
DROPDOWN_MOBILE_SHEET_MOTION_MS
|
|
605
|
+
);
|
|
606
|
+
return () => clearTimeout(t);
|
|
607
|
+
}, [open, isMobileSheet]);
|
|
589
608
|
useEffect(() => {
|
|
590
609
|
if (!shouldRender || !open) return;
|
|
591
610
|
let raf2 = 0;
|
|
@@ -615,12 +634,27 @@ var DropdownContent = ({
|
|
|
615
634
|
};
|
|
616
635
|
update();
|
|
617
636
|
window.addEventListener("resize", update);
|
|
618
|
-
window.addEventListener("scroll", update, true);
|
|
619
637
|
return () => {
|
|
620
638
|
window.removeEventListener("resize", update);
|
|
621
|
-
window.removeEventListener("scroll", update, true);
|
|
622
639
|
};
|
|
623
640
|
}, [shouldRender, side, align, offset, viewportPadding]);
|
|
641
|
+
useEffect(() => {
|
|
642
|
+
if (!open || isMobileSheet) return;
|
|
643
|
+
const isInsideMenu = (t) => t instanceof Node && (!!menuRef.current?.contains(t) || !!triggerRef.current?.contains(t) || t instanceof Element && !!t.closest(`[${DROPDOWN_SUB_CONTENT_ATTR}]`));
|
|
644
|
+
const onScroll = (e) => {
|
|
645
|
+
if (!isInsideMenu(e.target)) setOpen(false);
|
|
646
|
+
};
|
|
647
|
+
window.addEventListener("scroll", onScroll, true);
|
|
648
|
+
return () => window.removeEventListener("scroll", onScroll, true);
|
|
649
|
+
}, [open, isMobileSheet, setOpen, triggerRef]);
|
|
650
|
+
useEffect(() => {
|
|
651
|
+
if (!shouldRender || isMobileSheet) return;
|
|
652
|
+
const menu = menuRef.current;
|
|
653
|
+
if (!menu) return;
|
|
654
|
+
const onWheel = (e) => preventMenuWheelChain(menu, e);
|
|
655
|
+
menu.addEventListener("wheel", onWheel, { passive: false });
|
|
656
|
+
return () => menu.removeEventListener("wheel", onWheel);
|
|
657
|
+
}, [shouldRender, isMobileSheet]);
|
|
624
658
|
useEffect(() => {
|
|
625
659
|
if (isAnimating && menuRef.current) {
|
|
626
660
|
menuRef.current.focus();
|
|
@@ -686,15 +720,14 @@ var DropdownContent = ({
|
|
|
686
720
|
return () => window.removeEventListener("keydown", handler);
|
|
687
721
|
}, [open, closeOnEscape, loop, setOpen, triggerRef]);
|
|
688
722
|
useEffect(() => {
|
|
689
|
-
if (open
|
|
690
|
-
|
|
691
|
-
}
|
|
723
|
+
if (!open || !isMobileSheet) return;
|
|
724
|
+
document.body.style.overflow = "hidden";
|
|
692
725
|
return () => {
|
|
693
726
|
document.body.style.overflow = "";
|
|
694
727
|
};
|
|
695
|
-
}, [open,
|
|
728
|
+
}, [open, isMobileSheet]);
|
|
696
729
|
if (!shouldRender || typeof document === "undefined") return null;
|
|
697
|
-
if (
|
|
730
|
+
if (isMobileSheet) {
|
|
698
731
|
return /* @__PURE__ */ jsx(
|
|
699
732
|
DropdownMobileBottomSheetPortal,
|
|
700
733
|
{
|
|
@@ -706,7 +739,7 @@ var DropdownContent = ({
|
|
|
706
739
|
sheetTitle: resolvedMobile.title,
|
|
707
740
|
sheetExtraClassName: resolvedMobile.sheetExtraClassName,
|
|
708
741
|
contentClassName: resolvedMobile.contentClassName,
|
|
709
|
-
onRequestClose:
|
|
742
|
+
onRequestClose: () => setOpen(false),
|
|
710
743
|
menuRef,
|
|
711
744
|
portalZClassName: "z-50",
|
|
712
745
|
className,
|
|
@@ -729,7 +762,9 @@ var DropdownContent = ({
|
|
|
729
762
|
"aria-orientation": "vertical",
|
|
730
763
|
tabIndex: -1,
|
|
731
764
|
className: cn(
|
|
732
|
-
"bg-background border-primary/
|
|
765
|
+
"bg-background border-primary/8 absolute z-50 overflow-hidden rounded-xl border py-1.5 outline-none",
|
|
766
|
+
DROPDOWN_PANEL_SHADOW,
|
|
767
|
+
DROPDOWN_PANEL_SCROLL,
|
|
733
768
|
className
|
|
734
769
|
),
|
|
735
770
|
style: {
|
|
@@ -805,7 +840,7 @@ var DropdownItem = ({
|
|
|
805
840
|
),
|
|
806
841
|
children: [
|
|
807
842
|
icon && /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
|
|
808
|
-
/* @__PURE__ */ jsx("span", { className: "flex-1", children }),
|
|
843
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
|
|
809
844
|
shortcut ? /* @__PURE__ */ jsx(
|
|
810
845
|
"span",
|
|
811
846
|
{
|
|
@@ -1002,21 +1037,19 @@ var DropdownRadioItem = ({
|
|
|
1002
1037
|
}
|
|
1003
1038
|
);
|
|
1004
1039
|
};
|
|
1005
|
-
var DropdownSub = ({
|
|
1006
|
-
children
|
|
1007
|
-
}) => {
|
|
1040
|
+
var DropdownSub = ({ children, openOnHover = true }) => {
|
|
1008
1041
|
const [open, setOpen] = useState(false);
|
|
1009
1042
|
const triggerRef = useRef(null);
|
|
1010
1043
|
const subCtx = useMemo(
|
|
1011
|
-
() => ({ open, setOpen, triggerRef }),
|
|
1012
|
-
[open, setOpen]
|
|
1044
|
+
() => ({ open, setOpen, triggerRef, openOnHover }),
|
|
1045
|
+
[open, setOpen, openOnHover]
|
|
1013
1046
|
);
|
|
1014
1047
|
return /* @__PURE__ */ jsx(SubContext.Provider, { value: subCtx, children });
|
|
1015
1048
|
};
|
|
1016
1049
|
var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className, ...props }) => {
|
|
1017
1050
|
const sub = React3__default.useContext(SubContext);
|
|
1018
1051
|
if (!sub) throw new Error("DropdownSubTrigger must be inside DropdownSub");
|
|
1019
|
-
const { open, setOpen, triggerRef } = sub;
|
|
1052
|
+
const { open, setOpen, triggerRef, openOnHover } = sub;
|
|
1020
1053
|
const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);
|
|
1021
1054
|
return /* @__PURE__ */ jsxs(
|
|
1022
1055
|
"div",
|
|
@@ -1031,11 +1064,11 @@ var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className,
|
|
|
1031
1064
|
tabIndex: disabled ? void 0 : -1,
|
|
1032
1065
|
"aria-disabled": disabled,
|
|
1033
1066
|
onMouseEnter: () => {
|
|
1034
|
-
if (disabled || isMobile) return;
|
|
1067
|
+
if (disabled || isMobile || !openOnHover) return;
|
|
1035
1068
|
setOpen(true);
|
|
1036
1069
|
},
|
|
1037
1070
|
onMouseLeave: () => {
|
|
1038
|
-
if (isMobile) return;
|
|
1071
|
+
if (isMobile || !openOnHover) return;
|
|
1039
1072
|
setOpen(false);
|
|
1040
1073
|
},
|
|
1041
1074
|
onKeyDown: (e) => {
|
|
@@ -1059,8 +1092,8 @@ var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className,
|
|
|
1059
1092
|
),
|
|
1060
1093
|
children: [
|
|
1061
1094
|
icon && /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
|
|
1062
|
-
/* @__PURE__ */ jsx("span", { className: "flex-1", children }),
|
|
1063
|
-
/* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto size-4 opacity-50" })
|
|
1095
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
|
|
1096
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto size-4 shrink-0 opacity-50" })
|
|
1064
1097
|
]
|
|
1065
1098
|
}
|
|
1066
1099
|
);
|
|
@@ -1079,16 +1112,11 @@ var DropdownSubContent = ({
|
|
|
1079
1112
|
}) => {
|
|
1080
1113
|
const sub = React3__default.useContext(SubContext);
|
|
1081
1114
|
if (!sub) throw new Error("DropdownSubContent must be inside DropdownSub");
|
|
1082
|
-
const { open, setOpen, triggerRef } = sub;
|
|
1115
|
+
const { open, setOpen, triggerRef, openOnHover } = sub;
|
|
1083
1116
|
const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);
|
|
1084
|
-
const
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
);
|
|
1088
|
-
const resolvedMobile = useMemo(
|
|
1089
|
-
() => resolveDropdownMobileSheet(mobileOptions),
|
|
1090
|
-
[mobileOptions]
|
|
1091
|
-
);
|
|
1117
|
+
const resolvedMobile = resolveDropdownMobileSheet(mobileOptions);
|
|
1118
|
+
const isMobileSheet = isMobile && resolvedMobile.sheet;
|
|
1119
|
+
const slideOffsetPx = slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX;
|
|
1092
1120
|
const [shouldRender, setShouldRender] = useState(false);
|
|
1093
1121
|
const [isAnimating, setIsAnimating] = useState(false);
|
|
1094
1122
|
const [pos, setPos] = useState({
|
|
@@ -1097,17 +1125,22 @@ var DropdownSubContent = ({
|
|
|
1097
1125
|
side: "right"
|
|
1098
1126
|
});
|
|
1099
1127
|
const menuRef = useRef(null);
|
|
1100
|
-
const closeDuration = isMobile && resolvedMobile.sheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
|
|
1101
|
-
const closeSub = useCallback(() => setOpen(false), [setOpen]);
|
|
1102
1128
|
useEffect(() => {
|
|
1103
1129
|
if (open) {
|
|
1104
1130
|
setShouldRender(true);
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1131
|
+
return;
|
|
1132
|
+
}
|
|
1133
|
+
if (!isMobileSheet) {
|
|
1134
|
+
setShouldRender(false);
|
|
1135
|
+
return;
|
|
1109
1136
|
}
|
|
1110
|
-
|
|
1137
|
+
setIsAnimating(false);
|
|
1138
|
+
const t = setTimeout(
|
|
1139
|
+
() => setShouldRender(false),
|
|
1140
|
+
DROPDOWN_MOBILE_SHEET_MOTION_MS
|
|
1141
|
+
);
|
|
1142
|
+
return () => clearTimeout(t);
|
|
1143
|
+
}, [open, isMobileSheet]);
|
|
1111
1144
|
useEffect(() => {
|
|
1112
1145
|
if (!shouldRender || !open) return;
|
|
1113
1146
|
let raf2 = 0;
|
|
@@ -1120,8 +1153,8 @@ var DropdownSubContent = ({
|
|
|
1120
1153
|
};
|
|
1121
1154
|
}, [shouldRender, open]);
|
|
1122
1155
|
useLayoutEffect(() => {
|
|
1123
|
-
if (!shouldRender ||
|
|
1124
|
-
if (
|
|
1156
|
+
if (!shouldRender || isMobileSheet) return;
|
|
1157
|
+
if (!triggerRef.current || !menuRef.current) return;
|
|
1125
1158
|
const update = () => {
|
|
1126
1159
|
if (!triggerRef.current || !menuRef.current) return;
|
|
1127
1160
|
setPos(
|
|
@@ -1137,12 +1170,29 @@ var DropdownSubContent = ({
|
|
|
1137
1170
|
};
|
|
1138
1171
|
update();
|
|
1139
1172
|
window.addEventListener("resize", update);
|
|
1140
|
-
window.addEventListener("scroll", update, true);
|
|
1141
1173
|
return () => {
|
|
1142
1174
|
window.removeEventListener("resize", update);
|
|
1143
|
-
window.removeEventListener("scroll", update, true);
|
|
1144
1175
|
};
|
|
1145
|
-
}, [shouldRender, viewportPadding,
|
|
1176
|
+
}, [shouldRender, viewportPadding, isMobileSheet]);
|
|
1177
|
+
useEffect(() => {
|
|
1178
|
+
if (!open || isMobileSheet) return;
|
|
1179
|
+
const onScroll = (e) => {
|
|
1180
|
+
const t = e.target;
|
|
1181
|
+
if (!(t instanceof Node) || menuRef.current?.contains(t)) return;
|
|
1182
|
+
const trigger = triggerRef.current;
|
|
1183
|
+
if (trigger && (t === trigger || t.contains(trigger))) setOpen(false);
|
|
1184
|
+
};
|
|
1185
|
+
window.addEventListener("scroll", onScroll, true);
|
|
1186
|
+
return () => window.removeEventListener("scroll", onScroll, true);
|
|
1187
|
+
}, [open, isMobileSheet, setOpen, triggerRef]);
|
|
1188
|
+
useEffect(() => {
|
|
1189
|
+
if (!shouldRender || isMobileSheet) return;
|
|
1190
|
+
const menu = menuRef.current;
|
|
1191
|
+
if (!menu) return;
|
|
1192
|
+
const onWheel = (e) => preventMenuWheelChain(menu, e);
|
|
1193
|
+
menu.addEventListener("wheel", onWheel, { passive: false });
|
|
1194
|
+
return () => menu.removeEventListener("wheel", onWheel);
|
|
1195
|
+
}, [shouldRender, isMobileSheet]);
|
|
1146
1196
|
useEffect(() => {
|
|
1147
1197
|
if (isAnimating && menuRef.current) {
|
|
1148
1198
|
menuRef.current.focus();
|
|
@@ -1203,7 +1253,7 @@ var DropdownSubContent = ({
|
|
|
1203
1253
|
[onKeyDownProp, setOpen, triggerRef]
|
|
1204
1254
|
);
|
|
1205
1255
|
if (!shouldRender || typeof document === "undefined") return null;
|
|
1206
|
-
if (
|
|
1256
|
+
if (isMobileSheet) {
|
|
1207
1257
|
return /* @__PURE__ */ jsx(
|
|
1208
1258
|
DropdownMobileBottomSheetPortal,
|
|
1209
1259
|
{
|
|
@@ -1215,9 +1265,10 @@ var DropdownSubContent = ({
|
|
|
1215
1265
|
sheetTitle: resolvedMobile.title,
|
|
1216
1266
|
sheetExtraClassName: resolvedMobile.sheetExtraClassName,
|
|
1217
1267
|
contentClassName: resolvedMobile.contentClassName,
|
|
1218
|
-
onRequestClose:
|
|
1268
|
+
onRequestClose: () => setOpen(false),
|
|
1219
1269
|
menuRef,
|
|
1220
1270
|
portalZClassName: "z-[70]",
|
|
1271
|
+
isSubPortal: true,
|
|
1221
1272
|
className,
|
|
1222
1273
|
style,
|
|
1223
1274
|
role: "menu",
|
|
@@ -1236,12 +1287,14 @@ var DropdownSubContent = ({
|
|
|
1236
1287
|
ref: menuRef,
|
|
1237
1288
|
role: "menu",
|
|
1238
1289
|
tabIndex: -1,
|
|
1239
|
-
onMouseEnter: () => setOpen(true),
|
|
1240
|
-
onMouseLeave: () => setOpen(false),
|
|
1290
|
+
onMouseEnter: openOnHover ? () => setOpen(true) : void 0,
|
|
1291
|
+
onMouseLeave: openOnHover ? () => setOpen(false) : void 0,
|
|
1241
1292
|
onKeyDown: handleSubMenuKeyDown,
|
|
1242
1293
|
"data-dropdown-sub-content": "",
|
|
1243
1294
|
className: cn(
|
|
1244
|
-
"bg-background border-primary/
|
|
1295
|
+
"bg-background border-primary/8 absolute z-60 overflow-hidden rounded-xl border py-1.5 outline-none",
|
|
1296
|
+
DROPDOWN_PANEL_SHADOW,
|
|
1297
|
+
DROPDOWN_PANEL_SCROLL,
|
|
1245
1298
|
className
|
|
1246
1299
|
),
|
|
1247
1300
|
style: {
|