@fluentui/react-datepicker-compat 0.1.4 → 0.1.5

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 (256) hide show
  1. package/CHANGELOG.json +76 -1
  2. package/CHANGELOG.md +21 -2
  3. package/lib/Calendar.js +0 -1
  4. package/lib/Calendar.js.map +1 -1
  5. package/lib/CalendarDay.js +0 -1
  6. package/lib/CalendarDay.js.map +1 -1
  7. package/lib/CalendarDayGrid.js +0 -1
  8. package/lib/CalendarDayGrid.js.map +1 -1
  9. package/lib/CalendarMonth.js +0 -1
  10. package/lib/CalendarMonth.js.map +1 -1
  11. package/lib/CalendarPicker.js +0 -1
  12. package/lib/CalendarPicker.js.map +1 -1
  13. package/lib/CalendarYear.js +0 -1
  14. package/lib/CalendarYear.js.map +1 -1
  15. package/lib/DatePicker.js +0 -1
  16. package/lib/DatePicker.js.map +1 -1
  17. package/lib/components/Calendar/Calendar.js +278 -300
  18. package/lib/components/Calendar/Calendar.js.map +1 -1
  19. package/lib/components/Calendar/Calendar.types.js +7 -12
  20. package/lib/components/Calendar/Calendar.types.js.map +1 -1
  21. package/lib/components/Calendar/defaults.js +0 -1
  22. package/lib/components/Calendar/defaults.js.map +1 -1
  23. package/lib/components/Calendar/index.js +0 -1
  24. package/lib/components/Calendar/index.js.map +1 -1
  25. package/lib/components/Calendar/useCalendarStyles.styles.js.map +1 -1
  26. package/lib/components/CalendarDay/CalendarDay.js +100 -128
  27. package/lib/components/CalendarDay/CalendarDay.js.map +1 -1
  28. package/lib/components/CalendarDay/CalendarDay.types.js +0 -1
  29. package/lib/components/CalendarDay/CalendarDay.types.js.map +1 -1
  30. package/lib/components/CalendarDay/index.js +0 -1
  31. package/lib/components/CalendarDay/index.js.map +1 -1
  32. package/lib/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
  33. package/lib/components/CalendarDayGrid/CalendarDayGrid.js +146 -159
  34. package/lib/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
  35. package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -1
  36. package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
  37. package/lib/components/CalendarDayGrid/CalendarGridDayCell.js +150 -179
  38. package/lib/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
  39. package/lib/components/CalendarDayGrid/CalendarGridRow.js +20 -34
  40. package/lib/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
  41. package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js +29 -39
  42. package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
  43. package/lib/components/CalendarDayGrid/index.js +0 -1
  44. package/lib/components/CalendarDayGrid/index.js.map +1 -1
  45. package/lib/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
  46. package/lib/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
  47. package/lib/components/CalendarDayGrid/useWeeks.js +34 -36
  48. package/lib/components/CalendarDayGrid/useWeeks.js.map +1 -1
  49. package/lib/components/CalendarMonth/CalendarMonth.js +238 -258
  50. package/lib/components/CalendarMonth/CalendarMonth.js.map +1 -1
  51. package/lib/components/CalendarMonth/CalendarMonth.types.js +0 -1
  52. package/lib/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
  53. package/lib/components/CalendarMonth/index.js +0 -1
  54. package/lib/components/CalendarMonth/index.js.map +1 -1
  55. package/lib/components/CalendarMonth/useCalendarMonthStyles.js +2 -4
  56. package/lib/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
  57. package/lib/components/CalendarPicker/CalendarPicker.types.js +1 -2
  58. package/lib/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
  59. package/lib/components/CalendarPicker/index.js +0 -1
  60. package/lib/components/CalendarPicker/index.js.map +1 -1
  61. package/lib/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
  62. package/lib/components/CalendarYear/CalendarYear.js +260 -312
  63. package/lib/components/CalendarYear/CalendarYear.js.map +1 -1
  64. package/lib/components/CalendarYear/CalendarYear.types.js +0 -1
  65. package/lib/components/CalendarYear/CalendarYear.types.js.map +1 -1
  66. package/lib/components/CalendarYear/index.js +0 -1
  67. package/lib/components/CalendarYear/index.js.map +1 -1
  68. package/lib/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
  69. package/lib/components/DatePicker/DatePicker.js +4 -5
  70. package/lib/components/DatePicker/DatePicker.js.map +1 -1
  71. package/lib/components/DatePicker/DatePicker.types.js +0 -1
  72. package/lib/components/DatePicker/DatePicker.types.js.map +1 -1
  73. package/lib/components/DatePicker/defaults.js +9 -10
  74. package/lib/components/DatePicker/defaults.js.map +1 -1
  75. package/lib/components/DatePicker/index.js +0 -1
  76. package/lib/components/DatePicker/index.js.map +1 -1
  77. package/lib/components/DatePicker/renderDatePicker.js +5 -12
  78. package/lib/components/DatePicker/renderDatePicker.js.map +1 -1
  79. package/lib/components/DatePicker/useDatePicker.js +401 -353
  80. package/lib/components/DatePicker/useDatePicker.js.map +1 -1
  81. package/lib/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
  82. package/lib/index.js +0 -1
  83. package/lib/index.js.map +1 -1
  84. package/lib/utils/animations.js +72 -73
  85. package/lib/utils/animations.js.map +1 -1
  86. package/lib/utils/constants.js +50 -52
  87. package/lib/utils/constants.js.map +1 -1
  88. package/lib/utils/dateFormatting/dateFormatting.defaults.js +71 -34
  89. package/lib/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
  90. package/lib/utils/dateFormatting/dateFormatting.types.js +1 -2
  91. package/lib/utils/dateFormatting/dateFormatting.types.js.map +1 -1
  92. package/lib/utils/dateFormatting/index.js +0 -1
  93. package/lib/utils/dateFormatting/index.js.map +1 -1
  94. package/lib/utils/dateGrid/dateGrid.types.js +1 -2
  95. package/lib/utils/dateGrid/dateGrid.types.js.map +1 -1
  96. package/lib/utils/dateGrid/findAvailableDate.js +14 -21
  97. package/lib/utils/dateGrid/findAvailableDate.js.map +1 -1
  98. package/lib/utils/dateGrid/getBoundedDateRange.js +11 -11
  99. package/lib/utils/dateGrid/getBoundedDateRange.js.map +1 -1
  100. package/lib/utils/dateGrid/getDateRangeTypeToUse.js +6 -8
  101. package/lib/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
  102. package/lib/utils/dateGrid/getDayGrid.js +59 -73
  103. package/lib/utils/dateGrid/getDayGrid.js.map +1 -1
  104. package/lib/utils/dateGrid/index.js +0 -1
  105. package/lib/utils/dateGrid/index.js.map +1 -1
  106. package/lib/utils/dateGrid/isAfterMaxDate.js +3 -7
  107. package/lib/utils/dateGrid/isAfterMaxDate.js.map +1 -1
  108. package/lib/utils/dateGrid/isBeforeMinDate.js +3 -7
  109. package/lib/utils/dateGrid/isBeforeMinDate.js.map +1 -1
  110. package/lib/utils/dateGrid/isContiguous.js +11 -12
  111. package/lib/utils/dateGrid/isContiguous.js.map +1 -1
  112. package/lib/utils/dateGrid/isRestrictedDate.js +7 -13
  113. package/lib/utils/dateGrid/isRestrictedDate.js.map +1 -1
  114. package/lib/utils/dateMath/dateMath.js +179 -198
  115. package/lib/utils/dateMath/dateMath.js.map +1 -1
  116. package/lib/utils/dateMath/index.js +0 -1
  117. package/lib/utils/dateMath/index.js.map +1 -1
  118. package/lib/utils/dom.js +5 -6
  119. package/lib/utils/dom.js.map +1 -1
  120. package/lib/utils/focus.js +17 -19
  121. package/lib/utils/focus.js.map +1 -1
  122. package/lib/utils/index.js +0 -1
  123. package/lib/utils/index.js.map +1 -1
  124. package/lib/utils/usePopupPositioning.js +12 -16
  125. package/lib/utils/usePopupPositioning.js.map +1 -1
  126. package/lib-commonjs/Calendar.js +0 -3
  127. package/lib-commonjs/Calendar.js.map +1 -1
  128. package/lib-commonjs/CalendarDay.js +0 -3
  129. package/lib-commonjs/CalendarDay.js.map +1 -1
  130. package/lib-commonjs/CalendarDayGrid.js +0 -3
  131. package/lib-commonjs/CalendarDayGrid.js.map +1 -1
  132. package/lib-commonjs/CalendarMonth.js +0 -3
  133. package/lib-commonjs/CalendarMonth.js.map +1 -1
  134. package/lib-commonjs/CalendarPicker.js +0 -3
  135. package/lib-commonjs/CalendarPicker.js.map +1 -1
  136. package/lib-commonjs/CalendarYear.js +0 -3
  137. package/lib-commonjs/CalendarYear.js.map +1 -1
  138. package/lib-commonjs/DatePicker.js +0 -3
  139. package/lib-commonjs/DatePicker.js.map +1 -1
  140. package/lib-commonjs/components/Calendar/Calendar.js +1 -3
  141. package/lib-commonjs/components/Calendar/Calendar.js.map +1 -1
  142. package/lib-commonjs/components/Calendar/Calendar.types.js +5 -7
  143. package/lib-commonjs/components/Calendar/Calendar.types.js.map +1 -1
  144. package/lib-commonjs/components/Calendar/defaults.js +1 -3
  145. package/lib-commonjs/components/Calendar/defaults.js.map +1 -1
  146. package/lib-commonjs/components/Calendar/index.js +0 -3
  147. package/lib-commonjs/components/Calendar/index.js.map +1 -1
  148. package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js +0 -2
  149. package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js.map +1 -1
  150. package/lib-commonjs/components/CalendarDay/CalendarDay.js +1 -3
  151. package/lib-commonjs/components/CalendarDay/CalendarDay.js.map +1 -1
  152. package/lib-commonjs/components/CalendarDay/CalendarDay.types.js +0 -3
  153. package/lib-commonjs/components/CalendarDay/CalendarDay.types.js.map +1 -1
  154. package/lib-commonjs/components/CalendarDay/index.js +0 -3
  155. package/lib-commonjs/components/CalendarDay/index.js.map +1 -1
  156. package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js +0 -2
  157. package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
  158. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js +7 -9
  159. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
  160. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -3
  161. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
  162. package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js +1 -3
  163. package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
  164. package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js +1 -3
  165. package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
  166. package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js +1 -3
  167. package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
  168. package/lib-commonjs/components/CalendarDayGrid/index.js +0 -3
  169. package/lib-commonjs/components/CalendarDayGrid/index.js.map +1 -1
  170. package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js +0 -2
  171. package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
  172. package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js +0 -2
  173. package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
  174. package/lib-commonjs/components/CalendarDayGrid/useWeeks.js +9 -11
  175. package/lib-commonjs/components/CalendarDayGrid/useWeeks.js.map +1 -1
  176. package/lib-commonjs/components/CalendarMonth/CalendarMonth.js +1 -3
  177. package/lib-commonjs/components/CalendarMonth/CalendarMonth.js.map +1 -1
  178. package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js +0 -3
  179. package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
  180. package/lib-commonjs/components/CalendarMonth/index.js +0 -3
  181. package/lib-commonjs/components/CalendarMonth/index.js.map +1 -1
  182. package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js +1 -3
  183. package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
  184. package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js +0 -3
  185. package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
  186. package/lib-commonjs/components/CalendarPicker/index.js +0 -3
  187. package/lib-commonjs/components/CalendarPicker/index.js.map +1 -1
  188. package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js +0 -2
  189. package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
  190. package/lib-commonjs/components/CalendarYear/CalendarYear.js +1 -3
  191. package/lib-commonjs/components/CalendarYear/CalendarYear.js.map +1 -1
  192. package/lib-commonjs/components/CalendarYear/CalendarYear.types.js +0 -3
  193. package/lib-commonjs/components/CalendarYear/CalendarYear.types.js.map +1 -1
  194. package/lib-commonjs/components/CalendarYear/index.js +0 -3
  195. package/lib-commonjs/components/CalendarYear/index.js.map +1 -1
  196. package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js +0 -2
  197. package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
  198. package/lib-commonjs/components/DatePicker/DatePicker.js +1 -3
  199. package/lib-commonjs/components/DatePicker/DatePicker.js.map +1 -1
  200. package/lib-commonjs/components/DatePicker/DatePicker.types.js +0 -3
  201. package/lib-commonjs/components/DatePicker/DatePicker.types.js.map +1 -1
  202. package/lib-commonjs/components/DatePicker/defaults.js +1 -3
  203. package/lib-commonjs/components/DatePicker/defaults.js.map +1 -1
  204. package/lib-commonjs/components/DatePicker/index.js +0 -3
  205. package/lib-commonjs/components/DatePicker/index.js.map +1 -1
  206. package/lib-commonjs/components/DatePicker/renderDatePicker.js +1 -3
  207. package/lib-commonjs/components/DatePicker/renderDatePicker.js.map +1 -1
  208. package/lib-commonjs/components/DatePicker/useDatePicker.js +8 -11
  209. package/lib-commonjs/components/DatePicker/useDatePicker.js.map +1 -1
  210. package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js +0 -2
  211. package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
  212. package/lib-commonjs/index.js +0 -3
  213. package/lib-commonjs/index.js.map +1 -1
  214. package/lib-commonjs/utils/animations.js +4 -6
  215. package/lib-commonjs/utils/animations.js.map +1 -1
  216. package/lib-commonjs/utils/constants.js +7 -9
  217. package/lib-commonjs/utils/constants.js.map +1 -1
  218. package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js +1 -3
  219. package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
  220. package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js +0 -3
  221. package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js.map +1 -1
  222. package/lib-commonjs/utils/dateFormatting/index.js +0 -3
  223. package/lib-commonjs/utils/dateFormatting/index.js.map +1 -1
  224. package/lib-commonjs/utils/dateGrid/dateGrid.types.js +0 -3
  225. package/lib-commonjs/utils/dateGrid/dateGrid.types.js.map +1 -1
  226. package/lib-commonjs/utils/dateGrid/findAvailableDate.js +1 -3
  227. package/lib-commonjs/utils/dateGrid/findAvailableDate.js.map +1 -1
  228. package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js +1 -3
  229. package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js.map +1 -1
  230. package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js +1 -3
  231. package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
  232. package/lib-commonjs/utils/dateGrid/getDayGrid.js +1 -3
  233. package/lib-commonjs/utils/dateGrid/getDayGrid.js.map +1 -1
  234. package/lib-commonjs/utils/dateGrid/index.js +0 -3
  235. package/lib-commonjs/utils/dateGrid/index.js.map +1 -1
  236. package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js +1 -3
  237. package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js.map +1 -1
  238. package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js +1 -3
  239. package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js.map +1 -1
  240. package/lib-commonjs/utils/dateGrid/isContiguous.js +1 -3
  241. package/lib-commonjs/utils/dateGrid/isContiguous.js.map +1 -1
  242. package/lib-commonjs/utils/dateGrid/isRestrictedDate.js +1 -3
  243. package/lib-commonjs/utils/dateGrid/isRestrictedDate.js.map +1 -1
  244. package/lib-commonjs/utils/dateMath/dateMath.js +1 -3
  245. package/lib-commonjs/utils/dateMath/dateMath.js.map +1 -1
  246. package/lib-commonjs/utils/dateMath/index.js +0 -3
  247. package/lib-commonjs/utils/dateMath/index.js.map +1 -1
  248. package/lib-commonjs/utils/dom.js +1 -3
  249. package/lib-commonjs/utils/dom.js.map +1 -1
  250. package/lib-commonjs/utils/focus.js +1 -3
  251. package/lib-commonjs/utils/focus.js.map +1 -1
  252. package/lib-commonjs/utils/index.js +0 -3
  253. package/lib-commonjs/utils/index.js.map +1 -1
  254. package/lib-commonjs/utils/usePopupPositioning.js +1 -3
  255. package/lib-commonjs/utils/usePopupPositioning.js.map +1 -1
  256. package/package.json +11 -11
