@salt-ds/lab 1.0.0-alpha.55 → 1.0.0-alpha.57

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 (188) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/css/salt-lab.css +44 -7
  3. package/dist-cjs/calendar/Calendar.js +12 -12
  4. package/dist-cjs/calendar/Calendar.js.map +1 -1
  5. package/dist-cjs/calendar/CalendarGrid.css.js +6 -0
  6. package/dist-cjs/calendar/CalendarGrid.css.js.map +1 -0
  7. package/dist-cjs/calendar/CalendarGrid.js +107 -0
  8. package/dist-cjs/calendar/CalendarGrid.js.map +1 -0
  9. package/dist-cjs/calendar/CalendarNavigation.js +219 -201
  10. package/dist-cjs/calendar/CalendarNavigation.js.map +1 -1
  11. package/dist-cjs/calendar/CalendarWeekHeader.js +10 -4
  12. package/dist-cjs/calendar/CalendarWeekHeader.js.map +1 -1
  13. package/dist-cjs/calendar/internal/CalendarContext.js +6 -2
  14. package/dist-cjs/calendar/internal/CalendarContext.js.map +1 -1
  15. package/dist-cjs/calendar/internal/CalendarDay.js +6 -9
  16. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
  17. package/dist-cjs/calendar/internal/CalendarMonth.css.js +1 -1
  18. package/dist-cjs/calendar/internal/CalendarMonth.js +47 -54
  19. package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
  20. package/dist-cjs/calendar/internal/useFocusManagement.js +18 -18
  21. package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
  22. package/dist-cjs/calendar/internal/utils.js +33 -48
  23. package/dist-cjs/calendar/internal/utils.js.map +1 -1
  24. package/dist-cjs/calendar/useCalendar.js +46 -38
  25. package/dist-cjs/calendar/useCalendar.js.map +1 -1
  26. package/dist-cjs/calendar/useCalendarDay.js +15 -21
  27. package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
  28. package/dist-cjs/calendar/useCalendarSelection.js +44 -35
  29. package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
  30. package/dist-cjs/date-input/DateInput.css.js +1 -1
  31. package/dist-cjs/date-input/DateInputRange.js +102 -107
  32. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  33. package/dist-cjs/date-input/DateInputSingle.js +39 -51
  34. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  35. package/dist-cjs/date-picker/DatePicker.js +15 -13
  36. package/dist-cjs/date-picker/DatePicker.js.map +1 -1
  37. package/dist-cjs/date-picker/DatePickerActions.js +3 -8
  38. package/dist-cjs/date-picker/DatePickerActions.js.map +1 -1
  39. package/dist-cjs/date-picker/DatePickerContext.js +6 -2
  40. package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
  41. package/dist-cjs/date-picker/DatePickerOverlay.js +1 -0
  42. package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -1
  43. package/dist-cjs/date-picker/DatePickerOverlayProvider.js +21 -8
  44. package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -1
  45. package/dist-cjs/date-picker/DatePickerRangeInput.js +77 -28
  46. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  47. package/dist-cjs/date-picker/DatePickerRangePanel.js +45 -40
  48. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
  49. package/dist-cjs/date-picker/DatePickerSingleInput.js +123 -84
  50. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  51. package/dist-cjs/date-picker/DatePickerSinglePanel.js +17 -20
  52. package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -1
  53. package/dist-cjs/date-picker/DatePickerTrigger.js +32 -0
  54. package/dist-cjs/date-picker/DatePickerTrigger.js.map +1 -0
  55. package/dist-cjs/date-picker/useDatePicker.js +60 -110
  56. package/dist-cjs/date-picker/useDatePicker.js.map +1 -1
  57. package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
  58. package/dist-cjs/index.js +19 -20
  59. package/dist-cjs/index.js.map +1 -1
  60. package/dist-cjs/localization-provider/LocalizationProvider.js +48 -0
  61. package/dist-cjs/localization-provider/LocalizationProvider.js.map +1 -0
  62. package/dist-cjs/overlay/OverlayHeader.css.js +6 -0
  63. package/dist-cjs/overlay/OverlayHeader.css.js.map +1 -0
  64. package/dist-cjs/overlay/OverlayHeader.js +35 -0
  65. package/dist-cjs/overlay/OverlayHeader.js.map +1 -0
  66. package/dist-cjs/system-status/SystemStatus.css.js +1 -1
  67. package/dist-cjs/tabs-next/TabListNext.css.js +1 -1
  68. package/dist-cjs/tabs-next/TabListNext.js +4 -0
  69. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  70. package/dist-es/calendar/Calendar.js +12 -12
  71. package/dist-es/calendar/Calendar.js.map +1 -1
  72. package/dist-es/calendar/CalendarGrid.css.js +4 -0
  73. package/dist-es/calendar/CalendarGrid.css.js.map +1 -0
  74. package/dist-es/calendar/CalendarGrid.js +105 -0
  75. package/dist-es/calendar/CalendarGrid.js.map +1 -0
  76. package/dist-es/calendar/CalendarNavigation.js +220 -202
  77. package/dist-es/calendar/CalendarNavigation.js.map +1 -1
  78. package/dist-es/calendar/CalendarWeekHeader.js +11 -5
  79. package/dist-es/calendar/CalendarWeekHeader.js.map +1 -1
  80. package/dist-es/calendar/internal/CalendarContext.js +6 -2
  81. package/dist-es/calendar/internal/CalendarContext.js.map +1 -1
  82. package/dist-es/calendar/internal/CalendarDay.js +6 -9
  83. package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
  84. package/dist-es/calendar/internal/CalendarMonth.css.js +1 -1
  85. package/dist-es/calendar/internal/CalendarMonth.js +48 -55
  86. package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
  87. package/dist-es/calendar/internal/useFocusManagement.js +15 -15
  88. package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
  89. package/dist-es/calendar/internal/utils.js +32 -45
  90. package/dist-es/calendar/internal/utils.js.map +1 -1
  91. package/dist-es/calendar/useCalendar.js +40 -32
  92. package/dist-es/calendar/useCalendar.js.map +1 -1
  93. package/dist-es/calendar/useCalendarDay.js +11 -17
  94. package/dist-es/calendar/useCalendarDay.js.map +1 -1
  95. package/dist-es/calendar/useCalendarSelection.js +40 -29
  96. package/dist-es/calendar/useCalendarSelection.js.map +1 -1
  97. package/dist-es/date-input/DateInput.css.js +1 -1
  98. package/dist-es/date-input/DateInputRange.js +101 -107
  99. package/dist-es/date-input/DateInputRange.js.map +1 -1
  100. package/dist-es/date-input/DateInputSingle.js +39 -51
  101. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  102. package/dist-es/date-picker/DatePicker.js +15 -13
  103. package/dist-es/date-picker/DatePicker.js.map +1 -1
  104. package/dist-es/date-picker/DatePickerActions.js +3 -8
  105. package/dist-es/date-picker/DatePickerActions.js.map +1 -1
  106. package/dist-es/date-picker/DatePickerContext.js +6 -2
  107. package/dist-es/date-picker/DatePickerContext.js.map +1 -1
  108. package/dist-es/date-picker/DatePickerOverlay.js +1 -0
  109. package/dist-es/date-picker/DatePickerOverlay.js.map +1 -1
  110. package/dist-es/date-picker/DatePickerOverlayProvider.js +21 -8
  111. package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -1
  112. package/dist-es/date-picker/DatePickerRangeInput.js +78 -30
  113. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  114. package/dist-es/date-picker/DatePickerRangePanel.js +44 -39
  115. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
  116. package/dist-es/date-picker/DatePickerSingleInput.js +124 -85
  117. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  118. package/dist-es/date-picker/DatePickerSinglePanel.js +17 -20
  119. package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -1
  120. package/dist-es/date-picker/DatePickerTrigger.js +30 -0
  121. package/dist-es/date-picker/DatePickerTrigger.js.map +1 -0
  122. package/dist-es/date-picker/useDatePicker.js +61 -111
  123. package/dist-es/date-picker/useDatePicker.js.map +1 -1
  124. package/dist-es/dropdown/DropdownButton.js.map +1 -1
  125. package/dist-es/index.js +8 -7
  126. package/dist-es/index.js.map +1 -1
  127. package/dist-es/localization-provider/LocalizationProvider.js +44 -0
  128. package/dist-es/localization-provider/LocalizationProvider.js.map +1 -0
  129. package/dist-es/overlay/OverlayHeader.css.js +4 -0
  130. package/dist-es/overlay/OverlayHeader.css.js.map +1 -0
  131. package/dist-es/overlay/OverlayHeader.js +33 -0
  132. package/dist-es/overlay/OverlayHeader.js.map +1 -0
  133. package/dist-es/system-status/SystemStatus.css.js +1 -1
  134. package/dist-es/tabs-next/TabListNext.css.js +1 -1
  135. package/dist-es/tabs-next/TabListNext.js +5 -1
  136. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  137. package/dist-types/calendar/Calendar.d.ts +11 -6
  138. package/dist-types/calendar/CalendarGrid.d.ts +13 -0
  139. package/dist-types/calendar/CalendarNavigation.d.ts +9 -11
  140. package/dist-types/calendar/CalendarWeekHeader.d.ts +4 -3
  141. package/dist-types/calendar/index.d.ts +1 -2
  142. package/dist-types/calendar/internal/CalendarContext.d.ts +5 -6
  143. package/dist-types/calendar/internal/CalendarDay.d.ts +6 -8
  144. package/dist-types/calendar/internal/CalendarMonth.d.ts +5 -6
  145. package/dist-types/calendar/internal/useFocusManagement.d.ts +3 -4
  146. package/dist-types/calendar/internal/utils.d.ts +7 -11
  147. package/dist-types/calendar/useCalendar.d.ts +207 -55
  148. package/dist-types/calendar/useCalendarDay.d.ts +5 -7
  149. package/dist-types/calendar/useCalendarSelection.d.ts +92 -58
  150. package/dist-types/date-input/DateInputRange.d.ts +38 -56
  151. package/dist-types/date-input/DateInputSingle.d.ts +32 -49
  152. package/dist-types/date-input/index.d.ts +0 -1
  153. package/dist-types/date-picker/DatePicker.d.ts +23 -5
  154. package/dist-types/date-picker/DatePickerActions.d.ts +13 -12
  155. package/dist-types/date-picker/DatePickerContext.d.ts +42 -59
  156. package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +10 -0
  157. package/dist-types/date-picker/DatePickerRangeInput.d.ts +13 -3
  158. package/dist-types/date-picker/DatePickerRangePanel.d.ts +17 -17
  159. package/dist-types/date-picker/DatePickerSingleInput.d.ts +12 -3
  160. package/dist-types/date-picker/DatePickerSinglePanel.d.ts +11 -11
  161. package/dist-types/date-picker/DatePickerTrigger.d.ts +9 -0
  162. package/dist-types/date-picker/index.d.ts +3 -2
  163. package/dist-types/date-picker/useDatePicker.d.ts +52 -59
  164. package/dist-types/index.d.ts +2 -0
  165. package/dist-types/localization-provider/LocalizationProvider.d.ts +62 -0
  166. package/dist-types/localization-provider/index.d.ts +1 -0
  167. package/dist-types/overlay/OverlayHeader.d.ts +20 -0
  168. package/dist-types/overlay/index.d.ts +1 -0
  169. package/package.json +11 -3
  170. package/dist-cjs/calendar/CalendarDateGrid.css.js +0 -6
  171. package/dist-cjs/calendar/CalendarDateGrid.css.js.map +0 -1
  172. package/dist-cjs/calendar/CalendarDateGrid.js +0 -105
  173. package/dist-cjs/calendar/CalendarDateGrid.js.map +0 -1
  174. package/dist-cjs/calendar/formatDate.js +0 -51
  175. package/dist-cjs/calendar/formatDate.js.map +0 -1
  176. package/dist-cjs/date-input/utils.js +0 -63
  177. package/dist-cjs/date-input/utils.js.map +0 -1
  178. package/dist-es/calendar/CalendarDateGrid.css.js +0 -4
  179. package/dist-es/calendar/CalendarDateGrid.css.js.map +0 -1
  180. package/dist-es/calendar/CalendarDateGrid.js +0 -103
  181. package/dist-es/calendar/CalendarDateGrid.js.map +0 -1
  182. package/dist-es/calendar/formatDate.js +0 -48
  183. package/dist-es/calendar/formatDate.js.map +0 -1
  184. package/dist-es/date-input/utils.js +0 -57
  185. package/dist-es/date-input/utils.js.map +0 -1
  186. package/dist-types/calendar/CalendarDateGrid.d.ts +0 -10
  187. package/dist-types/calendar/formatDate.d.ts +0 -14
  188. package/dist-types/date-input/utils.d.ts +0 -43
