asterui 0.12.61 → 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.
Files changed (179) hide show
  1. package/dist/components/Affix.d.ts +2 -0
  2. package/dist/components/Affix.js.map +1 -1
  3. package/dist/components/Alert.d.ts +2 -0
  4. package/dist/components/Alert.js.map +1 -1
  5. package/dist/components/Anchor.d.ts +2 -0
  6. package/dist/components/Anchor.js +79 -75
  7. package/dist/components/Anchor.js.map +1 -1
  8. package/dist/components/Autocomplete.d.ts +1 -0
  9. package/dist/components/Autocomplete.js +115 -110
  10. package/dist/components/Autocomplete.js.map +1 -1
  11. package/dist/components/Avatar.d.ts +4 -0
  12. package/dist/components/Avatar.js.map +1 -1
  13. package/dist/components/Breadcrumb.d.ts +4 -2
  14. package/dist/components/Breadcrumb.js +54 -29
  15. package/dist/components/Breadcrumb.js.map +1 -1
  16. package/dist/components/Browser.d.ts +2 -0
  17. package/dist/components/Browser.js.map +1 -1
  18. package/dist/components/Button.d.ts +5 -1
  19. package/dist/components/Button.js +117 -107
  20. package/dist/components/Button.js.map +1 -1
  21. package/dist/components/Chart.d.ts +1 -0
  22. package/dist/components/Chart.js +31 -30
  23. package/dist/components/Chart.js.map +1 -1
  24. package/dist/components/Chat.d.ts +1 -0
  25. package/dist/components/Chat.js +39 -28
  26. package/dist/components/Chat.js.map +1 -1
  27. package/dist/components/Code.d.ts +2 -0
  28. package/dist/components/Code.js.map +1 -1
  29. package/dist/components/Command.d.ts +5 -2
  30. package/dist/components/Command.js +262 -233
  31. package/dist/components/Command.js.map +1 -1
  32. package/dist/components/Container.d.ts +2 -0
  33. package/dist/components/Container.js.map +1 -1
  34. package/dist/components/ContextMenu.d.ts +4 -0
  35. package/dist/components/ContextMenu.js +157 -122
  36. package/dist/components/ContextMenu.js.map +1 -1
  37. package/dist/components/CopyButton.d.ts +2 -0
  38. package/dist/components/CopyButton.js +9 -8
  39. package/dist/components/CopyButton.js.map +1 -1
  40. package/dist/components/Countdown.d.ts +3 -3
  41. package/dist/components/Countdown.js +49 -47
  42. package/dist/components/Countdown.js.map +1 -1
  43. package/dist/components/Diff.d.ts +3 -3
  44. package/dist/components/Diff.js +14 -10
  45. package/dist/components/Diff.js.map +1 -1
  46. package/dist/components/Divider.d.ts +2 -0
  47. package/dist/components/Divider.js.map +1 -1
  48. package/dist/components/Dock.d.ts +6 -0
  49. package/dist/components/Dock.js +75 -38
  50. package/dist/components/Dock.js.map +1 -1
  51. package/dist/components/Dropdown.js +110 -110
  52. package/dist/components/Dropdown.js.map +1 -1
  53. package/dist/components/Fieldset.d.ts +2 -0
  54. package/dist/components/Fieldset.js.map +1 -1
  55. package/dist/components/FileInput.d.ts +1 -0
  56. package/dist/components/FileInput.js +26 -26
  57. package/dist/components/FileInput.js.map +1 -1
  58. package/dist/components/Filter.d.ts +1 -0
  59. package/dist/components/Filter.js +43 -40
  60. package/dist/components/Filter.js.map +1 -1
  61. package/dist/components/Flex.d.ts +1 -0
  62. package/dist/components/Flex.js +43 -42
  63. package/dist/components/Flex.js.map +1 -1
  64. package/dist/components/FloatButton.d.ts +9 -0
  65. package/dist/components/FloatButton.js +211 -136
  66. package/dist/components/FloatButton.js.map +1 -1
  67. package/dist/components/Footer.d.ts +2 -0
  68. package/dist/components/Footer.js.map +1 -1
  69. package/dist/components/Grid.d.ts +4 -0
  70. package/dist/components/Grid.js.map +1 -1
  71. package/dist/components/Hero.d.ts +2 -0
  72. package/dist/components/Hero.js.map +1 -1
  73. package/dist/components/HoverGallery.d.ts +3 -3
  74. package/dist/components/HoverGallery.js +12 -10
  75. package/dist/components/HoverGallery.js.map +1 -1
  76. package/dist/components/Input.d.ts +1 -0
  77. package/dist/components/Input.js +201 -184
  78. package/dist/components/Input.js.map +1 -1
  79. package/dist/components/Join.d.ts +2 -0
  80. package/dist/components/Join.js.map +1 -1
  81. package/dist/components/Kbd.d.ts +2 -0
  82. package/dist/components/Kbd.js.map +1 -1
  83. package/dist/components/Loading.d.ts +3 -0
  84. package/dist/components/Loading.js +58 -35
  85. package/dist/components/Loading.js.map +1 -1
  86. package/dist/components/Mask.d.ts +2 -2
  87. package/dist/components/Mask.js.map +1 -1
  88. package/dist/components/Masonry.d.ts +1 -0
  89. package/dist/components/Masonry.js +45 -42
  90. package/dist/components/Masonry.js.map +1 -1
  91. package/dist/components/Mention.d.ts +1 -0
  92. package/dist/components/Mention.js +95 -91
  93. package/dist/components/Mention.js.map +1 -1
  94. package/dist/components/MonthCalendar.d.ts +1 -0
  95. package/dist/components/MonthCalendar.js +104 -97
  96. package/dist/components/MonthCalendar.js.map +1 -1
  97. package/dist/components/Navbar.d.ts +2 -0
  98. package/dist/components/Navbar.js.map +1 -1
  99. package/dist/components/Notification.js +32 -18
  100. package/dist/components/Notification.js.map +1 -1
  101. package/dist/components/Phone.d.ts +3 -2
  102. package/dist/components/Phone.js +10 -8
  103. package/dist/components/Phone.js.map +1 -1
  104. package/dist/components/Popconfirm.js +110 -92
  105. package/dist/components/Popconfirm.js.map +1 -1
  106. package/dist/components/Popover.d.ts +2 -0
  107. package/dist/components/Popover.js.map +1 -1
  108. package/dist/components/Progress.d.ts +2 -0
  109. package/dist/components/Progress.js.map +1 -1
  110. package/dist/components/QRCode.d.ts +1 -0
  111. package/dist/components/QRCode.js +84 -55
  112. package/dist/components/QRCode.js.map +1 -1
  113. package/dist/components/RadialProgress.d.ts +1 -0
  114. package/dist/components/RadialProgress.js +19 -17
  115. package/dist/components/RadialProgress.js.map +1 -1
  116. package/dist/components/Radio.d.ts +6 -3
  117. package/dist/components/Radio.js +9 -9
  118. package/dist/components/Radio.js.map +1 -1
  119. package/dist/components/Range.d.ts +1 -0
  120. package/dist/components/Range.js +45 -43
  121. package/dist/components/Range.js.map +1 -1
  122. package/dist/components/Rating.d.ts +4 -2
  123. package/dist/components/Rating.js +83 -79
  124. package/dist/components/Rating.js.map +1 -1
  125. package/dist/components/Responsive.d.ts +4 -2
  126. package/dist/components/Responsive.js +10 -9
  127. package/dist/components/Responsive.js.map +1 -1
  128. package/dist/components/Result.d.ts +1 -0
  129. package/dist/components/Result.js +24 -22
  130. package/dist/components/Result.js.map +1 -1
  131. package/dist/components/Select.d.ts +1 -0
  132. package/dist/components/Select.js +72 -62
  133. package/dist/components/Select.js.map +1 -1
  134. package/dist/components/Skeleton.d.ts +2 -0
  135. package/dist/components/Skeleton.js.map +1 -1
  136. package/dist/components/Space.d.ts +2 -0
  137. package/dist/components/Space.js.map +1 -1
  138. package/dist/components/Splitter.d.ts +2 -0
  139. package/dist/components/Splitter.js +137 -131
  140. package/dist/components/Splitter.js.map +1 -1
  141. package/dist/components/Stat.d.ts +4 -2
  142. package/dist/components/Stat.js +19 -18
  143. package/dist/components/Stat.js.map +1 -1
  144. package/dist/components/Status.d.ts +3 -3
  145. package/dist/components/Status.js +27 -25
  146. package/dist/components/Status.js.map +1 -1
  147. package/dist/components/Steps.d.ts +4 -2
  148. package/dist/components/Steps.js +56 -52
  149. package/dist/components/Steps.js.map +1 -1
  150. package/dist/components/TextRotate.d.ts +1 -0
  151. package/dist/components/TextRotate.js +14 -12
  152. package/dist/components/TextRotate.js.map +1 -1
  153. package/dist/components/Textarea.d.ts +1 -0
  154. package/dist/components/Textarea.js +31 -30
  155. package/dist/components/Textarea.js.map +1 -1
  156. package/dist/components/ThemeController.d.ts +6 -3
  157. package/dist/components/ThemeController.js +101 -92
  158. package/dist/components/ThemeController.js.map +1 -1
  159. package/dist/components/Toggle.d.ts +2 -0
  160. package/dist/components/Toggle.js.map +1 -1
  161. package/dist/components/Tooltip.d.ts +2 -0
  162. package/dist/components/Tooltip.js +38 -32
  163. package/dist/components/Tooltip.js.map +1 -1
  164. package/dist/components/Typography.d.ts +10 -5
  165. package/dist/components/Typography.js +84 -81
  166. package/dist/components/Typography.js.map +1 -1
  167. package/dist/components/VirtualList.d.ts +2 -1
  168. package/dist/components/VirtualList.js +40 -36
  169. package/dist/components/VirtualList.js.map +1 -1
  170. package/dist/components/Watermark.d.ts +1 -0
  171. package/dist/components/Watermark.js +74 -71
  172. package/dist/components/Watermark.js.map +1 -1
  173. package/dist/components/WeekCalendar.d.ts +1 -0
  174. package/dist/components/WeekCalendar.js +91 -76
  175. package/dist/components/WeekCalendar.js.map +1 -1
  176. package/dist/components/Window.d.ts +3 -2
  177. package/dist/components/Window.js +9 -7
  178. package/dist/components/Window.js.map +1 -1
  179. package/package.json +1 -1
