asterui 0.12.75 → 0.12.77

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.
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  export type DropdownTriggerType = 'click' | 'hover' | 'contextMenu';
3
+ export type DropdownPlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right';
3
4
  export interface DropdownMenuItem {
4
5
  key: string;
5
6
  label: React.ReactNode;
@@ -14,15 +15,30 @@ export interface DropdownMenuDivider {
14
15
  key?: string;
15
16
  }
16
17
  export type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider;
18
+ export interface DropdownMenuConfig {
19
+ /** Menu items */
20
+ items: DropdownMenuItemType[];
21
+ /** Callback when menu item is clicked */
22
+ onClick?: (info: {
23
+ key: string;
24
+ keyPath: string[];
25
+ }) => void;
26
+ }
27
+ export interface DropdownMenuProps {
28
+ children?: React.ReactNode;
29
+ className?: string;
30
+ }
17
31
  export interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
18
32
  /** Trigger element and dropdown content (compound pattern) */
19
33
  children?: React.ReactNode;
20
- /** Menu items (data-driven pattern) */
21
- items?: DropdownMenuItemType[];
34
+ /** Menu configuration (data-driven pattern) */
35
+ menu?: DropdownMenuConfig;
22
36
  /** Trigger mode(s) for dropdown */
23
37
  trigger?: DropdownTriggerType[];
24
- position?: 'top' | 'bottom' | 'left' | 'right';
25
- align?: 'start' | 'center' | 'end';
38
+ /** Placement of dropdown menu */
39
+ placement?: DropdownPlacement;
40
+ /** Whether to adjust dropdown placement automatically when dropdown is off screen */
41
+ autoAdjustOverflow?: boolean;
26
42
  /** Controlled open state */
27
43
  open?: boolean;
28
44
  /** Callback when open state changes */
@@ -1,87 +1,96 @@
1
- import { jsx as i, jsxs as K, Fragment as H } from "react/jsx-runtime";
2
- import d, { forwardRef as Ie, useId as J, useState as B, useRef as N, useImperativeHandle as Ce, useCallback as $, useEffect as V, createContext as xe, useContext as ke } from "react";
3
- import { useConfig as Ee } from "../providers/ConfigProvider.js";
4
- const ve = "dropdown", Me = "dropdown-top", Ae = "dropdown-bottom", Te = "dropdown-left", Re = "dropdown-right", Se = "dropdown-center", Ke = "dropdown-end", Ne = "dropdown-hover", Pe = "dropdown-open", $e = "dropdown-content", ne = "menu", te = xe(void 0);
5
- function X() {
6
- const u = ke(te);
7
- if (!u)
1
+ import { jsx as i, jsxs as K, Fragment as Q } from "react/jsx-runtime";
2
+ import u, { forwardRef as xe, useId as X, useState as j, useRef as L, useImperativeHandle as ve, useCallback as O, useEffect as V, createContext as Ee, useContext as Me } from "react";
3
+ import { useConfig as Ae } from "../providers/ConfigProvider.js";
4
+ const Te = "dropdown", Re = "dropdown-top", Se = "dropdown-bottom", Ke = "dropdown-left", Le = "dropdown-right", Ne = "dropdown-center", Pe = "dropdown-end", Oe = "dropdown-hover", $e = "dropdown-open", je = "dropdown-content", ne = "menu", oe = Ee(void 0);
5
+ function Z() {
6
+ const p = Me(oe);
7
+ if (!p)
8
8
  throw new Error("Dropdown compound components must be used within Dropdown");
9
- return u;
9
+ return p;
10
10
  }
11
- const Le = Ie(function({
11
+ const Be = xe(function({
12
12
  children: c,
13
- items: m,
14
- trigger: p = ["hover"],
15
- position: b = "bottom",
16
- align: o = "start",
17
- open: s,
18
- onOpenChange: r,
19
- disabled: y,
13
+ menu: f,
14
+ trigger: m = ["hover"],
15
+ placement: y = "bottomLeft",
16
+ autoAdjustOverflow: l = !0,
17
+ open: r,
18
+ onOpenChange: o,
19
+ disabled: d,
20
20
  arrow: w = !1,
21
- mouseEnterDelay: h = 0.15,
22
- mouseLeaveDelay: I = 0.1,
23
- getPopupContainer: g,
24
- destroyOnHidden: t = !1,
25
- popupRender: E,
26
- "data-testid": C,
27
- className: T = "",
21
+ mouseEnterDelay: g = 0.15,
22
+ mouseLeaveDelay: h = 0.1,
23
+ getPopupContainer: I,
24
+ destroyOnHidden: n = !1,
25
+ popupRender: v,
26
+ "data-testid": E,
27
+ className: C = "",
28
28
  ...F
29
- }, a) {
30
- const { componentDisabled: n } = Ee(), f = y ?? n ?? !1, x = J(), v = J(), [L, oe] = B(!1), [se, q] = B(-1), [ae, le] = B(0), [ie, Z] = B(!t), ee = N(/* @__PURE__ */ new Map()), z = N(null), M = N(null), R = p;
31
- Ce(a, () => z.current, []);
32
- const ce = (e) => C ? `${C}-${e}` : void 0, W = s !== void 0, S = W ? s : L, k = $((e, D = "trigger") => {
33
- f || (W || oe(e), e && Z(!0), r?.(e, { source: D }));
34
- }, [f, W, r]), de = $(() => {
35
- k(!1, "menu"), q(-1), document.getElementById(v)?.focus();
36
- }, [k, v]), ue = $((e, D, l) => {
37
- D ? ee.current.set(e, { ref: D, disabled: l }) : ee.current.delete(e);
29
+ }, s) {
30
+ const { componentDisabled: t } = Ae(), b = d ?? t ?? !1, k = {
31
+ top: { position: "top", align: "center" },
32
+ topLeft: { position: "top", align: "start" },
33
+ topRight: { position: "top", align: "end" },
34
+ bottom: { position: "bottom", align: "center" },
35
+ bottomLeft: { position: "bottom", align: "start" },
36
+ bottomRight: { position: "bottom", align: "end" },
37
+ left: { position: "left", align: "start" },
38
+ right: { position: "right", align: "start" }
39
+ }, { position: M, align: N } = k[y], se = X(), G = X(), [ae, ie] = j(!1), [le, q] = j(-1), [ce, de] = j(0), [ue, ee] = j(!n), te = L(/* @__PURE__ */ new Map()), z = L(null), A = L(null), R = m;
40
+ ve(s, () => z.current, []);
41
+ const pe = (e) => E ? `${E}-${e}` : void 0, H = r !== void 0, S = H ? r : ae, x = O((e, D = "trigger") => {
42
+ b || (H || ie(e), e && ee(!0), o?.(e, { source: D }));
43
+ }, [b, H, o]), fe = O(() => {
44
+ x(!1, "menu"), q(-1), document.getElementById(G)?.focus();
45
+ }, [x, G]), me = O((e, D, a) => {
46
+ D ? te.current.set(e, { ref: D, disabled: a }) : te.current.delete(e);
38
47
  }, []);
39
48
  V(() => {
40
- if (t && !S) {
41
- const e = setTimeout(() => Z(!1), 300);
49
+ if (n && !S) {
50
+ const e = setTimeout(() => ee(!1), 300);
42
51
  return () => clearTimeout(e);
43
52
  }
44
- }, [S, t]), V(() => {
53
+ }, [S, n]), V(() => {
45
54
  const e = (D) => {
46
- z.current && !z.current.contains(D.target) && (k(!1, "trigger"), q(-1));
55
+ z.current && !z.current.contains(D.target) && (x(!1, "trigger"), q(-1));
47
56
  };
48
57
  if (S)
49
58
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
50
- }, [S, k]);
51
- const pe = $(() => {
52
- R.includes("hover") && (M.current && clearTimeout(M.current), M.current = setTimeout(() => {
53
- k(!0, "trigger");
59
+ }, [S, x]);
60
+ const be = O(() => {
61
+ R.includes("hover") && (A.current && clearTimeout(A.current), A.current = setTimeout(() => {
62
+ x(!0, "trigger");
63
+ }, g * 1e3));
64
+ }, [R, g, x]), we = O(() => {
65
+ R.includes("hover") && (A.current && clearTimeout(A.current), A.current = setTimeout(() => {
66
+ x(!1, "trigger"), q(-1);
54
67
  }, h * 1e3));
55
- }, [R, h, k]), fe = $(() => {
56
- R.includes("hover") && (M.current && clearTimeout(M.current), M.current = setTimeout(() => {
57
- k(!1, "trigger"), q(-1);
58
- }, I * 1e3));
59
- }, [R, I, k]), me = $((e) => {
60
- R.includes("contextMenu") && (e.preventDefault(), k(!0, "trigger"));
61
- }, [R, k]);
68
+ }, [R, h, x]), ge = O((e) => {
69
+ R.includes("contextMenu") && (e.preventDefault(), x(!0, "trigger"));
70
+ }, [R, x]);
62
71
  V(() => () => {
63
- M.current && clearTimeout(M.current);
72
+ A.current && clearTimeout(A.current);
64
73
  }, []);
65
- const be = {
66
- top: Me,
67
- bottom: Ae,
68
- left: Te,
69
- right: Re
70
- }, we = {
74
+ const he = {
75
+ top: Re,
76
+ bottom: Se,
77
+ left: Ke,
78
+ right: Le
79
+ }, De = {
71
80
  start: "",
72
- center: Se,
73
- end: Ke
74
- }, he = typeof w == "boolean" ? w : !!w, _ = m ? (ie || !t) && /* @__PURE__ */ i(Q, { children: m ? m.map((e, D) => {
81
+ center: Ne,
82
+ end: Pe
83
+ }, ye = typeof w == "boolean" ? w : !!w, W = f ? (ue || !n) && /* @__PURE__ */ i(Y, { children: f?.items ? f.items.map((e, D) => {
75
84
  if ("type" in e && e.type === "divider")
76
85
  return /* @__PURE__ */ i(re, {}, e.key || `divider-${D}`);
77
- const l = e;
78
- return l.children && l.children.length > 0 ? /* @__PURE__ */ i(
79
- Y,
86
+ const a = e;
87
+ return a.children && a.children.length > 0 ? /* @__PURE__ */ i(
88
+ _,
80
89
  {
81
- title: l.label,
82
- icon: l.icon,
83
- disabled: l.disabled,
84
- children: l.children.map((P) => /* @__PURE__ */ i(
90
+ title: a.label,
91
+ icon: a.icon,
92
+ disabled: a.disabled,
93
+ children: a.children.map((P) => /* @__PURE__ */ i(
85
94
  U,
86
95
  {
87
96
  icon: P.icon,
@@ -93,174 +102,175 @@ const Le = Ie(function({
93
102
  P.key
94
103
  ))
95
104
  },
96
- l.key
105
+ a.key
97
106
  ) : /* @__PURE__ */ i(
98
107
  U,
99
108
  {
100
- icon: l.icon,
101
- disabled: l.disabled,
102
- danger: l.danger,
103
- onClick: l.onClick,
104
- children: l.label
109
+ icon: a.icon,
110
+ disabled: a.disabled,
111
+ danger: a.danger,
112
+ onClick: a.onClick,
113
+ children: a.label
105
114
  },
106
- l.key
115
+ a.key
107
116
  );
108
- }) : null }) : null, A = d.Children.toArray(c), ge = A.some(
109
- (e) => d.isValidElement(e) && e.type === O
110
- ), De = A.some(
111
- (e) => d.isValidElement(e) && e.type === Q
117
+ }) : null }) : null, T = u.Children.toArray(c), Ie = T.some(
118
+ (e) => u.isValidElement(e) && e.type === B
119
+ ), Ce = T.some(
120
+ (e) => u.isValidElement(e) && e.type === Y
112
121
  );
113
- let j, G = !1;
114
- if (m) {
115
- const e = A.find(
116
- (D) => d.isValidElement(D) && D.type === O
122
+ let $, J = !1;
123
+ if (f) {
124
+ const e = T.find(
125
+ (D) => u.isValidElement(D) && D.type === B
117
126
  );
118
- !e && A[0] && d.isValidElement(A[0]) ? (G = !0, j = /* @__PURE__ */ K(H, { children: [
119
- /* @__PURE__ */ i(O, { className: T, children: A[0] }),
120
- E ? E(_) : _
121
- ] })) : j = /* @__PURE__ */ K(H, { children: [
127
+ !e && T[0] && u.isValidElement(T[0]) ? (J = !0, $ = /* @__PURE__ */ K(Q, { children: [
128
+ /* @__PURE__ */ i(B, { className: C, children: T[0] }),
129
+ v ? v(W) : W
130
+ ] })) : $ = /* @__PURE__ */ K(Q, { children: [
122
131
  e,
123
- E ? E(_) : _
132
+ v ? v(W) : W
124
133
  ] });
125
- } else if (!ge && !De && A.length >= 2) {
126
- const [e, D, ...l] = A;
127
- G = !0, j = /* @__PURE__ */ K(H, { children: [
128
- e && d.isValidElement(e) && /* @__PURE__ */ i(O, { className: T, children: e }),
134
+ } else if (!Ie && !Ce && T.length >= 2) {
135
+ const [e, D, ...a] = T;
136
+ J = !0, $ = /* @__PURE__ */ K(Q, { children: [
137
+ e && u.isValidElement(e) && /* @__PURE__ */ i(B, { className: C, children: e }),
129
138
  D,
130
- l
139
+ a
131
140
  ] });
132
141
  } else
133
- j = c;
134
- const ye = [
135
- ve,
136
- be[b],
137
- we[o],
138
- R.includes("hover") && Ne,
139
- S && Pe,
140
- !G && T
142
+ $ = c;
143
+ const ke = [
144
+ Te,
145
+ he[M],
146
+ De[N],
147
+ R.includes("hover") && Oe,
148
+ S && $e,
149
+ !J && C
141
150
  ].filter(Boolean).join(" ");
142
151
  return /* @__PURE__ */ i(
143
- te.Provider,
152
+ oe.Provider,
144
153
  {
145
154
  value: {
146
- position: b,
147
- align: o,
148
- menuId: x,
149
- triggerId: v,
155
+ position: M,
156
+ align: N,
157
+ menuId: se,
158
+ triggerId: G,
150
159
  isOpen: S,
151
- setIsOpen: k,
152
- focusedIndex: se,
160
+ setIsOpen: x,
161
+ focusedIndex: le,
153
162
  setFocusedIndex: q,
154
- registerItem: ue,
155
- itemCount: ae,
156
- setItemCount: le,
157
- disabled: f,
158
- arrow: he,
159
- closeDropdown: de,
160
- getTestId: ce
163
+ registerItem: me,
164
+ itemCount: ce,
165
+ setItemCount: de,
166
+ disabled: b,
167
+ arrow: ye,
168
+ closeDropdown: fe,
169
+ getTestId: pe,
170
+ menuOnClick: f?.onClick
161
171
  },
162
172
  children: /* @__PURE__ */ i(
163
173
  "div",
164
174
  {
165
175
  ref: z,
166
- className: ye,
176
+ className: ke,
167
177
  "data-state": S ? "open" : "closed",
168
- "data-testid": C,
169
- "aria-disabled": f || void 0,
170
- onMouseEnter: pe,
171
- onMouseLeave: fe,
172
- onContextMenu: me,
178
+ "data-testid": E,
179
+ "aria-disabled": b || void 0,
180
+ onMouseEnter: be,
181
+ onMouseLeave: we,
182
+ onContextMenu: ge,
173
183
  ...F,
174
- children: j
184
+ children: $
175
185
  }
176
186
  )
177
187
  }
178
188
  );
179
189
  });
180
- function O({ children: u, className: c = "" }) {
181
- const { menuId: m, triggerId: p, isOpen: b, setIsOpen: o, setFocusedIndex: s, itemCount: r, disabled: y } = X(), w = (t) => {
182
- switch (t.key) {
190
+ function B({ children: p, className: c = "" }) {
191
+ const { menuId: f, triggerId: m, isOpen: y, setIsOpen: l, setFocusedIndex: r, itemCount: o, disabled: d } = Z(), w = (n) => {
192
+ switch (n.key) {
183
193
  case "Enter":
184
194
  case " ":
185
195
  case "ArrowDown":
186
- t.preventDefault(), o(!0), s(0);
196
+ n.preventDefault(), l(!0), r(0);
187
197
  break;
188
198
  case "ArrowUp":
189
- t.preventDefault(), o(!0), s(r - 1);
199
+ n.preventDefault(), l(!0), r(o - 1);
190
200
  break;
191
201
  case "Escape":
192
- t.preventDefault(), o(!1), s(-1);
202
+ n.preventDefault(), l(!1), r(-1);
193
203
  break;
194
204
  }
195
- }, h = () => {
196
- o(!b), b || s(0);
197
- }, I = d.Children.only(u), g = I.props;
198
- return d.cloneElement(I, {
199
- id: p,
200
- tabIndex: y ? -1 : 0,
205
+ }, g = () => {
206
+ l(!y), y || r(0);
207
+ }, h = u.Children.only(p), I = h.props;
208
+ return u.cloneElement(h, {
209
+ id: m,
210
+ tabIndex: d ? -1 : 0,
201
211
  "aria-haspopup": "menu",
202
- "aria-expanded": b,
203
- "aria-controls": m,
204
- onClick: (t) => {
205
- h(), g.onClick?.(t);
212
+ "aria-expanded": y,
213
+ "aria-controls": f,
214
+ onClick: (n) => {
215
+ g(), I.onClick?.(n);
206
216
  },
207
- onKeyDown: (t) => {
208
- w(t), g.onKeyDown?.(t);
217
+ onKeyDown: (n) => {
218
+ w(n), I.onKeyDown?.(n);
209
219
  },
210
- className: `${g.className || ""} ${c}`.trim()
220
+ className: `${I.className || ""} ${c}`.trim()
211
221
  });
212
222
  }
213
- function Q({ children: u, className: c = "" }) {
214
- const { menuId: m, triggerId: p, isOpen: b, setIsOpen: o, focusedIndex: s, setFocusedIndex: r, setItemCount: y, arrow: w, position: h, getTestId: I } = X(), g = N(null), t = d.Children.toArray(u).filter(
215
- (n) => d.isValidElement(n) && n.type === U
223
+ function Y({ children: p, className: c = "" }) {
224
+ const { menuId: f, triggerId: m, isOpen: y, setIsOpen: l, focusedIndex: r, setFocusedIndex: o, setItemCount: d, arrow: w, position: g, getTestId: h } = Z(), I = L(null), n = u.Children.toArray(p).filter(
225
+ (t) => u.isValidElement(t) && t.type === U
216
226
  );
217
227
  V(() => {
218
- y(t.length);
219
- }, [t.length, y]), V(() => {
220
- b && s >= 0 && g.current && g.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[s]?.focus();
221
- }, [b, s]);
222
- const E = (n) => {
223
- const x = t.filter(
224
- (v) => d.isValidElement(v) && !v.props.disabled
228
+ d(n.length);
229
+ }, [n.length, d]), V(() => {
230
+ y && r >= 0 && I.current && I.current.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])')[r]?.focus();
231
+ }, [y, r]);
232
+ const v = (t) => {
233
+ const k = n.filter(
234
+ (M) => u.isValidElement(M) && !M.props.disabled
225
235
  ).length;
226
- switch (n.key) {
236
+ switch (t.key) {
227
237
  case "ArrowDown":
228
- n.preventDefault(), r((s + 1) % x);
238
+ t.preventDefault(), o((r + 1) % k);
229
239
  break;
230
240
  case "ArrowUp":
231
- n.preventDefault(), r((s - 1 + x) % x);
241
+ t.preventDefault(), o((r - 1 + k) % k);
232
242
  break;
233
243
  case "Home":
234
- n.preventDefault(), r(0);
244
+ t.preventDefault(), o(0);
235
245
  break;
236
246
  case "End":
237
- n.preventDefault(), r(x - 1);
247
+ t.preventDefault(), o(k - 1);
238
248
  break;
239
249
  case "Escape":
240
- n.preventDefault(), o(!1), r(-1), document.getElementById(p)?.focus();
250
+ t.preventDefault(), l(!1), o(-1), document.getElementById(m)?.focus();
241
251
  break;
242
252
  case "Tab":
243
- o(!1), r(-1);
253
+ l(!1), o(-1);
244
254
  break;
245
255
  }
246
- }, C = [
247
- $e,
256
+ }, E = [
257
+ je,
248
258
  ne,
249
259
  "bg-base-100",
250
260
  "rounded-box",
251
261
  "z-50",
252
262
  "shadow",
253
263
  c
254
- ].filter(Boolean).join(" "), T = d.Children.map(u, (n, f) => {
255
- if (d.isValidElement(n)) {
256
- const x = n.key != null ? String(n.key) : void 0;
257
- if (n.type === U)
258
- return d.cloneElement(n, { _index: f, _key: x });
259
- if (n.type === Y)
260
- return d.cloneElement(n, { _key: x });
264
+ ].filter(Boolean).join(" "), C = u.Children.map(p, (t, b) => {
265
+ if (u.isValidElement(t)) {
266
+ const k = t.key != null ? String(t.key) : void 0;
267
+ if (t.type === U)
268
+ return u.cloneElement(t, { _index: b, _key: k });
269
+ if (t.type === _)
270
+ return u.cloneElement(t, { _key: k });
261
271
  }
262
- return n;
263
- }), a = w ? /* @__PURE__ */ i(
272
+ return t;
273
+ }), s = w ? /* @__PURE__ */ i(
264
274
  "span",
265
275
  {
266
276
  className: `absolute w-0 h-0 border-8 border-solid ${{
@@ -268,53 +278,53 @@ function Q({ children: u, className: c = "" }) {
268
278
  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",
269
279
  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",
270
280
  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"
271
- }[h || "bottom"]}`,
281
+ }[g || "bottom"]}`,
272
282
  "aria-hidden": "true"
273
283
  }
274
284
  ) : null;
275
285
  return /* @__PURE__ */ K(
276
286
  "ul",
277
287
  {
278
- ref: g,
279
- id: m,
288
+ ref: I,
289
+ id: f,
280
290
  role: "menu",
281
- "aria-labelledby": p,
291
+ "aria-labelledby": m,
282
292
  tabIndex: -1,
283
- className: `${C} ${w ? "relative" : ""}`,
284
- "data-testid": I("menu"),
285
- onKeyDown: E,
293
+ className: `${E} ${w ? "relative" : ""}`,
294
+ "data-testid": h("menu"),
295
+ onKeyDown: v,
286
296
  children: [
287
- a,
288
- T
297
+ s,
298
+ C
289
299
  ]
290
300
  }
291
301
  );
292
302
  }
293
303
  function U({
294
- children: u,
304
+ children: p,
295
305
  icon: c,
296
- label: m,
297
- onClick: p,
298
- active: b = !1,
299
- disabled: o = !1,
300
- danger: s = !1,
301
- className: r = "",
302
- _key: y
306
+ label: f,
307
+ onClick: m,
308
+ active: y = !1,
309
+ disabled: l = !1,
310
+ danger: r = !1,
311
+ className: o = "",
312
+ _key: d
303
313
  }) {
304
- const { closeDropdown: w, getTestId: h } = X(), I = [b && "active", o && "disabled", r].filter(Boolean).join(" "), g = () => {
305
- o || (p?.(), w());
306
- }, t = (C) => {
307
- (C.key === "Enter" || C.key === " ") && !o && (C.preventDefault(), g());
308
- }, E = m || u;
309
- return /* @__PURE__ */ i("li", { className: I, role: "none", "data-key": y, "data-testid": y ? h(`item-${y}`) : void 0, children: /* @__PURE__ */ K(
314
+ const { closeDropdown: w, getTestId: g, menuOnClick: h } = Z(), I = [y && "active", l && "disabled", o].filter(Boolean).join(" "), n = () => {
315
+ l || (m?.(), h && d && h({ key: d, keyPath: [d] }), w());
316
+ }, v = (C) => {
317
+ (C.key === "Enter" || C.key === " ") && !l && (C.preventDefault(), n());
318
+ }, E = f || p;
319
+ return /* @__PURE__ */ i("li", { className: I, role: "none", "data-key": d, "data-testid": d ? g(`item-${d}`) : void 0, children: /* @__PURE__ */ K(
310
320
  "a",
311
321
  {
312
322
  role: "menuitem",
313
- tabIndex: o ? -1 : 0,
314
- "aria-disabled": o || void 0,
315
- className: `whitespace-nowrap ${s ? "text-error" : ""}`,
316
- onClick: g,
317
- onKeyDown: t,
323
+ tabIndex: l ? -1 : 0,
324
+ "aria-disabled": l || void 0,
325
+ className: `whitespace-nowrap ${r ? "text-error" : ""}`,
326
+ onClick: n,
327
+ onKeyDown: v,
318
328
  children: [
319
329
  c && /* @__PURE__ */ i("span", { className: "mr-2 inline-flex items-center", children: c }),
320
330
  E
@@ -322,83 +332,83 @@ function U({
322
332
  }
323
333
  ) });
324
334
  }
325
- function Y({
326
- children: u,
335
+ function _({
336
+ children: p,
327
337
  title: c,
328
- icon: m,
329
- disabled: p = !1,
330
- className: b = "",
331
- _key: o
338
+ icon: f,
339
+ disabled: m = !1,
340
+ className: y = "",
341
+ _key: l
332
342
  }) {
333
- const [s, r] = B(!1), y = N(null), w = N(null), h = N(null), I = J(), g = () => {
334
- p || r(!0);
335
- }, t = () => {
336
- r(!1);
337
- }, E = () => {
343
+ const [r, o] = j(!1), d = L(null), w = L(null), g = L(null), h = X(), I = () => {
344
+ m || o(!0);
345
+ }, n = () => {
346
+ o(!1);
347
+ }, v = () => {
338
348
  setTimeout(() => {
339
- h.current?.querySelector('[role="menuitem"]:not([aria-disabled="true"])')?.focus();
349
+ g.current?.querySelector('[role="menuitem"]:not([aria-disabled="true"])')?.focus();
340
350
  }, 0);
341
- }, C = (a) => {
342
- if (!p)
343
- switch (a.key) {
351
+ }, E = (s) => {
352
+ if (!m)
353
+ switch (s.key) {
344
354
  case "ArrowRight":
345
355
  case "Enter":
346
356
  case " ":
347
- a.preventDefault(), a.stopPropagation(), r(!0), E();
357
+ s.preventDefault(), s.stopPropagation(), o(!0), v();
348
358
  break;
349
359
  case "ArrowLeft":
350
360
  case "Escape":
351
- a.preventDefault(), a.stopPropagation(), r(!1);
361
+ s.preventDefault(), s.stopPropagation(), o(!1);
352
362
  break;
353
363
  }
354
- }, T = (a) => {
355
- switch (a.key) {
364
+ }, C = (s) => {
365
+ switch (s.key) {
356
366
  case "ArrowLeft":
357
367
  case "Escape":
358
- a.preventDefault(), a.stopPropagation(), r(!1), w.current?.focus();
368
+ s.preventDefault(), s.stopPropagation(), o(!1), w.current?.focus();
359
369
  break;
360
370
  case "ArrowDown":
361
- a.preventDefault(), a.stopPropagation();
362
- const n = h.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
363
- if (n) {
364
- const v = (Array.from(n).findIndex((L) => L === document.activeElement) + 1) % n.length;
365
- n[v]?.focus();
371
+ s.preventDefault(), s.stopPropagation();
372
+ const t = g.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
373
+ if (t) {
374
+ const M = (Array.from(t).findIndex((N) => N === document.activeElement) + 1) % t.length;
375
+ t[M]?.focus();
366
376
  }
367
377
  break;
368
378
  case "ArrowUp":
369
- a.preventDefault(), a.stopPropagation();
370
- const f = h.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
371
- if (f) {
372
- const v = (Array.from(f).findIndex((L) => L === document.activeElement) - 1 + f.length) % f.length;
373
- f[v]?.focus();
379
+ s.preventDefault(), s.stopPropagation();
380
+ const b = g.current?.querySelectorAll('[role="menuitem"]:not([aria-disabled="true"])');
381
+ if (b) {
382
+ const M = (Array.from(b).findIndex((N) => N === document.activeElement) - 1 + b.length) % b.length;
383
+ b[M]?.focus();
374
384
  }
375
385
  break;
376
386
  }
377
- }, F = [p && "disabled", b].filter(Boolean).join(" ");
387
+ }, F = [m && "disabled", y].filter(Boolean).join(" ");
378
388
  return /* @__PURE__ */ i(
379
389
  "li",
380
390
  {
381
- ref: y,
391
+ ref: d,
382
392
  className: F,
383
393
  role: "none",
384
- "data-key": o,
385
- onMouseEnter: g,
386
- onMouseLeave: t,
387
- children: /* @__PURE__ */ K("details", { open: s, children: [
394
+ "data-key": l,
395
+ onMouseEnter: I,
396
+ onMouseLeave: n,
397
+ children: /* @__PURE__ */ K("details", { open: r, children: [
388
398
  /* @__PURE__ */ K(
389
399
  "summary",
390
400
  {
391
401
  ref: w,
392
402
  role: "menuitem",
393
- tabIndex: p ? -1 : 0,
394
- "aria-disabled": p || void 0,
403
+ tabIndex: m ? -1 : 0,
404
+ "aria-disabled": m || void 0,
395
405
  "aria-haspopup": "menu",
396
- "aria-expanded": s,
397
- "aria-controls": I,
406
+ "aria-expanded": r,
407
+ "aria-controls": h,
398
408
  className: "whitespace-nowrap",
399
- onKeyDown: C,
409
+ onKeyDown: E,
400
410
  children: [
401
- m && /* @__PURE__ */ i("span", { className: "mr-2 inline-flex items-center", children: m }),
411
+ f && /* @__PURE__ */ i("span", { className: "mr-2 inline-flex items-center", children: f }),
402
412
  c
403
413
  ]
404
414
  }
@@ -406,31 +416,31 @@ function Y({
406
416
  /* @__PURE__ */ i(
407
417
  "ul",
408
418
  {
409
- ref: h,
410
- id: I,
419
+ ref: g,
420
+ id: h,
411
421
  className: `${ne} bg-base-100 rounded-box z-50 shadow`,
412
422
  role: "menu",
413
423
  "aria-label": typeof c == "string" ? c : void 0,
414
- onKeyDown: T,
415
- children: u
424
+ onKeyDown: C,
425
+ children: p
416
426
  }
417
427
  )
418
428
  ] })
419
429
  }
420
430
  );
421
431
  }
422
- function re({ className: u = "" }) {
423
- const c = ["border-base-content/10", u].filter(Boolean).join(" ");
432
+ function re({ className: p = "" }) {
433
+ const c = ["border-base-content/10", p].filter(Boolean).join(" ");
424
434
  return /* @__PURE__ */ i("li", { role: "separator", className: "my-1", children: /* @__PURE__ */ i("hr", { className: c }) });
425
435
  }
426
- const Ue = Object.assign(Le, {
427
- Trigger: O,
428
- Menu: Q,
436
+ const ze = Object.assign(Be, {
437
+ Trigger: B,
438
+ Menu: Y,
429
439
  Item: U,
430
- SubMenu: Y,
440
+ SubMenu: _,
431
441
  Divider: re
432
442
  });
433
443
  export {
434
- Ue as Dropdown
444
+ ze as Dropdown
435
445
  };
436
446
  //# sourceMappingURL=Dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownTop = 'dropdown-top'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownLeft = 'dropdown-left'\nconst dDropdownRight = 'dropdown-right'\nconst dDropdownCenter = 'dropdown-center'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownHover = 'dropdown-hover'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\n\n// Types for data-driven items prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\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 closeDropdown: () => void\n getTestId: (suffix: string) => string | undefined\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 Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu items (data-driven pattern) */\n items?: DropdownMenuItemType[]\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\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, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\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 /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n items,\n trigger = ['hover'],\n position = 'bottom',\n align = 'start',\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\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 [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\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, source: 'trigger' | 'menu' = 'trigger') => {\n if (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\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, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: dDropdownTop,\n bottom: dDropdownBottom,\n left: dDropdownLeft,\n right: dDropdownRight,\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: dDropdownCenter,\n end: dDropdownEnd,\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n // Render items from data-driven prop\n const renderItems = () => {\n if (!items) return null\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or items-generated menu\n const menuContent = items ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (items) {\n // Data-driven pattern with items prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && 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: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </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 // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position, getTestId } = 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 dDropdownContent,\n dMenu,\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 and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\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 data-testid={getTestId('menu')}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown, getTestId } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n closeDropdown()\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 const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${danger ? 'text-error' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n className=\"whitespace-nowrap\"\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className={`${dMenu} bg-base-100 rounded-box z-50 shadow`}\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\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 SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["dDropdown","dDropdownTop","dDropdownBottom","dDropdownLeft","dDropdownRight","dDropdownCenter","dDropdownEnd","dDropdownHover","dDropdownOpen","dDropdownContent","dMenu","DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","forwardRef","children","items","trigger","position","align","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"Dropdown.js","sources":["../../src/components/Dropdown.tsx"],"sourcesContent":["import React, { createContext, useContext, useId, useRef, useState, useCallback, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dDropdown = 'dropdown'\nconst dDropdownTop = 'dropdown-top'\nconst dDropdownBottom = 'dropdown-bottom'\nconst dDropdownLeft = 'dropdown-left'\nconst dDropdownRight = 'dropdown-right'\nconst dDropdownCenter = 'dropdown-center'\nconst dDropdownEnd = 'dropdown-end'\nconst dDropdownHover = 'dropdown-hover'\nconst dDropdownOpen = 'dropdown-open'\nconst dDropdownContent = 'dropdown-content'\nconst dMenu = 'menu'\n\n// Types for data-driven menu prop\nexport type DropdownTriggerType = 'click' | 'hover' | 'contextMenu'\nexport type DropdownPlacement = 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'left' | 'right'\n\nexport interface DropdownMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n onClick?: () => void\n children?: DropdownMenuItem[] // For submenus\n}\n\nexport interface DropdownMenuDivider {\n type: 'divider'\n key?: string\n}\n\nexport type DropdownMenuItemType = DropdownMenuItem | DropdownMenuDivider\n\nexport interface DropdownMenuConfig {\n /** Menu items */\n items: DropdownMenuItemType[]\n /** Callback when menu item is clicked */\n onClick?: (info: { key: string; keyPath: string[] }) => void\n}\n\nexport interface DropdownMenuProps {\n children?: React.ReactNode\n className?: string\n}\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 closeDropdown: () => void\n getTestId: (suffix: string) => string | undefined\n menuOnClick?: (info: { key: string; keyPath: string[] }) => 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 Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Trigger element and dropdown content (compound pattern) */\n children?: React.ReactNode\n /** Menu configuration (data-driven pattern) */\n menu?: DropdownMenuConfig\n /** Trigger mode(s) for dropdown */\n trigger?: DropdownTriggerType[]\n /** Placement of dropdown menu */\n placement?: DropdownPlacement\n /** Whether to adjust dropdown placement automatically when dropdown is off screen */\n autoAdjustOverflow?: boolean\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean, info?: { source: 'trigger' | 'menu' }) => void\n /** Disable the dropdown */\n disabled?: boolean\n /** Show arrow pointing to trigger */\n arrow?: boolean | { pointAtCenter?: boolean }\n /** Delay before showing dropdown on hover (seconds) */\n mouseEnterDelay?: number\n /** Delay before hiding dropdown on mouse leave (seconds) */\n mouseLeaveDelay?: number\n /** Container for the dropdown menu */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement\n /** Destroy dropdown when hidden */\n destroyOnHidden?: boolean\n /** Customize popup content */\n popupRender?: (menu: React.ReactNode) => React.ReactNode\n /** Test ID prefix for child elements */\n 'data-testid'?: string\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 /** Icon to display before label */\n icon?: React.ReactNode\n /** Item label (alternative to children) */\n label?: React.ReactNode\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n danger?: boolean\n className?: string\n /** @internal */\n _index?: number\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownSubMenuProps {\n children: React.ReactNode\n /** Submenu title/label */\n title: React.ReactNode\n /** Icon to display before title */\n icon?: React.ReactNode\n disabled?: boolean\n className?: string\n /** @internal */\n _key?: string\n}\n\nexport interface DropdownDividerProps {\n className?: string\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, DropdownProps>(function DropdownRoot(\n {\n children,\n menu,\n trigger = ['hover'],\n placement = 'bottomLeft',\n autoAdjustOverflow = true,\n open: controlledOpen,\n onOpenChange,\n disabled,\n arrow = false,\n mouseEnterDelay = 0.15,\n mouseLeaveDelay = 0.1,\n getPopupContainer: _getPopupContainer,\n destroyOnHidden = false,\n popupRender,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentDisabled } = useConfig()\n const effectiveDisabled = disabled ?? componentDisabled ?? false\n\n // TODO: Implement autoAdjustOverflow logic to reposition dropdown when it goes off-screen\n // Currently the prop is accepted but not yet implemented\n\n // Convert placement to position + align\n const placementMap: Record<DropdownPlacement, { position: 'top' | 'bottom' | 'left' | 'right'; align: 'start' | 'center' | 'end' }> = {\n top: { position: 'top', align: 'center' },\n topLeft: { position: 'top', align: 'start' },\n topRight: { position: 'top', align: 'end' },\n bottom: { position: 'bottom', align: 'center' },\n bottomLeft: { position: 'bottom', align: 'start' },\n bottomRight: { position: 'bottom', align: 'end' },\n left: { position: 'left', align: 'start' },\n right: { position: 'right', align: 'start' },\n }\n\n const { position, align } = placementMap[placement]\n\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 [shouldRender, setShouldRender] = useState(!destroyOnHidden)\n const itemRefs = useRef<Map<number, { ref: HTMLElement | null; disabled: boolean }>>(new Map())\n const dropdownRef = useRef<HTMLDivElement>(null)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const triggers = trigger\n\n // Forward ref\n useImperativeHandle(ref, () => dropdownRef.current!, [])\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\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, source: 'trigger' | 'menu' = 'trigger') => {\n if (effectiveDisabled) return\n if (!isControlled) {\n setInternalOpen(open)\n }\n if (open) {\n setShouldRender(true)\n }\n onOpenChange?.(open, { source })\n }, [effectiveDisabled, isControlled, onOpenChange])\n\n const closeDropdown = useCallback(() => {\n setIsOpen(false, 'menu')\n setFocusedIndex(-1)\n document.getElementById(triggerId)?.focus()\n }, [setIsOpen, triggerId])\n\n const registerItem = useCallback((index: number, ref: HTMLElement | null, itemDisabled: boolean) => {\n if (ref) {\n itemRefs.current.set(index, { ref, disabled: itemDisabled })\n } else {\n itemRefs.current.delete(index)\n }\n }, [])\n\n // Handle destroyOnHidden\n useEffect(() => {\n if (destroyOnHidden && !isOpen) {\n const timeout = setTimeout(() => setShouldRender(false), 300)\n return () => clearTimeout(timeout)\n }\n }, [isOpen, destroyOnHidden])\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, 'trigger')\n setFocusedIndex(-1)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen])\n\n // Hover handlers with delay\n const handleMouseEnter = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true, 'trigger')\n }, mouseEnterDelay * 1000)\n }, [triggers, mouseEnterDelay, setIsOpen])\n\n const handleMouseLeave = useCallback(() => {\n if (!triggers.includes('hover')) return\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(false, 'trigger')\n setFocusedIndex(-1)\n }, mouseLeaveDelay * 1000)\n }, [triggers, mouseLeaveDelay, setIsOpen])\n\n // Context menu handler\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!triggers.includes('contextMenu')) return\n event.preventDefault()\n setIsOpen(true, 'trigger')\n }, [triggers, setIsOpen])\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current)\n }\n }\n }, [])\n\n const positionClasses: Record<string, string> = {\n top: dDropdownTop,\n bottom: dDropdownBottom,\n left: dDropdownLeft,\n right: dDropdownRight,\n }\n\n const alignClasses: Record<string, string> = {\n start: '',\n center: dDropdownCenter,\n end: dDropdownEnd,\n }\n\n const showArrow = typeof arrow === 'boolean' ? arrow : !!arrow\n\n // Render items from data-driven menu prop\n const renderItems = () => {\n if (!menu?.items) return null\n return menu.items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return <DropdownDivider key={item.key || `divider-${index}`} />\n }\n const menuItem = item as DropdownMenuItem\n if (menuItem.children && menuItem.children.length > 0) {\n return (\n <DropdownSubMenu\n key={menuItem.key}\n title={menuItem.label}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n >\n {menuItem.children.map((child) => (\n <DropdownItem\n key={child.key}\n icon={child.icon}\n disabled={child.disabled}\n danger={child.danger}\n onClick={child.onClick}\n >\n {child.label}\n </DropdownItem>\n ))}\n </DropdownSubMenu>\n )\n }\n return (\n <DropdownItem\n key={menuItem.key}\n icon={menuItem.icon}\n disabled={menuItem.disabled}\n danger={menuItem.danger}\n onClick={menuItem.onClick}\n >\n {menuItem.label}\n </DropdownItem>\n )\n })\n }\n\n // Determine content - either compound children or menu-generated content\n const menuContent = menu ? (\n (shouldRender || !destroyOnHidden) && (\n <DropdownMenu>{renderItems()}</DropdownMenu>\n )\n ) : null\n\n // Auto-detect trigger pattern\n const childArray = React.Children.toArray(children)\n const hasTrigger = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n const hasMenu = childArray.some(\n (child) => React.isValidElement(child) && child.type === DropdownMenu\n )\n\n let content: React.ReactNode\n let isAutoTrigger = false\n\n if (menu) {\n // Data-driven pattern with menu prop\n const triggerChild = childArray.find(\n (child) => React.isValidElement(child) && child.type === DropdownTrigger\n )\n\n // If no explicit Trigger, treat first child as trigger\n if (!triggerChild && childArray[0] && React.isValidElement(childArray[0])) {\n isAutoTrigger = true\n content = (\n <>\n <DropdownTrigger className={className}>{childArray[0]}</DropdownTrigger>\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n } else {\n content = (\n <>\n {triggerChild}\n {popupRender ? popupRender(menuContent) : menuContent}\n </>\n )\n }\n } else if (!hasTrigger && !hasMenu && childArray.length >= 2) {\n // Auto-pattern: first child is trigger, second child is menu\n const [triggerChild, menuChild, ...rest] = childArray\n isAutoTrigger = true\n content = (\n <>\n {triggerChild && React.isValidElement(triggerChild) && (\n <DropdownTrigger className={className}>{triggerChild}</DropdownTrigger>\n )}\n {menuChild}\n {rest}\n </>\n )\n } else {\n // Standard compound pattern or other cases\n content = children\n }\n\n const dropdownClasses = [\n dDropdown,\n positionClasses[position],\n alignClasses[align],\n triggers.includes('hover') && dDropdownHover,\n isOpen && dDropdownOpen,\n !isAutoTrigger && 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: effectiveDisabled,\n arrow: showArrow,\n closeDropdown,\n getTestId,\n menuOnClick: menu?.onClick,\n }}\n >\n <div\n ref={dropdownRef}\n className={dropdownClasses}\n data-state={isOpen ? 'open' : 'closed'}\n data-testid={testId}\n aria-disabled={effectiveDisabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onContextMenu={handleContextMenu}\n {...rest}\n >\n {content}\n </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 // Clone the child element to add event handlers and ARIA attributes\n const child = React.Children.only(children) as React.ReactElement<\n React.HTMLAttributes<HTMLElement> & {\n onClick?: (e: React.MouseEvent) => void\n onKeyDown?: (e: React.KeyboardEvent) => void\n className?: string\n }\n >\n\n const childProps = child.props\n\n return React.cloneElement(child, {\n id: triggerId,\n tabIndex: disabled ? -1 : 0,\n 'aria-haspopup': 'menu' as const,\n 'aria-expanded': isOpen,\n 'aria-controls': menuId,\n onClick: (e: React.MouseEvent) => {\n handleClick()\n childProps.onClick?.(e)\n },\n onKeyDown: (e: React.KeyboardEvent) => {\n handleKeyDown(e)\n childProps.onKeyDown?.(e)\n },\n className: `${childProps.className || ''} ${className}`.trim(),\n })\n}\n\nfunction DropdownMenu({ children, className = '' }: DropdownMenuProps) {\n const { menuId, triggerId, isOpen, setIsOpen, focusedIndex, setFocusedIndex, setItemCount, arrow, position, getTestId } = 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 dDropdownContent,\n dMenu,\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 and extract key\n const childrenWithIndex = React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n const childKey = child.key != null ? String(child.key) : undefined\n if (child.type === DropdownItem) {\n return React.cloneElement(child as React.ReactElement<any>, { _index: index, _key: childKey })\n }\n if (child.type === DropdownSubMenu) {\n return React.cloneElement(child as React.ReactElement<any>, { _key: childKey })\n }\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 data-testid={getTestId('menu')}\n onKeyDown={handleKeyDown}\n >\n {arrowElement}\n {childrenWithIndex}\n </ul>\n )\n}\n\nfunction DropdownItem({\n children,\n icon,\n label,\n onClick,\n active = false,\n disabled = false,\n danger = false,\n className = '',\n _key,\n}: DropdownItemProps) {\n const { closeDropdown, getTestId, menuOnClick } = useDropdownContext()\n const itemClasses = [active && 'active', disabled && 'disabled', className].filter(Boolean).join(' ')\n\n const handleClick = () => {\n if (!disabled) {\n onClick?.()\n // Call menu.onClick if provided\n if (menuOnClick && _key) {\n menuOnClick({ key: _key, keyPath: [_key] })\n }\n closeDropdown()\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 const content = label || children\n\n return (\n <li className={itemClasses} role=\"none\" data-key={_key} data-testid={_key ? getTestId(`item-${_key}`) : undefined}>\n <a\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={`whitespace-nowrap ${danger ? 'text-error' : ''}`}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {content}\n </a>\n </li>\n )\n}\n\nfunction DropdownSubMenu({\n children,\n title,\n icon,\n disabled = false,\n className = '',\n _key,\n}: DropdownSubMenuProps) {\n const [isSubOpen, setIsSubOpen] = useState(false)\n const subMenuRef = useRef<HTMLLIElement>(null)\n const summaryRef = useRef<HTMLElement>(null)\n const subMenuListRef = useRef<HTMLUListElement>(null)\n const subMenuId = useId()\n\n const handleMouseEnter = () => {\n if (!disabled) setIsSubOpen(true)\n }\n\n const handleMouseLeave = () => {\n setIsSubOpen(false)\n }\n\n // Focus first item in submenu\n const focusFirstItem = () => {\n setTimeout(() => {\n const firstItem = subMenuListRef.current?.querySelector('[role=\"menuitem\"]:not([aria-disabled=\"true\"])') as HTMLElement\n firstItem?.focus()\n }, 0)\n }\n\n // Keyboard handler for summary (submenu trigger)\n const handleSummaryKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'Enter':\n case ' ':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(true)\n focusFirstItem()\n break\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n break\n }\n }\n\n // Keyboard handler for submenu items\n const handleSubMenuKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n case 'Escape':\n event.preventDefault()\n event.stopPropagation()\n setIsSubOpen(false)\n summaryRef.current?.focus()\n break\n case 'ArrowDown':\n event.preventDefault()\n event.stopPropagation()\n const items = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (items) {\n const currentIndex = Array.from(items).findIndex(item => item === document.activeElement)\n const nextIndex = (currentIndex + 1) % items.length\n ;(items[nextIndex] as HTMLElement)?.focus()\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n event.stopPropagation()\n const itemsUp = subMenuListRef.current?.querySelectorAll('[role=\"menuitem\"]:not([aria-disabled=\"true\"])')\n if (itemsUp) {\n const currentIndexUp = Array.from(itemsUp).findIndex(item => item === document.activeElement)\n const prevIndex = (currentIndexUp - 1 + itemsUp.length) % itemsUp.length\n ;(itemsUp[prevIndex] as HTMLElement)?.focus()\n }\n break\n }\n }\n\n const itemClasses = [disabled && 'disabled', className].filter(Boolean).join(' ')\n\n return (\n <li\n ref={subMenuRef}\n className={itemClasses}\n role=\"none\"\n data-key={_key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <details open={isSubOpen}>\n <summary\n ref={summaryRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-haspopup=\"menu\"\n aria-expanded={isSubOpen}\n aria-controls={subMenuId}\n className=\"whitespace-nowrap\"\n onKeyDown={handleSummaryKeyDown}\n >\n {icon && <span className=\"mr-2 inline-flex items-center\">{icon}</span>}\n {title}\n </summary>\n <ul\n ref={subMenuListRef}\n id={subMenuId}\n className={`${dMenu} bg-base-100 rounded-box z-50 shadow`}\n role=\"menu\"\n aria-label={typeof title === 'string' ? title : undefined}\n onKeyDown={handleSubMenuKeyDown}\n >\n {children}\n </ul>\n </details>\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 SubMenu: DropdownSubMenu,\n Divider: DropdownDivider,\n})\n"],"names":["dDropdown","dDropdownTop","dDropdownBottom","dDropdownLeft","dDropdownRight","dDropdownCenter","dDropdownEnd","dDropdownHover","dDropdownOpen","dDropdownContent","dMenu","DropdownContext","createContext","useDropdownContext","context","useContext","DropdownRoot","forwardRef","children","menu","trigger","placement","autoAdjustOverflow","controlledOpen","onOpenChange","disabled","arrow","mouseEnterDelay","mouseLeaveDelay","_getPopupContainer","destroyOnHidden","popupRender","testId","className","rest","ref","componentDisabled","useConfig","effectiveDisabled","placementMap","position","align","menuId","useId","triggerId","internalOpen","setInternalOpen","useState","focusedIndex","setFocusedIndex","itemCount","setItemCount","shouldRender","setShouldRender","itemRefs","useRef","dropdownRef","hoverTimeoutRef","triggers","useImperativeHandle","getTestId","suffix","isControlled","isOpen","setIsOpen","useCallback","open","source","closeDropdown","registerItem","index","itemDisabled","useEffect","timeout","handleClickOutside","event","handleMouseEnter","handleMouseLeave","handleContextMenu","positionClasses","alignClasses","showArrow","menuContent","jsx","DropdownMenu","item","DropdownDivider","menuItem","DropdownSubMenu","child","DropdownItem","childArray","React","hasTrigger","DropdownTrigger","hasMenu","content","isAutoTrigger","triggerChild","jsxs","Fragment","menuChild","dropdownClasses","handleKeyDown","handleClick","childProps","e","menuRef","enabledCount","menuClasses","childrenWithIndex","childKey","arrowElement","icon","label","onClick","active","danger","_key","menuOnClick","itemClasses","title","isSubOpen","setIsSubOpen","subMenuRef","summaryRef","subMenuListRef","subMenuId","focusFirstItem","handleSummaryKeyDown","handleSubMenuKeyDown","items","nextIndex","itemsUp","prevIndex","classes","Dropdown"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import { default as React } from 'react';
2
- export interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {
2
+ export interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {
3
3
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
4
  color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error';
5
5
  className?: string;
6
6
  /** Test ID for testing */
7
7
  'data-testid'?: string;
8
+ /** Callback fired when the checked state changes */
9
+ onChange?: (checked: boolean, event: React.ChangeEvent<HTMLInputElement>) => void;
8
10
  }
9
11
  export declare const Toggle: React.ForwardRefExoticComponent<ToggleProps & React.RefAttributes<HTMLInputElement>>;
@@ -1,39 +1,42 @@
1
- import { jsx as i } from "react/jsx-runtime";
2
- import { forwardRef as m } from "react";
3
- import { useConfig as T } from "../providers/ConfigProvider.js";
4
- const f = "toggle", u = "toggle-xs", p = "toggle-sm", y = "toggle-md", x = "toggle-lg", S = "toggle-xl", h = "toggle-primary", k = "toggle-secondary", C = "toggle-accent", w = "toggle-neutral", z = "toggle-success", N = "toggle-warning", j = "toggle-info", X = "toggle-error", b = m(
1
+ import { jsx as f } from "react/jsx-runtime";
2
+ import { forwardRef as u } from "react";
3
+ import { useConfig as h } from "../providers/ConfigProvider.js";
4
+ const p = "toggle", y = "toggle-xs", x = "toggle-sm", C = "toggle-md", S = "toggle-lg", k = "toggle-xl", w = "toggle-primary", z = "toggle-secondary", N = "toggle-accent", j = "toggle-neutral", X = "toggle-success", b = "toggle-warning", A = "toggle-info", B = "toggle-error", E = u(
5
5
  ({
6
- size: t,
7
- color: o,
8
- className: s = "",
9
- ...e
10
- }, c) => {
11
- const { componentSize: l } = T(), g = t ?? l ?? "md", n = {
12
- xs: u,
13
- sm: p,
14
- md: y,
15
- lg: x,
16
- xl: S
17
- }, r = {
18
- primary: h,
19
- secondary: k,
20
- accent: C,
21
- neutral: w,
22
- success: z,
23
- warning: N,
24
- info: j,
25
- error: X
26
- }, a = [
27
- f,
28
- g && n[g],
29
- o && r[o],
30
- s
31
- ].filter(Boolean).join(" "), d = e.checked ? "checked" : "unchecked";
32
- return /* @__PURE__ */ i("input", { ref: c, type: "checkbox", className: a, "data-state": d, ...e });
6
+ size: s,
7
+ color: e,
8
+ className: c = "",
9
+ onChange: n,
10
+ ...o
11
+ }, l) => {
12
+ const { componentSize: r } = h(), g = s ?? r ?? "md", a = {
13
+ xs: y,
14
+ sm: x,
15
+ md: C,
16
+ lg: S,
17
+ xl: k
18
+ }, d = {
19
+ primary: w,
20
+ secondary: z,
21
+ accent: N,
22
+ neutral: j,
23
+ success: X,
24
+ warning: b,
25
+ info: A,
26
+ error: B
27
+ }, i = [
28
+ p,
29
+ g && a[g],
30
+ e && d[e],
31
+ c
32
+ ].filter(Boolean).join(" "), m = (t) => {
33
+ n?.(t.target.checked, t);
34
+ }, T = o.checked ? "checked" : "unchecked";
35
+ return /* @__PURE__ */ f("input", { ref: l, type: "checkbox", className: i, "data-state": T, ...o, onChange: m });
33
36
  }
34
37
  );
35
- b.displayName = "Toggle";
38
+ E.displayName = "Toggle";
36
39
  export {
37
- b as Toggle
40
+ E as Toggle
38
41
  };
39
42
  //# sourceMappingURL=Toggle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toggle.js","sources":["../../src/components/Toggle.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\nconst dTogglePrimary = 'toggle-primary'\nconst dToggleSecondary = 'toggle-secondary'\nconst dToggleAccent = 'toggle-accent'\nconst dToggleNeutral = 'toggle-neutral'\nconst dToggleSuccess = 'toggle-success'\nconst dToggleWarning = 'toggle-warning'\nconst dToggleInfo = 'toggle-info'\nconst dToggleError = 'toggle-error'\n\nexport interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n className?: string\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n size,\n color,\n className = '',\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n }\n\n const colorClasses = {\n primary: dTogglePrimary,\n secondary: dToggleSecondary,\n accent: dToggleAccent,\n neutral: dToggleNeutral,\n success: dToggleSuccess,\n warning: dToggleWarning,\n info: dToggleInfo,\n error: dToggleError,\n }\n\n const toggleClasses = [\n dToggle,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const dataState = props.checked ? 'checked' : 'unchecked'\n return <input ref={ref} type=\"checkbox\" className={toggleClasses} data-state={dataState} {...props} />\n }\n)\n\nToggle.displayName = 'Toggle'\n"],"names":["dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","dTogglePrimary","dToggleSecondary","dToggleAccent","dToggleNeutral","dToggleSuccess","dToggleWarning","dToggleInfo","dToggleError","Toggle","forwardRef","size","color","className","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","toggleClasses","dataState","jsx"],"mappings":";;;AAIA,MAAMA,IAAU,UACVC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAiB,kBACjBC,IAAmB,oBACnBC,IAAgB,iBAChBC,IAAiB,kBACjBC,IAAiB,kBACjBC,IAAiB,kBACjBC,IAAc,eACdC,IAAe,gBAURC,IAASC;AAAA,EACpB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBP,KAAQK,KAAiB,MAEzCG,IAAc;AAAA,MAClB,IAAIvB;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,IAAA,GAGAoB,IAAe;AAAA,MACnB,SAASnB;AAAA,MACT,WAAWC;AAAA,MACX,QAAQC;AAAA,MACR,SAASC;AAAA,MACT,SAASC;AAAA,MACT,SAASC;AAAA,MACT,MAAMC;AAAA,MACN,OAAOC;AAAA,IAAA,GAGHa,IAAgB;AAAA,MACpB1B;AAAA,MACAuB,KAAiBC,EAAYD,CAAa;AAAA,MAC1CN,KAASQ,EAAaR,CAAK;AAAA,MAC3BC;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELS,IAAYR,EAAM,UAAU,YAAY;AAC9C,WAAO,gBAAAS,EAAC,SAAA,EAAM,KAAAR,GAAU,MAAK,YAAW,WAAWM,GAAe,cAAYC,GAAY,GAAGR,EAAA,CAAO;AAAA,EACtG;AACF;AAEAL,EAAO,cAAc;"}
1
+ {"version":3,"file":"Toggle.js","sources":["../../src/components/Toggle.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from '../providers/ConfigProvider'\n\n// DaisyUI classes\nconst dToggle = 'toggle'\nconst dToggleXs = 'toggle-xs'\nconst dToggleSm = 'toggle-sm'\nconst dToggleMd = 'toggle-md'\nconst dToggleLg = 'toggle-lg'\nconst dToggleXl = 'toggle-xl'\nconst dTogglePrimary = 'toggle-primary'\nconst dToggleSecondary = 'toggle-secondary'\nconst dToggleAccent = 'toggle-accent'\nconst dToggleNeutral = 'toggle-neutral'\nconst dToggleSuccess = 'toggle-success'\nconst dToggleWarning = 'toggle-warning'\nconst dToggleInfo = 'toggle-info'\nconst dToggleError = 'toggle-error'\n\nexport interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n color?: 'primary' | 'secondary' | 'accent' | 'neutral' | 'success' | 'warning' | 'info' | 'error'\n className?: string\n /** Test ID for testing */\n 'data-testid'?: string\n /** Callback fired when the checked state changes */\n onChange?: (checked: boolean, event: React.ChangeEvent<HTMLInputElement>) => void\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n size,\n color,\n className = '',\n onChange,\n ...props\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const sizeClasses = {\n xs: dToggleXs,\n sm: dToggleSm,\n md: dToggleMd,\n lg: dToggleLg,\n xl: dToggleXl,\n }\n\n const colorClasses = {\n primary: dTogglePrimary,\n secondary: dToggleSecondary,\n accent: dToggleAccent,\n neutral: dToggleNeutral,\n success: dToggleSuccess,\n warning: dToggleWarning,\n info: dToggleInfo,\n error: dToggleError,\n }\n\n const toggleClasses = [\n dToggle,\n effectiveSize && sizeClasses[effectiveSize],\n color && colorClasses[color],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(event.target.checked, event)\n }\n\n const dataState = props.checked ? 'checked' : 'unchecked'\n return <input ref={ref} type=\"checkbox\" className={toggleClasses} data-state={dataState} {...props} onChange={handleChange} />\n }\n)\n\nToggle.displayName = 'Toggle'\n"],"names":["dToggle","dToggleXs","dToggleSm","dToggleMd","dToggleLg","dToggleXl","dTogglePrimary","dToggleSecondary","dToggleAccent","dToggleNeutral","dToggleSuccess","dToggleWarning","dToggleInfo","dToggleError","Toggle","forwardRef","size","color","className","onChange","props","ref","componentSize","useConfig","effectiveSize","sizeClasses","colorClasses","toggleClasses","handleChange","event","dataState","jsx"],"mappings":";;;AAIA,MAAMA,IAAU,UACVC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAY,aACZC,IAAiB,kBACjBC,IAAmB,oBACnBC,IAAgB,iBAChBC,IAAiB,kBACjBC,IAAiB,kBACjBC,IAAiB,kBACjBC,IAAc,eACdC,IAAe,gBAYRC,IAASC;AAAA,EACpB,CACE;AAAA,IACE,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,eAAAC,EAAA,IAAkBC,EAAA,GACpBC,IAAgBR,KAAQM,KAAiB,MAEzCG,IAAc;AAAA,MAClB,IAAIxB;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,MACJ,IAAIC;AAAA,IAAA,GAGAqB,IAAe;AAAA,MACnB,SAASpB;AAAA,MACT,WAAWC;AAAA,MACX,QAAQC;AAAA,MACR,SAASC;AAAA,MACT,SAASC;AAAA,MACT,SAASC;AAAA,MACT,MAAMC;AAAA,MACN,OAAOC;AAAA,IAAA,GAGHc,IAAgB;AAAA,MACpB3B;AAAA,MACAwB,KAAiBC,EAAYD,CAAa;AAAA,MAC1CP,KAASS,EAAaT,CAAK;AAAA,MAC3BC;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELU,IAAe,CAACC,MAA+C;AACnE,MAAAV,IAAWU,EAAM,OAAO,SAASA,CAAK;AAAA,IACxC,GAEMC,IAAYV,EAAM,UAAU,YAAY;AAC9C,WAAO,gBAAAW,EAAC,SAAA,EAAM,KAAAV,GAAU,MAAK,YAAW,WAAWM,GAAe,cAAYG,GAAY,GAAGV,GAAO,UAAUQ,EAAA,CAAc;AAAA,EAC9H;AACF;AAEAd,EAAO,cAAc;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asterui",
3
- "version": "0.12.75",
3
+ "version": "0.12.77",
4
4
  "description": "React UI component library with DaisyUI",
5
5
  "homepage": "https://asterui.com",
6
6
  "repository": {