@aster-ui/prefixed 0.12.55 → 0.12.57
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/DatePicker.d.ts +3 -1
- package/dist/components/DatePicker.js +84 -82
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dropdown.d.ts +5 -4
- package/dist/components/Dropdown.js +239 -233
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/InputNumber.d.ts +2 -0
- package/dist/components/InputNumber.js +92 -88
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Menu.d.ts +3 -1
- package/dist/components/Menu.js +49 -48
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.d.ts +40 -18
- package/dist/components/Modal.js +180 -156
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.d.ts +2 -0
- package/dist/components/OTPInput.js +46 -44
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +3 -1
- package/dist/components/Pagination.js +104 -90
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.d.ts +3 -1
- package/dist/components/Popconfirm.js +63 -59
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Tabs.d.ts +3 -2
- package/dist/components/Tabs.js +74 -72
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/ThemeController.js +102 -88
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/ThemeProvider.js +17 -15
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/Transfer.d.ts +3 -1
- package/dist/components/Transfer.js +127 -120
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Upload.d.ts +3 -1
- package/dist/components/Upload.js +144 -142
- package/dist/components/Upload.js.map +1 -1
- package/dist/hooks/useTheme.js +8 -6
- package/dist/hooks/useTheme.js.map +1 -1
- package/package.json +2 -2
package/dist/components/Menu.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as n, jsxs as y } from "react/jsx-runtime";
|
|
2
|
-
import v, { useState as j, useCallback as I, createContext as
|
|
3
|
-
const
|
|
4
|
-
function
|
|
2
|
+
import v, { useState as j, useCallback as I, createContext as A, useId as F, useContext as k } from "react";
|
|
3
|
+
const G = "d-menu", T = "d-menu-vertical", J = "d-menu-horizontal", Q = "d-menu-xs", U = "d-menu-sm", Y = "d-menu-md", Z = "d-menu-lg", $ = "d-menu-xl", C = "d-menu-icon", _ = "d-menu-title", K = A(null);
|
|
4
|
+
function ee() {
|
|
5
5
|
const e = k(K);
|
|
6
6
|
if (!e)
|
|
7
7
|
throw new Error("Menu components must be used within a Menu");
|
|
@@ -10,7 +10,7 @@ function _() {
|
|
|
10
10
|
function O(e, t, s, o, r) {
|
|
11
11
|
return e.divider ? /* @__PURE__ */ n(w, {}, e.key) : e.title ? /* @__PURE__ */ n(B, { children: e.label }, e.key) : e.children && e.children.length > 0 ? /* @__PURE__ */ n(S, { _key: e.key, label: e.label, icon: e.icon, disabled: e.disabled, children: e.children.map((m) => O(m)) }, e.key) : /* @__PURE__ */ n(N, { _key: e.key, icon: e.icon, disabled: e.disabled, children: e.label }, e.key);
|
|
12
12
|
}
|
|
13
|
-
function
|
|
13
|
+
function ne({
|
|
14
14
|
children: e,
|
|
15
15
|
items: t,
|
|
16
16
|
mode: s = "vertical",
|
|
@@ -19,47 +19,48 @@ function ee({
|
|
|
19
19
|
defaultSelectedKeys: m = [],
|
|
20
20
|
openKeys: l,
|
|
21
21
|
defaultOpenKeys: p = [],
|
|
22
|
-
onSelect:
|
|
22
|
+
onSelect: i,
|
|
23
23
|
onOpenChange: a,
|
|
24
|
-
className:
|
|
25
|
-
|
|
24
|
+
className: u = "",
|
|
25
|
+
"data-testid": f,
|
|
26
|
+
...b
|
|
26
27
|
}) {
|
|
27
|
-
const [
|
|
28
|
-
(
|
|
29
|
-
r === void 0 &&
|
|
28
|
+
const [x, h] = j(m), [D, z] = j(p), E = r ?? x, M = l ?? D, V = I(
|
|
29
|
+
(c) => {
|
|
30
|
+
r === void 0 && h([c]), i?.(c);
|
|
30
31
|
},
|
|
31
|
-
[r,
|
|
32
|
-
),
|
|
33
|
-
(
|
|
34
|
-
const
|
|
35
|
-
l === void 0 &&
|
|
32
|
+
[r, i]
|
|
33
|
+
), L = I(
|
|
34
|
+
(c) => {
|
|
35
|
+
const d = M.includes(c) ? M.filter((g) => g !== c) : [...M, c];
|
|
36
|
+
l === void 0 && z(d), a?.(d);
|
|
36
37
|
},
|
|
37
38
|
[M, l, a]
|
|
38
|
-
),
|
|
39
|
+
), R = {
|
|
39
40
|
vertical: T,
|
|
40
|
-
horizontal:
|
|
41
|
+
horizontal: J,
|
|
41
42
|
inline: T
|
|
42
|
-
},
|
|
43
|
-
xs:
|
|
44
|
-
sm:
|
|
45
|
-
md:
|
|
46
|
-
lg:
|
|
47
|
-
xl:
|
|
48
|
-
},
|
|
43
|
+
}, X = {
|
|
44
|
+
xs: Q,
|
|
45
|
+
sm: U,
|
|
46
|
+
md: Y,
|
|
47
|
+
lg: Z,
|
|
48
|
+
xl: $
|
|
49
|
+
}, H = [G, R[s], o && X[o], u].filter(Boolean).join(" "), P = {
|
|
49
50
|
mode: s,
|
|
50
|
-
selectedKeys:
|
|
51
|
+
selectedKeys: E,
|
|
51
52
|
openKeys: M,
|
|
52
|
-
onSelect:
|
|
53
|
-
onToggleOpen:
|
|
54
|
-
},
|
|
55
|
-
if (v.isValidElement(
|
|
56
|
-
const g =
|
|
57
|
-
if (
|
|
58
|
-
return v.cloneElement(
|
|
53
|
+
onSelect: V,
|
|
54
|
+
onToggleOpen: L
|
|
55
|
+
}, W = (c) => v.Children.map(c, (d) => {
|
|
56
|
+
if (v.isValidElement(d)) {
|
|
57
|
+
const g = d.key != null ? String(d.key) : void 0;
|
|
58
|
+
if (d.type === N || d.type === S)
|
|
59
|
+
return v.cloneElement(d, { _key: g });
|
|
59
60
|
}
|
|
60
|
-
return
|
|
61
|
-
}),
|
|
62
|
-
return /* @__PURE__ */ n(K.Provider, { value:
|
|
61
|
+
return d;
|
|
62
|
+
}), q = t && t.length > 0 ? t.map((c) => O(c)) : W(e);
|
|
63
|
+
return /* @__PURE__ */ n(K.Provider, { value: P, children: /* @__PURE__ */ n("ul", { className: H, "data-testid": f, ...b, children: q }) });
|
|
63
64
|
}
|
|
64
65
|
function N({
|
|
65
66
|
children: e,
|
|
@@ -71,8 +72,8 @@ function N({
|
|
|
71
72
|
_key: l,
|
|
72
73
|
...p
|
|
73
74
|
}) {
|
|
74
|
-
const
|
|
75
|
-
s || (l &&
|
|
75
|
+
const i = k(K), a = l && i ? i.selectedKeys.includes(l) : r, u = () => {
|
|
76
|
+
s || (l && i && i.onSelect(l), o?.());
|
|
76
77
|
}, f = [
|
|
77
78
|
a && "active bg-primary text-primary-content",
|
|
78
79
|
s && "disabled",
|
|
@@ -82,7 +83,7 @@ function N({
|
|
|
82
83
|
"a",
|
|
83
84
|
{
|
|
84
85
|
className: f,
|
|
85
|
-
onClick:
|
|
86
|
+
onClick: u,
|
|
86
87
|
"aria-disabled": s,
|
|
87
88
|
role: "menuitem",
|
|
88
89
|
"data-state": a ? "active" : "inactive",
|
|
@@ -104,10 +105,10 @@ function S({
|
|
|
104
105
|
_key: l,
|
|
105
106
|
...p
|
|
106
107
|
}) {
|
|
107
|
-
const
|
|
108
|
-
r || !l ||
|
|
108
|
+
const i = ee(), a = l ? i.openKeys.includes(l) : !1, u = F(), f = t ?? s, b = () => {
|
|
109
|
+
r || !l || i.onToggleOpen(l);
|
|
109
110
|
}, x = [r && "disabled", m].filter(Boolean).join(" ");
|
|
110
|
-
return
|
|
111
|
+
return i.mode === "inline" ? /* @__PURE__ */ n("li", { className: x, "data-state": a ? "open" : "closed", ...p, children: /* @__PURE__ */ y("details", { open: a, children: [
|
|
111
112
|
/* @__PURE__ */ y(
|
|
112
113
|
"summary",
|
|
113
114
|
{
|
|
@@ -115,7 +116,7 @@ function S({
|
|
|
115
116
|
h.preventDefault(), b();
|
|
116
117
|
},
|
|
117
118
|
"aria-expanded": a,
|
|
118
|
-
"aria-controls":
|
|
119
|
+
"aria-controls": u,
|
|
119
120
|
"aria-disabled": r,
|
|
120
121
|
children: [
|
|
121
122
|
o && /* @__PURE__ */ n("span", { className: C, children: o }),
|
|
@@ -123,7 +124,7 @@ function S({
|
|
|
123
124
|
]
|
|
124
125
|
}
|
|
125
126
|
),
|
|
126
|
-
/* @__PURE__ */ n("ul", { id:
|
|
127
|
+
/* @__PURE__ */ n("ul", { id: u, role: "menu", children: e })
|
|
127
128
|
] }) }) : /* @__PURE__ */ n("li", { className: x, "data-state": a ? "open" : "closed", ...p, children: /* @__PURE__ */ y("details", { open: a, children: [
|
|
128
129
|
/* @__PURE__ */ y(
|
|
129
130
|
"summary",
|
|
@@ -132,7 +133,7 @@ function S({
|
|
|
132
133
|
h.preventDefault(), b();
|
|
133
134
|
},
|
|
134
135
|
"aria-expanded": a,
|
|
135
|
-
"aria-controls":
|
|
136
|
+
"aria-controls": u,
|
|
136
137
|
"aria-disabled": r,
|
|
137
138
|
children: [
|
|
138
139
|
o && /* @__PURE__ */ n("span", { className: C, children: o }),
|
|
@@ -140,24 +141,24 @@ function S({
|
|
|
140
141
|
]
|
|
141
142
|
}
|
|
142
143
|
),
|
|
143
|
-
/* @__PURE__ */ n("ul", { id:
|
|
144
|
+
/* @__PURE__ */ n("ul", { id: u, role: "menu", children: e })
|
|
144
145
|
] }) });
|
|
145
146
|
}
|
|
146
147
|
function B({ children: e, className: t = "", ...s }) {
|
|
147
|
-
const o = [
|
|
148
|
+
const o = [_, t].filter(Boolean).join(" ");
|
|
148
149
|
return /* @__PURE__ */ n("li", { className: o, ...s, children: e });
|
|
149
150
|
}
|
|
150
151
|
function w({ className: e = "", ...t }) {
|
|
151
152
|
const s = ["border-t border-base-300 my-1", e].filter(Boolean).join(" ");
|
|
152
153
|
return /* @__PURE__ */ n("li", { className: s, role: "separator", ...t });
|
|
153
154
|
}
|
|
154
|
-
const
|
|
155
|
+
const le = Object.assign(ne, {
|
|
155
156
|
Item: N,
|
|
156
157
|
SubMenu: S,
|
|
157
158
|
Title: B,
|
|
158
159
|
Divider: w
|
|
159
160
|
});
|
|
160
161
|
export {
|
|
161
|
-
|
|
162
|
+
le as Menu
|
|
162
163
|
};
|
|
163
164
|
//# sourceMappingURL=Menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","sources":["../../src/components/Menu.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useId } from 'react'\n\n// DaisyUI classes\nconst dMenu = 'd-menu'\nconst dMenuVertical = 'd-menu-vertical'\nconst dMenuHorizontal = 'd-menu-horizontal'\nconst dMenuXs = 'd-menu-xs'\nconst dMenuSm = 'd-menu-sm'\nconst dMenuMd = 'd-menu-md'\nconst dMenuLg = 'd-menu-lg'\nconst dMenuXl = 'd-menu-xl'\nconst dMenuIcon = 'd-menu-icon'\nconst dMenuTitle = 'd-menu-title'\n\nexport type MenuMode = 'vertical' | 'horizontal' | 'inline'\nexport type MenuSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface MenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n children?: MenuItem[]\n divider?: boolean\n title?: boolean // For section titles\n}\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Menu items (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: MenuItem[]\n /** Menu display mode */\n mode?: MenuMode\n /** Menu size */\n size?: MenuSize\n /** Controlled selected keys */\n selectedKeys?: string[]\n /** Default selected keys (uncontrolled) */\n defaultSelectedKeys?: string[]\n /** Controlled open submenu keys */\n openKeys?: string[]\n /** Default open submenu keys (uncontrolled) */\n defaultOpenKeys?: string[]\n /** Callback when item is selected */\n onSelect?: (key: string) => void\n /** Callback when submenu open state changes */\n onOpenChange?: (openKeys: string[]) => void\n}\n\nexport interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLAnchorElement>, 'onClick'> {\n children: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n onClick?: () => void\n /** @deprecated Use key and selectedKeys instead */\n active?: boolean\n /** @internal */\n _key?: string\n}\n\nexport interface MenuSubMenuProps extends Omit<React.HTMLAttributes<HTMLLIElement>, 'title'> {\n children: React.ReactNode\n /** Submenu label */\n label?: React.ReactNode\n /** Submenu title (alias for label) */\n title?: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n /** @internal */\n _key?: string\n}\n\nexport interface MenuTitleProps extends React.HTMLAttributes<HTMLLIElement> {\n children: React.ReactNode\n}\n\nexport interface MenuDividerProps extends React.HTMLAttributes<HTMLLIElement> {}\n\ninterface MenuContextValue {\n mode: MenuMode\n selectedKeys: string[]\n openKeys: string[]\n onSelect: (key: string) => void\n onToggleOpen: (key: string) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nfunction useMenuContext() {\n const context = useContext(MenuContext)\n if (!context) {\n throw new Error('Menu components must be used within a Menu')\n }\n return context\n}\n\n// Internal component for rendering data-driven menu items\nfunction renderMenuItem(item: MenuItem, onSelect: (key: string) => void, selectedKeys: string[], openKeys: string[], onToggleOpen: (key: string) => void): React.ReactNode {\n if (item.divider) {\n return <MenuDivider key={item.key} />\n }\n\n if (item.title) {\n return <MenuTitle key={item.key}>{item.label}</MenuTitle>\n }\n\n if (item.children && item.children.length > 0) {\n return (\n <MenuSubMenu key={item.key} _key={item.key} label={item.label} icon={item.icon} disabled={item.disabled}>\n {item.children.map((child) => renderMenuItem(child, onSelect, selectedKeys, openKeys, onToggleOpen))}\n </MenuSubMenu>\n )\n }\n\n return (\n <MenuItem key={item.key} _key={item.key} icon={item.icon} disabled={item.disabled}>\n {item.label}\n </MenuItem>\n )\n}\n\nfunction MenuRoot({\n children,\n items,\n mode = 'vertical',\n size,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n openKeys: controlledOpenKeys,\n defaultOpenKeys = [],\n onSelect,\n onOpenChange,\n className = '',\n ...rest\n}: MenuProps) {\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys)\n const [internalOpenKeys, setInternalOpenKeys] = useState<string[]>(defaultOpenKeys)\n\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\n const openKeys = controlledOpenKeys ?? internalOpenKeys\n\n const handleSelect = useCallback(\n (key: string) => {\n if (controlledSelectedKeys === undefined) {\n setInternalSelectedKeys([key])\n }\n onSelect?.(key)\n },\n [controlledSelectedKeys, onSelect]\n )\n\n const handleToggleOpen = useCallback(\n (key: string) => {\n const newOpenKeys = openKeys.includes(key)\n ? openKeys.filter((k) => k !== key)\n : [...openKeys, key]\n\n if (controlledOpenKeys === undefined) {\n setInternalOpenKeys(newOpenKeys)\n }\n onOpenChange?.(newOpenKeys)\n },\n [openKeys, controlledOpenKeys, onOpenChange]\n )\n\n const modeClasses: Record<MenuMode, string> = {\n vertical: dMenuVertical,\n horizontal: dMenuHorizontal,\n inline: dMenuVertical,\n }\n\n const sizeClasses: Record<MenuSize, string> = {\n xs: dMenuXs,\n sm: dMenuSm,\n md: dMenuMd,\n lg: dMenuLg,\n xl: dMenuXl,\n }\n\n const menuClasses = [dMenu, modeClasses[mode], size && sizeClasses[size], className].filter(Boolean).join(' ')\n\n const contextValue = {\n mode,\n selectedKeys,\n openKeys,\n onSelect: handleSelect,\n onToggleOpen: handleToggleOpen,\n }\n\n // Clone children to extract keys\n const cloneChildrenWithKeys = (children: React.ReactNode): React.ReactNode => {\n return React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === MenuItem || child.type === MenuSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n }\n\n // Render data-driven items if provided\n const content = items && items.length > 0\n ? items.map((item) => renderMenuItem(item, handleSelect, selectedKeys, openKeys, handleToggleOpen))\n : cloneChildrenWithKeys(children)\n\n return (\n <MenuContext.Provider value={contextValue}>\n <ul className={menuClasses} {...rest}>{content}</ul>\n </MenuContext.Provider>\n )\n}\n\nfunction MenuItem({\n children,\n icon,\n disabled = false,\n onClick,\n active,\n className = '',\n _key,\n ...rest\n}: MenuItemProps) {\n const context = useContext(MenuContext)\n\n // Support both old active prop and new key-based selection\n const isSelected = _key && context ? context.selectedKeys.includes(_key) : active\n\n const handleClick = () => {\n if (disabled) return\n if (_key && context) {\n context.onSelect(_key)\n }\n onClick?.()\n }\n\n const itemClasses = [\n isSelected && 'active bg-primary text-primary-content',\n disabled && 'disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <li>\n <a\n className={itemClasses}\n onClick={handleClick}\n aria-disabled={disabled}\n role=\"menuitem\"\n data-state={isSelected ? 'active' : 'inactive'}\n {...rest}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {children}\n </a>\n </li>\n )\n}\n\nfunction MenuSubMenu({\n children,\n label,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n ...rest\n}: MenuSubMenuProps) {\n const context = useMenuContext()\n const isOpen = _key ? context.openKeys.includes(_key) : false\n const submenuId = useId()\n\n // Support both label and title (title as alias for backwards compatibility)\n const displayLabel = label ?? title\n\n const handleToggle = () => {\n if (disabled || !_key) return\n context.onToggleOpen(_key)\n }\n\n const submenuClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n // For inline mode, use collapsible details/summary\n if (context.mode === 'inline') {\n return (\n <li className={submenuClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <details open={isOpen}>\n <summary\n onClick={(e) => {\n e.preventDefault()\n handleToggle()\n }}\n aria-expanded={isOpen}\n aria-controls={submenuId}\n aria-disabled={disabled}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {displayLabel}\n </summary>\n <ul id={submenuId} role=\"menu\">\n {children}\n </ul>\n </details>\n </li>\n )\n }\n\n // For vertical/horizontal, use nested menu (dropdown style)\n return (\n <li className={submenuClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <details open={isOpen}>\n <summary\n onClick={(e) => {\n e.preventDefault()\n handleToggle()\n }}\n aria-expanded={isOpen}\n aria-controls={submenuId}\n aria-disabled={disabled}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {displayLabel}\n </summary>\n <ul id={submenuId} role=\"menu\">\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction MenuTitle({ children, className = '', ...rest }: MenuTitleProps) {\n const titleClasses = [dMenuTitle, className].filter(Boolean).join(' ')\n\n return <li className={titleClasses} {...rest}>{children}</li>\n}\n\nfunction MenuDivider({ className = '', ...rest }: MenuDividerProps) {\n const dividerClasses = ['border-t border-base-300 my-1', className].filter(Boolean).join(' ')\n\n return <li className={dividerClasses} role=\"separator\" {...rest} />\n}\n\nexport const Menu = Object.assign(MenuRoot, {\n Item: MenuItem,\n SubMenu: MenuSubMenu,\n Title: MenuTitle,\n Divider: MenuDivider,\n})\n"],"names":["dMenu","dMenuVertical","dMenuHorizontal","dMenuXs","dMenuSm","dMenuMd","dMenuLg","dMenuXl","dMenuIcon","dMenuTitle","MenuContext","createContext","useMenuContext","context","useContext","renderMenuItem","item","onSelect","selectedKeys","openKeys","onToggleOpen","jsx","MenuDivider","MenuTitle","MenuSubMenu","child","MenuItem","MenuRoot","children","items","mode","size","controlledSelectedKeys","defaultSelectedKeys","controlledOpenKeys","defaultOpenKeys","onOpenChange","className","rest","internalSelectedKeys","setInternalSelectedKeys","useState","internalOpenKeys","setInternalOpenKeys","handleSelect","useCallback","key","handleToggleOpen","newOpenKeys","k","modeClasses","sizeClasses","menuClasses","contextValue","cloneChildrenWithKeys","React","childKey","content","icon","disabled","onClick","active","_key","isSelected","handleClick","itemClasses","jsxs","label","title","isOpen","submenuId","useId","displayLabel","handleToggle","submenuClasses","e","titleClasses","dividerClasses","Menu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["../../src/components/Menu.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useId } from 'react'\n\n// DaisyUI classes\nconst dMenu = 'd-menu'\nconst dMenuVertical = 'd-menu-vertical'\nconst dMenuHorizontal = 'd-menu-horizontal'\nconst dMenuXs = 'd-menu-xs'\nconst dMenuSm = 'd-menu-sm'\nconst dMenuMd = 'd-menu-md'\nconst dMenuLg = 'd-menu-lg'\nconst dMenuXl = 'd-menu-xl'\nconst dMenuIcon = 'd-menu-icon'\nconst dMenuTitle = 'd-menu-title'\n\nexport type MenuMode = 'vertical' | 'horizontal' | 'inline'\nexport type MenuSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface MenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n children?: MenuItem[]\n divider?: boolean\n title?: boolean // For section titles\n}\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Menu items (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: MenuItem[]\n /** Menu display mode */\n mode?: MenuMode\n /** Menu size */\n size?: MenuSize\n /** Controlled selected keys */\n selectedKeys?: string[]\n /** Default selected keys (uncontrolled) */\n defaultSelectedKeys?: string[]\n /** Controlled open submenu keys */\n openKeys?: string[]\n /** Default open submenu keys (uncontrolled) */\n defaultOpenKeys?: string[]\n /** Callback when item is selected */\n onSelect?: (key: string) => void\n /** Callback when submenu open state changes */\n onOpenChange?: (openKeys: string[]) => void\n /** Test ID for the menu element */\n 'data-testid'?: string\n}\n\nexport interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLAnchorElement>, 'onClick'> {\n children: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n onClick?: () => void\n /** @deprecated Use key and selectedKeys instead */\n active?: boolean\n /** @internal */\n _key?: string\n}\n\nexport interface MenuSubMenuProps extends Omit<React.HTMLAttributes<HTMLLIElement>, 'title'> {\n children: React.ReactNode\n /** Submenu label */\n label?: React.ReactNode\n /** Submenu title (alias for label) */\n title?: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n /** @internal */\n _key?: string\n}\n\nexport interface MenuTitleProps extends React.HTMLAttributes<HTMLLIElement> {\n children: React.ReactNode\n}\n\nexport interface MenuDividerProps extends React.HTMLAttributes<HTMLLIElement> {}\n\ninterface MenuContextValue {\n mode: MenuMode\n selectedKeys: string[]\n openKeys: string[]\n onSelect: (key: string) => void\n onToggleOpen: (key: string) => void\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nfunction useMenuContext() {\n const context = useContext(MenuContext)\n if (!context) {\n throw new Error('Menu components must be used within a Menu')\n }\n return context\n}\n\n// Internal component for rendering data-driven menu items\nfunction renderMenuItem(item: MenuItem, onSelect: (key: string) => void, selectedKeys: string[], openKeys: string[], onToggleOpen: (key: string) => void): React.ReactNode {\n if (item.divider) {\n return <MenuDivider key={item.key} />\n }\n\n if (item.title) {\n return <MenuTitle key={item.key}>{item.label}</MenuTitle>\n }\n\n if (item.children && item.children.length > 0) {\n return (\n <MenuSubMenu key={item.key} _key={item.key} label={item.label} icon={item.icon} disabled={item.disabled}>\n {item.children.map((child) => renderMenuItem(child, onSelect, selectedKeys, openKeys, onToggleOpen))}\n </MenuSubMenu>\n )\n }\n\n return (\n <MenuItem key={item.key} _key={item.key} icon={item.icon} disabled={item.disabled}>\n {item.label}\n </MenuItem>\n )\n}\n\nfunction MenuRoot({\n children,\n items,\n mode = 'vertical',\n size,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n openKeys: controlledOpenKeys,\n defaultOpenKeys = [],\n onSelect,\n onOpenChange,\n className = '',\n 'data-testid': testId,\n ...rest\n}: MenuProps) {\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys)\n const [internalOpenKeys, setInternalOpenKeys] = useState<string[]>(defaultOpenKeys)\n\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\n const openKeys = controlledOpenKeys ?? internalOpenKeys\n\n const handleSelect = useCallback(\n (key: string) => {\n if (controlledSelectedKeys === undefined) {\n setInternalSelectedKeys([key])\n }\n onSelect?.(key)\n },\n [controlledSelectedKeys, onSelect]\n )\n\n const handleToggleOpen = useCallback(\n (key: string) => {\n const newOpenKeys = openKeys.includes(key)\n ? openKeys.filter((k) => k !== key)\n : [...openKeys, key]\n\n if (controlledOpenKeys === undefined) {\n setInternalOpenKeys(newOpenKeys)\n }\n onOpenChange?.(newOpenKeys)\n },\n [openKeys, controlledOpenKeys, onOpenChange]\n )\n\n const modeClasses: Record<MenuMode, string> = {\n vertical: dMenuVertical,\n horizontal: dMenuHorizontal,\n inline: dMenuVertical,\n }\n\n const sizeClasses: Record<MenuSize, string> = {\n xs: dMenuXs,\n sm: dMenuSm,\n md: dMenuMd,\n lg: dMenuLg,\n xl: dMenuXl,\n }\n\n const menuClasses = [dMenu, modeClasses[mode], size && sizeClasses[size], className].filter(Boolean).join(' ')\n\n const contextValue = {\n mode,\n selectedKeys,\n openKeys,\n onSelect: handleSelect,\n onToggleOpen: handleToggleOpen,\n }\n\n // Clone children to extract keys\n const cloneChildrenWithKeys = (children: React.ReactNode): React.ReactNode => {\n return React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === MenuItem || child.type === MenuSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\n }\n return child\n })\n }\n\n // Render data-driven items if provided\n const content = items && items.length > 0\n ? items.map((item) => renderMenuItem(item, handleSelect, selectedKeys, openKeys, handleToggleOpen))\n : cloneChildrenWithKeys(children)\n\n return (\n <MenuContext.Provider value={contextValue}>\n <ul className={menuClasses} data-testid={testId} {...rest}>{content}</ul>\n </MenuContext.Provider>\n )\n}\n\nfunction MenuItem({\n children,\n icon,\n disabled = false,\n onClick,\n active,\n className = '',\n _key,\n ...rest\n}: MenuItemProps) {\n const context = useContext(MenuContext)\n\n // Support both old active prop and new key-based selection\n const isSelected = _key && context ? context.selectedKeys.includes(_key) : active\n\n const handleClick = () => {\n if (disabled) return\n if (_key && context) {\n context.onSelect(_key)\n }\n onClick?.()\n }\n\n const itemClasses = [\n isSelected && 'active bg-primary text-primary-content',\n disabled && 'disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <li>\n <a\n className={itemClasses}\n onClick={handleClick}\n aria-disabled={disabled}\n role=\"menuitem\"\n data-state={isSelected ? 'active' : 'inactive'}\n {...rest}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {children}\n </a>\n </li>\n )\n}\n\nfunction MenuSubMenu({\n children,\n label,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n ...rest\n}: MenuSubMenuProps) {\n const context = useMenuContext()\n const isOpen = _key ? context.openKeys.includes(_key) : false\n const submenuId = useId()\n\n // Support both label and title (title as alias for backwards compatibility)\n const displayLabel = label ?? title\n\n const handleToggle = () => {\n if (disabled || !_key) return\n context.onToggleOpen(_key)\n }\n\n const submenuClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n // For inline mode, use collapsible details/summary\n if (context.mode === 'inline') {\n return (\n <li className={submenuClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <details open={isOpen}>\n <summary\n onClick={(e) => {\n e.preventDefault()\n handleToggle()\n }}\n aria-expanded={isOpen}\n aria-controls={submenuId}\n aria-disabled={disabled}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {displayLabel}\n </summary>\n <ul id={submenuId} role=\"menu\">\n {children}\n </ul>\n </details>\n </li>\n )\n }\n\n // For vertical/horizontal, use nested menu (dropdown style)\n return (\n <li className={submenuClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <details open={isOpen}>\n <summary\n onClick={(e) => {\n e.preventDefault()\n handleToggle()\n }}\n aria-expanded={isOpen}\n aria-controls={submenuId}\n aria-disabled={disabled}\n >\n {icon && <span className={dMenuIcon}>{icon}</span>}\n {displayLabel}\n </summary>\n <ul id={submenuId} role=\"menu\">\n {children}\n </ul>\n </details>\n </li>\n )\n}\n\nfunction MenuTitle({ children, className = '', ...rest }: MenuTitleProps) {\n const titleClasses = [dMenuTitle, className].filter(Boolean).join(' ')\n\n return <li className={titleClasses} {...rest}>{children}</li>\n}\n\nfunction MenuDivider({ className = '', ...rest }: MenuDividerProps) {\n const dividerClasses = ['border-t border-base-300 my-1', className].filter(Boolean).join(' ')\n\n return <li className={dividerClasses} role=\"separator\" {...rest} />\n}\n\nexport const Menu = Object.assign(MenuRoot, {\n Item: MenuItem,\n SubMenu: MenuSubMenu,\n Title: MenuTitle,\n Divider: MenuDivider,\n})\n"],"names":["dMenu","dMenuVertical","dMenuHorizontal","dMenuXs","dMenuSm","dMenuMd","dMenuLg","dMenuXl","dMenuIcon","dMenuTitle","MenuContext","createContext","useMenuContext","context","useContext","renderMenuItem","item","onSelect","selectedKeys","openKeys","onToggleOpen","jsx","MenuDivider","MenuTitle","MenuSubMenu","child","MenuItem","MenuRoot","children","items","mode","size","controlledSelectedKeys","defaultSelectedKeys","controlledOpenKeys","defaultOpenKeys","onOpenChange","className","testId","rest","internalSelectedKeys","setInternalSelectedKeys","useState","internalOpenKeys","setInternalOpenKeys","handleSelect","useCallback","key","handleToggleOpen","newOpenKeys","k","modeClasses","sizeClasses","menuClasses","contextValue","cloneChildrenWithKeys","React","childKey","content","icon","disabled","onClick","active","_key","isSelected","handleClick","itemClasses","jsxs","label","title","isOpen","submenuId","useId","displayLabel","handleToggle","submenuClasses","e","titleClasses","dividerClasses","Menu"],"mappings":"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"}
|
|
@@ -23,10 +23,26 @@ export interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>
|
|
|
23
23
|
centered?: boolean;
|
|
24
24
|
/** Callback when modal is closed */
|
|
25
25
|
onClose?: () => void;
|
|
26
|
+
/** Callback after modal close animation completes */
|
|
27
|
+
afterClose?: () => void;
|
|
26
28
|
/** Where to place initial focus: 'ok', 'cancel', or 'close' button */
|
|
27
29
|
initialFocus?: 'ok' | 'cancel' | 'close';
|
|
28
30
|
/** Use alertdialog role for urgent messages */
|
|
29
31
|
alertDialog?: boolean;
|
|
32
|
+
/** Show loading spinner on OK button */
|
|
33
|
+
confirmLoading?: boolean;
|
|
34
|
+
/** Props for the OK button */
|
|
35
|
+
okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
36
|
+
/** Props for the Cancel button */
|
|
37
|
+
cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
38
|
+
/** Custom close icon */
|
|
39
|
+
closeIcon?: React.ReactNode;
|
|
40
|
+
/** CSS z-index for the modal */
|
|
41
|
+
zIndex?: number;
|
|
42
|
+
/** Destroy child components when modal is closed */
|
|
43
|
+
destroyOnClose?: boolean;
|
|
44
|
+
/** Test ID prefix for child elements */
|
|
45
|
+
'data-testid'?: string;
|
|
30
46
|
}
|
|
31
47
|
export interface ModalFuncProps {
|
|
32
48
|
title?: React.ReactNode;
|
|
@@ -37,21 +53,27 @@ export interface ModalFuncProps {
|
|
|
37
53
|
cancelText?: string;
|
|
38
54
|
type?: 'info' | 'success' | 'warning' | 'error';
|
|
39
55
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
declare const Modal: React.ForwardRefExoticComponent<ModalProps & React.RefAttributes<HTMLDialogElement>>;
|
|
57
|
+
declare function confirm(config: ModalFuncProps): {
|
|
58
|
+
destroy: () => void;
|
|
59
|
+
};
|
|
60
|
+
declare function info(config: ModalFuncProps): {
|
|
61
|
+
destroy: () => void;
|
|
62
|
+
};
|
|
63
|
+
declare function success(config: ModalFuncProps): {
|
|
64
|
+
destroy: () => void;
|
|
65
|
+
};
|
|
66
|
+
declare function warning(config: ModalFuncProps): {
|
|
67
|
+
destroy: () => void;
|
|
68
|
+
};
|
|
69
|
+
declare function error(config: ModalFuncProps): {
|
|
70
|
+
destroy: () => void;
|
|
71
|
+
};
|
|
72
|
+
declare const ModalWithStatics: typeof Modal & {
|
|
73
|
+
confirm: typeof confirm;
|
|
74
|
+
info: typeof info;
|
|
75
|
+
success: typeof success;
|
|
76
|
+
warning: typeof warning;
|
|
77
|
+
error: typeof error;
|
|
78
|
+
};
|
|
79
|
+
export { ModalWithStatics as Modal };
|