@fluentui/react-datepicker-compat 0.1.3 → 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.
- package/CHANGELOG.json +133 -1
- package/CHANGELOG.md +37 -2
- package/lib/Calendar.js +0 -1
- package/lib/Calendar.js.map +1 -1
- package/lib/CalendarDay.js +0 -1
- package/lib/CalendarDay.js.map +1 -1
- package/lib/CalendarDayGrid.js +0 -1
- package/lib/CalendarDayGrid.js.map +1 -1
- package/lib/CalendarMonth.js +0 -1
- package/lib/CalendarMonth.js.map +1 -1
- package/lib/CalendarPicker.js +0 -1
- package/lib/CalendarPicker.js.map +1 -1
- package/lib/CalendarYear.js +0 -1
- package/lib/CalendarYear.js.map +1 -1
- package/lib/DatePicker.js +0 -1
- package/lib/DatePicker.js.map +1 -1
- package/lib/components/Calendar/Calendar.js +278 -300
- package/lib/components/Calendar/Calendar.js.map +1 -1
- package/lib/components/Calendar/Calendar.types.js +7 -12
- package/lib/components/Calendar/Calendar.types.js.map +1 -1
- package/lib/components/Calendar/defaults.js +0 -1
- package/lib/components/Calendar/defaults.js.map +1 -1
- package/lib/components/Calendar/index.js +0 -1
- package/lib/components/Calendar/index.js.map +1 -1
- package/lib/components/Calendar/useCalendarStyles.styles.js.map +1 -1
- package/lib/components/CalendarDay/CalendarDay.js +100 -128
- package/lib/components/CalendarDay/CalendarDay.js.map +1 -1
- package/lib/components/CalendarDay/CalendarDay.types.js +0 -1
- package/lib/components/CalendarDay/CalendarDay.types.js.map +1 -1
- package/lib/components/CalendarDay/index.js +0 -1
- package/lib/components/CalendarDay/index.js.map +1 -1
- package/lib/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarDayGrid.js +146 -159
- package/lib/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -1
- package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarGridDayCell.js +150 -179
- package/lib/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarGridRow.js +20 -34
- package/lib/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js +29 -39
- package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
- package/lib/components/CalendarDayGrid/index.js +0 -1
- package/lib/components/CalendarDayGrid/index.js.map +1 -1
- package/lib/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
- package/lib/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
- package/lib/components/CalendarDayGrid/useWeeks.js +34 -36
- package/lib/components/CalendarDayGrid/useWeeks.js.map +1 -1
- package/lib/components/CalendarMonth/CalendarMonth.js +238 -258
- package/lib/components/CalendarMonth/CalendarMonth.js.map +1 -1
- package/lib/components/CalendarMonth/CalendarMonth.types.js +0 -1
- package/lib/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
- package/lib/components/CalendarMonth/index.js +0 -1
- package/lib/components/CalendarMonth/index.js.map +1 -1
- package/lib/components/CalendarMonth/useCalendarMonthStyles.js +2 -4
- package/lib/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
- package/lib/components/CalendarPicker/CalendarPicker.types.js +1 -2
- package/lib/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
- package/lib/components/CalendarPicker/index.js +0 -1
- package/lib/components/CalendarPicker/index.js.map +1 -1
- package/lib/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
- package/lib/components/CalendarYear/CalendarYear.js +260 -312
- package/lib/components/CalendarYear/CalendarYear.js.map +1 -1
- package/lib/components/CalendarYear/CalendarYear.types.js +0 -1
- package/lib/components/CalendarYear/CalendarYear.types.js.map +1 -1
- package/lib/components/CalendarYear/index.js +0 -1
- package/lib/components/CalendarYear/index.js.map +1 -1
- package/lib/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
- package/lib/components/DatePicker/DatePicker.js +4 -5
- package/lib/components/DatePicker/DatePicker.js.map +1 -1
- package/lib/components/DatePicker/DatePicker.types.js +0 -1
- package/lib/components/DatePicker/DatePicker.types.js.map +1 -1
- package/lib/components/DatePicker/defaults.js +9 -10
- package/lib/components/DatePicker/defaults.js.map +1 -1
- package/lib/components/DatePicker/index.js +0 -1
- package/lib/components/DatePicker/index.js.map +1 -1
- package/lib/components/DatePicker/renderDatePicker.js +5 -12
- package/lib/components/DatePicker/renderDatePicker.js.map +1 -1
- package/lib/components/DatePicker/useDatePicker.js +401 -353
- package/lib/components/DatePicker/useDatePicker.js.map +1 -1
- package/lib/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/animations.js +72 -73
- package/lib/utils/animations.js.map +1 -1
- package/lib/utils/constants.js +50 -52
- package/lib/utils/constants.js.map +1 -1
- package/lib/utils/dateFormatting/dateFormatting.defaults.js +71 -34
- package/lib/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
- package/lib/utils/dateFormatting/dateFormatting.types.js +1 -2
- package/lib/utils/dateFormatting/dateFormatting.types.js.map +1 -1
- package/lib/utils/dateFormatting/index.js +0 -1
- package/lib/utils/dateFormatting/index.js.map +1 -1
- package/lib/utils/dateGrid/dateGrid.types.js +1 -2
- package/lib/utils/dateGrid/dateGrid.types.js.map +1 -1
- package/lib/utils/dateGrid/findAvailableDate.js +14 -21
- package/lib/utils/dateGrid/findAvailableDate.js.map +1 -1
- package/lib/utils/dateGrid/getBoundedDateRange.js +11 -11
- package/lib/utils/dateGrid/getBoundedDateRange.js.map +1 -1
- package/lib/utils/dateGrid/getDateRangeTypeToUse.js +6 -8
- package/lib/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
- package/lib/utils/dateGrid/getDayGrid.js +59 -73
- package/lib/utils/dateGrid/getDayGrid.js.map +1 -1
- package/lib/utils/dateGrid/index.js +0 -1
- package/lib/utils/dateGrid/index.js.map +1 -1
- package/lib/utils/dateGrid/isAfterMaxDate.js +3 -7
- package/lib/utils/dateGrid/isAfterMaxDate.js.map +1 -1
- package/lib/utils/dateGrid/isBeforeMinDate.js +3 -7
- package/lib/utils/dateGrid/isBeforeMinDate.js.map +1 -1
- package/lib/utils/dateGrid/isContiguous.js +11 -12
- package/lib/utils/dateGrid/isContiguous.js.map +1 -1
- package/lib/utils/dateGrid/isRestrictedDate.js +7 -13
- package/lib/utils/dateGrid/isRestrictedDate.js.map +1 -1
- package/lib/utils/dateMath/dateMath.js +179 -198
- package/lib/utils/dateMath/dateMath.js.map +1 -1
- package/lib/utils/dateMath/index.js +0 -1
- package/lib/utils/dateMath/index.js.map +1 -1
- package/lib/utils/dom.js +5 -6
- package/lib/utils/dom.js.map +1 -1
- package/lib/utils/focus.js +17 -19
- package/lib/utils/focus.js.map +1 -1
- package/lib/utils/index.js +0 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/usePopupPositioning.js +12 -16
- package/lib/utils/usePopupPositioning.js.map +1 -1
- package/lib-commonjs/Calendar.js +0 -3
- package/lib-commonjs/Calendar.js.map +1 -1
- package/lib-commonjs/CalendarDay.js +0 -3
- package/lib-commonjs/CalendarDay.js.map +1 -1
- package/lib-commonjs/CalendarDayGrid.js +0 -3
- package/lib-commonjs/CalendarDayGrid.js.map +1 -1
- package/lib-commonjs/CalendarMonth.js +0 -3
- package/lib-commonjs/CalendarMonth.js.map +1 -1
- package/lib-commonjs/CalendarPicker.js +0 -3
- package/lib-commonjs/CalendarPicker.js.map +1 -1
- package/lib-commonjs/CalendarYear.js +0 -3
- package/lib-commonjs/CalendarYear.js.map +1 -1
- package/lib-commonjs/DatePicker.js +0 -3
- package/lib-commonjs/DatePicker.js.map +1 -1
- package/lib-commonjs/components/Calendar/Calendar.js +1 -3
- package/lib-commonjs/components/Calendar/Calendar.js.map +1 -1
- package/lib-commonjs/components/Calendar/Calendar.types.js +5 -7
- package/lib-commonjs/components/Calendar/Calendar.types.js.map +1 -1
- package/lib-commonjs/components/Calendar/defaults.js +1 -3
- package/lib-commonjs/components/Calendar/defaults.js.map +1 -1
- package/lib-commonjs/components/Calendar/index.js +0 -3
- package/lib-commonjs/components/Calendar/index.js.map +1 -1
- package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js +0 -2
- package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js.map +1 -1
- package/lib-commonjs/components/CalendarDay/CalendarDay.js +1 -3
- package/lib-commonjs/components/CalendarDay/CalendarDay.js.map +1 -1
- package/lib-commonjs/components/CalendarDay/CalendarDay.types.js +0 -3
- package/lib-commonjs/components/CalendarDay/CalendarDay.types.js.map +1 -1
- package/lib-commonjs/components/CalendarDay/index.js +0 -3
- package/lib-commonjs/components/CalendarDay/index.js.map +1 -1
- package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js +0 -2
- package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js +7 -9
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -3
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js +1 -3
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js +1 -3
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js +1 -3
- package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/index.js +0 -3
- package/lib-commonjs/components/CalendarDayGrid/index.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js +0 -2
- package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js +0 -2
- package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/useWeeks.js +9 -11
- package/lib-commonjs/components/CalendarDayGrid/useWeeks.js.map +1 -1
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.js +1 -3
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.js.map +1 -1
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js +0 -3
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
- package/lib-commonjs/components/CalendarMonth/index.js +0 -3
- package/lib-commonjs/components/CalendarMonth/index.js.map +1 -1
- package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js +1 -3
- package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
- package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js +0 -3
- package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
- package/lib-commonjs/components/CalendarPicker/index.js +0 -3
- package/lib-commonjs/components/CalendarPicker/index.js.map +1 -1
- package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js +0 -2
- package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
- package/lib-commonjs/components/CalendarYear/CalendarYear.js +1 -3
- package/lib-commonjs/components/CalendarYear/CalendarYear.js.map +1 -1
- package/lib-commonjs/components/CalendarYear/CalendarYear.types.js +0 -3
- package/lib-commonjs/components/CalendarYear/CalendarYear.types.js.map +1 -1
- package/lib-commonjs/components/CalendarYear/index.js +0 -3
- package/lib-commonjs/components/CalendarYear/index.js.map +1 -1
- package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js +0 -2
- package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
- package/lib-commonjs/components/DatePicker/DatePicker.js +1 -3
- package/lib-commonjs/components/DatePicker/DatePicker.js.map +1 -1
- package/lib-commonjs/components/DatePicker/DatePicker.types.js +0 -3
- package/lib-commonjs/components/DatePicker/DatePicker.types.js.map +1 -1
- package/lib-commonjs/components/DatePicker/defaults.js +1 -3
- package/lib-commonjs/components/DatePicker/defaults.js.map +1 -1
- package/lib-commonjs/components/DatePicker/index.js +0 -3
- package/lib-commonjs/components/DatePicker/index.js.map +1 -1
- package/lib-commonjs/components/DatePicker/renderDatePicker.js +1 -3
- package/lib-commonjs/components/DatePicker/renderDatePicker.js.map +1 -1
- package/lib-commonjs/components/DatePicker/useDatePicker.js +8 -11
- package/lib-commonjs/components/DatePicker/useDatePicker.js.map +1 -1
- package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js +0 -2
- package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
- package/lib-commonjs/index.js +0 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utils/animations.js +4 -6
- package/lib-commonjs/utils/animations.js.map +1 -1
- package/lib-commonjs/utils/constants.js +7 -9
- package/lib-commonjs/utils/constants.js.map +1 -1
- package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js +1 -3
- package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
- package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js +0 -3
- package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js.map +1 -1
- package/lib-commonjs/utils/dateFormatting/index.js +0 -3
- package/lib-commonjs/utils/dateFormatting/index.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/dateGrid.types.js +0 -3
- package/lib-commonjs/utils/dateGrid/dateGrid.types.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/findAvailableDate.js +1 -3
- package/lib-commonjs/utils/dateGrid/findAvailableDate.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js +1 -3
- package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js +1 -3
- package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/getDayGrid.js +1 -3
- package/lib-commonjs/utils/dateGrid/getDayGrid.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/index.js +0 -3
- package/lib-commonjs/utils/dateGrid/index.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js +1 -3
- package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js +1 -3
- package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/isContiguous.js +1 -3
- package/lib-commonjs/utils/dateGrid/isContiguous.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/isRestrictedDate.js +1 -3
- package/lib-commonjs/utils/dateGrid/isRestrictedDate.js.map +1 -1
- package/lib-commonjs/utils/dateMath/dateMath.js +1 -3
- package/lib-commonjs/utils/dateMath/dateMath.js.map +1 -1
- package/lib-commonjs/utils/dateMath/index.js +0 -3
- package/lib-commonjs/utils/dateMath/index.js.map +1 -1
- package/lib-commonjs/utils/dom.js +1 -3
- package/lib-commonjs/utils/dom.js.map +1 -1
- package/lib-commonjs/utils/focus.js +1 -3
- package/lib-commonjs/utils/focus.js.map +1 -1
- package/lib-commonjs/utils/index.js +0 -3
- package/lib-commonjs/utils/index.js.map +1 -1
- package/lib-commonjs/utils/usePopupPositioning.js +1 -3
- package/lib-commonjs/utils/usePopupPositioning.js.map +1 -1
- 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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
previousYearRef.current
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
252
|
+
return today.getFullYear() === year && today.getMonth() === month;
|
|
272
253
|
}
|
|
273
254
|
function onButtonKeyDown(callback) {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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":"AAAA,YAAYA,KAAA,MAAW;AACvB,SAASC,KAAK,QAAQ;AACtB,SAASC,gBAAgB,EAAEC,cAAc,QAAQ;AACjD,SAASC,kBAAkB,QAAQ;AACnC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,YAAY,QAAQ;AAC7B,SACEC,QAAQ,EACRC,eAAe,EACfC,WAAW,EACXC,aAAa,EACbC,UAAU,EACVC,YAAY,EACZC,QAAQ,EACRC,uBAAuB,QAClB;AACP,SAASC,YAAY,QAAQ;AAC7B,SAASC,+BAA+B,QAAQ;AAIhD,MAAMC,cAAA,GAAiB;AAEvB,SAASC,oBAAoB;EAAEC;AAAa,CAA0D,EAAE;EACtG,MAAMC,WAAA,GAAcD,aAAA,CAAcE,WAAW;EAE7C,MAAMC,eAAA,GAAkBtB,KAAA,CAAMuB,MAAM;EACpCvB,KAAA,CAAMwB,SAAS,CAAC,MAAM;IACpBF,eAAA,CAAgBG,OAAO,GAAGL,WAAA;EAC5B;EACA,MAAMM,YAAA,GAAeJ,eAAA,CAAgBG,OAAO;EAE5C,IAAIC,YAAA,KAAiBC,SAAA,IAAaD,YAAA,KAAiBN,WAAA,EAAa;IAC9D,OAAOO,SAAA;EACT,OAAO;IACL,OAAOD,YAAA,GAAeN,WAAA;EACxB;AACF;AAEA,SAASQ,cAAc;EAAEC;AAAY,CAAwD,EAAE;EAC7F,MAAMC,iBAAA,GAAoB9B,KAAA,CAAMuB,MAAM,CAAoB,IAAI;EAC9D,MAAMQ,eAAA,GAAkB/B,KAAA,CAAMuB,MAAM,CAAgB,IAAI;EACxD,MAAMS,aAAA,GAAgBhC,KAAA,CAAMuB,MAAM,CAAC,KAAK;EAExC,MAAMU,KAAA,GAAQjC,KAAA,CAAMkC,WAAW,CAAC,MAAM;IACpC,IAAIH,eAAA,CAAgBN,OAAO,EAAE;MAC3BM,eAAA,CAAgBN,OAAO,CAACQ,KAAK;IAC/B,OAAO,IAAIH,iBAAA,CAAkBL,OAAO,EAAE;MACpCK,iBAAA,CAAkBL,OAAO,CAACQ,KAAK;IACjC;EACF,GAAG,EAAE;EAELjC,KAAA,CAAMmC,mBAAmB,CAACN,YAAA,EAAc,OAAO;IAAEI;EAAM,IAAI,CAACA,KAAA,CAAM;EAElEjC,KAAA,CAAMwB,SAAS,CAAC,MAAM;IACpB,IAAIQ,aAAA,CAAcP,OAAO,EAAE;MACzBQ,KAAA;MACAD,aAAA,CAAcP,OAAO,GAAG,KAAK;IAC/B;EACF;EAEA,MAAMW,iBAAA,GAAoBA,CAAA,KAAM;IAC9BJ,aAAA,CAAcP,OAAO,GAAG,IAAI;EAC9B;EAEA,OAAO,CAACK,iBAAA,EAAmBC,eAAA,EAAiBK,iBAAA,CAAkB;AAChE;AAEA;;;AAGA,OAAO,MAAMC,aAAA,GAA6DC,KAAA,IAAS;EACjF,MAAM;IACJC,YAAA;IACAC,kBAAA;IACAC,SAAA;IACAZ,YAAA;IACAa,iBAAA,GAAoB5B,uBAAA;IACpB6B,qBAAA;IACAC,sBAAA;IACAC,OAAA;IACAC,OAAA;IACA3B,aAAA;IACA4B,cAAA,EAAgBC,kBAAA;IAChBC,cAAA;IACAC,YAAA;IACAC,OAAA;IACAC,KAAA,GAAQ,IAAIC,IAAA;IACZC,gBAAA,GAAmB;EAAK,CACzB,GAAGhB,KAAA;EAEJ,MAAM,CAACR,iBAAA,EAAmBC,eAAA,EAAiBK,iBAAA,CAAkB,GAAGR,aAAA,CAAc;IAAEC;EAAa;EAC7F,MAAM,CAAC0B,mBAAA,EAAqBC,sBAAA,CAAuB,GAAGxD,KAAA,CAAMyD,QAAQ,CAAC,KAAK;EAE1E,MAAMC,gBAAA,GAAmBxC,mBAAA,CAAoB;IAAEC;EAAc;EAE7D,MAAMwC,mBAAA,GAAuBC,QAAA,IAAmC;IAC9D,OAAO,MAAMC,aAAA,CAAcD,QAAA;EAC7B;EAEA,MAAME,gBAAA,GAAmBA,CAAA,KAAY;IACnCb,cAAA,CAAe1C,QAAA,CAASY,aAAA,EAAe,IAAI,KAAK;EAClD;EAEA,MAAM4C,gBAAA,GAAmBA,CAAA,KAAY;IACnCd,cAAA,CAAe1C,QAAA,CAASY,aAAA,EAAe,CAAC,IAAI,KAAK;EACnD;EAEA,MAAM0C,aAAA,GAAiBD,QAAA,IAA2B;IAChD;IACAZ,kBAAA,aAAAA,kBAAA,uBAAAA,kBAAA;IACAC,cAAA,CAAepC,QAAA,CAASM,aAAA,EAAeyC,QAAA,GAAW,IAAI;EACxD;EAEA,MAAMb,cAAA,GAAiBA,CAAA,KAAY;IACjC,IAAI,CAACO,gBAAA,EAAkB;MACrBlB,iBAAA;MACAoB,sBAAA,CAAuB,IAAI;IAC7B,OAAO;MACLR,kBAAA,aAAAA,kBAAA,uBAAAA,kBAAA;IACF;EACF;EAEA,MAAMgB,YAAA,GAAgBC,YAAA,IAAyB;IAC7C7B,iBAAA;IACA,MAAM8B,OAAA,GAAU/C,aAAA,CAAcE,WAAW;IACzC,IAAI6C,OAAA,KAAYD,YAAA,EAAc;MAC5B,IAAIE,iBAAA,GAAoB,IAAId,IAAA,CAAKlC,aAAA,CAAciD,OAAO;MACtDD,iBAAA,CAAkBE,WAAW,CAACJ,YAAA;MAC9B;MACA;MACA,IAAIpB,OAAA,IAAWsB,iBAAA,GAAoBtB,OAAA,EAAS;QAC1CsB,iBAAA,GAAoBtD,QAAA,CAASsD,iBAAA,EAAmBtB,OAAA,CAAQyB,QAAQ;MAClE,OAAO,IAAIxB,OAAA,IAAWqB,iBAAA,GAAoBrB,OAAA,EAAS;QACjDqB,iBAAA,GAAoBtD,QAAA,CAASsD,iBAAA,EAAmBrB,OAAA,CAAQwB,QAAQ;MAClE;MACArB,cAAA,CAAekB,iBAAA,EAAmB,IAAI;IACxC;IACAX,sBAAA,CAAuB,KAAK;EAC9B;EAEA,MAAMe,wBAAA,GAA4BtC,KAAA,IAAyB;IACzDG,iBAAA;IACAoB,sBAAA,CAAuB,KAAK;EAC9B;EAEA,MAAMgB,aAAA,GAAgB9B,iBAAA;EAEtB;EACA,MAAM+B,kBAAA,GAAqB3B,OAAA,GAAUtC,eAAA,CAAgBsC,OAAA,EAASlC,YAAA,CAAaO,aAAA,KAAkB,IAAI,IAAI;EACrG,MAAMuD,kBAAA,GAAqB7B,OAAA,GAAUrC,eAAA,CAAgBG,UAAA,CAAWQ,aAAA,GAAgB0B,OAAA,IAAW,IAAI,IAAI;EAEnG,MAAM8B,UAAA,GAAa3D,+BAAA,CAAgC;IACjDyB,SAAA;IACAmC,sBAAA,EAAwB,CAAC,CAAC5B,kBAAA,IAAsB,CAACM,gBAAA;IACjDuB,gBAAA,EAAkBlC,qBAAA;IAClBmC,iBAAA,EAAmBlC,sBAAA;IACnBc,gBAAA;IACAlB;EACF;EAEA,MAAM;IAAEuC;EAAG,CAAE,GAAG3E,kBAAA;EAChB,MAAM4E,yBAAA,GAA4B3E,uBAAA,CAAwB;IAAE4E,IAAA,EAAM;EAAO;EAEzE,IAAI1B,mBAAA,EAAqB;IACvB,MAAM,CAAC2B,YAAA,EAAcC,WAAA,CAAY,GAAGC,cAAA,CAAe;MAAE1C,iBAAA;MAAmBvB,aAAA;MAAegC;IAAQ;IAC/F;IACA,oBACEnD,KAAA,CAAAqF,aAAA,CAACtE,YAAA;MACCuE,GAAA,EAAK;MACLC,OAAA,EAASzC,OAAA,GAAUA,OAAA,CAAQzB,WAAW,KAAKM,SAAS;MACpD6D,OAAA,EAAS3C,OAAA,GAAUA,OAAA,CAAQxB,WAAW,KAAKM,SAAS;MACpD;MACAqC,YAAA,EAAcA,YAAA;MACd;MACAjB,cAAA,EAAgBwB,wBAAA;MAChBN,YAAA,EACEf,YAAA,GAAeA,YAAA,CAAa7B,WAAW,KAAKF,aAAA,GAAgBA,aAAA,CAAcE,WAAW,KAAKM,SAAS;MAErGuD,YAAA,EAAcA,YAAA;MACd/B,OAAA,EAASgC,WAAA;MACTtD,YAAA,EAAcE,eAAA;MACd0D,oBAAA,EAAsB9C,qBAAA;MACtB+C,qBAAA,EAAuB9C,sBAAA;MACvBJ,kBAAA,EAAoBA;;EAG1B;EAEA,MAAMmD,UAAA,GAAa,EAAE;EACrB,KAAK,IAAIC,CAAA,GAAI,GAAGA,CAAA,GAAIzC,OAAA,CAAQ0C,WAAW,CAACC,MAAM,GAAG7E,cAAA,EAAgB2E,CAAA,IAAK;IACpED,UAAA,CAAWI,IAAI,CAACH,CAAA;EAClB;EAEA,MAAMI,UAAA,GAAaxB,aAAA,CAAcyB,UAAU,CAAC9E,aAAA;EAC5C,MAAM+E,eAAA,GAAkB/C,OAAA,CAAQgD,0BAA0B,GACtDhD,OAAA,CAAQgD,0BAA0B,CAACC,OAAO,CAAC,OAAOJ,UAAA,IAClDA,UAAU;EAEd,oBACEhG,KAAA,CAAAqF,aAAA,CAAC;IAAI5C,SAAA,EAAWkC,UAAA,CAAW0B;kBACzBrG,KAAA,CAAAqF,aAAA,CAAC;IAAI5C,SAAA,EAAWkC,UAAA,CAAW2B;kBACzBtG,KAAA,CAAAqF,aAAA,CAAC;IACC5C,SAAA,EAAWkC,UAAA,CAAW4B,iBAAiB;IACvCC,OAAA,EAASzD,cAAA;IACT0D,SAAA,EAAWC,eAAA,CAAgB3D,cAAA;IAC3B,cAAYmD,eAAA;IACZS,QAAA,EAAU,CAAC,CAAC3D,kBAAA,IAAsB,CAACM,gBAAA,GAAmB,IAAI,CAAC,CAAC;IAC5DsD,IAAA,EAAK;kBAEL5G,KAAA,CAAAqF,aAAA,CAAC;IAAK,aAAU;IAAS,eAAY;KAClCW,UAAA,iBAGLhG,KAAA,CAAAqF,aAAA,CAAC;IAAI5C,SAAA,EAAWkC,UAAA,CAAWkC;kBACzB7G,KAAA,CAAAqF,aAAA,CAAC;IACC5C,SAAA,EAAWnC,YAAA,CAAaqE,UAAA,CAAWmC,gBAAgB,EAAE,CAACrC,kBAAA,IAAsBE,UAAA,CAAWoC,QAAQ;IAC/F,iBAAe,CAACtC,kBAAA;IAChBkC,QAAA,EAAUlC,kBAAA,GAAqB9C,SAAA,GAAYY,YAAA,GAAe,IAAI,CAAC,CAAC;IAChEiE,OAAA,EAAS/B,kBAAA,GAAqBV,gBAAA,GAAmBpC,SAAS;IAC1D8E,SAAA,EAAWhC,kBAAA,GAAqBiC,eAAA,CAAgB3C,gBAAA,IAAoBpC,SAAS;IAC7EqF,KAAA,EACE7D,OAAA,CAAQ8D,iBAAiB,GACrB9D,OAAA,CAAQ8D,iBAAiB,GAAG,MAAMzC,aAAA,CAAcyB,UAAU,CAAC1F,QAAA,CAASY,aAAA,EAAe,CAAC,MACpFQ,SAAS;IAEfiF,IAAA,EAAK;KAEJ7B,GAAA,KAAQ,qBAAQ/E,KAAA,CAAAqF,aAAA,CAAClF,cAAA,uBAAoBH,KAAA,CAAAqF,aAAA,CAACnF,gBAAA,OAAmB,gBAE5DF,KAAA,CAAAqF,aAAA,CAAC;IACC5C,SAAA,EAAWnC,YAAA,CAAaqE,UAAA,CAAWmC,gBAAgB,EAAE,CAACpC,kBAAA,IAAsBC,UAAA,CAAWoC,QAAQ;IAC/F,iBAAe,CAACrC,kBAAA;IAChBiC,QAAA,EAAUjC,kBAAA,GAAqB/C,SAAA,GAAYY,YAAA,GAAe,IAAI,CAAC,CAAC;IAChEiE,OAAA,EAAS9B,kBAAA,GAAqBZ,gBAAA,GAAmBnC,SAAS;IAC1D8E,SAAA,EAAW/B,kBAAA,GAAqBgC,eAAA,CAAgB5C,gBAAA,IAAoBnC,SAAS;IAC7EqF,KAAA,EACE7D,OAAA,CAAQ+D,iBAAiB,GACrB/D,OAAA,CAAQ+D,iBAAiB,GAAG,MAAM1C,aAAA,CAAcyB,UAAU,CAAC1F,QAAA,CAASY,aAAA,EAAe,MACnFQ,SAAS;IAEfiF,IAAA,EAAK;KAEJ7B,GAAA,KAAQ,qBAAQ/E,KAAA,CAAAqF,aAAA,CAACnF,gBAAA,uBAAsBF,KAAA,CAAAqF,aAAA,CAAClF,cAAA,OAAiB,kBAIhEH,KAAA,CAAAqF,aAAA,CAAC;IAAK,GAAGL,yBAAyB;IAAEvC,SAAA,EAAWkC,UAAA,CAAWwC,aAAa;IAAEC,IAAA,EAAK;IAAO,cAAYpB;KAC9FL,UAAA,CAAW0B,GAAG,CAAEC,MAAA,IAAmB;IAClC,MAAMC,YAAA,GAAepE,OAAA,CAAS0C,WAAW,CAAC2B,KAAK,CAACF,MAAA,GAASrG,cAAA,EAAgB,CAACqG,MAAA,GAAS,KAAKrG,cAAA;IACxF,oBACEjB,KAAA,CAAAqF,aAAA,CAAC;MAAIC,GAAA,EAAK,cAAcgC,MAAA,GAASnG,aAAA,CAAcE,WAAW;MAAI+F,IAAA,EAAK;MAAM3E,SAAA,EAAWkC,UAAA,CAAW8C;OAC5FF,YAAA,CAAaF,GAAG,CAAC,CAACK,KAAA,EAAeC,KAAA,KAAkB;MAClD,MAAMC,UAAA,GAAaN,MAAA,GAASrG,cAAA,GAAiB0G,KAAA;MAC7C,MAAME,YAAA,GAAehH,QAAA,CAASM,aAAA,EAAeyG,UAAA;MAC7C,MAAME,gBAAA,GAAmB3G,aAAA,CAAcmD,QAAQ,OAAOsD,UAAA;MACtD,MAAMG,eAAA,GAAkB7E,YAAA,CAAaoB,QAAQ,OAAOsD,UAAA;MACpD,MAAMI,cAAA,GAAiB9E,YAAA,CAAa7B,WAAW,OAAOF,aAAA,CAAcE,WAAW;MAC/E,MAAM4G,UAAA,GACJ,CAACnF,OAAA,GAAUtC,eAAA,CAAgBsC,OAAA,EAASrC,WAAA,CAAYoH,YAAA,KAAiB,IAAI,IAAI,MACxEhF,OAAA,GAAUrC,eAAA,CAAgBE,aAAA,CAAcmH,YAAA,GAAehF,OAAA,IAAW,IAAI,IAAI,CAAD;MAE5E,oBACE7C,KAAA,CAAAqF,aAAA,CAAC;QACC6C,GAAA,EAAKJ,gBAAA,GAAmBhG,iBAAA,GAAoBH,SAAS;QACrDyF,IAAA,EAAM;QACN3E,SAAA,EAAWnC,YAAA,CACTqE,UAAA,CAAWwD,UAAU,EACrBxF,qBAAA,IACEyF,cAAA,CAAeR,UAAA,EAAYzG,aAAA,CAAcE,WAAW,IAAI+B,KAAA,KACxDuB,UAAA,CAAWlD,OAAO,EACpBmB,sBAAA,IAA0BmF,eAAA,IAAmBC,cAAA,IAAkBrD,UAAA,CAAW0D,QAAQ,EAClF,CAACJ,UAAA,IAActD,UAAA,CAAWoC,QAAQ;QAEpCA,QAAA,EAAU,CAACxE,YAAA,IAAgB,CAAC0F,UAAA;QAC5B3C,GAAA,EAAKsC,UAAA;QACLpB,OAAA,EAASyB,UAAA,GAAatE,mBAAA,CAAoBiE,UAAA,IAAcjG,SAAS;QACjE8E,SAAA,EAAWwB,UAAA,GAAavB,eAAA,CAAgB/C,mBAAA,CAAoBiE,UAAA,KAAejG,SAAS;QACpF,cAAY6C,aAAA,CAAc8D,WAAW,CAACT,YAAA,EAAc1E,OAAA;QACpD,iBAAe2E,gBAAA;QACfnB,QAAA,EAAUsB,UAAA,GAAa,IAAI,CAAC,CAAC;QAC7BrB,IAAA,EAAK;SAEJc,KAAA;IAGP;EAGN;AAIR;AACArF,aAAA,CAAckG,WAAW,GAAG;AAE5B,SAASnD,eAAe;EACtB1C,iBAAA;EACAvB,aAAA;EACAgC;AAAO,CACqE,EAAE;EAC9E,MAAMqF,YAAA,GAAgBC,IAAA,IAAiB;IACrC,IAAI/F,iBAAA,EAAmB;MACrB;MACA,MAAMgG,kBAAA,GAAqB,IAAIrF,IAAA,CAAKlC,aAAA,CAAciD,OAAO;MACzDsE,kBAAA,CAAmBrE,WAAW,CAACoE,IAAA;MAC/B,OAAO/F,iBAAA,CAAkBuD,UAAU,CAACyC,kBAAA;IACtC;IACA,OAAOC,MAAA,CAAOF,IAAA;EAChB;EAEA,MAAMG,iBAAA,GAAqBC,SAAA,IAAiC;IAC1D,OAAQ,GAAEL,YAAA,CAAaK,SAAA,CAAUC,QAAQ,CAAE,MAAKN,YAAA,CAAaK,SAAA,CAAUE,MAAM,CAAE,EAAC;EAClF;EAEA,MAAMC,0BAAA,GAA8BH,SAAA,IAAiC;IACnE,OAAO1F,OAAA,CAAQ8F,sBAAsB,GAAI,GAAE9F,OAAA,CAAQ8F,sBAAuB,IAAGL,iBAAA,CAAkBC,SAAA,CAAW,EAAC,GAAG,EAAE;EAClH;EAEA,MAAMK,0BAAA,GAA8BL,SAAA,IAAiC;IACnE,OAAO1F,OAAA,CAAQgG,sBAAsB,GAAI,GAAEhG,OAAA,CAAQgG,sBAAuB,IAAGP,iBAAA,CAAkBC,SAAA,CAAW,EAAC,GAAG,EAAE;EAClH;EAEA,OAAO,CACLL,YAAA,EACA;IACEY,cAAA,EAAgBR,iBAAA;IAChBS,kBAAA,EAAoBH,0BAAA;IACpBI,kBAAA,EAAoBN,0BAAA;IACpBO,2BAAA,EAA6BpG,OAAA,CAAQqG;EACvC,EACD;AACH;AAEA,SAASpB,eAAeV,KAAa,EAAEe,IAAY,EAAErF,KAAW,EAAW;EACzE,OAAOA,KAAA,CAAM/B,WAAW,OAAOoH,IAAA,IAAQrF,KAAA,CAAMkB,QAAQ,OAAOoD,KAAA;AAC9D;AAEA,SAAShB,gBAAgB+C,QAAoB,EAAwD;EACnG,OAAQC,EAAA,IAA+C;IACrD,QAAQA,EAAA,CAAGpE,GAAG;MACZ,KAAKrF,KAAA;QACHwJ,QAAA;QACA;IAAM;EAEZ;AACF"}
|
|
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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"}
|