@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.
Files changed (82) hide show
  1. package/README.md +61 -2
  2. package/dist/classes/chat.d.ts +9 -1
  3. package/dist/classes/console-page.d.ts +16 -0
  4. package/dist/classes/dropdown.d.ts +5 -5
  5. package/dist/classes/fab.d.ts +11 -0
  6. package/dist/classes/index.d.ts +5 -0
  7. package/dist/classes/index.js +180 -34
  8. package/dist/classes/megamenu.d.ts +10 -0
  9. package/dist/classes/otp-input.d.ts +12 -0
  10. package/dist/classes/popover.d.ts +1 -3
  11. package/dist/classes/swap.d.ts +12 -0
  12. package/dist/classes/tree-select.d.ts +6 -6
  13. package/dist/components/app/index.js +128 -68
  14. package/dist/components/avatar/Avatar.types.d.ts +1 -1
  15. package/dist/components/avatar/index.js +2 -1
  16. package/dist/components/badge/index.js +1 -1
  17. package/dist/components/button/Button.d.ts +1 -1
  18. package/dist/components/button/Button.types.d.ts +8 -0
  19. package/dist/components/button/index.js +253 -24
  20. package/dist/components/calendar/index.js +44 -19
  21. package/dist/components/chat/Chat.d.ts +9 -1
  22. package/dist/components/chat/Chat.types.d.ts +26 -0
  23. package/dist/components/chat/index.js +92 -3
  24. package/dist/components/color-picker/ColorPicker.types.d.ts +2 -1
  25. package/dist/components/color-picker/index.js +206 -9
  26. package/dist/components/console-page/ConsolePage.d.ts +2 -0
  27. package/dist/components/console-page/ConsolePage.types.d.ts +29 -0
  28. package/dist/components/console-page/index.d.ts +2 -0
  29. package/dist/components/console-page/index.js +205 -0
  30. package/dist/components/date-picker/DatePicker.types.d.ts +1 -0
  31. package/dist/components/date-picker/index.js +537 -35
  32. package/dist/components/date-picker/usePickerDropdown.d.ts +17 -0
  33. package/dist/components/dm-date-picker/index.js +545 -43
  34. package/dist/components/dm-drawer/index.js +253 -24
  35. package/dist/components/dm-layout/index.js +391 -24
  36. package/dist/components/dm-menu/index.js +380 -13
  37. package/dist/components/dm-page-header/index.js +404 -114
  38. package/dist/components/dm-pro-table/index.js +1183 -368
  39. package/dist/components/dm-query/DmQuery.types.d.ts +1 -1
  40. package/dist/components/dm-query/index.js +931 -188
  41. package/dist/components/dm-search/DmSearch.types.d.ts +4 -0
  42. package/dist/components/dm-search/index.js +917 -163
  43. package/dist/components/dm-table/index.js +1001 -247
  44. package/dist/components/dm-toolbar/index.js +400 -110
  45. package/dist/components/dm-truncate/index.js +115 -35
  46. package/dist/components/dropdown/Dropdown.types.d.ts +1 -1
  47. package/dist/components/dropdown/index.js +400 -110
  48. package/dist/components/fab/Fab.d.ts +4 -0
  49. package/dist/components/fab/Fab.types.d.ts +25 -0
  50. package/dist/components/fab/index.d.ts +2 -0
  51. package/dist/components/fab/index.js +480 -0
  52. package/dist/components/form/Form.types.d.ts +1 -0
  53. package/dist/components/form/index.js +14 -3
  54. package/dist/components/megamenu/Megamenu.d.ts +2 -0
  55. package/dist/components/megamenu/Megamenu.types.d.ts +32 -0
  56. package/dist/components/megamenu/index.d.ts +2 -0
  57. package/dist/components/megamenu/index.js +214 -0
  58. package/dist/components/modal/index.js +128 -68
  59. package/dist/components/otp-input/OtpInput.d.ts +2 -0
  60. package/dist/components/otp-input/OtpInput.types.d.ts +16 -0
  61. package/dist/components/otp-input/index.d.ts +2 -0
  62. package/dist/components/otp-input/index.js +112 -0
  63. package/dist/components/popconfirm/index.js +255 -26
  64. package/dist/components/popover/index.js +24 -4
  65. package/dist/components/swap/Swap.d.ts +3 -0
  66. package/dist/components/swap/Swap.types.d.ts +22 -0
  67. package/dist/components/swap/index.d.ts +2 -0
  68. package/dist/components/swap/index.js +109 -0
  69. package/dist/components/time-picker/TimePicker.types.d.ts +1 -0
  70. package/dist/components/time-picker/index.js +167 -29
  71. package/dist/components/tooltip/Tooltip.types.d.ts +4 -0
  72. package/dist/components/tooltip/index.js +107 -27
  73. package/dist/components/tour/index.js +253 -24
  74. package/dist/components/tree-select/index.js +8 -8
  75. package/dist/components/upload/Upload.types.d.ts +1 -0
  76. package/dist/components/upload/index.js +2 -0
  77. package/dist/generated/version.d.ts +1 -1
  78. package/dist/index.d.ts +5 -0
  79. package/dist/index.js +3330 -1632
  80. package/dist/infrastructure.js +1 -1
  81. package/dist/styles.css +1190 -906
  82. package/package.json +23 -3
@@ -2,19 +2,19 @@
2
2
 
3
3
  // src/components/dm-query/DmQuery.tsx
4
4
  import {
5
- forwardRef as forwardRef5,
6
- useImperativeHandle as useImperativeHandle3,
7
- useRef as useRef2,
8
- useState as useState5
5
+ forwardRef as forwardRef6,
6
+ useImperativeHandle as useImperativeHandle4,
7
+ useRef as useRef3,
8
+ useState as useState7
9
9
  } from "react";
10
10
 
11
11
  // src/components/dm-search/DmSearch.tsx
12
12
  import {
13
- forwardRef as forwardRef4,
14
- useEffect,
15
- useImperativeHandle as useImperativeHandle2,
16
- useMemo as useMemo3,
17
- useState as useState4
13
+ forwardRef as forwardRef5,
14
+ useEffect as useEffect2,
15
+ useImperativeHandle as useImperativeHandle3,
16
+ useMemo as useMemo4,
17
+ useState as useState6
18
18
  } from "react";
19
19
 
20
20
  // ../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
