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