asterui 0.12.4 → 0.12.6

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.
@@ -7,8 +7,14 @@ type BaseButtonProps = {
7
7
  soft?: boolean;
8
8
  active?: boolean;
9
9
  loading?: boolean;
10
- shape?: 'square' | 'circle' | 'wide' | 'block';
10
+ shape?: 'square' | 'circle' | 'wide' | 'block' | 'round';
11
11
  noAnimation?: boolean;
12
+ /** Icon element to display */
13
+ icon?: React.ReactNode;
14
+ /** Position of the icon */
15
+ iconPosition?: 'start' | 'end';
16
+ /** Applies error/danger styling (shorthand for type="error") */
17
+ danger?: boolean;
12
18
  };
13
19
  type ButtonAsButton = BaseButtonProps & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {
14
20
  href?: undefined;
@@ -4,6 +4,14 @@ export interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {
4
4
  hover?: boolean;
5
5
  position?: 'top' | 'bottom' | 'left' | 'right';
6
6
  align?: 'start' | 'center' | 'end';
7
+ /** Controlled open state */
8
+ open?: boolean;
9
+ /** Callback when open state changes */
10
+ onOpenChange?: (open: boolean) => void;
11
+ /** Disable the dropdown */
12
+ disabled?: boolean;
13
+ /** Show arrow pointing to trigger */
14
+ arrow?: boolean;
7
15
  }
8
16
  export interface DropdownTriggerProps {
9
17
  children: React.ReactNode;
@@ -25,7 +33,7 @@ export interface DropdownItemProps {
25
33
  export interface DropdownDividerProps {
26
34
  className?: string;
27
35
  }
28
- declare function DropdownRoot({ children, hover, position, align, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
36
+ declare function DropdownRoot({ children, hover, position, align, open: controlledOpen, onOpenChange, disabled, arrow, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
29
37
  declare function DropdownTrigger({ children, className }: DropdownTriggerProps): import("react/jsx-runtime").JSX.Element;
30
38
  declare function DropdownMenu({ children, className }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
31
39
  declare function DropdownItem({ children, onClick, active, disabled, danger, className, }: DropdownItemProps): import("react/jsx-runtime").JSX.Element;
package/dist/index37.js CHANGED
@@ -1,194 +1,217 @@
1
- import { jsx as p } from "react/jsx-runtime";
2
- import b, { useId as O, useState as y, useRef as x, useCallback as B, useEffect as k, createContext as R, useContext as F } from "react";
3
- const A = R(void 0);
4
- function v() {
5
- const t = F(A);
6
- if (!t)
1
+ import { jsx as I, jsxs as L } from "react/jsx-runtime";
2
+ import h, { useId as B, useState as E, useRef as v, useCallback as R, useEffect as O, createContext as S, useContext as U } from "react";
3
+ const F = S(void 0);
4
+ function j() {
5
+ const n = U(F);
6
+ if (!n)
7
7
  throw new Error("Dropdown compound components must be used within Dropdown");
8
- return t;
8
+ return n;
9
9
  }
10
- function M({
11
- children: t,
12
- hover: i = !1,
10
+ function q({
11
+ children: n,
12
+ hover: d = !1,
13
13
  position: u = "bottom",
14
- align: o = "start",
15
- className: c = "",
16
- ...d
14
+ align: r = "start",
15
+ open: a,
16
+ onOpenChange: o,
17
+ disabled: t = !1,
18
+ arrow: s = !1,
19
+ className: i = "",
20
+ ...p
17
21
  }) {
18
- const n = O(), s = O(), [a, l] = y(!1), [r, I] = y(-1), [m, C] = y(0), e = x(/* @__PURE__ */ new Map()), f = x(null), w = B((D, h, j) => {
19
- h ? e.current.set(D, { ref: h, disabled: j }) : e.current.delete(D);
22
+ const f = B(), l = B(), [c, g] = E(!1), [C, x] = E(-1), [A, k] = E(0), e = v(/* @__PURE__ */ new Map()), D = v(null), m = a !== void 0, b = m ? a : c, K = R((w) => {
23
+ t || (m || g(w), o?.(w));
24
+ }, [t, m, o]), $ = R((w, y, V) => {
25
+ y ? e.current.set(w, { ref: y, disabled: V }) : e.current.delete(w);
20
26
  }, []);
21
- k(() => {
22
- const D = (h) => {
23
- f.current && !f.current.contains(h.target) && (l(!1), I(-1));
27
+ O(() => {
28
+ const w = (y) => {
29
+ D.current && !D.current.contains(y.target) && (K(!1), x(-1));
24
30
  };
25
- if (a)
26
- return document.addEventListener("mousedown", D), () => document.removeEventListener("mousedown", D);
27
- }, [a]);
28
- const g = {
31
+ if (b)
32
+ return document.addEventListener("mousedown", w), () => document.removeEventListener("mousedown", w);
33
+ }, [b]);
34
+ const M = {
29
35
  top: "dropdown-top",
30
36
  bottom: "dropdown-bottom",
31
37
  left: "dropdown-left",
32
38
  right: "dropdown-right"
33
- }, K = {
39
+ }, P = {
34
40
  start: "",
35
41
  center: "dropdown-center",
36
42
  end: "dropdown-end"
37
- }, N = [
43
+ }, T = [
38
44
  "dropdown",
39
- g[u],
40
- K[o],
41
- i && "dropdown-hover",
42
- a && "dropdown-open",
43
- c
45
+ M[u],
46
+ P[r],
47
+ d && "dropdown-hover",
48
+ b && "dropdown-open",
49
+ i
44
50
  ].filter(Boolean).join(" ");
45
- return /* @__PURE__ */ p(
46
- A.Provider,
51
+ return /* @__PURE__ */ I(
52
+ F.Provider,
47
53
  {
48
54
  value: {
49
55
  position: u,
50
- align: o,
51
- menuId: n,
52
- triggerId: s,
53
- isOpen: a,
54
- setIsOpen: l,
55
- focusedIndex: r,
56
- setFocusedIndex: I,
57
- registerItem: w,
58
- itemCount: m,
59
- setItemCount: C
56
+ align: r,
57
+ menuId: f,
58
+ triggerId: l,
59
+ isOpen: b,
60
+ setIsOpen: K,
61
+ focusedIndex: C,
62
+ setFocusedIndex: x,
63
+ registerItem: $,
64
+ itemCount: A,
65
+ setItemCount: k,
66
+ disabled: t,
67
+ arrow: s
60
68
  },
61
- children: /* @__PURE__ */ p("div", { ref: f, className: N, "data-state": a ? "open" : "closed", ...d, children: t })
69
+ children: /* @__PURE__ */ I("div", { ref: D, className: T, "data-state": b ? "open" : "closed", "aria-disabled": t || void 0, ...p, children: n })
62
70
  }
63
71
  );
64
72
  }
65
- function T({ children: t, className: i = "" }) {
66
- const { menuId: u, triggerId: o, isOpen: c, setIsOpen: d, setFocusedIndex: n, itemCount: s } = v(), a = (r) => {
67
- switch (r.key) {
73
+ function z({ children: n, className: d = "" }) {
74
+ const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, setFocusedIndex: t, itemCount: s, disabled: i } = j(), p = (l) => {
75
+ switch (l.key) {
68
76
  case "Enter":
69
77
  case " ":
70
78
  case "ArrowDown":
71
- r.preventDefault(), d(!0), n(0);
79
+ l.preventDefault(), o(!0), t(0);
72
80
  break;
73
81
  case "ArrowUp":
74
- r.preventDefault(), d(!0), n(s - 1);
82
+ l.preventDefault(), o(!0), t(s - 1);
75
83
  break;
76
84
  case "Escape":
77
- r.preventDefault(), d(!1), n(-1);
85
+ l.preventDefault(), o(!1), t(-1);
78
86
  break;
79
87
  }
80
- }, l = () => {
81
- d(!c), c || n(0);
88
+ }, f = () => {
89
+ o(!a), a || t(0);
82
90
  };
83
- return /* @__PURE__ */ p(
91
+ return /* @__PURE__ */ I(
84
92
  "button",
85
93
  {
86
- id: o,
94
+ id: r,
87
95
  type: "button",
88
- tabIndex: 0,
89
- className: `btn ${i}`,
96
+ tabIndex: i ? -1 : 0,
97
+ className: `btn ${d}`,
90
98
  "aria-haspopup": "menu",
91
- "aria-expanded": c,
99
+ "aria-expanded": a,
92
100
  "aria-controls": u,
93
- onClick: l,
94
- onKeyDown: a,
95
- children: t
101
+ disabled: i,
102
+ onClick: f,
103
+ onKeyDown: p,
104
+ children: n
96
105
  }
97
106
  );
98
107
  }
99
- function V({ children: t, className: i = "" }) {
100
- const { menuId: u, triggerId: o, isOpen: c, setIsOpen: d, focusedIndex: n, setFocusedIndex: s, setItemCount: a } = v(), l = x(null), r = b.Children.toArray(t).filter(
101
- (e) => b.isValidElement(e) && e.type === E
108
+ function H({ children: n, className: d = "" }) {
109
+ const { menuId: u, triggerId: r, isOpen: a, setIsOpen: o, focusedIndex: t, setFocusedIndex: s, setItemCount: i, arrow: p, position: f } = j(), l = v(null), c = h.Children.toArray(n).filter(
110
+ (e) => h.isValidElement(e) && e.type === N
102
111
  );
103
- k(() => {
104
- a(r.length);
105
- }, [r.length, a]), k(() => {
106
- c && n >= 0 && l.current && l.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[n]?.focus();
107
- }, [c, n]);
108
- const I = (e) => {
109
- const w = r.filter(
110
- (g) => b.isValidElement(g) && !g.props.disabled
112
+ O(() => {
113
+ i(c.length);
114
+ }, [c.length, i]), O(() => {
115
+ a && t >= 0 && l.current && l.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[t]?.focus();
116
+ }, [a, t]);
117
+ const g = (e) => {
118
+ const m = c.filter(
119
+ (b) => h.isValidElement(b) && !b.props.disabled
111
120
  ).length;
112
121
  switch (e.key) {
113
122
  case "ArrowDown":
114
- e.preventDefault(), s((n + 1) % w);
123
+ e.preventDefault(), s((t + 1) % m);
115
124
  break;
116
125
  case "ArrowUp":
117
- e.preventDefault(), s((n - 1 + w) % w);
126
+ e.preventDefault(), s((t - 1 + m) % m);
118
127
  break;
119
128
  case "Home":
120
129
  e.preventDefault(), s(0);
121
130
  break;
122
131
  case "End":
123
- e.preventDefault(), s(w - 1);
132
+ e.preventDefault(), s(m - 1);
124
133
  break;
125
134
  case "Escape":
126
- e.preventDefault(), d(!1), s(-1), document.getElementById(o)?.focus();
135
+ e.preventDefault(), o(!1), s(-1), document.getElementById(r)?.focus();
127
136
  break;
128
137
  case "Tab":
129
- d(!1), s(-1);
138
+ o(!1), s(-1);
130
139
  break;
131
140
  }
132
- }, m = [
141
+ }, C = [
133
142
  "dropdown-content",
134
143
  "menu",
135
144
  "bg-base-100",
136
145
  "rounded-box",
137
- "z-[1]",
146
+ "z-50",
138
147
  "shadow",
139
- i
140
- ].filter(Boolean).join(" "), C = b.Children.map(t, (e, f) => b.isValidElement(e) && e.type === E ? b.cloneElement(e, { _index: f }) : e);
141
- return /* @__PURE__ */ p(
148
+ d
149
+ ].filter(Boolean).join(" "), x = h.Children.map(n, (e, D) => h.isValidElement(e) && e.type === N ? h.cloneElement(e, { _index: D }) : e), k = p ? /* @__PURE__ */ I(
150
+ "span",
151
+ {
152
+ className: `absolute w-0 h-0 border-8 border-solid ${{
153
+ top: "bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent",
154
+ bottom: "top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent",
155
+ left: "right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent",
156
+ right: "left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent"
157
+ }[f || "bottom"]}`,
158
+ "aria-hidden": "true"
159
+ }
160
+ ) : null;
161
+ return /* @__PURE__ */ L(
142
162
  "ul",
143
163
  {
144
164
  ref: l,
145
165
  id: u,
146
166
  role: "menu",
147
- "aria-labelledby": o,
167
+ "aria-labelledby": r,
148
168
  tabIndex: -1,
149
- className: m,
150
- onKeyDown: I,
151
- children: C
169
+ className: `${C} ${p ? "relative" : ""}`,
170
+ onKeyDown: g,
171
+ children: [
172
+ k,
173
+ x
174
+ ]
152
175
  }
153
176
  );
154
177
  }
155
- function E({
156
- children: t,
157
- onClick: i,
178
+ function N({
179
+ children: n,
180
+ onClick: d,
158
181
  active: u = !1,
159
- disabled: o = !1,
160
- danger: c = !1,
161
- className: d = ""
182
+ disabled: r = !1,
183
+ danger: a = !1,
184
+ className: o = ""
162
185
  }) {
163
- const { setIsOpen: n, setFocusedIndex: s, triggerId: a } = v(), l = [u && "active", o && "disabled", d].filter(Boolean).join(" "), r = () => {
164
- o || (i?.(), n(!1), s(-1), document.getElementById(a)?.focus());
186
+ const { setIsOpen: t, setFocusedIndex: s, triggerId: i } = j(), p = [u && "active", r && "disabled", o].filter(Boolean).join(" "), f = () => {
187
+ r || (d?.(), t(!1), s(-1), document.getElementById(i)?.focus());
165
188
  };
166
- return /* @__PURE__ */ p("li", { className: l, role: "none", children: /* @__PURE__ */ p(
189
+ return /* @__PURE__ */ I("li", { className: p, role: "none", children: /* @__PURE__ */ I(
167
190
  "a",
168
191
  {
169
192
  role: "menuitem",
170
- tabIndex: o ? -1 : 0,
171
- "aria-disabled": o || void 0,
172
- className: c ? "text-error" : "",
173
- onClick: r,
174
- onKeyDown: (m) => {
175
- (m.key === "Enter" || m.key === " ") && !o && (m.preventDefault(), r());
193
+ tabIndex: r ? -1 : 0,
194
+ "aria-disabled": r || void 0,
195
+ className: a ? "text-error" : "",
196
+ onClick: f,
197
+ onKeyDown: (c) => {
198
+ (c.key === "Enter" || c.key === " ") && !r && (c.preventDefault(), f());
176
199
  },
177
- children: t
200
+ children: n
178
201
  }
179
202
  ) });
180
203
  }
181
- function L({ className: t = "" }) {
182
- const i = ["border-base-content/10", t].filter(Boolean).join(" ");
183
- return /* @__PURE__ */ p("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ p("hr", { className: i }) });
204
+ function W({ className: n = "" }) {
205
+ const d = ["border-base-content/10", n].filter(Boolean).join(" ");
206
+ return /* @__PURE__ */ I("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ I("hr", { className: d }) });
184
207
  }
185
- const q = Object.assign(M, {
186
- Trigger: T,
187
- Menu: V,
188
- Item: E,
189
- Divider: L
208
+ const J = Object.assign(q, {
209
+ Trigger: z,
210
+ Menu: H,
211
+ Item: N,
212
+ Divider: W
190
213
  });
191
214
  export {
192
- q as Dropdown
215
+ J as Dropdown
193
216
  };
194
217
  //# sourceMappingURL=index37.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [isOpen, setIsOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const positionClasses: Record<string, string> = {\n top: 'dropdown-top',\n bottom: 'dropdown-bottom',\n left: 'dropdown-left',\n right: 'dropdown-right',\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: 'dropdown-center',\n end: 'dropdown-end',\n }\n\n const dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} {...rest}>{children}</div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\n )\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n 'dropdown-content',\n 'menu',\n 'bg-base-100',\n 'rounded-box',\n 'z-[1]',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\n }\n return child\n })\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={menuClasses}\n onKeyDown={handleKeyDown}\n >\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <li className={itemClasses} role=\"none\">\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </a>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","className","rest","menuId","useId","triggerId","isOpen","setIsOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","registerItem","useCallback","index","ref","disabled","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":";;AAgBA,MAAMA,IAAkBC,EAAgD,MAAS;AAEjF,SAASC,IAAqB;AAC5B,QAAMC,IAAUC,EAAWJ,CAAe;AAC1C,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,2DAA2D;AAE7E,SAAOA;AACT;AAiCA,SAASE,EAAa;AAAA,EACpB,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAkB;AAChB,QAAMC,IAASC,EAAA,GACTC,IAAYD,EAAA,GACZ,CAACE,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAAcC,CAAe,IAAIF,EAAS,EAAE,GAC7C,CAACG,GAAWC,CAAY,IAAIJ,EAAS,CAAC,GACtCK,IAAWC,EAAoE,oBAAI,KAAK,GACxFC,IAAcD,EAAuB,IAAI,GAEzCE,IAAeC,EAAY,CAACC,GAAeC,GAAyBC,MAAsB;AAC9F,IAAID,IACFN,EAAS,QAAQ,IAAIK,GAAO,EAAE,KAAAC,GAAK,UAAAC,GAAU,IAE7CP,EAAS,QAAQ,OAAOK,CAAK;AAAA,EAEjC,GAAG,CAAA,CAAE;AAGL,EAAAG,EAAU,MAAM;AACd,UAAMC,IAAqB,CAACC,MAAsB;AAChD,MAAIR,EAAY,WAAW,CAACA,EAAY,QAAQ,SAASQ,EAAM,MAAc,MAC3EhB,EAAU,EAAK,GACfG,EAAgB,EAAE;AAAA,IAEtB;AAEA,QAAIJ;AACF,sBAAS,iBAAiB,aAAagB,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAE7E,GAAG,CAAChB,CAAM,CAAC;AAEX,QAAMkB,IAA0C;AAAA,IAC9C,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,GAGHC,IAAuC;AAAA,IAC3C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EAAA,GAGDC,IAAkB;AAAA,IACtB;AAAA,IACAF,EAAgBzB,CAAQ;AAAA,IACxB0B,EAAazB,CAAK;AAAA,IAClBF,KAAS;AAAA,IACTQ,KAAU;AAAA,IACVL;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAA0B;AAAA,IAACpC,EAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL,UAAAQ;AAAA,QACA,OAAAC;AAAA,QACA,QAAAG;AAAA,QACA,WAAAE;AAAA,QACA,QAAAC;AAAA,QACA,WAAAC;AAAA,QACA,cAAAE;AAAA,QACA,iBAAAC;AAAA,QACA,cAAAM;AAAA,QACA,WAAAL;AAAA,QACA,cAAAC;AAAA,MAAA;AAAA,MAGF,UAAA,gBAAAe,EAAC,OAAA,EAAI,KAAKZ,GAAa,WAAWW,GAAiB,cAAYpB,IAAS,SAAS,UAAW,GAAGJ,GAAO,UAAAL,EAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAGrH;AAEA,SAAS+B,EAAgB,EAAE,UAAA/B,GAAU,WAAAI,IAAY,MAA4B;AAC3E,QAAM,EAAE,QAAAE,GAAQ,WAAAE,GAAW,QAAAC,GAAQ,WAAAC,GAAW,iBAAAG,GAAiB,WAAAC,EAAA,IAAclB,EAAA,GAEvEoC,IAAgB,CAACN,MAA+B;AACpD,YAAQA,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,EAAM,eAAA,GACNhB,EAAU,EAAI,GACdG,EAAgB,CAAC;AACjB;AAAA,MACF,KAAK;AACH,QAAAa,EAAM,eAAA,GACNhB,EAAU,EAAI,GACdG,EAAgBC,IAAY,CAAC;AAC7B;AAAA,MACF,KAAK;AACH,QAAAY,EAAM,eAAA,GACNhB,EAAU,EAAK,GACfG,EAAgB,EAAE;AAClB;AAAA,IAAA;AAAA,EAEN,GAEMoB,IAAc,MAAM;AACxB,IAAAvB,EAAU,CAACD,CAAM,GACZA,KACHI,EAAgB,CAAC;AAAA,EAErB;AAEA,SACE,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAItB;AAAA,MACJ,MAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW,OAAOJ,CAAS;AAAA,MAC3B,iBAAc;AAAA,MACd,iBAAeK;AAAA,MACf,iBAAeH;AAAA,MACf,SAAS2B;AAAA,MACT,WAAWD;AAAA,MAEV,UAAAhC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASkC,EAAa,EAAE,UAAAlC,GAAU,WAAAI,IAAY,MAAyB;AACrE,QAAM,EAAE,QAAAE,GAAQ,WAAAE,GAAW,QAAAC,GAAQ,WAAAC,GAAW,cAAAE,GAAc,iBAAAC,GAAiB,cAAAE,EAAA,IAAiBnB,EAAA,GACxFuC,IAAUlB,EAAyB,IAAI,GAGvCmB,IAAaC,EAAM,SAAS,QAAQrC,CAAQ,EAAE;AAAA,IAClD,CAACsC,MAAUD,EAAM,eAAeC,CAAK,KAAMA,EAAM,SAASC;AAAA,EAAA;AAG5D,EAAAf,EAAU,MAAM;AACd,IAAAT,EAAaqB,EAAW,MAAM;AAAA,EAChC,GAAG,CAACA,EAAW,QAAQrB,CAAY,CAAC,GAGpCS,EAAU,MAAM;AACd,IAAIf,KAAUG,KAAgB,KAAKuB,EAAQ,WAC3BA,EAAQ,QAAQ,iBAAiB,+CAA+C,EAC3EvB,CAAY,GACzB,MAAA;AAAA,EAEV,GAAG,CAACH,GAAQG,CAAY,CAAC;AAEzB,QAAMoB,IAAgB,CAACN,MAA+B;AAIpD,UAAMc,IAHeJ,EAAW;AAAA,MAC9B,CAACE,MAAUD,EAAM,eAAeC,CAAK,KAAK,CAAEA,EAAM,MAA4B;AAAA,IAAA,EAE9C;AAElC,YAAQZ,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAA,EAAM,eAAA,GACNb,GAAiBD,IAAe,KAAK4B,CAAY;AACjD;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNb,GAAiBD,IAAe,IAAI4B,KAAgBA,CAAY;AAChE;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNb,EAAgB,CAAC;AACjB;AAAA,MACF,KAAK;AACH,QAAAa,EAAM,eAAA,GACNb,EAAgB2B,IAAe,CAAC;AAChC;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNhB,EAAU,EAAK,GACfG,EAAgB,EAAE,GAElB,SAAS,eAAeL,CAAS,GAAG,MAAA;AACpC;AAAA,MACF,KAAK;AACH,QAAAE,EAAU,EAAK,GACfG,EAAgB,EAAE;AAClB;AAAA,IAAA;AAAA,EAEN,GAEM4B,IAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACArC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAGLsC,IAAoBL,EAAM,SAAS,IAAIrC,GAAU,CAACsC,GAAOjB,MACzDgB,EAAM,eAAeC,CAAK,KAAKA,EAAM,SAASC,IACzCF,EAAM,aAAaC,GAAkC,EAAE,QAAQjB,GAAO,IAExEiB,CACR;AAED,SACE,gBAAAR;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKK;AAAA,MACL,IAAI7B;AAAA,MACJ,MAAK;AAAA,MACL,mBAAiBE;AAAA,MACjB,UAAU;AAAA,MACV,WAAWiC;AAAA,MACX,WAAWT;AAAA,MAEV,UAAAU;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASH,EAAa;AAAA,EACpB,UAAAvC;AAAA,EACA,SAAA2C;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAArB,IAAW;AAAA,EACX,QAAAsB,IAAS;AAAA,EACT,WAAAzC,IAAY;AACd,GAAsB;AACpB,QAAM,EAAE,WAAAM,GAAW,iBAAAG,GAAiB,WAAAL,EAAA,IAAcZ,EAAA,GAC5CkD,IAAc,CAACF,KAAU,UAAUrB,KAAY,YAAYnB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAE9F6B,IAAc,MAAM;AACxB,IAAKV,MACHoB,IAAA,GACAjC,EAAU,EAAK,GACfG,EAAgB,EAAE,GAClB,SAAS,eAAeL,CAAS,GAAG,MAAA;AAAA,EAExC;AASA,SACE,gBAAAsB,EAAC,MAAA,EAAG,WAAWgB,GAAa,MAAK,QAC/B,UAAA,gBAAAhB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAUP,IAAW,KAAK;AAAA,MAC1B,iBAAeA,KAAY;AAAA,MAC3B,WAAWsB,IAAS,eAAe;AAAA,MACnC,SAASZ;AAAA,MACT,WAfgB,CAACP,MAA+B;AACpD,SAAKA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,QAAQ,CAACH,MACnDG,EAAM,eAAA,GACNO,EAAA;AAAA,MAEJ;AAAA,MAYO,UAAAjC;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEA,SAAS+C,EAAgB,EAAE,WAAA3C,IAAY,MAA4B;AACjE,QAAM4C,IAAU,CAAC,0BAA0B5C,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC9E,SACE,gBAAA0B,EAAC,MAAA,EAAG,MAAK,aAAY,WAAU,QAC7B,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAWkB,EAAA,CAAS,EAAA,CAC1B;AAEJ;AAEO,MAAMC,IAAW,OAAO,OAAOlD,GAAc;AAAA,EAClD,SAASgC;AAAA,EACT,MAAMG;AAAA,EACN,MAAMK;AAAA,EACN,SAASQ;AACX,CAAC;"}
1
+ {"version":3,"file":"index37.js","sources":["../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect } from 'react'\n\ninterface DropdownContextValue {\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n menuId: string\n triggerId: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n focusedIndex: number\n setFocusedIndex: (index: number) => void\n registerItem: (index: number, ref: HTMLElement | null, disabled: boolean) => void\n itemCount: number\n setItemCount: (count: number) => void\n disabled: boolean\n arrow: boolean\n}\n\nconst DropdownContext = createContext<DropdownContextValue | undefined>(undefined)\n\nfunction useDropdownContext() {\n const context = useContext(DropdownContext)\n if (!context) {\n throw new Error('Dropdown compound components must be used within Dropdown')\n }\n return context\n}\n\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hover?: boolean\n position?: 'top' | 'bottom' | 'left' | 'right'\n align?: 'start' | 'center' | 'end'\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownItemProps {\n children: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n _index?: number // Internal prop passed by DropdownMenu\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nfunction DropdownRoot({\n children,\n hover = false,\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n arrow = false,\n className = '',\n ...rest\n}: DropdownProps) {\n const menuId = useId()\n const triggerId = useId()\n const [internalOpen, setInternalOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const [itemCount, setItemCount] = useState(0)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Use controlled or uncontrolled open state\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const setIsOpen = useCallback((open: boolean) => {\n if (disabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n onOpenChange?.(open)\n }, [disabled, isControlled, onOpenChange])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, disabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const positionClasses: Record<string, string> = {\n top: 'dropdown-top',\n bottom: 'dropdown-bottom',\n left: 'dropdown-left',\n right: 'dropdown-right',\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: 'dropdown-center',\n end: 'dropdown-end',\n }\n\n const dropdownClasses = [\n 'dropdown',\n positionClasses[position],\n alignClasses[align],\n hover && 'dropdown-hover',\n isOpen && 'dropdown-open',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <DropdownContext.Provider\n value={{\n position,\n align,\n menuId,\n triggerId,\n isOpen,\n setIsOpen,\n focusedIndex,\n setFocusedIndex,\n registerItem,\n itemCount,\n setItemCount,\n disabled,\n arrow,\n }}\n >\n <div ref={dropdownRef} className={dropdownClasses} data-state={isOpen ? 'open' : 'closed'} aria-disabled={disabled || undefined} {...rest}>{children}</div>\n </DropdownContext.Provider>\n )\n}\n\nfunction DropdownTrigger({ children, className = '' }: DropdownTriggerProps) {\n const { menuId, triggerId, isOpen, setIsOpen, setFocusedIndex, itemCount, disabled } = useDropdownContext()\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(0)\n break\n case 'ArrowUp':\n event.preventDefault()\n setIsOpen(true)\n setFocusedIndex(itemCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const handleClick = () => {\n setIsOpen(!isOpen)\n if (!isOpen) {\n setFocusedIndex(0)\n }\n }\n\n return (\n <button\n id={triggerId}\n type=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={`btn ${className}`}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </button>\n )\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position } = useDropdownContext()\n const menuRef = useRef<HTMLUListElement>(null)\n\n // Count children and set item count\n const childArray = React.Children.toArray(children).filter(\n (child) => React.isValidElement(child) && (child.type === DropdownItem)\n )\n\n useEffect(() => {\n setItemCount(childArray.length)\n }, [childArray.length, setItemCount])\n\n // Focus management\n useEffect(() => {\n if (isOpen && focusedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n const item = items[focusedIndex] as HTMLElement\n item?.focus()\n }\n }, [isOpen, focusedIndex])\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const enabledItems = childArray.filter(\n (child) => React.isValidElement(child) && !(child.props as DropdownItemProps).disabled\n )\n const enabledCount = enabledItems.length\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setFocusedIndex((focusedIndex + 1) % enabledCount)\n break\n case 'ArrowUp':\n event.preventDefault()\n setFocusedIndex((focusedIndex - 1 + enabledCount) % enabledCount)\n break\n case 'Home':\n event.preventDefault()\n setFocusedIndex(0)\n break\n case 'End':\n event.preventDefault()\n setFocusedIndex(enabledCount - 1)\n break\n case 'Escape':\n event.preventDefault()\n setIsOpen(false)\n setFocusedIndex(-1)\n // Return focus to trigger\n document.getElementById(triggerId)?.focus()\n break\n case 'Tab':\n setIsOpen(false)\n setFocusedIndex(-1)\n break\n }\n }\n\n const menuClasses = [\n 'dropdown-content',\n 'menu',\n 'bg-base-100',\n 'rounded-box',\n 'z-50',\n 'shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Clone children to pass index\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index })\n }\n return child\n })\n\n // Arrow position classes based on menu position\n const arrowPositionClasses: Record<string, string> = {\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-base-100 border-l-transparent border-r-transparent border-b-transparent',\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-base-100 border-l-transparent border-r-transparent border-t-transparent',\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-base-100 border-t-transparent border-b-transparent border-r-transparent',\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-base-100 border-t-transparent border-b-transparent border-l-transparent',\n }\n\n const arrowElement = arrow ? (\n <span\n className={`absolute w-0 h-0 border-8 border-solid ${arrowPositionClasses[position || 'bottom']}`}\n aria-hidden=\"true\"\n />\n ) : null\n\n return (\n <ul\n ref={menuRef}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n className={`${menuClasses} ${arrow ? 'relative' : ''}`}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n}: DropdownItemProps) {\n const { setIsOpen, setFocusedIndex, triggerId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n setIsOpen(false)\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !disabled) {\n event.preventDefault()\n handleClick()\n }\n }\n\n return (\n <li className={itemClasses} role=\"none\">\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={danger ? 'text-error' : ''}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </a>\n </li>\n )\n}\n\nfunction DropdownDivider({ className = '' }: DropdownDividerProps) {\n const classes = ['border-base-content/10', className].filter(Boolean).join(' ')\n return (\n <li role=\"separator\" className=\"my-1\">\n <hr className={classes} />\n </li>\n )\n}\n\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Divider: DropdownDivider,\n})\n"],"names":["DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","children","hover","position","align","controlledOpen","onOpenChange","disabled","arrow","className","rest","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","itemRefs","useRef","dropdownRef","isControlled","isOpen","setIsOpen","useCallback","open","registerItem","index","ref","useEffect","handleClickOutside","event","positionClasses","alignClasses","dropdownClasses","jsx","DropdownTrigger","handleKeyDown","handleClick","DropdownMenu","menuRef","childArray","React","child","DropdownItem","enabledCount","menuClasses","childrenWithIndex","arrowElement","jsxs","onClick","active","danger","itemClasses","DropdownDivider","classes","Dropdown"],"mappings":";;AAkBA,MAAMA,IAAkBC,EAAgD,MAAS;AAEjF,SAASC,IAAqB;AAC5B,QAAMC,IAAUC,EAAWJ,CAAe;AAC1C,MAAI,CAACG;AACH,UAAM,IAAI,MAAM,2DAA2D;AAE7E,SAAOA;AACT;AAyCA,SAASE,EAAa;AAAA,EACpB,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,OAAAC,IAAQ;AAAA,EACR,MAAMC;AAAA,EACN,cAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAkB;AAChB,QAAMC,IAASC,EAAA,GACTC,IAAYD,EAAA,GACZ,CAACE,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChD,CAACC,GAAcC,CAAe,IAAIF,EAAS,EAAE,GAC7C,CAACG,GAAWC,CAAY,IAAIJ,EAAS,CAAC,GACtCK,IAAWC,EAAoE,oBAAI,KAAK,GACxFC,IAAcD,EAAuB,IAAI,GAGzCE,IAAenB,MAAmB,QAClCoB,IAASD,IAAenB,IAAiBS,GAEzCY,IAAYC,EAAY,CAACC,MAAkB;AAC/C,IAAIrB,MACCiB,KACHT,EAAgBa,CAAI,GAEtBtB,IAAesB,CAAI;AAAA,EACrB,GAAG,CAACrB,GAAUiB,GAAclB,CAAY,CAAC,GAEnCuB,IAAeF,EAAY,CAACG,GAAeC,GAAyBxB,MAAsB;AAC9F,IAAIwB,IACFV,EAAS,QAAQ,IAAIS,GAAO,EAAE,KAAAC,GAAK,UAAAxB,GAAU,IAE7Cc,EAAS,QAAQ,OAAOS,CAAK;AAAA,EAEjC,GAAG,CAAA,CAAE;AAGL,EAAAE,EAAU,MAAM;AACd,UAAMC,IAAqB,CAACC,MAAsB;AAChD,MAAIX,EAAY,WAAW,CAACA,EAAY,QAAQ,SAASW,EAAM,MAAc,MAC3ER,EAAU,EAAK,GACfR,EAAgB,EAAE;AAAA,IAEtB;AAEA,QAAIO;AACF,sBAAS,iBAAiB,aAAaQ,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAE7E,GAAG,CAACR,CAAM,CAAC;AAEX,QAAMU,IAA0C;AAAA,IAC9C,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,GAGHC,IAAuC;AAAA,IAC3C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EAAA,GAGDC,IAAkB;AAAA,IACtB;AAAA,IACAF,EAAgBhC,CAAQ;AAAA,IACxBiC,EAAahC,CAAK;AAAA,IAClBF,KAAS;AAAA,IACTuB,KAAU;AAAA,IACVhB;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAA6B;AAAA,IAAC3C,EAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL,UAAAQ;AAAA,QACA,OAAAC;AAAA,QACA,QAAAO;AAAA,QACA,WAAAE;AAAA,QACA,QAAAY;AAAA,QACA,WAAAC;AAAA,QACA,cAAAT;AAAA,QACA,iBAAAC;AAAA,QACA,cAAAW;AAAA,QACA,WAAAV;AAAA,QACA,cAAAC;AAAA,QACA,UAAAb;AAAA,QACA,OAAAC;AAAA,MAAA;AAAA,MAGF,UAAA,gBAAA8B,EAAC,OAAA,EAAI,KAAKf,GAAa,WAAWc,GAAiB,cAAYZ,IAAS,SAAS,UAAU,iBAAelB,KAAY,QAAY,GAAGG,GAAO,UAAAT,EAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAG3J;AAEA,SAASsC,EAAgB,EAAE,UAAAtC,GAAU,WAAAQ,IAAY,MAA4B;AAC3E,QAAM,EAAE,QAAAE,GAAQ,WAAAE,GAAW,QAAAY,GAAQ,WAAAC,GAAW,iBAAAR,GAAiB,WAAAC,GAAW,UAAAZ,EAAA,IAAaV,EAAA,GAEjF2C,IAAgB,CAACN,MAA+B;AACpD,YAAQA,EAAM,KAAA;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,EAAM,eAAA,GACNR,EAAU,EAAI,GACdR,EAAgB,CAAC;AACjB;AAAA,MACF,KAAK;AACH,QAAAgB,EAAM,eAAA,GACNR,EAAU,EAAI,GACdR,EAAgBC,IAAY,CAAC;AAC7B;AAAA,MACF,KAAK;AACH,QAAAe,EAAM,eAAA,GACNR,EAAU,EAAK,GACfR,EAAgB,EAAE;AAClB;AAAA,IAAA;AAAA,EAEN,GAEMuB,IAAc,MAAM;AACxB,IAAAf,EAAU,CAACD,CAAM,GACZA,KACHP,EAAgB,CAAC;AAAA,EAErB;AAEA,SACE,gBAAAoB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAIzB;AAAA,MACJ,MAAK;AAAA,MACL,UAAUN,IAAW,KAAK;AAAA,MAC1B,WAAW,OAAOE,CAAS;AAAA,MAC3B,iBAAc;AAAA,MACd,iBAAegB;AAAA,MACf,iBAAed;AAAA,MACf,UAAAJ;AAAA,MACA,SAASkC;AAAA,MACT,WAAWD;AAAA,MAEV,UAAAvC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASyC,EAAa,EAAE,UAAAzC,GAAU,WAAAQ,IAAY,MAAyB;AACrE,QAAM,EAAE,QAAAE,GAAQ,WAAAE,GAAW,QAAAY,GAAQ,WAAAC,GAAW,cAAAT,GAAc,iBAAAC,GAAiB,cAAAE,GAAc,OAAAZ,GAAO,UAAAL,EAAA,IAAaN,EAAA,GACzG8C,IAAUrB,EAAyB,IAAI,GAGvCsB,IAAaC,EAAM,SAAS,QAAQ5C,CAAQ,EAAE;AAAA,IAClD,CAAC6C,MAAUD,EAAM,eAAeC,CAAK,KAAMA,EAAM,SAASC;AAAA,EAAA;AAG5D,EAAAf,EAAU,MAAM;AACd,IAAAZ,EAAawB,EAAW,MAAM;AAAA,EAChC,GAAG,CAACA,EAAW,QAAQxB,CAAY,CAAC,GAGpCY,EAAU,MAAM;AACd,IAAIP,KAAUR,KAAgB,KAAK0B,EAAQ,WAC3BA,EAAQ,QAAQ,iBAAiB,+CAA+C,EAC3E1B,CAAY,GACzB,MAAA;AAAA,EAEV,GAAG,CAACQ,GAAQR,CAAY,CAAC;AAEzB,QAAMuB,IAAgB,CAACN,MAA+B;AAIpD,UAAMc,IAHeJ,EAAW;AAAA,MAC9B,CAACE,MAAUD,EAAM,eAAeC,CAAK,KAAK,CAAEA,EAAM,MAA4B;AAAA,IAAA,EAE9C;AAElC,YAAQZ,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAA,EAAM,eAAA,GACNhB,GAAiBD,IAAe,KAAK+B,CAAY;AACjD;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNhB,GAAiBD,IAAe,IAAI+B,KAAgBA,CAAY;AAChE;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNhB,EAAgB,CAAC;AACjB;AAAA,MACF,KAAK;AACH,QAAAgB,EAAM,eAAA,GACNhB,EAAgB8B,IAAe,CAAC;AAChC;AAAA,MACF,KAAK;AACH,QAAAd,EAAM,eAAA,GACNR,EAAU,EAAK,GACfR,EAAgB,EAAE,GAElB,SAAS,eAAeL,CAAS,GAAG,MAAA;AACpC;AAAA,MACF,KAAK;AACH,QAAAa,EAAU,EAAK,GACfR,EAAgB,EAAE;AAClB;AAAA,IAAA;AAAA,EAEN,GAEM+B,IAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAxC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAGLyC,IAAoBL,EAAM,SAAS,IAAI5C,GAAU,CAAC6C,GAAOhB,MACzDe,EAAM,eAAeC,CAAK,KAAKA,EAAM,SAASC,IACzCF,EAAM,aAAaC,GAAkC,EAAE,QAAQhB,GAAO,IAExEgB,CACR,GAUKK,IAAe3C,IACnB,gBAAA8B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,0CATsC;AAAA,QACnD,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA,EAKqEnC,KAAY,QAAQ,CAAC;AAAA,MAC/F,eAAY;AAAA,IAAA;AAAA,EAAA,IAEZ;AAEJ,SACE,gBAAAiD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKT;AAAA,MACL,IAAIhC;AAAA,MACJ,MAAK;AAAA,MACL,mBAAiBE;AAAA,MACjB,UAAU;AAAA,MACV,WAAW,GAAGoC,CAAW,IAAIzC,IAAQ,aAAa,EAAE;AAAA,MACpD,WAAWgC;AAAA,MAEV,UAAA;AAAA,QAAAW;AAAA,QACAD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASH,EAAa;AAAA,EACpB,UAAA9C;AAAA,EACA,SAAAoD;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAA/C,IAAW;AAAA,EACX,QAAAgD,IAAS;AAAA,EACT,WAAA9C,IAAY;AACd,GAAsB;AACpB,QAAM,EAAE,WAAAiB,GAAW,iBAAAR,GAAiB,WAAAL,EAAA,IAAchB,EAAA,GAC5C2D,IAAc,CAACF,KAAU,UAAU/C,KAAY,YAAYE,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAE9FgC,IAAc,MAAM;AACxB,IAAKlC,MACH8C,IAAA,GACA3B,EAAU,EAAK,GACfR,EAAgB,EAAE,GAClB,SAAS,eAAeL,CAAS,GAAG,MAAA;AAAA,EAExC;AASA,SACE,gBAAAyB,EAAC,MAAA,EAAG,WAAWkB,GAAa,MAAK,QAC/B,UAAA,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU/B,IAAW,KAAK;AAAA,MAC1B,iBAAeA,KAAY;AAAA,MAC3B,WAAWgD,IAAS,eAAe;AAAA,MACnC,SAASd;AAAA,MACT,WAfgB,CAACP,MAA+B;AACpD,SAAKA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,QAAQ,CAAC3B,MACnD2B,EAAM,eAAA,GACNO,EAAA;AAAA,MAEJ;AAAA,MAYO,UAAAxC;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;AAEA,SAASwD,EAAgB,EAAE,WAAAhD,IAAY,MAA4B;AACjE,QAAMiD,IAAU,CAAC,0BAA0BjD,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC9E,SACE,gBAAA6B,EAAC,MAAA,EAAG,MAAK,aAAY,WAAU,QAC7B,UAAA,gBAAAA,EAAC,MAAA,EAAG,WAAWoB,EAAA,CAAS,EAAA,CAC1B;AAEJ;AAEO,MAAMC,IAAW,OAAO,OAAO3D,GAAc;AAAA,EAClD,SAASuC;AAAA,EACT,MAAMG;AAAA,EACN,MAAMK;AAAA,EACN,SAASU;AACX,CAAC;"}
package/dist/index9.js CHANGED
@@ -1,19 +1,22 @@
1
- import { jsx as s, jsxs as j, Fragment as v } from "react/jsx-runtime";
2
- const T = ({
3
- children: l,
4
- type: e,
5
- size: b = "md",
6
- outline: i = !1,
7
- dash: d = !1,
8
- soft: u = !1,
9
- active: f = !1,
10
- loading: t = !1,
11
- shape: a,
12
- noAnimation: m = !1,
13
- className: h = "",
14
- ...n
1
+ import { jsx as a, jsxs as B, Fragment as z } from "react/jsx-runtime";
2
+ const $ = ({
3
+ children: t,
4
+ type: u,
5
+ size: f = "md",
6
+ outline: m = !1,
7
+ dash: h = !1,
8
+ soft: y = !1,
9
+ active: p = !1,
10
+ loading: n = !1,
11
+ shape: l,
12
+ noAnimation: x = !1,
13
+ icon: e,
14
+ iconPosition: r = "start",
15
+ danger: g = !1,
16
+ className: v = "",
17
+ ...s
15
18
  }) => {
16
- const y = {
19
+ const c = g ? "error" : u, C = {
17
20
  primary: "btn-primary",
18
21
  secondary: "btn-secondary",
19
22
  accent: "btn-accent",
@@ -24,50 +27,53 @@ const T = ({
24
27
  neutral: "btn-neutral",
25
28
  ghost: "btn-ghost",
26
29
  link: "btn-link"
27
- }, g = {
30
+ }, k = {
28
31
  xs: "btn-xs",
29
32
  sm: "btn-sm",
30
33
  md: "",
31
34
  lg: "btn-lg",
32
35
  xl: "btn-xl"
33
- }, x = {
36
+ }, w = {
34
37
  square: "btn-square",
35
38
  circle: "btn-circle",
36
39
  wide: "btn-wide",
37
- block: "btn-block"
38
- }, r = [
40
+ block: "btn-block",
41
+ round: "rounded-full"
42
+ }, o = [
39
43
  "btn",
40
- e && y[e],
41
- g[b],
42
- i && "btn-outline",
43
- d && "btn-dash",
44
- u && "btn-soft",
45
- f && "btn-active",
46
- a && x[a],
47
- m && "no-animation",
48
- h
49
- ].filter(Boolean).join(" "), o = /* @__PURE__ */ j(v, { children: [
50
- t && /* @__PURE__ */ s("span", { className: "loading loading-spinner", "aria-hidden": "true" }),
51
- l
44
+ c && C[c],
45
+ k[f],
46
+ m && "btn-outline",
47
+ h && "btn-dash",
48
+ y && "btn-soft",
49
+ p && "btn-active",
50
+ l && w[l],
51
+ x && "no-animation",
52
+ v
53
+ ].filter(Boolean).join(" "), N = t != null && t !== "" ? r === "start" ? "mr-2" : "ml-2" : "", b = e && /* @__PURE__ */ a("span", { className: `inline-flex items-center ${N}`, "aria-hidden": "true", children: e }), i = /* @__PURE__ */ B(z, { children: [
54
+ n && /* @__PURE__ */ a("span", { className: "loading loading-spinner", "aria-hidden": "true" }),
55
+ !n && e && r === "start" && b,
56
+ t,
57
+ !n && e && r === "end" && b
52
58
  ] });
53
- if ("href" in n && n.href !== void 0) {
54
- const { href: k, ...w } = n;
55
- return /* @__PURE__ */ s("a", { href: k, className: r, ...w, children: o });
59
+ if ("href" in s && s.href !== void 0) {
60
+ const { href: j, ...q } = s;
61
+ return /* @__PURE__ */ a("a", { href: j, className: o, ...q, children: i });
56
62
  }
57
- const { htmlType: p, ...c } = n;
58
- return /* @__PURE__ */ s(
63
+ const { htmlType: T, ...d } = s;
64
+ return /* @__PURE__ */ a(
59
65
  "button",
60
66
  {
61
- type: p ?? "button",
62
- className: r,
63
- "aria-busy": t ? "true" : void 0,
64
- disabled: t || c.disabled,
65
- ...c,
66
- children: o
67
+ type: T ?? "button",
68
+ className: o,
69
+ "aria-busy": n ? "true" : void 0,
70
+ disabled: n || d.disabled,
71
+ ...d,
72
+ children: i
67
73
  }
68
74
  );
69
75
  };
70
76
  export {
71
- T as Button
77
+ $ as Button
72
78
  };
73
79
  //# sourceMappingURL=index9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index9.js","sources":["../src/components/Button.tsx"],"sourcesContent":["import React from 'react'\n\ntype BaseButtonProps = {\n type?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral' | 'ghost' | 'link'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n outline?: boolean\n dash?: boolean\n soft?: boolean\n active?: boolean\n loading?: boolean\n shape?: 'square' | 'circle' | 'wide' | 'block'\n noAnimation?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n type,\n size = 'md',\n outline = false,\n dash = false,\n soft = false,\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n className = '',\n ...props\n}) => {\n const typeClasses = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n info: 'btn-info',\n success: 'btn-success',\n warning: 'btn-warning',\n error: 'btn-error',\n neutral: 'btn-neutral',\n ghost: 'btn-ghost',\n link: 'btn-link',\n }\n\n const sizeClasses = {\n xs: 'btn-xs',\n sm: 'btn-sm',\n md: '',\n lg: 'btn-lg',\n xl: 'btn-xl',\n }\n\n const shapeClasses = {\n square: 'btn-square',\n circle: 'btn-circle',\n wide: 'btn-wide',\n block: 'btn-block',\n }\n\n const classes = [\n 'btn',\n type && typeClasses[type],\n sizeClasses[size],\n outline && 'btn-outline',\n dash && 'btn-dash',\n soft && 'btn-soft',\n active && 'btn-active',\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const content = (\n <>\n {loading && <span className=\"loading loading-spinner\" aria-hidden=\"true\"></span>}\n {children}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, ...anchorProps } = props as ButtonAsAnchor\n return (\n <a href={href} className={classes} {...anchorProps}>\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading ? 'true' : undefined}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["Button","children","type","size","outline","dash","soft","active","loading","shape","noAnimation","className","props","typeClasses","sizeClasses","shapeClasses","classes","content","jsxs","Fragment","jsx","href","anchorProps","htmlType","buttonProps"],"mappings":";AA4BO,MAAMA,IAAgC,CAAC;AAAA,EAC5C,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAc;AAAA,IAClB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,GAGFC,IAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,GAGHC,IAAU;AAAA,IACd;AAAA,IACAd,KAAQW,EAAYX,CAAI;AAAA,IACxBY,EAAYX,CAAI;AAAA,IAChBC,KAAW;AAAA,IACXC,KAAQ;AAAA,IACRC,KAAQ;AAAA,IACRC,KAAU;AAAA,IACVE,KAASM,EAAaN,CAAK;AAAA,IAC3BC,KAAe;AAAA,IACfC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELM,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAX,KAAW,gBAAAY,EAAC,QAAA,EAAK,WAAU,2BAA0B,eAAY,QAAO;AAAA,IACxEnB;AAAA,EAAA,GACH;AAGF,MAAI,UAAUW,KAASA,EAAM,SAAS,QAAW;AAC/C,UAAM,EAAE,MAAAS,GAAM,GAAGC,EAAA,IAAgBV;AACjC,6BACG,KAAA,EAAE,MAAAS,GAAY,WAAWL,GAAU,GAAGM,GACpC,UAAAL,GACH;AAAA,EAEJ;AAEA,QAAM,EAAE,UAAAM,GAAU,GAAGC,EAAA,IAAgBZ;AAErC,SACE,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAH8CG,KAAY;AAAA,MAI1D,WAAWP;AAAA,MACX,aAAWR,IAAU,SAAS;AAAA,MAC9B,UAAUA,KAAWgB,EAAY;AAAA,MAChC,GAAGA;AAAA,MAEH,UAAAP;AAAA,IAAA;AAAA,EAAA;AAGP;"}
1
+ {"version":3,"file":"index9.js","sources":["../src/components/Button.tsx"],"sourcesContent":["import React from 'react'\n\ntype BaseButtonProps = {\n type?: 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'neutral' | 'ghost' | 'link'\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n outline?: boolean\n dash?: boolean\n soft?: boolean\n active?: boolean\n loading?: boolean\n shape?: 'square' | 'circle' | 'wide' | 'block' | 'round'\n noAnimation?: boolean\n /** Icon element to display */\n icon?: React.ReactNode\n /** Position of the icon */\n iconPosition?: 'start' | 'end'\n /** Applies error/danger styling (shorthand for type=\"error\") */\n danger?: boolean\n}\n\ntype ButtonAsButton = BaseButtonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & {\n href?: undefined\n htmlType?: 'button' | 'submit' | 'reset'\n }\n\ntype ButtonAsAnchor = BaseButtonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'type'> & {\n href: string\n htmlType?: undefined\n }\n\nexport type ButtonProps = ButtonAsButton | ButtonAsAnchor\n\nexport const Button: React.FC<ButtonProps> = ({\n children,\n type,\n size = 'md',\n outline = false,\n dash = false,\n soft = false,\n active = false,\n loading = false,\n shape,\n noAnimation = false,\n icon,\n iconPosition = 'start',\n danger = false,\n className = '',\n ...props\n}) => {\n // danger prop is a shorthand for type=\"error\"\n const effectiveType = danger ? 'error' : type\n const typeClasses = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n accent: 'btn-accent',\n info: 'btn-info',\n success: 'btn-success',\n warning: 'btn-warning',\n error: 'btn-error',\n neutral: 'btn-neutral',\n ghost: 'btn-ghost',\n link: 'btn-link',\n }\n\n const sizeClasses = {\n xs: 'btn-xs',\n sm: 'btn-sm',\n md: '',\n lg: 'btn-lg',\n xl: 'btn-xl',\n }\n\n const shapeClasses = {\n square: 'btn-square',\n circle: 'btn-circle',\n wide: 'btn-wide',\n block: 'btn-block',\n round: 'rounded-full',\n }\n\n const classes = [\n 'btn',\n effectiveType && typeClasses[effectiveType],\n sizeClasses[size],\n outline && 'btn-outline',\n dash && 'btn-dash',\n soft && 'btn-soft',\n active && 'btn-active',\n shape && shapeClasses[shape],\n noAnimation && 'no-animation',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Determine icon spacing based on whether there's text content\n const hasChildren = children !== undefined && children !== null && children !== ''\n const iconSpacing = hasChildren ? (iconPosition === 'start' ? 'mr-2' : 'ml-2') : ''\n\n const iconElement = icon && (\n <span className={`inline-flex items-center ${iconSpacing}`} aria-hidden=\"true\">\n {icon}\n </span>\n )\n\n const content = (\n <>\n {loading && <span className=\"loading loading-spinner\" aria-hidden=\"true\"></span>}\n {!loading && icon && iconPosition === 'start' && iconElement}\n {children}\n {!loading && icon && iconPosition === 'end' && iconElement}\n </>\n )\n\n if ('href' in props && props.href !== undefined) {\n const { href, ...anchorProps } = props as ButtonAsAnchor\n return (\n <a href={href} className={classes} {...anchorProps}>\n {content}\n </a>\n )\n }\n\n const { htmlType, ...buttonProps } = props as Omit<ButtonAsButton, keyof BaseButtonProps>\n const buttonType: 'button' | 'submit' | 'reset' = htmlType ?? 'button'\n return (\n <button\n type={buttonType}\n className={classes}\n aria-busy={loading ? 'true' : undefined}\n disabled={loading || buttonProps.disabled}\n {...buttonProps}\n >\n {content}\n </button>\n )\n}\n"],"names":["Button","children","type","size","outline","dash","soft","active","loading","shape","noAnimation","icon","iconPosition","danger","className","props","effectiveType","typeClasses","sizeClasses","shapeClasses","classes","iconSpacing","iconElement","jsx","content","jsxs","Fragment","href","anchorProps","htmlType","buttonProps"],"mappings":";AAkCO,MAAMA,IAAgC,CAAC;AAAA,EAC5C,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AAEJ,QAAMC,IAAgBH,IAAS,UAAUX,GACnCe,IAAc;AAAA,IAClB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EAAA,GAGFC,IAAc;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA,GAGAC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EAAA,GAGHC,IAAU;AAAA,IACd;AAAA,IACAJ,KAAiBC,EAAYD,CAAa;AAAA,IAC1CE,EAAYf,CAAI;AAAA,IAChBC,KAAW;AAAA,IACXC,KAAQ;AAAA,IACRC,KAAQ;AAAA,IACRC,KAAU;AAAA,IACVE,KAASU,EAAaV,CAAK;AAAA,IAC3BC,KAAe;AAAA,IACfI;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAILO,IADwCpB,KAAa,QAAQA,MAAa,KAC7CW,MAAiB,UAAU,SAAS,SAAU,IAE3EU,IAAcX,KAClB,gBAAAY,EAAC,QAAA,EAAK,WAAW,4BAA4BF,CAAW,IAAI,eAAY,QACrE,UAAAV,EAAA,CACH,GAGIa,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAlB,KAAW,gBAAAe,EAAC,QAAA,EAAK,WAAU,2BAA0B,eAAY,QAAO;AAAA,IACxE,CAACf,KAAWG,KAAQC,MAAiB,WAAWU;AAAA,IAChDrB;AAAA,IACA,CAACO,KAAWG,KAAQC,MAAiB,SAASU;AAAA,EAAA,GACjD;AAGF,MAAI,UAAUP,KAASA,EAAM,SAAS,QAAW;AAC/C,UAAM,EAAE,MAAAY,GAAM,GAAGC,EAAA,IAAgBb;AACjC,6BACG,KAAA,EAAE,MAAAY,GAAY,WAAWP,GAAU,GAAGQ,GACpC,UAAAJ,GACH;AAAA,EAEJ;AAEA,QAAM,EAAE,UAAAK,GAAU,GAAGC,EAAA,IAAgBf;AAErC,SACE,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAH8CM,KAAY;AAAA,MAI1D,WAAWT;AAAA,MACX,aAAWZ,IAAU,SAAS;AAAA,MAC9B,UAAUA,KAAWsB,EAAY;AAAA,MAChC,GAAGA;AAAA,MAEH,UAAAN;AAAA,IAAA;AAAA,EAAA;AAGP;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asterui",
3
- "version": "0.12.4",
3
+ "version": "0.12.6",
4
4
  "description": "React UI component library with DaisyUI",
5
5
  "homepage": "https://asterui.com",
6
6
  "repository": {