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.
Files changed (106) hide show
  1. package/dist/components/Anchor.d.ts +2 -0
  2. package/dist/components/Anchor.js +79 -75
  3. package/dist/components/Anchor.js.map +1 -1
  4. package/dist/components/Autocomplete.d.ts +1 -0
  5. package/dist/components/Autocomplete.js +115 -110
  6. package/dist/components/Autocomplete.js.map +1 -1
  7. package/dist/components/Breadcrumb.d.ts +4 -2
  8. package/dist/components/Breadcrumb.js +54 -29
  9. package/dist/components/Breadcrumb.js.map +1 -1
  10. package/dist/components/Button.d.ts +5 -1
  11. package/dist/components/Button.js +117 -107
  12. package/dist/components/Button.js.map +1 -1
  13. package/dist/components/Chart.d.ts +1 -0
  14. package/dist/components/Chart.js +31 -30
  15. package/dist/components/Chart.js.map +1 -1
  16. package/dist/components/Chat.d.ts +1 -0
  17. package/dist/components/Chat.js +32 -30
  18. package/dist/components/Chat.js.map +1 -1
  19. package/dist/components/Command.d.ts +5 -2
  20. package/dist/components/Command.js +262 -233
  21. package/dist/components/Command.js.map +1 -1
  22. package/dist/components/ContextMenu.d.ts +4 -0
  23. package/dist/components/ContextMenu.js +149 -130
  24. package/dist/components/ContextMenu.js.map +1 -1
  25. package/dist/components/Dock.d.ts +2 -0
  26. package/dist/components/Dock.js +70 -46
  27. package/dist/components/Dock.js.map +1 -1
  28. package/dist/components/FileInput.d.ts +1 -0
  29. package/dist/components/FileInput.js +26 -26
  30. package/dist/components/FileInput.js.map +1 -1
  31. package/dist/components/Filter.d.ts +1 -0
  32. package/dist/components/Filter.js +43 -40
  33. package/dist/components/Filter.js.map +1 -1
  34. package/dist/components/Flex.d.ts +1 -0
  35. package/dist/components/Flex.js +43 -42
  36. package/dist/components/Flex.js.map +1 -1
  37. package/dist/components/FloatButton.d.ts +3 -0
  38. package/dist/components/FloatButton.js +178 -127
  39. package/dist/components/FloatButton.js.map +1 -1
  40. package/dist/components/Input.d.ts +1 -0
  41. package/dist/components/Input.js +201 -184
  42. package/dist/components/Input.js.map +1 -1
  43. package/dist/components/Loading.d.ts +1 -0
  44. package/dist/components/Loading.js +40 -37
  45. package/dist/components/Loading.js.map +1 -1
  46. package/dist/components/Masonry.d.ts +1 -0
  47. package/dist/components/Masonry.js +45 -42
  48. package/dist/components/Masonry.js.map +1 -1
  49. package/dist/components/Mention.d.ts +1 -0
  50. package/dist/components/Mention.js +95 -91
  51. package/dist/components/Mention.js.map +1 -1
  52. package/dist/components/MonthCalendar.d.ts +1 -0
  53. package/dist/components/MonthCalendar.js +104 -97
  54. package/dist/components/MonthCalendar.js.map +1 -1
  55. package/dist/components/QRCode.d.ts +1 -0
  56. package/dist/components/QRCode.js +84 -55
  57. package/dist/components/QRCode.js.map +1 -1
  58. package/dist/components/RadialProgress.d.ts +1 -0
  59. package/dist/components/RadialProgress.js +19 -17
  60. package/dist/components/RadialProgress.js.map +1 -1
  61. package/dist/components/Range.d.ts +1 -0
  62. package/dist/components/Range.js +45 -43
  63. package/dist/components/Range.js.map +1 -1
  64. package/dist/components/Rating.d.ts +4 -2
  65. package/dist/components/Rating.js +83 -79
  66. package/dist/components/Rating.js.map +1 -1
  67. package/dist/components/Responsive.d.ts +4 -2
  68. package/dist/components/Responsive.js +10 -9
  69. package/dist/components/Responsive.js.map +1 -1
  70. package/dist/components/Result.d.ts +1 -0
  71. package/dist/components/Result.js +24 -22
  72. package/dist/components/Result.js.map +1 -1
  73. package/dist/components/Select.d.ts +1 -0
  74. package/dist/components/Select.js +72 -62
  75. package/dist/components/Select.js.map +1 -1
  76. package/dist/components/Splitter.d.ts +2 -0
  77. package/dist/components/Splitter.js +137 -131
  78. package/dist/components/Splitter.js.map +1 -1
  79. package/dist/components/Stat.d.ts +4 -2
  80. package/dist/components/Stat.js +19 -18
  81. package/dist/components/Stat.js.map +1 -1
  82. package/dist/components/Steps.d.ts +4 -2
  83. package/dist/components/Steps.js +56 -52
  84. package/dist/components/Steps.js.map +1 -1
  85. package/dist/components/TextRotate.d.ts +1 -0
  86. package/dist/components/TextRotate.js +14 -12
  87. package/dist/components/TextRotate.js.map +1 -1
  88. package/dist/components/Textarea.d.ts +1 -0
  89. package/dist/components/Textarea.js +31 -30
  90. package/dist/components/Textarea.js.map +1 -1
  91. package/dist/components/ThemeController.d.ts +6 -3
  92. package/dist/components/ThemeController.js +101 -92
  93. package/dist/components/ThemeController.js.map +1 -1
  94. package/dist/components/Typography.d.ts +10 -5
  95. package/dist/components/Typography.js +84 -81
  96. package/dist/components/Typography.js.map +1 -1
  97. package/dist/components/VirtualList.d.ts +2 -1
  98. package/dist/components/VirtualList.js +40 -36
  99. package/dist/components/VirtualList.js.map +1 -1
  100. package/dist/components/Watermark.d.ts +1 -0
  101. package/dist/components/Watermark.js +74 -71
  102. package/dist/components/Watermark.js.map +1 -1
  103. package/dist/components/WeekCalendar.d.ts +1 -0
  104. package/dist/components/WeekCalendar.js +91 -76
  105. package/dist/components/WeekCalendar.js.map +1 -1
  106. 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>;