@aster-ui/prefixed 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 +117 -112
  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 +38 -27
  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 +200 -183
  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 +57 -34
  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 +11 -9
  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 +83 -54
  112. package/dist/components/QRCode.js.map +1 -1
  113. package/dist/components/RadialProgress.d.ts +1 -0
  114. package/dist/components/RadialProgress.js +24 -22
  115. package/dist/components/RadialProgress.js.map +1 -1
  116. package/dist/components/Radio.d.ts +6 -3
  117. package/dist/components/Radio.js +7 -7
  118. package/dist/components/Radio.js.map +1 -1
  119. package/dist/components/Range.d.ts +1 -0
  120. package/dist/components/Range.js +46 -44
  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 +18 -17
  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 +33 -32
  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,7 +1,7 @@
1
- import { jsxs as M, jsx as o } from "react/jsx-runtime";
2
- import { useId as ie, useState as k, useRef as O, useEffect as z } from "react";
3
- import { useConfig as ue } from "../providers/ConfigProvider.js";
4
- const pe = "d-dropdown", fe = "d-dropdown-bottom", he = "d-dropdown-open", be = "d-dropdown-content", me = "d-menu", Ie = "d-input", ge = "d-input-xs", we = "d-input-sm", xe = "d-input-md", ye = "d-input-lg", ve = "d-input-xl", Ce = "d-input-neutral", ke = "d-input-primary", De = "d-input-secondary", Ne = "d-input-accent", $e = "d-input-info", je = "d-input-success", A = "d-input-warning", R = "d-input-error", Ee = ({ onClick: l, className: I }) => /* @__PURE__ */ o(
1
+ import { jsxs as z, jsx as o } from "react/jsx-runtime";
2
+ import { useId as pe, useState as D, useRef as A, useEffect as T } from "react";
3
+ import { useConfig as fe } from "../providers/ConfigProvider.js";
4
+ const be = "d-dropdown", he = "d-dropdown-bottom", me = "d-dropdown-open", ge = "d-dropdown-content", Ie = "d-menu", we = "d-input", xe = "d-input-xs", ve = "d-input-sm", ye = "d-input-md", Ce = "d-input-lg", $e = "d-input-xl", ke = "d-input-neutral", De = "d-input-primary", Ne = "d-input-secondary", je = "d-input-accent", Ee = "d-input-info", Se = "d-input-success", R = "d-input-warning", V = "d-input-error", Be = ({ onClick: l, className: I }) => /* @__PURE__ */ o(
5
5
  "button",
6
6
  {
7
7
  type: "button",
@@ -11,169 +11,174 @@ const pe = "d-dropdown", fe = "d-dropdown-bottom", he = "d-dropdown-open", be =
11
11
  tabIndex: -1,
12
12
  children: /* @__PURE__ */ o("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
13
13
  }
14
- ), ze = ({
14
+ ), Te = ({
15
15
  value: l,
16
16
  defaultValue: I = "",
17
- onChange: g,
18
- onSelect: T,
19
- onSearch: V,
20
- options: K,
21
- placeholder: P = "Type to search...",
22
- disabled: p = !1,
23
- size: U,
24
- color: D,
25
- status: w,
26
- className: W = "",
27
- allowCustomValue: N = !0,
28
- filterOption: $,
29
- notFoundContent: X = "No results found",
30
- allowClear: f,
31
- onClear: F,
32
- open: j,
33
- defaultOpen: H = !1,
34
- onOpenChange: q,
35
- defaultActiveFirstOption: x = !0,
36
- ...G
17
+ onChange: w,
18
+ onSelect: K,
19
+ onSearch: P,
20
+ options: U,
21
+ placeholder: W = "Type to search...",
22
+ disabled: f = !1,
23
+ size: X,
24
+ color: N,
25
+ status: x,
26
+ className: F = "",
27
+ allowCustomValue: j = !0,
28
+ filterOption: E,
29
+ notFoundContent: H = "No results found",
30
+ allowClear: b,
31
+ onClear: q,
32
+ open: S,
33
+ defaultOpen: G = !1,
34
+ onOpenChange: J,
35
+ defaultActiveFirstOption: v = !0,
36
+ "data-testid": y,
37
+ ...Q
37
38
  }) => {
38
- const { componentSize: J } = ue(), Q = U ?? J ?? "md", y = ie(), Y = `${y}-input`, E = `${y}-listbox`, v = K.map(
39
+ const { componentSize: Y } = fe(), Z = X ?? Y ?? "md", C = pe(), _ = `${C}-input`, B = `${C}-listbox`, $ = U.map(
39
40
  (e) => typeof e == "string" ? { value: e, label: e } : e
40
- ), [h, b] = k(I), [Z, _] = k(H), [t, r] = k(-1), m = O(null), d = O(null), S = j !== void 0, i = S ? j : Z, c = (e) => {
41
- S || _(e), q?.(e);
41
+ ), [h, m] = D(I), [ee, te] = D(G), [n, r] = D(-1), g = A(null), c = A(null), L = S !== void 0, i = L ? S : ee, d = (e) => {
42
+ L || te(e), J?.(e);
42
43
  };
43
- z(() => {
44
+ T(() => {
44
45
  if (l !== void 0) {
45
- const e = v.find((n) => n.value === l);
46
- b(e?.label || l);
46
+ const e = $.find((t) => t.value === l);
47
+ m(e?.label || l);
47
48
  }
48
- }, [l, v]);
49
- const ee = (e, n) => e.label.toLowerCase().includes(n.toLowerCase()), a = v.filter(
50
- (e) => $ ? $(e, h) : ee(e, h)
51
- ), u = a.filter((e) => !e.disabled), ne = (e) => {
52
- const n = e.target.value;
53
- b(n), c(!0), x && u.length > 0 ? r(0) : r(-1), V?.(n), N && g?.(n);
54
- }, C = (e) => {
55
- e.disabled || (b(e.label), c(!1), r(-1), g?.(e.value), T?.(e.value, e), m.current?.focus());
56
- }, te = (e) => {
49
+ }, [l, $]);
50
+ const ne = (e, t) => e.label.toLowerCase().includes(t.toLowerCase()), a = $.filter(
51
+ (e) => E ? E(e, h) : ne(e, h)
52
+ ), u = a.filter((e) => !e.disabled), se = (e) => {
53
+ const t = e.target.value;
54
+ m(t), d(!0), v && u.length > 0 ? r(0) : r(-1), P?.(t), j && w?.(t);
55
+ }, k = (e) => {
56
+ e.disabled || (m(e.label), d(!1), r(-1), w?.(e.value), K?.(e.value, e), g.current?.focus());
57
+ }, oe = (e) => {
57
58
  if (!i && (e.key === "ArrowDown" || e.key === "ArrowUp")) {
58
- c(!0), x && u.length > 0 && r(0);
59
+ d(!0), v && u.length > 0 && r(0);
59
60
  return;
60
61
  }
61
62
  switch (e.key) {
62
63
  case "ArrowDown":
63
- e.preventDefault(), r((n) => {
64
- for (let s = n + 1; s < a.length; s++)
64
+ e.preventDefault(), r((t) => {
65
+ for (let s = t + 1; s < a.length; s++)
65
66
  if (!a[s].disabled) return s;
66
- return n;
67
+ return t;
67
68
  });
68
69
  break;
69
70
  case "ArrowUp":
70
- e.preventDefault(), r((n) => {
71
- for (let s = n - 1; s >= 0; s--)
71
+ e.preventDefault(), r((t) => {
72
+ for (let s = t - 1; s >= 0; s--)
72
73
  if (!a[s].disabled) return s;
73
- return n;
74
+ return t;
74
75
  });
75
76
  break;
76
77
  case "Enter":
77
- e.preventDefault(), t >= 0 && a[t] && !a[t].disabled ? C(a[t]) : !N && u.length > 0 && C(u[0]);
78
+ e.preventDefault(), n >= 0 && a[n] && !a[n].disabled ? k(a[n]) : !j && u.length > 0 && k(u[0]);
78
79
  break;
79
80
  case "Escape":
80
- c(!1), r(-1), m.current?.blur();
81
+ d(!1), r(-1), g.current?.blur();
81
82
  break;
82
83
  }
83
- }, se = () => {
84
- c(!0), x && u.length > 0 && r(0);
85
- }, oe = (e) => {
86
- d.current && d.current.contains(e.relatedTarget) || setTimeout(() => c(!1), 200);
87
- }, re = (e) => {
88
- e.stopPropagation(), b(""), g?.(""), F?.(), m.current?.focus();
89
- }, ae = {
90
- xs: ge,
91
- sm: we,
92
- md: xe,
93
- lg: ye,
94
- xl: ve
95
- }, le = w ? {
96
- error: R,
97
- warning: A
98
- }[w] : D ? {
99
- neutral: Ce,
100
- primary: ke,
101
- secondary: De,
102
- accent: Ne,
103
- info: $e,
104
- success: je,
105
- warning: A,
106
- error: R
107
- }[D] : "";
108
- z(() => {
109
- t >= 0 && d.current && d.current.children[t]?.scrollIntoView({ block: "nearest" });
110
- }, [t]);
111
- const B = f && h && !p, ce = typeof f == "object" && f.clearIcon ? f.clearIcon : null, L = (e) => `${y}-option-${e}`, de = [
112
- `${Ie} w-full`,
113
- ae[Q],
114
- le,
115
- B && "pr-10"
116
- ].filter(Boolean).join(" ");
117
- return /* @__PURE__ */ M(
84
+ }, re = () => {
85
+ d(!0), v && u.length > 0 && r(0);
86
+ }, ae = (e) => {
87
+ c.current && c.current.contains(e.relatedTarget) || setTimeout(() => d(!1), 200);
88
+ }, le = (e) => {
89
+ e.stopPropagation(), m(""), w?.(""), q?.(), g.current?.focus();
90
+ }, de = {
91
+ xs: xe,
92
+ sm: ve,
93
+ md: ye,
94
+ lg: Ce,
95
+ xl: $e
96
+ }, ce = x ? {
97
+ error: V,
98
+ warning: R
99
+ }[x] : N ? {
100
+ neutral: ke,
101
+ primary: De,
102
+ secondary: Ne,
103
+ accent: je,
104
+ info: Ee,
105
+ success: Se,
106
+ warning: R,
107
+ error: V
108
+ }[N] : "";
109
+ T(() => {
110
+ n >= 0 && c.current && c.current.children[n]?.scrollIntoView({ block: "nearest" });
111
+ }, [n]);
112
+ const M = b && h && !f, ie = typeof b == "object" && b.clearIcon ? b.clearIcon : null, O = (e) => `${C}-option-${e}`, ue = [
113
+ `${we} w-full`,
114
+ de[Z],
115
+ ce,
116
+ M && "pr-10"
117
+ ].filter(Boolean).join(" "), p = (e) => y ? `${y}-${e}` : void 0;
118
+ return /* @__PURE__ */ z(
118
119
  "div",
119
120
  {
120
- className: `${pe} ${fe} w-full ${i && !p ? he : ""} ${W}`,
121
+ className: `${be} ${he} w-full ${i && !f ? me : ""} ${F}`,
121
122
  "data-state": i ? "open" : "closed",
122
- ...G,
123
+ "data-testid": y,
124
+ ...Q,
123
125
  children: [
124
- /* @__PURE__ */ M("div", { className: "relative w-full", children: [
126
+ /* @__PURE__ */ z("div", { className: "relative w-full", children: [
125
127
  /* @__PURE__ */ o(
126
128
  "input",
127
129
  {
128
- ref: m,
129
- id: Y,
130
+ ref: g,
131
+ id: _,
130
132
  type: "text",
131
133
  role: "combobox",
132
134
  "aria-expanded": i,
133
135
  "aria-haspopup": "listbox",
134
- "aria-controls": E,
136
+ "aria-controls": B,
135
137
  "aria-autocomplete": "list",
136
- "aria-activedescendant": t >= 0 ? L(t) : void 0,
137
- "aria-invalid": w === "error" ? !0 : void 0,
138
+ "aria-activedescendant": n >= 0 ? O(n) : void 0,
139
+ "aria-invalid": x === "error" ? !0 : void 0,
138
140
  value: h,
139
- onChange: ne,
140
- onKeyDown: te,
141
- onFocus: se,
142
- onBlur: oe,
143
- placeholder: P,
144
- disabled: p,
145
- className: de
141
+ onChange: se,
142
+ onKeyDown: oe,
143
+ onFocus: re,
144
+ onBlur: ae,
145
+ placeholder: W,
146
+ disabled: f,
147
+ className: ue,
148
+ "data-testid": p("input")
146
149
  }
147
150
  ),
148
- B && /* @__PURE__ */ o("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 z-10", children: ce || /* @__PURE__ */ o(Ee, { onClick: re }) })
151
+ M && /* @__PURE__ */ o("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 z-10", "data-testid": p("clear"), children: ie || /* @__PURE__ */ o(Be, { onClick: le }) })
149
152
  ] }),
150
- i && !p && /* @__PURE__ */ o(
153
+ i && !f && /* @__PURE__ */ o(
151
154
  "ul",
152
155
  {
153
- ref: d,
154
- id: E,
156
+ ref: c,
157
+ id: B,
155
158
  role: "listbox",
156
159
  "aria-label": "Suggestions",
157
160
  tabIndex: -1,
158
- className: `${be} ${me} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`,
159
- children: a.length > 0 ? a.map((e, n) => /* @__PURE__ */ o("li", { children: /* @__PURE__ */ o(
161
+ className: `${ge} ${Ie} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`,
162
+ "data-testid": p("listbox"),
163
+ children: a.length > 0 ? a.map((e, t) => /* @__PURE__ */ o("li", { children: /* @__PURE__ */ o(
160
164
  "a",
161
165
  {
162
- id: L(n),
166
+ id: O(t),
163
167
  role: "option",
164
- "aria-selected": t === n,
168
+ "aria-selected": n === t,
165
169
  "aria-disabled": e.disabled,
166
170
  onMouseDown: (s) => {
167
- s.preventDefault(), C(e);
171
+ s.preventDefault(), k(e);
168
172
  },
169
- onMouseEnter: () => !e.disabled && r(n),
173
+ onMouseEnter: () => !e.disabled && r(t),
170
174
  className: [
171
- n === t && !e.disabled && "active",
175
+ t === n && !e.disabled && "active",
172
176
  e.disabled && "disabled text-base-content/40 cursor-not-allowed"
173
177
  ].filter(Boolean).join(" "),
178
+ "data-testid": p(`option-${e.value || t}`),
174
179
  children: e.label
175
180
  }
176
- ) }, e.value)) : /* @__PURE__ */ o("li", { className: "disabled", children: /* @__PURE__ */ o("span", { className: "text-base-content/60 text-center cursor-default", children: X }) })
181
+ ) }, e.value)) : /* @__PURE__ */ o("li", { className: "disabled", "data-testid": p("empty"), children: /* @__PURE__ */ o("span", { className: "text-base-content/60 text-center cursor-default", children: H }) })
177
182
  }
178
183
  )
179
184
  ]
@@ -181,6 +186,6 @@ const pe = "d-dropdown", fe = "d-dropdown-bottom", he = "d-dropdown-open", be =
181
186
  );
182
187
  };
183
188
  export {
184
- ze as Autocomplete
189
+ Te as Autocomplete
185
190
  };
186
191
  //# sourceMappingURL=Autocomplete.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'd-dropdown'\nconst dDropdownBottom = 'd-dropdown-bottom'\nconst dDropdownOpen = 'd-dropdown-open'\nconst dDropdownContent = 'd-dropdown-content'\nconst dMenu = 'd-menu'\nconst dInput = 'd-input'\nconst dInputXs = 'd-input-xs'\nconst dInputSm = 'd-input-sm'\nconst dInputMd = 'd-input-md'\nconst dInputLg = 'd-input-lg'\nconst dInputXl = 'd-input-xl'\nconst dInputNeutral = 'd-input-neutral'\nconst dInputPrimary = 'd-input-primary'\nconst dInputSecondary = 'd-input-secondary'\nconst dInputAccent = 'd-input-accent'\nconst dInputInfo = 'd-input-info'\nconst dInputSuccess = 'd-input-success'\nconst dInputWarning = 'd-input-warning'\nconst dInputError = 'd-input-error'\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,\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 const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\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: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n const colorClasses = {\n neutral: dInputNeutral,\n primary: dInputPrimary,\n secondary: dInputSecondary,\n accent: dInputAccent,\n info: dInputInfo,\n success: dInputSuccess,\n warning: dInputWarning,\n error: dInputError,\n }\n\n const statusClasses = {\n error: dInputError,\n warning: dInputWarning,\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 `${dInput} w-full`,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n className={`${dDropdown} ${dDropdownBottom} w-full ${isOpen && !disabled ? dDropdownOpen : ''} ${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={`${dDropdownContent} ${dMenu} 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":["dDropdown","dDropdownBottom","dDropdownOpen","dDropdownContent","dMenu","dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","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","componentSize","useConfig","effectiveSize","baseId","useId","inputId","listboxId","options","opt","inputValue","setInputValue","useState","internalOpen","setInternalOpen","highlightedIndex","setHighlightedIndex","inputRef","useRef","dropdownRef","isOpenControlled","isOpen","setIsOpen","newOpen","useEffect","selectedOption","defaultFilter","option","input","filteredOptions","enabledOptions","handleInputChange","newInputValue","handleOptionClick","handleKeyDown","prev","i","handleFocus","handleBlur","handleClear","sizeClasses","effectiveColorClass","showClear","clearIcon","getOptionId","index","inputClasses","jsxs","e"],"mappings":"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"}
1
+ {"version":3,"file":"Autocomplete.js","sources":["../../src/components/Autocomplete.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'd-dropdown'\nconst dDropdownBottom = 'd-dropdown-bottom'\nconst dDropdownOpen = 'd-dropdown-open'\nconst dDropdownContent = 'd-dropdown-content'\nconst dMenu = 'd-menu'\nconst dInput = 'd-input'\nconst dInputXs = 'd-input-xs'\nconst dInputSm = 'd-input-sm'\nconst dInputMd = 'd-input-md'\nconst dInputLg = 'd-input-lg'\nconst dInputXl = 'd-input-xl'\nconst dInputNeutral = 'd-input-neutral'\nconst dInputPrimary = 'd-input-primary'\nconst dInputSecondary = 'd-input-secondary'\nconst dInputAccent = 'd-input-accent'\nconst dInputInfo = 'd-input-info'\nconst dInputSuccess = 'd-input-success'\nconst dInputWarning = 'd-input-warning'\nconst dInputError = 'd-input-error'\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 'data-testid'?: string\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,\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 'data-testid': testId,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\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: dInputXs,\n sm: dInputSm,\n md: dInputMd,\n lg: dInputLg,\n xl: dInputXl,\n }\n\n const colorClasses = {\n neutral: dInputNeutral,\n primary: dInputPrimary,\n secondary: dInputSecondary,\n accent: dInputAccent,\n info: dInputInfo,\n success: dInputSuccess,\n warning: dInputWarning,\n error: dInputError,\n }\n\n const statusClasses = {\n error: dInputError,\n warning: dInputWarning,\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 `${dInput} w-full`,\n sizeClasses[effectiveSize],\n effectiveColorClass,\n showClear && 'pr-10',\n ].filter(Boolean).join(' ')\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div\n className={`${dDropdown} ${dDropdownBottom} w-full ${isOpen && !disabled ? dDropdownOpen : ''} ${className}`}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\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 data-testid={getTestId('input')}\n />\n {showClear && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 z-10\" data-testid={getTestId('clear')}>\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={`${dDropdownContent} ${dMenu} bg-base-100 rounded-box z-50 w-full shadow-lg border border-base-300 max-h-60 overflow-auto flex-nowrap`}\n data-testid={getTestId('listbox')}\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 data-testid={getTestId(`option-${option.value || index}`)}\n >\n {option.label}\n </a>\n </li>\n ))\n ) : (\n <li className=\"disabled\" data-testid={getTestId('empty')}>\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":["dDropdown","dDropdownBottom","dDropdownOpen","dDropdownContent","dMenu","dInput","dInputXs","dInputSm","dInputMd","dInputLg","dInputXl","dInputNeutral","dInputPrimary","dInputSecondary","dInputAccent","dInputInfo","dInputSuccess","dInputWarning","dInputError","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","testId","rest","componentSize","useConfig","effectiveSize","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","getTestId","suffix","jsxs","e"],"mappings":"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"}
@@ -13,11 +13,15 @@ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
13
13
  online?: boolean;
14
14
  offline?: boolean;
15
15
  placeholder?: boolean;
16
+ /** Test ID for testing */
17
+ 'data-testid'?: string;
16
18
  }
17
19
  export interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {
18
20
  children: React.ReactNode;
19
21
  max?: number;
20
22
  size?: AvatarSize;
23
+ /** Test ID for testing */
24
+ 'data-testid'?: string;
21
25
  }
22
26
  declare function AvatarRoot({ src, alt, icon, children, size, shape, status, className, style, online, offline, placeholder, ...rest }: AvatarProps): import("react/jsx-runtime").JSX.Element;
23
27
  declare function AvatarGroup({ children, max, size, className, style, ...rest }: AvatarGroupProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dAvatar = 'd-avatar'\nconst dAvatarOnline = 'd-avatar-online'\nconst dAvatarOffline = 'd-avatar-offline'\nconst dAvatarPlaceholder = 'd-avatar-placeholder'\nconst dAvatarGroup = 'd-avatar-group'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n icon?: React.ReactNode\n children?: React.ReactNode\n size?: AvatarSize\n shape?: AvatarShape\n status?: AvatarStatus\n // Legacy props for backwards compatibility\n online?: boolean\n offline?: boolean\n placeholder?: boolean\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n max?: number\n size?: AvatarSize\n}\n\nfunction AvatarRoot({\n src,\n alt = 'avatar',\n icon,\n children,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n style,\n // Legacy props\n online,\n offline,\n placeholder,\n ...rest\n}: AvatarProps) {\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n const shapeClasses: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded',\n }\n\n // Handle legacy boolean props\n const resolvedStatus = status || (online ? 'online' : offline ? 'offline' : undefined)\n const isPlaceholder = placeholder || (!src && (icon || children))\n\n const avatarClasses = [\n dAvatar,\n resolvedStatus === 'online' && dAvatarOnline,\n resolvedStatus === 'offline' && dAvatarOffline,\n isPlaceholder && dAvatarPlaceholder,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const innerClasses = [sizeClasses[size], shapeClasses[shape]].filter(Boolean).join(' ')\n\n // Image avatar\n if (src) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <img src={src} alt={alt} />\n </div>\n </div>\n )\n }\n\n // Icon or text avatar (placeholder)\n const content = icon || children\n\n if (content) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral text-neutral-content flex items-center justify-center w-full h-full\">\n {content}\n </div>\n </div>\n </div>\n )\n }\n\n // Empty avatar\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral-focus text-neutral-content w-full h-full\" />\n </div>\n </div>\n )\n}\n\nfunction AvatarGroup({ children, max, size, className = '', style, ...rest }: AvatarGroupProps) {\n const avatars = React.Children.toArray(children)\n const displayAvatars = max ? avatars.slice(0, max) : avatars\n const remainingCount = max && avatars.length > max ? avatars.length - max : 0\n\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n return (\n <div className={`${dAvatarGroup} -space-x-6 rtl:space-x-reverse ${className}`} style={style} {...rest}>\n {displayAvatars}\n {remainingCount > 0 && (\n <div className={`${dAvatar} ${dAvatarPlaceholder}`}>\n <div className={`bg-neutral text-neutral-content rounded-full ${size ? sizeClasses[size] : 'w-12'}`}>\n <span>+{remainingCount}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const Avatar = Object.assign(AvatarRoot, {\n Group: AvatarGroup,\n})\n\nexport { AvatarGroup }\n\nexport default Avatar\n"],"names":["dAvatar","dAvatarOnline","dAvatarOffline","dAvatarPlaceholder","dAvatarGroup","AvatarRoot","src","alt","icon","children","size","shape","status","className","style","online","offline","placeholder","rest","sizeClasses","shapeClasses","resolvedStatus","avatarClasses","innerClasses","jsx","content","AvatarGroup","max","avatars","React","displayAvatars","remainingCount","jsxs","Avatar"],"mappings":";;AAGA,MAAMA,IAAU,YACVC,IAAgB,mBAChBC,IAAiB,oBACjBC,IAAqB,wBACrBC,IAAe;AA0BrB,SAASC,EAAW;AAAA,EAClB,KAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,OAAAC;AAAA;AAAA,EAEA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,GAAGC;AACL,GAAgB;AACd,QAAMC,IAA0C;AAAA,IAC9C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAA4C;AAAA,IAChD,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,GAIJC,IAAiBT,MAAWG,IAAS,WAAWC,IAAU,YAAY,SAGtEM,IAAgB;AAAA,IACpBtB;AAAA,IACAqB,MAAmB,YAAYpB;AAAA,IAC/BoB,MAAmB,aAAanB;AAAA,KALZe,KAAgB,CAACX,MAAQE,KAAQC,OAMpCN;AAAA,IACjBU;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELU,IAAe,CAACJ,EAAYT,CAAI,GAAGU,EAAaT,CAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAGtF,MAAIL;AACF,6BACG,OAAA,EAAI,WAAWgB,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,KAAAlB,GAAU,KAAAC,EAAA,CAAU,GAC3B,GACF;AAKJ,QAAMkB,IAAUjB,KAAQC;AAExB,SAAIgB,sBAEC,OAAA,EAAI,WAAWH,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kFACZ,UAAAC,GACH,GACF,EAAA,CACF,sBAMD,OAAA,EAAI,WAAWH,GAAe,OAAAR,GAAe,GAAGI,GAC/C,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,GACd,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,sDAAA,CAAsD,GACvE,GACF;AAEJ;AAEA,SAASE,EAAY,EAAE,UAAAjB,GAAU,KAAAkB,GAAK,MAAAjB,GAAM,WAAAG,IAAY,IAAI,OAAAC,GAAO,GAAGI,KAA0B;AAC9F,QAAMU,IAAUC,EAAM,SAAS,QAAQpB,CAAQ,GACzCqB,IAAiBH,IAAMC,EAAQ,MAAM,GAAGD,CAAG,IAAIC,GAC/CG,IAAiBJ,KAAOC,EAAQ,SAASD,IAAMC,EAAQ,SAASD,IAAM,GAEtER,IAA0C;AAAA,IAC9C,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAGN,SACE,gBAAAa,EAAC,OAAA,EAAI,WAAW,GAAG5B,CAAY,mCAAmCS,CAAS,IAAI,OAAAC,GAAe,GAAGI,GAC9F,UAAA;AAAA,IAAAY;AAAA,IACAC,IAAiB,KAChB,gBAAAP,EAAC,OAAA,EAAI,WAAW,GAAGxB,CAAO,IAAIG,CAAkB,IAC9C,4BAAC,OAAA,EAAI,WAAW,gDAAgDO,IAAOS,EAAYT,CAAI,IAAI,MAAM,IAC/F,UAAA,gBAAAsB,EAAC,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAED;AAAA,IAAA,EAAA,CAAe,GACzB,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEO,MAAME,IAAS,OAAO,OAAO5B,GAAY;AAAA,EAC9C,OAAOqB;AACT,CAAC;"}
1
+ {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dAvatar = 'd-avatar'\nconst dAvatarOnline = 'd-avatar-online'\nconst dAvatarOffline = 'd-avatar-offline'\nconst dAvatarPlaceholder = 'd-avatar-placeholder'\nconst dAvatarGroup = 'd-avatar-group'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type AvatarShape = 'circle' | 'square'\nexport type AvatarStatus = 'online' | 'offline'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n icon?: React.ReactNode\n children?: React.ReactNode\n size?: AvatarSize\n shape?: AvatarShape\n status?: AvatarStatus\n // Legacy props for backwards compatibility\n online?: boolean\n offline?: boolean\n placeholder?: boolean\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n max?: number\n size?: AvatarSize\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nfunction AvatarRoot({\n src,\n alt = 'avatar',\n icon,\n children,\n size = 'md',\n shape = 'circle',\n status,\n className = '',\n style,\n // Legacy props\n online,\n offline,\n placeholder,\n ...rest\n}: AvatarProps) {\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n const shapeClasses: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded',\n }\n\n // Handle legacy boolean props\n const resolvedStatus = status || (online ? 'online' : offline ? 'offline' : undefined)\n const isPlaceholder = placeholder || (!src && (icon || children))\n\n const avatarClasses = [\n dAvatar,\n resolvedStatus === 'online' && dAvatarOnline,\n resolvedStatus === 'offline' && dAvatarOffline,\n isPlaceholder && dAvatarPlaceholder,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const innerClasses = [sizeClasses[size], shapeClasses[shape]].filter(Boolean).join(' ')\n\n // Image avatar\n if (src) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <img src={src} alt={alt} />\n </div>\n </div>\n )\n }\n\n // Icon or text avatar (placeholder)\n const content = icon || children\n\n if (content) {\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral text-neutral-content flex items-center justify-center w-full h-full\">\n {content}\n </div>\n </div>\n </div>\n )\n }\n\n // Empty avatar\n return (\n <div className={avatarClasses} style={style} {...rest}>\n <div className={innerClasses}>\n <div className=\"bg-neutral-focus text-neutral-content w-full h-full\" />\n </div>\n </div>\n )\n}\n\nfunction AvatarGroup({ children, max, size, className = '', style, ...rest }: AvatarGroupProps) {\n const avatars = React.Children.toArray(children)\n const displayAvatars = max ? avatars.slice(0, max) : avatars\n const remainingCount = max && avatars.length > max ? avatars.length - max : 0\n\n const sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-8',\n sm: 'w-12',\n md: 'w-16',\n lg: 'w-20',\n xl: 'w-24',\n }\n\n return (\n <div className={`${dAvatarGroup} -space-x-6 rtl:space-x-reverse ${className}`} style={style} {...rest}>\n {displayAvatars}\n {remainingCount > 0 && (\n <div className={`${dAvatar} ${dAvatarPlaceholder}`}>\n <div className={`bg-neutral text-neutral-content rounded-full ${size ? sizeClasses[size] : 'w-12'}`}>\n <span>+{remainingCount}</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport const Avatar = Object.assign(AvatarRoot, {\n Group: AvatarGroup,\n})\n\nexport { AvatarGroup }\n\nexport default Avatar\n"],"names":["dAvatar","dAvatarOnline","dAvatarOffline","dAvatarPlaceholder","dAvatarGroup","AvatarRoot","src","alt","icon","children","size","shape","status","className","style","online","offline","placeholder","rest","sizeClasses","shapeClasses","resolvedStatus","avatarClasses","innerClasses","jsx","content","AvatarGroup","max","avatars","React","displayAvatars","remainingCount","jsxs","Avatar"],"mappings":"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"}
@@ -16,6 +16,7 @@ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {
16
16
  items?: BreadcrumbItemType[];
17
17
  /** Custom separator between items */
18
18
  separator?: React.ReactNode;
19
+ 'data-testid'?: string;
19
20
  }
20
21
  export interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'onClick'> {
21
22
  children: React.ReactNode;
@@ -23,9 +24,10 @@ export interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIE
23
24
  onClick?: () => void;
24
25
  /** Icon to display before the label */
25
26
  icon?: React.ReactNode;
27
+ 'data-testid'?: string;
26
28
  }
27
- declare function BreadcrumbRoot({ children, items, separator, className, ...rest }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
28
- declare function BreadcrumbItem({ children, href, onClick, icon, className, ...rest }: BreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
29
+ declare function BreadcrumbRoot({ children, items, separator, className, 'data-testid': testId, ...rest }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
30
+ declare function BreadcrumbItem({ children, href, onClick, icon, className, 'data-testid': testId, ...rest }: BreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
29
31
  export declare const Breadcrumb: typeof BreadcrumbRoot & {
30
32
  Item: typeof BreadcrumbItem;
31
33
  };
@@ -1,37 +1,62 @@
1
- import { jsx as n, jsxs as m } from "react/jsx-runtime";
2
- import u from "react";
3
- const f = "d-breadcrumbs";
4
- function g({ children: c, items: r, separator: t, className: o = "", ...i }) {
5
- const s = t !== void 0, a = typeof t == "string" ? "px-2" : "px-1", p = () => !r || r.length === 0 ? null : r.map((e, l) => {
6
- const d = l === r.length - 1;
7
- return /* @__PURE__ */ m(u.Fragment, { children: [
8
- /* @__PURE__ */ n("li", { className: e.className, children: e.href || e.onClick ? /* @__PURE__ */ n("a", { href: e.href, onClick: e.onClick, children: e.title }) : e.title }),
9
- s && !d && /* @__PURE__ */ n("li", { className: `flex items-center ${a} text-base-content/50`, children: t })
10
- ] }, l);
11
- }), b = () => {
1
+ import { jsx as a, jsxs as $ } from "react/jsx-runtime";
2
+ import m from "react";
3
+ const p = "d-breadcrumbs";
4
+ function C({ children: s, items: r, separator: n, className: l = "", "data-testid": c, ...d }) {
5
+ const i = n !== void 0, o = typeof n == "string" ? "px-2" : "px-1", h = (t) => c ? `${c}-${t}` : void 0, b = () => !r || r.length === 0 ? null : r.map((t, e) => {
6
+ const u = e === r.length - 1;
7
+ return /* @__PURE__ */ $(m.Fragment, { children: [
8
+ /* @__PURE__ */ a(
9
+ "li",
10
+ {
11
+ className: t.className,
12
+ "aria-current": u ? "page" : void 0,
13
+ "data-testid": h(`item-${t.href ?? e}`),
14
+ children: t.href || t.onClick ? /* @__PURE__ */ a("a", { href: t.href, onClick: t.onClick, "data-testid": h(`link-${t.href ?? e}`), children: t.title }) : t.title
15
+ }
16
+ ),
17
+ i && !u && /* @__PURE__ */ a(
18
+ "li",
19
+ {
20
+ className: `flex items-center ${o} text-base-content/50`,
21
+ "aria-hidden": "true",
22
+ "data-testid": h(`separator-${e}`),
23
+ children: n
24
+ }
25
+ )
26
+ ] }, e);
27
+ }), g = () => {
12
28
  if (r && r.length > 0)
13
- return p();
14
- if (s && c) {
15
- const e = u.Children.toArray(c), l = [];
16
- return e.forEach((d, h) => {
17
- l.push(d), h < e.length - 1 && l.push(
18
- /* @__PURE__ */ n("li", { className: `flex items-center ${a} text-base-content/50`, children: t }, `sep-${h}`)
29
+ return b();
30
+ if (i && s) {
31
+ const t = m.Children.toArray(s), e = [];
32
+ return t.forEach((u, f) => {
33
+ e.push(u), f < t.length - 1 && e.push(
34
+ /* @__PURE__ */ a(
35
+ "li",
36
+ {
37
+ className: `flex items-center ${o} text-base-content/50`,
38
+ "aria-hidden": "true",
39
+ "data-testid": h(`separator-${f}`),
40
+ children: n
41
+ },
42
+ `sep-${f}`
43
+ )
19
44
  );
20
- }), l;
45
+ }), e;
21
46
  }
22
- return c;
23
- }, x = s ? `${f} text-sm [&_li::before]:!hidden ${o}` : `${f} text-sm ${o}`;
24
- return /* @__PURE__ */ n("div", { className: x, ...i, children: /* @__PURE__ */ n("ul", { children: b() }) });
47
+ return s;
48
+ }, x = i ? `${p} text-sm [&_li::before]:!hidden ${l}` : `${p} text-sm ${l}`;
49
+ return /* @__PURE__ */ a("nav", { className: x, "aria-label": "Breadcrumb", "data-testid": c, ...d, children: /* @__PURE__ */ a("ul", { children: g() }) });
25
50
  }
26
- function $({ children: c, href: r, onClick: t, icon: o, className: i = "", ...s }) {
27
- const a = o ? /* @__PURE__ */ m("span", { className: "inline-flex items-center gap-2", children: [
28
- o,
29
- c
30
- ] }) : c;
31
- return r || t ? /* @__PURE__ */ n("li", { className: i, ...s, children: /* @__PURE__ */ n("a", { href: r, onClick: t, children: a }) }) : /* @__PURE__ */ n("li", { className: i, ...s, children: a });
51
+ function v({ children: s, href: r, onClick: n, icon: l, className: c = "", "data-testid": d, ...i }) {
52
+ const o = l ? /* @__PURE__ */ $("span", { className: "inline-flex items-center gap-2", children: [
53
+ l,
54
+ s
55
+ ] }) : s;
56
+ return r || n ? /* @__PURE__ */ a("li", { className: c, "data-testid": d, ...i, children: /* @__PURE__ */ a("a", { href: r, onClick: n, "data-testid": d ? `${d}-link` : void 0, children: o }) }) : /* @__PURE__ */ a("li", { className: c, "data-testid": d, ...i, children: o });
32
57
  }
33
- const N = Object.assign(g, {
34
- Item: $
58
+ const N = Object.assign(C, {
59
+ Item: v
35
60
  });
36
61
  export {
37
62
  N as Breadcrumb
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","sources":["../../src/components/Breadcrumb.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dBreadcrumbs = 'd-breadcrumbs'\n\nexport interface BreadcrumbItemType {\n /** Item title/label */\n title: React.ReactNode\n /** Link URL */\n href?: string\n /** Click handler */\n onClick?: () => void\n /** Custom class name */\n className?: string\n}\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Breadcrumb.Item children (compound pattern) */\n children?: React.ReactNode\n /** Breadcrumb items data (data-driven pattern) */\n items?: BreadcrumbItemType[]\n /** Custom separator between items */\n separator?: React.ReactNode\n}\n\nexport interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'onClick'> {\n children: React.ReactNode\n href?: string\n onClick?: () => void\n /** Icon to display before the label */\n icon?: React.ReactNode\n}\n\nfunction BreadcrumbRoot({ children, items, separator, className = '', ...rest }: BreadcrumbProps) {\n const hasCustomSeparator = separator !== undefined\n // Text separators need more padding than icon separators\n const separatorPadding = typeof separator === 'string' ? 'px-2' : 'px-1'\n\n const renderFromItems = () => {\n if (!items || items.length === 0) return null\n\n return items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <li className={item.className}>\n {item.href || item.onClick ? (\n <a href={item.href} onClick={item.onClick}>\n {item.title}\n </a>\n ) : (\n item.title\n )}\n </li>\n {hasCustomSeparator && !isLast && (\n <li className={`flex items-center ${separatorPadding} text-base-content/50`}>\n {separator}\n </li>\n )}\n </React.Fragment>\n )\n })\n }\n\n const renderChildren = () => {\n if (items && items.length > 0) {\n return renderFromItems()\n }\n\n if (hasCustomSeparator && children) {\n // Insert custom separator nodes between children\n const childArray = React.Children.toArray(children)\n const result: React.ReactNode[] = []\n childArray.forEach((child, index) => {\n result.push(child)\n if (index < childArray.length - 1) {\n result.push(\n <li key={`sep-${index}`} className={`flex items-center ${separatorPadding} text-base-content/50`}>\n {separator}\n </li>\n )\n }\n })\n return result\n }\n\n return children\n }\n\n // When custom separator is provided, hide default DaisyUI separator\n const cssClass = hasCustomSeparator\n ? `${dBreadcrumbs} text-sm [&_li::before]:!hidden ${className}`\n : `${dBreadcrumbs} text-sm ${className}`\n\n return (\n <div className={cssClass} {...rest}>\n <ul>{renderChildren()}</ul>\n </div>\n )\n}\n\nfunction BreadcrumbItem({ children, href, onClick, icon, className = '', ...rest }: BreadcrumbItemProps) {\n const content = icon ? (\n <span className=\"inline-flex items-center gap-2\">\n {icon}\n {children}\n </span>\n ) : children\n\n if (href || onClick) {\n return (\n <li className={className} {...rest}>\n <a href={href} onClick={onClick}>\n {content}\n </a>\n </li>\n )\n }\n\n return <li className={className} {...rest}>{content}</li>\n}\n\nexport const Breadcrumb = Object.assign(BreadcrumbRoot, {\n Item: BreadcrumbItem,\n})\n"],"names":["dBreadcrumbs","BreadcrumbRoot","children","items","separator","className","rest","hasCustomSeparator","separatorPadding","renderFromItems","item","index","isLast","jsxs","React","jsx","renderChildren","childArray","result","child","cssClass","BreadcrumbItem","href","onClick","icon","content","Breadcrumb"],"mappings":";;AAGA,MAAMA,IAAe;AA8BrB,SAASC,EAAe,EAAE,UAAAC,GAAU,OAAAC,GAAO,WAAAC,GAAW,WAAAC,IAAY,IAAI,GAAGC,KAAyB;AAChG,QAAMC,IAAqBH,MAAc,QAEnCI,IAAmB,OAAOJ,KAAc,WAAW,SAAS,QAE5DK,IAAkB,MAClB,CAACN,KAASA,EAAM,WAAW,IAAU,OAElCA,EAAM,IAAI,CAACO,GAAMC,MAAU;AAChC,UAAMC,IAASD,MAAUR,EAAM,SAAS;AACxC,WACE,gBAAAU,EAACC,EAAM,UAAN,EACC,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAWL,EAAK,WACjB,YAAK,QAAQA,EAAK,UACjB,gBAAAK,EAAC,KAAA,EAAE,MAAML,EAAK,MAAM,SAASA,EAAK,SAC/B,YAAK,MAAA,CACR,IAEAA,EAAK,MAAA,CAET;AAAA,MACCH,KAAsB,CAACK,KACtB,gBAAAG,EAAC,QAAG,WAAW,qBAAqBP,CAAgB,yBACjD,UAAAJ,EAAA,CACH;AAAA,IAAA,EAAA,GAbiBO,CAerB;AAAA,EAEJ,CAAC,GAGGK,IAAiB,MAAM;AAC3B,QAAIb,KAASA,EAAM,SAAS;AAC1B,aAAOM,EAAA;AAGT,QAAIF,KAAsBL,GAAU;AAElC,YAAMe,IAAaH,EAAM,SAAS,QAAQZ,CAAQ,GAC5CgB,IAA4B,CAAA;AAClC,aAAAD,EAAW,QAAQ,CAACE,GAAOR,MAAU;AACnC,QAAAO,EAAO,KAAKC,CAAK,GACbR,IAAQM,EAAW,SAAS,KAC9BC,EAAO;AAAA,UACL,gBAAAH,EAAC,QAAwB,WAAW,qBAAqBP,CAAgB,yBACtE,UAAAJ,EAAA,GADM,OAAOO,CAAK,EAErB;AAAA,QAAA;AAAA,MAGN,CAAC,GACMO;AAAA,IACT;AAEA,WAAOhB;AAAA,EACT,GAGMkB,IAAWb,IACb,GAAGP,CAAY,mCAAmCK,CAAS,KAC3D,GAAGL,CAAY,YAAYK,CAAS;AAExC,SACE,gBAAAU,EAAC,OAAA,EAAI,WAAWK,GAAW,GAAGd,GAC5B,UAAA,gBAAAS,EAAC,MAAA,EAAI,UAAAC,EAAA,EAAe,CAAE,EAAA,CACxB;AAEJ;AAEA,SAASK,EAAe,EAAE,UAAAnB,GAAU,MAAAoB,GAAM,SAAAC,GAAS,MAAAC,GAAM,WAAAnB,IAAY,IAAI,GAAGC,KAA6B;AACvG,QAAMmB,IAAUD,IACd,gBAAAX,EAAC,QAAA,EAAK,WAAU,kCACb,UAAA;AAAA,IAAAW;AAAA,IACAtB;AAAA,EAAA,EAAA,CACH,IACEA;AAEJ,SAAIoB,KAAQC,IAER,gBAAAR,EAAC,MAAA,EAAG,WAAAV,GAAuB,GAAGC,GAC5B,4BAAC,KAAA,EAAE,MAAAgB,GAAY,SAAAC,GACZ,UAAAE,EAAA,CACH,EAAA,CACF,IAIG,gBAAAV,EAAC,MAAA,EAAG,WAAAV,GAAuB,GAAGC,GAAO,UAAAmB,GAAQ;AACtD;AAEO,MAAMC,IAAa,OAAO,OAAOzB,GAAgB;AAAA,EACtD,MAAMoB;AACR,CAAC;"}
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../src/components/Breadcrumb.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dBreadcrumbs = 'd-breadcrumbs'\n\nexport interface BreadcrumbItemType {\n /** Item title/label */\n title: React.ReactNode\n /** Link URL */\n href?: string\n /** Click handler */\n onClick?: () => void\n /** Custom class name */\n className?: string\n}\n\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Breadcrumb.Item children (compound pattern) */\n children?: React.ReactNode\n /** Breadcrumb items data (data-driven pattern) */\n items?: BreadcrumbItemType[]\n /** Custom separator between items */\n separator?: React.ReactNode\n 'data-testid'?: string\n}\n\nexport interface BreadcrumbItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'onClick'> {\n children: React.ReactNode\n href?: string\n onClick?: () => void\n /** Icon to display before the label */\n icon?: React.ReactNode\n 'data-testid'?: string\n}\n\nfunction BreadcrumbRoot({ children, items, separator, className = '', 'data-testid': testId, ...rest }: BreadcrumbProps) {\n const hasCustomSeparator = separator !== undefined\n // Text separators need more padding than icon separators\n const separatorPadding = typeof separator === 'string' ? 'px-2' : 'px-1'\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n const renderFromItems = () => {\n if (!items || items.length === 0) return null\n\n return items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <li\n className={item.className}\n aria-current={isLast ? 'page' : undefined}\n data-testid={getTestId(`item-${item.href ?? index}`)}\n >\n {item.href || item.onClick ? (\n <a href={item.href} onClick={item.onClick} data-testid={getTestId(`link-${item.href ?? index}`)}>\n {item.title}\n </a>\n ) : (\n item.title\n )}\n </li>\n {hasCustomSeparator && !isLast && (\n <li\n className={`flex items-center ${separatorPadding} text-base-content/50`}\n aria-hidden=\"true\"\n data-testid={getTestId(`separator-${index}`)}\n >\n {separator}\n </li>\n )}\n </React.Fragment>\n )\n })\n }\n\n const renderChildren = () => {\n if (items && items.length > 0) {\n return renderFromItems()\n }\n\n if (hasCustomSeparator && children) {\n // Insert custom separator nodes between children\n const childArray = React.Children.toArray(children)\n const result: React.ReactNode[] = []\n childArray.forEach((child, index) => {\n result.push(child)\n if (index < childArray.length - 1) {\n result.push(\n <li\n key={`sep-${index}`}\n className={`flex items-center ${separatorPadding} text-base-content/50`}\n aria-hidden=\"true\"\n data-testid={getTestId(`separator-${index}`)}\n >\n {separator}\n </li>\n )\n }\n })\n return result\n }\n\n return children\n }\n\n // When custom separator is provided, hide default DaisyUI separator\n const cssClass = hasCustomSeparator\n ? `${dBreadcrumbs} text-sm [&_li::before]:!hidden ${className}`\n : `${dBreadcrumbs} text-sm ${className}`\n\n return (\n <nav className={cssClass} aria-label=\"Breadcrumb\" data-testid={testId} {...rest}>\n <ul>{renderChildren()}</ul>\n </nav>\n )\n}\n\nfunction BreadcrumbItem({ children, href, onClick, icon, className = '', 'data-testid': testId, ...rest }: BreadcrumbItemProps) {\n const content = icon ? (\n <span className=\"inline-flex items-center gap-2\">\n {icon}\n {children}\n </span>\n ) : children\n\n if (href || onClick) {\n return (\n <li className={className} data-testid={testId} {...rest}>\n <a href={href} onClick={onClick} data-testid={testId ? `${testId}-link` : undefined}>\n {content}\n </a>\n </li>\n )\n }\n\n return <li className={className} data-testid={testId} {...rest}>{content}</li>\n}\n\nexport const Breadcrumb = Object.assign(BreadcrumbRoot, {\n Item: BreadcrumbItem,\n})\n"],"names":["dBreadcrumbs","BreadcrumbRoot","children","items","separator","className","testId","rest","hasCustomSeparator","separatorPadding","getTestId","suffix","renderFromItems","item","index","isLast","jsxs","React","jsx","renderChildren","childArray","result","child","cssClass","BreadcrumbItem","href","onClick","icon","content","Breadcrumb"],"mappings":"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"}