asterui 0.12.49 → 0.12.51

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 (196) hide show
  1. package/dist/components/Alert.js +18 -18
  2. package/dist/components/Alert.js.map +1 -1
  3. package/dist/components/Autocomplete.js +115 -114
  4. package/dist/components/Autocomplete.js.map +1 -1
  5. package/dist/components/Avatar.js +33 -32
  6. package/dist/components/Avatar.js.map +1 -1
  7. package/dist/components/Badge.js +99 -99
  8. package/dist/components/Badge.js.map +1 -1
  9. package/dist/components/Breadcrumb.js +12 -11
  10. package/dist/components/Breadcrumb.js.map +1 -1
  11. package/dist/components/Browser.js +10 -10
  12. package/dist/components/Browser.js.map +1 -1
  13. package/dist/components/Button.js +80 -79
  14. package/dist/components/Button.js.map +1 -1
  15. package/dist/components/Card.d.ts +2 -0
  16. package/dist/components/Card.js +111 -110
  17. package/dist/components/Card.js.map +1 -1
  18. package/dist/components/Carousel.js +59 -59
  19. package/dist/components/Carousel.js.map +1 -1
  20. package/dist/components/Cascader.js +175 -174
  21. package/dist/components/Cascader.js.map +1 -1
  22. package/dist/components/Chat.js +27 -27
  23. package/dist/components/Chat.js.map +1 -1
  24. package/dist/components/Checkbox.js +98 -97
  25. package/dist/components/Checkbox.js.map +1 -1
  26. package/dist/components/Code.js +11 -11
  27. package/dist/components/Code.js.map +1 -1
  28. package/dist/components/Collapse.js +46 -46
  29. package/dist/components/Collapse.js.map +1 -1
  30. package/dist/components/ColorPicker.d.ts +1 -1
  31. package/dist/components/ColorPicker.js +93 -91
  32. package/dist/components/ColorPicker.js.map +1 -1
  33. package/dist/components/Command.js +120 -120
  34. package/dist/components/Command.js.map +1 -1
  35. package/dist/components/ConfigProvider.d.ts +1 -1
  36. package/dist/components/ConfigProvider.js +9 -9
  37. package/dist/components/ConfigProvider.js.map +1 -1
  38. package/dist/components/ContextMenu.js +33 -33
  39. package/dist/components/ContextMenu.js.map +1 -1
  40. package/dist/components/CopyButton.js +74 -73
  41. package/dist/components/CopyButton.js.map +1 -1
  42. package/dist/components/Countdown.js +60 -59
  43. package/dist/components/Countdown.js.map +1 -1
  44. package/dist/components/DatePicker.d.ts +1 -1
  45. package/dist/components/DatePicker.js +54 -53
  46. package/dist/components/DatePicker.js.map +1 -1
  47. package/dist/components/Diff.js +10 -10
  48. package/dist/components/Diff.js.map +1 -1
  49. package/dist/components/Divider.js +21 -20
  50. package/dist/components/Divider.js.map +1 -1
  51. package/dist/components/Dock.js +28 -27
  52. package/dist/components/Dock.js.map +1 -1
  53. package/dist/components/Drawer.js +43 -43
  54. package/dist/components/Drawer.js.map +1 -1
  55. package/dist/components/Dropdown.js +127 -127
  56. package/dist/components/Dropdown.js.map +1 -1
  57. package/dist/components/Empty.js +16 -15
  58. package/dist/components/Empty.js.map +1 -1
  59. package/dist/components/Fieldset.js +11 -10
  60. package/dist/components/Fieldset.js.map +1 -1
  61. package/dist/components/FileInput.js +30 -29
  62. package/dist/components/FileInput.js.map +1 -1
  63. package/dist/components/Filter.d.ts +1 -1
  64. package/dist/components/Filter.js +32 -30
  65. package/dist/components/Filter.js.map +1 -1
  66. package/dist/components/FloatButton.js +83 -83
  67. package/dist/components/FloatButton.js.map +1 -1
  68. package/dist/components/Footer.js +14 -13
  69. package/dist/components/Footer.js.map +1 -1
  70. package/dist/components/Form.js +133 -132
  71. package/dist/components/Form.js.map +1 -1
  72. package/dist/components/Hero.js +12 -11
  73. package/dist/components/Hero.js.map +1 -1
  74. package/dist/components/HoverGallery.js +7 -7
  75. package/dist/components/HoverGallery.js.map +1 -1
  76. package/dist/components/Image.js +40 -40
  77. package/dist/components/Image.js.map +1 -1
  78. package/dist/components/Input.js +171 -169
  79. package/dist/components/Input.js.map +1 -1
  80. package/dist/components/InputNumber.js +84 -83
  81. package/dist/components/InputNumber.js.map +1 -1
  82. package/dist/components/Join.js +11 -10
  83. package/dist/components/Join.js.map +1 -1
  84. package/dist/components/Kbd.js +15 -15
  85. package/dist/components/Kbd.js.map +1 -1
  86. package/dist/components/List.d.ts +1 -1
  87. package/dist/components/List.js +75 -72
  88. package/dist/components/List.js.map +1 -1
  89. package/dist/components/Loading.d.ts +1 -1
  90. package/dist/components/Loading.js +31 -29
  91. package/dist/components/Loading.js.map +1 -1
  92. package/dist/components/Mask.js +31 -31
  93. package/dist/components/Mask.js.map +1 -1
  94. package/dist/components/Mention.js +61 -61
  95. package/dist/components/Mention.js.map +1 -1
  96. package/dist/components/Menu.js +84 -84
  97. package/dist/components/Menu.js.map +1 -1
  98. package/dist/components/Message.js +30 -29
  99. package/dist/components/Message.js.map +1 -1
  100. package/dist/components/Modal.js +117 -116
  101. package/dist/components/Modal.js.map +1 -1
  102. package/dist/components/MonthCalendar.d.ts +31 -0
  103. package/dist/components/MonthCalendar.js +205 -0
  104. package/dist/components/MonthCalendar.js.map +1 -0
  105. package/dist/components/Navbar.js +25 -25
  106. package/dist/components/Navbar.js.map +1 -1
  107. package/dist/components/Notification.js +56 -55
  108. package/dist/components/Notification.js.map +1 -1
  109. package/dist/components/OTPInput.js +69 -68
  110. package/dist/components/OTPInput.js.map +1 -1
  111. package/dist/components/Pagination.d.ts +1 -1
  112. package/dist/components/Pagination.js +60 -58
  113. package/dist/components/Pagination.js.map +1 -1
  114. package/dist/components/Phone.js +10 -10
  115. package/dist/components/Phone.js.map +1 -1
  116. package/dist/components/Popconfirm.js +60 -60
  117. package/dist/components/Popconfirm.js.map +1 -1
  118. package/dist/components/Progress.js +17 -17
  119. package/dist/components/Progress.js.map +1 -1
  120. package/dist/components/QRCode.js +23 -23
  121. package/dist/components/QRCode.js.map +1 -1
  122. package/dist/components/RadialProgress.js +17 -17
  123. package/dist/components/RadialProgress.js.map +1 -1
  124. package/dist/components/Radio.js +41 -40
  125. package/dist/components/Radio.js.map +1 -1
  126. package/dist/components/Range.d.ts +1 -1
  127. package/dist/components/Range.js +39 -37
  128. package/dist/components/Range.js.map +1 -1
  129. package/dist/components/Rating.js +79 -78
  130. package/dist/components/Rating.js.map +1 -1
  131. package/dist/components/ResponsiveDrawer.js +27 -27
  132. package/dist/components/ResponsiveDrawer.js.map +1 -1
  133. package/dist/components/RichTextEditor.d.ts +32 -0
  134. package/dist/components/RichTextEditor.js +335 -0
  135. package/dist/components/RichTextEditor.js.map +1 -0
  136. package/dist/components/Segmented.d.ts +1 -1
  137. package/dist/components/Segmented.js +48 -46
  138. package/dist/components/Segmented.js.map +1 -1
  139. package/dist/components/Select.js +55 -54
  140. package/dist/components/Select.js.map +1 -1
  141. package/dist/components/Skeleton.js +9 -9
  142. package/dist/components/Skeleton.js.map +1 -1
  143. package/dist/components/Splitter.js +1 -3
  144. package/dist/components/Splitter.js.map +1 -1
  145. package/dist/components/Stat.js +17 -16
  146. package/dist/components/Stat.js.map +1 -1
  147. package/dist/components/Status.js +29 -29
  148. package/dist/components/Status.js.map +1 -1
  149. package/dist/components/Steps.js +61 -61
  150. package/dist/components/Steps.js.map +1 -1
  151. package/dist/components/Table.js +256 -256
  152. package/dist/components/Table.js.map +1 -1
  153. package/dist/components/Tabs.js +65 -65
  154. package/dist/components/Tabs.js.map +1 -1
  155. package/dist/components/Tag.js +147 -147
  156. package/dist/components/Tag.js.map +1 -1
  157. package/dist/components/TextRotate.js +6 -6
  158. package/dist/components/TextRotate.js.map +1 -1
  159. package/dist/components/Textarea.js +35 -34
  160. package/dist/components/Textarea.js.map +1 -1
  161. package/dist/components/ThemeController.d.ts +1 -1
  162. package/dist/components/ThemeController.js +71 -68
  163. package/dist/components/ThemeController.js.map +1 -1
  164. package/dist/components/TimePicker.d.ts +1 -1
  165. package/dist/components/TimePicker.js +133 -129
  166. package/dist/components/TimePicker.js.map +1 -1
  167. package/dist/components/Timeline.js +79 -79
  168. package/dist/components/Timeline.js.map +1 -1
  169. package/dist/components/Toggle.js +33 -32
  170. package/dist/components/Toggle.js.map +1 -1
  171. package/dist/components/Tooltip.js +25 -25
  172. package/dist/components/Tooltip.js.map +1 -1
  173. package/dist/components/Tour.js +126 -126
  174. package/dist/components/Tour.js.map +1 -1
  175. package/dist/components/Transfer.js +93 -92
  176. package/dist/components/Transfer.js.map +1 -1
  177. package/dist/components/Tree.js +200 -200
  178. package/dist/components/Tree.js.map +1 -1
  179. package/dist/components/TreeSelect.js +255 -254
  180. package/dist/components/TreeSelect.js.map +1 -1
  181. package/dist/components/Typography.js +71 -70
  182. package/dist/components/Typography.js.map +1 -1
  183. package/dist/components/Upload.js +81 -81
  184. package/dist/components/Upload.js.map +1 -1
  185. package/dist/components/WeekCalendar.d.ts +35 -0
  186. package/dist/components/WeekCalendar.js +204 -0
  187. package/dist/components/WeekCalendar.js.map +1 -0
  188. package/dist/components/Window.js +7 -7
  189. package/dist/components/Window.js.map +1 -1
  190. package/dist/editor.d.ts +1 -0
  191. package/dist/editor.js +5 -0
  192. package/dist/editor.js.map +1 -0
  193. package/dist/index.d.ts +4 -0
  194. package/dist/index.js +211 -207
  195. package/dist/index.js.map +1 -1
  196. package/package.json +30 -1
