@salt-ds/date-components 0.0.0-snapshot-20260330155807

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 (227) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +63 -0
  3. package/css/salt-date-components.css +633 -0
  4. package/dist-cjs/calendar/Calendar.css.js +6 -0
  5. package/dist-cjs/calendar/Calendar.css.js.map +1 -0
  6. package/dist-cjs/calendar/Calendar.js +154 -0
  7. package/dist-cjs/calendar/Calendar.js.map +1 -0
  8. package/dist-cjs/calendar/CalendarGrid.js +85 -0
  9. package/dist-cjs/calendar/CalendarGrid.js.map +1 -0
  10. package/dist-cjs/calendar/CalendarMonthHeader.css.js +6 -0
  11. package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +1 -0
  12. package/dist-cjs/calendar/CalendarMonthHeader.js +41 -0
  13. package/dist-cjs/calendar/CalendarMonthHeader.js.map +1 -0
  14. package/dist-cjs/calendar/CalendarNavigation.css.js +6 -0
  15. package/dist-cjs/calendar/CalendarNavigation.css.js.map +1 -0
  16. package/dist-cjs/calendar/CalendarNavigation.js +334 -0
  17. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -0
  18. package/dist-cjs/calendar/CalendarWeekHeader.css.js +6 -0
  19. package/dist-cjs/calendar/CalendarWeekHeader.css.js.map +1 -0
  20. package/dist-cjs/calendar/CalendarWeekHeader.js +46 -0
  21. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -0
  22. package/dist-cjs/calendar/internal/CalendarContext.js +23 -0
  23. package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -0
  24. package/dist-cjs/calendar/internal/CalendarDay.css.js +6 -0
  25. package/dist-cjs/calendar/internal/CalendarDay.css.js.map +1 -0
  26. package/dist-cjs/calendar/internal/CalendarDay.js +98 -0
  27. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -0
  28. package/dist-cjs/calendar/internal/CalendarMonth.css.js +6 -0
  29. package/dist-cjs/calendar/internal/CalendarMonth.css.js.map +1 -0
  30. package/dist-cjs/calendar/internal/CalendarMonth.js +81 -0
  31. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -0
  32. package/dist-cjs/calendar/internal/createAnnouncement.js +90 -0
  33. package/dist-cjs/calendar/internal/createAnnouncement.js.map +1 -0
  34. package/dist-cjs/calendar/internal/useFocusManagement.js +66 -0
  35. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -0
  36. package/dist-cjs/calendar/internal/utils.js +50 -0
  37. package/dist-cjs/calendar/internal/utils.js.map +1 -0
  38. package/dist-cjs/calendar/useCalendar.js +464 -0
  39. package/dist-cjs/calendar/useCalendar.js.map +1 -0
  40. package/dist-cjs/calendar/useCalendarDay.js +84 -0
  41. package/dist-cjs/calendar/useCalendarDay.js.map +1 -0
  42. package/dist-cjs/calendar/useCalendarSelection.js +353 -0
  43. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -0
  44. package/dist-cjs/calendar/useDateSelectionAnnouncer.js +52 -0
  45. package/dist-cjs/calendar/useDateSelectionAnnouncer.js.map +1 -0
  46. package/dist-cjs/date-input/DateInput.css.js +6 -0
  47. package/dist-cjs/date-input/DateInput.css.js.map +1 -0
  48. package/dist-cjs/date-input/DateInputRange.js +353 -0
  49. package/dist-cjs/date-input/DateInputRange.js.map +1 -0
  50. package/dist-cjs/date-input/DateInputSingle.js +237 -0
  51. package/dist-cjs/date-input/DateInputSingle.js.map +1 -0
  52. package/dist-cjs/date-picker/DatePicker.js +83 -0
  53. package/dist-cjs/date-picker/DatePicker.js.map +1 -0
  54. package/dist-cjs/date-picker/DatePickerActions.css.js +6 -0
  55. package/dist-cjs/date-picker/DatePickerActions.css.js.map +1 -0
  56. package/dist-cjs/date-picker/DatePickerActions.js +119 -0
  57. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -0
  58. package/dist-cjs/date-picker/DatePickerContext.js +36 -0
  59. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -0
  60. package/dist-cjs/date-picker/DatePickerHelperText.css.js +6 -0
  61. package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +1 -0
  62. package/dist-cjs/date-picker/DatePickerHelperText.js +36 -0
  63. package/dist-cjs/date-picker/DatePickerHelperText.js.map +1 -0
  64. package/dist-cjs/date-picker/DatePickerOverlay.css.js +6 -0
  65. package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +1 -0
  66. package/dist-cjs/date-picker/DatePickerOverlay.js +49 -0
  67. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -0
  68. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +164 -0
  69. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -0
  70. package/dist-cjs/date-picker/DatePickerPanel.css.js +6 -0
  71. package/dist-cjs/date-picker/DatePickerPanel.css.js.map +1 -0
  72. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +250 -0
  73. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  74. package/dist-cjs/date-picker/DatePickerRangeInput.js +206 -0
  75. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -0
  76. package/dist-cjs/date-picker/DatePickerRangePanel.js +365 -0
  77. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -0
  78. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +262 -0
  79. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  80. package/dist-cjs/date-picker/DatePickerSingleInput.js +150 -0
  81. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -0
  82. package/dist-cjs/date-picker/DatePickerSinglePanel.js +20 -0
  83. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -0
  84. package/dist-cjs/date-picker/DatePickerTrigger.js +32 -0
  85. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -0
  86. package/dist-cjs/date-picker/useDatePicker.js +222 -0
  87. package/dist-cjs/date-picker/useDatePicker.js.map +1 -0
  88. package/dist-cjs/date-picker/useFocusOut.js +43 -0
  89. package/dist-cjs/date-picker/useFocusOut.js.map +1 -0
  90. package/dist-cjs/date-picker/useKeyboard.js +22 -0
  91. package/dist-cjs/date-picker/useKeyboard.js.map +1 -0
  92. package/dist-cjs/index.js +64 -0
  93. package/dist-cjs/index.js.map +1 -0
  94. package/dist-cjs/localization-provider/LocalizationProvider.js +51 -0
  95. package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -0
  96. package/dist-es/calendar/Calendar.css.js +4 -0
  97. package/dist-es/calendar/Calendar.css.js.map +1 -0
  98. package/dist-es/calendar/Calendar.js +152 -0
  99. package/dist-es/calendar/Calendar.js.map +1 -0
  100. package/dist-es/calendar/CalendarGrid.js +83 -0
  101. package/dist-es/calendar/CalendarGrid.js.map +1 -0
  102. package/dist-es/calendar/CalendarMonthHeader.css.js +4 -0
  103. package/dist-es/calendar/CalendarMonthHeader.css.js.map +1 -0
  104. package/dist-es/calendar/CalendarMonthHeader.js +39 -0
  105. package/dist-es/calendar/CalendarMonthHeader.js.map +1 -0
  106. package/dist-es/calendar/CalendarNavigation.css.js +4 -0
  107. package/dist-es/calendar/CalendarNavigation.css.js.map +1 -0
  108. package/dist-es/calendar/CalendarNavigation.js +332 -0
  109. package/dist-es/calendar/CalendarNavigation.js.map +1 -0
  110. package/dist-es/calendar/CalendarWeekHeader.css.js +4 -0
  111. package/dist-es/calendar/CalendarWeekHeader.css.js.map +1 -0
  112. package/dist-es/calendar/CalendarWeekHeader.js +44 -0
  113. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -0
  114. package/dist-es/calendar/internal/CalendarContext.js +20 -0
  115. package/dist-es/calendar/internal/CalendarContext.js.map +1 -0
  116. package/dist-es/calendar/internal/CalendarDay.css.js +4 -0
  117. package/dist-es/calendar/internal/CalendarDay.css.js.map +1 -0
  118. package/dist-es/calendar/internal/CalendarDay.js +96 -0
  119. package/dist-es/calendar/internal/CalendarDay.js.map +1 -0
  120. package/dist-es/calendar/internal/CalendarMonth.css.js +4 -0
  121. package/dist-es/calendar/internal/CalendarMonth.css.js.map +1 -0
  122. package/dist-es/calendar/internal/CalendarMonth.js +79 -0
  123. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -0
  124. package/dist-es/calendar/internal/createAnnouncement.js +87 -0
  125. package/dist-es/calendar/internal/createAnnouncement.js.map +1 -0
  126. package/dist-es/calendar/internal/useFocusManagement.js +64 -0
  127. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -0
  128. package/dist-es/calendar/internal/utils.js +44 -0
  129. package/dist-es/calendar/internal/utils.js.map +1 -0
  130. package/dist-es/calendar/useCalendar.js +462 -0
  131. package/dist-es/calendar/useCalendar.js.map +1 -0
  132. package/dist-es/calendar/useCalendarDay.js +82 -0
  133. package/dist-es/calendar/useCalendarDay.js.map +1 -0
  134. package/dist-es/calendar/useCalendarSelection.js +349 -0
  135. package/dist-es/calendar/useCalendarSelection.js.map +1 -0
  136. package/dist-es/calendar/useDateSelectionAnnouncer.js +50 -0
  137. package/dist-es/calendar/useDateSelectionAnnouncer.js.map +1 -0
  138. package/dist-es/date-input/DateInput.css.js +4 -0
  139. package/dist-es/date-input/DateInput.css.js.map +1 -0
  140. package/dist-es/date-input/DateInputRange.js +350 -0
  141. package/dist-es/date-input/DateInputRange.js.map +1 -0
  142. package/dist-es/date-input/DateInputSingle.js +235 -0
  143. package/dist-es/date-input/DateInputSingle.js.map +1 -0
  144. package/dist-es/date-picker/DatePicker.js +80 -0
  145. package/dist-es/date-picker/DatePicker.js.map +1 -0
  146. package/dist-es/date-picker/DatePickerActions.css.js +4 -0
  147. package/dist-es/date-picker/DatePickerActions.css.js.map +1 -0
  148. package/dist-es/date-picker/DatePickerActions.js +117 -0
  149. package/dist-es/date-picker/DatePickerActions.js.map +1 -0
  150. package/dist-es/date-picker/DatePickerContext.js +32 -0
  151. package/dist-es/date-picker/DatePickerContext.js.map +1 -0
  152. package/dist-es/date-picker/DatePickerHelperText.css.js +4 -0
  153. package/dist-es/date-picker/DatePickerHelperText.css.js.map +1 -0
  154. package/dist-es/date-picker/DatePickerHelperText.js +34 -0
  155. package/dist-es/date-picker/DatePickerHelperText.js.map +1 -0
  156. package/dist-es/date-picker/DatePickerOverlay.css.js +4 -0
  157. package/dist-es/date-picker/DatePickerOverlay.css.js.map +1 -0
  158. package/dist-es/date-picker/DatePickerOverlay.js +47 -0
  159. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -0
  160. package/dist-es/date-picker/DatePickerOverlayProvider.js +161 -0
  161. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -0
  162. package/dist-es/date-picker/DatePickerPanel.css.js +4 -0
  163. package/dist-es/date-picker/DatePickerPanel.css.js.map +1 -0
  164. package/dist-es/date-picker/DatePickerRangeGridPanel.js +248 -0
  165. package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -0
  166. package/dist-es/date-picker/DatePickerRangeInput.js +203 -0
  167. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -0
  168. package/dist-es/date-picker/DatePickerRangePanel.js +363 -0
  169. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -0
  170. package/dist-es/date-picker/DatePickerSingleGridPanel.js +260 -0
  171. package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -0
  172. package/dist-es/date-picker/DatePickerSingleInput.js +148 -0
  173. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -0
  174. package/dist-es/date-picker/DatePickerSinglePanel.js +18 -0
  175. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -0
  176. package/dist-es/date-picker/DatePickerTrigger.js +30 -0
  177. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -0
  178. package/dist-es/date-picker/useDatePicker.js +220 -0
  179. package/dist-es/date-picker/useDatePicker.js.map +1 -0
  180. package/dist-es/date-picker/useFocusOut.js +41 -0
  181. package/dist-es/date-picker/useFocusOut.js.map +1 -0
  182. package/dist-es/date-picker/useKeyboard.js +20 -0
  183. package/dist-es/date-picker/useKeyboard.js.map +1 -0
  184. package/dist-es/index.js +25 -0
  185. package/dist-es/index.js.map +1 -0
  186. package/dist-es/localization-provider/LocalizationProvider.js +47 -0
  187. package/dist-es/localization-provider/LocalizationProvider.js.map +1 -0
  188. package/dist-types/calendar/Calendar.d.ts +105 -0
  189. package/dist-types/calendar/CalendarGrid.d.ts +27 -0
  190. package/dist-types/calendar/CalendarMonthHeader.d.ts +17 -0
  191. package/dist-types/calendar/CalendarNavigation.d.ts +43 -0
  192. package/dist-types/calendar/CalendarWeekHeader.d.ts +6 -0
  193. package/dist-types/calendar/index.d.ts +9 -0
  194. package/dist-types/calendar/internal/CalendarContext.d.ts +6 -0
  195. package/dist-types/calendar/internal/CalendarDay.d.ts +33 -0
  196. package/dist-types/calendar/internal/CalendarMonth.d.ts +14 -0
  197. package/dist-types/calendar/internal/createAnnouncement.d.ts +24 -0
  198. package/dist-types/calendar/internal/useFocusManagement.d.ts +9 -0
  199. package/dist-types/calendar/internal/utils.d.ts +6 -0
  200. package/dist-types/calendar/useCalendar.d.ts +335 -0
  201. package/dist-types/calendar/useCalendarDay.d.ts +67 -0
  202. package/dist-types/calendar/useCalendarSelection.d.ts +145 -0
  203. package/dist-types/calendar/useDateSelectionAnnouncer.d.ts +6 -0
  204. package/dist-types/date-input/DateInputRange.d.ts +131 -0
  205. package/dist-types/date-input/DateInputSingle.d.ts +99 -0
  206. package/dist-types/date-input/index.d.ts +2 -0
  207. package/dist-types/date-picker/DatePicker.d.ts +52 -0
  208. package/dist-types/date-picker/DatePickerActions.d.ts +79 -0
  209. package/dist-types/date-picker/DatePickerContext.d.ts +172 -0
  210. package/dist-types/date-picker/DatePickerHelperText.d.ts +4 -0
  211. package/dist-types/date-picker/DatePickerOverlay.d.ts +11 -0
  212. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +106 -0
  213. package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +14 -0
  214. package/dist-types/date-picker/DatePickerRangeInput.d.ts +17 -0
  215. package/dist-types/date-picker/DatePickerRangePanel.d.ts +83 -0
  216. package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +63 -0
  217. package/dist-types/date-picker/DatePickerSingleInput.d.ts +15 -0
  218. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +8 -0
  219. package/dist-types/date-picker/DatePickerTrigger.d.ts +9 -0
  220. package/dist-types/date-picker/index.d.ts +13 -0
  221. package/dist-types/date-picker/useDatePicker.d.ts +121 -0
  222. package/dist-types/date-picker/useFocusOut.d.ts +9 -0
  223. package/dist-types/date-picker/useKeyboard.d.ts +20 -0
  224. package/dist-types/index.d.ts +4 -0
  225. package/dist-types/localization-provider/LocalizationProvider.d.ts +62 -0
  226. package/dist-types/localization-provider/index.d.ts +1 -0
  227. package/package.json +60 -0
