@avenue-ticketing/ui 0.4.0 → 0.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/react/avatar.d.ts +42 -0
- package/dist/react/avatar.js +159 -0
- package/dist/react/avatar.js.map +1 -0
- package/dist/react/badge.d.ts +12 -0
- package/dist/react/badge.js +35 -1
- package/dist/react/badge.js.map +1 -1
- package/dist/react/button.d.ts +1 -1
- package/dist/react/button.js +3 -3
- package/dist/react/button.js.map +1 -1
- package/dist/react/calendar.d.ts +13 -0
- package/dist/react/calendar.js +4639 -0
- package/dist/react/calendar.js.map +1 -0
- package/dist/react/card.d.ts +11 -0
- package/dist/react/card.js +113 -0
- package/dist/react/card.js.map +1 -0
- package/dist/react/checkbox.d.ts +11 -0
- package/dist/react/checkbox.js +131 -0
- package/dist/react/checkbox.js.map +1 -0
- package/dist/react/datetime-picker.d.ts +21 -0
- package/dist/react/datetime-picker.js +6124 -0
- package/dist/react/datetime-picker.js.map +1 -0
- package/dist/react/dialog.js +1 -1
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/dropdown.d.ts +26 -9
- package/dist/react/dropdown.js +194 -96
- package/dist/react/dropdown.js.map +1 -1
- package/dist/react/input.d.ts +7 -0
- package/dist/react/input.js +15 -2
- package/dist/react/input.js.map +1 -1
- package/dist/react/pagination.d.ts +28 -0
- package/dist/react/pagination.js +262 -0
- package/dist/react/pagination.js.map +1 -0
- package/dist/react/popover.d.ts +76 -0
- package/dist/react/popover.js +564 -0
- package/dist/react/popover.js.map +1 -0
- package/dist/react/scroll-header.js +13 -1
- package/dist/react/scroll-header.js.map +1 -1
- package/dist/react/scroll-wheel.d.ts +45 -0
- package/dist/react/scroll-wheel.js +557 -0
- package/dist/react/scroll-wheel.js.map +1 -0
- package/dist/react/select.d.ts +62 -0
- package/dist/react/select.js +889 -0
- package/dist/react/select.js.map +1 -0
- package/dist/react/sheet.js +1 -1
- package/dist/react/sheet.js.map +1 -1
- package/dist/react/switch.d.ts +38 -0
- package/dist/react/switch.js +117 -0
- package/dist/react/switch.js.map +1 -0
- package/dist/react/table-pagination.d.ts +15 -0
- package/dist/react/table-pagination.js +1153 -0
- package/dist/react/table-pagination.js.map +1 -0
- package/dist/react/table-view/column-menu.d.ts +15 -0
- package/dist/react/table-view/column-menu.js +918 -0
- package/dist/react/table-view/column-menu.js.map +1 -0
- package/dist/react/table-view/index.d.ts +70 -0
- package/dist/react/table-view/index.js +2155 -0
- package/dist/react/table-view/index.js.map +1 -0
- package/dist/react/table.d.ts +86 -0
- package/dist/react/table.js +414 -0
- package/dist/react/table.js.map +1 -0
- package/dist/react/tabs.d.ts +9 -3
- package/dist/react/tabs.js +204 -48
- package/dist/react/tabs.js.map +1 -1
- package/dist/react/textarea.d.ts +6 -0
- package/dist/react/textarea.js +33 -0
- package/dist/react/textarea.js.map +1 -0
- package/dist/react/time-picker.d.ts +22 -0
- package/dist/react/time-picker.js +856 -0
- package/dist/react/time-picker.js.map +1 -0
- package/dist/react/tooltip.d.ts +45 -0
- package/dist/react/tooltip.js +540 -0
- package/dist/react/tooltip.js.map +1 -0
- package/package.json +1 -1
package/dist/react/dropdown.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import
|
|
1
|
+
import * as React3 from 'react';
|
|
2
|
+
import React3__default, { useState, useCallback, useRef, useLayoutEffect, useMemo, useEffect } from 'react';
|
|
3
3
|
import { createPortal } from 'react-dom';
|
|
4
4
|
import { X, ChevronDown, Check, ChevronRight } from 'lucide-react';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
@@ -10,7 +10,7 @@ function cn(...inputs) {
|
|
|
10
10
|
return twMerge(clsx(inputs));
|
|
11
11
|
}
|
|
12
12
|
var sizeClass = {
|
|
13
|
-
xs: "h-8 min-h-8 gap-2 px-4 text-
|
|
13
|
+
xs: "h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
|
|
14
14
|
default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4",
|
|
15
15
|
lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5"
|
|
16
16
|
};
|
|
@@ -30,7 +30,7 @@ var variantClass = {
|
|
|
30
30
|
destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5",
|
|
31
31
|
success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5"
|
|
32
32
|
};
|
|
33
|
-
var Button =
|
|
33
|
+
var Button = React3.forwardRef(
|
|
34
34
|
({
|
|
35
35
|
className,
|
|
36
36
|
type = "button",
|
|
@@ -50,9 +50,9 @@ var Button = React2.forwardRef(
|
|
|
50
50
|
"data-slot": "button",
|
|
51
51
|
"data-icon-only": iconOnly ? "" : void 0,
|
|
52
52
|
className: cn(
|
|
53
|
-
"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
53
|
+
"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
54
54
|
"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
55
|
-
"focus-visible:border-ring font-
|
|
55
|
+
"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
56
56
|
iconOnly ? iconOnlySizeClass[size] : sizeClass[size],
|
|
57
57
|
roundedClass[rounded],
|
|
58
58
|
variantClass[variant],
|
|
@@ -65,6 +65,124 @@ var Button = React2.forwardRef(
|
|
|
65
65
|
}
|
|
66
66
|
);
|
|
67
67
|
Button.displayName = "Button";
|
|
68
|
+
var CHECKBOX_TICK_DELAY_MS = 60;
|
|
69
|
+
var CHECKBOX_TICK_DRAW_MS = 100;
|
|
70
|
+
function CheckboxAnimatedCheckMark() {
|
|
71
|
+
const lineRef = useRef(null);
|
|
72
|
+
useLayoutEffect(() => {
|
|
73
|
+
const poly = lineRef.current;
|
|
74
|
+
if (!poly || typeof poly.getTotalLength !== "function") return;
|
|
75
|
+
const len = poly.getTotalLength();
|
|
76
|
+
if (len <= 0) return;
|
|
77
|
+
poly.style.strokeDasharray = `${len}`;
|
|
78
|
+
poly.style.strokeDashoffset = `${len}`;
|
|
79
|
+
if (typeof poly.animate !== "function") {
|
|
80
|
+
poly.style.strokeDashoffset = "0";
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const anim = poly.animate(
|
|
84
|
+
[{ strokeDashoffset: len }, { strokeDashoffset: 0 }],
|
|
85
|
+
{
|
|
86
|
+
duration: CHECKBOX_TICK_DRAW_MS,
|
|
87
|
+
delay: CHECKBOX_TICK_DELAY_MS,
|
|
88
|
+
easing: "cubic-bezier(0.45, 0, 0.2, 1)",
|
|
89
|
+
fill: "forwards"
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
return () => anim.cancel();
|
|
93
|
+
}, []);
|
|
94
|
+
return /* @__PURE__ */ jsx(
|
|
95
|
+
"svg",
|
|
96
|
+
{
|
|
97
|
+
className: "size-4 shrink-0 overflow-visible",
|
|
98
|
+
viewBox: "0 0 24 24",
|
|
99
|
+
"aria-hidden": true,
|
|
100
|
+
children: /* @__PURE__ */ jsx(
|
|
101
|
+
"polyline",
|
|
102
|
+
{
|
|
103
|
+
ref: lineRef,
|
|
104
|
+
points: "4 12 9 17 20 6",
|
|
105
|
+
fill: "none",
|
|
106
|
+
stroke: "currentColor",
|
|
107
|
+
strokeWidth: "3",
|
|
108
|
+
strokeLinecap: "round",
|
|
109
|
+
strokeLinejoin: "round"
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
var Checkbox = React3.forwardRef(
|
|
116
|
+
({
|
|
117
|
+
checked: checkedProp,
|
|
118
|
+
defaultChecked = false,
|
|
119
|
+
onCheckedChange,
|
|
120
|
+
indeterminate = false,
|
|
121
|
+
disabled = false,
|
|
122
|
+
className,
|
|
123
|
+
onClick,
|
|
124
|
+
...rest
|
|
125
|
+
}, ref) => {
|
|
126
|
+
const isControlled = checkedProp !== void 0;
|
|
127
|
+
const [uncontrolledChecked, setUncontrolledChecked] = useState(
|
|
128
|
+
defaultChecked
|
|
129
|
+
);
|
|
130
|
+
const checked = isControlled ? checkedProp : uncontrolledChecked;
|
|
131
|
+
const ariaChecked = indeterminate ? "mixed" : checked ? true : false;
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
ref,
|
|
136
|
+
type: "button",
|
|
137
|
+
role: "checkbox",
|
|
138
|
+
"data-slot": "checkbox",
|
|
139
|
+
"data-state": indeterminate ? "indeterminate" : checked ? "checked" : "unchecked",
|
|
140
|
+
disabled,
|
|
141
|
+
"aria-checked": ariaChecked,
|
|
142
|
+
className: cn(
|
|
143
|
+
"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",
|
|
144
|
+
"focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
145
|
+
"disabled:cursor-not-allowed",
|
|
146
|
+
className
|
|
147
|
+
),
|
|
148
|
+
onClick: (e) => {
|
|
149
|
+
onClick?.(e);
|
|
150
|
+
if (e.defaultPrevented) return;
|
|
151
|
+
if (disabled) return;
|
|
152
|
+
if (isControlled) {
|
|
153
|
+
onCheckedChange?.(!checked);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
setUncontrolledChecked((prev) => {
|
|
157
|
+
const next = !prev;
|
|
158
|
+
onCheckedChange?.(next);
|
|
159
|
+
return next;
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
...rest,
|
|
163
|
+
children: /* @__PURE__ */ jsx("span", { className: "pointer-events-none", children: /* @__PURE__ */ jsx(
|
|
164
|
+
"span",
|
|
165
|
+
{
|
|
166
|
+
"aria-hidden": true,
|
|
167
|
+
className: cn(
|
|
168
|
+
"flex size-5 shrink-0 items-center justify-center rounded-[4px] border",
|
|
169
|
+
!disabled && (indeterminate ? "border-primary bg-primary text-background" : checked ? "border-primary bg-primary text-background" : "border-primary/20 bg-background"),
|
|
170
|
+
disabled && (indeterminate ? "border-primary/40 bg-primary/45 text-primary-foreground" : checked ? "border-primary/40 bg-primary/45 text-primary-foreground" : "border-primary/10 bg-muted/25")
|
|
171
|
+
),
|
|
172
|
+
children: indeterminate ? /* @__PURE__ */ jsx(
|
|
173
|
+
"span",
|
|
174
|
+
{
|
|
175
|
+
className: "size-2.5 shrink-0 rounded-[2px] border border-primary/20 bg-background",
|
|
176
|
+
"aria-hidden": true
|
|
177
|
+
}
|
|
178
|
+
) : checked ? /* @__PURE__ */ jsx(CheckboxAnimatedCheckMark, {}) : null
|
|
179
|
+
}
|
|
180
|
+
) })
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
);
|
|
185
|
+
Checkbox.displayName = "Checkbox";
|
|
68
186
|
var DROPDOWN_PANEL_OPEN_EASING = "cubic-bezier(0,0.55,0.45,1)";
|
|
69
187
|
var DROPDOWN_PANEL_CLOSE_EASING = "cubic-bezier(0.55,0,1,0.45)";
|
|
70
188
|
var DROPDOWN_MENU_MIN_WIDTH_PX = 192;
|
|
@@ -73,6 +191,14 @@ var DROPDOWN_MOBILE_SHEET_MOTION_MS = 175;
|
|
|
73
191
|
var DROPDOWN_MOBILE_SHEET_ENTRY_EASING = "cubic-bezier(0.85, 0, 0.15, 1)";
|
|
74
192
|
var DROPDOWN_MOBILE_SHEET_EXIT_EASING = "cubic-bezier(0.85, 0, 1, 0.15)";
|
|
75
193
|
var DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX = 120;
|
|
194
|
+
function resolveDropdownMobileSheet(mobileOptions) {
|
|
195
|
+
return {
|
|
196
|
+
sheet: mobileOptions?.sheet ?? true,
|
|
197
|
+
title: mobileOptions?.title,
|
|
198
|
+
sheetExtraClassName: mobileOptions?.className,
|
|
199
|
+
contentClassName: mobileOptions?.contentClassName
|
|
200
|
+
};
|
|
201
|
+
}
|
|
76
202
|
var DROPDOWN_SUB_CONTENT_ATTR = "data-dropdown-sub-content";
|
|
77
203
|
var DROPDOWN_SHEET_MENU_TEXT = "max-[1024px]:text-base";
|
|
78
204
|
var DROPDOWN_SHEET_MENU_SHORTCUT = "max-[1024px]:text-sm";
|
|
@@ -174,14 +300,14 @@ function useIsMobile(breakpoint = 1025) {
|
|
|
174
300
|
}, [breakpoint]);
|
|
175
301
|
return isMobile;
|
|
176
302
|
}
|
|
177
|
-
var DropdownContext =
|
|
303
|
+
var DropdownContext = React3__default.createContext(void 0);
|
|
178
304
|
function useDropdown() {
|
|
179
|
-
const ctx =
|
|
305
|
+
const ctx = React3__default.useContext(DropdownContext);
|
|
180
306
|
if (!ctx)
|
|
181
307
|
throw new Error("Dropdown components must be used within <Dropdown />");
|
|
182
308
|
return ctx;
|
|
183
309
|
}
|
|
184
|
-
var SubContext =
|
|
310
|
+
var SubContext = React3__default.createContext(void 0);
|
|
185
311
|
var Dropdown = ({
|
|
186
312
|
children,
|
|
187
313
|
open: controlledOpen,
|
|
@@ -214,7 +340,7 @@ function mergeTriggerRef(triggerRef, node, childRef) {
|
|
|
214
340
|
else if (childRef && typeof childRef === "object")
|
|
215
341
|
childRef.current = node;
|
|
216
342
|
}
|
|
217
|
-
var DropdownTrigger =
|
|
343
|
+
var DropdownTrigger = React3__default.forwardRef(
|
|
218
344
|
({
|
|
219
345
|
children,
|
|
220
346
|
asChild,
|
|
@@ -241,9 +367,9 @@ var DropdownTrigger = React2__default.forwardRef(
|
|
|
241
367
|
},
|
|
242
368
|
[ref, triggerRef]
|
|
243
369
|
);
|
|
244
|
-
if (asChild &&
|
|
370
|
+
if (asChild && React3__default.isValidElement(children)) {
|
|
245
371
|
const child = children;
|
|
246
|
-
return
|
|
372
|
+
return React3__default.cloneElement(child, {
|
|
247
373
|
ref: (node) => {
|
|
248
374
|
mergeTriggerRef(
|
|
249
375
|
triggerRef,
|
|
@@ -296,7 +422,7 @@ function DropdownChevron({
|
|
|
296
422
|
}
|
|
297
423
|
);
|
|
298
424
|
}
|
|
299
|
-
var DropdownMobileClose =
|
|
425
|
+
var DropdownMobileClose = React3__default.forwardRef(({ className, type = "button", ...props }, ref) => {
|
|
300
426
|
return /* @__PURE__ */ jsxs(
|
|
301
427
|
"button",
|
|
302
428
|
{
|
|
@@ -320,7 +446,9 @@ function DropdownMobileBottomSheetPortal({
|
|
|
320
446
|
isAnimating,
|
|
321
447
|
slideEntrance,
|
|
322
448
|
slideOffsetPx,
|
|
323
|
-
|
|
449
|
+
sheetTitle,
|
|
450
|
+
sheetExtraClassName,
|
|
451
|
+
contentClassName,
|
|
324
452
|
onRequestClose,
|
|
325
453
|
menuRef,
|
|
326
454
|
portalZClassName = "z-50",
|
|
@@ -363,6 +491,7 @@ function DropdownMobileBottomSheetPortal({
|
|
|
363
491
|
className: cn(
|
|
364
492
|
"bg-background border-primary/10 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",
|
|
365
493
|
"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t",
|
|
494
|
+
sheetExtraClassName,
|
|
366
495
|
className
|
|
367
496
|
),
|
|
368
497
|
style: {
|
|
@@ -379,10 +508,10 @@ function DropdownMobileBottomSheetPortal({
|
|
|
379
508
|
{
|
|
380
509
|
className: cn(
|
|
381
510
|
"flex w-full shrink-0 items-center py-2 pl-4 pr-2",
|
|
382
|
-
|
|
511
|
+
sheetTitle ? "justify-between gap-3" : "justify-end"
|
|
383
512
|
),
|
|
384
513
|
children: [
|
|
385
|
-
|
|
514
|
+
sheetTitle ? /* @__PURE__ */ jsx("p", { className: "text-foreground min-w-0 flex-1 truncate text-base font-semibold", children: sheetTitle }) : null,
|
|
386
515
|
/* @__PURE__ */ jsx(
|
|
387
516
|
DropdownMobileClose,
|
|
388
517
|
{
|
|
@@ -395,7 +524,16 @@ function DropdownMobileBottomSheetPortal({
|
|
|
395
524
|
]
|
|
396
525
|
}
|
|
397
526
|
),
|
|
398
|
-
/* @__PURE__ */ jsx(
|
|
527
|
+
/* @__PURE__ */ jsx(
|
|
528
|
+
"div",
|
|
529
|
+
{
|
|
530
|
+
className: cn(
|
|
531
|
+
"min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]",
|
|
532
|
+
contentClassName
|
|
533
|
+
),
|
|
534
|
+
children
|
|
535
|
+
}
|
|
536
|
+
)
|
|
399
537
|
]
|
|
400
538
|
}
|
|
401
539
|
)
|
|
@@ -415,8 +553,7 @@ var DropdownContent = ({
|
|
|
415
553
|
closeOnEscape = true,
|
|
416
554
|
minWidth = "trigger",
|
|
417
555
|
loop = true,
|
|
418
|
-
|
|
419
|
-
mobileTitle,
|
|
556
|
+
mobileOptions,
|
|
420
557
|
slideEntrance = true,
|
|
421
558
|
slideEntranceOffsetPx: slideEntranceOffsetPxProp,
|
|
422
559
|
className,
|
|
@@ -430,11 +567,15 @@ var DropdownContent = ({
|
|
|
430
567
|
const [pos, setPos] = useState({ top: -9999, left: -9999, side });
|
|
431
568
|
const [triggerW, setTriggerW] = useState(0);
|
|
432
569
|
const menuRef = useRef(null);
|
|
570
|
+
const resolvedMobile = useMemo(
|
|
571
|
+
() => resolveDropdownMobileSheet(mobileOptions),
|
|
572
|
+
[mobileOptions]
|
|
573
|
+
);
|
|
433
574
|
const slideOffsetPx = useMemo(
|
|
434
575
|
() => slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,
|
|
435
576
|
[slideEntranceOffsetPxProp]
|
|
436
577
|
);
|
|
437
|
-
const closeDuration = isMobile &&
|
|
578
|
+
const closeDuration = isMobile && resolvedMobile.sheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
|
|
438
579
|
const closeMenu = useCallback(() => setOpen(false), [setOpen]);
|
|
439
580
|
useEffect(() => {
|
|
440
581
|
if (open) {
|
|
@@ -545,15 +686,15 @@ var DropdownContent = ({
|
|
|
545
686
|
return () => window.removeEventListener("keydown", handler);
|
|
546
687
|
}, [open, closeOnEscape, loop, setOpen, triggerRef]);
|
|
547
688
|
useEffect(() => {
|
|
548
|
-
if (open && isMobile &&
|
|
689
|
+
if (open && isMobile && resolvedMobile.sheet) {
|
|
549
690
|
document.body.style.overflow = "hidden";
|
|
550
691
|
}
|
|
551
692
|
return () => {
|
|
552
693
|
document.body.style.overflow = "";
|
|
553
694
|
};
|
|
554
|
-
}, [open, isMobile,
|
|
695
|
+
}, [open, isMobile, resolvedMobile.sheet]);
|
|
555
696
|
if (!shouldRender || typeof document === "undefined") return null;
|
|
556
|
-
if (isMobile &&
|
|
697
|
+
if (isMobile && resolvedMobile.sheet) {
|
|
557
698
|
return /* @__PURE__ */ jsx(
|
|
558
699
|
DropdownMobileBottomSheetPortal,
|
|
559
700
|
{
|
|
@@ -562,7 +703,9 @@ var DropdownContent = ({
|
|
|
562
703
|
isAnimating,
|
|
563
704
|
slideEntrance,
|
|
564
705
|
slideOffsetPx,
|
|
565
|
-
|
|
706
|
+
sheetTitle: resolvedMobile.title,
|
|
707
|
+
sheetExtraClassName: resolvedMobile.sheetExtraClassName,
|
|
708
|
+
contentClassName: resolvedMobile.contentClassName,
|
|
566
709
|
onRequestClose: closeMenu,
|
|
567
710
|
menuRef,
|
|
568
711
|
portalZClassName: "z-50",
|
|
@@ -649,7 +792,7 @@ var DropdownItem = ({
|
|
|
649
792
|
onClick: handleClick,
|
|
650
793
|
onKeyDown: handleKeyDown,
|
|
651
794
|
className: cn(
|
|
652
|
-
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none",
|
|
795
|
+
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none",
|
|
653
796
|
DROPDOWN_SHEET_MENU_TEXT,
|
|
654
797
|
inset && "pl-9",
|
|
655
798
|
!disabled && "cursor-pointer",
|
|
@@ -698,53 +841,6 @@ var DropdownLabel = ({ className, inset, ...props }) => /* @__PURE__ */ jsx(
|
|
|
698
841
|
...props
|
|
699
842
|
}
|
|
700
843
|
);
|
|
701
|
-
var DROPDOWN_CHECKBOX_TICK_DELAY_MS = 60;
|
|
702
|
-
var DROPDOWN_CHECKBOX_TICK_DRAW_MS = 200;
|
|
703
|
-
function DropdownCheckboxItemCheckMark() {
|
|
704
|
-
const lineRef = useRef(null);
|
|
705
|
-
useLayoutEffect(() => {
|
|
706
|
-
const poly = lineRef.current;
|
|
707
|
-
if (!poly || typeof poly.getTotalLength !== "function") return;
|
|
708
|
-
const len = poly.getTotalLength();
|
|
709
|
-
if (len <= 0) return;
|
|
710
|
-
poly.style.strokeDasharray = `${len}`;
|
|
711
|
-
poly.style.strokeDashoffset = `${len}`;
|
|
712
|
-
if (typeof poly.animate !== "function") {
|
|
713
|
-
poly.style.strokeDashoffset = "0";
|
|
714
|
-
return;
|
|
715
|
-
}
|
|
716
|
-
const anim = poly.animate(
|
|
717
|
-
[{ strokeDashoffset: len }, { strokeDashoffset: 0 }],
|
|
718
|
-
{
|
|
719
|
-
duration: DROPDOWN_CHECKBOX_TICK_DRAW_MS,
|
|
720
|
-
delay: DROPDOWN_CHECKBOX_TICK_DELAY_MS,
|
|
721
|
-
easing: "cubic-bezier(0.45, 0, 0.2, 1)",
|
|
722
|
-
fill: "forwards"
|
|
723
|
-
}
|
|
724
|
-
);
|
|
725
|
-
return () => anim.cancel();
|
|
726
|
-
}, []);
|
|
727
|
-
return /* @__PURE__ */ jsx(
|
|
728
|
-
"svg",
|
|
729
|
-
{
|
|
730
|
-
className: "size-4 shrink-0 overflow-visible",
|
|
731
|
-
viewBox: "0 0 24 24",
|
|
732
|
-
"aria-hidden": true,
|
|
733
|
-
children: /* @__PURE__ */ jsx(
|
|
734
|
-
"polyline",
|
|
735
|
-
{
|
|
736
|
-
ref: lineRef,
|
|
737
|
-
points: "4 12 9 17 20 6",
|
|
738
|
-
fill: "none",
|
|
739
|
-
stroke: "currentColor",
|
|
740
|
-
strokeWidth: "3",
|
|
741
|
-
strokeLinecap: "round",
|
|
742
|
-
strokeLinejoin: "round"
|
|
743
|
-
}
|
|
744
|
-
)
|
|
745
|
-
}
|
|
746
|
-
);
|
|
747
|
-
}
|
|
748
844
|
var DropdownCheckboxItem = ({
|
|
749
845
|
children,
|
|
750
846
|
checked = false,
|
|
@@ -780,25 +876,22 @@ var DropdownCheckboxItem = ({
|
|
|
780
876
|
onClick: handleClick,
|
|
781
877
|
onKeyDown: handleKeyDown,
|
|
782
878
|
className: cn(
|
|
783
|
-
"mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none",
|
|
879
|
+
"mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none",
|
|
784
880
|
DROPDOWN_SHEET_MENU_TEXT,
|
|
785
881
|
!disabled && "cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4",
|
|
786
882
|
disabled && "lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50",
|
|
787
883
|
className
|
|
788
884
|
),
|
|
789
885
|
children: [
|
|
790
|
-
/* @__PURE__ */ jsx(
|
|
791
|
-
|
|
886
|
+
/* @__PURE__ */ jsx("span", { className: "mr-1 inline-flex shrink-0", "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
887
|
+
Checkbox,
|
|
792
888
|
{
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
disabled && (checked ? "border-primary/40 bg-primary/45 text-primary-foreground" : "border-primary/10 bg-muted/25")
|
|
798
|
-
),
|
|
799
|
-
children: checked ? /* @__PURE__ */ jsx(DropdownCheckboxItemCheckMark, {}) : null
|
|
889
|
+
checked,
|
|
890
|
+
disabled,
|
|
891
|
+
tabIndex: -1,
|
|
892
|
+
className: "pointer-events-none"
|
|
800
893
|
}
|
|
801
|
-
),
|
|
894
|
+
) }),
|
|
802
895
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
|
|
803
896
|
shortcut && /* @__PURE__ */ jsx(
|
|
804
897
|
"span",
|
|
@@ -834,11 +927,11 @@ var DropdownRadioGroup = ({ children, value, onValueChange, group }) => {
|
|
|
834
927
|
);
|
|
835
928
|
return /* @__PURE__ */ jsx(RadioGroupContext.Provider, { value: radioCtx, children });
|
|
836
929
|
};
|
|
837
|
-
var RadioGroupContext =
|
|
930
|
+
var RadioGroupContext = React3__default.createContext(
|
|
838
931
|
void 0
|
|
839
932
|
);
|
|
840
933
|
function useRadioGroup() {
|
|
841
|
-
const ctx =
|
|
934
|
+
const ctx = React3__default.useContext(RadioGroupContext);
|
|
842
935
|
if (!ctx)
|
|
843
936
|
throw new Error("DropdownRadioItem must be inside DropdownRadioGroup");
|
|
844
937
|
return ctx;
|
|
@@ -879,7 +972,7 @@ var DropdownRadioItem = ({
|
|
|
879
972
|
onClick: handleClick,
|
|
880
973
|
onKeyDown: handleKeyDown,
|
|
881
974
|
className: cn(
|
|
882
|
-
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none",
|
|
975
|
+
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none",
|
|
883
976
|
DROPDOWN_SHEET_MENU_TEXT,
|
|
884
977
|
!disabled && "cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4",
|
|
885
978
|
disabled && "lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50",
|
|
@@ -921,7 +1014,7 @@ var DropdownSub = ({
|
|
|
921
1014
|
return /* @__PURE__ */ jsx(SubContext.Provider, { value: subCtx, children });
|
|
922
1015
|
};
|
|
923
1016
|
var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className, ...props }) => {
|
|
924
|
-
const sub =
|
|
1017
|
+
const sub = React3__default.useContext(SubContext);
|
|
925
1018
|
if (!sub) throw new Error("DropdownSubTrigger must be inside DropdownSub");
|
|
926
1019
|
const { open, setOpen, triggerRef } = sub;
|
|
927
1020
|
const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);
|
|
@@ -957,7 +1050,7 @@ var DropdownSubTrigger = ({ children, icon, inset, disabled = false, className,
|
|
|
957
1050
|
setOpen(!open);
|
|
958
1051
|
},
|
|
959
1052
|
className: cn(
|
|
960
|
-
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none",
|
|
1053
|
+
"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none",
|
|
961
1054
|
DROPDOWN_SHEET_MENU_TEXT,
|
|
962
1055
|
inset && "pl-9",
|
|
963
1056
|
!disabled && "cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4",
|
|
@@ -976,8 +1069,7 @@ var DropdownSubContent = ({
|
|
|
976
1069
|
children,
|
|
977
1070
|
duration = 80,
|
|
978
1071
|
viewportPadding = 8,
|
|
979
|
-
|
|
980
|
-
mobileTitle,
|
|
1072
|
+
mobileOptions,
|
|
981
1073
|
slideEntrance = true,
|
|
982
1074
|
slideEntranceOffsetPx: slideEntranceOffsetPxProp,
|
|
983
1075
|
className,
|
|
@@ -985,7 +1077,7 @@ var DropdownSubContent = ({
|
|
|
985
1077
|
onKeyDown: onKeyDownProp,
|
|
986
1078
|
...props
|
|
987
1079
|
}) => {
|
|
988
|
-
const sub =
|
|
1080
|
+
const sub = React3__default.useContext(SubContext);
|
|
989
1081
|
if (!sub) throw new Error("DropdownSubContent must be inside DropdownSub");
|
|
990
1082
|
const { open, setOpen, triggerRef } = sub;
|
|
991
1083
|
const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);
|
|
@@ -993,6 +1085,10 @@ var DropdownSubContent = ({
|
|
|
993
1085
|
() => slideEntranceOffsetPxProp ?? DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,
|
|
994
1086
|
[slideEntranceOffsetPxProp]
|
|
995
1087
|
);
|
|
1088
|
+
const resolvedMobile = useMemo(
|
|
1089
|
+
() => resolveDropdownMobileSheet(mobileOptions),
|
|
1090
|
+
[mobileOptions]
|
|
1091
|
+
);
|
|
996
1092
|
const [shouldRender, setShouldRender] = useState(false);
|
|
997
1093
|
const [isAnimating, setIsAnimating] = useState(false);
|
|
998
1094
|
const [pos, setPos] = useState({
|
|
@@ -1001,7 +1097,7 @@ var DropdownSubContent = ({
|
|
|
1001
1097
|
side: "right"
|
|
1002
1098
|
});
|
|
1003
1099
|
const menuRef = useRef(null);
|
|
1004
|
-
const closeDuration = isMobile &&
|
|
1100
|
+
const closeDuration = isMobile && resolvedMobile.sheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
|
|
1005
1101
|
const closeSub = useCallback(() => setOpen(false), [setOpen]);
|
|
1006
1102
|
useEffect(() => {
|
|
1007
1103
|
if (open) {
|
|
@@ -1025,7 +1121,7 @@ var DropdownSubContent = ({
|
|
|
1025
1121
|
}, [shouldRender, open]);
|
|
1026
1122
|
useLayoutEffect(() => {
|
|
1027
1123
|
if (!shouldRender || !triggerRef.current || !menuRef.current) return;
|
|
1028
|
-
if (isMobile &&
|
|
1124
|
+
if (isMobile && resolvedMobile.sheet) return;
|
|
1029
1125
|
const update = () => {
|
|
1030
1126
|
if (!triggerRef.current || !menuRef.current) return;
|
|
1031
1127
|
setPos(
|
|
@@ -1046,7 +1142,7 @@ var DropdownSubContent = ({
|
|
|
1046
1142
|
window.removeEventListener("resize", update);
|
|
1047
1143
|
window.removeEventListener("scroll", update, true);
|
|
1048
1144
|
};
|
|
1049
|
-
}, [shouldRender, viewportPadding, isMobile,
|
|
1145
|
+
}, [shouldRender, viewportPadding, isMobile, resolvedMobile.sheet]);
|
|
1050
1146
|
useEffect(() => {
|
|
1051
1147
|
if (isAnimating && menuRef.current) {
|
|
1052
1148
|
menuRef.current.focus();
|
|
@@ -1107,7 +1203,7 @@ var DropdownSubContent = ({
|
|
|
1107
1203
|
[onKeyDownProp, setOpen, triggerRef]
|
|
1108
1204
|
);
|
|
1109
1205
|
if (!shouldRender || typeof document === "undefined") return null;
|
|
1110
|
-
if (isMobile &&
|
|
1206
|
+
if (isMobile && resolvedMobile.sheet) {
|
|
1111
1207
|
return /* @__PURE__ */ jsx(
|
|
1112
1208
|
DropdownMobileBottomSheetPortal,
|
|
1113
1209
|
{
|
|
@@ -1116,7 +1212,9 @@ var DropdownSubContent = ({
|
|
|
1116
1212
|
isAnimating,
|
|
1117
1213
|
slideEntrance,
|
|
1118
1214
|
slideOffsetPx,
|
|
1119
|
-
|
|
1215
|
+
sheetTitle: resolvedMobile.title,
|
|
1216
|
+
sheetExtraClassName: resolvedMobile.sheetExtraClassName,
|
|
1217
|
+
contentClassName: resolvedMobile.contentClassName,
|
|
1120
1218
|
onRequestClose: closeSub,
|
|
1121
1219
|
menuRef,
|
|
1122
1220
|
portalZClassName: "z-[70]",
|