@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.
Files changed (73) hide show
  1. package/dist/react/avatar.d.ts +42 -0
  2. package/dist/react/avatar.js +159 -0
  3. package/dist/react/avatar.js.map +1 -0
  4. package/dist/react/badge.d.ts +12 -0
  5. package/dist/react/badge.js +35 -1
  6. package/dist/react/badge.js.map +1 -1
  7. package/dist/react/button.d.ts +1 -1
  8. package/dist/react/button.js +3 -3
  9. package/dist/react/button.js.map +1 -1
  10. package/dist/react/calendar.d.ts +13 -0
  11. package/dist/react/calendar.js +4639 -0
  12. package/dist/react/calendar.js.map +1 -0
  13. package/dist/react/card.d.ts +11 -0
  14. package/dist/react/card.js +113 -0
  15. package/dist/react/card.js.map +1 -0
  16. package/dist/react/checkbox.d.ts +11 -0
  17. package/dist/react/checkbox.js +131 -0
  18. package/dist/react/checkbox.js.map +1 -0
  19. package/dist/react/datetime-picker.d.ts +21 -0
  20. package/dist/react/datetime-picker.js +6124 -0
  21. package/dist/react/datetime-picker.js.map +1 -0
  22. package/dist/react/dialog.js +1 -1
  23. package/dist/react/dialog.js.map +1 -1
  24. package/dist/react/dropdown.d.ts +26 -9
  25. package/dist/react/dropdown.js +194 -96
  26. package/dist/react/dropdown.js.map +1 -1
  27. package/dist/react/input.d.ts +7 -0
  28. package/dist/react/input.js +15 -2
  29. package/dist/react/input.js.map +1 -1
  30. package/dist/react/pagination.d.ts +28 -0
  31. package/dist/react/pagination.js +262 -0
  32. package/dist/react/pagination.js.map +1 -0
  33. package/dist/react/popover.d.ts +76 -0
  34. package/dist/react/popover.js +564 -0
  35. package/dist/react/popover.js.map +1 -0
  36. package/dist/react/scroll-header.js +13 -1
  37. package/dist/react/scroll-header.js.map +1 -1
  38. package/dist/react/scroll-wheel.d.ts +45 -0
  39. package/dist/react/scroll-wheel.js +557 -0
  40. package/dist/react/scroll-wheel.js.map +1 -0
  41. package/dist/react/select.d.ts +62 -0
  42. package/dist/react/select.js +889 -0
  43. package/dist/react/select.js.map +1 -0
  44. package/dist/react/sheet.js +1 -1
  45. package/dist/react/sheet.js.map +1 -1
  46. package/dist/react/switch.d.ts +38 -0
  47. package/dist/react/switch.js +117 -0
  48. package/dist/react/switch.js.map +1 -0
  49. package/dist/react/table-pagination.d.ts +15 -0
  50. package/dist/react/table-pagination.js +1153 -0
  51. package/dist/react/table-pagination.js.map +1 -0
  52. package/dist/react/table-view/column-menu.d.ts +15 -0
  53. package/dist/react/table-view/column-menu.js +918 -0
  54. package/dist/react/table-view/column-menu.js.map +1 -0
  55. package/dist/react/table-view/index.d.ts +70 -0
  56. package/dist/react/table-view/index.js +2155 -0
  57. package/dist/react/table-view/index.js.map +1 -0
  58. package/dist/react/table.d.ts +86 -0
  59. package/dist/react/table.js +414 -0
  60. package/dist/react/table.js.map +1 -0
  61. package/dist/react/tabs.d.ts +9 -3
  62. package/dist/react/tabs.js +204 -48
  63. package/dist/react/tabs.js.map +1 -1
  64. package/dist/react/textarea.d.ts +6 -0
  65. package/dist/react/textarea.js +33 -0
  66. package/dist/react/textarea.js.map +1 -0
  67. package/dist/react/time-picker.d.ts +22 -0
  68. package/dist/react/time-picker.js +856 -0
  69. package/dist/react/time-picker.js.map +1 -0
  70. package/dist/react/tooltip.d.ts +45 -0
  71. package/dist/react/tooltip.js +540 -0
  72. package/dist/react/tooltip.js.map +1 -0
  73. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import * as React2 from 'react';
2
- import React2__default, { useCallback, useState, useRef, useMemo, useEffect, useLayoutEffect } from 'react';
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-xs has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
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 = React2.forwardRef(
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-bold tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
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 = React2__default.createContext(void 0);
303
+ var DropdownContext = React3__default.createContext(void 0);
178
304
  function useDropdown() {
179
- const ctx = React2__default.useContext(DropdownContext);
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 = React2__default.createContext(void 0);
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 = React2__default.forwardRef(
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 && React2__default.isValidElement(children)) {
370
+ if (asChild && React3__default.isValidElement(children)) {
245
371
  const child = children;
246
- return React2__default.cloneElement(child, {
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 = React2__default.forwardRef(({ className, type = "button", ...props }, ref) => {
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
- mobileTitle,
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
- mobileTitle ? "justify-between gap-3" : "justify-end"
511
+ sheetTitle ? "justify-between gap-3" : "justify-end"
383
512
  ),
384
513
  children: [
385
- mobileTitle ? /* @__PURE__ */ jsx("p", { className: "text-foreground min-w-0 flex-1 truncate text-base font-semibold", children: mobileTitle }) : null,
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("div", { className: "min-h-0 flex-1 overflow-y-auto pb-[max(0.375rem,env(safe-area-inset-bottom,0px))]", children: /* @__PURE__ */ jsx("div", { className: "pb-1", children }) })
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
- mobileSheet = true,
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 && mobileSheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
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 && mobileSheet) {
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, mobileSheet]);
695
+ }, [open, isMobile, resolvedMobile.sheet]);
555
696
  if (!shouldRender || typeof document === "undefined") return null;
556
- if (isMobile && mobileSheet) {
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
- mobileTitle,
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
- "span",
886
+ /* @__PURE__ */ jsx("span", { className: "mr-1 inline-flex shrink-0", "aria-hidden": true, children: /* @__PURE__ */ jsx(
887
+ Checkbox,
792
888
  {
793
- "aria-hidden": true,
794
- className: cn(
795
- "pointer-events-none flex size-5 shrink-0 items-center justify-center rounded-[4px] border mr-1",
796
- !disabled && (checked ? "border-primary bg-primary text-background" : "border-primary/20 bg-background"),
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 = React2__default.createContext(
930
+ var RadioGroupContext = React3__default.createContext(
838
931
  void 0
839
932
  );
840
933
  function useRadioGroup() {
841
- const ctx = React2__default.useContext(RadioGroupContext);
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 = React2__default.useContext(SubContext);
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
- mobileSheet = true,
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 = React2__default.useContext(SubContext);
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 && mobileSheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;
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 && mobileSheet) return;
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, mobileSheet]);
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 && mobileSheet) {
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
- mobileTitle,
1215
+ sheetTitle: resolvedMobile.title,
1216
+ sheetExtraClassName: resolvedMobile.sheetExtraClassName,
1217
+ contentClassName: resolvedMobile.contentClassName,
1120
1218
  onRequestClose: closeSub,
1121
1219
  menuRef,
1122
1220
  portalZClassName: "z-[70]",