asterui 0.12.62 → 0.12.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Anchor.d.ts +2 -0
- package/dist/components/Anchor.js +79 -75
- package/dist/components/Anchor.js.map +1 -1
- package/dist/components/Autocomplete.d.ts +1 -0
- package/dist/components/Autocomplete.js +115 -110
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Breadcrumb.d.ts +4 -2
- package/dist/components/Breadcrumb.js +54 -29
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Button.d.ts +5 -1
- package/dist/components/Button.js +117 -107
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Chart.d.ts +1 -0
- package/dist/components/Chart.js +31 -30
- package/dist/components/Chart.js.map +1 -1
- package/dist/components/Chat.d.ts +1 -0
- package/dist/components/Chat.js +32 -30
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Command.d.ts +5 -2
- package/dist/components/Command.js +262 -233
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ContextMenu.d.ts +4 -0
- package/dist/components/ContextMenu.js +149 -130
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/Dock.d.ts +2 -0
- package/dist/components/Dock.js +70 -46
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/FileInput.d.ts +1 -0
- package/dist/components/FileInput.js +26 -26
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -0
- package/dist/components/Filter.js +43 -40
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/Flex.d.ts +1 -0
- package/dist/components/Flex.js +43 -42
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/FloatButton.d.ts +3 -0
- package/dist/components/FloatButton.js +178 -127
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Input.d.ts +1 -0
- package/dist/components/Input.js +201 -184
- package/dist/components/Input.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -0
- package/dist/components/Loading.js +40 -37
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Masonry.d.ts +1 -0
- package/dist/components/Masonry.js +45 -42
- package/dist/components/Masonry.js.map +1 -1
- package/dist/components/Mention.d.ts +1 -0
- package/dist/components/Mention.js +95 -91
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +1 -0
- package/dist/components/MonthCalendar.js +104 -97
- package/dist/components/MonthCalendar.js.map +1 -1
- package/dist/components/QRCode.d.ts +1 -0
- package/dist/components/QRCode.js +84 -55
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.d.ts +1 -0
- package/dist/components/RadialProgress.js +19 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Range.d.ts +1 -0
- package/dist/components/Range.js +45 -43
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.d.ts +4 -2
- package/dist/components/Rating.js +83 -79
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/Responsive.d.ts +4 -2
- package/dist/components/Responsive.js +10 -9
- package/dist/components/Responsive.js.map +1 -1
- package/dist/components/Result.d.ts +1 -0
- package/dist/components/Result.js +24 -22
- package/dist/components/Result.js.map +1 -1
- package/dist/components/Select.d.ts +1 -0
- package/dist/components/Select.js +72 -62
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Splitter.d.ts +2 -0
- package/dist/components/Splitter.js +137 -131
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.d.ts +4 -2
- package/dist/components/Stat.js +19 -18
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Steps.d.ts +4 -2
- package/dist/components/Steps.js +56 -52
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/TextRotate.d.ts +1 -0
- package/dist/components/TextRotate.js +14 -12
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.d.ts +1 -0
- package/dist/components/Textarea.js +31 -30
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +6 -3
- package/dist/components/ThemeController.js +101 -92
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/Typography.d.ts +10 -5
- package/dist/components/Typography.js +84 -81
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/VirtualList.d.ts +2 -1
- package/dist/components/VirtualList.js +40 -36
- package/dist/components/VirtualList.js.map +1 -1
- package/dist/components/Watermark.d.ts +1 -0
- package/dist/components/Watermark.js +74 -71
- package/dist/components/Watermark.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +1 -0
- package/dist/components/WeekCalendar.js +91 -76
- package/dist/components/WeekCalendar.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,153 +1,156 @@
|
|
|
1
|
-
import { jsx as a, jsxs as
|
|
2
|
-
import { useState as f, useRef as
|
|
3
|
-
import { createPortal as
|
|
4
|
-
import { useConfig as
|
|
5
|
-
const
|
|
6
|
-
value:
|
|
7
|
-
defaultValue:
|
|
8
|
-
onChange:
|
|
9
|
-
onSelect:
|
|
10
|
-
onSearch:
|
|
11
|
-
options:
|
|
12
|
-
loading:
|
|
13
|
-
prefix:
|
|
14
|
-
split:
|
|
15
|
-
placeholder:
|
|
16
|
-
disabled:
|
|
17
|
-
readOnly:
|
|
18
|
-
rows:
|
|
1
|
+
import { jsx as a, jsxs as W } from "react/jsx-runtime";
|
|
2
|
+
import { useState as f, useRef as T, useCallback as E, useEffect as $ } from "react";
|
|
3
|
+
import { createPortal as he } from "react-dom";
|
|
4
|
+
import { useConfig as ge } from "../providers/ConfigProvider.js";
|
|
5
|
+
const pe = "textarea", be = "textarea-bordered", ve = "menu", we = "menu-sm", xe = "loading", ye = "loading-spinner", Ce = "loading-sm", $e = "avatar", Ie = ({
|
|
6
|
+
value: w,
|
|
7
|
+
defaultValue: X = "",
|
|
8
|
+
onChange: L,
|
|
9
|
+
onSelect: Y,
|
|
10
|
+
onSearch: G,
|
|
11
|
+
options: R = [],
|
|
12
|
+
loading: J = !1,
|
|
13
|
+
prefix: k = "@",
|
|
14
|
+
split: x = " ",
|
|
15
|
+
placeholder: Q,
|
|
16
|
+
disabled: Z,
|
|
17
|
+
readOnly: _ = !1,
|
|
18
|
+
rows: S = 3,
|
|
19
19
|
autoSize: l = !1,
|
|
20
|
-
notFoundContent:
|
|
21
|
-
filterOption:
|
|
22
|
-
className:
|
|
23
|
-
dropdownClassName:
|
|
24
|
-
|
|
20
|
+
notFoundContent: z,
|
|
21
|
+
filterOption: y = !0,
|
|
22
|
+
className: ee = "",
|
|
23
|
+
dropdownClassName: te = "",
|
|
24
|
+
"data-testid": M,
|
|
25
|
+
...ne
|
|
25
26
|
}) => {
|
|
26
|
-
const { componentDisabled:
|
|
27
|
-
if (!
|
|
28
|
-
const e = typeof
|
|
29
|
-
return
|
|
30
|
-
}, [
|
|
27
|
+
const { componentDisabled: se, renderEmpty: re, getPopupContainer: V } = ge(), ae = Z ?? se ?? !1, oe = z ?? re?.("Mention") ?? "No matches found", [le, B] = f(X), m = w !== void 0 ? w : le, [d, h] = f(!1), [N, D] = f(null), [I, P] = f(""), [u, C] = f(0), [g, H] = f(null), [j, ce] = f({ top: 0, left: 0 }), o = T(null), p = T(null), O = T(null), ie = Array.isArray(k) ? k : [k], c = E(() => {
|
|
28
|
+
if (!y) return R;
|
|
29
|
+
const e = typeof y == "function" ? y : (t, n) => (n.label || n.value).toLowerCase().includes(t.toLowerCase());
|
|
30
|
+
return R.filter((t) => e(I, t));
|
|
31
|
+
}, [R, I, y])(), F = E(() => {
|
|
31
32
|
const e = o.current;
|
|
32
33
|
if (!e || !l) return;
|
|
33
34
|
e.style.height = "auto";
|
|
34
35
|
const t = e.scrollHeight;
|
|
35
36
|
if (typeof l == "object") {
|
|
36
|
-
const n = parseInt(getComputedStyle(e).lineHeight) || 20,
|
|
37
|
-
e.style.height = `${Math.min(Math.max(t,
|
|
37
|
+
const n = parseInt(getComputedStyle(e).lineHeight) || 20, s = l.minRows ? l.minRows * n : 0, r = l.maxRows ? l.maxRows * n : 1 / 0;
|
|
38
|
+
e.style.height = `${Math.min(Math.max(t, s), r)}px`;
|
|
38
39
|
} else
|
|
39
40
|
e.style.height = `${t}px`;
|
|
40
41
|
}, [l]);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}, [m,
|
|
44
|
-
const
|
|
45
|
-
const e = o.current, t =
|
|
42
|
+
$(() => {
|
|
43
|
+
F();
|
|
44
|
+
}, [m, F]);
|
|
45
|
+
const K = E(() => {
|
|
46
|
+
const e = o.current, t = O.current;
|
|
46
47
|
if (!e || !t || g === null) return;
|
|
47
48
|
const n = m.substring(0, g);
|
|
48
49
|
t.textContent = n;
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
top:
|
|
52
|
-
left:
|
|
50
|
+
const s = e.getBoundingClientRect(), r = t.getBoundingClientRect(), v = parseInt(getComputedStyle(e).lineHeight) || 20;
|
|
51
|
+
ce({
|
|
52
|
+
top: s.top + window.scrollY + v + 4,
|
|
53
|
+
left: s.left + window.scrollX + Math.min(r.width % s.width, s.width - 200)
|
|
53
54
|
});
|
|
54
55
|
}, [m, g]);
|
|
55
|
-
|
|
56
|
-
d &&
|
|
57
|
-
}, [d,
|
|
58
|
-
const
|
|
56
|
+
$(() => {
|
|
57
|
+
d && K();
|
|
58
|
+
}, [d, K, I]);
|
|
59
|
+
const de = (e) => {
|
|
59
60
|
const t = e.target.value, n = e.target.selectionStart;
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
let n = null,
|
|
63
|
-
for (const
|
|
64
|
-
const i = e.substring(0, t).lastIndexOf(
|
|
61
|
+
w === void 0 && B(t), L?.(t), ue(t, n);
|
|
62
|
+
}, ue = (e, t) => {
|
|
63
|
+
let n = null, s = null;
|
|
64
|
+
for (const r of ie) {
|
|
65
|
+
const i = e.substring(0, t).lastIndexOf(r);
|
|
65
66
|
if (i !== -1) {
|
|
66
|
-
const
|
|
67
|
-
if (
|
|
67
|
+
const q = i > 0 ? e[i - 1] : x;
|
|
68
|
+
if (q === x || q === `
|
|
68
69
|
` || i === 0) {
|
|
69
|
-
const
|
|
70
|
-
if (!
|
|
70
|
+
const U = e.substring(i + r.length, t);
|
|
71
|
+
if (!U.includes(x) && !U.includes(`
|
|
71
72
|
`)) {
|
|
72
|
-
n =
|
|
73
|
+
n = r, s = i;
|
|
73
74
|
break;
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
78
|
-
if (n !== null &&
|
|
79
|
-
const
|
|
80
|
-
|
|
79
|
+
if (n !== null && s !== null) {
|
|
80
|
+
const r = e.substring(s + n.length, t);
|
|
81
|
+
D(n), P(r), H(s), h(!0), C(0), G?.(r, n);
|
|
81
82
|
} else
|
|
82
|
-
h(!1),
|
|
83
|
-
},
|
|
84
|
-
if (e.disabled || g === null ||
|
|
83
|
+
h(!1), D(null), P(""), H(null);
|
|
84
|
+
}, A = (e) => {
|
|
85
|
+
if (e.disabled || g === null || N === null) return;
|
|
85
86
|
const t = o.current;
|
|
86
87
|
if (!t) return;
|
|
87
|
-
const n = m.substring(0, g),
|
|
88
|
-
|
|
89
|
-
const i = n.length +
|
|
88
|
+
const n = m.substring(0, g), s = m.substring(t.selectionStart), r = `${N}${e.value}${x}`, v = n + r + s;
|
|
89
|
+
w === void 0 && B(v), L?.(v), Y?.(e, N), h(!1), D(null), P(""), H(null), setTimeout(() => {
|
|
90
|
+
const i = n.length + r.length;
|
|
90
91
|
t.focus(), t.setSelectionRange(i, i);
|
|
91
92
|
}, 0);
|
|
92
|
-
},
|
|
93
|
+
}, fe = (e) => {
|
|
93
94
|
if (d)
|
|
94
95
|
switch (e.key) {
|
|
95
96
|
case "ArrowDown":
|
|
96
|
-
e.preventDefault(),
|
|
97
|
+
e.preventDefault(), C((t) => (t + 1) % Math.max(c.length, 1));
|
|
97
98
|
break;
|
|
98
99
|
case "ArrowUp":
|
|
99
|
-
e.preventDefault(),
|
|
100
|
+
e.preventDefault(), C((t) => (t - 1 + c.length) % Math.max(c.length, 1));
|
|
100
101
|
break;
|
|
101
102
|
case "Enter":
|
|
102
|
-
c[u] && (e.preventDefault(),
|
|
103
|
+
c[u] && (e.preventDefault(), A(c[u]));
|
|
103
104
|
break;
|
|
104
105
|
case "Escape":
|
|
105
106
|
e.preventDefault(), h(!1);
|
|
106
107
|
break;
|
|
107
108
|
case "Tab":
|
|
108
|
-
c[u] && (e.preventDefault(),
|
|
109
|
+
c[u] && (e.preventDefault(), A(c[u]));
|
|
109
110
|
break;
|
|
110
111
|
}
|
|
111
112
|
};
|
|
112
|
-
|
|
113
|
+
$(() => {
|
|
113
114
|
const e = (t) => {
|
|
114
|
-
|
|
115
|
+
p.current && !p.current.contains(t.target) && o.current && !o.current.contains(t.target) && h(!1);
|
|
115
116
|
};
|
|
116
117
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
117
|
-
}, []),
|
|
118
|
-
d &&
|
|
118
|
+
}, []), $(() => {
|
|
119
|
+
d && p.current && p.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
|
|
119
120
|
}, [u, d]);
|
|
120
|
-
const
|
|
121
|
+
const b = (e) => M ? `${M}-${e}` : void 0, me = d && /* @__PURE__ */ a(
|
|
121
122
|
"div",
|
|
122
123
|
{
|
|
123
|
-
ref:
|
|
124
|
+
ref: p,
|
|
124
125
|
className: `fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg
|
|
125
|
-
min-w-48 max-h-60 overflow-auto ${
|
|
126
|
+
min-w-48 max-h-60 overflow-auto ${te}`,
|
|
126
127
|
style: {
|
|
127
|
-
top:
|
|
128
|
-
left:
|
|
128
|
+
top: j.top,
|
|
129
|
+
left: j.left
|
|
129
130
|
},
|
|
130
|
-
|
|
131
|
+
"data-testid": b("dropdown"),
|
|
132
|
+
children: J ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60", "data-testid": b("loading"), children: /* @__PURE__ */ a("span", { className: `${xe} ${ye} ${Ce}` }) }) : c.length === 0 ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60 text-sm", "data-testid": b("empty"), children: oe }) : /* @__PURE__ */ a("ul", { className: `${ve} ${we} p-1`, children: c.map((e, t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ W(
|
|
131
133
|
"button",
|
|
132
134
|
{
|
|
133
135
|
type: "button",
|
|
134
136
|
"data-active": t === u,
|
|
137
|
+
"data-testid": b(`option-${e.value || t}`),
|
|
135
138
|
className: `flex items-center gap-2 ${t === u ? "active" : ""} ${e.disabled ? "disabled opacity-50 cursor-not-allowed" : ""}`,
|
|
136
|
-
onClick: () =>
|
|
137
|
-
onMouseEnter: () =>
|
|
139
|
+
onClick: () => A(e),
|
|
140
|
+
onMouseEnter: () => C(t),
|
|
138
141
|
children: [
|
|
139
|
-
e.avatar && /* @__PURE__ */ a("div", { className:
|
|
142
|
+
e.avatar && /* @__PURE__ */ a("div", { className: $e, children: /* @__PURE__ */ a("div", { className: "w-6 h-6 rounded-full", children: /* @__PURE__ */ a("img", { src: e.avatar, alt: "" }) }) }),
|
|
140
143
|
/* @__PURE__ */ a("span", { children: e.label || e.value })
|
|
141
144
|
]
|
|
142
145
|
}
|
|
143
146
|
) }, e.value)) })
|
|
144
147
|
}
|
|
145
148
|
);
|
|
146
|
-
return /* @__PURE__ */
|
|
149
|
+
return /* @__PURE__ */ W("div", { className: `relative ${ee}`, "data-state": d ? "open" : "closed", "data-testid": M, ...ne, children: [
|
|
147
150
|
/* @__PURE__ */ a(
|
|
148
151
|
"div",
|
|
149
152
|
{
|
|
150
|
-
ref:
|
|
153
|
+
ref: O,
|
|
151
154
|
className: "invisible absolute whitespace-pre-wrap break-words",
|
|
152
155
|
style: {
|
|
153
156
|
font: o.current ? getComputedStyle(o.current).font : void 0,
|
|
@@ -162,19 +165,20 @@ const he = "textarea", ge = "textarea-bordered", be = "menu", pe = "menu-sm", ve
|
|
|
162
165
|
{
|
|
163
166
|
ref: o,
|
|
164
167
|
value: m,
|
|
165
|
-
onChange:
|
|
166
|
-
onKeyDown:
|
|
167
|
-
placeholder:
|
|
168
|
-
disabled:
|
|
169
|
-
readOnly:
|
|
170
|
-
rows: typeof l == "object" ? l.minRows ||
|
|
171
|
-
className: `${
|
|
168
|
+
onChange: de,
|
|
169
|
+
onKeyDown: fe,
|
|
170
|
+
placeholder: Q,
|
|
171
|
+
disabled: ae,
|
|
172
|
+
readOnly: _,
|
|
173
|
+
rows: typeof l == "object" ? l.minRows || S : l ? 1 : S,
|
|
174
|
+
className: `${pe} ${be} w-full resize-none`,
|
|
175
|
+
"data-testid": b("textarea")
|
|
172
176
|
}
|
|
173
177
|
),
|
|
174
|
-
|
|
178
|
+
he(me, V ? V(document.body) : document.body)
|
|
175
179
|
] });
|
|
176
180
|
};
|
|
177
181
|
export {
|
|
178
|
-
|
|
182
|
+
Ie as Mention
|
|
179
183
|
};
|
|
180
184
|
//# sourceMappingURL=Mention.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mention.js","sources":["../../src/components/Mention.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dMenu = 'menu'\nconst dMenuSm = 'menu-sm'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingSm = 'loading-sm'\nconst dAvatar = 'avatar'\n\nexport interface MentionOption {\n value: string\n label?: string\n avatar?: string\n disabled?: boolean\n}\n\nexport interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect' | 'defaultValue' | 'prefix'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (option: MentionOption, prefix: string) => void\n onSearch?: (text: string, prefix: string) => void\n options?: MentionOption[]\n loading?: boolean\n prefix?: string | string[]\n split?: string\n placeholder?: string\n disabled?: boolean\n readOnly?: boolean\n rows?: number\n autoSize?: boolean | { minRows?: number; maxRows?: number }\n notFoundContent?: React.ReactNode\n filterOption?: boolean | ((input: string, option: MentionOption) => boolean)\n dropdownClassName?: string\n}\n\nexport const Mention: React.FC<MentionProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options = [],\n loading = false,\n prefix = '@',\n split = ' ',\n placeholder,\n disabled,\n readOnly = false,\n rows = 3,\n autoSize = false,\n notFoundContent,\n filterOption = true,\n className = '',\n dropdownClassName = '',\n ...rest\n}) => {\n const { componentDisabled, renderEmpty, getPopupContainer } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n const effectiveNotFoundContent = notFoundContent ?? renderEmpty?.('Mention') ?? 'No matches found'\n\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [isOpen, setIsOpen] = useState(false)\n const [activePrefix, setActivePrefix] = useState<string | null>(null)\n const [searchText, setSearchText] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [mentionStart, setMentionStart] = useState<number | null>(null)\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n\n const prefixes = Array.isArray(prefix) ? prefix : [prefix]\n\n // Filter options based on search text\n const filteredOptions = useCallback(() => {\n if (!filterOption) return options\n\n const filterFn =\n typeof filterOption === 'function'\n ? filterOption\n : (input: string, option: MentionOption) => {\n const label = option.label || option.value\n return label.toLowerCase().includes(input.toLowerCase())\n }\n\n return options.filter((opt) => filterFn(searchText, opt))\n }, [options, searchText, filterOption])\n\n const filtered = filteredOptions()\n\n // Update textarea height for autoSize\n const updateHeight = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea || !autoSize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n\n if (typeof autoSize === 'object') {\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n const minHeight = autoSize.minRows ? autoSize.minRows * lineHeight : 0\n const maxHeight = autoSize.maxRows ? autoSize.maxRows * lineHeight : Infinity\n\n textarea.style.height = `${Math.min(Math.max(scrollHeight, minHeight), maxHeight)}px`\n } else {\n textarea.style.height = `${scrollHeight}px`\n }\n }, [autoSize])\n\n useEffect(() => {\n updateHeight()\n }, [currentValue, updateHeight])\n\n // Calculate dropdown position\n const updateDropdownPosition = useCallback(() => {\n const textarea = textareaRef.current\n const measure = measureRef.current\n if (!textarea || !measure || mentionStart === null) return\n\n // Get text before cursor to measure position\n const textBeforeCursor = currentValue.substring(0, mentionStart)\n\n // Create a temporary element to measure text position\n measure.textContent = textBeforeCursor\n\n const textareaRect = textarea.getBoundingClientRect()\n const measureRect = measure.getBoundingClientRect()\n\n // Calculate position relative to viewport\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n\n setDropdownPosition({\n top: textareaRect.top + window.scrollY + lineHeight + 4,\n left: textareaRect.left + window.scrollX + Math.min(measureRect.width % textareaRect.width, textareaRect.width - 200),\n })\n }, [currentValue, mentionStart])\n\n useEffect(() => {\n if (isOpen) {\n updateDropdownPosition()\n }\n }, [isOpen, updateDropdownPosition, searchText])\n\n // Handle text change\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n const cursorPos = e.target.selectionStart\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Check if we should open the mention dropdown\n checkForMention(newValue, cursorPos)\n }\n\n const checkForMention = (text: string, cursorPos: number) => {\n // Look backwards from cursor for a prefix\n let foundPrefix: string | null = null\n let foundStart: number | null = null\n\n for (const p of prefixes) {\n // Find the last occurrence of prefix before cursor\n const beforeCursor = text.substring(0, cursorPos)\n const lastPrefixIndex = beforeCursor.lastIndexOf(p)\n\n if (lastPrefixIndex !== -1) {\n // Check if prefix is at start or preceded by whitespace/split\n const charBefore = lastPrefixIndex > 0 ? text[lastPrefixIndex - 1] : split\n if (charBefore === split || charBefore === '\\n' || lastPrefixIndex === 0) {\n // Check if there's no space between prefix and cursor\n const textAfterPrefix = text.substring(lastPrefixIndex + p.length, cursorPos)\n if (!textAfterPrefix.includes(split) && !textAfterPrefix.includes('\\n')) {\n foundPrefix = p\n foundStart = lastPrefixIndex\n break\n }\n }\n }\n }\n\n if (foundPrefix !== null && foundStart !== null) {\n const search = text.substring(foundStart + foundPrefix.length, cursorPos)\n setActivePrefix(foundPrefix)\n setSearchText(search)\n setMentionStart(foundStart)\n setIsOpen(true)\n setActiveIndex(0)\n onSearch?.(search, foundPrefix)\n } else {\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n }\n }\n\n // Handle option selection\n const selectOption = (option: MentionOption) => {\n if (option.disabled || mentionStart === null || activePrefix === null) return\n\n const textarea = textareaRef.current\n if (!textarea) return\n\n const beforeMention = currentValue.substring(0, mentionStart)\n const afterCursor = currentValue.substring(textarea.selectionStart)\n\n const mentionText = `${activePrefix}${option.value}${split}`\n const newValue = beforeMention + mentionText + afterCursor\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onSelect?.(option, activePrefix)\n\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n\n // Set cursor position after mention\n setTimeout(() => {\n const newCursorPos = beforeMention.length + mentionText.length\n textarea.focus()\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n }, 0)\n }\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isOpen) return\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n break\n case 'Enter':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n break\n case 'Tab':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n }\n }\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node) &&\n textareaRef.current &&\n !textareaRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Scroll active item into view\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const activeItem = dropdownRef.current.querySelector('[data-active=\"true\"]')\n activeItem?.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex, isOpen])\n\n const dropdown = isOpen && (\n <div\n ref={dropdownRef}\n className={`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg\n min-w-48 max-h-60 overflow-auto ${dropdownClassName}`}\n style={{\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n }}\n >\n {loading ? (\n <div className=\"p-3 text-center text-base-content/60\">\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingSm}`}></span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"p-3 text-center text-base-content/60 text-sm\">\n {effectiveNotFoundContent}\n </div>\n ) : (\n <ul className={`${dMenu} ${dMenuSm} p-1`}>\n {filtered.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n data-active={index === activeIndex}\n className={`flex items-center gap-2 ${\n index === activeIndex ? 'active' : ''\n } ${option.disabled ? 'disabled opacity-50 cursor-not-allowed' : ''}`}\n onClick={() => selectOption(option)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {option.avatar && (\n <div className={dAvatar}>\n <div className=\"w-6 h-6 rounded-full\">\n <img src={option.avatar} alt=\"\" />\n </div>\n </div>\n )}\n <span>{option.label || option.value}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n {/* Hidden measure element for cursor position */}\n <div\n ref={measureRef}\n className=\"invisible absolute whitespace-pre-wrap break-words\"\n style={{\n font: textareaRef.current ? getComputedStyle(textareaRef.current).font : undefined,\n width: textareaRef.current?.clientWidth,\n padding: textareaRef.current ? getComputedStyle(textareaRef.current).padding : undefined,\n }}\n aria-hidden=\"true\"\n />\n\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n rows={typeof autoSize === 'object' ? autoSize.minRows || rows : autoSize ? 1 : rows}\n className={`${dTextarea} ${dTextareaBordered} w-full resize-none`}\n />\n\n {createPortal(dropdown, getPopupContainer ? getPopupContainer(document.body) : document.body)}\n </div>\n )\n}\n"],"names":["dTextarea","dTextareaBordered","dMenu","dMenuSm","dLoading","dLoadingSpinner","dLoadingSm","dAvatar","Mention","value","defaultValue","onChange","onSelect","onSearch","options","loading","prefix","split","placeholder","disabled","readOnly","rows","autoSize","notFoundContent","filterOption","className","dropdownClassName","rest","componentDisabled","renderEmpty","getPopupContainer","useConfig","effectiveDisabled","effectiveNotFoundContent","internalValue","setInternalValue","useState","currentValue","isOpen","setIsOpen","activePrefix","setActivePrefix","searchText","setSearchText","activeIndex","setActiveIndex","mentionStart","setMentionStart","dropdownPosition","setDropdownPosition","textareaRef","useRef","dropdownRef","measureRef","prefixes","filtered","useCallback","filterFn","input","option","opt","updateHeight","textarea","scrollHeight","lineHeight","minHeight","maxHeight","useEffect","updateDropdownPosition","measure","textBeforeCursor","textareaRect","measureRect","handleChange","newValue","cursorPos","checkForMention","text","foundPrefix","foundStart","p","lastPrefixIndex","charBefore","textAfterPrefix","search","selectOption","beforeMention","afterCursor","mentionText","newCursorPos","handleKeyDown","prev","handleClickOutside","e","dropdown","jsx","index","jsxs","createPortal"],"mappings":";;;;AAKA,MAAMA,KAAY,YACZC,KAAoB,qBACpBC,KAAQ,QACRC,KAAU,WACVC,KAAW,WACXC,KAAkB,mBAClBC,KAAa,cACbC,KAAU,UA6BHC,KAAkC,CAAC;AAAA,EAC9C,OAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC,IAAU,CAAA;AAAA,EACV,SAAAC,IAAU;AAAA,EACV,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,iBAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,WAAAC,IAAY;AAAA,EACZ,mBAAAC,IAAoB;AAAA,EACpB,GAAGC;AACL,MAAM;AACJ,QAAM,EAAE,mBAAAC,IAAmB,aAAAC,IAAa,mBAAAC,EAAA,IAAsBC,GAAA,GACxDC,KAAoBb,KAAYS,MAAqB,IACrDK,KAA2BV,KAAmBM,KAAc,SAAS,KAAK,oBAE1E,CAACK,IAAeC,CAAgB,IAAIC,EAAS1B,CAAY,GACzD2B,IAAe5B,MAAU,SAAYA,IAAQyB,IAE7C,CAACI,GAAQC,CAAS,IAAIH,EAAS,EAAK,GACpC,CAACI,GAAcC,CAAe,IAAIL,EAAwB,IAAI,GAC9D,CAACM,GAAYC,CAAa,IAAIP,EAAS,EAAE,GACzC,CAACQ,GAAaC,CAAc,IAAIT,EAAS,CAAC,GAC1C,CAACU,GAAcC,CAAe,IAAIX,EAAwB,IAAI,GAC9D,CAACY,GAAkBC,EAAmB,IAAIb,EAAS,EAAE,KAAK,GAAG,MAAM,GAAG,GAEtEc,IAAcC,EAA4B,IAAI,GAC9CC,IAAcD,EAAuB,IAAI,GACzCE,IAAaF,EAAuB,IAAI,GAExCG,KAAW,MAAM,QAAQtC,CAAM,IAAIA,IAAS,CAACA,CAAM,GAiBnDuC,IAdkBC,EAAY,MAAM;AACxC,QAAI,CAAChC,EAAc,QAAOV;AAE1B,UAAM2C,IACJ,OAAOjC,KAAiB,aACpBA,IACA,CAACkC,GAAeC,OACAA,EAAO,SAASA,EAAO,OACxB,YAAA,EAAc,SAASD,EAAM,aAAa;AAG/D,WAAO5C,EAAQ,OAAO,CAAC8C,MAAQH,EAASf,GAAYkB,CAAG,CAAC;AAAA,EAC1D,GAAG,CAAC9C,GAAS4B,GAAYlB,CAAY,CAAC,EAErB,GAGXqC,IAAeL,EAAY,MAAM;AACrC,UAAMM,IAAWZ,EAAY;AAC7B,QAAI,CAACY,KAAY,CAACxC,EAAU;AAE5B,IAAAwC,EAAS,MAAM,SAAS;AACxB,UAAMC,IAAeD,EAAS;AAE9B,QAAI,OAAOxC,KAAa,UAAU;AAChC,YAAM0C,IAAa,SAAS,iBAAiBF,CAAQ,EAAE,UAAU,KAAK,IAChEG,IAAY3C,EAAS,UAAUA,EAAS,UAAU0C,IAAa,GAC/DE,IAAY5C,EAAS,UAAUA,EAAS,UAAU0C,IAAa;AAErE,MAAAF,EAAS,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,IAAIC,GAAcE,CAAS,GAAGC,CAAS,CAAC;AAAA,IACnF;AACE,MAAAJ,EAAS,MAAM,SAAS,GAAGC,CAAY;AAAA,EAE3C,GAAG,CAACzC,CAAQ,CAAC;AAEb,EAAA6C,EAAU,MAAM;AACd,IAAAN,EAAA;AAAA,EACF,GAAG,CAACxB,GAAcwB,CAAY,CAAC;AAG/B,QAAMO,IAAyBZ,EAAY,MAAM;AAC/C,UAAMM,IAAWZ,EAAY,SACvBmB,IAAUhB,EAAW;AAC3B,QAAI,CAACS,KAAY,CAACO,KAAWvB,MAAiB,KAAM;AAGpD,UAAMwB,IAAmBjC,EAAa,UAAU,GAAGS,CAAY;AAG/D,IAAAuB,EAAQ,cAAcC;AAEtB,UAAMC,IAAeT,EAAS,sBAAA,GACxBU,IAAcH,EAAQ,sBAAA,GAGtBL,IAAa,SAAS,iBAAiBF,CAAQ,EAAE,UAAU,KAAK;AAEtE,IAAAb,GAAoB;AAAA,MAClB,KAAKsB,EAAa,MAAM,OAAO,UAAUP,IAAa;AAAA,MACtD,MAAMO,EAAa,OAAO,OAAO,UAAU,KAAK,IAAIC,EAAY,QAAQD,EAAa,OAAOA,EAAa,QAAQ,GAAG;AAAA,IAAA,CACrH;AAAA,EACH,GAAG,CAAClC,GAAcS,CAAY,CAAC;AAE/B,EAAAqB,EAAU,MAAM;AACd,IAAI7B,KACF8B,EAAA;AAAA,EAEJ,GAAG,CAAC9B,GAAQ8B,GAAwB1B,CAAU,CAAC;AAG/C,QAAM+B,KAAe,CAAC,MAA8C;AAClE,UAAMC,IAAW,EAAE,OAAO,OACpBC,IAAY,EAAE,OAAO;AAE3B,IAAIlE,MAAU,UACZ0B,EAAiBuC,CAAQ,GAE3B/D,IAAW+D,CAAQ,GAGnBE,GAAgBF,GAAUC,CAAS;AAAA,EACrC,GAEMC,KAAkB,CAACC,GAAcF,MAAsB;AAE3D,QAAIG,IAA6B,MAC7BC,IAA4B;AAEhC,eAAWC,KAAK1B,IAAU;AAGxB,YAAM2B,IADeJ,EAAK,UAAU,GAAGF,CAAS,EACX,YAAYK,CAAC;AAElD,UAAIC,MAAoB,IAAI;AAE1B,cAAMC,IAAaD,IAAkB,IAAIJ,EAAKI,IAAkB,CAAC,IAAIhE;AACrE,YAAIiE,MAAejE,KAASiE,MAAe;AAAA,KAAQD,MAAoB,GAAG;AAExE,gBAAME,IAAkBN,EAAK,UAAUI,IAAkBD,EAAE,QAAQL,CAAS;AAC5E,cAAI,CAACQ,EAAgB,SAASlE,CAAK,KAAK,CAACkE,EAAgB,SAAS;AAAA,CAAI,GAAG;AACvE,YAAAL,IAAcE,GACdD,IAAaE;AACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAIH,MAAgB,QAAQC,MAAe,MAAM;AAC/C,YAAMK,IAASP,EAAK,UAAUE,IAAaD,EAAY,QAAQH,CAAS;AACxE,MAAAlC,EAAgBqC,CAAW,GAC3BnC,EAAcyC,CAAM,GACpBrC,EAAgBgC,CAAU,GAC1BxC,EAAU,EAAI,GACdM,EAAe,CAAC,GAChBhC,IAAWuE,GAAQN,CAAW;AAAA,IAChC;AACE,MAAAvC,EAAU,EAAK,GACfE,EAAgB,IAAI,GACpBE,EAAc,EAAE,GAChBI,EAAgB,IAAI;AAAA,EAExB,GAGMsC,IAAe,CAAC1B,MAA0B;AAC9C,QAAIA,EAAO,YAAYb,MAAiB,QAAQN,MAAiB,KAAM;AAEvE,UAAMsB,IAAWZ,EAAY;AAC7B,QAAI,CAACY,EAAU;AAEf,UAAMwB,IAAgBjD,EAAa,UAAU,GAAGS,CAAY,GACtDyC,IAAclD,EAAa,UAAUyB,EAAS,cAAc,GAE5D0B,IAAc,GAAGhD,CAAY,GAAGmB,EAAO,KAAK,GAAG1C,CAAK,IACpDyD,IAAWY,IAAgBE,IAAcD;AAE/C,IAAI9E,MAAU,UACZ0B,EAAiBuC,CAAQ,GAE3B/D,IAAW+D,CAAQ,GACnB9D,IAAW+C,GAAQnB,CAAY,GAE/BD,EAAU,EAAK,GACfE,EAAgB,IAAI,GACpBE,EAAc,EAAE,GAChBI,EAAgB,IAAI,GAGpB,WAAW,MAAM;AACf,YAAM0C,IAAeH,EAAc,SAASE,EAAY;AACxD,MAAA1B,EAAS,MAAA,GACTA,EAAS,kBAAkB2B,GAAcA,CAAY;AAAA,IACvD,GAAG,CAAC;AAAA,EACN,GAGMC,KAAgB,CAAC,MAAgD;AACrE,QAAKpD;AAEL,cAAQ,EAAE,KAAA;AAAA,QACR,KAAK;AACH,YAAE,eAAA,GACFO,EAAe,CAAC8C,OAAUA,IAAO,KAAK,KAAK,IAAIpC,EAAS,QAAQ,CAAC,CAAC;AAClE;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACFV,EAAe,CAAC8C,OAAUA,IAAO,IAAIpC,EAAS,UAAU,KAAK,IAAIA,EAAS,QAAQ,CAAC,CAAC;AACpF;AAAA,QACF,KAAK;AACH,UAAIA,EAASX,CAAW,MACtB,EAAE,eAAA,GACFyC,EAAa9B,EAASX,CAAW,CAAC;AAEpC;AAAA,QACF,KAAK;AACH,YAAE,eAAA,GACFL,EAAU,EAAK;AACf;AAAA,QACF,KAAK;AACH,UAAIgB,EAASX,CAAW,MACtB,EAAE,eAAA,GACFyC,EAAa9B,EAASX,CAAW,CAAC;AAEpC;AAAA,MAAA;AAAA,EAEN;AAGA,EAAAuB,EAAU,MAAM;AACd,UAAMyB,IAAqB,CAACC,MAAkB;AAC5C,MACEzC,EAAY,WACZ,CAACA,EAAY,QAAQ,SAASyC,EAAE,MAAc,KAC9C3C,EAAY,WACZ,CAACA,EAAY,QAAQ,SAAS2C,EAAE,MAAc,KAE9CtD,EAAU,EAAK;AAAA,IAEnB;AAEA,oBAAS,iBAAiB,aAAaqD,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAAA,CAAE,GAGLzB,EAAU,MAAM;AACd,IAAI7B,KAAUc,EAAY,WACLA,EAAY,QAAQ,cAAc,sBAAsB,GAC/D,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAEnD,GAAG,CAACR,GAAaN,CAAM,CAAC;AAExB,QAAMwD,KAAWxD,KACf,gBAAAyD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK3C;AAAA,MACL,WAAW;AAAA,0CACyB1B,CAAiB;AAAA,MACrD,OAAO;AAAA,QACL,KAAKsB,EAAiB;AAAA,QACtB,MAAMA,EAAiB;AAAA,MAAA;AAAA,MAGxB,cACC,gBAAA+C,EAAC,OAAA,EAAI,WAAU,wCACb,UAAA,gBAAAA,EAAC,UAAK,WAAW,GAAG3F,EAAQ,IAAIC,EAAe,IAAIC,EAAU,IAAI,EAAA,CACnE,IACEiD,EAAS,WAAW,IACtB,gBAAAwC,EAAC,OAAA,EAAI,WAAU,gDACZ,UAAA9D,GAAA,CACH,IAEA,gBAAA8D,EAAC,MAAA,EAAG,WAAW,GAAG7F,EAAK,IAAIC,EAAO,QAC/B,UAAAoD,EAAS,IAAI,CAACI,GAAQqC,wBACpB,MAAA,EACC,UAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,eAAaD,MAAUpD;AAAA,UACvB,WAAW,2BACToD,MAAUpD,IAAc,WAAW,EACrC,IAAIe,EAAO,WAAW,2CAA2C,EAAE;AAAA,UACnE,SAAS,MAAM0B,EAAa1B,CAAM;AAAA,UAClC,cAAc,MAAMd,EAAemD,CAAK;AAAA,UAEvC,UAAA;AAAA,YAAArC,EAAO,UACN,gBAAAoC,EAAC,OAAA,EAAI,WAAWxF,IACd,4BAAC,OAAA,EAAI,WAAU,wBACb,UAAA,gBAAAwF,EAAC,SAAI,KAAKpC,EAAO,QAAQ,KAAI,IAAG,GAClC,EAAA,CACF;AAAA,YAEF,gBAAAoC,EAAC,QAAA,EAAM,UAAApC,EAAO,SAASA,EAAO,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,KAjB/BA,EAAO,KAmBhB,CACD,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAKN,SACE,gBAAAsC,EAAC,OAAA,EAAI,WAAW,YAAYxE,CAAS,IAAI,cAAYa,IAAS,SAAS,UAAW,GAAGX,IAEnF,UAAA;AAAA,IAAA,gBAAAoE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK1C;AAAA,QACL,WAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAMH,EAAY,UAAU,iBAAiBA,EAAY,OAAO,EAAE,OAAO;AAAA,UACzE,OAAOA,EAAY,SAAS;AAAA,UAC5B,SAASA,EAAY,UAAU,iBAAiBA,EAAY,OAAO,EAAE,UAAU;AAAA,QAAA;AAAA,QAEjF,eAAY;AAAA,MAAA;AAAA,IAAA;AAAA,IAGd,gBAAA6C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK7C;AAAA,QACL,OAAOb;AAAA,QACP,UAAUoC;AAAA,QACV,WAAWiB;AAAA,QACX,aAAAxE;AAAA,QACA,UAAUc;AAAA,QACV,UAAAZ;AAAA,QACA,MAAM,OAAOE,KAAa,WAAWA,EAAS,WAAWD,IAAOC,IAAW,IAAID;AAAA,QAC/E,WAAW,GAAGrB,EAAS,IAAIC,EAAiB;AAAA,MAAA;AAAA,IAAA;AAAA,IAG7CiG,GAAaJ,IAAUhE,IAAoBA,EAAkB,SAAS,IAAI,IAAI,SAAS,IAAI;AAAA,EAAA,GAC9F;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"Mention.js","sources":["../../src/components/Mention.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dTextarea = 'textarea'\nconst dTextareaBordered = 'textarea-bordered'\nconst dMenu = 'menu'\nconst dMenuSm = 'menu-sm'\nconst dLoading = 'loading'\nconst dLoadingSpinner = 'loading-spinner'\nconst dLoadingSm = 'loading-sm'\nconst dAvatar = 'avatar'\n\nexport interface MentionOption {\n value: string\n label?: string\n avatar?: string\n disabled?: boolean\n}\n\nexport interface MentionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect' | 'defaultValue' | 'prefix'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (option: MentionOption, prefix: string) => void\n onSearch?: (text: string, prefix: string) => void\n options?: MentionOption[]\n loading?: boolean\n prefix?: string | string[]\n split?: string\n placeholder?: string\n disabled?: boolean\n readOnly?: boolean\n rows?: number\n autoSize?: boolean | { minRows?: number; maxRows?: number }\n notFoundContent?: React.ReactNode\n filterOption?: boolean | ((input: string, option: MentionOption) => boolean)\n dropdownClassName?: string\n 'data-testid'?: string\n}\n\nexport const Mention: React.FC<MentionProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options = [],\n loading = false,\n prefix = '@',\n split = ' ',\n placeholder,\n disabled,\n readOnly = false,\n rows = 3,\n autoSize = false,\n notFoundContent,\n filterOption = true,\n className = '',\n dropdownClassName = '',\n 'data-testid': testId,\n ...rest\n}) => {\n const { componentDisabled, renderEmpty, getPopupContainer } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n const effectiveNotFoundContent = notFoundContent ?? renderEmpty?.('Mention') ?? 'No matches found'\n\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n\n const [isOpen, setIsOpen] = useState(false)\n const [activePrefix, setActivePrefix] = useState<string | null>(null)\n const [searchText, setSearchText] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [mentionStart, setMentionStart] = useState<number | null>(null)\n const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n\n const prefixes = Array.isArray(prefix) ? prefix : [prefix]\n\n // Filter options based on search text\n const filteredOptions = useCallback(() => {\n if (!filterOption) return options\n\n const filterFn =\n typeof filterOption === 'function'\n ? filterOption\n : (input: string, option: MentionOption) => {\n const label = option.label || option.value\n return label.toLowerCase().includes(input.toLowerCase())\n }\n\n return options.filter((opt) => filterFn(searchText, opt))\n }, [options, searchText, filterOption])\n\n const filtered = filteredOptions()\n\n // Update textarea height for autoSize\n const updateHeight = useCallback(() => {\n const textarea = textareaRef.current\n if (!textarea || !autoSize) return\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n\n if (typeof autoSize === 'object') {\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n const minHeight = autoSize.minRows ? autoSize.minRows * lineHeight : 0\n const maxHeight = autoSize.maxRows ? autoSize.maxRows * lineHeight : Infinity\n\n textarea.style.height = `${Math.min(Math.max(scrollHeight, minHeight), maxHeight)}px`\n } else {\n textarea.style.height = `${scrollHeight}px`\n }\n }, [autoSize])\n\n useEffect(() => {\n updateHeight()\n }, [currentValue, updateHeight])\n\n // Calculate dropdown position\n const updateDropdownPosition = useCallback(() => {\n const textarea = textareaRef.current\n const measure = measureRef.current\n if (!textarea || !measure || mentionStart === null) return\n\n // Get text before cursor to measure position\n const textBeforeCursor = currentValue.substring(0, mentionStart)\n\n // Create a temporary element to measure text position\n measure.textContent = textBeforeCursor\n\n const textareaRect = textarea.getBoundingClientRect()\n const measureRect = measure.getBoundingClientRect()\n\n // Calculate position relative to viewport\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20\n\n setDropdownPosition({\n top: textareaRect.top + window.scrollY + lineHeight + 4,\n left: textareaRect.left + window.scrollX + Math.min(measureRect.width % textareaRect.width, textareaRect.width - 200),\n })\n }, [currentValue, mentionStart])\n\n useEffect(() => {\n if (isOpen) {\n updateDropdownPosition()\n }\n }, [isOpen, updateDropdownPosition, searchText])\n\n // Handle text change\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n const cursorPos = e.target.selectionStart\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n\n // Check if we should open the mention dropdown\n checkForMention(newValue, cursorPos)\n }\n\n const checkForMention = (text: string, cursorPos: number) => {\n // Look backwards from cursor for a prefix\n let foundPrefix: string | null = null\n let foundStart: number | null = null\n\n for (const p of prefixes) {\n // Find the last occurrence of prefix before cursor\n const beforeCursor = text.substring(0, cursorPos)\n const lastPrefixIndex = beforeCursor.lastIndexOf(p)\n\n if (lastPrefixIndex !== -1) {\n // Check if prefix is at start or preceded by whitespace/split\n const charBefore = lastPrefixIndex > 0 ? text[lastPrefixIndex - 1] : split\n if (charBefore === split || charBefore === '\\n' || lastPrefixIndex === 0) {\n // Check if there's no space between prefix and cursor\n const textAfterPrefix = text.substring(lastPrefixIndex + p.length, cursorPos)\n if (!textAfterPrefix.includes(split) && !textAfterPrefix.includes('\\n')) {\n foundPrefix = p\n foundStart = lastPrefixIndex\n break\n }\n }\n }\n }\n\n if (foundPrefix !== null && foundStart !== null) {\n const search = text.substring(foundStart + foundPrefix.length, cursorPos)\n setActivePrefix(foundPrefix)\n setSearchText(search)\n setMentionStart(foundStart)\n setIsOpen(true)\n setActiveIndex(0)\n onSearch?.(search, foundPrefix)\n } else {\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n }\n }\n\n // Handle option selection\n const selectOption = (option: MentionOption) => {\n if (option.disabled || mentionStart === null || activePrefix === null) return\n\n const textarea = textareaRef.current\n if (!textarea) return\n\n const beforeMention = currentValue.substring(0, mentionStart)\n const afterCursor = currentValue.substring(textarea.selectionStart)\n\n const mentionText = `${activePrefix}${option.value}${split}`\n const newValue = beforeMention + mentionText + afterCursor\n\n if (value === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onSelect?.(option, activePrefix)\n\n setIsOpen(false)\n setActivePrefix(null)\n setSearchText('')\n setMentionStart(null)\n\n // Set cursor position after mention\n setTimeout(() => {\n const newCursorPos = beforeMention.length + mentionText.length\n textarea.focus()\n textarea.setSelectionRange(newCursorPos, newCursorPos)\n }, 0)\n }\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isOpen) return\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setActiveIndex((prev) => (prev + 1) % Math.max(filtered.length, 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n setActiveIndex((prev) => (prev - 1 + filtered.length) % Math.max(filtered.length, 1))\n break\n case 'Enter':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n case 'Escape':\n e.preventDefault()\n setIsOpen(false)\n break\n case 'Tab':\n if (filtered[activeIndex]) {\n e.preventDefault()\n selectOption(filtered[activeIndex])\n }\n break\n }\n }\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node) &&\n textareaRef.current &&\n !textareaRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n // Scroll active item into view\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const activeItem = dropdownRef.current.querySelector('[data-active=\"true\"]')\n activeItem?.scrollIntoView({ block: 'nearest' })\n }\n }, [activeIndex, isOpen])\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n const dropdown = isOpen && (\n <div\n ref={dropdownRef}\n className={`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg\n min-w-48 max-h-60 overflow-auto ${dropdownClassName}`}\n style={{\n top: dropdownPosition.top,\n left: dropdownPosition.left,\n }}\n data-testid={getTestId('dropdown')}\n >\n {loading ? (\n <div className=\"p-3 text-center text-base-content/60\" data-testid={getTestId('loading')}>\n <span className={`${dLoading} ${dLoadingSpinner} ${dLoadingSm}`}></span>\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"p-3 text-center text-base-content/60 text-sm\" data-testid={getTestId('empty')}>\n {effectiveNotFoundContent}\n </div>\n ) : (\n <ul className={`${dMenu} ${dMenuSm} p-1`}>\n {filtered.map((option, index) => (\n <li key={option.value}>\n <button\n type=\"button\"\n data-active={index === activeIndex}\n data-testid={getTestId(`option-${option.value || index}`)}\n className={`flex items-center gap-2 ${\n index === activeIndex ? 'active' : ''\n } ${option.disabled ? 'disabled opacity-50 cursor-not-allowed' : ''}`}\n onClick={() => selectOption(option)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {option.avatar && (\n <div className={dAvatar}>\n <div className=\"w-6 h-6 rounded-full\">\n <img src={option.avatar} alt=\"\" />\n </div>\n </div>\n )}\n <span>{option.label || option.value}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n {/* Hidden measure element for cursor position */}\n <div\n ref={measureRef}\n className=\"invisible absolute whitespace-pre-wrap break-words\"\n style={{\n font: textareaRef.current ? getComputedStyle(textareaRef.current).font : undefined,\n width: textareaRef.current?.clientWidth,\n padding: textareaRef.current ? getComputedStyle(textareaRef.current).padding : undefined,\n }}\n aria-hidden=\"true\"\n />\n\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n rows={typeof autoSize === 'object' ? autoSize.minRows || rows : autoSize ? 1 : rows}\n className={`${dTextarea} ${dTextareaBordered} w-full resize-none`}\n data-testid={getTestId('textarea')}\n />\n\n {createPortal(dropdown, getPopupContainer ? getPopupContainer(document.body) : document.body)}\n </div>\n )\n}\n"],"names":["dTextarea","dTextareaBordered","dMenu","dMenuSm","dLoading","dLoadingSpinner","dLoadingSm","dAvatar","Mention","value","defaultValue","onChange","onSelect","onSearch","options","loading","prefix","split","placeholder","disabled","readOnly","rows","autoSize","notFoundContent","filterOption","className","dropdownClassName","testId","rest","componentDisabled","renderEmpty","getPopupContainer","useConfig","effectiveDisabled","effectiveNotFoundContent","internalValue","setInternalValue","useState","currentValue","isOpen","setIsOpen","activePrefix","setActivePrefix","searchText","setSearchText","activeIndex","setActiveIndex","mentionStart","setMentionStart","dropdownPosition","setDropdownPosition","textareaRef","useRef","dropdownRef","measureRef","prefixes","filtered","useCallback","filterFn","input","option","opt","updateHeight","textarea","scrollHeight","lineHeight","minHeight","maxHeight","useEffect","updateDropdownPosition","measure","textBeforeCursor","textareaRect","measureRect","handleChange","newValue","cursorPos","checkForMention","text","foundPrefix","foundStart","p","lastPrefixIndex","charBefore","textAfterPrefix","search","selectOption","beforeMention","afterCursor","mentionText","newCursorPos","handleKeyDown","prev","handleClickOutside","e","getTestId","suffix","dropdown","jsx","index","jsxs","createPortal"],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ export interface MonthCalendarProps<T extends CalendarEvent = CalendarEvent> ext
|
|
|
25
25
|
header?: boolean;
|
|
26
26
|
daySelector?: boolean;
|
|
27
27
|
ellipsis?: boolean;
|
|
28
|
+
'data-testid'?: string;
|
|
28
29
|
}
|
|
29
30
|
export declare const MonthCalendar: <T extends CalendarEvent = CalendarEvent>(props: MonthCalendarProps<T> & {
|
|
30
31
|
ref?: React.ForwardedRef<HTMLDivElement>;
|