@salt-ds/lab 1.0.0-alpha.50 → 1.0.0-alpha.52
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/css/salt-lab.css +279 -267
- package/dist-cjs/calendar/Calendar.css.js +1 -1
- package/dist-cjs/calendar/Calendar.js +6 -15
- package/dist-cjs/calendar/Calendar.js.map +1 -1
- package/dist-cjs/calendar/CalendarNavigation.css.js +6 -0
- package/dist-cjs/calendar/{internal/CalendarNavigation.js → CalendarNavigation.js} +160 -63
- package/dist-cjs/calendar/CalendarNavigation.js.map +1 -0
- package/dist-cjs/calendar/formatDate.js +56 -0
- package/dist-cjs/calendar/formatDate.js.map +1 -0
- package/dist-cjs/calendar/internal/CalendarCarousel.js +3 -3
- package/dist-cjs/calendar/internal/CalendarCarousel.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-cjs/calendar/internal/CalendarDay.js +45 -33
- package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarMonth.js +3 -2
- package/dist-cjs/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-cjs/calendar/internal/CalendarWeekHeader.js +3 -3
- package/dist-cjs/calendar/internal/CalendarWeekHeader.js.map +1 -1
- package/dist-cjs/calendar/internal/useFocusManagement.js +7 -4
- package/dist-cjs/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-cjs/calendar/internal/utils.js +28 -23
- package/dist-cjs/calendar/internal/utils.js.map +1 -1
- package/dist-cjs/calendar/useCalendar.js +94 -45
- package/dist-cjs/calendar/useCalendar.js.map +1 -1
- package/dist-cjs/calendar/useCalendarDay.js +19 -10
- package/dist-cjs/calendar/useCalendarDay.js.map +1 -1
- package/dist-cjs/calendar/useCalendarSelection.js +360 -0
- package/dist-cjs/calendar/useCalendarSelection.js.map +1 -0
- package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/ComboBox.css.js +1 -1
- package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-cjs/content-status/ContentStatus.css.js +1 -1
- package/dist-cjs/date-input/DateInput.css.js +1 -1
- package/dist-cjs/date-input/DateInputRange.js +355 -0
- package/dist-cjs/date-input/DateInputRange.js.map +1 -0
- package/dist-cjs/date-input/DateInputSingle.js +229 -0
- package/dist-cjs/date-input/DateInputSingle.js.map +1 -0
- package/dist-cjs/date-input/utils.js +65 -0
- package/dist-cjs/date-input/utils.js.map +1 -0
- package/dist-cjs/date-picker/DatePicker.js +40 -148
- package/dist-cjs/date-picker/DatePicker.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerActions.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerActions.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerActions.js +102 -0
- package/dist-cjs/date-picker/DatePickerActions.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerContext.js +23 -17
- package/dist-cjs/date-picker/DatePickerContext.js.map +1 -1
- package/dist-cjs/date-picker/DatePickerOverlay.css.js +6 -0
- package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlay.js +50 -0
- package/dist-cjs/date-picker/DatePickerOverlay.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js +105 -0
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerPanel.css.js +1 -1
- package/dist-cjs/date-picker/DatePickerRangeInput.js +118 -0
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerRangePanel.js +206 -0
- package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSingleInput.js +97 -0
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -0
- package/dist-cjs/date-picker/DatePickerSinglePanel.js +138 -0
- package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +1 -0
- package/dist-cjs/date-picker/useDatePicker.js +179 -0
- package/dist-cjs/date-picker/useDatePicker.js.map +1 -0
- package/dist-cjs/dropdown/Dropdown.css.js +1 -1
- package/dist-cjs/dropdown/DropdownBase.js +1 -1
- package/dist-cjs/dropdown/DropdownBase.js.map +1 -1
- package/dist-cjs/dropdown/useDropdown.js.map +1 -1
- package/dist-cjs/form-field-legacy/FormLabel.js.map +1 -1
- package/dist-cjs/index.js +43 -10
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/list/List.js.map +1 -1
- package/dist-cjs/menu-button/MenuButtonTrigger.css.js +1 -1
- package/dist-cjs/query-input/QueryInput.css.js +1 -1
- package/dist-cjs/slider/Slider.css.js +1 -1
- package/dist-cjs/slider/Slider.js +53 -105
- package/dist-cjs/slider/Slider.js.map +1 -1
- package/dist-cjs/slider/internal/SliderContext.js +21 -0
- package/dist-cjs/slider/internal/SliderContext.js.map +1 -0
- package/dist-cjs/slider/internal/SliderMarks.js +31 -0
- package/dist-cjs/slider/internal/SliderMarks.js.map +1 -0
- package/dist-cjs/slider/internal/SliderSelection.js +17 -10
- package/dist-cjs/slider/internal/SliderSelection.js.map +1 -1
- package/dist-cjs/slider/internal/SliderThumb.js +77 -0
- package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
- package/dist-cjs/slider/internal/SliderTrack.js +91 -0
- package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
- package/dist-cjs/slider/internal/useKeyDownThumb.js +53 -0
- package/dist-cjs/slider/internal/useKeyDownThumb.js.map +1 -0
- package/dist-cjs/slider/internal/utils.js +78 -116
- package/dist-cjs/slider/internal/utils.js.map +1 -1
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.css.js +1 -1
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js +29 -25
- package/dist-cjs/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -1
- package/dist-cjs/tabs/TabActivationIndicator.css.js +1 -1
- package/dist-cjs/tabs/Tabstrip.css.js +1 -1
- package/dist-cjs/tabs/useTabs.js.map +1 -1
- package/dist-cjs/toolbar/overflow-panel/OverflowPanel.css.js +1 -1
- package/dist-cjs/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-es/calendar/Calendar.css.js +1 -1
- package/dist-es/calendar/Calendar.js +7 -16
- package/dist-es/calendar/Calendar.js.map +1 -1
- package/dist-es/calendar/CalendarNavigation.css.js +4 -0
- package/dist-es/calendar/CalendarNavigation.js +308 -0
- package/dist-es/calendar/CalendarNavigation.js.map +1 -0
- package/dist-es/calendar/formatDate.js +51 -0
- package/dist-es/calendar/formatDate.js.map +1 -0
- package/dist-es/calendar/internal/CalendarCarousel.js +3 -3
- package/dist-es/calendar/internal/CalendarCarousel.js.map +1 -1
- package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-es/calendar/internal/CalendarDay.js +45 -33
- package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
- package/dist-es/calendar/internal/CalendarMonth.js +3 -2
- package/dist-es/calendar/internal/CalendarMonth.js.map +1 -1
- package/dist-es/calendar/internal/CalendarWeekHeader.js +3 -3
- package/dist-es/calendar/internal/CalendarWeekHeader.js.map +1 -1
- package/dist-es/calendar/internal/useFocusManagement.js +7 -4
- package/dist-es/calendar/internal/useFocusManagement.js.map +1 -1
- package/dist-es/calendar/internal/utils.js +29 -23
- package/dist-es/calendar/internal/utils.js.map +1 -1
- package/dist-es/calendar/useCalendar.js +96 -47
- package/dist-es/calendar/useCalendar.js.map +1 -1
- package/dist-es/calendar/useCalendarDay.js +20 -11
- package/dist-es/calendar/useCalendarDay.js.map +1 -1
- package/dist-es/calendar/useCalendarSelection.js +350 -0
- package/dist-es/calendar/useCalendarSelection.js.map +1 -0
- package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-es/color-chooser/ColorChooser.js.map +1 -1
- package/dist-es/combo-box-deprecated/ComboBox.css.js +1 -1
- package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-es/content-status/ContentStatus.css.js +1 -1
- package/dist-es/date-input/DateInput.css.js +1 -1
- package/dist-es/date-input/DateInputRange.js +351 -0
- package/dist-es/date-input/DateInputRange.js.map +1 -0
- package/dist-es/date-input/DateInputSingle.js +225 -0
- package/dist-es/date-input/DateInputSingle.js.map +1 -0
- package/dist-es/date-input/utils.js +57 -0
- package/dist-es/date-input/utils.js.map +1 -0
- package/dist-es/date-picker/DatePicker.js +43 -152
- package/dist-es/date-picker/DatePicker.js.map +1 -1
- package/dist-es/date-picker/DatePickerActions.css.js +4 -0
- package/dist-es/date-picker/DatePickerActions.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerActions.js +98 -0
- package/dist-es/date-picker/DatePickerActions.js.map +1 -0
- package/dist-es/date-picker/DatePickerContext.js +22 -17
- package/dist-es/date-picker/DatePickerContext.js.map +1 -1
- package/dist-es/date-picker/DatePickerOverlay.css.js +4 -0
- package/dist-es/date-picker/DatePickerOverlay.css.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlay.js +46 -0
- package/dist-es/date-picker/DatePickerOverlay.js.map +1 -0
- package/dist-es/date-picker/DatePickerOverlayProvider.js +100 -0
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +1 -0
- package/dist-es/date-picker/DatePickerPanel.css.js +1 -1
- package/dist-es/date-picker/DatePickerRangeInput.js +114 -0
- package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -0
- package/dist-es/date-picker/DatePickerRangePanel.js +198 -0
- package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -0
- package/dist-es/date-picker/DatePickerSingleInput.js +93 -0
- package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -0
- package/dist-es/date-picker/DatePickerSinglePanel.js +130 -0
- package/dist-es/date-picker/DatePickerSinglePanel.js.map +1 -0
- package/dist-es/date-picker/useDatePicker.js +175 -0
- package/dist-es/date-picker/useDatePicker.js.map +1 -0
- package/dist-es/dropdown/Dropdown.css.js +1 -1
- package/dist-es/dropdown/DropdownBase.js +1 -1
- package/dist-es/dropdown/DropdownBase.js.map +1 -1
- package/dist-es/dropdown/useDropdown.js.map +1 -1
- package/dist-es/form-field-legacy/FormLabel.js.map +1 -1
- package/dist-es/index.js +14 -3
- package/dist-es/index.js.map +1 -1
- package/dist-es/list/List.js.map +1 -1
- package/dist-es/menu-button/MenuButtonTrigger.css.js +1 -1
- package/dist-es/query-input/QueryInput.css.js +1 -1
- package/dist-es/slider/Slider.css.js +1 -1
- package/dist-es/slider/Slider.js +55 -107
- package/dist-es/slider/Slider.js.map +1 -1
- package/dist-es/slider/internal/SliderContext.js +16 -0
- package/dist-es/slider/internal/SliderContext.js.map +1 -0
- package/dist-es/slider/internal/SliderMarks.js +27 -0
- package/dist-es/slider/internal/SliderMarks.js.map +1 -0
- package/dist-es/slider/internal/SliderSelection.js +17 -10
- package/dist-es/slider/internal/SliderSelection.js.map +1 -1
- package/dist-es/slider/internal/SliderThumb.js +73 -0
- package/dist-es/slider/internal/SliderThumb.js.map +1 -0
- package/dist-es/slider/internal/SliderTrack.js +87 -0
- package/dist-es/slider/internal/SliderTrack.js.map +1 -0
- package/dist-es/slider/internal/useKeyDownThumb.js +49 -0
- package/dist-es/slider/internal/useKeyDownThumb.js.map +1 -0
- package/dist-es/slider/internal/utils.js +70 -111
- package/dist-es/slider/internal/utils.js.map +1 -1
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.css.js +1 -1
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js +30 -26
- package/dist-es/stepped-tracker/TrackerStep/TrackerStep.js.map +1 -1
- package/dist-es/tabs/TabActivationIndicator.css.js +1 -1
- package/dist-es/tabs/Tabstrip.css.js +1 -1
- package/dist-es/tabs/useTabs.js.map +1 -1
- package/dist-es/toolbar/overflow-panel/OverflowPanel.css.js +1 -1
- package/dist-es/toolbar/overflow-panel/OverflowPanel.js.map +1 -1
- package/dist-types/calendar/Calendar.d.ts +63 -5
- package/dist-types/calendar/CalendarNavigation.d.ts +57 -0
- package/dist-types/calendar/formatDate.d.ts +14 -0
- package/dist-types/calendar/index.d.ts +3 -1
- package/dist-types/calendar/internal/CalendarDay.d.ts +2 -1
- package/dist-types/calendar/internal/CalendarWeekHeader.d.ts +4 -4
- package/dist-types/calendar/internal/useFocusManagement.d.ts +2 -1
- package/dist-types/calendar/internal/utils.d.ts +7 -8
- package/dist-types/calendar/useCalendar.d.ts +100 -16
- package/dist-types/calendar/useCalendarDay.d.ts +38 -0
- package/dist-types/calendar/useCalendarSelection.d.ts +189 -0
- package/dist-types/date-input/DateInputRange.d.ts +150 -0
- package/dist-types/date-input/DateInputSingle.d.ts +117 -0
- package/dist-types/date-input/index.d.ts +3 -1
- package/dist-types/date-input/utils.d.ts +43 -0
- package/dist-types/date-picker/DatePicker.d.ts +20 -62
- package/dist-types/date-picker/DatePickerActions.d.ts +80 -0
- package/dist-types/date-picker/DatePickerContext.d.ts +180 -17
- package/dist-types/date-picker/DatePickerOverlay.d.ts +11 -0
- package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +67 -0
- package/dist-types/date-picker/DatePickerRangeInput.d.ts +7 -0
- package/dist-types/date-picker/DatePickerRangePanel.d.ts +64 -0
- package/dist-types/date-picker/DatePickerSingleInput.d.ts +7 -0
- package/dist-types/date-picker/DatePickerSinglePanel.d.ts +42 -0
- package/dist-types/date-picker/index.d.ts +7 -0
- package/dist-types/date-picker/useDatePicker.d.ts +112 -0
- package/dist-types/slider/Slider.d.ts +23 -10
- package/dist-types/slider/internal/SliderContext.d.ts +11 -0
- package/dist-types/slider/internal/SliderMarks.d.ts +7 -0
- package/dist-types/slider/internal/SliderSelection.d.ts +3 -3
- package/dist-types/slider/internal/SliderThumb.d.ts +8 -0
- package/dist-types/slider/internal/SliderTrack.d.ts +4 -0
- package/dist-types/slider/internal/index.d.ts +3 -0
- package/dist-types/slider/internal/useKeyDownThumb.d.ts +2 -0
- package/dist-types/slider/internal/utils.d.ts +18 -10
- package/dist-types/slider/types.d.ts +3 -1
- package/dist-types/stepped-tracker/TrackerStep/TrackerStep.d.ts +11 -3
- package/package.json +3 -3
- package/dist-cjs/calendar/internal/CalendarNavigation.css.js +0 -6
- package/dist-cjs/calendar/internal/CalendarNavigation.js.map +0 -1
- package/dist-cjs/calendar/useSelection.js +0 -249
- package/dist-cjs/calendar/useSelection.js.map +0 -1
- package/dist-cjs/date-input/DateInput.js +0 -281
- package/dist-cjs/date-input/DateInput.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerPanel.js +0 -155
- package/dist-cjs/date-picker/DatePickerPanel.js.map +0 -1
- package/dist-cjs/slider/internal/SliderHandle.js +0 -44
- package/dist-cjs/slider/internal/SliderHandle.js.map +0 -1
- package/dist-cjs/slider/internal/SliderMarkLabels.js +0 -45
- package/dist-cjs/slider/internal/SliderMarkLabels.js.map +0 -1
- package/dist-cjs/slider/internal/SliderRail.js +0 -25
- package/dist-cjs/slider/internal/SliderRail.js.map +0 -1
- package/dist-cjs/slider/internal/SliderRailMarks.js +0 -48
- package/dist-cjs/slider/internal/SliderRailMarks.js.map +0 -1
- package/dist-cjs/slider/internal/styles.js +0 -99
- package/dist-cjs/slider/internal/styles.js.map +0 -1
- package/dist-cjs/slider/internal/useSliderKeyDown.js +0 -50
- package/dist-cjs/slider/internal/useSliderKeyDown.js.map +0 -1
- package/dist-cjs/slider/internal/useSliderMouseDown.js +0 -96
- package/dist-cjs/slider/internal/useSliderMouseDown.js.map +0 -1
- package/dist-es/calendar/internal/CalendarNavigation.css.js +0 -4
- package/dist-es/calendar/internal/CalendarNavigation.js +0 -211
- package/dist-es/calendar/internal/CalendarNavigation.js.map +0 -1
- package/dist-es/calendar/useSelection.js +0 -242
- package/dist-es/calendar/useSelection.js.map +0 -1
- package/dist-es/date-input/DateInput.js +0 -277
- package/dist-es/date-input/DateInput.js.map +0 -1
- package/dist-es/date-picker/DatePickerPanel.js +0 -151
- package/dist-es/date-picker/DatePickerPanel.js.map +0 -1
- package/dist-es/slider/internal/SliderHandle.js +0 -40
- package/dist-es/slider/internal/SliderHandle.js.map +0 -1
- package/dist-es/slider/internal/SliderMarkLabels.js +0 -41
- package/dist-es/slider/internal/SliderMarkLabels.js.map +0 -1
- package/dist-es/slider/internal/SliderRail.js +0 -21
- package/dist-es/slider/internal/SliderRail.js.map +0 -1
- package/dist-es/slider/internal/SliderRailMarks.js +0 -44
- package/dist-es/slider/internal/SliderRailMarks.js.map +0 -1
- package/dist-es/slider/internal/styles.js +0 -91
- package/dist-es/slider/internal/styles.js.map +0 -1
- package/dist-es/slider/internal/useSliderKeyDown.js +0 -46
- package/dist-es/slider/internal/useSliderKeyDown.js.map +0 -1
- package/dist-es/slider/internal/useSliderMouseDown.js +0 -92
- package/dist-es/slider/internal/useSliderMouseDown.js.map +0 -1
- package/dist-types/calendar/internal/CalendarNavigation.d.ts +0 -15
- package/dist-types/calendar/useSelection.d.ts +0 -78
- package/dist-types/date-input/DateInput.d.ts +0 -56
- package/dist-types/date-picker/DatePickerPanel.d.ts +0 -10
- package/dist-types/slider/internal/SliderHandle.d.ts +0 -11
- package/dist-types/slider/internal/SliderMarkLabels.d.ts +0 -7
- package/dist-types/slider/internal/SliderRail.d.ts +0 -1
- package/dist-types/slider/internal/SliderRailMarks.d.ts +0 -12
- package/dist-types/slider/internal/styles.d.ts +0 -10
- package/dist-types/slider/internal/useSliderKeyDown.d.ts +0 -4
- package/dist-types/slider/internal/useSliderMouseDown.d.ts +0 -4
- /package/dist-cjs/calendar/{internal/CalendarNavigation.css.js.map → CalendarNavigation.css.js.map} +0 -0
- /package/dist-es/calendar/{internal/CalendarNavigation.css.js.map → CalendarNavigation.css.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCalendar.js","sources":["../src/calendar/useCalendar.ts"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n endOfYear,\n getLocalTimeZone,\n isSameDay,\n isSameMonth,\n startOfMonth,\n startOfYear,\n today,\n} from \"@internationalized/date\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { type SyntheticEvent, useCallback, useEffect, useState } from \"react\";\nimport {\n type UseMultiSelectionCalendarProps,\n type UseOffsetSelectionCalendarProps,\n type UseRangeSelectionCalendarProps,\n type UseSingleSelectionCalendarProps,\n isRangeOrOffsetSelectionWithStartDate,\n useSelectionCalendar,\n type useSelectionCalendarProps,\n} from \"./useSelection\";\n\ninterface BaseUseCalendarProps {\n defaultVisibleMonth?: DateValue;\n onVisibleMonthChange?: (\n event: SyntheticEvent,\n visibleMonth: DateValue,\n ) => void;\n isDayUnselectable?: (date: DateValue) => string | false | undefined;\n isDayHighlighted?: (date: DateValue) => string | false | undefined;\n isDayDisabled?: (date: DateValue) => boolean;\n visibleMonth?: DateValue;\n hideOutOfRangeDates?: boolean;\n hideYearDropdown?: boolean;\n minDate?: DateValue;\n maxDate?: DateValue;\n}\n\nexport type useCalendarProps = (\n | Omit<UseSingleSelectionCalendarProps, \"isDaySelectable\">\n | Omit<UseMultiSelectionCalendarProps, \"isDaySelectable\">\n | Omit<UseRangeSelectionCalendarProps, \"isDaySelectable\">\n | Omit<UseOffsetSelectionCalendarProps, \"isDaySelectable\">\n) &\n BaseUseCalendarProps;\n\nconst defaultIsDayUnselectable = (): string | false => false;\nconst defaultIsDayHighlighted = (): string | false => false;\nconst defaultIsDayDisabled = (): false => false;\n\nexport function useCalendar(props: useCalendarProps) {\n const {\n selectedDate,\n defaultSelectedDate,\n visibleMonth: visibleMonthProp,\n hideYearDropdown,\n hideOutOfRangeDates,\n defaultVisibleMonth = today(getLocalTimeZone()),\n onSelectedDateChange,\n onVisibleMonthChange,\n isDayUnselectable = defaultIsDayUnselectable,\n isDayHighlighted = defaultIsDayHighlighted,\n isDayDisabled = defaultIsDayDisabled,\n minDate = hideYearDropdown\n ? startOfYear(today(getLocalTimeZone()))\n : undefined,\n maxDate = hideYearDropdown\n ? endOfYear(today(getLocalTimeZone()))\n : undefined,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const [visibleMonth, setVisibleMonthState] = useControlled({\n controlled: visibleMonthProp ? startOfMonth(visibleMonthProp) : undefined,\n default: startOfMonth(defaultVisibleMonth),\n name: \"Calendar\",\n state: \"visibleMonth\",\n });\n\n const isOutsideAllowedDates = useCallback(\n (date: DateValue) => {\n return (\n (minDate != null && date.compare(minDate) < 0) ||\n (maxDate != null && date.compare(maxDate) > 0)\n );\n },\n [maxDate, minDate],\n );\n\n const isOutsideAllowedMonths = (date: DateValue) => {\n return (\n (minDate != null && endOfMonth(date).compare(minDate) < 0) ||\n (maxDate != null && startOfMonth(date).compare(maxDate) > 0)\n );\n };\n\n const isOutsideAllowedYears = (date: DateValue) => {\n return (\n (minDate != null && endOfYear(date).compare(minDate) < 0) ||\n (maxDate != null && startOfYear(date).compare(maxDate) > 0)\n );\n };\n\n const isDaySelectable = useCallback(\n (date?: DateValue) =>\n !(\n date &&\n (isDayUnselectable(date) ||\n isDayDisabled(date) ||\n isOutsideAllowedDates(date))\n ),\n [isDayUnselectable, isDayDisabled, isOutsideAllowedDates],\n );\n\n const selectionManager = useSelectionCalendar({\n defaultSelectedDate: defaultSelectedDate,\n selectedDate,\n onSelectedDateChange,\n startDateOffset:\n props.selectionVariant === \"offset\"\n ? props.startDateOffset\n : (date) => date,\n endDateOffset:\n props.selectionVariant === \"offset\"\n ? props.endDateOffset\n : (date) => date,\n isDaySelectable,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n } as useSelectionCalendarProps);\n\n const [calendarFocused, setCalendarFocused] = useState(false);\n\n const isInVisibleMonth = (\n date: DateValue | undefined | null,\n ): date is DateValue => date != null && isSameMonth(date, visibleMonth);\n\n const getInitialFocusedDate = (): DateValue => {\n const selectedDate = selectionManager.state.selectedDate;\n // Case range or offset\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isRangeOrOffsetSelectionWithStartDate(selectedDate)\n ) {\n if (isInVisibleMonth(selectedDate?.startDate)) {\n return selectedDate.startDate;\n }\n if (isInVisibleMonth(selectedDate?.endDate)) {\n return selectedDate.endDate;\n }\n if (\n selectedDate?.startDate &&\n selectedDate?.endDate &&\n visibleMonth.compare(selectedDate.startDate) < 0 &&\n visibleMonth.compare(selectedDate.endDate) > 0\n ) {\n return startOfMonth(visibleMonth);\n }\n }\n // Case multiselect\n if (selectionVariant === \"multiselect\" && Array.isArray(selectedDate)) {\n // return first selected day in visible month\n const selectionInMonth = selectedDate\n .filter((day) => isInVisibleMonth(day))\n .sort((a, b) => a.compare(b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n }\n // Case single select\n if (\n selectionVariant === \"default\" &&\n !isRangeOrOffsetSelectionWithStartDate(selectedDate) &&\n !Array.isArray(selectedDate) &&\n isInVisibleMonth(selectedDate)\n ) {\n return selectedDate;\n }\n // default\n if (isInVisibleMonth(today(getLocalTimeZone()))) {\n return today(getLocalTimeZone());\n }\n return startOfMonth(visibleMonth);\n };\n\n const [focusedDate, setFocusedDateState] = useState<DateValue>(\n getInitialFocusedDate,\n );\n\n const isDayVisible = useCallback(\n (date: DateValue) => {\n const startInsideDays = startOfMonth(visibleMonth);\n\n if (date.compare(startInsideDays) < 0) return false;\n\n const endInsideDays = endOfMonth(visibleMonth);\n\n return !(date.compare(endInsideDays) > 0);\n },\n [visibleMonth],\n );\n\n const setVisibleMonth = useCallback(\n (event: SyntheticEvent, newVisibleMonth: DateValue) => {\n setVisibleMonthState(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange, setVisibleMonthState],\n );\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent, date: DateValue) => {\n if (isSameDay(date, focusedDate) || isOutsideAllowedDates(date)) return;\n\n setFocusedDateState(date);\n\n const shouldTransition =\n !isDayVisible(date) &&\n isDaySelectable(date) &&\n !isOutsideAllowedDates(date);\n if (shouldTransition) {\n setVisibleMonth(event, startOfMonth(date));\n }\n },\n [\n focusedDate,\n isDaySelectable,\n isDayVisible,\n isOutsideAllowedDates,\n setVisibleMonth,\n ],\n );\n\n useEffect(() => {\n if (!isDayVisible(focusedDate)) {\n setFocusedDateState(getInitialFocusedDate());\n }\n }, [isDayVisible, focusedDate, visibleMonth]);\n\n return {\n state: {\n visibleMonth,\n focusedDate,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n calendarFocused,\n ...selectionManager.state,\n },\n helpers: {\n setVisibleMonth,\n setFocusedDate,\n setCalendarFocused,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n ...selectionManager.helpers,\n },\n };\n}\n"],"names":["selectedDate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useCalendar.js","sources":["../src/calendar/useCalendar.ts"],"sourcesContent":["import {\n type DateValue,\n endOfMonth,\n endOfYear,\n getLocalTimeZone,\n isSameDay,\n isSameMonth,\n startOfMonth,\n startOfYear,\n today,\n} from \"@internationalized/date\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n type SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { getCurrentLocale } from \"./formatDate\";\nimport { generateDatesForMonth } from \"./internal/utils\";\nimport {\n type UseCalendarSelectionMultiSelectProps,\n type UseCalendarSelectionOffsetProps,\n type UseCalendarSelectionProps,\n type UseCalendarSelectionRangeProps,\n type UseCalendarSelectionSingleProps,\n isDateRangeSelection,\n useCalendarSelection,\n} from \"./useCalendarSelection\";\n\n/**\n * Interface representing the base properties UseCalendar hook.\n */\ninterface UseCalendarBaseProps {\n /**\n * The default visible month.\n */\n defaultVisibleMonth?: DateValue;\n /**\n * Callback fired when the visible month changes.\n * @param event - The synthetic event.\n * @param visibleMonth - The new visible month.\n */\n onVisibleMonthChange?: (\n event: SyntheticEvent,\n visibleMonth: DateValue,\n ) => void;\n /**\n * Function to determine if a day is unselectable.\n * @param date - The date to check.\n * @returns A string reason if the day is unselectable, otherwise `false` or `undefined`.\n */\n isDayUnselectable?: (date: DateValue) => string | false | undefined;\n /**\n * Function to determine if a day is highlighted.\n * @param date - The date to check.\n * @returns A string reason if the day is highlighted, otherwise `false` or `undefined`.\n */\n isDayHighlighted?: (date: DateValue) => string | false | undefined;\n /**\n * Function to determine if a day is disabled.\n * @param date - The date to check.\n * @returns A string reason if the day is disabled, otherwise `false` or `undefined`.\n */\n isDayDisabled?: (date: DateValue) => string | false | undefined;\n /**\n * The currently visible month.\n */\n visibleMonth?: DateValue;\n /**\n * If `true`, hides dates that are out of the selectable range.\n */\n hideOutOfRangeDates?: boolean;\n /**\n * The minimum selectable date.\n */\n minDate?: DateValue;\n /**\n * The maximum selectable date.\n */\n maxDate?: DateValue;\n /**\n * The time zone used for date calculations.\n */\n timeZone?: string;\n /**\n * The locale used for date formatting.\n */\n locale?: string;\n}\n\n/**\n * UseCalendar hook props for a single date selection Calendar.\n */\nexport interface UseCalendarSingleProps\n extends UseCalendarSelectionSingleProps,\n UseCalendarBaseProps {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n}\n\n/**\n * UseCalendar hook props for a date range selection Calendar.\n */\nexport interface UseCalendarRangeProps\n extends UseCalendarSelectionRangeProps,\n UseCalendarBaseProps {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n}\n\n/**\n * UseCalendar hook props for a multi-select Calendar.\n */\nexport interface UseCalendarMultiSelectProps\n extends UseCalendarSelectionMultiSelectProps,\n UseCalendarBaseProps {\n /**\n * The selection variant, set to \"multiselect\".\n */\n selectionVariant: \"multiselect\";\n}\n\n/**\n * UseCalendar hook props for an offset date selection Calendar.\n */\nexport interface UseCalendarOffsetProps\n extends UseCalendarSelectionOffsetProps,\n UseCalendarBaseProps {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n}\n\n/**\n * UseCalendar hook props, wth the selection variant determining the return type of the date selection\n */\nexport type UseCalendarProps =\n | UseCalendarSingleProps\n | UseCalendarRangeProps\n | UseCalendarMultiSelectProps\n | UseCalendarOffsetProps;\n\n/**\n * Default function to determine if a day is unselectable.\n * @returns `false` indicating the day is selectable.\n */\nconst defaultIsDayUnselectable = (): string | false => false;\n\n/**\n * Default function to determine if a day is highlighted.\n * @returns `false` indicating the day is not highlighted.\n */\nconst defaultIsDayHighlighted = (): string | false => false;\n\n/**\n * Default function to determine if a day is disabled.\n * @returns `false` indicating the day is not disabled.\n */\nconst defaultIsDayDisabled = (): false => false;\n\nexport function useCalendar(props: UseCalendarProps) {\n const {\n selectedDate,\n defaultSelectedDate,\n visibleMonth: visibleMonthProp,\n hideOutOfRangeDates,\n timeZone = getLocalTimeZone(),\n locale = getCurrentLocale(),\n defaultVisibleMonth = today(timeZone),\n onSelectedDateChange,\n onVisibleMonthChange,\n isDayUnselectable = defaultIsDayUnselectable,\n isDayHighlighted = defaultIsDayHighlighted,\n isDayDisabled = defaultIsDayDisabled,\n minDate,\n maxDate,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n select,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const [visibleMonth, setVisibleMonthState] = useControlled({\n controlled: visibleMonthProp ? startOfMonth(visibleMonthProp) : undefined,\n default: startOfMonth(defaultVisibleMonth),\n name: \"Calendar\",\n state: \"visibleMonth\",\n });\n\n const isOutsideAllowedDates = useCallback(\n (date: DateValue) => {\n return (\n (minDate && date.compare(minDate) < 0) ||\n (maxDate && date.compare(maxDate) > 0)\n );\n },\n [maxDate, minDate],\n );\n\n const isOutsideAllowedMonths = useCallback(\n (date: DateValue) => {\n return (\n (minDate && endOfMonth(date).compare(minDate) < 0) ||\n (maxDate && startOfMonth(date).compare(maxDate) > 0)\n );\n },\n [minDate, maxDate],\n );\n\n const isOutsideAllowedYears = useCallback(\n (date: DateValue) => {\n return (\n (minDate && endOfYear(date).compare(minDate) < 0) ||\n (maxDate && startOfYear(date).compare(maxDate) > 0)\n );\n },\n [minDate, maxDate],\n );\n\n const isDaySelectable = useCallback(\n (date?: DateValue) =>\n !(\n date &&\n (isDayUnselectable(date) ||\n isDayDisabled(date) ||\n isOutsideAllowedDates(date))\n ),\n [isDayUnselectable, isDayDisabled, isOutsideAllowedDates],\n );\n\n const selectionManager = useCalendarSelection({\n defaultSelectedDate: defaultSelectedDate,\n selectedDate,\n onSelectedDateChange,\n startDateOffset:\n props.selectionVariant === \"offset\" ? props.startDateOffset : undefined,\n endDateOffset:\n props.selectionVariant === \"offset\" ? props.endDateOffset : undefined,\n isDaySelectable,\n selectionVariant,\n onHoveredDateChange,\n hoveredDate,\n select,\n } as UseCalendarSelectionProps);\n\n const [calendarFocused, setCalendarFocused] = useState(false);\n\n const isInVisibleMonth = useCallback(\n (date: DateValue | undefined | null): date is DateValue =>\n date != null && isSameMonth(date, visibleMonth),\n [visibleMonth],\n );\n\n const getInitialFocusedDate = useCallback(() => {\n const selectedDate = selectionManager.state.selectedDate;\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(selectedDate)\n ) {\n if (isInVisibleMonth(selectedDate?.startDate)) {\n return selectedDate.startDate;\n }\n if (isInVisibleMonth(selectedDate?.endDate)) {\n return selectedDate.endDate;\n }\n } else if (\n selectionVariant === \"multiselect\" &&\n Array.isArray(selectedDate)\n ) {\n // return first selected day in visible month\n const selectionInMonth = selectedDate\n .filter((day) => isInVisibleMonth(day))\n .sort((a, b) => a.compare(b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (\n selectionVariant === \"single\" &&\n !isDateRangeSelection(selectedDate) &&\n !Array.isArray(selectedDate) &&\n isInVisibleMonth(selectedDate)\n ) {\n return selectedDate;\n }\n // Defaults\n if (isDaySelectable(today(timeZone)) && isInVisibleMonth(today(timeZone))) {\n return today(timeZone);\n }\n const firstSelectableDate = generateDatesForMonth(visibleMonth).find(\n (visibleDay) => isDaySelectable(visibleDay),\n );\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n }, [\n isInVisibleMonth,\n selectionVariant,\n selectionManager.state.selectedDate,\n timeZone,\n visibleMonth,\n ]);\n\n const [focusedDate, setFocusedDateState] = useState<DateValue | null>(\n getInitialFocusedDate,\n );\n\n const isDayVisible = useCallback(\n (date: DateValue) => {\n const startInsideDays = startOfMonth(visibleMonth);\n\n if (date.compare(startInsideDays) < 0) return false;\n\n const endInsideDays = endOfMonth(visibleMonth);\n\n return !(date.compare(endInsideDays) > 0);\n },\n [visibleMonth],\n );\n\n const setVisibleMonth = useCallback(\n (event: SyntheticEvent, newVisibleMonth: DateValue) => {\n setVisibleMonthState(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange],\n );\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent, date: DateValue) => {\n if (\n !focusedDate ||\n isSameDay(date, focusedDate) ||\n isOutsideAllowedDates(date)\n )\n return;\n\n setFocusedDateState(date);\n\n const shouldTransition =\n !isDayVisible(date) &&\n isDaySelectable(date) &&\n !isOutsideAllowedDates(date);\n if (shouldTransition) {\n setVisibleMonth(event, startOfMonth(date));\n }\n },\n [\n focusedDate,\n isDaySelectable,\n isDayVisible,\n isOutsideAllowedDates,\n setVisibleMonth,\n ],\n );\n\n useEffect(() => {\n if (visibleMonth && focusedDate && !isDayVisible(focusedDate)) {\n const focusableDate = getInitialFocusedDate();\n if (focusableDate) {\n setFocusedDateState(focusableDate);\n }\n }\n }, [isDayVisible, focusedDate, getInitialFocusedDate, visibleMonth]);\n\n return useMemo(\n () => ({\n state: {\n visibleMonth,\n focusedDate,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n calendarFocused,\n timeZone,\n locale,\n ...selectionManager.state,\n },\n helpers: {\n setVisibleMonth,\n setFocusedDate,\n setCalendarFocused,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n ...selectionManager.helpers,\n },\n }),\n [\n visibleMonth,\n focusedDate,\n minDate,\n maxDate,\n selectionVariant,\n hideOutOfRangeDates,\n calendarFocused,\n timeZone,\n locale,\n setVisibleMonth,\n setFocusedDate,\n isDayUnselectable,\n isDayHighlighted,\n isDayDisabled,\n isDayVisible,\n isOutsideAllowedDates,\n isOutsideAllowedMonths,\n isOutsideAllowedYears,\n selectionManager,\n ],\n );\n}\n"],"names":["selectedDate"],"mappings":"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"}
|
|
@@ -1,21 +1,28 @@
|
|
|
1
|
-
import { isSameMonth, isSameDay, isToday
|
|
1
|
+
import { isSameMonth, isSameDay, isToday } from '@internationalized/date';
|
|
2
2
|
import { useEffect } from 'react';
|
|
3
3
|
import { useCalendarContext } from './internal/CalendarContext.js';
|
|
4
4
|
import { useFocusManagement } from './internal/useFocusManagement.js';
|
|
5
|
-
import {
|
|
5
|
+
import { useCalendarSelectionDay } from './useCalendarSelection.js';
|
|
6
6
|
|
|
7
7
|
function useCalendarDay({ date, month }, ref) {
|
|
8
8
|
const {
|
|
9
|
-
state: {
|
|
9
|
+
state: {
|
|
10
|
+
focusedDate,
|
|
11
|
+
hideOutOfRangeDates,
|
|
12
|
+
calendarFocused,
|
|
13
|
+
locale,
|
|
14
|
+
timeZone
|
|
15
|
+
},
|
|
10
16
|
helpers: {
|
|
11
17
|
isDayUnselectable,
|
|
18
|
+
isDaySelectable,
|
|
12
19
|
isDayHighlighted,
|
|
13
20
|
isDayDisabled,
|
|
14
21
|
isOutsideAllowedMonths
|
|
15
22
|
}
|
|
16
23
|
} = useCalendarContext();
|
|
17
|
-
const selectionManager =
|
|
18
|
-
const focusManager = useFocusManagement({ date });
|
|
24
|
+
const selectionManager = useCalendarSelectionDay({ date });
|
|
25
|
+
const focusManager = useFocusManagement({ date, locale });
|
|
19
26
|
const handleClick = (event) => {
|
|
20
27
|
selectionManager == null ? void 0 : selectionManager.handleClick(event);
|
|
21
28
|
focusManager.handleClick(event);
|
|
@@ -38,12 +45,12 @@ function useCalendarDay({ date, month }, ref) {
|
|
|
38
45
|
onMouseOver: handleMouseOver
|
|
39
46
|
};
|
|
40
47
|
const outOfRange = !isSameMonth(date, month);
|
|
41
|
-
const focused = isSameDay(date, focusedDate) && calendarFocused && !outOfRange;
|
|
42
|
-
const tabIndex = isSameDay(date, focusedDate) && !outOfRange ? 0 : -1;
|
|
43
|
-
const today = isToday(date,
|
|
44
|
-
const unselectableReason = isDayUnselectable(date);
|
|
48
|
+
const focused = focusedDate && isSameDay(date, focusedDate) && calendarFocused && !outOfRange;
|
|
49
|
+
const tabIndex = focusedDate && isSameDay(date, focusedDate) && !outOfRange ? 0 : -1;
|
|
50
|
+
const today = isToday(date, timeZone);
|
|
51
|
+
const unselectableReason = isDayUnselectable(date) || isDayDisabled(date);
|
|
45
52
|
const highlightedReason = isDayHighlighted(date);
|
|
46
|
-
const disabled = isDayDisabled(date) || outOfRange && isOutsideAllowedMonths(date);
|
|
53
|
+
const disabled = isDayDisabled(date) || outOfRange && isOutsideAllowedMonths(date) || isDaySelectable && !isDaySelectable(date);
|
|
47
54
|
const unselectable = Boolean(unselectableReason);
|
|
48
55
|
const highlighted = Boolean(highlightedReason);
|
|
49
56
|
const hidden = hideOutOfRangeDates && outOfRange;
|
|
@@ -72,7 +79,9 @@ function useCalendarDay({ date, month }, ref) {
|
|
|
72
79
|
...selectionManager.dayProps
|
|
73
80
|
},
|
|
74
81
|
unselectableReason,
|
|
75
|
-
highlightedReason
|
|
82
|
+
highlightedReason,
|
|
83
|
+
locale,
|
|
84
|
+
timeZone
|
|
76
85
|
};
|
|
77
86
|
}
|
|
78
87
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCalendarDay.js","sources":["../src/calendar/useCalendarDay.ts"],"sourcesContent":["import {\n type DateValue,\n
|
|
1
|
+
{"version":3,"file":"useCalendarDay.js","sources":["../src/calendar/useCalendarDay.ts"],"sourcesContent":["import {\n type DateValue,\n isSameDay,\n isSameMonth,\n isToday,\n} from \"@internationalized/date\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type RefObject,\n useEffect,\n} from \"react\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { useFocusManagement } from \"./internal/useFocusManagement\";\nimport { useCalendarSelectionDay } from \"./useCalendarSelection\";\n\n/**\n * Interface representing the status of a day in the Calendar.\n */\nexport interface DayStatus {\n /**\n * If `true`, the day is out of the selectable range.\n */\n outOfRange?: boolean;\n /**\n * If `true`, the day is selected.\n */\n selected?: boolean;\n /**\n * If `true`, the day is today.\n */\n today?: boolean;\n /**\n * If set, the day is unselectable with a reason.\n */\n unselectable?: string | false;\n /**\n * If set, the day is highlighted with a reason.\n */\n highlighted?: string | false;\n /**\n * If `true`, the day is focused.\n */\n focused?: boolean;\n /**\n * If `true`, the day is disabled.\n */\n disabled?: boolean;\n /**\n * If `true`, the day is hidden.\n */\n hidden?: boolean;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status\n */\nexport interface useCalendarDayProps {\n /**\n * The date of the calendar day.\n */\n date: DateValue;\n /**\n * The month of the calendar day.\n */\n month: DateValue;\n}\n\nexport function useCalendarDay(\n { date, month }: useCalendarDayProps,\n ref: RefObject<HTMLElement>,\n) {\n const {\n state: {\n focusedDate,\n hideOutOfRangeDates,\n calendarFocused,\n locale,\n timeZone,\n },\n helpers: {\n isDayUnselectable,\n isDaySelectable,\n isDayHighlighted,\n isDayDisabled,\n isOutsideAllowedMonths,\n },\n } = useCalendarContext();\n const selectionManager = useCalendarSelectionDay({ date });\n const focusManager = useFocusManagement({ date, locale });\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = (event) => {\n selectionManager?.handleClick(event);\n focusManager.handleClick(event);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = (event) => {\n focusManager.handleKeyDown(event);\n selectionManager?.handleKeyDown(event);\n };\n\n const handleFocus: FocusEventHandler<HTMLButtonElement> = (event) => {\n focusManager.handleFocus(event);\n };\n\n const handleMouseOver: MouseEventHandler<HTMLButtonElement> = (event) => {\n selectionManager.handleMouseOver?.(event);\n };\n\n const eventHandlers = {\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onFocus: handleFocus,\n onMouseOver: handleMouseOver,\n };\n\n const outOfRange = !isSameMonth(date, month);\n const focused =\n focusedDate &&\n isSameDay(date, focusedDate) &&\n calendarFocused &&\n !outOfRange;\n const tabIndex =\n focusedDate && isSameDay(date, focusedDate) && !outOfRange ? 0 : -1;\n const today = isToday(date, timeZone);\n\n const unselectableReason = isDayUnselectable(date) || isDayDisabled(date);\n const highlightedReason = isDayHighlighted(date);\n\n const disabled =\n isDayDisabled(date) ||\n (outOfRange && isOutsideAllowedMonths(date)) ||\n (isDaySelectable && !isDaySelectable(date));\n const unselectable = Boolean(unselectableReason);\n const highlighted = Boolean(highlightedReason);\n const hidden = hideOutOfRangeDates && outOfRange;\n\n useEffect(() => {\n if (focused) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [ref, focused]);\n\n return {\n status: {\n outOfRange,\n today,\n unselectable,\n focused,\n hidden,\n disabled,\n highlighted,\n ...selectionManager.status,\n } as DayStatus,\n dayProps: {\n tabIndex,\n \"aria-current\": today ? \"date\" : undefined,\n \"aria-hidden\": hidden ? \"true\" : undefined,\n ...eventHandlers,\n ...selectionManager.dayProps,\n } as ComponentPropsWithoutRef<\"button\">,\n unselectableReason,\n highlightedReason,\n locale,\n timeZone,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { CalendarDate, CalendarDateTime, ZonedDateTime, isSameDay } from '@internationalized/date';
|
|
2
|
+
import { makePrefixer, useControlled } from '@salt-ds/core';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { useCallback, useMemo } from 'react';
|
|
5
|
+
import { useCalendarContext } from './internal/CalendarContext.js';
|
|
6
|
+
|
|
7
|
+
const CALENDAR_MIN_YEAR = 1900;
|
|
8
|
+
const CALENDAR_MAX_YEAR = 2100;
|
|
9
|
+
function isSingleSelectionValueType(value) {
|
|
10
|
+
return value instanceof CalendarDate || value instanceof CalendarDateTime || value instanceof ZonedDateTime;
|
|
11
|
+
}
|
|
12
|
+
function isDateRangeSelection(value) {
|
|
13
|
+
return value && typeof value === "object" && ("startDate" in value || "endDate" in value);
|
|
14
|
+
}
|
|
15
|
+
function isMultipleDateSelection(value) {
|
|
16
|
+
return Array.isArray(value) && value.every((item) => isSingleSelectionValueType(item));
|
|
17
|
+
}
|
|
18
|
+
function addOrRemoveFromArray(array, item) {
|
|
19
|
+
if (Array.isArray(array)) {
|
|
20
|
+
if (array.find((element) => isSameDay(element, item))) {
|
|
21
|
+
return array.filter((element) => !isSameDay(element, item));
|
|
22
|
+
}
|
|
23
|
+
return array.concat(item);
|
|
24
|
+
}
|
|
25
|
+
return [item];
|
|
26
|
+
}
|
|
27
|
+
const defaultOffset = (date) => date;
|
|
28
|
+
const withBaseName = makePrefixer("saltCalendarDay");
|
|
29
|
+
const defaultSingleSelectionHandler = (_currentSelectedDate, newSelectedDate) => {
|
|
30
|
+
return newSelectedDate;
|
|
31
|
+
};
|
|
32
|
+
const defaultMultiSelectHandler = (currentSelectedDate, newSelectedDate) => {
|
|
33
|
+
return addOrRemoveFromArray(currentSelectedDate, newSelectedDate);
|
|
34
|
+
};
|
|
35
|
+
const defaultRangeSelectionHandler = (currentSelectedDate, newSelectedDate) => {
|
|
36
|
+
let base = { ...currentSelectedDate };
|
|
37
|
+
if ((base == null ? void 0 : base.startDate) && (base == null ? void 0 : base.endDate)) {
|
|
38
|
+
base = { startDate: newSelectedDate };
|
|
39
|
+
} else if ((base == null ? void 0 : base.startDate) && newSelectedDate.compare(base.startDate) < 0) {
|
|
40
|
+
base = { startDate: newSelectedDate };
|
|
41
|
+
} else if ((base == null ? void 0 : base.startDate) && newSelectedDate.compare(base.startDate) >= 0) {
|
|
42
|
+
base = { ...base, endDate: newSelectedDate };
|
|
43
|
+
} else {
|
|
44
|
+
base = { startDate: newSelectedDate };
|
|
45
|
+
}
|
|
46
|
+
return base;
|
|
47
|
+
};
|
|
48
|
+
const defaultOffsetSelectionHandler = (_currentSelectedDate, newSelectedDate) => {
|
|
49
|
+
return {
|
|
50
|
+
startDate: newSelectedDate,
|
|
51
|
+
endDate: newSelectedDate
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
function useCalendarSelection(props) {
|
|
55
|
+
const {
|
|
56
|
+
hoveredDate: hoveredDateProp,
|
|
57
|
+
selectedDate: selectedDateProp,
|
|
58
|
+
defaultSelectedDate,
|
|
59
|
+
onSelectedDateChange,
|
|
60
|
+
onHoveredDateChange,
|
|
61
|
+
isDaySelectable,
|
|
62
|
+
selectionVariant,
|
|
63
|
+
select: selectProp
|
|
64
|
+
} = props;
|
|
65
|
+
const [selectedDate, setSelectedDateState] = useControlled({
|
|
66
|
+
controlled: selectedDateProp,
|
|
67
|
+
default: defaultSelectedDate,
|
|
68
|
+
name: "Calendar",
|
|
69
|
+
state: "selectedDate"
|
|
70
|
+
});
|
|
71
|
+
const startDateOffset = selectionVariant === "offset" ? props.startDateOffset : void 0;
|
|
72
|
+
const endDateOffset = selectionVariant === "offset" ? props.endDateOffset : void 0;
|
|
73
|
+
const getStartDateOffset = useCallback(
|
|
74
|
+
(date) => {
|
|
75
|
+
if (selectionVariant === "offset" && startDateOffset) {
|
|
76
|
+
return startDateOffset(date);
|
|
77
|
+
}
|
|
78
|
+
return defaultOffset(date);
|
|
79
|
+
},
|
|
80
|
+
[selectionVariant, startDateOffset]
|
|
81
|
+
);
|
|
82
|
+
const getEndDateOffset = useCallback(
|
|
83
|
+
(date) => {
|
|
84
|
+
if (selectionVariant === "offset" && endDateOffset) {
|
|
85
|
+
return endDateOffset(date);
|
|
86
|
+
}
|
|
87
|
+
return defaultOffset(date);
|
|
88
|
+
},
|
|
89
|
+
[selectionVariant, endDateOffset]
|
|
90
|
+
);
|
|
91
|
+
const setSelectedDate = useCallback(
|
|
92
|
+
(event, newSelectedDate) => {
|
|
93
|
+
if (!isDaySelectable || isDaySelectable(newSelectedDate)) {
|
|
94
|
+
switch (selectionVariant) {
|
|
95
|
+
case "single": {
|
|
96
|
+
const singleSelect = selectProp || defaultSingleSelectionHandler;
|
|
97
|
+
const newSingleDate = singleSelect(
|
|
98
|
+
selectedDate,
|
|
99
|
+
newSelectedDate
|
|
100
|
+
);
|
|
101
|
+
setSelectedDateState(newSingleDate);
|
|
102
|
+
onSelectedDateChange == null ? void 0 : onSelectedDateChange(event, newSingleDate);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case "multiselect": {
|
|
106
|
+
const multiSelect = selectProp || defaultMultiSelectHandler;
|
|
107
|
+
const newMultiSelectDate = multiSelect(
|
|
108
|
+
selectedDate,
|
|
109
|
+
newSelectedDate
|
|
110
|
+
);
|
|
111
|
+
setSelectedDateState(newMultiSelectDate);
|
|
112
|
+
onSelectedDateChange == null ? void 0 : onSelectedDateChange(event, newMultiSelectDate);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case "range": {
|
|
116
|
+
const rangeSelect = selectProp || defaultRangeSelectionHandler;
|
|
117
|
+
const newRangeDate = rangeSelect(
|
|
118
|
+
selectedDate,
|
|
119
|
+
newSelectedDate
|
|
120
|
+
);
|
|
121
|
+
setSelectedDateState(newRangeDate);
|
|
122
|
+
onSelectedDateChange == null ? void 0 : onSelectedDateChange(event, newRangeDate);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
case "offset": {
|
|
126
|
+
const offsetSelect = selectProp || defaultOffsetSelectionHandler;
|
|
127
|
+
const newOffsetDate = offsetSelect(
|
|
128
|
+
selectedDate,
|
|
129
|
+
newSelectedDate
|
|
130
|
+
);
|
|
131
|
+
setSelectedDateState(newOffsetDate);
|
|
132
|
+
onSelectedDateChange == null ? void 0 : onSelectedDateChange(event, newOffsetDate);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
[
|
|
139
|
+
isDaySelectable,
|
|
140
|
+
selectProp,
|
|
141
|
+
selectedDate,
|
|
142
|
+
selectionVariant,
|
|
143
|
+
onSelectedDateChange
|
|
144
|
+
]
|
|
145
|
+
);
|
|
146
|
+
const isSelected = useCallback(
|
|
147
|
+
(date) => {
|
|
148
|
+
switch (selectionVariant) {
|
|
149
|
+
case "single":
|
|
150
|
+
return isSingleSelectionValueType(selectedDate) && isSameDay(selectedDate, date);
|
|
151
|
+
case "multiselect":
|
|
152
|
+
return Array.isArray(selectedDate) && !!selectedDate.find((element) => isSameDay(element, date));
|
|
153
|
+
default:
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
[selectionVariant, selectedDate]
|
|
158
|
+
);
|
|
159
|
+
const [hoveredDate, setHoveredDateState] = useControlled({
|
|
160
|
+
controlled: hoveredDateProp,
|
|
161
|
+
default: void 0,
|
|
162
|
+
name: "Calendar",
|
|
163
|
+
state: "hoveredDate"
|
|
164
|
+
});
|
|
165
|
+
const setHoveredDate = useCallback(
|
|
166
|
+
(event, date) => {
|
|
167
|
+
setHoveredDateState(date);
|
|
168
|
+
onHoveredDateChange == null ? void 0 : onHoveredDateChange(event, date);
|
|
169
|
+
},
|
|
170
|
+
[onHoveredDateChange]
|
|
171
|
+
);
|
|
172
|
+
const isHovered = useCallback(
|
|
173
|
+
(date) => {
|
|
174
|
+
return !!hoveredDate && isSameDay(date, hoveredDate);
|
|
175
|
+
},
|
|
176
|
+
[hoveredDate]
|
|
177
|
+
);
|
|
178
|
+
const isSelectedSpan = useCallback(
|
|
179
|
+
(date) => {
|
|
180
|
+
if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(selectedDate) && (selectedDate == null ? void 0 : selectedDate.startDate) && (selectedDate == null ? void 0 : selectedDate.endDate)) {
|
|
181
|
+
return date.compare(selectedDate.startDate) > 0 && date.compare(selectedDate.endDate) < 0;
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
},
|
|
185
|
+
[selectionVariant, selectedDate]
|
|
186
|
+
);
|
|
187
|
+
const isHoveredSpan = useCallback(
|
|
188
|
+
(date) => {
|
|
189
|
+
if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(selectedDate) && selectedDate.startDate && !selectedDate.endDate && hoveredDate) {
|
|
190
|
+
const isForwardRange = hoveredDate.compare(selectedDate.startDate) > 0 && (date.compare(selectedDate.startDate) > 0 && date.compare(hoveredDate) < 0 || isSameDay(date, hoveredDate));
|
|
191
|
+
const isValidDayHovered = !isDaySelectable || isDaySelectable(hoveredDate);
|
|
192
|
+
return isForwardRange && isValidDayHovered;
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
},
|
|
196
|
+
[selectionVariant, selectedDate, hoveredDate, isDaySelectable]
|
|
197
|
+
);
|
|
198
|
+
const isSelectedStart = useCallback(
|
|
199
|
+
(date) => {
|
|
200
|
+
if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(selectedDate) && selectedDate.startDate) {
|
|
201
|
+
return isSameDay(selectedDate.startDate, date);
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
},
|
|
205
|
+
[selectionVariant, selectedDate]
|
|
206
|
+
);
|
|
207
|
+
const isSelectedEnd = useCallback(
|
|
208
|
+
(date) => {
|
|
209
|
+
if ((selectionVariant === "range" || selectionVariant === "offset") && isDateRangeSelection(selectedDate) && selectedDate.endDate) {
|
|
210
|
+
return isSameDay(selectedDate.endDate, date);
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
},
|
|
214
|
+
[selectionVariant, selectedDate]
|
|
215
|
+
);
|
|
216
|
+
const isHoveredOffset = useCallback(
|
|
217
|
+
(date) => {
|
|
218
|
+
if (hoveredDate && selectionVariant === "offset") {
|
|
219
|
+
const startDate = getStartDateOffset(hoveredDate);
|
|
220
|
+
const endDate = getEndDateOffset(hoveredDate);
|
|
221
|
+
return date.compare(startDate) >= 0 && date.compare(endDate) <= 0 && (!isDaySelectable || isDaySelectable(date));
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
},
|
|
225
|
+
[
|
|
226
|
+
getStartDateOffset,
|
|
227
|
+
getEndDateOffset,
|
|
228
|
+
hoveredDate,
|
|
229
|
+
isDaySelectable,
|
|
230
|
+
selectionVariant
|
|
231
|
+
]
|
|
232
|
+
);
|
|
233
|
+
return useMemo(
|
|
234
|
+
() => ({
|
|
235
|
+
state: {
|
|
236
|
+
selectedDate,
|
|
237
|
+
hoveredDate
|
|
238
|
+
},
|
|
239
|
+
helpers: {
|
|
240
|
+
setSelectedDate,
|
|
241
|
+
isSelected,
|
|
242
|
+
setHoveredDate,
|
|
243
|
+
isHovered,
|
|
244
|
+
isSelectedSpan,
|
|
245
|
+
isHoveredSpan,
|
|
246
|
+
isSelectedStart,
|
|
247
|
+
isSelectedEnd,
|
|
248
|
+
isHoveredOffset,
|
|
249
|
+
isDaySelectable
|
|
250
|
+
}
|
|
251
|
+
}),
|
|
252
|
+
[
|
|
253
|
+
selectedDate,
|
|
254
|
+
hoveredDate,
|
|
255
|
+
setSelectedDate,
|
|
256
|
+
isSelected,
|
|
257
|
+
setHoveredDate,
|
|
258
|
+
isHovered,
|
|
259
|
+
isSelectedSpan,
|
|
260
|
+
isHoveredSpan,
|
|
261
|
+
isSelectedStart,
|
|
262
|
+
isSelectedEnd,
|
|
263
|
+
isHoveredOffset,
|
|
264
|
+
isDaySelectable
|
|
265
|
+
]
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
function useCalendarSelectionDay({ date }) {
|
|
269
|
+
const {
|
|
270
|
+
helpers: {
|
|
271
|
+
setSelectedDate,
|
|
272
|
+
isSelected,
|
|
273
|
+
setHoveredDate,
|
|
274
|
+
isSelectedSpan,
|
|
275
|
+
isHoveredSpan,
|
|
276
|
+
isSelectedStart,
|
|
277
|
+
isSelectedEnd,
|
|
278
|
+
isHovered,
|
|
279
|
+
isHoveredOffset,
|
|
280
|
+
isDaySelectable
|
|
281
|
+
}
|
|
282
|
+
} = useCalendarContext();
|
|
283
|
+
const handleClick = useCallback(
|
|
284
|
+
(event) => {
|
|
285
|
+
setSelectedDate(event, date);
|
|
286
|
+
},
|
|
287
|
+
[date, setSelectedDate]
|
|
288
|
+
);
|
|
289
|
+
const handleKeyDown = useCallback(
|
|
290
|
+
(event) => {
|
|
291
|
+
switch (event.key) {
|
|
292
|
+
case "Space":
|
|
293
|
+
case "Enter":
|
|
294
|
+
setSelectedDate(event, date);
|
|
295
|
+
event.preventDefault();
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
[date, setSelectedDate]
|
|
299
|
+
);
|
|
300
|
+
const handleMouseOver = useCallback(
|
|
301
|
+
(event) => {
|
|
302
|
+
setHoveredDate(event, date);
|
|
303
|
+
},
|
|
304
|
+
[date, setHoveredDate]
|
|
305
|
+
);
|
|
306
|
+
const handleMouseLeave = useCallback(
|
|
307
|
+
(event) => {
|
|
308
|
+
setHoveredDate(event, null);
|
|
309
|
+
},
|
|
310
|
+
[setHoveredDate]
|
|
311
|
+
);
|
|
312
|
+
const selected = isSelected(date);
|
|
313
|
+
const selectedSpan = isSelectedSpan(date);
|
|
314
|
+
const hoveredSpan = isHoveredSpan(date);
|
|
315
|
+
const selectedStart = isSelectedStart(date);
|
|
316
|
+
const selectedEnd = isSelectedEnd(date);
|
|
317
|
+
const hovered = isHovered(date);
|
|
318
|
+
const hoveredOffset = isHoveredOffset(date);
|
|
319
|
+
return {
|
|
320
|
+
handleClick,
|
|
321
|
+
handleKeyDown,
|
|
322
|
+
handleMouseOver,
|
|
323
|
+
handleMouseLeave,
|
|
324
|
+
status: {
|
|
325
|
+
selected,
|
|
326
|
+
selectedSpan,
|
|
327
|
+
hoveredSpan,
|
|
328
|
+
selectedStart,
|
|
329
|
+
selectedEnd,
|
|
330
|
+
hovered,
|
|
331
|
+
hoveredOffset
|
|
332
|
+
},
|
|
333
|
+
dayProps: {
|
|
334
|
+
className: clsx({
|
|
335
|
+
[withBaseName("selected")]: selected,
|
|
336
|
+
[withBaseName("selectedSpan")]: selectedSpan,
|
|
337
|
+
[withBaseName("hoveredSpan")]: hoveredSpan,
|
|
338
|
+
[withBaseName("selectedStart")]: selectedStart,
|
|
339
|
+
[withBaseName("selectedEnd")]: selectedEnd,
|
|
340
|
+
[withBaseName("hovered")]: hovered,
|
|
341
|
+
[withBaseName("hoveredOffset")]: hoveredOffset
|
|
342
|
+
}),
|
|
343
|
+
"aria-pressed": selected || selectedEnd || selectedStart || selectedSpan ? "true" : void 0,
|
|
344
|
+
"aria-disabled": isDaySelectable && !isDaySelectable(date) ? "true" : void 0
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export { CALENDAR_MAX_YEAR, CALENDAR_MIN_YEAR, isDateRangeSelection, isMultipleDateSelection, isSingleSelectionValueType, useCalendarSelection, useCalendarSelectionDay };
|
|
350
|
+
//# sourceMappingURL=useCalendarSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import {\n CalendarDate,\n CalendarDateTime,\n type DateValue,\n ZonedDateTime,\n isSameDay,\n} from \"@internationalized/date\";\nimport { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport type {\n KeyboardEventHandler,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\n\n/**\n * Type representing a single date selection.\n */\nexport type SingleDateSelection = DateValue;\n\n/**\n * Type representing multiple date selections.\n */\nexport type MultipleDateSelection = DateValue[];\n\n/**\n * Type representing a date range selection.\n */\nexport type DateRangeSelection = {\n /**\n * The start date of the range.\n */\n startDate?: DateValue | null;\n /**\n * The end date of the range.\n */\n endDate?: DateValue | null;\n};\n\n/**\n * Type representing all possible selection value types.\n */\nexport type AllSelectionValueType =\n | SingleDateSelection\n | MultipleDateSelection\n | DateRangeSelection\n | null;\n\n/**\n * The default minimum year used by the calendar.\n */\nexport const CALENDAR_MIN_YEAR = 1900;\n\n/**\n * The default maximum year used by the calendar.\n */\nexport const CALENDAR_MAX_YEAR = 2100;\n\n/**\n * Checks if a value is a single date selection.\n * @param value - The value to check.\n * @returns `true` if the value is a single date selection, otherwise `false`.\n */\n// biome-ignore lint/suspicious/noExplicitAny: type guard\nexport function isSingleSelectionValueType(value: any): value is DateValue {\n return (\n value instanceof CalendarDate ||\n value instanceof CalendarDateTime ||\n value instanceof ZonedDateTime\n );\n}\n\n/**\n * Checks if a value is a date range selection.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\n// biome-ignore lint/suspicious/noExplicitAny: type guard\nexport function isDateRangeSelection(value: any): value is DateRangeSelection {\n return (\n value &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\n/**\n * Checks if a value is a multiple date selection.\n * @param value - The value to check.\n * @returns `true` if the value is a multiple date selection, otherwise `false`.\n */\nexport function isMultipleDateSelection(\n // biome-ignore lint/suspicious/noExplicitAny: type guard\n value: any,\n): value is MultipleDateSelection {\n return (\n Array.isArray(value) &&\n value.every((item) => isSingleSelectionValueType(item))\n );\n}\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n * @template SelectionVariantType - The type of the selection variant.\n */\ninterface UseCalendarSelectionBaseProps<SelectionVariantType> {\n /**\n * The currently hovered date.\n */\n hoveredDate?: DateValue | null;\n /**\n * The currently selected date.\n */\n selectedDate?: SelectionVariantType | null;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: SelectionVariantType;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectedDateChange?: (\n event: SyntheticEvent,\n selectedDate: SelectionVariantType | null,\n ) => void;\n /**\n * Function to determine if a day is selectable.\n * @param date - The date to check.\n * @returns `true` if the day is selectable, otherwise `false`.\n */\n isDaySelectable?: (date: DateValue) => boolean;\n /**\n * Callback fired when the hovered date changes.\n * @param event - The synthetic event.\n * @param hoveredDate - The new hovered date.\n */\n onHoveredDateChange?: (\n event: SyntheticEvent,\n hoveredDate: DateValue | null,\n ) => void;\n /**\n * Function to select a new date.\n * @param currentSelectedDate - The current selected date.\n * @param newSelectedDate - The new date to select.\n * @returns The updated selection variant type.\n */\n select?: (\n currentSelectedDate: SelectionVariantType,\n newSelectedDate: DateValue,\n ) => SelectionVariantType;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status\n */\nexport interface UseCalendarSelectionOffsetProps\n extends Omit<\n UseCalendarSelectionBaseProps<DateRangeSelection>,\n \"startDateOffset\" | \"endDateOffset\"\n > {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * Function to calculate the start date offset.\n * @param date - The date to offset.\n * @returns The offset start date.\n */\n startDateOffset?: (date: DateValue) => DateValue;\n /**\n * Function to calculate the end date offset.\n * @param date - The date to offset.\n * @returns The offset end date.\n */\n endDateOffset?: (date: DateValue) => DateValue;\n}\n\n/**\n * Properties for the range date selection hook.\n */\nexport interface UseCalendarSelectionRangeProps\n extends UseCalendarSelectionBaseProps<DateRangeSelection> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n}\n\n/**\n * Properties for the multi-select date selection hook.\n */\nexport interface UseCalendarSelectionMultiSelectProps\n extends UseCalendarSelectionBaseProps<MultipleDateSelection> {\n /**\n * The selection variant, set to \"multiselect\".\n */\n selectionVariant: \"multiselect\";\n}\n\n/**\n * Properties for the single date selection hook.\n */\nexport interface UseCalendarSelectionSingleProps\n extends UseCalendarSelectionBaseProps<SingleDateSelection> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n}\n\n/**\n * UseCalendarSelection hook props, wth the selection variant determining the return type of the date selection\n */\nexport type UseCalendarSelectionProps =\n | UseCalendarSelectionSingleProps\n | UseCalendarSelectionMultiSelectProps\n | UseCalendarSelectionRangeProps\n | UseCalendarSelectionOffsetProps;\n\nfunction addOrRemoveFromArray(array: AllSelectionValueType, item: DateValue) {\n if (Array.isArray(array)) {\n if (array.find((element) => isSameDay(element, item))) {\n return array.filter((element) => !isSameDay(element, item));\n }\n return array.concat(item);\n }\n return [item];\n}\n\nconst defaultOffset = (date: DateValue) => date;\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nconst defaultSingleSelectionHandler = (\n _currentSelectedDate: DateValue,\n newSelectedDate: DateValue,\n): DateValue => {\n return newSelectedDate;\n};\n\nconst defaultMultiSelectHandler = (\n currentSelectedDate: DateValue[],\n newSelectedDate: DateValue,\n): DateValue[] => {\n return addOrRemoveFromArray(currentSelectedDate, newSelectedDate);\n};\n\nconst defaultRangeSelectionHandler = (\n currentSelectedDate: DateRangeSelection,\n newSelectedDate: DateValue,\n): DateRangeSelection => {\n let base = { ...currentSelectedDate };\n if (base?.startDate && base?.endDate) {\n base = { startDate: newSelectedDate };\n } else if (base?.startDate && newSelectedDate.compare(base.startDate) < 0) {\n base = { startDate: newSelectedDate };\n } else if (base?.startDate && newSelectedDate.compare(base.startDate) >= 0) {\n base = { ...base, endDate: newSelectedDate };\n } else {\n base = { startDate: newSelectedDate };\n }\n return base;\n};\n\nconst defaultOffsetSelectionHandler = (\n _currentSelectedDate: DateRangeSelection,\n newSelectedDate: DateValue,\n): DateRangeSelection => {\n return {\n startDate: newSelectedDate,\n endDate: newSelectedDate,\n };\n};\n\nexport function useCalendarSelection(props: UseCalendarSelectionProps) {\n const {\n hoveredDate: hoveredDateProp,\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectedDateChange,\n onHoveredDateChange,\n isDaySelectable,\n selectionVariant,\n select: selectProp,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const [selectedDate, setSelectedDateState] = useControlled({\n controlled: selectedDateProp,\n default: defaultSelectedDate,\n name: \"Calendar\",\n state: \"selectedDate\",\n });\n\n const startDateOffset =\n selectionVariant === \"offset\" ? props.startDateOffset : undefined;\n const endDateOffset =\n selectionVariant === \"offset\" ? props.endDateOffset : undefined;\n\n const getStartDateOffset = useCallback(\n (date: DateValue) => {\n if (selectionVariant === \"offset\" && startDateOffset) {\n return startDateOffset(date);\n }\n return defaultOffset(date);\n },\n [selectionVariant, startDateOffset],\n );\n\n const getEndDateOffset = useCallback(\n (date: DateValue) => {\n if (selectionVariant === \"offset\" && endDateOffset) {\n return endDateOffset(date);\n }\n return defaultOffset(date);\n },\n [selectionVariant, endDateOffset],\n );\n\n const setSelectedDate = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newSelectedDate: DateValue) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n switch (selectionVariant) {\n case \"single\": {\n const singleSelect = selectProp || defaultSingleSelectionHandler;\n const newSingleDate = singleSelect(\n selectedDate as DateValue,\n newSelectedDate,\n );\n setSelectedDateState(newSingleDate);\n onSelectedDateChange?.(event, newSingleDate);\n break;\n }\n case \"multiselect\": {\n const multiSelect = selectProp || defaultMultiSelectHandler;\n const newMultiSelectDate = multiSelect(\n selectedDate as DateValue[],\n newSelectedDate,\n );\n setSelectedDateState(newMultiSelectDate);\n onSelectedDateChange?.(event, newMultiSelectDate);\n break;\n }\n case \"range\": {\n const rangeSelect = selectProp || defaultRangeSelectionHandler;\n const newRangeDate = rangeSelect(\n selectedDate as DateRangeSelection,\n newSelectedDate,\n );\n setSelectedDateState(newRangeDate);\n onSelectedDateChange?.(event, newRangeDate);\n break;\n }\n case \"offset\": {\n const offsetSelect = selectProp || defaultOffsetSelectionHandler;\n const newOffsetDate = offsetSelect(\n selectedDate as DateRangeSelection,\n newSelectedDate,\n );\n setSelectedDateState(newOffsetDate);\n onSelectedDateChange?.(event, newOffsetDate);\n break;\n }\n }\n }\n },\n [\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectedDateChange,\n ],\n );\n\n const isSelected = useCallback(\n (date: DateValue) => {\n switch (selectionVariant) {\n case \"single\":\n return (\n isSingleSelectionValueType(selectedDate) &&\n isSameDay(selectedDate, date)\n );\n case \"multiselect\":\n return (\n Array.isArray(selectedDate) &&\n !!selectedDate.find((element) => isSameDay(element, date))\n );\n default:\n return false;\n }\n },\n [selectionVariant, selectedDate],\n );\n\n const [hoveredDate, setHoveredDateState] = useControlled({\n controlled: hoveredDateProp,\n default: undefined,\n name: \"Calendar\",\n state: \"hoveredDate\",\n });\n\n const setHoveredDate = useCallback(\n (event: SyntheticEvent, date: DateValue | null) => {\n setHoveredDateState(date);\n onHoveredDateChange?.(event, date);\n },\n [onHoveredDateChange],\n );\n\n const isHovered = useCallback(\n (date: DateValue) => {\n return !!hoveredDate && isSameDay(date, hoveredDate);\n },\n [hoveredDate],\n );\n\n const isSelectedSpan = useCallback(\n (date: DateValue) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(selectedDate) &&\n selectedDate?.startDate &&\n selectedDate?.endDate\n ) {\n return (\n date.compare(selectedDate.startDate) > 0 &&\n date.compare(selectedDate.endDate) < 0\n );\n }\n return false;\n },\n [selectionVariant, selectedDate],\n );\n const isHoveredSpan = useCallback(\n (date: DateValue) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(selectedDate) &&\n selectedDate.startDate &&\n !selectedDate.endDate &&\n hoveredDate\n ) {\n const isForwardRange =\n hoveredDate.compare(selectedDate.startDate) > 0 &&\n ((date.compare(selectedDate.startDate) > 0 &&\n date.compare(hoveredDate) < 0) ||\n isSameDay(date, hoveredDate));\n\n const isValidDayHovered =\n !isDaySelectable || isDaySelectable(hoveredDate);\n\n return isForwardRange && isValidDayHovered;\n }\n return false;\n },\n [selectionVariant, selectedDate, hoveredDate, isDaySelectable],\n );\n\n const isSelectedStart = useCallback(\n (date: DateValue) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(selectedDate) &&\n selectedDate.startDate\n ) {\n return isSameDay(selectedDate.startDate, date);\n }\n return false;\n },\n [selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: DateValue) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(selectedDate) &&\n selectedDate.endDate\n ) {\n return isSameDay(selectedDate.endDate, date);\n }\n return false;\n },\n [selectionVariant, selectedDate],\n );\n\n const isHoveredOffset = useCallback(\n (date: DateValue) => {\n if (hoveredDate && selectionVariant === \"offset\") {\n const startDate = getStartDateOffset(hoveredDate);\n const endDate = getEndDateOffset(hoveredDate);\n\n return (\n date.compare(startDate) >= 0 &&\n date.compare(endDate) <= 0 &&\n (!isDaySelectable || isDaySelectable(date))\n );\n }\n\n return false;\n },\n [\n getStartDateOffset,\n getEndDateOffset,\n hoveredDate,\n isDaySelectable,\n selectionVariant,\n ],\n );\n\n return useMemo(\n () => ({\n state: {\n selectedDate,\n hoveredDate,\n },\n helpers: {\n setSelectedDate,\n isSelected,\n setHoveredDate,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n },\n }),\n [\n selectedDate,\n hoveredDate,\n setSelectedDate,\n isSelected,\n setHoveredDate,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n ],\n );\n}\n\nexport function useCalendarSelectionDay({ date }: { date: DateValue }) {\n const {\n helpers: {\n setSelectedDate,\n isSelected,\n setHoveredDate,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHovered,\n isHoveredOffset,\n isDaySelectable,\n },\n } = useCalendarContext();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const handleMouseOver: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setHoveredDate(event, date);\n },\n [date, setHoveredDate],\n );\n\n const handleMouseLeave: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setHoveredDate(event, null);\n },\n [setHoveredDate],\n );\n\n const selected = isSelected(date);\n const selectedSpan = isSelectedSpan(date);\n const hoveredSpan = isHoveredSpan(date);\n const selectedStart = isSelectedStart(date);\n const selectedEnd = isSelectedEnd(date);\n const hovered = isHovered(date);\n const hoveredOffset = isHoveredOffset(date);\n\n return {\n handleClick,\n handleKeyDown,\n handleMouseOver,\n handleMouseLeave,\n status: {\n selected,\n selectedSpan,\n hoveredSpan,\n selectedStart,\n selectedEnd,\n hovered,\n hoveredOffset,\n },\n dayProps: {\n className: clsx({\n [withBaseName(\"selected\")]: selected,\n [withBaseName(\"selectedSpan\")]: selectedSpan,\n [withBaseName(\"hoveredSpan\")]: hoveredSpan,\n [withBaseName(\"selectedStart\")]: selectedStart,\n [withBaseName(\"selectedEnd\")]: selectedEnd,\n [withBaseName(\"hovered\")]: hovered,\n [withBaseName(\"hoveredOffset\")]: hoveredOffset,\n }),\n \"aria-pressed\":\n selected || selectedEnd || selectedStart || selectedSpan\n ? \"true\"\n : undefined,\n \"aria-disabled\":\n isDaySelectable && !isDaySelectable(date) ? \"true\" : undefined,\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMouseHandlers.js","sources":["../src/cascading-menu/internal/useMouseHandlers.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport type { CascadingMenuListProps } from \"../CascadingMenuList\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction } from \"./CascadingMenuAction\";\n\nfunction isOrContainsNode(parent: HTMLElement | null, child: HTMLElement) {\n return parent === child || !!parent?.contains?.(child);\n}\n\nexport function useMouseHandlers(\n props: CascadingMenuListProps,\n isMenuActiveState: [boolean, Dispatch<SetStateAction<boolean>>],\n menuRef: HTMLElement | null,\n) {\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const {\n delay,\n refsManager,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n data,\n highlightedItemIndex,\n menuId,\n parentElement,\n } = props;\n const scheduledHighlightedIndexChange = useRef<number | null>(null);\n const mouseEnterTimer = useRef<number>();\n const mouseOutTimer = useRef<number>();\n\n useEffect(\n () =>\n function cleanUpTimeouts() {\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n },\n [],\n );\n\n const handleMouseMove = useCallback(\n (highlightedIndex: number) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n\n if (!isMenuActive) {\n setIsMenuActive(true);\n }\n if (scheduledHighlightedIndexChange.current !== highlightedIndex) {\n scheduledHighlightedIndexChange.current = highlightedIndex;\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n mouseEnterTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_ENTER,\n targetId: menuId,\n highlightedItemIndex: highlightedIndex,\n });\n }, delay);\n }\n },\n [\n isNavigatingWithKeyboard,\n isMenuActive,\n setIsNavigatingWithKeyboard,\n setIsMenuActive,\n delay,\n dispatch,\n menuId,\n ],\n );\n const handleMouseOut = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n clearTimeout(mouseOutTimer.current);\n // If mouse leaves from parent menu into other element other than submenu -> close submenu\n const { relatedTarget } = event;\n const subMenuElement =\n typeof highlightedItemIndex === \"number\"\n ? refsManager.get(data.childMenus[highlightedItemIndex]) ?? null\n : null;\n\n const mouseMovedToSameMenu = isOrContainsNode(\n menuRef,\n relatedTarget as HTMLElement,\n );\n const mouseMovedToParentMenu = isOrContainsNode(\n parentElement ?? null,\n relatedTarget as HTMLElement,\n );\n\n if (mouseMovedToParentMenu) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_MOVE_TO_PARENT,\n targetId: menuId,\n highlightedItemIndex: null,\n });\n }\n const didMouseMoveOutOfMenu = !(\n mouseMovedToParentMenu ||\n mouseMovedToSameMenu ||\n isOrContainsNode(subMenuElement, relatedTarget as HTMLElement)\n );\n\n if (didMouseMoveOutOfMenu) {\n scheduledHighlightedIndexChange.current = null;\n if (!isMenuActive) {\n setIsMenuActive(true);\n clearInterval(mouseEnterTimer.current);\n mouseOutTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.RESET_MENU,\n cause: stateChangeTypes.MOUSE_OUT_OF_MENUS,\n targetId: menuId,\n });\n }, delay);\n }\n } else if (!mouseMovedToSameMenu) {\n setIsMenuActive(false);\n }\n },\n [\n isNavigatingWithKeyboard,\n refsManager,\n data.childMenus,\n highlightedItemIndex,\n menuRef,\n parentElement,\n setIsNavigatingWithKeyboard,\n dispatch,\n menuId,\n isMenuActive,\n delay,\n setIsMenuActive,\n ],\n );\n return [handleMouseMove, handleMouseOut] as const;\n}\n"],"names":[],"mappings":";;;;AAaA,SAAS,gBAAA,CAAiB,QAA4B,KAAoB,EAAA;AAb1E,EAAA,IAAA,EAAA,CAAA;AAcE,EAAA,OAAO,WAAW,KAAS,IAAA,CAAC,EAAC,CAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAQ,aAAR,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAClD,CAAA;AAEgB,SAAA,gBAAA,CACd,KACA,EAAA,iBAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,CAAC,YAAc,EAAA,eAAe,CAAI,GAAA,iBAAA,CAAA;AACxC,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,wBAAA;AAAA,IACA,2BAAA;AAAA,IACA,IAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,GACE,GAAA,KAAA,CAAA;AACJ,EAAM,MAAA,+BAAA,GAAkC,OAAsB,IAAI,CAAA,CAAA;AAClE,EAAA,MAAM,kBAAkB,MAAe,EAAA,CAAA;AACvC,EAAA,MAAM,gBAAgB,MAAe,EAAA,CAAA;AAErC,EAAA,SAAA;AAAA,IACE,MACE,SAAS,eAAkB,GAAA;AACzB,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA,CAAA;AACpC,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA,CAAA;AAAA,KACpC;AAAA,IACF,EAAC;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,gBAA6B,KAAA;AAC5B,MAAA,IAAI,wBAA0B,EAAA;AAC5B,QAAA,2BAAA,CAA4B,KAAK,CAAA,CAAA;AAAA,OACnC;AAEA,MAAA,IAAI,CAAC,YAAc,EAAA;AACjB,QAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAAA,OACtB;AACA,MAAI,IAAA,+BAAA,CAAgC,YAAY,gBAAkB,EAAA;AAChE,QAAA,+BAAA,CAAgC,OAAU,GAAA,gBAAA,CAAA;AAC1C,QAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA,CAAA;AACpC,QAAA,YAAA,CAAa,cAAc,OAAO,CAAA,CAAA;AAClC,QAAgB,eAAA,CAAA,OAAA,GAAU,MAAO,CAAA,UAAA,CAAW,MAAM;AAChD,UAAS,QAAA,CAAA;AAAA,YACP,MAAM,mBAAoB,CAAA,2BAAA;AAAA,YAC1B,OAAO,gBAAiB,CAAA,gBAAA;AAAA,YACxB,QAAU,EAAA,MAAA;AAAA,YACV,oBAAsB,EAAA,gBAAA;AAAA,WACvB,CAAA,CAAA;AAAA,WACA,KAAK,CAAA,CAAA;AAAA,OACV;AAAA,KACF;AAAA,IACA;AAAA,MACE,wBAAA;AAAA,MACA,YAAA;AAAA,MACA,2BAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,KACF;AAAA,GACF,CAAA;AACA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,KAAmC,KAAA;AAjFxC,MAAA,IAAA,EAAA,CAAA;AAkFM,MAAA,IAAI,wBAA0B,EAAA;AAC5B,QAAA,2BAAA,CAA4B,KAAK,CAAA,CAAA;AAAA,OACnC;AACA,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA,CAAA;AAElC,MAAM,MAAA,EAAE,eAAkB,GAAA,KAAA,CAAA;AAC1B,MAAM,MAAA,cAAA,GACJ,OAAO,oBAAA,KAAyB,
|
|
1
|
+
{"version":3,"file":"useMouseHandlers.js","sources":["../src/cascading-menu/internal/useMouseHandlers.ts"],"sourcesContent":["import {\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport type { CascadingMenuListProps } from \"../CascadingMenuList\";\nimport { stateChangeTypes } from \"../stateChangeTypes\";\nimport { CascadingMenuAction } from \"./CascadingMenuAction\";\n\nfunction isOrContainsNode(parent: HTMLElement | null, child: HTMLElement) {\n return parent === child || !!parent?.contains?.(child);\n}\n\nexport function useMouseHandlers(\n props: CascadingMenuListProps,\n isMenuActiveState: [boolean, Dispatch<SetStateAction<boolean>>],\n menuRef: HTMLElement | null,\n) {\n const [isMenuActive, setIsMenuActive] = isMenuActiveState;\n const {\n delay,\n refsManager,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n data,\n highlightedItemIndex,\n menuId,\n parentElement,\n } = props;\n const scheduledHighlightedIndexChange = useRef<number | null>(null);\n const mouseEnterTimer = useRef<number>();\n const mouseOutTimer = useRef<number>();\n\n useEffect(\n () =>\n function cleanUpTimeouts() {\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n },\n [],\n );\n\n const handleMouseMove = useCallback(\n (highlightedIndex: number) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n\n if (!isMenuActive) {\n setIsMenuActive(true);\n }\n if (scheduledHighlightedIndexChange.current !== highlightedIndex) {\n scheduledHighlightedIndexChange.current = highlightedIndex;\n clearTimeout(mouseEnterTimer.current);\n clearTimeout(mouseOutTimer.current);\n mouseEnterTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_ENTER,\n targetId: menuId,\n highlightedItemIndex: highlightedIndex,\n });\n }, delay);\n }\n },\n [\n isNavigatingWithKeyboard,\n isMenuActive,\n setIsNavigatingWithKeyboard,\n setIsMenuActive,\n delay,\n dispatch,\n menuId,\n ],\n );\n const handleMouseOut = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (isNavigatingWithKeyboard) {\n setIsNavigatingWithKeyboard(false);\n }\n clearTimeout(mouseOutTimer.current);\n // If mouse leaves from parent menu into other element other than submenu -> close submenu\n const { relatedTarget } = event;\n const subMenuElement =\n typeof highlightedItemIndex === \"number\"\n ? (refsManager.get(data.childMenus[highlightedItemIndex]) ?? null)\n : null;\n\n const mouseMovedToSameMenu = isOrContainsNode(\n menuRef,\n relatedTarget as HTMLElement,\n );\n const mouseMovedToParentMenu = isOrContainsNode(\n parentElement ?? null,\n relatedTarget as HTMLElement,\n );\n\n if (mouseMovedToParentMenu) {\n dispatch({\n type: CascadingMenuAction.SET_CURRENT_INTERACTED_ITEM,\n cause: stateChangeTypes.ITEM_MOUSE_MOVE_TO_PARENT,\n targetId: menuId,\n highlightedItemIndex: null,\n });\n }\n const didMouseMoveOutOfMenu = !(\n mouseMovedToParentMenu ||\n mouseMovedToSameMenu ||\n isOrContainsNode(subMenuElement, relatedTarget as HTMLElement)\n );\n\n if (didMouseMoveOutOfMenu) {\n scheduledHighlightedIndexChange.current = null;\n if (!isMenuActive) {\n setIsMenuActive(true);\n clearInterval(mouseEnterTimer.current);\n mouseOutTimer.current = window.setTimeout(() => {\n dispatch({\n type: CascadingMenuAction.RESET_MENU,\n cause: stateChangeTypes.MOUSE_OUT_OF_MENUS,\n targetId: menuId,\n });\n }, delay);\n }\n } else if (!mouseMovedToSameMenu) {\n setIsMenuActive(false);\n }\n },\n [\n isNavigatingWithKeyboard,\n refsManager,\n data.childMenus,\n highlightedItemIndex,\n menuRef,\n parentElement,\n setIsNavigatingWithKeyboard,\n dispatch,\n menuId,\n isMenuActive,\n delay,\n setIsMenuActive,\n ],\n );\n return [handleMouseMove, handleMouseOut] as const;\n}\n"],"names":[],"mappings":"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"}
|