@@ -1,15 +1,13 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { makePrefixer, useIcon, Button, Dropdown, Tooltip, useListControlContext, Option } from '@salt-ds/core';
3
- import { clsx } from 'clsx';
4
- import { forwardRef, useCallback, useMemo } from 'react';
5
- import { useCalendarContext } from './internal/CalendarContext.js';
6
- import { CALENDAR_MAX_YEAR, CALENDAR_MIN_YEAR } from './useCalendarSelection.js';
7
- import { isSameMonth, isSameYear, CalendarDate } from '@internationalized/date';
8
3
  import { useComponentCssInjection } from '@salt-ds/styles';
9
4
  import { useWindow } from '@salt-ds/window';
5
+ import { clsx } from 'clsx';
6
+ import { forwardRef, useCallback, useMemo } from 'react';
7
+ import { useLocalization } from '../localization-provider/LocalizationProvider.js';
10
8
  import css_248z from './CalendarNavigation.css.js';
11
- import { formatDate } from './formatDate.js';
12
- import { monthsForLocale, monthDiff } from './internal/utils.js';
9
+ import { useCalendarContext } from './internal/CalendarContext.js';
10
+ import { generateMonthsForYear, monthDiff } from './internal/utils.js';
13
11
 
14
12
  const withBaseName = makePrefixer("saltCalendarNavigation");
