@duskmoon-dev/components 0.3.3 → 0.4.0
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/README.md +61 -2
- package/dist/classes/chat.d.ts +9 -1
- package/dist/classes/console-page.d.ts +16 -0
- package/dist/classes/dropdown.d.ts +5 -5
- package/dist/classes/fab.d.ts +11 -0
- package/dist/classes/index.d.ts +5 -0
- package/dist/classes/index.js +180 -34
- package/dist/classes/megamenu.d.ts +10 -0
- package/dist/classes/otp-input.d.ts +12 -0
- package/dist/classes/popover.d.ts +1 -3
- package/dist/classes/swap.d.ts +12 -0
- package/dist/classes/tree-select.d.ts +6 -6
- package/dist/components/app/index.js +128 -68
- package/dist/components/avatar/Avatar.types.d.ts +1 -1
- package/dist/components/avatar/index.js +2 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/button/Button.d.ts +1 -1
- package/dist/components/button/Button.types.d.ts +8 -0
- package/dist/components/button/index.js +253 -24
- package/dist/components/calendar/index.js +44 -19
- package/dist/components/chat/Chat.d.ts +9 -1
- package/dist/components/chat/Chat.types.d.ts +26 -0
- package/dist/components/chat/index.js +92 -3
- package/dist/components/color-picker/ColorPicker.types.d.ts +2 -1
- package/dist/components/color-picker/index.js +206 -9
- package/dist/components/console-page/ConsolePage.d.ts +2 -0
- package/dist/components/console-page/ConsolePage.types.d.ts +29 -0
- package/dist/components/console-page/index.d.ts +2 -0
- package/dist/components/console-page/index.js +205 -0
- package/dist/components/date-picker/DatePicker.types.d.ts +1 -0
- package/dist/components/date-picker/index.js +537 -35
- package/dist/components/date-picker/usePickerDropdown.d.ts +17 -0
- package/dist/components/dm-date-picker/index.js +545 -43
- package/dist/components/dm-drawer/index.js +253 -24
- package/dist/components/dm-layout/index.js +391 -24
- package/dist/components/dm-menu/index.js +380 -13
- package/dist/components/dm-page-header/index.js +404 -114
- package/dist/components/dm-pro-table/index.js +1183 -368
- package/dist/components/dm-query/DmQuery.types.d.ts +1 -1
- package/dist/components/dm-query/index.js +931 -188
- package/dist/components/dm-search/DmSearch.types.d.ts +4 -0
- package/dist/components/dm-search/index.js +917 -163
- package/dist/components/dm-table/index.js +1001 -247
- package/dist/components/dm-toolbar/index.js +400 -110
- package/dist/components/dm-truncate/index.js +115 -35
- package/dist/components/dropdown/Dropdown.types.d.ts +1 -1
- package/dist/components/dropdown/index.js +400 -110
- package/dist/components/fab/Fab.d.ts +4 -0
- package/dist/components/fab/Fab.types.d.ts +25 -0
- package/dist/components/fab/index.d.ts +2 -0
- package/dist/components/fab/index.js +480 -0
- package/dist/components/form/Form.types.d.ts +1 -0
- package/dist/components/form/index.js +14 -3
- package/dist/components/megamenu/Megamenu.d.ts +2 -0
- package/dist/components/megamenu/Megamenu.types.d.ts +32 -0
- package/dist/components/megamenu/index.d.ts +2 -0
- package/dist/components/megamenu/index.js +214 -0
- package/dist/components/modal/index.js +128 -68
- package/dist/components/otp-input/OtpInput.d.ts +2 -0
- package/dist/components/otp-input/OtpInput.types.d.ts +16 -0
- package/dist/components/otp-input/index.d.ts +2 -0
- package/dist/components/otp-input/index.js +112 -0
- package/dist/components/popconfirm/index.js +255 -26
- package/dist/components/popover/index.js +24 -4
- package/dist/components/swap/Swap.d.ts +3 -0
- package/dist/components/swap/Swap.types.d.ts +22 -0
- package/dist/components/swap/index.d.ts +2 -0
- package/dist/components/swap/index.js +109 -0
- package/dist/components/time-picker/TimePicker.types.d.ts +1 -0
- package/dist/components/time-picker/index.js +167 -29
- package/dist/components/tooltip/Tooltip.types.d.ts +4 -0
- package/dist/components/tooltip/index.js +107 -27
- package/dist/components/tour/index.js +253 -24
- package/dist/components/tree-select/index.js +8 -8
- package/dist/components/upload/Upload.types.d.ts +1 -0
- package/dist/components/upload/index.js +2 -0
- package/dist/generated/version.d.ts +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3330 -1632
- package/dist/infrastructure.js +1 -1
- package/dist/styles.css +1190 -906
- package/package.json +23 -3
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
// src/components/date-picker/DatePicker.tsx
|
|
4
|
+
import { forwardRef as forwardRef2, useMemo as useMemo2, useState as useState3 } from "react";
|
|
5
|
+
|
|
6
|
+
// src/components/calendar/Calendar.tsx
|
|
4
7
|
import { forwardRef, useMemo, useState } from "react";
|
|
5
8
|
|
|
6
9
|
// ../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
|
|
@@ -28,6 +31,420 @@ function clsx() {
|
|
|
28
31
|
function cn(...inputs) {
|
|
29
32
|
return clsx(inputs);
|
|
30
33
|
}
|
|
34
|
+
// src/classes/calendar.ts
|
|
35
|
+
var calendarBaseClass = "datepicker calendar";
|
|
36
|
+
var calendarHeaderClass = "calendar-header";
|
|
37
|
+
var calendarTitleClass = "calendar-title";
|
|
38
|
+
var calendarControlsClass = "calendar-controls";
|
|
39
|
+
var calendarNavClass = "calendar-nav";
|
|
40
|
+
var calendarModeClass = "calendar-mode";
|
|
41
|
+
var calendarWeekdaysClass = "calendar-weekdays";
|
|
42
|
+
var calendarWeekdayClass = "calendar-weekday";
|
|
43
|
+
var calendarBodyClass = "calendar-body";
|
|
44
|
+
var calendarDateGridClass = "calendar-date-grid";
|
|
45
|
+
var calendarMonthGridClass = "calendar-month-grid";
|
|
46
|
+
var calendarCellContentClass = "calendar-cell-content";
|
|
47
|
+
function getCalendarClasses({
|
|
48
|
+
fullscreen = true,
|
|
49
|
+
mode = "month",
|
|
50
|
+
className
|
|
51
|
+
}) {
|
|
52
|
+
return cn(calendarBaseClass, fullscreen ? "calendar-fullscreen" : "calendar-card", mode === "year" && "calendar-year-mode", className);
|
|
53
|
+
}
|
|
54
|
+
function getCalendarCellClasses({
|
|
55
|
+
selected,
|
|
56
|
+
today,
|
|
57
|
+
outside,
|
|
58
|
+
disabled,
|
|
59
|
+
className
|
|
60
|
+
}) {
|
|
61
|
+
return cn("calendar-cell", selected && "calendar-cell-selected", today && "calendar-cell-today", outside && "calendar-cell-outside", disabled && "calendar-cell-disabled", className);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/components/calendar/Calendar.tsx
|
|
65
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
66
|
+
var WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
67
|
+
var MONTHS = [
|
|
68
|
+
"Jan",
|
|
69
|
+
"Feb",
|
|
70
|
+
"Mar",
|
|
71
|
+
"Apr",
|
|
72
|
+
"May",
|
|
73
|
+
"Jun",
|
|
74
|
+
"Jul",
|
|
75
|
+
"Aug",
|
|
76
|
+
"Sep",
|
|
77
|
+
"Oct",
|
|
78
|
+
"Nov",
|
|
79
|
+
"Dec"
|
|
80
|
+
];
|
|
81
|
+
function pad(value) {
|
|
82
|
+
return String(value).padStart(2, "0");
|
|
83
|
+
}
|
|
84
|
+
function formatDate(date) {
|
|
85
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
86
|
+
}
|
|
87
|
+
function formatMonth(date) {
|
|
88
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-01`;
|
|
89
|
+
}
|
|
90
|
+
function parseDate(value) {
|
|
91
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
92
|
+
return new Date(value.getFullYear(), value.getMonth(), value.getDate());
|
|
93
|
+
}
|
|
94
|
+
if (typeof value === "string" && value.length > 0) {
|
|
95
|
+
const [year, month = "1", day = "1"] = value.split("-");
|
|
96
|
+
const parsed = new Date(Number(year), Number(month) - 1, Number(day));
|
|
97
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const today = new Date;
|
|
102
|
+
return new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
103
|
+
}
|
|
104
|
+
function addMonths(date, amount) {
|
|
105
|
+
return new Date(date.getFullYear(), date.getMonth() + amount, 1);
|
|
106
|
+
}
|
|
107
|
+
function addYears(date, amount) {
|
|
108
|
+
return new Date(date.getFullYear() + amount, date.getMonth(), 1);
|
|
109
|
+
}
|
|
110
|
+
function startOfCalendarGrid(panelDate) {
|
|
111
|
+
const firstOfMonth = new Date(panelDate.getFullYear(), panelDate.getMonth(), 1);
|
|
112
|
+
const start = new Date(firstOfMonth);
|
|
113
|
+
start.setDate(firstOfMonth.getDate() - firstOfMonth.getDay());
|
|
114
|
+
return start;
|
|
115
|
+
}
|
|
116
|
+
function buildDateGrid(panelDate) {
|
|
117
|
+
const start = startOfCalendarGrid(panelDate);
|
|
118
|
+
return Array.from({ length: 42 }, (_, index) => {
|
|
119
|
+
const date = new Date(start);
|
|
120
|
+
date.setDate(start.getDate() + index);
|
|
121
|
+
return date;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function isSameMonth(left, right) {
|
|
125
|
+
return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth();
|
|
126
|
+
}
|
|
127
|
+
function isOutsideRange(date, validRange) {
|
|
128
|
+
if (!validRange) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const current = formatDate(date);
|
|
132
|
+
const start = formatDate(parseDate(validRange[0]));
|
|
133
|
+
const end = formatDate(parseDate(validRange[1]));
|
|
134
|
+
return current < start || current > end;
|
|
135
|
+
}
|
|
136
|
+
function Header({
|
|
137
|
+
panelDate,
|
|
138
|
+
mode,
|
|
139
|
+
setPanelDate,
|
|
140
|
+
setMode
|
|
141
|
+
}) {
|
|
142
|
+
const title = mode === "year" ? String(panelDate.getFullYear()) : `${MONTHS[panelDate.getMonth()]} ${panelDate.getFullYear()}`;
|
|
143
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
144
|
+
className: calendarHeaderClass,
|
|
145
|
+
children: [
|
|
146
|
+
/* @__PURE__ */ jsx("button", {
|
|
147
|
+
type: "button",
|
|
148
|
+
className: calendarNavClass,
|
|
149
|
+
"aria-label": "Previous panel",
|
|
150
|
+
onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, -1) : addMonths(panelDate, -1), mode),
|
|
151
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
152
|
+
"aria-hidden": "true",
|
|
153
|
+
focusable: "false",
|
|
154
|
+
width: "16",
|
|
155
|
+
height: "16",
|
|
156
|
+
viewBox: "0 0 24 24",
|
|
157
|
+
fill: "none",
|
|
158
|
+
stroke: "currentColor",
|
|
159
|
+
strokeWidth: "2",
|
|
160
|
+
strokeLinecap: "round",
|
|
161
|
+
strokeLinejoin: "round",
|
|
162
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
163
|
+
d: "m15 18-6-6 6-6"
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
}),
|
|
167
|
+
/* @__PURE__ */ jsxs("div", {
|
|
168
|
+
className: calendarControlsClass,
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ jsx("div", {
|
|
171
|
+
className: calendarTitleClass,
|
|
172
|
+
children: title
|
|
173
|
+
}),
|
|
174
|
+
/* @__PURE__ */ jsxs("div", {
|
|
175
|
+
className: calendarModeClass,
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ jsx("button", {
|
|
178
|
+
type: "button",
|
|
179
|
+
"aria-pressed": mode === "month",
|
|
180
|
+
onClick: () => setMode("month"),
|
|
181
|
+
children: "Month"
|
|
182
|
+
}),
|
|
183
|
+
/* @__PURE__ */ jsx("button", {
|
|
184
|
+
type: "button",
|
|
185
|
+
"aria-pressed": mode === "year",
|
|
186
|
+
onClick: () => setMode("year"),
|
|
187
|
+
children: "Year"
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
})
|
|
191
|
+
]
|
|
192
|
+
}),
|
|
193
|
+
/* @__PURE__ */ jsx("button", {
|
|
194
|
+
type: "button",
|
|
195
|
+
className: calendarNavClass,
|
|
196
|
+
"aria-label": "Next panel",
|
|
197
|
+
onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, 1) : addMonths(panelDate, 1), mode),
|
|
198
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
199
|
+
"aria-hidden": "true",
|
|
200
|
+
focusable: "false",
|
|
201
|
+
width: "16",
|
|
202
|
+
height: "16",
|
|
203
|
+
viewBox: "0 0 24 24",
|
|
204
|
+
fill: "none",
|
|
205
|
+
stroke: "currentColor",
|
|
206
|
+
strokeWidth: "2",
|
|
207
|
+
strokeLinecap: "round",
|
|
208
|
+
strokeLinejoin: "round",
|
|
209
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
210
|
+
d: "m9 18 6-6-6-6"
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
})
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
var Calendar = forwardRef(({
|
|
218
|
+
className,
|
|
219
|
+
value,
|
|
220
|
+
defaultValue,
|
|
221
|
+
mode,
|
|
222
|
+
defaultMode = "month",
|
|
223
|
+
fullscreen = true,
|
|
224
|
+
validRange,
|
|
225
|
+
disabledDate,
|
|
226
|
+
dateCellRender,
|
|
227
|
+
dateFullCellRender,
|
|
228
|
+
monthCellRender,
|
|
229
|
+
monthFullCellRender,
|
|
230
|
+
cellRender,
|
|
231
|
+
fullCellRender,
|
|
232
|
+
headerRender,
|
|
233
|
+
onChange,
|
|
234
|
+
onSelect,
|
|
235
|
+
onPanelChange,
|
|
236
|
+
...props
|
|
237
|
+
}, ref) => {
|
|
238
|
+
const selectedDate = parseDate(value ?? defaultValue);
|
|
239
|
+
const [innerValue, setInnerValue] = useState(() => formatDate(selectedDate));
|
|
240
|
+
const [panelDate, setInnerPanelDate] = useState(selectedDate);
|
|
241
|
+
const [innerMode, setInnerMode] = useState(mode ?? defaultMode);
|
|
242
|
+
const currentMode = mode ?? innerMode;
|
|
243
|
+
const currentValue = value === undefined ? innerValue : formatDate(parseDate(value));
|
|
244
|
+
const today = useMemo(() => formatDate(new Date), []);
|
|
245
|
+
const dateGrid = useMemo(() => buildDateGrid(panelDate), [panelDate]);
|
|
246
|
+
function emitPanelChange(nextDate, nextMode = currentMode) {
|
|
247
|
+
setInnerPanelDate(nextDate);
|
|
248
|
+
onPanelChange?.(formatDate(nextDate), nextMode);
|
|
249
|
+
}
|
|
250
|
+
function setCalendarMode(nextMode) {
|
|
251
|
+
if (mode === undefined) {
|
|
252
|
+
setInnerMode(nextMode);
|
|
253
|
+
}
|
|
254
|
+
onPanelChange?.(formatDate(panelDate), nextMode);
|
|
255
|
+
}
|
|
256
|
+
function commitValue(nextDate, source) {
|
|
257
|
+
const nextValue = source === "month" ? formatMonth(nextDate) : formatDate(nextDate);
|
|
258
|
+
if (disabledDate?.(nextValue) || isOutsideRange(nextDate, validRange)) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (value === undefined) {
|
|
262
|
+
setInnerValue(nextValue);
|
|
263
|
+
}
|
|
264
|
+
setInnerPanelDate(nextDate);
|
|
265
|
+
onSelect?.(nextValue, { source });
|
|
266
|
+
onChange?.(nextValue);
|
|
267
|
+
}
|
|
268
|
+
function renderDateCell(date) {
|
|
269
|
+
const dateValue = formatDate(date);
|
|
270
|
+
const originNode = /* @__PURE__ */ jsxs("div", {
|
|
271
|
+
className: calendarCellContentClass,
|
|
272
|
+
children: [
|
|
273
|
+
/* @__PURE__ */ jsx("span", {
|
|
274
|
+
children: date.getDate()
|
|
275
|
+
}),
|
|
276
|
+
dateCellRender?.(dateValue)
|
|
277
|
+
]
|
|
278
|
+
});
|
|
279
|
+
const info = {
|
|
280
|
+
originNode,
|
|
281
|
+
today,
|
|
282
|
+
type: "month"
|
|
283
|
+
};
|
|
284
|
+
const content = fullCellRender?.(dateValue, info) ?? dateFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
|
|
285
|
+
const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
|
|
286
|
+
return /* @__PURE__ */ jsx("button", {
|
|
287
|
+
type: "button",
|
|
288
|
+
"aria-label": dateValue,
|
|
289
|
+
disabled,
|
|
290
|
+
className: getCalendarCellClasses({
|
|
291
|
+
selected: dateValue === currentValue,
|
|
292
|
+
today: dateValue === today,
|
|
293
|
+
outside: !isSameMonth(date, panelDate),
|
|
294
|
+
disabled
|
|
295
|
+
}),
|
|
296
|
+
onClick: () => commitValue(date, "date"),
|
|
297
|
+
children: content
|
|
298
|
+
}, dateValue);
|
|
299
|
+
}
|
|
300
|
+
function renderMonthCell(month) {
|
|
301
|
+
const date = new Date(panelDate.getFullYear(), month, 1);
|
|
302
|
+
const dateValue = formatMonth(date);
|
|
303
|
+
const originNode = /* @__PURE__ */ jsxs("div", {
|
|
304
|
+
className: calendarCellContentClass,
|
|
305
|
+
children: [
|
|
306
|
+
/* @__PURE__ */ jsx("span", {
|
|
307
|
+
children: MONTHS[month]
|
|
308
|
+
}),
|
|
309
|
+
monthCellRender?.(dateValue)
|
|
310
|
+
]
|
|
311
|
+
});
|
|
312
|
+
const info = {
|
|
313
|
+
originNode,
|
|
314
|
+
today,
|
|
315
|
+
type: "year"
|
|
316
|
+
};
|
|
317
|
+
const content = fullCellRender?.(dateValue, info) ?? monthFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
|
|
318
|
+
const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
|
|
319
|
+
return /* @__PURE__ */ jsx("button", {
|
|
320
|
+
type: "button",
|
|
321
|
+
"aria-label": dateValue,
|
|
322
|
+
disabled,
|
|
323
|
+
className: getCalendarCellClasses({
|
|
324
|
+
selected: dateValue === formatMonth(parseDate(currentValue)),
|
|
325
|
+
today: dateValue === formatMonth(new Date),
|
|
326
|
+
disabled
|
|
327
|
+
}),
|
|
328
|
+
onClick: () => commitValue(date, "month"),
|
|
329
|
+
children: content
|
|
330
|
+
}, dateValue);
|
|
331
|
+
}
|
|
332
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
333
|
+
...props,
|
|
334
|
+
ref,
|
|
335
|
+
className: getCalendarClasses({
|
|
336
|
+
fullscreen,
|
|
337
|
+
mode: currentMode,
|
|
338
|
+
className
|
|
339
|
+
}),
|
|
340
|
+
children: [
|
|
341
|
+
headerRender ? headerRender({
|
|
342
|
+
value: formatDate(panelDate),
|
|
343
|
+
type: currentMode,
|
|
344
|
+
onChange: (nextValue) => emitPanelChange(parseDate(nextValue)),
|
|
345
|
+
onTypeChange: setCalendarMode
|
|
346
|
+
}) : /* @__PURE__ */ jsx(Header, {
|
|
347
|
+
panelDate,
|
|
348
|
+
mode: currentMode,
|
|
349
|
+
setPanelDate: emitPanelChange,
|
|
350
|
+
setMode: setCalendarMode
|
|
351
|
+
}),
|
|
352
|
+
/* @__PURE__ */ jsx("div", {
|
|
353
|
+
className: calendarBodyClass,
|
|
354
|
+
children: currentMode === "month" ? /* @__PURE__ */ jsxs(Fragment, {
|
|
355
|
+
children: [
|
|
356
|
+
/* @__PURE__ */ jsx("div", {
|
|
357
|
+
className: calendarWeekdaysClass,
|
|
358
|
+
"aria-hidden": "true",
|
|
359
|
+
children: WEEKDAYS.map((weekday) => /* @__PURE__ */ jsx("span", {
|
|
360
|
+
className: calendarWeekdayClass,
|
|
361
|
+
children: weekday
|
|
362
|
+
}, weekday))
|
|
363
|
+
}),
|
|
364
|
+
/* @__PURE__ */ jsx("div", {
|
|
365
|
+
className: calendarDateGridClass,
|
|
366
|
+
children: dateGrid.map(renderDateCell)
|
|
367
|
+
})
|
|
368
|
+
]
|
|
369
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
370
|
+
className: calendarMonthGridClass,
|
|
371
|
+
children: MONTHS.map((_, month) => renderMonthCell(month))
|
|
372
|
+
})
|
|
373
|
+
})
|
|
374
|
+
]
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
Calendar.displayName = "Calendar";
|
|
378
|
+
// src/components/date-picker/usePickerDropdown.ts
|
|
379
|
+
import { useEffect, useId, useImperativeHandle, useRef, useState as useState2 } from "react";
|
|
380
|
+
function usePickerDropdown({
|
|
381
|
+
open,
|
|
382
|
+
defaultOpen,
|
|
383
|
+
disabled,
|
|
384
|
+
onOpenChange,
|
|
385
|
+
ref
|
|
386
|
+
}) {
|
|
387
|
+
const rootRef = useRef(null);
|
|
388
|
+
const inputRef = useRef(null);
|
|
389
|
+
const skipFocus = useRef(false);
|
|
390
|
+
const panelId = useId();
|
|
391
|
+
const [innerOpen, setInnerOpen] = useState2(Boolean(defaultOpen));
|
|
392
|
+
const visible = !disabled && (open ?? innerOpen);
|
|
393
|
+
useImperativeHandle(ref, () => rootRef.current, []);
|
|
394
|
+
function setVisible(next) {
|
|
395
|
+
if (disabled || next === visible)
|
|
396
|
+
return;
|
|
397
|
+
if (open === undefined)
|
|
398
|
+
setInnerOpen(next);
|
|
399
|
+
onOpenChange?.(next);
|
|
400
|
+
}
|
|
401
|
+
function closeAndFocus() {
|
|
402
|
+
skipFocus.current = true;
|
|
403
|
+
inputRef.current?.focus();
|
|
404
|
+
skipFocus.current = false;
|
|
405
|
+
setVisible(false);
|
|
406
|
+
}
|
|
407
|
+
useEffect(() => {
|
|
408
|
+
function handleOutside(event) {
|
|
409
|
+
if (visible && !rootRef.current?.contains(event.target))
|
|
410
|
+
setVisible(false);
|
|
411
|
+
}
|
|
412
|
+
function handleKeyDown(event) {
|
|
413
|
+
if (event.defaultPrevented || !rootRef.current?.contains(event.target))
|
|
414
|
+
return;
|
|
415
|
+
if (event.key === "Escape" && visible) {
|
|
416
|
+
event.preventDefault();
|
|
417
|
+
closeAndFocus();
|
|
418
|
+
} else if (event.key === "ArrowDown" && event.target === inputRef.current) {
|
|
419
|
+
event.preventDefault();
|
|
420
|
+
setVisible(true);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
document.addEventListener("pointerdown", handleOutside);
|
|
424
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
425
|
+
return () => {
|
|
426
|
+
document.removeEventListener("pointerdown", handleOutside);
|
|
427
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
428
|
+
};
|
|
429
|
+
});
|
|
430
|
+
return {
|
|
431
|
+
rootRef,
|
|
432
|
+
inputRef,
|
|
433
|
+
panelId,
|
|
434
|
+
visible,
|
|
435
|
+
setVisible,
|
|
436
|
+
closeAndFocus,
|
|
437
|
+
onInputFocus: () => {
|
|
438
|
+
if (!skipFocus.current)
|
|
439
|
+
setVisible(true);
|
|
440
|
+
},
|
|
441
|
+
onRootBlur: (event) => {
|
|
442
|
+
if (!event.currentTarget.contains(event.relatedTarget))
|
|
443
|
+
setVisible(false);
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
31
448
|
// src/classes/date-picker.ts
|
|
32
449
|
var datePickerBaseClass = "datepicker";
|
|
33
450
|
var datePickerInputClass = "datepicker-input";
|
|
@@ -75,7 +492,7 @@ function getDatePickerDropdownClasses({
|
|
|
75
492
|
}
|
|
76
493
|
|
|
77
494
|
// src/components/date-picker/DatePicker.tsx
|
|
78
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
495
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
79
496
|
function todayValue(picker) {
|
|
80
497
|
const today = new Date;
|
|
81
498
|
const year = today.getFullYear();
|
|
@@ -114,9 +531,10 @@ function placeholderForPicker(picker) {
|
|
|
114
531
|
function normalizeDateValue(value) {
|
|
115
532
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
116
533
|
}
|
|
117
|
-
var DatePickerRoot =
|
|
534
|
+
var DatePickerRoot = forwardRef2(({
|
|
118
535
|
allowClear,
|
|
119
536
|
className,
|
|
537
|
+
inputProps,
|
|
120
538
|
defaultOpen,
|
|
121
539
|
defaultValue,
|
|
122
540
|
disabled,
|
|
@@ -135,19 +553,19 @@ var DatePickerRoot = forwardRef(({
|
|
|
135
553
|
value,
|
|
136
554
|
...props
|
|
137
555
|
}, ref) => {
|
|
556
|
+
const [calendarMode, setCalendarMode] = useState3("month");
|
|
138
557
|
const isValueControlled = value !== undefined;
|
|
139
|
-
const
|
|
140
|
-
const
|
|
141
|
-
|
|
558
|
+
const [innerValue, setInnerValue] = useState3(() => normalizeDateValue(defaultValue));
|
|
559
|
+
const dropdown = usePickerDropdown({
|
|
560
|
+
open,
|
|
561
|
+
defaultOpen,
|
|
562
|
+
disabled,
|
|
563
|
+
onOpenChange,
|
|
564
|
+
ref
|
|
565
|
+
});
|
|
142
566
|
const currentValue = isValueControlled ? normalizeDateValue(value) : innerValue;
|
|
143
|
-
const visible
|
|
567
|
+
const { visible, setVisible } = dropdown;
|
|
144
568
|
const inputType = inputTypeForPicker(picker);
|
|
145
|
-
function setVisible(nextOpen) {
|
|
146
|
-
if (!isOpenControlled) {
|
|
147
|
-
setInnerOpen(nextOpen);
|
|
148
|
-
}
|
|
149
|
-
onOpenChange?.(nextOpen);
|
|
150
|
-
}
|
|
151
569
|
function emitChange(nextValue) {
|
|
152
570
|
if (nextValue && disabledDate?.(nextValue)) {
|
|
153
571
|
return;
|
|
@@ -157,10 +575,17 @@ var DatePickerRoot = forwardRef(({
|
|
|
157
575
|
}
|
|
158
576
|
onChange?.(nextValue, nextValue ?? "");
|
|
159
577
|
}
|
|
160
|
-
|
|
161
|
-
|
|
578
|
+
function selectValue(nextValue) {
|
|
579
|
+
if (disabledDate?.(nextValue))
|
|
580
|
+
return;
|
|
581
|
+
emitChange(nextValue);
|
|
582
|
+
dropdown.closeAndFocus();
|
|
583
|
+
}
|
|
584
|
+
const presetItems = useMemo2(() => presets ?? [], [presets]);
|
|
585
|
+
return /* @__PURE__ */ jsxs2("div", {
|
|
162
586
|
...props,
|
|
163
|
-
ref,
|
|
587
|
+
ref: dropdown.rootRef,
|
|
588
|
+
onBlur: dropdown.onRootBlur,
|
|
164
589
|
className: getDatePickerClasses({
|
|
165
590
|
size,
|
|
166
591
|
status,
|
|
@@ -170,7 +595,11 @@ var DatePickerRoot = forwardRef(({
|
|
|
170
595
|
className
|
|
171
596
|
}),
|
|
172
597
|
children: [
|
|
173
|
-
/* @__PURE__ */
|
|
598
|
+
/* @__PURE__ */ jsx2("input", {
|
|
599
|
+
...inputProps,
|
|
600
|
+
ref: dropdown.inputRef,
|
|
601
|
+
"aria-haspopup": "dialog",
|
|
602
|
+
"aria-controls": visible ? dropdown.panelId : undefined,
|
|
174
603
|
className: datePickerInputClass,
|
|
175
604
|
disabled,
|
|
176
605
|
type: inputType,
|
|
@@ -178,15 +607,15 @@ var DatePickerRoot = forwardRef(({
|
|
|
178
607
|
placeholder: placeholder ?? placeholderForPicker(picker),
|
|
179
608
|
onFocus: (event) => {
|
|
180
609
|
onFocus?.(event);
|
|
181
|
-
|
|
610
|
+
dropdown.onInputFocus();
|
|
182
611
|
},
|
|
183
612
|
onBlur: (event) => {
|
|
184
613
|
onBlur?.(event);
|
|
185
|
-
setVisible(false);
|
|
186
614
|
},
|
|
615
|
+
onClick: () => setVisible(true),
|
|
187
616
|
onChange: (event) => emitChange(event.currentTarget.value || undefined)
|
|
188
617
|
}),
|
|
189
|
-
allowClear && currentValue && !disabled ? /* @__PURE__ */
|
|
618
|
+
allowClear && currentValue && !disabled ? /* @__PURE__ */ jsx2("button", {
|
|
190
619
|
type: "button",
|
|
191
620
|
className: datePickerClearClass,
|
|
192
621
|
"aria-label": "Clear date",
|
|
@@ -194,26 +623,95 @@ var DatePickerRoot = forwardRef(({
|
|
|
194
623
|
onClick: () => emitChange(undefined),
|
|
195
624
|
children: "x"
|
|
196
625
|
}) : null,
|
|
197
|
-
/* @__PURE__ */
|
|
626
|
+
/* @__PURE__ */ jsx2("button", {
|
|
627
|
+
type: "button",
|
|
198
628
|
className: datePickerIconClass,
|
|
199
|
-
"aria-
|
|
629
|
+
"aria-label": "Open date picker",
|
|
630
|
+
"aria-haspopup": "dialog",
|
|
631
|
+
"aria-expanded": visible,
|
|
632
|
+
"aria-controls": visible ? dropdown.panelId : undefined,
|
|
633
|
+
disabled,
|
|
634
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
635
|
+
onClick: () => setVisible(!visible),
|
|
636
|
+
children: /* @__PURE__ */ jsxs2("svg", {
|
|
637
|
+
"aria-hidden": "true",
|
|
638
|
+
focusable: "false",
|
|
639
|
+
width: "18",
|
|
640
|
+
height: "18",
|
|
641
|
+
viewBox: "0 0 24 24",
|
|
642
|
+
fill: "none",
|
|
643
|
+
stroke: "currentColor",
|
|
644
|
+
strokeWidth: "1.75",
|
|
645
|
+
strokeLinecap: "round",
|
|
646
|
+
strokeLinejoin: "round",
|
|
647
|
+
children: [
|
|
648
|
+
/* @__PURE__ */ jsx2("rect", {
|
|
649
|
+
x: "3",
|
|
650
|
+
y: "5",
|
|
651
|
+
width: "18",
|
|
652
|
+
height: "16",
|
|
653
|
+
rx: "2"
|
|
654
|
+
}),
|
|
655
|
+
/* @__PURE__ */ jsx2("path", {
|
|
656
|
+
d: "M8 3v4M16 3v4M3 10h18"
|
|
657
|
+
})
|
|
658
|
+
]
|
|
659
|
+
})
|
|
200
660
|
}),
|
|
201
|
-
|
|
661
|
+
visible ? /* @__PURE__ */ jsxs2("div", {
|
|
662
|
+
id: dropdown.panelId,
|
|
663
|
+
role: "dialog",
|
|
664
|
+
"aria-label": "Choose date",
|
|
202
665
|
className: getDatePickerDropdownClasses({ open: visible }),
|
|
203
666
|
children: [
|
|
204
|
-
|
|
667
|
+
picker === "date" || picker === "month" ? /* @__PURE__ */ jsx2(Calendar, {
|
|
668
|
+
fullscreen: false,
|
|
669
|
+
value: currentValue,
|
|
670
|
+
mode: picker === "month" ? "year" : calendarMode,
|
|
671
|
+
onPanelChange: (_, mode) => {
|
|
672
|
+
if (picker === "date")
|
|
673
|
+
setCalendarMode(mode);
|
|
674
|
+
},
|
|
675
|
+
disabledDate: (date) => {
|
|
676
|
+
if (!disabledDate)
|
|
677
|
+
return false;
|
|
678
|
+
if (picker === "month")
|
|
679
|
+
return disabledDate(date.slice(0, 7));
|
|
680
|
+
if (calendarMode === "year") {
|
|
681
|
+
const [year, month] = date.split("-").map(Number);
|
|
682
|
+
const days = new Date(year, month, 0).getDate();
|
|
683
|
+
return Array.from({ length: days }, (_, index) => `${date.slice(0, 7)}-${String(index + 1).padStart(2, "0")}`).every((day) => disabledDate(day));
|
|
684
|
+
}
|
|
685
|
+
return disabledDate(date);
|
|
686
|
+
},
|
|
687
|
+
onSelect: (date, info) => {
|
|
688
|
+
if (picker === "date" && info.source === "month") {
|
|
689
|
+
setCalendarMode("month");
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
selectValue(picker === "month" ? date.slice(0, 7) : date);
|
|
693
|
+
}
|
|
694
|
+
}) : /* @__PURE__ */ jsx2("input", {
|
|
695
|
+
type: inputType,
|
|
696
|
+
"aria-label": placeholderForPicker(picker),
|
|
697
|
+
value: currentValue ?? "",
|
|
698
|
+
onChange: (event) => selectValue(event.currentTarget.value)
|
|
699
|
+
}),
|
|
700
|
+
presetItems.map((preset, index) => /* @__PURE__ */ jsx2("button", {
|
|
205
701
|
type: "button",
|
|
206
702
|
className: datePickerPresetClass,
|
|
207
703
|
onMouseDown: (event) => event.preventDefault(),
|
|
208
|
-
|
|
704
|
+
disabled: Boolean(disabledDate?.(preset.value)),
|
|
705
|
+
onClick: () => selectValue(preset.value),
|
|
209
706
|
children: preset.label
|
|
210
707
|
}, index)),
|
|
211
|
-
showNow ? /* @__PURE__ */
|
|
708
|
+
showNow ? /* @__PURE__ */ jsx2("div", {
|
|
212
709
|
className: datePickerFooterClass,
|
|
213
|
-
children: /* @__PURE__ */
|
|
710
|
+
children: /* @__PURE__ */ jsx2("button", {
|
|
214
711
|
type: "button",
|
|
215
712
|
onMouseDown: (event) => event.preventDefault(),
|
|
216
|
-
|
|
713
|
+
disabled: Boolean(disabledDate?.(todayValue(picker))),
|
|
714
|
+
onClick: () => selectValue(todayValue(picker)),
|
|
217
715
|
children: "Now"
|
|
218
716
|
})
|
|
219
717
|
}) : null
|
|
@@ -223,9 +721,10 @@ var DatePickerRoot = forwardRef(({
|
|
|
223
721
|
});
|
|
224
722
|
});
|
|
225
723
|
DatePickerRoot.displayName = "DatePicker";
|
|
226
|
-
var RangePicker =
|
|
724
|
+
var RangePicker = forwardRef2(({
|
|
227
725
|
allowClear,
|
|
228
726
|
className,
|
|
727
|
+
inputProps,
|
|
229
728
|
defaultValue,
|
|
230
729
|
disabled,
|
|
231
730
|
disabledDate,
|
|
@@ -239,7 +738,7 @@ var RangePicker = forwardRef(({
|
|
|
239
738
|
...props
|
|
240
739
|
}, ref) => {
|
|
241
740
|
const isControlled = value !== undefined;
|
|
242
|
-
const [innerValue, setInnerValue] =
|
|
741
|
+
const [innerValue, setInnerValue] = useState3(defaultValue ?? [undefined, undefined]);
|
|
243
742
|
const currentValue = isControlled ? value : innerValue;
|
|
244
743
|
const inputType = inputTypeForPicker(picker);
|
|
245
744
|
function emitChange(nextValue) {
|
|
@@ -254,7 +753,7 @@ var RangePicker = forwardRef(({
|
|
|
254
753
|
function updateIndex(index, nextItem) {
|
|
255
754
|
emitChange(index === 0 ? [nextItem, currentValue?.[1]] : [currentValue?.[0], nextItem]);
|
|
256
755
|
}
|
|
257
|
-
return /* @__PURE__ */
|
|
756
|
+
return /* @__PURE__ */ jsxs2("div", {
|
|
258
757
|
...props,
|
|
259
758
|
ref,
|
|
260
759
|
className: getDatePickerClasses({
|
|
@@ -266,7 +765,8 @@ var RangePicker = forwardRef(({
|
|
|
266
765
|
className
|
|
267
766
|
}),
|
|
268
767
|
children: [
|
|
269
|
-
/* @__PURE__ */
|
|
768
|
+
/* @__PURE__ */ jsx2("input", {
|
|
769
|
+
...inputProps,
|
|
270
770
|
className: datePickerInputClass,
|
|
271
771
|
disabled,
|
|
272
772
|
type: inputType,
|
|
@@ -274,11 +774,13 @@ var RangePicker = forwardRef(({
|
|
|
274
774
|
placeholder: Array.isArray(placeholder) ? placeholder[0] : "Start date",
|
|
275
775
|
onChange: (event) => updateIndex(0, event.currentTarget.value || undefined)
|
|
276
776
|
}),
|
|
277
|
-
/* @__PURE__ */
|
|
777
|
+
/* @__PURE__ */ jsx2("span", {
|
|
278
778
|
className: datePickerSeparatorClass,
|
|
279
779
|
children: separator
|
|
280
780
|
}),
|
|
281
|
-
/* @__PURE__ */
|
|
781
|
+
/* @__PURE__ */ jsx2("input", {
|
|
782
|
+
...inputProps,
|
|
783
|
+
id: inputProps?.id ? `${inputProps.id}-end` : undefined,
|
|
282
784
|
className: datePickerInputClass,
|
|
283
785
|
disabled,
|
|
284
786
|
type: inputType,
|
|
@@ -286,7 +788,7 @@ var RangePicker = forwardRef(({
|
|
|
286
788
|
placeholder: Array.isArray(placeholder) ? placeholder[1] : "End date",
|
|
287
789
|
onChange: (event) => updateIndex(1, event.currentTarget.value || undefined)
|
|
288
790
|
}),
|
|
289
|
-
allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */
|
|
791
|
+
allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */ jsx2("button", {
|
|
290
792
|
type: "button",
|
|
291
793
|
className: datePickerClearClass,
|
|
292
794
|
"aria-label": "Clear date range",
|
|
@@ -298,7 +800,7 @@ var RangePicker = forwardRef(({
|
|
|
298
800
|
});
|
|
299
801
|
RangePicker.displayName = "DatePicker.RangePicker";
|
|
300
802
|
function withPicker(picker, displayName) {
|
|
301
|
-
const Picker =
|
|
803
|
+
const Picker = forwardRef2((props, ref) => /* @__PURE__ */ jsx2(DatePickerRoot, {
|
|
302
804
|
...props,
|
|
303
805
|
ref,
|
|
304
806
|
picker
|