@@ -58,6 +58,10 @@ function getDmSearchClasses({
58
58
  return cn(dmSearchBaseClass, compact && dmSearchCompactClass, collapsed && dmSearchCollapsedClass, className);
59
59
  }
60
60
 
61
+ // src/components/button/Button.tsx
62
+ import React from "react";
63
+ import { createPortal } from "react-dom";
64
+
61
65
  // src/classes/button.ts
62
66
  var buttonBaseClass = "btn";
63
67
  var buttonColorClasses = {
@@ -81,7 +85,7 @@ var buttonAppearanceClasses = {
81
85
  };
82
86
  var buttonShapeClasses = {
83
87
  rect: "",
84
- circle: "btn-circle",
88
+ circle: "btn-circle btn-icon",
85
89
  square: "btn-square"
86
90
  };
87
91
  var buttonSizeClasses = {
@@ -101,11 +105,14 @@ function getButtonClasses({
101
105
  isLoading,
102
106
  className
103
107
  }) {
104
- return cn(buttonBaseClass, buttonColorClasses[color], buttonAppearanceClasses[appearance], buttonShapeClasses[shape], buttonSizeClasses[size], block && buttonBlockClass, isLoading && buttonIsLoadingClass, className);
108
+ return cn(buttonBaseClass, buttonColorClasses[color], buttonAppearanceClasses[appearance], buttonShapeClasses[shape], buttonSizeClasses[size], shape === "circle" && size === "xs" && "btn-icon-sm", shape === "circle" && size === "sm" && "btn-icon-sm", shape === "circle" && size === "lg" && "btn-icon-lg", block && buttonBlockClass, isLoading && buttonIsLoadingClass, className);
105
109
  }
106
110
 
107
111
  // src/components/button/Button.tsx
108
- import { jsx, jsxs } from "react/jsx-runtime";
112
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
113
+ function isPromiseLike(value) {
114
+ return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
115
+ }
109
116
  function Button({
110
117
  color = "primary",
111
118
  appearance = "filled",
@@ -119,8 +126,155 @@ function Button({
119
126
  children,
120
127
  disabled,
121
128
  ref,
129
+ confirm,
130
+ onClick,
122
131
  ...props
123
132
  }) {
133
+ const buttonRef = React.useRef(null);
134
+ const popoverRef = React.useRef(null);
135
+ const cancelRef = React.useRef(null);
136
+ const approvalRef = React.useRef("idle");
137
+ const pendingRef = React.useRef(false);
138
+ const actionRef = React.useRef(0);
139
+ const operationRef = React.useRef(0);
140
+ const mountedRef = React.useRef(false);
141
+ const [portalTarget, setPortalTarget] = React.useState(null);
142
+ const [confirmLoading, setConfirmLoading] = React.useState(false);
143
+ const [confirmError, setConfirmError] = React.useState(false);
144
+ const generatedId = React.useId().replace(/:/g, "");
145
+ const popoverId = `button-confirm-${generatedId}`;
146
+ const titleId = `${popoverId}-title`;
147
+ const descriptionId = `${popoverId}-description`;
148
+ const anchor = `--${popoverId}-anchor`;
149
+ const hasConfirm = Boolean(confirm);
150
+ const confirmation = confirm && typeof confirm === "object" ? confirm : undefined;
151
+ const title = confirmation ? confirmation.title : "Confirm action";
152
+ const hasTitle = title !== undefined && title !== null && title !== false && title !== "";
153
+ const content = confirmation?.component ?? confirmation?.message ?? confirmation?.description;
154
+ const hasContent = content !== undefined && content !== null && content !== false && content !== "";
155
+ const mergedRef = React.useCallback((node) => {
156
+ buttonRef.current = node;
157
+ if (!node) {
158
+ if (typeof ref === "function")
159
+ ref(null);
160
+ else if (ref)
161
+ ref.current = null;
162
+ return;
163
+ }
164
+ const cleanup = typeof ref === "function" ? ref(node) : undefined;
165
+ if (ref && typeof ref !== "function")
166
+ ref.current = node;
167
+ return () => {
168
+ buttonRef.current = null;
169
+ if (typeof cleanup === "function")
170
+ cleanup();
171
+ else if (typeof ref === "function")
172
+ ref(null);
173
+ else if (ref)
174
+ ref.current = null;
175
+ };
176
+ }, [ref]);
177
+ React.useEffect(() => {
178
+ mountedRef.current = true;
179
+ return () => {
180
+ mountedRef.current = false;
181
+ operationRef.current += 1;
182
+ };
183
+ }, []);
184
+ React.useEffect(() => {
185
+ operationRef.current += 1;
186
+ approvalRef.current = "idle";
187
+ setConfirmError(false);
188
+ setPortalTarget(hasConfirm ? document.body : null);
189
+ }, [hasConfirm]);
190
+ function closePopover() {
191
+ if (popoverRef.current?.matches(":popover-open")) {
192
+ popoverRef.current.hidePopover();
193
+ }
194
+ buttonRef.current?.focus();
195
+ }
196
+ function handleClick(event) {
197
+ if (!confirm) {
198
+ onClick?.(event);
199
+ return;
200
+ }
201
+ if (approvalRef.current === "native") {
202
+ approvalRef.current = "idle";
203
+ return;
204
+ }
205
+ if (approvalRef.current === "action") {
206
+ approvalRef.current = "idle";
207
+ let result;
208
+ try {
209
+ result = onClick?.(event);
210
+ } catch {
211
+ event.preventDefault();
212
+ pendingRef.current = false;
213
+ setConfirmError(true);
214
+ return;
215
+ }
216
+ if (!isPromiseLike(result)) {
217
+ pendingRef.current = false;
218
+ closePopover();
219
+ return;
220
+ }
221
+ const userPreventedDefault = event.defaultPrevented;
222
+ event.preventDefault();
223
+ setConfirmLoading(true);
224
+ const action = actionRef.current;
225
+ const operation = operationRef.current;
226
+ Promise.resolve(result).then(() => {
227
+ if (!mountedRef.current || action !== actionRef.current)
228
+ return;
229
+ pendingRef.current = false;
230
+ setConfirmLoading(false);
231
+ if (operation !== operationRef.current)
232
+ return;
233
+ closePopover();
234
+ if (!userPreventedDefault && !buttonRef.current?.disabled) {
235
+ approvalRef.current = "native";
236
+ buttonRef.current?.click();
237
+ approvalRef.current = "idle";
238
+ }
239
+ }, () => {
240
+ if (!mountedRef.current || action !== actionRef.current)
241
+ return;
242
+ pendingRef.current = false;
243
+ setConfirmLoading(false);
244
+ if (operation !== operationRef.current)
245
+ return;
246
+ setConfirmError(true);
247
+ cancelRef.current?.focus();
248
+ });
249
+ return;
250
+ }
251
+ event.preventDefault();
252
+ if (disabled || isLoading || pendingRef.current)
253
+ return;
254
+ if (popoverRef.current?.matches(":popover-open")) {
255
+ closePopover();
256
+ return;
257
+ }
258
+ setConfirmError(false);
259
+ popoverRef.current?.showPopover();
260
+ cancelRef.current?.focus();
261
+ }
262
+ function handleConfirm(event) {
263
+ event.preventDefault();
264
+ event.stopPropagation();
265
+ const trigger = buttonRef.current;
266
+ if (disabled || isLoading || pendingRef.current || !trigger || trigger.disabled || !event.currentTarget.matches(":popover-open"))
267
+ return;
268
+ setConfirmError(false);
269
+ pendingRef.current = true;
270
+ actionRef.current += 1;
271
+ approvalRef.current = "action";
272
+ trigger.click();
273
+ if (approvalRef.current === "action") {
274
+ approvalRef.current = "idle";
275
+ pendingRef.current = false;
276
+ }
277
+ }
124
278
  const classes = getButtonClasses({
125
279
  color,
126
280
  appearance,
@@ -130,34 +284,526 @@ function Button({
130
284
  isLoading,
131
285
  className
132
286
  });
133
- return /* @__PURE__ */ jsxs("button", {
134
- ref,
135
- className: classes,
136
- disabled: disabled || isLoading,
137
- "aria-busy": isLoading,
138
- "aria-disabled": disabled || isLoading,
139
- ...props,
287
+ const confirmClasses = getButtonClasses({
288
+ color,
289
+ size: "sm",
290
+ isLoading: confirmLoading
291
+ });
292
+ return /* @__PURE__ */ jsxs(Fragment, {
140
293
  children: [
141
- isLoading && /* @__PURE__ */ jsx("span", {
142
- className: "btn-spinner"
294
+ /* @__PURE__ */ jsxs("button", {
295
+ ref: confirm ? mergedRef : ref,
296
+ className: classes,
297
+ disabled: disabled || isLoading,
298
+ "aria-busy": isLoading,
299
+ "aria-disabled": disabled || isLoading,
300
+ ...props,
301
+ style: confirm ? { ...props.style, anchorName: anchor } : props.style,
302
+ "aria-haspopup": confirm ? "dialog" : props["aria-haspopup"],
303
+ "aria-controls": confirm ? popoverId : props["aria-controls"],
304
+ onClick: confirm ? handleClick : onClick,
305
+ children: [
306
+ isLoading && /* @__PURE__ */ jsx("span", {
307
+ className: "btn-spinner"
308
+ }),
309
+ !isLoading && leftIcon && /* @__PURE__ */ jsx("span", {
310
+ className: "btn-icon-left",
311
+ children: leftIcon
312
+ }),
313
+ /* @__PURE__ */ jsx("span", {
314
+ className: "btn-content",
315
+ children
316
+ }),
317
+ !isLoading && rightIcon && /* @__PURE__ */ jsx("span", {
318
+ className: "btn-icon-right",
319
+ children: rightIcon
320
+ })
321
+ ]
143
322
  }),
144
- !isLoading && leftIcon && /* @__PURE__ */ jsx("span", {
145
- className: "btn-icon-left",
146
- children: leftIcon
323
+ confirm && portalTarget && createPortal(/* @__PURE__ */ jsxs("form", {
324
+ id: popoverId,
325
+ ref: popoverRef,
326
+ popover: "auto",
327
+ role: "dialog",
328
+ "aria-labelledby": hasTitle ? titleId : undefined,
329
+ "aria-label": hasTitle ? undefined : "Confirm action",
330
+ "aria-describedby": hasContent ? descriptionId : undefined,
331
+ className: "popover popover-confirm popover-bottom",
332
+ style: { positionAnchor: anchor },
333
+ onSubmit: handleConfirm,
334
+ onClick: (event) => event.stopPropagation(),
335
+ onToggle: (event) => {
336
+ if (!event.currentTarget.matches(":popover-open")) {
337
+ operationRef.current += 1;
338
+ if (event.currentTarget.contains(document.activeElement) || document.activeElement === document.body) {
339
+ buttonRef.current?.focus();
340
+ }
341
+ }
342
+ },
343
+ children: [
344
+ hasTitle && /* @__PURE__ */ jsx("div", {
345
+ className: "popover-header",
346
+ children: /* @__PURE__ */ jsx("h3", {
347
+ id: titleId,
348
+ className: "popover-title",
349
+ children: title
350
+ })
351
+ }),
352
+ hasContent && /* @__PURE__ */ jsx("div", {
353
+ id: descriptionId,
354
+ className: "popover-body",
355
+ children: content
356
+ }),
357
+ confirmError && /* @__PURE__ */ jsx("div", {
358
+ role: "alert",
359
+ className: "popover-body",
360
+ children: "The action failed. Please try again."
361
+ }),
362
+ /* @__PURE__ */ jsxs("div", {
363
+ className: "popover-footer",
364
+ children: [
365
+ /* @__PURE__ */ jsx("button", {
366
+ ref: cancelRef,
367
+ type: "button",
368
+ className: "btn btn-text btn-sm",
369
+ popoverTarget: popoverId,
370
+ popoverTargetAction: "hide",
371
+ disabled: confirmLoading,
372
+ children: confirmation?.cancelText ?? "Cancel"
373
+ }),
374
+ /* @__PURE__ */ jsx("button", {
375
+ type: "submit",
376
+ className: confirmClasses,
377
+ disabled: disabled || isLoading || confirmLoading,
378
+ "aria-busy": confirmLoading,
379
+ children: confirmation?.confirmText ?? "Confirm"
380
+ })
381
+ ]
382
+ })
383
+ ]
384
+ }), portalTarget)
385
+ ]
386
+ });
387
+ }
388
+ // src/components/date-picker/DatePicker.tsx
389
+ import { forwardRef as forwardRef2, useMemo as useMemo2, useState as useState3 } from "react";
390
+
391
+ // src/components/calendar/Calendar.tsx
392
+ import { forwardRef, useMemo, useState } from "react";
393
+
394
+ // src/classes/calendar.ts
395
+ var calendarBaseClass = "datepicker calendar";
396
+ var calendarHeaderClass = "calendar-header";
397
+ var calendarTitleClass = "calendar-title";
398
+ var calendarControlsClass = "calendar-controls";
399
+ var calendarNavClass = "calendar-nav";
400
+ var calendarModeClass = "calendar-mode";
401
+ var calendarWeekdaysClass = "calendar-weekdays";
402
+ var calendarWeekdayClass = "calendar-weekday";
403
+ var calendarBodyClass = "calendar-body";
404
+ var calendarDateGridClass = "calendar-date-grid";
405
+ var calendarMonthGridClass = "calendar-month-grid";
406
+ var calendarCellContentClass = "calendar-cell-content";
407
+ function getCalendarClasses({
408
+ fullscreen = true,
409
+ mode = "month",
410
+ className
411
+ }) {
412
+ return cn(calendarBaseClass, fullscreen ? "calendar-fullscreen" : "calendar-card", mode === "year" && "calendar-year-mode", className);
413
+ }
414
+ function getCalendarCellClasses({
415
+ selected,
416
+ today,
417
+ outside,
418
+ disabled,
419
+ className
420
+ }) {
421
+ return cn("calendar-cell", selected && "calendar-cell-selected", today && "calendar-cell-today", outside && "calendar-cell-outside", disabled && "calendar-cell-disabled", className);
422
+ }
423
+
424
+ // src/components/calendar/Calendar.tsx
425
+ import { jsx as jsx2, jsxs as jsxs2, Fragment as Fragment2 } from "react/jsx-runtime";
426
+ var WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
427
+ var MONTHS = [
428
+ "Jan",
429
+ "Feb",
430
+ "Mar",
431
+ "Apr",
432
+ "May",
433
+ "Jun",
434
+ "Jul",
435
+ "Aug",
436
+ "Sep",
437
+ "Oct",
438
+ "Nov",
439
+ "Dec"
440
+ ];
441
+ function pad(value) {
442
+ return String(value).padStart(2, "0");
443
+ }
444
+ function formatDate(date) {
445
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
446
+ }
447
+ function formatMonth(date) {
448
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-01`;
449
+ }
450
+ function parseDate(value) {
451
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
452
+ return new Date(value.getFullYear(), value.getMonth(), value.getDate());
453
+ }
454
+ if (typeof value === "string" && value.length > 0) {
455
+ const [year, month = "1", day = "1"] = value.split("-");
456
+ const parsed = new Date(Number(year), Number(month) - 1, Number(day));
457
+ if (!Number.isNaN(parsed.getTime())) {
458
+ return parsed;
459
+ }
460
+ }
461
+ const today = new Date;
462
+ return new Date(today.getFullYear(), today.getMonth(), today.getDate());
463
+ }
464
+ function addMonths(date, amount) {
465
+ return new Date(date.getFullYear(), date.getMonth() + amount, 1);
466
+ }
467
+ function addYears(date, amount) {
468
+ return new Date(date.getFullYear() + amount, date.getMonth(), 1);
469
+ }
470
+ function startOfCalendarGrid(panelDate) {
471
+ const firstOfMonth = new Date(panelDate.getFullYear(), panelDate.getMonth(), 1);
472
+ const start = new Date(firstOfMonth);
473
+ start.setDate(firstOfMonth.getDate() - firstOfMonth.getDay());
474
+ return start;
475
+ }
476
+ function buildDateGrid(panelDate) {
477
+ const start = startOfCalendarGrid(panelDate);
478
+ return Array.from({ length: 42 }, (_, index) => {
479
+ const date = new Date(start);
480
+ date.setDate(start.getDate() + index);
481
+ return date;
482
+ });
483
+ }
484
+ function isSameMonth(left, right) {
485
+ return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth();
486
+ }
487
+ function isOutsideRange(date, validRange) {
488
+ if (!validRange) {
489
+ return false;
490
+ }
491
+ const current = formatDate(date);
492
+ const start = formatDate(parseDate(validRange[0]));
493
+ const end = formatDate(parseDate(validRange[1]));
494
+ return current < start || current > end;
495
+ }
496
+ function Header({
497
+ panelDate,
498
+ mode,
499
+ setPanelDate,
500
+ setMode
501
+ }) {
502
+ const title = mode === "year" ? String(panelDate.getFullYear()) : `${MONTHS[panelDate.getMonth()]} ${panelDate.getFullYear()}`;
503
+ return /* @__PURE__ */ jsxs2("div", {
504
+ className: calendarHeaderClass,
505
+ children: [
506
+ /* @__PURE__ */ jsx2("button", {
507
+ type: "button",
508
+ className: calendarNavClass,
509
+ "aria-label": "Previous panel",
510
+ onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, -1) : addMonths(panelDate, -1), mode),
511
+ children: /* @__PURE__ */ jsx2("svg", {
512
+ "aria-hidden": "true",
513
+ focusable: "false",
514
+ width: "16",
515
+ height: "16",
516
+ viewBox: "0 0 24 24",
517
+ fill: "none",
518
+ stroke: "currentColor",
519
+ strokeWidth: "2",
520
+ strokeLinecap: "round",
521
+ strokeLinejoin: "round",
522
+ children: /* @__PURE__ */ jsx2("path", {
523
+ d: "m15 18-6-6 6-6"
524
+ })
525
+ })
147
526
  }),
148
- /* @__PURE__ */ jsx("span", {
149
- className: "btn-content",
150
- children
527
+ /* @__PURE__ */ jsxs2("div", {
528
+ className: calendarControlsClass,
529
+ children: [
530
+ /* @__PURE__ */ jsx2("div", {
531
+ className: calendarTitleClass,
532
+ children: title
533
+ }),
534
+ /* @__PURE__ */ jsxs2("div", {
535
+ className: calendarModeClass,
536
+ children: [
537
+ /* @__PURE__ */ jsx2("button", {
538
+ type: "button",
539
+ "aria-pressed": mode === "month",
540
+ onClick: () => setMode("month"),
541
+ children: "Month"
542
+ }),
543
+ /* @__PURE__ */ jsx2("button", {
544
+ type: "button",
545
+ "aria-pressed": mode === "year",
546
+ onClick: () => setMode("year"),
547
+ children: "Year"
548
+ })
549
+ ]
550
+ })
551
+ ]
151
552
  }),
152
- !isLoading && rightIcon && /* @__PURE__ */ jsx("span", {
153
- className: "btn-icon-right",
154
- children: rightIcon
553
+ /* @__PURE__ */ jsx2("button", {
554
+ type: "button",
555
+ className: calendarNavClass,
556
+ "aria-label": "Next panel",
557
+ onClick: () => setPanelDate(mode === "year" ? addYears(panelDate, 1) : addMonths(panelDate, 1), mode),
558
+ children: /* @__PURE__ */ jsx2("svg", {
559
+ "aria-hidden": "true",
560
+ focusable: "false",
561
+ width: "16",
562
+ height: "16",
563
+ viewBox: "0 0 24 24",
564
+ fill: "none",
565
+ stroke: "currentColor",
566
+ strokeWidth: "2",
567
+ strokeLinecap: "round",
568
+ strokeLinejoin: "round",
569
+ children: /* @__PURE__ */ jsx2("path", {
570
+ d: "m9 18 6-6-6-6"
571
+ })
572
+ })
155
573
  })
156
574
  ]
157
575
  });
158
576
  }
159
- // src/components/date-picker/DatePicker.tsx
160
- import { forwardRef, useMemo, useState } from "react";
577
+ var Calendar = forwardRef(({
578
+ className,
579
+ value,
580
+ defaultValue,
581
+ mode,
582
+ defaultMode = "month",
583
+ fullscreen = true,
584
+ validRange,
585
+ disabledDate,
586
+ dateCellRender,
587
+ dateFullCellRender,
588
+ monthCellRender,
589
+ monthFullCellRender,
590
+ cellRender,
591
+ fullCellRender,
592
+ headerRender,
593
+ onChange,
594
+ onSelect,
595
+ onPanelChange,
596
+ ...props
597
+ }, ref) => {
598
+ const selectedDate = parseDate(value ?? defaultValue);
599
+ const [innerValue, setInnerValue] = useState(() => formatDate(selectedDate));
600
+ const [panelDate, setInnerPanelDate] = useState(selectedDate);
601
+ const [innerMode, setInnerMode] = useState(mode ?? defaultMode);
602
+ const currentMode = mode ?? innerMode;
603
+ const currentValue = value === undefined ? innerValue : formatDate(parseDate(value));
604
+ const today = useMemo(() => formatDate(new Date), []);
605
+ const dateGrid = useMemo(() => buildDateGrid(panelDate), [panelDate]);
606
+ function emitPanelChange(nextDate, nextMode = currentMode) {
607
+ setInnerPanelDate(nextDate);
608
+ onPanelChange?.(formatDate(nextDate), nextMode);
609
+ }
610
+ function setCalendarMode(nextMode) {
611
+ if (mode === undefined) {
612
+ setInnerMode(nextMode);
613
+ }
614
+ onPanelChange?.(formatDate(panelDate), nextMode);
615
+ }
616
+ function commitValue(nextDate, source) {
617
+ const nextValue = source === "month" ? formatMonth(nextDate) : formatDate(nextDate);
618
+ if (disabledDate?.(nextValue) || isOutsideRange(nextDate, validRange)) {
619
+ return;
620
+ }
621
+ if (value === undefined) {
622
+ setInnerValue(nextValue);
623
+ }
624
+ setInnerPanelDate(nextDate);
625
+ onSelect?.(nextValue, { source });
626
+ onChange?.(nextValue);
627
+ }
628
+ function renderDateCell(date) {
629
+ const dateValue = formatDate(date);
630
+ const originNode = /* @__PURE__ */ jsxs2("div", {
631
+ className: calendarCellContentClass,
632
+ children: [
633
+ /* @__PURE__ */ jsx2("span", {
634
+ children: date.getDate()
635
+ }),
636
+ dateCellRender?.(dateValue)
637
+ ]
638
+ });
639
+ const info = {
640
+ originNode,
641
+ today,
642
+ type: "month"
643
+ };
644
+ const content = fullCellRender?.(dateValue, info) ?? dateFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
645
+ const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
646
+ return /* @__PURE__ */ jsx2("button", {
647
+ type: "button",
648
+ "aria-label": dateValue,
649
+ disabled,
650
+ className: getCalendarCellClasses({
651
+ selected: dateValue === currentValue,
652
+ today: dateValue === today,
653
+ outside: !isSameMonth(date, panelDate),
654
+ disabled
655
+ }),
656
+ onClick: () => commitValue(date, "date"),
657
+ children: content
658
+ }, dateValue);
659
+ }
660
+ function renderMonthCell(month) {
661
+ const date = new Date(panelDate.getFullYear(), month, 1);
662
+ const dateValue = formatMonth(date);
663
+ const originNode = /* @__PURE__ */ jsxs2("div", {
664
+ className: calendarCellContentClass,
665
+ children: [
666
+ /* @__PURE__ */ jsx2("span", {
667
+ children: MONTHS[month]
668
+ }),
669
+ monthCellRender?.(dateValue)
670
+ ]
671
+ });
672
+ const info = {
673
+ originNode,
674
+ today,
675
+ type: "year"
676
+ };
677
+ const content = fullCellRender?.(dateValue, info) ?? monthFullCellRender?.(dateValue) ?? cellRender?.(dateValue, info) ?? originNode;
678
+ const disabled = disabledDate?.(dateValue) || isOutsideRange(date, validRange);
679
+ return /* @__PURE__ */ jsx2("button", {
680
+ type: "button",
681
+ "aria-label": dateValue,
682
+ disabled,
683
+ className: getCalendarCellClasses({
684
+ selected: dateValue === formatMonth(parseDate(currentValue)),
685
+ today: dateValue === formatMonth(new Date),
686
+ disabled
687
+ }),
688
+ onClick: () => commitValue(date, "month"),
689
+ children: content
690
+ }, dateValue);
691
+ }
692
+ return /* @__PURE__ */ jsxs2("div", {
693
+ ...props,
694
+ ref,
695
+ className: getCalendarClasses({
696
+ fullscreen,
697
+ mode: currentMode,
698
+ className
699
+ }),
700
+ children: [
701
+ headerRender ? headerRender({
702
+ value: formatDate(panelDate),
703
+ type: currentMode,
704
+ onChange: (nextValue) => emitPanelChange(parseDate(nextValue)),
705
+ onTypeChange: setCalendarMode
706
+ }) : /* @__PURE__ */ jsx2(Header, {
707
+ panelDate,
708
+ mode: currentMode,
709
+ setPanelDate: emitPanelChange,
710
+ setMode: setCalendarMode
711
+ }),
712
+ /* @__PURE__ */ jsx2("div", {
713
+ className: calendarBodyClass,
714
+ children: currentMode === "month" ? /* @__PURE__ */ jsxs2(Fragment2, {
715
+ children: [
716
+ /* @__PURE__ */ jsx2("div", {
717
+ className: calendarWeekdaysClass,
718
+ "aria-hidden": "true",
719
+ children: WEEKDAYS.map((weekday) => /* @__PURE__ */ jsx2("span", {
720
+ className: calendarWeekdayClass,
721
+ children: weekday
722
+ }, weekday))
723
+ }),
724
+ /* @__PURE__ */ jsx2("div", {
725
+ className: calendarDateGridClass,
726
+ children: dateGrid.map(renderDateCell)
727
+ })
728
+ ]
729
+ }) : /* @__PURE__ */ jsx2("div", {
730
+ className: calendarMonthGridClass,
731
+ children: MONTHS.map((_, month) => renderMonthCell(month))
732
+ })
733
+ })
734
+ ]
735
+ });
736
+ });
737
+ Calendar.displayName = "Calendar";
738
+ // src/components/date-picker/usePickerDropdown.ts
739
+ import { useEffect, useId, useImperativeHandle, useRef, useState as useState2 } from "react";
740
+ function usePickerDropdown({
741
+ open,
742
+ defaultOpen,
743
+ disabled,
744
+ onOpenChange,
745
+ ref
746
+ }) {
747
+ const rootRef = useRef(null);
748
+ const inputRef = useRef(null);
749
+ const skipFocus = useRef(false);
750
+ const panelId = useId();
751
+ const [innerOpen, setInnerOpen] = useState2(Boolean(defaultOpen));
752
+ const visible = !disabled && (open ?? innerOpen);
753
+ useImperativeHandle(ref, () => rootRef.current, []);
754
+ function setVisible(next) {
755
+ if (disabled || next === visible)
756
+ return;
757
+ if (open === undefined)
758
+ setInnerOpen(next);
759
+ onOpenChange?.(next);
760
+ }
761
+ function closeAndFocus() {
762
+ skipFocus.current = true;
763
+ inputRef.current?.focus();
764
+ skipFocus.current = false;
765
+ setVisible(false);
766
+ }
767
+ useEffect(() => {
768
+ function handleOutside(event) {
769
+ if (visible && !rootRef.current?.contains(event.target))
770
+ setVisible(false);
771
+ }
772
+ function handleKeyDown(event) {
773
+ if (event.defaultPrevented || !rootRef.current?.contains(event.target))
774
+ return;
775
+ if (event.key === "Escape" && visible) {
776
+ event.preventDefault();
777
+ closeAndFocus();
778
+ } else if (event.key === "ArrowDown" && event.target === inputRef.current) {
779
+ event.preventDefault();
780
+ setVisible(true);
781
+ }
782
+ }
783
+ document.addEventListener("pointerdown", handleOutside);
784
+ document.addEventListener("keydown", handleKeyDown);
785
+ return () => {
786
+ document.removeEventListener("pointerdown", handleOutside);
787
+ document.removeEventListener("keydown", handleKeyDown);
788
+ };
789
+ });
790
+ return {
791
+ rootRef,
792
+ inputRef,
793
+ panelId,
794
+ visible,
795
+ setVisible,
796
+ closeAndFocus,
797
+ onInputFocus: () => {
798
+ if (!skipFocus.current)
799
+ setVisible(true);
800
+ },
801
+ onRootBlur: (event) => {
802
+ if (!event.currentTarget.contains(event.relatedTarget))
803
+ setVisible(false);
804
+ }
805
+ };
806
+ }
161
807
 
162
808
  // src/classes/date-picker.ts
163
809
  var datePickerBaseClass = "datepicker";
@@ -206,7 +852,7 @@ function getDatePickerDropdownClasses({
206
852
  }
207
853
 
208
854
  // src/components/date-picker/DatePicker.tsx
209
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
855
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
210
856
  function todayValue(picker) {
211
857
  const today = new Date;
212
858
  const year = today.getFullYear();
@@ -245,9 +891,10 @@ function placeholderForPicker(picker) {
245
891
  function normalizeDateValue(value) {
246
892
  return typeof value === "string" && value.length > 0 ? value : undefined;
247
893
  }
248
- var DatePickerRoot = forwardRef(({
894
+ var DatePickerRoot = forwardRef2(({
249
895
  allowClear,
250
896
  className,
897
+ inputProps,
251
898
  defaultOpen,
252
899
  defaultValue,
253
900
  disabled,
@@ -266,19 +913,19 @@ var DatePickerRoot = forwardRef(({
266
913
  value,
267
914
  ...props
268
915
  }, ref) => {
916
+ const [calendarMode, setCalendarMode] = useState3("month");
269
917
  const isValueControlled = value !== undefined;
270
- const isOpenControlled = open !== undefined;
271
- const [innerValue, setInnerValue] = useState(() => normalizeDateValue(defaultValue));
272
- const [innerOpen, setInnerOpen] = useState(Boolean(defaultOpen));
918
+ const [innerValue, setInnerValue] = useState3(() => normalizeDateValue(defaultValue));
919
+ const dropdown = usePickerDropdown({
920
+ open,
921
+ defaultOpen,
922
+ disabled,
923
+ onOpenChange,
924
+ ref
925
+ });
273
926
  const currentValue = isValueControlled ? normalizeDateValue(value) : innerValue;
274
- const visible = isOpenControlled ? Boolean(open) : innerOpen;
927
+ const { visible, setVisible } = dropdown;
275
928
  const inputType = inputTypeForPicker(picker);
276
- function setVisible(nextOpen) {
277
- if (!isOpenControlled) {
278
- setInnerOpen(nextOpen);
279
- }
280
- onOpenChange?.(nextOpen);
281
- }
282
929
  function emitChange(nextValue) {
283
930
  if (nextValue && disabledDate?.(nextValue)) {
284
931
  return;
@@ -288,10 +935,17 @@ var DatePickerRoot = forwardRef(({
288
935
  }
289
936
  onChange?.(nextValue, nextValue ?? "");
290
937
  }
291
- const presetItems = useMemo(() => presets ?? [], [presets]);
292
- return /* @__PURE__ */ jsxs2("div", {
938
+ function selectValue(nextValue) {
939
+ if (disabledDate?.(nextValue))
940
+ return;
941
+ emitChange(nextValue);
942
+ dropdown.closeAndFocus();
943
+ }
944
+ const presetItems = useMemo2(() => presets ?? [], [presets]);
945
+ return /* @__PURE__ */ jsxs3("div", {
293
946
  ...props,
294
- ref,
947
+ ref: dropdown.rootRef,
948
+ onBlur: dropdown.onRootBlur,
295
949
  className: getDatePickerClasses({
296
950
  size,
297
951
  status,
@@ -301,7 +955,11 @@ var DatePickerRoot = forwardRef(({
301
955
  className
302
956
  }),
303
957
  children: [
304
- /* @__PURE__ */ jsx2("input", {
958
+ /* @__PURE__ */ jsx3("input", {
959
+ ...inputProps,
960
+ ref: dropdown.inputRef,
961
+ "aria-haspopup": "dialog",
962
+ "aria-controls": visible ? dropdown.panelId : undefined,
305
963
  className: datePickerInputClass,
306
964
  disabled,
307
965
  type: inputType,
@@ -309,15 +967,15 @@ var DatePickerRoot = forwardRef(({
309
967
  placeholder: placeholder ?? placeholderForPicker(picker),
310
968
  onFocus: (event) => {
311
969
  onFocus?.(event);
312
- setVisible(true);
970
+ dropdown.onInputFocus();
313
971
  },
314
972
  onBlur: (event) => {
315
973
  onBlur?.(event);
316
- setVisible(false);
317
974
  },
975
+ onClick: () => setVisible(true),
318
976
  onChange: (event) => emitChange(event.currentTarget.value || undefined)
319
977
  }),
320
- allowClear && currentValue && !disabled ? /* @__PURE__ */ jsx2("button", {
978
+ allowClear && currentValue && !disabled ? /* @__PURE__ */ jsx3("button", {
321
979
  type: "button",
322
980
  className: datePickerClearClass,
323
981
  "aria-label": "Clear date",
@@ -325,26 +983,95 @@ var DatePickerRoot = forwardRef(({
325
983
  onClick: () => emitChange(undefined),
326
984
  children: "x"
327
985
  }) : null,
328
- /* @__PURE__ */ jsx2("span", {
986
+ /* @__PURE__ */ jsx3("button", {
987
+ type: "button",
329
988
  className: datePickerIconClass,
330
- "aria-hidden": "true"
989
+ "aria-label": "Open date picker",
990
+ "aria-haspopup": "dialog",
991
+ "aria-expanded": visible,
992
+ "aria-controls": visible ? dropdown.panelId : undefined,
993
+ disabled,
994
+ onMouseDown: (event) => event.preventDefault(),
995
+ onClick: () => setVisible(!visible),
996
+ children: /* @__PURE__ */ jsxs3("svg", {
997
+ "aria-hidden": "true",
998
+ focusable: "false",
999
+ width: "18",
1000
+ height: "18",
1001
+ viewBox: "0 0 24 24",
1002
+ fill: "none",
1003
+ stroke: "currentColor",
1004
+ strokeWidth: "1.75",
1005
+ strokeLinecap: "round",
1006
+ strokeLinejoin: "round",
1007
+ children: [
1008
+ /* @__PURE__ */ jsx3("rect", {
1009
+ x: "3",
1010
+ y: "5",
1011
+ width: "18",
1012
+ height: "16",
1013
+ rx: "2"
1014
+ }),
1015
+ /* @__PURE__ */ jsx3("path", {
1016
+ d: "M8 3v4M16 3v4M3 10h18"
1017
+ })
1018
+ ]
1019
+ })
331
1020
  }),
332
- (presetItems.length > 0 || showNow) && visible ? /* @__PURE__ */ jsxs2("div", {
1021
+ visible ? /* @__PURE__ */ jsxs3("div", {
1022
+ id: dropdown.panelId,
1023
+ role: "dialog",
1024
+ "aria-label": "Choose date",
333
1025
  className: getDatePickerDropdownClasses({ open: visible }),
334
1026
  children: [
335
- presetItems.map((preset, index) => /* @__PURE__ */ jsx2("button", {
1027
+ picker === "date" || picker === "month" ? /* @__PURE__ */ jsx3(Calendar, {
1028
+ fullscreen: false,
1029
+ value: currentValue,
1030
+ mode: picker === "month" ? "year" : calendarMode,
1031
+ onPanelChange: (_, mode) => {
1032
+ if (picker === "date")
1033
+ setCalendarMode(mode);
1034
+ },
1035
+ disabledDate: (date) => {
1036
+ if (!disabledDate)
1037
+ return false;
1038
+ if (picker === "month")
1039
+ return disabledDate(date.slice(0, 7));
1040
+ if (calendarMode === "year") {
1041
+ const [year, month] = date.split("-").map(Number);
1042
+ const days = new Date(year, month, 0).getDate();
1043
+ return Array.from({ length: days }, (_, index) => `${date.slice(0, 7)}-${String(index + 1).padStart(2, "0")}`).every((day) => disabledDate(day));
1044
+ }
1045
+ return disabledDate(date);
1046
+ },
1047
+ onSelect: (date, info) => {
1048
+ if (picker === "date" && info.source === "month") {
1049
+ setCalendarMode("month");
1050
+ return;
1051
+ }
1052
+ selectValue(picker === "month" ? date.slice(0, 7) : date);
1053
+ }
1054
+ }) : /* @__PURE__ */ jsx3("input", {
1055
+ type: inputType,
1056
+ "aria-label": placeholderForPicker(picker),
1057
+ value: currentValue ?? "",
1058
+ onChange: (event) => selectValue(event.currentTarget.value)
1059
+ }),
1060
+ presetItems.map((preset, index) => /* @__PURE__ */ jsx3("button", {
336
1061
  type: "button",
337
1062
  className: datePickerPresetClass,
338
1063
  onMouseDown: (event) => event.preventDefault(),
339
- onClick: () => emitChange(preset.value),
1064
+ disabled: Boolean(disabledDate?.(preset.value)),
1065
+ onClick: () => selectValue(preset.value),
340
1066
  children: preset.label
341
1067
  }, index)),
342
- showNow ? /* @__PURE__ */ jsx2("div", {
1068
+ showNow ? /* @__PURE__ */ jsx3("div", {
343
1069
  className: datePickerFooterClass,
344
- children: /* @__PURE__ */ jsx2("button", {
1070
+ children: /* @__PURE__ */ jsx3("button", {
345
1071
  type: "button",
346
1072
  onMouseDown: (event) => event.preventDefault(),
347
- onClick: () => emitChange(todayValue(picker)),
1073
+ disabled: Boolean(disabledDate?.(todayValue(picker))),
1074
+ onClick: () => selectValue(todayValue(picker)),
348
1075
  children: "Now"
349
1076
  })
350
1077
  }) : null
@@ -354,9 +1081,10 @@ var DatePickerRoot = forwardRef(({
354
1081
  });
355
1082
  });
356
1083
  DatePickerRoot.displayName = "DatePicker";
357
- var RangePicker = forwardRef(({
1084
+ var RangePicker = forwardRef2(({
358
1085
  allowClear,
359
1086
  className,
1087
+ inputProps,
360
1088
  defaultValue,
361
1089
  disabled,
362
1090
  disabledDate,
@@ -370,7 +1098,7 @@ var RangePicker = forwardRef(({
370
1098
  ...props
371
1099
  }, ref) => {
372
1100
  const isControlled = value !== undefined;
373
- const [innerValue, setInnerValue] = useState(defaultValue ?? [undefined, undefined]);
1101
+ const [innerValue, setInnerValue] = useState3(defaultValue ?? [undefined, undefined]);
374
1102
  const currentValue = isControlled ? value : innerValue;
375
1103
  const inputType = inputTypeForPicker(picker);
376
1104
  function emitChange(nextValue) {
@@ -385,7 +1113,7 @@ var RangePicker = forwardRef(({
385
1113
  function updateIndex(index, nextItem) {
386
1114
  emitChange(index === 0 ? [nextItem, currentValue?.[1]] : [currentValue?.[0], nextItem]);
387
1115
  }
388
- return /* @__PURE__ */ jsxs2("div", {
1116
+ return /* @__PURE__ */ jsxs3("div", {
389
1117
  ...props,
390
1118
  ref,
391
1119
  className: getDatePickerClasses({
@@ -397,7 +1125,8 @@ var RangePicker = forwardRef(({
397
1125
  className
398
1126
  }),
399
1127
  children: [
400
- /* @__PURE__ */ jsx2("input", {
1128
+ /* @__PURE__ */ jsx3("input", {
1129
+ ...inputProps,
401
1130
  className: datePickerInputClass,
402
1131
  disabled,
403
1132
  type: inputType,
@@ -405,11 +1134,13 @@ var RangePicker = forwardRef(({
405
1134
  placeholder: Array.isArray(placeholder) ? placeholder[0] : "Start date",
406
1135
  onChange: (event) => updateIndex(0, event.currentTarget.value || undefined)
407
1136
  }),
408
- /* @__PURE__ */ jsx2("span", {
1137
+ /* @__PURE__ */ jsx3("span", {
409
1138
  className: datePickerSeparatorClass,
410
1139
  children: separator
411
1140
  }),
412
- /* @__PURE__ */ jsx2("input", {
1141
+ /* @__PURE__ */ jsx3("input", {
1142
+ ...inputProps,
1143
+ id: inputProps?.id ? `${inputProps.id}-end` : undefined,
413
1144
  className: datePickerInputClass,
414
1145
  disabled,
415
1146
  type: inputType,
@@ -417,7 +1148,7 @@ var RangePicker = forwardRef(({
417
1148
  placeholder: Array.isArray(placeholder) ? placeholder[1] : "End date",
418
1149
  onChange: (event) => updateIndex(1, event.currentTarget.value || undefined)
419
1150
  }),
420
- allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */ jsx2("button", {
1151
+ allowClear && (currentValue?.[0] || currentValue?.[1]) && !disabled ? /* @__PURE__ */ jsx3("button", {
421
1152
  type: "button",
422
1153
  className: datePickerClearClass,
423
1154
  "aria-label": "Clear date range",
@@ -429,7 +1160,7 @@ var RangePicker = forwardRef(({
429
1160
  });
430
1161
  RangePicker.displayName = "DatePicker.RangePicker";
431
1162
  function withPicker(picker, displayName) {
432
- const Picker = forwardRef((props, ref) => /* @__PURE__ */ jsx2(DatePickerRoot, {
1163
+ const Picker = forwardRef2((props, ref) => /* @__PURE__ */ jsx3(DatePickerRoot, {
433
1164
  ...props,
434
1165
  ref,
435
1166
  picker
@@ -446,10 +1177,10 @@ var DatePicker = Object.assign(DatePickerRoot, {
446
1177
  });
447
1178
  // src/components/input/Input.tsx
448
1179
  import {
449
- forwardRef as forwardRef2,
450
- useImperativeHandle,
451
- useRef,
452
- useState as useState2
1180
+ forwardRef as forwardRef3,
1181
+ useImperativeHandle as useImperativeHandle2,
1182
+ useRef as useRef2,
1183
+ useState as useState4
453
1184
  } from "react";
454
1185
 
455
1186
  // src/classes/input.ts
@@ -538,14 +1269,14 @@ function getTextAreaCountClasses({ exceeded }) {
538
1269
  }
539
1270
 
540
1271
  // src/components/input/Input.tsx
541
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1272
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
542
1273
  function toTextValue(value) {
543
1274
  if (Array.isArray(value)) {
544
1275
  return value.join(",");
545
1276
  }
546
1277
  return value == null ? "" : String(value);
547
1278
  }
548
- var InputRoot = forwardRef2(({
1279
+ var InputRoot = forwardRef3(({
549
1280
  allowClear,
550
1281
  className,
551
1282
  defaultValue,
@@ -560,12 +1291,12 @@ var InputRoot = forwardRef2(({
560
1291
  variant = "outlined",
561
1292
  ...props
562
1293
  }, ref) => {
563
- const inputRef = useRef(null);
564
- const [internalValue, setInternalValue] = useState2(() => toTextValue(defaultValue));
1294
+ const inputRef = useRef2(null);
1295
+ const [internalValue, setInternalValue] = useState4(() => toTextValue(defaultValue));
565
1296
  const isControlled = value !== undefined;
566
1297
  const currentValue = isControlled ? toTextValue(value) : internalValue;
567
1298
  const hasAffix = prefix != null || suffix != null || allowClear;
568
- useImperativeHandle(ref, () => inputRef.current);
1299
+ useImperativeHandle2(ref, () => inputRef.current);
569
1300
  function handleChange(event) {
570
1301
  if (!isControlled) {
571
1302
  setInternalValue(event.currentTarget.value);
@@ -588,7 +1319,7 @@ var InputRoot = forwardRef2(({
588
1319
  });
589
1320
  input.focus();
590
1321
  }
591
- const control = /* @__PURE__ */ jsx3("input", {
1322
+ const control = /* @__PURE__ */ jsx4("input", {
592
1323
  ...props,
593
1324
  ref: inputRef,
594
1325
  type,
@@ -601,22 +1332,22 @@ var InputRoot = forwardRef2(({
601
1332
  return control;
602
1333
  }
603
1334
  const showClear = allowClear && !disabled && currentValue.length > 0;
604
- return /* @__PURE__ */ jsxs3("span", {
1335
+ return /* @__PURE__ */ jsxs4("span", {
605
1336
  className: getInputWrapperClasses({ affixed: hasAffix }),
606
1337
  children: [
607
- prefix != null ? /* @__PURE__ */ jsx3("span", {
1338
+ prefix != null ? /* @__PURE__ */ jsx4("span", {
608
1339
  className: inputPrefixClass,
609
1340
  children: prefix
610
1341
  }) : null,
611
1342
  control,
612
- showClear ? /* @__PURE__ */ jsx3("button", {
1343
+ showClear ? /* @__PURE__ */ jsx4("button", {
613
1344
  type: "button",
614
1345
  className: inputClearClass,
615
1346
  "aria-label": "Clear input",
616
1347
  onClick: handleClear,
617
1348
  children: "x"
618
1349
  }) : null,
619
- suffix != null ? /* @__PURE__ */ jsx3("span", {
1350
+ suffix != null ? /* @__PURE__ */ jsx4("span", {
620
1351
  className: inputSuffixClass,
621
1352
  children: suffix
622
1353
  }) : null
@@ -624,7 +1355,7 @@ var InputRoot = forwardRef2(({
624
1355
  });
625
1356
  });
626
1357
  InputRoot.displayName = "Input";
627
- var Search = forwardRef2(({
1358
+ var Search = forwardRef3(({
628
1359
  className,
629
1360
  disabled,
630
1361
  enterButton,
@@ -633,8 +1364,8 @@ var Search = forwardRef2(({
633
1364
  onSearch,
634
1365
  ...props
635
1366
  }, ref) => {
636
- const inputRef = useRef(null);
637
- useImperativeHandle(ref, () => inputRef.current);
1367
+ const inputRef = useRef2(null);
1368
+ useImperativeHandle2(ref, () => inputRef.current);
638
1369
  function emitSearch(event) {
639
1370
  onSearch?.(inputRef.current?.value ?? "", event);
640
1371
  }
@@ -645,16 +1376,16 @@ var Search = forwardRef2(({
645
1376
  }
646
1377
  }
647
1378
  const buttonContent = enterButton === true ? "Search" : enterButton ?? "Search";
648
- return /* @__PURE__ */ jsxs3("span", {
1379
+ return /* @__PURE__ */ jsxs4("span", {
649
1380
  className: getSearchWrapperClasses({ className }),
650
1381
  children: [
651
- /* @__PURE__ */ jsx3(InputRoot, {
1382
+ /* @__PURE__ */ jsx4(InputRoot, {
652
1383
  ...props,
653
1384
  ref: inputRef,
654
1385
  disabled,
655
1386
  onKeyDown: handleKeyDown
656
1387
  }),
657
- enterButton || loading ? /* @__PURE__ */ jsx3("button", {
1388
+ enterButton || loading ? /* @__PURE__ */ jsx4("button", {
658
1389
  type: "button",
659
1390
  className: inputSearchButtonClass,
660
1391
  disabled: disabled || loading,
@@ -666,10 +1397,10 @@ var Search = forwardRef2(({
666
1397
  });
667
1398
  });
668
1399
  Search.displayName = "Input.Search";
669
- var Password = forwardRef2(({ className, disabled, visibilityToggle = true, ...props }, ref) => {
670
- const [visible, setVisible] = useState2(false);
1400
+ var Password = forwardRef3(({ className, disabled, visibilityToggle = true, ...props }, ref) => {
1401
+ const [visible, setVisible] = useState4(false);
671
1402
  const type = visible ? "text" : "password";
672
- const toggle = visibilityToggle ? /* @__PURE__ */ jsx3("button", {
1403
+ const toggle = visibilityToggle ? /* @__PURE__ */ jsx4("button", {
673
1404
  type: "button",
674
1405
  className: inputPasswordToggleClass,
675
1406
  disabled,
@@ -679,9 +1410,9 @@ var Password = forwardRef2(({ className, disabled, visibilityToggle = true, ...p
679
1410
  },
680
1411
  children: visible ? "Hide" : "Show"
681
1412
  }) : undefined;
682
- return /* @__PURE__ */ jsx3("span", {
1413
+ return /* @__PURE__ */ jsx4("span", {
683
1414
  className: getPasswordWrapperClasses({ className }),
684
- children: /* @__PURE__ */ jsx3(InputRoot, {
1415
+ children: /* @__PURE__ */ jsx4(InputRoot, {
685
1416
  ...props,
686
1417
  ref,
687
1418
  disabled,
@@ -691,7 +1422,7 @@ var Password = forwardRef2(({ className, disabled, visibilityToggle = true, ...p
691
1422
  });
692
1423
  });
693
1424
  Password.displayName = "Input.Password";
694
- var TextArea = forwardRef2(({
1425
+ var TextArea = forwardRef3(({
695
1426
  autoSize,
696
1427
  className,
697
1428
  defaultValue,
@@ -705,7 +1436,7 @@ var TextArea = forwardRef2(({
705
1436
  variant = "outlined",
706
1437
  ...props
707
1438
  }, ref) => {
708
- const [internalValue, setInternalValue] = useState2(() => toTextValue(defaultValue));
1439
+ const [internalValue, setInternalValue] = useState4(() => toTextValue(defaultValue));
709
1440
  const isControlled = value !== undefined;
710
1441
  const currentValue = isControlled ? toTextValue(value) : internalValue;
711
1442
  const count = currentValue.length;
@@ -716,7 +1447,7 @@ var TextArea = forwardRef2(({
716
1447
  }
717
1448
  onChange?.(event);
718
1449
  }
719
- const control = /* @__PURE__ */ jsx3("textarea", {
1450
+ const control = /* @__PURE__ */ jsx4("textarea", {
720
1451
  ...props,
721
1452
  ref,
722
1453
  className: getTextAreaClasses({
@@ -734,11 +1465,11 @@ var TextArea = forwardRef2(({
734
1465
  if (!showCount) {
735
1466
  return control;
736
1467
  }
737
- return /* @__PURE__ */ jsxs3("span", {
1468
+ return /* @__PURE__ */ jsxs4("span", {
738
1469
  className: textAreaWrapperClass,
739
1470
  children: [
740
1471
  control,
741
- /* @__PURE__ */ jsxs3("span", {
1472
+ /* @__PURE__ */ jsxs4("span", {
742
1473
  className: getTextAreaCountClasses({ exceeded }),
743
1474
  children: [
744
1475
  count,
@@ -749,7 +1480,7 @@ var TextArea = forwardRef2(({
749
1480
  });
750
1481
  });
751
1482
  TextArea.displayName = "Input.TextArea";
752
- var Group = forwardRef2(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx3("div", {
1483
+ var Group = forwardRef3(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx4("div", {
753
1484
  ...props,
754
1485
  ref,
755
1486
  className: cn(inputGroupClass, className),
@@ -763,7 +1494,7 @@ var Input = Object.assign(InputRoot, {
763
1494
  Group
764
1495
  });
765
1496
  // src/components/select/Select.tsx
766
- import React3, { forwardRef as forwardRef3, useMemo as useMemo2, useState as useState3 } from "react";
1497
+ import React5, { forwardRef as forwardRef4, useMemo as useMemo3, useState as useState5 } from "react";
767
1498
 
768
1499
  // src/classes/select.ts
769
1500
  var selectContainerClass = "select-container";
@@ -819,7 +1550,7 @@ function getSelectOptionClasses({
819
1550
  }
820
1551
 
821
1552
  // src/components/select/Select.tsx
822
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1553
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
823
1554
  function isGroup(option) {
824
1555
  return "options" in option;
825
1556
  }
@@ -844,8 +1575,8 @@ function normalizeMultiValue(value) {
844
1575
  }
845
1576
  function optionsFromChildren(children) {
846
1577
  const result = [];
847
- React3.Children.forEach(children, (child) => {
848
- if (!React3.isValidElement(child)) {
1578
+ React5.Children.forEach(children, (child) => {
1579
+ if (!React5.isValidElement(child)) {
849
1580
  return;
850
1581
  }
851
1582
  if (child.type === Option) {
@@ -895,19 +1626,19 @@ function filterOptions(options, searchValue, filterOption) {
895
1626
  function renderValue(option) {
896
1627
  return option ? optionLabel(option) : null;
897
1628
  }
898
- var Option = forwardRef3(({ children, ...props }, ref) => /* @__PURE__ */ jsx4("div", {
1629
+ var Option = forwardRef4(({ children, ...props }, ref) => /* @__PURE__ */ jsx5("div", {
899
1630
  ...props,
900
1631
  ref,
901
1632
  children
902
1633
  }));
903
1634
  Option.displayName = "Select.Option";
904
- var OptGroup = forwardRef3(({ children, ...props }, ref) => /* @__PURE__ */ jsx4("div", {
1635
+ var OptGroup = forwardRef4(({ children, ...props }, ref) => /* @__PURE__ */ jsx5("div", {
905
1636
  ...props,
906
1637
  ref,
907
1638
  children
908
1639
  }));
909
1640
  OptGroup.displayName = "Select.OptGroup";
910
- var SelectRoot = forwardRef3(({
1641
+ var SelectRoot = forwardRef4(({
911
1642
  allowClear,
912
1643
  children,
913
1644
  className,
@@ -926,11 +1657,11 @@ var SelectRoot = forwardRef3(({
926
1657
  ...props
927
1658
  }, ref) => {
928
1659
  const multiple = mode === "multiple" || mode === "tags";
929
- const sourceOptions = useMemo2(() => options ?? optionsFromChildren(children), [children, options]);
930
- const flatOptions = useMemo2(() => flattenOptions(sourceOptions), [sourceOptions]);
931
- const [open, setOpen] = useState3(false);
932
- const [searchValue, setSearchValue] = useState3("");
933
- const [internalValue, setInternalValue] = useState3(multiple ? normalizeMultiValue(defaultValue) : normalizeSingleValue(defaultValue));
1660
+ const sourceOptions = useMemo3(() => options ?? optionsFromChildren(children), [children, options]);
1661
+ const flatOptions = useMemo3(() => flattenOptions(sourceOptions), [sourceOptions]);
1662
+ const [open, setOpen] = useState5(false);
1663
+ const [searchValue, setSearchValue] = useState5("");
1664
+ const [internalValue, setInternalValue] = useState5(multiple ? normalizeMultiValue(defaultValue) : normalizeSingleValue(defaultValue));
934
1665
  const controlled = value !== undefined;
935
1666
  const currentValue = controlled ? value : internalValue;
936
1667
  const selectedValues = multiple ? normalizeMultiValue(currentValue) : normalizeSingleValue(currentValue) === undefined ? [] : [normalizeSingleValue(currentValue)];
@@ -987,7 +1718,7 @@ var SelectRoot = forwardRef3(({
987
1718
  }
988
1719
  function renderOption(option) {
989
1720
  const selected = selectedKeys.has(valueKey(option.value));
990
- return /* @__PURE__ */ jsx4("button", {
1721
+ return /* @__PURE__ */ jsx5("button", {
991
1722
  type: "button",
992
1723
  role: "option",
993
1724
  "aria-selected": selected,
@@ -1006,11 +1737,11 @@ var SelectRoot = forwardRef3(({
1006
1737
  if (!isGroup(option)) {
1007
1738
  return renderOption(option);
1008
1739
  }
1009
- return /* @__PURE__ */ jsxs4("div", {
1740
+ return /* @__PURE__ */ jsxs5("div", {
1010
1741
  className: cn(selectGroupClass, option.className),
1011
1742
  role: "group",
1012
1743
  children: [
1013
- /* @__PURE__ */ jsx4("div", {
1744
+ /* @__PURE__ */ jsx5("div", {
1014
1745
  className: selectGroupLabelClass,
1015
1746
  children: option.label
1016
1747
  }),
@@ -1019,11 +1750,11 @@ var SelectRoot = forwardRef3(({
1019
1750
  }, `group-${index}`);
1020
1751
  });
1021
1752
  }
1022
- const selection = multiple ? selectedOptions.map((option) => /* @__PURE__ */ jsx4("span", {
1753
+ const selection = multiple ? selectedOptions.map((option) => /* @__PURE__ */ jsx5("span", {
1023
1754
  className: selectTagClass,
1024
1755
  children: renderValue(option)
1025
1756
  }, valueKey(option.value))) : renderValue(selectedOptions[0]);
1026
- return /* @__PURE__ */ jsxs4("div", {
1757
+ return /* @__PURE__ */ jsxs5("div", {
1027
1758
  ...props,
1028
1759
  ref,
1029
1760
  className: getSelectContainerClasses({
@@ -1034,7 +1765,7 @@ var SelectRoot = forwardRef3(({
1034
1765
  className
1035
1766
  }),
1036
1767
  children: [
1037
- /* @__PURE__ */ jsxs4("button", {
1768
+ /* @__PURE__ */ jsxs5("button", {
1038
1769
  type: "button",
1039
1770
  className: getSelectClasses({ size, status, disabled }),
1040
1771
  disabled: disabled || loading,
@@ -1042,33 +1773,33 @@ var SelectRoot = forwardRef3(({
1042
1773
  "aria-expanded": open,
1043
1774
  onClick: () => setOpen((current) => !current),
1044
1775
  children: [
1045
- /* @__PURE__ */ jsx4("span", {
1776
+ /* @__PURE__ */ jsx5("span", {
1046
1777
  className: selectSelectionClass,
1047
- children: hasValue ? selection : /* @__PURE__ */ jsx4("span", {
1778
+ children: hasValue ? selection : /* @__PURE__ */ jsx5("span", {
1048
1779
  className: selectPlaceholderClass,
1049
1780
  children: placeholder
1050
1781
  })
1051
1782
  }),
1052
- /* @__PURE__ */ jsx4("span", {
1783
+ /* @__PURE__ */ jsx5("span", {
1053
1784
  className: selectIconClass,
1054
1785
  "aria-hidden": "true",
1055
1786
  children: "v"
1056
1787
  })
1057
1788
  ]
1058
1789
  }),
1059
- allowClear && hasValue && !disabled && !loading ? /* @__PURE__ */ jsx4("button", {
1790
+ allowClear && hasValue && !disabled && !loading ? /* @__PURE__ */ jsx5("button", {
1060
1791
  type: "button",
1061
1792
  className: selectClearClass,
1062
1793
  "aria-label": "Clear selection",
1063
1794
  onClick: clearValue,
1064
1795
  children: "x"
1065
1796
  }) : null,
1066
- open ? /* @__PURE__ */ jsxs4("div", {
1797
+ open ? /* @__PURE__ */ jsxs5("div", {
1067
1798
  className: selectDropdownClass,
1068
1799
  role: "listbox",
1069
1800
  "aria-multiselectable": multiple || undefined,
1070
1801
  children: [
1071
- searchable ? /* @__PURE__ */ jsx4("input", {
1802
+ searchable ? /* @__PURE__ */ jsx5("input", {
1072
1803
  className: selectSearchClass,
1073
1804
  value: searchValue,
1074
1805
  placeholder: typeof placeholder === "string" ? placeholder : undefined,
@@ -1080,7 +1811,7 @@ var SelectRoot = forwardRef3(({
1080
1811
  }
1081
1812
  }
1082
1813
  }) : null,
1083
- visibleOptions.length > 0 ? renderOptions(visibleOptions) : /* @__PURE__ */ jsx4("div", {
1814
+ visibleOptions.length > 0 ? renderOptions(visibleOptions) : /* @__PURE__ */ jsx5("div", {
1084
1815
  className: selectEmptyClass,
1085
1816
  children: "No data"
1086
1817
  })
@@ -1094,7 +1825,7 @@ var Select = SelectRoot;
1094
1825
  Select.Option = Option;
1095
1826
  Select.OptGroup = OptGroup;
1096
1827
  // src/components/dm-search/DmSearch.tsx
1097
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1828
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1098
1829
  function initialValues(items, searchParams, useSearchParams = true) {
1099
1830
  return items.reduce((acc, item) => {
1100
1831
  const defaultValue = item.search.extraProps?.value ?? item.search.formProps?.initialValue;
@@ -1118,7 +1849,7 @@ function renderField({
1118
1849
  return item.search.render?.(value, setValue, item) ?? null;
1119
1850
  }
1120
1851
  if (item.search.type === "select") {
1121
- return /* @__PURE__ */ jsx5(Select, {
1852
+ return /* @__PURE__ */ jsx6(Select, {
1122
1853
  ...extraProps,
1123
1854
  disabled: Boolean(loading || extraProps.disabled),
1124
1855
  value,
@@ -1127,25 +1858,25 @@ function renderField({
1127
1858
  });
1128
1859
  }
1129
1860
  if (item.search.type === "dateRange") {
1130
- return /* @__PURE__ */ jsx5(DatePicker.RangePicker, {
1861
+ return /* @__PURE__ */ jsx6(DatePicker.RangePicker, {
1131
1862
  ...extraProps,
1132
1863
  value,
1133
1864
  onChange: (nextValue) => setValue(nextValue)
1134
1865
  });
1135
1866
  }
1136
1867
  if (item.search.type === "date") {
1137
- return /* @__PURE__ */ jsx5(DatePicker, {
1868
+ return /* @__PURE__ */ jsx6(DatePicker, {
1138
1869
  ...extraProps,
1139
1870
  value,
1140
1871
  onChange: (nextValue) => setValue(nextValue)
1141
1872
  });
1142
1873
  }
1143
1874
  if (item.search.type === "radio" || item.search.type === "checkbox") {
1144
- return /* @__PURE__ */ jsx5("div", {
1875
+ return /* @__PURE__ */ jsx6("div", {
1145
1876
  role: item.search.type === "radio" ? "radiogroup" : "group",
1146
- children: optionList(extraProps).map((option) => /* @__PURE__ */ jsxs5("label", {
1877
+ children: optionList(extraProps).map((option) => /* @__PURE__ */ jsxs6("label", {
1147
1878
  children: [
1148
- /* @__PURE__ */ jsx5("input", {
1879
+ /* @__PURE__ */ jsx6("input", {
1149
1880
  type: item.search.type,
1150
1881
  disabled: loading,
1151
1882
  checked: item.search.type === "checkbox" ? Array.isArray(value) && value.includes(option.value) : value === option.value,
@@ -1163,7 +1894,7 @@ function renderField({
1163
1894
  }, String(option.value)))
1164
1895
  });
1165
1896
  }
1166
- return /* @__PURE__ */ jsx5(Input, {
1897
+ return /* @__PURE__ */ jsx6(Input, {
1167
1898
  ...extraProps,
1168
1899
  type: item.search.type === "input-number" ? "number" : "text",
1169
1900
  disabled: Boolean(loading || extraProps.disabled),
@@ -1177,8 +1908,11 @@ function renderField({
1177
1908
  }
1178
1909
  });
1179
1910
  }
1180
- var DmSearch = forwardRef4(({
1911
+ var DmSearch = forwardRef5(({
1181
1912
  items = [],
1913
+ values: controlledValues,
1914
+ onValuesChange,
1915
+ onReset,
1182
1916
  onSearch,
1183
1917
  extra,
1184
1918
  fastFilterItem,
@@ -1187,27 +1921,37 @@ var DmSearch = forwardRef4(({
1187
1921
  compact = false,
1188
1922
  searchParams,
1189
1923
  loading = false,
1924
+ noValidate,
1190
1925
  enableDefaultPlaceHolder = false,
1191
1926
  className
1192
1927
  }, ref) => {
1193
- const allItems = useMemo3(() => fastFilterItem ? [fastFilterItem, ...items] : items, [fastFilterItem, items]);
1194
- const [collapsed, setCollapsed] = useState4(defaultCollapsed);
1195
- const [values, setValues] = useState4(() => initialValues(allItems, searchParams));
1928
+ const allItems = useMemo4(() => fastFilterItem ? [fastFilterItem, ...items] : items, [fastFilterItem, items]);
1929
+ const [collapsed, setCollapsed] = useState6(defaultCollapsed);
1930
+ const [internalValues, setValues] = useState6(() => initialValues(allItems, searchParams));
1931
+ const controlled = controlledValues !== undefined;
1932
+ const values = controlled ? controlledValues : internalValues;
1196
1933
  const visibleItems = collapsed ? allItems.slice(0, 1) : allItems;
1197
- useEffect(() => {
1198
- setValues(initialValues(allItems, searchParams));
1199
- }, [allItems, searchParams]);
1934
+ useEffect2(() => {
1935
+ if (!controlled)
1936
+ setValues(initialValues(allItems, searchParams));
1937
+ }, [allItems, searchParams, controlled]);
1200
1938
  function reset(useSearchParams = false) {
1201
1939
  const nextValues = initialValues(allItems, searchParams, useSearchParams);
1202
- setValues(nextValues);
1940
+ if (!controlled)
1941
+ setValues(nextValues);
1942
+ if (onReset)
1943
+ onReset(nextValues);
1944
+ else if (controlled)
1945
+ onValuesChange?.(nextValues);
1203
1946
  return nextValues;
1204
1947
  }
1205
- useImperativeHandle2(ref, () => ({
1948
+ useImperativeHandle3(ref, () => ({
1206
1949
  onReset: () => {
1207
1950
  reset(false);
1208
1951
  }
1209
1952
  }));
1210
- return /* @__PURE__ */ jsxs5("form", {
1953
+ return /* @__PURE__ */ jsxs6("form", {
1954
+ noValidate,
1211
1955
  id: "searchForm",
1212
1956
  className: getDmSearchClasses({ compact, collapsed, className }),
1213
1957
  onSubmit: (event) => {
@@ -1215,53 +1959,63 @@ var DmSearch = forwardRef4(({
1215
1959
  onSearch?.(values);
1216
1960
  },
1217
1961
  children: [
1218
- fastFilterItem ? /* @__PURE__ */ jsx5("div", {
1962
+ fastFilterItem ? /* @__PURE__ */ jsx6("div", {
1219
1963
  className: dmSearchFastFilterClass,
1220
1964
  children: fastFilterItem.title
1221
1965
  }) : null,
1222
- /* @__PURE__ */ jsx5("div", {
1966
+ /* @__PURE__ */ jsx6("div", {
1223
1967
  className: dmSearchFieldsClass,
1224
- children: visibleItems.map((item) => /* @__PURE__ */ jsxs5("label", {
1225
- className: dmSearchFieldClass,
1226
- children: [
1227
- compact ? null : /* @__PURE__ */ jsx5("span", {
1228
- children: item.title
1229
- }),
1230
- renderField({
1231
- item,
1232
- value: values[item.dataIndex],
1233
- loading,
1234
- enableDefaultPlaceHolder,
1235
- setValue: (value) => setValues((current) => ({
1236
- ...current,
1237
- [item.dataIndex]: value
1238
- }))
1239
- })
1240
- ]
1241
- }, item.key))
1968
+ children: visibleItems.map((item) => {
1969
+ const Field = item.search.type === "custom" ? "div" : "label";
1970
+ return /* @__PURE__ */ jsxs6(Field, {
1971
+ className: dmSearchFieldClass,
1972
+ children: [
1973
+ compact ? null : /* @__PURE__ */ jsx6("span", {
1974
+ children: item.title
1975
+ }),
1976
+ renderField({
1977
+ item,
1978
+ value: values[item.dataIndex],
1979
+ loading,
1980
+ enableDefaultPlaceHolder,
1981
+ setValue: (value) => {
1982
+ const nextValues = { ...values, [item.dataIndex]: value };
1983
+ if (!controlled)
1984
+ setValues(nextValues);
1985
+ onValuesChange?.(nextValues);
1986
+ }
1987
+ })
1988
+ ]
1989
+ }, item.key);
1990
+ })
1242
1991
  }),
1243
- /* @__PURE__ */ jsxs5("div", {
1992
+ /* @__PURE__ */ jsxs6("div", {
1244
1993
  className: dmSearchActionsClass,
1245
1994
  children: [
1246
- /* @__PURE__ */ jsx5(Button, {
1995
+ /* @__PURE__ */ jsx6(Button, {
1247
1996
  type: "submit",
1248
1997
  isLoading: loading,
1249
1998
  children: "Search"
1250
1999
  }),
1251
- /* @__PURE__ */ jsx5(Button, {
2000
+ /* @__PURE__ */ jsx6(Button, {
1252
2001
  type: "button",
1253
2002
  color: "secondary",
1254
2003
  appearance: "outline",
1255
- onClick: () => onSearch?.(reset(false)),
2004
+ onClick: () => {
2005
+ const nextValues = reset(false);
2006
+ if (!onReset)
2007
+ onSearch?.(nextValues);
2008
+ },
1256
2009
  children: "Reset"
1257
2010
  }),
1258
- !hideCollapseBtn && allItems.length > 1 ? /* @__PURE__ */ jsx5(Button, {
2011
+ !hideCollapseBtn && allItems.length > 1 ? /* @__PURE__ */ jsx6(Button, {
1259
2012
  type: "button",
1260
2013
  color: "secondary",
1261
2014
  appearance: "text",
1262
2015
  onClick: () => {
1263
2016
  setCollapsed((current) => !current);
1264
- setValues(initialValues(allItems, searchParams));
2017
+ if (!controlled)
2018
+ setValues(initialValues(allItems, searchParams));
1265
2019
  },
1266
2020
  children: collapsed ? "Expand" : "Collapse"
1267
2021
  }) : null,
@@ -1273,7 +2027,7 @@ var DmSearch = forwardRef4(({
1273
2027
  });
1274
2028
  DmSearch.displayName = "DmSearch";
1275
2029
  // src/components/dm-query/DmQuery.tsx
1276
- import { jsx as jsx6, jsxs as jsxs6, Fragment } from "react/jsx-runtime";
2030
+ import { jsx as jsx7 } from "react/jsx-runtime";
1277
2031
  function toSearchItem(item) {
1278
2032
  return {
1279
2033
  key: item.key,
@@ -1282,11 +2036,12 @@ function toSearchItem(item) {
1282
2036
  search: {
1283
2037
  type: item.type,
1284
2038
  extraProps: item.extraProps,
1285
- formProps: item.customProps
2039
+ formProps: item.customProps,
2040
+ render: item.render
1286
2041
  }
1287
2042
  };
1288
2043
  }
1289
- var DmQuery = forwardRef5(({
2044
+ var DmQuery = forwardRef6(({
1290
2045
  queryItem,
1291
2046
  fastFilterItem,
1292
2047
  collapsed = false,
@@ -1294,35 +2049,23 @@ var DmQuery = forwardRef5(({
1294
2049
  onSearch,
1295
2050
  ...props
1296
2051
  }, ref) => {
1297
- const searchRef = useRef2(null);
1298
- const [selectedItem, setSelectedItem] = useState5(queryItem[0]);
2052
+ const searchRef = useRef3(null);
2053
+ const [selectedItem, setSelectedItem] = useState7(queryItem[0]);
1299
2054
  const items = selectedItem ? [toSearchItem(selectedItem)] : queryItem.map(toSearchItem);
1300
- useImperativeHandle3(ref, () => ({
2055
+ useImperativeHandle4(ref, () => ({
1301
2056
  onReset: () => searchRef.current?.onReset(),
1302
2057
  retractChange: (value, data = queryItem) => {
1303
2058
  setSelectedItem(data.find((item) => item.name === value || item.key === value));
1304
2059
  }
1305
2060
  }));
1306
- return /* @__PURE__ */ jsx6(DmSearch, {
2061
+ return /* @__PURE__ */ jsx7(DmSearch, {
1307
2062
  ...props,
1308
2063
  ref: searchRef,
1309
- defaultCollapsed: collapsed,
2064
+ defaultCollapsed: props.defaultCollapsed ?? collapsed,
1310
2065
  items: collapsed ? queryItem.map(toSearchItem) : items,
1311
2066
  fastFilterItem: fastFilterItem ? toSearchItem(fastFilterItem) : undefined,
1312
2067
  onSearch,
1313
- extra: /* @__PURE__ */ jsxs6(Fragment, {
1314
- children: [
1315
- props.extra,
1316
- /* @__PURE__ */ jsx6("button", {
1317
- type: "button",
1318
- hidden: true,
1319
- onClick: () => {
1320
- searchRef.current?.onReset();
1321
- onReset?.();
1322
- }
1323
- })
1324
- ]
1325
- })
2068
+ onReset
1326
2069
  });
1327
2070
  });
1328
2071
  DmQuery.displayName = "DmQuery";