@startdownnotez404/ui 1.3.5 → 1.3.6

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 (254) hide show
  1. package/dist/AutocompleteField-653233JU.mjs +203 -0
  2. package/dist/AutocompleteField-653233JU.mjs.map +1 -0
  3. package/dist/AvatarField-KFASMVZU.mjs +378 -0
  4. package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
  5. package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
  6. package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
  7. package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
  8. package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
  9. package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
  10. package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
  11. package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
  12. package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
  13. package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
  14. package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
  15. package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
  16. package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
  17. package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
  18. package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
  19. package/dist/TimeField-XVWXBJID.mjs +94 -0
  20. package/dist/TimeField-XVWXBJID.mjs.map +1 -0
  21. package/dist/alert.d.mts +148 -18
  22. package/dist/alert.d.ts +148 -18
  23. package/dist/alert.js +698 -254
  24. package/dist/alert.js.map +1 -1
  25. package/dist/alert.mjs +46 -10
  26. package/dist/autocomplete.d.mts +438 -4
  27. package/dist/autocomplete.d.ts +438 -4
  28. package/dist/autocomplete.js +632 -21
  29. package/dist/autocomplete.js.map +1 -1
  30. package/dist/autocomplete.mjs +26 -7
  31. package/dist/avatar.js +2 -1
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/avatar.mjs +12 -11
  34. package/dist/box.mjs +2 -1
  35. package/dist/button.mjs +3 -2
  36. package/dist/chart.mjs +3 -2
  37. package/dist/checkbox.mjs +3 -2
  38. package/dist/chunk-2FK24ZPJ.mjs +78 -0
  39. package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
  40. package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
  41. package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
  42. package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
  43. package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
  44. package/dist/chunk-4P45Z5LR.mjs.map +1 -0
  45. package/dist/chunk-4SSJY32J.mjs +1182 -0
  46. package/dist/chunk-4SSJY32J.mjs.map +1 -0
  47. package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
  48. package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
  49. package/dist/chunk-6JKMEH2L.mjs +205 -0
  50. package/dist/chunk-6JKMEH2L.mjs.map +1 -0
  51. package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
  52. package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
  53. package/dist/chunk-AFLEG5ZC.mjs +28 -0
  54. package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
  55. package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
  56. package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
  57. package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
  58. package/dist/chunk-DPIMA5IO.mjs +72 -0
  59. package/dist/chunk-DPIMA5IO.mjs.map +1 -0
  60. package/dist/chunk-F2CGFVIZ.mjs +83 -0
  61. package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
  62. package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
  63. package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
  64. package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
  65. package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
  66. package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
  67. package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
  68. package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
  69. package/dist/chunk-HAJWE62X.mjs.map +1 -0
  70. package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
  71. package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
  72. package/dist/chunk-KYTHGFFY.mjs +866 -0
  73. package/dist/chunk-KYTHGFFY.mjs.map +1 -0
  74. package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
  75. package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
  76. package/dist/chunk-LQNDBPHU.mjs +142 -0
  77. package/dist/chunk-LQNDBPHU.mjs.map +1 -0
  78. package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
  79. package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
  80. package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
  81. package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
  82. package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
  83. package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
  84. package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
  85. package/dist/chunk-PNSJC6PC.mjs.map +1 -0
  86. package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
  87. package/dist/chunk-QFS5CENY.mjs +659 -0
  88. package/dist/chunk-QFS5CENY.mjs.map +1 -0
  89. package/dist/chunk-RSN7NH2J.mjs +250 -0
  90. package/dist/chunk-RSN7NH2J.mjs.map +1 -0
  91. package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
  92. package/dist/chunk-RVSMEZE3.mjs.map +1 -0
  93. package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
  94. package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
  95. package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
  96. package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
  97. package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
  98. package/dist/chunk-USXGNKWJ.mjs.map +1 -0
  99. package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
  100. package/dist/chunk-VL7V52YD.mjs.map +1 -0
  101. package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
  102. package/dist/chunk-XAJAMVAG.mjs +1720 -0
  103. package/dist/chunk-XAJAMVAG.mjs.map +1 -0
  104. package/dist/chunk-YIJ5QVJ6.mjs +277 -0
  105. package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
  106. package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
  107. package/dist/chunk-YRW5NKD7.mjs.map +1 -0
  108. package/dist/chunk-ZMJKG2UI.mjs +71 -0
  109. package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
  110. package/dist/confirm.d.mts +48 -0
  111. package/dist/confirm.d.ts +48 -0
  112. package/dist/confirm.js +334 -0
  113. package/dist/confirm.js.map +1 -0
  114. package/dist/confirm.mjs +20 -0
  115. package/dist/datePicker.d.mts +256 -14
  116. package/dist/datePicker.d.ts +256 -14
  117. package/dist/datePicker.js +1624 -145
  118. package/dist/datePicker.js.map +1 -1
  119. package/dist/datePicker.mjs +19 -6
  120. package/dist/dialog.d.mts +166 -0
  121. package/dist/dialog.d.ts +166 -0
  122. package/dist/dialog.js +362 -0
  123. package/dist/dialog.js.map +1 -0
  124. package/dist/dialog.mjs +45 -0
  125. package/dist/emptyState.d.mts +17 -0
  126. package/dist/emptyState.d.ts +17 -0
  127. package/dist/emptyState.js +253 -0
  128. package/dist/emptyState.js.map +1 -0
  129. package/dist/emptyState.mjs +12 -0
  130. package/dist/emptyState.mjs.map +1 -0
  131. package/dist/errorState.d.mts +18 -0
  132. package/dist/errorState.d.ts +18 -0
  133. package/dist/{displayFile.js → errorState.js} +107 -156
  134. package/dist/errorState.js.map +1 -0
  135. package/dist/errorState.mjs +15 -0
  136. package/dist/errorState.mjs.map +1 -0
  137. package/dist/fileUpload.d.mts +197 -0
  138. package/dist/fileUpload.d.ts +197 -0
  139. package/dist/fileUpload.js +1483 -0
  140. package/dist/fileUpload.js.map +1 -0
  141. package/dist/fileUpload.mjs +65 -0
  142. package/dist/fileUpload.mjs.map +1 -0
  143. package/dist/flowMap.mjs +7 -6
  144. package/dist/flowMap.mjs.map +1 -1
  145. package/dist/image.js +1195 -429
  146. package/dist/image.js.map +1 -1
  147. package/dist/image.mjs +8 -6
  148. package/dist/index.d.ts +7 -2
  149. package/dist/index.js +8606 -4087
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +314 -152
  152. package/dist/inlineError.d.mts +16 -0
  153. package/dist/inlineError.d.ts +16 -0
  154. package/dist/inlineError.js +297 -0
  155. package/dist/inlineError.js.map +1 -0
  156. package/dist/inlineError.mjs +15 -0
  157. package/dist/inlineError.mjs.map +1 -0
  158. package/dist/input.mjs +8 -7
  159. package/dist/jsonEditor.mjs +3 -2
  160. package/dist/list.mjs +7 -6
  161. package/dist/loading.mjs +8 -6
  162. package/dist/markdown.mjs +7 -6
  163. package/dist/markdown.mjs.map +1 -1
  164. package/dist/menu.mjs +9 -8
  165. package/dist/modal.js +2 -1
  166. package/dist/modal.js.map +1 -1
  167. package/dist/modal.mjs +7 -5
  168. package/dist/process.d.mts +33 -75
  169. package/dist/process.d.ts +33 -75
  170. package/dist/process.js +1275 -203
  171. package/dist/process.js.map +1 -1
  172. package/dist/process.mjs +12 -9
  173. package/dist/scrollToLoad.mjs +4 -3
  174. package/dist/select.mjs +10 -9
  175. package/dist/skeleton.d.mts +15 -1
  176. package/dist/skeleton.d.ts +15 -1
  177. package/dist/skeleton.js +114 -2
  178. package/dist/skeleton.js.map +1 -1
  179. package/dist/skeleton.mjs +6 -3
  180. package/dist/stepper.mjs +4 -3
  181. package/dist/tab.mjs +10 -9
  182. package/dist/table.d.mts +269 -85
  183. package/dist/table.d.ts +269 -85
  184. package/dist/table.js +5102 -3153
  185. package/dist/table.js.map +1 -1
  186. package/dist/table.mjs +21 -19
  187. package/dist/theme.js +1766 -432
  188. package/dist/theme.js.map +1 -1
  189. package/dist/theme.mjs +32 -25
  190. package/dist/timeline.mjs +4 -3
  191. package/dist/toast.d.mts +49 -0
  192. package/dist/toast.d.ts +49 -0
  193. package/dist/toast.js +175 -0
  194. package/dist/toast.js.map +1 -0
  195. package/dist/toast.mjs +9 -0
  196. package/dist/toast.mjs.map +1 -0
  197. package/dist/toggleButtonGroup.mjs +3 -2
  198. package/dist/useForm.d.mts +270 -86
  199. package/dist/useForm.d.ts +270 -86
  200. package/dist/useForm.js +4672 -2727
  201. package/dist/useForm.js.map +1 -1
  202. package/dist/useForm.mjs +18 -16
  203. package/dist/useSearch.mjs +13 -12
  204. package/dist/variablesRenderer.mjs +8 -7
  205. package/package.json +3 -3
  206. package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
  207. package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
  208. package/dist/AvatarField-SAODT3CZ.mjs +0 -275
  209. package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
  210. package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
  211. package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
  212. package/dist/FileUploadField-NTMWBJER.mjs +0 -78
  213. package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
  214. package/dist/chunk-24XDGNJ6.mjs.map +0 -1
  215. package/dist/chunk-27KYFU7R.mjs +0 -30
  216. package/dist/chunk-27KYFU7R.mjs.map +0 -1
  217. package/dist/chunk-AAH2O24U.mjs +0 -325
  218. package/dist/chunk-AAH2O24U.mjs.map +0 -1
  219. package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
  220. package/dist/chunk-EEH7HACG.mjs +0 -249
  221. package/dist/chunk-EEH7HACG.mjs.map +0 -1
  222. package/dist/chunk-EKPULYPU.mjs +0 -497
  223. package/dist/chunk-EKPULYPU.mjs.map +0 -1
  224. package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
  225. package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
  226. package/dist/chunk-S6EZVRZC.mjs.map +0 -1
  227. package/dist/chunk-SGCUDWO3.mjs +0 -396
  228. package/dist/chunk-SGCUDWO3.mjs.map +0 -1
  229. package/dist/chunk-T6AMRENK.mjs.map +0 -1
  230. package/dist/chunk-UDREPVEY.mjs.map +0 -1
  231. package/dist/chunk-UTVSYS6S.mjs.map +0 -1
  232. package/dist/chunk-XIMFP6RB.mjs +0 -161
  233. package/dist/chunk-XIMFP6RB.mjs.map +0 -1
  234. package/dist/displayFile.d.mts +0 -95
  235. package/dist/displayFile.d.ts +0 -95
  236. package/dist/displayFile.js.map +0 -1
  237. package/dist/displayFile.mjs +0 -19
  238. package/dist/fileUploader.d.mts +0 -86
  239. package/dist/fileUploader.d.ts +0 -86
  240. package/dist/fileUploader.js +0 -722
  241. package/dist/fileUploader.js.map +0 -1
  242. package/dist/fileUploader.mjs +0 -16
  243. /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
  244. /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
  245. /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
  246. /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
  247. /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
  248. /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
  249. /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
  250. /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
  251. /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
  252. /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
  253. /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
  254. /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
