asterui 0.12.75 → 0.12.76
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.
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
export type DropdownTriggerType = 'click' | 'hover' | 'contextMenu';
|
|
3
|
+
export type DropdownPlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right';
|
|
3
4
|
export interface DropdownMenuItem {
|
|
4
5
|
key: string;
|
|
5
6
|
label: React.ReactNode;
|
|
@@ -14,15 +15,30 @@ export interface DropdownMenuDivider {
|
|
|
14
15
|
key?: string;
|
|
15
16
|
}
|
|
16
17
|
export type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider;
|
|
18
|
+
export interface DropdownMenuConfig {
|
|
19
|
+
/** Menu items */
|
|
20
|
+
items: DropdownMenuItemType[];
|
|
21
|
+
/** Callback when menu item is clicked */
|
|
22
|
+
onClick?: (info: {
|
|
23
|
+
key: string;
|
|
24
|
+
keyPath: string[];
|
|
25
|
+
}) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface DropdownMenuProps {
|
|
28
|
+
children?: React.ReactNode;
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
17
31
|
export interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
|
|
18
32
|
/** Trigger element and dropdown content (compound pattern) */
|
|
19
33
|
children?: React.ReactNode;
|
|
20
|
-
/** Menu
|
|
21
|
-
|
|
34
|
+
/** Menu configuration (data-driven pattern) */
|
|
35
|
+
menu?: DropdownMenuConfig;
|
|
22
36
|
/** Trigger mode(s) for dropdown */
|
|
23
37
|
trigger?: DropdownTriggerType[];
|
|
24
|
-
|
|
25
|
-
|
|
38
|
+
/** Placement of dropdown menu */
|
|
39
|
+
placement?: DropdownPlacement;
|
|
40
|
+
/** Whether to adjust dropdown placement automatically when dropdown is off screen */
|
|
41
|
+
autoAdjustOverflow?: boolean;
|
|
26
42
|
/** Controlled open state */
|
|
27
43
|
open?: boolean;
|
|
28
44
|
/** Callback when open state changes */
|
|
@@ -1,87 +1,96 @@
|
|
|
1
|
-
import { jsx as i, jsxs as K, Fragment as
|
|
2
|
-
import
|
|
3
|
-
import { useConfig as
|
|
4
|
-
const
|
|
5
|
-
function
|
|
6
|
-
const
|
|
7
|
-
if (!
|
|
1
|
+
import { jsx as i, jsxs as K, Fragment as Q } from "react/jsx-runtime";
|
|
2
|
+
import u, { forwardRef as xe, useId as X, useState as j, useRef as L, useImperativeHandle as ve, useCallback as O, useEffect as V, createContext as Ee, useContext as Me } from "react";
|
|
3
|
+
import { useConfig as Ae } from "../providers/ConfigProvider.js";
|
|
4
|
+
const Te = "dropdown", Re = "dropdown-top", Se = "dropdown-bottom", Ke = "dropdown-left", Le = "dropdown-right", Ne = "dropdown-center", Pe = "dropdown-end", Oe = "dropdown-hover", $e = "dropdown-open", je = "dropdown-content", ne = "menu", oe = Ee(void 0);
|
|
5
|
+
function Z() {
|
|
6
|
+
const p = Me(oe);
|
|
7
|
+
if (!p)
|
|
8
8
|
throw new Error("Dropdown compound components must be used within Dropdown");
|
|
9
|
-
return
|
|
9
|
+
return p;
|
|
10
10
|
}
|
|
11
|
-
const
|
|
11
|
+
const Be = xe(function({
|
|
12
12
|
children: c,
|
|
13
|
-
|
|
14
|
-
trigger:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
open:
|
|
18
|
-
onOpenChange:
|
|
19
|
-
disabled:
|
|
13
|
+
menu: f,
|
|
14
|
+
trigger: m = ["hover"],
|
|
15
|
+
placement: y = "bottomLeft",
|
|
16
|
+
autoAdjustOverflow: l = !0,
|
|
17
|
+
open: r,
|
|
18
|
+
onOpenChange: o,
|
|
19
|
+
disabled: d,
|
|
20
20
|
arrow: w = !1,
|
|
21
|
-
mouseEnterDelay:
|
|
22
|
-
mouseLeaveDelay:
|
|
23
|
-
getPopupContainer:
|
|
24
|
-
destroyOnHidden:
|
|
25
|
-
popupRender:
|
|
26
|
-
"data-testid":
|
|
27
|
-
className:
|
|
21
|
+
mouseEnterDelay: g = 0.15,
|
|
22
|
+
mouseLeaveDelay: h = 0.1,
|
|
23
|
+
getPopupContainer: I,
|
|
24
|
+
destroyOnHidden: n = !1,
|
|
25
|
+
popupRender: v,
|
|
26
|
+
"data-testid": E,
|
|
27
|
+
className: C = "",
|
|
28
28
|
...F
|
|
29
|
-
},
|
|
30
|
-
const { componentDisabled:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
}, s) {
|
|
30
|
+
const { componentDisabled: t } = Ae(), b = d ?? t ?? !1, k = {
|
|
31
|
+
top: { position: "top", align: "center" },
|
|
32
|
+
topLeft: { position: "top", align: "start" },
|
|
33
|
+
topRight: { position: "top", align: "end" },
|
|
34
|
+
bottom: { position: "bottom", align: "center" },
|
|
35
|
+
bottomLeft: { position: "bottom", align: "start" },
|
|
36
|
+
bottomRight: { position: "bottom", align: "end" },
|
|
37
|
+
left: { position: "left", align: "start" },
|
|
38
|
+
right: { position: "right", align: "start" }
|
|
39
|
+
}, { position: M, align: N } = k[y], se = X(), G = X(), [ae, ie] = j(!1), [le, q] = j(-1), [ce, de] = j(0), [ue, ee] = j(!n), te = L(/* @__PURE__ */ new Map()), z = L(null), A = L(null), R = m;
|
|
40
|
+
ve(s, () => z.current, []);
|
|
41
|
+
const pe = (e) => E ? `${E}-${e}` : void 0, H = r !== void 0, S = H ? r : ae, x = O((e, D = "trigger") => {
|
|
42
|
+
b || (H || ie(e), e && ee(!0), o?.(e, { source: D }));
|
|
43
|
+
}, [b, H, o]), fe = O(() => {
|
|
44
|
+
x(!1, "menu"), q(-1), document.getElementById(G)?.focus();
|
|
45
|
+
}, [x, G]), me = O((e, D, a) => {
|
|
46
|
+
D ? te.current.set(e, { ref: D, disabled: a }) : te.current.delete(e);
|
|
38
47
|
}, []);
|
|
39
48
|
V(() => {
|
|
40
|
-
if (
|
|
41
|
-
const e = setTimeout(() =>
|
|
49
|
+
if (n && !S) {
|
|
50
|
+
const e = setTimeout(() => ee(!1), 300);
|
|
42
51
|
return () => clearTimeout(e);
|
|
43
52
|
}
|
|
44
|
-
}, [S,
|
|
53
|
+
}, [S, n]), V(() => {
|
|
45
54
|
const e = (D) => {
|
|
46
|
-
z.current && !z.current.contains(D.target) && (
|
|
55
|
+
z.current && !z.current.contains(D.target) && (x(!1, "trigger"), q(-1));
|
|
47
56
|
};
|
|
48
57
|
if (S)
|
|
49
58
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
50
|
-
}, [S,
|
|
51
|
-
const
|
|
52
|
-
R.includes("hover") && (
|
|
53
|
-
|
|
59
|
+
}, [S, x]);
|
|
60
|
+
const be = O(() => {
|
|
61
|
+
R.includes("hover") && (A.current && clearTimeout(A.current), A.current = setTimeout(() => {
|
|
62
|
+
x(!0, "trigger");
|
|
63
|
+
}, g * 1e3));
|
|
64
|
+
}, [R, g, x]), we = O(() => {
|
|
65
|
+
R.includes("hover") && (A.current && clearTimeout(A.current), A.current = setTimeout(() => {
|
|
66
|
+
x(!1, "trigger"), q(-1);
|
|
54
67
|
}, h * 1e3));
|
|
55
|
-
}, [R, h,
|
|
56
|
-
R.includes("
|
|
57
|
-
|
|
58
|
-
}, I * 1e3));
|
|
59
|
-
}, [R, I, k]), me = $((e) => {
|
|
60
|
-
R.includes("contextMenu") && (e.preventDefault(), k(!0, "trigger"));
|
|
61
|
-
}, [R, k]);
|
|
68
|
+
}, [R, h, x]), ge = O((e) => {
|
|
69
|
+
R.includes("contextMenu") && (e.preventDefault(), x(!0, "trigger"));
|
|
70
|
+
}, [R, x]);
|
|
62
71
|
V(() => () => {
|
|
63
|
-
|
|
72
|
+
A.current && clearTimeout(A.current);
|
|
64
73
|
}, []);
|
|
65
|
-
const
|
|
66
|
-
top:
|
|
67
|
-
bottom:
|
|
68
|
-
left:
|
|
69
|
-
right:
|
|
70
|
-
},
|
|
74
|
+
const he = {
|
|
75
|
+
top: Re,
|
|
76
|
+
bottom: Se,
|
|
77
|
+
left: Ke,
|
|
78
|
+
right: Le
|
|
79
|
+
}, De = {
|
|
71
80
|
start: "",
|
|
72
|
-
center:
|
|
73
|
-
end:
|
|
74
|
-
},
|
|
81
|
+
center: Ne,
|
|
82
|
+
end: Pe
|
|
83
|
+
}, ye = typeof w == "boolean" ? w : !!w, W = f ? (ue || !n) && /* @__PURE__ */ i(Y, { children: f?.items ? f.items.map((e, D) => {
|
|
75
84
|
if ("type" in e && e.type === "divider")
|
|
76
85
|
return /* @__PURE__ */ i(re, {}, e.key || `divider-${D}`);
|
|
77
|
-
const
|
|
78
|
-
return
|
|
79
|
-
|
|
86
|
+
const a = e;
|
|
87
|
+
return a.children && a.children.length > 0 ? /* @__PURE__ */ i(
|
|
88
|
+
_,
|
|
80
89
|
{
|
|
81
|
-
title:
|
|
82
|
-
icon:
|
|
83
|
-
disabled:
|
|
84
|
-
children:
|
|
90
|
+
title: a.label,
|
|
91
|
+
icon: a.icon,
|
|
92
|
+
disabled: a.disabled,
|
|
93
|
+
children: a.children.map((P) => /* @__PURE__ */ i(
|
|
85
94
|
U,
|
|
86
95
|
{
|
|
87
96
|
icon: P.icon,
|
|
@@ -93,174 +102,175 @@ const Le = Ie(function({
|
|
|
93
102
|
P.key
|
|
94
103
|
))
|
|
95
104
|
},
|
|
96
|
-
|
|
105
|
+
a.key
|
|
97
106
|
) : /* @__PURE__ */ i(
|
|
98
107
|
U,
|
|
99
108
|
{
|
|
100
|
-
icon:
|
|
101
|
-
disabled:
|
|
102
|
-
danger:
|
|
103
|
-
onClick:
|
|
104
|
-
children:
|
|
109
|
+
icon: a.icon,
|
|
110
|
+
disabled: a.disabled,
|
|
111
|
+
danger: a.danger,
|
|
112
|
+
onClick: a.onClick,
|
|
113
|
+
children: a.label
|
|
105
114
|
},
|
|
106
|
-
|
|
115
|
+
a.key
|
|
107
116
|
);
|
|
108
|
-
}) : null }) : null,
|
|
109
|
-
(e) =>
|
|
110
|
-
),
|
|
111
|
-
(e) =>
|
|
117
|
+
}) : null }) : null, T = u.Children.toArray(c), Ie = T.some(
|
|
118
|
+
(e) => u.isValidElement(e) && e.type === B
|
|
119
|
+
), Ce = T.some(
|
|
120
|
+
(e) => u.isValidElement(e) && e.type === Y
|
|
112
121
|
);
|
|
113
|
-
let
|
|
114
|
-
if (
|
|
115
|
-
const e =
|
|
116
|
-
(D) =>
|
|
122
|
+
let $, J = !1;
|
|
123
|
+
if (f) {
|
|
124
|
+
const e = T.find(
|
|
125
|
+
(D) => u.isValidElement(D) && D.type === B
|
|
117
126
|
);
|
|
118
|
-
!e &&
|
|
119
|
-
/* @__PURE__ */ i(
|
|
120
|
-
|
|
121
|
-
] })) :
|
|
127
|
+
!e && T[0] && u.isValidElement(T[0]) ? (J = !0, $ = /* @__PURE__ */ K(Q, { children: [
|
|
128
|
+
/* @__PURE__ */ i(B, { className: C, children: T[0] }),
|
|
129
|
+
v ? v(W) : W
|
|
130
|
+
] })) : $ = /* @__PURE__ */ K(Q, { children: [
|
|
122
131
|
e,
|
|
123
|
-
|
|
132
|
+
v ? v(W) : W
|
|
124
133
|
] });
|
|
125
|
-
} else if (!
|
|
126
|
-
const [e, D, ...
|
|
127
|
-
|
|
128
|
-
e &&
|
|
134
|
+
} else if (!Ie && !Ce && T.length >= 2) {
|
|
135
|
+
const [e, D, ...a] = T;
|
|
136
|
+
J = !0, $ = /* @__PURE__ */ K(Q, { children: [
|
|
137
|
+
e && u.isValidElement(e) && /* @__PURE__ */ i(B, { className: C, children: e }),
|
|
129
138
|
D,
|
|
130
|
-
|
|
139
|
+
a
|
|
131
140
|
] });
|
|
132
141
|
} else
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
R.includes("hover") &&
|
|
139
|
-
S &&
|
|
140
|
-
!
|
|
142
|
+
$ = c;
|
|
143
|
+
const ke = [
|
|
144
|
+
Te,
|
|
145
|
+
he[M],
|
|
146
|
+
De[N],
|
|
147
|
+
R.includes("hover") && Oe,
|
|
148
|
+
S && $e,
|
|
149
|
+
!J && C
|
|
141
150
|
].filter(Boolean).join(" ");
|
|
142
151
|
return /* @__PURE__ */ i(
|
|
143
|
-
|
|
152
|
+
oe.Provider,
|
|
144
153
|
{
|
|
145
154
|
value: {
|
|
146
|
-
position:
|
|
147
|
-
align:
|
|
148
|
-
menuId:
|
|
149
|
-
triggerId:
|
|
155
|
+
position: M,
|
|
156
|
+
align: N,
|
|
157
|
+
menuId: se,
|
|
158
|
+
triggerId: G,
|
|
150
159
|
isOpen: S,
|
|
151
|
-
setIsOpen:
|
|
152
|
-
focusedIndex:
|
|
160
|
+
setIsOpen: x,
|
|
161
|
+
focusedIndex: le,
|
|
153
162
|
setFocusedIndex: q,
|
|
154
|
-
registerItem:
|
|
155
|
-
itemCount:
|
|
156
|
-
setItemCount:
|
|
157
|
-
disabled:
|
|
158
|
-
arrow:
|
|
159
|
-
closeDropdown:
|
|
160
|
-
getTestId:
|
|
163
|
+
registerItem: me,
|
|
164
|
+
itemCount: ce,
|
|
165
|
+
setItemCount: de,
|
|
166
|
+
disabled: b,
|
|
167
|
+
arrow: ye,
|
|
168
|
+
closeDropdown: fe,
|
|
169
|
+
getTestId: pe,
|
|
170
|
+
menuOnClick: f?.onClick
|
|
161
171
|
},
|
|
162
172
|
children: /* @__PURE__ */ i(
|
|
163
173
|
"div",
|
|
164
174
|
{
|
|
165
175
|
ref: z,
|
|
166
|
-
className:
|
|
176
|
+
className: ke,
|
|
167
177
|
"data-state": S ? "open" : "closed",
|
|
168
|
-
"data-testid":
|
|
169
|
-
"aria-disabled":
|
|
170
|
-
onMouseEnter:
|
|
171
|
-
onMouseLeave:
|
|
172
|
-
onContextMenu:
|
|
178
|
+
"data-testid": E,
|
|
179
|
+
"aria-disabled": b || void 0,
|
|
180
|
+
onMouseEnter: be,
|
|
181
|
+
onMouseLeave: we,
|
|
182
|
+
onContextMenu: ge,
|
|
173
183
|
...F,
|
|
174
|
-
children:
|
|
184
|
+
children: $
|
|
175
185
|
}
|
|
176
186
|
)
|
|
177
187
|
}
|
|
178
188
|
);
|
|
179
189
|
});
|
|
180
|
-
function
|
|
181
|
-
const { menuId:
|
|
182
|
-
switch (
|
|
190
|
+
function B({ children: p, className: c = "" }) {
|
|
191
|
+
const { menuId: f, triggerId: m, isOpen: y, setIsOpen: l, setFocusedIndex: r, itemCount: o, disabled: d } = Z(), w = (n) => {
|
|
192
|
+
switch (n.key) {
|
|
183
193
|
case "Enter":
|
|
184
194
|
case " ":
|
|
185
195
|
case "ArrowDown":
|
|
186
|
-
|
|
196
|
+
n.preventDefault(), l(!0), r(0);
|
|
187
197
|
break;
|
|
188
198
|
case "ArrowUp":
|
|
189
|
-
|
|
199
|
+
n.preventDefault(), l(!0), r(o - 1);
|
|
190
200
|
break;
|
|
191
201
|
case "Escape":
|
|
192
|
-
|
|
202
|
+
n.preventDefault(), l(!1), r(-1);
|
|
193
203
|
break;
|
|
194
204
|
}
|
|
195
|
-
},
|
|
196
|
-
|
|
197
|
-
},
|
|
198
|
-
return
|
|
199
|
-
id:
|
|
200
|
-
tabIndex:
|
|
205
|
+
}, g = () => {
|
|
206
|
+
l(!y), y || r(0);
|
|
207
|
+
}, h = u.Children.only(p), I = h.props;
|
|
208
|
+
return u.cloneElement(h, {
|
|
209
|
+
id: m,
|
|
210
|
+
tabIndex: d ? -1 : 0,
|
|
201
211
|
"aria-haspopup": "menu",
|
|
202
|
-
"aria-expanded":
|
|
203
|
-
"aria-controls":
|
|
204
|
-
onClick: (
|
|
205
|
-
|
|
212
|
+
"aria-expanded": y,
|
|
213
|
+
"aria-controls": f,
|
|
214
|
+
onClick: (n) => {
|
|
215
|
+
g(), I.onClick?.(n);
|
|
206
216
|
},
|
|
207
|
-
onKeyDown: (
|
|
208
|
-
w(
|
|
217
|
+
onKeyDown: (n) => {
|
|
218
|
+
w(n), I.onKeyDown?.(n);
|
|
209
219
|
},
|
|
210
|
-
className: `${
|
|
220
|
+
className: `${I.className || ""} ${c}`.trim()
|
|
211
221
|
});
|
|
212
222
|
}
|
|
213
|
-
function
|
|
214
|
-
const { menuId:
|
|
215
|
-
(
|
|
223
|
+
function Y({ children: p, className: c = "" }) {
|
|
224
|
+
const { menuId: f, triggerId: m, isOpen: y, setIsOpen: l, focusedIndex: r, setFocusedIndex: o, setItemCount: d, arrow: w, position: g, getTestId: h } = Z(), I = L(null), n = u.Children.toArray(p).filter(
|
|
225
|
+
(t) => u.isValidElement(t) && t.type === U
|
|
216
226
|
);
|
|
217
227
|
V(() => {
|
|
218
|
-
|
|
219
|
-
}, [
|
|
220
|
-
|
|
221
|
-
}, [
|
|
222
|
-
const
|
|
223
|
-
const
|
|
224
|
-
(
|
|
228
|
+
d(n.length);
|
|
229
|
+
}, [n.length, d]), V(() => {
|
|
230
|
+
y && r >= 0 && I.current && I.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[r]?.focus();
|
|
231
|
+
}, [y, r]);
|
|
232
|
+
const v = (t) => {
|
|
233
|
+
const k = n.filter(
|
|
234
|
+
(M) => u.isValidElement(M) && !M.props.disabled
|
|
225
235
|
).length;
|
|
226
|
-
switch (
|
|
236
|
+
switch (t.key) {
|
|
227
237
|
case "ArrowDown":
|
|
228
|
-
|
|
238
|
+
t.preventDefault(), o((r + 1) % k);
|
|
229
239
|
break;
|
|
230
240
|
case "ArrowUp":
|
|
231
|
-
|
|
241
|
+
t.preventDefault(), o((r - 1 + k) % k);
|
|
232
242
|
break;
|
|
233
243
|
case "Home":
|
|
234
|
-
|
|
244
|
+
t.preventDefault(), o(0);
|
|
235
245
|
break;
|
|
236
246
|
case "End":
|
|
237
|
-
|
|
247
|
+
t.preventDefault(), o(k - 1);
|
|
238
248
|
break;
|
|
239
249
|
case "Escape":
|
|
240
|
-
|
|
250
|
+
t.preventDefault(), l(!1), o(-1), document.getElementById(m)?.focus();
|
|
241
251
|
break;
|
|
242
252
|
case "Tab":
|
|
243
|
-
|
|
253
|
+
l(!1), o(-1);
|
|
244
254
|
break;
|
|
245
255
|
}
|
|
246
|
-
},
|
|
247
|
-
|
|
256
|
+
}, E = [
|
|
257
|
+
je,
|
|
248
258
|
ne,
|
|
249
259
|
"bg-base-100",
|
|
250
260
|
"rounded-box",
|
|
251
261
|
"z-50",
|
|
252
262
|
"shadow",
|
|
253
263
|
c
|
|
254
|
-
].filter(Boolean).join(" "),
|
|
255
|
-
if (
|
|
256
|
-
const
|
|
257
|
-
if (
|
|
258
|
-
return
|
|
259
|
-
if (
|
|
260
|
-
return
|
|
264
|
+
].filter(Boolean).join(" "), C = u.Children.map(p, (t, b) => {
|
|
265
|
+
if (u.isValidElement(t)) {
|
|
266
|
+
const k = t.key != null ? String(t.key) : void 0;
|
|
267
|
+
if (t.type === U)
|
|
268
|
+
return u.cloneElement(t, { _index: b, _key: k });
|
|
269
|
+
if (t.type === _)
|
|
270
|
+
return u.cloneElement(t, { _key: k });
|
|
261
271
|
}
|
|
262
|
-
return
|
|
263
|
-
}),
|
|
272
|
+
return t;
|
|
273
|
+
}), s = w ? /* @__PURE__ */ i(
|
|
264
274
|
"span",
|
|
265
275
|
{
|
|
266
276
|
className: `absolute w-0 h-0 border-8 border-solid ${{
|
|
@@ -268,53 +278,53 @@ function Q({ children: u, className: c = "" }) {
|
|
|
268
278
|
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",
|
|
269
279
|
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",
|
|
270
280
|
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"
|
|
271
|
-
}[
|
|
281
|
+
}[g || "bottom"]}`,
|
|
272
282
|
"aria-hidden": "true"
|
|
273
283
|
}
|
|
274
284
|
) : null;
|
|
275
285
|
return /* @__PURE__ */ K(
|
|
276
286
|
"ul",
|
|
277
287
|
{
|
|
278
|
-
ref:
|
|
279
|
-
id:
|
|
288
|
+
ref: I,
|
|
289
|
+
id: f,
|
|
280
290
|
role: "menu",
|
|
281
|
-
"aria-labelledby":
|
|
291
|
+
"aria-labelledby": m,
|
|
282
292
|
tabIndex: -1,
|
|
283
|
-
className: `${
|
|
284
|
-
"data-testid":
|
|
285
|
-
onKeyDown:
|
|
293
|
+
className: `${E} ${w ? "relative" : ""}`,
|
|
294
|
+
"data-testid": h("menu"),
|
|
295
|
+
onKeyDown: v,
|
|
286
296
|
children: [
|
|
287
|
-
|
|
288
|
-
|
|
297
|
+
s,
|
|
298
|
+
C
|
|
289
299
|
]
|
|
290
300
|
}
|
|
291
301
|
);
|
|
292
302
|
}
|
|
293
303
|
function U({
|
|
294
|
-
children:
|
|
304
|
+
children: p,
|
|
295
305
|
icon: c,
|
|
296
|
-
label:
|
|
297
|
-
onClick:
|
|
298
|
-
active:
|
|
299
|
-
disabled:
|
|
300
|
-
danger:
|
|
301
|
-
className:
|
|
302
|
-
_key:
|
|
306
|
+
label: f,
|
|
307
|
+
onClick: m,
|
|
308
|
+
active: y = !1,
|
|
309
|
+
disabled: l = !1,
|
|
310
|
+
danger: r = !1,
|
|
311
|
+
className: o = "",
|
|
312
|
+
_key: d
|
|
303
313
|
}) {
|
|
304
|
-
const { closeDropdown: w, getTestId: h } =
|
|
305
|
-
|
|
306
|
-
},
|
|
307
|
-
(C.key === "Enter" || C.key === " ") && !
|
|
308
|
-
}, E =
|
|
309
|
-
return /* @__PURE__ */ i("li", { className: I, role: "none", "data-key":
|
|
314
|
+
const { closeDropdown: w, getTestId: g, menuOnClick: h } = Z(), I = [y && "active", l && "disabled", o].filter(Boolean).join(" "), n = () => {
|
|
315
|
+
l || (m?.(), h && d && h({ key: d, keyPath: [d] }), w());
|
|
316
|
+
}, v = (C) => {
|
|
317
|
+
(C.key === "Enter" || C.key === " ") && !l && (C.preventDefault(), n());
|
|
318
|
+
}, E = f || p;
|
|
319
|
+
return /* @__PURE__ */ i("li", { className: I, role: "none", "data-key": d, "data-testid": d ? g(`item-${d}`) : void 0, children: /* @__PURE__ */ K(
|
|
310
320
|
"a",
|
|
311
321
|
{
|
|
312
322
|
role: "menuitem",
|
|
313
|
-
tabIndex:
|
|
314
|
-
"aria-disabled":
|
|
315
|
-
className: `whitespace-nowrap ${
|
|
316
|
-
onClick:
|
|
317
|
-
onKeyDown:
|
|
323
|
+
tabIndex: l ? -1 : 0,
|
|
324
|
+
"aria-disabled": l || void 0,
|
|
325
|
+
className: `whitespace-nowrap ${r ? "text-error" : ""}`,
|
|
326
|
+
onClick: n,
|
|
327
|
+
onKeyDown: v,
|
|
318
328
|
children: [
|
|
319
329
|
c && /* @__PURE__ */ i("span", { className: "mr-2 inline-flex items-center", children: c }),
|
|
320
330
|
E
|
|
@@ -322,83 +332,83 @@ function U({
|
|
|
322
332
|
}
|
|
323
333
|
) });
|
|
324
334
|
}
|
|
325
|
-
function
|
|
326
|
-
children:
|
|
335
|
+
function _({
|
|
336
|
+
children: p,
|
|
327
337
|
title: c,
|
|
328
|
-
icon:
|
|
329
|
-
disabled:
|
|
330
|
-
className:
|
|
331
|
-
_key:
|
|
338
|
+
icon: f,
|
|
339
|
+
disabled: m = !1,
|
|
340
|
+
className: y = "",
|
|
341
|
+
_key: l
|
|
332
342
|
}) {
|
|
333
|
-
const [
|
|
334
|
-
|
|
335
|
-
},
|
|
336
|
-
|
|
337
|
-
},
|
|
343
|
+
const [r, o] = j(!1), d = L(null), w = L(null), g = L(null), h = X(), I = () => {
|
|
344
|
+
m || o(!0);
|
|
345
|
+
}, n = () => {
|
|
346
|
+
o(!1);
|
|
347
|
+
}, v = () => {
|
|
338
348
|
setTimeout(() => {
|
|
339
|
-
|
|
349
|
+
g.current?.querySelector('[role="menuitem"]:not([aria-disabled="true"])')?.focus();
|
|
340
350
|
}, 0);
|
|
341
|
-
},
|
|
342
|
-
if (!
|
|
343
|
-
switch (
|
|
351
|
+
}, E = (s) => {
|
|
352
|
+
if (!m)
|
|
353
|
+
switch (s.key) {
|
|
344
354
|
case "ArrowRight":
|
|
345
355
|
case "Enter":
|
|
346
356
|
case " ":
|
|
347
|
-
|
|
357
|
+
s.preventDefault(), s.stopPropagation(), o(!0), v();
|
|
348
358
|
break;
|
|
349
359
|
case "ArrowLeft":
|
|
350
360
|
case "Escape":
|
|
351
|
-
|
|
361
|
+
s.preventDefault(), s.stopPropagation(), o(!1);
|
|
352
362
|
break;
|
|
353
363
|
}
|
|
354
|
-
},
|
|
355
|
-
switch (
|
|
364
|
+
}, C = (s) => {
|
|
365
|
+
switch (s.key) {
|
|
356
366
|
case "ArrowLeft":
|
|
357
367
|
case "Escape":
|
|
358
|
-
|
|
368
|
+
s.preventDefault(), s.stopPropagation(), o(!1), w.current?.focus();
|
|
359
369
|
break;
|
|
360
370
|
case "ArrowDown":
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
if (
|
|
364
|
-
const
|
|
365
|
-
|
|
371
|
+
s.preventDefault(), s.stopPropagation();
|
|
372
|
+
const t = g.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
|
|
373
|
+
if (t) {
|
|
374
|
+
const M = (Array.from(t).findIndex((N) => N === document.activeElement) + 1) % t.length;
|
|
375
|
+
t[M]?.focus();
|
|
366
376
|
}
|
|
367
377
|
break;
|
|
368
378
|
case "ArrowUp":
|
|
369
|
-
|
|
370
|
-
const
|
|
371
|
-
if (
|
|
372
|
-
const
|
|
373
|
-
|
|
379
|
+
s.preventDefault(), s.stopPropagation();
|
|
380
|
+
const b = g.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
|
|
381
|
+
if (b) {
|
|
382
|
+
const M = (Array.from(b).findIndex((N) => N === document.activeElement) - 1 + b.length) % b.length;
|
|
383
|
+
b[M]?.focus();
|
|
374
384
|
}
|
|
375
385
|
break;
|
|
376
386
|
}
|
|
377
|
-
}, F = [
|
|
387
|
+
}, F = [m && "disabled", y].filter(Boolean).join(" ");
|
|
378
388
|
return /* @__PURE__ */ i(
|
|
379
389
|
"li",
|
|
380
390
|
{
|
|
381
|
-
ref:
|
|
391
|
+
ref: d,
|
|
382
392
|
className: F,
|
|
383
393
|
role: "none",
|
|
384
|
-
"data-key":
|
|
385
|
-
onMouseEnter:
|
|
386
|
-
onMouseLeave:
|
|
387
|
-
children: /* @__PURE__ */ K("details", { open:
|
|
394
|
+
"data-key": l,
|
|
395
|
+
onMouseEnter: I,
|
|
396
|
+
onMouseLeave: n,
|
|
397
|
+
children: /* @__PURE__ */ K("details", { open: r, children: [
|
|
388
398
|
/* @__PURE__ */ K(
|
|
389
399
|
"summary",
|
|
390
400
|
{
|
|
391
401
|
ref: w,
|
|
392
402
|
role: "menuitem",
|
|
393
|
-
tabIndex:
|
|
394
|
-
"aria-disabled":
|
|
403
|
+
tabIndex: m ? -1 : 0,
|
|
404
|
+
"aria-disabled": m || void 0,
|
|
395
405
|
"aria-haspopup": "menu",
|
|
396
|
-
"aria-expanded":
|
|
397
|
-
"aria-controls":
|
|
406
|
+
"aria-expanded": r,
|
|
407
|
+
"aria-controls": h,
|
|
398
408
|
className: "whitespace-nowrap",
|
|
399
|
-
onKeyDown:
|
|
409
|
+
onKeyDown: E,
|
|
400
410
|
children: [
|
|
401
|
-
|
|
411
|
+
f && /* @__PURE__ */ i("span", { className: "mr-2 inline-flex items-center", children: f }),
|
|
402
412
|
c
|
|
403
413
|
]
|
|
404
414
|
}
|
|
@@ -406,31 +416,31 @@ function Y({
|
|
|
406
416
|
/* @__PURE__ */ i(
|
|
407
417
|
"ul",
|
|
408
418
|
{
|
|
409
|
-
ref:
|
|
410
|
-
id:
|
|
419
|
+
ref: g,
|
|
420
|
+
id: h,
|
|
411
421
|
className: `${ne} bg-base-100 rounded-box z-50 shadow`,
|
|
412
422
|
role: "menu",
|
|
413
423
|
"aria-label": typeof c == "string" ? c : void 0,
|
|
414
|
-
onKeyDown:
|
|
415
|
-
children:
|
|
424
|
+
onKeyDown: C,
|
|
425
|
+
children: p
|
|
416
426
|
}
|
|
417
427
|
)
|
|
418
428
|
] })
|
|
419
429
|
}
|
|
420
430
|
);
|
|
421
431
|
}
|
|
422
|
-
function re({ className:
|
|
423
|
-
const c = ["border-base-content/10",
|
|
432
|
+
function re({ className: p = "" }) {
|
|
433
|
+
const c = ["border-base-content/10", p].filter(Boolean).join(" ");
|
|
424
434
|
return /* @__PURE__ */ i("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ i("hr", { className: c }) });
|
|
425
435
|
}
|
|
426
|
-
const
|
|
427
|
-
Trigger:
|
|
428
|
-
Menu:
|
|
436
|
+
const ze = Object.assign(Be, {
|
|
437
|
+
Trigger: B,
|
|
438
|
+
Menu: Y,
|
|
429
439
|
Item: U,
|
|
430
|
-
SubMenu:
|
|
440
|
+
SubMenu: _,
|
|
431
441
|
Divider: re
|
|
432
442
|
});
|
|
433
443
|
export {
|
|
434
|
-
|
|
444
|
+
ze as Dropdown
|
|
435
445
|
};
|
|
436
446
|
//# 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, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\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 getTestId: (suffix: string) => string | undefined\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 /** 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 /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\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\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n items,\n trigger = ['hover'],\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\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 const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\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 (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, 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 // 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 menuContent = items ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (items) {\n // Data-driven pattern with items prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && className,\n ]\n .filter(Boolean)\n .join(' ')\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: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || 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, getTestId } = 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 data-testid={getTestId('menu')}\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, getTestId } = 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} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${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 className=\"whitespace-nowrap\"\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","forwardRef","children","items","trigger","position","align","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","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, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\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 menu prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\nexport type DropdownPlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right'\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\nexport interface DropdownMenuConfig {\n /** Menu items */\n items: DropdownMenuItemType[]\n /** Callback when menu item is clicked */\n onClick?: (info: { key: string; keyPath: string[] }) => void\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\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 getTestId: (suffix: string) => string | undefined\n menuOnClick?: (info: { key: string; keyPath: string[] }) => 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 configuration (data-driven pattern) */\n menu?: DropdownMenuConfig\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n /** Placement of dropdown menu */\n placement?: DropdownPlacement\n /** Whether to adjust dropdown placement automatically when dropdown is off screen */\n autoAdjustOverflow?: boolean\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 /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\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\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n menu,\n trigger = ['hover'],\n placement = 'bottomLeft',\n autoAdjustOverflow = true,\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\n // TODO: Implement autoAdjustOverflow logic to reposition dropdown when it goes off-screen\n // Currently the prop is accepted but not yet implemented\n\n // Convert placement to position + align\n const placementMap: Record<DropdownPlacement, { position: 'top' | 'bottom' | 'left' | 'right'; align: 'start' | 'center' | 'end' }> = {\n top: { position: 'top', align: 'center' },\n topLeft: { position: 'top', align: 'start' },\n topRight: { position: 'top', align: 'end' },\n bottom: { position: 'bottom', align: 'center' },\n bottomLeft: { position: 'bottom', align: 'start' },\n bottomRight: { position: 'bottom', align: 'end' },\n left: { position: 'left', align: 'start' },\n right: { position: 'right', align: 'start' },\n }\n\n const { position, align } = placementMap[placement]\n\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 const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\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 (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, 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 // Render items from data-driven menu prop\n const renderItems = () => {\n if (!menu?.items) return null\n return menu.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 menu-generated content\n const menuContent = menu ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (menu) {\n // Data-driven pattern with menu prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && className,\n ]\n .filter(Boolean)\n .join(' ')\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: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n menuOnClick: menu?.onClick,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || 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, getTestId } = 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 data-testid={getTestId('menu')}\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, getTestId, menuOnClick } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n // Call menu.onClick if provided\n if (menuOnClick && _key) {\n menuOnClick({ key: _key, keyPath: [_key] })\n }\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} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${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 className=\"whitespace-nowrap\"\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","forwardRef","children","menu","trigger","placement","autoAdjustOverflow","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","placementMap","position","align","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","menuOnClick","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","items","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
|