@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,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
// src/components/dm-date-picker/DmDatePicker.tsx
|
|
4
|
-
import { forwardRef as
|
|
4
|
+
import { forwardRef as forwardRef3 } from "react";
|
|
5
5
|
|
|
6
6
|
// ../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
|
|
7
7
|
function r(e) {
|
|
@@ -113,8 +113,425 @@ function getDmDatePickerLocale() {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
// src/components/date-picker/DatePicker.tsx
|
|
116
|
+
import { forwardRef as forwardRef2, useMemo as useMemo2, useState as useState4 } from "react";
|
|
117
|
+
|
|
118
|
+
// src/components/calendar/Calendar.tsx
|
|
116
119
|
import { forwardRef, useMemo, useState as useState2 } from "react";
|
|
117
120
|
|
|
121
|
+
// src/classes/calendar.ts
|
|
122
|
+
var calendarBaseClass = "datepicker calendar";
|
|
123
|
+
var calendarHeaderClass = "calendar-header";
|
|
124
|
+
var calendarTitleClass = "calendar-title";
|
|
125
|
+
var calendarControlsClass = "calendar-controls";
|
|
126
|
+
var calendarNavClass = "calendar-nav";
|
|
127
|
+
var calendarModeClass = "calendar-mode";
|
|
128
|
+
var calendarWeekdaysClass = "calendar-weekdays";
|
|
129
|
+
var calendarWeekdayClass = "calendar-weekday";
|
|
130
|
+
var calendarBodyClass = "calendar-body";
|
|
131
|
+
var calendarDateGridClass = "calendar-date-grid";
|
|
132
|
+
var calendarMonthGridClass = "calendar-month-grid";
|
|
133
|
+
var calendarCellContentClass = "calendar-cell-content";
|
|
134
|
+
function getCalendarClasses({
|
|
135
|
+
fullscreen = true,
|
|
136
|
+
mode = "month",
|
|
137
|
+
className
|
|
138
|
+
}) {
|
|
139
|
+
return cn(calendarBaseClass, fullscreen ? "calendar-fullscreen" : "calendar-card", mode === "year" && "calendar-year-mode", className);
|
|
140
|
+
}
|
|
141
|
+
function getCalendarCellClasses({
|
|
142
|
+
selected,
|
|
143
|
+
today,
|
|
144
|
+
outside,
|
|
145
|
+
disabled,
|
|
146
|
+
className
|
|
147
|
+
}) {
|
|
148
|
+
return cn("calendar-cell", selected && "calendar-cell-selected", today && "calendar-cell-today", outside && "calendar-cell-outside", disabled && "calendar-cell-disabled", className);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/components/calendar/Calendar.tsx
|
|
152
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
153
|
+
var WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
154
|
+
var MONTHS = [
|
|
155
|
+
"Jan",
|
|
156
|
+
"Feb",
|
|
157
|
+
"Mar",
|
|
158
|
+
"Apr",
|
|
159
|
+
"May",
|
|
160
|
+
"Jun",
|
|
161
|
+
"Jul",
|
|
162
|
+
"Aug",
|
|
163
|
+
"Sep",
|
|
164
|
+
"Oct",
|
|
165
|
+
"Nov",
|
|
166
|
+
"Dec"
|
|
167
|
+
];
|
|
168
|
+
function pad(value) {
|
|
169
|
+
return String(value).padStart(2, "0");
|
|
170
|
+
}
|
|
171
|
+
function formatDate(date) {
|
|
172
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
173
|
+
}
|
|
174
|
+
function formatMonth(date) {
|
|
175
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-01`;
|
|
176
|
+
}
|
|
177
|
+
function parseDate(value) {
|
|
178
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) {
|
|
179
|
+
return new Date(value.getFullYear(), value.getMonth(), value.getDate());
|
|
180
|
+
}
|
|
181
|
+
if (typeof value === "string" && value.length > 0) {
|
|
182
|
+
const [year, month = "1", day = "1"] = value.split("-");
|
|
183
|
+
const parsed = new Date(Number(year), Number(month) - 1, Number(day));
|
|
184
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const today = new Date;
|
|
189
|
+
return new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
190
|
+
}
|
|
191
|
+
function addMonths(date, amount) {
|
|
192
|
+
return new Date(date.getFullYear(), date.getMonth() + amount, 1);
|
|
193
|
+
}
|
|
194
|
+
function addYears(date, amount) {
|
|
195
|
+
return new Date(date.getFullYear() + amount, date.getMonth(), 1);
|
|
196
|
+
}
|
|
197
|
+
function startOfCalendarGrid(panelDate) {
|
|
198
|
+
const firstOfMonth = new Date(panelDate.getFullYear(), panelDate.getMonth(), 1);
|
|
199
|
+
const start = new Date(firstOfMonth);
|
|
200
|
+
start.setDate(firstOfMonth.getDate() - firstOfMonth.getDay());
|
|
201
|
+
return start;
|
|
202
|
+
}
|
|
203
|
+
function buildDateGrid(panelDate) {
|
|
204
|
+
const start = startOfCalendarGrid(panelDate);
|
|
205
|
+
return Array.from({ length: 42 }, (_, index) => {
|
|
206
|
+
const date = new Date(start);
|
|
207
|
+
date.setDate(start.getDate() + index);
|
|
208
|
+
return date;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function isSameMonth(left, right) {
|
|
212
|
+
return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth();
|
|
213
|
+
}
|
|
214
|
+
function isOutsideRange(date, validRange) {
|
|
215
|
+
if (!validRange) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const current = formatDate(date);
|
|
219
|
+
const start = formatDate(parseDate(validRange[0]));
|
|
220
|
+
const end = formatDate(parseDate(validRange[1]));
|
|
221
|
+
return current < start || current > end;
|
|
222
|
+
}
|
|
223
|
+
function Header({
|
|
224
|
+
panelDate,
|
|
225
|
+
mode,
|
|
226
|
+
setPanelDate,
|
|
227
|
+
setMode
|
|
228
|
+
}) {
|
|
229
|
+
const title = mode === "year" ? String(panelDate.getFullYear()) : `${MONTHS[panelDate.getMonth()]} ${panelDate.getFullYear()}`;
|
|
230
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
231
|
+
className: calendarHeaderClass,
|
|
232
|
+
children: [
|
|
233
|
+
/* @__PURE__ */ jsx("button", {
|
|
234
|
+
type: "button",
|
|
235
|
+
className: calendarNavClass,
|
|
236
|
+
"aria-label": "Previous panel",
|
|
237
|
+
onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, -1) : addMonths(panelDate, -1), mode),
|
|
238
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
239
|
+
"aria-hidden": "true",
|
|
240
|
+
focusable: "false",
|
|
241
|
+
width: "16",
|
|
242
|
+
height: "16",
|
|
243
|
+
viewBox: "0 0 24 24",
|
|
244
|
+
fill: "none",
|
|
245
|
+
stroke: "currentColor",
|
|
246
|
+
strokeWidth: "2",
|
|
247
|
+
strokeLinecap: "round",
|
|
248
|
+
strokeLinejoin: "round",
|
|
249
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
250
|
+
d: "m15 18-6-6 6-6"
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
}),
|
|
254
|
+
/* @__PURE__ */ jsxs("div", {
|
|
255
|
+
className: calendarControlsClass,
|
|
256
|
+
children: [
|
|
257
|
+
/* @__PURE__ */ jsx("div", {
|
|
258
|
+
className: calendarTitleClass,
|
|
259
|
+
children: title
|
|
260
|
+
}),
|
|
261
|
+
/* @__PURE__ */ jsxs("div", {
|
|
262
|
+
className: calendarModeClass,
|
|
263
|
+
children: [
|
|
264
|
+
/* @__PURE__ */ jsx("button", {
|
|
265
|
+
type: "button",
|
|
266
|
+
"aria-pressed": mode === "month",
|
|
267
|
+
onClick: () => setMode("month"),
|
|
268
|
+
children: "Month"
|
|
269
|
+
}),
|
|
270
|
+
/* @__PURE__ */ jsx("button", {
|
|
271
|
+
type: "button",
|
|
272
|
+
"aria-pressed": mode === "year",
|
|
273
|
+
onClick: () => setMode("year"),
|
|
274
|
+
children: "Year"
|
|
275
|
+
})
|
|
276
|
+
]
|
|
277
|
+
})
|
|
278
|
+
]
|
|
279
|
+
}),
|
|
280
|
+
/* @__PURE__ */ jsx("button", {
|
|
281
|
+
type: "button",
|
|
282
|
+
className: calendarNavClass,
|
|
283
|
+
"aria-label": "Next panel",
|
|
284
|
+
onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, 1) : addMonths(panelDate, 1), mode),
|
|
285
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
286
|
+
"aria-hidden": "true",
|
|
287
|
+
focusable: "false",
|
|
288
|
+
width: "16",
|
|
289
|
+
height: "16",
|
|
290
|
+
viewBox: "0 0 24 24",
|
|
291
|
+
fill: "none",
|
|
292
|
+
stroke: "currentColor",
|
|
293
|
+
strokeWidth: "2",
|
|
294
|
+
strokeLinecap: "round",
|
|
295
|
+
strokeLinejoin: "round",
|
|
296
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
297
|
+
d: "m9 18 6-6-6-6"
|
|
298
|
+
})
|
|
299
|
+
})
|
|
300
|
+
})
|
|
301
|
+
]
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
var Calendar = forwardRef(({
|
|
305
|
+
className,
|
|
306
|
+
value,
|
|
307
|
+
defaultValue,
|
|
308
|
+
mode,
|
|
309
|
+
defaultMode = "month",
|
|
310
|
+
fullscreen = true,
|
|
311
|
+
validRange,
|
|
312
|
+
disabledDate,
|
|
313
|
+
dateCellRender,
|
|
314
|
+
dateFullCellRender,
|
|
315
|
+
monthCellRender,
|
|
316
|
+
monthFullCellRender,
|
|
317
|
+
cellRender,
|
|
318
|
+
fullCellRender,
|
|
319
|
+
headerRender,
|
|
320
|
+
onChange,
|
|
321
|
+
onSelect,
|
|
322
|
+
onPanelChange,
|
|
323
|
+
...props
|
|
324
|
+
}, ref) => {
|
|
325
|
+
const selectedDate = parseDate(value ?? defaultValue);
|
|
326
|
+
const [innerValue, setInnerValue] = useState2(() => formatDate(selectedDate));
|
|
327
|
+
const [panelDate, setInnerPanelDate] = useState2(selectedDate);
|
|
328
|
+
const [innerMode, setInnerMode] = useState2(mode ?? defaultMode);
|
|
329
|
+
const currentMode = mode ?? innerMode;
|
|
330
|
+
const currentValue = value === undefined ? innerValue : formatDate(parseDate(value));
|
|
331
|
+
const today = useMemo(() => formatDate(new Date), []);
|
|
332
|
+
const dateGrid = useMemo(() => buildDateGrid(panelDate), [panelDate]);
|
|
333
|
+
function emitPanelChange(nextDate, nextMode = currentMode) {
|
|
334
|
+
setInnerPanelDate(nextDate);
|
|
335
|
+
onPanelChange?.(formatDate(nextDate), nextMode);
|
|
336
|
+
}
|
|
337
|
+
function setCalendarMode(nextMode) {
|
|
338
|
+
if (mode === undefined) {
|
|
339
|
+
setInnerMode(nextMode);
|
|
340
|
+
}
|
|
341
|
+
onPanelChange?.(formatDate(panelDate), nextMode);
|
|
342
|
+
}
|
|
343
|
+
function commitValue(nextDate, source) {
|
|
344
|
+
const nextValue = source === "month" ? formatMonth(nextDate) : formatDate(nextDate);
|
|
345
|
+
if (disabledDate?.(nextValue) || isOutsideRange(nextDate, validRange)) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
if (value === undefined) {
|
|
349
|
+
setInnerValue(nextValue);
|
|
350
|
+
}
|
|
351
|
+
setInnerPanelDate(nextDate);
|
|
352
|
+
onSelect?.(nextValue, { source });
|
|
353
|
+
onChange?.(nextValue);
|
|
354
|
+
}
|
|
355
|
+
function renderDateCell(date) {
|
|
356
|
+
const dateValue = formatDate(date);
|
|
357
|
+
const originNode = /* @__PURE__ */ jsxs("div", {
|
|
358
|
+
className: calendarCellContentClass,
|
|
359
|
+
children: [
|
|
360
|
+
/* @__PURE__ */ jsx("span", {
|
|
361
|
+
children: date.getDate()
|
|
362
|
+
}),
|
|
363
|
+
dateCellRender?.(dateValue)
|
|
364
|
+
]
|
|
365
|
+
});
|
|
366
|
+
const info = {
|
|
367
|
+
originNode,
|
|
368
|
+
today,
|
|
369
|
+
type: "month"
|
|
370
|
+
};
|
|
371
|
+
const content = fullCellRender?.(dateValue, info) ?? dateFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
|
|
372
|
+
const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
|
|
373
|
+
return /* @__PURE__ */ jsx("button", {
|
|
374
|
+
type: "button",
|
|
375
|
+
"aria-label": dateValue,
|
|
376
|
+
disabled,
|
|
377
|
+
className: getCalendarCellClasses({
|
|
378
|
+
selected: dateValue === currentValue,
|
|
379
|
+
today: dateValue === today,
|
|
380
|
+
outside: !isSameMonth(date, panelDate),
|
|
381
|
+
disabled
|
|
382
|
+
}),
|
|
383
|
+
onClick: () => commitValue(date, "date"),
|
|
384
|
+
children: content
|
|
385
|
+
}, dateValue);
|
|
386
|
+
}
|
|
387
|
+
function renderMonthCell(month) {
|
|
388
|
+
const date = new Date(panelDate.getFullYear(), month, 1);
|
|
389
|
+
const dateValue = formatMonth(date);
|
|
390
|
+
const originNode = /* @__PURE__ */ jsxs("div", {
|
|
391
|
+
className: calendarCellContentClass,
|
|
392
|
+
children: [
|
|
393
|
+
/* @__PURE__ */ jsx("span", {
|
|
394
|
+
children: MONTHS[month]
|
|
395
|
+
}),
|
|
396
|
+
monthCellRender?.(dateValue)
|
|
397
|
+
]
|
|
398
|
+
});
|
|
399
|
+
const info = {
|
|
400
|
+
originNode,
|
|
401
|
+
today,
|
|
402
|
+
type: "year"
|
|
403
|
+
};
|
|
404
|
+
const content = fullCellRender?.(dateValue, info) ?? monthFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
|
|
405
|
+
const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
|
|
406
|
+
return /* @__PURE__ */ jsx("button", {
|
|
407
|
+
type: "button",
|
|
408
|
+
"aria-label": dateValue,
|
|
409
|
+
disabled,
|
|
410
|
+
className: getCalendarCellClasses({
|
|
411
|
+
selected: dateValue === formatMonth(parseDate(currentValue)),
|
|
412
|
+
today: dateValue === formatMonth(new Date),
|
|
413
|
+
disabled
|
|
414
|
+
}),
|
|
415
|
+
onClick: () => commitValue(date, "month"),
|
|
416
|
+
children: content
|
|
417
|
+
}, dateValue);
|
|
418
|
+
}
|
|
419
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
420
|
+
...props,
|
|
421
|
+
ref,
|
|
422
|
+
className: getCalendarClasses({
|
|
423
|
+
fullscreen,
|
|
424
|
+
mode: currentMode,
|
|
425
|
+
className
|
|
426
|
+
}),
|
|
427
|
+
children: [
|
|
428
|
+
headerRender ? headerRender({
|
|
429
|
+
value: formatDate(panelDate),
|
|
430
|
+
type: currentMode,
|
|
431
|
+
onChange: (nextValue) => emitPanelChange(parseDate(nextValue)),
|
|
432
|
+
onTypeChange: setCalendarMode
|
|
433
|
+
}) : /* @__PURE__ */ jsx(Header, {
|
|
434
|
+
panelDate,
|
|
435
|
+
mode: currentMode,
|
|
436
|
+
setPanelDate: emitPanelChange,
|
|
437
|
+
setMode: setCalendarMode
|
|
438
|
+
}),
|
|
439
|
+
/* @__PURE__ */ jsx("div", {
|
|
440
|
+
className: calendarBodyClass,
|
|
441
|
+
children: currentMode === "month" ? /* @__PURE__ */ jsxs(Fragment, {
|
|
442
|
+
children: [
|
|
443
|
+
/* @__PURE__ */ jsx("div", {
|
|
444
|
+
className: calendarWeekdaysClass,
|
|
445
|
+
"aria-hidden": "true",
|
|
446
|
+
children: WEEKDAYS.map((weekday) => /* @__PURE__ */ jsx("span", {
|
|
447
|
+
className: calendarWeekdayClass,
|
|
448
|
+
children: weekday
|
|
449
|
+
}, weekday))
|
|
450
|
+
}),
|
|
451
|
+
/* @__PURE__ */ jsx("div", {
|
|
452
|
+
className: calendarDateGridClass,
|
|
453
|
+
children: dateGrid.map(renderDateCell)
|
|
454
|
+
})
|
|
455
|
+
]
|
|
456
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
457
|
+
className: calendarMonthGridClass,
|
|
458
|
+
children: MONTHS.map((_, month) => renderMonthCell(month))
|
|
459
|
+
})
|
|
460
|
+
})
|
|
461
|
+
]
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
Calendar.displayName = "Calendar";
|
|
465
|
+
// src/components/date-picker/usePickerDropdown.ts
|
|
466
|
+
import { useEffect, useId, useImperativeHandle, useRef, useState as useState3 } from "react";
|
|
467
|
+
function usePickerDropdown({
|
|
468
|
+
open,
|
|
469
|
+
defaultOpen,
|
|
470
|
+
disabled,
|
|
471
|
+
onOpenChange,
|
|
472
|
+
ref
|
|
473
|
+
}) {
|
|
474
|
+
const rootRef = useRef(null);
|
|
475
|
+
const inputRef = useRef(null);
|
|
476
|
+
const skipFocus = useRef(false);
|
|
477
|
+
const panelId = useId();
|
|
478
|
+
const [innerOpen, setInnerOpen] = useState3(Boolean(defaultOpen));
|
|
479
|
+
const visible = !disabled && (open ?? innerOpen);
|
|
480
|
+
useImperativeHandle(ref, () => rootRef.current, []);
|
|
481
|
+
function setVisible(next) {
|
|
482
|
+
if (disabled || next === visible)
|
|
483
|
+
return;
|
|
484
|
+
if (open === undefined)
|
|
485
|
+
setInnerOpen(next);
|
|
486
|
+
onOpenChange?.(next);
|
|
487
|
+
}
|
|
488
|
+
function closeAndFocus() {
|
|
489
|
+
skipFocus.current = true;
|
|
490
|
+
inputRef.current?.focus();
|
|
491
|
+
skipFocus.current = false;
|
|
492
|
+
setVisible(false);
|
|
493
|
+
}
|
|
494
|
+
useEffect(() => {
|
|
495
|
+
function handleOutside(event) {
|
|
496
|
+
if (visible && !rootRef.current?.contains(event.target))
|
|
497
|
+
setVisible(false);
|
|
498
|
+
}
|
|
499
|
+
function handleKeyDown(event) {
|
|
500
|
+
if (event.defaultPrevented || !rootRef.current?.contains(event.target))
|
|
501
|
+
return;
|
|
502
|
+
if (event.key === "Escape" && visible) {
|
|
503
|
+
event.preventDefault();
|
|
504
|
+
closeAndFocus();
|
|
505
|
+
} else if (event.key === "ArrowDown" && event.target === inputRef.current) {
|
|
506
|
+
event.preventDefault();
|
|
507
|
+
setVisible(true);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
document.addEventListener("pointerdown", handleOutside);
|
|
511
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
512
|
+
return () => {
|
|
513
|
+
document.removeEventListener("pointerdown", handleOutside);
|
|
514
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
return {
|
|
518
|
+
rootRef,
|
|
519
|
+
inputRef,
|
|
520
|
+
panelId,
|
|
521
|
+
visible,
|
|
522
|
+
setVisible,
|
|
523
|
+
closeAndFocus,
|
|
524
|
+
onInputFocus: () => {
|
|
525
|
+
if (!skipFocus.current)
|
|
526
|
+
setVisible(true);
|
|
527
|
+
},
|
|
528
|
+
onRootBlur: (event) => {
|
|
529
|
+
if (!event.currentTarget.contains(event.relatedTarget))
|
|
530
|
+
setVisible(false);
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
|
|
118
535
|
// src/classes/date-picker.ts
|
|
119
536
|
var datePickerBaseClass = "datepicker";
|
|
120
537
|
var datePickerInputClass = "datepicker-input";
|
|
@@ -162,7 +579,7 @@ function getDatePickerDropdownClasses({
|
|
|
162
579
|
}
|
|
163
580
|
|
|
164
581
|
// src/components/date-picker/DatePicker.tsx
|
|
165
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
582
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
166
583
|
function todayValue(picker) {
|
|
167
584
|
const today = new Date;
|
|
168
585
|
const year = today.getFullYear();
|
|
@@ -201,9 +618,10 @@ function placeholderForPicker(picker) {
|
|
|
201
618
|
function normalizeDateValue(value) {
|
|
202
619
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
203
620
|
}
|
|
204
|
-
var DatePickerRoot =
|
|
621
|
+
var DatePickerRoot = forwardRef2(({
|
|
205
622
|
allowClear,
|
|
206
623
|
className,
|
|
624
|
+
inputProps,
|
|
207
625
|
defaultOpen,
|
|
208
626
|
defaultValue,
|
|
209
627
|
disabled,
|
|
@@ -222,19 +640,19 @@ var DatePickerRoot = forwardRef(({
|
|
|
222
640
|
value,
|
|
223
641
|
...props
|
|
224
642
|
}, ref) => {
|
|
643
|
+
const [calendarMode, setCalendarMode] = useState4("month");
|
|
225
644
|
const isValueControlled = value !== undefined;
|
|
226
|
-
const
|
|
227
|
-
const
|
|
228
|
-
|
|
645
|
+
const [innerValue, setInnerValue] = useState4(() => normalizeDateValue(defaultValue));
|
|
646
|
+
const dropdown = usePickerDropdown({
|
|
647
|
+
open,
|
|
648
|
+
defaultOpen,
|
|
649
|
+
disabled,
|
|
650
|
+
onOpenChange,
|
|
651
|
+
ref
|
|
652
|
+
});
|
|
229
653
|
const currentValue = isValueControlled ? normalizeDateValue(value) : innerValue;
|
|
230
|
-
const visible
|
|
654
|
+
const { visible, setVisible } = dropdown;
|
|
231
655
|
const inputType = inputTypeForPicker(picker);
|
|
232
|
-
function setVisible(nextOpen) {
|
|
233
|
-
if (!isOpenControlled) {
|
|
234
|
-
setInnerOpen(nextOpen);
|
|
235
|
-
}
|
|
236
|
-
onOpenChange?.(nextOpen);
|
|
237
|
-
}
|
|
238
656
|
function emitChange(nextValue) {
|
|
239
657
|
if (nextValue && disabledDate?.(nextValue)) {
|
|
240
658
|
return;
|
|
@@ -244,10 +662,17 @@ var DatePickerRoot = forwardRef(({
|
|
|
244
662
|
}
|
|
245
663
|
onChange?.(nextValue, nextValue ?? "");
|
|
246
664
|
}
|
|
247
|
-
|
|
248
|
-
|
|
665
|
+
function selectValue(nextValue) {
|
|
666
|
+
if (disabledDate?.(nextValue))
|
|
667
|
+
return;
|
|
668
|
+
emitChange(nextValue);
|
|
669
|
+
dropdown.closeAndFocus();
|
|
670
|
+
}
|
|
671
|
+
const presetItems = useMemo2(() => presets ?? [], [presets]);
|
|
672
|
+
return /* @__PURE__ */ jsxs2("div", {
|
|
249
673
|
...props,
|
|
250
|
-
ref,
|
|
674
|
+
ref: dropdown.rootRef,
|
|
675
|
+
onBlur: dropdown.onRootBlur,
|
|
251
676
|
className: getDatePickerClasses({
|
|
252
677
|
size,
|
|
253
678
|
status,
|
|
@@ -257,7 +682,11 @@ var DatePickerRoot = forwardRef(({
|
|
|
257
682
|
className
|
|
258
683
|
}),
|
|
259
684
|
children: [
|
|
260
|
-
/* @__PURE__ */
|
|
685
|
+
/* @__PURE__ */ jsx2("input", {
|
|
686
|
+
...inputProps,
|
|
687
|
+
ref: dropdown.inputRef,
|
|
688
|
+
"aria-haspopup": "dialog",
|
|
689
|
+
"aria-controls": visible ? dropdown.panelId : undefined,
|
|
261
690
|
className: datePickerInputClass,
|
|
262
691
|
disabled,
|
|
263
692
|
type: inputType,
|
|
@@ -265,15 +694,15 @@ var DatePickerRoot = forwardRef(({
|
|
|
265
694
|
placeholder: placeholder ?? placeholderForPicker(picker),
|
|
266
695
|
onFocus: (event) => {
|
|
267
696
|
onFocus?.(event);
|
|
268
|
-
|
|
697
|
+
dropdown.onInputFocus();
|
|
269
698
|
},
|
|
270
699
|
onBlur: (event) => {
|
|
271
700
|
onBlur?.(event);
|
|
272
|
-
setVisible(false);
|
|
273
701
|
},
|
|
702
|
+
onClick: () => setVisible(true),
|
|
274
703
|
onChange: (event) => emitChange(event.currentTarget.value || undefined)
|
|
275
704
|
}),
|
|
276
|
-
allowClear && currentValue && !disabled ? /* @__PURE__ */
|
|
705
|
+
allowClear && currentValue && !disabled ? /* @__PURE__ */ jsx2("button", {
|
|
277
706
|
type: "button",
|
|
278
707
|
className: datePickerClearClass,
|
|
279
708
|
"aria-label": "Clear date",
|
|
@@ -281,26 +710,95 @@ var DatePickerRoot = forwardRef(({
|
|
|
281
710
|
onClick: () => emitChange(undefined),
|
|
282
711
|
children: "x"
|
|
283
712
|
}) : null,
|
|
284
|
-
/* @__PURE__ */
|
|
713
|
+
/* @__PURE__ */ jsx2("button", {
|
|
714
|
+
type: "button",
|
|
285
715
|
className: datePickerIconClass,
|
|
286
|
-
"aria-
|
|
716
|
+
"aria-label": "Open date picker",
|
|
717
|
+
"aria-haspopup": "dialog",
|
|
718
|
+
"aria-expanded": visible,
|
|
719
|
+
"aria-controls": visible ? dropdown.panelId : undefined,
|
|
720
|
+
disabled,
|
|
721
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
722
|
+
onClick: () => setVisible(!visible),
|
|
723
|
+
children: /* @__PURE__ */ jsxs2("svg", {
|
|
724
|
+
"aria-hidden": "true",
|
|
725
|
+
focusable: "false",
|
|
726
|
+
width: "18",
|
|
727
|
+
height: "18",
|
|
728
|
+
viewBox: "0 0 24 24",
|
|
729
|
+
fill: "none",
|
|
730
|
+
stroke: "currentColor",
|
|
731
|
+
strokeWidth: "1.75",
|
|
732
|
+
strokeLinecap: "round",
|
|
733
|
+
strokeLinejoin: "round",
|
|
734
|
+
children: [
|
|
735
|
+
/* @__PURE__ */ jsx2("rect", {
|
|
736
|
+
x: "3",
|
|
737
|
+
y: "5",
|
|
738
|
+
width: "18",
|
|
739
|
+
height: "16",
|
|
740
|
+
rx: "2"
|
|
741
|
+
}),
|
|
742
|
+
/* @__PURE__ */ jsx2("path", {
|
|
743
|
+
d: "M8 3v4M16 3v4M3 10h18"
|
|
744
|
+
})
|
|
745
|
+
]
|
|
746
|
+
})
|
|
287
747
|
}),
|
|
288
|
-
|
|
748
|
+
visible ? /* @__PURE__ */ jsxs2("div", {
|
|
749
|
+
id: dropdown.panelId,
|
|
750
|
+
role: "dialog",
|
|
751
|
+
"aria-label": "Choose date",
|
|
289
752
|
className: getDatePickerDropdownClasses({ open: visible }),
|
|
290
753
|
children: [
|
|
291
|
-
|
|
754
|
+
picker === "date" || picker === "month" ? /* @__PURE__ */ jsx2(Calendar, {
|
|
755
|
+
fullscreen: false,
|
|
756
|
+
value: currentValue,
|
|
757
|
+
mode: picker === "month" ? "year" : calendarMode,
|
|
758
|
+
onPanelChange: (_, mode) => {
|
|
759
|
+
if (picker === "date")
|
|
760
|
+
setCalendarMode(mode);
|
|
761
|
+
},
|
|
762
|
+
disabledDate: (date) => {
|
|
763
|
+
if (!disabledDate)
|
|
764
|
+
return false;
|
|
765
|
+
if (picker === "month")
|
|
766
|
+
return disabledDate(date.slice(0, 7));
|
|
767
|
+
if (calendarMode === "year") {
|
|
768
|
+
const [year, month] = date.split("-").map(Number);
|
|
769
|
+
const days = new Date(year, month, 0).getDate();
|
|
770
|
+
return Array.from({ length: days }, (_, index) => `${date.slice(0, 7)}-${String(index + 1).padStart(2, "0")}`).every((day) => disabledDate(day));
|
|
771
|
+
}
|
|
772
|
+
return disabledDate(date);
|
|
773
|
+
},
|
|
774
|
+
onSelect: (date, info) => {
|
|
775
|
+
if (picker === "date" && info.source === "month") {
|
|
776
|
+
setCalendarMode("month");
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
selectValue(picker === "month" ? date.slice(0, 7) : date);
|
|
780
|
+
}
|
|
781
|
+
}) : /* @__PURE__ */ jsx2("input", {
|
|
782
|
+
type: inputType,
|
|
783
|
+
"aria-label": placeholderForPicker(picker),
|
|
784
|
+
value: currentValue ?? "",
|
|
785
|
+
onChange: (event) => selectValue(event.currentTarget.value)
|
|
786
|
+
}),
|
|
787
|
+
presetItems.map((preset, index) => /* @__PURE__ */ jsx2("button", {
|
|
292
788
|
type: "button",
|
|
293
789
|
className: datePickerPresetClass,
|
|
294
790
|
onMouseDown: (event) => event.preventDefault(),
|
|
295
|
-
|
|
791
|
+
disabled: Boolean(disabledDate?.(preset.value)),
|
|
792
|
+
onClick: () => selectValue(preset.value),
|
|
296
793
|
children: preset.label
|
|
297
794
|
}, index)),
|
|
298
|
-
showNow ? /* @__PURE__ */
|
|
795
|
+
showNow ? /* @__PURE__ */ jsx2("div", {
|
|
299
796
|
className: datePickerFooterClass,
|
|
300
|
-
children: /* @__PURE__ */
|
|
797
|
+
children: /* @__PURE__ */ jsx2("button", {
|
|
301
798
|
type: "button",
|
|
302
799
|
onMouseDown: (event) => event.preventDefault(),
|
|
303
|
-
|
|
800
|
+
disabled: Boolean(disabledDate?.(todayValue(picker))),
|
|
801
|
+
onClick: () => selectValue(todayValue(picker)),
|
|
304
802
|
children: "Now"
|
|
305
803
|
})
|
|
306
804
|
}) : null
|
|
@@ -310,9 +808,10 @@ var DatePickerRoot = forwardRef(({
|
|
|
310
808
|
});
|
|
311
809
|
});
|
|
312
810
|
DatePickerRoot.displayName = "DatePicker";
|
|
313
|
-
var RangePicker =
|
|
811
|
+
var RangePicker = forwardRef2(({
|
|
314
812
|
allowClear,
|
|
315
813
|
className,
|
|
814
|
+
inputProps,
|
|
316
815
|
defaultValue,
|
|
317
816
|
disabled,
|
|
318
817
|
disabledDate,
|
|
@@ -326,7 +825,7 @@ var RangePicker = forwardRef(({
|
|
|
326
825
|
...props
|
|
327
826
|
}, ref) => {
|
|
328
827
|
const isControlled = value !== undefined;
|
|
329
|
-
const [innerValue, setInnerValue] =
|
|
828
|
+
const [innerValue, setInnerValue] = useState4(defaultValue ?? [undefined, undefined]);
|
|
330
829
|
const currentValue = isControlled ? value : innerValue;
|
|
331
830
|
const inputType = inputTypeForPicker(picker);
|
|
332
831
|
function emitChange(nextValue) {
|
|
@@ -341,7 +840,7 @@ var RangePicker = forwardRef(({
|
|
|
341
840
|
function updateIndex(index, nextItem) {
|
|
342
841
|
emitChange(index === 0 ? [nextItem, currentValue?.[1]] : [currentValue?.[0], nextItem]);
|
|
343
842
|
}
|
|
344
|
-
return /* @__PURE__ */
|
|
843
|
+
return /* @__PURE__ */ jsxs2("div", {
|
|
345
844
|
...props,
|
|
346
845
|
ref,
|
|
347
846
|
className: getDatePickerClasses({
|
|
@@ -353,7 +852,8 @@ var RangePicker = forwardRef(({
|
|
|
353
852
|
className
|
|
354
853
|
}),
|
|
355
854
|
children: [
|
|
356
|
-
/* @__PURE__ */
|
|
855
|
+
/* @__PURE__ */ jsx2("input", {
|
|
856
|
+
...inputProps,
|
|
357
857
|
className: datePickerInputClass,
|
|
358
858
|
disabled,
|
|
359
859
|
type: inputType,
|
|
@@ -361,11 +861,13 @@ var RangePicker = forwardRef(({
|
|
|
361
861
|
placeholder: Array.isArray(placeholder) ? placeholder[0] : "Start date",
|
|
362
862
|
onChange: (event) => updateIndex(0, event.currentTarget.value || undefined)
|
|
363
863
|
}),
|
|
364
|
-
/* @__PURE__ */
|
|
864
|
+
/* @__PURE__ */ jsx2("span", {
|
|
365
865
|
className: datePickerSeparatorClass,
|
|
366
866
|
children: separator
|
|
367
867
|
}),
|
|
368
|
-
/* @__PURE__ */
|
|
868
|
+
/* @__PURE__ */ jsx2("input", {
|
|
869
|
+
...inputProps,
|
|
870
|
+
id: inputProps?.id ? `${inputProps.id}-end` : undefined,
|
|
369
871
|
className: datePickerInputClass,
|
|
370
872
|
disabled,
|
|
371
873
|
type: inputType,
|
|
@@ -373,7 +875,7 @@ var RangePicker = forwardRef(({
|
|
|
373
875
|
placeholder: Array.isArray(placeholder) ? placeholder[1] : "End date",
|
|
374
876
|
onChange: (event) => updateIndex(1, event.currentTarget.value || undefined)
|
|
375
877
|
}),
|
|
376
|
-
allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */
|
|
878
|
+
allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */ jsx2("button", {
|
|
377
879
|
type: "button",
|
|
378
880
|
className: datePickerClearClass,
|
|
379
881
|
"aria-label": "Clear date range",
|
|
@@ -385,7 +887,7 @@ var RangePicker = forwardRef(({
|
|
|
385
887
|
});
|
|
386
888
|
RangePicker.displayName = "DatePicker.RangePicker";
|
|
387
889
|
function withPicker(picker, displayName) {
|
|
388
|
-
const Picker =
|
|
890
|
+
const Picker = forwardRef2((props, ref) => /* @__PURE__ */ jsx2(DatePickerRoot, {
|
|
389
891
|
...props,
|
|
390
892
|
ref,
|
|
391
893
|
picker
|
|
@@ -401,7 +903,7 @@ var DatePicker = Object.assign(DatePickerRoot, {
|
|
|
401
903
|
YearPicker: withPicker("year", "DatePicker.YearPicker")
|
|
402
904
|
});
|
|
403
905
|
// src/components/dm-date-picker/DmDatePicker.tsx
|
|
404
|
-
import { jsx as
|
|
906
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
405
907
|
function getDefaultPlaceholder(picker) {
|
|
406
908
|
const locale = getDmDatePickerLocale();
|
|
407
909
|
if (locale === "zh") {
|
|
@@ -417,7 +919,7 @@ function getDefaultPlaceholder(picker) {
|
|
|
417
919
|
}
|
|
418
920
|
return;
|
|
419
921
|
}
|
|
420
|
-
var DmDatePickerRoot =
|
|
922
|
+
var DmDatePickerRoot = forwardRef3(({ className, placeholder, picker, ...props }, ref) => /* @__PURE__ */ jsx3(DatePicker, {
|
|
421
923
|
...props,
|
|
422
924
|
ref,
|
|
423
925
|
picker,
|
|
@@ -425,7 +927,7 @@ var DmDatePickerRoot = forwardRef2(({ className, placeholder, picker, ...props }
|
|
|
425
927
|
className: getDmDatePickerClasses({ className })
|
|
426
928
|
}));
|
|
427
929
|
DmDatePickerRoot.displayName = "DmDatePicker";
|
|
428
|
-
var DmRangePicker =
|
|
930
|
+
var DmRangePicker = forwardRef3(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(DatePicker.RangePicker, {
|
|
429
931
|
...props,
|
|
430
932
|
ref,
|
|
431
933
|
className: getDmDatePickerClasses({ className })
|
|
@@ -433,22 +935,22 @@ var DmRangePicker = forwardRef2(({ className, ...props }, ref) => /* @__PURE__ *
|
|
|
433
935
|
DmRangePicker.displayName = "DmDatePicker.RangePicker";
|
|
434
936
|
var DmDatePicker = DmDatePickerRoot;
|
|
435
937
|
DmDatePicker.RangePicker = DmRangePicker;
|
|
436
|
-
DmDatePicker.WeekPicker =
|
|
938
|
+
DmDatePicker.WeekPicker = forwardRef3((props, ref) => /* @__PURE__ */ jsx3(DmDatePicker, {
|
|
437
939
|
...props,
|
|
438
940
|
ref,
|
|
439
941
|
picker: "week"
|
|
440
942
|
}));
|
|
441
|
-
DmDatePicker.MonthPicker =
|
|
943
|
+
DmDatePicker.MonthPicker = forwardRef3((props, ref) => /* @__PURE__ */ jsx3(DmDatePicker, {
|
|
442
944
|
...props,
|
|
443
945
|
ref,
|
|
444
946
|
picker: "month"
|
|
445
947
|
}));
|
|
446
|
-
DmDatePicker.QuarterPicker =
|
|
948
|
+
DmDatePicker.QuarterPicker = forwardRef3((props, ref) => /* @__PURE__ */ jsx3(DmDatePicker, {
|
|
447
949
|
...props,
|
|
448
950
|
ref,
|
|
449
951
|
picker: "quarter"
|
|
450
952
|
}));
|
|
451
|
-
DmDatePicker.YearPicker =
|
|
953
|
+
DmDatePicker.YearPicker = forwardRef3((props, ref) => /* @__PURE__ */ jsx3(DmDatePicker, {
|
|
452
954
|
...props,
|
|
453
955
|
ref,
|
|
454
956
|
picker: "year"
|