asterui 0.12.11 → 0.12.12
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/Anchor.d.ts +10 -0
- package/dist/components/Breadcrumb.d.ts +20 -3
- package/dist/components/ContextMenu.d.ts +39 -3
- package/dist/components/Menu.d.ts +29 -4
- package/dist/index.d.ts +2 -2
- package/dist/index19.js +161 -63
- package/dist/index19.js.map +1 -1
- package/dist/index3.js +81 -65
- package/dist/index3.js.map +1 -1
- package/dist/index51.js +110 -104
- package/dist/index51.js.map +1 -1
- package/dist/index8.js +32 -8
- package/dist/index8.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,8 +14,12 @@ export interface AnchorProps {
|
|
|
14
14
|
direction?: 'horizontal' | 'vertical';
|
|
15
15
|
/** Offset from top when calculating scroll position */
|
|
16
16
|
offsetTop?: number;
|
|
17
|
+
/** Bounding distance of anchor area */
|
|
18
|
+
bounds?: number;
|
|
17
19
|
/** Target scroll container (default: window) */
|
|
18
20
|
getContainer?: () => HTMLElement | Window;
|
|
21
|
+
/** Customize the anchor highlight */
|
|
22
|
+
getCurrentAnchor?: (activeLink: string) => string;
|
|
19
23
|
/** Callback when active link changes */
|
|
20
24
|
onChange?: (activeLink: string) => void;
|
|
21
25
|
/** Callback when link is clicked */
|
|
@@ -25,6 +29,12 @@ export interface AnchorProps {
|
|
|
25
29
|
}) => void;
|
|
26
30
|
/** Currently active link (controlled) */
|
|
27
31
|
activeLink?: string;
|
|
32
|
+
/** Whether to fix the anchor when scrolling */
|
|
33
|
+
affix?: boolean;
|
|
34
|
+
/** Pixels to offset from top when affix is true */
|
|
35
|
+
affixOffsetTop?: number;
|
|
36
|
+
/** Replace history instead of push */
|
|
37
|
+
replace?: boolean;
|
|
28
38
|
/** Custom class name */
|
|
29
39
|
className?: string;
|
|
30
40
|
/** Anchor.Link children */
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
+
export interface BreadcrumbItemType {
|
|
3
|
+
/** Item title/label */
|
|
4
|
+
title: React.ReactNode;
|
|
5
|
+
/** Link URL */
|
|
6
|
+
href?: string;
|
|
7
|
+
/** Click handler */
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
/** Custom class name */
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
2
12
|
export interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
-
children
|
|
13
|
+
/** Breadcrumb.Item children (compound pattern) */
|
|
14
|
+
children?: React.ReactNode;
|
|
15
|
+
/** Breadcrumb items data (data-driven pattern) */
|
|
16
|
+
items?: BreadcrumbItemType[];
|
|
17
|
+
/** Custom separator between items */
|
|
18
|
+
separator?: React.ReactNode;
|
|
4
19
|
}
|
|
5
20
|
export interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'onClick'> {
|
|
6
21
|
children: React.ReactNode;
|
|
7
22
|
href?: string;
|
|
8
23
|
onClick?: () => void;
|
|
24
|
+
/** Icon to display before the label */
|
|
25
|
+
icon?: React.ReactNode;
|
|
9
26
|
}
|
|
10
|
-
declare function BreadcrumbRoot({ children, className, ...rest }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
-
declare function BreadcrumbItem({ children, href, onClick, className, ...rest }: BreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
declare function BreadcrumbRoot({ children, items, separator, className, ...rest }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
declare function BreadcrumbItem({ children, href, onClick, icon, className, ...rest }: BreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
|
|
12
29
|
export declare const Breadcrumb: typeof BreadcrumbRoot & {
|
|
13
30
|
Item: typeof BreadcrumbItem;
|
|
14
31
|
};
|
|
@@ -11,8 +11,8 @@ export interface ContextMenuItem {
|
|
|
11
11
|
export interface ContextMenuProps {
|
|
12
12
|
/** Element that triggers the context menu on right-click */
|
|
13
13
|
children: React.ReactNode;
|
|
14
|
-
/** Menu items */
|
|
15
|
-
items
|
|
14
|
+
/** Menu items (data-driven pattern) */
|
|
15
|
+
items?: ContextMenuItem[];
|
|
16
16
|
/** Callback when an item is selected */
|
|
17
17
|
onSelect?: (key: string) => void;
|
|
18
18
|
/** Whether the context menu is disabled */
|
|
@@ -20,4 +20,40 @@ export interface ContextMenuProps {
|
|
|
20
20
|
/** Additional CSS classes for the menu */
|
|
21
21
|
className?: string;
|
|
22
22
|
}
|
|
23
|
-
export
|
|
23
|
+
export interface ContextMenuItemProps {
|
|
24
|
+
/** Unique key for the item */
|
|
25
|
+
itemKey: string;
|
|
26
|
+
/** Item content */
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
/** Icon to display before label */
|
|
29
|
+
icon?: React.ReactNode;
|
|
30
|
+
/** Whether the item is disabled */
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
/** Show as danger/destructive action */
|
|
33
|
+
danger?: boolean;
|
|
34
|
+
/** Additional CSS classes */
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ContextMenuDividerProps {
|
|
38
|
+
/** Additional CSS classes */
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ContextMenuSubMenuProps {
|
|
42
|
+
/** Unique key for the submenu */
|
|
43
|
+
itemKey: string;
|
|
44
|
+
/** Submenu label */
|
|
45
|
+
label: React.ReactNode;
|
|
46
|
+
/** Icon to display before label */
|
|
47
|
+
icon?: React.ReactNode;
|
|
48
|
+
/** Whether the submenu is disabled */
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
/** Submenu items */
|
|
51
|
+
children: React.ReactNode;
|
|
52
|
+
/** Additional CSS classes */
|
|
53
|
+
className?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare const ContextMenu: React.FC<ContextMenuProps> & {
|
|
56
|
+
Item: React.FC<ContextMenuItemProps>;
|
|
57
|
+
Divider: React.FC<ContextMenuDividerProps>;
|
|
58
|
+
SubMenu: React.FC<ContextMenuSubMenuProps>;
|
|
59
|
+
};
|
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
export type MenuMode = 'vertical' | 'horizontal' | 'inline';
|
|
3
|
+
export type MenuSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
4
|
+
export interface MenuItem {
|
|
5
|
+
key: string;
|
|
6
|
+
label: React.ReactNode;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
children?: MenuItem[];
|
|
10
|
+
divider?: boolean;
|
|
11
|
+
title?: boolean;
|
|
12
|
+
}
|
|
3
13
|
export interface MenuProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {
|
|
4
|
-
|
|
14
|
+
/** Menu items (compound pattern) */
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
/** Menu items (data-driven pattern) */
|
|
17
|
+
items?: MenuItem[];
|
|
18
|
+
/** Menu display mode */
|
|
5
19
|
mode?: MenuMode;
|
|
20
|
+
/** Menu size */
|
|
21
|
+
size?: MenuSize;
|
|
22
|
+
/** Controlled selected keys */
|
|
6
23
|
selectedKeys?: string[];
|
|
24
|
+
/** Default selected keys (uncontrolled) */
|
|
7
25
|
defaultSelectedKeys?: string[];
|
|
26
|
+
/** Controlled open submenu keys */
|
|
8
27
|
openKeys?: string[];
|
|
28
|
+
/** Default open submenu keys (uncontrolled) */
|
|
9
29
|
defaultOpenKeys?: string[];
|
|
30
|
+
/** Callback when item is selected */
|
|
10
31
|
onSelect?: (key: string) => void;
|
|
32
|
+
/** Callback when submenu open state changes */
|
|
11
33
|
onOpenChange?: (openKeys: string[]) => void;
|
|
12
34
|
}
|
|
13
35
|
export interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLAnchorElement>, 'onClick'> {
|
|
@@ -22,7 +44,10 @@ export interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLAnchorEleme
|
|
|
22
44
|
export interface MenuSubMenuProps extends React.HTMLAttributes<HTMLLIElement> {
|
|
23
45
|
children: React.ReactNode;
|
|
24
46
|
itemKey: string;
|
|
25
|
-
label
|
|
47
|
+
/** Submenu label */
|
|
48
|
+
label?: React.ReactNode;
|
|
49
|
+
/** Submenu title (alias for label) */
|
|
50
|
+
title?: React.ReactNode;
|
|
26
51
|
icon?: React.ReactNode;
|
|
27
52
|
disabled?: boolean;
|
|
28
53
|
}
|
|
@@ -31,9 +56,9 @@ export interface MenuTitleProps extends React.HTMLAttributes<HTMLLIElement> {
|
|
|
31
56
|
}
|
|
32
57
|
export interface MenuDividerProps extends React.HTMLAttributes<HTMLLIElement> {
|
|
33
58
|
}
|
|
34
|
-
declare function MenuRoot({ children, mode, selectedKeys: controlledSelectedKeys, defaultSelectedKeys, openKeys: controlledOpenKeys, defaultOpenKeys, onSelect, onOpenChange, className, ...rest }: MenuProps): import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
declare function MenuRoot({ children, items, mode, size, selectedKeys: controlledSelectedKeys, defaultSelectedKeys, openKeys: controlledOpenKeys, defaultOpenKeys, onSelect, onOpenChange, className, ...rest }: MenuProps): import("react/jsx-runtime").JSX.Element;
|
|
35
60
|
declare function MenuItem({ children, itemKey, icon, disabled, onClick, active, className, ...rest }: MenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
-
declare function MenuSubMenu({ children, itemKey, label, icon, disabled, className, ...rest }: MenuSubMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
declare function MenuSubMenu({ children, itemKey, label, title, icon, disabled, className, ...rest }: MenuSubMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
37
62
|
declare function MenuTitle({ children, className, ...rest }: MenuTitleProps): import("react/jsx-runtime").JSX.Element;
|
|
38
63
|
declare function MenuDivider({ className, ...rest }: MenuDividerProps): import("react/jsx-runtime").JSX.Element;
|
|
39
64
|
export declare const Menu: typeof MenuRoot & {
|
package/dist/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export type { CollapseProps, CollapseTitleProps, CollapseContentProps } from './
|
|
|
33
33
|
export { Container } from './components/Container';
|
|
34
34
|
export type { ContainerProps } from './components/Container';
|
|
35
35
|
export { ContextMenu } from './components/ContextMenu';
|
|
36
|
-
export type { ContextMenuProps, ContextMenuItem } from './components/ContextMenu';
|
|
36
|
+
export type { ContextMenuProps, ContextMenuItem, ContextMenuItemProps, ContextMenuDividerProps, ContextMenuSubMenuProps } from './components/ContextMenu';
|
|
37
37
|
export { Countdown } from './components/Countdown';
|
|
38
38
|
export type { CountdownProps } from './components/Countdown';
|
|
39
39
|
export { DatePicker } from './components/DatePicker';
|
|
@@ -97,7 +97,7 @@ export type { MasonryProps } from './components/Masonry';
|
|
|
97
97
|
export { Mention } from './components/Mention';
|
|
98
98
|
export type { MentionProps, MentionOption } from './components/Mention';
|
|
99
99
|
export { Menu } from './components/Menu';
|
|
100
|
-
export type { MenuProps, MenuItemProps, MenuSubMenuProps, MenuTitleProps, MenuDividerProps, MenuMode } from './components/Menu';
|
|
100
|
+
export type { MenuProps, MenuItem, MenuItemProps, MenuSubMenuProps, MenuTitleProps, MenuDividerProps, MenuMode, MenuSize } from './components/Menu';
|
|
101
101
|
export { Browser } from './components/Browser';
|
|
102
102
|
export type { BrowserProps } from './components/Browser';
|
|
103
103
|
export { Code } from './components/Code';
|
package/dist/index19.js
CHANGED
|
@@ -1,25 +1,107 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { createPortal as
|
|
4
|
-
const
|
|
5
|
-
const
|
|
1
|
+
import { jsxs as b, Fragment as P, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import T, { useState as g, useRef as C, useCallback as M, useEffect as N, createContext as W, useContext as z } from "react";
|
|
3
|
+
import { createPortal as B } from "react-dom";
|
|
4
|
+
const E = W(null), I = () => {
|
|
5
|
+
const e = z(E);
|
|
6
|
+
if (!e)
|
|
7
|
+
throw new Error("ContextMenu compound components must be used within a ContextMenu");
|
|
8
|
+
return e;
|
|
9
|
+
}, A = ({
|
|
10
|
+
itemKey: e,
|
|
11
|
+
children: u,
|
|
12
|
+
icon: l,
|
|
13
|
+
disabled: s = !1,
|
|
14
|
+
danger: d = !1,
|
|
15
|
+
className: o = ""
|
|
16
|
+
}) => {
|
|
17
|
+
const { onSelect: h, onClose: t } = I();
|
|
18
|
+
return /* @__PURE__ */ n("li", { className: o, children: /* @__PURE__ */ b(
|
|
19
|
+
"button",
|
|
20
|
+
{
|
|
21
|
+
onClick: () => {
|
|
22
|
+
s || (h(e), t());
|
|
23
|
+
},
|
|
24
|
+
disabled: s,
|
|
25
|
+
className: `
|
|
26
|
+
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
27
|
+
${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
|
|
28
|
+
${d ? "text-error hover:bg-error/10" : ""}
|
|
29
|
+
`,
|
|
30
|
+
children: [
|
|
31
|
+
l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
|
|
32
|
+
/* @__PURE__ */ n("span", { className: "flex-1", children: u })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
) });
|
|
36
|
+
}, H = ({ className: e = "" }) => /* @__PURE__ */ n("li", { className: `divider my-1 ${e}` }), K = ({
|
|
37
|
+
itemKey: e,
|
|
38
|
+
label: u,
|
|
39
|
+
icon: l,
|
|
40
|
+
disabled: s = !1,
|
|
41
|
+
children: d,
|
|
42
|
+
className: o = ""
|
|
43
|
+
}) => {
|
|
44
|
+
const [h, t] = g(!1), a = C(null), c = () => {
|
|
45
|
+
s || (a.current && clearTimeout(a.current), t(!0));
|
|
46
|
+
}, m = () => {
|
|
47
|
+
a.current = setTimeout(() => t(!1), 100);
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ b(
|
|
50
|
+
"li",
|
|
51
|
+
{
|
|
52
|
+
onMouseEnter: c,
|
|
53
|
+
onMouseLeave: m,
|
|
54
|
+
className: `relative ${o}`,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ b(
|
|
57
|
+
"button",
|
|
58
|
+
{
|
|
59
|
+
disabled: s,
|
|
60
|
+
className: `
|
|
61
|
+
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
62
|
+
${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
|
|
63
|
+
`,
|
|
64
|
+
children: [
|
|
65
|
+
l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
|
|
66
|
+
/* @__PURE__ */ n("span", { className: "flex-1", children: u }),
|
|
67
|
+
/* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
h && /* @__PURE__ */ n(
|
|
72
|
+
"ul",
|
|
73
|
+
{
|
|
74
|
+
className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
|
|
75
|
+
onMouseEnter: c,
|
|
76
|
+
onMouseLeave: m,
|
|
77
|
+
children: d
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}, L = ({ item: e, onSelect: u, onClose: l }) => {
|
|
84
|
+
const [s, d] = g(!1), o = C(null);
|
|
6
85
|
if (e.divider)
|
|
7
|
-
return /* @__PURE__ */
|
|
8
|
-
const
|
|
9
|
-
e.disabled || e.children && e.children.length > 0 || (
|
|
10
|
-
}, t = e.children && e.children.length > 0
|
|
11
|
-
|
|
86
|
+
return /* @__PURE__ */ n("li", { className: "divider my-1" });
|
|
87
|
+
const h = () => {
|
|
88
|
+
e.disabled || e.children && e.children.length > 0 || (u(e.key), l());
|
|
89
|
+
}, t = e.children && e.children.length > 0, a = () => {
|
|
90
|
+
t && (o.current && clearTimeout(o.current), d(!0));
|
|
91
|
+
}, c = () => {
|
|
92
|
+
t && (o.current = setTimeout(() => d(!1), 100));
|
|
93
|
+
};
|
|
94
|
+
return /* @__PURE__ */ b(
|
|
12
95
|
"li",
|
|
13
96
|
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
onMouseLeave: () => t && m(!1),
|
|
97
|
+
onMouseEnter: a,
|
|
98
|
+
onMouseLeave: c,
|
|
17
99
|
className: "relative",
|
|
18
100
|
children: [
|
|
19
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ b(
|
|
20
102
|
"button",
|
|
21
103
|
{
|
|
22
|
-
onClick:
|
|
104
|
+
onClick: h,
|
|
23
105
|
disabled: e.disabled,
|
|
24
106
|
className: `
|
|
25
107
|
flex items-center gap-2 w-full px-4 py-2 text-left text-sm
|
|
@@ -27,75 +109,91 @@ const C = ({ item: e, onSelect: h, onClose: c }) => {
|
|
|
27
109
|
${e.danger ? "text-error hover:bg-error/10" : ""}
|
|
28
110
|
`,
|
|
29
111
|
children: [
|
|
30
|
-
e.icon && /* @__PURE__ */
|
|
31
|
-
/* @__PURE__ */
|
|
32
|
-
t && /* @__PURE__ */
|
|
112
|
+
e.icon && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: e.icon }),
|
|
113
|
+
/* @__PURE__ */ n("span", { className: "flex-1", children: e.label }),
|
|
114
|
+
t && /* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
33
115
|
]
|
|
34
116
|
}
|
|
35
117
|
),
|
|
36
|
-
t &&
|
|
118
|
+
t && s && /* @__PURE__ */ n(
|
|
119
|
+
"ul",
|
|
120
|
+
{
|
|
121
|
+
className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
|
|
122
|
+
onMouseEnter: a,
|
|
123
|
+
onMouseLeave: c,
|
|
124
|
+
children: e.children.map((m) => /* @__PURE__ */ n(L, { item: m, onSelect: u, onClose: l }, m.key))
|
|
125
|
+
}
|
|
126
|
+
)
|
|
37
127
|
]
|
|
38
128
|
}
|
|
39
129
|
);
|
|
40
|
-
},
|
|
130
|
+
}, O = ({
|
|
41
131
|
children: e,
|
|
42
|
-
items:
|
|
43
|
-
onSelect:
|
|
44
|
-
disabled:
|
|
45
|
-
className:
|
|
132
|
+
items: u,
|
|
133
|
+
onSelect: l,
|
|
134
|
+
disabled: s = !1,
|
|
135
|
+
className: d = ""
|
|
46
136
|
}) => {
|
|
47
|
-
const [
|
|
48
|
-
(
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
let
|
|
52
|
-
|
|
137
|
+
const [o, h] = g(!1), [t, a] = g({ x: 0, y: 0 }), c = C(null), m = C(null), S = M(
|
|
138
|
+
(r) => {
|
|
139
|
+
if (s) return;
|
|
140
|
+
r.preventDefault(), r.stopPropagation();
|
|
141
|
+
let i = r.clientX, f = r.clientY;
|
|
142
|
+
a({ x: i, y: f }), h(!0);
|
|
53
143
|
},
|
|
54
|
-
[
|
|
55
|
-
),
|
|
56
|
-
|
|
57
|
-
}, []),
|
|
58
|
-
(
|
|
59
|
-
|
|
144
|
+
[s]
|
|
145
|
+
), x = M(() => {
|
|
146
|
+
h(!1);
|
|
147
|
+
}, []), y = M(
|
|
148
|
+
(r) => {
|
|
149
|
+
l?.(r);
|
|
60
150
|
},
|
|
61
|
-
[
|
|
151
|
+
[l]
|
|
62
152
|
);
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
const
|
|
66
|
-
let { x:
|
|
67
|
-
|
|
153
|
+
N(() => {
|
|
154
|
+
if (o && c.current) {
|
|
155
|
+
const i = c.current.getBoundingClientRect(), f = window.innerWidth, p = window.innerHeight;
|
|
156
|
+
let { x: v, y: w } = t;
|
|
157
|
+
v + i.width > f && (v = f - i.width - 8), w + i.height > p && (w = p - i.height - 8), (v !== t.x || w !== t.y) && a({ x: v, y: w });
|
|
68
158
|
}
|
|
69
|
-
}, [
|
|
70
|
-
if (!
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
},
|
|
76
|
-
|
|
159
|
+
}, [o, t]), N(() => {
|
|
160
|
+
if (!o) return;
|
|
161
|
+
const r = (p) => {
|
|
162
|
+
c.current && !c.current.contains(p.target) && x();
|
|
163
|
+
}, i = (p) => {
|
|
164
|
+
p.key === "Escape" && x();
|
|
165
|
+
}, f = () => {
|
|
166
|
+
x();
|
|
77
167
|
};
|
|
78
|
-
return document.addEventListener("mousedown",
|
|
79
|
-
document.removeEventListener("mousedown",
|
|
168
|
+
return document.addEventListener("mousedown", r), document.addEventListener("keydown", i), document.addEventListener("scroll", f, !0), () => {
|
|
169
|
+
document.removeEventListener("mousedown", r), document.removeEventListener("keydown", i), document.removeEventListener("scroll", f, !0);
|
|
80
170
|
};
|
|
81
|
-
}, [
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
171
|
+
}, [o, x]);
|
|
172
|
+
const k = T.Children.toArray(e), R = k[0], $ = k.slice(1), j = u && u.length > 0, D = {
|
|
173
|
+
onSelect: y,
|
|
174
|
+
onClose: x
|
|
175
|
+
};
|
|
176
|
+
return /* @__PURE__ */ b(P, { children: [
|
|
177
|
+
/* @__PURE__ */ n("div", { ref: m, onContextMenu: S, className: "inline-block", children: R }),
|
|
178
|
+
o && B(
|
|
179
|
+
/* @__PURE__ */ n(E.Provider, { value: D, children: /* @__PURE__ */ n(
|
|
85
180
|
"ul",
|
|
86
181
|
{
|
|
87
|
-
ref:
|
|
88
|
-
className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${
|
|
182
|
+
ref: c,
|
|
183
|
+
className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${d}`,
|
|
89
184
|
style: { left: t.x, top: t.y },
|
|
90
|
-
children:
|
|
185
|
+
children: j ? u.map((r) => /* @__PURE__ */ n(L, { item: r, onSelect: y, onClose: x }, r.key)) : $
|
|
91
186
|
}
|
|
92
|
-
),
|
|
187
|
+
) }),
|
|
93
188
|
document.body
|
|
94
189
|
)
|
|
95
190
|
] });
|
|
96
|
-
}
|
|
97
|
-
|
|
191
|
+
}, Y = Object.assign(O, {
|
|
192
|
+
Item: A,
|
|
193
|
+
Divider: H,
|
|
194
|
+
SubMenu: K
|
|
195
|
+
});
|
|
98
196
|
export {
|
|
99
|
-
|
|
197
|
+
Y as ContextMenu
|
|
100
198
|
};
|
|
101
199
|
//# sourceMappingURL=index19.js.map
|
package/dist/index19.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index19.js","sources":["../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ContextMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n children?: ContextMenuItem[]\n}\n\nexport interface ContextMenuProps {\n /** Element that triggers the context menu on right-click */\n children: React.ReactNode\n /** Menu items */\n items: ContextMenuItem[]\n /** Callback when an item is selected */\n onSelect?: (key: string) => void\n /** Whether the context menu is disabled */\n disabled?: boolean\n /** Additional CSS classes for the menu */\n className?: string\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst MenuItem: React.FC<{\n item: ContextMenuItem\n onSelect: (key: string) => void\n onClose: () => void\n}> = ({ item, onSelect, onClose }) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const itemRef = useRef<HTMLLIElement>(null)\n\n if (item.divider) {\n return <li className=\"divider my-1\"></li>\n }\n\n const handleClick = () => {\n if (item.disabled) return\n if (item.children && item.children.length > 0) return\n onSelect(item.key)\n onClose()\n }\n\n const hasSubmenu = item.children && item.children.length > 0\n\n return (\n <li\n ref={itemRef}\n onMouseEnter={() => hasSubmenu && setShowSubmenu(true)}\n onMouseLeave={() => hasSubmenu && setShowSubmenu(false)}\n className=\"relative\"\n >\n <button\n onClick={handleClick}\n disabled={item.disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${item.danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {hasSubmenu && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n {hasSubmenu && showSubmenu && (\n <ul className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50\">\n {item.children!.map((child) => (\n <MenuItem key={child.key} item={child} onSelect={onSelect} onClose={onClose} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n children,\n items,\n onSelect,\n disabled = false,\n className = '',\n}) => {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 })\n const menuRef = useRef<HTMLUListElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n e.stopPropagation()\n\n // Calculate position, ensuring menu stays within viewport\n let x = e.clientX\n let y = e.clientY\n\n // We'll adjust after render when we know menu dimensions\n setPosition({ x, y })\n setVisible(true)\n },\n [disabled]\n )\n\n const handleClose = useCallback(() => {\n setVisible(false)\n }, [])\n\n const handleSelect = useCallback(\n (key: string) => {\n onSelect?.(key)\n },\n [onSelect]\n )\n\n // Adjust position after menu renders to keep it in viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const menu = menuRef.current\n const rect = menu.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let { x, y } = position\n\n if (x + rect.width > viewportWidth) {\n x = viewportWidth - rect.width - 8\n }\n if (y + rect.height > viewportHeight) {\n y = viewportHeight - rect.height - 8\n }\n\n if (x !== position.x || y !== position.y) {\n setPosition({ x, y })\n }\n }\n }, [visible, position])\n\n // Close on click outside or escape\n useEffect(() => {\n if (!visible) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n handleClose()\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }\n\n const handleScroll = () => {\n handleClose()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n document.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }, [visible, handleClose])\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {children}\n </div>\n {visible &&\n createPortal(\n <ul\n ref={menuRef}\n className={`menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${className}`}\n style={{ left: position.x, top: position.y }}\n >\n {items.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))}\n </ul>,\n document.body\n )}\n </>\n )\n}\n\nContextMenu.displayName = 'ContextMenu'\n"],"names":["MenuItem","item","onSelect","onClose","showSubmenu","setShowSubmenu","useState","itemRef","useRef","jsx","handleClick","hasSubmenu","jsxs","child","ContextMenu","children","items","disabled","className","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","Fragment","createPortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index19.js","sources":["../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, createContext, useContext } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ContextMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n children?: ContextMenuItem[]\n}\n\nexport interface ContextMenuProps {\n /** Element that triggers the context menu on right-click */\n children: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: ContextMenuItem[]\n /** Callback when an item is selected */\n onSelect?: (key: string) => void\n /** Whether the context menu is disabled */\n disabled?: boolean\n /** Additional CSS classes for the menu */\n className?: string\n}\n\nexport interface ContextMenuItemProps {\n /** Unique key for the item */\n itemKey: string\n /** Item content */\n children: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the item is disabled */\n disabled?: boolean\n /** Show as danger/destructive action */\n danger?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuDividerProps {\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuSubMenuProps {\n /** Unique key for the submenu */\n itemKey: string\n /** Submenu label */\n label: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the submenu is disabled */\n disabled?: boolean\n /** Submenu items */\n children: React.ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\ninterface ContextMenuContextValue {\n onSelect: (key: string) => void\n onClose: () => void\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst ContextMenuContext = createContext<ContextMenuContextValue | null>(null)\n\nconst useContextMenuContext = () => {\n const context = useContext(ContextMenuContext)\n if (!context) {\n throw new Error('ContextMenu compound components must be used within a ContextMenu')\n }\n return context\n}\n\n// Compound pattern components\nconst ContextMenuItemComponent: React.FC<ContextMenuItemProps> = ({\n itemKey,\n children,\n icon,\n disabled = false,\n danger = false,\n className = '',\n}) => {\n const { onSelect, onClose } = useContextMenuContext()\n\n const handleClick = () => {\n if (disabled) return\n onSelect(itemKey)\n onClose()\n }\n\n return (\n <li className={className}>\n <button\n onClick={handleClick}\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n </button>\n </li>\n )\n}\n\nconst ContextMenuDividerComponent: React.FC<ContextMenuDividerProps> = ({ className = '' }) => {\n return <li className={`divider my-1 ${className}`}></li>\n}\n\nconst ContextMenuSubMenuComponent: React.FC<ContextMenuSubMenuProps> = ({\n itemKey: _itemKey,\n label,\n icon,\n disabled = false,\n children,\n className = '',\n}) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleMouseEnter = () => {\n if (disabled) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative ${className}`}\n >\n <button\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{label}</span>\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n {showSubmenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </ul>\n )}\n </li>\n )\n}\n\n// Data-driven pattern internal component\nconst MenuItem: React.FC<{\n item: ContextMenuItem\n onSelect: (key: string) => void\n onClose: () => void\n}> = ({ item, onSelect, onClose }) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n if (item.divider) {\n return <li className=\"divider my-1\"></li>\n }\n\n const handleClick = () => {\n if (item.disabled) return\n if (item.children && item.children.length > 0) return\n onSelect(item.key)\n onClose()\n }\n\n const hasSubmenu = item.children && item.children.length > 0\n\n const handleMouseEnter = () => {\n if (!hasSubmenu) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n if (!hasSubmenu) return\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className=\"relative\"\n >\n <button\n onClick={handleClick}\n disabled={item.disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${item.danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {hasSubmenu && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n {hasSubmenu && showSubmenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {item.children!.map((child) => (\n <MenuItem key={child.key} item={child} onSelect={onSelect} onClose={onClose} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nconst ContextMenuRoot: React.FC<ContextMenuProps> = ({\n children,\n items,\n onSelect,\n disabled = false,\n className = '',\n}) => {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 })\n const menuRef = useRef<HTMLUListElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n e.stopPropagation()\n\n // Calculate position, ensuring menu stays within viewport\n let x = e.clientX\n let y = e.clientY\n\n // We'll adjust after render when we know menu dimensions\n setPosition({ x, y })\n setVisible(true)\n },\n [disabled]\n )\n\n const handleClose = useCallback(() => {\n setVisible(false)\n }, [])\n\n const handleSelect = useCallback(\n (key: string) => {\n onSelect?.(key)\n },\n [onSelect]\n )\n\n // Adjust position after menu renders to keep it in viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const menu = menuRef.current\n const rect = menu.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let { x, y } = position\n\n if (x + rect.width > viewportWidth) {\n x = viewportWidth - rect.width - 8\n }\n if (y + rect.height > viewportHeight) {\n y = viewportHeight - rect.height - 8\n }\n\n if (x !== position.x || y !== position.y) {\n setPosition({ x, y })\n }\n }\n }, [visible, position])\n\n // Close on click outside or escape\n useEffect(() => {\n if (!visible) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n handleClose()\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }\n\n const handleScroll = () => {\n handleClose()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n document.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }, [visible, handleClose])\n\n // Determine if using data-driven or compound pattern\n // Find menu content children (not the trigger element)\n const childArray = React.Children.toArray(children)\n const triggerChild = childArray[0]\n const menuChildren = childArray.slice(1)\n const useDataDriven = items && items.length > 0\n\n const contextValue: ContextMenuContextValue = {\n onSelect: handleSelect,\n onClose: handleClose,\n }\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {triggerChild}\n </div>\n {visible &&\n createPortal(\n <ContextMenuContext.Provider value={contextValue}>\n <ul\n ref={menuRef}\n className={`menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${className}`}\n style={{ left: position.x, top: position.y }}\n >\n {useDataDriven\n ? items!.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))\n : menuChildren}\n </ul>\n </ContextMenuContext.Provider>,\n document.body\n )}\n </>\n )\n}\n\n// Assign compound components\nexport const ContextMenu = Object.assign(ContextMenuRoot, {\n Item: ContextMenuItemComponent,\n Divider: ContextMenuDividerComponent,\n SubMenu: ContextMenuSubMenuComponent,\n})\n"],"names":["ContextMenuContext","createContext","useContextMenuContext","context","useContext","ContextMenuItemComponent","itemKey","children","icon","disabled","danger","className","onSelect","onClose","jsx","jsxs","ContextMenuDividerComponent","ContextMenuSubMenuComponent","_itemKey","label","showSubmenu","setShowSubmenu","useState","timeoutRef","useRef","handleMouseEnter","handleMouseLeave","MenuItem","item","handleClick","hasSubmenu","child","ContextMenuRoot","items","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","childArray","React","triggerChild","menuChildren","useDataDriven","contextValue","Fragment","createPortal","ContextMenu"],"mappings":"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"}
|
package/dist/index3.js
CHANGED
|
@@ -1,100 +1,116 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
const
|
|
4
|
-
const o =
|
|
1
|
+
import { jsx as a, jsxs as W } from "react/jsx-runtime";
|
|
2
|
+
import { useState as R, useRef as V, useCallback as y, useEffect as $, createContext as X, useContext as Z } from "react";
|
|
3
|
+
const C = X(null), _ = () => {
|
|
4
|
+
const o = Z(C);
|
|
5
5
|
if (!o)
|
|
6
6
|
throw new Error("Anchor.Link must be used within an Anchor");
|
|
7
7
|
return o;
|
|
8
|
-
},
|
|
8
|
+
}, Y = ({
|
|
9
9
|
href: o,
|
|
10
|
-
title:
|
|
11
|
-
children:
|
|
12
|
-
className:
|
|
10
|
+
title: h,
|
|
11
|
+
children: c,
|
|
12
|
+
className: f = ""
|
|
13
13
|
}) => {
|
|
14
|
-
const { activeLink:
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
return /* @__PURE__ */
|
|
18
|
-
/* @__PURE__ */
|
|
14
|
+
const { activeLink: r, direction: k, registerLink: l, unregisterLink: w, handleClick: x } = _();
|
|
15
|
+
$(() => (l(o), () => w(o)), [o, l, w]);
|
|
16
|
+
const v = r === o, d = k === "vertical";
|
|
17
|
+
return /* @__PURE__ */ W("div", { className: d ? "" : "inline-block", children: [
|
|
18
|
+
/* @__PURE__ */ a(
|
|
19
19
|
"a",
|
|
20
20
|
{
|
|
21
21
|
href: `#${o}`,
|
|
22
|
-
onClick: (
|
|
22
|
+
onClick: (b) => x(b, o, h),
|
|
23
23
|
className: `
|
|
24
24
|
block text-sm transition-colors
|
|
25
|
-
${
|
|
26
|
-
${
|
|
27
|
-
${
|
|
25
|
+
${d ? "py-1 pl-3 border-l-2" : "px-3 py-1 border-b-2"}
|
|
26
|
+
${v ? "text-primary border-primary font-medium" : "text-base-content/70 border-transparent hover:text-base-content hover:border-base-content/30"}
|
|
27
|
+
${f}
|
|
28
28
|
`.trim(),
|
|
29
|
-
children:
|
|
29
|
+
children: h
|
|
30
30
|
}
|
|
31
31
|
),
|
|
32
|
-
|
|
32
|
+
c && /* @__PURE__ */ a("div", { className: d ? "pl-3" : "inline-flex", children: c })
|
|
33
33
|
] });
|
|
34
|
-
},
|
|
34
|
+
}, O = ({
|
|
35
35
|
items: o,
|
|
36
|
-
direction:
|
|
37
|
-
offsetTop:
|
|
36
|
+
direction: h = "vertical",
|
|
37
|
+
offsetTop: c = 0,
|
|
38
|
+
bounds: f = 5,
|
|
38
39
|
getContainer: r,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
getCurrentAnchor: k,
|
|
41
|
+
onChange: l,
|
|
42
|
+
onClick: w,
|
|
43
|
+
activeLink: x,
|
|
44
|
+
affix: v = !1,
|
|
45
|
+
affixOffsetTop: d = 0,
|
|
46
|
+
replace: b = !1,
|
|
47
|
+
className: D = "",
|
|
48
|
+
children: q
|
|
44
49
|
}) => {
|
|
45
|
-
const [
|
|
46
|
-
|
|
47
|
-
}, []),
|
|
48
|
-
|
|
49
|
-
}, []),
|
|
50
|
+
const [F, H] = R(""), [i, N] = R([]), [m, G] = R(!1), p = V(null), B = V(null), g = x !== void 0, L = g ? x : F, J = k ? k(L) : L, K = y((n) => {
|
|
51
|
+
N((t) => t.includes(n) ? t : [...t, n]);
|
|
52
|
+
}, []), M = y((n) => {
|
|
53
|
+
N((t) => t.filter((e) => e !== n));
|
|
54
|
+
}, []), T = y((n) => {
|
|
50
55
|
const t = document.getElementById(n);
|
|
51
56
|
if (t) {
|
|
52
|
-
const e = r?.() ?? window,
|
|
53
|
-
e === window ? window.scrollTo({ top:
|
|
57
|
+
const e = r?.() ?? window, s = t.getBoundingClientRect().top, u = e === window ? 0 : e.getBoundingClientRect().top, E = e === window ? window.scrollY : e.scrollTop, A = s - u + E - c;
|
|
58
|
+
e === window ? window.scrollTo({ top: A, behavior: "smooth" }) : e.scrollTo({ top: A, behavior: "smooth" }), b ? window.history.replaceState(null, "", `#${n}`) : window.history.pushState(null, "", `#${n}`);
|
|
54
59
|
}
|
|
55
|
-
}, [r,
|
|
56
|
-
n.preventDefault(),
|
|
57
|
-
}, [
|
|
58
|
-
|
|
59
|
-
if (
|
|
60
|
+
}, [r, c, b]), Q = y((n, t, e) => {
|
|
61
|
+
n.preventDefault(), w?.(n, { href: t, title: e }), T(t), g || H(t), l?.(t);
|
|
62
|
+
}, [w, T, g, l]);
|
|
63
|
+
$(() => {
|
|
64
|
+
if (!v || !p.current) return;
|
|
65
|
+
const n = r?.() ?? window, t = () => {
|
|
66
|
+
if (!p.current || !B.current) return;
|
|
67
|
+
const e = B.current.getBoundingClientRect(), s = n === window ? 0 : n.getBoundingClientRect().top, u = e.top - s <= d;
|
|
68
|
+
u !== m && G(u);
|
|
69
|
+
};
|
|
70
|
+
return n.addEventListener("scroll", t, { passive: !0 }), t(), () => n.removeEventListener("scroll", t);
|
|
71
|
+
}, [v, d, r, m]), $(() => {
|
|
72
|
+
if (i.length === 0) return;
|
|
60
73
|
const n = r?.() ?? window, t = () => {
|
|
61
74
|
let e = "";
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
64
|
-
e =
|
|
75
|
+
const s = n === window ? document.documentElement : n, u = n === window ? 0 : s.getBoundingClientRect().top, E = n === window ? window.scrollY : s.scrollTop, A = s.scrollHeight, U = n === window ? window.innerHeight : s.clientHeight;
|
|
76
|
+
if (E + U >= A - 10 && i.length > 0)
|
|
77
|
+
e = i[i.length - 1];
|
|
65
78
|
else {
|
|
66
|
-
for (const
|
|
67
|
-
const
|
|
68
|
-
|
|
79
|
+
for (const z of i) {
|
|
80
|
+
const P = document.getElementById(z);
|
|
81
|
+
P && P.getBoundingClientRect().top - u - c <= f && (e = z);
|
|
69
82
|
}
|
|
70
|
-
!e &&
|
|
83
|
+
!e && i.length > 0 && (e = i[0]);
|
|
71
84
|
}
|
|
72
|
-
e && e !==
|
|
85
|
+
e && e !== L && (g || H(e), l?.(e));
|
|
73
86
|
};
|
|
74
87
|
return n.addEventListener("scroll", t, { passive: !0 }), t(), () => n.removeEventListener("scroll", t);
|
|
75
|
-
}, [
|
|
76
|
-
const
|
|
77
|
-
activeLink:
|
|
78
|
-
direction:
|
|
79
|
-
offsetTop:
|
|
80
|
-
registerLink:
|
|
81
|
-
unregisterLink:
|
|
82
|
-
handleClick:
|
|
83
|
-
},
|
|
84
|
-
return /* @__PURE__ */ m($.Provider, { value: S, children: /* @__PURE__ */ m(
|
|
88
|
+
}, [i, r, c, f, L, g, l]);
|
|
89
|
+
const I = {
|
|
90
|
+
activeLink: J,
|
|
91
|
+
direction: h,
|
|
92
|
+
offsetTop: c,
|
|
93
|
+
registerLink: K,
|
|
94
|
+
unregisterLink: M,
|
|
95
|
+
handleClick: Q
|
|
96
|
+
}, S = (n) => n.map((t) => /* @__PURE__ */ a(Y, { href: t.href, title: t.title, children: t.children && S(t.children) }, t.href)), j = /* @__PURE__ */ a(
|
|
85
97
|
"nav",
|
|
86
98
|
{
|
|
99
|
+
ref: p,
|
|
87
100
|
className: `
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
101
|
+
${h === "horizontal" ? "flex items-center" : "flex flex-col"}
|
|
102
|
+
${m ? "fixed bg-base-100 shadow-sm z-10" : ""}
|
|
103
|
+
${D}
|
|
104
|
+
`.trim(),
|
|
105
|
+
style: m ? { top: d } : void 0,
|
|
106
|
+
children: o ? S(o) : q
|
|
92
107
|
}
|
|
93
|
-
)
|
|
94
|
-
},
|
|
95
|
-
|
|
108
|
+
);
|
|
109
|
+
return v ? /* @__PURE__ */ a(C.Provider, { value: I, children: /* @__PURE__ */ a("div", { ref: B, style: m && p.current ? { height: p.current.offsetHeight } : void 0, children: j }) }) : /* @__PURE__ */ a(C.Provider, { value: I, children: j });
|
|
110
|
+
}, rt = Object.assign(O, {
|
|
111
|
+
Link: Y
|
|
96
112
|
});
|
|
97
113
|
export {
|
|
98
|
-
|
|
114
|
+
rt as Anchor
|
|
99
115
|
};
|
|
100
116
|
//# sourceMappingURL=index3.js.map
|
package/dist/index3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index3.js","sources":["../src/components/Anchor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, createContext, useContext } from 'react'\n\nexport interface AnchorLinkItem {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: AnchorLinkItem[]\n}\n\nexport interface AnchorProps {\n /** Anchor links (alternative to Anchor.Link children) */\n items?: AnchorLinkItem[]\n /** Layout direction */\n direction?: 'horizontal' | 'vertical'\n /** Offset from top when calculating scroll position */\n offsetTop?: number\n /** Target scroll container (default: window) */\n getContainer?: () => HTMLElement | Window\n /** Callback when active link changes */\n onChange?: (activeLink: string) => void\n /** Callback when link is clicked */\n onClick?: (e: React.MouseEvent, link: { href: string; title: React.ReactNode }) => void\n /** Currently active link (controlled) */\n activeLink?: string\n /** Custom class name */\n className?: string\n /** Anchor.Link children */\n children?: React.ReactNode\n}\n\nexport interface AnchorLinkProps {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: React.ReactNode\n /** Custom class name */\n className?: string\n}\n\ninterface AnchorContextValue {\n activeLink: string\n direction: 'horizontal' | 'vertical'\n offsetTop: number\n registerLink: (href: string) => void\n unregisterLink: (href: string) => void\n handleClick: (e: React.MouseEvent, href: string, title: React.ReactNode) => void\n}\n\nconst AnchorContext = createContext<AnchorContextValue | null>(null)\n\nconst useAnchorContext = () => {\n const context = useContext(AnchorContext)\n if (!context) {\n throw new Error('Anchor.Link must be used within an Anchor')\n }\n return context\n}\n\nconst AnchorLink: React.FC<AnchorLinkProps> = ({\n href,\n title,\n children,\n className = '',\n}) => {\n const { activeLink, direction, registerLink, unregisterLink, handleClick } = useAnchorContext()\n\n useEffect(() => {\n registerLink(href)\n return () => unregisterLink(href)\n }, [href, registerLink, unregisterLink])\n\n const isActive = activeLink === href\n const isVertical = direction === 'vertical'\n\n return (\n <div className={isVertical ? '' : 'inline-block'}>\n <a\n href={`#${href}`}\n onClick={(e) => handleClick(e, href, title)}\n className={`\n block text-sm transition-colors\n ${isVertical ? 'py-1 pl-3 border-l-2' : 'px-3 py-1 border-b-2'}\n ${isActive\n ? 'text-primary border-primary font-medium'\n : 'text-base-content/70 border-transparent hover:text-base-content hover:border-base-content/30'\n }\n ${className}\n `.trim()}\n >\n {title}\n </a>\n {children && (\n <div className={isVertical ? 'pl-3' : 'inline-flex'}>\n {children}\n </div>\n )}\n </div>\n )\n}\n\nconst AnchorComponent: React.FC<AnchorProps> = ({\n items,\n direction = 'vertical',\n offsetTop = 0,\n getContainer,\n onChange,\n onClick,\n activeLink: controlledActiveLink,\n className = '',\n children,\n}) => {\n const [internalActiveLink, setInternalActiveLink] = useState('')\n const [links, setLinks] = useState<string[]>([])\n\n const isControlled = controlledActiveLink !== undefined\n const activeLink = isControlled ? controlledActiveLink : internalActiveLink\n\n const registerLink = useCallback((href: string) => {\n setLinks((prev) => (prev.includes(href) ? prev : [...prev, href]))\n }, [])\n\n const unregisterLink = useCallback((href: string) => {\n setLinks((prev) => prev.filter((link) => link !== href))\n }, [])\n\n const scrollToTarget = useCallback((href: string) => {\n const target = document.getElementById(href)\n if (target) {\n const container = getContainer?.() ?? window\n const targetTop = target.getBoundingClientRect().top\n const containerTop = container === window\n ? 0\n : (container as HTMLElement).getBoundingClientRect().top\n const scrollTop = container === window\n ? window.scrollY\n : (container as HTMLElement).scrollTop\n\n const top = targetTop - containerTop + scrollTop - offsetTop\n\n if (container === window) {\n window.scrollTo({ top, behavior: 'smooth' })\n } else {\n (container as HTMLElement).scrollTo({ top, behavior: 'smooth' })\n }\n }\n }, [getContainer, offsetTop])\n\n const handleClick = useCallback((\n e: React.MouseEvent,\n href: string,\n title: React.ReactNode\n ) => {\n e.preventDefault()\n onClick?.(e, { href, title })\n scrollToTarget(href)\n\n if (!isControlled) {\n setInternalActiveLink(href)\n }\n onChange?.(href)\n }, [onClick, scrollToTarget, isControlled, onChange])\n\n // Scroll spy\n useEffect(() => {\n if (links.length === 0) return\n\n const container = getContainer?.() ?? window\n\n const handleScroll = () => {\n let currentActive = ''\n const containerEl = container === window ? document.documentElement : container as HTMLElement\n const containerTop = container === window\n ? 0\n : containerEl.getBoundingClientRect().top\n\n // Check if scrolled to near the bottom\n const scrollTop = container === window ? window.scrollY : containerEl.scrollTop\n const scrollHeight = containerEl.scrollHeight\n const clientHeight = container === window ? window.innerHeight : containerEl.clientHeight\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - 10\n\n // If near bottom, use the last link\n if (isNearBottom && links.length > 0) {\n currentActive = links[links.length - 1]\n } else {\n // Find the last element that has scrolled past the top (standard scroll spy behavior)\n for (const href of links) {\n const element = document.getElementById(href)\n if (element) {\n const rect = element.getBoundingClientRect()\n const distance = rect.top - containerTop - offsetTop\n\n // If element's top is at or above the threshold, it's the current section\n if (distance <= 10) {\n currentActive = href\n }\n }\n }\n\n // If nothing matched, use the first link\n if (!currentActive && links.length > 0) {\n currentActive = links[0]\n }\n }\n\n if (currentActive && currentActive !== activeLink) {\n if (!isControlled) {\n setInternalActiveLink(currentActive)\n }\n onChange?.(currentActive)\n }\n }\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll() // Initial check\n\n return () => container.removeEventListener('scroll', handleScroll)\n }, [links, getContainer, offsetTop, activeLink, isControlled, onChange])\n\n const contextValue: AnchorContextValue = {\n activeLink,\n direction,\n offsetTop,\n registerLink,\n unregisterLink,\n handleClick,\n }\n\n const renderItems = (linkItems: AnchorLinkItem[]): React.ReactNode => {\n return linkItems.map((item) => (\n <AnchorLink key={item.href} href={item.href} title={item.title}>\n {item.children && renderItems(item.children)}\n </AnchorLink>\n ))\n }\n\n return (\n <AnchorContext.Provider value={contextValue}>\n <nav\n className={`\n ${direction === 'horizontal' ? 'flex items-center' : 'flex flex-col'}\n ${className}\n `.trim()}\n >\n {items ? renderItems(items) : children}\n </nav>\n </AnchorContext.Provider>\n )\n}\n\nexport const Anchor = Object.assign(AnchorComponent, {\n Link: AnchorLink,\n})\n"],"names":["AnchorContext","createContext","useAnchorContext","context","useContext","AnchorLink","href","title","children","className","activeLink","direction","registerLink","unregisterLink","handleClick","useEffect","isActive","isVertical","jsxs","jsx","e","AnchorComponent","items","offsetTop","getContainer","onChange","onClick","controlledActiveLink","internalActiveLink","setInternalActiveLink","useState","links","setLinks","isControlled","useCallback","prev","link","scrollToTarget","target","container","targetTop","containerTop","scrollTop","top","handleScroll","currentActive","containerEl","scrollHeight","clientHeight","element","contextValue","renderItems","linkItems","item","Anchor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index3.js","sources":["../src/components/Anchor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, createContext, useContext, useRef } from 'react'\n\nexport interface AnchorLinkItem {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: AnchorLinkItem[]\n}\n\nexport interface AnchorProps {\n /** Anchor links (alternative to Anchor.Link children) */\n items?: AnchorLinkItem[]\n /** Layout direction */\n direction?: 'horizontal' | 'vertical'\n /** Offset from top when calculating scroll position */\n offsetTop?: number\n /** Bounding distance of anchor area */\n bounds?: number\n /** Target scroll container (default: window) */\n getContainer?: () => HTMLElement | Window\n /** Customize the anchor highlight */\n getCurrentAnchor?: (activeLink: string) => string\n /** Callback when active link changes */\n onChange?: (activeLink: string) => void\n /** Callback when link is clicked */\n onClick?: (e: React.MouseEvent, link: { href: string; title: React.ReactNode }) => void\n /** Currently active link (controlled) */\n activeLink?: string\n /** Whether to fix the anchor when scrolling */\n affix?: boolean\n /** Pixels to offset from top when affix is true */\n affixOffsetTop?: number\n /** Replace history instead of push */\n replace?: boolean\n /** Custom class name */\n className?: string\n /** Anchor.Link children */\n children?: React.ReactNode\n}\n\nexport interface AnchorLinkProps {\n /** Target element id (without #) */\n href: string\n /** Link title */\n title: React.ReactNode\n /** Nested links */\n children?: React.ReactNode\n /** Custom class name */\n className?: string\n}\n\ninterface AnchorContextValue {\n activeLink: string\n direction: 'horizontal' | 'vertical'\n offsetTop: number\n registerLink: (href: string) => void\n unregisterLink: (href: string) => void\n handleClick: (e: React.MouseEvent, href: string, title: React.ReactNode) => void\n}\n\nconst AnchorContext = createContext<AnchorContextValue | null>(null)\n\nconst useAnchorContext = () => {\n const context = useContext(AnchorContext)\n if (!context) {\n throw new Error('Anchor.Link must be used within an Anchor')\n }\n return context\n}\n\nconst AnchorLink: React.FC<AnchorLinkProps> = ({\n href,\n title,\n children,\n className = '',\n}) => {\n const { activeLink, direction, registerLink, unregisterLink, handleClick } = useAnchorContext()\n\n useEffect(() => {\n registerLink(href)\n return () => unregisterLink(href)\n }, [href, registerLink, unregisterLink])\n\n const isActive = activeLink === href\n const isVertical = direction === 'vertical'\n\n return (\n <div className={isVertical ? '' : 'inline-block'}>\n <a\n href={`#${href}`}\n onClick={(e) => handleClick(e, href, title)}\n className={`\n block text-sm transition-colors\n ${isVertical ? 'py-1 pl-3 border-l-2' : 'px-3 py-1 border-b-2'}\n ${isActive\n ? 'text-primary border-primary font-medium'\n : 'text-base-content/70 border-transparent hover:text-base-content hover:border-base-content/30'\n }\n ${className}\n `.trim()}\n >\n {title}\n </a>\n {children && (\n <div className={isVertical ? 'pl-3' : 'inline-flex'}>\n {children}\n </div>\n )}\n </div>\n )\n}\n\nconst AnchorComponent: React.FC<AnchorProps> = ({\n items,\n direction = 'vertical',\n offsetTop = 0,\n bounds = 5,\n getContainer,\n getCurrentAnchor,\n onChange,\n onClick,\n activeLink: controlledActiveLink,\n affix = false,\n affixOffsetTop = 0,\n replace = false,\n className = '',\n children,\n}) => {\n const [internalActiveLink, setInternalActiveLink] = useState('')\n const [links, setLinks] = useState<string[]>([])\n const [isAffixed, setIsAffixed] = useState(false)\n const anchorRef = useRef<HTMLDivElement>(null)\n const placeholderRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledActiveLink !== undefined\n const rawActiveLink = isControlled ? controlledActiveLink : internalActiveLink\n const activeLink = getCurrentAnchor ? getCurrentAnchor(rawActiveLink) : rawActiveLink\n\n const registerLink = useCallback((href: string) => {\n setLinks((prev) => (prev.includes(href) ? prev : [...prev, href]))\n }, [])\n\n const unregisterLink = useCallback((href: string) => {\n setLinks((prev) => prev.filter((link) => link !== href))\n }, [])\n\n const scrollToTarget = useCallback((href: string) => {\n const target = document.getElementById(href)\n if (target) {\n const container = getContainer?.() ?? window\n const targetTop = target.getBoundingClientRect().top\n const containerTop = container === window\n ? 0\n : (container as HTMLElement).getBoundingClientRect().top\n const scrollTop = container === window\n ? window.scrollY\n : (container as HTMLElement).scrollTop\n\n const top = targetTop - containerTop + scrollTop - offsetTop\n\n if (container === window) {\n window.scrollTo({ top, behavior: 'smooth' })\n } else {\n (container as HTMLElement).scrollTo({ top, behavior: 'smooth' })\n }\n\n // Update URL hash\n if (replace) {\n window.history.replaceState(null, '', `#${href}`)\n } else {\n window.history.pushState(null, '', `#${href}`)\n }\n }\n }, [getContainer, offsetTop, replace])\n\n const handleClick = useCallback((\n e: React.MouseEvent,\n href: string,\n title: React.ReactNode\n ) => {\n e.preventDefault()\n onClick?.(e, { href, title })\n scrollToTarget(href)\n\n if (!isControlled) {\n setInternalActiveLink(href)\n }\n onChange?.(href)\n }, [onClick, scrollToTarget, isControlled, onChange])\n\n // Affix logic\n useEffect(() => {\n if (!affix || !anchorRef.current) return\n\n const container = getContainer?.() ?? window\n\n const handleScroll = () => {\n if (!anchorRef.current || !placeholderRef.current) return\n\n const placeholderRect = placeholderRef.current.getBoundingClientRect()\n const containerTop = container === window\n ? 0\n : (container as HTMLElement).getBoundingClientRect().top\n\n const shouldAffix = placeholderRect.top - containerTop <= affixOffsetTop\n\n if (shouldAffix !== isAffixed) {\n setIsAffixed(shouldAffix)\n }\n }\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll()\n\n return () => container.removeEventListener('scroll', handleScroll)\n }, [affix, affixOffsetTop, getContainer, isAffixed])\n\n // Scroll spy\n useEffect(() => {\n if (links.length === 0) return\n\n const container = getContainer?.() ?? window\n\n const handleScroll = () => {\n let currentActive = ''\n const containerEl = container === window ? document.documentElement : container as HTMLElement\n const containerTop = container === window\n ? 0\n : containerEl.getBoundingClientRect().top\n\n // Check if scrolled to near the bottom\n const scrollTop = container === window ? window.scrollY : containerEl.scrollTop\n const scrollHeight = containerEl.scrollHeight\n const clientHeight = container === window ? window.innerHeight : containerEl.clientHeight\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - 10\n\n // If near bottom, use the last link\n if (isNearBottom && links.length > 0) {\n currentActive = links[links.length - 1]\n } else {\n // Find the last element that has scrolled past the top (standard scroll spy behavior)\n for (const href of links) {\n const element = document.getElementById(href)\n if (element) {\n const rect = element.getBoundingClientRect()\n const distance = rect.top - containerTop - offsetTop\n\n // If element's top is within bounds of the threshold, it's the current section\n if (distance <= bounds) {\n currentActive = href\n }\n }\n }\n\n // If nothing matched, use the first link\n if (!currentActive && links.length > 0) {\n currentActive = links[0]\n }\n }\n\n if (currentActive && currentActive !== rawActiveLink) {\n if (!isControlled) {\n setInternalActiveLink(currentActive)\n }\n onChange?.(currentActive)\n }\n }\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n handleScroll() // Initial check\n\n return () => container.removeEventListener('scroll', handleScroll)\n }, [links, getContainer, offsetTop, bounds, rawActiveLink, isControlled, onChange])\n\n const contextValue: AnchorContextValue = {\n activeLink,\n direction,\n offsetTop,\n registerLink,\n unregisterLink,\n handleClick,\n }\n\n const renderItems = (linkItems: AnchorLinkItem[]): React.ReactNode => {\n return linkItems.map((item) => (\n <AnchorLink key={item.href} href={item.href} title={item.title}>\n {item.children && renderItems(item.children)}\n </AnchorLink>\n ))\n }\n\n const anchorContent = (\n <nav\n ref={anchorRef}\n className={`\n ${direction === 'horizontal' ? 'flex items-center' : 'flex flex-col'}\n ${isAffixed ? 'fixed bg-base-100 shadow-sm z-10' : ''}\n ${className}\n `.trim()}\n style={isAffixed ? { top: affixOffsetTop } : undefined}\n >\n {items ? renderItems(items) : children}\n </nav>\n )\n\n if (affix) {\n return (\n <AnchorContext.Provider value={contextValue}>\n <div ref={placeholderRef} style={isAffixed && anchorRef.current ? { height: anchorRef.current.offsetHeight } : undefined}>\n {anchorContent}\n </div>\n </AnchorContext.Provider>\n )\n }\n\n return (\n <AnchorContext.Provider value={contextValue}>\n {anchorContent}\n </AnchorContext.Provider>\n )\n}\n\nexport const Anchor = Object.assign(AnchorComponent, {\n Link: AnchorLink,\n})\n"],"names":["AnchorContext","createContext","useAnchorContext","context","useContext","AnchorLink","href","title","children","className","activeLink","direction","registerLink","unregisterLink","handleClick","useEffect","isActive","isVertical","jsxs","jsx","e","AnchorComponent","items","offsetTop","bounds","getContainer","getCurrentAnchor","onChange","onClick","controlledActiveLink","affix","affixOffsetTop","replace","internalActiveLink","setInternalActiveLink","useState","links","setLinks","isAffixed","setIsAffixed","anchorRef","useRef","placeholderRef","isControlled","rawActiveLink","useCallback","prev","link","scrollToTarget","target","container","targetTop","containerTop","scrollTop","top","handleScroll","placeholderRect","shouldAffix","currentActive","containerEl","scrollHeight","clientHeight","element","contextValue","renderItems","linkItems","item","anchorContent","Anchor"],"mappings":"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"}
|
package/dist/index51.js
CHANGED
|
@@ -1,150 +1,156 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
const
|
|
4
|
-
function
|
|
5
|
-
const
|
|
6
|
-
if (!
|
|
1
|
+
import { jsx as l, jsxs as b } from "react/jsx-runtime";
|
|
2
|
+
import { useState as C, useCallback as M, createContext as V, useId as q, useContext as N } from "react";
|
|
3
|
+
const y = V(null);
|
|
4
|
+
function A() {
|
|
5
|
+
const e = N(y);
|
|
6
|
+
if (!e)
|
|
7
7
|
throw new Error("Menu components must be used within a Menu");
|
|
8
|
-
return
|
|
8
|
+
return e;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
children:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
10
|
+
function j(e, n, s, a, o) {
|
|
11
|
+
return e.divider ? /* @__PURE__ */ l(S, {}, e.key) : e.title ? /* @__PURE__ */ l(K, { children: e.label }, e.key) : e.children && e.children.length > 0 ? /* @__PURE__ */ l(I, { itemKey: e.key, label: e.label, icon: e.icon, disabled: e.disabled, children: e.children.map((i) => j(i)) }, e.key) : /* @__PURE__ */ l(k, { itemKey: e.key, icon: e.icon, disabled: e.disabled, children: e.label }, e.key);
|
|
12
|
+
}
|
|
13
|
+
function F({
|
|
14
|
+
children: e,
|
|
15
|
+
items: n,
|
|
16
|
+
mode: s = "vertical",
|
|
17
|
+
size: a,
|
|
18
|
+
selectedKeys: o,
|
|
19
|
+
defaultSelectedKeys: i = [],
|
|
20
|
+
openKeys: d,
|
|
21
|
+
defaultOpenKeys: m = [],
|
|
22
|
+
onSelect: r,
|
|
23
|
+
onOpenChange: t,
|
|
24
|
+
className: c = "",
|
|
25
|
+
...p
|
|
21
26
|
}) {
|
|
22
|
-
const [
|
|
23
|
-
(
|
|
24
|
-
|
|
27
|
+
const [x, v] = C(i), [f, T] = C(m), O = o ?? x, h = d ?? f, B = M(
|
|
28
|
+
(u) => {
|
|
29
|
+
o === void 0 && v([u]), r?.(u);
|
|
25
30
|
},
|
|
26
|
-
[
|
|
27
|
-
),
|
|
28
|
-
(
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
+
[o, r]
|
|
32
|
+
), w = M(
|
|
33
|
+
(u) => {
|
|
34
|
+
const g = h.includes(u) ? h.filter((R) => R !== u) : [...h, u];
|
|
35
|
+
d === void 0 && T(g), t?.(g);
|
|
31
36
|
},
|
|
32
|
-
[h,
|
|
33
|
-
),
|
|
34
|
-
vertical: "",
|
|
37
|
+
[h, d, t]
|
|
38
|
+
), D = {
|
|
39
|
+
vertical: "menu-vertical",
|
|
35
40
|
horizontal: "menu-horizontal",
|
|
36
|
-
inline: ""
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
41
|
+
inline: "menu-vertical"
|
|
42
|
+
}, z = {
|
|
43
|
+
xs: "menu-xs",
|
|
44
|
+
sm: "menu-sm",
|
|
45
|
+
md: "menu-md",
|
|
46
|
+
lg: "menu-lg",
|
|
47
|
+
xl: "menu-xl"
|
|
48
|
+
}, E = ["menu", D[s], a && z[a], c].filter(Boolean).join(" "), L = {
|
|
49
|
+
mode: s,
|
|
50
|
+
selectedKeys: O,
|
|
51
|
+
openKeys: h,
|
|
52
|
+
onSelect: B,
|
|
53
|
+
onToggleOpen: w
|
|
54
|
+
}, P = n && n.length > 0 ? n.map((u) => j(u)) : e;
|
|
55
|
+
return /* @__PURE__ */ l(y.Provider, { value: L, children: /* @__PURE__ */ l("ul", { className: E, ...p, children: P }) });
|
|
51
56
|
}
|
|
52
|
-
function
|
|
53
|
-
children:
|
|
54
|
-
itemKey:
|
|
55
|
-
icon:
|
|
57
|
+
function k({
|
|
58
|
+
children: e,
|
|
59
|
+
itemKey: n,
|
|
60
|
+
icon: s,
|
|
56
61
|
disabled: a = !1,
|
|
57
|
-
onClick:
|
|
58
|
-
active:
|
|
59
|
-
className:
|
|
60
|
-
...
|
|
62
|
+
onClick: o,
|
|
63
|
+
active: i,
|
|
64
|
+
className: d = "",
|
|
65
|
+
...m
|
|
61
66
|
}) {
|
|
62
|
-
const
|
|
63
|
-
a || (
|
|
64
|
-
},
|
|
65
|
-
|
|
67
|
+
const r = N(y), t = n && r ? r.selectedKeys.includes(n) : i, c = () => {
|
|
68
|
+
a || (n && r && r.onSelect(n), o?.());
|
|
69
|
+
}, p = [
|
|
70
|
+
t && "active bg-primary text-primary-content",
|
|
66
71
|
a && "disabled",
|
|
67
|
-
|
|
72
|
+
d
|
|
68
73
|
].filter(Boolean).join(" ");
|
|
69
|
-
return /* @__PURE__ */
|
|
74
|
+
return /* @__PURE__ */ l("li", { children: /* @__PURE__ */ b(
|
|
70
75
|
"a",
|
|
71
76
|
{
|
|
72
|
-
className:
|
|
73
|
-
onClick:
|
|
77
|
+
className: p,
|
|
78
|
+
onClick: c,
|
|
74
79
|
"aria-disabled": a,
|
|
75
80
|
role: "menuitem",
|
|
76
|
-
"data-state":
|
|
77
|
-
...
|
|
81
|
+
"data-state": t ? "active" : "inactive",
|
|
82
|
+
...m,
|
|
78
83
|
children: [
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
s && /* @__PURE__ */ l("span", { className: "menu-icon", children: s }),
|
|
85
|
+
e
|
|
81
86
|
]
|
|
82
87
|
}
|
|
83
88
|
) });
|
|
84
89
|
}
|
|
85
|
-
function
|
|
86
|
-
children:
|
|
87
|
-
itemKey:
|
|
88
|
-
label:
|
|
89
|
-
|
|
90
|
+
function I({
|
|
91
|
+
children: e,
|
|
92
|
+
itemKey: n,
|
|
93
|
+
label: s,
|
|
94
|
+
title: a,
|
|
95
|
+
icon: o,
|
|
90
96
|
disabled: i = !1,
|
|
91
|
-
className:
|
|
92
|
-
...
|
|
97
|
+
className: d = "",
|
|
98
|
+
...m
|
|
93
99
|
}) {
|
|
94
|
-
const r =
|
|
95
|
-
i || r.onToggleOpen(
|
|
96
|
-
},
|
|
97
|
-
return r.mode === "inline" ? /* @__PURE__ */
|
|
98
|
-
/* @__PURE__ */
|
|
100
|
+
const r = A(), t = r.openKeys.includes(n), c = q(), p = s ?? a, x = () => {
|
|
101
|
+
i || r.onToggleOpen(n);
|
|
102
|
+
}, v = [i && "disabled", d].filter(Boolean).join(" ");
|
|
103
|
+
return r.mode === "inline" ? /* @__PURE__ */ l("li", { className: v, "data-state": t ? "open" : "closed", ...m, children: /* @__PURE__ */ b("details", { open: t, children: [
|
|
104
|
+
/* @__PURE__ */ b(
|
|
99
105
|
"summary",
|
|
100
106
|
{
|
|
101
|
-
onClick: (
|
|
102
|
-
|
|
107
|
+
onClick: (f) => {
|
|
108
|
+
f.preventDefault(), x();
|
|
103
109
|
},
|
|
104
|
-
"aria-expanded":
|
|
105
|
-
"aria-controls":
|
|
110
|
+
"aria-expanded": t,
|
|
111
|
+
"aria-controls": c,
|
|
106
112
|
"aria-disabled": i,
|
|
107
113
|
children: [
|
|
108
|
-
|
|
109
|
-
|
|
114
|
+
o && /* @__PURE__ */ l("span", { className: "menu-icon", children: o }),
|
|
115
|
+
p
|
|
110
116
|
]
|
|
111
117
|
}
|
|
112
118
|
),
|
|
113
|
-
/* @__PURE__ */
|
|
114
|
-
] }) }) : /* @__PURE__ */
|
|
115
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ l("ul", { id: c, role: "menu", children: e })
|
|
120
|
+
] }) }) : /* @__PURE__ */ l("li", { className: v, "data-state": t ? "open" : "closed", ...m, children: /* @__PURE__ */ b("details", { open: t, children: [
|
|
121
|
+
/* @__PURE__ */ b(
|
|
116
122
|
"summary",
|
|
117
123
|
{
|
|
118
|
-
onClick: (
|
|
119
|
-
|
|
124
|
+
onClick: (f) => {
|
|
125
|
+
f.preventDefault(), x();
|
|
120
126
|
},
|
|
121
|
-
"aria-expanded":
|
|
122
|
-
"aria-controls":
|
|
127
|
+
"aria-expanded": t,
|
|
128
|
+
"aria-controls": c,
|
|
123
129
|
"aria-disabled": i,
|
|
124
130
|
children: [
|
|
125
|
-
|
|
126
|
-
|
|
131
|
+
o && /* @__PURE__ */ l("span", { className: "menu-icon", children: o }),
|
|
132
|
+
p
|
|
127
133
|
]
|
|
128
134
|
}
|
|
129
135
|
),
|
|
130
|
-
/* @__PURE__ */
|
|
136
|
+
/* @__PURE__ */ l("ul", { id: c, role: "menu", children: e })
|
|
131
137
|
] }) });
|
|
132
138
|
}
|
|
133
|
-
function
|
|
134
|
-
const a = ["menu-title",
|
|
135
|
-
return /* @__PURE__ */
|
|
139
|
+
function K({ children: e, className: n = "", ...s }) {
|
|
140
|
+
const a = ["menu-title", n].filter(Boolean).join(" ");
|
|
141
|
+
return /* @__PURE__ */ l("li", { className: a, ...s, children: e });
|
|
136
142
|
}
|
|
137
|
-
function
|
|
138
|
-
const
|
|
139
|
-
return /* @__PURE__ */
|
|
143
|
+
function S({ className: e = "", ...n }) {
|
|
144
|
+
const s = ["border-t border-base-300 my-1", e].filter(Boolean).join(" ");
|
|
145
|
+
return /* @__PURE__ */ l("li", { className: s, role: "separator", ...n });
|
|
140
146
|
}
|
|
141
|
-
const
|
|
142
|
-
Item:
|
|
143
|
-
SubMenu:
|
|
144
|
-
Title:
|
|
145
|
-
Divider:
|
|
147
|
+
const J = Object.assign(F, {
|
|
148
|
+
Item: k,
|
|
149
|
+
SubMenu: I,
|
|
150
|
+
Title: K,
|
|
151
|
+
Divider: S
|
|
146
152
|
});
|
|
147
153
|
export {
|
|
148
|
-
|
|
154
|
+
J as Menu
|
|
149
155
|
};
|
|
150
156
|
//# sourceMappingURL=index51.js.map
|
package/dist/index51.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index51.js","sources":["../src/components/Menu.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useId } from 'react'\n\nexport type MenuMode = 'vertical' | 'horizontal' | 'inline'\n\nexport interface MenuProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n children: React.ReactNode\n mode?: MenuMode\n selectedKeys?: string[]\n defaultSelectedKeys?: string[]\n openKeys?: string[]\n defaultOpenKeys?: string[]\n onSelect?: (key: string) => void\n onOpenChange?: (openKeys: string[]) => void\n}\n\nexport interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLAnchorElement>, 'onClick'> {\n children: React.ReactNode\n itemKey?: string\n icon?: React.ReactNode\n disabled?: boolean\n onClick?: () => void\n /** @deprecated Use itemKey and selectedKeys instead */\n active?: boolean\n}\n\nexport interface MenuSubMenuProps extends React.HTMLAttributes<HTMLLIElement> {\n children: React.ReactNode\n itemKey: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\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\nfunction MenuRoot({\n children,\n mode = 'vertical',\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: '',\n horizontal: 'menu-horizontal',\n inline: '',\n }\n\n const menuClasses = ['menu', modeClasses[mode], className].filter(Boolean).join(' ')\n\n return (\n <MenuContext.Provider\n value={{\n mode,\n selectedKeys,\n openKeys,\n onSelect: handleSelect,\n onToggleOpen: handleToggleOpen,\n }}\n >\n <ul className={menuClasses} {...rest}>{children}</ul>\n </MenuContext.Provider>\n )\n}\n\nfunction MenuItem({\n children,\n itemKey,\n icon,\n disabled = false,\n onClick,\n active,\n className = '',\n ...rest\n}: MenuItemProps) {\n const context = useContext(MenuContext)\n\n // Support both old active prop and new key-based selection\n const isSelected = itemKey && context ? context.selectedKeys.includes(itemKey) : active\n\n const handleClick = () => {\n if (disabled) return\n if (itemKey && context) {\n context.onSelect(itemKey)\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=\"menu-icon\">{icon}</span>}\n {children}\n </a>\n </li>\n )\n}\n\nfunction MenuSubMenu({\n children,\n itemKey,\n label,\n icon,\n disabled = false,\n className = '',\n ...rest\n}: MenuSubMenuProps) {\n const context = useMenuContext()\n const isOpen = context.openKeys.includes(itemKey)\n const submenuId = useId()\n\n const handleToggle = () => {\n if (disabled) return\n context.onToggleOpen(itemKey)\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=\"menu-icon\">{icon}</span>}\n {label}\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=\"menu-icon\">{icon}</span>}\n {label}\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 = ['menu-title', 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":["MenuContext","createContext","useMenuContext","context","useContext","MenuRoot","children","mode","controlledSelectedKeys","defaultSelectedKeys","controlledOpenKeys","defaultOpenKeys","onSelect","onOpenChange","className","rest","internalSelectedKeys","setInternalSelectedKeys","useState","internalOpenKeys","setInternalOpenKeys","selectedKeys","openKeys","handleSelect","useCallback","key","handleToggleOpen","newOpenKeys","k","menuClasses","jsx","MenuItem","itemKey","icon","disabled","onClick","active","isSelected","handleClick","itemClasses","jsxs","MenuSubMenu","label","isOpen","submenuId","useId","handleToggle","submenuClasses","e","MenuTitle","titleClasses","MenuDivider","dividerClasses","Menu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index51.js","sources":["../src/components/Menu.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback, useId } from 'react'\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 itemKey?: string\n icon?: React.ReactNode\n disabled?: boolean\n onClick?: () => void\n /** @deprecated Use itemKey and selectedKeys instead */\n active?: boolean\n}\n\nexport interface MenuSubMenuProps extends React.HTMLAttributes<HTMLLIElement> {\n children: React.ReactNode\n itemKey: string\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}\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} itemKey={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} itemKey={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: 'menu-vertical',\n horizontal: 'menu-horizontal',\n inline: 'menu-vertical',\n }\n\n const sizeClasses: Record<MenuSize, string> = {\n xs: 'menu-xs',\n sm: 'menu-sm',\n md: 'menu-md',\n lg: 'menu-lg',\n xl: 'menu-xl',\n }\n\n const menuClasses = ['menu', 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 // Render data-driven items if provided\n const content = items && items.length > 0\n ? items.map((item) => renderMenuItem(item, handleSelect, selectedKeys, openKeys, handleToggleOpen))\n : 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 itemKey,\n icon,\n disabled = false,\n onClick,\n active,\n className = '',\n ...rest\n}: MenuItemProps) {\n const context = useContext(MenuContext)\n\n // Support both old active prop and new key-based selection\n const isSelected = itemKey && context ? context.selectedKeys.includes(itemKey) : active\n\n const handleClick = () => {\n if (disabled) return\n if (itemKey && context) {\n context.onSelect(itemKey)\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=\"menu-icon\">{icon}</span>}\n {children}\n </a>\n </li>\n )\n}\n\nfunction MenuSubMenu({\n children,\n itemKey,\n label,\n title,\n icon,\n disabled = false,\n className = '',\n ...rest\n}: MenuSubMenuProps) {\n const context = useMenuContext()\n const isOpen = context.openKeys.includes(itemKey)\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) return\n context.onToggleOpen(itemKey)\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=\"menu-icon\">{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=\"menu-icon\">{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 = ['menu-title', 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":["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","content","itemKey","icon","disabled","onClick","active","isSelected","handleClick","itemClasses","jsxs","label","title","isOpen","submenuId","useId","displayLabel","handleToggle","submenuClasses","e","titleClasses","dividerClasses","Menu"],"mappings":"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"}
|
package/dist/index8.js
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { jsx as n, jsxs as f } from "react/jsx-runtime";
|
|
2
|
+
import u from "react";
|
|
3
|
+
function x({ children: c, items: r, separator: t, className: o = "", ...i }) {
|
|
4
|
+
const s = t !== void 0, a = typeof t == "string" ? "px-2" : "px-1", m = () => !r || r.length === 0 ? null : r.map((e, l) => {
|
|
5
|
+
const d = l === r.length - 1;
|
|
6
|
+
return /* @__PURE__ */ f(u.Fragment, { children: [
|
|
7
|
+
/* @__PURE__ */ n("li", { className: e.className, children: e.href || e.onClick ? /* @__PURE__ */ n("a", { href: e.href, onClick: e.onClick, children: e.title }) : e.title }),
|
|
8
|
+
s && !d && /* @__PURE__ */ n("li", { className: `flex items-center ${a} text-base-content/50`, children: t })
|
|
9
|
+
] }, l);
|
|
10
|
+
}), b = () => {
|
|
11
|
+
if (r && r.length > 0)
|
|
12
|
+
return m();
|
|
13
|
+
if (s && c) {
|
|
14
|
+
const e = u.Children.toArray(c), l = [];
|
|
15
|
+
return e.forEach((d, h) => {
|
|
16
|
+
l.push(d), h < e.length - 1 && l.push(
|
|
17
|
+
/* @__PURE__ */ n("li", { className: `flex items-center ${a} text-base-content/50`, children: t }, `sep-${h}`)
|
|
18
|
+
);
|
|
19
|
+
}), l;
|
|
20
|
+
}
|
|
21
|
+
return c;
|
|
22
|
+
}, p = s ? `breadcrumbs text-sm [&_li::before]:!hidden ${o}` : `breadcrumbs text-sm ${o}`;
|
|
23
|
+
return /* @__PURE__ */ n("div", { className: p, ...i, children: /* @__PURE__ */ n("ul", { children: b() }) });
|
|
4
24
|
}
|
|
5
|
-
function
|
|
6
|
-
|
|
25
|
+
function g({ children: c, href: r, onClick: t, icon: o, className: i = "", ...s }) {
|
|
26
|
+
const a = o ? /* @__PURE__ */ f("span", { className: "inline-flex items-center gap-2", children: [
|
|
27
|
+
o,
|
|
28
|
+
c
|
|
29
|
+
] }) : c;
|
|
30
|
+
return r || t ? /* @__PURE__ */ n("li", { className: i, ...s, children: /* @__PURE__ */ n("a", { href: r, onClick: t, children: a }) }) : /* @__PURE__ */ n("li", { className: i, ...s, children: a });
|
|
7
31
|
}
|
|
8
|
-
const
|
|
9
|
-
Item:
|
|
32
|
+
const N = Object.assign(x, {
|
|
33
|
+
Item: g
|
|
10
34
|
});
|
|
11
35
|
export {
|
|
12
|
-
|
|
36
|
+
N as Breadcrumb
|
|
13
37
|
};
|
|
14
38
|
//# sourceMappingURL=index8.js.map
|
package/dist/index8.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index8.js","sources":["../src/components/Breadcrumb.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children
|
|
1
|
+
{"version":3,"file":"index8.js","sources":["../src/components/Breadcrumb.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface BreadcrumbItemType {\n /** Item title/label */\n title: React.ReactNode\n /** Link URL */\n href?: string\n /** Click handler */\n onClick?: () => void\n /** Custom class name */\n className?: string\n}\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Breadcrumb.Item children (compound pattern) */\n children?: React.ReactNode\n /** Breadcrumb items data (data-driven pattern) */\n items?: BreadcrumbItemType[]\n /** Custom separator between items */\n separator?: React.ReactNode\n}\n\nexport interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'onClick'> {\n children: React.ReactNode\n href?: string\n onClick?: () => void\n /** Icon to display before the label */\n icon?: React.ReactNode\n}\n\nfunction BreadcrumbRoot({ children, items, separator, className = '', ...rest }: BreadcrumbProps) {\n const hasCustomSeparator = separator !== undefined\n // Text separators need more padding than icon separators\n const separatorPadding = typeof separator === 'string' ? 'px-2' : 'px-1'\n\n const renderFromItems = () => {\n if (!items || items.length === 0) return null\n\n return items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <li className={item.className}>\n {item.href || item.onClick ? (\n <a href={item.href} onClick={item.onClick}>\n {item.title}\n </a>\n ) : (\n item.title\n )}\n </li>\n {hasCustomSeparator && !isLast && (\n <li className={`flex items-center ${separatorPadding} text-base-content/50`}>\n {separator}\n </li>\n )}\n </React.Fragment>\n )\n })\n }\n\n const renderChildren = () => {\n if (items && items.length > 0) {\n return renderFromItems()\n }\n\n if (hasCustomSeparator && children) {\n // Insert custom separator nodes between children\n const childArray = React.Children.toArray(children)\n const result: React.ReactNode[] = []\n childArray.forEach((child, index) => {\n result.push(child)\n if (index < childArray.length - 1) {\n result.push(\n <li key={`sep-${index}`} className={`flex items-center ${separatorPadding} text-base-content/50`}>\n {separator}\n </li>\n )\n }\n })\n return result\n }\n\n return children\n }\n\n // When custom separator is provided, hide default DaisyUI separator\n const cssClass = hasCustomSeparator\n ? `breadcrumbs text-sm [&_li::before]:!hidden ${className}`\n : `breadcrumbs text-sm ${className}`\n\n return (\n <div className={cssClass} {...rest}>\n <ul>{renderChildren()}</ul>\n </div>\n )\n}\n\nfunction BreadcrumbItem({ children, href, onClick, icon, className = '', ...rest }: BreadcrumbItemProps) {\n const content = icon ? (\n <span className=\"inline-flex items-center gap-2\">\n {icon}\n {children}\n </span>\n ) : children\n\n if (href || onClick) {\n return (\n <li className={className} {...rest}>\n <a href={href} onClick={onClick}>\n {content}\n </a>\n </li>\n )\n }\n\n return <li className={className} {...rest}>{content}</li>\n}\n\nexport const Breadcrumb = Object.assign(BreadcrumbRoot, {\n Item: BreadcrumbItem,\n})\n"],"names":["BreadcrumbRoot","children","items","separator","className","rest","hasCustomSeparator","separatorPadding","renderFromItems","item","index","isLast","jsxs","React","jsx","renderChildren","childArray","result","child","cssClass","BreadcrumbItem","href","onClick","icon","content","Breadcrumb"],"mappings":";;AA8BA,SAASA,EAAe,EAAE,UAAAC,GAAU,OAAAC,GAAO,WAAAC,GAAW,WAAAC,IAAY,IAAI,GAAGC,KAAyB;AAChG,QAAMC,IAAqBH,MAAc,QAEnCI,IAAmB,OAAOJ,KAAc,WAAW,SAAS,QAE5DK,IAAkB,MAClB,CAACN,KAASA,EAAM,WAAW,IAAU,OAElCA,EAAM,IAAI,CAACO,GAAMC,MAAU;AAChC,UAAMC,IAASD,MAAUR,EAAM,SAAS;AACxC,WACE,gBAAAU,EAACC,EAAM,UAAN,EACC,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAWL,EAAK,WACjB,YAAK,QAAQA,EAAK,UACjB,gBAAAK,EAAC,KAAA,EAAE,MAAML,EAAK,MAAM,SAASA,EAAK,SAC/B,YAAK,MAAA,CACR,IAEAA,EAAK,MAAA,CAET;AAAA,MACCH,KAAsB,CAACK,KACtB,gBAAAG,EAAC,QAAG,WAAW,qBAAqBP,CAAgB,yBACjD,UAAAJ,EAAA,CACH;AAAA,IAAA,EAAA,GAbiBO,CAerB;AAAA,EAEJ,CAAC,GAGGK,IAAiB,MAAM;AAC3B,QAAIb,KAASA,EAAM,SAAS;AAC1B,aAAOM,EAAA;AAGT,QAAIF,KAAsBL,GAAU;AAElC,YAAMe,IAAaH,EAAM,SAAS,QAAQZ,CAAQ,GAC5CgB,IAA4B,CAAA;AAClC,aAAAD,EAAW,QAAQ,CAACE,GAAOR,MAAU;AACnC,QAAAO,EAAO,KAAKC,CAAK,GACbR,IAAQM,EAAW,SAAS,KAC9BC,EAAO;AAAA,UACL,gBAAAH,EAAC,QAAwB,WAAW,qBAAqBP,CAAgB,yBACtE,UAAAJ,EAAA,GADM,OAAOO,CAAK,EAErB;AAAA,QAAA;AAAA,MAGN,CAAC,GACMO;AAAA,IACT;AAEA,WAAOhB;AAAA,EACT,GAGMkB,IAAWb,IACb,8CAA8CF,CAAS,KACvD,uBAAuBA,CAAS;AAEpC,SACE,gBAAAU,EAAC,OAAA,EAAI,WAAWK,GAAW,GAAGd,GAC5B,UAAA,gBAAAS,EAAC,MAAA,EAAI,UAAAC,EAAA,EAAe,CAAE,EAAA,CACxB;AAEJ;AAEA,SAASK,EAAe,EAAE,UAAAnB,GAAU,MAAAoB,GAAM,SAAAC,GAAS,MAAAC,GAAM,WAAAnB,IAAY,IAAI,GAAGC,KAA6B;AACvG,QAAMmB,IAAUD,IACd,gBAAAX,EAAC,QAAA,EAAK,WAAU,kCACb,UAAA;AAAA,IAAAW;AAAA,IACAtB;AAAA,EAAA,EAAA,CACH,IACEA;AAEJ,SAAIoB,KAAQC,IAER,gBAAAR,EAAC,MAAA,EAAG,WAAAV,GAAuB,GAAGC,GAC5B,4BAAC,KAAA,EAAE,MAAAgB,GAAY,SAAAC,GACZ,UAAAE,EAAA,CACH,EAAA,CACF,IAIG,gBAAAV,EAAC,MAAA,EAAG,WAAAV,GAAuB,GAAGC,GAAO,UAAAmB,GAAQ;AACtD;AAEO,MAAMC,IAAa,OAAO,OAAOzB,GAAgB;AAAA,EACtD,MAAMoB;AACR,CAAC;"}
|