@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,349 @@
1
+ import { makePrefixer, useControlled } from '@salt-ds/core';
2
+ import { clsx } from 'clsx';
3
+ import { useCallback, useMemo } from 'react';
4
+ import { useLocalization } from '../localization-provider/LocalizationProvider.js';
5
+ import { useCalendarContext } from './internal/CalendarContext.js';
6
+
7
+ function isDateRangeSelection(value) {
8
+ return !!value && !Array.isArray(value) && typeof value === "object" && ("startDate" in value || "endDate" in value);
9
+ }
10
+ function isMultiselect(props) {
11
+ return props.multiselect === true;
12
+ }
13
+ function selectDateRange(dateAdapter, previousSelectedDate, newDate) {
14
+ if ((previousSelectedDate == null ? void 0 : previousSelectedDate.startDate) && (previousSelectedDate == null ? void 0 : previousSelectedDate.endDate)) {
15
+ return {
16
+ startDate: newDate
17
+ };
18
+ }
19
+ if ((previousSelectedDate == null ? void 0 : previousSelectedDate.startDate) && dateAdapter.compare(newDate, previousSelectedDate == null ? void 0 : previousSelectedDate.startDate) >= 0) {
20
+ return {
21
+ ...previousSelectedDate,
22
+ endDate: newDate
23
+ };
24
+ }
25
+ return {
26
+ startDate: newDate
27
+ };
28
+ }
29
+ function selectMultiselectDateRange(dateAdapter, previousSelectedDate, newDate) {
30
+ const lastRange = previousSelectedDate.length ? previousSelectedDate[previousSelectedDate.length - 1] : void 0;
31
+ const isIncompleteRange = !(lastRange == null ? void 0 : lastRange.endDate);
32
+ if (isIncompleteRange) {
33
+ const isNewSelection = previousSelectedDate.length === 0;
34
+ if (isNewSelection) {
35
+ return [{ startDate: newDate }];
36
+ }
37
+ const completeDateRange = selectDateRange(
38
+ dateAdapter,
39
+ previousSelectedDate[previousSelectedDate.length - 1],
40
+ newDate
41
+ );
42
+ return [...previousSelectedDate.slice(0, -1), completeDateRange];
43
+ }
44
+ return [...previousSelectedDate, { startDate: newDate }];
45
+ }
46
+ function useCalendarSelection(props) {
47
+ const {
48
+ selectedDate: selectedDateProp,
49
+ defaultSelectedDate,
50
+ onSelectionChange,
51
+ isDaySelectable = () => true,
52
+ isOutsideAllowedDates = () => 0,
53
+ select: selectProp,
54
+ selectionVariant
55
+ // startDateOffset,
56
+ // endDateOffset,
57
+ } = props;
58
+ const { dateAdapter } = useLocalization();
59
+ const [selectedDate, setSelectedDateState] = useControlled({
60
+ controlled: selectedDateProp,
61
+ default: defaultSelectedDate,
62
+ name: "Calendar",
63
+ state: "selectedDate"
64
+ });
65
+ const setSelectedDate = useCallback(
66
+ (event, newSelectedDate) => {
67
+ if (!isDaySelectable || isDaySelectable(newSelectedDate)) {
68
+ const handleSelectionChange = (updatedSelection, changeHandler) => {
69
+ changeHandler == null ? void 0 : changeHandler(event, updatedSelection);
70
+ setSelectedDateState(updatedSelection);
71
+ };
72
+ switch (selectionVariant) {
73
+ case "single": {
74
+ if (isMultiselect(props)) {
75
+ const multipleSingleSelectedDate = selectedDate;
76
+ const select = selectProp;
77
+ const updatedSelection = select ? select(multipleSingleSelectedDate ?? [], newSelectedDate) : [...multipleSingleSelectedDate ?? [], newSelectedDate];
78
+ const changeHandler = onSelectionChange;
79
+ handleSelectionChange(updatedSelection, changeHandler);
80
+ } else {
81
+ const singleSelectedDate = selectedDate;
82
+ const select = selectProp;
83
+ const updatedSelection = select ? select(singleSelectedDate, newSelectedDate) : newSelectedDate;
84
+ const changeHandler = onSelectionChange;
85
+ handleSelectionChange(updatedSelection, changeHandler);
86
+ }
87
+ break;
88
+ }
89
+ case "range": {
90
+ if (isMultiselect(props)) {
91
+ const multipleRangeSelectedDate = selectedDate;
92
+ const select = selectProp;
93
+ const updatedSelection = select ? select(multipleRangeSelectedDate ?? [], newSelectedDate) : selectMultiselectDateRange(
94
+ dateAdapter,
95
+ multipleRangeSelectedDate ?? [],
96
+ newSelectedDate
97
+ );
98
+ const changeHandler = onSelectionChange;
99
+ handleSelectionChange(updatedSelection, changeHandler);
100
+ } else {
101
+ const rangeSelectedDate = selectedDate;
102
+ const select = selectProp;
103
+ const updatedSelection = select ? select(rangeSelectedDate, newSelectedDate) : selectDateRange(
104
+ dateAdapter,
105
+ rangeSelectedDate,
106
+ newSelectedDate
107
+ );
108
+ const changeHandler = onSelectionChange;
109
+ handleSelectionChange(updatedSelection, changeHandler);
110
+ }
111
+ break;
112
+ }
113
+ case "offset": {
114
+ const { startDateOffset, endDateOffset } = props;
115
+ if (isMultiselect(props)) {
116
+ const multipleOffsetSelectedDate = selectedDate;
117
+ const select = selectProp;
118
+ const updatedSelection = select ? select(multipleOffsetSelectedDate ?? [], newSelectedDate) : [
119
+ ...multipleOffsetSelectedDate ?? [],
120
+ {
121
+ startDate: newSelectedDate,
122
+ endDate: endDateOffset ? endDateOffset(newSelectedDate) : newSelectedDate
123
+ }
124
+ ];
125
+ const changeHandler = onSelectionChange;
126
+ handleSelectionChange(updatedSelection, changeHandler);
127
+ } else {
128
+ const offsetSelectedDate = selectedDate;
129
+ const select = selectProp;
130
+ const updatedSelection = select ? select(offsetSelectedDate, newSelectedDate) : {
131
+ startDate: startDateOffset ? startDateOffset(newSelectedDate) : newSelectedDate,
132
+ endDate: endDateOffset ? endDateOffset(newSelectedDate) : newSelectedDate
133
+ };
134
+ const changeHandler = onSelectionChange;
135
+ handleSelectionChange(updatedSelection, changeHandler);
136
+ }
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ },
142
+ [
143
+ dateAdapter,
144
+ isDaySelectable,
145
+ selectProp,
146
+ selectedDate,
147
+ selectionVariant,
148
+ onSelectionChange,
149
+ props
150
+ // Ensure props is included in the dependency array
151
+ ]
152
+ );
153
+ const isSelected = useCallback(
154
+ (date) => {
155
+ if (!selectedDate) {
156
+ return false;
157
+ }
158
+ if (selectionVariant === "single") {
159
+ const singleDates = Array.isArray(selectedDate) ? selectedDate : [selectedDate];
160
+ return singleDates.some(
161
+ (singleDate) => dateAdapter.isSame(singleDate, date, "day")
162
+ );
163
+ }
164
+ return false;
165
+ },
166
+ [dateAdapter, selectedDate, selectionVariant]
167
+ );
168
+ const isSameDay = useCallback(
169
+ (date) => {
170
+ const dateRanges = Array.isArray(selectedDate) ? selectedDate : [selectedDate];
171
+ return dateRanges.some((range) => {
172
+ if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(range) && (range == null ? void 0 : range.startDate) && (range == null ? void 0 : range.endDate) && dateAdapter.isSame(range == null ? void 0 : range.startDate, date, "day")) {
173
+ return dateAdapter.isSame(range == null ? void 0 : range.startDate, range == null ? void 0 : range.endDate, "day");
174
+ }
175
+ return false;
176
+ });
177
+ },
178
+ [dateAdapter, selectionVariant, selectedDate]
179
+ );
180
+ const isSelectedStart = useCallback(
181
+ (date) => {
182
+ if (selectionVariant === "single") {
183
+ return false;
184
+ }
185
+ const dateRanges = Array.isArray(selectedDate) ? selectedDate : [selectedDate];
186
+ return dateRanges.some((range) => {
187
+ if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(range) && dateAdapter.isValid(range.startDate) && isOutsideAllowedDates(range.startDate) === 0) {
188
+ return dateAdapter.isSame(range.startDate, date, "day");
189
+ }
190
+ return false;
191
+ });
192
+ },
193
+ [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate]
194
+ );
195
+ const isSelectedSpan = useCallback(
196
+ (date) => {
197
+ if (selectionVariant === "single") {
198
+ return false;
199
+ }
200
+ const dateRanges = Array.isArray(selectedDate) ? selectedDate : [selectedDate];
201
+ return dateRanges.some((range) => {
202
+ if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(range) && dateAdapter.isValid(range.startDate) && dateAdapter.isValid(range.endDate) && isOutsideAllowedDates(range.startDate) === 0 && isOutsideAllowedDates(range.endDate) === 0) {
203
+ return dateAdapter.compare(date, range.startDate) > 0 && dateAdapter.compare(date, range.endDate) < 0;
204
+ }
205
+ return false;
206
+ });
207
+ },
208
+ [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate]
209
+ );
210
+ const isSelectedEnd = useCallback(
211
+ (date) => {
212
+ if (selectionVariant === "single") {
213
+ return false;
214
+ }
215
+ const dateRanges = Array.isArray(selectedDate) ? selectedDate : [selectedDate];
216
+ return dateRanges.some((range) => {
217
+ if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(range) && dateAdapter.isValid(range.endDate) && isOutsideAllowedDates(range.endDate) === 0) {
218
+ return dateAdapter.isSame(range.endDate, date, "day");
219
+ }
220
+ return false;
221
+ });
222
+ },
223
+ [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate]
224
+ );
225
+ return useMemo(
226
+ () => ({
227
+ state: {
228
+ selectedDate
229
+ },
230
+ helpers: {
231
+ isSelected,
232
+ isSameDay,
233
+ setSelectedDate,
234
+ isSelectedStart,
235
+ isSelectedSpan,
236
+ isSelectedEnd
237
+ }
238
+ }),
239
+ [
240
+ selectedDate,
241
+ isSelected,
242
+ isSameDay,
243
+ isSelectedStart,
244
+ isSelectedSpan,
245
+ isSelectedEnd,
246
+ setSelectedDate
247
+ ]
248
+ );
249
+ }
250
+ const withBaseName = makePrefixer("saltCalendarDay");
251
+ function useCalendarSelectionDay({ date }) {
252
+ const { dateAdapter } = useLocalization();
253
+ const {
254
+ state: { selectionVariant, minDate, maxDate },
255
+ helpers: {
256
+ setSelectedDate,
257
+ isSameDay,
258
+ isSelected,
259
+ isSelectedStart,
260
+ isSelectedSpan,
261
+ isSelectedEnd,
262
+ isHovered,
263
+ isHoveredStart,
264
+ isHoveredSpan,
265
+ isHoveredEnd,
266
+ isDaySelectable
267
+ }
268
+ } = useCalendarContext();
269
+ const handleClick = useCallback(
270
+ (event) => {
271
+ setSelectedDate(event, date);
272
+ },
273
+ [date, setSelectedDate]
274
+ );
275
+ const handleKeyDown = useCallback(
276
+ (event) => {
277
+ switch (event.key) {
278
+ case "Space":
279
+ case "Enter":
280
+ setSelectedDate(event, date);
281
+ event.preventDefault();
282
+ }
283
+ },
284
+ [date, setSelectedDate]
285
+ );
286
+ const selected = isSelected(date);
287
+ const selectedStart = isSelectedStart(date);
288
+ const selectedSpan = isSelectedSpan(date);
289
+ const selectedEnd = isSelectedEnd(date);
290
+ const selectedOnSameDay = isSameDay(date);
291
+ const hovered = isHovered(date);
292
+ const hoveredStart = isHoveredStart(date);
293
+ const hoveredSpan = isHoveredSpan(date);
294
+ const hoveredEnd = isHoveredEnd(date);
295
+ const formattedDate = dateAdapter.format(date, "dddd D MMMM YYYY");
296
+ let ariaLabel = formattedDate;
297
+ if (selectionVariant === "single") {
298
+ if (selected) {
299
+ ariaLabel = `${ariaLabel}, selected`;
300
+ }
301
+ } else if (selectedStart) {
302
+ ariaLabel = `Start range: ${formattedDate}, selected`;
303
+ } else if (selectedEnd) {
304
+ ariaLabel = `End range: ${formattedDate}, selected`;
305
+ } else if (selectedSpan) {
306
+ ariaLabel = `In range: ${formattedDate}, selected`;
307
+ } else if (hoveredStart) {
308
+ ariaLabel = `Start new range: ${formattedDate}`;
309
+ } else if (hoveredEnd) {
310
+ ariaLabel = `Complete new range: ${formattedDate}`;
311
+ } else {
312
+ if (dateAdapter.isSame(minDate, date, "day")) {
313
+ ariaLabel = `${formattedDate}, minimum date`;
314
+ } else if (dateAdapter.isSame(maxDate, date, "day")) {
315
+ ariaLabel = `${formattedDate}, maximum date`;
316
+ }
317
+ }
318
+ return {
319
+ handleClick,
320
+ handleKeyDown,
321
+ status: {
322
+ hovered,
323
+ selected,
324
+ selectedStart,
325
+ selectedSpan,
326
+ selectedEnd,
327
+ hoveredStart,
328
+ hoveredSpan,
329
+ hoveredEnd
330
+ },
331
+ dayProps: {
332
+ className: clsx({
333
+ [withBaseName("selected")]: selectionVariant === "single" ? selected : void 0,
334
+ [withBaseName("selectedStart")]: selectionVariant !== "single" ? selectedStart : void 0,
335
+ [withBaseName("selectedSpan")]: selectionVariant !== "single" ? selectedSpan : void 0,
336
+ [withBaseName("selectedEnd")]: selectionVariant !== "single" ? selectedEnd : void 0,
337
+ [withBaseName("selectedSameDay")]: selectionVariant !== "single" && selectedOnSameDay,
338
+ [withBaseName("hoveredStart")]: selectionVariant !== "single" && hoveredStart,
339
+ [withBaseName("hoveredSpan")]: selectionVariant !== "single" && hoveredSpan,
340
+ [withBaseName("hoveredEnd")]: selectionVariant !== "single" && hoveredEnd
341
+ }),
342
+ "aria-disabled": isDaySelectable && !isDaySelectable(date) ? "true" : void 0,
343
+ "aria-label": ariaLabel
344
+ }
345
+ };
346
+ }
347
+
348
+ export { isDateRangeSelection, useCalendarSelection, useCalendarSelectionDay };
349
+ //# sourceMappingURL=useCalendarSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEventHandler,\n type MouseEventHandler,\n type SyntheticEvent,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\n\n/**\n * Type representing a single date selection.\n */\nexport type SingleDateSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n> = {\n /**\n * The start date of the range, or null if empty\n */\n startDate?: TDate | null;\n /**\n * The end date of the range, or null if empty\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<\n TDate extends DateFrameworkType = DateFrameworkType,\n>(value: unknown): value is DateRangeSelection<TDate> {\n return (\n !!value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\nexport type SelectionVariant = \"single\" | \"range\" | \"offset\";\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n */\nexport interface UseCalendarSelectionBaseProps<Selection> {\n /**\n * Determines if a date is outside the allowed date range.\n * @param date - The date to check.\n * @returns 0 if inside the date range, -1 if before the min date, 1 if after the max date.\n */\n isOutsideAllowedDates?: (date: DateFrameworkType) => -1 | 0 | 1;\n /**\n * Function to determine if a day is selectable.\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable?: (date: DateFrameworkType) => boolean;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: SelectionVariant;\n /**\n * The currently selected date.\n */\n selectedDate?: Selection;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Selection;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (event: SyntheticEvent, selectedDate: Selection) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Selection,\n newDate: DateFrameworkType,\n ) => Selection;\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: DateFrameworkType) => DateFrameworkType;\n}\n\nexport type UseCalendarSelectionSingleProps =\n UseCalendarSelectionBaseProps<SingleDateSelection<DateFrameworkType> | null> & {\n selectionVariant: \"single\";\n multiselect?: false;\n };\n\nexport type UseCalendarSelectionMultiselectSingleProps =\n UseCalendarSelectionBaseProps<\n Array<SingleDateSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"single\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionRangeProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"range\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectRangeProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"range\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionOffsetProps = UseCalendarSelectionBaseProps<\n DateRangeSelection<DateFrameworkType>\n> & {\n selectionVariant: \"offset\";\n multiselect?: false;\n};\n\nexport type UseCalendarSelectionMultiselectOffsetProps =\n UseCalendarSelectionBaseProps<\n Array<DateRangeSelection<DateFrameworkType>>\n > & {\n selectionVariant: \"offset\";\n multiselect: true;\n };\n\nexport type UseCalendarSelectionProps =\n | UseCalendarSelectionSingleProps\n | UseCalendarSelectionMultiselectSingleProps\n | UseCalendarSelectionRangeProps\n | UseCalendarSelectionMultiselectRangeProps\n | UseCalendarSelectionOffsetProps\n | UseCalendarSelectionMultiselectOffsetProps;\n\nfunction isMultiselect(\n props: UseCalendarSelectionProps,\n): props is\n | UseCalendarSelectionMultiselectSingleProps\n | UseCalendarSelectionMultiselectRangeProps\n | UseCalendarSelectionMultiselectOffsetProps {\n return props.multiselect === true;\n}\n\nfunction selectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange(\n dateAdapter: SaltDateAdapter,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>[],\n newDate: DateFrameworkType,\n): DateRangeSelection<DateFrameworkType>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection(props: UseCalendarSelectionProps) {\n const {\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n isDaySelectable = () => true,\n isOutsideAllowedDates = () => 0,\n select: selectProp,\n selectionVariant,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const setSelectedDate = useCallback(\n (\n event: SyntheticEvent<HTMLButtonElement>,\n newSelectedDate: DateFrameworkType,\n ) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (DateFrameworkType | null)\n | DateFrameworkType[]\n | (DateRangeSelection<DateFrameworkType> | null)\n | DateRangeSelection<DateFrameworkType>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (isMultiselect(props)) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps[\"select\"];\n const updatedSelection: Array<\n SingleDateSelection<DateFrameworkType>\n > = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<DateFrameworkType> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps[\"select\"];\n const updatedSelection: SingleDateSelection<DateFrameworkType> | null =\n select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (isMultiselect(props)) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionRangeProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n const { startDateOffset, endDateOffset } = props;\n if (isMultiselect(props)) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<DateFrameworkType>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType>[] =\n select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<DateFrameworkType>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps[\"select\"];\n const updatedSelection: DateRangeSelection<DateFrameworkType> =\n select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: startDateOffset\n ? startDateOffset(newSelectedDate)\n : newSelectedDate,\n endDate: endDateOffset\n ? endDateOffset(newSelectedDate)\n : newSelectedDate,\n };\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n props, // Ensure props is included in the dependency array\n ],\n );\n\n const isSelected = useCallback(\n (date: DateFrameworkType) => {\n if (!selectedDate) {\n return false;\n }\n if (selectionVariant === \"single\") {\n const singleDates = (\n Array.isArray(selectedDate) ? selectedDate : [selectedDate]\n ) as DateFrameworkType[];\n return singleDates.some((singleDate) =>\n dateAdapter.isSame(singleDate, date, \"day\"),\n );\n }\n return false;\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const isSameDay = useCallback(\n (date: DateFrameworkType) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n range?.startDate &&\n range?.endDate &&\n dateAdapter.isSame(range?.startDate, date, \"day\")\n ) {\n return dateAdapter.isSame(range?.startDate, range?.endDate, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, selectionVariant, selectedDate],\n );\n\n const isSelectedStart = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n isOutsideAllowedDates(range.startDate) === 0\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedSpan = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.startDate) === 0 &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: DateFrameworkType) => {\n if (selectionVariant === \"single\") {\n return false;\n }\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n isOutsideAllowedDates(range.endDate) === 0\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n return useMemo(\n () => ({\n state: {\n selectedDate,\n },\n helpers: {\n isSelected,\n isSameDay,\n setSelectedDate,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n },\n }),\n [\n selectedDate,\n isSelected,\n isSameDay,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n setSelectedDate,\n ],\n );\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport function useCalendarSelectionDay({ date }: { date: DateFrameworkType }) {\n const { dateAdapter } = useLocalization<DateFrameworkType>();\n const {\n state: { selectionVariant, minDate, maxDate },\n helpers: {\n setSelectedDate,\n isSameDay,\n isSelected,\n isSelectedStart,\n isSelectedSpan,\n isSelectedEnd,\n isHovered,\n isHoveredStart,\n isHoveredSpan,\n isHoveredEnd,\n isDaySelectable,\n },\n } = useCalendarContext();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const selectedStart = isSelectedStart(date);\n const selectedSpan = isSelectedSpan(date);\n const selectedEnd = isSelectedEnd(date);\n const selectedOnSameDay = isSameDay(date);\n\n const hovered = isHovered(date);\n const hoveredStart = isHoveredStart(date);\n const hoveredSpan = isHoveredSpan(date);\n const hoveredEnd = isHoveredEnd(date);\n\n const formattedDate = dateAdapter.format(date, \"dddd D MMMM YYYY\");\n\n // Determine aria-label based on selection state\n let ariaLabel = formattedDate;\n if (selectionVariant === \"single\") {\n if (selected) {\n ariaLabel = `${ariaLabel}, selected`;\n }\n } else if (selectedStart) {\n ariaLabel = `Start range: ${formattedDate}, selected`;\n } else if (selectedEnd) {\n ariaLabel = `End range: ${formattedDate}, selected`;\n } else if (selectedSpan) {\n ariaLabel = `In range: ${formattedDate}, selected`;\n } else if (hoveredStart) {\n ariaLabel = `Start new range: ${formattedDate}`;\n } else if (hoveredEnd) {\n ariaLabel = `Complete new range: ${formattedDate}`;\n } else {\n if (dateAdapter.isSame(minDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, minimum date`;\n } else if (dateAdapter.isSame(maxDate, date, \"day\")) {\n ariaLabel = `${formattedDate}, maximum date`;\n }\n }\n\n return {\n handleClick,\n handleKeyDown,\n status: {\n hovered,\n selected,\n selectedStart,\n selectedSpan,\n selectedEnd,\n hoveredStart,\n hoveredSpan,\n hoveredEnd,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]:\n selectionVariant === \"single\" ? selected : undefined,\n [withBaseName(\"selectedStart\")]:\n selectionVariant !== \"single\" ? selectedStart : undefined,\n [withBaseName(\"selectedSpan\")]:\n selectionVariant !== \"single\" ? selectedSpan : undefined,\n [withBaseName(\"selectedEnd\")]:\n selectionVariant !== \"single\" ? selectedEnd : undefined,\n [withBaseName(\"selectedSameDay\")]:\n selectionVariant !== \"single\" && selectedOnSameDay,\n [withBaseName(\"hoveredStart\")]:\n selectionVariant !== \"single\" && hoveredStart,\n [withBaseName(\"hoveredSpan\")]:\n selectionVariant !== \"single\" && hoveredSpan,\n [withBaseName(\"hoveredEnd\")]:\n selectionVariant !== \"single\" && hoveredEnd,\n }),\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n \"aria-label\": ariaLabel,\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { useAriaAnnouncer } from '@salt-ds/core';
2
+ import { useRef, useCallback, useEffect } from 'react';
3
+
4
+ const DEBOUNCE_MSECS = 2e3;
5
+ function useDateSelectionAnnouncer(createAnnouncement, dateAdapter) {
6
+ const { announce: saltAnnouncer } = useAriaAnnouncer();
7
+ const createAnnouncementRef = useRef(createAnnouncement);
8
+ createAnnouncementRef.current = createAnnouncement;
9
+ const dateAdapterRef = useRef(dateAdapter);
10
+ dateAdapterRef.current = dateAdapter;
11
+ const latestAnnouncementRef = useRef(null);
12
+ const timerRef = useRef(null);
13
+ const announce = useCallback(
14
+ (announcementType, state) => {
15
+ const create = createAnnouncementRef.current;
16
+ if (!create) {
17
+ return;
18
+ }
19
+ const announcement = create(
20
+ announcementType,
21
+ state ?? {},
22
+ dateAdapterRef.current
23
+ );
24
+ if (announcement) {
25
+ latestAnnouncementRef.current = announcement;
26
+ if (timerRef.current) {
27
+ clearTimeout(timerRef.current);
28
+ }
29
+ timerRef.current = setTimeout(() => {
30
+ if (latestAnnouncementRef.current) {
31
+ saltAnnouncer(latestAnnouncementRef.current);
32
+ latestAnnouncementRef.current = null;
33
+ }
34
+ }, DEBOUNCE_MSECS);
35
+ }
36
+ },
37
+ [saltAnnouncer]
38
+ );
39
+ useEffect(() => {
40
+ return () => {
41
+ if (timerRef.current) {
42
+ clearTimeout(timerRef.current);
43
+ }
44
+ };
45
+ }, []);
46
+ return { announce };
47
+ }
48
+
49
+ export { useDateSelectionAnnouncer };
50
+ //# sourceMappingURL=useDateSelectionAnnouncer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDateSelectionAnnouncer.js","sources":["../src/calendar/useDateSelectionAnnouncer.ts"],"sourcesContent":["import { useAriaAnnouncer } from \"@salt-ds/core\";\nimport type { SaltDateAdapter } from \"@salt-ds/date-adapters\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport type {\n AnnouncementType,\n DateSelectionAnnouncerState,\n} from \"./internal/createAnnouncement\";\n\nexport type CreateAnnouncement = (\n announcementType: AnnouncementType,\n state: DateSelectionAnnouncerState,\n dateAdapter: SaltDateAdapter,\n) => string | undefined;\n\nconst DEBOUNCE_MSECS = 2000;\n\nexport function useDateSelectionAnnouncer(\n createAnnouncement: CreateAnnouncement | null | undefined,\n dateAdapter: SaltDateAdapter,\n) {\n const { announce: saltAnnouncer } = useAriaAnnouncer();\n\n // Ensure the returned announce function always uses the latest inputs.\n const createAnnouncementRef = useRef(createAnnouncement);\n createAnnouncementRef.current = createAnnouncement;\n\n const dateAdapterRef = useRef(dateAdapter);\n dateAdapterRef.current = dateAdapter;\n\n const latestAnnouncementRef = useRef<string | null>(null);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /**\n * Call this function with the announcement type and the state needed for that announcement.\n * Example:\n * announce(\"dateSelected\", { multiselect, selectedDate });\n * announce(\"visibleMonthChanged\", { startVisibleMonth, endVisibleMonth });\n */\n const announce = useCallback(\n (\n announcementType: AnnouncementType,\n state?: DateSelectionAnnouncerState | undefined,\n ) => {\n const create = createAnnouncementRef.current;\n if (!create) {\n return;\n }\n const announcement = create(\n announcementType,\n state ?? {},\n dateAdapterRef.current,\n );\n\n if (announcement) {\n latestAnnouncementRef.current = announcement;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n if (latestAnnouncementRef.current) {\n saltAnnouncer(latestAnnouncementRef.current);\n latestAnnouncementRef.current = null;\n }\n }, DEBOUNCE_MSECS);\n }\n },\n [saltAnnouncer],\n );\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return { announce };\n}\n"],"names":[],"mappings":";;;AAcA,MAAM,cAAA,GAAiB,GAAA;AAEhB,SAAS,yBAAA,CACd,oBACA,WAAA,EACA;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,aAAA,EAAc,GAAI,gBAAA,EAAiB;AAGrD,EAAA,MAAM,qBAAA,GAAwB,OAAO,kBAAkB,CAAA;AACvD,EAAA,qBAAA,CAAsB,OAAA,GAAU,kBAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAW,CAAA;AACzC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAEzB,EAAA,MAAM,qBAAA,GAAwB,OAAsB,IAAI,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,OAA8B,IAAI,CAAA;AAQnD,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CACE,kBACA,KAAA,KACG;AACH,MAAA,MAAM,SAAS,qBAAA,CAAsB,OAAA;AACrC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,YAAA,GAAe,MAAA;AAAA,QACnB,gBAAA;AAAA,QACA,SAAS,EAAC;AAAA,QACV,cAAA,CAAe;AAAA,OACjB;AAEA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,qBAAA,CAAsB,OAAA,GAAU,YAAA;AAEhC,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,QAC/B;AAEA,QAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,UAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,YAAA,aAAA,CAAc,sBAAsB,OAAO,CAAA;AAC3C,YAAA,qBAAA,CAAsB,OAAA,GAAU,IAAA;AAAA,UAClC;AAAA,QACF,GAAG,cAAc,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = "/* Style applied to the root element */\n.saltDateInput {\n align-items: center;\n background: var(--saltDateInput-background, var(--input-background));\n border-radius: var(--salt-palette-corner-weak, 0);\n color: var(--saltDateInput-color, var(--salt-content-primary-foreground));\n display: inline-flex;\n font-family: var(--salt-text-fontFamily);\n font-size: var(--saltDateInput-fontSize, var(--salt-text-fontSize));\n line-height: var(--saltDateInput-lineHeight, var(--salt-text-lineHeight));\n letter-spacing: var(--salt-text-letterSpacing);\n height: var(--saltDateInput-height, var(--salt-size-base));\n min-height: var(--saltDateInput-minHeight, var(--salt-size-base));\n min-width: var(--saltDateInput-minWidth, 4em);\n padding-left: var(--saltDateInput-paddingLeft, var(--salt-spacing-100));\n padding-right: var(--saltDateInput-paddingRight, var(--salt-spacing-100));\n position: relative;\n box-sizing: border-box;\n overflow: hidden;\n width: 100%;\n}\n\n.saltDateInput:hover {\n cursor: var(--salt-cursor-text);\n}\n\n/* Style applied if `bordered={true}` */\n.saltDateInput-bordered.saltDateInput {\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput-bordered.saltDateInput:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-bordered.saltDateInput-focused,\n.saltDateInput-bordered.saltDateInput-focused:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--input-borderColor-active);\n}\n\n.saltDateInput-bordered.saltDateInput-readOnly,\n.saltDateInput-bordered.saltDateInput-readOnly:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-bordered.saltDateInput-disabled,\n.saltDateInput-bordered.saltDateInput-disabled:hover {\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-activationIndicator {\n left: 0;\n bottom: 0;\n width: 100%;\n position: absolute;\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--input-borderColor);\n}\n\n.saltDateInput:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--input-borderColor-hover);\n}\n\n.saltDateInput-focused .saltDateInput-activationIndicator,\n.saltDateInput-focused:hover .saltDateInput-activationIndicator {\n border-bottom: var(--salt-size-fixed-200) var(--salt-borderStyle-solid) var(--input-borderColor-active);\n}\n\n.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-readOnly:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-readonly);\n}\n\n.saltDateInput-disabled .saltDateInput-activationIndicator,\n.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-style: var(--salt-borderStyle-solid);\n border-bottom-color: var(--salt-editable-borderColor-disabled);\n}\n\n.saltDateInput-bordered .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-readOnly .saltDateInput-activationIndicator,\n.saltDateInput-bordered.saltDateInput-disabled:hover .saltDateInput-activationIndicator {\n border-bottom-width: 0;\n}\n\n.saltDateInput-bordered.saltDateInput-focused .saltDateInput-activationIndicator {\n /* Activation indicator width minus the border from the input. */\n border-bottom-width: var(--salt-size-fixed-100);\n}\n\n/* Class applied if `variant=\"primary\"` */\n.saltDateInput-primary {\n --input-background: var(--salt-editable-primary-background);\n --input-background-disabled: var(--salt-editable-primary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"secondary\"` */\n.saltDateInput-secondary {\n --input-background: var(--salt-editable-secondary-background);\n --input-background-disabled: var(--salt-editable-secondary-background-disabled);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Class applied if `variant=\"tertiary\"` */\n.saltDateInput-tertiary {\n --input-background: var(--salt-editable-tertiary-background);\n --input-background-readonly: var(--salt-editable-background-readonly);\n --input-borderColor: var(--salt-editable-borderColor);\n --input-borderColor-active: var(--salt-editable-borderColor-active);\n --input-borderColor-hover: var(--salt-editable-borderColor-hover);\n --input-outlineColor: var(--salt-focused-outlineColor);\n}\n\n/* Style applied to input if `validationState=\"error\"` */\n.saltDateInput-error {\n --input-background: var(--salt-status-error-background);\n --input-background-readonly: var(--salt-status-error-background);\n --input-borderColor: var(--salt-status-error-borderColor);\n --input-borderColor-active: var(--salt-status-error-borderColor);\n --input-borderColor-hover: var(--salt-status-error-borderColor);\n --input-outlineColor: var(--salt-status-error-borderColor);\n}\n\n/* Style applied to input if `validationState=\"warning\"` */\n.saltDateInput-warning {\n --input-background: var(--salt-status-warning-background);\n --input-background-readonly: var(--salt-status-warning-background);\n --input-borderColor: var(--salt-status-warning-borderColor);\n --input-borderColor-active: var(--salt-status-warning-borderColor);\n --input-borderColor-hover: var(--salt-status-warning-borderColor);\n --input-outlineColor: var(--salt-status-warning-borderColor);\n}\n\n/* Style applied to input if `validationState=\"success\"` */\n.saltDateInput-success {\n --input-background: var(--salt-status-success-background);\n --input-background-readonly: var(--salt-status-success-background);\n --input-borderColor: var(--salt-status-success-borderColor);\n --input-borderColor-active: var(--salt-status-success-borderColor);\n --input-borderColor-hover: var(--salt-status-success-borderColor);\n --input-outlineColor: var(--salt-status-success-borderColor);\n}\n\n/* Styling when focused */\n.saltDateInput-focused,\n.saltDateInput-focused:hover {\n cursor: var(--salt-cursor-text);\n outline: var(--saltDateInput-outline, var(--salt-focused-outlineWidth) var(--salt-focused-outlineStyle) var(--input-outlineColor));\n}\n\n/* Style applied if `readOnly={true}` */\n.saltDateInput.saltDateInput-readOnly {\n background: var(--input-background-readonly);\n cursor: var(--salt-cursor-readonly);\n}\n\n/* Styling when focused if `disabled={true}` */\n.saltDateInput-disabled,\n.saltDateInput-disabled:hover {\n background: var(--input-background-disabled);\n cursor: var(--salt-cursor-disabled);\n color: var(--saltDateInput-color-disabled, var(--salt-content-primary-foreground-disabled));\n}\n\n/* Style applied to start adornments */\n.saltDateInput-startAdornmentContainer {\n align-items: center;\n display: inline-flex;\n padding-right: var(--salt-spacing-100);\n column-gap: var(--salt-spacing-100);\n}\n\n/* Style applied to end adornments */\n.saltDateInput-endAdornmentContainer {\n display: inline-flex;\n column-gap: var(--salt-spacing-50);\n align-items: flex-end;\n}\n\n.saltDateInput-endAdornmentContainer .saltButton ~ .saltButton {\n margin-left: calc(-1 * var(--salt-spacing-50));\n}\n\n.saltDateInput-endAdornmentContainer .saltButton:last-child {\n margin-right: calc(var(--salt-spacing-50) * -1);\n}\n\n.saltDateInput-startAdornmentContainer > .saltButton,\n.saltDateInput-endAdornmentContainer > .saltButton {\n --saltButton-padding: calc(var(--salt-spacing-50) - var(--button-borderWidth));\n --saltButton-height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n --saltButton-borderRadius: var(--salt-palette-corner-weaker);\n}\n\n/* Style applied to inner input component */\n.saltDateInput-input {\n background: none;\n border: none;\n box-sizing: content-box;\n color: inherit;\n cursor: inherit;\n display: block;\n font: inherit;\n height: 100%;\n letter-spacing: var(--saltDateInput-letterSpacing, 0);\n margin: 0;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n text-align: left;\n width: 100%;\n}\n\n/* Reset in the class */\n.saltDateInput-input:focus {\n outline: none;\n}\n\n/* Style applied to selected input if `disabled={true}` */\n.saltDateInput-disabled .saltDateInput-input::selection {\n background: none;\n}\n\n/* Style applied to placeholder text */\n.saltDateInput-input::placeholder {\n color: var(--salt-content-secondary-foreground);\n font-weight: var(--salt-text-fontWeight-small);\n}\n\n/* Style applied to the dash between two inputs in range date input */\n.saltDateInput-dash {\n margin: 0 var(--salt-spacing-50);\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=DateInput.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateInput.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}