asterui 0.12.13 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/components/Autocomplete.d.ts +22 -2
  2. package/dist/components/Button.d.ts +14 -5
  3. package/dist/components/Drawer.d.ts +47 -6
  4. package/dist/components/Dropdown.d.ts +65 -9
  5. package/dist/components/Form.d.ts +11 -1
  6. package/dist/components/Input.d.ts +15 -1
  7. package/dist/components/Modal.d.ts +5 -1
  8. package/dist/components/Navbar.d.ts +15 -1
  9. package/dist/components/Rating.d.ts +12 -4
  10. package/dist/components/SidebarDrawer.d.ts +21 -0
  11. package/dist/components/Tabs.d.ts +30 -4
  12. package/dist/index.d.ts +6 -4
  13. package/dist/index.js +169 -167
  14. package/dist/index.js.map +1 -1
  15. package/dist/index100.js +44 -11
  16. package/dist/index100.js.map +1 -1
  17. package/dist/index101.js +10 -12
  18. package/dist/index101.js.map +1 -1
  19. package/dist/index102.js +14 -7
  20. package/dist/index102.js.map +1 -1
  21. package/dist/index103.js +7 -12
  22. package/dist/index103.js.map +1 -1
  23. package/dist/index104.js +11 -29
  24. package/dist/index104.js.map +1 -1
  25. package/dist/index105.js +29 -16
  26. package/dist/index105.js.map +1 -1
  27. package/dist/index106.js +21 -0
  28. package/dist/index106.js.map +1 -0
  29. package/dist/index21.js +1 -1
  30. package/dist/index26.js +171 -40
  31. package/dist/index26.js.map +1 -1
  32. package/dist/index27.js +41 -17
  33. package/dist/index27.js.map +1 -1
  34. package/dist/index28.js +17 -33
  35. package/dist/index28.js.map +1 -1
  36. package/dist/index29.js +33 -52
  37. package/dist/index29.js.map +1 -1
  38. package/dist/index30.js +50 -61
  39. package/dist/index30.js.map +1 -1
  40. package/dist/index31.js +60 -181
  41. package/dist/index31.js.map +1 -1
  42. package/dist/index32.js +184 -18
  43. package/dist/index32.js.map +1 -1
  44. package/dist/index33.js +15 -217
  45. package/dist/index33.js.map +1 -1
  46. package/dist/index34.js +230 -1083
  47. package/dist/index34.js.map +1 -1
  48. package/dist/index35.js +1086 -16
  49. package/dist/index35.js.map +1 -1
  50. package/dist/index36.js +16 -121
  51. package/dist/index36.js.map +1 -1
  52. package/dist/index37.js +119 -37
  53. package/dist/index37.js.map +1 -1
  54. package/dist/index38.js +34 -208
  55. package/dist/index38.js.map +1 -1
  56. package/dist/index39.js +390 -89
  57. package/dist/index39.js.map +1 -1
  58. package/dist/index40.js +93 -158
  59. package/dist/index40.js.map +1 -1
  60. package/dist/index41.js +211 -135
  61. package/dist/index41.js.map +1 -1
  62. package/dist/index42.js +155 -15
  63. package/dist/index42.js.map +1 -1
  64. package/dist/index43.js +15 -17
  65. package/dist/index43.js.map +1 -1
  66. package/dist/index44.js +17 -21
  67. package/dist/index44.js.map +1 -1
  68. package/dist/index45.js +18 -134
  69. package/dist/index45.js.map +1 -1
  70. package/dist/index46.js +134 -10
  71. package/dist/index46.js.map +1 -1
  72. package/dist/index47.js +13 -35
  73. package/dist/index47.js.map +1 -1
  74. package/dist/index48.js +35 -34
  75. package/dist/index48.js.map +1 -1
  76. package/dist/index49.js +34 -81
  77. package/dist/index49.js.map +1 -1
  78. package/dist/index5.js +161 -80
  79. package/dist/index5.js.map +1 -1
  80. package/dist/index50.js +71 -166
  81. package/dist/index50.js.map +1 -1
  82. package/dist/index51.js +167 -144
  83. package/dist/index51.js.map +1 -1
  84. package/dist/index52.js +152 -11
  85. package/dist/index52.js.map +1 -1
  86. package/dist/index53.js +10 -20
  87. package/dist/index53.js.map +1 -1
  88. package/dist/index54.js +22 -14
  89. package/dist/index54.js.map +1 -1
  90. package/dist/index55.js +14 -7
  91. package/dist/index55.js.map +1 -1
  92. package/dist/index56.js +6 -310
  93. package/dist/index56.js.map +1 -1
  94. package/dist/index57.js +334 -17
  95. package/dist/index57.js.map +1 -1
  96. package/dist/index58.js +47 -122
  97. package/dist/index58.js.map +1 -1
  98. package/dist/index59.js +120 -108
  99. package/dist/index59.js.map +1 -1
  100. package/dist/index60.js +107 -167
  101. package/dist/index60.js.map +1 -1
  102. package/dist/index61.js +167 -29
  103. package/dist/index61.js.map +1 -1
  104. package/dist/index62.js +30 -120
  105. package/dist/index62.js.map +1 -1
  106. package/dist/index63.js +116 -80
  107. package/dist/index63.js.map +1 -1
  108. package/dist/index64.js +85 -19
  109. package/dist/index64.js.map +1 -1
  110. package/dist/index65.js +19 -73
  111. package/dist/index65.js.map +1 -1
  112. package/dist/index66.js +71 -54
  113. package/dist/index66.js.map +1 -1
  114. package/dist/index67.js +56 -44
  115. package/dist/index67.js.map +1 -1
  116. package/dist/index68.js +42 -49
  117. package/dist/index68.js.map +1 -1
  118. package/dist/index69.js +52 -62
  119. package/dist/index69.js.map +1 -1
  120. package/dist/index70.js +118 -102
  121. package/dist/index70.js.map +1 -1
  122. package/dist/index71.js +107 -41
  123. package/dist/index71.js.map +1 -1
  124. package/dist/index72.js +41 -68
  125. package/dist/index72.js.map +1 -1
  126. package/dist/index73.js +66 -19
  127. package/dist/index73.js.map +1 -1
  128. package/dist/index74.js +18 -55
  129. package/dist/index74.js.map +1 -1
  130. package/dist/index75.js +55 -251
  131. package/dist/index75.js.map +1 -1
  132. package/dist/index76.js +254 -22
  133. package/dist/index76.js.map +1 -1
  134. package/dist/index77.js +22 -31
  135. package/dist/index77.js.map +1 -1
  136. package/dist/index78.js +30 -93
  137. package/dist/index78.js.map +1 -1
  138. package/dist/index79.js +89 -324
  139. package/dist/index79.js.map +1 -1
  140. package/dist/index80.js +323 -50
  141. package/dist/index80.js.map +1 -1
  142. package/dist/index81.js +79 -39
  143. package/dist/index81.js.map +1 -1
  144. package/dist/index82.js +40 -23
  145. package/dist/index82.js.map +1 -1
  146. package/dist/index83.js +21 -93
  147. package/dist/index83.js.map +1 -1
  148. package/dist/index84.js +87 -148
  149. package/dist/index84.js.map +1 -1
  150. package/dist/index85.js +147 -152
  151. package/dist/index85.js.map +1 -1
  152. package/dist/index86.js +159 -63
  153. package/dist/index86.js.map +1 -1
  154. package/dist/index87.js +65 -35
  155. package/dist/index87.js.map +1 -1
  156. package/dist/index88.js +35 -234
  157. package/dist/index88.js.map +1 -1
  158. package/dist/index89.js +231 -31
  159. package/dist/index89.js.map +1 -1
  160. package/dist/index9.js +73 -46
  161. package/dist/index9.js.map +1 -1
  162. package/dist/index90.js +34 -210
  163. package/dist/index90.js.map +1 -1
  164. package/dist/index91.js +195 -198
  165. package/dist/index91.js.map +1 -1
  166. package/dist/index92.js +159 -241
  167. package/dist/index92.js.map +1 -1
  168. package/dist/index93.js +283 -166
  169. package/dist/index93.js.map +1 -1
  170. package/dist/index94.js +173 -253
  171. package/dist/index94.js.map +1 -1
  172. package/dist/index95.js +258 -14
  173. package/dist/index95.js.map +1 -1
  174. package/dist/index96.js +12 -31
  175. package/dist/index96.js.map +1 -1
  176. package/dist/index97.js +32 -5
  177. package/dist/index97.js.map +1 -1
  178. package/dist/index98.js +5 -13
  179. package/dist/index98.js.map +1 -1
  180. package/dist/index99.js +11 -43
  181. package/dist/index99.js.map +1 -1
  182. package/package.json +1 -1
