asterui 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.
- package/dist/components/DatePicker.d.ts +3 -1
- package/dist/components/DatePicker.js +85 -83
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dropdown.d.ts +5 -4
- package/dist/components/Dropdown.js +228 -222
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/InputNumber.d.ts +2 -0
- package/dist/components/InputNumber.js +92 -88
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Menu.d.ts +3 -1
- package/dist/components/Menu.js +38 -37
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.d.ts +40 -18
- package/dist/components/Modal.js +180 -156
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.d.ts +2 -0
- package/dist/components/OTPInput.js +55 -53
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +3 -1
- package/dist/components/Pagination.js +104 -90
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.d.ts +3 -1
- package/dist/components/Popconfirm.js +63 -59
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Tabs.d.ts +3 -2
- package/dist/components/Tabs.js +74 -72
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/ThemeController.js +102 -88
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/ThemeProvider.js +17 -15
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/Transfer.d.ts +3 -1
- package/dist/components/Transfer.js +127 -120
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Upload.d.ts +3 -1
- package/dist/components/Upload.js +144 -142
- package/dist/components/Upload.js.map +1 -1
- package/dist/hooks/useTheme.js +8 -6
- package/dist/hooks/useTheme.js.map +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
13
|
+
export declare const DatePicker: React.ForwardRefExoticComponent<DatePickerProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { Input as
|
|
4
|
-
import { useConfig as
|
|
5
|
-
const
|
|
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 = "btn", y = "btn-ghost", S = "btn-sm", F = "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 = "btn", M = "btn-ghost", y = "btn-sm", Y = "btn-square", E = ["Su", "Mo
|
|
|
16
16
|
"November",
|
|
17
17
|
"December"
|
|
18
18
|
];
|
|
19
|
-
function
|
|
20
|
-
if (!
|
|
21
|
-
const
|
|
22
|
-
return
|
|
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
|
|
25
|
-
return new Date(
|
|
24
|
+
function Q(o, n) {
|
|
25
|
+
return new Date(o, n + 1, 0).getDate();
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
return new Date(
|
|
27
|
+
function U(o, n) {
|
|
28
|
+
return new Date(o, n, 1).getDay();
|
|
29
29
|
}
|
|
30
|
-
const
|
|
31
|
-
value:
|
|
32
|
-
defaultValue:
|
|
33
|
-
onChange:
|
|
34
|
-
format:
|
|
35
|
-
placeholder:
|
|
36
|
-
disabled:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
30
|
+
const te = J(function({
|
|
31
|
+
value: n,
|
|
32
|
+
defaultValue: h,
|
|
33
|
+
onChange: d,
|
|
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
|
-
|
|
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
|
|
58
|
-
const s = new Date(
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
r === 0 ? (i(11),
|
|
62
|
-
},
|
|
63
|
-
r === 11 ? (i(0),
|
|
64
|
-
},
|
|
65
|
-
for (let e = 0; e <
|
|
66
|
-
|
|
67
|
-
for (let e = 1; e <=
|
|
68
|
-
|
|
69
|
-
const
|
|
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() ===
|
|
73
|
+
return s.getDate() === e && s.getMonth() === r && s.getFullYear() === l;
|
|
73
74
|
};
|
|
74
|
-
return /* @__PURE__ */
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
|
|
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:
|
|
79
|
-
placeholder:
|
|
80
|
-
disabled:
|
|
81
|
-
size:
|
|
79
|
+
value: K(a, g),
|
|
80
|
+
placeholder: k,
|
|
81
|
+
disabled: x,
|
|
82
|
+
size: T,
|
|
82
83
|
readOnly: !0,
|
|
83
|
-
onClick: () => !
|
|
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__ */
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
-
/* @__PURE__ */
|
|
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:
|
|
94
|
-
className: `${
|
|
95
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
115
|
-
|
|
116
|
+
/* @__PURE__ */ f("div", { className: "text-base font-semibold", children: [
|
|
117
|
+
W[r],
|
|
116
118
|
" ",
|
|
117
|
-
|
|
119
|
+
l
|
|
118
120
|
] }),
|
|
119
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ t(
|
|
120
122
|
"button",
|
|
121
123
|
{
|
|
122
124
|
type: "button",
|
|
123
|
-
onClick:
|
|
124
|
-
className: `${
|
|
125
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 &&
|
|
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
|
-
${
|
|
163
|
-
${I(e) &&
|
|
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__ */
|
|
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
|
-
|
|
178
|
+
b(e), i(e.getMonth()), v(e.getFullYear()), d?.(e), u(!1);
|
|
177
179
|
},
|
|
178
|
-
className: `${
|
|
180
|
+
className: `${M} ${y} ${S}`,
|
|
179
181
|
children: "Today"
|
|
180
182
|
}
|
|
181
183
|
) })
|
|
182
184
|
] })
|
|
183
185
|
] });
|
|
184
|
-
};
|
|
186
|
+
});
|
|
185
187
|
export {
|
|
186
|
-
|
|
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 = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = '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 = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnSm = 'btn-sm'\nconst dBtnSquare = '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:
|
|
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;
|