@@ -1,31 +1,31 @@
1
1
  import { jsx as i } from "react/jsx-runtime";
2
- const m = ({
3
- children: r,
4
- className: s = "",
2
+ const d = "alert", f = "alert-info", A = "alert-success", u = "alert-warning", g = "alert-error", m = "alert-outline", p = "alert-dash", h = "alert-soft", j = "alert-vertical", x = ({
3
+ children: t,
4
+ className: r = "",
5
5
  type: e,
6
- outline: a = !1,
6
+ outline: s = !1,
7
7
  dash: l = !1,
8
- soft: t = !1,
9
- vertical: o = !1,
8
+ soft: o = !1,
9
+ vertical: a = !1,
10
10
  ...n
11
11
  }) => {
12
12
  const c = [
13
- "alert",
13
+ d,
14
14
  e && {
15
- info: "alert-info",
16
- success: "alert-success",
17
- warning: "alert-warning",
18
- error: "alert-error"
15
+ info: f,
16
+ success: A,
17
+ warning: u,
18
+ error: g
19
19
  }[e],
20
- a && "alert-outline",
21
- l && "alert-dash",
22
- t && "alert-soft",
23
- o && "alert-vertical",
24
- s
20
+ s && m,
21
+ l && p,
22
+ o && h,
23
+ a && j,
24
+ r
25
25
  ].filter(Boolean).join(" ");
26
- return /* @__PURE__ */ i("div", { role: "alert", className: c, ...n, children: r });
26
+ return /* @__PURE__ */ i("div", { role: "alert", className: c, ...n, children: t });
27
27
  };
28
28
  export {
29
- m as Alert
29
+ x as Alert
30
30
  };
31
31
  //# sourceMappingURL=Alert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.js","sources":["../../src/components/Alert.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n type?: 'info' | 'success' | 'warning' | 'error'\n outline?: boolean\n dash?: boolean\n soft?: boolean\n vertical?: boolean\n}\n\nexport const Alert: React.FC<AlertProps> = ({\n children,\n className = '',\n type,\n outline = false,\n dash = false,\n soft = false,\n vertical = false,\n ...rest\n}) => {\n const typeClasses = {\n info: 'alert-info',\n success: 'alert-success',\n warning: 'alert-warning',\n error: 'alert-error',\n }\n\n const classes = [\n 'alert',\n type && typeClasses[type],\n outline && 'alert-outline',\n dash && 'alert-dash',\n soft && 'alert-soft',\n vertical && 'alert-vertical',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div role=\"alert\" className={classes} {...rest}>\n {children}\n </div>\n )\n}\n"],"names":["Alert","children","className","type","outline","dash","soft","vertical","rest","classes","jsx"],"mappings":";AAWO,MAAMA,IAA8B,CAAC;AAAA,EAC1C,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,GAAGC;AACL,MAAM;AAQJ,QAAMC,IAAU;AAAA,IACd;AAAA,IACAN,KATkB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,IAAA,EAKaA,CAAI;AAAA,IACxBC,KAAW;AAAA,IACXC,KAAQ;AAAA,IACRC,KAAQ;AAAA,IACRC,KAAY;AAAA,IACZL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAQ,EAAC,SAAI,MAAK,SAAQ,WAAWD,GAAU,GAAGD,GACvC,UAAAP,GACH;AAEJ;"}
1
+ {"version":3,"file":"Alert.js","sources":["../../src/components/Alert.tsx"],"sourcesContent":["import React from 'react'\n\n// DaisyUI classes\nconst dAlert = 'alert'\nconst dAlertInfo = 'alert-info'\nconst dAlertSuccess = 'alert-success'\nconst dAlertWarning = 'alert-warning'\nconst dAlertError = 'alert-error'\nconst dAlertOutline = 'alert-outline'\nconst dAlertDash = 'alert-dash'\nconst dAlertSoft = 'alert-soft'\nconst dAlertVertical = 'alert-vertical'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n type?: 'info' | 'success' | 'warning' | 'error'\n outline?: boolean\n dash?: boolean\n soft?: boolean\n vertical?: boolean\n}\n\nexport const Alert: React.FC<AlertProps> = ({\n children,\n className = '',\n type,\n outline = false,\n dash = false,\n soft = false,\n vertical = false,\n ...rest\n}) => {\n const typeClasses = {\n info: dAlertInfo,\n success: dAlertSuccess,\n warning: dAlertWarning,\n error: dAlertError,\n }\n\n const classes = [\n dAlert,\n type && typeClasses[type],\n outline && dAlertOutline,\n dash && dAlertDash,\n soft && dAlertSoft,\n vertical && dAlertVertical,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div role=\"alert\" className={classes} {...rest}>\n {children}\n </div>\n )\n}\n"],"names":["dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","dAlertOutline","dAlertDash","dAlertSoft","dAlertVertical","Alert","children","className","type","outline","dash","soft","vertical","rest","classes","jsx"],"mappings":";AAGA,MAAMA,IAAS,SACTC,IAAa,cACbC,IAAgB,iBAChBC,IAAgB,iBAChBC,IAAc,eACdC,IAAgB,iBAChBC,IAAa,cACbC,IAAa,cACbC,IAAiB,kBAWVC,IAA8B,CAAC;AAAA,EAC1C,UAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,GAAGC;AACL,MAAM;AAQJ,QAAMC,IAAU;AAAA,IACdlB;AAAA,IACAY,KATkB;AAAA,MAClB,MAAMX;AAAA,MACN,SAASC;AAAA,MACT,SAASC;AAAA,MACT,OAAOC;AAAA,IAAA,EAKaQ,CAAI;AAAA,IACxBC,KAAWR;AAAA,IACXS,KAAQR;AAAA,IACRS,KAAQR;AAAA,IACRS,KAAYR;AAAA,IACZG;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAQ,EAAC,SAAI,MAAK,SAAQ,WAAWD,GAAU,GAAGD,GACvC,UAAAP,GACH;AAEJ;"}
@@ -1,178 +1,179 @@
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(
1
+ import { jsxs as M, jsx as o } from "react/jsx-runtime";
2
+ import { useId as de, useState as k, useRef as O, useEffect as z } from "react";
3
+ import { useConfig as ue } from "./ConfigProvider.js";
4
+ const pe = "dropdown", fe = "dropdown-bottom", he = "dropdown-open", be = "dropdown-content", me = "menu", Ie = "input", ge = "input-xs", we = "input-sm", xe = "input-md", ye = "input-lg", ve = "input-xl", Ce = "input-neutral", ke = "input-primary", De = "input-secondary", Ne = "input-accent", $e = "input-info", je = "input-success", A = "input-warning", R = "input-error", Ee = ({ onClick: l, className: I }) => /* @__PURE__ */ o(
4
5
  "button",
5
6
  {
6
7
  type: "button",
7
- onClick: o,
8
- className: `flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${g || ""}`,
8
+ onClick: l,
9
+ className: `flex items-center justify-center opacity-50 hover:opacity-100 transition-opacity ${I || ""}`,
9
10
  "aria-label": "Clear input",
10
11
  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
+ 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" }) })
12
13
  }
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...",
14
+ ), ze = ({
15
+ value: l,
16
+ defaultValue: I = "",
17
+ onChange: g,
18
+ onSelect: T,
19
+ onSearch: V,
20
+ options: K,
21
+ placeholder: P = "Type to search...",
21
22
  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",
23
+ size: U,
24
+ color: D,
25
+ status: w,
26
+ className: W = "",
27
+ allowCustomValue: N = !0,
28
+ filterOption: $,
29
+ notFoundContent: X = "No results found",
29
30
  allowClear: f,
30
- onClear: H,
31
- open: $,
32
- defaultOpen: P = !1,
33
- onOpenChange: W,
34
- defaultActiveFirstOption: v = !0,
35
- ...q
31
+ onClear: F,
32
+ open: j,
33
+ defaultOpen: H = !1,
34
+ onOpenChange: q,
35
+ defaultActiveFirstOption: x = !0,
36
+ ...G
36
37
  }) => {
37
- const y = le(), G = `${y}-input`, E = `${y}-listbox`, I = V.map(
38
+ const { componentSize: J } = ue(), Q = U ?? J ?? "md", y = de(), Y = `${y}-input`, E = `${y}-listbox`, v = K.map(
38
39
  (e) => typeof e == "string" ? { value: e, label: e } : e
39
- ), [h, b] = 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);
40
+ ), [h, b] = k(I), [Z, _] = k(H), [t, r] = k(-1), m = O(null), i = O(null), S = j !== void 0, d = S ? j : Z, c = (e) => {
41
+ S || _(e), q?.(e);
41
42
  };
42
- A(() => {
43
- if (o !== void 0) {
44
- const e = I.find((t) => t.value === o);
45
- b(e?.label || o);
43
+ z(() => {
44
+ if (l !== void 0) {
45
+ const e = v.find((n) => n.value === l);
46
+ b(e?.label || l);
46
47
  }
47
- }, [o, I]);
48
- const X = (e, t) => e.label.toLowerCase().includes(t.toLowerCase()), l = I.filter(
49
- (e) => j ? j(e, h) : X(e, h)
50
- ), d = l.filter((e) => !e.disabled), Y = (e) => {
51
- const t = e.target.value;
52
- b(t), i(!0), v && d.length > 0 ? a(0) : a(-1), T?.(t), D && w?.(t);
53
- }, k = (e) => {
54
- e.disabled || (b(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);
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) => {
57
+ if (!d && (e.key === "ArrowDown" || e.key === "ArrowUp")) {
58
+ c(!0), x && u.length > 0 && r(0);
58
59
  return;
59
60
  }
60
61
  switch (e.key) {
61
62
  case "ArrowDown":
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;
63
+ e.preventDefault(), r((n) => {
64
+ for (let s = n + 1; s < a.length; s++)
65
+ if (!a[s].disabled) return s;
66
+ return n;
66
67
  });
67
68
  break;
68
69
  case "ArrowUp":
69
- e.preventDefault(), a((t) => {
70
- for (let s = t - 1; s >= 0; s--)
71
- if (!l[s].disabled) return s;
72
- return t;
70
+ e.preventDefault(), r((n) => {
71
+ for (let s = n - 1; s >= 0; s--)
72
+ if (!a[s].disabled) return s;
73
+ return n;
73
74
  });
74
75
  break;
75
76
  case "Enter":
76
- e.preventDefault(), n >= 0 && l[n] && !l[n].disabled ? k(l[n]) : !D && d.length > 0 && k(d[0]);
77
+ e.preventDefault(), t >= 0 && a[t] && !a[t].disabled ? C(a[t]) : !N && u.length > 0 && C(u[0]);
77
78
  break;
78
79
  case "Escape":
79
- i(!1), a(-1), m.current?.blur();
80
+ c(!1), r(-1), m.current?.blur();
80
81
  break;
81
82
  }
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(), b(""), w?.(""), H?.(), m.current?.focus();
88
- }, ne = {
89
- xs: "input-xs",
90
- sm: "input-sm",
91
- md: "input-md",
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 && h && !p, re = typeof f == "object" && f.clearIcon ? f.clearIcon : null, O = (e) => `${y}-option-${e}`, ae = [
111
- "input w-full",
112
- ne[S],
113
- se,
114
- L && "pr-10"
83
+ }, se = () => {
84
+ c(!0), x && u.length > 0 && r(0);
85
+ }, oe = (e) => {
86
+ i.current && i.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 && i.current && i.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}`, ie = [
112
+ `${Ie} w-full`,
113
+ ae[Q],
114
+ le,
115
+ B && "pr-10"
115
116
  ].filter(Boolean).join(" ");
116
117
  return /* @__PURE__ */ M(
117
118
  "div",
118
119
  {
119
- className: `dropdown dropdown-bottom w-full ${u && !p ? "dropdown-open" : ""} ${U}`,
120
- "data-state": u ? "open" : "closed",
121
- ...q,
120
+ className: `${pe} ${fe} w-full ${d && !p ? he : ""} ${W}`,
121
+ "data-state": d ? "open" : "closed",
122
+ ...G,
122
123
  children: [
123
124
  /* @__PURE__ */ M("div", { className: "relative w-full", children: [
124
- /* @__PURE__ */ r(
125
+ /* @__PURE__ */ o(
125
126
  "input",
126
127
  {
127
128
  ref: m,
128
- id: G,
129
+ id: Y,
129
130
  type: "text",
130
131
  role: "combobox",
131
- "aria-expanded": u,
132
+ "aria-expanded": d,
132
133
  "aria-haspopup": "listbox",
133
134
  "aria-controls": E,
134
135
  "aria-autocomplete": "list",
135
- "aria-activedescendant": n >= 0 ? O(n) : void 0,
136
- "aria-invalid": x === "error" ? !0 : void 0,
136
+ "aria-activedescendant": t >= 0 ? L(t) : void 0,
137
+ "aria-invalid": w === "error" ? !0 : void 0,
137
138
  value: h,
138
- onChange: Y,
139
- onKeyDown: Z,
140
- onFocus: _,
141
- onBlur: ee,
142
- placeholder: K,
139
+ onChange: ne,
140
+ onKeyDown: te,
141
+ onFocus: se,
142
+ onBlur: oe,
143
+ placeholder: P,
143
144
  disabled: p,
144
- className: ae
145
+ className: ie
145
146
  }
146
147
  ),
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
+ B && /* @__PURE__ */ o("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 z-10", children: ce || /* @__PURE__ */ o(Ee, { onClick: re }) })
148
149
  ] }),
149
- u && !p && /* @__PURE__ */ r(
150
+ d && !p && /* @__PURE__ */ o(
150
151
  "ul",
151
152
  {
152
- ref: c,
153
+ ref: i,
153
154
  id: E,
154
155
  role: "listbox",
155
156
  "aria-label": "Suggestions",
156
157
  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(
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(
159
160
  "a",
160
161
  {
161
- id: O(t),
162
+ id: L(n),
162
163
  role: "option",
163
- "aria-selected": n === t,
164
+ "aria-selected": t === n,
164
165
  "aria-disabled": e.disabled,
165
166
  onMouseDown: (s) => {
166
- s.preventDefault(), k(e);
167
+ s.preventDefault(), C(e);
167
168
  },
168
- onMouseEnter: () => !e.disabled && a(t),
169
+ onMouseEnter: () => !e.disabled && r(n),
169
170
  className: [
170
- t === n && !e.disabled && "active",
171
+ n === t && !e.disabled && "active",
171
172
  e.disabled && "disabled text-base-content/40 cursor-not-allowed"
172
173
  ].filter(Boolean).join(" "),
173
174
  children: e.label
174
175
  }
175
- ) }, e.value)) : /* @__PURE__ */ r("li", { className: "disabled", children: /* @__PURE__ */ r("span", { className: "text-base-content/60 text-center cursor-default", children: F }) })
176
+ ) }, e.value)) : /* @__PURE__ */ o("li", { className: "disabled", children: /* @__PURE__ */ o("span", { className: "text-base-content/60 text-center cursor-default", children: X }) })
176
177
  }
177
178
  )
178
179
  ]
@@ -180,6 +181,6 @@ const oe = ({ onClick: o, className: g }) => /* @__PURE__ */ r(
180
181
  );
181
182
  };
182
183
  export {
183
- pe as Autocomplete
184
+ ze as Autocomplete
184
185
  };
185
186
  //# 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'\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 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":"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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 './ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputMd = 'input-md'\nconst dInputLg = 'input-lg'\nconst dInputXl = 'input-xl'\nconst dInputNeutral = 'input-neutral'\nconst dInputPrimary = 'input-primary'\nconst dInputSecondary = 'input-secondary'\nconst dInputAccent = 'input-accent'\nconst dInputInfo = 'input-info'\nconst dInputSuccess = 'input-success'\nconst dInputWarning = 'input-warning'\nconst dInputError = '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":";;;AAIA,MAAMA,KAAY,YACZC,KAAkB,mBAClBC,KAAgB,iBAChBC,KAAmB,oBACnBC,KAAQ,QACRC,KAAS,SACTC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAW,YACXC,KAAgB,iBAChBC,KAAgB,iBAChBC,KAAkB,mBAClBC,KAAe,gBACfC,KAAa,cACbC,KAAgB,iBAChBC,IAAgB,iBAChBC,IAAc,eAuCdC,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;AAAA,EACA,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;AACJ,QAAM,EAAE,eAAAC,EAAA,IAAkBC,GAAA,GACpBC,IAAgBf,KAAQa,KAAiB,MAEzCG,IAASC,GAAA,GACTC,IAAU,GAAGF,CAAM,UACnBG,IAAY,GAAGH,CAAM,YAGrBI,IAAgCvB,EAAW;AAAA,IAAI,CAACwB,MACpD,OAAOA,KAAQ,WAAW,EAAE,OAAOA,GAAK,OAAOA,MAAQA;AAAA,EAAA,GAGnD,CAACC,GAAYC,CAAa,IAAIC,EAAS/B,CAAY,GACnD,CAACgC,GAAcC,CAAe,IAAIF,EAASf,CAAW,GACtD,CAACkB,GAAkBC,CAAmB,IAAIJ,EAAS,EAAE,GACrDK,IAAWC,EAAyB,IAAI,GACxCC,IAAcD,EAAyB,IAAI,GAG3CE,IAAmBxB,MAAmB,QACtCyB,IAASD,IAAmBxB,IAAiBiB,GAE7CS,IAAY,CAACC,MAAqB;AACtC,IAAKH,KACHN,EAAgBS,CAAO,GAEzBzB,IAAeyB,CAAO;AAAA,EACxB;AAGA,EAAAC,EAAU,MAAM;AACd,QAAI5C,MAAU,QAAW;AACvB,YAAM6C,IAAiBjB,EAAQ,KAAK,CAACC,MAAQA,EAAI,UAAU7B,CAAK;AAChE,MAAA+B,EAAcc,GAAgB,SAAS7C,CAAK;AAAA,IAC9C;AAAA,EACF,GAAG,CAACA,GAAO4B,CAAO,CAAC;AAGnB,QAAMkB,KAAgB,CAACC,GAA4BC,MACjDD,EAAO,MAAM,cAAc,SAASC,EAAM,YAAA,CAAa,GAEnDC,IAAkBrB,EAAQ;AAAA,IAAO,CAACmB,MACtCnC,IAAeA,EAAamC,GAAQjB,CAAU,IAAIgB,GAAcC,GAAQjB,CAAU;AAAA,EAAA,GAI9EoB,IAAiBD,EAAgB,OAAO,CAAApB,MAAO,CAACA,EAAI,QAAQ,GAE5DsB,KAAoB,CAAC,MAA2C;AACpE,UAAMC,IAAgB,EAAE,OAAO;AAC/B,IAAArB,EAAcqB,CAAa,GAC3BV,EAAU,EAAI,GAEVvB,KAA4B+B,EAAe,SAAS,IACtDd,EAAoB,CAAC,IAErBA,EAAoB,EAAE,GAGxBhC,IAAWgD,CAAa,GAEpBzC,KACFT,IAAWkD,CAAa;AAAA,EAE5B,GAEMC,IAAoB,CAACN,MAA+B;AACxD,IAAIA,EAAO,aAEXhB,EAAcgB,EAAO,KAAK,GAC1BL,EAAU,EAAK,GACfN,EAAoB,EAAE,GAEtBlC,IAAW6C,EAAO,KAAK,GACvB5C,IAAW4C,EAAO,OAAOA,CAAM,GAC/BV,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMiB,KAAgB,CAAC,MAA6C;AAClE,QAAI,CAACb,MAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,YAAY;AAC7D,MAAAC,EAAU,EAAI,GACVvB,KAA4B+B,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,CAACxB,KAAoBuC,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,KAAc,MAAM;AACxB,IAAAf,EAAU,EAAI,GACVvB,KAA4B+B,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,GAChB7B,IAAW,EAAE,GACba,IAAA,GACAsB,EAAS,SAAS,MAAA;AAAA,EACpB,GAEMuB,KAAc;AAAA,IAClB,IAAI9E;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,GAoBA2E,KAAsBnD,IANN;AAAA,IACpB,OAAOhB;AAAA,IACP,SAASD;AAAA,EAAA,EAIwCiB,CAAM,IAAKD,IAjBzC;AAAA,IACnB,SAAStB;AAAA,IACT,SAASC;AAAA,IACT,WAAWC;AAAA,IACX,QAAQC;AAAA,IACR,MAAMC;AAAA,IACN,SAASC;AAAA,IACT,SAASC;AAAA,IACT,OAAOC;AAAA,EAAA,EAS0Ee,CAAK,IAAI;AAG5F,EAAAmC,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,IAAYhD,KAAcgB,KAAc,CAACvB,GAGzCwD,KAAY,OAAOjD,KAAe,YAAYA,EAAW,YAC3DA,EAAW,YACX,MAGEkD,IAAc,CAACC,MAAkB,GAAGzC,CAAM,WAAWyC,CAAK,IAE1DC,KAAe;AAAA,IACnB,GAAGrF,EAAM;AAAA,IACT+E,GAAYrC,CAAa;AAAA,IACzBsC;AAAA,IACAC,KAAa;AAAA,EAAA,EACb,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG3F,EAAS,IAAIC,EAAe,WAAWgE,KAAU,CAAClC,IAAW7B,KAAgB,EAAE,IAAImB,CAAS;AAAA,MAC1G,cAAY4C,IAAS,SAAS;AAAA,MAC7B,GAAGrB;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAA+C,EAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA,gBAAArE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKuC;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,gBAAczB,MAAW,UAAU,KAAO;AAAA,cAC1C,OAAOoB;AAAA,cACP,UAAUqB;AAAA,cACV,WAAWG;AAAA,cACX,SAASG;AAAA,cACT,QAAQC;AAAA,cACR,aAAApD;AAAA,cACA,UAAAC;AAAA,cACA,WAAW2D;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZJ,KACC,gBAAAhE,EAAC,QAAA,EAAK,WAAU,kDACb,gBAAa,gBAAAA,EAACH,IAAA,EAAU,SAASgE,GAAA,CAAa,EAAA,CACjD;AAAA,QAAA,GAEJ;AAAA,QAEClB,KAAU,CAAClC,KACV,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKyC;AAAA,YACL,IAAIZ;AAAA,YACJ,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU;AAAA,YACV,WAAW,GAAGhD,EAAgB,IAAIC,EAAK;AAAA,YAEtC,UAAAqE,EAAgB,SAAS,IACxBA,EAAgB,IAAI,CAACF,GAAQkB,MAC3B,gBAAAnE,EAAC,MAAA,EACC,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIkE,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,gBAAAjD,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;"}
@@ -1,64 +1,65 @@
1
- import { jsxs as p, jsx as e } from "react/jsx-runtime";
2
- import C from "react";
3
- function j({
1
+ import { jsxs as p, jsx as a } from "react/jsx-runtime";
2
+ import j from "react";
3
+ const w = "avatar", $ = "avatar-online", b = "avatar-offline", g = "avatar-placeholder", G = "avatar-group";
4
+ function O({
4
5
  src: s,
5
- alt: a = "avatar",
6
+ alt: e = "avatar",
6
7
  icon: t,
7
8
  children: r,
8
9
  size: c = "md",
9
- shape: i = "circle",
10
- status: l,
11
- className: o = "",
12
- style: n,
10
+ shape: o = "circle",
11
+ status: n,
12
+ className: i = "",
13
+ style: l,
13
14
  // Legacy props
14
15
  online: d,
15
- offline: w,
16
- placeholder: g,
16
+ offline: N,
17
+ placeholder: A,
17
18
  ...u
18
19
  }) {
19
- const N = {
20
+ const x = {
20
21
  xs: "w-8",
21
22
  sm: "w-12",
22
23
  md: "w-16",
23
24
  lg: "w-20",
24
25
  xl: "w-24"
25
- }, x = {
26
+ }, C = {
26
27
  circle: "rounded-full",
27
28
  square: "rounded"
28
- }, h = l || (d ? "online" : w ? "offline" : void 0), v = [
29
- "avatar",
30
- h === "online" && "avatar-online",
31
- h === "offline" && "avatar-offline",
32
- (g || !s && (t || r)) && "avatar-placeholder",
33
- o
34
- ].filter(Boolean).join(" "), f = [N[c], x[i]].filter(Boolean).join(" ");
29
+ }, h = n || (d ? "online" : N ? "offline" : void 0), v = [
30
+ w,
31
+ h === "online" && $,
32
+ h === "offline" && b,
33
+ (A || !s && (t || r)) && g,
34
+ i
35
+ ].filter(Boolean).join(" "), f = [x[c], C[o]].filter(Boolean).join(" ");
35
36
  if (s)
36
- return /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("img", { src: s, alt: a }) }) });
37
+ return /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("img", { src: s, alt: e }) }) });
37
38
  const m = t || r;
38
- return m ? /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("div", { className: "bg-neutral text-neutral-content flex items-center justify-center w-full h-full", children: m }) }) }) : /* @__PURE__ */ e("div", { className: v, style: n, ...u, children: /* @__PURE__ */ e("div", { className: f, children: /* @__PURE__ */ e("div", { className: "bg-neutral-focus text-neutral-content w-full h-full" }) }) });
39
+ return m ? /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("div", { className: "bg-neutral text-neutral-content flex items-center justify-center w-full h-full", children: m }) }) }) : /* @__PURE__ */ a("div", { className: v, style: l, ...u, children: /* @__PURE__ */ a("div", { className: f, children: /* @__PURE__ */ a("div", { className: "bg-neutral-focus text-neutral-content w-full h-full" }) }) });
39
40
  }
40
- function A({ children: s, max: a, size: t, className: r = "", style: c, ...i }) {
41
- const l = C.Children.toArray(s), o = a ? l.slice(0, a) : l, n = a && l.length > a ? l.length - a : 0, d = {
41
+ function P({ children: s, max: e, size: t, className: r = "", style: c, ...o }) {
42
+ const n = j.Children.toArray(s), i = e ? n.slice(0, e) : n, l = e && n.length > e ? n.length - e : 0, d = {
42
43
  xs: "w-8",
43
44
  sm: "w-12",
44
45
  md: "w-16",
45
46
  lg: "w-20",
46
47
  xl: "w-24"
47
48
  };
48
- return /* @__PURE__ */ p("div", { className: `avatar-group -space-x-6 rtl:space-x-reverse ${r}`, style: c, ...i, children: [
49
- o,
50
- n > 0 && /* @__PURE__ */ e("div", { className: "avatar placeholder", children: /* @__PURE__ */ e("div", { className: `bg-neutral text-neutral-content rounded-full ${t ? d[t] : "w-12"}`, children: /* @__PURE__ */ p("span", { children: [
49
+ return /* @__PURE__ */ p("div", { className: `${G} -space-x-6 rtl:space-x-reverse ${r}`, style: c, ...o, children: [
50
+ i,
51
+ l > 0 && /* @__PURE__ */ a("div", { className: `${w} ${g}`, children: /* @__PURE__ */ a("div", { className: `bg-neutral text-neutral-content rounded-full ${t ? d[t] : "w-12"}`, children: /* @__PURE__ */ p("span", { children: [
51
52
  "+",
52
- n
53
+ l
53
54
  ] }) }) })
54
55
  ] });
55
56
  }
56
- const P = Object.assign(j, {
57
- Group: A
57
+ const y = Object.assign(O, {
58
+ Group: P
58
59
  });
59
60
  export {
60
- P as Avatar,
61
- A as AvatarGroup,
62
- P as default
61
+ y as Avatar,
62
+ P as AvatarGroup,
63
+ y as default
63
64
  };
64
65
  //# sourceMappingURL=Avatar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../src/components/Avatar.tsx"],"sourcesContent":["import React from 'react'\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 'avatar',\n resolvedStatus === 'online' && 'avatar-online',\n resolvedStatus === 'offline' && 'avatar-offline',\n isPlaceholder && 'avatar-placeholder',\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={`avatar-group -space-x-6 rtl:space-x-reverse ${className}`} style={style} {...rest}>\n {displayAvatars}\n {remainingCount > 0 && (\n <div className=\"avatar placeholder\">\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":["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":";;AA0BA,SAASA,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,IACpB;AAAA,IACAD,MAAmB,YAAY;AAAA,IAC/BA,MAAmB,aAAa;AAAA,KALZJ,KAAgB,CAACX,MAAQE,KAAQC,OAMpC;AAAA,IACjBI;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,SAAI,WAAW,+CAA+CnB,CAAS,IAAI,OAAAC,GAAe,GAAGI,GAC3F,UAAA;AAAA,IAAAY;AAAA,IACAC,IAAiB,KAChB,gBAAAP,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAW,gDAAgDd,IAAOS,EAAYT,CAAI,IAAI,MAAM,IAC/F,4BAAC,QAAA,EAAK,UAAA;AAAA,MAAA;AAAA,MAAEqB;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 = 'avatar'\nconst dAvatarOnline = 'avatar-online'\nconst dAvatarOffline = 'avatar-offline'\nconst dAvatarPlaceholder = 'avatar-placeholder'\nconst dAvatarGroup = '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":"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"}