package/dist/index5.js CHANGED
@@ -1,104 +1,185 @@
1
- import { jsxs as z, jsx as c } from "react/jsx-runtime";
2
- import { useState as g, useRef as v, useEffect as y } from "react";
3
- const L = ({
4
- value: a,
5
- defaultValue: k = "",
6
- onChange: m,
7
- options: D,
8
- placeholder: I = "Type to search...",
9
- disabled: b = !1,
10
- size: E = "md",
11
- className: N = "",
12
- allowCustomValue: w = !0,
13
- filterOption: x,
14
- notFoundContent: A = "No results found",
15
- ...C
1
+ import { jsxs as M, jsx as r } from "react/jsx-runtime";
2
+ import { useId as le, useState as C, useRef as z, useEffect as A } from "react";
3
+ const oe = ({ onClick: o, className: g }) => /* @__PURE__ */ r(
4
+ "button",
5
+ {
6
+ type: "button",
7
+ onClick: o,
8
+ className: `flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${g || ""}`,
9
+ "aria-label": "Clear input",
10
+ tabIndex: -1,
11
+ children: /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
12
+ }
13
+ ), pe = ({
14
+ value: o,
15
+ defaultValue: g = "",
16
+ onChange: w,
17
+ onSelect: R,
18
+ onSearch: T,
19
+ options: V,
20
+ placeholder: K = "Type to search...",
21
+ disabled: p = !1,
22
+ size: S = "md",
23
+ color: N,
24
+ status: x,
25
+ className: U = "",
26
+ allowCustomValue: D = !0,
27
+ filterOption: j,
28
+ notFoundContent: F = "No results found",
29
+ allowClear: f,
30
+ onClear: H,
31
+ open: $,
32
+ defaultOpen: P = !1,
33
+ onOpenChange: W,
34
+ defaultActiveFirstOption: v = !0,
35
+ ...q
16
36
  }) => {
17
- const u = D.map(
37
+ const y = le(), G = `${y}-input`, E = `${y}-listbox`, I = V.map(
18
38
  (e) => typeof e == "string" ? { value: e, label: e } : e
19
- ), [i, d] = g(k), [f, l] = g(!1), [r, n] = g(-1), p = v(null), o = v(null);
20
- y(() => {
21
- if (a !== void 0) {
22
- const e = u.find((t) => t.value === a);
23
- d(e?.label || a);
39
+ ), [b, h] = C(g), [J, Q] = C(P), [n, a] = C(-1), m = z(null), c = z(null), B = $ !== void 0, u = B ? $ : J, i = (e) => {
40
+ B || Q(e), W?.(e);
41
+ };
42
+ A(() => {
43
+ if (o !== void 0) {
44
+ const e = I.find((t) => t.value === o);
45
+ h(e?.label || o);
24
46
  }
25
- }, [a, u]);
26
- const O = (e, t) => e.label.toLowerCase().includes(t.toLowerCase()), s = u.filter(
27
- (e) => x ? x(e, i) : O(e, i)
28
- ), F = (e) => {
47
+ }, [o, I]);
48
+ const X = (e, t) => e.label.toLowerCase().includes(t.toLowerCase()), l = I.filter(
49
+ (e) => j ? j(e, b) : X(e, b)
50
+ ), d = l.filter((e) => !e.disabled), Y = (e) => {
29
51
  const t = e.target.value;
30
- d(t), l(!0), n(0), w && m?.(t);
31
- }, h = (e) => {
32
- d(e.label), l(!1), n(-1), m?.(e.value), p.current?.focus();
33
- }, R = (e) => {
34
- if (!f && (e.key === "ArrowDown" || e.key === "ArrowUp")) {
35
- l(!0), n(0);
52
+ h(t), i(!0), v && d.length > 0 ? a(0) : a(-1), T?.(t), D && w?.(t);
53
+ }, k = (e) => {
54
+ e.disabled || (h(e.label), i(!1), a(-1), w?.(e.value), R?.(e.value, e), m.current?.focus());
55
+ }, Z = (e) => {
56
+ if (!u && (e.key === "ArrowDown" || e.key === "ArrowUp")) {
57
+ i(!0), v && d.length > 0 && a(0);
36
58
  return;
37
59
  }
38
60
  switch (e.key) {
39
61
  case "ArrowDown":
40
- e.preventDefault(), n((t) => t < s.length - 1 ? t + 1 : t);
62
+ e.preventDefault(), a((t) => {
63
+ for (let s = t + 1; s < l.length; s++)
64
+ if (!l[s].disabled) return s;
65
+ return t;
66
+ });
41
67
  break;
42
68
  case "ArrowUp":
43
- e.preventDefault(), n((t) => t > 0 ? t - 1 : 0);
69
+ e.preventDefault(), a((t) => {
70
+ for (let s = t - 1; s >= 0; s--)
71
+ if (!l[s].disabled) return s;
72
+ return t;
73
+ });
44
74
  break;
45
75
  case "Enter":
46
- e.preventDefault(), r >= 0 && s[r] ? h(s[r]) : !w && s.length > 0 && h(s[0]);
76
+ e.preventDefault(), n >= 0 && l[n] && !l[n].disabled ? k(l[n]) : !D && d.length > 0 && k(d[0]);
47
77
  break;
48
78
  case "Escape":
49
- l(!1), n(-1), p.current?.blur();
79
+ i(!1), a(-1), m.current?.blur();
50
80
  break;
51
81
  }
52
- }, T = () => {
53
- l(!0), s.length > 0 && n(0);
54
- }, V = (e) => {
55
- o.current && o.current.contains(e.relatedTarget) || setTimeout(() => l(!1), 200);
56
- }, $ = {
82
+ }, _ = () => {
83
+ i(!0), v && d.length > 0 && a(0);
84
+ }, ee = (e) => {
85
+ c.current && c.current.contains(e.relatedTarget) || setTimeout(() => i(!1), 200);
86
+ }, te = (e) => {
87
+ e.stopPropagation(), h(""), w?.(""), H?.(), m.current?.focus();
88
+ }, ne = {
57
89
  xs: "input-xs",
58
90
  sm: "input-sm",
59
91
  md: "input-md",
60
- lg: "input-lg"
61
- }[E];
62
- return y(() => {
63
- r >= 0 && o.current && o.current.children[r]?.scrollIntoView({ block: "nearest" });
64
- }, [r]), /* @__PURE__ */ z("div", { className: `relative ${N}`, "data-state": f ? "open" : "closed", ...C, children: [
65
- /* @__PURE__ */ c(
66
- "input",
67
- {
68
- ref: p,
69
- type: "text",
70
- value: i,
71
- onChange: F,
72
- onKeyDown: R,
73
- onFocus: T,
74
- onBlur: V,
75
- placeholder: I,
76
- disabled: b,
77
- className: `input input-bordered w-full ${$}`
78
- }
79
- ),
80
- f && !b && /* @__PURE__ */ c(
81
- "div",
82
- {
83
- ref: o,
84
- className: "absolute z-50 w-full mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg max-h-60 overflow-auto",
85
- children: s.length > 0 ? s.map((e, t) => /* @__PURE__ */ c(
86
- "div",
92
+ lg: "input-lg",
93
+ xl: "input-xl"
94
+ }, se = x ? {
95
+ error: "input-error",
96
+ warning: "input-warning"
97
+ }[x] : N ? {
98
+ neutral: "input-neutral",
99
+ primary: "input-primary",
100
+ secondary: "input-secondary",
101
+ accent: "input-accent",
102
+ info: "input-info",
103
+ success: "input-success",
104
+ warning: "input-warning",
105
+ error: "input-error"
106
+ }[N] : "";
107
+ A(() => {
108
+ n >= 0 && c.current && c.current.children[n]?.scrollIntoView({ block: "nearest" });
109
+ }, [n]);
110
+ const L = f && b && !p, re = typeof f == "object" && f.clearIcon ? f.clearIcon : null, O = (e) => `${y}-option-${e}`, ae = [
111
+ "input input-bordered w-full",
112
+ ne[S],
113
+ se,
114
+ L && "pr-10"
115
+ ].filter(Boolean).join(" ");
116
+ return /* @__PURE__ */ M(
117
+ "div",
118
+ {
119
+ className: `dropdown dropdown-bottom w-full ${u && !p ? "dropdown-open" : ""} ${U}`,
120
+ "data-state": u ? "open" : "closed",
121
+ ...q,
122
+ children: [
123
+ /* @__PURE__ */ M("div", { className: "relative w-full", children: [
124
+ /* @__PURE__ */ r(
125
+ "input",
126
+ {
127
+ ref: m,
128
+ id: G,
129
+ type: "text",
130
+ role: "combobox",
131
+ "aria-expanded": u,
132
+ "aria-haspopup": "listbox",
133
+ "aria-controls": E,
134
+ "aria-autocomplete": "list",
135
+ "aria-activedescendant": n >= 0 ? O(n) : void 0,
136
+ "aria-invalid": x === "error" ? !0 : void 0,
137
+ value: b,
138
+ onChange: Y,
139
+ onKeyDown: Z,
140
+ onFocus: _,
141
+ onBlur: ee,
142
+ placeholder: K,
143
+ disabled: p,
144
+ className: ae
145
+ }
146
+ ),
147
+ L && /* @__PURE__ */ r("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 z-10", children: re || /* @__PURE__ */ r(oe, { onClick: te }) })
148
+ ] }),
149
+ u && !p && /* @__PURE__ */ r(
150
+ "ul",
87
151
  {
88
- onMouseDown: (j) => {
89
- j.preventDefault(), h(e);
90
- },
91
- onMouseEnter: () => n(t),
92
- className: `px-4 py-2 cursor-pointer transition-colors ${t === r ? "bg-primary text-primary-content" : "hover:bg-base-200"}`,
93
- children: e.label
94
- },
95
- e.value
96
- )) : /* @__PURE__ */ c("div", { className: "px-4 py-2 text-base-content/60 text-center", children: A })
97
- }
98
- )
99
- ] });
152
+ ref: c,
153
+ id: E,
154
+ role: "listbox",
155
+ "aria-label": "Suggestions",
156
+ tabIndex: -1,
157
+ className: "dropdown-content menu bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap",
158
+ children: l.length > 0 ? l.map((e, t) => /* @__PURE__ */ r("li", { children: /* @__PURE__ */ r(
159
+ "a",
160
+ {
161
+ id: O(t),
162
+ role: "option",
163
+ "aria-selected": n === t,
164
+ "aria-disabled": e.disabled,
165
+ onMouseDown: (s) => {
166
+ s.preventDefault(), k(e);
167
+ },
168
+ onMouseEnter: () => !e.disabled && a(t),
169
+ className: [
170
+ t === n && !e.disabled && "active",
171
+ e.disabled && "disabled text-base-content/40 cursor-not-allowed"
172
+ ].filter(Boolean).join(" "),
173
+ children: e.label
174
+ }
175
+ ) }, e.value)) : /* @__PURE__ */ r("li", { className: "disabled", children: /* @__PURE__ */ r("span", { className: "text-base-content/60 text-center cursor-default", children: F }) })
176
+ }
177
+ )
178
+ ]
179
+ }
180
+ );
100
181
  };
101
182
  export {
102
- L as Autocomplete
183
+ pe as Autocomplete
103
184
  };
104
185
  //# sourceMappingURL=index5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index5.js","sources":["../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n}\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size = 'md',\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n ...rest\n}) => {\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n setHighlightedIndex(0)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n setHighlightedIndex(0)\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => (prev < filteredOptions.length - 1 ? prev + 1 : prev))\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : 0))\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && filteredOptions.length > 0) {\n handleOptionClick(filteredOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (filteredOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const sizeClass = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n }[size]\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n return (\n <div className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={`input input-bordered w-full ${sizeClass}`}\n />\n\n {isOpen && !disabled && (\n <div\n ref={dropdownRef}\n className=\"absolute z-50 w-full mt-1 bg-base-100 border border-base-300 rounded-lg shadow-lg max-h-60 overflow-auto\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={option.value}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={`px-4 py-2 cursor-pointer transition-colors ${\n index === highlightedIndex\n ? 'bg-primary text-primary-content'\n : 'hover:bg-base-200'\n }`}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className=\"px-4 py-2 text-base-content/60 text-center\">{notFoundContent}</div>\n )}\n </div>\n )}\n </div>\n )\n}\n"],"names":["Autocomplete","value","defaultValue","onChange","rawOptions","placeholder","disabled","size","className","allowCustomValue","filterOption","notFoundContent","rest","options","opt","inputValue","setInputValue","useState","isOpen","setIsOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","handleFocus","handleBlur","sizeClass","jsxs","jsx","index","e"],"mappings":"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"}
1
+ {"version":3,"file":"index5.js","sources":["../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\n\nexport interface AutocompleteOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onSelect'> {\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n onSelect?: (value: string, option: AutocompleteOption) => void\n onSearch?: (value: string) => void\n options: AutocompleteOption[] | string[]\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'\n /** Validation status */\n status?: 'error' | 'warning'\n allowCustomValue?: boolean\n filterOption?: (option: AutocompleteOption, inputValue: string) => boolean\n notFoundContent?: React.ReactNode\n /** Show clear button when input has value */\n allowClear?: boolean | { clearIcon?: React.ReactNode }\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Controlled open state */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Activate first option by default */\n defaultActiveFirstOption?: boolean\n}\n\n// Clear icon component\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void; className?: string }> = ({ onClick, className }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${className || ''}`}\n aria-label=\"Clear input\"\n tabIndex={-1}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n)\n\nexport const Autocomplete: React.FC<AutocompleteProps> = ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n onSearch,\n options: rawOptions,\n placeholder = 'Type to search...',\n disabled = false,\n size = 'md',\n color,\n status,\n className = '',\n allowCustomValue = true,\n filterOption,\n notFoundContent = 'No results found',\n allowClear,\n onClear,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n defaultActiveFirstOption = true,\n ...rest\n}) => {\n // Generate unique IDs for ARIA\n const baseId = useId()\n const inputId = `${baseId}-input`\n const listboxId = `${baseId}-listbox`\n\n // Normalize options to AutocompleteOption[]\n const options: AutocompleteOption[] = rawOptions.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const [inputValue, setInputValue] = useState(defaultValue)\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLUListElement>(null)\n\n // Determine if open state is controlled\n const isOpenControlled = controlledOpen !== undefined\n const isOpen = isOpenControlled ? controlledOpen : internalOpen\n\n const setIsOpen = (newOpen: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n // Update input value when controlled value changes\n useEffect(() => {\n if (value !== undefined) {\n const selectedOption = options.find((opt) => opt.value === value)\n setInputValue(selectedOption?.label || value)\n }\n }, [value, options])\n\n // Filter options based on input\n const defaultFilter = (option: AutocompleteOption, input: string) =>\n option.label.toLowerCase().includes(input.toLowerCase())\n\n const filteredOptions = options.filter((option) =>\n filterOption ? filterOption(option, inputValue) : defaultFilter(option, inputValue)\n )\n\n // Get only enabled options for keyboard navigation\n const enabledOptions = filteredOptions.filter(opt => !opt.disabled)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newInputValue = e.target.value\n setInputValue(newInputValue)\n setIsOpen(true)\n\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n } else {\n setHighlightedIndex(-1)\n }\n\n onSearch?.(newInputValue)\n\n if (allowCustomValue) {\n onChange?.(newInputValue)\n }\n }\n\n const handleOptionClick = (option: AutocompleteOption) => {\n if (option.disabled) return\n\n setInputValue(option.label)\n setIsOpen(false)\n setHighlightedIndex(-1)\n\n onChange?.(option.value)\n onSelect?.(option.value, option)\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find next enabled option\n for (let i = prev + 1; i < filteredOptions.length; i++) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) => {\n // Find previous enabled option\n for (let i = prev - 1; i >= 0; i--) {\n if (!filteredOptions[i].disabled) return i\n }\n return prev\n })\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex] && !filteredOptions[highlightedIndex].disabled) {\n handleOptionClick(filteredOptions[highlightedIndex])\n } else if (!allowCustomValue && enabledOptions.length > 0) {\n handleOptionClick(enabledOptions[0])\n }\n break\n case 'Escape':\n setIsOpen(false)\n setHighlightedIndex(-1)\n inputRef.current?.blur()\n break\n }\n }\n\n const handleFocus = () => {\n setIsOpen(true)\n if (defaultActiveFirstOption && enabledOptions.length > 0) {\n setHighlightedIndex(0)\n }\n }\n\n const handleBlur = (e: React.FocusEvent) => {\n // Don't close if clicking inside dropdown\n if (dropdownRef.current && dropdownRef.current.contains(e.relatedTarget as Node)) {\n return\n }\n setTimeout(() => setIsOpen(false), 200)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInputValue('')\n onChange?.('')\n onClear?.()\n inputRef.current?.focus()\n }\n\n const sizeClasses = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n xl: 'input-xl',\n }\n\n const colorClasses = {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n }\n\n const statusClasses = {\n error: 'input-error',\n warning: 'input-warning',\n }\n\n // Status takes precedence over color for validation feedback\n const effectiveColorClass = status ? statusClasses[status] : (color ? colorClasses[color] : '')\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (highlightedIndex >= 0 && dropdownRef.current) {\n const highlightedElement = dropdownRef.current.children[highlightedIndex] as HTMLElement\n highlightedElement?.scrollIntoView({ block: 'nearest' })\n }\n }, [highlightedIndex])\n\n // Determine if we should show clear button\n const showClear = allowClear && inputValue && !disabled\n\n // Get custom clear icon if provided\n const clearIcon = typeof allowClear === 'object' && allowClear.clearIcon\n ? allowClear.clearIcon\n : null\n\n // Get option ID for ARIA\n const getOptionId = (index: number) => `${baseId}-option-${index}`\n\n const inputClasses = [\n 'input input-bordered w-full',\n sizeClasses[size],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`dropdown dropdown-bottom w-full ${isOpen && !disabled ? 'dropdown-open' : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n {...rest}\n >\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined}\n aria-invalid={status === 'error' ? true : undefined}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n className={inputClasses}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\">\n {clearIcon || <ClearIcon onClick={handleClear} />}\n </span>\n )}\n </div>\n\n {isOpen && !disabled && (\n <ul\n ref={dropdownRef}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n tabIndex={-1}\n className=\"dropdown-content menu bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li key={option.value}>\n <a\n id={getOptionId(index)}\n role=\"option\"\n aria-selected={highlightedIndex === index}\n aria-disabled={option.disabled}\n onMouseDown={(e) => {\n e.preventDefault()\n handleOptionClick(option)\n }}\n onMouseEnter={() => !option.disabled && setHighlightedIndex(index)}\n className={[\n index === highlightedIndex && !option.disabled && 'active',\n option.disabled && 'disabled text-base-content/40 cursor-not-allowed',\n ].filter(Boolean).join(' ')}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\">\n <span className=\"text-base-content/60 text-center cursor-default\">{notFoundContent}</span>\n </li>\n )}\n </ul>\n )}\n </div>\n )\n}\n"],"names":["ClearIcon","onClick","className","jsx","Autocomplete","value","defaultValue","onChange","onSelect","onSearch","rawOptions","placeholder","disabled","size","color","status","allowCustomValue","filterOption","notFoundContent","allowClear","onClear","controlledOpen","defaultOpen","onOpenChange","defaultActiveFirstOption","rest","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":";;AAuCA,MAAMA,KAAsF,CAAC,EAAE,SAAAC,GAAS,WAAAC,QACtG,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAAF;AAAA,IACA,WAAW,oFAAoFC,KAAa,EAAE;AAAA,IAC9G,cAAW;AAAA,IACX,UAAU;AAAA,IAEV,UAAA,gBAAAC,EAAC,SAAI,WAAU,WAAU,MAAK,QAAO,SAAQ,aAAY,QAAO,gBAAe,eAAY,QACzF,UAAA,gBAAAA,EAAC,QAAA,EAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,uBAAA,CAAuB,EAAA,CAC9F;AAAA,EAAA;AACF,GAGWC,KAA4C,CAAC;AAAA,EACxD,OAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAASC;AAAA,EACT,aAAAC,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAb,IAAY;AAAA,EACZ,kBAAAc,IAAmB;AAAA,EACnB,cAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC,IAAc;AAAA,EACd,cAAAC;AAAA,EACA,0BAAAC,IAA2B;AAAA,EAC3B,GAAGC;AACL,MAAM;AAEJ,QAAMC,IAASC,GAAA,GACTC,IAAU,GAAGF,CAAM,UACnBG,IAAY,GAAGH,CAAM,YAGrBI,IAAgCpB,EAAW;AAAA,IAAI,CAACqB,MACpD,OAAOA,KAAQ,WAAW,EAAE,OAAOA,GAAK,OAAOA,MAAQA;AAAA,EAAA,GAGnD,CAACC,GAAYC,CAAa,IAAIC,EAAS5B,CAAY,GACnD,CAAC6B,GAAcC,CAAe,IAAIF,EAASZ,CAAW,GACtD,CAACe,GAAkBC,CAAmB,IAAIJ,EAAS,EAAE,GACrDK,IAAWC,EAAyB,IAAI,GACxCC,IAAcD,EAAyB,IAAI,GAG3CE,IAAmBrB,MAAmB,QACtCsB,IAASD,IAAmBrB,IAAiBc,GAE7CS,IAAY,CAACC,MAAqB;AACtC,IAAKH,KACHN,EAAgBS,CAAO,GAEzBtB,IAAesB,CAAO;AAAA,EACxB;AAGA,EAAAC,EAAU,MAAM;AACd,QAAIzC,MAAU,QAAW;AACvB,YAAM0C,IAAiBjB,EAAQ,KAAK,CAACC,MAAQA,EAAI,UAAU1B,CAAK;AAChE,MAAA4B,EAAcc,GAAgB,SAAS1C,CAAK;AAAA,IAC9C;AAAA,EACF,GAAG,CAACA,GAAOyB,CAAO,CAAC;AAGnB,QAAMkB,IAAgB,CAACC,GAA4BC,MACjDD,EAAO,MAAM,cAAc,SAASC,EAAM,YAAA,CAAa,GAEnDC,IAAkBrB,EAAQ;AAAA,IAAO,CAACmB,MACtChC,IAAeA,EAAagC,GAAQjB,CAAU,IAAIgB,EAAcC,GAAQjB,CAAU;AAAA,EAAA,GAI9EoB,IAAiBD,EAAgB,OAAO,CAAApB,MAAO,CAACA,EAAI,QAAQ,GAE5DsB,IAAoB,CAAC,MAA2C;AACpE,UAAMC,IAAgB,EAAE,OAAO;AAC/B,IAAArB,EAAcqB,CAAa,GAC3BV,EAAU,EAAI,GAEVpB,KAA4B4B,EAAe,SAAS,IACtDd,EAAoB,CAAC,IAErBA,EAAoB,EAAE,GAGxB7B,IAAW6C,CAAa,GAEpBtC,KACFT,IAAW+C,CAAa;AAAA,EAE5B,GAEMC,IAAoB,CAACN,MAA+B;AACxD,IAAIA,EAAO,aAEXhB,EAAcgB,EAAO,KAAK,GAC1BL,EAAU,EAAK,GACfN,EAAoB,EAAE,GAEtB/B,IAAW0C,EAAO,KAAK,GACvBzC,IAAWyC,EAAO,OAAOA,CAAM,GAC/BV,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMiB,IAAgB,CAAC,MAA6C;AAClE,QAAI,CAACb,MAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,YAAY;AAC7D,MAAAC,EAAU,EAAI,GACVpB,KAA4B4B,EAAe,SAAS,KACtDd,EAAoB,CAAC;AAEvB;AAAA,IACF;AAEA,YAAQ,EAAE,KAAA;AAAA,MACR,KAAK;AACH,UAAE,eAAA,GACFA,EAAoB,CAACmB,MAAS;AAE5B,mBAASC,IAAID,IAAO,GAAGC,IAAIP,EAAgB,QAAQO;AACjD,gBAAI,CAACP,EAAgBO,CAAC,EAAE,SAAU,QAAOA;AAE3C,iBAAOD;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACFnB,EAAoB,CAACmB,MAAS;AAE5B,mBAASC,IAAID,IAAO,GAAGC,KAAK,GAAGA;AAC7B,gBAAI,CAACP,EAAgBO,CAAC,EAAE,SAAU,QAAOA;AAE3C,iBAAOD;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,UAAE,eAAA,GACEpB,KAAoB,KAAKc,EAAgBd,CAAgB,KAAK,CAACc,EAAgBd,CAAgB,EAAE,WACnGkB,EAAkBJ,EAAgBd,CAAgB,CAAC,IAC1C,CAACrB,KAAoBoC,EAAe,SAAS,KACtDG,EAAkBH,EAAe,CAAC,CAAC;AAErC;AAAA,MACF,KAAK;AACH,QAAAR,EAAU,EAAK,GACfN,EAAoB,EAAE,GACtBC,EAAS,SAAS,KAAA;AAClB;AAAA,IAAA;AAAA,EAEN,GAEMoB,IAAc,MAAM;AACxB,IAAAf,EAAU,EAAI,GACVpB,KAA4B4B,EAAe,SAAS,KACtDd,EAAoB,CAAC;AAAA,EAEzB,GAEMsB,KAAa,CAAC,MAAwB;AAE1C,IAAInB,EAAY,WAAWA,EAAY,QAAQ,SAAS,EAAE,aAAqB,KAG/E,WAAW,MAAMG,EAAU,EAAK,GAAG,GAAG;AAAA,EACxC,GAEMiB,KAAc,CAAC,MAAwB;AAC3C,MAAE,gBAAA,GACF5B,EAAc,EAAE,GAChB1B,IAAW,EAAE,GACba,IAAA,GACAmB,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMuB,KAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAoBAC,KAAsBhD,IANN;AAAA,IACpB,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,EAIwCA,CAAM,IAAKD,IAjBzC;AAAA,IACnB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,EAS0EA,CAAK,IAAI;AAG5F,EAAAgC,EAAU,MAAM;AACd,IAAIT,KAAoB,KAAKI,EAAY,WACZA,EAAY,QAAQ,SAASJ,CAAgB,GACpD,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAE3D,GAAG,CAACA,CAAgB,CAAC;AAGrB,QAAM2B,IAAY7C,KAAca,KAAc,CAACpB,GAGzCqD,KAAY,OAAO9C,KAAe,YAAYA,EAAW,YAC3DA,EAAW,YACX,MAGE+C,IAAc,CAACC,MAAkB,GAAGzC,CAAM,WAAWyC,CAAK,IAE1DC,KAAe;AAAA,IACnB;AAAA,IACAN,GAAYjD,CAAI;AAAA,IAChBkD;AAAA,IACAC,KAAa;AAAA,EAAA,EACb,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,mCAAmC1B,KAAU,CAAC/B,IAAW,kBAAkB,EAAE,IAAIV,CAAS;AAAA,MACrG,cAAYyC,IAAS,SAAS;AAAA,MAC7B,GAAGlB;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAA4C,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA,gBAAAlE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKoC;AAAA,cACL,IAAIX;AAAA,cACJ,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAee;AAAA,cACf,iBAAc;AAAA,cACd,iBAAed;AAAA,cACf,qBAAkB;AAAA,cAClB,yBAAuBQ,KAAoB,IAAI6B,EAAY7B,CAAgB,IAAI;AAAA,cAC/E,gBAActB,MAAW,UAAU,KAAO;AAAA,cAC1C,OAAOiB;AAAA,cACP,UAAUqB;AAAA,cACV,WAAWG;AAAA,cACX,SAASG;AAAA,cACT,QAAQC;AAAA,cACR,aAAAjD;AAAA,cACA,UAAAC;AAAA,cACA,WAAWwD;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZJ,KACC,gBAAA7D,EAAC,QAAA,EAAK,WAAU,kDACb,gBAAa,gBAAAA,EAACH,IAAA,EAAU,SAAS6D,GAAA,CAAa,EAAA,CACjD;AAAA,QAAA,GAEJ;AAAA,QAEClB,KAAU,CAAC/B,KACV,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKsC;AAAA,YACL,IAAIZ;AAAA,YACJ,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU;AAAA,YACV,WAAU;AAAA,YAET,UAAAsB,EAAgB,SAAS,IACxBA,EAAgB,IAAI,CAACF,GAAQkB,MAC3B,gBAAAhE,EAAC,MAAA,EACC,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAI+D,EAAYC,CAAK;AAAA,gBACrB,MAAK;AAAA,gBACL,iBAAe9B,MAAqB8B;AAAA,gBACpC,iBAAelB,EAAO;AAAA,gBACtB,aAAa,CAACqB,MAAM;AAClB,kBAAAA,EAAE,eAAA,GACFf,EAAkBN,CAAM;AAAA,gBAC1B;AAAA,gBACA,cAAc,MAAM,CAACA,EAAO,YAAYX,EAAoB6B,CAAK;AAAA,gBACjE,WAAW;AAAA,kBACTA,MAAU9B,KAAoB,CAACY,EAAO,YAAY;AAAA,kBAClDA,EAAO,YAAY;AAAA,gBAAA,EACnB,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBAEzB,UAAAA,EAAO;AAAA,cAAA;AAAA,YAAA,EACV,GAjBOA,EAAO,KAkBhB,CACD,IAED,gBAAA9C,EAAC,MAAA,EAAG,WAAU,YACZ,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,mDAAmD,aAAgB,EAAA,CACrF;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EAAA;AAIR;"}
package/dist/index50.js CHANGED
@@ -1,179 +1,84 @@
1
- import { jsx as a, jsxs as K } from "react/jsx-runtime";
2
- import { useState as f, useRef as $, useCallback as A, useEffect as C } from "react";
3
- import { createPortal as oe } from "react-dom";
4
- const fe = ({
5
- value: p,
6
- defaultValue: q = "",
7
- onChange: E,
8
- onSelect: U,
9
- onSearch: W,
10
- options: R = [],
11
- loading: X = !1,
12
- prefix: k = "@",
13
- split: v = " ",
14
- placeholder: Y,
15
- disabled: G = !1,
16
- readOnly: J = !1,
17
- rows: V = 3,
18
- autoSize: o = !1,
19
- notFoundContent: Q = "No matches found",
20
- filterOption: x = !0,
21
- className: Z = "",
22
- dropdownClassName: _ = "",
23
- ...z
1
+ import { jsx as H } from "react/jsx-runtime";
2
+ import I, { useRef as R, useState as b, useCallback as K, useLayoutEffect as A } from "react";
3
+ const d = {
4
+ sm: 640,
5
+ md: 768,
6
+ lg: 1024,
7
+ xl: 1280,
8
+ "2xl": 1536
9
+ };
10
+ function L(t, e) {
11
+ return typeof t == "number" ? t : t ? t["2xl"] !== void 0 && e >= d["2xl"] ? t["2xl"] : t.xl !== void 0 && e >= d.xl ? t.xl : t.lg !== void 0 && e >= d.lg ? t.lg : t.md !== void 0 && e >= d.md ? t.md : t.sm !== void 0 && e >= d.sm ? t.sm : t.xs !== void 0 ? t.xs : 3 : 3;
12
+ }
13
+ const O = ({
14
+ children: t,
15
+ columns: e = 3,
16
+ gap: r = 16,
17
+ className: z = "",
18
+ style: M,
19
+ ...P
24
20
  }) => {
25
- const [ee, T] = f(q), h = p !== void 0 ? p : ee, [u, m] = f(!1), [I, N] = f(null), [D, M] = f(""), [d, y] = f(0), [g, H] = f(null), [j, te] = f({ top: 0, left: 0 }), l = $(null), b = $(null), B = $(null), ne = Array.isArray(k) ? k : [k], c = A(() => {
26
- if (!x) return R;
27
- const e = typeof x == "function" ? x : (t, n) => (n.label || n.value).toLowerCase().includes(t.toLowerCase());
28
- return R.filter((t) => e(D, t));
29
- }, [R, D, x])(), L = A(() => {
30
- const e = l.current;
31
- if (!e || !o) return;
32
- e.style.height = "auto";
33
- const t = e.scrollHeight;
34
- if (typeof o == "object") {
35
- const n = parseInt(getComputedStyle(e).lineHeight) || 20, r = o.minRows ? o.minRows * n : 0, s = o.maxRows ? o.maxRows * n : 1 / 0;
36
- e.style.height = `${Math.min(Math.max(t, r), s)}px`;
37
- } else
38
- e.style.height = `${t}px`;
39
- }, [o]);
40
- C(() => {
41
- L();
42
- }, [h, L]);
43
- const O = A(() => {
44
- const e = l.current, t = B.current;
45
- if (!e || !t || g === null) return;
46
- const n = h.substring(0, g);
47
- t.textContent = n;
48
- const r = e.getBoundingClientRect(), s = t.getBoundingClientRect(), w = parseInt(getComputedStyle(e).lineHeight) || 20;
49
- te({
50
- top: r.top + window.scrollY + w + 4,
51
- left: r.left + window.scrollX + Math.min(s.width % r.width, r.width - 200)
52
- });
53
- }, [h, g]);
54
- C(() => {
55
- u && O();
56
- }, [u, O, D]);
57
- const re = (e) => {
58
- const t = e.target.value, n = e.target.selectionStart;
59
- p === void 0 && T(t), E?.(t), se(t, n);
60
- }, se = (e, t) => {
61
- let n = null, r = null;
62
- for (const s of ne) {
63
- const i = e.substring(0, t).lastIndexOf(s);
64
- if (i !== -1) {
65
- const S = i > 0 ? e[i - 1] : v;
66
- if (S === v || S === `
67
- ` || i === 0) {
68
- const F = e.substring(i + s.length, t);
69
- if (!F.includes(v) && !F.includes(`
70
- `)) {
71
- n = s, r = i;
72
- break;
73
- }
74
- }
75
- }
76
- }
77
- if (n !== null && r !== null) {
78
- const s = e.substring(r + n.length, t);
79
- N(n), M(s), H(r), m(!0), y(0), W?.(s, n);
80
- } else
81
- m(!1), N(null), M(""), H(null);
82
- }, P = (e) => {
83
- if (e.disabled || g === null || I === null) return;
84
- const t = l.current;
85
- if (!t) return;
86
- const n = h.substring(0, g), r = h.substring(t.selectionStart), s = `${I}${e.value}${v}`, w = n + s + r;
87
- p === void 0 && T(w), E?.(w), U?.(e, I), m(!1), N(null), M(""), H(null), setTimeout(() => {
88
- const i = n.length + s.length;
89
- t.focus(), t.setSelectionRange(i, i);
90
- }, 0);
91
- }, ae = (e) => {
92
- if (u)
93
- switch (e.key) {
94
- case "ArrowDown":
95
- e.preventDefault(), y((t) => (t + 1) % Math.max(c.length, 1));
96
- break;
97
- case "ArrowUp":
98
- e.preventDefault(), y((t) => (t - 1 + c.length) % Math.max(c.length, 1));
99
- break;
100
- case "Enter":
101
- c[d] && (e.preventDefault(), P(c[d]));
102
- break;
103
- case "Escape":
104
- e.preventDefault(), m(!1);
105
- break;
106
- case "Tab":
107
- c[d] && (e.preventDefault(), P(c[d]));
108
- break;
109
- }
110
- };
111
- C(() => {
112
- const e = (t) => {
113
- b.current && !b.current.contains(t.target) && l.current && !l.current.contains(t.target) && m(!1);
21
+ const u = R(null), [l, T] = b([]), [y, N] = b(0), w = R([]), c = I.Children.toArray(t), s = K(() => {
22
+ const i = u.current;
23
+ if (!i || c.length === 0) return;
24
+ const n = i.offsetWidth, m = typeof window < "u" ? window.innerWidth : n, a = L(e, m), j = (n - r * (a - 1)) / a, o = new Array(a).fill(0), W = [];
25
+ c.forEach((_, x) => {
26
+ const C = w.current[x];
27
+ if (!C) return;
28
+ let h = 0, E = o[0];
29
+ for (let f = 1; f < a; f++)
30
+ o[f] < E && (E = o[f], h = f);
31
+ const k = h * (j + r), B = o[h];
32
+ W[x] = { left: k, top: B };
33
+ const F = C.offsetHeight;
34
+ o[h] += F + r;
35
+ }), T(W), N(Math.max(...o) - r);
36
+ }, [t, e, r, c.length]);
37
+ A(() => {
38
+ s();
39
+ const i = () => {
40
+ s();
114
41
  };
115
- return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
116
- }, []), C(() => {
117
- u && b.current && b.current.querySelector('[data-active="true"]')?.scrollIntoView({ block: "nearest" });
118
- }, [d, u]);
119
- const le = u && /* @__PURE__ */ a(
42
+ return window.addEventListener("resize", i), () => window.removeEventListener("resize", i);
43
+ }, [s]), A(() => {
44
+ const i = setTimeout(s, 0);
45
+ return () => clearTimeout(i);
46
+ }, [t, s]);
47
+ const v = u.current?.offsetWidth ?? 0, S = typeof window < "u" ? window.innerWidth : v, g = L(e, S), p = v > 0 ? (v - r * (g - 1)) / g : 0;
48
+ return /* @__PURE__ */ H(
120
49
  "div",
121
50
  {
122
- ref: b,
123
- className: `fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-lg
124
- min-w-48 max-h-60 overflow-auto ${_}`,
51
+ ref: u,
52
+ className: z,
125
53
  style: {
126
- top: j.top,
127
- left: j.left
54
+ position: "relative",
55
+ height: y > 0 ? y : void 0,
56
+ ...M
128
57
  },
129
- children: X ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60", children: /* @__PURE__ */ a("span", { className: "loading loading-spinner loading-sm" }) }) : c.length === 0 ? /* @__PURE__ */ a("div", { className: "p-3 text-center text-base-content/60 text-sm", children: Q }) : /* @__PURE__ */ a("ul", { className: "menu menu-sm p-1", children: c.map((e, t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ K(
130
- "button",
58
+ ...P,
59
+ children: c.map((i, n) => /* @__PURE__ */ H(
60
+ "div",
131
61
  {
132
- type: "button",
133
- "data-active": t === d,
134
- className: `flex items-center gap-2 ${t === d ? "active" : ""} ${e.disabled ? "disabled opacity-50 cursor-not-allowed" : ""}`,
135
- onClick: () => P(e),
136
- onMouseEnter: () => y(t),
137
- children: [
138
- e.avatar && /* @__PURE__ */ a("div", { className: "avatar", children: /* @__PURE__ */ a("div", { className: "w-6 h-6 rounded-full", children: /* @__PURE__ */ a("img", { src: e.avatar, alt: "" }) }) }),
139
- /* @__PURE__ */ a("span", { children: e.label || e.value })
140
- ]
141
- }
142
- ) }, e.value)) })
62
+ ref: (m) => {
63
+ w.current[n] = m;
64
+ },
65
+ style: {
66
+ position: l.length > 0 ? "absolute" : "relative",
67
+ left: l[n]?.left ?? 0,
68
+ top: l[n]?.top ?? 0,
69
+ width: p > 0 ? p : "100%",
70
+ visibility: l.length > 0 ? "visible" : "hidden"
71
+ },
72
+ children: i
73
+ },
74
+ n
75
+ ))
143
76
  }
144
77
  );
145
- return /* @__PURE__ */ K("div", { className: `relative ${Z}`, "data-state": u ? "open" : "closed", ...z, children: [
146
- /* @__PURE__ */ a(
147
- "div",
148
- {
149
- ref: B,
150
- className: "invisible absolute whitespace-pre-wrap break-words",
151
- style: {
152
- font: l.current ? getComputedStyle(l.current).font : void 0,
153
- width: l.current?.clientWidth,
154
- padding: l.current ? getComputedStyle(l.current).padding : void 0
155
- },
156
- "aria-hidden": "true"
157
- }
158
- ),
159
- /* @__PURE__ */ a(
160
- "textarea",
161
- {
162
- ref: l,
163
- value: h,
164
- onChange: re,
165
- onKeyDown: ae,
166
- placeholder: Y,
167
- disabled: G,
168
- readOnly: J,
169
- rows: typeof o == "object" ? o.minRows || V : o ? 1 : V,
170
- className: "textarea textarea-bordered w-full resize-none"
171
- }
172
- ),
173
- oe(le, document.body)
174
- ] });
175
78
  };
79
+ O.displayName = "Masonry";
176
80
  export {
177
- fe as Mention
81
+ O as Masonry,
82
+ O as default
178
83
  };
179
84
  //# sourceMappingURL=index50.js.map