asterui 0.12.5 → 0.12.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Dropdown.d.ts +9 -1
- package/dist/components/FloatButton.d.ts +50 -11
- package/dist/index30.js +159 -55
- package/dist/index30.js.map +1 -1
- package/dist/index37.js +131 -108
- package/dist/index37.js.map +1 -1
- package/package.json +2 -2
|
@@ -4,6 +4,14 @@ export interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
4
4
|
hover?: boolean;
|
|
5
5
|
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
6
6
|
align?: 'start' | 'center' | 'end';
|
|
7
|
+
/** Controlled open state */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** Callback when open state changes */
|
|
10
|
+
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
/** Disable the dropdown */
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/** Show arrow pointing to trigger */
|
|
14
|
+
arrow?: boolean;
|
|
7
15
|
}
|
|
8
16
|
export interface DropdownTriggerProps {
|
|
9
17
|
children: React.ReactNode;
|
|
@@ -25,7 +33,7 @@ export interface DropdownItemProps {
|
|
|
25
33
|
export interface DropdownDividerProps {
|
|
26
34
|
className?: string;
|
|
27
35
|
}
|
|
28
|
-
declare function DropdownRoot({ children, hover, position, align, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
declare function DropdownRoot({ children, hover, position, align, open: controlledOpen, onOpenChange, disabled, arrow, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
29
37
|
declare function DropdownTrigger({ children, className }: DropdownTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
30
38
|
declare function DropdownMenu({ children, className }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
31
39
|
declare function DropdownItem({ children, onClick, active, disabled, danger, className, }: DropdownItemProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
export interface FloatButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/** Icon to display */
|
|
4
|
+
icon?: React.ReactNode;
|
|
5
|
+
/** Description text below icon */
|
|
6
|
+
description?: React.ReactNode;
|
|
5
7
|
/** Button type/color */
|
|
6
|
-
type?: 'default' | 'primary'
|
|
8
|
+
type?: 'default' | 'primary';
|
|
7
9
|
/** Button shape */
|
|
8
10
|
shape?: 'circle' | 'square';
|
|
9
|
-
/** Position on screen */
|
|
10
|
-
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
11
|
-
/** Distance from edge in pixels */
|
|
12
|
-
offset?: number;
|
|
13
11
|
/** Tooltip text */
|
|
14
12
|
tooltip?: string;
|
|
15
13
|
/** Tooltip placement */
|
|
16
14
|
tooltipPlacement?: 'left' | 'right' | 'top' | 'bottom';
|
|
15
|
+
/** Badge content */
|
|
16
|
+
badge?: number | React.ReactNode;
|
|
17
|
+
/** Link URL (renders as anchor) */
|
|
18
|
+
href?: string;
|
|
19
|
+
/** Link target */
|
|
20
|
+
target?: string;
|
|
21
|
+
/** @deprecated Use icon prop instead */
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
export interface FloatButtonGroupProps {
|
|
25
|
+
/** Child FloatButton components */
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
/** Arrange buttons in a quarter-circle (radial) layout */
|
|
28
|
+
flower?: boolean;
|
|
29
|
+
/** Button shape for children */
|
|
30
|
+
shape?: 'circle' | 'square';
|
|
31
|
+
/** Main trigger button icon */
|
|
32
|
+
icon?: React.ReactNode;
|
|
33
|
+
/** Main action button that replaces trigger when open (fab-main-action) */
|
|
34
|
+
mainAction?: React.ReactNode;
|
|
35
|
+
/** Click handler for main action button */
|
|
36
|
+
onMainAction?: () => void;
|
|
37
|
+
/** Show close button when open (fab-close) */
|
|
38
|
+
showClose?: boolean;
|
|
39
|
+
/** Button type/color */
|
|
40
|
+
type?: 'default' | 'primary';
|
|
41
|
+
/** Position on screen */
|
|
42
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
43
|
+
/** Distance from edge */
|
|
44
|
+
offset?: number;
|
|
45
|
+
/** Additional CSS classes */
|
|
46
|
+
className?: string;
|
|
47
|
+
/** Custom styles */
|
|
48
|
+
style?: React.CSSProperties;
|
|
17
49
|
}
|
|
18
50
|
export interface BackTopProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'onClick'> {
|
|
19
51
|
/** Scroll threshold to show button (pixels) */
|
|
@@ -22,13 +54,20 @@ export interface BackTopProps extends Omit<React.ButtonHTMLAttributes<HTMLButton
|
|
|
22
54
|
target?: () => HTMLElement | Window;
|
|
23
55
|
/** Click handler (called before scrolling) */
|
|
24
56
|
onClick?: () => void;
|
|
25
|
-
/** Custom
|
|
26
|
-
|
|
57
|
+
/** Custom icon */
|
|
58
|
+
icon?: React.ReactNode;
|
|
59
|
+
/** Duration of scroll animation in ms */
|
|
60
|
+
duration?: number;
|
|
27
61
|
/** Position on screen */
|
|
28
62
|
position?: 'bottom-right' | 'bottom-left';
|
|
29
63
|
/** Distance from edge in pixels */
|
|
30
64
|
offset?: number;
|
|
65
|
+
/** @deprecated Use icon prop instead */
|
|
66
|
+
children?: React.ReactNode;
|
|
31
67
|
}
|
|
32
|
-
|
|
68
|
+
interface FloatButtonComponent extends React.FC<FloatButtonProps> {
|
|
69
|
+
Group: React.FC<FloatButtonGroupProps>;
|
|
33
70
|
BackTop: React.FC<BackTopProps>;
|
|
34
|
-
}
|
|
71
|
+
}
|
|
72
|
+
export declare const FloatButton: FloatButtonComponent;
|
|
73
|
+
export {};
|
package/dist/index30.js
CHANGED
|
@@ -1,83 +1,187 @@
|
|
|
1
|
-
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
3
|
-
const
|
|
1
|
+
import { jsx as t, jsxs as N, Fragment as I } from "react/jsx-runtime";
|
|
2
|
+
import { useContext as C, createContext as F, useState as S, useEffect as W } from "react";
|
|
3
|
+
const y = () => /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }), E = () => /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 10l7-7m0 0l7 7m-7-7v18" }) }), M = () => /* @__PURE__ */ t("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-6 w-6", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ t("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }), f = F({ inGroup: !1 }), P = {
|
|
4
4
|
left: "tooltip-left",
|
|
5
5
|
right: "tooltip-right",
|
|
6
6
|
top: "tooltip-top",
|
|
7
7
|
bottom: "tooltip-bottom"
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
}, j = {
|
|
9
|
+
default: "btn-neutral",
|
|
10
|
+
primary: "btn-primary"
|
|
11
|
+
}, L = {
|
|
12
|
+
circle: "btn-circle",
|
|
13
|
+
square: "btn-square"
|
|
14
|
+
}, B = ({
|
|
15
|
+
icon: d,
|
|
16
|
+
description: l,
|
|
17
|
+
onClick: o,
|
|
18
|
+
type: p = "default",
|
|
19
|
+
shape: u = "circle",
|
|
20
|
+
className: w = "",
|
|
21
|
+
tooltip: c,
|
|
22
|
+
tooltipPlacement: v = "left",
|
|
23
|
+
badge: a,
|
|
24
|
+
href: e,
|
|
25
|
+
target: i,
|
|
26
|
+
children: g,
|
|
27
|
+
style: m,
|
|
28
|
+
...s
|
|
19
29
|
}) => {
|
|
20
|
-
const
|
|
30
|
+
const h = C(f), x = h.inGroup && h.shape || u, n = [
|
|
21
31
|
"btn",
|
|
22
32
|
"btn-lg",
|
|
23
33
|
"shadow-lg",
|
|
24
|
-
|
|
34
|
+
L[x],
|
|
35
|
+
j[p],
|
|
36
|
+
w
|
|
37
|
+
].filter(Boolean).join(" "), b = d || g || /* @__PURE__ */ t(y, {}), r = /* @__PURE__ */ t(I, { children: l ? /* @__PURE__ */ N("div", { className: "flex flex-col items-center", children: [
|
|
38
|
+
b,
|
|
39
|
+
/* @__PURE__ */ t("span", { className: "text-xs mt-1", children: l })
|
|
40
|
+
] }) : b });
|
|
41
|
+
if (h.inGroup)
|
|
42
|
+
return e ? /* @__PURE__ */ t(
|
|
43
|
+
"a",
|
|
44
|
+
{
|
|
45
|
+
href: e,
|
|
46
|
+
target: i,
|
|
47
|
+
className: n,
|
|
48
|
+
title: c,
|
|
49
|
+
onClick: o,
|
|
50
|
+
...s,
|
|
51
|
+
children: r
|
|
52
|
+
}
|
|
53
|
+
) : /* @__PURE__ */ t("button", { className: n, title: c, onClick: o, ...s, children: r });
|
|
54
|
+
const G = e ? /* @__PURE__ */ t(
|
|
55
|
+
"a",
|
|
25
56
|
{
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
57
|
+
href: e,
|
|
58
|
+
target: i,
|
|
59
|
+
className: n,
|
|
60
|
+
style: m,
|
|
61
|
+
onClick: o,
|
|
62
|
+
...s,
|
|
63
|
+
children: r
|
|
64
|
+
}
|
|
65
|
+
) : /* @__PURE__ */ t("button", { className: n, onClick: o, style: m, ...s, children: r }), T = a !== void 0 ? /* @__PURE__ */ N("div", { className: "indicator", style: m, children: [
|
|
66
|
+
/* @__PURE__ */ t("span", { className: "indicator-item badge badge-secondary", children: a }),
|
|
67
|
+
e ? /* @__PURE__ */ t("a", { href: e, target: i, className: n, onClick: o, ...s, children: r }) : /* @__PURE__ */ t("button", { className: n, onClick: o, ...s, children: r })
|
|
68
|
+
] }) : G;
|
|
69
|
+
return c ? /* @__PURE__ */ t("div", { className: `tooltip ${P[v]}`, "data-tip": c, style: m, children: a !== void 0 ? /* @__PURE__ */ N("div", { className: "indicator", children: [
|
|
70
|
+
/* @__PURE__ */ t("span", { className: "indicator-item badge badge-secondary", children: a }),
|
|
71
|
+
e ? /* @__PURE__ */ t("a", { href: e, target: i, className: n, onClick: o, ...s, children: r }) : /* @__PURE__ */ t("button", { className: n, onClick: o, ...s, children: r })
|
|
72
|
+
] }) : e ? /* @__PURE__ */ t("a", { href: e, target: i, className: n, onClick: o, ...s, children: r }) : /* @__PURE__ */ t("button", { className: n, onClick: o, ...s, children: r }) }) : T;
|
|
73
|
+
}, k = (d) => {
|
|
74
|
+
const {
|
|
75
|
+
style: l,
|
|
76
|
+
...o
|
|
77
|
+
} = d;
|
|
78
|
+
if (C(f).inGroup)
|
|
79
|
+
return /* @__PURE__ */ t(B, { ...o });
|
|
80
|
+
const u = {
|
|
33
81
|
position: "fixed",
|
|
34
82
|
zIndex: 1e3,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
83
|
+
bottom: 24,
|
|
84
|
+
right: 24,
|
|
85
|
+
...l
|
|
86
|
+
};
|
|
87
|
+
return /* @__PURE__ */ t(B, { ...o, style: u });
|
|
88
|
+
}, $ = ({
|
|
89
|
+
children: d,
|
|
90
|
+
flower: l = !1,
|
|
91
|
+
shape: o = "circle",
|
|
92
|
+
icon: p,
|
|
93
|
+
mainAction: u,
|
|
94
|
+
onMainAction: w,
|
|
95
|
+
showClose: c = !1,
|
|
96
|
+
type: v = "default",
|
|
97
|
+
position: a = "bottom-right",
|
|
45
98
|
offset: e = 24,
|
|
46
|
-
className:
|
|
47
|
-
|
|
99
|
+
className: i = "",
|
|
100
|
+
style: g
|
|
101
|
+
}) => {
|
|
102
|
+
const m = [
|
|
103
|
+
"fab",
|
|
104
|
+
l ? "fab-flower" : "",
|
|
105
|
+
i
|
|
106
|
+
].filter(Boolean).join(" "), s = [
|
|
107
|
+
"btn",
|
|
108
|
+
"btn-lg",
|
|
109
|
+
"shadow-lg",
|
|
110
|
+
L[o],
|
|
111
|
+
j[v]
|
|
112
|
+
].filter(Boolean).join(" "), h = {
|
|
113
|
+
...a.includes("bottom") ? { bottom: e } : { top: e },
|
|
114
|
+
...a.includes("right") ? { right: e } : { left: e },
|
|
115
|
+
...g
|
|
116
|
+
};
|
|
117
|
+
return /* @__PURE__ */ N("div", { className: m, style: h, children: [
|
|
118
|
+
/* @__PURE__ */ t(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
tabIndex: 0,
|
|
122
|
+
role: "button",
|
|
123
|
+
className: s,
|
|
124
|
+
children: p || /* @__PURE__ */ t(y, {})
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
u && /* @__PURE__ */ t(
|
|
128
|
+
"button",
|
|
129
|
+
{
|
|
130
|
+
className: `${s} fab-main-action`,
|
|
131
|
+
onClick: w,
|
|
132
|
+
children: u
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
c && /* @__PURE__ */ t("button", { className: `${s} fab-close`, children: /* @__PURE__ */ t(M, {}) }),
|
|
136
|
+
/* @__PURE__ */ t(f.Provider, { value: { inGroup: !0, shape: o }, children: d })
|
|
137
|
+
] });
|
|
138
|
+
}, q = ({
|
|
139
|
+
visibilityHeight: d = 400,
|
|
140
|
+
target: l,
|
|
141
|
+
onClick: o,
|
|
142
|
+
icon: p,
|
|
143
|
+
duration: u = 450,
|
|
144
|
+
position: w = "bottom-right",
|
|
145
|
+
offset: c = 24,
|
|
146
|
+
className: v = "",
|
|
147
|
+
children: a,
|
|
148
|
+
style: e,
|
|
149
|
+
...i
|
|
48
150
|
}) => {
|
|
49
|
-
const [
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
151
|
+
const [g, m] = S(!1);
|
|
152
|
+
W(() => {
|
|
153
|
+
const n = l ? l() : window, b = () => {
|
|
154
|
+
const r = n instanceof Window ? window.scrollY : n.scrollTop;
|
|
155
|
+
m(r >= d);
|
|
54
156
|
};
|
|
55
|
-
return
|
|
56
|
-
}, [
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
157
|
+
return n.addEventListener("scroll", b), b(), () => n.removeEventListener("scroll", b);
|
|
158
|
+
}, [l, d]);
|
|
159
|
+
const s = () => {
|
|
160
|
+
o?.();
|
|
161
|
+
const n = l ? l() : window;
|
|
162
|
+
n instanceof Window ? window.scrollTo({ top: 0, behavior: "smooth" }) : n.scrollTo({ top: 0, behavior: "smooth" });
|
|
61
163
|
};
|
|
62
|
-
if (!
|
|
63
|
-
const
|
|
164
|
+
if (!g) return null;
|
|
165
|
+
const h = [
|
|
64
166
|
"btn",
|
|
65
167
|
"btn-lg",
|
|
66
168
|
"btn-circle",
|
|
67
169
|
"btn-neutral",
|
|
68
170
|
"shadow-lg",
|
|
69
171
|
"transition-opacity",
|
|
70
|
-
|
|
71
|
-
].filter(Boolean).join(" "),
|
|
172
|
+
v
|
|
173
|
+
].filter(Boolean).join(" "), x = {
|
|
72
174
|
position: "fixed",
|
|
73
175
|
zIndex: 1e3,
|
|
74
|
-
bottom:
|
|
75
|
-
...
|
|
176
|
+
bottom: c,
|
|
177
|
+
...w.includes("right") ? { right: c } : { left: c },
|
|
178
|
+
...e
|
|
76
179
|
};
|
|
77
|
-
return /* @__PURE__ */ t("button", { className:
|
|
180
|
+
return /* @__PURE__ */ t("button", { className: h, onClick: s, style: x, ...i, children: p || a || /* @__PURE__ */ t(E, {}) });
|
|
78
181
|
};
|
|
79
|
-
|
|
182
|
+
k.Group = $;
|
|
183
|
+
k.BackTop = q;
|
|
80
184
|
export {
|
|
81
|
-
|
|
185
|
+
k as FloatButton
|
|
82
186
|
};
|
|
83
187
|
//# sourceMappingURL=index30.js.map
|
package/dist/index30.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index30.js","sources":["../src/components/FloatButton.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\n\nexport interface FloatButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n /** Button content (icon or text) */\n children?: React.ReactNode\n /** Button type/color */\n type?: 'default' | 'primary' | 'secondary' | 'accent'\n /** Button shape */\n shape?: 'circle' | 'square'\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n /** Distance from edge in pixels */\n offset?: number\n /** Tooltip text */\n tooltip?: string\n /** Tooltip placement */\n tooltipPlacement?: 'left' | 'right' | 'top' | 'bottom'\n}\n\nexport interface BackTopProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'onClick'> {\n /** Scroll threshold to show button (pixels) */\n visibilityHeight?: number\n /** Scroll target (default: window) */\n target?: () => HTMLElement | Window\n /** Click handler (called before scrolling) */\n onClick?: () => void\n /** Custom content */\n children?: React.ReactNode\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left'\n /** Distance from edge in pixels */\n offset?: number\n}\n\nconst tooltipPlacementClasses = {\n left: 'tooltip-left',\n right: 'tooltip-right',\n top: 'tooltip-top',\n bottom: 'tooltip-bottom',\n}\n\nexport const FloatButton: React.FC<FloatButtonProps> & { BackTop: React.FC<BackTopProps> } = ({\n children,\n onClick,\n type = 'default',\n shape = 'circle',\n position = 'bottom-right',\n offset = 24,\n className = '',\n tooltip,\n tooltipPlacement = 'left',\n ...rest\n}) => {\n const typeClasses = {\n default: 'btn-neutral',\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n }\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'shadow-lg',\n shape === 'circle' ? 'btn-circle' : 'btn-square',\n typeClasses[type],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n ...(position.includes('bottom') ? { bottom: offset } : { top: offset }),\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n }\n\n const button = (\n <button className={buttonClasses} onClick={onClick} style={style} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )}\n </button>\n )\n\n if (tooltip) {\n return (\n <div className={`tooltip ${tooltipPlacementClasses[tooltipPlacement]}`} data-tip={tooltip} style={style}>\n <button className={buttonClasses} onClick={onClick} style={{ position: 'static' }} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n )}\n </button>\n </div>\n )\n }\n\n return button\n}\n\nconst BackTop: React.FC<BackTopProps> = ({\n visibilityHeight = 400,\n target,\n onClick,\n children,\n position = 'bottom-right',\n offset = 24,\n className = '',\n ...rest\n}) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const scrollTarget = target ? target() : window\n\n const handleScroll = () => {\n const scrollTop =\n scrollTarget instanceof Window\n ? window.scrollY\n : (scrollTarget as HTMLElement).scrollTop\n\n setVisible(scrollTop >= visibilityHeight)\n }\n\n scrollTarget.addEventListener('scroll', handleScroll)\n handleScroll()\n\n return () => scrollTarget.removeEventListener('scroll', handleScroll)\n }, [target, visibilityHeight])\n\n const handleClick = () => {\n onClick?.()\n const scrollTarget = target ? target() : window\n if (scrollTarget instanceof Window) {\n window.scrollTo({ top: 0, behavior: 'smooth' })\n } else {\n (scrollTarget as HTMLElement).scrollTo({ top: 0, behavior: 'smooth' })\n }\n }\n\n if (!visible) return null\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'btn-circle',\n 'btn-neutral',\n 'shadow-lg',\n 'transition-opacity',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n bottom: offset,\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n }\n\n return (\n <button className={buttonClasses} onClick={handleClick} style={style} {...rest}>\n {children || (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />\n </svg>\n )}\n </button>\n )\n}\n\nFloatButton.BackTop = BackTop\n"],"names":["tooltipPlacementClasses","FloatButton","children","onClick","type","shape","position","offset","className","tooltip","tooltipPlacement","rest","buttonClasses","style","button","jsx","BackTop","visibilityHeight","target","visible","setVisible","useState","useEffect","scrollTarget","handleScroll","scrollTop","handleClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index30.js","sources":["../src/components/FloatButton.tsx"],"sourcesContent":["import React, { useState, useEffect, createContext, useContext } from 'react'\n\n// Default icons\nconst PlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n)\n\nconst ArrowUpIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />\n </svg>\n)\n\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\nexport interface FloatButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n /** Icon to display */\n icon?: React.ReactNode\n /** Description text below icon */\n description?: React.ReactNode\n /** Button type/color */\n type?: 'default' | 'primary'\n /** Button shape */\n shape?: 'circle' | 'square'\n /** Tooltip text */\n tooltip?: string\n /** Tooltip placement */\n tooltipPlacement?: 'left' | 'right' | 'top' | 'bottom'\n /** Badge content */\n badge?: number | React.ReactNode\n /** Link URL (renders as anchor) */\n href?: string\n /** Link target */\n target?: string\n /** @deprecated Use icon prop instead */\n children?: React.ReactNode\n}\n\nexport interface FloatButtonGroupProps {\n /** Child FloatButton components */\n children: React.ReactNode\n /** Arrange buttons in a quarter-circle (radial) layout */\n flower?: boolean\n /** Button shape for children */\n shape?: 'circle' | 'square'\n /** Main trigger button icon */\n icon?: React.ReactNode\n /** Main action button that replaces trigger when open (fab-main-action) */\n mainAction?: React.ReactNode\n /** Click handler for main action button */\n onMainAction?: () => void\n /** Show close button when open (fab-close) */\n showClose?: boolean\n /** Button type/color */\n type?: 'default' | 'primary'\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n /** Distance from edge */\n offset?: number\n /** Additional CSS classes */\n className?: string\n /** Custom styles */\n style?: React.CSSProperties\n}\n\nexport interface BackTopProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'onClick'> {\n /** Scroll threshold to show button (pixels) */\n visibilityHeight?: number\n /** Scroll target (default: window) */\n target?: () => HTMLElement | Window\n /** Click handler (called before scrolling) */\n onClick?: () => void\n /** Custom icon */\n icon?: React.ReactNode\n /** Duration of scroll animation in ms */\n duration?: number\n /** Position on screen */\n position?: 'bottom-right' | 'bottom-left'\n /** Distance from edge in pixels */\n offset?: number\n /** @deprecated Use icon prop instead */\n children?: React.ReactNode\n}\n\n// Context for group\ninterface FloatButtonGroupContextValue {\n inGroup: boolean\n shape?: 'circle' | 'square'\n}\n\nconst FloatButtonGroupContext = createContext<FloatButtonGroupContextValue>({ inGroup: false })\n\nconst tooltipPlacementClasses: Record<string, string> = {\n left: 'tooltip-left',\n right: 'tooltip-right',\n top: 'tooltip-top',\n bottom: 'tooltip-bottom',\n}\n\nconst typeClasses: Record<string, string> = {\n default: 'btn-neutral',\n primary: 'btn-primary',\n}\n\nconst shapeClasses: Record<string, string> = {\n circle: 'btn-circle',\n square: 'btn-square',\n}\n\ninterface FloatButtonComponent extends React.FC<FloatButtonProps> {\n Group: React.FC<FloatButtonGroupProps>\n BackTop: React.FC<BackTopProps>\n}\n\nconst FloatButtonBase: React.FC<FloatButtonProps & { style?: React.CSSProperties }> = ({\n icon,\n description,\n onClick,\n type = 'default',\n shape = 'circle',\n className = '',\n tooltip,\n tooltipPlacement = 'left',\n badge,\n href,\n target,\n children,\n style,\n ...rest\n}) => {\n const groupContext = useContext(FloatButtonGroupContext)\n const effectiveShape = groupContext.inGroup ? (groupContext.shape || shape) : shape\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'shadow-lg',\n shapeClasses[effectiveShape],\n typeClasses[type],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const content = icon || children || <PlusIcon />\n\n const buttonContent = (\n <>\n {description ? (\n <div className=\"flex flex-col items-center\">\n {content}\n <span className=\"text-xs mt-1\">{description}</span>\n </div>\n ) : (\n content\n )}\n </>\n )\n\n // When inside a group, render simple button without wrapper divs\n // DaisyUI's fab CSS requires direct button children\n if (groupContext.inGroup) {\n return href ? (\n <a\n href={href}\n target={target}\n className={buttonClasses}\n title={tooltip}\n onClick={onClick as any}\n {...(rest as any)}\n >\n {buttonContent}\n </a>\n ) : (\n <button className={buttonClasses} title={tooltip} onClick={onClick} {...rest}>\n {buttonContent}\n </button>\n )\n }\n\n const buttonElement = href ? (\n <a\n href={href}\n target={target}\n className={buttonClasses}\n style={style}\n onClick={onClick as any}\n {...(rest as any)}\n >\n {buttonContent}\n </a>\n ) : (\n <button className={buttonClasses} onClick={onClick} style={style} {...rest}>\n {buttonContent}\n </button>\n )\n\n const withBadge = badge !== undefined ? (\n <div className=\"indicator\" style={style}>\n <span className=\"indicator-item badge badge-secondary\">\n {badge}\n </span>\n {href ? (\n <a href={href} target={target} className={buttonClasses} onClick={onClick as any} {...(rest as any)}>\n {buttonContent}\n </a>\n ) : (\n <button className={buttonClasses} onClick={onClick} {...rest}>\n {buttonContent}\n </button>\n )}\n </div>\n ) : buttonElement\n\n if (tooltip) {\n return (\n <div className={`tooltip ${tooltipPlacementClasses[tooltipPlacement]}`} data-tip={tooltip} style={style}>\n {badge !== undefined ? (\n <div className=\"indicator\">\n <span className=\"indicator-item badge badge-secondary\">{badge}</span>\n {href ? (\n <a href={href} target={target} className={buttonClasses} onClick={onClick as any} {...(rest as any)}>\n {buttonContent}\n </a>\n ) : (\n <button className={buttonClasses} onClick={onClick} {...rest}>\n {buttonContent}\n </button>\n )}\n </div>\n ) : href ? (\n <a href={href} target={target} className={buttonClasses} onClick={onClick as any} {...(rest as any)}>\n {buttonContent}\n </a>\n ) : (\n <button className={buttonClasses} onClick={onClick} {...rest}>\n {buttonContent}\n </button>\n )}\n </div>\n )\n }\n\n return withBadge\n}\n\nexport const FloatButton: FloatButtonComponent = (props) => {\n const {\n style: propStyle,\n ...rest\n } = props\n\n const groupContext = useContext(FloatButtonGroupContext)\n\n // If in group, don't apply fixed positioning\n if (groupContext.inGroup) {\n return <FloatButtonBase {...rest} />\n }\n\n // Standalone button with fixed positioning\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n bottom: 24,\n right: 24,\n ...propStyle,\n }\n\n return <FloatButtonBase {...rest} style={style} />\n}\n\nconst FloatButtonGroup: React.FC<FloatButtonGroupProps> = ({\n children,\n flower = false,\n shape = 'circle',\n icon,\n mainAction,\n onMainAction,\n showClose = false,\n type = 'default',\n position = 'bottom-right',\n offset = 24,\n className = '',\n style: propStyle,\n}) => {\n const fabClasses = [\n 'fab',\n flower ? 'fab-flower' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const triggerButtonClasses = [\n 'btn',\n 'btn-lg',\n 'shadow-lg',\n shapeClasses[shape],\n typeClasses[type],\n ]\n .filter(Boolean)\n .join(' ')\n\n const containerStyle: React.CSSProperties = {\n ...(position.includes('bottom') ? { bottom: offset } : { top: offset }),\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n ...propStyle,\n }\n\n return (\n <div className={fabClasses} style={containerStyle}>\n {/* Trigger button - shown when closed */}\n <div\n tabIndex={0}\n role=\"button\"\n className={triggerButtonClasses}\n >\n {icon || <PlusIcon />}\n </div>\n\n {/* Main action button - shown when open (replaces trigger in flower mode) */}\n {mainAction && (\n <button\n className={`${triggerButtonClasses} fab-main-action`}\n onClick={onMainAction}\n >\n {mainAction}\n </button>\n )}\n\n {/* Close button - shown when open */}\n {showClose && (\n <button className={`${triggerButtonClasses} fab-close`}>\n <CloseIcon />\n </button>\n )}\n\n <FloatButtonGroupContext.Provider value={{ inGroup: true, shape }}>\n {children}\n </FloatButtonGroupContext.Provider>\n </div>\n )\n}\n\nconst BackTop: React.FC<BackTopProps> = ({\n visibilityHeight = 400,\n target,\n onClick,\n icon,\n duration = 450,\n position = 'bottom-right',\n offset = 24,\n className = '',\n children,\n style: propStyle,\n ...rest\n}) => {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const scrollTarget = target ? target() : window\n\n const handleScroll = () => {\n const scrollTop =\n scrollTarget instanceof Window\n ? window.scrollY\n : (scrollTarget as HTMLElement).scrollTop\n\n setVisible(scrollTop >= visibilityHeight)\n }\n\n scrollTarget.addEventListener('scroll', handleScroll)\n handleScroll()\n\n return () => scrollTarget.removeEventListener('scroll', handleScroll)\n }, [target, visibilityHeight])\n\n const handleClick = () => {\n onClick?.()\n const scrollTarget = target ? target() : window\n if (scrollTarget instanceof Window) {\n window.scrollTo({ top: 0, behavior: 'smooth' })\n } else {\n (scrollTarget as HTMLElement).scrollTo({ top: 0, behavior: 'smooth' })\n }\n }\n\n if (!visible) return null\n\n const buttonClasses = [\n 'btn',\n 'btn-lg',\n 'btn-circle',\n 'btn-neutral',\n 'shadow-lg',\n 'transition-opacity',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const style: React.CSSProperties = {\n position: 'fixed',\n zIndex: 1000,\n bottom: offset,\n ...(position.includes('right') ? { right: offset } : { left: offset }),\n ...propStyle,\n }\n\n return (\n <button className={buttonClasses} onClick={handleClick} style={style} {...rest}>\n {icon || children || <ArrowUpIcon />}\n </button>\n )\n}\n\nFloatButton.Group = FloatButtonGroup\nFloatButton.BackTop = BackTop\n"],"names":["PlusIcon","jsx","ArrowUpIcon","CloseIcon","FloatButtonGroupContext","createContext","tooltipPlacementClasses","typeClasses","shapeClasses","FloatButtonBase","icon","description","onClick","type","shape","className","tooltip","tooltipPlacement","badge","href","target","children","style","rest","groupContext","useContext","effectiveShape","buttonClasses","content","buttonContent","Fragment","jsxs","buttonElement","withBadge","FloatButton","props","propStyle","FloatButtonGroup","flower","mainAction","onMainAction","showClose","position","offset","fabClasses","triggerButtonClasses","containerStyle","BackTop","visibilityHeight","duration","visible","setVisible","useState","useEffect","scrollTarget","handleScroll","scrollTop","handleClick"],"mappings":"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"}
|
package/dist/index37.js
CHANGED
|
@@ -1,194 +1,217 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import
|
|
3
|
-
const
|
|
4
|
-
function
|
|
5
|
-
const
|
|
6
|
-
if (!
|
|
1
|
+
import { jsx as I, jsxs as L } from "react/jsx-runtime";
|
|
2
|
+
import h, { useId as B, useState as E, useRef as v, useCallback as R, useEffect as O, createContext as S, useContext as U } from "react";
|
|
3
|
+
const F = S(void 0);
|
|
4
|
+
function j() {
|
|
5
|
+
const n = U(F);
|
|
6
|
+
if (!n)
|
|
7
7
|
throw new Error("Dropdown compound components must be used within Dropdown");
|
|
8
|
-
return
|
|
8
|
+
return n;
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
children:
|
|
12
|
-
hover:
|
|
10
|
+
function q({
|
|
11
|
+
children: n,
|
|
12
|
+
hover: d = !1,
|
|
13
13
|
position: u = "bottom",
|
|
14
|
-
align:
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
align: r = "start",
|
|
15
|
+
open: a,
|
|
16
|
+
onOpenChange: o,
|
|
17
|
+
disabled: t = !1,
|
|
18
|
+
arrow: s = !1,
|
|
19
|
+
className: i = "",
|
|
20
|
+
...p
|
|
17
21
|
}) {
|
|
18
|
-
const
|
|
19
|
-
|
|
22
|
+
const f = B(), l = B(), [c, g] = E(!1), [C, x] = E(-1), [A, k] = E(0), e = v(/* @__PURE__ */ new Map()), D = v(null), m = a !== void 0, b = m ? a : c, K = R((w) => {
|
|
23
|
+
t || (m || g(w), o?.(w));
|
|
24
|
+
}, [t, m, o]), $ = R((w, y, V) => {
|
|
25
|
+
y ? e.current.set(w, { ref: y, disabled: V }) : e.current.delete(w);
|
|
20
26
|
}, []);
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
27
|
+
O(() => {
|
|
28
|
+
const w = (y) => {
|
|
29
|
+
D.current && !D.current.contains(y.target) && (K(!1), x(-1));
|
|
24
30
|
};
|
|
25
|
-
if (
|
|
26
|
-
return document.addEventListener("mousedown",
|
|
27
|
-
}, [
|
|
28
|
-
const
|
|
31
|
+
if (b)
|
|
32
|
+
return document.addEventListener("mousedown", w), () => document.removeEventListener("mousedown", w);
|
|
33
|
+
}, [b]);
|
|
34
|
+
const M = {
|
|
29
35
|
top: "dropdown-top",
|
|
30
36
|
bottom: "dropdown-bottom",
|
|
31
37
|
left: "dropdown-left",
|
|
32
38
|
right: "dropdown-right"
|
|
33
|
-
},
|
|
39
|
+
}, P = {
|
|
34
40
|
start: "",
|
|
35
41
|
center: "dropdown-center",
|
|
36
42
|
end: "dropdown-end"
|
|
37
|
-
},
|
|
43
|
+
}, T = [
|
|
38
44
|
"dropdown",
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
M[u],
|
|
46
|
+
P[r],
|
|
47
|
+
d && "dropdown-hover",
|
|
48
|
+
b && "dropdown-open",
|
|
49
|
+
i
|
|
44
50
|
].filter(Boolean).join(" ");
|
|
45
|
-
return /* @__PURE__ */
|
|
46
|
-
|
|
51
|
+
return /* @__PURE__ */ I(
|
|
52
|
+
F.Provider,
|
|
47
53
|
{
|
|
48
54
|
value: {
|
|
49
55
|
position: u,
|
|
50
|
-
align:
|
|
51
|
-
menuId:
|
|
52
|
-
triggerId:
|
|
53
|
-
isOpen:
|
|
54
|
-
setIsOpen:
|
|
55
|
-
focusedIndex:
|
|
56
|
-
setFocusedIndex:
|
|
57
|
-
registerItem:
|
|
58
|
-
itemCount:
|
|
59
|
-
setItemCount:
|
|
56
|
+
align: r,
|
|
57
|
+
menuId: f,
|
|
58
|
+
triggerId: l,
|
|
59
|
+
isOpen: b,
|
|
60
|
+
setIsOpen: K,
|
|
61
|
+
focusedIndex: C,
|
|
62
|
+
setFocusedIndex: x,
|
|
63
|
+
registerItem: $,
|
|
64
|
+
itemCount: A,
|
|
65
|
+
setItemCount: k,
|
|
66
|
+
disabled: t,
|
|
67
|
+
arrow: s
|
|
60
68
|
},
|
|
61
|
-
children: /* @__PURE__ */
|
|
69
|
+
children: /* @__PURE__ */ I("div", { ref: D, className: T, "data-state": b ? "open" : "closed", "aria-disabled": t || void 0, ...p, children: n })
|
|
62
70
|
}
|
|
63
71
|
);
|
|
64
72
|
}
|
|
65
|
-
function
|
|
66
|
-
const { menuId: u, triggerId:
|
|
67
|
-
switch (
|
|
73
|
+
function z({ children: n, className: d = "" }) {
|
|
74
|
+
const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, setFocusedIndex: t, itemCount: s, disabled: i } = j(), p = (l) => {
|
|
75
|
+
switch (l.key) {
|
|
68
76
|
case "Enter":
|
|
69
77
|
case " ":
|
|
70
78
|
case "ArrowDown":
|
|
71
|
-
|
|
79
|
+
l.preventDefault(), o(!0), t(0);
|
|
72
80
|
break;
|
|
73
81
|
case "ArrowUp":
|
|
74
|
-
|
|
82
|
+
l.preventDefault(), o(!0), t(s - 1);
|
|
75
83
|
break;
|
|
76
84
|
case "Escape":
|
|
77
|
-
|
|
85
|
+
l.preventDefault(), o(!1), t(-1);
|
|
78
86
|
break;
|
|
79
87
|
}
|
|
80
|
-
},
|
|
81
|
-
|
|
88
|
+
}, f = () => {
|
|
89
|
+
o(!a), a || t(0);
|
|
82
90
|
};
|
|
83
|
-
return /* @__PURE__ */
|
|
91
|
+
return /* @__PURE__ */ I(
|
|
84
92
|
"button",
|
|
85
93
|
{
|
|
86
|
-
id:
|
|
94
|
+
id: r,
|
|
87
95
|
type: "button",
|
|
88
|
-
tabIndex: 0,
|
|
89
|
-
className: `btn ${
|
|
96
|
+
tabIndex: i ? -1 : 0,
|
|
97
|
+
className: `btn ${d}`,
|
|
90
98
|
"aria-haspopup": "menu",
|
|
91
|
-
"aria-expanded":
|
|
99
|
+
"aria-expanded": a,
|
|
92
100
|
"aria-controls": u,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
disabled: i,
|
|
102
|
+
onClick: f,
|
|
103
|
+
onKeyDown: p,
|
|
104
|
+
children: n
|
|
96
105
|
}
|
|
97
106
|
);
|
|
98
107
|
}
|
|
99
|
-
function
|
|
100
|
-
const { menuId: u, triggerId:
|
|
101
|
-
(e) =>
|
|
108
|
+
function H({ children: n, className: d = "" }) {
|
|
109
|
+
const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, focusedIndex: t, setFocusedIndex: s, setItemCount: i, arrow: p, position: f } = j(), l = v(null), c = h.Children.toArray(n).filter(
|
|
110
|
+
(e) => h.isValidElement(e) && e.type === N
|
|
102
111
|
);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}, [
|
|
106
|
-
|
|
107
|
-
}, [
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
(
|
|
112
|
+
O(() => {
|
|
113
|
+
i(c.length);
|
|
114
|
+
}, [c.length, i]), O(() => {
|
|
115
|
+
a && t >= 0 && l.current && l.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[t]?.focus();
|
|
116
|
+
}, [a, t]);
|
|
117
|
+
const g = (e) => {
|
|
118
|
+
const m = c.filter(
|
|
119
|
+
(b) => h.isValidElement(b) && !b.props.disabled
|
|
111
120
|
).length;
|
|
112
121
|
switch (e.key) {
|
|
113
122
|
case "ArrowDown":
|
|
114
|
-
e.preventDefault(), s((
|
|
123
|
+
e.preventDefault(), s((t + 1) % m);
|
|
115
124
|
break;
|
|
116
125
|
case "ArrowUp":
|
|
117
|
-
e.preventDefault(), s((
|
|
126
|
+
e.preventDefault(), s((t - 1 + m) % m);
|
|
118
127
|
break;
|
|
119
128
|
case "Home":
|
|
120
129
|
e.preventDefault(), s(0);
|
|
121
130
|
break;
|
|
122
131
|
case "End":
|
|
123
|
-
e.preventDefault(), s(
|
|
132
|
+
e.preventDefault(), s(m - 1);
|
|
124
133
|
break;
|
|
125
134
|
case "Escape":
|
|
126
|
-
e.preventDefault(),
|
|
135
|
+
e.preventDefault(), o(!1), s(-1), document.getElementById(r)?.focus();
|
|
127
136
|
break;
|
|
128
137
|
case "Tab":
|
|
129
|
-
|
|
138
|
+
o(!1), s(-1);
|
|
130
139
|
break;
|
|
131
140
|
}
|
|
132
|
-
},
|
|
141
|
+
}, C = [
|
|
133
142
|
"dropdown-content",
|
|
134
143
|
"menu",
|
|
135
144
|
"bg-base-100",
|
|
136
145
|
"rounded-box",
|
|
137
|
-
"z-
|
|
146
|
+
"z-50",
|
|
138
147
|
"shadow",
|
|
139
|
-
|
|
140
|
-
].filter(Boolean).join(" "),
|
|
141
|
-
|
|
148
|
+
d
|
|
149
|
+
].filter(Boolean).join(" "), x = h.Children.map(n, (e, D) => h.isValidElement(e) && e.type === N ? h.cloneElement(e, { _index: D }) : e), k = p ? /* @__PURE__ */ I(
|
|
150
|
+
"span",
|
|
151
|
+
{
|
|
152
|
+
className: `absolute w-0 h-0 border-8 border-solid ${{
|
|
153
|
+
top: "bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent",
|
|
154
|
+
bottom: "top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent",
|
|
155
|
+
left: "right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent",
|
|
156
|
+
right: "left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent"
|
|
157
|
+
}[f || "bottom"]}`,
|
|
158
|
+
"aria-hidden": "true"
|
|
159
|
+
}
|
|
160
|
+
) : null;
|
|
161
|
+
return /* @__PURE__ */ L(
|
|
142
162
|
"ul",
|
|
143
163
|
{
|
|
144
164
|
ref: l,
|
|
145
165
|
id: u,
|
|
146
166
|
role: "menu",
|
|
147
|
-
"aria-labelledby":
|
|
167
|
+
"aria-labelledby": r,
|
|
148
168
|
tabIndex: -1,
|
|
149
|
-
className:
|
|
150
|
-
onKeyDown:
|
|
151
|
-
children:
|
|
169
|
+
className: `${C} ${p ? "relative" : ""}`,
|
|
170
|
+
onKeyDown: g,
|
|
171
|
+
children: [
|
|
172
|
+
k,
|
|
173
|
+
x
|
|
174
|
+
]
|
|
152
175
|
}
|
|
153
176
|
);
|
|
154
177
|
}
|
|
155
|
-
function
|
|
156
|
-
children:
|
|
157
|
-
onClick:
|
|
178
|
+
function N({
|
|
179
|
+
children: n,
|
|
180
|
+
onClick: d,
|
|
158
181
|
active: u = !1,
|
|
159
|
-
disabled:
|
|
160
|
-
danger:
|
|
161
|
-
className:
|
|
182
|
+
disabled: r = !1,
|
|
183
|
+
danger: a = !1,
|
|
184
|
+
className: o = ""
|
|
162
185
|
}) {
|
|
163
|
-
const { setIsOpen:
|
|
164
|
-
|
|
186
|
+
const { setIsOpen: t, setFocusedIndex: s, triggerId: i } = j(), p = [u && "active", r && "disabled", o].filter(Boolean).join(" "), f = () => {
|
|
187
|
+
r || (d?.(), t(!1), s(-1), document.getElementById(i)?.focus());
|
|
165
188
|
};
|
|
166
|
-
return /* @__PURE__ */
|
|
189
|
+
return /* @__PURE__ */ I("li", { className: p, role: "none", children: /* @__PURE__ */ I(
|
|
167
190
|
"a",
|
|
168
191
|
{
|
|
169
192
|
role: "menuitem",
|
|
170
|
-
tabIndex:
|
|
171
|
-
"aria-disabled":
|
|
172
|
-
className:
|
|
173
|
-
onClick:
|
|
174
|
-
onKeyDown: (
|
|
175
|
-
(
|
|
193
|
+
tabIndex: r ? -1 : 0,
|
|
194
|
+
"aria-disabled": r || void 0,
|
|
195
|
+
className: a ? "text-error" : "",
|
|
196
|
+
onClick: f,
|
|
197
|
+
onKeyDown: (c) => {
|
|
198
|
+
(c.key === "Enter" || c.key === " ") && !r && (c.preventDefault(), f());
|
|
176
199
|
},
|
|
177
|
-
children:
|
|
200
|
+
children: n
|
|
178
201
|
}
|
|
179
202
|
) });
|
|
180
203
|
}
|
|
181
|
-
function
|
|
182
|
-
const
|
|
183
|
-
return /* @__PURE__ */
|
|
204
|
+
function W({ className: n = "" }) {
|
|
205
|
+
const d = ["border-base-content/10", n].filter(Boolean).join(" ");
|
|
206
|
+
return /* @__PURE__ */ I("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ I("hr", { className: d }) });
|
|
184
207
|
}
|
|
185
|
-
const
|
|
186
|
-
Trigger:
|
|
187
|
-
Menu:
|
|
188
|
-
Item:
|
|
189
|
-
Divider:
|
|
208
|
+
const J = Object.assign(q, {
|
|
209
|
+
Trigger: z,
|
|
210
|
+
Menu: H,
|
|
211
|
+
Item: N,
|
|
212
|
+
Divider: W
|
|
190
213
|
});
|
|
191
214
|
export {
|
|
192
|
-
|
|
215
|
+
J as Dropdown
|
|
193
216
|
};
|
|
194
217
|
//# sourceMappingURL=index37.js.map
|
package/dist/index37.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [isOpen, setIsOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const positionClasses: Record<string, string> = {\n top: 'dropdown-top',\n bottom: 'dropdown-bottom',\n left: 'dropdown-left',\n right: 'dropdown-right',\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: 'dropdown-center',\n end: 'dropdown-end',\n }\n\n const dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>{children}</div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\n )\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n 'dropdown-content',\n 'menu',\n 'bg-base-100',\n 'rounded-box',\n 'z-[1]',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\n }\n return child\n })\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={menuClasses}\n onKeyDown={handleKeyDown}\n >\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <li className={itemClasses} role=\"none\">\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </a>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","className","rest","menuId","useId","triggerId","isOpen","setIsOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","registerItem","useCallback","index","ref","disabled","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n arrow = false,\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean) => {\n if (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n onOpenChange?.(open)\n }, [disabled, isControlled, onOpenChange])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const positionClasses: Record<string, string> = {\n top: 'dropdown-top',\n bottom: 'dropdown-bottom',\n left: 'dropdown-left',\n right: 'dropdown-right',\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: 'dropdown-center',\n end: 'dropdown-end',\n }\n\n const dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled,\n arrow,\n }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} aria-disabled={disabled || undefined} {...rest}>{children}</div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\n )\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n 'dropdown-content',\n 'menu',\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <li className={itemClasses} role=\"none\">\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </a>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","controlledOpen","onOpenChange","disabled","arrow","className","rest","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","isControlled","isOpen","setIsOpen","useCallback","open","registerItem","index","ref","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","arrowElement","jsxs","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "asterui",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.7",
|
|
4
4
|
"description": "React UI component library with DaisyUI",
|
|
5
5
|
"homepage": "https://asterui.com",
|
|
6
6
|
"repository": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@types/react-dom": "^19.2.2",
|
|
47
47
|
"@vitejs/plugin-react": "^5.1.1",
|
|
48
48
|
"apexcharts": "^5.3.6",
|
|
49
|
-
"daisyui": "^5.5.
|
|
49
|
+
"daisyui": "^5.5.8",
|
|
50
50
|
"qrcode": "^1.5.4",
|
|
51
51
|
"react": "^19.2.0",
|
|
52
52
|
"react-dom": "^19.2.0",
|