@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,206 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var dateAdapters = require('@salt-ds/date-adapters');
6
+ var clsx = require('clsx');
7
+ var react = require('react');
8
+ var DateInputRange = require('../date-input/DateInputRange.js');
9
+ require('../date-input/DateInputSingle.js');
10
+ var LocalizationProvider = require('../localization-provider/LocalizationProvider.js');
11
+ var DatePickerContext = require('./DatePickerContext.js');
12
+ var DatePickerOverlayProvider = require('./DatePickerOverlayProvider.js');
13
+
14
+ const withBaseName = core.makePrefixer("saltDatePickerRangeInput");
15
+ function defaultRangeValidator(dateAdapter, date, details, minDate, maxDate) {
16
+ const { startDate, endDate } = date || {};
17
+ if (!startDate) {
18
+ details.startDate = details.startDate || {};
19
+ details.startDate.errors = details.startDate.errors || [];
20
+ const unsetStartDateError = details.startDate.errors.find(
21
+ (err) => err.type === dateAdapters.DateDetailError.UNSET
22
+ );
23
+ if (unsetStartDateError) {
24
+ unsetStartDateError.message = "no start date defined";
25
+ } else {
26
+ details.startDate.errors.push({
27
+ type: dateAdapters.DateDetailError.UNSET,
28
+ message: "no start date defined"
29
+ });
30
+ }
31
+ }
32
+ if (!endDate) {
33
+ details.endDate = details.endDate || {};
34
+ details.endDate.errors = details.endDate.errors || [];
35
+ const unsetEndDateError = details.endDate.errors.find(
36
+ (err) => err.type === dateAdapters.DateDetailError.UNSET
37
+ );
38
+ if (unsetEndDateError) {
39
+ unsetEndDateError.message = "no end date defined";
40
+ } else {
41
+ details.endDate.errors.push({
42
+ type: dateAdapters.DateDetailError.UNSET,
43
+ message: "no end date defined"
44
+ });
45
+ }
46
+ }
47
+ if (dateAdapter.isValid(startDate) && dateAdapter.isValid(endDate) && dateAdapter.compare(startDate, endDate) > 0) {
48
+ details.startDate = details.startDate || {};
49
+ details.startDate.errors = details.startDate.errors || [];
50
+ details.startDate.errors.push({
51
+ type: "greater-than-end-date",
52
+ message: "start date after end date"
53
+ });
54
+ }
55
+ if (minDate && dateAdapter.isValid(startDate) && dateAdapter.compare(startDate, minDate) < 0) {
56
+ details.startDate = details.startDate || {};
57
+ details.startDate.errors = details.startDate.errors || [];
58
+ details.startDate.errors.push({
59
+ type: "min-date",
60
+ message: "is before min date"
61
+ });
62
+ }
63
+ if (maxDate && dateAdapter.isValid(startDate) && dateAdapter.compare(startDate, maxDate) > 0) {
64
+ details.startDate = details.startDate || {};
65
+ details.startDate.errors = details.startDate.errors || [];
66
+ details.startDate.errors.push({
67
+ type: "max-date",
68
+ message: "is after max date"
69
+ });
70
+ }
71
+ if (minDate && dateAdapter.isValid(endDate) && dateAdapter.compare(endDate, minDate) < 0) {
72
+ details.endDate = details.endDate || {};
73
+ details.endDate.errors = details.endDate.errors || [];
74
+ details.endDate.errors.push({
75
+ type: "max-date",
76
+ message: "is before min date"
77
+ });
78
+ }
79
+ if (maxDate && dateAdapter.isValid(endDate) && dateAdapter.compare(endDate, maxDate) > 0) {
80
+ details.endDate = details.endDate || {};
81
+ details.endDate.errors = details.endDate.errors || [];
82
+ details.endDate.errors.push({
83
+ type: "max-date",
84
+ message: "is after max date"
85
+ });
86
+ }
87
+ return details;
88
+ }
89
+ const DatePickerRangeInput = react.forwardRef((props, ref) => {
90
+ const { dateAdapter } = LocalizationProvider.useLocalization();
91
+ const {
92
+ className,
93
+ endInputProps,
94
+ startInputProps,
95
+ defaultValue,
96
+ format = "DD MMM YYYY",
97
+ value: valueProp,
98
+ validate,
99
+ onChange,
100
+ onDateValueChange,
101
+ ...rest
102
+ } = props;
103
+ const { CalendarIcon } = core.useIcon();
104
+ const {
105
+ state: {
106
+ selectedDate,
107
+ disabled,
108
+ readOnly,
109
+ cancelled,
110
+ minDate,
111
+ maxDate,
112
+ timezone
113
+ },
114
+ helpers: { select }
115
+ } = DatePickerContext.useDatePickerContext({
116
+ selectionVariant: "range"
117
+ });
118
+ const {
119
+ state: { open },
120
+ helpers: { setOpen }
121
+ } = DatePickerOverlayProvider.useDatePickerOverlay();
122
+ const previousValue = react.useRef();
123
+ const [value, setValue] = core.useControlled({
124
+ controlled: valueProp,
125
+ default: defaultValue,
126
+ name: "DatePickerRangeInput",
127
+ state: "dateValue"
128
+ });
129
+ react.useEffect(() => {
130
+ setValue({
131
+ startDate: !(selectedDate == null ? void 0 : selectedDate.startDate) ? "" : (selectedDate == null ? void 0 : selectedDate.startDate) && dateAdapter.isValid(selectedDate.startDate) ? dateAdapter.format(selectedDate.startDate, format) : value == null ? void 0 : value.startDate,
132
+ endDate: !(selectedDate == null ? void 0 : selectedDate.endDate) ? "" : (selectedDate == null ? void 0 : selectedDate.endDate) && dateAdapter.isValid(selectedDate.endDate) ? dateAdapter.format(selectedDate.endDate, format) : value == null ? void 0 : value.endDate
133
+ });
134
+ }, [dateAdapter, format, selectedDate]);
135
+ const handleCalendarButton = react.useCallback(
136
+ (event) => {
137
+ event.persist();
138
+ setOpen(!open, event.nativeEvent, "click");
139
+ event.stopPropagation();
140
+ },
141
+ [open, setOpen]
142
+ );
143
+ const handleDateChange = react.useCallback(
144
+ (event, date, details) => {
145
+ const validatedDetails = validate ? validate(date, details) : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);
146
+ select(event, date, validatedDetails);
147
+ },
148
+ [dateAdapter, select, minDate, maxDate, validate]
149
+ );
150
+ const handleDateValueChange = react.useCallback(
151
+ (event, newDateValue) => {
152
+ setValue(newDateValue);
153
+ onDateValueChange == null ? void 0 : onDateValueChange(event, newDateValue);
154
+ },
155
+ [onDateValueChange]
156
+ );
157
+ react.useEffect(() => {
158
+ if (open) {
159
+ previousValue.current = value;
160
+ }
161
+ }, [open]);
162
+ react.useEffect(() => {
163
+ if (cancelled) {
164
+ setValue(previousValue.current);
165
+ }
166
+ }, [cancelled]);
167
+ return /* @__PURE__ */ jsxRuntime.jsx(
168
+ DateInputRange.DateInputRange,
169
+ {
170
+ value: value ?? {
171
+ startDate: "",
172
+ endDate: ""
173
+ },
174
+ className: clsx.clsx(withBaseName(), className),
175
+ date: selectedDate ?? null,
176
+ startInputProps,
177
+ endInputProps,
178
+ readOnly,
179
+ disabled,
180
+ ref,
181
+ onDateChange: handleDateChange,
182
+ onDateValueChange: handleDateValueChange,
183
+ onChange,
184
+ endAdornment: !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
185
+ core.Button,
186
+ {
187
+ appearance: "transparent",
188
+ sentiment: "neutral",
189
+ onClick: handleCalendarButton,
190
+ disabled,
191
+ "aria-haspopup": "dialog",
192
+ "aria-label": "Open Calendar",
193
+ "aria-expanded": open,
194
+ children: /* @__PURE__ */ jsxRuntime.jsx(CalendarIcon, { "aria-hidden": true })
195
+ }
196
+ ),
197
+ format,
198
+ timezone,
199
+ ...rest
200
+ }
201
+ );
202
+ });
203
+
204
+ exports.DatePickerRangeInput = DatePickerRangeInput;
205
+ exports.defaultRangeValidator = defaultRangeValidator;
206
+ //# sourceMappingURL=DatePickerRangeInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatePickerRangeInput.js","sources":["../src/date-picker/DatePickerRangeInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled, useIcon } from \"@salt-ds/core\";\nimport {\n DateDetailError,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { DateRangeSelection } from \"../calendar\";\nimport {\n DateInputRange,\n type DateInputRangeDetails,\n type DateInputRangeProps,\n type DateInputRangeValue,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n type RangeDatePickerState,\n useDatePickerContext,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerRangeInput\");\n\n/**\n * Props for the DatePickerRangeInput component.\n */\nexport interface DatePickerRangeInputProps extends DateInputRangeProps {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputRangeDetails details\n */\n validate?: (\n date: DateRangeSelection | null,\n details: DateInputRangeDetails,\n ) => DateInputRangeDetails;\n}\n\nexport function defaultRangeValidator(\n dateAdapter: SaltDateAdapter,\n date: DateRangeSelection | null,\n details: DateInputRangeDetails,\n minDate?: DateFrameworkType,\n maxDate?: DateFrameworkType,\n): DateInputRangeDetails {\n const { startDate, endDate } = date || {};\n\n if (!startDate) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n const unsetStartDateError = details.startDate.errors.find(\n (err) => err.type === DateDetailError.UNSET,\n );\n if (unsetStartDateError) {\n unsetStartDateError.message = \"no start date defined\";\n } else {\n details.startDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no start date defined\",\n });\n }\n }\n\n if (!endDate) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n const unsetEndDateError = details.endDate.errors.find(\n (err) => err.type === DateDetailError.UNSET,\n );\n if (unsetEndDateError) {\n unsetEndDateError.message = \"no end date defined\";\n } else {\n details.endDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no end date defined\",\n });\n }\n }\n\n // If startDate is after endDate\n if (\n dateAdapter.isValid(startDate) &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(startDate, endDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"greater-than-end-date\",\n message: \"start date after end date\",\n });\n }\n // If startDate is before minDate\n if (\n minDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, minDate) < 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n }\n // If startDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, maxDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n if (\n minDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, minDate) < 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is before min date\",\n });\n }\n // If endDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, maxDate) > 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n return details;\n}\n\nexport const DatePickerRangeInput = forwardRef<\n HTMLDivElement,\n DatePickerRangeInputProps\n>((props: DatePickerRangeInputProps, ref: React.Ref<HTMLDivElement>) => {\n const { dateAdapter } = useLocalization();\n const {\n className,\n endInputProps,\n startInputProps,\n defaultValue,\n format = \"DD MMM YYYY\",\n value: valueProp,\n validate,\n onChange,\n onDateValueChange,\n ...rest\n } = props;\n\n const { CalendarIcon } = useIcon();\n\n const {\n state: {\n selectedDate,\n disabled,\n readOnly,\n cancelled,\n minDate,\n maxDate,\n timezone,\n },\n helpers: { select },\n } = useDatePickerContext({\n selectionVariant: \"range\",\n }) as RangeDatePickerState;\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerRangeInput\",\n state: \"dateValue\",\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run when date changes to sync the value\n useEffect(() => {\n setValue({\n startDate: !selectedDate?.startDate\n ? \"\"\n : selectedDate?.startDate && dateAdapter.isValid(selectedDate.startDate)\n ? dateAdapter.format(selectedDate.startDate, format)\n : value?.startDate,\n endDate: !selectedDate?.endDate\n ? \"\"\n : selectedDate?.endDate && dateAdapter.isValid(selectedDate.endDate)\n ? dateAdapter.format(selectedDate.endDate, format)\n : value?.endDate,\n });\n }, [dateAdapter, format, selectedDate]);\n\n const handleCalendarButton: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n event.persist();\n setOpen(!open, event.nativeEvent, \"click\");\n event.stopPropagation();\n },\n [open, setOpen],\n );\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection | null,\n details: DateInputRangeDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);\n select(event, date, validatedDetails);\n },\n [dateAdapter, select, minDate, maxDate, validate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: DateInputRangeValue) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue.current);\n }\n }, [cancelled]);\n\n return (\n <DateInputRange\n value={\n value ?? {\n startDate: \"\",\n endDate: \"\",\n }\n }\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n startInputProps={startInputProps}\n endInputProps={endInputProps}\n readOnly={readOnly}\n disabled={disabled}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n onChange={onChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-label=\"Open Calendar\"\n aria-expanded={open}\n >\n <CalendarIcon aria-hidden />\n </Button>\n )\n }\n format={format}\n timezone={timezone}\n {...rest}\n />\n );\n});\n"],"names":["makePrefixer","DateDetailError","forwardRef","useLocalization","useIcon","useDatePickerContext","useDatePickerOverlay","useRef","useControlled","useEffect","useCallback","jsx","DateInputRange","clsx","Button"],"mappings":"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"}
@@ -0,0 +1,365 @@
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 Calendar = require('../calendar/Calendar.js');
10
+ var CalendarGrid = require('../calendar/CalendarGrid.js');
11
+ var CalendarNavigation = require('../calendar/CalendarNavigation.js');
12
+ require('../calendar/CalendarWeekHeader.js');
13
+ var LocalizationProvider = require('../localization-provider/LocalizationProvider.js');
14
+ var utils = require('../calendar/internal/utils.js');
15
+ require('../calendar/useCalendarSelection.js');
16
+ require('../calendar/internal/CalendarContext.js');
17
+ var DatePickerContext = require('./DatePickerContext.js');
18
+ var DatePickerOverlayProvider = require('./DatePickerOverlayProvider.js');
19
+ var DatePickerPanel = require('./DatePickerPanel.css.js');
20
+
21
+ function getFallbackVisibleMonths(dateAdapter, selectedDate, timezone = "default") {
22
+ function createConsecutiveRange(date) {
23
+ const startDate = dateAdapter.startOf(date, "month");
24
+ const endDate = dateAdapter.add(startDate, { months: 1 });
25
+ return [startDate, endDate];
26
+ }
27
+ if (selectedDate && dateAdapter.isValid(selectedDate == null ? void 0 : selectedDate.startDate)) {
28
+ const { startDate, endDate } = selectedDate;
29
+ if (dateAdapter.isValid(endDate)) {
30
+ return dateAdapter.isSame(startDate, endDate, "month") ? createConsecutiveRange(startDate) : [
31
+ dateAdapter.startOf(startDate, "month"),
32
+ dateAdapter.startOf(endDate, "month")
33
+ ];
34
+ }
35
+ return createConsecutiveRange(startDate);
36
+ }
37
+ const currentMonth = dateAdapter.startOf(
38
+ dateAdapter.today(timezone),
39
+ "month"
40
+ );
41
+ return [currentMonth, dateAdapter.add(currentMonth, { months: 1 })];
42
+ }
43
+ const withBaseName = core.makePrefixer("saltDatePickerPanel");
44
+ const DatePickerRangePanel = react.forwardRef(function DatePickerRangePanel2(props, ref) {
45
+ const { dateAdapter } = LocalizationProvider.useLocalization();
46
+ const {
47
+ className,
48
+ defaultStartVisibleMonth: defaultStartVisibleMonthProp,
49
+ startVisibleMonth: startVisibleMonthProp,
50
+ onStartVisibleMonthChange,
51
+ defaultEndVisibleMonth: defaultEndVisibleMonthProp,
52
+ endVisibleMonth: endVisibleMonthProp,
53
+ onEndVisibleMonthChange,
54
+ helperText,
55
+ onFocusedDateChange,
56
+ onHoveredDateChange,
57
+ onSelectionChange,
58
+ StartCalendarProps: StartCalendarPropsProp,
59
+ StartCalendarNavigationProps,
60
+ StartCalendarGridProps,
61
+ EndCalendarProps: EndCalendarPropsProp,
62
+ EndCalendarNavigationProps,
63
+ EndCalendarGridProps,
64
+ ...rest
65
+ } = props;
66
+ const targetWindow = window.useWindow();
67
+ styles.useComponentCssInjection({
68
+ testId: "salt-date-picker-range-panel",
69
+ css: DatePickerPanel,
70
+ window: targetWindow
71
+ });
72
+ const calendarsRef = react.useRef(null);
73
+ const containerRef = core.useForkRef(ref, calendarsRef);
74
+ const {
75
+ state: {
76
+ timezone,
77
+ selectedDate,
78
+ minDate = dateAdapter.startOf(dateAdapter.today(timezone), "month"),
79
+ maxDate = dateAdapter.add(minDate, { months: 1 })
80
+ },
81
+ helpers: { select, isDayHighlighted, isDayUnselectable }
82
+ } = DatePickerContext.useDatePickerContext({
83
+ selectionVariant: "range"
84
+ });
85
+ const {
86
+ state: { initialFocusRef, focused }
87
+ } = DatePickerOverlayProvider.useDatePickerOverlay();
88
+ const [hoveredDate, setHoveredDate] = react.useState(
89
+ null
90
+ );
91
+ const [[fallbackStartVisibleMonth, fallbackEndVisibleMonth]] = react.useState(
92
+ () => getFallbackVisibleMonths(dateAdapter, selectedDate, timezone)
93
+ );
94
+ const [startVisibleMonth, setStartVisibleMonth] = core.useControlled({
95
+ controlled: startVisibleMonthProp,
96
+ default: defaultStartVisibleMonthProp || fallbackStartVisibleMonth,
97
+ name: "DatePickerRangePanel",
98
+ state: "startVisibleMonth"
99
+ });
100
+ const [endVisibleMonth, setEndVisibleMonth] = core.useControlled({
101
+ controlled: endVisibleMonthProp,
102
+ default: defaultEndVisibleMonthProp || fallbackEndVisibleMonth,
103
+ name: "DatePickerRangePanel",
104
+ state: "endVisibleMonth"
105
+ });
106
+ const handleSelectionChange = react.useCallback(
107
+ (event, newDate) => {
108
+ select(event, newDate);
109
+ onSelectionChange == null ? void 0 : onSelectionChange(event, newDate);
110
+ },
111
+ [select, onSelectionChange]
112
+ );
113
+ const handleHoveredStartDateChange = react.useCallback(
114
+ (event, newHoveredDate) => {
115
+ setHoveredDate(newHoveredDate);
116
+ onHoveredDateChange == null ? void 0 : onHoveredDateChange(event, newHoveredDate);
117
+ },
118
+ [onHoveredDateChange]
119
+ );
120
+ const handleHoveredEndDateChange = react.useCallback(
121
+ (event, newHoveredDate) => {
122
+ setHoveredDate(newHoveredDate);
123
+ onHoveredDateChange == null ? void 0 : onHoveredDateChange(event, newHoveredDate);
124
+ },
125
+ [onHoveredDateChange]
126
+ );
127
+ const handleStartVisibleMonthChange = react.useCallback(
128
+ (event, newVisibleMonth) => {
129
+ setStartVisibleMonth(newVisibleMonth);
130
+ if (dateAdapter.compare(newVisibleMonth, endVisibleMonth) >= 0) {
131
+ setEndVisibleMonth(dateAdapter.add(newVisibleMonth, { months: 1 }));
132
+ }
133
+ onStartVisibleMonthChange == null ? void 0 : onStartVisibleMonthChange(event, newVisibleMonth);
134
+ },
135
+ [dateAdapter, endVisibleMonth, onStartVisibleMonthChange]
136
+ );
137
+ const handleEndVisibleMonthChange = react.useCallback(
138
+ (event, newVisibleMonth) => {
139
+ setEndVisibleMonth(newVisibleMonth);
140
+ if (dateAdapter.compare(newVisibleMonth, startVisibleMonth) <= 0) {
141
+ setStartVisibleMonth(
142
+ dateAdapter.startOf(
143
+ dateAdapter.subtract(newVisibleMonth, { months: 1 }),
144
+ "month"
145
+ )
146
+ );
147
+ }
148
+ onEndVisibleMonthChange == null ? void 0 : onEndVisibleMonthChange(event, newVisibleMonth);
149
+ },
150
+ [dateAdapter, startVisibleMonth, onEndVisibleMonthChange]
151
+ );
152
+ const calendarSelectedDate = {
153
+ startDate: selectedDate && dateAdapter.isValid(selectedDate.startDate) ? selectedDate.startDate : null,
154
+ endDate: selectedDate && dateAdapter.isValid(selectedDate.endDate) ? selectedDate.endDate : null
155
+ };
156
+ const [focusedDate, setFocusedDate] = react.useState(
157
+ null
158
+ );
159
+ const handleStartCalendarFocusedDateChange = react.useCallback(
160
+ (event, newFocusedDate) => {
161
+ setFocusedDate(newFocusedDate);
162
+ if (newFocusedDate && !dateAdapter.isSame(startVisibleMonth, newFocusedDate, "month")) {
163
+ handleStartVisibleMonthChange(
164
+ event,
165
+ dateAdapter.startOf(newFocusedDate, "month")
166
+ );
167
+ }
168
+ onFocusedDateChange == null ? void 0 : onFocusedDateChange(event, newFocusedDate);
169
+ },
170
+ [
171
+ dateAdapter,
172
+ startVisibleMonth,
173
+ handleStartVisibleMonthChange,
174
+ onFocusedDateChange
175
+ ]
176
+ );
177
+ const handleEndCalendarFocusedDateChange = react.useCallback(
178
+ (event, newFocusedDate) => {
179
+ setFocusedDate(newFocusedDate);
180
+ if (newFocusedDate && !dateAdapter.isSame(endVisibleMonth, newFocusedDate, "month")) {
181
+ handleEndVisibleMonthChange(
182
+ event,
183
+ dateAdapter.startOf(newFocusedDate, "month")
184
+ );
185
+ }
186
+ onFocusedDateChange == null ? void 0 : onFocusedDateChange(event, newFocusedDate);
187
+ },
188
+ [
189
+ dateAdapter,
190
+ endVisibleMonth,
191
+ handleEndVisibleMonthChange,
192
+ onFocusedDateChange
193
+ ]
194
+ );
195
+ const getNextFocusedDate = (nextStartVisibleMonth, nextEndVisibleMonth) => {
196
+ const isOutsideAllowedDates = (date) => {
197
+ return dateAdapter.compare(date, minDate) < 0 || dateAdapter.compare(date, maxDate) > 0;
198
+ };
199
+ const isDaySelectable = (date) => !(date && ((isDayUnselectable == null ? void 0 : isDayUnselectable(date)) || isOutsideAllowedDates(date)));
200
+ const getVisibleSelectedDate = (visibleMonth) => {
201
+ if ((selectedDate == null ? void 0 : selectedDate.startDate) && dateAdapter.isSame(visibleMonth, selectedDate.startDate, "month") && isDaySelectable(selectedDate.startDate)) {
202
+ return selectedDate.startDate;
203
+ }
204
+ if ((selectedDate == null ? void 0 : selectedDate.endDate) && dateAdapter.isSame(visibleMonth, selectedDate.endDate, "month") && isDaySelectable(selectedDate.endDate)) {
205
+ return selectedDate.endDate;
206
+ }
207
+ return null;
208
+ };
209
+ let focusSelectedDate = getVisibleSelectedDate(nextStartVisibleMonth);
210
+ focusSelectedDate = focusSelectedDate ?? getVisibleSelectedDate(nextEndVisibleMonth);
211
+ if (focusSelectedDate && isDaySelectable(focusSelectedDate)) {
212
+ return focusSelectedDate;
213
+ }
214
+ const today = dateAdapter.today(timezone);
215
+ if ((dateAdapter.isSame(nextStartVisibleMonth, today, "month") || dateAdapter.isSame(nextEndVisibleMonth, today, "month")) && isDaySelectable(today)) {
216
+ return today;
217
+ }
218
+ const getFirstSelectableDate = (visibleMonth) => {
219
+ const firstSelectableDate = utils.generateDatesForMonth(
220
+ dateAdapter,
221
+ visibleMonth
222
+ ).find((visibleDay) => isDaySelectable(visibleDay));
223
+ return firstSelectableDate ?? null;
224
+ };
225
+ return getFirstSelectableDate(nextStartVisibleMonth) ?? getFirstSelectableDate(nextEndVisibleMonth);
226
+ };
227
+ core.useIsomorphicLayoutEffect(() => {
228
+ if (!focused) {
229
+ setFocusedDate(null);
230
+ return;
231
+ }
232
+ const isStartDateValid = (selectedDate == null ? void 0 : selectedDate.startDate) && dateAdapter.isValid(selectedDate.startDate) && dateAdapter.compare(selectedDate.startDate, minDate) >= 0 && dateAdapter.compare(selectedDate.startDate, maxDate) <= 0;
233
+ const isEndDateValid = (selectedDate == null ? void 0 : selectedDate.endDate) && dateAdapter.isValid(selectedDate.endDate) && dateAdapter.compare(selectedDate.endDate, minDate) >= 0 && dateAdapter.compare(selectedDate.endDate, maxDate) <= 0;
234
+ let nextStartVisibleMonth = startVisibleMonth;
235
+ let nextEndVisibleMonth = endVisibleMonth;
236
+ const setVisibleMonths = (start, end) => {
237
+ nextStartVisibleMonth = dateAdapter.startOf(start, "month");
238
+ nextEndVisibleMonth = dateAdapter.startOf(end, "month");
239
+ };
240
+ if ((selectedDate == null ? void 0 : selectedDate.startDate) && (selectedDate == null ? void 0 : selectedDate.endDate) && isStartDateValid && isEndDateValid) {
241
+ if (dateAdapter.isSame(
242
+ selectedDate.startDate,
243
+ startVisibleMonth,
244
+ "month"
245
+ ) && dateAdapter.isSame(selectedDate.endDate, startVisibleMonth, "month")) {
246
+ setVisibleMonths(
247
+ selectedDate.startDate,
248
+ dateAdapter.add(selectedDate.startDate, { months: 1 })
249
+ );
250
+ } else {
251
+ setVisibleMonths(selectedDate.startDate, selectedDate.endDate);
252
+ }
253
+ } else if ((selectedDate == null ? void 0 : selectedDate.startDate) && isStartDateValid) {
254
+ setVisibleMonths(
255
+ selectedDate.startDate,
256
+ dateAdapter.add(selectedDate.startDate, { months: 1 })
257
+ );
258
+ } else if ((selectedDate == null ? void 0 : selectedDate.endDate) && isEndDateValid) {
259
+ setVisibleMonths(
260
+ dateAdapter.subtract(selectedDate.endDate, { months: 1 }),
261
+ selectedDate.endDate
262
+ );
263
+ }
264
+ if (!focusedDate) {
265
+ setFocusedDate((prevFocusedDate) => {
266
+ if (!prevFocusedDate) {
267
+ return getNextFocusedDate(nextStartVisibleMonth, nextEndVisibleMonth);
268
+ }
269
+ return prevFocusedDate;
270
+ });
271
+ }
272
+ }, [dateAdapter, minDate, maxDate, focused]);
273
+ const StartCalendarProps = {
274
+ visibleMonth: startVisibleMonth,
275
+ hoveredDate,
276
+ selectedDate: calendarSelectedDate,
277
+ isDayHighlighted,
278
+ isDayUnselectable,
279
+ focusedDateRef: initialFocusRef,
280
+ focusedDate: focusedDate && dateAdapter.compare(
281
+ focusedDate,
282
+ dateAdapter.startOf(endVisibleMonth, "month")
283
+ ) < 0 ? focusedDate : null,
284
+ onHoveredDateChange: handleHoveredStartDateChange,
285
+ onFocusedDateChange: handleStartCalendarFocusedDateChange,
286
+ onVisibleMonthChange: handleStartVisibleMonthChange,
287
+ onSelectionChange: handleSelectionChange,
288
+ hideOutOfRangeDates: true,
289
+ minDate,
290
+ maxDate,
291
+ timezone,
292
+ ...StartCalendarPropsProp
293
+ };
294
+ const EndCalendarProps = {
295
+ visibleMonth: endVisibleMonth,
296
+ hoveredDate,
297
+ isDayHighlighted,
298
+ isDayUnselectable,
299
+ focusedDateRef: initialFocusRef,
300
+ focusedDate: focusedDate && dateAdapter.compare(
301
+ focusedDate,
302
+ dateAdapter.startOf(endVisibleMonth, "month")
303
+ ) >= 0 ? focusedDate : null,
304
+ selectedDate: calendarSelectedDate,
305
+ onFocusedDateChange: handleEndCalendarFocusedDateChange,
306
+ onHoveredDateChange: handleHoveredEndDateChange,
307
+ onVisibleMonthChange: handleEndVisibleMonthChange,
308
+ onSelectionChange: handleSelectionChange,
309
+ hideOutOfRangeDates: true,
310
+ minDate,
311
+ maxDate,
312
+ timezone,
313
+ ...EndCalendarPropsProp
314
+ };
315
+ return /* @__PURE__ */ jsxRuntime.jsxs(
316
+ core.StackLayout,
317
+ {
318
+ separators: true,
319
+ gap: 0,
320
+ className: clsx.clsx(className, withBaseName("container")),
321
+ ref: containerRef,
322
+ ...rest,
323
+ children: [
324
+ helperText && /* @__PURE__ */ jsxRuntime.jsx(core.FlexItem, { className: withBaseName("header"), children: /* @__PURE__ */ jsxRuntime.jsx(core.FormFieldHelperText, { children: helperText }) }),
325
+ /* @__PURE__ */ jsxRuntime.jsx(core.FlexLayout, { gap: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(core.FormFieldContext.Provider, { value: {}, children: [
326
+ /* @__PURE__ */ jsxRuntime.jsxs(Calendar.Calendar, { selectionVariant: "range", ...StartCalendarProps, children: [
327
+ /* @__PURE__ */ jsxRuntime.jsx(
328
+ CalendarNavigation.CalendarNavigation,
329
+ {
330
+ NextButtonProps: {
331
+ disabled: dateAdapter.isSame(
332
+ startVisibleMonth,
333
+ dateAdapter.subtract(maxDate, { months: 1 }),
334
+ "month"
335
+ )
336
+ },
337
+ ...StartCalendarNavigationProps
338
+ }
339
+ ),
340
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarGrid.CalendarGrid, { ...StartCalendarGridProps })
341
+ ] }),
342
+ /* @__PURE__ */ jsxRuntime.jsxs(Calendar.Calendar, { selectionVariant: "range", ...EndCalendarProps, children: [
343
+ /* @__PURE__ */ jsxRuntime.jsx(
344
+ CalendarNavigation.CalendarNavigation,
345
+ {
346
+ NextButtonProps: {
347
+ disabled: dateAdapter.isSame(
348
+ endVisibleMonth,
349
+ dateAdapter.add(minDate, { months: 1 }),
350
+ "month"
351
+ )
352
+ },
353
+ ...EndCalendarNavigationProps
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsxRuntime.jsx(CalendarGrid.CalendarGrid, { ...EndCalendarGridProps })
357
+ ] })
358
+ ] }) })
359
+ ]
360
+ }
361
+ );
362
+ });
363
+
364
+ exports.DatePickerRangePanel = DatePickerRangePanel;
365
+ //# sourceMappingURL=DatePickerRangePanel.js.map