asterui 0.12.49 → 0.12.51
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/components/Alert.js +18 -18
- package/dist/components/Alert.js.map +1 -1
- package/dist/components/Autocomplete.js +115 -114
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Avatar.js +33 -32
- package/dist/components/Avatar.js.map +1 -1
- package/dist/components/Badge.js +99 -99
- package/dist/components/Badge.js.map +1 -1
- package/dist/components/Breadcrumb.js +12 -11
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Browser.js +10 -10
- package/dist/components/Browser.js.map +1 -1
- package/dist/components/Button.js +80 -79
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Card.d.ts +2 -0
- package/dist/components/Card.js +111 -110
- package/dist/components/Card.js.map +1 -1
- package/dist/components/Carousel.js +59 -59
- package/dist/components/Carousel.js.map +1 -1
- package/dist/components/Cascader.js +175 -174
- package/dist/components/Cascader.js.map +1 -1
- package/dist/components/Chat.js +27 -27
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Checkbox.js +98 -97
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/Code.js +11 -11
- package/dist/components/Code.js.map +1 -1
- package/dist/components/Collapse.js +46 -46
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/ColorPicker.d.ts +1 -1
- package/dist/components/ColorPicker.js +93 -91
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/Command.js +120 -120
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ConfigProvider.d.ts +1 -1
- package/dist/components/ConfigProvider.js +9 -9
- package/dist/components/ConfigProvider.js.map +1 -1
- package/dist/components/ContextMenu.js +33 -33
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/CopyButton.js +74 -73
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +60 -59
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.d.ts +1 -1
- package/dist/components/DatePicker.js +54 -53
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Diff.js +10 -10
- package/dist/components/Diff.js.map +1 -1
- package/dist/components/Divider.js +21 -20
- package/dist/components/Divider.js.map +1 -1
- package/dist/components/Dock.js +28 -27
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Drawer.js +43 -43
- package/dist/components/Drawer.js.map +1 -1
- package/dist/components/Dropdown.js +127 -127
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/Empty.js +16 -15
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/Fieldset.js +11 -10
- package/dist/components/Fieldset.js.map +1 -1
- package/dist/components/FileInput.js +30 -29
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -1
- package/dist/components/Filter.js +32 -30
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/FloatButton.js +83 -83
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Footer.js +14 -13
- package/dist/components/Footer.js.map +1 -1
- package/dist/components/Form.js +133 -132
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Hero.js +12 -11
- package/dist/components/Hero.js.map +1 -1
- package/dist/components/HoverGallery.js +7 -7
- package/dist/components/HoverGallery.js.map +1 -1
- package/dist/components/Image.js +40 -40
- package/dist/components/Image.js.map +1 -1
- package/dist/components/Input.js +171 -169
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +84 -83
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Join.js +11 -10
- package/dist/components/Join.js.map +1 -1
- package/dist/components/Kbd.js +15 -15
- package/dist/components/Kbd.js.map +1 -1
- package/dist/components/List.d.ts +1 -1
- package/dist/components/List.js +75 -72
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -1
- package/dist/components/Loading.js +31 -29
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Mask.js +31 -31
- package/dist/components/Mask.js.map +1 -1
- package/dist/components/Mention.js +61 -61
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Menu.js +84 -84
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Message.js +30 -29
- package/dist/components/Message.js.map +1 -1
- package/dist/components/Modal.js +117 -116
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +31 -0
- package/dist/components/MonthCalendar.js +205 -0
- package/dist/components/MonthCalendar.js.map +1 -0
- package/dist/components/Navbar.js +25 -25
- package/dist/components/Navbar.js.map +1 -1
- package/dist/components/Notification.js +56 -55
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/OTPInput.js +69 -68
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +1 -1
- package/dist/components/Pagination.js +60 -58
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Phone.js +10 -10
- package/dist/components/Phone.js.map +1 -1
- package/dist/components/Popconfirm.js +60 -60
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Progress.js +17 -17
- package/dist/components/Progress.js.map +1 -1
- package/dist/components/QRCode.js +23 -23
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.js +17 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Radio.js +41 -40
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.d.ts +1 -1
- package/dist/components/Range.js +39 -37
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +79 -78
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/ResponsiveDrawer.js +27 -27
- package/dist/components/ResponsiveDrawer.js.map +1 -1
- package/dist/components/RichTextEditor.d.ts +32 -0
- package/dist/components/RichTextEditor.js +335 -0
- package/dist/components/RichTextEditor.js.map +1 -0
- package/dist/components/Segmented.d.ts +1 -1
- package/dist/components/Segmented.js +48 -46
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +55 -54
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Skeleton.js +9 -9
- package/dist/components/Skeleton.js.map +1 -1
- package/dist/components/Splitter.js +1 -3
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.js +17 -16
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Status.js +29 -29
- package/dist/components/Status.js.map +1 -1
- package/dist/components/Steps.js +61 -61
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/Table.js +256 -256
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +65 -65
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Tag.js +147 -147
- package/dist/components/Tag.js.map +1 -1
- package/dist/components/TextRotate.js +6 -6
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.js +35 -34
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +1 -1
- package/dist/components/ThemeController.js +71 -68
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.d.ts +1 -1
- package/dist/components/TimePicker.js +133 -129
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Timeline.js +79 -79
- package/dist/components/Timeline.js.map +1 -1
- package/dist/components/Toggle.js +33 -32
- package/dist/components/Toggle.js.map +1 -1
- package/dist/components/Tooltip.js +25 -25
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Tour.js +126 -126
- package/dist/components/Tour.js.map +1 -1
- package/dist/components/Transfer.js +93 -92
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Tree.js +200 -200
- package/dist/components/Tree.js.map +1 -1
- package/dist/components/TreeSelect.js +255 -254
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/components/Typography.js +71 -70
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/Upload.js +81 -81
- package/dist/components/Upload.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +35 -0
- package/dist/components/WeekCalendar.js +204 -0
- package/dist/components/WeekCalendar.js.map +1 -0
- package/dist/components/Window.js +7 -7
- package/dist/components/Window.js.map +1 -1
- package/dist/editor.d.ts +1 -0
- package/dist/editor.js +5 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +211 -207
- package/dist/index.js.map +1 -1
- package/package.json +30 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { jsxs as B, Fragment as
|
|
2
|
-
import y, { useId as q, useState as
|
|
3
|
-
const G = ue(void 0);
|
|
1
|
+
import { jsxs as B, Fragment as de, jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import y, { useId as q, useState as L, useRef as R, useCallback as N, useEffect as j, createContext as ue, useContext as pe } from "react";
|
|
3
|
+
const fe = "dropdown", me = "dropdown-top", be = "dropdown-bottom", we = "dropdown-left", he = "dropdown-right", ge = "dropdown-center", ye = "dropdown-end", De = "dropdown-hover", Ie = "dropdown-open", ke = "dropdown-content", G = "menu", J = ue(void 0);
|
|
4
4
|
function V() {
|
|
5
|
-
const a =
|
|
5
|
+
const a = pe(J);
|
|
6
6
|
if (!a)
|
|
7
7
|
throw new Error("Dropdown compound components must be used within Dropdown");
|
|
8
8
|
return a;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
10
|
+
function xe({
|
|
11
11
|
children: a,
|
|
12
12
|
items: l,
|
|
13
|
-
hover:
|
|
14
|
-
trigger:
|
|
15
|
-
position:
|
|
13
|
+
hover: D = !1,
|
|
14
|
+
trigger: p = ["click"],
|
|
15
|
+
position: f = "bottom",
|
|
16
16
|
align: o = "start",
|
|
17
17
|
open: s,
|
|
18
18
|
onOpenChange: t,
|
|
@@ -25,133 +25,133 @@ function fe({
|
|
|
25
25
|
className: k = "",
|
|
26
26
|
...S
|
|
27
27
|
}) {
|
|
28
|
-
const
|
|
29
|
-
m || (F ||
|
|
30
|
-
}, [m, F, t]),
|
|
28
|
+
const $ = q(), v = q(), [e, I] = L(!1), [i, x] = L(-1), [T, P] = L(0), [Z, z] = L(!r), W = R(/* @__PURE__ */ new Map()), U = R(null), C = R(null), M = D ? ["hover"] : p, F = s !== void 0, A = F ? s : e, g = N((n, E = "trigger") => {
|
|
29
|
+
m || (F || I(n), n && z(!0), t?.(n, { source: E }));
|
|
30
|
+
}, [m, F, t]), H = N(() => {
|
|
31
31
|
g(!1, "menu"), x(-1), document.getElementById(v)?.focus();
|
|
32
|
-
}, [g, v]),
|
|
33
|
-
E ? W.current.set(n, { ref: E, disabled:
|
|
32
|
+
}, [g, v]), ee = N((n, E, d) => {
|
|
33
|
+
E ? W.current.set(n, { ref: E, disabled: d }) : W.current.delete(n);
|
|
34
34
|
}, []);
|
|
35
|
-
|
|
35
|
+
j(() => {
|
|
36
36
|
if (r && !A) {
|
|
37
37
|
const n = setTimeout(() => z(!1), 300);
|
|
38
38
|
return () => clearTimeout(n);
|
|
39
39
|
}
|
|
40
|
-
}, [A, r]),
|
|
40
|
+
}, [A, r]), j(() => {
|
|
41
41
|
const n = (E) => {
|
|
42
|
-
|
|
42
|
+
U.current && !U.current.contains(E.target) && (g(!1, "trigger"), x(-1));
|
|
43
43
|
};
|
|
44
44
|
if (A)
|
|
45
45
|
return document.addEventListener("mousedown", n), () => document.removeEventListener("mousedown", n);
|
|
46
46
|
}, [A, g]);
|
|
47
|
-
const
|
|
47
|
+
const ne = N(() => {
|
|
48
48
|
M.includes("hover") && (C.current && clearTimeout(C.current), C.current = setTimeout(() => {
|
|
49
49
|
g(!0, "trigger");
|
|
50
50
|
}, w * 1e3));
|
|
51
|
-
}, [M, w, g]),
|
|
51
|
+
}, [M, w, g]), te = N(() => {
|
|
52
52
|
M.includes("hover") && (C.current && clearTimeout(C.current), C.current = setTimeout(() => {
|
|
53
53
|
g(!1, "trigger"), x(-1);
|
|
54
54
|
}, c * 1e3));
|
|
55
|
-
}, [M, c, g]),
|
|
55
|
+
}, [M, c, g]), re = N((n) => {
|
|
56
56
|
M.includes("contextMenu") && (n.preventDefault(), g(!0, "trigger"));
|
|
57
57
|
}, [M, g]);
|
|
58
|
-
|
|
58
|
+
j(() => () => {
|
|
59
59
|
C.current && clearTimeout(C.current);
|
|
60
60
|
}, []);
|
|
61
|
-
const
|
|
62
|
-
top:
|
|
63
|
-
bottom:
|
|
64
|
-
left:
|
|
65
|
-
right:
|
|
66
|
-
},
|
|
61
|
+
const oe = {
|
|
62
|
+
top: me,
|
|
63
|
+
bottom: be,
|
|
64
|
+
left: we,
|
|
65
|
+
right: he
|
|
66
|
+
}, se = {
|
|
67
67
|
start: "",
|
|
68
|
-
center:
|
|
69
|
-
end:
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
M.includes("hover") &&
|
|
75
|
-
A &&
|
|
68
|
+
center: ge,
|
|
69
|
+
end: ye
|
|
70
|
+
}, ae = typeof b == "boolean" ? b : !!b, le = [
|
|
71
|
+
fe,
|
|
72
|
+
oe[f],
|
|
73
|
+
se[o],
|
|
74
|
+
M.includes("hover") && De,
|
|
75
|
+
A && Ie,
|
|
76
76
|
k
|
|
77
|
-
].filter(Boolean).join(" "),
|
|
77
|
+
].filter(Boolean).join(" "), ce = () => l ? l.map((n, E) => {
|
|
78
78
|
if ("type" in n && n.type === "divider")
|
|
79
|
-
return /* @__PURE__ */
|
|
80
|
-
const
|
|
81
|
-
return
|
|
79
|
+
return /* @__PURE__ */ u(Y, {}, n.key || `divider-${E}`);
|
|
80
|
+
const d = n;
|
|
81
|
+
return d.children && d.children.length > 0 ? /* @__PURE__ */ u(
|
|
82
82
|
_,
|
|
83
83
|
{
|
|
84
|
-
title:
|
|
85
|
-
icon:
|
|
86
|
-
disabled:
|
|
87
|
-
children:
|
|
84
|
+
title: d.label,
|
|
85
|
+
icon: d.icon,
|
|
86
|
+
disabled: d.disabled,
|
|
87
|
+
children: d.children.map((K) => /* @__PURE__ */ u(
|
|
88
88
|
O,
|
|
89
89
|
{
|
|
90
|
-
icon:
|
|
91
|
-
disabled:
|
|
92
|
-
danger:
|
|
93
|
-
onClick:
|
|
94
|
-
children:
|
|
90
|
+
icon: K.icon,
|
|
91
|
+
disabled: K.disabled,
|
|
92
|
+
danger: K.danger,
|
|
93
|
+
onClick: K.onClick,
|
|
94
|
+
children: K.label
|
|
95
95
|
},
|
|
96
|
-
|
|
96
|
+
K.key
|
|
97
97
|
))
|
|
98
98
|
},
|
|
99
|
-
|
|
100
|
-
) : /* @__PURE__ */
|
|
99
|
+
d.key
|
|
100
|
+
) : /* @__PURE__ */ u(
|
|
101
101
|
O,
|
|
102
102
|
{
|
|
103
|
-
icon:
|
|
104
|
-
disabled:
|
|
105
|
-
danger:
|
|
106
|
-
onClick:
|
|
107
|
-
children:
|
|
103
|
+
icon: d.icon,
|
|
104
|
+
disabled: d.disabled,
|
|
105
|
+
danger: d.danger,
|
|
106
|
+
onClick: d.onClick,
|
|
107
|
+
children: d.label
|
|
108
108
|
},
|
|
109
|
-
|
|
109
|
+
d.key
|
|
110
110
|
);
|
|
111
|
-
}) : null,
|
|
111
|
+
}) : null, ie = l ? /* @__PURE__ */ B(de, { children: [
|
|
112
112
|
y.Children.toArray(a).find(
|
|
113
|
-
(n) => y.isValidElement(n) && n.type ===
|
|
113
|
+
(n) => y.isValidElement(n) && n.type === Q
|
|
114
114
|
),
|
|
115
|
-
(
|
|
115
|
+
(Z || !r) && /* @__PURE__ */ u(X, { children: ce() })
|
|
116
116
|
] }) : a;
|
|
117
|
-
return /* @__PURE__ */
|
|
118
|
-
|
|
117
|
+
return /* @__PURE__ */ u(
|
|
118
|
+
J.Provider,
|
|
119
119
|
{
|
|
120
120
|
value: {
|
|
121
|
-
position:
|
|
121
|
+
position: f,
|
|
122
122
|
align: o,
|
|
123
|
-
menuId:
|
|
123
|
+
menuId: $,
|
|
124
124
|
triggerId: v,
|
|
125
125
|
isOpen: A,
|
|
126
126
|
setIsOpen: g,
|
|
127
127
|
focusedIndex: i,
|
|
128
128
|
setFocusedIndex: x,
|
|
129
|
-
registerItem:
|
|
129
|
+
registerItem: ee,
|
|
130
130
|
itemCount: T,
|
|
131
131
|
setItemCount: P,
|
|
132
132
|
disabled: m,
|
|
133
|
-
arrow:
|
|
134
|
-
closeDropdown:
|
|
133
|
+
arrow: ae,
|
|
134
|
+
closeDropdown: H
|
|
135
135
|
},
|
|
136
|
-
children: /* @__PURE__ */
|
|
136
|
+
children: /* @__PURE__ */ u(
|
|
137
137
|
"div",
|
|
138
138
|
{
|
|
139
|
-
ref:
|
|
140
|
-
className:
|
|
139
|
+
ref: U,
|
|
140
|
+
className: le,
|
|
141
141
|
"data-state": A ? "open" : "closed",
|
|
142
142
|
"aria-disabled": m || void 0,
|
|
143
|
-
onMouseEnter:
|
|
144
|
-
onMouseLeave:
|
|
145
|
-
onContextMenu:
|
|
143
|
+
onMouseEnter: ne,
|
|
144
|
+
onMouseLeave: te,
|
|
145
|
+
onContextMenu: re,
|
|
146
146
|
...S,
|
|
147
|
-
children:
|
|
147
|
+
children: ie
|
|
148
148
|
}
|
|
149
149
|
)
|
|
150
150
|
}
|
|
151
151
|
);
|
|
152
152
|
}
|
|
153
|
-
function
|
|
154
|
-
const { menuId:
|
|
153
|
+
function Q({ children: a, className: l = "" }) {
|
|
154
|
+
const { menuId: D, triggerId: p, isOpen: f, setIsOpen: o, setFocusedIndex: s, itemCount: t, disabled: m } = V(), b = (r) => {
|
|
155
155
|
switch (r.key) {
|
|
156
156
|
case "Enter":
|
|
157
157
|
case " ":
|
|
@@ -166,14 +166,14 @@ function J({ children: a, className: l = "" }) {
|
|
|
166
166
|
break;
|
|
167
167
|
}
|
|
168
168
|
}, w = () => {
|
|
169
|
-
o(!
|
|
169
|
+
o(!f), f || s(0);
|
|
170
170
|
}, c = y.Children.only(a), h = c.props;
|
|
171
171
|
return y.cloneElement(c, {
|
|
172
|
-
id:
|
|
172
|
+
id: p,
|
|
173
173
|
tabIndex: m ? -1 : 0,
|
|
174
174
|
"aria-haspopup": "menu",
|
|
175
|
-
"aria-expanded":
|
|
176
|
-
"aria-controls":
|
|
175
|
+
"aria-expanded": f,
|
|
176
|
+
"aria-controls": D,
|
|
177
177
|
onClick: (r) => {
|
|
178
178
|
w(), h.onClick?.(r);
|
|
179
179
|
},
|
|
@@ -183,15 +183,15 @@ function J({ children: a, className: l = "" }) {
|
|
|
183
183
|
className: `${h.className || ""} ${l}`.trim()
|
|
184
184
|
});
|
|
185
185
|
}
|
|
186
|
-
function
|
|
187
|
-
const { menuId:
|
|
186
|
+
function X({ children: a, className: l = "" }) {
|
|
187
|
+
const { menuId: D, triggerId: p, isOpen: f, setIsOpen: o, focusedIndex: s, setFocusedIndex: t, setItemCount: m, arrow: b, position: w } = V(), c = R(null), h = y.Children.toArray(a).filter(
|
|
188
188
|
(e) => y.isValidElement(e) && e.type === O
|
|
189
189
|
);
|
|
190
|
-
|
|
190
|
+
j(() => {
|
|
191
191
|
m(h.length);
|
|
192
|
-
}, [h.length, m]),
|
|
193
|
-
|
|
194
|
-
}, [
|
|
192
|
+
}, [h.length, m]), j(() => {
|
|
193
|
+
f && s >= 0 && c.current && c.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[s]?.focus();
|
|
194
|
+
}, [f, s]);
|
|
195
195
|
const r = (e) => {
|
|
196
196
|
const i = h.filter(
|
|
197
197
|
(x) => y.isValidElement(x) && !x.props.disabled
|
|
@@ -210,30 +210,30 @@ function Q({ children: a, className: l = "" }) {
|
|
|
210
210
|
e.preventDefault(), t(i - 1);
|
|
211
211
|
break;
|
|
212
212
|
case "Escape":
|
|
213
|
-
e.preventDefault(), o(!1), t(-1), document.getElementById(
|
|
213
|
+
e.preventDefault(), o(!1), t(-1), document.getElementById(p)?.focus();
|
|
214
214
|
break;
|
|
215
215
|
case "Tab":
|
|
216
216
|
o(!1), t(-1);
|
|
217
217
|
break;
|
|
218
218
|
}
|
|
219
219
|
}, k = [
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
ke,
|
|
221
|
+
G,
|
|
222
222
|
"bg-base-100",
|
|
223
223
|
"rounded-box",
|
|
224
224
|
"z-50",
|
|
225
225
|
"shadow",
|
|
226
226
|
l
|
|
227
|
-
].filter(Boolean).join(" "), S = y.Children.map(a, (e,
|
|
227
|
+
].filter(Boolean).join(" "), S = y.Children.map(a, (e, I) => {
|
|
228
228
|
if (y.isValidElement(e)) {
|
|
229
229
|
const i = e.key != null ? String(e.key) : void 0;
|
|
230
230
|
if (e.type === O)
|
|
231
|
-
return y.cloneElement(e, { _index:
|
|
231
|
+
return y.cloneElement(e, { _index: I, _key: i });
|
|
232
232
|
if (e.type === _)
|
|
233
233
|
return y.cloneElement(e, { _key: i });
|
|
234
234
|
}
|
|
235
235
|
return e;
|
|
236
|
-
}), v = b ? /* @__PURE__ */
|
|
236
|
+
}), v = b ? /* @__PURE__ */ u(
|
|
237
237
|
"span",
|
|
238
238
|
{
|
|
239
239
|
className: `absolute w-0 h-0 border-8 border-solid ${{
|
|
@@ -249,9 +249,9 @@ function Q({ children: a, className: l = "" }) {
|
|
|
249
249
|
"ul",
|
|
250
250
|
{
|
|
251
251
|
ref: c,
|
|
252
|
-
id:
|
|
252
|
+
id: D,
|
|
253
253
|
role: "menu",
|
|
254
|
-
"aria-labelledby":
|
|
254
|
+
"aria-labelledby": p,
|
|
255
255
|
tabIndex: -1,
|
|
256
256
|
className: `${k} ${b ? "relative" : ""}`,
|
|
257
257
|
onKeyDown: r,
|
|
@@ -265,18 +265,18 @@ function Q({ children: a, className: l = "" }) {
|
|
|
265
265
|
function O({
|
|
266
266
|
children: a,
|
|
267
267
|
icon: l,
|
|
268
|
-
label:
|
|
269
|
-
onClick:
|
|
270
|
-
active:
|
|
268
|
+
label: D,
|
|
269
|
+
onClick: p,
|
|
270
|
+
active: f = !1,
|
|
271
271
|
disabled: o = !1,
|
|
272
272
|
danger: s = !1,
|
|
273
273
|
className: t = "",
|
|
274
274
|
_key: m
|
|
275
275
|
}) {
|
|
276
|
-
const { closeDropdown: b } = V(), w = [
|
|
277
|
-
o || (
|
|
276
|
+
const { closeDropdown: b } = V(), w = [f && "active", o && "disabled", t].filter(Boolean).join(" "), c = () => {
|
|
277
|
+
o || (p?.(), b());
|
|
278
278
|
};
|
|
279
|
-
return /* @__PURE__ */
|
|
279
|
+
return /* @__PURE__ */ u("li", { className: w, role: "none", "data-key": m, children: /* @__PURE__ */ B(
|
|
280
280
|
"a",
|
|
281
281
|
{
|
|
282
282
|
role: "menuitem",
|
|
@@ -288,8 +288,8 @@ function O({
|
|
|
288
288
|
(k.key === "Enter" || k.key === " ") && !o && (k.preventDefault(), c());
|
|
289
289
|
},
|
|
290
290
|
children: [
|
|
291
|
-
l && /* @__PURE__ */
|
|
292
|
-
|
|
291
|
+
l && /* @__PURE__ */ u("span", { className: "mr-2 inline-flex items-center", children: l }),
|
|
292
|
+
D || a
|
|
293
293
|
]
|
|
294
294
|
}
|
|
295
295
|
) });
|
|
@@ -297,13 +297,13 @@ function O({
|
|
|
297
297
|
function _({
|
|
298
298
|
children: a,
|
|
299
299
|
title: l,
|
|
300
|
-
icon:
|
|
301
|
-
disabled:
|
|
302
|
-
className:
|
|
300
|
+
icon: D,
|
|
301
|
+
disabled: p = !1,
|
|
302
|
+
className: f = "",
|
|
303
303
|
_key: o
|
|
304
304
|
}) {
|
|
305
|
-
const [s, t] =
|
|
306
|
-
|
|
305
|
+
const [s, t] = L(!1), m = R(null), b = R(null), w = R(null), c = q(), h = () => {
|
|
306
|
+
p || t(!0);
|
|
307
307
|
}, r = () => {
|
|
308
308
|
t(!1);
|
|
309
309
|
}, k = () => {
|
|
@@ -311,7 +311,7 @@ function _({
|
|
|
311
311
|
w.current?.querySelector('[role="menuitem"]:not([aria-disabled="true"])')?.focus();
|
|
312
312
|
}, 0);
|
|
313
313
|
}, S = (e) => {
|
|
314
|
-
if (!
|
|
314
|
+
if (!p)
|
|
315
315
|
switch (e.key) {
|
|
316
316
|
case "ArrowRight":
|
|
317
317
|
case "Enter":
|
|
@@ -323,7 +323,7 @@ function _({
|
|
|
323
323
|
e.preventDefault(), e.stopPropagation(), t(!1);
|
|
324
324
|
break;
|
|
325
325
|
}
|
|
326
|
-
},
|
|
326
|
+
}, $ = (e) => {
|
|
327
327
|
switch (e.key) {
|
|
328
328
|
case "ArrowLeft":
|
|
329
329
|
case "Escape":
|
|
@@ -331,10 +331,10 @@ function _({
|
|
|
331
331
|
break;
|
|
332
332
|
case "ArrowDown":
|
|
333
333
|
e.preventDefault(), e.stopPropagation();
|
|
334
|
-
const
|
|
335
|
-
if (
|
|
336
|
-
const T = (Array.from(
|
|
337
|
-
|
|
334
|
+
const I = w.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
|
|
335
|
+
if (I) {
|
|
336
|
+
const T = (Array.from(I).findIndex((P) => P === document.activeElement) + 1) % I.length;
|
|
337
|
+
I[T]?.focus();
|
|
338
338
|
}
|
|
339
339
|
break;
|
|
340
340
|
case "ArrowUp":
|
|
@@ -346,8 +346,8 @@ function _({
|
|
|
346
346
|
}
|
|
347
347
|
break;
|
|
348
348
|
}
|
|
349
|
-
}, v = [
|
|
350
|
-
return /* @__PURE__ */
|
|
349
|
+
}, v = [p && "disabled", f].filter(Boolean).join(" ");
|
|
350
|
+
return /* @__PURE__ */ u(
|
|
351
351
|
"li",
|
|
352
352
|
{
|
|
353
353
|
ref: m,
|
|
@@ -362,27 +362,27 @@ function _({
|
|
|
362
362
|
{
|
|
363
363
|
ref: b,
|
|
364
364
|
role: "menuitem",
|
|
365
|
-
tabIndex:
|
|
366
|
-
"aria-disabled":
|
|
365
|
+
tabIndex: p ? -1 : 0,
|
|
366
|
+
"aria-disabled": p || void 0,
|
|
367
367
|
"aria-haspopup": "menu",
|
|
368
368
|
"aria-expanded": s,
|
|
369
369
|
"aria-controls": c,
|
|
370
370
|
onKeyDown: S,
|
|
371
371
|
children: [
|
|
372
|
-
|
|
372
|
+
D && /* @__PURE__ */ u("span", { className: "mr-2 inline-flex items-center", children: D }),
|
|
373
373
|
l
|
|
374
374
|
]
|
|
375
375
|
}
|
|
376
376
|
),
|
|
377
|
-
/* @__PURE__ */
|
|
377
|
+
/* @__PURE__ */ u(
|
|
378
378
|
"ul",
|
|
379
379
|
{
|
|
380
380
|
ref: w,
|
|
381
381
|
id: c,
|
|
382
|
-
className:
|
|
382
|
+
className: `${G} bg-base-100 rounded-box z-50 shadow`,
|
|
383
383
|
role: "menu",
|
|
384
384
|
"aria-label": typeof l == "string" ? l : void 0,
|
|
385
|
-
onKeyDown:
|
|
385
|
+
onKeyDown: $,
|
|
386
386
|
children: a
|
|
387
387
|
}
|
|
388
388
|
)
|
|
@@ -390,18 +390,18 @@ function _({
|
|
|
390
390
|
}
|
|
391
391
|
);
|
|
392
392
|
}
|
|
393
|
-
function
|
|
393
|
+
function Y({ className: a = "" }) {
|
|
394
394
|
const l = ["border-base-content/10", a].filter(Boolean).join(" ");
|
|
395
|
-
return /* @__PURE__ */
|
|
395
|
+
return /* @__PURE__ */ u("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ u("hr", { className: l }) });
|
|
396
396
|
}
|
|
397
|
-
const
|
|
398
|
-
Trigger:
|
|
399
|
-
Menu:
|
|
397
|
+
const ve = Object.assign(xe, {
|
|
398
|
+
Trigger: Q,
|
|
399
|
+
Menu: X,
|
|
400
400
|
Item: O,
|
|
401
401
|
SubMenu: _,
|
|
402
|
-
Divider:
|
|
402
|
+
Divider: Y
|
|
403
403
|
});
|
|
404
404
|
export {
|
|
405
|
-
|
|
405
|
+
ve as Dropdown
|
|
406
406
|
};
|
|
407
407
|
//# sourceMappingURL=Dropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\n// Types for data-driven items prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n closeDropdown: () => void\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: DropdownMenuItemType[]\n /** @deprecated Use trigger={['hover']} instead */\n hover?: boolean\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children?: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n items,\n hover = false,\n trigger = ['click'],\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer,\n destroyOnHidden = false,\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Normalize trigger - support both hover boolean (deprecated) and trigger array\n const triggers = hover ? ['hover'] : trigger\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean, source: 'trigger' | 'menu' = 'trigger') => {\n if (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [disabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: 'dropdown-top',\n bottom: 'dropdown-bottom',\n left: 'dropdown-left',\n right: 'dropdown-right',\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: 'dropdown-center',\n end: 'dropdown-end',\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n const dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && 'dropdown-hover',\n isOpen && 'dropdown-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Render items from data-driven prop\n const renderItems = () => {\n if (!items) return null\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or items-generated menu\n const content = items ? (\n <>\n {React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )}\n {(shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )}\n </>\n ) : (\n children\n )\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled,\n arrow: showArrow,\n closeDropdown,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n aria-disabled={disabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n 'dropdown-content',\n 'menu',\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n closeDropdown()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className=\"menu bg-base-100 rounded-box z-50 shadow\"\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","items","hover","trigger","position","align","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","getPopupContainer","destroyOnHidden","className","rest","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","ref","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","dropdownClasses","renderItems","item","DropdownDivider","menuItem","jsx","DropdownSubMenu","child","DropdownItem","content","jsxs","Fragment","React","DropdownTrigger","DropdownMenu","handleKeyDown","handleClick","childProps","e","menuRef","childArray","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownTop = 'dropdown-top'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownLeft = 'dropdown-left'\nconst dDropdownRight = 'dropdown-right'\nconst dDropdownCenter = 'dropdown-center'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownHover = 'dropdown-hover'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\n\n// Types for data-driven items prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n closeDropdown: () => void\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: DropdownMenuItemType[]\n /** @deprecated Use trigger={['hover']} instead */\n hover?: boolean\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children?: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n items,\n hover = false,\n trigger = ['click'],\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer,\n destroyOnHidden = false,\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Normalize trigger - support both hover boolean (deprecated) and trigger array\n const triggers = hover ? ['hover'] : trigger\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean, source: 'trigger' | 'menu' = 'trigger') => {\n if (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [disabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: dDropdownTop,\n bottom: dDropdownBottom,\n left: dDropdownLeft,\n right: dDropdownRight,\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: dDropdownCenter,\n end: dDropdownEnd,\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Render items from data-driven prop\n const renderItems = () => {\n if (!items) return null\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or items-generated menu\n const content = items ? (\n <>\n {React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )}\n {(shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )}\n </>\n ) : (\n children\n )\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled,\n arrow: showArrow,\n closeDropdown,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n aria-disabled={disabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n dDropdownContent,\n dMenu,\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n closeDropdown()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className={`${dMenu} bg-base-100 rounded-box z-50 shadow`}\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["dDropdown","dDropdownTop","dDropdownBottom","dDropdownLeft","dDropdownRight","dDropdownCenter","dDropdownEnd","dDropdownHover","dDropdownOpen","dDropdownContent","dMenu","DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","items","hover","trigger","position","align","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","getPopupContainer","destroyOnHidden","className","rest","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","ref","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","dropdownClasses","renderItems","item","DropdownDivider","menuItem","jsx","DropdownSubMenu","child","DropdownItem","content","jsxs","Fragment","React","DropdownTrigger","DropdownMenu","handleKeyDown","handleClick","childProps","e","menuRef","childArray","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
|