@aster-ui/prefixed 0.12.55 → 0.12.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/components/DatePicker.d.ts +3 -1
  2. package/dist/components/DatePicker.js +84 -82
  3. package/dist/components/DatePicker.js.map +1 -1
  4. package/dist/components/Dropdown.d.ts +5 -4
  5. package/dist/components/Dropdown.js +239 -233
  6. package/dist/components/Dropdown.js.map +1 -1
  7. package/dist/components/InputNumber.d.ts +2 -0
  8. package/dist/components/InputNumber.js +92 -88
  9. package/dist/components/InputNumber.js.map +1 -1
  10. package/dist/components/Menu.d.ts +3 -1
  11. package/dist/components/Menu.js +49 -48
  12. package/dist/components/Menu.js.map +1 -1
  13. package/dist/components/Modal.d.ts +40 -18
  14. package/dist/components/Modal.js +180 -156
  15. package/dist/components/Modal.js.map +1 -1
  16. package/dist/components/OTPInput.d.ts +2 -0
  17. package/dist/components/OTPInput.js +46 -44
  18. package/dist/components/OTPInput.js.map +1 -1
  19. package/dist/components/Pagination.d.ts +3 -1
  20. package/dist/components/Pagination.js +104 -90
  21. package/dist/components/Pagination.js.map +1 -1
  22. package/dist/components/Popconfirm.d.ts +3 -1
  23. package/dist/components/Popconfirm.js +63 -59
  24. package/dist/components/Popconfirm.js.map +1 -1
  25. package/dist/components/Tabs.d.ts +3 -2
  26. package/dist/components/Tabs.js +74 -72
  27. package/dist/components/Tabs.js.map +1 -1
  28. package/dist/components/ThemeController.js +102 -88
  29. package/dist/components/ThemeController.js.map +1 -1
  30. package/dist/components/ThemeProvider.js +17 -15
  31. package/dist/components/ThemeProvider.js.map +1 -1
  32. package/dist/components/Transfer.d.ts +3 -1
  33. package/dist/components/Transfer.js +127 -120
  34. package/dist/components/Transfer.js.map +1 -1
  35. package/dist/components/Upload.d.ts +3 -1
  36. package/dist/components/Upload.js +144 -142
  37. package/dist/components/Upload.js.map +1 -1
  38. package/dist/hooks/useTheme.js +8 -6
  39. package/dist/hooks/useTheme.js.map +1 -1
  40. package/package.json +2 -2
@@ -7,5 +7,7 @@ export interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElemen
7
7
  placeholder?: string;
8
8
  disabled?: boolean;
9
9
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
10
+ /** Test ID prefix for child elements */
11
+ 'data-testid'?: string;
10
12
  }