@@ -0,0 +1,1720 @@
1
+ import {
2
+ MuiPaper
3
+ } from "./chunk-3VUAM2GY.mjs";
4
+ import {
5
+ default as default12
6
+ } from "./chunk-VYD3PDBB.mjs";
7
+ import {
8
+ default as default3,
9
+ default2 as default4
10
+ } from "./chunk-MDAUF7IL.mjs";
11
+ import {
12
+ default108 as default6,
13
+ default125 as default7,
14
+ default126 as default8,
15
+ default128 as default9,
16
+ default130 as default10,
17
+ default131 as default11,
18
+ default69 as default5
19
+ } from "./chunk-ZVFYOXDE.mjs";
20
+ import {
21
+ IconButton_default
22
+ } from "./chunk-D4XPNSSI.mjs";
23
+ import {
24
+ Chip
25
+ } from "./chunk-OP6LKXPA.mjs";
26
+ import {
27
+ default as default2
28
+ } from "./chunk-PNSJC6PC.mjs";
29
+
30
+ // src/components/elemental/DatePicker/src/MuiXDatePicker.tsx
31
+ import React from "react";
32
+ import dayjs from "dayjs";
33
+ import customParseFormat from "dayjs/plugin/customParseFormat";
34
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
35
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
36
+ import { DateCalendar } from "@mui/x-date-pickers/DateCalendar";
37
+ import DialogActions from "@mui/material/DialogActions";
38
+ import InputAdornment from "@mui/material/InputAdornment";
39
+ import { jsx, jsxs } from "react/jsx-runtime";
40
+ dayjs.extend(customParseFormat);
41
+ var DISPLAY_DATE_FMT = "MM/DD/YYYY";
42
+ var toDayjs = (v) => {
43
+ if (v == null || v === "") return null;
44
+ const d = dayjs(v);
45
+ return d.isValid() ? d : null;
46
+ };
47
+ var formatDateLabel = (v, fmt) => v && v.isValid() ? v.format(fmt) : "";
48
+ var DATE_PARSE_FORMATS = [
49
+ DISPLAY_DATE_FMT,
50
+ "M/D/YYYY",
51
+ "YYYY-MM-DD",
52
+ "MMM D, YYYY",
53
+ "D MMM YYYY",
54
+ "MMM D YYYY",
55
+ "YYYY/MM/DD"
56
+ ];
57
+ var parseDateInput = (raw) => {
58
+ const trimmed = raw.trim();
59
+ if (!trimmed) return null;
60
+ for (const fmt of DATE_PARSE_FORMATS) {
61
+ const d = dayjs(trimmed, fmt, true);
62
+ if (d.isValid()) return d.startOf("day");
63
+ }
64
+ const loose = dayjs(trimmed);
65
+ if (loose.isValid()) return loose.startOf("day");
66
+ return "invalid";
67
+ };
68
+ var MuiXDatePicker = ({
69
+ value: valueProp,
70
+ defaultValue,
71
+ onChange,
72
+ label = "Pick a date",
73
+ disabled,
74
+ format: formatProp,
75
+ sx,
76
+ disableTyping = false,
77
+ slotProps
78
+ }) => {
79
+ const displayFmt = formatProp ?? DISPLAY_DATE_FMT;
80
+ const isControlled = valueProp !== void 0;
81
+ const [uncontrolled, setUncontrolled] = React.useState(
82
+ () => toDayjs(defaultValue)
83
+ );
84
+ const value = isControlled ? toDayjs(valueProp) : uncontrolled;
85
+ const [open, setOpen] = React.useState(false);
86
+ const [draft, setDraft] = React.useState(value);
87
+ const committedLabel = formatDateLabel(value, displayFmt);
88
+ const [inputText, setInputText] = React.useState(committedLabel);
89
+ const [fieldFocused, setFieldFocused] = React.useState(false);
90
+ const typingEnabled = !disableTyping;
91
+ const skipCommitOnBlurRef = React.useRef(false);
92
+ const anchorRef = React.useRef(null);
93
+ const [anchorEl, setAnchorEl] = React.useState(null);
94
+ const tf = slotProps?.textField ?? {};
95
+ const mergedDisabled = disabled ?? tf.disabled;
96
+ const mergedRequired = Boolean(tf.required);
97
+ const mergedError = Boolean(tf.error);
98
+ const helperText = tf.helperText;
99
+ const commit = (next) => {
100
+ if (!isControlled) setUncontrolled(next);
101
+ onChange?.(next);
102
+ return next;
103
+ };
104
+ React.useEffect(() => {
105
+ if (!fieldFocused) setInputText(committedLabel);
106
+ }, [committedLabel, fieldFocused]);
107
+ const commitTypedInput = () => {
108
+ if (!typingEnabled) return;
109
+ const parsed = parseDateInput(inputText);
110
+ if (parsed === "invalid") {
111
+ setInputText(committedLabel);
112
+ return;
113
+ }
114
+ const next = commit(parsed);
115
+ setDraft(next);
116
+ setInputText(formatDateLabel(next, displayFmt));
117
+ };
118
+ const openPicker = () => {
119
+ if (mergedDisabled) return;
120
+ setDraft(value);
121
+ setOpen(true);
122
+ };
123
+ const closePicker = () => {
124
+ setOpen(false);
125
+ };
126
+ const handleAccept = () => {
127
+ commit(draft);
128
+ setInputText(formatDateLabel(draft, displayFmt));
129
+ closePicker();
130
+ };
131
+ const handleCancel = () => {
132
+ setDraft(value);
133
+ closePicker();
134
+ };
135
+ const handleClear = () => {
136
+ setDraft(null);
137
+ };
138
+ const handleToday = () => {
139
+ setDraft(dayjs().startOf("day"));
140
+ };
141
+ const handleCalendarChange = (d) => {
142
+ if (!d) {
143
+ setDraft(null);
144
+ return;
145
+ }
146
+ setDraft(dayjs(d).startOf("day"));
147
+ };
148
+ return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: /* @__PURE__ */ jsxs(default2, { sx: { display: "inline-flex", flexDirection: "column", ...sx || {} }, children: [
149
+ /* @__PURE__ */ jsx(
150
+ default2,
151
+ {
152
+ ref: (el) => {
153
+ anchorRef.current = el;
154
+ setAnchorEl(el);
155
+ },
156
+ sx: { display: "inline-flex", minWidth: 200 },
157
+ children: /* @__PURE__ */ jsx(
158
+ default12,
159
+ {
160
+ size: "small",
161
+ fullWidth: true,
162
+ label,
163
+ value: typingEnabled ? inputText : committedLabel,
164
+ placeholder: displayFmt,
165
+ disabled: mergedDisabled,
166
+ required: mergedRequired,
167
+ error: mergedError,
168
+ helperText,
169
+ onClick: typingEnabled ? void 0 : openPicker,
170
+ onFocus: () => {
171
+ if (typingEnabled) {
172
+ setFieldFocused(true);
173
+ } else {
174
+ openPicker();
175
+ }
176
+ },
177
+ onBlur: () => {
178
+ if (!typingEnabled) return;
179
+ setFieldFocused(false);
180
+ if (skipCommitOnBlurRef.current) {
181
+ skipCommitOnBlurRef.current = false;
182
+ setInputText(committedLabel);
183
+ return;
184
+ }
185
+ commitTypedInput();
186
+ },
187
+ onChange: (e) => {
188
+ if (!typingEnabled) return;
189
+ setInputText(e.target.value);
190
+ },
191
+ onKeyDown: (e) => {
192
+ if (!typingEnabled) return;
193
+ if (e.key === "Enter") {
194
+ e.preventDefault();
195
+ e.target.blur();
196
+ }
197
+ if (e.key === "Escape") {
198
+ e.preventDefault();
199
+ skipCommitOnBlurRef.current = true;
200
+ setInputText(committedLabel);
201
+ e.target.blur();
202
+ }
203
+ },
204
+ inputProps: {
205
+ readOnly: !typingEnabled,
206
+ "aria-label": label,
207
+ "data-testid": "date-field"
208
+ },
209
+ InputProps: {
210
+ endAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx(
211
+ IconButton_default,
212
+ {
213
+ size: "small",
214
+ disabled: mergedDisabled,
215
+ "aria-label": "Choose date",
216
+ title: "Choose date",
217
+ ...slotProps?.openPickerIcon,
218
+ onMouseDown: (e) => {
219
+ e.preventDefault();
220
+ },
221
+ onClick: (e) => {
222
+ e.stopPropagation();
223
+ if (open) closePicker();
224
+ else openPicker();
225
+ },
226
+ children: /* @__PURE__ */ jsx(default9, { fontSize: "small" })
227
+ }
228
+ ) })
229
+ }
230
+ }
231
+ )
232
+ }
233
+ ),
234
+ /* @__PURE__ */ jsx(
235
+ default4,
236
+ {
237
+ open,
238
+ anchorEl,
239
+ placement: "bottom-start",
240
+ style: { zIndex: 1300 },
241
+ children: /* @__PURE__ */ jsx(default3, { onClickAway: handleCancel, children: /* @__PURE__ */ jsxs(
242
+ MuiPaper,
243
+ {
244
+ elevation: 0,
245
+ sx: {
246
+ mt: 1,
247
+ borderRadius: "20px",
248
+ background: "var(--mui-palette-background-default)",
249
+ border: "solid 1px var(--mui-palette-border-1)",
250
+ overflow: "hidden"
251
+ },
252
+ children: [
253
+ /* @__PURE__ */ jsx(
254
+ DateCalendar,
255
+ {
256
+ value: draft,
257
+ onChange: handleCalendarChange,
258
+ showDaysOutsideCurrentMonth: true
259
+ }
260
+ ),
261
+ /* @__PURE__ */ jsxs(DialogActions, { sx: { px: 1.5, pb: 1, justifyContent: "flex-end", gap: 0.5 }, children: [
262
+ /* @__PURE__ */ jsx(IconButton_default, { "data-testid": "clear-action-button", onClick: handleClear, title: "clear", children: /* @__PURE__ */ jsx(default11, { fontSize: "small" }) }),
263
+ /* @__PURE__ */ jsx(IconButton_default, { "data-testid": "today-action-button", onClick: handleToday, title: "today", children: /* @__PURE__ */ jsx(default10, { fontSize: "small" }) }),
264
+ /* @__PURE__ */ jsx(IconButton_default, { onClick: handleCancel, title: "cancel", children: /* @__PURE__ */ jsx(default6, { fontSize: "small" }) }),
265
+ /* @__PURE__ */ jsx(IconButton_default, { onClick: handleAccept, title: "accept", children: /* @__PURE__ */ jsx(default5, { fontSize: "small" }) })
266
+ ] })
267
+ ]
268
+ }
269
+ ) })
270
+ }
271
+ )
272
+ ] }) });
273
+ };
274
+ var MuiXDatePicker_default = MuiXDatePicker;
275
+
276
+ // src/components/elemental/DatePicker/src/MuiXDateTimePicker.tsx
277
+ import React2 from "react";
278
+ import dayjs2 from "dayjs";
279
+ import customParseFormat2 from "dayjs/plugin/customParseFormat";
280
+ import { LocalizationProvider as LocalizationProvider2 } from "@mui/x-date-pickers/LocalizationProvider";
281
+ import { AdapterDayjs as AdapterDayjs2 } from "@mui/x-date-pickers/AdapterDayjs";
282
+ import { DateCalendar as DateCalendar2 } from "@mui/x-date-pickers/DateCalendar";
283
+ import { MultiSectionDigitalClock } from "@mui/x-date-pickers/MultiSectionDigitalClock";
284
+ import DialogActions2 from "@mui/material/DialogActions";
285
+ import InputAdornment2 from "@mui/material/InputAdornment";
286
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
287
+ dayjs2.extend(customParseFormat2);
288
+ var DISPLAY_DATETIME_FMT = "MM/DD/YYYY hh:mm a";
289
+ var DISPLAY_DATETIME_FMT_24 = "MM/DD/YYYY HH:mm";
290
+ var toDayjs2 = (v) => {
291
+ if (v == null || v === "") return null;
292
+ const d = dayjs2(v);
293
+ return d.isValid() ? d : null;
294
+ };
295
+ var formatDateTimeLabel = (v, fmt) => v && v.isValid() ? v.format(fmt) : "";
296
+ var DATE_PARSE_FORMATS2 = [
297
+ "MM/DD/YYYY",
298
+ "M/D/YYYY",
299
+ "YYYY-MM-DD",
300
+ "MMM D, YYYY",
301
+ "D MMM YYYY",
302
+ "MMM D YYYY",
303
+ "YYYY/MM/DD"
304
+ ];
305
+ var MERIDIEM_TIME_FORMATS = [
306
+ "hh:mm a",
307
+ "h:mm a",
308
+ "hh:mma",
309
+ "h:mma",
310
+ "hh:mm A",
311
+ "h:mm A",
312
+ "hh:mmA",
313
+ "h:mmA"
314
+ ];
315
+ var DATETIME_PARSE_FORMATS = [
316
+ DISPLAY_DATETIME_FMT,
317
+ "MM/DD/YYYY h:mm a",
318
+ "M/D/YYYY hh:mm a",
319
+ "M/D/YYYY h:mm a",
320
+ "MM/DD/YYYY hh:mma",
321
+ "M/D/YYYY h:mma",
322
+ "MM/DD/YYYY HH:mm",
323
+ "M/D/YYYY H:mm",
324
+ "MM/DD/YYYY H:mm",
325
+ "YYYY-MM-DD HH:mm",
326
+ "YYYY-MM-DD H:mm",
327
+ "YYYY-MM-DDTHH:mm",
328
+ "YYYY-MM-DDTHH:mm:ss",
329
+ "YYYY-MM-DD HH:mm:ss",
330
+ "MMM D, YYYY hh:mm a",
331
+ "MMM D, YYYY h:mm a",
332
+ "MMM D, YYYY HH:mm"
333
+ ];
334
+ var stampDateTime = (datePart, hour, minute) => datePart.hour(hour).minute(minute).second(0).millisecond(0);
335
+ var parseTimeFragment = (raw, opts) => {
336
+ const trimmed = raw.trim();
337
+ if (!trimmed) return "invalid";
338
+ const normalized = trimmed.replace(/\s+/g, " ").replace(/(\d)\s*([ap])\.?m\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`);
339
+ for (const fmt of MERIDIEM_TIME_FORMATS) {
340
+ const d = dayjs2(normalized, fmt, true);
341
+ if (d.isValid()) return { hour: d.hour(), minute: d.minute() };
342
+ }
343
+ const bare = normalized.match(/^(\d{1,2})\s*:\s*(\d{2})$/);
344
+ if (bare) {
345
+ const hour = Number(bare[1]);
346
+ const minute = Number(bare[2]);
347
+ if (minute > 59 || hour > 23) return "invalid";
348
+ if (!opts.ampm || hour > 12 || hour === 0 && bare[1].length === 2) {
349
+ return { hour, minute };
350
+ }
351
+ let h12 = hour % 12;
352
+ if (opts.anchorHour != null && opts.anchorHour >= 12) {
353
+ h12 += 12;
354
+ }
355
+ if (hour === 12 && opts.anchorHour == null) {
356
+ h12 = 12;
357
+ } else if (hour === 12 && opts.anchorHour != null) {
358
+ h12 = opts.anchorHour >= 12 ? 12 : 0;
359
+ }
360
+ return { hour: h12, minute };
361
+ }
362
+ for (const fmt of ["HH:mm", "H:mm"]) {
363
+ const d = dayjs2(normalized, fmt, true);
364
+ if (d.isValid()) return { hour: d.hour(), minute: d.minute() };
365
+ }
366
+ return "invalid";
367
+ };
368
+ var parseDateFragment = (raw) => {
369
+ const t = raw.trim();
370
+ if (!t) return null;
371
+ for (const fmt of DATE_PARSE_FORMATS2) {
372
+ const d = dayjs2(t, fmt, true);
373
+ if (d.isValid()) return d.startOf("day");
374
+ }
375
+ const loose = dayjs2(t);
376
+ if (loose.isValid()) return loose.startOf("day");
377
+ return "invalid";
378
+ };
379
+ var splitDateAndTime = (raw) => {
380
+ const s = raw.trim();
381
+ const isoT = s.match(/^(\d{4}-\d{2}-\d{2})[T\s]+(.+)$/i);
382
+ if (isoT) return [isoT[1], isoT[2]];
383
+ const m = s.match(/^(.+?)\s+(\d{1,2}:\d{2}(?:\s*[ap]\.?m\.?)?)$/i);
384
+ if (m) return [m[1], m[2]];
385
+ return null;
386
+ };
387
+ var parseDateTimeInput = (raw, opts) => {
388
+ const trimmed = raw.trim();
389
+ if (!trimmed) return null;
390
+ const normalized = trimmed.replace(/\s+/g, " ").replace(/(\d)\s*([ap])\.?m\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`);
391
+ for (const fmt of DATETIME_PARSE_FORMATS) {
392
+ const d = dayjs2(normalized, fmt, true);
393
+ if (d.isValid()) return d.second(0).millisecond(0);
394
+ }
395
+ const halves = splitDateAndTime(normalized);
396
+ if (halves) {
397
+ const datePart = parseDateFragment(halves[0]);
398
+ if (datePart === "invalid" || datePart == null) return "invalid";
399
+ const timePart = parseTimeFragment(halves[1], {
400
+ ampm: opts.ampm,
401
+ anchorHour: opts.anchor && opts.anchor.isValid() ? opts.anchor.hour() : null
402
+ });
403
+ if (timePart === "invalid") return "invalid";
404
+ return stampDateTime(datePart, timePart.hour, timePart.minute);
405
+ }
406
+ const dateOnly = parseDateFragment(normalized);
407
+ if (dateOnly !== "invalid" && dateOnly != null) {
408
+ if (opts.anchor && opts.anchor.isValid()) {
409
+ return stampDateTime(dateOnly, opts.anchor.hour(), opts.anchor.minute());
410
+ }
411
+ return stampDateTime(dateOnly, 0, 0);
412
+ }
413
+ const loose = dayjs2(trimmed);
414
+ if (loose.isValid()) return loose.second(0).millisecond(0);
415
+ return "invalid";
416
+ };
417
+ var MuiXDateTimePicker = ({
418
+ value: valueProp,
419
+ defaultValue,
420
+ onChange,
421
+ label = "Pick date & time",
422
+ disabled,
423
+ ampm = true,
424
+ format: formatProp,
425
+ sx,
426
+ disableTyping = false,
427
+ slotProps
428
+ }) => {
429
+ const displayFmt = formatProp ?? (ampm ? DISPLAY_DATETIME_FMT : DISPLAY_DATETIME_FMT_24);
430
+ const isControlled = valueProp !== void 0;
431
+ const [uncontrolled, setUncontrolled] = React2.useState(
432
+ () => toDayjs2(defaultValue)
433
+ );
434
+ const value = isControlled ? toDayjs2(valueProp) : uncontrolled;
435
+ const [open, setOpen] = React2.useState(false);
436
+ const [draft, setDraft] = React2.useState(value);
437
+ const committedLabel = formatDateTimeLabel(value, displayFmt);
438
+ const [inputText, setInputText] = React2.useState(committedLabel);
439
+ const [fieldFocused, setFieldFocused] = React2.useState(false);
440
+ const typingEnabled = !disableTyping;
441
+ const skipCommitOnBlurRef = React2.useRef(false);
442
+ const anchorRef = React2.useRef(null);
443
+ const [anchorEl, setAnchorEl] = React2.useState(null);
444
+ const tf = slotProps?.textField ?? {};
445
+ const mergedDisabled = disabled ?? tf.disabled;
446
+ const mergedRequired = Boolean(tf.required);
447
+ const mergedError = Boolean(tf.error);
448
+ const helperText = tf.helperText;
449
+ const commit = (next) => {
450
+ if (!isControlled) setUncontrolled(next);
451
+ onChange?.(next);
452
+ return next;
453
+ };
454
+ React2.useEffect(() => {
455
+ if (!fieldFocused) setInputText(committedLabel);
456
+ }, [committedLabel, fieldFocused]);
457
+ const commitTypedInput = () => {
458
+ if (!typingEnabled) return;
459
+ const parsed = parseDateTimeInput(inputText, { ampm, anchor: value });
460
+ if (parsed === "invalid") {
461
+ setInputText(committedLabel);
462
+ return;
463
+ }
464
+ const next = commit(parsed);
465
+ setDraft(next);
466
+ setInputText(formatDateTimeLabel(next, displayFmt));
467
+ };
468
+ const openPicker = () => {
469
+ if (mergedDisabled) return;
470
+ setDraft(value);
471
+ setOpen(true);
472
+ };
473
+ const closePicker = () => {
474
+ setOpen(false);
475
+ };
476
+ const handleAccept = () => {
477
+ commit(draft);
478
+ setInputText(formatDateTimeLabel(draft, displayFmt));
479
+ closePicker();
480
+ };
481
+ const handleCancel = () => {
482
+ setDraft(value);
483
+ closePicker();
484
+ };
485
+ const handleClear = () => {
486
+ setDraft(null);
487
+ };
488
+ const handleCalendarChange = (d) => {
489
+ if (!d) {
490
+ setDraft(null);
491
+ return;
492
+ }
493
+ if (draft && draft.isValid()) {
494
+ setDraft(stampDateTime(d, draft.hour(), draft.minute()));
495
+ } else {
496
+ const now = dayjs2();
497
+ setDraft(stampDateTime(d, now.hour(), now.minute()));
498
+ }
499
+ };
500
+ const handleClockChange = (v) => {
501
+ if (!v) return;
502
+ const base = draft && draft.isValid() ? draft : dayjs2();
503
+ setDraft(stampDateTime(base, dayjs2(v).hour(), dayjs2(v).minute()));
504
+ };
505
+ const clockViews = ampm ? ["hours", "minutes", "meridiem"] : ["hours", "minutes"];
506
+ const placeholder = ampm ? "MM/DD/YYYY hh:mm aa" : "MM/DD/YYYY HH:mm";
507
+ return /* @__PURE__ */ jsx2(LocalizationProvider2, { dateAdapter: AdapterDayjs2, children: /* @__PURE__ */ jsxs2(default2, { sx: { display: "inline-flex", flexDirection: "column", ...sx || {} }, children: [
508
+ /* @__PURE__ */ jsx2(
509
+ default2,
510
+ {
511
+ ref: (el) => {
512
+ anchorRef.current = el;
513
+ setAnchorEl(el);
514
+ },
515
+ sx: { display: "inline-flex", minWidth: 260 },
516
+ children: /* @__PURE__ */ jsx2(
517
+ default12,
518
+ {
519
+ size: "small",
520
+ fullWidth: true,
521
+ label,
522
+ value: typingEnabled ? inputText : committedLabel,
523
+ placeholder,
524
+ disabled: mergedDisabled,
525
+ required: mergedRequired,
526
+ error: mergedError,
527
+ helperText,
528
+ onClick: typingEnabled ? void 0 : openPicker,
529
+ onFocus: () => {
530
+ if (typingEnabled) {
531
+ setFieldFocused(true);
532
+ } else {
533
+ openPicker();
534
+ }
535
+ },
536
+ onBlur: () => {
537
+ if (!typingEnabled) return;
538
+ setFieldFocused(false);
539
+ if (skipCommitOnBlurRef.current) {
540
+ skipCommitOnBlurRef.current = false;
541
+ setInputText(committedLabel);
542
+ return;
543
+ }
544
+ commitTypedInput();
545
+ },
546
+ onChange: (e) => {
547
+ if (!typingEnabled) return;
548
+ setInputText(e.target.value);
549
+ },
550
+ onKeyDown: (e) => {
551
+ if (!typingEnabled) return;
552
+ if (e.key === "Enter") {
553
+ e.preventDefault();
554
+ e.target.blur();
555
+ }
556
+ if (e.key === "Escape") {
557
+ e.preventDefault();
558
+ skipCommitOnBlurRef.current = true;
559
+ setInputText(committedLabel);
560
+ e.target.blur();
561
+ }
562
+ },
563
+ inputProps: {
564
+ readOnly: !typingEnabled,
565
+ "aria-label": label,
566
+ "data-testid": "datetime-field"
567
+ },
568
+ InputProps: {
569
+ endAdornment: /* @__PURE__ */ jsx2(InputAdornment2, { position: "end", children: /* @__PURE__ */ jsx2(
570
+ IconButton_default,
571
+ {
572
+ size: "small",
573
+ disabled: mergedDisabled,
574
+ "aria-label": "Choose date and time",
575
+ title: "Choose date and time",
576
+ ...slotProps?.openPickerIcon,
577
+ onMouseDown: (e) => {
578
+ e.preventDefault();
579
+ },
580
+ onClick: (e) => {
581
+ e.stopPropagation();
582
+ if (open) closePicker();
583
+ else openPicker();
584
+ },
585
+ children: /* @__PURE__ */ jsx2(default9, { fontSize: "small" })
586
+ }
587
+ ) })
588
+ }
589
+ }
590
+ )
591
+ }
592
+ ),
593
+ /* @__PURE__ */ jsx2(
594
+ default4,
595
+ {
596
+ open,
597
+ anchorEl,
598
+ placement: "bottom-start",
599
+ style: { zIndex: 1300 },
600
+ children: /* @__PURE__ */ jsx2(default3, { onClickAway: handleCancel, children: /* @__PURE__ */ jsxs2(
601
+ MuiPaper,
602
+ {
603
+ elevation: 0,
604
+ sx: {
605
+ mt: 1,
606
+ borderRadius: "20px",
607
+ background: "var(--mui-palette-background-default)",
608
+ border: "solid 1px var(--mui-palette-border-1)",
609
+ overflow: "hidden"
610
+ },
611
+ children: [
612
+ /* @__PURE__ */ jsxs2(
613
+ default2,
614
+ {
615
+ sx: {
616
+ display: "flex",
617
+ flexDirection: { xs: "column", sm: "row" },
618
+ alignItems: "stretch"
619
+ },
620
+ children: [
621
+ /* @__PURE__ */ jsx2(
622
+ DateCalendar2,
623
+ {
624
+ value: draft,
625
+ onChange: handleCalendarChange,
626
+ showDaysOutsideCurrentMonth: true
627
+ }
628
+ ),
629
+ /* @__PURE__ */ jsx2(
630
+ default2,
631
+ {
632
+ sx: {
633
+ px: 1,
634
+ pt: 1,
635
+ borderLeft: {
636
+ sm: "solid 1px var(--mui-palette-border-1)"
637
+ },
638
+ borderTop: {
639
+ xs: "solid 1px var(--mui-palette-border-1)",
640
+ sm: "none"
641
+ },
642
+ display: "flex",
643
+ alignItems: "center"
644
+ },
645
+ children: /* @__PURE__ */ jsx2(
646
+ MultiSectionDigitalClock,
647
+ {
648
+ ampm,
649
+ value: draft,
650
+ onChange: handleClockChange,
651
+ views: [...clockViews]
652
+ }
653
+ )
654
+ }
655
+ )
656
+ ]
657
+ }
658
+ ),
659
+ /* @__PURE__ */ jsxs2(DialogActions2, { sx: { px: 1.5, pb: 1, justifyContent: "flex-end", gap: 0.5 }, children: [
660
+ /* @__PURE__ */ jsx2(IconButton_default, { "data-testid": "clear-action-button", onClick: handleClear, title: "clear", children: /* @__PURE__ */ jsx2(default11, { fontSize: "small" }) }),
661
+ /* @__PURE__ */ jsx2(IconButton_default, { onClick: handleCancel, title: "cancel", children: /* @__PURE__ */ jsx2(default6, { fontSize: "small" }) }),
662
+ /* @__PURE__ */ jsx2(IconButton_default, { onClick: handleAccept, title: "accept", children: /* @__PURE__ */ jsx2(default5, { fontSize: "small" }) })
663
+ ] })
664
+ ]
665
+ }
666
+ ) })
667
+ }
668
+ )
669
+ ] }) });
670
+ };
671
+ var MuiXDateTimePicker_default = MuiXDateTimePicker;
672
+
673
+ // src/components/elemental/DatePicker/src/MuiXTimePicker.tsx
674
+ import React3 from "react";
675
+ import dayjs3 from "dayjs";
676
+ import customParseFormat3 from "dayjs/plugin/customParseFormat";
677
+ import { LocalizationProvider as LocalizationProvider3 } from "@mui/x-date-pickers/LocalizationProvider";
678
+ import { AdapterDayjs as AdapterDayjs3 } from "@mui/x-date-pickers/AdapterDayjs";
679
+ import { MultiSectionDigitalClock as MultiSectionDigitalClock2 } from "@mui/x-date-pickers/MultiSectionDigitalClock";
680
+ import DialogActions3 from "@mui/material/DialogActions";
681
+ import InputAdornment3 from "@mui/material/InputAdornment";
682
+ import AccessTimeIcon from "@mui/icons-material/AccessTime";
683
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
684
+ dayjs3.extend(customParseFormat3);
685
+ var DISPLAY_TIME_FMT = "hh:mm a";
686
+ var toDayjs3 = (v) => {
687
+ if (v == null || v === "") return null;
688
+ const d = dayjs3(v);
689
+ return d.isValid() ? d : null;
690
+ };
691
+ var formatTimeLabel = (v, fmt) => v && v.isValid() ? v.format(fmt) : "";
692
+ var MERIDIEM_PARSE_FORMATS = [
693
+ "hh:mm a",
694
+ "h:mm a",
695
+ "hh:mma",
696
+ "h:mma",
697
+ "hh:mm A",
698
+ "h:mm A",
699
+ "hh:mmA",
700
+ "h:mmA"
701
+ ];
702
+ var stampTime = (anchor, hour, minute) => {
703
+ const base = anchor && anchor.isValid() ? anchor : dayjs3();
704
+ return base.hour(hour).minute(minute).second(0).millisecond(0);
705
+ };
706
+ var parseTimeInput = (raw, opts) => {
707
+ const trimmed = raw.trim();
708
+ if (!trimmed) return null;
709
+ const normalized = trimmed.replace(/\s+/g, " ").replace(/(\d)\s*([ap])\.?m\.?$/i, (_, d, p) => `${d} ${p.toLowerCase()}m`);
710
+ for (const fmt of MERIDIEM_PARSE_FORMATS) {
711
+ const d = dayjs3(normalized, fmt, true);
712
+ if (d.isValid()) return stampTime(opts.anchor, d.hour(), d.minute());
713
+ }
714
+ const bare = normalized.match(/^(\d{1,2})\s*:\s*(\d{2})$/);
715
+ if (bare) {
716
+ const hour = Number(bare[1]);
717
+ const minute = Number(bare[2]);
718
+ if (minute > 59 || hour > 23) return "invalid";
719
+ if (!opts.ampm || hour > 12 || hour === 0 && bare[1].length === 2) {
720
+ return stampTime(opts.anchor, hour, minute);
721
+ }
722
+ let h12 = hour % 12;
723
+ if (opts.anchor && opts.anchor.isValid() && opts.anchor.hour() >= 12) {
724
+ h12 += 12;
725
+ }
726
+ if (hour === 12 && !(opts.anchor && opts.anchor.isValid())) {
727
+ h12 = 12;
728
+ } else if (hour === 12 && opts.anchor && opts.anchor.isValid()) {
729
+ h12 = opts.anchor.hour() >= 12 ? 12 : 0;
730
+ }
731
+ return stampTime(opts.anchor, h12, minute);
732
+ }
733
+ for (const fmt of ["HH:mm", "H:mm"]) {
734
+ const d = dayjs3(normalized, fmt, true);
735
+ if (d.isValid()) return stampTime(opts.anchor, d.hour(), d.minute());
736
+ }
737
+ return "invalid";
738
+ };
739
+ var MuiXTimePicker = ({
740
+ value: valueProp,
741
+ defaultValue,
742
+ onChange,
743
+ label = "Pick a time",
744
+ disabled,
745
+ ampm = true,
746
+ format: formatProp,
747
+ sx,
748
+ disableTyping = false,
749
+ slotProps
750
+ }) => {
751
+ const displayFmt = formatProp ?? (ampm ? DISPLAY_TIME_FMT : "HH:mm");
752
+ const isControlled = valueProp !== void 0;
753
+ const [uncontrolled, setUncontrolled] = React3.useState(
754
+ () => toDayjs3(defaultValue)
755
+ );
756
+ const value = isControlled ? toDayjs3(valueProp) : uncontrolled;
757
+ const [open, setOpen] = React3.useState(false);
758
+ const [draft, setDraft] = React3.useState(value);
759
+ const committedLabel = formatTimeLabel(value, displayFmt);
760
+ const [inputText, setInputText] = React3.useState(committedLabel);
761
+ const [fieldFocused, setFieldFocused] = React3.useState(false);
762
+ const typingEnabled = !disableTyping;
763
+ const skipCommitOnBlurRef = React3.useRef(false);
764
+ const anchorRef = React3.useRef(null);
765
+ const [anchorEl, setAnchorEl] = React3.useState(null);
766
+ const tf = slotProps?.textField ?? {};
767
+ const mergedDisabled = disabled ?? tf.disabled;
768
+ const mergedRequired = Boolean(tf.required);
769
+ const mergedError = Boolean(tf.error);
770
+ const helperText = tf.helperText;
771
+ const commit = (next) => {
772
+ if (!isControlled) setUncontrolled(next);
773
+ onChange?.(next);
774
+ return next;
775
+ };
776
+ React3.useEffect(() => {
777
+ if (!fieldFocused) setInputText(committedLabel);
778
+ }, [committedLabel, fieldFocused]);
779
+ const commitTypedInput = () => {
780
+ if (!typingEnabled) return;
781
+ const parsed = parseTimeInput(inputText, { ampm, anchor: value });
782
+ if (parsed === "invalid") {
783
+ setInputText(committedLabel);
784
+ return;
785
+ }
786
+ const next = commit(parsed);
787
+ setDraft(next);
788
+ setInputText(formatTimeLabel(next, displayFmt));
789
+ };
790
+ const openPicker = () => {
791
+ if (mergedDisabled) return;
792
+ setDraft(value);
793
+ setOpen(true);
794
+ };
795
+ const closePicker = () => {
796
+ setOpen(false);
797
+ };
798
+ const handleAccept = () => {
799
+ commit(draft);
800
+ setInputText(formatTimeLabel(draft, displayFmt));
801
+ closePicker();
802
+ };
803
+ const handleCancel = () => {
804
+ setDraft(value);
805
+ closePicker();
806
+ };
807
+ const handleClear = () => {
808
+ setDraft(null);
809
+ };
810
+ const clockViews = ampm ? ["hours", "minutes", "meridiem"] : ["hours", "minutes"];
811
+ return /* @__PURE__ */ jsx3(LocalizationProvider3, { dateAdapter: AdapterDayjs3, children: /* @__PURE__ */ jsxs3(default2, { sx: { display: "inline-flex", flexDirection: "column", ...sx || {} }, children: [
812
+ /* @__PURE__ */ jsx3(
813
+ default2,
814
+ {
815
+ ref: (el) => {
816
+ anchorRef.current = el;
817
+ setAnchorEl(el);
818
+ },
819
+ sx: { display: "inline-flex", minWidth: 200 },
820
+ children: /* @__PURE__ */ jsx3(
821
+ default12,
822
+ {
823
+ size: "small",
824
+ fullWidth: true,
825
+ label,
826
+ value: typingEnabled ? inputText : committedLabel,
827
+ placeholder: ampm ? "hh:mm aa" : "HH:mm",
828
+ disabled: mergedDisabled,
829
+ required: mergedRequired,
830
+ error: mergedError,
831
+ helperText,
832
+ onClick: typingEnabled ? void 0 : openPicker,
833
+ onFocus: () => {
834
+ if (typingEnabled) {
835
+ setFieldFocused(true);
836
+ } else {
837
+ openPicker();
838
+ }
839
+ },
840
+ onBlur: () => {
841
+ if (!typingEnabled) return;
842
+ setFieldFocused(false);
843
+ if (skipCommitOnBlurRef.current) {
844
+ skipCommitOnBlurRef.current = false;
845
+ setInputText(committedLabel);
846
+ return;
847
+ }
848
+ commitTypedInput();
849
+ },
850
+ onChange: (e) => {
851
+ if (!typingEnabled) return;
852
+ setInputText(e.target.value);
853
+ },
854
+ onKeyDown: (e) => {
855
+ if (!typingEnabled) return;
856
+ if (e.key === "Enter") {
857
+ e.preventDefault();
858
+ e.target.blur();
859
+ }
860
+ if (e.key === "Escape") {
861
+ e.preventDefault();
862
+ skipCommitOnBlurRef.current = true;
863
+ setInputText(committedLabel);
864
+ e.target.blur();
865
+ }
866
+ },
867
+ inputProps: {
868
+ readOnly: !typingEnabled,
869
+ "aria-label": label,
870
+ "data-testid": "time-field"
871
+ },
872
+ InputProps: {
873
+ endAdornment: /* @__PURE__ */ jsx3(InputAdornment3, { position: "end", children: /* @__PURE__ */ jsx3(
874
+ IconButton_default,
875
+ {
876
+ size: "small",
877
+ disabled: mergedDisabled,
878
+ "aria-label": "Choose time",
879
+ title: "Choose time",
880
+ ...slotProps?.openPickerIcon,
881
+ onMouseDown: (e) => {
882
+ e.preventDefault();
883
+ },
884
+ onClick: (e) => {
885
+ e.stopPropagation();
886
+ if (open) closePicker();
887
+ else openPicker();
888
+ },
889
+ children: /* @__PURE__ */ jsx3(AccessTimeIcon, { fontSize: "small" })
890
+ }
891
+ ) })
892
+ }
893
+ }
894
+ )
895
+ }
896
+ ),
897
+ /* @__PURE__ */ jsx3(
898
+ default4,
899
+ {
900
+ open,
901
+ anchorEl,
902
+ placement: "bottom-start",
903
+ style: { zIndex: 1300 },
904
+ children: /* @__PURE__ */ jsx3(default3, { onClickAway: handleCancel, children: /* @__PURE__ */ jsxs3(
905
+ MuiPaper,
906
+ {
907
+ elevation: 0,
908
+ sx: {
909
+ mt: 1,
910
+ borderRadius: "20px",
911
+ background: "var(--mui-palette-background-default)",
912
+ border: "solid 1px var(--mui-palette-border-1)",
913
+ overflow: "hidden"
914
+ },
915
+ children: [
916
+ /* @__PURE__ */ jsx3(default2, { sx: { px: 1, pt: 1 }, children: /* @__PURE__ */ jsx3(
917
+ MultiSectionDigitalClock2,
918
+ {
919
+ ampm,
920
+ value: draft,
921
+ onChange: (v) => setDraft(v ? dayjs3(v) : null),
922
+ views: [...clockViews]
923
+ }
924
+ ) }),
925
+ /* @__PURE__ */ jsxs3(DialogActions3, { sx: { px: 1.5, pb: 1, justifyContent: "flex-end", gap: 0.5 }, children: [
926
+ /* @__PURE__ */ jsx3(IconButton_default, { "data-testid": "clear-action-button", onClick: handleClear, title: "clear", children: /* @__PURE__ */ jsx3(default11, { fontSize: "small" }) }),
927
+ /* @__PURE__ */ jsx3(IconButton_default, { onClick: handleCancel, title: "cancel", children: /* @__PURE__ */ jsx3(default6, { fontSize: "small" }) }),
928
+ /* @__PURE__ */ jsx3(IconButton_default, { onClick: handleAccept, title: "accept", children: /* @__PURE__ */ jsx3(default5, { fontSize: "small" }) })
929
+ ] })
930
+ ]
931
+ }
932
+ ) })
933
+ }
934
+ )
935
+ ] }) });
936
+ };
937
+ var MuiXTimePicker_default = MuiXTimePicker;
938
+
939
+ // src/components/elemental/DatePicker/src/MuiXDateRangePicker.tsx
940
+ import React4 from "react";
941
+ import dayjs4 from "dayjs";
942
+ import customParseFormat4 from "dayjs/plugin/customParseFormat";
943
+ import { LocalizationProvider as LocalizationProvider4 } from "@mui/x-date-pickers/LocalizationProvider";
944
+ import { AdapterDayjs as AdapterDayjs4 } from "@mui/x-date-pickers/AdapterDayjs";
945
+ import { DateCalendar as DateCalendar3 } from "@mui/x-date-pickers/DateCalendar";
946
+ import { PickersDay } from "@mui/x-date-pickers/PickersDay";
947
+ import DialogActions4 from "@mui/material/DialogActions";
948
+ import InputAdornment4 from "@mui/material/InputAdornment";
949
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
950
+ dayjs4.extend(customParseFormat4);
951
+ var EMPTY = { start: null, end: null };
952
+ var toDayjs4 = (d) => d ? dayjs4(d) : null;
953
+ var toDate = (d) => {
954
+ if (!d) return null;
955
+ return typeof d.toDate === "function" ? d.toDate() : d;
956
+ };
957
+ var orderRange = (next) => {
958
+ if (next.start && next.end && next.start.getTime() > next.end.getTime()) {
959
+ return { start: next.end, end: next.start };
960
+ }
961
+ return next;
962
+ };
963
+ var DISPLAY_DATE_FMT2 = "MMM D, YYYY";
964
+ var formatDay = (d) => d ? dayjs4(d).format(DISPLAY_DATE_FMT2) : "";
965
+ var formatRangeLabel = (v, startLabel, endLabel) => {
966
+ const s = formatDay(v.start);
967
+ const e = formatDay(v.end);
968
+ if (s && e) return `${s} \u2013 ${e}`;
969
+ if (s) return `${s} \u2013 ${endLabel}`;
970
+ if (e) return `${startLabel} \u2013 ${e}`;
971
+ return "";
972
+ };
973
+ var DATE_PARSE_FORMATS3 = [
974
+ DISPLAY_DATE_FMT2,
975
+ "YYYY-MM-DD",
976
+ "M/D/YYYY",
977
+ "MM/DD/YYYY",
978
+ "D MMM YYYY",
979
+ "MMM D YYYY",
980
+ "YYYY/MM/DD"
981
+ ];
982
+ var parseOneDate = (raw) => {
983
+ const t = raw.trim();
984
+ if (!t) return null;
985
+ for (const fmt of DATE_PARSE_FORMATS3) {
986
+ const d = dayjs4(t, fmt, true);
987
+ if (d.isValid()) return d.startOf("day").toDate();
988
+ }
989
+ const loose = dayjs4(t);
990
+ if (loose.isValid()) return loose.startOf("day").toDate();
991
+ return "invalid";
992
+ };
993
+ var splitRangeHalves = (raw) => {
994
+ const s = raw.trim();
995
+ if (!s) return null;
996
+ if (s.includes("\u2013")) {
997
+ const i = s.indexOf("\u2013");
998
+ return [s.slice(0, i), s.slice(i + "\u2013".length)];
999
+ }
1000
+ const toParts = s.split(/\s+to\s+/i);
1001
+ if (toParts.length === 2) return [toParts[0], toParts[1]];
1002
+ for (const sep of [" - ", " / "]) {
1003
+ if (s.includes(sep)) {
1004
+ const i = s.indexOf(sep);
1005
+ return [s.slice(0, i), s.slice(i + sep.length)];
1006
+ }
1007
+ }
1008
+ const isoSlash = s.match(/^(\d{4}-\d{2}-\d{2})\s*\/\s*(\d{4}-\d{2}-\d{2})$/);
1009
+ if (isoSlash) return [isoSlash[1], isoSlash[2]];
1010
+ const isoHyphen = s.match(/^(\d{4}-\d{2}-\d{2})\s*-\s*(\d{4}-\d{2}-\d{2})$/);
1011
+ if (isoHyphen) return [isoHyphen[1], isoHyphen[2]];
1012
+ return null;
1013
+ };
1014
+ var isLabelPlaceholder = (part, label) => {
1015
+ const t = part.trim();
1016
+ return !t || t.toLowerCase() === label.trim().toLowerCase();
1017
+ };
1018
+ var parseRangeInput = (raw, startLabel, endLabel) => {
1019
+ const trimmed = raw.trim();
1020
+ if (!trimmed) return EMPTY;
1021
+ const halves = splitRangeHalves(trimmed);
1022
+ if (!halves) {
1023
+ if (isLabelPlaceholder(trimmed, startLabel) || isLabelPlaceholder(trimmed, endLabel)) {
1024
+ return EMPTY;
1025
+ }
1026
+ const one = parseOneDate(trimmed);
1027
+ if (one === "invalid") return null;
1028
+ return { start: one, end: null };
1029
+ }
1030
+ const [a, b] = halves;
1031
+ let start;
1032
+ let end;
1033
+ if (isLabelPlaceholder(a, startLabel)) {
1034
+ start = null;
1035
+ } else {
1036
+ const p = parseOneDate(a);
1037
+ if (p === "invalid") return null;
1038
+ start = p;
1039
+ }
1040
+ if (isLabelPlaceholder(b, endLabel)) {
1041
+ end = null;
1042
+ } else {
1043
+ const p = parseOneDate(b);
1044
+ if (p === "invalid") return null;
1045
+ end = p;
1046
+ }
1047
+ return orderRange({ start, end });
1048
+ };
1049
+ var formatDefaultEndorsement = (start, end, unit = "nights") => {
1050
+ const nights = Math.max(0, dayjs4(end).startOf("day").diff(dayjs4(start).startOf("day"), "day"));
1051
+ if (unit === "days") {
1052
+ const days = nights + 1;
1053
+ return days === 1 ? "1 day" : `${days} days`;
1054
+ }
1055
+ return nights === 1 ? "1 night" : `${nights} nights`;
1056
+ };
1057
+ var resolveEndorsementLabel = (start, end, showEndorsement, endorsement, endorsementUnit = "nights") => {
1058
+ if (!start || !end) return null;
1059
+ if (showEndorsement === false) return null;
1060
+ if (typeof endorsement === "string") return endorsement;
1061
+ if (typeof endorsement === "function") return endorsement({ start, end });
1062
+ return formatDefaultEndorsement(start, end, endorsementUnit);
1063
+ };
1064
+ var endorsementChipSx = {
1065
+ height: 22,
1066
+ mr: 0.5,
1067
+ maxWidth: 140,
1068
+ borderColor: "var(--mui-palette-border-1)",
1069
+ backgroundColor: "var(--mui-palette-focus-1)",
1070
+ color: "text.secondary",
1071
+ fontWeight: 500,
1072
+ fontSize: "0.75rem",
1073
+ "& .MuiChip-label": { px: 1, overflow: "hidden", textOverflow: "ellipsis" }
1074
+ };
1075
+ var dayStart = (d) => d.startOf("day");
1076
+ var isSameDay = (a, b) => !!(a && b && a.isSame(b, "day"));
1077
+ var isBetween = (day, start, end) => {
1078
+ const t = dayStart(day).valueOf();
1079
+ const a = dayStart(start).valueOf();
1080
+ const b = dayStart(end).valueOf();
1081
+ const lo = Math.min(a, b);
1082
+ const hi = Math.max(a, b);
1083
+ return t > lo && t < hi;
1084
+ };
1085
+ var RANGE_TEXT = "var(--mui-palette-error-main)";
1086
+ var RANGE_FILL = "var(--mui-palette-focus-1)";
1087
+ var RANGE_FILL_HOVER = "var(--mui-palette-focus-1-hover)";
1088
+ var RANGE_QUIET_BORDER = "var(--mui-palette-border-1)";
1089
+ var rangeDayFillSx = (isEndpoint, isHoveredCell) => ({
1090
+ color: RANGE_TEXT,
1091
+ // Hovered cell (preview end under cursor) gets the stronger wash; others stay focus-1.
1092
+ backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL,
1093
+ fontWeight: isEndpoint ? 600 : void 0,
1094
+ // Soft quiet ring on the day under cursor — readable, no cream primary.
1095
+ ...isHoveredCell ? {
1096
+ boxShadow: `inset 0 0 0 1px ${RANGE_QUIET_BORDER}`
1097
+ } : {},
1098
+ // Per-cell :hover intensify only; focus/selected stay on shared tokens (no primary cream).
1099
+ "&:hover": {
1100
+ color: RANGE_TEXT,
1101
+ backgroundColor: RANGE_FILL_HOVER
1102
+ },
1103
+ "&:focus, &.Mui-focusVisible": {
1104
+ color: RANGE_TEXT,
1105
+ backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL
1106
+ },
1107
+ "&.Mui-selected, &.Mui-selected:hover, &.Mui-selected:focus": {
1108
+ color: RANGE_TEXT,
1109
+ backgroundColor: isHoveredCell ? RANGE_FILL_HOVER : RANGE_FILL,
1110
+ fontWeight: isEndpoint ? 600 : void 0
1111
+ }
1112
+ });
1113
+ var RangeDay = React4.forwardRef(function RangeDay2(props, ref) {
1114
+ const { rangeStart, rangeEnd, hoverDay, day, outsideCurrentMonth, sx, ...other } = props;
1115
+ const current = dayjs4(day);
1116
+ const previewEnd = rangeStart && !rangeEnd && hoverDay ? hoverDay : rangeEnd;
1117
+ const isStart = isSameDay(current, rangeStart);
1118
+ const isEnd = isSameDay(current, previewEnd) && !!(rangeEnd || rangeStart && hoverDay);
1119
+ const inBridge = !!rangeStart && !!previewEnd && isBetween(current, rangeStart, previewEnd);
1120
+ const isEndpoint = isStart || isEnd;
1121
+ const showRange = isEndpoint || inBridge;
1122
+ const isHoveredCell = !!hoverDay && isSameDay(current, hoverDay) && !outsideCurrentMonth;
1123
+ let radius = "50%";
1124
+ if (isStart && isEnd) {
1125
+ radius = "50%";
1126
+ } else if (isStart && previewEnd) {
1127
+ radius = "50% 0 0 50%";
1128
+ } else if (isEnd && rangeStart) {
1129
+ radius = "0 50% 50% 0";
1130
+ } else if (inBridge) {
1131
+ radius = 0;
1132
+ }
1133
+ return /* @__PURE__ */ jsx4(
1134
+ PickersDay,
1135
+ {
1136
+ ...other,
1137
+ ref,
1138
+ day,
1139
+ outsideCurrentMonth,
1140
+ selected: false,
1141
+ autoFocus: false,
1142
+ disableMargin: true,
1143
+ sx: [
1144
+ {
1145
+ fontSize: "0.8125rem",
1146
+ // Soft hover for ordinary (non-range) days — quiet focus wash, not primary cream.
1147
+ ...!showRange && !outsideCurrentMonth ? {
1148
+ "&:hover": {
1149
+ backgroundColor: RANGE_FILL
1150
+ }
1151
+ } : {},
1152
+ ...showRange && !outsideCurrentMonth ? {
1153
+ borderRadius: radius,
1154
+ ...rangeDayFillSx(isEndpoint, isHoveredCell)
1155
+ } : {}
1156
+ },
1157
+ ...Array.isArray(sx) ? sx : sx ? [sx] : []
1158
+ ]
1159
+ }
1160
+ );
1161
+ });
1162
+ var NAV_BTN_SLOT_PX = 30;
1163
+ var monthPaneLabelSx = {
1164
+ flex: 1,
1165
+ textAlign: "center",
1166
+ typography: "body1",
1167
+ fontWeight: 500,
1168
+ lineHeight: "40px",
1169
+ userSelect: "none",
1170
+ color: "text.primary"
1171
+ };
1172
+ var navBtnSlotSx = {
1173
+ width: NAV_BTN_SLOT_PX,
1174
+ flexShrink: 0
1175
+ };
1176
+ var NullCalendarHeader = () => null;
1177
+ var MuiXDateRangePicker = ({
1178
+ value: valueProp,
1179
+ defaultValue,
1180
+ onChange,
1181
+ label,
1182
+ startLabel = "Start",
1183
+ endLabel = "End",
1184
+ disabled,
1185
+ showEndorsement,
1186
+ endorsement,
1187
+ endorsementUnit = "nights",
1188
+ slotProps,
1189
+ sx,
1190
+ disableTyping = false
1191
+ }) => {
1192
+ const isControlled = valueProp !== void 0;
1193
+ const [uncontrolled, setUncontrolled] = React4.useState(
1194
+ defaultValue ?? EMPTY
1195
+ );
1196
+ const value = isControlled ? valueProp ?? EMPTY : uncontrolled;
1197
+ const [open, setOpen] = React4.useState(false);
1198
+ const [draft, setDraft] = React4.useState(value);
1199
+ const [selectingEnd, setSelectingEnd] = React4.useState(false);
1200
+ const [hoverDay, setHoverDay] = React4.useState(null);
1201
+ const [leftMonth, setLeftMonth] = React4.useState(
1202
+ () => toDayjs4(value.start) ?? toDayjs4(value.end) ?? dayjs4().startOf("month")
1203
+ );
1204
+ const committedLabel = formatRangeLabel(value, startLabel, endLabel);
1205
+ const [inputText, setInputText] = React4.useState(committedLabel);
1206
+ const [fieldFocused, setFieldFocused] = React4.useState(false);
1207
+ const typingEnabled = !disableTyping;
1208
+ const skipCommitOnBlurRef = React4.useRef(false);
1209
+ const anchorRef = React4.useRef(null);
1210
+ const [anchorEl, setAnchorEl] = React4.useState(null);
1211
+ const fieldLabel = label ?? `${startLabel} \u2013 ${endLabel}`;
1212
+ const startTf = slotProps?.start?.slotProps?.textField ?? {};
1213
+ const endTf = slotProps?.end?.slotProps?.textField ?? {};
1214
+ const mergedDisabled = disabled ?? slotProps?.start?.disabled ?? slotProps?.end?.disabled ?? startTf.disabled ?? endTf.disabled;
1215
+ const mergedRequired = Boolean(startTf.required || endTf.required);
1216
+ const mergedError = Boolean(startTf.error || endTf.error);
1217
+ const commit = (next) => {
1218
+ const ordered = orderRange(next);
1219
+ if (!isControlled) setUncontrolled(ordered);
1220
+ onChange?.(ordered);
1221
+ return ordered;
1222
+ };
1223
+ React4.useEffect(() => {
1224
+ if (!fieldFocused) setInputText(committedLabel);
1225
+ }, [committedLabel, fieldFocused]);
1226
+ const commitTypedInput = () => {
1227
+ if (!typingEnabled) return;
1228
+ const parsed = parseRangeInput(inputText, startLabel, endLabel);
1229
+ if (parsed === null) {
1230
+ setInputText(committedLabel);
1231
+ return;
1232
+ }
1233
+ const ordered = commit(parsed);
1234
+ setDraft(ordered);
1235
+ setSelectingEnd(Boolean(ordered.start && !ordered.end));
1236
+ setInputText(formatRangeLabel(ordered, startLabel, endLabel));
1237
+ };
1238
+ const openPicker = () => {
1239
+ if (mergedDisabled) return;
1240
+ setDraft(value);
1241
+ setSelectingEnd(Boolean(value.start && !value.end));
1242
+ setHoverDay(null);
1243
+ setLeftMonth(toDayjs4(value.start) ?? toDayjs4(value.end) ?? dayjs4().startOf("month"));
1244
+ setOpen(true);
1245
+ };
1246
+ const closePicker = () => {
1247
+ setOpen(false);
1248
+ setHoverDay(null);
1249
+ };
1250
+ const handleAccept = () => {
1251
+ commit(draft);
1252
+ closePicker();
1253
+ };
1254
+ const handleCancel = () => {
1255
+ setDraft(value);
1256
+ closePicker();
1257
+ };
1258
+ const handleClear = () => {
1259
+ setDraft(EMPTY);
1260
+ setSelectingEnd(false);
1261
+ setHoverDay(null);
1262
+ };
1263
+ const handleDayClick = (day) => {
1264
+ if (!day) return;
1265
+ const picked = toDate(day);
1266
+ if (!selectingEnd || !draft.start) {
1267
+ setDraft({ start: picked, end: null });
1268
+ setSelectingEnd(true);
1269
+ setHoverDay(null);
1270
+ return;
1271
+ }
1272
+ setDraft(orderRange({ start: draft.start, end: picked }));
1273
+ setSelectingEnd(false);
1274
+ setHoverDay(null);
1275
+ };
1276
+ const shiftMonths = (delta) => {
1277
+ setLeftMonth((m) => m.add(delta, "month").startOf("month"));
1278
+ };
1279
+ const rangeStart = toDayjs4(draft.start);
1280
+ const rangeEnd = toDayjs4(draft.end);
1281
+ const DaySlot = React4.useCallback(
1282
+ (dayProps) => /* @__PURE__ */ jsx4(
1283
+ RangeDay,
1284
+ {
1285
+ ...dayProps,
1286
+ rangeStart,
1287
+ rangeEnd,
1288
+ hoverDay: selectingEnd ? hoverDay : null,
1289
+ onMouseEnter: (event, d) => {
1290
+ dayProps.onMouseEnter?.(event, d);
1291
+ if (selectingEnd) setHoverDay(dayjs4(d));
1292
+ },
1293
+ onDaySelect: (d) => {
1294
+ handleDayClick(dayjs4(d));
1295
+ }
1296
+ }
1297
+ ),
1298
+ // handleDayClick closes over draft/selectingEnd; recreate when those change.
1299
+ // eslint-disable-next-line react-hooks/exhaustive-deps
1300
+ [rangeStart, rangeEnd, selectingEnd, hoverDay, draft.start]
1301
+ );
1302
+ const rightMonth = leftMonth.add(1, "month");
1303
+ const endorsementStart = open ? draft.start : value.start;
1304
+ const endorsementEnd = open ? selectingEnd && draft.start && hoverDay ? toDate(hoverDay) : selectingEnd ? null : draft.end : value.end;
1305
+ const endorsementLabel = resolveEndorsementLabel(
1306
+ endorsementStart,
1307
+ endorsementEnd,
1308
+ showEndorsement,
1309
+ endorsement,
1310
+ endorsementUnit
1311
+ );
1312
+ return /* @__PURE__ */ jsx4(LocalizationProvider4, { dateAdapter: AdapterDayjs4, children: /* @__PURE__ */ jsxs4(default2, { sx: { display: "inline-flex", flexDirection: "column", ...sx || {} }, children: [
1313
+ /* @__PURE__ */ jsx4(
1314
+ default2,
1315
+ {
1316
+ ref: (el) => {
1317
+ anchorRef.current = el;
1318
+ setAnchorEl(el);
1319
+ },
1320
+ sx: { display: "inline-flex", minWidth: 280 },
1321
+ children: /* @__PURE__ */ jsx4(
1322
+ default12,
1323
+ {
1324
+ size: "small",
1325
+ fullWidth: true,
1326
+ label: fieldLabel,
1327
+ value: typingEnabled ? inputText : committedLabel,
1328
+ placeholder: `${startLabel} \u2013 ${endLabel}`,
1329
+ disabled: mergedDisabled,
1330
+ required: mergedRequired,
1331
+ error: mergedError,
1332
+ onClick: typingEnabled ? void 0 : openPicker,
1333
+ onFocus: () => {
1334
+ if (typingEnabled) {
1335
+ setFieldFocused(true);
1336
+ } else {
1337
+ openPicker();
1338
+ }
1339
+ },
1340
+ onBlur: () => {
1341
+ if (!typingEnabled) return;
1342
+ setFieldFocused(false);
1343
+ if (skipCommitOnBlurRef.current) {
1344
+ skipCommitOnBlurRef.current = false;
1345
+ setInputText(committedLabel);
1346
+ return;
1347
+ }
1348
+ commitTypedInput();
1349
+ },
1350
+ onChange: (e) => {
1351
+ if (!typingEnabled) return;
1352
+ setInputText(e.target.value);
1353
+ },
1354
+ onKeyDown: (e) => {
1355
+ if (!typingEnabled) return;
1356
+ if (e.key === "Enter") {
1357
+ e.preventDefault();
1358
+ e.target.blur();
1359
+ }
1360
+ if (e.key === "Escape") {
1361
+ e.preventDefault();
1362
+ skipCommitOnBlurRef.current = true;
1363
+ setInputText(committedLabel);
1364
+ e.target.blur();
1365
+ }
1366
+ },
1367
+ inputProps: {
1368
+ readOnly: !typingEnabled,
1369
+ "aria-label": fieldLabel,
1370
+ "data-testid": "date-range-field"
1371
+ },
1372
+ InputProps: {
1373
+ endAdornment: /* @__PURE__ */ jsxs4(InputAdornment4, { position: "end", sx: { gap: 0.25 }, children: [
1374
+ endorsementLabel ? /* @__PURE__ */ jsx4(
1375
+ default2,
1376
+ {
1377
+ component: "span",
1378
+ onMouseDown: (e) => {
1379
+ e.preventDefault();
1380
+ e.stopPropagation();
1381
+ },
1382
+ onClick: (e) => {
1383
+ e.stopPropagation();
1384
+ openPicker();
1385
+ },
1386
+ sx: { display: "inline-flex", cursor: "pointer" },
1387
+ children: /* @__PURE__ */ jsx4(
1388
+ Chip,
1389
+ {
1390
+ size: "small",
1391
+ variant: "outlined",
1392
+ label: endorsementLabel,
1393
+ "data-testid": "date-range-endorsement",
1394
+ "aria-label": endorsementLabel,
1395
+ sx: endorsementChipSx
1396
+ }
1397
+ )
1398
+ }
1399
+ ) : null,
1400
+ /* @__PURE__ */ jsx4(
1401
+ IconButton_default,
1402
+ {
1403
+ size: "small",
1404
+ disabled: mergedDisabled,
1405
+ onClick: (e) => {
1406
+ e.stopPropagation();
1407
+ if (open) closePicker();
1408
+ else openPicker();
1409
+ },
1410
+ "aria-label": "Choose date range",
1411
+ title: "Choose date range",
1412
+ children: /* @__PURE__ */ jsx4(default9, { fontSize: "small" })
1413
+ }
1414
+ )
1415
+ ] })
1416
+ }
1417
+ }
1418
+ )
1419
+ }
1420
+ ),
1421
+ /* @__PURE__ */ jsx4(
1422
+ default4,
1423
+ {
1424
+ open,
1425
+ anchorEl,
1426
+ placement: "bottom-start",
1427
+ style: { zIndex: 1300 },
1428
+ children: /* @__PURE__ */ jsx4(default3, { onClickAway: handleCancel, children: /* @__PURE__ */ jsxs4(
1429
+ MuiPaper,
1430
+ {
1431
+ elevation: 0,
1432
+ sx: {
1433
+ mt: 1,
1434
+ borderRadius: "20px",
1435
+ background: "var(--mui-palette-background-default)",
1436
+ border: "solid 1px var(--mui-palette-border-1)",
1437
+ overflow: "hidden"
1438
+ },
1439
+ children: [
1440
+ /* @__PURE__ */ jsxs4(
1441
+ default2,
1442
+ {
1443
+ sx: {
1444
+ display: "flex",
1445
+ alignItems: "stretch",
1446
+ gap: 0,
1447
+ px: 1,
1448
+ pt: 1,
1449
+ flexWrap: { xs: "wrap", sm: "nowrap" }
1450
+ },
1451
+ children: [
1452
+ /* @__PURE__ */ jsxs4(default2, { sx: { width: 300 }, children: [
1453
+ /* @__PURE__ */ jsxs4(
1454
+ default2,
1455
+ {
1456
+ sx: {
1457
+ display: "flex",
1458
+ alignItems: "center",
1459
+ minHeight: 40,
1460
+ px: 0.5
1461
+ },
1462
+ children: [
1463
+ /* @__PURE__ */ jsx4(
1464
+ IconButton_default,
1465
+ {
1466
+ size: "small",
1467
+ onClick: () => shiftMonths(-1),
1468
+ "aria-label": "Previous month",
1469
+ title: "Previous month",
1470
+ children: /* @__PURE__ */ jsx4(default7, { fontSize: "small" })
1471
+ }
1472
+ ),
1473
+ /* @__PURE__ */ jsx4(default2, { sx: monthPaneLabelSx, "aria-live": "polite", children: leftMonth.format("MMMM YYYY") }),
1474
+ /* @__PURE__ */ jsx4(default2, { sx: navBtnSlotSx, "aria-hidden": true })
1475
+ ]
1476
+ }
1477
+ ),
1478
+ /* @__PURE__ */ jsx4(
1479
+ DateCalendar3,
1480
+ {
1481
+ value: null,
1482
+ referenceDate: leftMonth,
1483
+ onMonthChange: (m) => setLeftMonth(dayjs4(m).startOf("month")),
1484
+ showDaysOutsideCurrentMonth: true,
1485
+ slots: { day: DaySlot, calendarHeader: NullCalendarHeader },
1486
+ sx: { width: 300 }
1487
+ },
1488
+ leftMonth.format("YYYY-MM")
1489
+ )
1490
+ ] }),
1491
+ /* @__PURE__ */ jsx4(
1492
+ default2,
1493
+ {
1494
+ sx: {
1495
+ width: "1px",
1496
+ alignSelf: "stretch",
1497
+ bgcolor: "var(--mui-palette-border-1)",
1498
+ display: { xs: "none", sm: "block" }
1499
+ }
1500
+ }
1501
+ ),
1502
+ /* @__PURE__ */ jsxs4(default2, { sx: { width: 300 }, children: [
1503
+ /* @__PURE__ */ jsxs4(
1504
+ default2,
1505
+ {
1506
+ sx: {
1507
+ display: "flex",
1508
+ alignItems: "center",
1509
+ minHeight: 40,
1510
+ px: 0.5
1511
+ },
1512
+ children: [
1513
+ /* @__PURE__ */ jsx4(default2, { sx: navBtnSlotSx, "aria-hidden": true }),
1514
+ /* @__PURE__ */ jsx4(default2, { sx: monthPaneLabelSx, "aria-live": "polite", children: rightMonth.format("MMMM YYYY") }),
1515
+ /* @__PURE__ */ jsx4(
1516
+ IconButton_default,
1517
+ {
1518
+ size: "small",
1519
+ onClick: () => shiftMonths(1),
1520
+ "aria-label": "Next month",
1521
+ title: "Next month",
1522
+ children: /* @__PURE__ */ jsx4(default8, { fontSize: "small" })
1523
+ }
1524
+ )
1525
+ ]
1526
+ }
1527
+ ),
1528
+ /* @__PURE__ */ jsx4(
1529
+ DateCalendar3,
1530
+ {
1531
+ value: null,
1532
+ referenceDate: rightMonth,
1533
+ onMonthChange: (m) => setLeftMonth(dayjs4(m).subtract(1, "month").startOf("month")),
1534
+ showDaysOutsideCurrentMonth: true,
1535
+ slots: { day: DaySlot, calendarHeader: NullCalendarHeader },
1536
+ sx: { width: 300 }
1537
+ },
1538
+ rightMonth.format("YYYY-MM")
1539
+ )
1540
+ ] })
1541
+ ]
1542
+ }
1543
+ ),
1544
+ /* @__PURE__ */ jsxs4(DialogActions4, { sx: { px: 1.5, pb: 1, justifyContent: "flex-end", gap: 0.5 }, children: [
1545
+ /* @__PURE__ */ jsx4(IconButton_default, { "data-testid": "clear-action-button", onClick: handleClear, title: "clear", children: /* @__PURE__ */ jsx4(default11, { fontSize: "small" }) }),
1546
+ /* @__PURE__ */ jsx4(IconButton_default, { onClick: handleCancel, title: "cancel", children: /* @__PURE__ */ jsx4(default6, { fontSize: "small" }) }),
1547
+ /* @__PURE__ */ jsx4(IconButton_default, { onClick: handleAccept, title: "accept", children: /* @__PURE__ */ jsx4(default5, { fontSize: "small" }) })
1548
+ ] })
1549
+ ]
1550
+ }
1551
+ ) })
1552
+ }
1553
+ )
1554
+ ] }) });
1555
+ };
1556
+ var MuiXDateRangePicker_default = MuiXDateRangePicker;
1557
+
1558
+ // src/components/elemental/DatePicker/src/theme.ts
1559
+ var datePickerTheme = {
1560
+ defaultProps: {
1561
+ slotProps: {
1562
+ popper: {
1563
+ sx: {
1564
+ "& .MuiPaper-root": {
1565
+ borderRadius: "20px",
1566
+ background: "var(--mui-palette-background-default)",
1567
+ border: "solid 1px var(--mui-palette-border-1)"
1568
+ }
1569
+ }
1570
+ }
1571
+ }
1572
+ }
1573
+ };
1574
+ var dateTimePickerTheme = {
1575
+ defaultProps: {
1576
+ slotProps: {
1577
+ popper: {
1578
+ sx: {
1579
+ "& .MuiPaper-root": {
1580
+ borderRadius: "20px",
1581
+ background: "var(--mui-palette-background-default)",
1582
+ border: "solid 1px var(--mui-palette-border-1)"
1583
+ }
1584
+ }
1585
+ }
1586
+ }
1587
+ }
1588
+ };
1589
+ var timePickerTheme = {
1590
+ defaultProps: {
1591
+ slotProps: {
1592
+ popper: {
1593
+ sx: {
1594
+ "& .MuiPaper-root": {
1595
+ borderRadius: "20px",
1596
+ background: "var(--mui-palette-background-default)",
1597
+ border: "solid 1px var(--mui-palette-border-1)"
1598
+ }
1599
+ }
1600
+ }
1601
+ }
1602
+ }
1603
+ };
1604
+ var dateCalendarTheme = {
1605
+ defaultProps: {
1606
+ slotProps: {}
1607
+ },
1608
+ styleOverrides: {
1609
+ root: {
1610
+ borderRadius: "20px"
1611
+ }
1612
+ }
1613
+ };
1614
+ var pickersCalendarHeaderTheme = {
1615
+ defaultProps: {
1616
+ slotProps: {
1617
+ previousIconButton: { size: "small" },
1618
+ nextIconButton: { size: "small" },
1619
+ switchViewIcon: { fontSize: "small" }
1620
+ }
1621
+ },
1622
+ styleOverrides: {
1623
+ root: {},
1624
+ label: {}
1625
+ }
1626
+ };
1627
+ var pickersDayTheme = {
1628
+ defaultProps: {},
1629
+ styleOverrides: {
1630
+ root: {
1631
+ "&.Mui-selected.MuiButtonBase-root": {
1632
+ color: "var(--mui-palette-error-main)",
1633
+ backgroundColor: "var(--mui-palette-focus-1)",
1634
+ "&:hover": {
1635
+ backgroundColor: "var(--mui-palette-focus-1-hover)"
1636
+ }
1637
+ },
1638
+ "&.MuiPickersDay-today": {
1639
+ borderColor: "var(--mui-palette-focus-1)"
1640
+ }
1641
+ },
1642
+ dayOutsideMonth: {
1643
+ color: "var(--mui-palette-text-disabled)"
1644
+ }
1645
+ }
1646
+ };
1647
+ var multiSectionDigitalClockTheme = {
1648
+ defaultProps: {
1649
+ slotProps: {
1650
+ digitalClockSectionItem: {
1651
+ dense: true
1652
+ }
1653
+ }
1654
+ },
1655
+ styleOverrides: {
1656
+ root: {
1657
+ "&": { paddingRight: "4px" },
1658
+ "& .MuiMultiSectionDigitalClockSection-root": {
1659
+ scrollbarWidth: "inherit",
1660
+ "& .MuiMultiSectionDigitalClockSection-item, & li": {
1661
+ borderRadius: "var(--mui-shape-borderRadius)",
1662
+ position: "relative",
1663
+ overflow: "hidden",
1664
+ "&::before": {
1665
+ borderRadius: "var(--mui-shape-borderRadius)",
1666
+ content: "none",
1667
+ display: "none",
1668
+ backgroundColor: "transparent",
1669
+ width: 0,
1670
+ height: 0
1671
+ },
1672
+ "&.Mui-selected": {
1673
+ color: "var(--mui-palette-error-main)",
1674
+ backgroundColor: "var(--mui-palette-focus-1)",
1675
+ "&:hover, &:focus-visible": {
1676
+ backgroundColor: "var(--mui-palette-focus-1-hover)"
1677
+ },
1678
+ "&::before": {
1679
+ content: "none",
1680
+ display: "none",
1681
+ backgroundColor: "transparent"
1682
+ }
1683
+ }
1684
+ }
1685
+ }
1686
+ }
1687
+ }
1688
+ };
1689
+ var pickersInputBaseTheme = {
1690
+ styleOverrides: {
1691
+ root: {
1692
+ "&.Mui-focused:not(.Mui-error) fieldset.MuiPickersOutlinedInput-notchedOutline": {
1693
+ borderColor: "var(--mui-palette-text-secondary)"
1694
+ },
1695
+ "&.MuiPickersInputBase-root": {
1696
+ "& .MuiButtonBase-root": {
1697
+ "& > svg": {
1698
+ fontSize: "1.25rem"
1699
+ }
1700
+ }
1701
+ }
1702
+ }
1703
+ }
1704
+ };
1705
+
1706
+ export {
1707
+ MuiXDatePicker_default,
1708
+ MuiXDateTimePicker_default,
1709
+ MuiXTimePicker_default,
1710
+ MuiXDateRangePicker_default,
1711
+ datePickerTheme,
1712
+ dateTimePickerTheme,
1713
+ timePickerTheme,
1714
+ dateCalendarTheme,
1715
+ pickersCalendarHeaderTheme,
1716
+ pickersDayTheme,
1717
+ multiSectionDigitalClockTheme,
1718
+ pickersInputBaseTheme
1719
+ };
1720
+ //# sourceMappingURL=chunk-XAJAMVAG.mjs.map