asterui 0.12.13 → 0.12.15
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/Autocomplete.d.ts +22 -2
- package/dist/components/Button.d.ts +14 -5
- package/dist/components/Drawer.d.ts +47 -6
- package/dist/components/Dropdown.d.ts +65 -9
- package/dist/components/Form.d.ts +11 -1
- package/dist/components/Input.d.ts +15 -1
- package/dist/components/Modal.d.ts +5 -1
- package/dist/components/Navbar.d.ts +15 -1
- package/dist/components/Rating.d.ts +12 -4
- package/dist/components/SidebarDrawer.d.ts +21 -0
- package/dist/components/Tabs.d.ts +30 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +169 -167
- package/dist/index.js.map +1 -1
- package/dist/index100.js +44 -11
- package/dist/index100.js.map +1 -1
- package/dist/index101.js +10 -12
- package/dist/index101.js.map +1 -1
- package/dist/index102.js +14 -7
- package/dist/index102.js.map +1 -1
- package/dist/index103.js +7 -12
- package/dist/index103.js.map +1 -1
- package/dist/index104.js +11 -29
- package/dist/index104.js.map +1 -1
- package/dist/index105.js +29 -16
- package/dist/index105.js.map +1 -1
- package/dist/index106.js +21 -0
- package/dist/index106.js.map +1 -0
- package/dist/index21.js +1 -1
- package/dist/index26.js +171 -40
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +41 -17
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +17 -33
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +33 -52
- package/dist/index29.js.map +1 -1
- package/dist/index30.js +50 -61
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +60 -181
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +184 -18
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +15 -217
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +230 -1083
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +1086 -16
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +16 -121
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +119 -37
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +34 -208
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +390 -89
- package/dist/index39.js.map +1 -1
- package/dist/index40.js +93 -158
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +211 -135
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +155 -15
- package/dist/index42.js.map +1 -1
- package/dist/index43.js +15 -17
- package/dist/index43.js.map +1 -1
- package/dist/index44.js +17 -21
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +18 -134
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +134 -10
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +13 -35
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +35 -34
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +34 -81
- package/dist/index49.js.map +1 -1
- package/dist/index5.js +161 -80
- package/dist/index5.js.map +1 -1
- package/dist/index50.js +71 -166
- package/dist/index50.js.map +1 -1
- package/dist/index51.js +167 -144
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +152 -11
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +10 -20
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +22 -14
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +14 -7
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +6 -310
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +334 -17
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +47 -122
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +120 -108
- package/dist/index59.js.map +1 -1
- package/dist/index60.js +107 -167
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +167 -29
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +30 -120
- package/dist/index62.js.map +1 -1
- package/dist/index63.js +116 -80
- package/dist/index63.js.map +1 -1
- package/dist/index64.js +85 -19
- package/dist/index64.js.map +1 -1
- package/dist/index65.js +19 -73
- package/dist/index65.js.map +1 -1
- package/dist/index66.js +71 -54
- package/dist/index66.js.map +1 -1
- package/dist/index67.js +56 -44
- package/dist/index67.js.map +1 -1
- package/dist/index68.js +42 -49
- package/dist/index68.js.map +1 -1
- package/dist/index69.js +52 -62
- package/dist/index69.js.map +1 -1
- package/dist/index70.js +118 -102
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +107 -41
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +41 -68
- package/dist/index72.js.map +1 -1
- package/dist/index73.js +66 -19
- package/dist/index73.js.map +1 -1
- package/dist/index74.js +18 -55
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +55 -251
- package/dist/index75.js.map +1 -1
- package/dist/index76.js +254 -22
- package/dist/index76.js.map +1 -1
- package/dist/index77.js +22 -31
- package/dist/index77.js.map +1 -1
- package/dist/index78.js +30 -93
- package/dist/index78.js.map +1 -1
- package/dist/index79.js +89 -324
- package/dist/index79.js.map +1 -1
- package/dist/index80.js +323 -50
- package/dist/index80.js.map +1 -1
- package/dist/index81.js +79 -39
- package/dist/index81.js.map +1 -1
- package/dist/index82.js +40 -23
- package/dist/index82.js.map +1 -1
- package/dist/index83.js +21 -93
- package/dist/index83.js.map +1 -1
- package/dist/index84.js +87 -148
- package/dist/index84.js.map +1 -1
- package/dist/index85.js +147 -152
- package/dist/index85.js.map +1 -1
- package/dist/index86.js +159 -63
- package/dist/index86.js.map +1 -1
- package/dist/index87.js +65 -35
- package/dist/index87.js.map +1 -1
- package/dist/index88.js +35 -234
- package/dist/index88.js.map +1 -1
- package/dist/index89.js +231 -31
- package/dist/index89.js.map +1 -1
- package/dist/index9.js +73 -46
- package/dist/index9.js.map +1 -1
- package/dist/index90.js +34 -210
- package/dist/index90.js.map +1 -1
- package/dist/index91.js +195 -198
- package/dist/index91.js.map +1 -1
- package/dist/index92.js +159 -241
- package/dist/index92.js.map +1 -1
- package/dist/index93.js +283 -166
- package/dist/index93.js.map +1 -1
- package/dist/index94.js +173 -253
- package/dist/index94.js.map +1 -1
- package/dist/index95.js +258 -14
- package/dist/index95.js.map +1 -1
- package/dist/index96.js +12 -31
- package/dist/index96.js.map +1 -1
- package/dist/index97.js +32 -5
- package/dist/index97.js.map +1 -1
- package/dist/index98.js +5 -13
- package/dist/index98.js.map +1 -1
- package/dist/index99.js +11 -43
- package/dist/index99.js.map +1 -1
- package/package.json +1 -1
package/dist/index5.js
CHANGED
|
@@ -1,104 +1,185 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { jsxs as M, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { useId as le, useState as C, useRef as z, useEffect as A } from "react";
|
|
3
|
+
const oe = ({ onClick: o, className: g }) => /* @__PURE__ */ r(
|
|
4
|
+
"button",
|
|
5
|
+
{
|
|
6
|
+
type: "button",
|
|
7
|
+
onClick: o,
|
|
8
|
+
className: `flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${g || ""}`,
|
|
9
|
+
"aria-label": "Clear input",
|
|
10
|
+
tabIndex: -1,
|
|
11
|
+
children: /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
12
|
+
}
|
|
13
|
+
), pe = ({
|
|
14
|
+
value: o,
|
|
15
|
+
defaultValue: g = "",
|
|
16
|
+
onChange: w,
|
|
17
|
+
onSelect: R,
|
|
18
|
+
onSearch: T,
|
|
19
|
+
options: V,
|
|
20
|
+
placeholder: K = "Type to search...",
|
|
21
|
+
disabled: p = !1,
|
|
22
|
+
size: S = "md",
|
|
23
|
+
color: N,
|
|
24
|
+
status: x,
|
|
25
|
+
className: U = "",
|
|
26
|
+
allowCustomValue: D = !0,
|
|
27
|
+
filterOption: j,
|
|
28
|
+
notFoundContent: F = "No results found",
|
|
29
|
+
allowClear: f,
|
|
30
|
+
onClear: H,
|
|
31
|
+
open: $,
|
|
32
|
+
defaultOpen: P = !1,
|
|
33
|
+
onOpenChange: W,
|
|
34
|
+
defaultActiveFirstOption: v = !0,
|
|
35
|
+
...q
|
|
16
36
|
}) => {
|
|
17
|
-
const
|
|
37
|
+
const y = le(), G = `${y}-input`, E = `${y}-listbox`, I = V.map(
|
|
18
38
|
(e) => typeof e == "string" ? { value: e, label: e } : e
|
|
19
|
-
), [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
39
|
+
), [b, h] = C(g), [J, Q] = C(P), [n, a] = C(-1), m = z(null), c = z(null), B = $ !== void 0, u = B ? $ : J, i = (e) => {
|
|
40
|
+
B || Q(e), W?.(e);
|
|
41
|
+
};
|
|
42
|
+
A(() => {
|
|
43
|
+
if (o !== void 0) {
|
|
44
|
+
const e = I.find((t) => t.value === o);
|
|
45
|
+
h(e?.label || o);
|
|
24
46
|
}
|
|
25
|
-
}, [
|
|
26
|
-
const
|
|
27
|
-
(e) =>
|
|
28
|
-
),
|
|
47
|
+
}, [o, I]);
|
|
48
|
+
const X = (e, t) => e.label.toLowerCase().includes(t.toLowerCase()), l = I.filter(
|
|
49
|
+
(e) => j ? j(e, b) : X(e, b)
|
|
50
|
+
), d = l.filter((e) => !e.disabled), Y = (e) => {
|
|
29
51
|
const t = e.target.value;
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
},
|
|
34
|
-
if (!
|
|
35
|
-
|
|
52
|
+
h(t), i(!0), v && d.length > 0 ? a(0) : a(-1), T?.(t), D && w?.(t);
|
|
53
|
+
}, k = (e) => {
|
|
54
|
+
e.disabled || (h(e.label), i(!1), a(-1), w?.(e.value), R?.(e.value, e), m.current?.focus());
|
|
55
|
+
}, Z = (e) => {
|
|
56
|
+
if (!u && (e.key === "ArrowDown" || e.key === "ArrowUp")) {
|
|
57
|
+
i(!0), v && d.length > 0 && a(0);
|
|
36
58
|
return;
|
|
37
59
|
}
|
|
38
60
|
switch (e.key) {
|
|
39
61
|
case "ArrowDown":
|
|
40
|
-
e.preventDefault(),
|
|
62
|
+
e.preventDefault(), a((t) => {
|
|
63
|
+
for (let s = t + 1; s < l.length; s++)
|
|
64
|
+
if (!l[s].disabled) return s;
|
|
65
|
+
return t;
|
|
66
|
+
});
|
|
41
67
|
break;
|
|
42
68
|
case "ArrowUp":
|
|
43
|
-
e.preventDefault(),
|
|
69
|
+
e.preventDefault(), a((t) => {
|
|
70
|
+
for (let s = t - 1; s >= 0; s--)
|
|
71
|
+
if (!l[s].disabled) return s;
|
|
72
|
+
return t;
|
|
73
|
+
});
|
|
44
74
|
break;
|
|
45
75
|
case "Enter":
|
|
46
|
-
e.preventDefault(),
|
|
76
|
+
e.preventDefault(), n >= 0 && l[n] && !l[n].disabled ? k(l[n]) : !D && d.length > 0 && k(d[0]);
|
|
47
77
|
break;
|
|
48
78
|
case "Escape":
|
|
49
|
-
|
|
79
|
+
i(!1), a(-1), m.current?.blur();
|
|
50
80
|
break;
|
|
51
81
|
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
},
|
|
82
|
+
}, _ = () => {
|
|
83
|
+
i(!0), v && d.length > 0 && a(0);
|
|
84
|
+
}, ee = (e) => {
|
|
85
|
+
c.current && c.current.contains(e.relatedTarget) || setTimeout(() => i(!1), 200);
|
|
86
|
+
}, te = (e) => {
|
|
87
|
+
e.stopPropagation(), h(""), w?.(""), H?.(), m.current?.focus();
|
|
88
|
+
}, ne = {
|
|
57
89
|
xs: "input-xs",
|
|
58
90
|
sm: "input-sm",
|
|
59
91
|
md: "input-md",
|
|
60
|
-
lg: "input-lg"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
lg: "input-lg",
|
|
93
|
+
xl: "input-xl"
|
|
94
|
+
}, se = x ? {
|
|
95
|
+
error: "input-error",
|
|
96
|
+
warning: "input-warning"
|
|
97
|
+
}[x] : N ? {
|
|
98
|
+
neutral: "input-neutral",
|
|
99
|
+
primary: "input-primary",
|
|
100
|
+
secondary: "input-secondary",
|
|
101
|
+
accent: "input-accent",
|
|
102
|
+
info: "input-info",
|
|
103
|
+
success: "input-success",
|
|
104
|
+
warning: "input-warning",
|
|
105
|
+
error: "input-error"
|
|
106
|
+
}[N] : "";
|
|
107
|
+
A(() => {
|
|
108
|
+
n >= 0 && c.current && c.current.children[n]?.scrollIntoView({ block: "nearest" });
|
|
109
|
+
}, [n]);
|
|
110
|
+
const L = f && b && !p, re = typeof f == "object" && f.clearIcon ? f.clearIcon : null, O = (e) => `${y}-option-${e}`, ae = [
|
|
111
|
+
"input input-bordered w-full",
|
|
112
|
+
ne[S],
|
|
113
|
+
se,
|
|
114
|
+
L && "pr-10"
|
|
115
|
+
].filter(Boolean).join(" ");
|
|
116
|
+
return /* @__PURE__ */ M(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: `dropdown dropdown-bottom w-full ${u && !p ? "dropdown-open" : ""} ${U}`,
|
|
120
|
+
"data-state": u ? "open" : "closed",
|
|
121
|
+
...q,
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ M("div", { className: "relative w-full", children: [
|
|
124
|
+
/* @__PURE__ */ r(
|
|
125
|
+
"input",
|
|
126
|
+
{
|
|
127
|
+
ref: m,
|
|
128
|
+
id: G,
|
|
129
|
+
type: "text",
|
|
130
|
+
role: "combobox",
|
|
131
|
+
"aria-expanded": u,
|
|
132
|
+
"aria-haspopup": "listbox",
|
|
133
|
+
"aria-controls": E,
|
|
134
|
+
"aria-autocomplete": "list",
|
|
135
|
+
"aria-activedescendant": n >= 0 ? O(n) : void 0,
|
|
136
|
+
"aria-invalid": x === "error" ? !0 : void 0,
|
|
137
|
+
value: b,
|
|
138
|
+
onChange: Y,
|
|
139
|
+
onKeyDown: Z,
|
|
140
|
+
onFocus: _,
|
|
141
|
+
onBlur: ee,
|
|
142
|
+
placeholder: K,
|
|
143
|
+
disabled: p,
|
|
144
|
+
className: ae
|
|
145
|
+
}
|
|
146
|
+
),
|
|
147
|
+
L && /* @__PURE__ */ r("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 z-10", children: re || /* @__PURE__ */ r(oe, { onClick: te }) })
|
|
148
|
+
] }),
|
|
149
|
+
u && !p && /* @__PURE__ */ r(
|
|
150
|
+
"ul",
|
|
87
151
|
{
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
152
|
+
ref: c,
|
|
153
|
+
id: E,
|
|
154
|
+
role: "listbox",
|
|
155
|
+
"aria-label": "Suggestions",
|
|
156
|
+
tabIndex: -1,
|
|
157
|
+
className: "dropdown-content menu bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap",
|
|
158
|
+
children: l.length > 0 ? l.map((e, t) => /* @__PURE__ */ r("li", { children: /* @__PURE__ */ r(
|
|
159
|
+
"a",
|
|
160
|
+
{
|
|
161
|
+
id: O(t),
|
|
162
|
+
role: "option",
|
|
163
|
+
"aria-selected": n === t,
|
|
164
|
+
"aria-disabled": e.disabled,
|
|
165
|
+
onMouseDown: (s) => {
|
|
166
|
+
s.preventDefault(), k(e);
|
|
167
|
+
},
|
|
168
|
+
onMouseEnter: () => !e.disabled && a(t),
|
|
169
|
+
className: [
|
|
170
|
+
t === n && !e.disabled && "active",
|
|
171
|
+
e.disabled && "disabled text-base-content/40 cursor-not-allowed"
|
|
172
|
+
].filter(Boolean).join(" "),
|
|
173
|
+
children: e.label
|
|
174
|
+
}
|
|
175
|
+
) }, e.value)) : /* @__PURE__ */ r("li", { className: "disabled", children: /* @__PURE__ */ r("span", { className: "text-base-content/60 text-center cursor-default", children: F }) })
|
|
176
|
+
}
|
|
177
|
+
)
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
);
|
|
100
181
|
};
|
|
101
182
|
export {
|
|
102
|
-
|
|
183
|
+
pe as Autocomplete
|
|
103
184
|
};
|
|
104
185
|
//# sourceMappingURL=index5.js.map
|
package/dist/index5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index5.js","sources":["../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n}\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size = 'md',\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n ...rest\n}) => {\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n setHighlightedIndex(0)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n setHighlightedIndex(0)\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => (prev < filteredOptions.length - 1 ? prev + 1 : prev))\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : 0))\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && filteredOptions.length > 0) {\n handleOptionClick(filteredOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (filteredOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const sizeClass = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n }[size]\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={`input input-bordered w-full ${sizeClass}`}\n />\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n className=\"absolute z-50 w-full mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg max-h-60 overflow-auto\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={option.value}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={`px-4 py-2 cursor-pointer transition-colors ${\n index === highlightedIndex\n ? 'bg-primary text-primary-content'\n : 'hover:bg-base-200'\n }`}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className=\"px-4 py-2 text-base-content/60 text-center\">{notFoundContent}</div>\n )}\n </div>\n )}\n </div>\n )\n}\n"],"names":["Autocomplete","value","defaultValue","onChange","rawOptions","placeholder","disabled","size","className","allowCustomValue","filterOption","notFoundContent","rest","options","opt","inputValue","setInputValue","useState","isOpen","setIsOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","handleFocus","handleBlur","sizeClass","jsxs","jsx","index","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index5.js","sources":["../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size = 'md',\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\n\n const sizeClasses = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n xl: 'input-xl',\n }\n\n const colorClasses = {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n }\n\n const statusClasses = {\n error: 'input-error',\n warning: 'input-warning',\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n 'input input-bordered w-full',\n sizeClasses[size],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`dropdown dropdown-bottom w-full ${isOpen && !disabled ? 'dropdown-open' : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className=\"dropdown-content menu bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":"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"}
|
package/dist/index50.js
CHANGED
|
@@ -1,179 +1,84 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
filterOption: x = !0,
|
|
21
|
-
className: Z = "",
|
|
22
|
-
dropdownClassName: _ = "",
|
|
23
|
-
...z
|
|
1
|
+
import { jsx as H } from "react/jsx-runtime";
|
|
2
|
+
import I, { useRef as R, useState as b, useCallback as K, useLayoutEffect as A } from "react";
|
|
3
|
+
const d = {
|
|
4
|
+
sm: 640,
|
|
5
|
+
md: 768,
|
|
6
|
+
lg: 1024,
|
|
7
|
+
xl: 1280,
|
|
8
|
+
"2xl": 1536
|
|
9
|
+
};
|
|
10
|
+
function L(t, e) {
|
|
11
|
+
return typeof t == "number" ? t : t ? t["2xl"] !== void 0 && e >= d["2xl"] ? t["2xl"] : t.xl !== void 0 && e >= d.xl ? t.xl : t.lg !== void 0 && e >= d.lg ? t.lg : t.md !== void 0 && e >= d.md ? t.md : t.sm !== void 0 && e >= d.sm ? t.sm : t.xs !== void 0 ? t.xs : 3 : 3;
|
|
12
|
+
}
|
|
13
|
+
const O = ({
|
|
14
|
+
children: t,
|
|
15
|
+
columns: e = 3,
|
|
16
|
+
gap: r = 16,
|
|
17
|
+
className: z = "",
|
|
18
|
+
style: M,
|
|
19
|
+
...P
|
|
24
20
|
}) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!e || !t || g === null) return;
|
|
46
|
-
const n = h.substring(0, g);
|
|
47
|
-
t.textContent = n;
|
|
48
|
-
const r = e.getBoundingClientRect(), s = t.getBoundingClientRect(), w = parseInt(getComputedStyle(e).lineHeight) || 20;
|
|
49
|
-
te({
|
|
50
|
-
top: r.top + window.scrollY + w + 4,
|
|
51
|
-
left: r.left + window.scrollX + Math.min(s.width % r.width, r.width - 200)
|
|
52
|
-
});
|
|
53
|
-
}, [h, g]);
|
|
54
|
-
C(() => {
|
|
55
|
-
u && O();
|
|
56
|
-
}, [u, O, D]);
|
|
57
|
-
const re = (e) => {
|
|
58
|
-
const t = e.target.value, n = e.target.selectionStart;
|
|
59
|
-
p === void 0 && T(t), E?.(t), se(t, n);
|
|
60
|
-
}, se = (e, t) => {
|
|
61
|
-
let n = null, r = null;
|
|
62
|
-
for (const s of ne) {
|
|
63
|
-
const i = e.substring(0, t).lastIndexOf(s);
|
|
64
|
-
if (i !== -1) {
|
|
65
|
-
const S = i > 0 ? e[i - 1] : v;
|
|
66
|
-
if (S === v || S === `
|
|
67
|
-
` || i === 0) {
|
|
68
|
-
const F = e.substring(i + s.length, t);
|
|
69
|
-
if (!F.includes(v) && !F.includes(`
|
|
70
|
-
`)) {
|
|
71
|
-
n = s, r = i;
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (n !== null && r !== null) {
|
|
78
|
-
const s = e.substring(r + n.length, t);
|
|
79
|
-
N(n), M(s), H(r), m(!0), y(0), W?.(s, n);
|
|
80
|
-
} else
|
|
81
|
-
m(!1), N(null), M(""), H(null);
|
|
82
|
-
}, P = (e) => {
|
|
83
|
-
if (e.disabled || g === null || I === null) return;
|
|
84
|
-
const t = l.current;
|
|
85
|
-
if (!t) return;
|
|
86
|
-
const n = h.substring(0, g), r = h.substring(t.selectionStart), s = `${I}${e.value}${v}`, w = n + s + r;
|
|
87
|
-
p === void 0 && T(w), E?.(w), U?.(e, I), m(!1), N(null), M(""), H(null), setTimeout(() => {
|
|
88
|
-
const i = n.length + s.length;
|
|
89
|
-
t.focus(), t.setSelectionRange(i, i);
|
|
90
|
-
}, 0);
|
|
91
|
-
}, ae = (e) => {
|
|
92
|
-
if (u)
|
|
93
|
-
switch (e.key) {
|
|
94
|
-
case "ArrowDown":
|
|
95
|
-
e.preventDefault(), y((t) => (t + 1) % Math.max(c.length, 1));
|
|
96
|
-
break;
|
|
97
|
-
case "ArrowUp":
|
|
98
|
-
e.preventDefault(), y((t) => (t - 1 + c.length) % Math.max(c.length, 1));
|
|
99
|
-
break;
|
|
100
|
-
case "Enter":
|
|
101
|
-
c[d] && (e.preventDefault(), P(c[d]));
|
|
102
|
-
break;
|
|
103
|
-
case "Escape":
|
|
104
|
-
e.preventDefault(), m(!1);
|
|
105
|
-
break;
|
|
106
|
-
case "Tab":
|
|
107
|
-
c[d] && (e.preventDefault(), P(c[d]));
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
C(() => {
|
|
112
|
-
const e = (t) => {
|
|
113
|
-
b.current && !b.current.contains(t.target) && l.current && !l.current.contains(t.target) && m(!1);
|
|
21
|
+
const u = R(null), [l, T] = b([]), [y, N] = b(0), w = R([]), c = I.Children.toArray(t), s = K(() => {
|
|
22
|
+
const i = u.current;
|
|
23
|
+
if (!i || c.length === 0) return;
|
|
24
|
+
const n = i.offsetWidth, m = typeof window < "u" ? window.innerWidth : n, a = L(e, m), j = (n - r * (a - 1)) / a, o = new Array(a).fill(0), W = [];
|
|
25
|
+
c.forEach((_, x) => {
|
|
26
|
+
const C = w.current[x];
|
|
27
|
+
if (!C) return;
|
|
28
|
+
let h = 0, E = o[0];
|
|
29
|
+
for (let f = 1; f < a; f++)
|
|
30
|
+
o[f] < E && (E = o[f], h = f);
|
|
31
|
+
const k = h * (j + r), B = o[h];
|
|
32
|
+
W[x] = { left: k, top: B };
|
|
33
|
+
const F = C.offsetHeight;
|
|
34
|
+
o[h] += F + r;
|
|
35
|
+
}), T(W), N(Math.max(...o) - r);
|
|
36
|
+
}, [t, e, r, c.length]);
|
|
37
|
+
A(() => {
|
|
38
|
+
s();
|
|
39
|
+
const i = () => {
|
|
40
|
+
s();
|
|
114
41
|
};
|
|
115
|
-
return
|
|
116
|
-
}, []),
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
42
|
+
return window.addEventListener("resize", i), () => window.removeEventListener("resize", i);
|
|
43
|
+
}, [s]), A(() => {
|
|
44
|
+
const i = setTimeout(s, 0);
|
|
45
|
+
return () => clearTimeout(i);
|
|
46
|
+
}, [t, s]);
|
|
47
|
+
const v = u.current?.offsetWidth ?? 0, S = typeof window < "u" ? window.innerWidth : v, g = L(e, S), p = v > 0 ? (v - r * (g - 1)) / g : 0;
|
|
48
|
+
return /* @__PURE__ */ H(
|
|
120
49
|
"div",
|
|
121
50
|
{
|
|
122
|
-
ref:
|
|
123
|
-
className:
|
|
124
|
-
min-w-48 max-h-60 overflow-auto ${_}`,
|
|
51
|
+
ref: u,
|
|
52
|
+
className: z,
|
|
125
53
|
style: {
|
|
126
|
-
|
|
127
|
-
|
|
54
|
+
position: "relative",
|
|
55
|
+
height: y > 0 ? y : void 0,
|
|
56
|
+
...M
|
|
128
57
|
},
|
|
129
|
-
|
|
130
|
-
|
|
58
|
+
...P,
|
|
59
|
+
children: c.map((i, n) => /* @__PURE__ */ H(
|
|
60
|
+
"div",
|
|
131
61
|
{
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
62
|
+
ref: (m) => {
|
|
63
|
+
w.current[n] = m;
|
|
64
|
+
},
|
|
65
|
+
style: {
|
|
66
|
+
position: l.length > 0 ? "absolute" : "relative",
|
|
67
|
+
left: l[n]?.left ?? 0,
|
|
68
|
+
top: l[n]?.top ?? 0,
|
|
69
|
+
width: p > 0 ? p : "100%",
|
|
70
|
+
visibility: l.length > 0 ? "visible" : "hidden"
|
|
71
|
+
},
|
|
72
|
+
children: i
|
|
73
|
+
},
|
|
74
|
+
n
|
|
75
|
+
))
|
|
143
76
|
}
|
|
144
77
|
);
|
|
145
|
-
return /* @__PURE__ */ K("div", { className: `relative ${Z}`, "data-state": u ? "open" : "closed", ...z, children: [
|
|
146
|
-
/* @__PURE__ */ a(
|
|
147
|
-
"div",
|
|
148
|
-
{
|
|
149
|
-
ref: B,
|
|
150
|
-
className: "invisible absolute whitespace-pre-wrap break-words",
|
|
151
|
-
style: {
|
|
152
|
-
font: l.current ? getComputedStyle(l.current).font : void 0,
|
|
153
|
-
width: l.current?.clientWidth,
|
|
154
|
-
padding: l.current ? getComputedStyle(l.current).padding : void 0
|
|
155
|
-
},
|
|
156
|
-
"aria-hidden": "true"
|
|
157
|
-
}
|
|
158
|
-
),
|
|
159
|
-
/* @__PURE__ */ a(
|
|
160
|
-
"textarea",
|
|
161
|
-
{
|
|
162
|
-
ref: l,
|
|
163
|
-
value: h,
|
|
164
|
-
onChange: re,
|
|
165
|
-
onKeyDown: ae,
|
|
166
|
-
placeholder: Y,
|
|
167
|
-
disabled: G,
|
|
168
|
-
readOnly: J,
|
|
169
|
-
rows: typeof o == "object" ? o.minRows || V : o ? 1 : V,
|
|
170
|
-
className: "textarea textarea-bordered w-full resize-none"
|
|
171
|
-
}
|
|
172
|
-
),
|
|
173
|
-
oe(le, document.body)
|
|
174
|
-
] });
|
|
175
78
|
};
|
|
79
|
+
O.displayName = "Masonry";
|
|
176
80
|
export {
|
|
177
|
-
|
|
81
|
+
O as Masonry,
|
|
82
|
+
O as default
|
|
178
83
|
};
|
|
179
84
|
//# sourceMappingURL=index50.js.map
|