@duskmoon-dev/components 0.3.1 → 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.
Files changed (109) hide show
  1. package/README.md +61 -2
  2. package/dist/{chunk-r9wkv7xd.js → chunk-fwjzvsrx.js} +3 -3
  3. package/dist/classes/chat.d.ts +43 -0
  4. package/dist/classes/console-page.d.ts +16 -0
  5. package/dist/classes/dropdown.d.ts +5 -5
  6. package/dist/classes/fab.d.ts +11 -0
  7. package/dist/classes/index.d.ts +6 -0
  8. package/dist/classes/index.js +1443 -1210
  9. package/dist/classes/megamenu.d.ts +10 -0
  10. package/dist/classes/otp-input.d.ts +12 -0
  11. package/dist/classes/popover.d.ts +1 -3
  12. package/dist/classes/swap.d.ts +12 -0
  13. package/dist/classes/tree-select.d.ts +6 -6
  14. package/dist/components/anchor/index.js +2 -2
  15. package/dist/components/app/index.js +211 -151
  16. package/dist/components/avatar/Avatar.types.d.ts +1 -1
  17. package/dist/components/avatar/index.js +2 -1
  18. package/dist/components/badge/index.js +1 -1
  19. package/dist/components/button/Button.d.ts +1 -1
  20. package/dist/components/button/Button.types.d.ts +8 -0
  21. package/dist/components/button/index.js +253 -24
  22. package/dist/components/calendar/index.js +44 -19
  23. package/dist/components/cascader/index.js +2 -2
  24. package/dist/components/chat/Chat.d.ts +22 -0
  25. package/dist/components/chat/Chat.types.d.ts +73 -0
  26. package/dist/components/chat/index.d.ts +2 -0
  27. package/dist/components/chat/index.js +309 -0
  28. package/dist/components/color-picker/ColorPicker.types.d.ts +2 -1
  29. package/dist/components/color-picker/index.js +210 -13
  30. package/dist/components/config-provider/index.js +2 -2
  31. package/dist/components/console-page/ConsolePage.d.ts +2 -0
  32. package/dist/components/console-page/ConsolePage.types.d.ts +29 -0
  33. package/dist/components/console-page/index.d.ts +2 -0
  34. package/dist/components/console-page/index.js +205 -0
  35. package/dist/components/date-picker/DatePicker.types.d.ts +1 -0
  36. package/dist/components/date-picker/index.js +537 -35
  37. package/dist/components/date-picker/usePickerDropdown.d.ts +17 -0
  38. package/dist/components/dm-breadcrumb/index.js +18 -18
  39. package/dist/components/dm-date-picker/index.js +635 -133
  40. package/dist/components/dm-drawer/index.js +269 -40
  41. package/dist/components/dm-layout/index.js +575 -208
  42. package/dist/components/dm-menu/index.js +399 -32
  43. package/dist/components/dm-message/index.js +18 -18
  44. package/dist/components/dm-page-header/index.js +537 -247
  45. package/dist/components/dm-pagination/index.js +39 -39
  46. package/dist/components/dm-pro-table/index.js +2374 -1559
  47. package/dist/components/dm-provider/index.js +94 -94
  48. package/dist/components/dm-query/DmQuery.types.d.ts +1 -1
  49. package/dist/components/dm-query/index.js +955 -210
  50. package/dist/components/dm-search/DmSearch.types.d.ts +4 -0
  51. package/dist/components/dm-search/index.js +937 -183
  52. package/dist/components/dm-splitter/index.js +32 -32
  53. package/dist/components/dm-status/index.js +25 -25
  54. package/dist/components/dm-table/index.js +1430 -676
  55. package/dist/components/dm-tabs/index.js +34 -34
  56. package/dist/components/dm-toolbar/index.js +423 -133
  57. package/dist/components/dm-tree/index.js +92 -92
  58. package/dist/components/dm-truncate/index.js +145 -65
  59. package/dist/components/dropdown/Dropdown.types.d.ts +1 -1
  60. package/dist/components/dropdown/index.js +467 -177
  61. package/dist/components/fab/Fab.d.ts +4 -0
  62. package/dist/components/fab/Fab.types.d.ts +25 -0
  63. package/dist/components/fab/index.d.ts +2 -0
  64. package/dist/components/fab/index.js +480 -0
  65. package/dist/components/form/Form.types.d.ts +1 -0
  66. package/dist/components/form/index.js +16 -5
  67. package/dist/components/grid/index.js +2 -2
  68. package/dist/components/input/index.js +4 -4
  69. package/dist/components/markdown/index.js +1 -1
  70. package/dist/components/megamenu/Megamenu.d.ts +2 -0
  71. package/dist/components/megamenu/Megamenu.types.d.ts +32 -0
  72. package/dist/components/megamenu/index.d.ts +2 -0
  73. package/dist/components/megamenu/index.js +214 -0
  74. package/dist/components/message/index.js +5 -5
  75. package/dist/components/modal/index.js +128 -68
  76. package/dist/components/notification/index.js +2 -2
  77. package/dist/components/otp-input/OtpInput.d.ts +2 -0
  78. package/dist/components/otp-input/OtpInput.types.d.ts +16 -0
  79. package/dist/components/otp-input/index.d.ts +2 -0
  80. package/dist/components/otp-input/index.js +112 -0
  81. package/dist/components/popconfirm/index.js +297 -68
  82. package/dist/components/popover/index.js +24 -4
  83. package/dist/components/skeleton/index.js +5 -5
  84. package/dist/components/spin/index.js +2 -2
  85. package/dist/components/steps/index.js +2 -2
  86. package/dist/components/swap/Swap.d.ts +3 -0
  87. package/dist/components/swap/Swap.types.d.ts +22 -0
  88. package/dist/components/swap/index.d.ts +2 -0
  89. package/dist/components/swap/index.js +109 -0
  90. package/dist/components/table/index.js +2 -2
  91. package/dist/components/tabs/index.js +2 -2
  92. package/dist/components/tag/index.js +2 -2
  93. package/dist/components/time-picker/TimePicker.types.d.ts +1 -0
  94. package/dist/components/time-picker/index.js +167 -29
  95. package/dist/components/tooltip/Tooltip.types.d.ts +4 -0
  96. package/dist/components/tooltip/index.js +107 -27
  97. package/dist/components/tour/index.js +315 -86
  98. package/dist/components/tree-select/index.js +8 -8
  99. package/dist/components/typography/index.js +4 -4
  100. package/dist/components/upload/Upload.types.d.ts +1 -0
  101. package/dist/components/upload/index.js +7 -5
  102. package/dist/generated/version.d.ts +1 -1
  103. package/dist/index.d.ts +6 -0
  104. package/dist/index.js +4023 -2134
  105. package/dist/infrastructure.js +11 -11
  106. package/dist/styles.css +13677 -9811
  107. package/dist/theme/index.js +3 -3
  108. package/dist/utils/index.js +5 -5
  109. package/package.json +30 -6
