@salt-ds/lab 1.0.0-alpha.73 → 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 +43 -0
- package/css/salt-lab.css +332 -18
- 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/Collapsible.js +47 -0
- package/dist-cjs/collapsible/Collapsible.js.map +1 -0
- package/dist-cjs/collapsible/CollapsibleContext.js +23 -0
- package/dist-cjs/collapsible/CollapsibleContext.js.map +1 -0
- package/dist-cjs/collapsible/CollapsiblePanel.css.js +6 -0
- package/dist-cjs/collapsible/CollapsiblePanel.css.js.map +1 -0
- package/dist-cjs/collapsible/CollapsiblePanel.js +42 -0
- package/dist-cjs/collapsible/CollapsiblePanel.js.map +1 -0
- package/dist-cjs/collapsible/CollapsibleTrigger.js +35 -0
- package/dist-cjs/collapsible/CollapsibleTrigger.js.map +1 -0
- 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/index.js +36 -0
- package/dist-cjs/index.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/TBody.js +32 -0
- package/dist-cjs/table/TBody.js.map +1 -0
- package/dist-cjs/table/TD.js +30 -0
- package/dist-cjs/table/TD.js.map +1 -0
- package/dist-cjs/table/TFoot.js +45 -0
- package/dist-cjs/table/TFoot.js.map +1 -0
- package/dist-cjs/table/TH.js +30 -0
- package/dist-cjs/table/TH.js.map +1 -0
- package/dist-cjs/table/THead.js +45 -0
- package/dist-cjs/table/THead.js.map +1 -0
- package/dist-cjs/table/TR.js +30 -0
- package/dist-cjs/table/TR.js.map +1 -0
- package/dist-cjs/table/Table.css.js +6 -0
- package/dist-cjs/table/Table.css.js.map +1 -0
- package/dist-cjs/table/Table.js +47 -0
- package/dist-cjs/table/Table.js.map +1 -0
- 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/SubMenuContext.js +34 -0
- package/dist-cjs/vertical-navigation/SubMenuContext.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigation.css.js +6 -0
- package/dist-cjs/vertical-navigation/VerticalNavigation.css.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigation.js +34 -0
- package/dist-cjs/vertical-navigation/VerticalNavigation.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItem.js +48 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItem.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js +6 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.js +83 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemExpansionIcon.js +29 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemExpansionIcon.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.css.js +6 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.css.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.js +24 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemLabel.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.css.js +6 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.css.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js +69 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js +6 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js.map +1 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.js +35 -0
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.js.map +1 -0
- 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/Collapsible.js +45 -0
- package/dist-es/collapsible/Collapsible.js.map +1 -0
- package/dist-es/collapsible/CollapsibleContext.js +20 -0
- package/dist-es/collapsible/CollapsibleContext.js.map +1 -0
- package/dist-es/collapsible/CollapsiblePanel.css.js +4 -0
- package/dist-es/collapsible/CollapsiblePanel.css.js.map +1 -0
- package/dist-es/collapsible/CollapsiblePanel.js +40 -0
- package/dist-es/collapsible/CollapsiblePanel.js.map +1 -0
- package/dist-es/collapsible/CollapsibleTrigger.js +33 -0
- package/dist-es/collapsible/CollapsibleTrigger.js.map +1 -0
- 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/index.js +17 -0
- package/dist-es/index.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/TBody.js +30 -0
- package/dist-es/table/TBody.js.map +1 -0
- package/dist-es/table/TD.js +28 -0
- package/dist-es/table/TD.js.map +1 -0
- package/dist-es/table/TFoot.js +43 -0
- package/dist-es/table/TFoot.js.map +1 -0
- package/dist-es/table/TH.js +28 -0
- package/dist-es/table/TH.js.map +1 -0
- package/dist-es/table/THead.js +43 -0
- package/dist-es/table/THead.js.map +1 -0
- package/dist-es/table/TR.js +28 -0
- package/dist-es/table/TR.js.map +1 -0
- package/dist-es/table/Table.css.js +4 -0
- package/dist-es/table/Table.css.js.map +1 -0
- package/dist-es/table/Table.js +44 -0
- package/dist-es/table/Table.js.map +1 -0
- 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/SubMenuContext.js +30 -0
- package/dist-es/vertical-navigation/SubMenuContext.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigation.css.js +4 -0
- package/dist-es/vertical-navigation/VerticalNavigation.css.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigation.js +32 -0
- package/dist-es/vertical-navigation/VerticalNavigation.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItem.js +45 -0
- package/dist-es/vertical-navigation/VerticalNavigationItem.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js +4 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.js +81 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemExpansionIcon.js +27 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemExpansionIcon.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemLabel.css.js +4 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemLabel.css.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemLabel.js +22 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemLabel.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.css.js +4 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.css.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js +67 -0
- package/dist-es/vertical-navigation/VerticalNavigationItemTrigger.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js +4 -0
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js.map +1 -0
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.js +33 -0
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.js.map +1 -0
- 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/Collapsible.d.ts +16 -0
- package/dist-types/collapsible/CollapsibleContext.d.ts +9 -0
- package/dist-types/collapsible/CollapsiblePanel.d.ts +4 -0
- package/dist-types/collapsible/CollapsibleTrigger.d.ts +5 -0
- package/dist-types/collapsible/index.d.ts +3 -0
- 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/index.d.ts +3 -0
- 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/table/TBody.d.ts +4 -0
- package/dist-types/table/TD.d.ts +4 -0
- package/dist-types/table/TFoot.d.ts +20 -0
- package/dist-types/table/TH.d.ts +4 -0
- package/dist-types/table/THead.d.ts +20 -0
- package/dist-types/table/TR.d.ts +4 -0
- package/dist-types/table/Table.d.ts +20 -0
- package/dist-types/table/index.d.ts +7 -0
- package/dist-types/vertical-navigation/SubMenuContext.d.ts +14 -0
- package/dist-types/vertical-navigation/VerticalNavigation.d.ts +5 -0
- package/dist-types/vertical-navigation/VerticalNavigationItem.d.ts +12 -0
- package/dist-types/vertical-navigation/VerticalNavigationItemContent.d.ts +4 -0
- package/dist-types/vertical-navigation/VerticalNavigationItemExpansionIcon.d.ts +2 -0
- package/dist-types/vertical-navigation/VerticalNavigationItemLabel.d.ts +4 -0
- package/dist-types/vertical-navigation/VerticalNavigationItemTrigger.d.ts +6 -0
- package/dist-types/vertical-navigation/VerticalNavigationSubMenu.d.ts +4 -0
- package/dist-types/vertical-navigation/index.d.ts +7 -0
- package/package.json +3 -6
|
@@ -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":["makePrefixer","forwardRef","ButtonBar","useWindow","useComponentCssInjection","buttonBarCss","useDescendants","Children","useMemo","jsx","ButtonBarContext","DescendantProvider","clsx"],"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":["makePrefixer","forwardRef","ButtonBar","useWindow","useComponentCssInjection","buttonBarCss","useDescendants","Children","useMemo","jsx","ButtonBarContext","DescendantProvider","clsx"],"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":["createContext","useRef","useState","useIsomorphicLayoutEffect","jsx"],"mappings":";;;;;;AAkCa,MAAA,iBAAA,GAAoBA,mBAAqC,CAAA,EAAE;AAEjE,SAAS,kBAAmB,CAAA;AAAA,EACjC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAA4B,EAAA;AAG1B,EAAM,MAAA,SAAA,GAAYC,aAAO,IAAI,CAAA;AAK7B,EAAA,MAAM,GAAG,WAAW,CAAA,GAAIC,cAAkB,EAAA;AAI1C,EAAAC,8BAAA,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,uBAAAC,cAAA,CAAC,iBAAkB,CAAA,QAAA,EAAlB,EAA4B,GAAG,OAAO,KAAO,EAAA,EAAE,QAAU,EAAA,SAAA,EAAa,EAAA,CAAA;AAE3E;;;;;"}
|
|
@@ -296,7 +296,7 @@ function useCalendarSelection(props) {
|
|
|
296
296
|
const getFocusableDates = react.useCallback(() => {
|
|
297
297
|
const focusableDates = [];
|
|
298
298
|
if (Array.isArray(selectedDate)) {
|
|
299
|
-
|
|
299
|
+
for (const selection of selectedDate) {
|
|
300
300
|
if (isDateRangeSelection(selection)) {
|
|
301
301
|
if (selection.startDate && isDayVisible(selection.startDate)) {
|
|
302
302
|
focusableDates.push(selection.startDate);
|
|
@@ -306,7 +306,7 @@ function useCalendarSelection(props) {
|
|
|
306
306
|
} else if (isDayVisible(selection)) {
|
|
307
307
|
focusableDates.push(selection);
|
|
308
308
|
}
|
|
309
|
-
}
|
|
309
|
+
}
|
|
310
310
|
} else if (selectedDate) {
|
|
311
311
|
if (isDateRangeSelection(selectedDate)) {
|
|
312
312
|
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":["makePrefixer","useLocalization","useControlled","useCallback","generateDatesForMonth","useMemo","useCalendarContext","clsx"],"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":["makePrefixer","useLocalization","useControlled","useCallback","generateDatesForMonth","useMemo","useCalendarContext","clsx"],"mappings":"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"}
|
|
@@ -83,11 +83,15 @@ const CascadingMenu = react.forwardRef(
|
|
|
83
83
|
}
|
|
84
84
|
});
|
|
85
85
|
const openCloseMenu = react.useCallback(
|
|
86
|
-
(open) =>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
(open) => {
|
|
87
|
+
if (rootMenuId) {
|
|
88
|
+
dispatch({
|
|
89
|
+
type: open ? CascadingMenuAction.CascadingMenuAction.OPEN_MENU : CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
|
|
90
|
+
cause: stateChangeTypes.stateChangeTypes.MOUSE_TOGGLE,
|
|
91
|
+
targetId: rootMenuId
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
},
|
|
91
95
|
[rootMenuId]
|
|
92
96
|
);
|
|
93
97
|
react.useEffect(() => {
|
|
@@ -102,18 +106,20 @@ const CascadingMenu = react.forwardRef(
|
|
|
102
106
|
clickAwayNodes,
|
|
103
107
|
containingDocument,
|
|
104
108
|
() => {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
if (rootMenuId) {
|
|
110
|
+
dispatch({
|
|
111
|
+
type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
|
|
112
|
+
cause: stateChangeTypes.stateChangeTypes.CLICKED_AWAY,
|
|
113
|
+
targetId: rootMenuId
|
|
114
|
+
});
|
|
115
|
+
}
|
|
110
116
|
},
|
|
111
117
|
() => {
|
|
112
118
|
setIsNavigatingWithKeyboard(false);
|
|
113
119
|
}
|
|
114
120
|
);
|
|
115
121
|
const handleResize = useEventCallback.useEventCallback(() => {
|
|
116
|
-
if (rootMenuState) {
|
|
122
|
+
if (rootMenuState && rootMenuId) {
|
|
117
123
|
dispatch({
|
|
118
124
|
type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
|
|
119
125
|
cause: stateChangeTypes.stateChangeTypes.ON_RESIZE,
|
|
@@ -131,7 +137,7 @@ const CascadingMenu = react.forwardRef(
|
|
|
131
137
|
const onItemClickCallback = react.useCallback(
|
|
132
138
|
(sourceItem, event) => {
|
|
133
139
|
onItemClick == null ? void 0 : onItemClick(sourceItem, event);
|
|
134
|
-
if (!isNavigatingWithKeyboard) {
|
|
140
|
+
if (!isNavigatingWithKeyboard && rootMenuId) {
|
|
135
141
|
dispatch({
|
|
136
142
|
type: CascadingMenuAction.CascadingMenuAction.CLOSE_CASCADING_MENU,
|
|
137
143
|
cause: stateChangeTypes.stateChangeTypes.ITEM_CLICKED,
|
|
@@ -202,7 +208,7 @@ const CascadingMenu = react.forwardRef(
|
|
|
202
208
|
Object.values(state).map((menuState) => {
|
|
203
209
|
const data = menusDataById[menuState.id];
|
|
204
210
|
const isRoot = data.level === 0;
|
|
205
|
-
const parentElement = isRoot ? getMenuTriggerRef() : refsManager.get(data.parentId);
|
|
211
|
+
const parentElement = isRoot ? getMenuTriggerRef() : refsManager.get((data == null ? void 0 : data.parentId) ?? "");
|
|
206
212
|
const isChildMenuOpen = !!state[data.level + 1];
|
|
207
213
|
return /* @__PURE__ */ react.createElement(
|
|
208
214
|
CascadingMenuList.CascadingMenuList,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CascadingMenu.js","sources":["../src/cascading-menu/CascadingMenu.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n ownerWindow,\n useControlled,\n useDensity,\n useForkRef,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport { useEventCallback } from \"../utils\";\nimport { CascadingMenuList } from \"./CascadingMenuList\";\nimport type { CascadingMenuProps, MenuDescriptor } from \"./CascadingMenuProps\";\nimport { CascadingMenuAction } from \"./internal/CascadingMenuAction\";\nimport { defaultGetScreenBounds } from \"./internal/menuPositioning\";\nimport { deriveFlatStateFromTree } from \"./internal/stateUtils\";\nimport { useClickAway } from \"./internal/useClickAway\";\nimport { useMenuTriggerHandlers } from \"./internal/useMenuTriggerHandlers\";\nimport { useRefsManager } from \"./internal/useRefsManager\";\nimport { useStateReducer } from \"./internal/useStateReducer\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nconst defaultItemToString = (item: any) => item?.title || String(item);\n\nexport const CascadingMenu = forwardRef<HTMLDivElement, CascadingMenuProps>(\n function CascadingMenu(props, ref) {\n const {\n children,\n className,\n initialSource: initialSourceProp,\n itemToString = defaultItemToString,\n onClose,\n onItemClick,\n onOpen,\n maxWidth = 544,\n minWidth = 200,\n delay = 300,\n rowHeight,\n tooltipEnterDelay = 1500,\n tooltipLeaveDelay = 0,\n height,\n rootPlacement,\n // Add this to offset x, y on popper open\n rootPlacementOffset,\n menuTriggerRef: anchorRefProp,\n open: openProp,\n getScreenBounds = defaultGetScreenBounds,\n disableMouseOutInteractions,\n disableClickAway,\n containingDocument = globalThis.document,\n source: sourceProp,\n } = props;\n const density = useDensity();\n\n const refsManager = useRefsManager();\n const childrenRef = useRef<HTMLElement | null>(null);\n const getMenuTriggerRef = useCallback(\n (): HTMLElement | null => anchorRefProp || childrenRef.current,\n [anchorRefProp],\n );\n\n const [menuSource] = useControlled({\n controlled: sourceProp,\n default: initialSourceProp,\n name: \"CascadingMenu\",\n state: \"source\",\n });\n\n const [isNavigatingWithKeyboard, setIsNavigatingWithKeyboard] =\n useState(false);\n\n const menusDataById = useMemo(\n () => (menuSource ? deriveFlatStateFromTree(menuSource) : {}),\n [menuSource],\n );\n\n const rootMenuId = useMemo(\n () =>\n Object.keys(menusDataById).find((id) => menusDataById[id].level === 0),\n [menusDataById],\n );\n\n const stateReducer = useStateReducer(\n menusDataById,\n isNavigatingWithKeyboard,\n );\n const [state, dispatch] = useReducer(stateReducer, []);\n const rootMenuState = state[0];\n\n // Call open and close callbacks after rendering as we know for sure whether the cascading menu is open or closed\n const prevState = usePrevious(state, undefined, []);\n const prevRootMenuState = prevState?.[0];\n useEffect(() => {\n if (!!rootMenuState !== !!prevRootMenuState) {\n if (!rootMenuState) {\n onClose?.();\n } else if (rootMenuState) {\n onOpen?.();\n }\n }\n });\n\n // Controlled opening/closing of the menu\n const openCloseMenu = useCallback(\n (open: boolean) =>\n dispatch({\n type: open\n ? CascadingMenuAction.OPEN_MENU\n : CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.MOUSE_TOGGLE,\n targetId: rootMenuId!,\n }),\n [rootMenuId],\n );\n // do not re-render every time if prop does not change\n useEffect(() => {\n if (openProp !== undefined && openProp !== !!rootMenuState) {\n openCloseMenu(openProp);\n }\n });\n\n const clickAwayNodes = disableClickAway\n ? null\n : () =>\n [getMenuTriggerRef(), ...refsManager.values()].filter(\n (node) => node !== null,\n ) as HTMLElement[];\n useClickAway(\n clickAwayNodes,\n containingDocument,\n () => {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.CLICKED_AWAY,\n targetId: rootMenuId!,\n });\n },\n () => {\n setIsNavigatingWithKeyboard(false);\n },\n );\n\n const handleResize = useEventCallback(() => {\n if (rootMenuState) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ON_RESIZE,\n targetId: rootMenuId!,\n });\n }\n });\n\n useEffect(() => {\n const win = ownerWindow(getMenuTriggerRef());\n\n win.addEventListener(\"resize\", handleResize);\n return () => {\n win.removeEventListener(\"resize\", handleResize);\n };\n }, [getMenuTriggerRef, handleResize]);\n\n // close the menu on item click via mouse\n const onItemClickCallback = useCallback(\n (sourceItem: MenuDescriptor, event: KeyboardEvent | MouseEvent) => {\n onItemClick?.(sourceItem, event);\n\n if (!isNavigatingWithKeyboard) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ITEM_CLICKED,\n targetId: rootMenuId!,\n });\n }\n },\n [isNavigatingWithKeyboard, onItemClick, rootMenuId],\n );\n\n // Set up event handlers on menu trigger if passed\n const setMenuTriggerRef = useCallback((node: HTMLElement) => {\n childrenRef.current = node;\n }, []);\n const handleRef = useForkRef(\n getRefFromChildren(children),\n setMenuTriggerRef,\n );\n\n const [onMenuTriggerClick, onMenuTriggerKeydown] = useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById,\n });\n\n const cloneMenuChildren = (cloneChildren: ReactNode) => {\n if (isValidElement(cloneChildren)) {\n const childrenProps = {\n ...cloneChildren.props,\n };\n\n if (openProp === undefined) {\n childrenProps.onClick = onMenuTriggerClick;\n childrenProps.onKeyDown = onMenuTriggerKeydown;\n }\n\n return cloneElement(cloneChildren, {\n ref: handleRef,\n ...childrenProps,\n });\n }\n return null;\n };\n\n const clonedChildren = cloneMenuChildren(children);\n\n const commonMenuProps = {\n className,\n delay,\n itemToString,\n maxWidth,\n minWidth,\n onItemClick: onItemClickCallback,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n menusDataById,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n rootPlacement,\n rootPlacementOffset,\n getScreenBounds,\n disableMouseOutInteractions,\n };\n\n useEffect(() => {\n if (!openProp) {\n setIsNavigatingWithKeyboard(false);\n }\n }, [openProp, rootPlacementOffset]);\n\n return Object.keys(menusDataById).length > 0 ? (\n <>\n {clonedChildren || null}\n {Object.values(state).map((menuState) => {\n const data = menusDataById[menuState.id];\n\n const isRoot = data.level === 0;\n const parentElement = isRoot\n ? getMenuTriggerRef()\n : refsManager.get(data.parentId!);\n\n const isChildMenuOpen = !!state[data.level + 1];\n return (\n <CascadingMenuList\n {...commonMenuProps}\n data={data}\n height={height}\n highlightedItemIndex={menuState.highlightedItemIndex}\n isChildMenuOpen={isChildMenuOpen}\n isRoot={isRoot}\n key={`${density}${menuState.id}`}\n menuId={menuState.id}\n menuTriggerRef={getMenuTriggerRef()}\n parentElement={parentElement}\n ref={isRoot ? ref : null}\n refsManager={refsManager}\n rowHeight={rowHeight}\n />\n );\n })}\n </>\n ) : null;\n },\n);\n"],"names":["forwardRef","CascadingMenu","defaultGetScreenBounds","useDensity","useRefsManager","useRef","useCallback","useControlled","useState","useMemo","deriveFlatStateFromTree","useStateReducer","useReducer","usePrevious","useEffect","CascadingMenuAction","stateChangeTypes","useClickAway","useEventCallback","ownerWindow","useForkRef","getRefFromChildren","useMenuTriggerHandlers","isValidElement","cloneElement","jsxs","Fragment","createElement","CascadingMenuList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CascadingMenu.js","sources":["../src/cascading-menu/CascadingMenu.tsx"],"sourcesContent":["import {\n getRefFromChildren,\n ownerWindow,\n useControlled,\n useDensity,\n useForkRef,\n usePrevious,\n} from \"@salt-ds/core\";\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport { useEventCallback } from \"../utils\";\nimport { CascadingMenuList } from \"./CascadingMenuList\";\nimport type { CascadingMenuProps, MenuDescriptor } from \"./CascadingMenuProps\";\nimport { CascadingMenuAction } from \"./internal/CascadingMenuAction\";\nimport { defaultGetScreenBounds } from \"./internal/menuPositioning\";\nimport { deriveFlatStateFromTree } from \"./internal/stateUtils\";\nimport { useClickAway } from \"./internal/useClickAway\";\nimport { useMenuTriggerHandlers } from \"./internal/useMenuTriggerHandlers\";\nimport { useRefsManager } from \"./internal/useRefsManager\";\nimport { useStateReducer } from \"./internal/useStateReducer\";\nimport { stateChangeTypes } from \"./stateChangeTypes\";\n\nconst defaultItemToString = (item: any) => item?.title || String(item);\n\nexport const CascadingMenu = forwardRef<HTMLDivElement, CascadingMenuProps>(\n function CascadingMenu(props, ref) {\n const {\n children,\n className,\n initialSource: initialSourceProp,\n itemToString = defaultItemToString,\n onClose,\n onItemClick,\n onOpen,\n maxWidth = 544,\n minWidth = 200,\n delay = 300,\n rowHeight,\n tooltipEnterDelay = 1500,\n tooltipLeaveDelay = 0,\n height,\n rootPlacement,\n // Add this to offset x, y on popper open\n rootPlacementOffset,\n menuTriggerRef: anchorRefProp,\n open: openProp,\n getScreenBounds = defaultGetScreenBounds,\n disableMouseOutInteractions,\n disableClickAway,\n containingDocument = globalThis.document,\n source: sourceProp,\n } = props;\n const density = useDensity();\n\n const refsManager = useRefsManager();\n const childrenRef = useRef<HTMLElement | null>(null);\n const getMenuTriggerRef = useCallback(\n (): HTMLElement | null => anchorRefProp || childrenRef.current,\n [anchorRefProp],\n );\n\n const [menuSource] = useControlled({\n controlled: sourceProp,\n default: initialSourceProp,\n name: \"CascadingMenu\",\n state: \"source\",\n });\n\n const [isNavigatingWithKeyboard, setIsNavigatingWithKeyboard] =\n useState(false);\n\n const menusDataById = useMemo(\n () => (menuSource ? deriveFlatStateFromTree(menuSource) : {}),\n [menuSource],\n );\n\n const rootMenuId = useMemo(\n () =>\n Object.keys(menusDataById).find((id) => menusDataById[id].level === 0),\n [menusDataById],\n );\n\n const stateReducer = useStateReducer(\n menusDataById,\n isNavigatingWithKeyboard,\n );\n const [state, dispatch] = useReducer(stateReducer, []);\n const rootMenuState = state[0];\n\n // Call open and close callbacks after rendering as we know for sure whether the cascading menu is open or closed\n const prevState = usePrevious(state, undefined, []);\n const prevRootMenuState = prevState?.[0];\n useEffect(() => {\n if (!!rootMenuState !== !!prevRootMenuState) {\n if (!rootMenuState) {\n onClose?.();\n } else if (rootMenuState) {\n onOpen?.();\n }\n }\n });\n\n // Controlled opening/closing of the menu\n const openCloseMenu = useCallback(\n (open: boolean) => {\n if (rootMenuId) {\n dispatch({\n type: open\n ? CascadingMenuAction.OPEN_MENU\n : CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.MOUSE_TOGGLE,\n targetId: rootMenuId,\n });\n }\n },\n [rootMenuId],\n );\n // do not re-render every time if prop does not change\n useEffect(() => {\n if (openProp !== undefined && openProp !== !!rootMenuState) {\n openCloseMenu(openProp);\n }\n });\n\n const clickAwayNodes = disableClickAway\n ? null\n : () =>\n [getMenuTriggerRef(), ...refsManager.values()].filter(\n (node) => node !== null,\n ) as HTMLElement[];\n useClickAway(\n clickAwayNodes,\n containingDocument,\n () => {\n if (rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.CLICKED_AWAY,\n targetId: rootMenuId,\n });\n }\n },\n () => {\n setIsNavigatingWithKeyboard(false);\n },\n );\n\n const handleResize = useEventCallback(() => {\n if (rootMenuState && rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ON_RESIZE,\n targetId: rootMenuId,\n });\n }\n });\n\n useEffect(() => {\n const win = ownerWindow(getMenuTriggerRef());\n\n win.addEventListener(\"resize\", handleResize);\n return () => {\n win.removeEventListener(\"resize\", handleResize);\n };\n }, [getMenuTriggerRef, handleResize]);\n\n // close the menu on item click via mouse\n const onItemClickCallback = useCallback(\n (sourceItem: MenuDescriptor, event: KeyboardEvent | MouseEvent) => {\n onItemClick?.(sourceItem, event);\n\n if (!isNavigatingWithKeyboard && rootMenuId) {\n dispatch({\n type: CascadingMenuAction.CLOSE_CASCADING_MENU,\n cause: stateChangeTypes.ITEM_CLICKED,\n targetId: rootMenuId,\n });\n }\n },\n [isNavigatingWithKeyboard, onItemClick, rootMenuId],\n );\n\n // Set up event handlers on menu trigger if passed\n const setMenuTriggerRef = useCallback((node: HTMLElement) => {\n childrenRef.current = node;\n }, []);\n const handleRef = useForkRef(\n getRefFromChildren(children),\n setMenuTriggerRef,\n );\n\n const [onMenuTriggerClick, onMenuTriggerKeydown] = useMenuTriggerHandlers({\n dispatch,\n children,\n setIsNavigatingWithKeyboard,\n openCloseMenu,\n rootMenuState,\n rootMenuId,\n menusDataById,\n });\n\n const cloneMenuChildren = (cloneChildren: ReactNode) => {\n if (isValidElement(cloneChildren)) {\n const childrenProps = {\n ...cloneChildren.props,\n };\n\n if (openProp === undefined) {\n childrenProps.onClick = onMenuTriggerClick;\n childrenProps.onKeyDown = onMenuTriggerKeydown;\n }\n\n return cloneElement(cloneChildren, {\n ref: handleRef,\n ...childrenProps,\n });\n }\n return null;\n };\n\n const clonedChildren = cloneMenuChildren(children);\n\n const commonMenuProps = {\n className,\n delay,\n itemToString,\n maxWidth,\n minWidth,\n onItemClick: onItemClickCallback,\n dispatch,\n isNavigatingWithKeyboard,\n setIsNavigatingWithKeyboard,\n menusDataById,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n rootPlacement,\n rootPlacementOffset,\n getScreenBounds,\n disableMouseOutInteractions,\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: We want to run this if rootPlacementOffset changes.\n useEffect(() => {\n if (!openProp) {\n setIsNavigatingWithKeyboard(false);\n }\n }, [openProp, rootPlacementOffset]);\n\n return Object.keys(menusDataById).length > 0 ? (\n <>\n {clonedChildren || null}\n {Object.values(state).map((menuState) => {\n const data = menusDataById[menuState.id];\n\n const isRoot = data.level === 0;\n const parentElement = isRoot\n ? getMenuTriggerRef()\n : refsManager.get(data?.parentId ?? \"\");\n\n const isChildMenuOpen = !!state[data.level + 1];\n return (\n <CascadingMenuList\n {...commonMenuProps}\n data={data}\n height={height}\n highlightedItemIndex={menuState.highlightedItemIndex}\n isChildMenuOpen={isChildMenuOpen}\n isRoot={isRoot}\n key={`${density}${menuState.id}`}\n menuId={menuState.id}\n menuTriggerRef={getMenuTriggerRef()}\n parentElement={parentElement}\n ref={isRoot ? ref : null}\n refsManager={refsManager}\n rowHeight={rowHeight}\n />\n );\n })}\n </>\n ) : null;\n },\n);\n"],"names":["forwardRef","CascadingMenu","defaultGetScreenBounds","useDensity","useRefsManager","useRef","useCallback","useControlled","useState","useMemo","deriveFlatStateFromTree","useStateReducer","useReducer","usePrevious","useEffect","CascadingMenuAction","stateChangeTypes","useClickAway","useEventCallback","ownerWindow","useForkRef","getRefFromChildren","useMenuTriggerHandlers","isValidElement","cloneElement","jsxs","Fragment","createElement","CascadingMenuList"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM,sBAAsB,CAAC,IAAA,KAAA,CAAc,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,KAAS,OAAO,IAAI,CAAA;AAE9D,MAAM,aAAgB,GAAAA,gBAAA;AAAA,EAC3B,SAASC,cAAc,CAAA,KAAA,EAAO,GAAK,EAAA;AACjC,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAe,EAAA,iBAAA;AAAA,MACf,YAAe,GAAA,mBAAA;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAW,GAAA,GAAA;AAAA,MACX,QAAW,GAAA,GAAA;AAAA,MACX,KAAQ,GAAA,GAAA;AAAA,MACR,SAAA;AAAA,MACA,iBAAoB,GAAA,IAAA;AAAA,MACpB,iBAAoB,GAAA,CAAA;AAAA,MACpB,MAAA;AAAA,MACA,aAAA;AAAA;AAAA,MAEA,mBAAA;AAAA,MACA,cAAgB,EAAA,aAAA;AAAA,MAChB,IAAM,EAAA,QAAA;AAAA,MACN,eAAkB,GAAAC,sCAAA;AAAA,MAClB,2BAAA;AAAA,MACA,gBAAA;AAAA,MACA,qBAAqB,UAAW,CAAA,QAAA;AAAA,MAChC,MAAQ,EAAA;AAAA,KACN,GAAA,KAAA;AACJ,IAAA,MAAM,UAAUC,eAAW,EAAA;AAE3B,IAAA,MAAM,cAAcC,6BAAe,EAAA;AACnC,IAAM,MAAA,WAAA,GAAcC,aAA2B,IAAI,CAAA;AACnD,IAAA,MAAM,iBAAoB,GAAAC,iBAAA;AAAA,MACxB,MAA0B,iBAAiB,WAAY,CAAA,OAAA;AAAA,MACvD,CAAC,aAAa;AAAA,KAChB;AAEA,IAAM,MAAA,CAAC,UAAU,CAAA,GAAIC,kBAAc,CAAA;AAAA,MACjC,UAAY,EAAA,UAAA;AAAA,MACZ,OAAS,EAAA,iBAAA;AAAA,MACT,IAAM,EAAA,eAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1DC,eAAS,KAAK,CAAA;AAEhB,IAAA,MAAM,aAAgB,GAAAC,aAAA;AAAA,MACpB,MAAO,UAAA,GAAaC,kCAAwB,CAAA,UAAU,IAAI,EAAC;AAAA,MAC3D,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,UAAa,GAAAD,aAAA;AAAA,MACjB,MACE,MAAA,CAAO,IAAK,CAAA,aAAa,CAAE,CAAA,IAAA,CAAK,CAAC,EAAA,KAAO,aAAc,CAAA,EAAE,CAAE,CAAA,KAAA,KAAU,CAAC,CAAA;AAAA,MACvE,CAAC,aAAa;AAAA,KAChB;AAEA,IAAA,MAAM,YAAe,GAAAE,+BAAA;AAAA,MACnB,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,IAAIC,gBAAW,CAAA,YAAA,EAAc,EAAE,CAAA;AACrD,IAAM,MAAA,aAAA,GAAgB,MAAM,CAAC,CAAA;AAG7B,IAAA,MAAM,SAAY,GAAAC,gBAAA,CAAY,KAAO,EAAA,MAAA,EAAW,EAAE,CAAA;AAClD,IAAA,MAAM,oBAAoB,SAAY,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAA,CAAA,CAAA;AACtC,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,CAAC,aAAkB,KAAA,CAAC,CAAC,iBAAmB,EAAA;AAC3C,QAAA,IAAI,CAAC,aAAe,EAAA;AAClB,UAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,EAAA;AAAA,mBACS,aAAe,EAAA;AACxB,UAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,EAAA;AAAA;AACF;AACF,KACD,CAAA;AAGD,IAAA,MAAM,aAAgB,GAAAR,iBAAA;AAAA,MACpB,CAAC,IAAkB,KAAA;AACjB,QAAA,IAAI,UAAY,EAAA;AACd,UAAS,QAAA,CAAA;AAAA,YACP,IAAM,EAAA,IAAA,GACFS,uCAAoB,CAAA,SAAA,GACpBA,uCAAoB,CAAA,oBAAA;AAAA,YACxB,OAAOC,iCAAiB,CAAA,YAAA;AAAA,YACxB,QAAU,EAAA;AAAA,WACX,CAAA;AAAA;AACH,OACF;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAAF,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAa,KAAA,MAAA,IAAa,QAAa,KAAA,CAAC,CAAC,aAAe,EAAA;AAC1D,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA;AACxB,KACD,CAAA;AAED,IAAM,MAAA,cAAA,GAAiB,gBACnB,GAAA,IAAA,GACA,MACE,CAAC,iBAAkB,EAAA,EAAG,GAAG,WAAA,CAAY,MAAO,EAAC,CAAE,CAAA,MAAA;AAAA,MAC7C,CAAC,SAAS,IAAS,KAAA;AAAA,KACrB;AACN,IAAAG,yBAAA;AAAA,MACE,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,MAAM;AACJ,QAAA,IAAI,UAAY,EAAA;AACd,UAAS,QAAA,CAAA;AAAA,YACP,MAAMF,uCAAoB,CAAA,oBAAA;AAAA,YAC1B,OAAOC,iCAAiB,CAAA,YAAA;AAAA,YACxB,QAAU,EAAA;AAAA,WACX,CAAA;AAAA;AACH,OACF;AAAA,MACA,MAAM;AACJ,QAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,KACF;AAEA,IAAM,MAAA,YAAA,GAAeE,kCAAiB,MAAM;AAC1C,MAAA,IAAI,iBAAiB,UAAY,EAAA;AAC/B,QAAS,QAAA,CAAA;AAAA,UACP,MAAMH,uCAAoB,CAAA,oBAAA;AAAA,UAC1B,OAAOC,iCAAiB,CAAA,SAAA;AAAA,UACxB,QAAU,EAAA;AAAA,SACX,CAAA;AAAA;AACH,KACD,CAAA;AAED,IAAAF,eAAA,CAAU,MAAM;AACd,MAAM,MAAA,GAAA,GAAMK,gBAAY,CAAA,iBAAA,EAAmB,CAAA;AAE3C,MAAI,GAAA,CAAA,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC3C,MAAA,OAAO,MAAM;AACX,QAAI,GAAA,CAAA,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,OAChD;AAAA,KACC,EAAA,CAAC,iBAAmB,EAAA,YAAY,CAAC,CAAA;AAGpC,IAAA,MAAM,mBAAsB,GAAAb,iBAAA;AAAA,MAC1B,CAAC,YAA4B,KAAsC,KAAA;AACjE,QAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,UAAY,EAAA,KAAA,CAAA;AAE1B,QAAI,IAAA,CAAC,4BAA4B,UAAY,EAAA;AAC3C,UAAS,QAAA,CAAA;AAAA,YACP,MAAMS,uCAAoB,CAAA,oBAAA;AAAA,YAC1B,OAAOC,iCAAiB,CAAA,YAAA;AAAA,YACxB,QAAU,EAAA;AAAA,WACX,CAAA;AAAA;AACH,OACF;AAAA,MACA,CAAC,wBAA0B,EAAA,WAAA,EAAa,UAAU;AAAA,KACpD;AAGA,IAAM,MAAA,iBAAA,GAAoBV,iBAAY,CAAA,CAAC,IAAsB,KAAA;AAC3D,MAAA,WAAA,CAAY,OAAU,GAAA,IAAA;AAAA,KACxB,EAAG,EAAE,CAAA;AACL,IAAA,MAAM,SAAY,GAAAc,eAAA;AAAA,MAChBC,wBAAmB,QAAQ,CAAA;AAAA,MAC3B;AAAA,KACF;AAEA,IAAA,MAAM,CAAC,kBAAA,EAAoB,oBAAoB,CAAA,GAAIC,6CAAuB,CAAA;AAAA,MACxE,QAAA;AAAA,MACA,QAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAM,MAAA,iBAAA,GAAoB,CAAC,aAA6B,KAAA;AACtD,MAAI,IAAAC,oBAAA,CAAe,aAAa,CAAG,EAAA;AACjC,QAAA,MAAM,aAAgB,GAAA;AAAA,UACpB,GAAG,aAAc,CAAA;AAAA,SACnB;AAEA,QAAA,IAAI,aAAa,MAAW,EAAA;AAC1B,UAAA,aAAA,CAAc,OAAU,GAAA,kBAAA;AACxB,UAAA,aAAA,CAAc,SAAY,GAAA,oBAAA;AAAA;AAG5B,QAAA,OAAOC,mBAAa,aAAe,EAAA;AAAA,UACjC,GAAK,EAAA,SAAA;AAAA,UACL,GAAG;AAAA,SACJ,CAAA;AAAA;AAEH,MAAO,OAAA,IAAA;AAAA,KACT;AAEA,IAAM,MAAA,cAAA,GAAiB,kBAAkB,QAAQ,CAAA;AAEjD,IAAA,MAAM,eAAkB,GAAA;AAAA,MACtB,SAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAa,EAAA,mBAAA;AAAA,MACb,QAAA;AAAA,MACA,wBAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAAV,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,QAAU,EAAA;AACb,QAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA;AACnC,KACC,EAAA,CAAC,QAAU,EAAA,mBAAmB,CAAC,CAAA;AAElC,IAAA,OAAO,OAAO,IAAK,CAAA,aAAa,CAAE,CAAA,MAAA,GAAS,oBAEtCW,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,MAAkB,cAAA,IAAA,IAAA;AAAA,MAClB,OAAO,MAAO,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,SAAc,KAAA;AACvC,QAAM,MAAA,IAAA,GAAO,aAAc,CAAA,SAAA,CAAU,EAAE,CAAA;AAEvC,QAAM,MAAA,MAAA,GAAS,KAAK,KAAU,KAAA,CAAA;AAC9B,QAAM,MAAA,aAAA,GAAgB,SAClB,iBAAkB,EAAA,GAClB,YAAY,GAAI,CAAA,CAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,aAAY,EAAE,CAAA;AAExC,QAAA,MAAM,kBAAkB,CAAC,CAAC,KAAM,CAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC9C,QACE,uBAAAC,mBAAA;AAAA,UAACC,mCAAA;AAAA,UAAA;AAAA,YACE,GAAG,eAAA;AAAA,YACJ,IAAA;AAAA,YACA,MAAA;AAAA,YACA,sBAAsB,SAAU,CAAA,oBAAA;AAAA,YAChC,eAAA;AAAA,YACA,MAAA;AAAA,YACA,GAAK,EAAA,CAAA,EAAG,OAAO,CAAA,EAAG,UAAU,EAAE,CAAA,CAAA;AAAA,YAC9B,QAAQ,SAAU,CAAA,EAAA;AAAA,YAClB,gBAAgB,iBAAkB,EAAA;AAAA,YAClC,aAAA;AAAA,YACA,GAAA,EAAK,SAAS,GAAM,GAAA,IAAA;AAAA,YACpB,WAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,OAEH;AAAA,KAAA,EACH,CACE,GAAA,IAAA;AAAA;AAER;;;;"}
|
|
@@ -61,10 +61,8 @@ const DefaultMenuItem = react.forwardRef(
|
|
|
61
61
|
const menuText = itemToString(sourceItem);
|
|
62
62
|
react.useEffect(() => {
|
|
63
63
|
const element = menuTextRef.current;
|
|
64
|
-
if (element) {
|
|
65
|
-
|
|
66
|
-
setHasTooltip(true);
|
|
67
|
-
}
|
|
64
|
+
if (element && menuText != null) {
|
|
65
|
+
setHasTooltip(element.offsetWidth < element.scrollWidth);
|
|
68
66
|
}
|
|
69
67
|
}, [menuText]);
|
|
70
68
|
const isDisabled = sourceItem.disabled;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CascadingMenuItem.js","sources":["../src/cascading-menu/CascadingMenuItem.tsx"],"sourcesContent":["import { makePrefixer, Tooltip, useIcon } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ListItem, type ListItemProps } from \"../list-deprecated\";\nimport cascadingMenuItemCss from \"./CascadingMenuItem.css\";\nimport type { MenuDescriptor } from \"./CascadingMenuProps\";\n\nconst noop = () => undefined;\nconst withBaseName = makePrefixer(\"saltCascadingMenuItem\");\n\nconst getIcon = (sourceItem: MenuDescriptor, isDisabled = false) => {\n const CustomIcon = sourceItem.icon;\n if (CustomIcon) {\n return (\n <CustomIcon\n className={clsx(withBaseName(\"menuItemStartAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n );\n }\n return null;\n};\n\nexport interface MenuItemProps extends ListItemProps<MenuDescriptor> {\n blurSelected: boolean;\n className?: string;\n hasEndAdornment: boolean;\n hasScrollbar: boolean;\n hasStartAdornment: boolean;\n hasSubMenu: boolean;\n isInteracted: boolean;\n isChildMenuOpen: boolean;\n isNavigatingWithKeyboard: boolean;\n itemToString: Required<ListItemProps<MenuDescriptor>>[\"itemToString\"];\n onItemClick?: (\n sourceItem: MenuDescriptor,\n event: MouseEvent | KeyboardEvent,\n ) => void;\n sourceItem: MenuDescriptor;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const DefaultMenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n (props, ref) => {\n const {\n blurSelected,\n className,\n hasEndAdornment,\n hasScrollbar,\n hasStartAdornment,\n onItemClick,\n itemToString,\n isInteracted,\n isNavigatingWithKeyboard,\n isChildMenuOpen,\n hasSubMenu,\n sourceItem,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-item\",\n css: cascadingMenuItemCss,\n window: targetWindow,\n });\n const { ExpandGroupIcon } = useIcon();\n const menuTextRef = useRef<HTMLDivElement>(null);\n const [hasTooltip, setHasTooltip] = useState(false);\n const menuText = itemToString(sourceItem);\n\n useEffect(() => {\n const element = menuTextRef.current;\n if (element) {\n
|
|
1
|
+
{"version":3,"file":"CascadingMenuItem.js","sources":["../src/cascading-menu/CascadingMenuItem.tsx"],"sourcesContent":["import { makePrefixer, Tooltip, useIcon } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ListItem, type ListItemProps } from \"../list-deprecated\";\nimport cascadingMenuItemCss from \"./CascadingMenuItem.css\";\nimport type { MenuDescriptor } from \"./CascadingMenuProps\";\n\nconst noop = () => undefined;\nconst withBaseName = makePrefixer(\"saltCascadingMenuItem\");\n\nconst getIcon = (sourceItem: MenuDescriptor, isDisabled = false) => {\n const CustomIcon = sourceItem.icon;\n if (CustomIcon) {\n return (\n <CustomIcon\n className={clsx(withBaseName(\"menuItemStartAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n );\n }\n return null;\n};\n\nexport interface MenuItemProps extends ListItemProps<MenuDescriptor> {\n blurSelected: boolean;\n className?: string;\n hasEndAdornment: boolean;\n hasScrollbar: boolean;\n hasStartAdornment: boolean;\n hasSubMenu: boolean;\n isInteracted: boolean;\n isChildMenuOpen: boolean;\n isNavigatingWithKeyboard: boolean;\n itemToString: Required<ListItemProps<MenuDescriptor>>[\"itemToString\"];\n onItemClick?: (\n sourceItem: MenuDescriptor,\n event: MouseEvent | KeyboardEvent,\n ) => void;\n sourceItem: MenuDescriptor;\n tooltipEnterDelay: number;\n tooltipLeaveDelay: number;\n}\n\nexport const DefaultMenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n (props, ref) => {\n const {\n blurSelected,\n className,\n hasEndAdornment,\n hasScrollbar,\n hasStartAdornment,\n onItemClick,\n itemToString,\n isInteracted,\n isNavigatingWithKeyboard,\n isChildMenuOpen,\n hasSubMenu,\n sourceItem,\n tooltipEnterDelay,\n tooltipLeaveDelay,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-cascading-menu-item\",\n css: cascadingMenuItemCss,\n window: targetWindow,\n });\n const { ExpandGroupIcon } = useIcon();\n const menuTextRef = useRef<HTMLDivElement>(null);\n const [hasTooltip, setHasTooltip] = useState(false);\n const menuText = itemToString(sourceItem);\n\n useEffect(() => {\n const element = menuTextRef.current;\n if (element && menuText != null) {\n setHasTooltip(element.offsetWidth < element.scrollWidth);\n }\n }, [menuText]);\n\n const isDisabled = sourceItem.disabled;\n const divider = sourceItem.divider;\n\n const onClick = isDisabled || hasSubMenu ? noop : onItemClick;\n\n const handleOnClick = (event: MouseEvent) => {\n if (!isDisabled && !hasSubMenu) {\n onClick?.(sourceItem, event);\n }\n };\n const interactionClasses = isNavigatingWithKeyboard\n ? {\n [withBaseName(\"menuItemKeyboardActive\")]:\n !isDisabled && isInteracted && !blurSelected,\n [withBaseName(\"menuItemKeyboardDisabled\")]:\n isDisabled && isInteracted,\n }\n : {\n [withBaseName(\"menuItemHover\")]: !isDisabled && !blurSelected,\n };\n\n const icon = hasStartAdornment ? getIcon(sourceItem, isDisabled) : null;\n const tooltipTitle = sourceItem.tooltip || menuText;\n\n return (\n <Tooltip\n disableFocusListener\n disableHoverListener\n enterDelay={tooltipEnterDelay}\n leaveDelay={tooltipLeaveDelay}\n placement=\"top\"\n disabled={!tooltipTitle || !hasTooltip || isChildMenuOpen}\n content={tooltipTitle}\n >\n <ListItem\n ref={ref}\n aria-expanded={isChildMenuOpen || undefined}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"menuItemDivider\")]: divider,\n [withBaseName(\"menuItemBlurSelected\")]: blurSelected,\n [withBaseName(\"menuItemSelected\")]:\n !isDisabled && !hasSubMenu && isInteracted,\n ...interactionClasses,\n [withBaseName(\"menuItemWithScrollbar\")]: hasScrollbar,\n },\n className,\n )}\n disabled={isDisabled}\n role=\"menuitem\"\n onClick={handleOnClick}\n item={sourceItem}\n // TODO highlightProps - see original code?\n {...restProps}\n >\n {hasStartAdornment && (\n <div className={withBaseName(\"menuItemStartAdornmentContainer\")}>\n {icon}\n </div>\n )}\n <div\n className={clsx(withBaseName(\"menuItemText\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n ref={menuTextRef}\n >\n {menuText}\n </div>\n {hasEndAdornment && (\n <div\n className={clsx(withBaseName(\"menuItemEndAdornmentContainer\"), {\n [withBaseName(\"menuItemAdornmentHidden\")]: !hasSubMenu,\n })}\n >\n <ExpandGroupIcon\n className={clsx(withBaseName(\"menuItemEndAdornment\"), {\n [withBaseName(\"menuItemDisabled\")]: isDisabled,\n })}\n />\n </div>\n )}\n {/** biome-ignore lint/a11y/useAriaPropsForRole: Separator is not focusable, so it doesn't need aria-valuenow. */}\n {divider && <div role=\"separator\" />}\n </ListItem>\n </Tooltip>\n );\n },\n);\n"],"names":["makePrefixer","jsx","clsx","forwardRef","useWindow","useComponentCssInjection","cascadingMenuItemCss","useIcon","useRef","useState","useEffect","Tooltip","jsxs","ListItem"],"mappings":"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"}
|
|
@@ -63,8 +63,7 @@ const CascadingMenuList = react.forwardRef(function CascadingMenuList2(props, re
|
|
|
63
63
|
},
|
|
64
64
|
[refsManager, menuId]
|
|
65
65
|
);
|
|
66
|
-
const
|
|
67
|
-
const defaultRowHeight = sizeStackable;
|
|
66
|
+
const defaultRowHeight = 36;
|
|
68
67
|
const spacing = 8;
|
|
69
68
|
const isMenuActiveState = react.useState(true);
|
|
70
69
|
const [isMenuActive, setIsMenuActive] = isMenuActiveState;
|