asterui 0.12.5 → 0.12.6
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/Dropdown.d.ts +9 -1
- package/dist/index37.js +131 -108
- package/dist/index37.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,14 @@ export interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
4
4
|
hover?: boolean;
|
|
5
5
|
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
6
6
|
align?: 'start' | 'center' | 'end';
|
|
7
|
+
/** Controlled open state */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** Callback when open state changes */
|
|
10
|
+
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
/** Disable the dropdown */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** Show arrow pointing to trigger */
|
|
14
|
+
arrow?: boolean;
|
|
7
15
|
}
|
|
8
16
|
export interface DropdownTriggerProps {
|
|
9
17
|
children: React.ReactNode;
|
|
@@ -25,7 +33,7 @@ export interface DropdownItemProps {
|
|
|
25
33
|
export interface DropdownDividerProps {
|
|
26
34
|
className?: string;
|
|
27
35
|
}
|
|
28
|
-
declare function DropdownRoot({ children, hover, position, align, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
declare function DropdownRoot({ children, hover, position, align, open: controlledOpen, onOpenChange, disabled, arrow, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
29
37
|
declare function DropdownTrigger({ children, className }: DropdownTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
30
38
|
declare function DropdownMenu({ children, className }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
31
39
|
declare function DropdownItem({ children, onClick, active, disabled, danger, className, }: DropdownItemProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/index37.js
CHANGED
|
@@ -1,194 +1,217 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
4
|
-
function
|
|
5
|
-
const
|
|
6
|
-
if (!
|
|
1
|
+
import { jsx as I, jsxs as L } from "react/jsx-runtime";
|
|
2
|
+
import h, { useId as B, useState as E, useRef as v, useCallback as R, useEffect as O, createContext as S, useContext as U } from "react";
|
|
3
|
+
const F = S(void 0);
|
|
4
|
+
function j() {
|
|
5
|
+
const n = U(F);
|
|
6
|
+
if (!n)
|
|
7
7
|
throw new Error("Dropdown compound components must be used within Dropdown");
|
|
8
|
-
return
|
|
8
|
+
return n;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
children:
|
|
12
|
-
hover:
|
|
10
|
+
function q({
|
|
11
|
+
children: n,
|
|
12
|
+
hover: d = !1,
|
|
13
13
|
position: u = "bottom",
|
|
14
|
-
align:
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
align: r = "start",
|
|
15
|
+
open: a,
|
|
16
|
+
onOpenChange: o,
|
|
17
|
+
disabled: t = !1,
|
|
18
|
+
arrow: s = !1,
|
|
19
|
+
className: i = "",
|
|
20
|
+
...p
|
|
17
21
|
}) {
|
|
18
|
-
const
|
|
19
|
-
|
|
22
|
+
const f = B(), l = B(), [c, g] = E(!1), [C, x] = E(-1), [A, k] = E(0), e = v(/* @__PURE__ */ new Map()), D = v(null), m = a !== void 0, b = m ? a : c, K = R((w) => {
|
|
23
|
+
t || (m || g(w), o?.(w));
|
|
24
|
+
}, [t, m, o]), $ = R((w, y, V) => {
|
|
25
|
+
y ? e.current.set(w, { ref: y, disabled: V }) : e.current.delete(w);
|
|
20
26
|
}, []);
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
27
|
+
O(() => {
|
|
28
|
+
const w = (y) => {
|
|
29
|
+
D.current && !D.current.contains(y.target) && (K(!1), x(-1));
|
|
24
30
|
};
|
|
25
|
-
if (
|
|
26
|
-
return document.addEventListener("mousedown",
|
|
27
|
-
}, [
|
|
28
|
-
const
|
|
31
|
+
if (b)
|
|
32
|
+
return document.addEventListener("mousedown", w), () => document.removeEventListener("mousedown", w);
|
|
33
|
+
}, [b]);
|
|
34
|
+
const M = {
|
|
29
35
|
top: "dropdown-top",
|
|
30
36
|
bottom: "dropdown-bottom",
|
|
31
37
|
left: "dropdown-left",
|
|
32
38
|
right: "dropdown-right"
|
|
33
|
-
},
|
|
39
|
+
}, P = {
|
|
34
40
|
start: "",
|
|
35
41
|
center: "dropdown-center",
|
|
36
42
|
end: "dropdown-end"
|
|
37
|
-
},
|
|
43
|
+
}, T = [
|
|
38
44
|
"dropdown",
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
M[u],
|
|
46
|
+
P[r],
|
|
47
|
+
d && "dropdown-hover",
|
|
48
|
+
b && "dropdown-open",
|
|
49
|
+
i
|
|
44
50
|
].filter(Boolean).join(" ");
|
|
45
|
-
return /* @__PURE__ */
|
|
46
|
-
|
|
51
|
+
return /* @__PURE__ */ I(
|
|
52
|
+
F.Provider,
|
|
47
53
|
{
|
|
48
54
|
value: {
|
|
49
55
|
position: u,
|
|
50
|
-
align:
|
|
51
|
-
menuId:
|
|
52
|
-
triggerId:
|
|
53
|
-
isOpen:
|
|
54
|
-
setIsOpen:
|
|
55
|
-
focusedIndex:
|
|
56
|
-
setFocusedIndex:
|
|
57
|
-
registerItem:
|
|
58
|
-
itemCount:
|
|
59
|
-
setItemCount:
|
|
56
|
+
align: r,
|
|
57
|
+
menuId: f,
|
|
58
|
+
triggerId: l,
|
|
59
|
+
isOpen: b,
|
|
60
|
+
setIsOpen: K,
|
|
61
|
+
focusedIndex: C,
|
|
62
|
+
setFocusedIndex: x,
|
|
63
|
+
registerItem: $,
|
|
64
|
+
itemCount: A,
|
|
65
|
+
setItemCount: k,
|
|
66
|
+
disabled: t,
|
|
67
|
+
arrow: s
|
|
60
68
|
},
|
|
61
|
-
children: /* @__PURE__ */
|
|
69
|
+
children: /* @__PURE__ */ I("div", { ref: D, className: T, "data-state": b ? "open" : "closed", "aria-disabled": t || void 0, ...p, children: n })
|
|
62
70
|
}
|
|
63
71
|
);
|
|
64
72
|
}
|
|
65
|
-
function
|
|
66
|
-
const { menuId: u, triggerId:
|
|
67
|
-
switch (
|
|
73
|
+
function z({ children: n, className: d = "" }) {
|
|
74
|
+
const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, setFocusedIndex: t, itemCount: s, disabled: i } = j(), p = (l) => {
|
|
75
|
+
switch (l.key) {
|
|
68
76
|
case "Enter":
|
|
69
77
|
case " ":
|
|
70
78
|
case "ArrowDown":
|
|
71
|
-
|
|
79
|
+
l.preventDefault(), o(!0), t(0);
|
|
72
80
|
break;
|
|
73
81
|
case "ArrowUp":
|
|
74
|
-
|
|
82
|
+
l.preventDefault(), o(!0), t(s - 1);
|
|
75
83
|
break;
|
|
76
84
|
case "Escape":
|
|
77
|
-
|
|
85
|
+
l.preventDefault(), o(!1), t(-1);
|
|
78
86
|
break;
|
|
79
87
|
}
|
|
80
|
-
},
|
|
81
|
-
|
|
88
|
+
}, f = () => {
|
|
89
|
+
o(!a), a || t(0);
|
|
82
90
|
};
|
|
83
|
-
return /* @__PURE__ */
|
|
91
|
+
return /* @__PURE__ */ I(
|
|
84
92
|
"button",
|
|
85
93
|
{
|
|
86
|
-
id:
|
|
94
|
+
id: r,
|
|
87
95
|
type: "button",
|
|
88
|
-
tabIndex: 0,
|
|
89
|
-
className: `btn ${
|
|
96
|
+
tabIndex: i ? -1 : 0,
|
|
97
|
+
className: `btn ${d}`,
|
|
90
98
|
"aria-haspopup": "menu",
|
|
91
|
-
"aria-expanded":
|
|
99
|
+
"aria-expanded": a,
|
|
92
100
|
"aria-controls": u,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
disabled: i,
|
|
102
|
+
onClick: f,
|
|
103
|
+
onKeyDown: p,
|
|
104
|
+
children: n
|
|
96
105
|
}
|
|
97
106
|
);
|
|
98
107
|
}
|
|
99
|
-
function
|
|
100
|
-
const { menuId: u, triggerId:
|
|
101
|
-
(e) =>
|
|
108
|
+
function H({ children: n, className: d = "" }) {
|
|
109
|
+
const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, focusedIndex: t, setFocusedIndex: s, setItemCount: i, arrow: p, position: f } = j(), l = v(null), c = h.Children.toArray(n).filter(
|
|
110
|
+
(e) => h.isValidElement(e) && e.type === N
|
|
102
111
|
);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}, [
|
|
106
|
-
|
|
107
|
-
}, [
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
(
|
|
112
|
+
O(() => {
|
|
113
|
+
i(c.length);
|
|
114
|
+
}, [c.length, i]), O(() => {
|
|
115
|
+
a && t >= 0 && l.current && l.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[t]?.focus();
|
|
116
|
+
}, [a, t]);
|
|
117
|
+
const g = (e) => {
|
|
118
|
+
const m = c.filter(
|
|
119
|
+
(b) => h.isValidElement(b) && !b.props.disabled
|
|
111
120
|
).length;
|
|
112
121
|
switch (e.key) {
|
|
113
122
|
case "ArrowDown":
|
|
114
|
-
e.preventDefault(), s((
|
|
123
|
+
e.preventDefault(), s((t + 1) % m);
|
|
115
124
|
break;
|
|
116
125
|
case "ArrowUp":
|
|
117
|
-
e.preventDefault(), s((
|
|
126
|
+
e.preventDefault(), s((t - 1 + m) % m);
|
|
118
127
|
break;
|
|
119
128
|
case "Home":
|
|
120
129
|
e.preventDefault(), s(0);
|
|
121
130
|
break;
|
|
122
131
|
case "End":
|
|
123
|
-
e.preventDefault(), s(
|
|
132
|
+
e.preventDefault(), s(m - 1);
|
|
124
133
|
break;
|
|
125
134
|
case "Escape":
|
|
126
|
-
e.preventDefault(),
|
|
135
|
+
e.preventDefault(), o(!1), s(-1), document.getElementById(r)?.focus();
|
|
127
136
|
break;
|
|
128
137
|
case "Tab":
|
|
129
|
-
|
|
138
|
+
o(!1), s(-1);
|
|
130
139
|
break;
|
|
131
140
|
}
|
|
132
|
-
},
|
|
141
|
+
}, C = [
|
|
133
142
|
"dropdown-content",
|
|
134
143
|
"menu",
|
|
135
144
|
"bg-base-100",
|
|
136
145
|
"rounded-box",
|
|
137
|
-
"z-
|
|
146
|
+
"z-50",
|
|
138
147
|
"shadow",
|
|
139
|
-
|
|
140
|
-
].filter(Boolean).join(" "),
|
|
141
|
-
|
|
148
|
+
d
|
|
149
|
+
].filter(Boolean).join(" "), x = h.Children.map(n, (e, D) => h.isValidElement(e) && e.type === N ? h.cloneElement(e, { _index: D }) : e), k = p ? /* @__PURE__ */ I(
|
|
150
|
+
"span",
|
|
151
|
+
{
|
|
152
|
+
className: `absolute w-0 h-0 border-8 border-solid ${{
|
|
153
|
+
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",
|
|
154
|
+
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",
|
|
155
|
+
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",
|
|
156
|
+
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"
|
|
157
|
+
}[f || "bottom"]}`,
|
|
158
|
+
"aria-hidden": "true"
|
|
159
|
+
}
|
|
160
|
+
) : null;
|
|
161
|
+
return /* @__PURE__ */ L(
|
|
142
162
|
"ul",
|
|
143
163
|
{
|
|
144
164
|
ref: l,
|
|
145
165
|
id: u,
|
|
146
166
|
role: "menu",
|
|
147
|
-
"aria-labelledby":
|
|
167
|
+
"aria-labelledby": r,
|
|
148
168
|
tabIndex: -1,
|
|
149
|
-
className:
|
|
150
|
-
onKeyDown:
|
|
151
|
-
children:
|
|
169
|
+
className: `${C} ${p ? "relative" : ""}`,
|
|
170
|
+
onKeyDown: g,
|
|
171
|
+
children: [
|
|
172
|
+
k,
|
|
173
|
+
x
|
|
174
|
+
]
|
|
152
175
|
}
|
|
153
176
|
);
|
|
154
177
|
}
|
|
155
|
-
function
|
|
156
|
-
children:
|
|
157
|
-
onClick:
|
|
178
|
+
function N({
|
|
179
|
+
children: n,
|
|
180
|
+
onClick: d,
|
|
158
181
|
active: u = !1,
|
|
159
|
-
disabled:
|
|
160
|
-
danger:
|
|
161
|
-
className:
|
|
182
|
+
disabled: r = !1,
|
|
183
|
+
danger: a = !1,
|
|
184
|
+
className: o = ""
|
|
162
185
|
}) {
|
|
163
|
-
const { setIsOpen:
|
|
164
|
-
|
|
186
|
+
const { setIsOpen: t, setFocusedIndex: s, triggerId: i } = j(), p = [u && "active", r && "disabled", o].filter(Boolean).join(" "), f = () => {
|
|
187
|
+
r || (d?.(), t(!1), s(-1), document.getElementById(i)?.focus());
|
|
165
188
|
};
|
|
166
|
-
return /* @__PURE__ */
|
|
189
|
+
return /* @__PURE__ */ I("li", { className: p, role: "none", children: /* @__PURE__ */ I(
|
|
167
190
|
"a",
|
|
168
191
|
{
|
|
169
192
|
role: "menuitem",
|
|
170
|
-
tabIndex:
|
|
171
|
-
"aria-disabled":
|
|
172
|
-
className:
|
|
173
|
-
onClick:
|
|
174
|
-
onKeyDown: (
|
|
175
|
-
(
|
|
193
|
+
tabIndex: r ? -1 : 0,
|
|
194
|
+
"aria-disabled": r || void 0,
|
|
195
|
+
className: a ? "text-error" : "",
|
|
196
|
+
onClick: f,
|
|
197
|
+
onKeyDown: (c) => {
|
|
198
|
+
(c.key === "Enter" || c.key === " ") && !r && (c.preventDefault(), f());
|
|
176
199
|
},
|
|
177
|
-
children:
|
|
200
|
+
children: n
|
|
178
201
|
}
|
|
179
202
|
) });
|
|
180
203
|
}
|
|
181
|
-
function
|
|
182
|
-
const
|
|
183
|
-
return /* @__PURE__ */
|
|
204
|
+
function W({ className: n = "" }) {
|
|
205
|
+
const d = ["border-base-content/10", n].filter(Boolean).join(" ");
|
|
206
|
+
return /* @__PURE__ */ I("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ I("hr", { className: d }) });
|
|
184
207
|
}
|
|
185
|
-
const
|
|
186
|
-
Trigger:
|
|
187
|
-
Menu:
|
|
188
|
-
Item:
|
|
189
|
-
Divider:
|
|
208
|
+
const J = Object.assign(q, {
|
|
209
|
+
Trigger: z,
|
|
210
|
+
Menu: H,
|
|
211
|
+
Item: N,
|
|
212
|
+
Divider: W
|
|
190
213
|
});
|
|
191
214
|
export {
|
|
192
|
-
|
|
215
|
+
J as Dropdown
|
|
193
216
|
};
|
|
194
217
|
//# sourceMappingURL=index37.js.map
|
package/dist/index37.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\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}\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 React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\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 onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [isOpen, setIsOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\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)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\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 dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n 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 }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>{children}</div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount } = 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 return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\n )\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount } = 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-[1]',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\n }\n return child\n })\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={menuClasses}\n onKeyDown={handleKeyDown}\n >\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\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 return (\n <li className={itemClasses} role=\"none\">\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 {children}\n </a>\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 Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","className","rest","menuId","useId","triggerId","isOpen","setIsOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","registerItem","useCallback","index","ref","disabled","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\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}\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 React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\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) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: 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 onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n arrow = 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 itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\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) => {\n if (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n onOpenChange?.(open)\n }, [disabled, isControlled, onOpenChange])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\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)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\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 dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n 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,\n arrow,\n }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} aria-disabled={disabled || undefined} {...rest}>{children}</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 return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\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\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\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 onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\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 return (\n <li className={itemClasses} role=\"none\">\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 {children}\n </a>\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 Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","controlledOpen","onOpenChange","disabled","arrow","className","rest","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","isControlled","isOpen","setIsOpen","useCallback","open","registerItem","index","ref","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","arrowElement","jsxs","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":"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"}
|