@salt-ds/lab 1.0.0-alpha.74 → 1.0.0-alpha.75
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.md +17 -0
- package/css/salt-lab.css +7 -23
- package/dist-cjs/app-header/AppHeader.js +5 -1
- package/dist-cjs/app-header/AppHeader.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumbs.js +11 -2
- package/dist-cjs/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -6
- package/dist-cjs/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
- package/dist-cjs/button-bar/ButtonBar.js +1 -1
- package/dist-cjs/button-bar/ButtonBar.js.map +1 -1
- package/dist-cjs/button-bar/internal/DescendantContext.js.map +1 -1
- package/dist-cjs/calendar/useCalendarSelection.js +2 -2
- package/dist-cjs/calendar/useCalendarSelection.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenu.js +19 -13
- package/dist-cjs/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenuItem.js +2 -4
- package/dist-cjs/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-cjs/cascading-menu/CascadingMenuList.js +1 -2
- package/dist-cjs/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js +4 -1
- package/dist-cjs/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useMouseHandlers.js +1 -1
- package/dist-cjs/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-cjs/cascading-menu/internal/useRefsManager.js +3 -1
- package/dist-cjs/cascading-menu/internal/useRefsManager.js.map +1 -1
- package/dist-cjs/collapsible/CollapsibleTrigger.js +1 -2
- package/dist-cjs/collapsible/CollapsibleTrigger.js.map +1 -1
- package/dist-cjs/color-chooser/AlphaInputField.js +1 -1
- package/dist-cjs/color-chooser/AlphaInputField.js.map +1 -1
- package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
- package/dist-cjs/color-chooser/DictTabs.js +1 -1
- package/dist-cjs/color-chooser/DictTabs.js.map +1 -1
- package/dist-cjs/color-chooser/RGBAInputField.js +2 -2
- package/dist-cjs/color-chooser/RGBAInputField.js.map +1 -1
- package/dist-cjs/combo-box/useCombobox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
- package/dist-cjs/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
- package/dist-cjs/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js +0 -4
- package/dist-cjs/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/useComboBox.js +4 -1
- package/dist-cjs/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
- package/dist-cjs/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-cjs/common-hooks/useAutoSizer.js +0 -9
- package/dist-cjs/common-hooks/useAutoSizer.js.map +1 -1
- package/dist-cjs/common-hooks/useCollapsibleGroups.js +37 -49
- package/dist-cjs/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/dist-cjs/common-hooks/useCollectionItems.js +6 -11
- package/dist-cjs/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js +7 -7
- package/dist-cjs/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
- package/dist-cjs/common-hooks/useSelection.js +1 -1
- package/dist-cjs/common-hooks/useSelection.js.map +1 -1
- package/dist-cjs/common-hooks/useTypeahead.js +2 -2
- package/dist-cjs/common-hooks/useTypeahead.js.map +1 -1
- package/dist-cjs/common-hooks/useViewportTracking.js +1 -1
- package/dist-cjs/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-cjs/common-hooks/utils/collection-item-utils.js +1 -1
- package/dist-cjs/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/dist-cjs/contact-details/ContactAction.js +1 -0
- package/dist-cjs/contact-details/ContactAction.js.map +1 -1
- package/dist-cjs/contact-details/ContactSecondaryInfo.js +1 -1
- package/dist-cjs/contact-details/ContactSecondaryInfo.js.map +1 -1
- package/dist-cjs/contact-details/internal/ContactDetailsContext.js +2 -2
- package/dist-cjs/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
- package/dist-cjs/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-cjs/content-status/ContentStatus.js.map +1 -1
- package/dist-cjs/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-cjs/date-input/DateInput.css.js +1 -1
- package/dist-cjs/date-picker/useFocusOut.js +1 -1
- package/dist-cjs/date-picker/useFocusOut.js.map +1 -1
- package/dist-cjs/dropdown/DropdownButton.js.map +1 -1
- package/dist-cjs/dropdown/useDropdown.js.map +1 -1
- package/dist-cjs/input-legacy/InputLegacy.css.js +1 -1
- package/dist-cjs/list/List.js +1 -1
- package/dist-cjs/list/List.js.map +1 -1
- package/dist-cjs/list/ListItem.css.js +1 -1
- package/dist-cjs/list/ListItem.js +2 -1
- package/dist-cjs/list/ListItem.js.map +1 -1
- package/dist-cjs/list/keyset.js.map +1 -1
- package/dist-cjs/list/useList.js +1 -3
- package/dist-cjs/list/useList.js.map +1 -1
- package/dist-cjs/list/useListHeight.js +3 -3
- package/dist-cjs/list/useListHeight.js.map +1 -1
- package/dist-cjs/list-deprecated/List.js +4 -1
- package/dist-cjs/list-deprecated/List.js.map +1 -1
- package/dist-cjs/list-deprecated/ListBase.js +18 -17
- package/dist-cjs/list-deprecated/ListBase.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItemBase.js +1 -0
- package/dist-cjs/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/helpers.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/scrollIntoView.js +2 -2
- package/dist-cjs/list-deprecated/internal/scrollIntoView.js.map +1 -1
- package/dist-cjs/list-deprecated/internal/useListAutoSizer.js.map +1 -1
- package/dist-cjs/list-deprecated/itemToString.js.map +1 -1
- package/dist-cjs/list-deprecated/useList.js +3 -10
- package/dist-cjs/list-deprecated/useList.js.map +1 -1
- package/dist-cjs/list-deprecated/useListItem.js.map +1 -1
- package/dist-cjs/list-next/ListNext.js.map +1 -1
- package/dist-cjs/metric/MetricContent.js +1 -0
- package/dist-cjs/metric/MetricContent.js.map +1 -1
- package/dist-cjs/number-input/NumberInput.css.js +1 -1
- package/dist-cjs/number-input/internal/utils.js +1 -1
- package/dist-cjs/number-input/internal/utils.js.map +1 -1
- package/dist-cjs/query-input/QueryInput.js +10 -10
- package/dist-cjs/query-input/QueryInput.js.map +1 -1
- package/dist-cjs/query-input/internal/QueryInputBody.js +1 -1
- package/dist-cjs/query-input/internal/QueryInputBody.js.map +1 -1
- package/dist-cjs/query-input/internal/SearchList.js +1 -1
- package/dist-cjs/query-input/internal/SearchList.js.map +1 -1
- package/dist-cjs/query-input/internal/usePopperStatus.js +2 -2
- package/dist-cjs/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-cjs/query-input/useQueryInput.js +6 -6
- package/dist-cjs/query-input/useQueryInput.js.map +1 -1
- package/dist-cjs/responsive/OverflowReducer.js +0 -2
- package/dist-cjs/responsive/OverflowReducer.js.map +1 -1
- package/dist-cjs/responsive/overflowUtils.js +6 -3
- package/dist-cjs/responsive/overflowUtils.js.map +1 -1
- package/dist-cjs/responsive/useDynamicCollapse.js +6 -3
- package/dist-cjs/responsive/useDynamicCollapse.js.map +1 -1
- package/dist-cjs/responsive/useOverflow.js +2 -2
- package/dist-cjs/responsive/useOverflow.js.map +1 -1
- package/dist-cjs/responsive/useOverflowCollectionItems.js +1 -1
- package/dist-cjs/responsive/useOverflowCollectionItems.js.map +1 -1
- package/dist-cjs/responsive/useOverflowLayout.js +1 -1
- package/dist-cjs/responsive/useOverflowLayout.js.map +1 -1
- package/dist-cjs/responsive/useReclaimSpace.js +1 -1
- package/dist-cjs/responsive/useReclaimSpace.js.map +1 -1
- package/dist-cjs/responsive/useResizeObserver.js +7 -2
- package/dist-cjs/responsive/useResizeObserver.js.map +1 -1
- package/dist-cjs/search-input/SearchInput.js.map +1 -1
- package/dist-cjs/table/TH.js +1 -1
- package/dist-cjs/table/TH.js.map +1 -1
- package/dist-cjs/table/TR.js +1 -1
- package/dist-cjs/table/TR.js.map +1 -1
- package/dist-cjs/tabs/TabActivationIndicator.css.js +1 -1
- package/dist-cjs/tabs/Tabs.js +0 -8
- package/dist-cjs/tabs/Tabs.js.map +1 -1
- package/dist-cjs/tabs/drag-drop/useDragSpacers.js +6 -7
- package/dist-cjs/tabs/drag-drop/useDragSpacers.js.map +1 -1
- package/dist-cjs/tabs/useActivationIndicator.js.map +1 -1
- package/dist-cjs/tabs-next/TabNextTrigger.js +2 -1
- package/dist-cjs/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-cjs/tabs-next/hooks/useOverflow.js +3 -5
- package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-cjs/tokenized-input/useTokenizedInput.js +5 -5
- package/dist-cjs/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.css.js +1 -1
- package/dist-cjs/tree/Tree.js.map +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigation.css.js +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigation.js +4 -4
- package/dist-cjs/vertical-navigation/VerticalNavigation.js.map +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationItem.js +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationItem.js.map +1 -1
- package/dist-es/app-header/AppHeader.js +5 -1
- package/dist-es/app-header/AppHeader.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumbs.js +11 -2
- package/dist-es/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js +3 -6
- package/dist-es/breadcrumbs/internal/BreadcrumbsCollapsed.js.map +1 -1
- package/dist-es/button-bar/ButtonBar.js +1 -1
- package/dist-es/button-bar/ButtonBar.js.map +1 -1
- package/dist-es/button-bar/internal/DescendantContext.js.map +1 -1
- package/dist-es/calendar/useCalendarSelection.js +2 -2
- package/dist-es/calendar/useCalendarSelection.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenu.js +19 -13
- package/dist-es/cascading-menu/CascadingMenu.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenuItem.js +2 -4
- package/dist-es/cascading-menu/CascadingMenuItem.js.map +1 -1
- package/dist-es/cascading-menu/CascadingMenuList.js +1 -2
- package/dist-es/cascading-menu/CascadingMenuList.js.map +1 -1
- package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js +4 -1
- package/dist-es/cascading-menu/internal/useMenuTriggerHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useMouseHandlers.js +1 -1
- package/dist-es/cascading-menu/internal/useMouseHandlers.js.map +1 -1
- package/dist-es/cascading-menu/internal/useRefsManager.js +3 -1
- package/dist-es/cascading-menu/internal/useRefsManager.js.map +1 -1
- package/dist-es/collapsible/CollapsibleTrigger.js +1 -2
- package/dist-es/collapsible/CollapsibleTrigger.js.map +1 -1
- package/dist-es/color-chooser/AlphaInputField.js +1 -1
- package/dist-es/color-chooser/AlphaInputField.js.map +1 -1
- package/dist-es/color-chooser/ColorChooser.js.map +1 -1
- package/dist-es/color-chooser/DictTabs.js +1 -1
- package/dist-es/color-chooser/DictTabs.js.map +1 -1
- package/dist-es/color-chooser/RGBAInputField.js +2 -2
- package/dist-es/color-chooser/RGBAInputField.js.map +1 -1
- package/dist-es/combo-box/useCombobox.js.map +1 -1
- package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js +1 -1
- package/dist-es/combo-box-deprecated/ComboBoxDeprecated.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -2
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -5
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js +4 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js.map +1 -1
- package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +7 -2
- package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js.map +1 -1
- package/dist-es/common-hooks/useAutoSizer.js +0 -9
- package/dist-es/common-hooks/useAutoSizer.js.map +1 -1
- package/dist-es/common-hooks/useCollapsibleGroups.js +38 -50
- package/dist-es/common-hooks/useCollapsibleGroups.js.map +1 -1
- package/dist-es/common-hooks/useCollectionItems.js +6 -11
- package/dist-es/common-hooks/useCollectionItems.js.map +1 -1
- package/dist-es/common-hooks/useKeyboardNavigationPanel.js +8 -8
- package/dist-es/common-hooks/useKeyboardNavigationPanel.js.map +1 -1
- package/dist-es/common-hooks/useSelection.js +1 -1
- package/dist-es/common-hooks/useSelection.js.map +1 -1
- package/dist-es/common-hooks/useTypeahead.js +2 -2
- package/dist-es/common-hooks/useTypeahead.js.map +1 -1
- package/dist-es/common-hooks/useViewportTracking.js +1 -1
- package/dist-es/common-hooks/useViewportTracking.js.map +1 -1
- package/dist-es/common-hooks/utils/collection-item-utils.js +1 -1
- package/dist-es/common-hooks/utils/collection-item-utils.js.map +1 -1
- package/dist-es/contact-details/ContactAction.js +1 -0
- package/dist-es/contact-details/ContactAction.js.map +1 -1
- package/dist-es/contact-details/ContactSecondaryInfo.js +1 -1
- package/dist-es/contact-details/ContactSecondaryInfo.js.map +1 -1
- package/dist-es/contact-details/internal/ContactDetailsContext.js +2 -2
- package/dist-es/contact-details/internal/ContactDetailsContext.js.map +1 -1
- package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js +10 -1
- package/dist-es/contact-details/internal/FavoriteToggleWithTooltip.js.map +1 -1
- package/dist-es/content-status/ContentStatus.js.map +1 -1
- package/dist-es/content-status/internal/StatusIndicator.js.map +1 -1
- package/dist-es/date-input/DateInput.css.js +1 -1
- package/dist-es/date-picker/useFocusOut.js +1 -1
- package/dist-es/date-picker/useFocusOut.js.map +1 -1
- package/dist-es/dropdown/DropdownButton.js.map +1 -1
- package/dist-es/dropdown/useDropdown.js.map +1 -1
- package/dist-es/input-legacy/InputLegacy.css.js +1 -1
- package/dist-es/list/List.js +2 -2
- package/dist-es/list/List.js.map +1 -1
- package/dist-es/list/ListItem.css.js +1 -1
- package/dist-es/list/ListItem.js +2 -1
- package/dist-es/list/ListItem.js.map +1 -1
- package/dist-es/list/keyset.js.map +1 -1
- package/dist-es/list/useList.js +1 -3
- package/dist-es/list/useList.js.map +1 -1
- package/dist-es/list/useListHeight.js +3 -3
- package/dist-es/list/useListHeight.js.map +1 -1
- package/dist-es/list-deprecated/List.js +4 -1
- package/dist-es/list-deprecated/List.js.map +1 -1
- package/dist-es/list-deprecated/ListBase.js +19 -18
- package/dist-es/list-deprecated/ListBase.js.map +1 -1
- package/dist-es/list-deprecated/ListItem.js.map +1 -1
- package/dist-es/list-deprecated/ListItemBase.js +1 -0
- package/dist-es/list-deprecated/ListItemBase.js.map +1 -1
- package/dist-es/list-deprecated/internal/helpers.js.map +1 -1
- package/dist-es/list-deprecated/internal/scrollIntoView.js +2 -2
- package/dist-es/list-deprecated/internal/scrollIntoView.js.map +1 -1
- package/dist-es/list-deprecated/internal/useListAutoSizer.js.map +1 -1
- package/dist-es/list-deprecated/itemToString.js.map +1 -1
- package/dist-es/list-deprecated/useList.js +3 -10
- package/dist-es/list-deprecated/useList.js.map +1 -1
- package/dist-es/list-deprecated/useListItem.js.map +1 -1
- package/dist-es/list-next/ListNext.js.map +1 -1
- package/dist-es/metric/MetricContent.js +1 -0
- package/dist-es/metric/MetricContent.js.map +1 -1
- package/dist-es/number-input/NumberInput.css.js +1 -1
- package/dist-es/number-input/internal/utils.js +1 -1
- package/dist-es/number-input/internal/utils.js.map +1 -1
- package/dist-es/query-input/QueryInput.js +10 -10
- package/dist-es/query-input/QueryInput.js.map +1 -1
- package/dist-es/query-input/internal/QueryInputBody.js +1 -1
- package/dist-es/query-input/internal/QueryInputBody.js.map +1 -1
- package/dist-es/query-input/internal/SearchList.js +1 -1
- package/dist-es/query-input/internal/SearchList.js.map +1 -1
- package/dist-es/query-input/internal/usePopperStatus.js +2 -2
- package/dist-es/query-input/internal/usePopperStatus.js.map +1 -1
- package/dist-es/query-input/useQueryInput.js +6 -6
- package/dist-es/query-input/useQueryInput.js.map +1 -1
- package/dist-es/responsive/OverflowReducer.js +0 -2
- package/dist-es/responsive/OverflowReducer.js.map +1 -1
- package/dist-es/responsive/overflowUtils.js +6 -3
- package/dist-es/responsive/overflowUtils.js.map +1 -1
- package/dist-es/responsive/useDynamicCollapse.js +6 -3
- package/dist-es/responsive/useDynamicCollapse.js.map +1 -1
- package/dist-es/responsive/useOverflow.js +2 -2
- package/dist-es/responsive/useOverflow.js.map +1 -1
- package/dist-es/responsive/useOverflowCollectionItems.js +1 -1
- package/dist-es/responsive/useOverflowCollectionItems.js.map +1 -1
- package/dist-es/responsive/useOverflowLayout.js +1 -1
- package/dist-es/responsive/useOverflowLayout.js.map +1 -1
- package/dist-es/responsive/useReclaimSpace.js +1 -1
- package/dist-es/responsive/useReclaimSpace.js.map +1 -1
- package/dist-es/responsive/useResizeObserver.js +7 -2
- package/dist-es/responsive/useResizeObserver.js.map +1 -1
- package/dist-es/search-input/SearchInput.js.map +1 -1
- package/dist-es/table/TH.js +1 -1
- package/dist-es/table/TH.js.map +1 -1
- package/dist-es/table/TR.js +1 -1
- package/dist-es/table/TR.js.map +1 -1
- package/dist-es/tabs/TabActivationIndicator.css.js +1 -1
- package/dist-es/tabs/Tabs.js +1 -9
- package/dist-es/tabs/Tabs.js.map +1 -1
- package/dist-es/tabs/drag-drop/useDragSpacers.js +6 -7
- package/dist-es/tabs/drag-drop/useDragSpacers.js.map +1 -1
- package/dist-es/tabs/useActivationIndicator.js.map +1 -1
- package/dist-es/tabs-next/TabNextTrigger.js +2 -1
- package/dist-es/tabs-next/TabNextTrigger.js.map +1 -1
- package/dist-es/tabs-next/hooks/useOverflow.js +4 -6
- package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
- package/dist-es/tokenized-input/useTokenizedInput.js +5 -5
- package/dist-es/tokenized-input/useTokenizedInput.js.map +1 -1
- package/dist-es/tokenized-input-next/TokenizedInputNext.css.js +1 -1
- package/dist-es/tree/Tree.js.map +1 -1
- package/dist-es/vertical-navigation/VerticalNavigation.css.js +1 -1
- package/dist-es/vertical-navigation/VerticalNavigation.js +4 -4
- package/dist-es/vertical-navigation/VerticalNavigation.js.map +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationItem.js +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationItem.js.map +1 -1
- package/dist-types/breadcrumbs/Breadcrumb.d.ts +2 -2
- package/dist-types/breadcrumbs/Breadcrumbs.d.ts +2 -2
- package/dist-types/cascading-menu/CascadingMenuList.d.ts +3 -1
- package/dist-types/cascading-menu/CascadingMenuProps.d.ts +1 -1
- package/dist-types/cascading-menu/internal/useMenuTriggerHandlers.d.ts +3 -2
- package/dist-types/collapsible/CollapsibleTrigger.d.ts +1 -1
- package/dist-types/combo-box-deprecated/internal/useComboBox.d.ts +5 -5
- package/dist-types/combo-box-deprecated/internal/useMultiSelectComboBox.d.ts +7 -7
- package/dist-types/common-hooks/useAutoSizer.d.ts +1 -1
- package/dist-types/common-hooks/useCollapsibleGroups.d.ts +2 -2
- package/dist-types/common-hooks/useCollectionItems.d.ts +1 -1
- package/dist-types/common-hooks/useSelection.d.ts +1 -1
- package/dist-types/content-status/ContentStatus.d.ts +1 -1
- package/dist-types/dropdown/DropdownButton.d.ts +1 -1
- package/dist-types/dropdown/dropdownTypes.d.ts +2 -2
- package/dist-types/dropdown/useDropdown.d.ts +1 -1
- package/dist-types/list/useListHeight.d.ts +1 -1
- package/dist-types/list-deprecated/ListBase.d.ts +4 -8
- package/dist-types/list-deprecated/ListProps.d.ts +7 -6
- package/dist-types/list-deprecated/internal/helpers.d.ts +3 -2
- package/dist-types/list-deprecated/internal/useListAutoSizer.d.ts +2 -7
- package/dist-types/list-deprecated/itemToString.d.ts +2 -2
- package/dist-types/list-deprecated/useList.d.ts +1 -1
- package/dist-types/metric/internal/helpers.d.ts +1 -1
- package/dist-types/query-input/internal/usePopperStatus.d.ts +3 -3
- package/dist-types/responsive/overflowTypes.d.ts +1 -1
- package/dist-types/responsive/overflowUtils.d.ts +1 -1
- package/dist-types/responsive/useReclaimSpace.d.ts +1 -1
- package/dist-types/search-input/SearchInput.d.ts +1 -1
- package/dist-types/vertical-navigation/VerticalNavigation.d.ts +2 -2
- package/package.json +3 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerticalNavigationItem.js","sources":["../src/vertical-navigation/VerticalNavigationItem.tsx"],"sourcesContent":["import { createContext, makePrefixer } from \"@salt-ds/core\";\nimport clsx from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type Dispatch,\n forwardRef,\n type SetStateAction,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport { useSubMenuContext } from \"./SubMenuContext\";\n\nexport interface VerticalNavigationItemProps\n extends ComponentPropsWithoutRef<\"li\"> {\n active?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltVerticalNavigationItem\");\n\ntype VerticalNavigationItemContextType = {\n active: boolean;\n focusVisible: boolean;\n setFocusVisible: Dispatch<SetStateAction<boolean>>;\n};\n\nconst VerticalNavigationItemContext =\n createContext<VerticalNavigationItemContextType>(\n \"saltVerticalNavigationItemContext\",\n {\n active: false,\n focusVisible: false,\n setFocusVisible: () => {},\n },\n );\n\nexport function useVerticalNavigationItem() {\n return useContext(VerticalNavigationItemContext);\n}\n\nexport const VerticalNavigationItem = forwardRef<\n HTMLLIElement,\n VerticalNavigationItemProps\n>(function VerticalNavigationItem(props, ref) {\n const { children, className, active = false, style, ...rest } = props;\n\n const { depth } = useSubMenuContext();\n const [focusVisible, setFocusVisible] = useState(false);\n\n const context = useMemo(\n () => ({\n active,\n focusVisible,\n setFocusVisible,\n }),\n [active, focusVisible],\n );\n\n return (\n <VerticalNavigationItemContext.Provider value={context}>\n <li\n ref={ref}\n className={clsx(withBaseName(), className)}\n style={\n { \"--verticalNavigationItem-depth\": depth, ...style } as CSSProperties\n }\n {...rest}\n >\n {children}\n </li>\n </VerticalNavigationItemContext.Provider>\n );\n});\n"],"names":["makePrefixer","createContext","useContext","forwardRef","VerticalNavigationItem","useSubMenuContext","useState","useMemo","jsx"],"mappings":";;;;;;;;AAmBA,MAAM,YAAA,GAAeA,kBAAa,4BAA4B,CAAA;AAQ9D,MAAM,6BACJ,GAAAC,kBAAA;AAAA,EACE,mCAAA;AAAA,EACA;AAAA,IACE,MAAQ,EAAA,KAAA;AAAA,IACR,YAAc,EAAA,KAAA;AAAA,IACd,iBAAiB,MAAM;AAAA;AAAC;AAE5B,CAAA;AAEK,SAAS,yBAA4B,GAAA;AAC1C,EAAA,OAAOC,iBAAW,6BAA6B,CAAA;AACjD;AAEO,MAAM,sBAAyB,GAAAC,gBAAA,CAGpC,SAASC,uBAAAA,CAAuB,OAAO,GAAK,EAAA;AAC5C,EAAM,MAAA,EAAE,UAAU,SAAW,EAAA,MAAA,GAAS,OAAO,KAAO,EAAA,GAAG,MAAS,GAAA,KAAA;AAEhE,EAAM,MAAA,EAAE,KAAM,EAAA,GAAIC,gCAAkB,EAAA;AACpC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,OAAU,GAAAC,aAAA;AAAA,IACd,OAAO;AAAA,MACL,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,uBACGC,cAAA,CAAA,6BAAA,CAA8B,QAA9B,EAAA,EAAuC,OAAO,OAC7C,EAAA,QAAA,kBAAAA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,
|
|
1
|
+
{"version":3,"file":"VerticalNavigationItem.js","sources":["../src/vertical-navigation/VerticalNavigationItem.tsx"],"sourcesContent":["import { createContext, makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type Dispatch,\n forwardRef,\n type SetStateAction,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport { useSubMenuContext } from \"./SubMenuContext\";\n\nexport interface VerticalNavigationItemProps\n extends ComponentPropsWithoutRef<\"li\"> {\n active?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltVerticalNavigationItem\");\n\ntype VerticalNavigationItemContextType = {\n active: boolean;\n focusVisible: boolean;\n setFocusVisible: Dispatch<SetStateAction<boolean>>;\n};\n\nconst VerticalNavigationItemContext =\n createContext<VerticalNavigationItemContextType>(\n \"saltVerticalNavigationItemContext\",\n {\n active: false,\n focusVisible: false,\n setFocusVisible: () => {},\n },\n );\n\nexport function useVerticalNavigationItem() {\n return useContext(VerticalNavigationItemContext);\n}\n\nexport const VerticalNavigationItem = forwardRef<\n HTMLLIElement,\n VerticalNavigationItemProps\n>(function VerticalNavigationItem(props, ref) {\n const { children, className, active = false, style, ...rest } = props;\n\n const { depth } = useSubMenuContext();\n const [focusVisible, setFocusVisible] = useState(false);\n\n const context = useMemo(\n () => ({\n active,\n focusVisible,\n setFocusVisible,\n }),\n [active, focusVisible],\n );\n\n return (\n <VerticalNavigationItemContext.Provider value={context}>\n <li\n ref={ref}\n className={clsx(withBaseName(), className)}\n style={\n { \"--verticalNavigationItem-depth\": depth, ...style } as CSSProperties\n }\n {...rest}\n >\n {children}\n </li>\n </VerticalNavigationItemContext.Provider>\n );\n});\n"],"names":["makePrefixer","createContext","useContext","forwardRef","VerticalNavigationItem","useSubMenuContext","useState","useMemo","jsx","clsx"],"mappings":";;;;;;;;AAmBA,MAAM,YAAA,GAAeA,kBAAa,4BAA4B,CAAA;AAQ9D,MAAM,6BACJ,GAAAC,kBAAA;AAAA,EACE,mCAAA;AAAA,EACA;AAAA,IACE,MAAQ,EAAA,KAAA;AAAA,IACR,YAAc,EAAA,KAAA;AAAA,IACd,iBAAiB,MAAM;AAAA;AAAC;AAE5B,CAAA;AAEK,SAAS,yBAA4B,GAAA;AAC1C,EAAA,OAAOC,iBAAW,6BAA6B,CAAA;AACjD;AAEO,MAAM,sBAAyB,GAAAC,gBAAA,CAGpC,SAASC,uBAAAA,CAAuB,OAAO,GAAK,EAAA;AAC5C,EAAM,MAAA,EAAE,UAAU,SAAW,EAAA,MAAA,GAAS,OAAO,KAAO,EAAA,GAAG,MAAS,GAAA,KAAA;AAEhE,EAAM,MAAA,EAAE,KAAM,EAAA,GAAIC,gCAAkB,EAAA;AACpC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,OAAU,GAAAC,aAAA;AAAA,IACd,OAAO;AAAA,MACL,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAEA,EAAA,uBACGC,cAAA,CAAA,6BAAA,CAA8B,QAA9B,EAAA,EAAuC,OAAO,OAC7C,EAAA,QAAA,kBAAAA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,KACE,EAAA,EAAE,gCAAkC,EAAA,KAAA,EAAO,GAAG,KAAM,EAAA;AAAA,MAErD,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GAEL,EAAA,CAAA;AAEJ,CAAC;;;;;"}
|
|
@@ -14,7 +14,11 @@ import css_248z from './AppHeader.css.js';
|
|
|
14
14
|
|
|
15
15
|
const withBaseName = makePrefixer("saltAppHeader");
|
|
16
16
|
const AppHeader = forwardRef(
|
|
17
|
-
({
|
|
17
|
+
({
|
|
18
|
+
children,
|
|
19
|
+
className
|
|
20
|
+
// ...rest
|
|
21
|
+
}, ref) => {
|
|
18
22
|
const targetWindow = useWindow();
|
|
19
23
|
useComponentCssInjection({
|
|
20
24
|
testId: "salt-app-header",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppHeader.js","sources":["../src/app-header/AppHeader.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { MenuIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\nimport { Toolbar } from \"../toolbar\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltAppHeader\");\n\nexport type AppHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const AppHeader = forwardRef<HTMLDivElement, AppHeaderProps>(\n ({
|
|
1
|
+
{"version":3,"file":"AppHeader.js","sources":["../src/app-header/AppHeader.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { MenuIcon } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\nimport { Toolbar } from \"../toolbar\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltAppHeader\");\n\nexport type AppHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const AppHeader = forwardRef<HTMLDivElement, AppHeaderProps>(\n (\n {\n children,\n className,\n // ...rest\n },\n ref,\n ) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-app-header\",\n css: appHeaderCss,\n window: targetWindow,\n });\n\n // const [innerContainerRef, overflowedItems] = useOverflowObserver(\n // \"horizontal\",\n // null\n // );\n\n return (\n <Toolbar\n className={clsx(withBaseName(), className)}\n ref={ref}\n overflowButtonIcon={<MenuIcon />}\n // OverflowButtonProps={{ align: \"start\" }}\n >\n {children}\n </Toolbar>\n );\n // return (\n // <div className={clsx(withBaseName(), className)} ref={ref} {...rest}>\n // <div className={withBaseName(\"innerContainer\")} ref={innerContainerRef}>\n // <OverflowMenu\n // className={withBaseName(\"navMenu\")}\n // IconComponent={MenuIcon}\n // source={overflowedItems}\n // />\n // {children}\n // </div>\n // </div>\n // );\n },\n);\n"],"names":["appHeaderCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,eAAe,CAAA;AAI1C,MAAM,SAAY,GAAA,UAAA;AAAA,EACvB,CACE;AAAA,IACE,QAAA;AAAA,IACA;AAAA;AAAA,KAGF,GACG,KAAA;AACH,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,iBAAA;AAAA,MACR,GAAK,EAAAA,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAOD,IACE,uBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,GAAA;AAAA,QACA,kBAAA,sBAAqB,QAAS,EAAA,EAAA,CAAA;AAAA,QAG7B;AAAA;AAAA,KACH;AAAA;AAeN;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumb.js","sources":["../src/breadcrumbs/Breadcrumb.tsx"],"sourcesContent":["import { Link, makePrefixer, Text, type TooltipProps } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n type ComponentType,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport breadcrumbCss from \"./Breadcrumb.css\";\nimport { useBreadcrumbsContext } from \"./internal/BreadcrumbsContext\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumb\");\n\nexport interface BreadcrumbProps {\n children?: ReactNode;\n ContainerProps?: HTMLAttributes<HTMLLIElement>;\n tooltipText?: string;\n tooltipProps?: TooltipProps;\n className?: string;\n href?: string;\n isCurrentLevel?: boolean;\n maxWidth?: number;\n minWidth?: number;\n
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sources":["../src/breadcrumbs/Breadcrumb.tsx"],"sourcesContent":["import { Link, makePrefixer, Text, type TooltipProps } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n type ComponentType,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport type { CascadingMenuProps } from \"../cascading-menu/CascadingMenuProps\";\nimport breadcrumbCss from \"./Breadcrumb.css\";\nimport { useBreadcrumbsContext } from \"./internal/BreadcrumbsContext\";\n\nconst withBaseName = makePrefixer(\"saltBreadcrumb\");\n\nexport interface BreadcrumbProps\n extends Pick<CascadingMenuProps, \"onItemClick\"> {\n children?: ReactNode;\n ContainerProps?: HTMLAttributes<HTMLLIElement>;\n tooltipText?: string;\n tooltipProps?: TooltipProps;\n className?: string;\n href?: string;\n isCurrentLevel?: boolean;\n maxWidth?: number;\n minWidth?: number;\n overflowLabel?: string;\n Icon?: ComponentType<IconProps>;\n}\n\nexport const Breadcrumb = forwardRef<HTMLLIElement, BreadcrumbProps>(\n function Breadcrumb(\n {\n children,\n ContainerProps = {},\n tooltipText,\n tooltipProps,\n isCurrentLevel,\n onItemClick,\n overflowLabel,\n maxWidth,\n Icon,\n minWidth,\n className,\n ...props\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-breadcrumb\",\n css: breadcrumbCss,\n window: targetWindow,\n });\n\n const { itemsMaxWidth, itemsMinWidth, liClass } = useBreadcrumbsContext();\n\n const hasChildren = Children.count(children) !== 0;\n const hasOnlyIcon = Icon && !hasChildren;\n\n const getDefaultBreadcrumb = () =>\n isCurrentLevel ? (\n <Text\n maxRows={1}\n className={clsx(\n withBaseName(),\n className,\n withBaseName(\"currentLevel\"),\n )}\n styleAs=\"label\"\n >\n {children}\n </Text>\n ) : (\n <div\n className={clsx(\n withBaseName(),\n className,\n {\n [withBaseName(\"justifyContentCenter\")]: hasOnlyIcon,\n },\n withBaseName(\"regular\"),\n )}\n >\n {Icon && <Icon className={withBaseName(\"icon\")} />}\n {hasChildren && (\n <Link maxRows={1} styleAs=\"label\" {...props}>\n {children}\n </Link>\n )}\n </div>\n );\n\n const content = getDefaultBreadcrumb();\n\n const {\n style: containerStyle,\n className: containerClassName,\n ...containerPropsRest\n } = ContainerProps;\n\n return (\n <li\n ref={ref}\n style={{\n ...containerStyle,\n minWidth: minWidth ?? itemsMinWidth,\n maxWidth: maxWidth ?? itemsMaxWidth,\n }}\n className={clsx(liClass, containerClassName)}\n {...containerPropsRest}\n >\n {content}\n </li>\n );\n },\n);\n"],"names":["Breadcrumb","breadcrumbCss"],"mappings":";;;;;;;;;AAgBA,MAAM,YAAA,GAAe,aAAa,gBAAgB,CAAA;AAiB3C,MAAM,UAAa,GAAA,UAAA;AAAA,EACxB,SAASA,WACP,CAAA;AAAA,IACE,QAAA;AAAA,IACA,iBAAiB,EAAC;AAAA,IAClB,WAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,iBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,aAAA,EAAe,aAAe,EAAA,OAAA,KAAY,qBAAsB,EAAA;AAExE,IAAA,MAAM,WAAc,GAAA,QAAA,CAAS,KAAM,CAAA,QAAQ,CAAM,KAAA,CAAA;AACjD,IAAM,MAAA,WAAA,GAAc,QAAQ,CAAC,WAAA;AAE7B,IAAM,MAAA,oBAAA,GAAuB,MAC3B,cACE,mBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA,CAAA;AAAA,QACT,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,SAAA;AAAA,UACA,aAAa,cAAc;AAAA,SAC7B;AAAA,QACA,OAAQ,EAAA,OAAA;AAAA,QAEP;AAAA;AAAA,KAGH,mBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,IAAA;AAAA,UACT,YAAa,EAAA;AAAA,UACb,SAAA;AAAA,UACA;AAAA,YACE,CAAC,YAAA,CAAa,sBAAsB,CAAC,GAAG;AAAA,WAC1C;AAAA,UACA,aAAa,SAAS;AAAA,SACxB;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAS,GAAA,CAAA,IAAA,EAAA,EAAK,SAAW,EAAA,YAAA,CAAa,MAAM,CAAG,EAAA,CAAA;AAAA,UAC/C,WAAA,wBACE,IAAK,EAAA,EAAA,OAAA,EAAS,GAAG,OAAQ,EAAA,OAAA,EAAS,GAAG,KAAA,EACnC,QACH,EAAA;AAAA;AAAA;AAAA,KAEJ;AAGJ,IAAA,MAAM,UAAU,oBAAqB,EAAA;AAErC,IAAM,MAAA;AAAA,MACJ,KAAO,EAAA,cAAA;AAAA,MACP,SAAW,EAAA,kBAAA;AAAA,MACX,GAAG;AAAA,KACD,GAAA,cAAA;AAEJ,IACE,uBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAO,EAAA;AAAA,UACL,GAAG,cAAA;AAAA,UACH,UAAU,QAAY,IAAA,aAAA;AAAA,UACtB,UAAU,QAAY,IAAA;AAAA,SACxB;AAAA,QACA,SAAA,EAAW,IAAK,CAAA,OAAA,EAAS,kBAAkB,CAAA;AAAA,QAC1C,GAAG,kBAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
|
|
@@ -16,7 +16,16 @@ function insertSeparators(items, className, separator, hideCurrentLevel, shouldR
|
|
|
16
16
|
if (index < items.length - 1) {
|
|
17
17
|
return acc.concat(
|
|
18
18
|
current,
|
|
19
|
-
/* @__PURE__ */ jsx(
|
|
19
|
+
/* @__PURE__ */ jsx(
|
|
20
|
+
"li",
|
|
21
|
+
{
|
|
22
|
+
"aria-hidden": true,
|
|
23
|
+
className,
|
|
24
|
+
children: separator
|
|
25
|
+
},
|
|
26
|
+
`separator-${// biome-ignore lint/suspicious/noArrayIndexKey: Using index as key is acceptable here
|
|
27
|
+
index}`
|
|
28
|
+
)
|
|
20
29
|
);
|
|
21
30
|
}
|
|
22
31
|
const skipLastElement = hideCurrentLevel && shouldRenderAllItems || hideCurrentLevel && !shouldRenderAllItems && itemsAfterCollapse !== 0;
|
|
@@ -36,7 +45,7 @@ const Breadcrumbs = forwardRef(
|
|
|
36
45
|
itemsMinWidth: itemsMinWidthProp,
|
|
37
46
|
itemsMaxWidth,
|
|
38
47
|
wrap,
|
|
39
|
-
Menu,
|
|
48
|
+
Menu: _Menu,
|
|
40
49
|
SeparatorProps = {},
|
|
41
50
|
...other
|
|
42
51
|
} = props;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs.js","sources":["../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport type { BreadcrumbProps } from \"./Breadcrumb\";\nimport breadcrumbsCss from \"./Breadcrumbs.css\";\nimport { BreadcrumbsCollapsed } from \"./internal/BreadcrumbsCollapsed\";\nimport { BreadcrumbsContext } from \"./internal/BreadcrumbsContext\";\nimport { BreadcrumbsSeparator } from \"./internal/BreadcrumbsSeparator\";\n\nconst iconWidth = 12;\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbs\");\n\nfunction insertSeparators(\n items: ReactNode[],\n className?: string,\n separator?: ReactNode,\n hideCurrentLevel?: boolean,\n shouldRenderAllItems?: boolean,\n itemsAfterCollapse?: number,\n) {\n return items.reduce((acc: ReactNode[], current: ReactNode, index: number) => {\n if (index < items.length - 1) {\n return acc.concat(\n current,\n <li
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.js","sources":["../src/breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n type ComponentType,\n cloneElement,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport type { BreadcrumbProps } from \"./Breadcrumb\";\nimport breadcrumbsCss from \"./Breadcrumbs.css\";\nimport { BreadcrumbsCollapsed } from \"./internal/BreadcrumbsCollapsed\";\nimport { BreadcrumbsContext } from \"./internal/BreadcrumbsContext\";\nimport { BreadcrumbsSeparator } from \"./internal/BreadcrumbsSeparator\";\n\nconst iconWidth = 12;\n\nconst withBaseName = makePrefixer(\"saltBreadcrumbs\");\n\nfunction insertSeparators(\n items: ReactNode[],\n className?: string,\n separator?: ReactNode,\n hideCurrentLevel?: boolean,\n shouldRenderAllItems?: boolean,\n itemsAfterCollapse?: number,\n) {\n return items.reduce((acc: ReactNode[], current: ReactNode, index: number) => {\n if (index < items.length - 1) {\n return acc.concat(\n current,\n <li\n aria-hidden\n className={className}\n key={`separator-${\n // biome-ignore lint/suspicious/noArrayIndexKey: Using index as key is acceptable here\n index\n }`}\n >\n {separator}\n </li>,\n );\n }\n const skipLastElement =\n (hideCurrentLevel && shouldRenderAllItems) ||\n (hideCurrentLevel && !shouldRenderAllItems && itemsAfterCollapse !== 0);\n return skipLastElement ? acc : acc.concat(current);\n }, []);\n}\n\nexport interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n Menu?: ComponentType;\n SeparatorProps?: IconProps;\n hideCurrentLevel?: boolean;\n itemsAfterCollapse?: number;\n itemsBeforeCollapse?: number;\n itemsMaxWidth?: number | string;\n itemsMinWidth?: number | string;\n maxItems?: number;\n separator?: ReactNode;\n wrap?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(\n function Breadcrumbs(props, ref) {\n const {\n children,\n className,\n itemsAfterCollapse = 1,\n itemsBeforeCollapse = 1,\n maxItems = 3,\n separator: separatorProp,\n hideCurrentLevel,\n itemsMinWidth: itemsMinWidthProp,\n itemsMaxWidth,\n wrap,\n Menu: _Menu,\n SeparatorProps = {},\n ...other\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-breadcrumbs\",\n css: breadcrumbsCss,\n window: targetWindow,\n });\n\n const itemsMinWidth =\n itemsMinWidthProp != null ? itemsMinWidthProp : iconWidth;\n\n const breadcrumbsContext = useMemo(\n () => ({\n wrap,\n itemsMinWidth,\n itemsMaxWidth,\n liClass: withBaseName(\"li\"),\n }),\n [wrap, itemsMaxWidth, itemsMinWidth],\n );\n\n const separator = separatorProp || (\n <BreadcrumbsSeparator {...SeparatorProps} />\n );\n\n const childrenArray = Children.toArray(children);\n const shouldRenderAllItems =\n wrap || maxItems == null || childrenArray.length <= maxItems;\n\n const allItems = childrenArray\n .filter(isValidElement)\n .map((child, index) => {\n const isLastChild = index === childrenArray.length - 1;\n\n return cloneElement(child, {\n isCurrentLevel: isLastChild,\n } as BreadcrumbProps);\n });\n\n const renderItemsBeforeAndAfter = () => {\n // This defends against someone passing weird input, to ensure that if all\n // items would be shown anyway, we just show all items without the EllipsisItem\n if (itemsBeforeCollapse + itemsAfterCollapse >= allItems.length) {\n console.warn(\n [\n \"You have provided an invalid combination of properties to the Breadcrumbs.\",\n `itemsAfterCollapse={${itemsAfterCollapse}} +itemsBeforeCollapse={${itemsBeforeCollapse}} >= maxItems={${maxItems}}`,\n ].join(\"\\n\"),\n );\n return allItems;\n }\n\n const hiddenItems = allItems.slice(\n itemsBeforeCollapse,\n allItems.length - itemsAfterCollapse,\n );\n return [\n ...allItems.slice(0, itemsBeforeCollapse),\n <li className={withBaseName(\"li\")} key=\"breadcrumbs-collapsed\">\n <BreadcrumbsCollapsed\n accessibleText={`Breadcrumb levels ${itemsBeforeCollapse + 1} to ${\n allItems.length - itemsAfterCollapse\n }`}\n className={withBaseName(\"overflowButton\")}\n >\n {hiddenItems}\n </BreadcrumbsCollapsed>\n </li>,\n ...allItems.slice(\n allItems.length - itemsAfterCollapse,\n allItems.length,\n ),\n ];\n };\n\n const itemsToRender = shouldRenderAllItems\n ? allItems\n : renderItemsBeforeAndAfter();\n return (\n <BreadcrumbsContext.Provider value={breadcrumbsContext}>\n <nav\n aria-label=\"Breadcrumb\"\n className={clsx(withBaseName(), className)}\n data-testid=\"breadcrumbs\"\n ref={ref}\n {...other}\n >\n <ol\n className={clsx(withBaseName(\"ol\"), {\n [withBaseName(\"ol-wrap\")]: wrap,\n })}\n >\n {insertSeparators(\n itemsToRender,\n withBaseName(\"separator\"),\n separator,\n hideCurrentLevel,\n shouldRenderAllItems,\n itemsAfterCollapse,\n )}\n </ol>\n </nav>\n </BreadcrumbsContext.Provider>\n );\n },\n);\n"],"names":["Breadcrumbs","breadcrumbsCss"],"mappings":"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"}
|
|
@@ -26,12 +26,9 @@ const BreadcrumbsCollapsed = ({
|
|
|
26
26
|
const { overflowLabel, tooltipText, children: children2 } = child.props;
|
|
27
27
|
return overflowLabel || tooltipText || String(children2);
|
|
28
28
|
}, []);
|
|
29
|
-
const onItemClick = useCallback(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
[shouldFocusOnMount]
|
|
34
|
-
);
|
|
29
|
+
const onItemClick = useCallback(() => {
|
|
30
|
+
shouldFocusOnMount.current = true;
|
|
31
|
+
}, [shouldFocusOnMount]);
|
|
35
32
|
const menuItems = [];
|
|
36
33
|
Children.forEach(children, (x) => {
|
|
37
34
|
if (isValidElement(x)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BreadcrumbsCollapsed.js","sources":["../src/breadcrumbs/internal/BreadcrumbsCollapsed.tsx"],"sourcesContent":["import { useIcon } from \"@salt-ds/core\";\nimport {\n Children,\n type Component,\n isValidElement,\n type
|
|
1
|
+
{"version":3,"file":"BreadcrumbsCollapsed.js","sources":["../src/breadcrumbs/internal/BreadcrumbsCollapsed.tsx"],"sourcesContent":["import { useIcon } from \"@salt-ds/core\";\nimport {\n Children,\n type Component,\n isValidElement,\n type ReactNode,\n useCallback,\n} from \"react\";\nimport type { CascadingMenuProps, MenuDescriptor } from \"../../cascading-menu\";\nimport { MenuButton, type MenuButtonProps } from \"../../menu-button\";\nimport type { BreadcrumbProps } from \"../Breadcrumb\";\nimport { useFocusMenuRemount } from \"./useFocusMenuRemount\";\n\nexport interface BreadcrumbsCollapsedProps\n extends Omit<MenuButtonProps, \"CascadingMenuProps\"> {\n CascadingMenuProps?: CascadingMenuProps;\n accessibleText?: string;\n children: ReactNode;\n className?: string;\n}\n\nexport const BreadcrumbsCollapsed = ({\n children,\n CascadingMenuProps,\n accessibleText,\n ...rest\n}: BreadcrumbsCollapsedProps) => {\n const keys = Children.map(children, (child) => {\n if (isValidElement(child)) {\n return child.key;\n }\n return \"\";\n });\n\n const { OverflowIcon } = useIcon();\n const key = keys ? keys.join(\"\") : \"\";\n const { ref, shouldFocusOnMount } =\n useFocusMenuRemount<HTMLButtonElement>(key);\n\n const itemToString = useCallback((child: Component<BreadcrumbProps>) => {\n if (!child) {\n return \"\";\n }\n const { overflowLabel, tooltipText, children } = child.props;\n return overflowLabel || tooltipText || String(children);\n }, []) as (item: MenuDescriptor) => string;\n\n const onItemClick = useCallback((): void => {\n shouldFocusOnMount.current = true;\n }, [shouldFocusOnMount]);\n\n const menuItems: MenuDescriptor[] = [];\n Children.forEach(children, (x) => {\n if (isValidElement(x)) {\n menuItems.push({ props: x.props } as MenuDescriptor);\n }\n });\n\n return (\n <MenuButton\n CascadingMenuProps={{\n initialSource: {\n // Only `props` is required for `itemToString`. Otherwise causing circular JSON conversion in useControlled.js\n // This is not reproducible in unit tests, where react / react-dom is partially mocked without circular reference\n menuItems,\n },\n itemToString,\n onItemClick,\n minWidth: 0,\n ...CascadingMenuProps,\n }}\n hideCaret\n {...rest}\n ref={ref}\n >\n <OverflowIcon />\n </MenuButton>\n );\n};\n"],"names":["children"],"mappings":";;;;;;AAqBO,MAAM,uBAAuB,CAAC;AAAA,EACnC,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAG;AACL,CAAiC,KAAA;AAC/B,EAAA,MAAM,IAAO,GAAA,QAAA,CAAS,GAAI,CAAA,QAAA,EAAU,CAAC,KAAU,KAAA;AAC7C,IAAI,IAAA,cAAA,CAAe,KAAK,CAAG,EAAA;AACzB,MAAA,OAAO,KAAM,CAAA,GAAA;AAAA;AAEf,IAAO,OAAA,EAAA;AAAA,GACR,CAAA;AAED,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,OAAQ,EAAA;AACjC,EAAA,MAAM,GAAM,GAAA,IAAA,GAAO,IAAK,CAAA,IAAA,CAAK,EAAE,CAAI,GAAA,EAAA;AACnC,EAAA,MAAM,EAAE,GAAA,EAAK,kBAAmB,EAAA,GAC9B,oBAAuC,GAAG,CAAA;AAE5C,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,CAAC,KAAsC,KAAA;AACtE,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAO,OAAA,EAAA;AAAA;AAET,IAAA,MAAM,EAAE,aAAe,EAAA,WAAA,EAAa,QAAAA,EAAAA,SAAAA,KAAa,KAAM,CAAA,KAAA;AACvD,IAAO,OAAA,aAAA,IAAiB,WAAe,IAAA,MAAA,CAAOA,SAAQ,CAAA;AAAA,GACxD,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,WAAA,GAAc,YAAY,MAAY;AAC1C,IAAA,kBAAA,CAAmB,OAAU,GAAA,IAAA;AAAA,GAC/B,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,MAAM,YAA8B,EAAC;AACrC,EAAS,QAAA,CAAA,OAAA,CAAQ,QAAU,EAAA,CAAC,CAAM,KAAA;AAChC,IAAI,IAAA,cAAA,CAAe,CAAC,CAAG,EAAA;AACrB,MAAA,SAAA,CAAU,IAAK,CAAA,EAAE,KAAO,EAAA,CAAA,CAAE,OAAyB,CAAA;AAAA;AACrD,GACD,CAAA;AAED,EACE,uBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,kBAAoB,EAAA;AAAA,QAClB,aAAe,EAAA;AAAA;AAAA;AAAA,UAGb;AAAA,SACF;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAU,EAAA,CAAA;AAAA,QACV,GAAG;AAAA,OACL;AAAA,MACA,SAAS,EAAA,IAAA;AAAA,MACR,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MAEA,8BAAC,YAAa,EAAA,EAAA;AAAA;AAAA,GAChB;AAEJ;;;;"}
|
|
@@ -154,7 +154,7 @@ const ButtonBar = forwardRef(
|
|
|
154
154
|
alignedIndex: secondaryChildAlignment.index,
|
|
155
155
|
align: secondaryChildAlignment.align
|
|
156
156
|
}),
|
|
157
|
-
[
|
|
157
|
+
[secondaryChildAlignment.align, secondaryChildAlignment.index]
|
|
158
158
|
);
|
|
159
159
|
return /* @__PURE__ */ jsx(ButtonBarContext.Provider, { value: buttonBarContextValue, children: /* @__PURE__ */ jsx(DescendantProvider, { items: childrenData, setItems: setChildrenData, children: /* @__PURE__ */ jsx(
|
|
160
160
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ButtonBar.js","sources":["../src/button-bar/ButtonBar.tsx"],"sourcesContent":["import { type ButtonVariant, makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport buttonBarCss from \"./ButtonBar.css\";\nimport { ButtonBarContext } from \"./internal/ButtonBarContext\";\nimport { DescendantProvider } from \"./internal/DescendantContext\";\nimport { useDescendants } from \"./internal/useDescendants\";\n\nexport type PartialRecord<K extends keyof any, T> = Partial<Record<K, T>>;\n\ntype ButtonBarOrderKey = \"order\" | \"alignLeftOrder\" | \"stackOrder\";\nexport type ButtonBarSortOrder = \"asc\" | \"desc\";\n\nexport const DefaultButtonsOrderByVariant: Record<\n ButtonVariant,\n Record<ButtonBarOrderKey, number>\n> = {\n cta: {\n order: 0,\n alignLeftOrder: 1,\n stackOrder: 2,\n },\n primary: {\n order: 1,\n alignLeftOrder: 2,\n stackOrder: 1,\n },\n secondary: {\n order: 2,\n alignLeftOrder: 0,\n stackOrder: 0,\n },\n};\n\ntype OrderedButtonData = { variant?: ButtonVariant } & PartialRecord<\n ButtonBarOrderKey,\n number\n>;\n\nfunction getPriorityForButton(\n item: OrderedButtonData,\n field: ButtonBarOrderKey,\n) {\n const variant = item?.variant || \"primary\";\n return item?.[field] ?? DefaultButtonsOrderByVariant[variant][field];\n}\nconst createComparatorForField = (\n field: ButtonBarOrderKey,\n sort: ButtonBarSortOrder,\n alignLeft: boolean,\n childrenData: Array<OrderedButtonData>,\n) => {\n let equalityResult: number;\n if (field === \"order\" || field === \"stackOrder\") {\n equalityResult = sort === \"asc\" ? 1 : 0;\n } else {\n equalityResult = alignLeft ? 1 : -1;\n }\n\n function createDescComparator(indexA: number, indexB: number) {\n const priorityA = getPriorityForButton(childrenData[indexA], field);\n const priorityB = getPriorityForButton(childrenData[indexB], field);\n if (priorityA == null && priorityB == null) {\n return 0;\n }\n if (priorityA == null) {\n return 1;\n }\n if (priorityB == null) {\n return -1;\n }\n if (priorityA === priorityB) {\n return equalityResult;\n }\n return priorityB - priorityA;\n }\n\n function createAscComparator(indexA: number, indexB: number) {\n return createDescComparator(indexA, indexB) * -1;\n }\n\n return sort === \"asc\" ? createAscComparator : createDescComparator;\n};\n\nfunction alignSecondaryChild(\n orderedChildrenData: Array<OrderedButtonData & { index: number }>,\n sortOrder: ButtonBarSortOrder,\n alignLeft: boolean,\n): { index?: number; align?: \"left\" | \"right\" } {\n const noSecondaryChildren = { index: undefined, align: undefined };\n if (sortOrder === \"asc\" || alignLeft) {\n const firstSecondaryChildIndex = orderedChildrenData.findIndex(\n (childData) => childData.variant === \"secondary\",\n );\n\n if (firstSecondaryChildIndex !== -1) {\n const originalChildIndex =\n orderedChildrenData[firstSecondaryChildIndex].index;\n return { index: originalChildIndex, align: \"right\" };\n }\n return noSecondaryChildren;\n }\n let index = orderedChildrenData.length;\n while (index--) {\n if (orderedChildrenData[index].variant === \"secondary\") {\n return { index: orderedChildrenData[index].index, align: \"left\" };\n }\n }\n return noSecondaryChildren;\n}\n\nexport interface ButtonBarProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * By default ButtonBar lays buttons from right to left horizontally ordering action buttons by order prop.\n * Use this prop to lay button from left to right instead.\n * Actions buttons will be ordered by alignLeftOrder prop.\n */\n alignLeft?: boolean;\n /**\n * A list of OrderButtons. Required to have some children.\n */\n children: ReactNode;\n /**\n * The className(s) of the component\n */\n className?: string;\n /**\n * By default ButtonBar aligns secondary buttons to the left while displayed horizontally\n * and to the right while aligned left or sorting ascending.\n * Use this prop to disable this behavior.\n */\n disableAutoAlignment?: boolean;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is NOT stacked and aligned left.\n */\n sortAlignLeft?: ButtonBarSortOrder;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is NOT stacked and NOT aligned left.\n */\n sortOrder?: ButtonBarSortOrder;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is stacked.\n */\n sortStackOrder?: ButtonBarSortOrder;\n /**\n * When the viewport is equal to or smaller than the breakpoint the buttons will be stacked vertically.\n * Alternatively pass a screen width number in pixels.\n * Use `0` to disable this feature. Defaults to 'xs'.\n * Actions buttons will be ordered by stackOrder prop.\n */\n stackAtBreakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n}\n\nconst withBaseName = makePrefixer(\"saltButtonBar\");\n\nexport const ButtonBar = forwardRef<HTMLDivElement, ButtonBarProps>(\n function ButtonBar(\n {\n alignLeft = false,\n children: childrenProp,\n className,\n disableAutoAlignment,\n sortAlignLeft = \"desc\",\n sortOrder = \"desc\",\n sortStackOrder = \"desc\",\n stackAtBreakpoint = \"xs\",\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-button-bar\",\n css: buttonBarCss,\n window: targetWindow,\n });\n\n const [childrenData, setChildrenData] = useDescendants<OrderedButtonData>();\n // TODO: we need a mechanism to work with breakpoints.\n const matches = false;\n\n const childrenArray = Children.toArray(childrenProp);\n const childrenIndexes = childrenArray.map((_, index) => index);\n const stackOrderComparator = createComparatorForField(\n \"stackOrder\",\n sortStackOrder,\n alignLeft,\n childrenData,\n );\n const orderComparator = createComparatorForField(\n \"order\",\n sortOrder,\n alignLeft,\n childrenData,\n );\n const alignLeftComparator = createComparatorForField(\n \"alignLeftOrder\",\n sortAlignLeft,\n alignLeft,\n childrenData,\n );\n\n let orderedChildrenIndexes: number[];\n\n if (childrenData.length !== childrenIndexes.length) {\n orderedChildrenIndexes = childrenIndexes;\n } else {\n orderedChildrenIndexes = matches\n ? childrenIndexes.sort(stackOrderComparator)\n : childrenIndexes.sort(\n alignLeft ? alignLeftComparator : orderComparator,\n );\n }\n\n let secondaryChildAlignment: { index?: number; align?: \"left\" | \"right\" } =\n {\n index: undefined,\n align: undefined,\n };\n if (!disableAutoAlignment) {\n secondaryChildAlignment = alignSecondaryChild(\n orderedChildrenIndexes.map((index) => ({\n index,\n ...childrenData[index],\n })),\n sortOrder,\n alignLeft,\n );\n }\n\n const hasSecondaryButtons = childrenData.some(\n (buttonData) => buttonData.variant === \"secondary\",\n );\n\n const orderedChildren = orderedChildrenIndexes.map(\n (index) => childrenArray[index],\n );\n\n const buttonBarContextValue = useMemo(\n () => ({\n matches,\n alignedIndex: secondaryChildAlignment.index,\n align: secondaryChildAlignment.align,\n }),\n [matches, secondaryChildAlignment.align, secondaryChildAlignment.index],\n );\n\n return (\n <ButtonBarContext.Provider value={buttonBarContextValue}>\n <DescendantProvider items={childrenData} setItems={setChildrenData}>\n <div\n aria-label=\"button bar\"\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"stacked\")]: matches,\n [withBaseName(\"alignLeft\")]: alignLeft,\n [withBaseName(\"autoAligning\")]:\n hasSecondaryButtons && !disableAutoAlignment,\n },\n className,\n )}\n ref={ref}\n role=\"region\"\n {...rest}\n >\n {orderedChildren}\n </div>\n </DescendantProvider>\n </ButtonBarContext.Provider>\n );\n },\n);\n"],"names":["ButtonBar","buttonBarCss"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ButtonBar.js","sources":["../src/button-bar/ButtonBar.tsx"],"sourcesContent":["import { type ButtonVariant, makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport buttonBarCss from \"./ButtonBar.css\";\nimport { ButtonBarContext } from \"./internal/ButtonBarContext\";\nimport { DescendantProvider } from \"./internal/DescendantContext\";\nimport { useDescendants } from \"./internal/useDescendants\";\n\n// biome-ignore lint/suspicious/noExplicitAny: any is used here to allow flexibility in the type of keys\nexport type PartialRecord<K extends keyof any, T> = Partial<Record<K, T>>;\n\ntype ButtonBarOrderKey = \"order\" | \"alignLeftOrder\" | \"stackOrder\";\nexport type ButtonBarSortOrder = \"asc\" | \"desc\";\n\nexport const DefaultButtonsOrderByVariant: Record<\n ButtonVariant,\n Record<ButtonBarOrderKey, number>\n> = {\n cta: {\n order: 0,\n alignLeftOrder: 1,\n stackOrder: 2,\n },\n primary: {\n order: 1,\n alignLeftOrder: 2,\n stackOrder: 1,\n },\n secondary: {\n order: 2,\n alignLeftOrder: 0,\n stackOrder: 0,\n },\n};\n\ntype OrderedButtonData = { variant?: ButtonVariant } & PartialRecord<\n ButtonBarOrderKey,\n number\n>;\n\nfunction getPriorityForButton(\n item: OrderedButtonData,\n field: ButtonBarOrderKey,\n) {\n const variant = item?.variant || \"primary\";\n return item?.[field] ?? DefaultButtonsOrderByVariant[variant][field];\n}\nconst createComparatorForField = (\n field: ButtonBarOrderKey,\n sort: ButtonBarSortOrder,\n alignLeft: boolean,\n childrenData: Array<OrderedButtonData>,\n) => {\n let equalityResult: number;\n if (field === \"order\" || field === \"stackOrder\") {\n equalityResult = sort === \"asc\" ? 1 : 0;\n } else {\n equalityResult = alignLeft ? 1 : -1;\n }\n\n function createDescComparator(indexA: number, indexB: number) {\n const priorityA = getPriorityForButton(childrenData[indexA], field);\n const priorityB = getPriorityForButton(childrenData[indexB], field);\n if (priorityA == null && priorityB == null) {\n return 0;\n }\n if (priorityA == null) {\n return 1;\n }\n if (priorityB == null) {\n return -1;\n }\n if (priorityA === priorityB) {\n return equalityResult;\n }\n return priorityB - priorityA;\n }\n\n function createAscComparator(indexA: number, indexB: number) {\n return createDescComparator(indexA, indexB) * -1;\n }\n\n return sort === \"asc\" ? createAscComparator : createDescComparator;\n};\n\nfunction alignSecondaryChild(\n orderedChildrenData: Array<OrderedButtonData & { index: number }>,\n sortOrder: ButtonBarSortOrder,\n alignLeft: boolean,\n): { index?: number; align?: \"left\" | \"right\" } {\n const noSecondaryChildren = { index: undefined, align: undefined };\n if (sortOrder === \"asc\" || alignLeft) {\n const firstSecondaryChildIndex = orderedChildrenData.findIndex(\n (childData) => childData.variant === \"secondary\",\n );\n\n if (firstSecondaryChildIndex !== -1) {\n const originalChildIndex =\n orderedChildrenData[firstSecondaryChildIndex].index;\n return { index: originalChildIndex, align: \"right\" };\n }\n return noSecondaryChildren;\n }\n let index = orderedChildrenData.length;\n while (index--) {\n if (orderedChildrenData[index].variant === \"secondary\") {\n return { index: orderedChildrenData[index].index, align: \"left\" };\n }\n }\n return noSecondaryChildren;\n}\n\nexport interface ButtonBarProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * By default ButtonBar lays buttons from right to left horizontally ordering action buttons by order prop.\n * Use this prop to lay button from left to right instead.\n * Actions buttons will be ordered by alignLeftOrder prop.\n */\n alignLeft?: boolean;\n /**\n * A list of OrderButtons. Required to have some children.\n */\n children: ReactNode;\n /**\n * The className(s) of the component\n */\n className?: string;\n /**\n * By default ButtonBar aligns secondary buttons to the left while displayed horizontally\n * and to the right while aligned left or sorting ascending.\n * Use this prop to disable this behavior.\n */\n disableAutoAlignment?: boolean;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is NOT stacked and aligned left.\n */\n sortAlignLeft?: ButtonBarSortOrder;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is NOT stacked and NOT aligned left.\n */\n sortOrder?: ButtonBarSortOrder;\n /**\n * By default ButtonBar sorts buttons in descending order.\n * Use this prop to change that when the button bar is stacked.\n */\n sortStackOrder?: ButtonBarSortOrder;\n /**\n * When the viewport is equal to or smaller than the breakpoint the buttons will be stacked vertically.\n * Alternatively pass a screen width number in pixels.\n * Use `0` to disable this feature. Defaults to 'xs'.\n * Actions buttons will be ordered by stackOrder prop.\n */\n stackAtBreakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n}\n\nconst withBaseName = makePrefixer(\"saltButtonBar\");\n\nexport const ButtonBar = forwardRef<HTMLDivElement, ButtonBarProps>(\n function ButtonBar(\n {\n alignLeft = false,\n children: childrenProp,\n className,\n disableAutoAlignment,\n sortAlignLeft = \"desc\",\n sortOrder = \"desc\",\n sortStackOrder = \"desc\",\n stackAtBreakpoint = \"xs\",\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-button-bar\",\n css: buttonBarCss,\n window: targetWindow,\n });\n\n const [childrenData, setChildrenData] = useDescendants<OrderedButtonData>();\n // TODO: we need a mechanism to work with breakpoints.\n const matches = false;\n\n const childrenArray = Children.toArray(childrenProp);\n const childrenIndexes = childrenArray.map((_, index) => index);\n const stackOrderComparator = createComparatorForField(\n \"stackOrder\",\n sortStackOrder,\n alignLeft,\n childrenData,\n );\n const orderComparator = createComparatorForField(\n \"order\",\n sortOrder,\n alignLeft,\n childrenData,\n );\n const alignLeftComparator = createComparatorForField(\n \"alignLeftOrder\",\n sortAlignLeft,\n alignLeft,\n childrenData,\n );\n\n let orderedChildrenIndexes: number[];\n\n if (childrenData.length !== childrenIndexes.length) {\n orderedChildrenIndexes = childrenIndexes;\n } else {\n orderedChildrenIndexes = matches\n ? childrenIndexes.sort(stackOrderComparator)\n : childrenIndexes.sort(\n alignLeft ? alignLeftComparator : orderComparator,\n );\n }\n\n let secondaryChildAlignment: { index?: number; align?: \"left\" | \"right\" } =\n {\n index: undefined,\n align: undefined,\n };\n if (!disableAutoAlignment) {\n secondaryChildAlignment = alignSecondaryChild(\n orderedChildrenIndexes.map((index) => ({\n index,\n ...childrenData[index],\n })),\n sortOrder,\n alignLeft,\n );\n }\n\n const hasSecondaryButtons = childrenData.some(\n (buttonData) => buttonData.variant === \"secondary\",\n );\n\n const orderedChildren = orderedChildrenIndexes.map(\n (index) => childrenArray[index],\n );\n\n const buttonBarContextValue = useMemo(\n () => ({\n matches,\n alignedIndex: secondaryChildAlignment.index,\n align: secondaryChildAlignment.align,\n }),\n [secondaryChildAlignment.align, secondaryChildAlignment.index],\n );\n\n return (\n <ButtonBarContext.Provider value={buttonBarContextValue}>\n <DescendantProvider items={childrenData} setItems={setChildrenData}>\n <div\n aria-label=\"button bar\"\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"stacked\")]: matches,\n [withBaseName(\"alignLeft\")]: alignLeft,\n [withBaseName(\"autoAligning\")]:\n hasSecondaryButtons && !disableAutoAlignment,\n },\n className,\n )}\n ref={ref}\n role=\"region\"\n {...rest}\n >\n {orderedChildren}\n </div>\n </DescendantProvider>\n </ButtonBarContext.Provider>\n );\n },\n);\n"],"names":["ButtonBar","buttonBarCss"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DescendantContext.js","sources":["../src/button-bar/internal/DescendantContext.tsx"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\n// Copied from https://gist.github.com/ryanflorence/10e9387f633f9d2e6f444a9bddaabf6e\nimport {\n createContext,\n type Dispatch,\n type MutableRefObject,\n type ReactNode,\n type SetStateAction,\n useRef,\n useState,\n} from \"react\";\n\n// //////////////////////////////////////////////////////////////////////////////\n// SUPER HACKS AHEAD: The React team will hate this enough to hopefully give us\n// a way to know the index of a descendant given a parent (will help generate\n// IDs for accessibility a long with the ability create maximally composable\n// component abstractions).\n//\n// This is all to avoid cloneElement. If we can avoid cloneElement then people\n// can have arbitrary markup around MenuItems. This basically takes advantage\n// of
|
|
1
|
+
{"version":3,"file":"DescendantContext.js","sources":["../src/button-bar/internal/DescendantContext.tsx"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\n// Copied from https://gist.github.com/ryanflorence/10e9387f633f9d2e6f444a9bddaabf6e\nimport {\n createContext,\n type Dispatch,\n type MutableRefObject,\n type ReactNode,\n type SetStateAction,\n useRef,\n useState,\n} from \"react\";\n\n// //////////////////////////////////////////////////////////////////////////////\n// SUPER HACKS AHEAD: The React team will hate this enough to hopefully give us\n// a way to know the index of a descendant given a parent (will help generate\n// IDs for accessibility a long with the ability create maximally composable\n// component abstractions).\n//\n// This is all to avoid cloneElement. If we can avoid cloneElement then people\n// can have arbitrary markup around MenuItems. This basically takes advantage\n// of React's render lifecycles to let us \"register\" descendants to an\n// ancestor, so that we can track all the descendants and manage focus on them,\n// etc. The super hacks here are for the child to know its index as well, so\n// that it can set attributes, match against state from above, etc.\ninterface DescendantProviderProps {\n children?: ReactNode;\n items: Record<string, any>[];\n setItems: Dispatch<SetStateAction<Record<string, any>[]>>;\n}\n\ninterface DescendantContextType {\n assigning?: MutableRefObject<boolean>;\n setItems?: DescendantProviderProps[\"setItems\"];\n}\nexport const DescendantContext = createContext<DescendantContextType>({});\n\nexport function DescendantProvider({\n items,\n setItems,\n ...props\n}: DescendantProviderProps) {\n // On the first render we say we're \"assigning\", and the children will push\n // into the array when they show up in their own useLayoutEffect.\n const assigning = useRef(true);\n\n // since children are pushed into the array in useLayoutEffect of the child,\n // children can't read their index on first render. So we need to cause a\n // second render so they can read their index.\n const [, forceUpdate] = useState<unknown>();\n\n // parent useLayoutEffect is always last\n // biome-ignore lint/correctness/useExhaustiveDependencies: We only want this to run when items change, not on every render\n useIsomorphicLayoutEffect(() => {\n if (assigning.current) {\n // At this point all of the children have pushed into the array so we set\n // assigning to false and force an update. Since we're in\n // useLayoutEffect, we won't get a flash of rendered content, it will all\n // happen synchronously. And now that this is false, children won't push\n // into the array on the forceUpdate\n assigning.current = false;\n forceUpdate({});\n } else {\n // After the forceUpdate completes, we end up here and set assigning back\n // to true for the next update from the app\n assigning.current = true;\n }\n return () => {\n // this cleanup function runs right before the next render, so it's the\n // right time to empty out the array to be reassigned with whatever shows\n // up next render.\n if (assigning.current) {\n // we only want to empty out the array before the next render cycle if\n // it was NOT the result of our forceUpdate, so being guarded behind\n // assigning.current works\n setItems([]);\n }\n };\n }, [items]);\n\n return (\n <DescendantContext.Provider {...props} value={{ setItems, assigning }} />\n );\n}\n"],"names":[],"mappings":";;;;AAkCa,MAAA,iBAAA,GAAoB,aAAqC,CAAA,EAAE;AAEjE,SAAS,kBAAmB,CAAA;AAAA,EACjC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAA4B,EAAA;AAG1B,EAAM,MAAA,SAAA,GAAY,OAAO,IAAI,CAAA;AAK7B,EAAA,MAAM,GAAG,WAAW,CAAA,GAAI,QAAkB,EAAA;AAI1C,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,UAAU,OAAS,EAAA;AAMrB,MAAA,SAAA,CAAU,OAAU,GAAA,KAAA;AACpB,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,KACT,MAAA;AAGL,MAAA,SAAA,CAAU,OAAU,GAAA,IAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AAIX,MAAA,IAAI,UAAU,OAAS,EAAA;AAIrB,QAAA,QAAA,CAAS,EAAE,CAAA;AAAA;AACb,KACF;AAAA,GACF,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EACE,uBAAA,GAAA,CAAC,iBAAkB,CAAA,QAAA,EAAlB,EAA4B,GAAG,OAAO,KAAO,EAAA,EAAE,QAAU,EAAA,SAAA,EAAa,EAAA,CAAA;AAE3E;;;;"}
|
|
@@ -294,7 +294,7 @@ function useCalendarSelection(props) {
|
|
|
294
294
|
const getFocusableDates = useCallback(() => {
|
|
295
295
|
const focusableDates = [];
|
|
296
296
|
if (Array.isArray(selectedDate)) {
|
|
297
|
-
|
|
297
|
+
for (const selection of selectedDate) {
|
|
298
298
|
if (isDateRangeSelection(selection)) {
|
|
299
299
|
if (selection.startDate && isDayVisible(selection.startDate)) {
|
|
300
300
|
focusableDates.push(selection.startDate);
|
|
@@ -304,7 +304,7 @@ function useCalendarSelection(props) {
|
|
|
304
304
|
} else if (isDayVisible(selection)) {
|
|
305
305
|
focusableDates.push(selection);
|
|
306
306
|
}
|
|
307
|
-
}
|
|
307
|
+
}
|
|
308
308
|
} else if (selectedDate) {
|
|
309
309
|
if (isDateRangeSelection(selectedDate)) {
|
|
310
310
|
if (selectedDate.startDate && isDayVisible(selectedDate.startDate)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport type {\n KeyboardEventHandler,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateDatesForMonth } from \"./internal/utils\";\n\n/**\n * Type representing a single date selection.\n * @template TDate - The type of the date object.\n */\nexport type SingleDateSelection<TDate extends DateFrameworkType> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<TDate extends DateFrameworkType> = {\n /**\n * The start date of the range.\n */\n startDate?: TDate | null;\n /**\n * The end date of the range.\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<TDate extends DateFrameworkType>(\n // biome-ignore lint/suspicious/noExplicitAny: date framework dependent\n value: any,\n): value is DateRangeSelection<TDate> {\n return (\n value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionBaseProps<\n TDate extends DateFrameworkType,\n> {\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate?: TDate | null;\n /**\n * The currently hovered date.\n */\n hoveredDate?: TDate | null;\n /**\n * Determines if a date is outside the allowed date range.\n * @param date - The date to check.\n * @returns `true` if the date is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedDates?: (date: TDate) => boolean;\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: TDate) => boolean;\n /**\n * Function to determine if a day is visible.\n * @param date - The date to check.\n * @returns `true` if the day is visible, otherwise `false`.\n */\n isDayVisible?: (date: TDate) => boolean;\n /**\n * Ref to attach to the focused element, enabling focus to be controlled.\n */\n focusedDateRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Callback fired when the focused date changes.\n * @param event - The synthetic event, if user event triggered focus or null.\n * @param date - The new focused date.\n */\n onFocusedDateChange?: (\n event: SyntheticEvent | null,\n date: TDate | null,\n ) => void;\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: TDate | null,\n ) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n /**\n * The currently visible month.\n */\n visibleMonth?: TDate;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n}\n\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * The currently selected date.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: SingleDateSelection<TDate> | null,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: SingleDateSelection<TDate> | null,\n newDate: SingleDateSelection<TDate> | null,\n ) => SingleDateSelection<TDate> | null;\n}\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<SingleDateSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n @param newDate\n */\n select?: (\n previousSelectedDate: Array<SingleDateSelection<TDate>>,\n newDate: TDate,\n ) => Array<SingleDateSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectRangeProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\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: TDate) => TDate;\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: TDate) => TDate;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDat\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\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: TDate) => TDate;\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: TDate) => TDate;\n}\n\n/**\n * UseCalendarSelection hook props, wth the selection variant determining the return type of the date selection\n * @template TDate - The type of the date object.\n */\nexport type UseCalendarSelectionProps<TDate extends DateFrameworkType> =\n | UseCalendarSelectionSingleProps<TDate>\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionRangeProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionOffsetProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate>;\n\nfunction isMultiselect<TDate>(\n props: UseCalendarSelectionProps<TDate>,\n): props is\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate> {\n return props.multiselect === true;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nfunction selectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<TDate>[],\n newDate: TDate,\n): DateRangeSelection<TDate>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection<TDate extends DateFrameworkType>(\n props: UseCalendarSelectionProps<TDate>,\n) {\n const {\n multiselect,\n focusedDate: focusedDateProp,\n hoveredDate: hoveredDateProp,\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n onHoveredDateChange,\n isDaySelectable = () => true,\n isDayVisible = () => true,\n isOutsideAllowedDates = () => true,\n focusedDateRef,\n onFocusedDateChange,\n select: selectProp,\n selectionVariant,\n timezone,\n visibleMonth,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\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: TDate) => {\n if (selectionVariant === \"offset\" && startDateOffset) {\n return startDateOffset(date);\n }\n return date;\n },\n [selectionVariant, startDateOffset],\n );\n\n const getEndDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && endDateOffset) {\n return endDateOffset(date);\n }\n return date;\n },\n [selectionVariant, endDateOffset],\n );\n\n const setSelectedDate = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newSelectedDate: TDate) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (TDate | null)\n | TDate[]\n | (DateRangeSelection<TDate> | null)\n | DateRangeSelection<TDate>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (isMultiselect(props)) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps<TDate>[\"select\"];\n const updatedSelection: Array<SingleDateSelection<TDate>> = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<TDate> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps<TDate>[\"select\"];\n const updatedSelection: SingleDateSelection<TDate> | null = select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (isMultiselect(props)) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (isMultiselect(props)) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n };\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n getEndDateOffset,\n getStartDateOffset,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n props, // Ensure props is included in the dependency array\n ],\n );\n\n const isSelected = useCallback(\n (date: TDate) => {\n if (!selectedDate) {\n return false;\n }\n\n const isSingleDateSelected = (element: SingleDateSelection<TDate>) =>\n dateAdapter.isSame(element, date, \"day\");\n\n const isDateRangeSelected = (range: DateRangeSelection<TDate>) =>\n range.startDate &&\n range.endDate &&\n dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, range.endDate) <= 0;\n\n if (Array.isArray(selectedDate)) {\n return selectedDate.some((element) =>\n isDateRangeSelection(element)\n ? isDateRangeSelected(element)\n : isSingleDateSelected(element as SingleDateSelection<TDate>),\n );\n }\n\n switch (selectionVariant) {\n case \"single\":\n return isSingleDateSelected(\n selectedDate as SingleDateSelection<TDate>,\n );\n case \"range\":\n case \"offset\":\n return isDateRangeSelected(selectedDate as DateRangeSelection<TDate>);\n default:\n return false;\n }\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const getDefaultFocusedDate = () => {\n if (\n selectedDate &&\n (selectionVariant === \"range\" || selectionVariant === \"offset\")\n ) {\n const getFocusableDate = (\n result: TDate[],\n selection: DateRangeSelection<TDate>,\n ) => {\n if (selection?.startDate && isDayVisible(selection.startDate)) {\n return [...result, selection.startDate];\n }\n if (selection?.endDate && isDayVisible(selection.endDate)) {\n return [...result, selection.endDate];\n }\n return result;\n };\n let focusableSelectedDates:\n | DateRangeSelection<TDate>\n | DateRangeSelection<TDate>[];\n if (!multiselect) {\n focusableSelectedDates = [selectedDate as DateRangeSelection<TDate>];\n } else {\n focusableSelectedDates = selectedDate as DateRangeSelection<TDate>[];\n }\n const selectionInMonth = focusableSelectedDates\n .reduce(getFocusableDate, [])\n .sort((a, b) => dateAdapter.compare(a, b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (selectedDate && selectionVariant === \"single\") {\n const focusableSelectedDate = multiselect\n ? (selectedDate as SingleDateSelection<TDate>[])?.[0]\n : (selectedDate as SingleDateSelection<TDate>);\n if (focusableSelectedDate && isDayVisible(focusableSelectedDate)) {\n return focusableSelectedDate;\n }\n }\n\n // Defaults\n if (\n isDaySelectable?.(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n return dateAdapter.today(timezone);\n }\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable?.(visibleDay));\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n };\n\n const [focusedDate, setFocusedDateState] = useControlled({\n controlled: focusedDateProp,\n default: useMemo(getDefaultFocusedDate, []),\n name: \"Calendar\",\n state: \"focusedDate\",\n });\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent | null, date: TDate | null) => {\n if (focusedDateRef && event?.target instanceof HTMLElement) {\n focusedDateRef.current = event.target;\n }\n if (\n date &&\n ((focusedDate && dateAdapter.isSame(date, focusedDate, \"day\")) ||\n isOutsideAllowedDates(date))\n ) {\n return;\n }\n setFocusedDateState(date);\n onFocusedDateChange?.(event, date);\n },\n [\n dateAdapter,\n focusedDate,\n focusedDateRef,\n isOutsideAllowedDates,\n onFocusedDateChange,\n ],\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: TDate | null) => {\n setHoveredDateState(date);\n onHoveredDateChange?.(event, date);\n },\n [onHoveredDateChange],\n );\n\n const isHovered = useCallback(\n (date: TDate) => {\n return !!hoveredDate && dateAdapter.isSame(date, hoveredDate, \"day\");\n },\n [dateAdapter, hoveredDate],\n );\n\n const getFocusableDates = useCallback(() => {\n const focusableDates: TDate[] = [];\n\n if (Array.isArray(selectedDate)) {\n // Handle array of selections\n selectedDate.forEach((selection) => {\n if (isDateRangeSelection(selection)) {\n if (selection.startDate && isDayVisible(selection.startDate)) {\n focusableDates.push(selection.startDate);\n } else if (selection.endDate && isDayVisible(selection.endDate)) {\n focusableDates.push(selection.endDate);\n }\n } else if (isDayVisible(selection as TDate)) {\n focusableDates.push(selection as TDate);\n }\n });\n } else if (selectedDate) {\n // Handle single selection\n if (isDateRangeSelection(selectedDate)) {\n if (selectedDate.startDate && isDayVisible(selectedDate.startDate)) {\n focusableDates.push(selectedDate.startDate);\n } else if (selectedDate.endDate && isDayVisible(selectedDate.endDate)) {\n focusableDates.push(selectedDate.endDate);\n }\n } else if (isDayVisible(selectedDate)) {\n focusableDates.push(selectedDate);\n }\n }\n\n if (\n focusedDate &&\n visibleMonth &&\n dateAdapter.isSame(focusedDate, visibleMonth, \"month\")\n ) {\n focusableDates.push(focusedDate);\n return focusableDates;\n }\n\n // Defaults\n if (\n focusableDates.length === 0 &&\n isDaySelectable(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n focusableDates.push(dateAdapter.today(timezone));\n }\n if (focusableDates.length === 0 || !focusableDates.some(isDayVisible)) {\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable(visibleDay));\n if (firstSelectableDate) {\n focusableDates.push(firstSelectableDate);\n }\n }\n\n return focusableDates;\n }, [\n dateAdapter,\n focusedDate,\n isDaySelectable,\n isDayVisible,\n selectedDate,\n timezone,\n visibleMonth,\n ]);\n\n const isSelectedSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n hoveredDate\n ) {\n const isForwardRange =\n dateAdapter.compare(hoveredDate, range.startDate) >= 0 &&\n ((dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, hoveredDate) <= 0) ||\n dateAdapter.isSame(date, hoveredDate, \"day\"));\n\n const isValidDayHovered =\n !isDaySelectable || isDaySelectable(hoveredDate);\n\n return isForwardRange && isValidDayHovered;\n }\n return false;\n });\n },\n [\n dateAdapter,\n isOutsideAllowedDates,\n selectionVariant,\n selectedDate,\n hoveredDate,\n isDaySelectable,\n ],\n );\n\n const isSelectedStart = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !isOutsideAllowedDates(range.startDate)\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredOffset = useCallback(\n (date: TDate) => {\n if (hoveredDate && selectionVariant === \"offset\") {\n const startDate = getStartDateOffset(hoveredDate);\n const endDate = getEndDateOffset(hoveredDate);\n\n return (\n dateAdapter.compare(date, startDate) >= 0 &&\n dateAdapter.compare(date, endDate) <= 0 &&\n (!isDaySelectable || isDaySelectable(date))\n );\n }\n\n return false;\n },\n [\n dateAdapter,\n getStartDateOffset,\n getEndDateOffset,\n hoveredDate,\n isDaySelectable,\n selectionVariant,\n ],\n );\n\n return useMemo(\n () => ({\n state: {\n focusedDate,\n focusedDateRef,\n hoveredDate,\n selectedDate,\n focusableDates: getFocusableDates(),\n },\n helpers: {\n isSelected,\n setSelectedDate,\n isHovered,\n setHoveredDate,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n },\n }),\n [\n selectedDate,\n focusedDate,\n focusedDateRef,\n getFocusableDates,\n hoveredDate,\n isSelected,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n setHoveredDate,\n setSelectedDate,\n ],\n );\n}\n\nexport function useCalendarSelectionDay<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const {\n helpers: {\n setSelectedDate,\n isSelected,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHovered,\n isHoveredOffset,\n isDaySelectable,\n },\n } = useCalendarContext<TDate>();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const 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 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
|
+
{"version":3,"file":"useCalendarSelection.js","sources":["../src/calendar/useCalendarSelection.ts"],"sourcesContent":["import { makePrefixer, useControlled } from \"@salt-ds/core\";\nimport type {\n DateFrameworkType,\n SaltDateAdapter,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport type {\n KeyboardEventHandler,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useCalendarContext } from \"./internal/CalendarContext\";\nimport { generateDatesForMonth } from \"./internal/utils\";\n\n/**\n * Type representing a single date selection.\n * @template TDate - The type of the date object.\n */\nexport type SingleDateSelection<TDate extends DateFrameworkType> = TDate;\n\n/**\n * Type representing a date range selection.\n * @template TDate - The type of the date object.\n */\nexport type DateRangeSelection<TDate extends DateFrameworkType> = {\n /**\n * The start date of the range.\n */\n startDate?: TDate | null;\n /**\n * The end date of the range.\n */\n endDate?: TDate | null;\n};\n\n/**\n * Checks if a value is a date range selection.\n * @template TDate - The type of the date object.\n * @param value - The value to check.\n * @returns `true` if the value is a date range selection, otherwise `false`.\n */\nexport function isDateRangeSelection<TDate extends DateFrameworkType>(\n // biome-ignore lint/suspicious/noExplicitAny: date framework dependent\n value: any,\n): value is DateRangeSelection<TDate> {\n return (\n value &&\n !Array.isArray(value) &&\n typeof value === \"object\" &&\n (\"startDate\" in value || \"endDate\" in value)\n );\n}\n\n/**\n * Base properties for calendar UseCalendarSelection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionBaseProps<\n TDate extends DateFrameworkType,\n> {\n /**\n * The currently focused date in the calendar, or null if no date is focused.\n */\n focusedDate?: TDate | null;\n /**\n * The currently hovered date.\n */\n hoveredDate?: TDate | null;\n /**\n * Determines if a date is outside the allowed date range.\n * @param date - The date to check.\n * @returns `true` if the date is outside the allowed range, otherwise `false`.\n */\n isOutsideAllowedDates?: (date: TDate) => boolean;\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: TDate) => boolean;\n /**\n * Function to determine if a day is visible.\n * @param date - The date to check.\n * @returns `true` if the day is visible, otherwise `false`.\n */\n isDayVisible?: (date: TDate) => boolean;\n /**\n * Ref to attach to the focused element, enabling focus to be controlled.\n */\n focusedDateRef?: React.MutableRefObject<HTMLElement | null>;\n /**\n * Callback fired when the focused date changes.\n * @param event - The synthetic event, if user event triggered focus or null.\n * @param date - The new focused date.\n */\n onFocusedDateChange?: (\n event: SyntheticEvent | null,\n date: TDate | null,\n ) => void;\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: TDate | null,\n ) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n /**\n * The currently visible month.\n */\n visibleMonth?: TDate;\n /**\n * If `true`, the calendar will be multiselect.\n */\n multiselect?: boolean;\n}\n\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * The currently selected date.\n */\n selectedDate?: SingleDateSelection<TDate> | null;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: SingleDateSelection<TDate> | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: SingleDateSelection<TDate> | null,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: SingleDateSelection<TDate> | null,\n newDate: SingleDateSelection<TDate> | null,\n ) => SingleDateSelection<TDate> | null;\n}\n/**\n * Properties for the single date selection hook.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectSingleProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"single\".\n */\n selectionVariant: \"single\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<SingleDateSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<SingleDateSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n @param newDate\n */\n select?: (\n previousSelectedDate: Array<SingleDateSelection<TDate>>,\n newDate: TDate,\n ) => Array<SingleDateSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionRangeProps<TDate extends DateFrameworkType>\n extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect date range selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectRangeProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"range\".\n */\n selectionVariant: \"range\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for single offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * The currently selected date.\n */\n selectedDate?: DateRangeSelection<TDate>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: DateRangeSelection<TDate>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: DateRangeSelection<TDate>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDate\n * @param newDate\n */\n select?: (\n previousSelectedDate: DateRangeSelection<TDate>,\n newDate: TDate,\n ) => DateRangeSelection<TDate>;\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: TDate) => TDate;\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: TDate) => TDate;\n}\n\n/**\n * UseCalendar hook props to return a calendar day's status for multiselect offset selection.\n * @template TDate - The type of the date object.\n */\nexport interface UseCalendarSelectionMultiselectOffsetProps<\n TDate extends DateFrameworkType,\n> extends UseCalendarSelectionBaseProps<TDate> {\n /**\n * The selection variant, set to \"offset\".\n */\n selectionVariant: \"offset\";\n /**\n * Multiple selection\n */\n multiselect: true;\n /**\n * The currently selected date.\n */\n selectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * The default selected date.\n */\n defaultSelectedDate?: Array<DateRangeSelection<TDate>>;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param selectedDate - The new selected date.\n */\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate: Array<DateRangeSelection<TDate>>,\n ) => void;\n /**\n * A pure function to manage the selected date for uncontrolled use-cases.\n * Return the selection based on the previous selection and the new date.\n * @param previousSelectedDat\n * @param newDate\n */\n select?: (\n previousSelectedDate: Array<DateRangeSelection<TDate>>,\n newDate: TDate,\n ) => Array<DateRangeSelection<TDate>>;\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: TDate) => TDate;\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: TDate) => TDate;\n}\n\n/**\n * UseCalendarSelection hook props, wth the selection variant determining the return type of the date selection\n * @template TDate - The type of the date object.\n */\nexport type UseCalendarSelectionProps<TDate extends DateFrameworkType> =\n | UseCalendarSelectionSingleProps<TDate>\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionRangeProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionOffsetProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate>;\n\nfunction isMultiselect<TDate>(\n props: UseCalendarSelectionProps<TDate>,\n): props is\n | UseCalendarSelectionMultiselectSingleProps<TDate>\n | UseCalendarSelectionMultiselectRangeProps<TDate>\n | UseCalendarSelectionMultiselectOffsetProps<TDate> {\n return props.multiselect === true;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nfunction selectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<DateFrameworkType>,\n newDate: DateFrameworkType,\n) {\n if (previousSelectedDate?.startDate && previousSelectedDate?.endDate) {\n return {\n startDate: newDate,\n };\n }\n if (\n previousSelectedDate?.startDate &&\n dateAdapter.compare(newDate, previousSelectedDate?.startDate) >= 0\n ) {\n return {\n ...previousSelectedDate,\n endDate: newDate,\n };\n }\n return {\n startDate: newDate,\n };\n}\n\nfunction selectMultiselectDateRange<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n previousSelectedDate: DateRangeSelection<TDate>[],\n newDate: TDate,\n): DateRangeSelection<TDate>[] {\n const lastRange = previousSelectedDate.length\n ? previousSelectedDate[previousSelectedDate.length - 1]\n : undefined;\n const isIncompleteRange = !lastRange?.endDate;\n\n if (isIncompleteRange) {\n const isNewSelection = previousSelectedDate.length === 0;\n if (isNewSelection) {\n return [{ startDate: newDate }];\n }\n const completeDateRange = selectDateRange(\n dateAdapter,\n previousSelectedDate[previousSelectedDate.length - 1],\n newDate,\n );\n return [...previousSelectedDate.slice(0, -1), completeDateRange];\n }\n return [...previousSelectedDate, { startDate: newDate }];\n}\n\nexport function useCalendarSelection<TDate extends DateFrameworkType>(\n props: UseCalendarSelectionProps<TDate>,\n) {\n const {\n multiselect,\n focusedDate: focusedDateProp,\n hoveredDate: hoveredDateProp,\n selectedDate: selectedDateProp,\n defaultSelectedDate,\n onSelectionChange,\n onHoveredDateChange,\n isDaySelectable = () => true,\n isDayVisible = () => true,\n isOutsideAllowedDates = () => true,\n focusedDateRef,\n onFocusedDateChange,\n select: selectProp,\n selectionVariant,\n timezone,\n visibleMonth,\n // startDateOffset,\n // endDateOffset,\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\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: TDate) => {\n if (selectionVariant === \"offset\" && startDateOffset) {\n return startDateOffset(date);\n }\n return date;\n },\n [selectionVariant, startDateOffset],\n );\n\n const getEndDateOffset = useCallback(\n (date: TDate) => {\n if (selectionVariant === \"offset\" && endDateOffset) {\n return endDateOffset(date);\n }\n return date;\n },\n [selectionVariant, endDateOffset],\n );\n\n const setSelectedDate = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>, newSelectedDate: TDate) => {\n if (!isDaySelectable || isDaySelectable(newSelectedDate)) {\n const handleSelectionChange = <\n U extends\n | (TDate | null)\n | TDate[]\n | (DateRangeSelection<TDate> | null)\n | DateRangeSelection<TDate>[],\n >(\n updatedSelection: U,\n changeHandler:\n | ((event: SyntheticEvent, updatedSelection: U) => void)\n | undefined,\n ) => {\n changeHandler?.(event, updatedSelection);\n setSelectedDateState(updatedSelection);\n };\n\n switch (selectionVariant) {\n case \"single\": {\n if (isMultiselect(props)) {\n const multipleSingleSelectedDate = selectedDate as Array<\n SingleDateSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectSingleProps<TDate>[\"select\"];\n const updatedSelection: Array<SingleDateSelection<TDate>> = select\n ? select(multipleSingleSelectedDate ?? [], newSelectedDate)\n : [...(multipleSingleSelectedDate ?? []), newSelectedDate];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const singleSelectedDate =\n selectedDate as SingleDateSelection<TDate> | null;\n const select =\n selectProp as UseCalendarSelectionSingleProps<TDate>[\"select\"];\n const updatedSelection: SingleDateSelection<TDate> | null = select\n ? select(singleSelectedDate, newSelectedDate)\n : newSelectedDate;\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionSingleProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"range\": {\n if (isMultiselect(props)) {\n const multipleRangeSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleRangeSelectedDate ?? [], newSelectedDate)\n : selectMultiselectDateRange(\n dateAdapter,\n multipleRangeSelectedDate ?? [],\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const rangeSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionRangeProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(rangeSelectedDate, newSelectedDate)\n : selectDateRange(\n dateAdapter,\n rangeSelectedDate,\n newSelectedDate,\n );\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionRangeProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n case \"offset\": {\n if (isMultiselect(props)) {\n const multipleOffsetSelectedDate = selectedDate as Array<\n DateRangeSelection<TDate>\n >;\n const select =\n selectProp as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate>[] = select\n ? select(multipleOffsetSelectedDate ?? [], newSelectedDate)\n : [\n ...(multipleOffsetSelectedDate ?? []),\n {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n },\n ];\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionMultiselectOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n } else {\n const offsetSelectedDate =\n selectedDate as DateRangeSelection<TDate>;\n const select =\n selectProp as UseCalendarSelectionOffsetProps<TDate>[\"select\"];\n const updatedSelection: DateRangeSelection<TDate> = select\n ? select(offsetSelectedDate, newSelectedDate)\n : {\n startDate: getStartDateOffset(newSelectedDate),\n endDate: getEndDateOffset(newSelectedDate),\n };\n\n const changeHandler =\n onSelectionChange as UseCalendarSelectionOffsetProps<TDate>[\"onSelectionChange\"];\n handleSelectionChange(updatedSelection, changeHandler);\n }\n break;\n }\n }\n }\n },\n [\n dateAdapter,\n getEndDateOffset,\n getStartDateOffset,\n isDaySelectable,\n selectProp,\n selectedDate,\n selectionVariant,\n onSelectionChange,\n props, // Ensure props is included in the dependency array\n ],\n );\n\n const isSelected = useCallback(\n (date: TDate) => {\n if (!selectedDate) {\n return false;\n }\n\n const isSingleDateSelected = (element: SingleDateSelection<TDate>) =>\n dateAdapter.isSame(element, date, \"day\");\n\n const isDateRangeSelected = (range: DateRangeSelection<TDate>) =>\n range.startDate &&\n range.endDate &&\n dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, range.endDate) <= 0;\n\n if (Array.isArray(selectedDate)) {\n return selectedDate.some((element) =>\n isDateRangeSelection(element)\n ? isDateRangeSelected(element)\n : isSingleDateSelected(element as SingleDateSelection<TDate>),\n );\n }\n\n switch (selectionVariant) {\n case \"single\":\n return isSingleDateSelected(\n selectedDate as SingleDateSelection<TDate>,\n );\n case \"range\":\n case \"offset\":\n return isDateRangeSelected(selectedDate as DateRangeSelection<TDate>);\n default:\n return false;\n }\n },\n [dateAdapter, selectedDate, selectionVariant],\n );\n\n const getDefaultFocusedDate = () => {\n if (\n selectedDate &&\n (selectionVariant === \"range\" || selectionVariant === \"offset\")\n ) {\n const getFocusableDate = (\n result: TDate[],\n selection: DateRangeSelection<TDate>,\n ) => {\n if (selection?.startDate && isDayVisible(selection.startDate)) {\n return [...result, selection.startDate];\n }\n if (selection?.endDate && isDayVisible(selection.endDate)) {\n return [...result, selection.endDate];\n }\n return result;\n };\n let focusableSelectedDates:\n | DateRangeSelection<TDate>\n | DateRangeSelection<TDate>[];\n if (!multiselect) {\n focusableSelectedDates = [selectedDate as DateRangeSelection<TDate>];\n } else {\n focusableSelectedDates = selectedDate as DateRangeSelection<TDate>[];\n }\n const selectionInMonth = focusableSelectedDates\n .reduce(getFocusableDate, [])\n .sort((a, b) => dateAdapter.compare(a, b));\n if (selectionInMonth.length > 0) {\n return selectionInMonth[0];\n }\n } else if (selectedDate && selectionVariant === \"single\") {\n const focusableSelectedDate = multiselect\n ? (selectedDate as SingleDateSelection<TDate>[])?.[0]\n : (selectedDate as SingleDateSelection<TDate>);\n if (focusableSelectedDate && isDayVisible(focusableSelectedDate)) {\n return focusableSelectedDate;\n }\n }\n\n // Defaults\n if (\n isDaySelectable?.(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n return dateAdapter.today(timezone);\n }\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable?.(visibleDay));\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n return null;\n };\n\n const [focusedDate, setFocusedDateState] = useControlled({\n controlled: focusedDateProp,\n default: useMemo(getDefaultFocusedDate, []),\n name: \"Calendar\",\n state: \"focusedDate\",\n });\n\n const setFocusedDate = useCallback(\n (event: SyntheticEvent | null, date: TDate | null) => {\n if (focusedDateRef && event?.target instanceof HTMLElement) {\n focusedDateRef.current = event.target;\n }\n if (\n date &&\n ((focusedDate && dateAdapter.isSame(date, focusedDate, \"day\")) ||\n isOutsideAllowedDates(date))\n ) {\n return;\n }\n setFocusedDateState(date);\n onFocusedDateChange?.(event, date);\n },\n [\n dateAdapter,\n focusedDate,\n focusedDateRef,\n isOutsideAllowedDates,\n onFocusedDateChange,\n ],\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: TDate | null) => {\n setHoveredDateState(date);\n onHoveredDateChange?.(event, date);\n },\n [onHoveredDateChange],\n );\n\n const isHovered = useCallback(\n (date: TDate) => {\n return !!hoveredDate && dateAdapter.isSame(date, hoveredDate, \"day\");\n },\n [dateAdapter, hoveredDate],\n );\n\n const getFocusableDates = useCallback(() => {\n const focusableDates: TDate[] = [];\n\n if (Array.isArray(selectedDate)) {\n // Handle array of selections\n for (const selection of selectedDate) {\n if (isDateRangeSelection(selection)) {\n if (selection.startDate && isDayVisible(selection.startDate)) {\n focusableDates.push(selection.startDate);\n } else if (selection.endDate && isDayVisible(selection.endDate)) {\n focusableDates.push(selection.endDate);\n }\n } else if (isDayVisible(selection as TDate)) {\n focusableDates.push(selection as TDate);\n }\n }\n } else if (selectedDate) {\n // Handle single selection\n if (isDateRangeSelection(selectedDate)) {\n if (selectedDate.startDate && isDayVisible(selectedDate.startDate)) {\n focusableDates.push(selectedDate.startDate);\n } else if (selectedDate.endDate && isDayVisible(selectedDate.endDate)) {\n focusableDates.push(selectedDate.endDate);\n }\n } else if (isDayVisible(selectedDate)) {\n focusableDates.push(selectedDate);\n }\n }\n\n if (\n focusedDate &&\n visibleMonth &&\n dateAdapter.isSame(focusedDate, visibleMonth, \"month\")\n ) {\n focusableDates.push(focusedDate);\n return focusableDates;\n }\n\n // Defaults\n if (\n focusableDates.length === 0 &&\n isDaySelectable(dateAdapter.today(timezone)) &&\n isDayVisible(dateAdapter.today(timezone))\n ) {\n focusableDates.push(dateAdapter.today(timezone));\n }\n if (focusableDates.length === 0 || !focusableDates.some(isDayVisible)) {\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n visibleMonth,\n ).find((visibleDay) => visibleDay && isDaySelectable(visibleDay));\n if (firstSelectableDate) {\n focusableDates.push(firstSelectableDate);\n }\n }\n\n return focusableDates;\n }, [\n dateAdapter,\n focusedDate,\n isDaySelectable,\n isDayVisible,\n selectedDate,\n timezone,\n visibleMonth,\n ]);\n\n const isSelectedSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return (\n dateAdapter.compare(date, range.startDate) > 0 &&\n dateAdapter.compare(date, range.endDate) < 0\n );\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredSpan = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.startDate) &&\n hoveredDate\n ) {\n const isForwardRange =\n dateAdapter.compare(hoveredDate, range.startDate) >= 0 &&\n ((dateAdapter.compare(date, range.startDate) >= 0 &&\n dateAdapter.compare(date, hoveredDate) <= 0) ||\n dateAdapter.isSame(date, hoveredDate, \"day\"));\n\n const isValidDayHovered =\n !isDaySelectable || isDaySelectable(hoveredDate);\n\n return isForwardRange && isValidDayHovered;\n }\n return false;\n });\n },\n [\n dateAdapter,\n isOutsideAllowedDates,\n selectionVariant,\n selectedDate,\n hoveredDate,\n isDaySelectable,\n ],\n );\n\n const isSelectedStart = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.startDate) &&\n !isOutsideAllowedDates(range.startDate)\n ) {\n return dateAdapter.isSame(range.startDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isSelectedEnd = useCallback(\n (date: TDate) => {\n const dateRanges = Array.isArray(selectedDate)\n ? selectedDate\n : [selectedDate];\n return dateRanges.some((range) => {\n if (\n (selectionVariant === \"range\" || selectionVariant === \"offset\") &&\n isDateRangeSelection(range) &&\n dateAdapter.isValid(range.endDate) &&\n !isOutsideAllowedDates(range.endDate)\n ) {\n return dateAdapter.isSame(range.endDate, date, \"day\");\n }\n return false;\n });\n },\n [dateAdapter, isOutsideAllowedDates, selectionVariant, selectedDate],\n );\n\n const isHoveredOffset = useCallback(\n (date: TDate) => {\n if (hoveredDate && selectionVariant === \"offset\") {\n const startDate = getStartDateOffset(hoveredDate);\n const endDate = getEndDateOffset(hoveredDate);\n\n return (\n dateAdapter.compare(date, startDate) >= 0 &&\n dateAdapter.compare(date, endDate) <= 0 &&\n (!isDaySelectable || isDaySelectable(date))\n );\n }\n\n return false;\n },\n [\n dateAdapter,\n getStartDateOffset,\n getEndDateOffset,\n hoveredDate,\n isDaySelectable,\n selectionVariant,\n ],\n );\n\n return useMemo(\n () => ({\n state: {\n focusedDate,\n focusedDateRef,\n hoveredDate,\n selectedDate,\n focusableDates: getFocusableDates(),\n },\n helpers: {\n isSelected,\n setSelectedDate,\n isHovered,\n setHoveredDate,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n },\n }),\n [\n selectedDate,\n focusedDate,\n focusedDateRef,\n getFocusableDates,\n hoveredDate,\n isSelected,\n isHovered,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHoveredOffset,\n isDaySelectable,\n setFocusedDate,\n setHoveredDate,\n setSelectedDate,\n ],\n );\n}\n\nexport function useCalendarSelectionDay<TDate extends DateFrameworkType>({\n date,\n}: {\n date: TDate;\n}) {\n const {\n helpers: {\n setSelectedDate,\n isSelected,\n isSelectedSpan,\n isHoveredSpan,\n isSelectedStart,\n isSelectedEnd,\n isHovered,\n isHoveredOffset,\n isDaySelectable,\n },\n } = useCalendarContext<TDate>();\n\n const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n setSelectedDate(event, date);\n },\n [date, setSelectedDate],\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = useCallback(\n (event) => {\n switch (event.key) {\n case \"Space\":\n case \"Enter\":\n setSelectedDate(event, date);\n event.preventDefault();\n }\n },\n [date, setSelectedDate],\n );\n\n const selected = isSelected(date);\n const 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 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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"}
|