@@ -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 = forwardRef(({
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 isOpenControlled = open !== undefined;
140
- const [innerValue, setInnerValue] = useState(() => normalizeDateValue(defaultValue));
141
- const [innerOpen, setInnerOpen] = useState(Boolean(defaultOpen));
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 = isOpenControlled ? Boolean(open) : innerOpen;
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
- const presetItems = useMemo(() => presets ?? [], [presets]);
161
- return /* @__PURE__ */ jsxs("div", {
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__ */ jsx("input", {
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
- setVisible(true);
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__ */ jsx("button", {
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__ */ jsx("span", {
626
+ /* @__PURE__ */ jsx2("button", {
627
+ type: "button",
198
628
  className: datePickerIconClass,
199
- "aria-hidden": "true"
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
- (presetItems.length > 0 || showNow) && visible ? /* @__PURE__ */ jsxs("div", {
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
- presetItems.map((preset, index) => /* @__PURE__ */ jsx("button", {
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
- onClick: () => emitChange(preset.value),
704
+ disabled: Boolean(disabledDate?.(preset.value)),
705
+ onClick: () => selectValue(preset.value),
209
706
  children: preset.label
210
707
  }, index)),
211
- showNow ? /* @__PURE__ */ jsx("div", {
708
+ showNow ? /* @__PURE__ */ jsx2("div", {
212
709
  className: datePickerFooterClass,
213
- children: /* @__PURE__ */ jsx("button", {
710
+ children: /* @__PURE__ */ jsx2("button", {
214
711
  type: "button",
215
712
  onMouseDown: (event) => event.preventDefault(),
216
- onClick: () => emitChange(todayValue(picker)),
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 = forwardRef(({
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] = useState(defaultValue ?? [undefined, undefined]);
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__ */ jsxs("div", {
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__ */ jsx("input", {
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__ */ jsx("span", {
777
+ /* @__PURE__ */ jsx2("span", {
278
778
  className: datePickerSeparatorClass,
279
779
  children: separator
280
780
  }),
281
- /* @__PURE__ */ jsx("input", {
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__ */ jsx("button", {
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 = forwardRef((props, ref) => /* @__PURE__ */ jsx(DatePickerRoot, {
803
+ const Picker = forwardRef2((props, ref) => /* @__PURE__ */ jsx2(DatePickerRoot, {
302
804
  ...props,
303
805
  ref,
304
806
  picker