@@ -1,153 +1,156 @@
1
- import { jsx as a, jsxs as q } from "react/jsx-runtime";
2
- import { useState as f, useRef as H, useCallback as A, useEffect as C } from "react";
3
- import { createPortal as fe } from "react-dom";
4
- import { useConfig as me } from "../providers/ConfigProvider.js";
5
- const he = "textarea", ge = "textarea-bordered", be = "menu", pe = "menu-sm", ve = "loading", we = "loading-spinner", xe = "loading-sm", ye = "avatar", Ne = ({
6
- value: v,
7
- defaultValue: U = "",
8
- onChange: E,
9
- onSelect: W,
10
- onSearch: X,
11
- options: $ = [],
12
- loading: Y = !1,
13
- prefix: R = "@",
14
- split: w = " ",
15
- placeholder: G,
16
- disabled: J,
17
- readOnly: Q = !1,
18
- rows: L = 3,
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: Z,
21
- filterOption: x = !0,
22
- className: _ = "",
23
- dropdownClassName: z = "",
24
- ...ee
20
+ notFoundContent: z,
21
+ filterOption: y = !0,
22
+ className: ee = "",
23
+ dropdownClassName: te = "",
24
+ "data-testid": M,
25
+ ...ne
25
26
  }) => {
26
- const { componentDisabled: te, renderEmpty: ne, getPopupContainer: S } = me(), re = J ?? te ?? !1, se = Z ?? ne?.("Mention") ?? "No matches found", [ae, T] = f(U), m = v !== void 0 ? v : ae, [d, h] = f(!1), [k, M] = f(null), [N, D] = f(""), [u, y] = f(0), [g, I] = f(null), [V, oe] = f({ top: 0, left: 0 }), o = H(null), b = H(null), B = H(null), le = Array.isArray(R) ? R : [R], c = A(() => {
27
- if (!x) return $;
28
- const e = typeof x == "function" ? x : (t, n) => (n.label || n.value).toLowerCase().includes(t.toLowerCase());
29
- return $.filter((t) => e(N, t));
30
- }, [$, N, x])(), j = A(() => {
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, r = l.minRows ? l.minRows * n : 0, s = l.maxRows ? l.maxRows * n : 1 / 0;
37
- e.style.height = `${Math.min(Math.max(t, r), s)}px`;
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
- C(() => {
42
- j();
43
- }, [m, j]);
44
- const O = A(() => {
45
- const e = o.current, t = B.current;
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 r = e.getBoundingClientRect(), s = t.getBoundingClientRect(), p = parseInt(getComputedStyle(e).lineHeight) || 20;
50
- oe({
51
- top: r.top + window.scrollY + p + 4,
52
- left: r.left + window.scrollX + Math.min(s.width % r.width, r.width - 200)
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
- C(() => {
56
- d && O();
57
- }, [d, O, N]);
58
- const ce = (e) => {
56
+ $(() => {
57
+ d && K();
58
+ }, [d, K, I]);
59
+ const de = (e) => {
59
60
  const t = e.target.value, n = e.target.selectionStart;
60
- v === void 0 && T(t), E?.(t), ie(t, n);
61
- }, ie = (e, t) => {
62
- let n = null, r = null;
63
- for (const s of le) {
64
- const i = e.substring(0, t).lastIndexOf(s);
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 F = i > 0 ? e[i - 1] : w;
67
- if (F === w || F === `
67
+ const q = i > 0 ? e[i - 1] : x;
68
+ if (q === x || q === `
68
69
  ` || i === 0) {
69
- const K = e.substring(i + s.length, t);
70
- if (!K.includes(w) && !K.includes(`
70
+ const U = e.substring(i + r.length, t);
71
+ if (!U.includes(x) && !U.includes(`
71
72
  `)) {
72
- n = s, r = i;
73
+ n = r, s = i;
73
74
  break;
74
75
  }
75
76
  }
76
77
  }
77
78
  }
78
- if (n !== null && r !== null) {
79
- const s = e.substring(r + n.length, t);
80
- M(n), D(s), I(r), h(!0), y(0), X?.(s, n);
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), M(null), D(""), I(null);
83
- }, P = (e) => {
84
- if (e.disabled || g === null || k === null) return;
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), r = m.substring(t.selectionStart), s = `${k}${e.value}${w}`, p = n + s + r;
88
- v === void 0 && T(p), E?.(p), W?.(e, k), h(!1), M(null), D(""), I(null), setTimeout(() => {
89
- const i = n.length + s.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
- }, de = (e) => {
93
+ }, fe = (e) => {
93
94
  if (d)
94
95
  switch (e.key) {
95
96
  case "ArrowDown":
96
- e.preventDefault(), y((t) => (t + 1) % Math.max(c.length, 1));
97
+ e.preventDefault(), C((t) => (t + 1) % Math.max(c.length, 1));
97
98
  break;
98
99
  case "ArrowUp":
99
- e.preventDefault(), y((t) => (t - 1 + c.length) % Math.max(c.length, 1));
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(), P(c[u]));
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(), P(c[u]));
109
+ c[u] && (e.preventDefault(), A(c[u]));
109
110
  break;
110
111
  }
111
112
  };
112
- C(() => {
113
+ $(() => {
113
114
  const e = (t) => {
114
- b.current && !b.current.contains(t.target) && o.current && !o.current.contains(t.target) && h(!1);
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
- }, []), C(() => {
118
- d && b.current && b.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
118
+ }, []), $(() => {
119
+ d && p.current && p.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
119
120
  }, [u, d]);
120
- const ue = d && /* @__PURE__ */ a(
121
+ const b = (e) => M ? `${M}-${e}` : void 0, me = d && /* @__PURE__ */ a(
121
122
  "div",
122
123
  {
123
- ref: b,
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 ${z}`,
126
+ min-w-48 max-h-60 overflow-auto ${te}`,
126
127
  style: {
127
- top: V.top,
128
- left: V.left
128
+ top: j.top,
129
+ left: j.left
129
130
  },
130
- children: Y ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60", children: /* @__PURE__ */ a("span", { className: `${ve} ${we} ${xe}` }) }) : c.length === 0 ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60 text-sm", children: se }) : /* @__PURE__ */ a("ul", { className: `${be} ${pe} p-1`, children: c.map((e, t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ q(
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: () => P(e),
137
- onMouseEnter: () => y(t),
139
+ onClick: () => A(e),
140
+ onMouseEnter: () => C(t),
138
141
  children: [
139
- e.avatar && /* @__PURE__ */ a("div", { className: ye, children: /* @__PURE__ */ a("div", { className: "w-6 h-6 rounded-full", children: /* @__PURE__ */ a("img", { src: e.avatar, alt: "" }) }) }),
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__ */ q("div", { className: `relative ${_}`, "data-state": d ? "open" : "closed", ...ee, children: [
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: B,
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: ce,
166
- onKeyDown: de,
167
- placeholder: G,
168
- disabled: re,
169
- readOnly: Q,
170
- rows: typeof l == "object" ? l.minRows || L : l ? 1 : L,
171
- className: `${he} ${ge} w-full resize-none`
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
- fe(ue, S ? S(document.body) : document.body)
178
+ he(me, V ? V(document.body) : document.body)
175
179
  ] });
176
180
  };
177
181
  export {
178
- Ne as Mention
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":"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"}
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>;