@@ -8,275 +8,255 @@ import { addYears, compareDatePart, getMonthEnd, getMonthStart, getYearEnd, getY
8
8
  import { CalendarYear } from '../CalendarYear/CalendarYear';
9
9
  import { useCalendarMonthStyles_unstable } from './useCalendarMonthStyles';
10
10
  const MONTHS_PER_ROW = 4;
11
- function useAnimateBackwards({
12
- navigatedDate
13
- }) {
14
- const currentYear = navigatedDate.getFullYear();
15
- const previousYearRef = React.useRef();
16
- React.useEffect(() => {
17
- previousYearRef.current = currentYear;
18
- });
19
- const previousYear = previousYearRef.current;
20
- if (previousYear === undefined || previousYear === currentYear) {
21
- return undefined;
22
- } else {
23
- return previousYear > currentYear;
24
- }
25
- }
26
- function useFocusLogic({
27
- componentRef
28
- }) {
29
- const navigatedMonthRef = React.useRef(null);
30
- const calendarYearRef = React.useRef(null);
31
- const focusOnUpdate = React.useRef(false);
32
- const focus = React.useCallback(() => {
33
- if (calendarYearRef.current) {
34
- calendarYearRef.current.focus();
35
- } else if (navigatedMonthRef.current) {
36
- navigatedMonthRef.current.focus();
37
- }
38
- }, []);
39
- React.useImperativeHandle(componentRef, () => ({
40
- focus
41
- }), [focus]);
42
- React.useEffect(() => {
43
- if (focusOnUpdate.current) {
44
- focus();
45
- focusOnUpdate.current = false;
11
+ function useAnimateBackwards({ navigatedDate }) {
12
+ const currentYear = navigatedDate.getFullYear();
13
+ const previousYearRef = React.useRef();
14
+ React.useEffect(()=>{
15
+ previousYearRef.current = currentYear;
16
+ });
17
+ const previousYear = previousYearRef.current;
18
+ if (previousYear === undefined || previousYear === currentYear) {
19
+ return undefined;
20
+ } else {
21
+ return previousYear > currentYear;
46
22
  }
47
- });
48
- const focusOnNextUpdate = () => {
49
- focusOnUpdate.current = true;
50
- };
51
- return [navigatedMonthRef, calendarYearRef, focusOnNextUpdate];
23
+ }
24
+ function useFocusLogic({ componentRef }) {
25
+ const navigatedMonthRef = React.useRef(null);
26
+ const calendarYearRef = React.useRef(null);
27
+ const focusOnUpdate = React.useRef(false);
28
+ const focus = React.useCallback(()=>{
29
+ if (calendarYearRef.current) {
30
+ calendarYearRef.current.focus();
31
+ } else if (navigatedMonthRef.current) {
32
+ navigatedMonthRef.current.focus();
33
+ }
34
+ }, []);
35
+ React.useImperativeHandle(componentRef, ()=>({
36
+ focus
37
+ }), [
38
+ focus
39
+ ]);
40
+ React.useEffect(()=>{
41
+ if (focusOnUpdate.current) {
42
+ focus();
43
+ focusOnUpdate.current = false;
44
+ }
45
+ });
46
+ const focusOnNextUpdate = ()=>{
47
+ focusOnUpdate.current = true;
48
+ };
49
+ return [
50
+ navigatedMonthRef,
51
+ calendarYearRef,
52
+ focusOnNextUpdate
53
+ ];
52
54
  }
53
55
  /**
54
56
  * @internal
55
- */
56
- export const CalendarMonth = props => {
57
- const {
58
- allFocusable,
59
- animationDirection,
60
- className,
61
- componentRef,
62
- dateTimeFormatter = DEFAULT_DATE_FORMATTING,
63
- highlightCurrentMonth,
64
- highlightSelectedMonth,
65
- maxDate,
66
- minDate,
67
- navigatedDate,
68
- onHeaderSelect: onUserHeaderSelect,
69
- onNavigateDate,
70
- selectedDate,
71
- strings,
72
- today = new Date(),
73
- yearPickerHidden = false
74
- } = props;
75
- const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({
76
- componentRef
77
- });
78
- const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);
79
- const animateBackwards = useAnimateBackwards({
80
- navigatedDate
81
- });
82
- const selectMonthCallback = newMonth => {
83
- return () => onSelectMonth(newMonth);
84
- };
85
- const onSelectNextYear = () => {
86
- onNavigateDate(addYears(navigatedDate, 1), false);
87
- };
88
- const onSelectPrevYear = () => {
89
- onNavigateDate(addYears(navigatedDate, -1), false);
90
- };
91
- const onSelectMonth = newMonth => {
92
- // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked
93
- onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
94
- onNavigateDate(setMonth(navigatedDate, newMonth), true);
95
- };
96
- const onHeaderSelect = () => {
97
- if (!yearPickerHidden) {
98
- focusOnNextUpdate();
99
- setIsYearPickerVisible(true);
100
- } else {
101
- onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
102
- }
103
- };
104
- const onSelectYear = selectedYear => {
105
- focusOnNextUpdate();
106
- const navYear = navigatedDate.getFullYear();
107
- if (navYear !== selectedYear) {
108
- let newNavigationDate = new Date(navigatedDate.getTime());
109
- newNavigationDate.setFullYear(selectedYear);
110
- // for min and max dates, adjust the new navigation date - perhaps this should be
111
- // checked on the master navigation date handler (i.e. in Calendar)
112
- if (maxDate && newNavigationDate > maxDate) {
113
- newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());
114
- } else if (minDate && newNavigationDate < minDate) {
115
- newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());
116
- }
117
- onNavigateDate(newNavigationDate, true);
118
- }
119
- setIsYearPickerVisible(false);
120
- };
121
- const onYearPickerHeaderSelect = focus => {
122
- focusOnNextUpdate();
123
- setIsYearPickerVisible(false);
124
- };
125
- const dateFormatter = dateTimeFormatter;
126
- // determine if previous/next years are in bounds
127
- const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;
128
- const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;
129
- const classNames = useCalendarMonthStyles_unstable({
130
- className,
131
- hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,
132
- highlightCurrent: highlightCurrentMonth,
133
- highlightSelected: highlightSelectedMonth,
134
- animateBackwards,
135
- animationDirection
136
- });
137
- const {
138
- dir
139
- } = useFluent_unstable();
140
- const arrowNavigationAttributes = useArrowNavigationGroup({
141
- axis: 'both'
142
- });
143
- if (isYearPickerVisible) {
144
- const [onRenderYear, yearStrings] = getYearStrings({
145
- dateTimeFormatter,
146
- navigatedDate,
147
- strings
57
+ */ export const CalendarMonth = (props)=>{
58
+ const { allFocusable , animationDirection , className , componentRef , dateTimeFormatter =DEFAULT_DATE_FORMATTING , highlightCurrentMonth , highlightSelectedMonth , maxDate , minDate , navigatedDate , onHeaderSelect: onUserHeaderSelect , onNavigateDate , selectedDate , strings , today =new Date() , yearPickerHidden =false } = props;
59
+ const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({
60
+ componentRef
148
61
  });
149
- // use navigated date for the year picker
150
- return /*#__PURE__*/React.createElement(CalendarYear, {
151
- key: 'calendarYear',
152
- minYear: minDate ? minDate.getFullYear() : undefined,
153
- maxYear: maxDate ? maxDate.getFullYear() : undefined,
154
- // eslint-disable-next-line react/jsx-no-bind
155
- onSelectYear: onSelectYear,
156
- // eslint-disable-next-line react/jsx-no-bind
157
- onHeaderSelect: onYearPickerHeaderSelect,
158
- selectedYear: selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined,
159
- onRenderYear: onRenderYear,
160
- strings: yearStrings,
161
- componentRef: calendarYearRef,
162
- highlightCurrentYear: highlightCurrentMonth,
163
- highlightSelectedYear: highlightSelectedMonth,
164
- animationDirection: animationDirection
62
+ const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);
63
+ const animateBackwards = useAnimateBackwards({
64
+ navigatedDate
165
65
  });
166
- }
167
- const rowIndexes = [];
168
- for (let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++) {
169
- rowIndexes.push(i);
170
- }
171
- const yearString = dateFormatter.formatYear(navigatedDate);
172
- const headerAriaLabel = strings.monthPickerHeaderAriaLabel ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString) : yearString;
173
- return /*#__PURE__*/React.createElement("div", {
174
- className: classNames.root
175
- }, /*#__PURE__*/React.createElement("div", {
176
- className: classNames.headerContainer
177
- }, /*#__PURE__*/React.createElement("button", {
178
- className: classNames.currentItemButton,
179
- onClick: onHeaderSelect,
180
- onKeyDown: onButtonKeyDown(onHeaderSelect),
181
- "aria-label": headerAriaLabel,
182
- tabIndex: !!onUserHeaderSelect || !yearPickerHidden ? 0 : -1,
183
- type: "button"
184
- }, /*#__PURE__*/React.createElement("span", {
185
- "aria-live": "polite",
186
- "aria-atomic": "true"
187
- }, yearString)), /*#__PURE__*/React.createElement("div", {
188
- className: classNames.navigationButtonsContainer
189
- }, /*#__PURE__*/React.createElement("button", {
190
- className: mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled),
191
- "aria-disabled": !isPrevYearInBounds,
192
- tabIndex: isPrevYearInBounds ? undefined : allFocusable ? 0 : -1,
193
- onClick: isPrevYearInBounds ? onSelectPrevYear : undefined,
194
- onKeyDown: isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined,
195
- title: strings.prevYearAriaLabel ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1)) : undefined,
196
- type: "button"
197
- }, dir === 'ltr' ? /*#__PURE__*/React.createElement(ArrowUpRegular, null) : /*#__PURE__*/React.createElement(ArrowDownRegular, null)), /*#__PURE__*/React.createElement("button", {
198
- className: mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled),
199
- "aria-disabled": !isNextYearInBounds,
200
- tabIndex: isNextYearInBounds ? undefined : allFocusable ? 0 : -1,
201
- onClick: isNextYearInBounds ? onSelectNextYear : undefined,
202
- onKeyDown: isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined,
203
- title: strings.nextYearAriaLabel ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1)) : undefined,
204
- type: "button"
205
- }, dir === 'ltr' ? /*#__PURE__*/React.createElement(ArrowDownRegular, null) : /*#__PURE__*/React.createElement(ArrowUpRegular, null)))), /*#__PURE__*/React.createElement("div", {
206
- ...arrowNavigationAttributes,
207
- className: classNames.gridContainer,
208
- role: "grid",
209
- "aria-label": yearString
210
- }, rowIndexes.map(rowNum => {
211
- const monthsForRow = strings.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);
212
- return /*#__PURE__*/React.createElement("div", {
213
- key: 'monthRow_' + rowNum + navigatedDate.getFullYear(),
214
- role: "row",
215
- className: classNames.buttonRow
216
- }, monthsForRow.map((month, index) => {
217
- const monthIndex = rowNum * MONTHS_PER_ROW + index;
218
- const indexedMonth = setMonth(navigatedDate, monthIndex);
219
- const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;
220
- const isSelectedMonth = selectedDate.getMonth() === monthIndex;
221
- const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();
222
- const isInBounds = (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) && (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);
223
- return /*#__PURE__*/React.createElement("button", {
224
- ref: isNavigatedMonth ? navigatedMonthRef : undefined,
225
- role: 'gridcell',
226
- className: mergeClasses(classNames.itemButton, highlightCurrentMonth && isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) && classNames.current, highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected, !isInBounds && classNames.disabled),
227
- disabled: !allFocusable && !isInBounds,
228
- key: monthIndex,
229
- onClick: isInBounds ? selectMonthCallback(monthIndex) : undefined,
230
- onKeyDown: isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined,
231
- "aria-label": dateFormatter.formatMonth(indexedMonth, strings),
232
- "aria-selected": isNavigatedMonth,
233
- tabIndex: isInBounds ? 0 : -1,
66
+ const selectMonthCallback = (newMonth)=>{
67
+ return ()=>onSelectMonth(newMonth);
68
+ };
69
+ const onSelectNextYear = ()=>{
70
+ onNavigateDate(addYears(navigatedDate, 1), false);
71
+ };
72
+ const onSelectPrevYear = ()=>{
73
+ onNavigateDate(addYears(navigatedDate, -1), false);
74
+ };
75
+ const onSelectMonth = (newMonth)=>{
76
+ // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked
77
+ onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
78
+ onNavigateDate(setMonth(navigatedDate, newMonth), true);
79
+ };
80
+ const onHeaderSelect = ()=>{
81
+ if (!yearPickerHidden) {
82
+ focusOnNextUpdate();
83
+ setIsYearPickerVisible(true);
84
+ } else {
85
+ onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
86
+ }
87
+ };
88
+ const onSelectYear = (selectedYear)=>{
89
+ focusOnNextUpdate();
90
+ const navYear = navigatedDate.getFullYear();
91
+ if (navYear !== selectedYear) {
92
+ let newNavigationDate = new Date(navigatedDate.getTime());
93
+ newNavigationDate.setFullYear(selectedYear);
94
+ // for min and max dates, adjust the new navigation date - perhaps this should be
95
+ // checked on the master navigation date handler (i.e. in Calendar)
96
+ if (maxDate && newNavigationDate > maxDate) {
97
+ newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());
98
+ } else if (minDate && newNavigationDate < minDate) {
99
+ newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());
100
+ }
101
+ onNavigateDate(newNavigationDate, true);
102
+ }
103
+ setIsYearPickerVisible(false);
104
+ };
105
+ const onYearPickerHeaderSelect = (focus)=>{
106
+ focusOnNextUpdate();
107
+ setIsYearPickerVisible(false);
108
+ };
109
+ const dateFormatter = dateTimeFormatter;
110
+ // determine if previous/next years are in bounds
111
+ const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;
112
+ const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;
113
+ const classNames = useCalendarMonthStyles_unstable({
114
+ className,
115
+ hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,
116
+ highlightCurrent: highlightCurrentMonth,
117
+ highlightSelected: highlightSelectedMonth,
118
+ animateBackwards,
119
+ animationDirection
120
+ });
121
+ const { dir } = useFluent_unstable();
122
+ const arrowNavigationAttributes = useArrowNavigationGroup({
123
+ axis: 'both'
124
+ });
125
+ if (isYearPickerVisible) {
126
+ const [onRenderYear, yearStrings] = getYearStrings({
127
+ dateTimeFormatter,
128
+ navigatedDate,
129
+ strings
130
+ });
131
+ // use navigated date for the year picker
132
+ return /*#__PURE__*/ React.createElement(CalendarYear, {
133
+ key: 'calendarYear',
134
+ minYear: minDate ? minDate.getFullYear() : undefined,
135
+ maxYear: maxDate ? maxDate.getFullYear() : undefined,
136
+ // eslint-disable-next-line react/jsx-no-bind
137
+ onSelectYear: onSelectYear,
138
+ // eslint-disable-next-line react/jsx-no-bind
139
+ onHeaderSelect: onYearPickerHeaderSelect,
140
+ selectedYear: selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined,
141
+ onRenderYear: onRenderYear,
142
+ strings: yearStrings,
143
+ componentRef: calendarYearRef,
144
+ highlightCurrentYear: highlightCurrentMonth,
145
+ highlightSelectedYear: highlightSelectedMonth,
146
+ animationDirection: animationDirection
147
+ });
148
+ }
149
+ const rowIndexes = [];
150
+ for(let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++){
151
+ rowIndexes.push(i);
152
+ }
153
+ const yearString = dateFormatter.formatYear(navigatedDate);
154
+ const headerAriaLabel = strings.monthPickerHeaderAriaLabel ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString) : yearString;
155
+ return /*#__PURE__*/ React.createElement("div", {
156
+ className: classNames.root
157
+ }, /*#__PURE__*/ React.createElement("div", {
158
+ className: classNames.headerContainer
159
+ }, /*#__PURE__*/ React.createElement("button", {
160
+ className: classNames.currentItemButton,
161
+ onClick: onHeaderSelect,
162
+ onKeyDown: onButtonKeyDown(onHeaderSelect),
163
+ "aria-label": headerAriaLabel,
164
+ tabIndex: !!onUserHeaderSelect || !yearPickerHidden ? 0 : -1,
234
165
  type: "button"
235
- }, month);
236
- }));
237
- })));
166
+ }, /*#__PURE__*/ React.createElement("span", {
167
+ "aria-live": "polite",
168
+ "aria-atomic": "true"
169
+ }, yearString)), /*#__PURE__*/ React.createElement("div", {
170
+ className: classNames.navigationButtonsContainer
171
+ }, /*#__PURE__*/ React.createElement("button", {
172
+ className: mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled),
173
+ "aria-disabled": !isPrevYearInBounds,
174
+ tabIndex: isPrevYearInBounds ? undefined : allFocusable ? 0 : -1,
175
+ onClick: isPrevYearInBounds ? onSelectPrevYear : undefined,
176
+ onKeyDown: isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined,
177
+ title: strings.prevYearAriaLabel ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1)) : undefined,
178
+ type: "button"
179
+ }, dir === 'ltr' ? /*#__PURE__*/ React.createElement(ArrowUpRegular, null) : /*#__PURE__*/ React.createElement(ArrowDownRegular, null)), /*#__PURE__*/ React.createElement("button", {
180
+ className: mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled),
181
+ "aria-disabled": !isNextYearInBounds,
182
+ tabIndex: isNextYearInBounds ? undefined : allFocusable ? 0 : -1,
183
+ onClick: isNextYearInBounds ? onSelectNextYear : undefined,
184
+ onKeyDown: isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined,
185
+ title: strings.nextYearAriaLabel ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1)) : undefined,
186
+ type: "button"
187
+ }, dir === 'ltr' ? /*#__PURE__*/ React.createElement(ArrowDownRegular, null) : /*#__PURE__*/ React.createElement(ArrowUpRegular, null)))), /*#__PURE__*/ React.createElement("div", {
188
+ ...arrowNavigationAttributes,
189
+ className: classNames.gridContainer,
190
+ role: "grid",
191
+ "aria-label": yearString
192
+ }, rowIndexes.map((rowNum)=>{
193
+ const monthsForRow = strings.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);
194
+ return /*#__PURE__*/ React.createElement("div", {
195
+ key: 'monthRow_' + rowNum + navigatedDate.getFullYear(),
196
+ role: "row",
197
+ className: classNames.buttonRow
198
+ }, monthsForRow.map((month, index)=>{
199
+ const monthIndex = rowNum * MONTHS_PER_ROW + index;
200
+ const indexedMonth = setMonth(navigatedDate, monthIndex);
201
+ const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;
202
+ const isSelectedMonth = selectedDate.getMonth() === monthIndex;
203
+ const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();
204
+ const isInBounds = (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) && (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);
205
+ return /*#__PURE__*/ React.createElement("button", {
206
+ ref: isNavigatedMonth ? navigatedMonthRef : undefined,
207
+ role: 'gridcell',
208
+ className: mergeClasses(classNames.itemButton, highlightCurrentMonth && isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) && classNames.current, highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected, !isInBounds && classNames.disabled),
209
+ disabled: !allFocusable && !isInBounds,
210
+ key: monthIndex,
211
+ onClick: isInBounds ? selectMonthCallback(monthIndex) : undefined,
212
+ onKeyDown: isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined,
213
+ "aria-label": dateFormatter.formatMonth(indexedMonth, strings),
214
+ "aria-selected": isNavigatedMonth,
215
+ tabIndex: isInBounds ? 0 : -1,
216
+ type: "button"
217
+ }, month);
218
+ }));
219
+ })));
238
220
  };