15
13
  const ConditionalTooltip = ({
@@ -22,16 +20,18 @@ const ConditionalTooltip = ({
22
20
  }
23
21
  return /* @__PURE__ */ jsx(Tooltip, { ...rest, children });
24
22
  };
25
- function generateYearsBetweenRange(minYear, maxYear) {
23
+ function generateYearsBetweenRange(dateAdapter, minYear, maxYear) {
26
24
  const years = [];
27
25
  for (let year = minYear; year <= maxYear; year++) {
28
- years.push(new CalendarDate(year, 1, 1));
26
+ let startOfYear = dateAdapter.today();
27
+ startOfYear = dateAdapter.set(startOfYear, { day: 1, month: 1, year });
28
+ years.push(startOfYear);
29
29
  }
30
30
  return years;
31
31
  }
32
32
  function useCalendarNavigation() {
33
33
  const {
34
- state: { visibleMonth, minDate, maxDate, locale, timeZone },
34
+ state: { visibleMonth, locale, minDate, maxDate },
35
35
  helpers: {
36
36
  setVisibleMonth,
37
37
  isDayVisible,
@@ -39,77 +39,87 @@ function useCalendarNavigation() {
39
39
  isOutsideAllowedMonths
40
40
  }
41
41
  } = useCalendarContext();
42
+ const { dateAdapter } = useLocalization();
42
43
  const moveToNextMonth = useCallback(
43
44
  (event, step = 1) => {
44
- setVisibleMonth(event, visibleMonth.add({ months: step }));
45
+ setVisibleMonth(event, dateAdapter.add(visibleMonth, { months: step }));
45
46
  },
46
- [setVisibleMonth, visibleMonth]
47
+ [dateAdapter, setVisibleMonth, visibleMonth]
47
48
  );
48
49
  const moveToPreviousMonth = useCallback(
49
50
  (event, step = 1) => {
50
- setVisibleMonth(event, visibleMonth.subtract({ months: step }));
51
+ setVisibleMonth(
52
+ event,
53
+ dateAdapter.subtract(visibleMonth, { months: step })
54
+ );
51
55
  },
52
- [setVisibleMonth, visibleMonth]
56
+ [dateAdapter, setVisibleMonth, visibleMonth]
53
57
  );
54
58
  const moveToMonth = useCallback(
55
59
  (event, month) => {
56
60
  let newMonth = month;
57
- if (!isOutsideAllowedYears(newMonth)) {
58
- if (isOutsideAllowedMonths(newMonth)) {
59
- const navigableMonths = monthsForLocale(visibleMonth, locale).filter(
60
- (n) => !isOutsideAllowedMonths(n)
61
- );
62
- newMonth = navigableMonths.reduce(
63
- (closestMonth, currentMonth) => Math.abs(monthDiff(currentMonth, newMonth)) < Math.abs(monthDiff(closestMonth, newMonth)) ? currentMonth : closestMonth
64
- );
65
- }
66
- setVisibleMonth(event, newMonth);
61
+ if (isOutsideAllowedMonths(newMonth)) {
62
+ const navigableMonths = generateMonthsForYear(
63
+ dateAdapter,
64
+ visibleMonth
65
+ ).filter((n) => !isOutsideAllowedMonths(n));
66
+ newMonth = navigableMonths.reduce(
67
+ (closestMonth, currentMonth) => Math.abs(monthDiff(dateAdapter, currentMonth, newMonth)) < Math.abs(monthDiff(dateAdapter, closestMonth, newMonth)) ? currentMonth : closestMonth
68
+ );
67
69
  }
70
+ setVisibleMonth(event, newMonth);
68
71
  },
69
72
  [
73
+ dateAdapter,
70
74
  isOutsideAllowedYears,
71
75
  isOutsideAllowedMonths,
72
76
  setVisibleMonth,
73
- visibleMonth,
74
- locale
77
+ visibleMonth
75
78
  ]
76
79
  );
77
80
  const months = useMemo(
78
- () => monthsForLocale(visibleMonth, locale),
79
- [visibleMonth, locale]
81
+ () => generateMonthsForYear(dateAdapter, visibleMonth),
82
+ [visibleMonth]
80
83
  );
81
84
  const years = useMemo(
82
85
  () => generateYearsBetweenRange(
83
- Math.min(minDate ? minDate.year : CALENDAR_MIN_YEAR, visibleMonth.year),
84
- Math.max(maxDate ? maxDate.year : CALENDAR_MAX_YEAR, visibleMonth.year)
86
+ dateAdapter,
87
+ Math.min(
88
+ dateAdapter.getYear(minDate),
89
+ dateAdapter.getYear(visibleMonth)
90
+ ),
91
+ Math.max(
92
+ dateAdapter.getYear(maxDate),
93
+ dateAdapter.getYear(visibleMonth)
94
+ )
85
95
  ),
86
- [minDate, maxDate, visibleMonth.year]
96
+ [dateAdapter, minDate, maxDate, visibleMonth]
87
97
  );
88
98
  const selectedMonth = months.find(
89
- (month) => isSameMonth(month, visibleMonth)
99
+ (month) => dateAdapter.isSame(month, visibleMonth, "month")
90
100
  );
91
101
  const selectedYear = years.find(
92
- (year) => isSameYear(year, visibleMonth)
102
+ (year) => dateAdapter.isSame(year, visibleMonth, "year")
93
103
  );
94
- const canNavigatePrevious = !(minDate && isDayVisible(minDate));
95
- const canNavigateNext = !(maxDate && isDayVisible(maxDate));
104
+ const canNavigatePrevious = !isDayVisible(minDate);
105
+ const canNavigateNext = !isDayVisible(maxDate);
96
106
  return useMemo(
97
107
  () => ({
98
108
  moveToNextMonth,
99
109
  moveToPreviousMonth,
100
110
  moveToMonth,
101
111
  visibleMonth,
112
+ locale,
102
113
  months,
103
114
  years,
104
115
  canNavigateNext,
105
116
  canNavigatePrevious,
106
117
  selectedMonth,
107
118
  selectedYear,
108
- isOutsideAllowedMonths,
109
- locale,
110
- timeZone
119
+ isOutsideAllowedMonths
111
120
  }),
112
121
  [
122
+ locale,
113
123
  months,
114
124
  moveToPreviousMonth,
115
125
  moveToNextMonth,
@@ -120,18 +130,16 @@ function useCalendarNavigation() {
120
130
  canNavigatePrevious,
121
131
  selectedMonth,
122
132
  selectedYear,
123
- isOutsideAllowedMonths,
124
- locale,
125
- timeZone
133
+ isOutsideAllowedMonths
126
134
  ]
127
135
  );
128
136
  }
129
- const OptionWithTooltip = ({
137
+ function OptionWithTooltip({
130
138
  value,
131
139
  children,
132
140
  disabled = false,
133
141
  tooltipContent
134
- }) => {
142
+ }) {
135
143
  const { activeState, openState } = useListControlContext();
136
144
  const open = (activeState == null ? void 0 : activeState.value) === value;
137
145
  return /* @__PURE__ */ jsx(
@@ -146,174 +154,184 @@ const OptionWithTooltip = ({
146
154
  children: /* @__PURE__ */ jsx(Option, { value, disabled, children })
147
155
  }
148
156
  );
149
- };
150
- const CalendarNavigation = forwardRef(function CalendarNavigation2(props, ref) {
151
- const {
152
- className,
153
- formatMonth: formatMonthProp,
154
- formatYear: formatYearProp,
155
- MonthDropdownProps,
156
- YearDropdownProps,
157
- hideYearDropdown,
158
- step = 1,
159
- ...rest
160
- } = props;
161
- const targetWindow = useWindow();
162
- useComponentCssInjection({
163
- testId: "salt-calendar-navigation",
164
- css: css_248z,
165
- window: targetWindow
166
- });
167
- const { NextIcon, PreviousIcon } = useIcon();
168
- const {
169
- moveToPreviousMonth,
170
- moveToNextMonth,
171
- moveToMonth,
172
- months,
173
- years,
174
- canNavigateNext,
175
- canNavigatePrevious,
176
- selectedMonth,
177
- selectedYear,
178
- isOutsideAllowedMonths,
179
- locale
180
- } = useCalendarNavigation();
181
- const handleNavigatePrevious = useCallback(
182
- (event) => {
183
- moveToPreviousMonth(event, step);
184
- },
185
- [moveToPreviousMonth, step]
186
- );
187
- const handleNavigateNext = useCallback(
188
- (event) => {
189
- moveToNextMonth(event, step);
190
- },
191
- [moveToNextMonth, step]
192
- );
193
- const handleMonthSelect = useCallback(
194
- (event, month) => {
195
- moveToMonth(event, month[0]);
196
- },
197
- [moveToMonth]
198
- );
199
- const handleYearSelect = useCallback(
200
- (event, year) => {
201
- moveToMonth(event, year[0]);
202
- },
203
- [moveToMonth]
204
- );
205
- const formatMonth = useCallback(
206
- (date) => {
207
- if (date && formatMonthProp) {
208
- return formatMonthProp(date);
209
- }
210
- return !date ? "" : formatDate(date, locale, {
211
- month: hideYearDropdown ? "long" : "short",
212
- day: void 0,
213
- year: void 0
214
- });
215
- },
216
- [formatMonthProp]
217
- );
218
- const formatYear = useCallback(
219
- (date) => {
220
- if (date && formatYearProp) {
221
- return formatYearProp(date);
222
- }
223
- return !date ? "" : `${date.year}`;
224
- },
225
- [formatYearProp]
226
- );
227
- return /* @__PURE__ */ jsxs(
228
- "div",
229
- {
230
- className: clsx(
231
- withBaseName(),
232
- { [withBaseName("hideYearDropdown")]: hideYearDropdown },
233
- className
234
- ),
235
- ref,
236
- ...rest,
237
- children: [
238
- /* @__PURE__ */ jsx(
239
- ConditionalTooltip,
240
- {
241
- placement: "top",
242
- disabled: canNavigatePrevious,
243
- content: "Past dates are out of range",
244
- enterDelay: 0,
245
- leaveDelay: 0,
246
- children: /* @__PURE__ */ jsx(
247
- Button,
248
- {
249
- disabled: !canNavigatePrevious,
250
- appearance: "transparent",
251
- sentiment: "neutral",
252
- onClick: handleNavigatePrevious,
253
- focusableWhenDisabled: true,
254
- children: /* @__PURE__ */ jsx(PreviousIcon, { "aria-label": "Previous Month" })
255
- }
256
- )
257
- }
157
+ }
158
+ const CalendarNavigation = forwardRef(
159
+ (props, ref) => {
160
+ const {
161
+ className,
162
+ formatMonth: formatMonthProp,
163
+ formatYear: formatYearProp,
164
+ MonthDropdownProps,
165
+ YearDropdownProps,
166
+ hideYearDropdown,
167
+ step = 1,
168
+ ...rest
169
+ } = props;
170
+ const { dateAdapter } = useLocalization();
171
+ const targetWindow = useWindow();
172
+ useComponentCssInjection({
173
+ testId: "salt-calendar-navigation",
174
+ css: css_248z,
175
+ window: targetWindow
176
+ });
177
+ const { NextIcon, PreviousIcon } = useIcon();
178
+ const {
179
+ locale,
180
+ moveToPreviousMonth,
181
+ moveToNextMonth,
182
+ moveToMonth,
183
+ months,
184
+ years,
185
+ canNavigateNext,
186
+ canNavigatePrevious,
187
+ selectedMonth,
188
+ selectedYear,
189
+ isOutsideAllowedMonths,
190
+ visibleMonth
191
+ } = useCalendarNavigation();
192
+ const handleNavigatePrevious = useCallback(
193
+ (event) => {
194
+ moveToPreviousMonth(event, step);
195
+ },
196
+ [moveToPreviousMonth, step]
197
+ );
198
+ const handleNavigateNext = useCallback(
199
+ (event) => {
200
+ moveToNextMonth(event, step);
201
+ },
202
+ [moveToNextMonth, step]
203
+ );
204
+ const handleMonthSelect = useCallback(
205
+ (event, month) => {
206
+ moveToMonth(event, month[0]);
207
+ },
208
+ [moveToMonth]
209
+ );
210
+ const handleYearSelect = useCallback(
211
+ (event, year) => {
212
+ let newVisibleMonth = dateAdapter.clone(visibleMonth);
213
+ newVisibleMonth = dateAdapter.set(newVisibleMonth, {
214
+ year: dateAdapter.getYear(year[0])
215
+ });
216
+ moveToMonth(event, newVisibleMonth);
217
+ },
218
+ [moveToMonth, visibleMonth]
219
+ );
220
+ const formatMonth = useCallback(
221
+ (date) => {
222
+ if (date && formatMonthProp) {
223
+ return dateAdapter.format(date, formatMonthProp, locale);
224
+ }
225
+ return date ? dateAdapter.format(date, hideYearDropdown ? "MMMM" : "MMM") : "";
226
+ },
227
+ [dateAdapter, formatMonthProp, locale]
228
+ );
229
+ const formatYear = useCallback(
230
+ (date) => {
231
+ if (date && formatYearProp) {
232
+ return dateAdapter.format(date, formatYearProp);
233
+ }
234
+ return !date ? "" : `${dateAdapter.format(date, "YYYY")}`;
235
+ },
236
+ [dateAdapter, formatYearProp]
237
+ );
238
+ return /* @__PURE__ */ jsxs(
239
+ "div",
240
+ {
241
+ className: clsx(
242
+ withBaseName(),
243
+ { [withBaseName("hideYearDropdown")]: hideYearDropdown },
244
+ className
258
245
  ),
259
- /* @__PURE__ */ jsxs("div", { className: clsx({ [withBaseName("dropdowns")]: !hideYearDropdown }), children: [
246
+ ref,
247
+ ...rest,
248
+ children: [
260
249
  /* @__PURE__ */ jsx(
261
- Dropdown,
250
+ ConditionalTooltip,
262
251
  {
263
- "aria-label": "Month Dropdown",
264
- selected: selectedMonth ? [selectedMonth] : [],
265
- value: formatMonth(selectedMonth),
266
- onSelectionChange: handleMonthSelect,
267
- ...MonthDropdownProps,
268
- children: months.map((month) => /* @__PURE__ */ jsx(
269
- OptionWithTooltip,
252
+ placement: "top",
253
+ disabled: canNavigatePrevious,
254
+ content: "Past dates are out of range",
255
+ enterDelay: 0,
256
+ leaveDelay: 0,
257
+ children: /* @__PURE__ */ jsx(
258
+ Button,
270
259
  {
271
- value: month,
272
- disabled: isOutsideAllowedMonths(month),
273
- tooltipContent: "This month is out of range",
274
- children: formatMonth(month)
275
- },
276
- formatMonth(month)
277
- ))
260
+ disabled: !canNavigatePrevious,
261
+ appearance: "transparent",
262
+ sentiment: "neutral",
263
+ onClick: handleNavigatePrevious,
264
+ focusableWhenDisabled: true,
265
+ children: /* @__PURE__ */ jsx(PreviousIcon, { "aria-label": "Previous Month" })
266
+ }
267
+ )
278
268
  }
279
269
  ),
280
- !hideYearDropdown && /* @__PURE__ */ jsx(
281
- Dropdown,
270
+ /* @__PURE__ */ jsxs(
271
+ "div",
282
272
  {
283
- "aria-label": "Year Dropdown",
284
- selected: selectedYear ? [selectedYear] : [],
285
- value: formatYear(selectedYear),
286
- onSelectionChange: handleYearSelect,
287
- ...YearDropdownProps,
288
- children: years.map((year) => /* @__PURE__ */ jsx(OptionWithTooltip, { value: year, children: formatYear(year) }, formatYear(year)))
273
+ className: clsx({ [withBaseName("dropdowns")]: !hideYearDropdown }),
274
+ children: [
275
+ /* @__PURE__ */ jsx(
276
+ Dropdown,
277
+ {
278
+ "aria-label": "Month Dropdown",
279
+ selected: selectedMonth ? [selectedMonth] : [],
280
+ value: formatMonth(selectedMonth),
281
+ onSelectionChange: handleMonthSelect,
282
+ ...MonthDropdownProps,
283
+ children: months.map((month) => /* @__PURE__ */ jsx(
284
+ OptionWithTooltip,
285
+ {
286
+ value: month,
287
+ disabled: isOutsideAllowedMonths(month),
288
+ tooltipContent: "This month is out of range",
289
+ children: formatMonth(month)
290
+ },
291
+ formatMonth(month)
292
+ ))
293
+ }
294
+ ),
295
+ !hideYearDropdown && /* @__PURE__ */ jsx(
296
+ Dropdown,
297
+ {
298
+ "aria-label": "Year Dropdown",
299
+ selected: selectedYear ? [selectedYear] : [],
300
+ value: formatYear(selectedYear),
301
+ onSelectionChange: handleYearSelect,
302
+ ...YearDropdownProps,
303
+ children: years.map((year) => /* @__PURE__ */ jsx(OptionWithTooltip, { value: year, children: formatYear(year) }, formatYear(year)))
304
+ }
305
+ )
306
+ ]
307
+ }
308
+ ),
309
+ /* @__PURE__ */ jsx(
310
+ ConditionalTooltip,
311
+ {
312
+ placement: "top",
313
+ disabled: canNavigateNext,
314
+ content: "Future dates are out of range",
315
+ enterDelay: 0,
316
+ leaveDelay: 0,
317
+ children: /* @__PURE__ */ jsx(
318
+ Button,
319
+ {
320
+ disabled: !canNavigateNext,
321
+ appearance: "transparent",
322
+ sentiment: "neutral",
323
+ onClick: handleNavigateNext,
324
+ focusableWhenDisabled: true,
325
+ children: /* @__PURE__ */ jsx(NextIcon, { "aria-label": "Next Month" })
326
+ }
327
+ )
289
328
  }
290
329
  )
291
- ] }),
292
- /* @__PURE__ */ jsx(
293
- ConditionalTooltip,
294
- {
295
- placement: "top",
296
- disabled: canNavigateNext,
297
- content: "Future dates are out of range",
298
- enterDelay: 0,
299
- leaveDelay: 0,
300
- children: /* @__PURE__ */ jsx(
301
- Button,
302
- {
303
- disabled: !canNavigateNext,
304
- appearance: "transparent",
305
- sentiment: "neutral",
306
- onClick: handleNavigateNext,
307
- focusableWhenDisabled: true,
308
- children: /* @__PURE__ */ jsx(NextIcon, { "aria-label": "Next Month" })
309
- }
310
- )
311
- }
312
- )
313
- ]
314
- }
315
- );
316
- });
330
+ ]
331
+ }
332
+ );
333
+ }
334
+ );
317
335
 
318
336
  export { CalendarNavigation };
319
337
  //# sourceMappingURL=CalendarNavigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarNavigation.js","sources":["../src/calendar/CalendarNavigation.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n Dropdown,\n type DropdownProps,\n Option,\n type OptionProps,\n Tooltip,\n type TooltipProps,\n makePrefixer,\n useIcon,\n useListControlContext,\n} from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithRef,\n type MouseEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { CALENDAR_MAX_YEAR, CALENDAR_MIN_YEAR } from \"./useCalendarSelection\";\n\nimport {\n CalendarDate,\n type DateValue,\n isSameMonth,\n isSameYear,\n} from \"@internationalized/date\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\nimport { formatDate } from \"./formatDate\";\nimport { monthDiff, monthsForLocale } from \"./internal/utils\";\n\ntype DateDropdownProps = DropdownProps<DateValue>;\n\n/**\n * Props for the CalendarNavigation component.\n */\nexport interface CalendarNavigationProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Props for the month dropdown component.\n */\n MonthDropdownProps?: DateDropdownProps;\n\n /**\n * Props for the year dropdown component.\n */\n YearDropdownProps?: DateDropdownProps;\n\n /**\n * Callback fired when a month is selected.\n * @param event - The change event.\n */\n onMonthSelect?: DateDropdownProps[\"onChange\"];\n\n /**\n * Callback fired when a year is selected.\n * @param event - The change event.\n */\n onYearSelect?: DateDropdownProps[\"onChange\"];\n\n /**\n * Callback fired when navigating to the next month.\n * @param event - The click event.\n */\n onNavigateNext?: ButtonProps[\"onClick\"];\n\n /**\n * Callback fired when navigating to the previous month.\n * @param event - The click event.\n */\n onNavigatePrevious?: ButtonProps[\"onClick\"];\n\n /**\n * If `true`, hides the year dropdown.\n */\n hideYearDropdown?: boolean;\n\n /**\n * The step value for navigation. Defaults to 1.\n */\n step?: number;\n /**\n * Format the month dropdown values\n * @param date\n */\n formatMonth?: (date: DateValue) => string;\n /**\n * Format the year dropdown values\n * @param date\n */\n formatYear?: (date: DateValue) => string;\n}\n\ninterface OptionWithTooltipProps extends OptionProps {\n value: DateValue;\n tooltipContent?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nconst ConditionalTooltip: React.FC<TooltipProps> = ({\n children,\n disabled = true,\n ...rest\n}) => {\n if (disabled) {\n return <>{children}</>;\n }\n return <Tooltip {...rest}>{children}</Tooltip>;\n};\n\nfunction generateYearsBetweenRange(\n minYear: number,\n maxYear: number,\n): DateValue[] {\n const years: DateValue[] = [];\n for (let year = minYear; year <= maxYear; year++) {\n years.push(new CalendarDate(year, 1, 1));\n }\n return years;\n}\n\nfunction useCalendarNavigation() {\n const {\n state: { visibleMonth, minDate, maxDate, locale, timeZone },\n helpers: {\n setVisibleMonth,\n isDayVisible,\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n },\n } = useCalendarContext();\n\n const moveToNextMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(event, visibleMonth.add({ months: step }));\n },\n [setVisibleMonth, visibleMonth],\n );\n\n const moveToPreviousMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(event, visibleMonth.subtract({ months: step }));\n },\n [setVisibleMonth, visibleMonth],\n );\n\n const moveToMonth = useCallback(\n (event: SyntheticEvent, month: DateValue) => {\n let newMonth = month;\n\n if (!isOutsideAllowedYears(newMonth)) {\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month\n const navigableMonths = monthsForLocale(visibleMonth, locale).filter(\n (n) => !isOutsideAllowedMonths(n),\n );\n newMonth = navigableMonths.reduce((closestMonth, currentMonth) =>\n Math.abs(monthDiff(currentMonth, newMonth)) <\n Math.abs(monthDiff(closestMonth, newMonth))\n ? currentMonth\n : closestMonth,\n );\n }\n setVisibleMonth(event, newMonth);\n }\n },\n [\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n setVisibleMonth,\n visibleMonth,\n locale,\n ],\n );\n\n const months: DateValue[] = useMemo(\n () => monthsForLocale(visibleMonth, locale),\n [visibleMonth, locale],\n );\n\n const years: DateValue[] = useMemo(\n () =>\n generateYearsBetweenRange(\n Math.min(minDate ? minDate.year : CALENDAR_MIN_YEAR, visibleMonth.year),\n Math.max(maxDate ? maxDate.year : CALENDAR_MAX_YEAR, visibleMonth.year),\n ),\n [minDate, maxDate, visibleMonth.year],\n );\n\n const selectedMonth: DateValue | undefined = months.find((month: DateValue) =>\n isSameMonth(month, visibleMonth),\n );\n const selectedYear: DateValue | undefined = years.find((year: DateValue) =>\n isSameYear(year, visibleMonth),\n );\n\n const canNavigatePrevious = !(minDate && isDayVisible(minDate));\n const canNavigateNext = !(maxDate && isDayVisible(maxDate));\n\n return useMemo(\n () => ({\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n locale,\n timeZone,\n }),\n [\n months,\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n visibleMonth,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n locale,\n timeZone,\n ],\n );\n}\n\nconst OptionWithTooltip = ({\n value,\n children,\n disabled = false,\n tooltipContent,\n}: OptionWithTooltipProps) => {\n const { activeState, openState } = useListControlContext();\n const open = activeState?.value === value;\n return (\n <ConditionalTooltip\n placement=\"right\"\n open={open && openState}\n disabled={!disabled}\n content={tooltipContent}\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Option value={value} disabled={disabled}>\n {children}\n </Option>\n </ConditionalTooltip>\n );\n};\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps\n>(function CalendarNavigation(props, ref) {\n const {\n className,\n formatMonth: formatMonthProp,\n formatYear: formatYearProp,\n MonthDropdownProps,\n YearDropdownProps,\n hideYearDropdown,\n step = 1,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-navigation\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const { NextIcon, PreviousIcon } = useIcon();\n\n const {\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n locale,\n } = useCalendarNavigation();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n moveToPreviousMonth(event, step);\n },\n [moveToPreviousMonth, step],\n );\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n moveToNextMonth(event, step);\n },\n [moveToNextMonth, step],\n );\n\n const handleMonthSelect = useCallback(\n (event: SyntheticEvent, month: DateValue[]) => {\n moveToMonth(event, month[0]);\n },\n [moveToMonth],\n );\n\n const handleYearSelect = useCallback(\n (event: SyntheticEvent, year: DateValue[]) => {\n moveToMonth(event, year[0]);\n },\n [moveToMonth],\n );\n\n const formatMonth = useCallback(\n (date?: DateValue) => {\n if (date && formatMonthProp) {\n return formatMonthProp(date);\n }\n return !date\n ? \"\"\n : formatDate(date, locale, {\n month: hideYearDropdown ? \"long\" : \"short\",\n day: undefined,\n year: undefined,\n });\n },\n [formatMonthProp],\n );\n\n const formatYear = useCallback(\n (date?: DateValue) => {\n if (date && formatYearProp) {\n return formatYearProp(date);\n }\n return !date ? \"\" : `${date.year}`;\n },\n [formatYearProp],\n );\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className,\n )}\n ref={ref}\n {...rest}\n >\n <ConditionalTooltip\n placement=\"top\"\n disabled={canNavigatePrevious}\n content=\"Past dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigatePrevious}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigatePrevious}\n focusableWhenDisabled={true}\n >\n <PreviousIcon aria-label=\"Previous Month\" />\n </Button>\n </ConditionalTooltip>\n <div className={clsx({ [withBaseName(\"dropdowns\")]: !hideYearDropdown })}>\n <Dropdown\n aria-label=\"Month Dropdown\"\n selected={selectedMonth ? [selectedMonth] : []}\n value={formatMonth(selectedMonth)}\n onSelectionChange={handleMonthSelect}\n {...MonthDropdownProps}\n >\n {months.map((month) => (\n <OptionWithTooltip\n key={formatMonth(month)}\n value={month}\n disabled={isOutsideAllowedMonths(month)}\n tooltipContent=\"This month is out of range\"\n >\n {formatMonth(month)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n {!hideYearDropdown && (\n <Dropdown\n aria-label=\"Year Dropdown\"\n selected={selectedYear ? [selectedYear] : []}\n value={formatYear(selectedYear)}\n onSelectionChange={handleYearSelect}\n {...YearDropdownProps}\n >\n {years.map((year) => (\n <OptionWithTooltip key={formatYear(year)} value={year}>\n {formatYear(year)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n )}\n </div>\n <ConditionalTooltip\n placement=\"top\"\n disabled={canNavigateNext}\n content=\"Future dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigateNext}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigateNext}\n focusableWhenDisabled={true}\n >\n <NextIcon aria-label=\"Next Month\" />\n </Button>\n </ConditionalTooltip>\n </div>\n );\n});\n"],"names":["CalendarNavigation","calendarNavigationCss"],"mappings":"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"}
1
+ {"version":3,"file":"CalendarNavigation.js","sources":["../src/calendar/CalendarNavigation.tsx"],"sourcesContent":["import {\n Button,\n type ButtonProps,\n Dropdown,\n type DropdownProps,\n Option,\n type OptionProps,\n Tooltip,\n type TooltipProps,\n makePrefixer,\n useIcon,\n useListControlContext,\n} from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\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 ComponentPropsWithRef,\n type MouseEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateMonthsForYear, monthDiff } from \"./internal/utils\";\n\n/**\n * Props for the CalendarNavigation component.\n */\nexport interface CalendarNavigationProps<TDate extends DateFrameworkType>\n extends ComponentPropsWithRef<\"div\"> {\n /**\n * Props for the month dropdown component.\n */\n MonthDropdownProps?: DropdownProps<TDate>;\n\n /**\n * Props for the year dropdown component.\n */\n YearDropdownProps?: DropdownProps<TDate>;\n\n /**\n * Callback fired when a month is selected.\n * @param event - The change event.\n */\n onMonthSelect?: DropdownProps<TDate>[\"onChange\"];\n\n /**\n * Callback fired when a year is selected.\n * @param event - The change event.\n */\n onYearSelect?: DropdownProps<TDate>[\"onChange\"];\n\n /**\n * Callback fired when navigating to the next month.\n * @param event - The click event.\n */\n onNavigateNext?: ButtonProps[\"onClick\"];\n\n /**\n * Callback fired when navigating to the previous month.\n * @param event - The click event.\n */\n onNavigatePrevious?: ButtonProps[\"onClick\"];\n\n /**\n * If `true`, hides the year dropdown.\n */\n hideYearDropdown?: boolean;\n\n /**\n * The step value for navigation. Defaults to 1.\n */\n step?: number;\n /**\n * Format the month dropdown values\n * @param date\n */\n formatMonth?: string;\n /**\n * Format the year dropdown values\n * @param date\n */\n formatYear?: string;\n}\n\ninterface OptionWithTooltipProps<TDate> extends OptionProps {\n value: TDate;\n tooltipContent?: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nconst ConditionalTooltip: React.FC<TooltipProps> = ({\n children,\n disabled = true,\n ...rest\n}) => {\n if (disabled) {\n return <>{children}</>;\n }\n return <Tooltip {...rest}>{children}</Tooltip>;\n};\n\nfunction generateYearsBetweenRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n minYear: number,\n maxYear: number,\n): TDate[] {\n const years: TDate[] = [];\n for (let year = minYear; year <= maxYear; year++) {\n let startOfYear = dateAdapter.today();\n startOfYear = dateAdapter.set(startOfYear, { day: 1, month: 1, year });\n years.push(startOfYear);\n }\n return years;\n}\n\nfunction useCalendarNavigation<TDate extends DateFrameworkType>() {\n const {\n state: { visibleMonth, locale, minDate, maxDate },\n helpers: {\n setVisibleMonth,\n isDayVisible,\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n },\n } = useCalendarContext<TDate>();\n\n const { dateAdapter } = useLocalization<TDate>();\n\n const moveToNextMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(event, dateAdapter.add(visibleMonth, { months: step }));\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToPreviousMonth = useCallback(\n (event: SyntheticEvent, step = 1) => {\n setVisibleMonth(\n event,\n dateAdapter.subtract(visibleMonth, { months: step }),\n );\n },\n [dateAdapter, setVisibleMonth, visibleMonth],\n );\n\n const moveToMonth = useCallback(\n (event: SyntheticEvent, month: TDate) => {\n let newMonth = month;\n\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month\n const navigableMonths = generateMonthsForYear(\n dateAdapter,\n visibleMonth,\n ).filter((n) => !isOutsideAllowedMonths(n));\n newMonth = navigableMonths.reduce((closestMonth, currentMonth) =>\n Math.abs(monthDiff(dateAdapter, currentMonth, newMonth)) <\n Math.abs(monthDiff(dateAdapter, closestMonth, newMonth))\n ? currentMonth\n : closestMonth,\n );\n }\n setVisibleMonth(event, newMonth);\n },\n [\n dateAdapter,\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n setVisibleMonth,\n visibleMonth,\n ],\n );\n\n const months: TDate[] = useMemo(\n () => generateMonthsForYear<TDate>(dateAdapter, visibleMonth),\n [visibleMonth],\n );\n\n const years: TDate[] = useMemo(\n () =>\n generateYearsBetweenRange<TDate>(\n dateAdapter,\n Math.min(\n dateAdapter.getYear(minDate),\n dateAdapter.getYear(visibleMonth),\n ),\n Math.max(\n dateAdapter.getYear(maxDate),\n dateAdapter.getYear(visibleMonth),\n ),\n ),\n [dateAdapter, minDate, maxDate, visibleMonth],\n );\n\n const selectedMonth: TDate | undefined = months.find((month: TDate) =>\n dateAdapter.isSame(month, visibleMonth, \"month\"),\n );\n const selectedYear: TDate | undefined = years.find((year: TDate) =>\n dateAdapter.isSame(year, visibleMonth, \"year\"),\n );\n\n const canNavigatePrevious = !isDayVisible(minDate);\n const canNavigateNext = !isDayVisible(maxDate);\n\n return useMemo(\n () => ({\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n locale,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n }),\n [\n locale,\n months,\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n visibleMonth,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n ],\n );\n}\n\nfunction OptionWithTooltip<TDate extends DateFrameworkType>({\n value,\n children,\n disabled = false,\n tooltipContent,\n}: OptionWithTooltipProps<TDate>) {\n const { activeState, openState } = useListControlContext();\n const open = activeState?.value === value;\n return (\n <ConditionalTooltip\n placement=\"right\"\n open={open && openState}\n disabled={!disabled}\n content={tooltipContent}\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Option value={value} disabled={disabled}>\n {children}\n </Option>\n </ConditionalTooltip>\n );\n}\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps<any>\n>(\n <TDate extends DateFrameworkType>(\n props: CalendarNavigationProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const {\n className,\n formatMonth: formatMonthProp,\n formatYear: formatYearProp,\n MonthDropdownProps,\n YearDropdownProps,\n hideYearDropdown,\n step = 1,\n ...rest\n } = props;\n\n const { dateAdapter } = useLocalization<TDate>();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-navigation\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const { NextIcon, PreviousIcon } = useIcon();\n\n const {\n locale,\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n visibleMonth,\n } = useCalendarNavigation<TDate>();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n moveToPreviousMonth(event, step);\n },\n [moveToPreviousMonth, step],\n );\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> =\n useCallback(\n (event) => {\n moveToNextMonth(event, step);\n },\n [moveToNextMonth, step],\n );\n\n const handleMonthSelect = useCallback(\n (event: SyntheticEvent, month: TDate[]) => {\n moveToMonth(event, month[0]);\n },\n [moveToMonth],\n );\n\n const handleYearSelect = useCallback(\n (event: SyntheticEvent, year: TDate[]) => {\n let newVisibleMonth = dateAdapter.clone(visibleMonth);\n newVisibleMonth = dateAdapter.set(newVisibleMonth, {\n year: dateAdapter.getYear(year[0]),\n });\n moveToMonth(event, newVisibleMonth);\n },\n [moveToMonth, visibleMonth],\n );\n\n const formatMonth = useCallback(\n (date?: TDate) => {\n if (date && formatMonthProp) {\n return dateAdapter.format(date, formatMonthProp, locale);\n }\n return date\n ? dateAdapter.format(date, hideYearDropdown ? \"MMMM\" : \"MMM\")\n : \"\";\n },\n [dateAdapter, formatMonthProp, locale],\n );\n\n const formatYear = useCallback(\n (date?: TDate) => {\n if (date && formatYearProp) {\n return dateAdapter.format(date, formatYearProp);\n }\n return !date ? \"\" : `${dateAdapter.format(date, \"YYYY\")}`;\n },\n [dateAdapter, formatYearProp],\n );\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className,\n )}\n ref={ref}\n {...rest}\n >\n <ConditionalTooltip\n placement=\"top\"\n disabled={canNavigatePrevious}\n content=\"Past dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigatePrevious}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigatePrevious}\n focusableWhenDisabled={true}\n >\n <PreviousIcon aria-label=\"Previous Month\" />\n </Button>\n </ConditionalTooltip>\n <div\n className={clsx({ [withBaseName(\"dropdowns\")]: !hideYearDropdown })}\n >\n <Dropdown\n aria-label=\"Month Dropdown\"\n selected={selectedMonth ? [selectedMonth] : []}\n value={formatMonth(selectedMonth)}\n onSelectionChange={handleMonthSelect}\n {...MonthDropdownProps}\n >\n {months.map((month) => (\n <OptionWithTooltip\n key={formatMonth(month)}\n value={month}\n disabled={isOutsideAllowedMonths(month)}\n tooltipContent=\"This month is out of range\"\n >\n {formatMonth(month)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n {!hideYearDropdown && (\n <Dropdown\n aria-label=\"Year Dropdown\"\n selected={selectedYear ? [selectedYear] : []}\n value={formatYear(selectedYear)}\n onSelectionChange={handleYearSelect}\n {...YearDropdownProps}\n >\n {years.map((year) => (\n <OptionWithTooltip key={formatYear(year)} value={year}>\n {formatYear(year)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n )}\n </div>\n <ConditionalTooltip\n placement=\"top\"\n disabled={canNavigateNext}\n content=\"Future dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigateNext}\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleNavigateNext}\n focusableWhenDisabled={true}\n >\n <NextIcon aria-label=\"Next Month\" />\n </Button>\n </ConditionalTooltip>\n </div>\n );\n },\n);\n"],"names":["calendarNavigationCss"],"mappings":"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"}
@@ -2,16 +2,22 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { makePrefixer } from '@salt-ds/core';
3
3
  import { clsx } from 'clsx';
4
4
  import { forwardRef } from 'react';
5
- import { daysForLocale } from './internal/utils.js';
5
+ import { daysOfWeek } from './internal/utils.js';
6
6
  import { useComponentCssInjection } from '@salt-ds/styles';
7
7
  import { useWindow } from '@salt-ds/window';
8
+ import { useLocalization } from '../localization-provider/LocalizationProvider.js';
8
9
  import css_248z from './CalendarWeekHeader.css.js';
9
- import { getCurrentLocale } from './formatDate.js';
10
+ import { useCalendarContext } from './internal/CalendarContext.js';
10
11
 
11
12
  const withBaseName = makePrefixer("saltCalendarWeekHeader");
12
- const CalendarWeekHeader = forwardRef(function CalendarWeekHeader2({ className, locale = getCurrentLocale(), ...rest }, ref) {
13
- const weekdaysShort = daysForLocale("narrow", locale);
14
- const weekdaysLong = daysForLocale("long", locale);
13
+ const CalendarWeekHeader = forwardRef(function CalendarWeekHeader2(props, ref) {
14
+ const { className, ...rest } = props;
15
+ const { dateAdapter } = useLocalization();
16
+ const {
17
+ state: { locale }
18
+ } = useCalendarContext();
19
+ const weekdaysShort = daysOfWeek(dateAdapter, "narrow", locale);
20
+ const weekdaysLong = daysOfWeek(dateAdapter, "long", locale);
15
21
  const targetWindow = useWindow();
16
22
  useComponentCssInjection({
17
23
  testId: "salt-calendar-week-header",