11
- export declare const DatePicker: React.FC<DatePickerProps>;
13
+ export declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,8 +1,8 @@
1
- import { jsxs as m, jsx as n } from "react/jsx-runtime";
2
- import { useState as f, useRef as L, useEffect as N } from "react";
3
- import { Input as q } from "./Input.js";
4
- import { useConfig as A } from "./ConfigProvider.js";
5
- const D = "d-btn", M = "d-btn-ghost", y = "d-btn-sm", Y = "d-btn-square", E = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], J = [
1
+ import { jsxs as f, jsx as t } from "react/jsx-runtime";
2
+ import { forwardRef as J, useState as m, useRef as P, useEffect as Y } from "react";
3
+ import { Input as V } from "./Input.js";
4
+ import { useConfig as G } from "./ConfigProvider.js";
5
+ const M = "d-btn", y = "d-btn-ghost", S = "d-btn-sm", F = "d-btn-square", H = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], W = [
6
6
  "January",
7
7
  "February",
8
8
  "March",
@@ -16,90 +16,92 @@ const D = "d-btn", M = "d-btn-ghost", y = "d-btn-sm", Y = "d-btn-square", E = ["
16
16
  "November",
17
17
  "December"
18
18
  ];
19
- function P(t, l = "MM/DD/YYYY") {
20
- if (!t) return "";
21
- const d = t.getFullYear(), h = String(t.getMonth() + 1).padStart(2, "0"), g = String(t.getDate()).padStart(2, "0");
22
- return l.replace("YYYY", String(d)).replace("MM", h).replace("DD", g);
19
+ function K(o, n = "MM/DD/YYYY") {
20
+ if (!o) return "";
21
+ const h = o.getFullYear(), d = String(o.getMonth() + 1).padStart(2, "0"), g = String(o.getDate()).padStart(2, "0");
22
+ return n.replace("YYYY", String(h)).replace("MM", d).replace("DD", g);
23
23
  }
24
- function V(t, l) {
25
- return new Date(t, l + 1, 0).getDate();
24
+ function Q(o, n) {
25
+ return new Date(o, n + 1, 0).getDate();
26
26
  }
27
- function G(t, l) {
28
- return new Date(t, l, 1).getDay();
27
+ function U(o, n) {
28
+ return new Date(o, n, 1).getDay();
29
29
  }
30
- const U = ({
31
- value: t,
32
- defaultValue: l,
30
+ const te = J(function({
31
+ value: n,
32
+ defaultValue: h,
33
33
  onChange: d,
34
- format: h,
35
- placeholder: g = "Select date",
36
- disabled: S = !1,
37
- className: $ = "",
38
- size: F,
39
- ...C
40
- }) => {
41
- const { componentSize: O } = A(), k = F ?? O ?? "md", [o, p] = f(
42
- t || l || null
43
- ), [c, u] = f(!1), [r, i] = f(
44
- o ? o.getMonth() : (/* @__PURE__ */ new Date()).getMonth()
45
- ), [a, b] = f(
46
- o ? o.getFullYear() : (/* @__PURE__ */ new Date()).getFullYear()
47
- ), v = L(null);
48
- N(() => {
49
- t !== void 0 && p(t);
50
- }, [t]), N(() => {
34
+ format: g,
35
+ placeholder: k = "Select date",
36
+ disabled: x = !1,
37
+ size: C,
38
+ "data-testid": p,
39
+ className: O = "",
40
+ ...R
41
+ }, z) {
42
+ const { componentSize: B } = G(), T = C ?? B ?? "md", N = (e) => p ? `${p}-${e}` : void 0, [a, b] = m(
43
+ n || h || null
44
+ ), [c, u] = m(!1), [r, i] = m(
45
+ a ? a.getMonth() : (/* @__PURE__ */ new Date()).getMonth()
46
+ ), [l, v] = m(
47
+ a ? a.getFullYear() : (/* @__PURE__ */ new Date()).getFullYear()
48
+ ), w = P(null);
49
+ Y(() => {
50
+ n !== void 0 && b(n);
51
+ }, [n]), Y(() => {
51
52
  function e(s) {
52
- v.current && !v.current.contains(s.target) && u(!1);
53
+ w.current && !w.current.contains(s.target) && u(!1);
53
54
  }
54
55
  if (c)
55
56
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
56
57
  }, [c]);
57
- const z = (e) => {
58
- const s = new Date(a, r, e);
59
- p(s), d?.(s), u(!1);
60
- }, B = () => {
61
- r === 0 ? (i(11), b(a - 1)) : i(r - 1);
62
- }, R = () => {
63
- r === 11 ? (i(0), b(a + 1)) : i(r + 1);
64
- }, j = V(a, r), T = G(a, r), w = [];
65
- for (let e = 0; e < T; e++)
66
- w.push(null);
67
- for (let e = 1; e <= j; e++)
68
- w.push(e);
69
- const x = (e) => !e || !o ? !1 : o.getDate() === e && o.getMonth() === r && o.getFullYear() === a, I = (e) => {
58
+ const j = (e) => {
59
+ const s = new Date(l, r, e);
60
+ b(s), d?.(s), u(!1);
61
+ }, L = () => {
62
+ r === 0 ? (i(11), v(l - 1)) : i(r - 1);
63
+ }, q = () => {
64
+ r === 11 ? (i(0), v(l + 1)) : i(r + 1);
65
+ }, A = Q(l, r), E = U(l, r), D = [];
66
+ for (let e = 0; e < E; e++)
67
+ D.push(null);
68
+ for (let e = 1; e <= A; e++)
69
+ D.push(e);
70
+ const $ = (e) => !e || !a ? !1 : a.getDate() === e && a.getMonth() === r && a.getFullYear() === l, I = (e) => {
70
71
  if (!e) return !1;
71
72
  const s = /* @__PURE__ */ new Date();
72
- return s.getDate() === e && s.getMonth() === r && s.getFullYear() === a;
73
+ return s.getDate() === e && s.getMonth() === r && s.getFullYear() === l;
73
74
  };
74
- return /* @__PURE__ */ m("div", { ref: v, className: `relative ${$}`, "data-state": c ? "open" : "closed", ...C, children: [
75
- /* @__PURE__ */ n(
76
- q,
75
+ return /* @__PURE__ */ f("div", { ref: z || w, className: `relative ${O}`, "data-state": c ? "open" : "closed", "data-testid": p, ...R, children: [
76
+ /* @__PURE__ */ t(
77
+ V,
77
78
  {
78
- value: P(o, h),
79
- placeholder: g,
80
- disabled: S,
81
- size: k,
79
+ value: K(a, g),
80
+ placeholder: k,
81
+ disabled: x,
82
+ size: T,
82
83
  readOnly: !0,
83
- onClick: () => !S && u(!c),
84
- className: "cursor-pointer"
84
+ onClick: () => !x && u(!c),
85
+ className: "cursor-pointer",
86
+ "data-testid": N("input")
85
87
  }
86
88
  ),
87
- c && /* @__PURE__ */ m("div", { className: "absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80", children: [
88
- /* @__PURE__ */ m("div", { className: "flex items-center justify-between mb-4", children: [
89
- /* @__PURE__ */ n(
89
+ c && /* @__PURE__ */ f("div", { className: "absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80", "data-testid": N("calendar"), children: [
90
+ /* @__PURE__ */ f("div", { className: "flex items-center justify-between mb-4", children: [
91
+ /* @__PURE__ */ t(
90
92
  "button",
91
93
  {
92
94
  type: "button",
93
- onClick: B,
94
- className: `${D} ${M} ${y} ${Y}`,
95
- children: /* @__PURE__ */ n(
95
+ onClick: L,
96
+ className: `${M} ${y} ${S} ${F}`,
97
+ children: /* @__PURE__ */ t(
96
98
  "svg",
97
99
  {
98
100
  xmlns: "http://www.w3.org/2000/svg",
99
101
  className: "h-5 w-5",
100
102
  viewBox: "0 0 20 20",
101
103
  fill: "currentColor",
102
- children: /* @__PURE__ */ n(
104
+ children: /* @__PURE__ */ t(
103
105
  "path",
104
106
  {
105
107
  fillRule: "evenodd",
@@ -111,25 +113,25 @@ const U = ({
111
113
  )
112
114
  }
113
115
  ),
114
- /* @__PURE__ */ m("div", { className: "text-base font-semibold", children: [
115
- J[r],
116
+ /* @__PURE__ */ f("div", { className: "text-base font-semibold", children: [
117
+ W[r],
116
118
  " ",
117
- a
119
+ l
118
120
  ] }),
119
- /* @__PURE__ */ n(
121
+ /* @__PURE__ */ t(
120
122
  "button",
121
123
  {
122
124
  type: "button",
123
- onClick: R,
124
- className: `${D} ${M} ${y} ${Y}`,
125
- children: /* @__PURE__ */ n(
125
+ onClick: q,
126
+ className: `${M} ${y} ${S} ${F}`,
127
+ children: /* @__PURE__ */ t(
126
128
  "svg",
127
129
  {
128
130
  xmlns: "http://www.w3.org/2000/svg",
129
131
  className: "h-5 w-5",
130
132
  viewBox: "0 0 20 20",
131
133
  fill: "currentColor",
132
- children: /* @__PURE__ */ n(
134
+ children: /* @__PURE__ */ t(
133
135
  "path",
134
136
  {
135
137
  fillRule: "evenodd",
@@ -142,7 +144,7 @@ const U = ({
142
144
  }
143
145
  )
144
146
  ] }),
145
- /* @__PURE__ */ n("div", { className: "grid grid-cols-7 gap-1 mb-2", children: E.map((e) => /* @__PURE__ */ n(
147
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-7 gap-1 mb-2", children: H.map((e) => /* @__PURE__ */ t(
146
148
  "div",
147
149
  {
148
150
  className: "text-center text-xs font-semibold text-base-content/60 py-2",
@@ -150,39 +152,39 @@ const U = ({
150
152
  },
151
153
  e
152
154
  )) }),
153
- /* @__PURE__ */ n("div", { className: "grid grid-cols-7 gap-1", children: w.map((e, s) => /* @__PURE__ */ n(
155
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-7 gap-1", children: D.map((e, s) => /* @__PURE__ */ t(
154
156
  "button",
155
157
  {
156
158
  type: "button",
157
159
  disabled: !e,
158
- onClick: () => e && z(e),
160
+ onClick: () => e && j(e),
159
161
  className: `
160
162
  aspect-square flex items-center justify-center text-sm rounded-lg
161
163
  ${e ? "hover:bg-base-200" : "invisible"}
162
- ${x(e) ? "bg-primary text-primary-content hover:bg-primary/90" : ""}
163
- ${I(e) && !x(e) ? "border border-primary" : ""}
164
+ ${$(e) ? "bg-primary text-primary-content hover:bg-primary/90" : ""}
165
+ ${I(e) && !$(e) ? "border border-primary" : ""}
164
166
  ${e ? "cursor-pointer" : ""}
165
167
  `,
166
168
  children: e
167
169
  },
168
170
  s
169
171
  )) }),
170
- /* @__PURE__ */ n("div", { className: "mt-4 flex justify-end", children: /* @__PURE__ */ n(
172
+ /* @__PURE__ */ t("div", { className: "mt-4 flex justify-end", children: /* @__PURE__ */ t(
171
173
  "button",
172
174
  {
173
175
  type: "button",
174
176
  onClick: () => {
175
177
  const e = /* @__PURE__ */ new Date();
176
- p(e), i(e.getMonth()), b(e.getFullYear()), d?.(e), u(!1);
178
+ b(e), i(e.getMonth()), v(e.getFullYear()), d?.(e), u(!1);
177
179
  },
178
- className: `${D} ${M} ${y}`,
180
+ className: `${M} ${y} ${S}`,
179
181
  children: "Today"
180
182
  }
181
183
  ) })
182
184
  ] })
183
185
  ] });
184
- };
186
+ });
185
187
  export {
186
- U as DatePicker
188
+ te as DatePicker
187
189
  };
188
190
  //# sourceMappingURL=DatePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sources":["../../src/components/DatePicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react'\nimport { Input } from './Input'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnSquare = 'd-btn-square'\n\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: Date | null\n defaultValue?: Date | null\n onChange?: (date: Date | null) => void\n format?: string\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nfunction formatDate(date: Date | null, format: string = 'MM/DD/YYYY'): string {\n if (!date) return ''\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n value,\n defaultValue,\n onChange,\n format,\n placeholder = 'Select date',\n disabled = false,\n className = '',\n size,\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n value || defaultValue || null\n )\n const [isOpen, setIsOpen] = useState(false)\n const [viewMonth, setViewMonth] = useState(\n selectedDate ? selectedDate.getMonth() : new Date().getMonth()\n )\n const [viewYear, setViewYear] = useState(\n selectedDate ? selectedDate.getFullYear() : new Date().getFullYear()\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedDate(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n setSelectedDate(newDate)\n onChange?.(newDate)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isSelectedDay = (day: number | null): boolean => {\n if (!day || !selectedDate) return false\n return (\n selectedDate.getDate() === day &&\n selectedDate.getMonth() === viewMonth &&\n selectedDate.getFullYear() === viewYear\n )\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n return (\n <div ref={containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} {...rest}>\n <Input\n value={formatDate(selectedDate, format)}\n placeholder={placeholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className=\"cursor-pointer\"\n />\n\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n disabled={!day}\n onClick={() => day && handleDateSelect(day)}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : 'hover:bg-base-200'}\n ${isSelectedDay(day) ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isSelectedDay(day) ? 'border border-primary' : ''}\n ${day ? 'cursor-pointer' : ''}\n `}\n >\n {day}\n </button>\n ))}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n setSelectedDate(today)\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.(today)\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnSquare","DAYS","MONTHS","formatDate","date","format","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","value","defaultValue","onChange","placeholder","disabled","className","size","rest","componentSize","useConfig","effectiveSize","selectedDate","setSelectedDate","useState","isOpen","setIsOpen","viewMonth","setViewMonth","viewYear","setViewYear","containerRef","useRef","useEffect","handleClickOutside","event","handleDateSelect","newDate","handlePrevMonth","handleNextMonth","daysInMonth","firstDayOfMonth","calendarDays","i","isSelectedDay","isToday","today","jsxs","jsx","Input","index"],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","sources":["../../src/components/DatePicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, forwardRef } from 'react'\nimport { Input } from './Input'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'd-btn'\nconst dBtnGhost = 'd-btn-ghost'\nconst dBtnSm = 'd-btn-sm'\nconst dBtnSquare = 'd-btn-square'\n\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n value?: Date | null\n defaultValue?: Date | null\n onChange?: (date: Date | null) => void\n format?: string\n placeholder?: string\n disabled?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\n\nfunction formatDate(date: Date | null, format: string = 'MM/DD/YYYY'): string {\n if (!date) return ''\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(function DatePicker(\n {\n value,\n defaultValue,\n onChange,\n format,\n placeholder = 'Select date',\n disabled = false,\n size,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const [selectedDate, setSelectedDate] = useState<Date | null>(\n value || defaultValue || null\n )\n const [isOpen, setIsOpen] = useState(false)\n const [viewMonth, setViewMonth] = useState(\n selectedDate ? selectedDate.getMonth() : new Date().getMonth()\n )\n const [viewYear, setViewYear] = useState(\n selectedDate ? selectedDate.getFullYear() : new Date().getFullYear()\n )\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (value !== undefined) {\n setSelectedDate(value)\n }\n }, [value])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n const handleDateSelect = (day: number) => {\n const newDate = new Date(viewYear, viewMonth, day)\n setSelectedDate(newDate)\n onChange?.(newDate)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n if (viewMonth === 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else {\n setViewMonth(viewMonth - 1)\n }\n }\n\n const handleNextMonth = () => {\n if (viewMonth === 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else {\n setViewMonth(viewMonth + 1)\n }\n }\n\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDayOfMonth = getFirstDayOfMonth(viewYear, viewMonth)\n\n const calendarDays: (number | null)[] = []\n for (let i = 0; i < firstDayOfMonth; i++) {\n calendarDays.push(null)\n }\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(i)\n }\n\n const isSelectedDay = (day: number | null): boolean => {\n if (!day || !selectedDate) return false\n return (\n selectedDate.getDate() === day &&\n selectedDate.getMonth() === viewMonth &&\n selectedDate.getFullYear() === viewYear\n )\n }\n\n const isToday = (day: number | null): boolean => {\n if (!day) return false\n const today = new Date()\n return (\n today.getDate() === day &&\n today.getMonth() === viewMonth &&\n today.getFullYear() === viewYear\n )\n }\n\n return (\n <div ref={ref || containerRef} className={`relative ${className}`} data-state={isOpen ? 'open' : 'closed'} data-testid={testId} {...rest}>\n <Input\n value={formatDate(selectedDate, format)}\n placeholder={placeholder}\n disabled={disabled}\n size={effectiveSize}\n readOnly\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className=\"cursor-pointer\"\n data-testid={getTestId('input')}\n />\n\n {isOpen && (\n <div className=\"absolute top-full left-0 mt-2 bg-base-100 border border-base-300 rounded-lg shadow-lg p-4 z-50 w-80\" data-testid={getTestId('calendar')}>\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n\n <div className=\"text-base font-semibold\">\n {MONTHS[viewMonth]} {viewYear}\n </div>\n\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm} ${dBtnSquare}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n {/* Days of week */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map((day) => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-base-content/60 py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n disabled={!day}\n onClick={() => day && handleDateSelect(day)}\n className={`\n aspect-square flex items-center justify-center text-sm rounded-lg\n ${!day ? 'invisible' : 'hover:bg-base-200'}\n ${isSelectedDay(day) ? 'bg-primary text-primary-content hover:bg-primary/90' : ''}\n ${isToday(day) && !isSelectedDay(day) ? 'border border-primary' : ''}\n ${day ? 'cursor-pointer' : ''}\n `}\n >\n {day}\n </button>\n ))}\n </div>\n\n {/* Today button */}\n <div className=\"mt-4 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date()\n setSelectedDate(today)\n setViewMonth(today.getMonth())\n setViewYear(today.getFullYear())\n onChange?.(today)\n setIsOpen(false)\n }}\n className={`${dBtn} ${dBtnGhost} ${dBtnSm}`}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnSm","dBtnSquare","DAYS","MONTHS","formatDate","date","format","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","forwardRef","value","defaultValue","onChange","placeholder","disabled","size","testId","className","rest","ref","componentSize","useConfig","effectiveSize","getTestId","suffix","selectedDate","setSelectedDate","useState","isOpen","setIsOpen","viewMonth","setViewMonth","viewYear","setViewYear","containerRef","useRef","useEffect","handleClickOutside","event","handleDateSelect","newDate","handlePrevMonth","handleNextMonth","daysInMonth","firstDayOfMonth","calendarDays","i","isSelectedDay","isToday","today","jsx","Input","jsxs","index"],"mappings":"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"}
@@ -19,8 +19,6 @@ export interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>
19
19
  children?: React.ReactNode;
20
20
  /** Menu items (data-driven pattern) */
21
21
  items?: DropdownMenuItemType[];
22
- /** @deprecated Use trigger={['hover']} instead */
23
- hover?: boolean;
24
22
  /** Trigger mode(s) for dropdown */
25
23
  trigger?: DropdownTriggerType[];
26
24
  position?: 'top' | 'bottom' | 'left' | 'right';
@@ -45,6 +43,10 @@ export interface DropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>
45
43
  getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
46
44
  /** Destroy dropdown when hidden */
47
45
  destroyOnHidden?: boolean;
46
+ /** Customize popup content */
47
+ popupRender?: (menu: React.ReactNode) => React.ReactNode;
48
+ /** Test ID prefix for child elements */
49
+ 'data-testid'?: string;
48
50
  }
49
51
  export interface DropdownTriggerProps {
50
52
  children: React.ReactNode;
@@ -84,7 +86,6 @@ export interface DropdownSubMenuProps {
84
86
  export interface DropdownDividerProps {
85
87
  className?: string;
86
88
  }
87
- declare function DropdownRoot({ children, items, hover, trigger, position, align, open: controlledOpen, onOpenChange, disabled, arrow, mouseEnterDelay, mouseLeaveDelay, getPopupContainer, destroyOnHidden, className, ...rest }: DropdownProps): import("react/jsx-runtime").JSX.Element;
88
89
  declare function DropdownTrigger({ children, className }: DropdownTriggerProps): React.ReactElement<React.HTMLAttributes<HTMLElement> & {
89
90
  onClick?: (e: React.MouseEvent) => void;
90
91
  onKeyDown?: (e: React.KeyboardEvent) => void;
@@ -94,7 +95,7 @@ declare function DropdownMenu({ children, className }: DropdownMenuProps): impor
94
95
  declare function DropdownItem({ children, icon, label, onClick, active, disabled, danger, className, _key, }: DropdownItemProps): import("react/jsx-runtime").JSX.Element;
95
96
  declare function DropdownSubMenu({ children, title, icon, disabled, className, _key, }: DropdownSubMenuProps): import("react/jsx-runtime").JSX.Element;
96
97
  declare function DropdownDivider({ className }: DropdownDividerProps): import("react/jsx-runtime").JSX.Element;
97
- export declare const Dropdown: typeof DropdownRoot & {
98
+ export declare const Dropdown: React.ForwardRefExoticComponent<DropdownProps & React.RefAttributes<HTMLDivElement>> & {
98
99
  Trigger: typeof DropdownTrigger;
99
100
  Menu: typeof DropdownMenu;
100
101
  Item: typeof DropdownItem;