239
221
  CalendarMonth.displayName = 'CalendarMonth';
240
- function getYearStrings({
241
- dateTimeFormatter,
242
- navigatedDate,
243
- strings
244
- }) {
245
- const yearToString = year => {
246
- if (dateTimeFormatter) {
247
- // create a date based on the current nav date
248
- const yearFormattingDate = new Date(navigatedDate.getTime());
249
- yearFormattingDate.setFullYear(year);
250
- return dateTimeFormatter.formatYear(yearFormattingDate);
251
- }
252
- return String(year);
253
- };
254
- const yearRangeToString = yearRange => {
255
- return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;
256
- };
257
- const yearRangeToNextDecadeLabel = yearRange => {
258
- return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';
259
- };
260
- const yearRangeToPrevDecadeLabel = yearRange => {
261
- return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';
262
- };
263
- return [yearToString, {
264
- rangeAriaLabel: yearRangeToString,
265
- prevRangeAriaLabel: yearRangeToPrevDecadeLabel,
266
- nextRangeAriaLabel: yearRangeToNextDecadeLabel,
267
- headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel
268
- }];
222
+ function getYearStrings({ dateTimeFormatter , navigatedDate , strings }) {
223
+ const yearToString = (year)=>{
224
+ if (dateTimeFormatter) {
225
+ // create a date based on the current nav date
226
+ const yearFormattingDate = new Date(navigatedDate.getTime());
227
+ yearFormattingDate.setFullYear(year);
228
+ return dateTimeFormatter.formatYear(yearFormattingDate);
229
+ }
230
+ return String(year);
231
+ };
232
+ const yearRangeToString = (yearRange)=>{
233
+ return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;
234
+ };
235
+ const yearRangeToNextDecadeLabel = (yearRange)=>{
236
+ return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';
237
+ };
238
+ const yearRangeToPrevDecadeLabel = (yearRange)=>{
239
+ return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';
240
+ };
241
+ return [
242
+ yearToString,
243
+ {
244
+ rangeAriaLabel: yearRangeToString,
245
+ prevRangeAriaLabel: yearRangeToPrevDecadeLabel,
246
+ nextRangeAriaLabel: yearRangeToNextDecadeLabel,
247
+ headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel
248
+ }
249
+ ];
269
250
  }
270
251
  function isCurrentMonth(month, year, today) {
271
- return today.getFullYear() === year && today.getMonth() === month;
252
+ return today.getFullYear() === year && today.getMonth() === month;
272
253
  }
273
254
  function onButtonKeyDown(callback) {
274
- return ev => {
275
- switch (ev.key) {
276
- case Enter:
277
- callback();
278
- break;
279
- }
280
- };
255
+ return (ev)=>{
256
+ switch(ev.key){
257
+ case Enter:
258
+ callback();
259
+ break;
260
+ }
261
+ };
281
262
  }
282
- //# sourceMappingURL=CalendarMonth.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","Enter","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","addYears","compareDatePart","getMonthEnd","getMonthStart","getYearEnd","getYearStart","setMonth","DEFAULT_DATE_FORMATTING","CalendarYear","useCalendarMonthStyles_unstable","MONTHS_PER_ROW","useAnimateBackwards","navigatedDate","currentYear","getFullYear","previousYearRef","useRef","useEffect","current","previousYear","undefined","useFocusLogic","componentRef","navigatedMonthRef","calendarYearRef","focusOnUpdate","focus","useCallback","useImperativeHandle","focusOnNextUpdate","CalendarMonth","props","allFocusable","animationDirection","className","dateTimeFormatter","highlightCurrentMonth","highlightSelectedMonth","maxDate","minDate","onHeaderSelect","onUserHeaderSelect","onNavigateDate","selectedDate","strings","today","Date","yearPickerHidden","isYearPickerVisible","setIsYearPickerVisible","useState","animateBackwards","selectMonthCallback","newMonth","onSelectMonth","onSelectNextYear","onSelectPrevYear","onSelectYear","selectedYear","navYear","newNavigationDate","getTime","setFullYear","getMonth","onYearPickerHeaderSelect","dateFormatter","isPrevYearInBounds","isNextYearInBounds","classNames","hasHeaderClickCallback","highlightCurrent","highlightSelected","dir","arrowNavigationAttributes","axis","onRenderYear","yearStrings","getYearStrings","createElement","key","minYear","maxYear","highlightCurrentYear","highlightSelectedYear","rowIndexes","i","shortMonths","length","push","yearString","formatYear","headerAriaLabel","monthPickerHeaderAriaLabel","replace","root","headerContainer","currentItemButton","onClick","onKeyDown","onButtonKeyDown","tabIndex","type","navigationButtonsContainer","navigationButton","disabled","title","prevYearAriaLabel","nextYearAriaLabel","gridContainer","role","map","rowNum","monthsForRow","slice","buttonRow","month","index","monthIndex","indexedMonth","isNavigatedMonth","isSelectedMonth","isSelectedYear","isInBounds","ref","itemButton","isCurrentMonth","selected","formatMonth","displayName","yearToString","year","yearFormattingDate","String","yearRangeToString","yearRange","fromYear","toYear","yearRangeToNextDecadeLabel","nextYearRangeAriaLabel","yearRangeToPrevDecadeLabel","prevYearRangeAriaLabel","rangeAriaLabel","prevRangeAriaLabel","nextRangeAriaLabel","headerAriaLabelFormatString","yearPickerHeaderAriaLabel","callback","ev"],"sources":["../../../src/components/CalendarMonth/CalendarMonth.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport {\n addYears,\n compareDatePart,\n getMonthEnd,\n getMonthStart,\n getYearEnd,\n getYearStart,\n setMonth,\n DEFAULT_DATE_FORMATTING,\n} from '../../utils';\nimport { CalendarYear } from '../CalendarYear/CalendarYear';\nimport { useCalendarMonthStyles_unstable } from './useCalendarMonthStyles';\nimport type { CalendarMonthProps } from './CalendarMonth.types';\nimport type { CalendarYearRange, ICalendarYear } from '../CalendarYear/CalendarYear.types';\n\nconst MONTHS_PER_ROW = 4;\n\nfunction useAnimateBackwards({ navigatedDate }: { navigatedDate: CalendarMonthProps['navigatedDate'] }) {\n const currentYear = navigatedDate.getFullYear();\n\n const previousYearRef = React.useRef<number | undefined>();\n React.useEffect(() => {\n previousYearRef.current = currentYear;\n });\n const previousYear = previousYearRef.current;\n\n if (previousYear === undefined || previousYear === currentYear) {\n return undefined;\n } else {\n return previousYear > currentYear;\n }\n}\n\nfunction useFocusLogic({ componentRef }: { componentRef: CalendarMonthProps['componentRef'] }) {\n const navigatedMonthRef = React.useRef<HTMLButtonElement>(null);\n const calendarYearRef = React.useRef<ICalendarYear>(null);\n const focusOnUpdate = React.useRef(false);\n\n const focus = React.useCallback(() => {\n if (calendarYearRef.current) {\n calendarYearRef.current.focus();\n } else if (navigatedMonthRef.current) {\n navigatedMonthRef.current.focus();\n }\n }, []);\n\n React.useImperativeHandle(componentRef, () => ({ focus }), [focus]);\n\n React.useEffect(() => {\n if (focusOnUpdate.current) {\n focus();\n focusOnUpdate.current = false;\n }\n });\n\n const focusOnNextUpdate = () => {\n focusOnUpdate.current = true;\n };\n\n return [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarMonth: React.FunctionComponent<CalendarMonthProps> = props => {\n const {\n allFocusable,\n animationDirection,\n className,\n componentRef,\n dateTimeFormatter = DEFAULT_DATE_FORMATTING,\n highlightCurrentMonth,\n highlightSelectedMonth,\n maxDate,\n minDate,\n navigatedDate,\n onHeaderSelect: onUserHeaderSelect,\n onNavigateDate,\n selectedDate,\n strings,\n today = new Date(),\n yearPickerHidden = false,\n } = props;\n\n const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({ componentRef });\n const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);\n\n const animateBackwards = useAnimateBackwards({ navigatedDate });\n\n const selectMonthCallback = (newMonth: number): (() => void) => {\n return () => onSelectMonth(newMonth);\n };\n\n const onSelectNextYear = (): void => {\n onNavigateDate(addYears(navigatedDate, 1), false);\n };\n\n const onSelectPrevYear = (): void => {\n onNavigateDate(addYears(navigatedDate, -1), false);\n };\n\n const onSelectMonth = (newMonth: number): void => {\n // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked\n onUserHeaderSelect?.();\n onNavigateDate(setMonth(navigatedDate, newMonth), true);\n };\n\n const onHeaderSelect = (): void => {\n if (!yearPickerHidden) {\n focusOnNextUpdate();\n setIsYearPickerVisible(true);\n } else {\n onUserHeaderSelect?.();\n }\n };\n\n const onSelectYear = (selectedYear: number) => {\n focusOnNextUpdate();\n const navYear = navigatedDate.getFullYear();\n if (navYear !== selectedYear) {\n let newNavigationDate = new Date(navigatedDate.getTime());\n newNavigationDate.setFullYear(selectedYear);\n // for min and max dates, adjust the new navigation date - perhaps this should be\n // checked on the master navigation date handler (i.e. in Calendar)\n if (maxDate && newNavigationDate > maxDate) {\n newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());\n } else if (minDate && newNavigationDate < minDate) {\n newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());\n }\n onNavigateDate(newNavigationDate, true);\n }\n setIsYearPickerVisible(false);\n };\n\n const onYearPickerHeaderSelect = (focus: boolean): void => {\n focusOnNextUpdate();\n setIsYearPickerVisible(false);\n };\n\n const dateFormatter = dateTimeFormatter!;\n\n // determine if previous/next years are in bounds\n const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;\n const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;\n\n const classNames = useCalendarMonthStyles_unstable({\n className,\n hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,\n highlightCurrent: highlightCurrentMonth,\n highlightSelected: highlightSelectedMonth,\n animateBackwards,\n animationDirection,\n });\n\n const { dir } = useFluent_unstable();\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n if (isYearPickerVisible) {\n const [onRenderYear, yearStrings] = getYearStrings({ dateTimeFormatter, navigatedDate, strings });\n // use navigated date for the year picker\n return (\n <CalendarYear\n key={'calendarYear'}\n minYear={minDate ? minDate.getFullYear() : undefined}\n maxYear={maxDate ? maxDate.getFullYear() : undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onSelectYear={onSelectYear}\n // eslint-disable-next-line react/jsx-no-bind\n onHeaderSelect={onYearPickerHeaderSelect}\n selectedYear={\n selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined\n }\n onRenderYear={onRenderYear}\n strings={yearStrings}\n componentRef={calendarYearRef}\n highlightCurrentYear={highlightCurrentMonth}\n highlightSelectedYear={highlightSelectedMonth}\n animationDirection={animationDirection}\n />\n );\n }\n\n const rowIndexes = [];\n for (let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++) {\n rowIndexes.push(i);\n }\n\n const yearString = dateFormatter.formatYear(navigatedDate);\n const headerAriaLabel = strings.monthPickerHeaderAriaLabel\n ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString)\n : yearString;\n\n return (\n <div className={classNames.root}>\n <div className={classNames.headerContainer}>\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onButtonKeyDown(onHeaderSelect)}\n aria-label={headerAriaLabel}\n tabIndex={!!onUserHeaderSelect || !yearPickerHidden ? 0 : -1}\n type=\"button\"\n >\n <span aria-live=\"polite\" aria-atomic=\"true\">\n {yearString}\n </span>\n </button>\n <div className={classNames.navigationButtonsContainer}>\n <button\n className={mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled)}\n aria-disabled={!isPrevYearInBounds}\n tabIndex={isPrevYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isPrevYearInBounds ? onSelectPrevYear : undefined}\n onKeyDown={isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined}\n title={\n strings.prevYearAriaLabel\n ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n <button\n className={mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled)}\n aria-disabled={!isNextYearInBounds}\n tabIndex={isNextYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isNextYearInBounds ? onSelectNextYear : undefined}\n onKeyDown={isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined}\n title={\n strings.nextYearAriaLabel\n ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowDownRegular /> : <ArrowUpRegular />}\n </button>\n </div>\n </div>\n <div {...arrowNavigationAttributes} className={classNames.gridContainer} role=\"grid\" aria-label={yearString}>\n {rowIndexes.map((rowNum: number) => {\n const monthsForRow = strings!.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);\n return (\n <div key={'monthRow_' + rowNum + navigatedDate.getFullYear()} role=\"row\" className={classNames.buttonRow}>\n {monthsForRow.map((month: string, index: number) => {\n const monthIndex = rowNum * MONTHS_PER_ROW + index;\n const indexedMonth = setMonth(navigatedDate, monthIndex);\n const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;\n const isSelectedMonth = selectedDate.getMonth() === monthIndex;\n const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();\n const isInBounds =\n (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) &&\n (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);\n\n return (\n <button\n ref={isNavigatedMonth ? navigatedMonthRef : undefined}\n role={'gridcell'}\n className={mergeClasses(\n classNames.itemButton,\n highlightCurrentMonth &&\n isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) &&\n classNames.current,\n highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected,\n !isInBounds && classNames.disabled,\n )}\n disabled={!allFocusable && !isInBounds}\n key={monthIndex}\n onClick={isInBounds ? selectMonthCallback(monthIndex) : undefined}\n onKeyDown={isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined}\n aria-label={dateFormatter.formatMonth(indexedMonth, strings!)}\n aria-selected={isNavigatedMonth}\n tabIndex={isInBounds ? 0 : -1}\n type=\"button\"\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarMonth.displayName = 'CalendarMonth';\n\nfunction getYearStrings({\n dateTimeFormatter,\n navigatedDate,\n strings,\n}: Pick<CalendarMonthProps, 'dateTimeFormatter' | 'navigatedDate' | 'strings'>) {\n const yearToString = (year: number) => {\n if (dateTimeFormatter) {\n // create a date based on the current nav date\n const yearFormattingDate = new Date(navigatedDate.getTime());\n yearFormattingDate.setFullYear(year);\n return dateTimeFormatter.formatYear(yearFormattingDate);\n }\n return String(year);\n };\n\n const yearRangeToString = (yearRange: CalendarYearRange) => {\n return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;\n };\n\n const yearRangeToNextDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n const yearRangeToPrevDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n return [\n yearToString,\n {\n rangeAriaLabel: yearRangeToString,\n prevRangeAriaLabel: yearRangeToPrevDecadeLabel,\n nextRangeAriaLabel: yearRangeToNextDecadeLabel,\n headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel,\n } as const,\n ] as const;\n}\n\nfunction isCurrentMonth(month: number, year: number, today: Date): boolean {\n return today.getFullYear() === year && today.getMonth() === month;\n}\n\nfunction onButtonKeyDown(callback: () => void): (ev: React.KeyboardEvent<HTMLButtonElement>) => void {\n return (ev: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (ev.key) {\n case Enter:\n callback();\n break;\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"sources":["CalendarMonth.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport {\n addYears,\n compareDatePart,\n getMonthEnd,\n getMonthStart,\n getYearEnd,\n getYearStart,\n setMonth,\n DEFAULT_DATE_FORMATTING,\n} from '../../utils';\nimport { CalendarYear } from '../CalendarYear/CalendarYear';\nimport { useCalendarMonthStyles_unstable } from './useCalendarMonthStyles';\nimport type { CalendarMonthProps } from './CalendarMonth.types';\nimport type { CalendarYearRange, ICalendarYear } from '../CalendarYear/CalendarYear.types';\n\nconst MONTHS_PER_ROW = 4;\n\nfunction useAnimateBackwards({ navigatedDate }: { navigatedDate: CalendarMonthProps['navigatedDate'] }) {\n const currentYear = navigatedDate.getFullYear();\n\n const previousYearRef = React.useRef<number | undefined>();\n React.useEffect(() => {\n previousYearRef.current = currentYear;\n });\n const previousYear = previousYearRef.current;\n\n if (previousYear === undefined || previousYear === currentYear) {\n return undefined;\n } else {\n return previousYear > currentYear;\n }\n}\n\nfunction useFocusLogic({ componentRef }: { componentRef: CalendarMonthProps['componentRef'] }) {\n const navigatedMonthRef = React.useRef<HTMLButtonElement>(null);\n const calendarYearRef = React.useRef<ICalendarYear>(null);\n const focusOnUpdate = React.useRef(false);\n\n const focus = React.useCallback(() => {\n if (calendarYearRef.current) {\n calendarYearRef.current.focus();\n } else if (navigatedMonthRef.current) {\n navigatedMonthRef.current.focus();\n }\n }, []);\n\n React.useImperativeHandle(componentRef, () => ({ focus }), [focus]);\n\n React.useEffect(() => {\n if (focusOnUpdate.current) {\n focus();\n focusOnUpdate.current = false;\n }\n });\n\n const focusOnNextUpdate = () => {\n focusOnUpdate.current = true;\n };\n\n return [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarMonth: React.FunctionComponent<CalendarMonthProps> = props => {\n const {\n allFocusable,\n animationDirection,\n className,\n componentRef,\n dateTimeFormatter = DEFAULT_DATE_FORMATTING,\n highlightCurrentMonth,\n highlightSelectedMonth,\n maxDate,\n minDate,\n navigatedDate,\n onHeaderSelect: onUserHeaderSelect,\n onNavigateDate,\n selectedDate,\n strings,\n today = new Date(),\n yearPickerHidden = false,\n } = props;\n\n const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({ componentRef });\n const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);\n\n const animateBackwards = useAnimateBackwards({ navigatedDate });\n\n const selectMonthCallback = (newMonth: number): (() => void) => {\n return () => onSelectMonth(newMonth);\n };\n\n const onSelectNextYear = (): void => {\n onNavigateDate(addYears(navigatedDate, 1), false);\n };\n\n const onSelectPrevYear = (): void => {\n onNavigateDate(addYears(navigatedDate, -1), false);\n };\n\n const onSelectMonth = (newMonth: number): void => {\n // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked\n onUserHeaderSelect?.();\n onNavigateDate(setMonth(navigatedDate, newMonth), true);\n };\n\n const onHeaderSelect = (): void => {\n if (!yearPickerHidden) {\n focusOnNextUpdate();\n setIsYearPickerVisible(true);\n } else {\n onUserHeaderSelect?.();\n }\n };\n\n const onSelectYear = (selectedYear: number) => {\n focusOnNextUpdate();\n const navYear = navigatedDate.getFullYear();\n if (navYear !== selectedYear) {\n let newNavigationDate = new Date(navigatedDate.getTime());\n newNavigationDate.setFullYear(selectedYear);\n // for min and max dates, adjust the new navigation date - perhaps this should be\n // checked on the master navigation date handler (i.e. in Calendar)\n if (maxDate && newNavigationDate > maxDate) {\n newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());\n } else if (minDate && newNavigationDate < minDate) {\n newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());\n }\n onNavigateDate(newNavigationDate, true);\n }\n setIsYearPickerVisible(false);\n };\n\n const onYearPickerHeaderSelect = (focus: boolean): void => {\n focusOnNextUpdate();\n setIsYearPickerVisible(false);\n };\n\n const dateFormatter = dateTimeFormatter!;\n\n // determine if previous/next years are in bounds\n const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;\n const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;\n\n const classNames = useCalendarMonthStyles_unstable({\n className,\n hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,\n highlightCurrent: highlightCurrentMonth,\n highlightSelected: highlightSelectedMonth,\n animateBackwards,\n animationDirection,\n });\n\n const { dir } = useFluent_unstable();\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n if (isYearPickerVisible) {\n const [onRenderYear, yearStrings] = getYearStrings({ dateTimeFormatter, navigatedDate, strings });\n // use navigated date for the year picker\n return (\n <CalendarYear\n key={'calendarYear'}\n minYear={minDate ? minDate.getFullYear() : undefined}\n maxYear={maxDate ? maxDate.getFullYear() : undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onSelectYear={onSelectYear}\n // eslint-disable-next-line react/jsx-no-bind\n onHeaderSelect={onYearPickerHeaderSelect}\n selectedYear={\n selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined\n }\n onRenderYear={onRenderYear}\n strings={yearStrings}\n componentRef={calendarYearRef}\n highlightCurrentYear={highlightCurrentMonth}\n highlightSelectedYear={highlightSelectedMonth}\n animationDirection={animationDirection}\n />\n );\n }\n\n const rowIndexes = [];\n for (let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++) {\n rowIndexes.push(i);\n }\n\n const yearString = dateFormatter.formatYear(navigatedDate);\n const headerAriaLabel = strings.monthPickerHeaderAriaLabel\n ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString)\n : yearString;\n\n return (\n <div className={classNames.root}>\n <div className={classNames.headerContainer}>\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onButtonKeyDown(onHeaderSelect)}\n aria-label={headerAriaLabel}\n tabIndex={!!onUserHeaderSelect || !yearPickerHidden ? 0 : -1}\n type=\"button\"\n >\n <span aria-live=\"polite\" aria-atomic=\"true\">\n {yearString}\n </span>\n </button>\n <div className={classNames.navigationButtonsContainer}>\n <button\n className={mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled)}\n aria-disabled={!isPrevYearInBounds}\n tabIndex={isPrevYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isPrevYearInBounds ? onSelectPrevYear : undefined}\n onKeyDown={isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined}\n title={\n strings.prevYearAriaLabel\n ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n <button\n className={mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled)}\n aria-disabled={!isNextYearInBounds}\n tabIndex={isNextYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isNextYearInBounds ? onSelectNextYear : undefined}\n onKeyDown={isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined}\n title={\n strings.nextYearAriaLabel\n ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowDownRegular /> : <ArrowUpRegular />}\n </button>\n </div>\n </div>\n <div {...arrowNavigationAttributes} className={classNames.gridContainer} role=\"grid\" aria-label={yearString}>\n {rowIndexes.map((rowNum: number) => {\n const monthsForRow = strings!.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);\n return (\n <div key={'monthRow_' + rowNum + navigatedDate.getFullYear()} role=\"row\" className={classNames.buttonRow}>\n {monthsForRow.map((month: string, index: number) => {\n const monthIndex = rowNum * MONTHS_PER_ROW + index;\n const indexedMonth = setMonth(navigatedDate, monthIndex);\n const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;\n const isSelectedMonth = selectedDate.getMonth() === monthIndex;\n const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();\n const isInBounds =\n (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) &&\n (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);\n\n return (\n <button\n ref={isNavigatedMonth ? navigatedMonthRef : undefined}\n role={'gridcell'}\n className={mergeClasses(\n classNames.itemButton,\n highlightCurrentMonth &&\n isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) &&\n classNames.current,\n highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected,\n !isInBounds && classNames.disabled,\n )}\n disabled={!allFocusable && !isInBounds}\n key={monthIndex}\n onClick={isInBounds ? selectMonthCallback(monthIndex) : undefined}\n onKeyDown={isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined}\n aria-label={dateFormatter.formatMonth(indexedMonth, strings!)}\n aria-selected={isNavigatedMonth}\n tabIndex={isInBounds ? 0 : -1}\n type=\"button\"\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarMonth.displayName = 'CalendarMonth';\n\nfunction getYearStrings({\n dateTimeFormatter,\n navigatedDate,\n strings,\n}: Pick<CalendarMonthProps, 'dateTimeFormatter' | 'navigatedDate' | 'strings'>) {\n const yearToString = (year: number) => {\n if (dateTimeFormatter) {\n // create a date based on the current nav date\n const yearFormattingDate = new Date(navigatedDate.getTime());\n yearFormattingDate.setFullYear(year);\n return dateTimeFormatter.formatYear(yearFormattingDate);\n }\n return String(year);\n };\n\n const yearRangeToString = (yearRange: CalendarYearRange) => {\n return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;\n };\n\n const yearRangeToNextDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n const yearRangeToPrevDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n return [\n yearToString,\n {\n rangeAriaLabel: yearRangeToString,\n prevRangeAriaLabel: yearRangeToPrevDecadeLabel,\n nextRangeAriaLabel: yearRangeToNextDecadeLabel,\n headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel,\n } as const,\n ] as const;\n}\n\nfunction isCurrentMonth(month: number, year: number, today: Date): boolean {\n return today.getFullYear() === year && today.getMonth() === month;\n}\n\nfunction onButtonKeyDown(callback: () => void): (ev: React.KeyboardEvent<HTMLButtonElement>) => void {\n return (ev: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (ev.key) {\n case Enter:\n callback();\n break;\n }\n };\n}\n"],"names":["React","Enter","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","addYears","compareDatePart","getMonthEnd","getMonthStart","getYearEnd","getYearStart","setMonth","DEFAULT_DATE_FORMATTING","CalendarYear","useCalendarMonthStyles_unstable","MONTHS_PER_ROW","useAnimateBackwards","navigatedDate","currentYear","getFullYear","previousYearRef","useRef","useEffect","current","previousYear","undefined","useFocusLogic","componentRef","navigatedMonthRef","calendarYearRef","focusOnUpdate","focus","useCallback","useImperativeHandle","focusOnNextUpdate","CalendarMonth","props","allFocusable","animationDirection","className","dateTimeFormatter","highlightCurrentMonth","highlightSelectedMonth","maxDate","minDate","onHeaderSelect","onUserHeaderSelect","onNavigateDate","selectedDate","strings","today","Date","yearPickerHidden","isYearPickerVisible","setIsYearPickerVisible","useState","animateBackwards","selectMonthCallback","newMonth","onSelectMonth","onSelectNextYear","onSelectPrevYear","onSelectYear","selectedYear","navYear","newNavigationDate","getTime","setFullYear","getMonth","onYearPickerHeaderSelect","dateFormatter","isPrevYearInBounds","isNextYearInBounds","classNames","hasHeaderClickCallback","highlightCurrent","highlightSelected","dir","arrowNavigationAttributes","axis","onRenderYear","yearStrings","getYearStrings","key","minYear","maxYear","highlightCurrentYear","highlightSelectedYear","rowIndexes","i","shortMonths","length","push","yearString","formatYear","headerAriaLabel","monthPickerHeaderAriaLabel","replace","div","root","headerContainer","button","currentItemButton","onClick","onKeyDown","onButtonKeyDown","aria-label","tabIndex","type","span","aria-live","aria-atomic","navigationButtonsContainer","navigationButton","disabled","aria-disabled","title","prevYearAriaLabel","nextYearAriaLabel","gridContainer","role","map","rowNum","monthsForRow","slice","buttonRow","month","index","monthIndex","indexedMonth","isNavigatedMonth","isSelectedMonth","isSelectedYear","isInBounds","ref","itemButton","isCurrentMonth","selected","formatMonth","aria-selected","displayName","yearToString","year","yearFormattingDate","String","yearRangeToString","yearRange","fromYear","toYear","yearRangeToNextDecadeLabel","nextYearRangeAriaLabel","yearRangeToPrevDecadeLabel","prevYearRangeAriaLabel","rangeAriaLabel","prevRangeAriaLabel","nextRangeAriaLabel","headerAriaLabelFormatString","yearPickerHeaderAriaLabel","callback","ev"],"mappings":"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"}