@@ -0,0 +1,353 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var clsx = require('clsx');
8
+ var react = require('react');
9
+ var LocalizationProvider = require('../localization-provider/LocalizationProvider.js');
10
+ var DateInput = require('./DateInput.css.js');
11
+
12
+ const withBaseName = core.makePrefixer("saltDateInput");
13
+ var DateParserField = /* @__PURE__ */ ((DateParserField2) => {
14
+ DateParserField2["START"] = "start";
15
+ DateParserField2["END"] = "end";
16
+ return DateParserField2;
17
+ })(DateParserField || {});
18
+ const DateInputRange = react.forwardRef(
19
+ (props, ref) => {
20
+ const { dateAdapter } = LocalizationProvider.useLocalization();
21
+ const {
22
+ "aria-label": ariaLabel,
23
+ bordered = false,
24
+ className,
25
+ disabled,
26
+ date: dateProp,
27
+ defaultDate,
28
+ onDateChange,
29
+ value: valueProp,
30
+ format = "DD MMM YYYY",
31
+ defaultValue = {
32
+ startDate: "",
33
+ endDate: ""
34
+ },
35
+ onChange,
36
+ onDateValueChange,
37
+ onMouseDown,
38
+ emptyReadOnlyMarker = "\u2014",
39
+ endAdornment,
40
+ startInputProps = {},
41
+ endInputProps = {},
42
+ startInputRef: startInputRefProp,
43
+ endInputRef: endInputRefProp,
44
+ parse: parseProp,
45
+ placeholder = format.toLowerCase(),
46
+ readOnly: readOnlyProp,
47
+ validationStatus: validationStatusProp,
48
+ variant = "primary",
49
+ timezone = (dateProp == null ? void 0 : dateProp.startDate) || (defaultDate == null ? void 0 : defaultDate.startDate) ? dateAdapter.getTimezone(
50
+ (dateProp == null ? void 0 : dateProp.startDate) ?? (defaultDate == null ? void 0 : defaultDate.startDate)
51
+ ) : "default",
52
+ ...rest
53
+ } = props;
54
+ const wrapperRef = react.useRef(null);
55
+ const handleWrapperRef = core.useForkRef(ref, wrapperRef);
56
+ const startInputRef = react.useRef(null);
57
+ const handleStartInputRef = core.useForkRef(startInputRef, startInputRefProp);
58
+ const endInputRef = react.useRef(null);
59
+ const handleEndInputRef = core.useForkRef(endInputRef, endInputRefProp);
60
+ const startInputID = core.useId(startInputProps.id);
61
+ const endInputID = core.useId(endInputProps.id);
62
+ const targetWindow = window.useWindow();
63
+ styles.useComponentCssInjection({
64
+ testId: "salt-date-input-range",
65
+ css: DateInput,
66
+ window: targetWindow
67
+ });
68
+ const parseDateValue = (dateValue2, field) => parseProp ? parseProp(dateValue2 ?? "", field, format) : dateAdapter.parse.bind(dateAdapter)(dateValue2 ?? "", format);
69
+ const [dateValue, setDateValue] = core.useControlled({
70
+ controlled: valueProp,
71
+ default: defaultValue,
72
+ name: "DateInputRange",
73
+ state: "dateValue"
74
+ });
75
+ const [date, setDate] = core.useControlled({
76
+ controlled: dateProp,
77
+ // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount
78
+ default: react.useMemo(() => {
79
+ if (defaultDate) {
80
+ return defaultDate;
81
+ }
82
+ if (!defaultValue) {
83
+ return void 0;
84
+ }
85
+ const { date: startDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.startDate, "start" /* START */) ?? {};
86
+ const { date: endDate = void 0 } = parseDateValue(defaultValue == null ? void 0 : defaultValue.endDate, "end" /* END */) ?? {};
87
+ return {
88
+ startDate,
89
+ endDate
90
+ };
91
+ }, []),
92
+ name: "DateInputRange",
93
+ state: "date"
94
+ });
95
+ const lastAppliedValue = react.useRef(dateValue);
96
+ const preservedTime = react.useRef({ startTime: null, endTime: null });
97
+ preservedTime.current = {
98
+ startTime: (date == null ? void 0 : date.startDate) && dateAdapter.isValid(date == null ? void 0 : date.startDate) ? dateAdapter.getTime(date.startDate) : null,
99
+ endTime: (date == null ? void 0 : date.endDate) && dateAdapter.isValid(date == null ? void 0 : date.endDate) ? dateAdapter.getTime(date.endDate) : null
100
+ };
101
+ const setDateValueFromDate = (newDate) => {
102
+ let newDateValue = { startDate: "", endDate: "" };
103
+ if (!(newDate == null ? void 0 : newDate.startDate)) {
104
+ newDateValue = { ...newDateValue, startDate: "" };
105
+ } else if (!dateAdapter.isValid(newDate == null ? void 0 : newDate.startDate)) {
106
+ newDateValue = {
107
+ ...newDateValue,
108
+ startDate: (dateValue == null ? void 0 : dateValue.startDate) ?? ""
109
+ };
110
+ } else if (newDate == null ? void 0 : newDate.startDate) {
111
+ const formattedStartDateValue = dateAdapter.format(
112
+ newDate.startDate,
113
+ format
114
+ );
115
+ newDateValue = { ...newDateValue, startDate: formattedStartDateValue };
116
+ }
117
+ if (!(newDate == null ? void 0 : newDate.endDate)) {
118
+ newDateValue = { ...newDateValue, endDate: "" };
119
+ } else if (!dateAdapter.isValid(newDate == null ? void 0 : newDate.endDate)) {
120
+ newDateValue = { ...newDateValue, endDate: (dateValue == null ? void 0 : dateValue.endDate) ?? "" };
121
+ } else if ((newDate == null ? void 0 : newDate.endDate) && dateAdapter.isValid(newDate.endDate)) {
122
+ const formattedEndDateValue = dateAdapter.format(
123
+ newDate.endDate,
124
+ format
125
+ );
126
+ newDateValue = { ...newDateValue, endDate: formattedEndDateValue };
127
+ }
128
+ if (!(newDateValue == null ? void 0 : newDateValue.startDate) && !!(dateValue == null ? void 0 : dateValue.startDate) || !newDateValue.endDate && !!(dateValue == null ? void 0 : dateValue.endDate) || (newDateValue == null ? void 0 : newDateValue.startDate) !== (dateValue == null ? void 0 : dateValue.startDate) || (newDateValue == null ? void 0 : newDateValue.endDate) !== (dateValue == null ? void 0 : dateValue.endDate)) {
129
+ onDateValueChange == null ? void 0 : onDateValueChange(null, newDateValue);
130
+ setDateValue(newDateValue);
131
+ }
132
+ return newDateValue;
133
+ };
134
+ react.useEffect(() => {
135
+ lastAppliedValue.current = setDateValueFromDate(date);
136
+ }, [date, date == null ? void 0 : date.startDate, date == null ? void 0 : date.endDate, dateAdapter.format, format]);
137
+ const [focused, setFocused] = react.useState(false);
138
+ const {
139
+ a11yProps: {
140
+ "aria-describedby": formFieldDescribedBy,
141
+ "aria-labelledby": formFieldLabelledBy
142
+ } = {},
143
+ disabled: formFieldDisabled,
144
+ readOnly: formFieldReadOnly,
145
+ necessity: formFieldRequired,
146
+ validationStatus: formFieldValidationStatus
147
+ } = core.useFormFieldProps();
148
+ const isReadOnly = readOnlyProp || formFieldReadOnly;
149
+ const isDisabled = disabled || formFieldDisabled;
150
+ const validationStatus = formFieldValidationStatus ?? validationStatusProp;
151
+ const {
152
+ "aria-describedby": startInputPropsDescribedBy,
153
+ "aria-labelledby": startInputPropsLabelledBy,
154
+ onBlur: startInputPropsOnBlur,
155
+ onChange: startInputPropsOnChange,
156
+ onKeyDown: startInputPropsOnKeyDown,
157
+ onFocus: startInputPropsOnFocus,
158
+ required: startInputPropsRequired,
159
+ ...restStartInputProps
160
+ } = startInputProps;
161
+ const startInputIsRequired = formFieldRequired ? ["required", "asterisk"].includes(formFieldRequired) : startInputPropsRequired;
162
+ const {
163
+ "aria-describedby": endInputPropsDescribedBy,
164
+ "aria-labelledby": endInputPropsLabelledBy,
165
+ onBlur: endInputPropsOnBlur,
166
+ onChange: endInputPropsOnChange,
167
+ onKeyDown: endInputPropsOnKeyDown,
168
+ onFocus: endInputPropsOnFocus,
169
+ required: endInputPropsRequired,
170
+ ...restEndInputProps
171
+ } = endInputProps;
172
+ const startAriaLabelledBy = clsx.clsx(formFieldLabelledBy, startInputPropsLabelledBy) || void 0;
173
+ const endAriaLabelledBy = clsx.clsx(formFieldLabelledBy, endInputPropsLabelledBy) || void 0;
174
+ const startAriaDescribedBy = clsx.clsx(formFieldDescribedBy, startInputPropsDescribedBy) || void 0;
175
+ const endAriaDescribedBy = clsx.clsx(formFieldDescribedBy, endInputPropsDescribedBy) || void 0;
176
+ const startAriaLabel = ariaLabel ? `Start date ${ariaLabel}` : "Start date";
177
+ const endAriaLabel = ariaLabel ? `End date ${ariaLabel}` : "End date";
178
+ const endInputIsRequired = formFieldRequired ? ["required", "asterisk"].includes(formFieldRequired) : endInputPropsRequired;
179
+ const apply = (event) => {
180
+ var _a, _b;
181
+ const { date: startDate = void 0, ...startDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.startDate, "start" /* START */) ?? {};
182
+ const { date: endDate = void 0, ...endDateParseDetails } = parseDateValue(dateValue == null ? void 0 : dateValue.endDate, "end" /* END */) ?? {};
183
+ const updatedDateRange = {
184
+ startDate: ((_a = dateValue == null ? void 0 : dateValue.startDate) == null ? void 0 : _a.length) ? startDate : null,
185
+ endDate: ((_b = dateValue == null ? void 0 : dateValue.endDate) == null ? void 0 : _b.length) ? endDate : null
186
+ };
187
+ if (dateAdapter.isValid(startDate)) {
188
+ updatedDateRange.startDate = dateAdapter.setTimezone(
189
+ startDate,
190
+ timezone
191
+ );
192
+ if (preservedTime.current.startTime) {
193
+ updatedDateRange.startDate = dateAdapter.set(
194
+ updatedDateRange.startDate,
195
+ preservedTime.current.startTime
196
+ );
197
+ }
198
+ }
199
+ if (dateAdapter.isValid(endDate)) {
200
+ updatedDateRange.endDate = dateAdapter.setTimezone(endDate, timezone);
201
+ if (preservedTime.current.endTime) {
202
+ updatedDateRange.endDate = dateAdapter.set(
203
+ updatedDateRange.endDate,
204
+ preservedTime.current.endTime
205
+ );
206
+ }
207
+ }
208
+ const updatedDateValue = setDateValueFromDate(updatedDateRange);
209
+ setDate(updatedDateRange);
210
+ if (lastAppliedValue.current.startDate !== updatedDateValue.startDate || lastAppliedValue.current.endDate !== updatedDateValue.endDate) {
211
+ onDateChange == null ? void 0 : onDateChange(event, updatedDateRange, {
212
+ startDate: startDateParseDetails,
213
+ endDate: endDateParseDetails
214
+ });
215
+ onDateValueChange == null ? void 0 : onDateValueChange(event, updatedDateValue);
216
+ lastAppliedValue.current = updatedDateValue;
217
+ }
218
+ };
219
+ const handleStartInputChange = (event) => {
220
+ const newDateValue = { ...dateValue, startDate: event.target.value };
221
+ setDateValue(newDateValue);
222
+ startInputPropsOnChange == null ? void 0 : startInputPropsOnChange(event);
223
+ onChange == null ? void 0 : onChange(event);
224
+ onDateValueChange == null ? void 0 : onDateValueChange(event, newDateValue);
225
+ };
226
+ const handleEndInputChange = (event) => {
227
+ const newDateValue = { ...dateValue, endDate: event.target.value };
228
+ setDateValue(newDateValue);
229
+ endInputPropsOnChange == null ? void 0 : endInputPropsOnChange(event);
230
+ onChange == null ? void 0 : onChange(event);
231
+ onDateValueChange == null ? void 0 : onDateValueChange(event, newDateValue);
232
+ };
233
+ const handleStartInputFocus = (event) => {
234
+ setFocused(true);
235
+ startInputPropsOnFocus == null ? void 0 : startInputPropsOnFocus(event);
236
+ };
237
+ const handleEndInputFocus = (event) => {
238
+ setFocused(true);
239
+ endInputPropsOnFocus == null ? void 0 : endInputPropsOnFocus(event);
240
+ };
241
+ const handleStartInputBlur = (event) => {
242
+ setFocused(false);
243
+ apply(event);
244
+ startInputPropsOnBlur == null ? void 0 : startInputPropsOnBlur(event);
245
+ };
246
+ const handleEndInputBlur = (event) => {
247
+ setFocused(false);
248
+ apply(event);
249
+ endInputPropsOnBlur == null ? void 0 : endInputPropsOnBlur(event);
250
+ };
251
+ const handleStartInputKeyDown = (event) => {
252
+ if (event.key === "Enter") {
253
+ apply(event);
254
+ }
255
+ startInputPropsOnKeyDown == null ? void 0 : startInputPropsOnKeyDown(event);
256
+ };
257
+ const handleEndInputKeyDown = (event) => {
258
+ if (event.key === "Enter") {
259
+ apply(event);
260
+ }
261
+ endInputPropsOnKeyDown == null ? void 0 : endInputPropsOnKeyDown(event);
262
+ };
263
+ const handleWrapperMouseDown = (event) => {
264
+ if (event.target === wrapperRef.current) {
265
+ event.preventDefault();
266
+ const input = startInputRef.current;
267
+ input == null ? void 0 : input.focus();
268
+ input == null ? void 0 : input.setSelectionRange(input.value.length, input.value.length);
269
+ }
270
+ onMouseDown == null ? void 0 : onMouseDown(event);
271
+ };
272
+ return /* @__PURE__ */ jsxRuntime.jsxs(
273
+ "div",
274
+ {
275
+ className: clsx.clsx(
276
+ withBaseName(),
277
+ withBaseName(variant),
278
+ {
279
+ [withBaseName("focused")]: !isDisabled && focused,
280
+ [withBaseName("disabled")]: isDisabled,
281
+ [withBaseName("readOnly")]: isReadOnly,
282
+ [withBaseName(validationStatus ?? "")]: validationStatus,
283
+ [withBaseName("bordered")]: bordered
284
+ },
285
+ className
286
+ ),
287
+ ref: handleWrapperRef,
288
+ onMouseDown: handleWrapperMouseDown,
289
+ ...rest,
290
+ children: [
291
+ /* @__PURE__ */ jsxRuntime.jsx(
292
+ "input",
293
+ {
294
+ autoComplete: "off",
295
+ "aria-describedby": startAriaDescribedBy,
296
+ "aria-labelledby": startAriaLabelledBy,
297
+ "aria-invalid": !isReadOnly && validationStatus === "error" || void 0,
298
+ "aria-label": startAriaLabel,
299
+ id: startInputID,
300
+ className: withBaseName("input"),
301
+ disabled: isDisabled,
302
+ readOnly: isReadOnly,
303
+ ref: handleStartInputRef,
304
+ tabIndex: isDisabled ? -1 : 0,
305
+ placeholder,
306
+ value: isReadOnly && !(dateValue == null ? void 0 : dateValue.startDate) ? emptyReadOnlyMarker : dateValue.startDate ?? dateAdapter.format(void 0, format),
307
+ ...restStartInputProps,
308
+ onBlur: handleStartInputBlur,
309
+ onChange: handleStartInputChange,
310
+ onKeyDown: handleStartInputKeyDown,
311
+ onFocus: !isDisabled ? handleStartInputFocus : void 0,
312
+ required: startInputIsRequired
313
+ }
314
+ ),
315
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: withBaseName("dash"), children: "-" }),
316
+ /* @__PURE__ */ jsxRuntime.jsx(
317
+ "input",
318
+ {
319
+ autoComplete: "off",
320
+ "aria-describedby": endAriaDescribedBy,
321
+ "aria-labelledby": endAriaLabelledBy,
322
+ "aria-invalid": !isReadOnly && validationStatus === "error" || void 0,
323
+ "aria-label": endAriaLabel,
324
+ id: endInputID,
325
+ className: withBaseName("input"),
326
+ disabled: isDisabled,
327
+ readOnly: isReadOnly,
328
+ ref: handleEndInputRef,
329
+ tabIndex: isDisabled ? -1 : 0,
330
+ placeholder,
331
+ value: isReadOnly && !(dateValue == null ? void 0 : dateValue.endDate) ? emptyReadOnlyMarker : dateValue.endDate ?? dateAdapter.format(void 0, format),
332
+ ...restEndInputProps,
333
+ onBlur: handleEndInputBlur,
334
+ onChange: handleEndInputChange,
335
+ onKeyDown: handleEndInputKeyDown,
336
+ onFocus: !isDisabled ? handleEndInputFocus : void 0,
337
+ required: endInputIsRequired
338
+ }
339
+ ),
340
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName("endAdornmentContainer"), children: [
341
+ !isDisabled && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
342
+ endAdornment
343
+ ] }),
344
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("activationIndicator") })
345
+ ]
346
+ }
347
+ );
348
+ }
349
+ );
350
+
351
+ exports.DateInputRange = DateInputRange;
352
+ exports.DateParserField = DateParserField;
353
+ //# sourceMappingURL=DateInputRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateInputRange.js","sources":["../src/date-input/DateInputRange.tsx"],"sourcesContent":["import {\n type InputProps,\n makePrefixer,\n StatusAdornment,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport type {\n DateDetail,\n DateFrameworkType,\n ParserResult,\n TimeFields,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection } from \"../calendar\";\nimport { useLocalization } from \"../localization-provider\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\n\n/**\n * DateInputRange raw value or null if no date is defined.\n */\nexport type DateInputRangeValue = {\n startDate?: string | null;\n endDate?: string | null;\n};\n\n/**\n * Details of parsing the date range\n */\nexport type DateInputRangeDetails = {\n /** Details of parsing the start date and applying any validation */\n startDate?: DateDetail;\n /** Details of parsing the end date and applying any validation */\n endDate?: DateDetail;\n};\n\n/**\n * Enum to identify the field being parsed\n */\nexport enum DateParserField {\n START = \"start\",\n END = \"end\",\n}\n\n/**\n * Props for the DateInputRange component.\n */\nexport interface DateInputRangeProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\" | \"onChange\">,\n Omit<InputProps, \"defaultValue\" | \"inputRef\" | \"value\" | \"onChange\"> {\n /**\n * Styling variant with full border. Defaults to false.\n */\n bordered?: boolean;\n /**\n * The marker to use in an empty read-only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component.\n */\n endAdornment?: ReactNode;\n /**\n * Attributes applied to the start `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n startInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Attributes applied to the end `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n endInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read-only.\n */\n readOnly?: boolean;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * Format string for date.\n */\n format?: string;\n /**\n * Optional ref for the start input component.\n */\n startInputRef?: Ref<HTMLInputElement>;\n /**\n * Optional ref for the end input component.\n */\n endInputRef?: Ref<HTMLInputElement>;\n /**\n * Parser callback, if not using the adapter's parser\n * @param value - date string to parse\n * @param field: DateParserField to identify value,\n * @param format - format required\n */\n parse?: (\n value: string,\n field: DateParserField,\n format: string,\n ) => ParserResult;\n /**\n * Input value. Use when the input value is controlled.\n */\n value?: DateInputRangeValue;\n /**\n * The initial input value. Use when the component is uncontrolled.\n */\n defaultValue?: DateInputRangeValue;\n /**\n * The date value. Use when the component is controlled.\n */\n date?: DateRangeSelection | null;\n /**\n * The initial selected date value. Use when the component is uncontrolled.\n */\n defaultDate?: DateRangeSelection | null;\n /**\n * Callback fired when the input value changes.\n * @param event - The change event.\n * @param date - The new date input range value.\n */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param date - the selected date, invalid date if not a valid date or undefined (uncontrolled) or null (controlled) if not defined\n * @param details - The details of date selection, either a valid date or error\n */\n onDateChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection | null,\n details: DateInputRangeDetails,\n ) => void;\n /**\n * Called when input values change, either due to user interaction or programmatic formatting of valid dates.\n * @param event - The synthetic event or null if a programmatic change.\n * @param newValue - The new date input range value.\n */\n onDateValueChange?: (\n event: SyntheticEvent | null,\n newValue: DateInputRangeValue,\n ) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n}\n\nexport const DateInputRange = forwardRef<HTMLDivElement, DateInputRangeProps>(\n (props: DateInputRangeProps, ref: React.Ref<HTMLDivElement>) => {\n const { dateAdapter } = useLocalization();\n const {\n \"aria-label\": ariaLabel,\n bordered = false,\n className,\n disabled,\n date: dateProp,\n defaultDate,\n onDateChange,\n value: valueProp,\n format = \"DD MMM YYYY\",\n defaultValue = {\n startDate: \"\",\n endDate: \"\",\n },\n onChange,\n onDateValueChange,\n onMouseDown,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n startInputProps = {},\n endInputProps = {},\n startInputRef: startInputRefProp,\n endInputRef: endInputRefProp,\n parse: parseProp,\n placeholder = format.toLowerCase(),\n readOnly: readOnlyProp,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n timezone = dateProp?.startDate || defaultDate?.startDate\n ? dateAdapter.getTimezone(\n (dateProp?.startDate ??\n defaultDate?.startDate) as DateFrameworkType,\n )\n : \"default\",\n ...rest\n } = props;\n const wrapperRef = useRef(null);\n const handleWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n\n const startInputRef = useRef<HTMLInputElement>(null);\n const handleStartInputRef = useForkRef(startInputRef, startInputRefProp);\n const endInputRef = useRef<HTMLInputElement>(null);\n const handleEndInputRef = useForkRef(endInputRef, endInputRefProp);\n\n const startInputID = useId(startInputProps.id);\n const endInputID = useId(endInputProps.id);\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-input-range\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const parseDateValue = (\n dateValue: string | null | undefined,\n field: DateParserField,\n ): ParserResult | undefined =>\n parseProp\n ? parseProp(dateValue ?? \"\", field, format)\n : dateAdapter.parse.bind(dateAdapter)(dateValue ?? \"\", format);\n\n const [dateValue, setDateValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DateInputRange\",\n state: \"dateValue\",\n });\n\n const [date, setDate] = useControlled({\n controlled: dateProp,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(() => {\n if (defaultDate) {\n return defaultDate;\n }\n if (!defaultValue) {\n return undefined;\n }\n const { date: startDate = undefined } =\n parseDateValue(defaultValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined } =\n parseDateValue(defaultValue?.endDate, DateParserField.END) ?? {};\n return {\n startDate,\n endDate,\n };\n }, []),\n name: \"DateInputRange\",\n state: \"date\",\n });\n\n const lastAppliedValue = useRef<DateInputRangeValue>(dateValue);\n const preservedTime = useRef<{\n startTime: TimeFields | null;\n endTime: TimeFields | null;\n }>({ startTime: null, endTime: null });\n preservedTime.current = {\n startTime:\n date?.startDate && dateAdapter.isValid(date?.startDate)\n ? dateAdapter.getTime(date.startDate)\n : null,\n endTime:\n date?.endDate && dateAdapter.isValid(date?.endDate)\n ? dateAdapter.getTime(date.endDate)\n : null,\n };\n const setDateValueFromDate = (newDate: typeof date) => {\n let newDateValue = { startDate: \"\", endDate: \"\" };\n if (!newDate?.startDate) {\n newDateValue = { ...newDateValue, startDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.startDate)) {\n newDateValue = {\n ...newDateValue,\n startDate: dateValue?.startDate ?? \"\",\n };\n } else if (newDate?.startDate) {\n const formattedStartDateValue = dateAdapter.format(\n newDate.startDate,\n format,\n );\n newDateValue = { ...newDateValue, startDate: formattedStartDateValue };\n }\n if (!newDate?.endDate) {\n newDateValue = { ...newDateValue, endDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.endDate)) {\n newDateValue = { ...newDateValue, endDate: dateValue?.endDate ?? \"\" };\n } else if (newDate?.endDate && dateAdapter.isValid(newDate.endDate)) {\n const formattedEndDateValue = dateAdapter.format(\n newDate.endDate,\n format,\n );\n newDateValue = { ...newDateValue, endDate: formattedEndDateValue };\n }\n\n if (\n (!newDateValue?.startDate && !!dateValue?.startDate) ||\n (!newDateValue.endDate && !!dateValue?.endDate) ||\n newDateValue?.startDate !== dateValue?.startDate ||\n newDateValue?.endDate !== dateValue?.endDate\n ) {\n onDateValueChange?.(null, newDateValue);\n setDateValue(newDateValue);\n }\n return newDateValue;\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Update date string value ONLY when selected date changes, not when date string itself change\n useEffect(() => {\n lastAppliedValue.current = setDateValueFromDate(date);\n }, [date, date?.startDate, date?.endDate, dateAdapter.format, format]);\n\n const [focused, setFocused] = useState(false);\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": startInputPropsDescribedBy,\n \"aria-labelledby\": startInputPropsLabelledBy,\n onBlur: startInputPropsOnBlur,\n onChange: startInputPropsOnChange,\n onKeyDown: startInputPropsOnKeyDown,\n onFocus: startInputPropsOnFocus,\n required: startInputPropsRequired,\n ...restStartInputProps\n } = startInputProps;\n\n const startInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : startInputPropsRequired;\n\n const {\n \"aria-describedby\": endInputPropsDescribedBy,\n \"aria-labelledby\": endInputPropsLabelledBy,\n onBlur: endInputPropsOnBlur,\n onChange: endInputPropsOnChange,\n onKeyDown: endInputPropsOnKeyDown,\n onFocus: endInputPropsOnFocus,\n required: endInputPropsRequired,\n ...restEndInputProps\n } = endInputProps;\n\n const startAriaLabelledBy =\n clsx(formFieldLabelledBy, startInputPropsLabelledBy) || undefined;\n const endAriaLabelledBy =\n clsx(formFieldLabelledBy, endInputPropsLabelledBy) || undefined;\n const startAriaDescribedBy =\n clsx(formFieldDescribedBy, startInputPropsDescribedBy) || undefined;\n const endAriaDescribedBy =\n clsx(formFieldDescribedBy, endInputPropsDescribedBy) || undefined;\n\n const startAriaLabel = ariaLabel ? `Start date ${ariaLabel}` : \"Start date\";\n\n const endAriaLabel = ariaLabel ? `End date ${ariaLabel}` : \"End date\";\n\n const endInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : endInputPropsRequired;\n\n const apply = (event: SyntheticEvent) => {\n const { date: startDate = undefined, ...startDateParseDetails } =\n parseDateValue(dateValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined, ...endDateParseDetails } =\n parseDateValue(dateValue?.endDate, DateParserField.END) ?? {};\n\n const updatedDateRange: DateRangeSelection = {\n startDate: dateValue?.startDate?.length ? startDate : null,\n endDate: dateValue?.endDate?.length ? endDate : null,\n };\n if (dateAdapter.isValid(startDate)) {\n updatedDateRange.startDate = dateAdapter.setTimezone(\n startDate,\n timezone,\n );\n if (preservedTime.current.startTime) {\n updatedDateRange.startDate = dateAdapter.set(\n updatedDateRange.startDate,\n preservedTime.current.startTime,\n );\n }\n }\n if (dateAdapter.isValid(endDate)) {\n updatedDateRange.endDate = dateAdapter.setTimezone(endDate, timezone);\n if (preservedTime.current.endTime) {\n updatedDateRange.endDate = dateAdapter.set(\n updatedDateRange.endDate,\n preservedTime.current.endTime,\n );\n }\n }\n const updatedDateValue = setDateValueFromDate(updatedDateRange);\n\n setDate(updatedDateRange);\n\n if (\n lastAppliedValue.current.startDate !== updatedDateValue.startDate ||\n lastAppliedValue.current.endDate !== updatedDateValue.endDate\n ) {\n onDateChange?.(event, updatedDateRange, {\n startDate: startDateParseDetails,\n endDate: endDateParseDetails,\n });\n onDateValueChange?.(event, updatedDateValue);\n lastAppliedValue.current = updatedDateValue;\n }\n };\n\n const handleStartInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, startDate: event.target.value };\n setDateValue(newDateValue);\n startInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleEndInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, endDate: event.target.value };\n setDateValue(newDateValue);\n endInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleStartInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n startInputPropsOnFocus?.(event);\n };\n\n const handleEndInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n endInputPropsOnFocus?.(event);\n };\n\n const handleStartInputBlur: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(false);\n apply(event);\n startInputPropsOnBlur?.(event);\n };\n\n const handleEndInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(false);\n apply(event);\n endInputPropsOnBlur?.(event);\n };\n\n const handleStartInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n startInputPropsOnKeyDown?.(event);\n };\n\n const handleEndInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n endInputPropsOnKeyDown?.(event);\n };\n\n const handleWrapperMouseDown: MouseEventHandler<HTMLDivElement> = (\n event,\n ) => {\n if (event.target === wrapperRef.current) {\n event.preventDefault();\n const input = startInputRef.current;\n input?.focus();\n input?.setSelectionRange(input.value.length, input.value.length);\n }\n onMouseDown?.(event);\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus ?? \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n className,\n )}\n ref={handleWrapperRef}\n onMouseDown={handleWrapperMouseDown}\n {...rest}\n >\n <input\n autoComplete=\"off\"\n aria-describedby={startAriaDescribedBy}\n aria-labelledby={startAriaLabelledBy}\n aria-invalid={\n (!isReadOnly && validationStatus === \"error\") || undefined\n }\n aria-label={startAriaLabel}\n id={startInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleStartInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.startDate\n ? emptyReadOnlyMarker\n : (dateValue.startDate ?? dateAdapter.format(undefined, format))\n }\n {...restStartInputProps}\n onBlur={handleStartInputBlur}\n onChange={handleStartInputChange}\n onKeyDown={handleStartInputKeyDown}\n onFocus={!isDisabled ? handleStartInputFocus : undefined}\n required={startInputIsRequired}\n />\n <span className={withBaseName(\"dash\")}>-</span>\n <input\n autoComplete=\"off\"\n aria-describedby={endAriaDescribedBy}\n aria-labelledby={endAriaLabelledBy}\n aria-invalid={\n (!isReadOnly && validationStatus === \"error\") || undefined\n }\n aria-label={endAriaLabel}\n id={endInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleEndInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.endDate\n ? emptyReadOnlyMarker\n : (dateValue.endDate ?? dateAdapter.format(undefined, format))\n }\n {...restEndInputProps}\n onBlur={handleEndInputBlur}\n onChange={handleEndInputChange}\n onKeyDown={handleEndInputKeyDown}\n onFocus={!isDisabled ? handleEndInputFocus : undefined}\n required={endInputIsRequired}\n />\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n },\n);\n"],"names":["makePrefixer","DateParserField","forwardRef","useLocalization","useRef","useForkRef","useId","useWindow","useComponentCssInjection","dateInputCss","dateValue","useControlled","useMemo","useEffect","useState","useFormFieldProps","clsx","jsxs","jsx","StatusAdornment"],"mappings":";;;;;;;;;;;AAwCA,MAAM,YAAA,GAAeA,kBAAa,eAAe,CAAA;AAuB1C,IAAK,eAAA,qBAAAC,gBAAAA,KAAL;AACL,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,KAAA,CAAA,GAAM,KAAA;AAFI,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AA0HL,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,CAAC,OAA4B,GAAA,KAAmC;AAC9D,IAAA,MAAM,EAAE,WAAA,EAAY,GAAIC,oCAAA,EAAgB;AACxC,IAAA,MAAM;AAAA,MACJ,YAAA,EAAc,SAAA;AAAA,MACd,QAAA,GAAW,KAAA;AAAA,MACX,SAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,WAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,GAAS,aAAA;AAAA,MACT,YAAA,GAAe;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,mBAAA,GAAsB,QAAA;AAAA,MACtB,YAAA;AAAA,MACA,kBAAkB,EAAC;AAAA,MACnB,gBAAgB,EAAC;AAAA,MACjB,aAAA,EAAe,iBAAA;AAAA,MACf,WAAA,EAAa,eAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,GAAc,OAAO,WAAA,EAAY;AAAA,MACjC,QAAA,EAAU,YAAA;AAAA,MACV,gBAAA,EAAkB,oBAAA;AAAA,MAClB,OAAA,GAAU,SAAA;AAAA,MACV,QAAA,GAAA,CAAW,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,SAAA,MAAa,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,aAC3C,WAAA,CAAY,WAAA;AAAA,QAAA,CACT,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,eACT,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,SAAA;AAAA,OACjB,GACA,SAAA;AAAA,MACJ,GAAG;AAAA,KACL,GAAI,KAAA;AACJ,IAAA,MAAM,UAAA,GAAaC,aAAO,IAAI,CAAA;AAC9B,IAAA,MAAM,gBAAA,GAAmBC,eAAA,CAA2B,GAAA,EAAK,UAAU,CAAA;AAEnE,IAAA,MAAM,aAAA,GAAgBD,aAAyB,IAAI,CAAA;AACnD,IAAA,MAAM,mBAAA,GAAsBC,eAAA,CAAW,aAAA,EAAe,iBAAiB,CAAA;AACvE,IAAA,MAAM,WAAA,GAAcD,aAAyB,IAAI,CAAA;AACjD,IAAA,MAAM,iBAAA,GAAoBC,eAAA,CAAW,WAAA,EAAa,eAAe,CAAA;AAEjE,IAAA,MAAM,YAAA,GAAeC,UAAA,CAAM,eAAA,CAAgB,EAAE,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAaA,UAAA,CAAM,aAAA,CAAc,EAAE,CAAA;AAEzC,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,SAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,iBAAiB,CACrBC,UAAAA,EACA,UAEA,SAAA,GACI,SAAA,CAAUA,cAAa,EAAA,EAAI,KAAA,EAAO,MAAM,CAAA,GACxC,YAAY,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAAEA,UAAAA,IAAa,IAAI,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,kBAAA,CAAc;AAAA,MAC9C,UAAA,EAAY,SAAA;AAAA,MACZ,OAAA,EAAS,YAAA;AAAA,MACT,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,kBAAA,CAAc;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA;AAAA,MAEZ,OAAA,EAASC,cAAQ,MAAM;AACrB,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAO,WAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,EAAE,IAAA,EAAM,SAAA,GAAY,MAAA,EAAU,GAClC,eAAe,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA,EAAW,OAAA,aAAqB,IAAK,EAAC;AACrE,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,GAAU,MAAA,EAAU,GAChC,eAAe,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAA,EAAS,KAAA,WAAmB,IAAK,EAAC;AACjE,QAAA,OAAO;AAAA,UACL,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,EAAG,EAAE,CAAA;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmBR,aAA4B,SAAS,CAAA;AAC9D,IAAA,MAAM,gBAAgBA,YAAA,CAGnB,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACrC,IAAA,aAAA,CAAc,OAAA,GAAU;AAAA,MACtB,SAAA,EAAA,CACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAA,KAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAS,CAAA,GAClD,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,GAClC,IAAA;AAAA,MACN,OAAA,EAAA,CACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAA,KAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAO,CAAA,GAC9C,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAChC;AAAA,KACR;AACA,IAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,KAAyB;AACrD,MAAA,IAAI,YAAA,GAAe,EAAE,SAAA,EAAW,EAAA,EAAI,SAAS,EAAA,EAAG;AAChD,MAAA,IAAI,EAAC,mCAAS,SAAA,CAAA,EAAW;AACvB,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,EAAA,EAAG;AAAA,MAClD,WAAW,CAAC,WAAA,CAAY,OAAA,CAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,SAAS,CAAA,EAAG;AACnD,QAAA,YAAA,GAAe;AAAA,UACb,GAAG,YAAA;AAAA,UACH,SAAA,EAAA,CAAW,uCAAW,SAAA,KAAa;AAAA,SACrC;AAAA,MACF,CAAA,MAAA,IAAW,mCAAS,SAAA,EAAW;AAC7B,QAAA,MAAM,0BAA0B,WAAA,CAAY,MAAA;AAAA,UAC1C,OAAA,CAAQ,SAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,uBAAA,EAAwB;AAAA,MACvE;AACA,MAAA,IAAI,EAAC,mCAAS,OAAA,CAAA,EAAS;AACrB,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,EAAA,EAAG;AAAA,MAChD,WAAW,CAAC,WAAA,CAAY,OAAA,CAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,CAAA,EAAG;AACjD,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAA,CAAS,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,YAAW,EAAA,EAAG;AAAA,MACtE,YAAW,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAW,YAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnE,QAAA,MAAM,wBAAwB,WAAA,CAAY,MAAA;AAAA,UACxC,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,qBAAA,EAAsB;AAAA,MACnE;AAEA,MAAA,IACG,EAAC,6CAAc,SAAA,CAAA,IAAa,CAAC,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,CAAA,IACzC,CAAC,YAAA,CAAa,OAAA,IAAW,CAAC,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,aACvC,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA,OAAc,uCAAW,SAAA,CAAA,IAAA,CACvC,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAA,OAAY,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,CAAA,EACrC;AACA,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,IAAA,EAAM,YAAA,CAAA;AAC1B,QAAA,YAAA,CAAa,YAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAGA,IAAAS,eAAA,CAAU,MAAM;AACd,MAAA,gBAAA,CAAiB,OAAA,GAAU,qBAAqB,IAAI,CAAA;AAAA,IACtD,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAA,EAAW,6BAAM,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,MAAM,CAAC,CAAA;AAErE,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE5C,IAAA,MAAM;AAAA,MACJ,SAAA,EAAW;AAAA,QACT,kBAAA,EAAoB,oBAAA;AAAA,QACpB,iBAAA,EAAmB;AAAA,UACjB,EAAC;AAAA,MACL,QAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,iBAAA;AAAA,MACX,gBAAA,EAAkB;AAAA,QAChBC,sBAAA,EAAkB;AAEtB,IAAA,MAAM,aAAa,YAAA,IAAgB,iBAAA;AACnC,IAAA,MAAM,aAAa,QAAA,IAAY,iBAAA;AAE/B,IAAA,MAAM,mBAAmB,yBAAA,IAA6B,oBAAA;AAEtD,IAAA,MAAM;AAAA,MACJ,kBAAA,EAAoB,0BAAA;AAAA,MACpB,iBAAA,EAAmB,yBAAA;AAAA,MACnB,MAAA,EAAQ,qBAAA;AAAA,MACR,QAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,wBAAA;AAAA,MACX,OAAA,EAAS,sBAAA;AAAA,MACT,QAAA,EAAU,uBAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,eAAA;AAEJ,IAAA,MAAM,oBAAA,GAAuB,oBACzB,CAAC,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA,GACnD,uBAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,kBAAA,EAAoB,wBAAA;AAAA,MACpB,iBAAA,EAAmB,uBAAA;AAAA,MACnB,MAAA,EAAQ,mBAAA;AAAA,MACR,QAAA,EAAU,qBAAA;AAAA,MACV,SAAA,EAAW,sBAAA;AAAA,MACX,OAAA,EAAS,oBAAA;AAAA,MACT,QAAA,EAAU,qBAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,aAAA;AAEJ,IAAA,MAAM,mBAAA,GACJC,SAAA,CAAK,mBAAA,EAAqB,yBAAyB,CAAA,IAAK,MAAA;AAC1D,IAAA,MAAM,iBAAA,GACJA,SAAA,CAAK,mBAAA,EAAqB,uBAAuB,CAAA,IAAK,MAAA;AACxD,IAAA,MAAM,oBAAA,GACJA,SAAA,CAAK,oBAAA,EAAsB,0BAA0B,CAAA,IAAK,MAAA;AAC5D,IAAA,MAAM,kBAAA,GACJA,SAAA,CAAK,oBAAA,EAAsB,wBAAwB,CAAA,IAAK,MAAA;AAE1D,IAAA,MAAM,cAAA,GAAiB,SAAA,GAAY,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,GAAK,YAAA;AAE/D,IAAA,MAAM,YAAA,GAAe,SAAA,GAAY,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,GAAK,UAAA;AAE3D,IAAA,MAAM,kBAAA,GAAqB,oBACvB,CAAC,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA,GACnD,qBAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA0B;AAjZ7C,MAAA,IAAA,EAAA,EAAA,EAAA;AAkZM,MAAA,MAAM,EAAE,IAAA,EAAM,SAAA,GAAY,MAAA,EAAW,GAAG,qBAAA,EAAsB,GAC5D,cAAA,CAAe,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,EAAW,OAAA,aAAqB,IAAK,EAAC;AAClE,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,GAAU,MAAA,EAAW,GAAG,mBAAA,EAAoB,GACxD,cAAA,CAAe,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,EAAS,KAAA,WAAmB,IAAK,EAAC;AAE9D,MAAA,MAAM,gBAAA,GAAuC;AAAA,QAC3C,SAAA,EAAA,CAAA,CAAW,EAAA,GAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,UAAS,SAAA,GAAY,IAAA;AAAA,QACtD,OAAA,EAAA,CAAA,CAAS,EAAA,GAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,UAAS,OAAA,GAAU;AAAA,OAClD;AACA,MAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClC,QAAA,gBAAA,CAAiB,YAAY,WAAA,CAAY,WAAA;AAAA,UACvC,SAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,aAAA,CAAc,QAAQ,SAAA,EAAW;AACnC,UAAA,gBAAA,CAAiB,YAAY,WAAA,CAAY,GAAA;AAAA,YACvC,gBAAA,CAAiB,SAAA;AAAA,YACjB,cAAc,OAAA,CAAQ;AAAA,WACxB;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChC,QAAA,gBAAA,CAAiB,OAAA,GAAU,WAAA,CAAY,WAAA,CAAY,OAAA,EAAS,QAAQ,CAAA;AACpE,QAAA,IAAI,aAAA,CAAc,QAAQ,OAAA,EAAS;AACjC,UAAA,gBAAA,CAAiB,UAAU,WAAA,CAAY,GAAA;AAAA,YACrC,gBAAA,CAAiB,OAAA;AAAA,YACjB,cAAc,OAAA,CAAQ;AAAA,WACxB;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,gBAAA,GAAmB,qBAAqB,gBAAgB,CAAA;AAE9D,MAAA,OAAA,CAAQ,gBAAgB,CAAA;AAExB,MAAA,IACE,gBAAA,CAAiB,QAAQ,SAAA,KAAc,gBAAA,CAAiB,aACxD,gBAAA,CAAiB,OAAA,CAAQ,OAAA,KAAY,gBAAA,CAAiB,OAAA,EACtD;AACA,QAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,OAAO,gBAAA,EAAkB;AAAA,UACtC,SAAA,EAAW,qBAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACX,CAAA;AACA,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,gBAAA,CAAA;AAC3B,QAAA,gBAAA,CAAiB,OAAA,GAAU,gBAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAA+D,CACnE,KAAA,KACG;AACH,MAAA,MAAM,eAAe,EAAE,GAAG,WAAW,SAAA,EAAW,KAAA,CAAM,OAAO,KAAA,EAAM;AACnE,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,uBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,uBAAA,CAA0B,KAAA,CAAA;AAC1B,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AACX,MAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,YAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,oBAAA,GAA6D,CACjE,KAAA,KACG;AACH,MAAA,MAAM,eAAe,EAAE,GAAG,WAAW,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAM;AACjE,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,qBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,qBAAA,CAAwB,KAAA,CAAA;AACxB,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AACX,MAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,YAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,qBAAA,GAA6D,CACjE,KAAA,KACG;AACH,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,sBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,sBAAA,CAAyB,KAAA,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,mBAAA,GAA2D,CAC/D,KAAA,KACG;AACH,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,oBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAuB,KAAA,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,oBAAA,GAA4D,CAChE,KAAA,KACG;AACH,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,qBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,qBAAA,CAAwB,KAAA,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,kBAAA,GAA0D,CAAC,KAAA,KAAU;AACzE,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAsB,KAAA,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,uBAAA,GAAkE,CACtE,KAAA,KACG;AACH,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA,MACb;AACA,MAAA,wBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,wBAAA,CAA2B,KAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAgE,CACpE,KAAA,KACG;AACH,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA,MACb;AACA,MAAA,sBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,sBAAA,CAAyB,KAAA,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,sBAAA,GAA4D,CAChE,KAAA,KACG;AACH,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,UAAA,CAAW,OAAA,EAAS;AACvC,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAM,QAAQ,aAAA,CAAc,OAAA;AAC5B,QAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,KAAA,EAAA;AACP,QAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,MAAA,CAAA;AAAA,MAC3D;AACA,MAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,KAAA,CAAA;AAAA,IAChB,CAAA;AAEA,IAAA,uBACEC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWD,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG,CAAC,UAAA,IAAc,OAAA;AAAA,YAC1C,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,gBAAA,IAAoB,EAAE,CAAC,GAAG,gBAAA;AAAA,YACxC,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG;AAAA,WAC9B;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA,EAAK,gBAAA;AAAA,QACL,WAAA,EAAa,sBAAA;AAAA,QACZ,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAE,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAa,KAAA;AAAA,cACb,kBAAA,EAAkB,oBAAA;AAAA,cAClB,iBAAA,EAAiB,mBAAA;AAAA,cACjB,cAAA,EACG,CAAC,UAAA,IAAc,gBAAA,KAAqB,OAAA,IAAY,MAAA;AAAA,cAEnD,YAAA,EAAY,cAAA;AAAA,cACZ,EAAA,EAAI,YAAA;AAAA,cACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,mBAAA;AAAA,cACL,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,cAC5B,WAAA;AAAA,cACA,KAAA,EACE,UAAA,IAAc,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,CAAA,GACtB,mBAAA,GACC,SAAA,CAAU,SAAA,IAAa,WAAA,CAAY,MAAA,CAAO,MAAA,EAAW,MAAM,CAAA;AAAA,cAEjE,GAAG,mBAAA;AAAA,cACJ,MAAA,EAAQ,oBAAA;AAAA,cACR,QAAA,EAAU,sBAAA;AAAA,cACV,SAAA,EAAW,uBAAA;AAAA,cACX,OAAA,EAAS,CAAC,UAAA,GAAa,qBAAA,GAAwB,MAAA;AAAA,cAC/C,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,yCACC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,MAAM,GAAG,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BACxCA,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAa,KAAA;AAAA,cACb,kBAAA,EAAkB,kBAAA;AAAA,cAClB,iBAAA,EAAiB,iBAAA;AAAA,cACjB,cAAA,EACG,CAAC,UAAA,IAAc,gBAAA,KAAqB,OAAA,IAAY,MAAA;AAAA,cAEnD,YAAA,EAAY,YAAA;AAAA,cACZ,EAAA,EAAI,UAAA;AAAA,cACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,iBAAA;AAAA,cACL,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,cAC5B,WAAA;AAAA,cACA,KAAA,EACE,UAAA,IAAc,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,CAAA,GACtB,mBAAA,GACC,SAAA,CAAU,OAAA,IAAW,WAAA,CAAY,MAAA,CAAO,MAAA,EAAW,MAAM,CAAA;AAAA,cAE/D,GAAG,iBAAA;AAAA,cACJ,MAAA,EAAQ,kBAAA;AAAA,cACR,QAAA,EAAU,oBAAA;AAAA,cACV,SAAA,EAAW,qBAAA;AAAA,cACX,OAAA,EAAS,CAAC,UAAA,GAAa,mBAAA,GAAsB,MAAA;AAAA,cAC7C,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,uBAAuB,CAAA,EACjD,QAAA,EAAA;AAAA,YAAA,CAAC,UAAA,IAAc,gBAAA,oBACdC,cAAA,CAACC,oBAAA,EAAA,EAAgB,QAAQ,gBAAA,EAAkB,CAAA;AAAA,YAE5C;AAAA,WAAA,EACH,CAAA;AAAA,0BACAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,qBAAqB,CAAA,EAAG;AAAA;AAAA;AAAA,KACvD;AAAA,EAEJ;AACF;;;;;"}
@@ -0,0 +1,237 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
7
+ var clsx = require('clsx');
8
+ var react = require('react');
9
+ var LocalizationProvider = require('../localization-provider/LocalizationProvider.js');
10
+ var DateInput = require('./DateInput.css.js');
11
+
12
+ const withBaseName = core.makePrefixer("saltDateInput");
13
+ const DateInputSingle = react.forwardRef(
14
+ (props, ref) => {
15
+ const { dateAdapter } = LocalizationProvider.useLocalization();
16
+ const {
17
+ bordered = false,
18
+ className,
19
+ disabled,
20
+ "aria-label": ariaLabel,
21
+ date: dateProp,
22
+ defaultDate,
23
+ onDateChange,
24
+ value: valueProp,
25
+ format = "DD MMM YYYY",
26
+ defaultValue = "",
27
+ id,
28
+ onChange,
29
+ onMouseDown,
30
+ emptyReadOnlyMarker = "\u2014",
31
+ endAdornment,
32
+ inputProps = {},
33
+ inputRef: inputRefProp = null,
34
+ parse: parseProp,
35
+ placeholder = format.toLowerCase(),
36
+ readOnly: readOnlyProp,
37
+ startAdornment,
38
+ validationStatus: validationStatusProp,
39
+ variant = "primary",
40
+ onDateValueChange,
41
+ timezone = dateProp || defaultDate ? dateAdapter.getTimezone(
42
+ dateProp ?? defaultDate
43
+ ) : "default",
44
+ ...rest
45
+ } = props;
46
+ const wrapperRef = react.useRef(null);
47
+ const handleWrapperRef = core.useForkRef(ref, wrapperRef);
48
+ const innerInputRef = react.useRef(null);
49
+ const handleInputRef = core.useForkRef(
50
+ innerInputRef,
51
+ inputRefProp
52
+ );
53
+ const inputId = core.useId(id);
54
+ const targetWindow = window.useWindow();
55
+ styles.useComponentCssInjection({
56
+ testId: "salt-date-input-single",
57
+ css: DateInput,
58
+ window: targetWindow
59
+ });
60
+ const [date, setDate] = core.useControlled({
61
+ controlled: dateProp,
62
+ // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount
63
+ default: react.useMemo(() => {
64
+ if (defaultDate) {
65
+ return defaultDate;
66
+ }
67
+ if (!defaultValue) {
68
+ return void 0;
69
+ }
70
+ return dateAdapter.parse(defaultValue, format).date;
71
+ }, []),
72
+ name: "DateInputSingle",
73
+ state: "date"
74
+ });
75
+ const [dateValue, setDateValue] = core.useControlled({
76
+ controlled: valueProp,
77
+ default: defaultValue,
78
+ name: "DateInputSingle",
79
+ state: "dateValue"
80
+ });
81
+ const lastAppliedValue = react.useRef(dateValue);
82
+ const preservedTime = react.useRef(null);
83
+ preservedTime.current = dateAdapter.isValid(date) ? dateAdapter.getTime(date) : null;
84
+ react.useEffect(() => {
85
+ const formattedValue = dateAdapter.format(date, format);
86
+ const hasValueChanged = formattedValue !== dateValue;
87
+ if (
88
+ // should not reset "error" input values
89
+ (date === null || dateAdapter.isValid(date)) && hasValueChanged
90
+ ) {
91
+ setDateValue(formattedValue);
92
+ onDateValueChange == null ? void 0 : onDateValueChange(null, formattedValue);
93
+ lastAppliedValue.current = formattedValue;
94
+ }
95
+ }, [date, dateAdapter.format, format]);
96
+ const [focused, setFocused] = react.useState(false);
97
+ const {
98
+ a11yProps: {
99
+ "aria-describedby": formFieldDescribedBy,
100
+ "aria-labelledby": formFieldLabelledBy
101
+ } = {},
102
+ disabled: formFieldDisabled,
103
+ readOnly: formFieldReadOnly,
104
+ necessity: formFieldRequired,
105
+ validationStatus: formFieldValidationStatus
106
+ } = core.useFormFieldProps();
107
+ const isReadOnly = readOnlyProp || formFieldReadOnly;
108
+ const isDisabled = disabled || formFieldDisabled;
109
+ const validationStatus = formFieldValidationStatus ?? validationStatusProp;
110
+ const {
111
+ "aria-describedby": dateInputDescribedBy,
112
+ "aria-labelledby": dateInputLabelledBy,
113
+ onBlur: inputPropsOnBlur,
114
+ onChange: inputPropsOnChange,
115
+ onKeyDown: inputPropsOnKeyDown,
116
+ onFocus: inputPropsOnFocus,
117
+ required: dateInputPropsRequired,
118
+ ...restDateInputProps
119
+ } = inputProps;
120
+ const inputAriaLabelledBy = clsx.clsx(formFieldLabelledBy, dateInputLabelledBy) || void 0;
121
+ const inputAriaDescribedBy = clsx.clsx(formFieldDescribedBy, dateInputDescribedBy) || void 0;
122
+ const isRequired = formFieldRequired ? ["required", "asterisk"].includes(formFieldRequired) : dateInputPropsRequired;
123
+ const apply = (event) => {
124
+ const parse = parseProp ?? dateAdapter.parse.bind(dateAdapter);
125
+ const parseResult = parse(dateValue ?? "", format);
126
+ let parsedDate;
127
+ let parseDetails;
128
+ ({ date: parsedDate, ...parseDetails } = parseResult);
129
+ parsedDate = dateValue ? parsedDate : null;
130
+ let formattedValue = "";
131
+ const isDateValid = dateAdapter.isValid(parsedDate);
132
+ if (isDateValid && parsedDate) {
133
+ parsedDate = dateAdapter.setTimezone(parsedDate, timezone);
134
+ if (preservedTime.current) {
135
+ parsedDate = dateAdapter.set(parsedDate, preservedTime.current);
136
+ }
137
+ formattedValue = dateAdapter.format(parsedDate, format);
138
+ }
139
+ const hasValueChanged = formattedValue !== dateValue;
140
+ const newValue = isDateValid ? formattedValue : dateValue;
141
+ if (hasValueChanged) {
142
+ setDateValue(newValue);
143
+ onDateValueChange == null ? void 0 : onDateValueChange(event, newValue);
144
+ }
145
+ setDate(parsedDate);
146
+ if (lastAppliedValue.current !== newValue) {
147
+ onDateChange == null ? void 0 : onDateChange(event, parsedDate, parseDetails);
148
+ }
149
+ lastAppliedValue.current = newValue;
150
+ };
151
+ const handleChange = (event) => {
152
+ const newDateValue = event.target.value;
153
+ setDateValue(newDateValue);
154
+ inputPropsOnChange == null ? void 0 : inputPropsOnChange(event);
155
+ onChange == null ? void 0 : onChange(event);
156
+ onDateValueChange == null ? void 0 : onDateValueChange(event, newDateValue);
157
+ };
158
+ const handleFocus = (event) => {
159
+ setFocused(true);
160
+ inputPropsOnFocus == null ? void 0 : inputPropsOnFocus(event);
161
+ };
162
+ const handleBlur = (event) => {
163
+ setFocused(false);
164
+ apply(event);
165
+ inputPropsOnBlur == null ? void 0 : inputPropsOnBlur(event);
166
+ };
167
+ const handleKeyDown = (event) => {
168
+ if (event.key === "Enter") {
169
+ apply(event);
170
+ }
171
+ inputPropsOnKeyDown == null ? void 0 : inputPropsOnKeyDown(event);
172
+ };
173
+ const handleMouseDown = (event) => {
174
+ var _a;
175
+ if (event.target === wrapperRef.current) {
176
+ event.preventDefault();
177
+ (_a = innerInputRef.current) == null ? void 0 : _a.focus();
178
+ }
179
+ onMouseDown == null ? void 0 : onMouseDown(event);
180
+ };
181
+ return /* @__PURE__ */ jsxRuntime.jsxs(
182
+ "div",
183
+ {
184
+ className: clsx.clsx(
185
+ withBaseName(),
186
+ withBaseName(variant),
187
+ {
188
+ [withBaseName("focused")]: !isDisabled && focused,
189
+ [withBaseName("disabled")]: isDisabled,
190
+ [withBaseName("readOnly")]: isReadOnly,
191
+ [withBaseName(validationStatus ?? "")]: validationStatus,
192
+ [withBaseName("bordered")]: bordered
193
+ },
194
+ className
195
+ ),
196
+ ref: handleWrapperRef,
197
+ onMouseDown: handleMouseDown,
198
+ ...rest,
199
+ children: [
200
+ startAdornment && /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("startAdornmentContainer"), children: startAdornment }),
201
+ /* @__PURE__ */ jsxRuntime.jsx(
202
+ "input",
203
+ {
204
+ autoComplete: "off",
205
+ "aria-describedby": inputAriaDescribedBy,
206
+ "aria-labelledby": inputAriaLabelledBy,
207
+ "aria-invalid": !isReadOnly && validationStatus === "error" || void 0,
208
+ "aria-label": ariaLabel ?? "date input",
209
+ id: inputId,
210
+ className: withBaseName("input"),
211
+ disabled: isDisabled,
212
+ readOnly: isReadOnly,
213
+ ref: handleInputRef,
214
+ tabIndex: isDisabled ? -1 : 0,
215
+ placeholder,
216
+ value: isReadOnly && !dateValue ? emptyReadOnlyMarker : dateValue,
217
+ ...restDateInputProps,
218
+ onBlur: handleBlur,
219
+ onChange: handleChange,
220
+ onKeyDown: handleKeyDown,
221
+ onFocus: !isDisabled ? handleFocus : void 0,
222
+ required: isRequired
223
+ }
224
+ ),
225
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName("endAdornmentContainer"), children: [
226
+ !isDisabled && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
227
+ endAdornment
228
+ ] }),
229
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("activationIndicator") })
230
+ ]
231
+ }
232
+ );
233
+ }
234
+ );
235
+
236
+ exports.DateInputSingle = DateInputSingle;
237
+ //# sourceMappingURL=DateInputSingle.js.map