@salt-ds/core 1.71.0 → 1.73.0
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 +204 -0
- package/css/salt-core.css +432 -175
- package/dist-cjs/accordion/AccordionHeader.css.js +1 -1
- package/dist-cjs/avatar/Avatar.css.js +1 -1
- package/dist-cjs/badge/Badge.css.js +1 -1
- package/dist-cjs/banner/Banner.css.js +1 -1
- package/dist-cjs/border-layout/BorderLayout.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumb.css.js +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumb.js +5 -6
- package/dist-cjs/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumbs.css.js +1 -1
- package/dist-cjs/button/Button.css.js +1 -1
- package/dist-cjs/card/CardContent.css.js +1 -1
- package/dist-cjs/card/hasCardSection.js +11 -3
- package/dist-cjs/card/hasCardSection.js.map +1 -1
- package/dist-cjs/checkbox/Checkbox.css.js +1 -1
- package/dist-cjs/checkbox/CheckboxIcon.css.js +1 -1
- package/dist-cjs/checkbox/CheckboxIcon.js.map +1 -1
- package/dist-cjs/collapsible/CollapsiblePanel.css.js +1 -1
- package/dist-cjs/collapsible/CollapsiblePanel.js +15 -15
- package/dist-cjs/collapsible/CollapsiblePanel.js.map +1 -1
- package/dist-cjs/combo-box/ComboBox.js +18 -36
- package/dist-cjs/combo-box/ComboBox.js.map +1 -1
- package/dist-cjs/combo-box/useComboBox.js +21 -21
- package/dist-cjs/combo-box/useComboBox.js.map +1 -1
- package/dist-cjs/dialog/DialogHeader.js +2 -0
- package/dist-cjs/dialog/DialogHeader.js.map +1 -1
- package/dist-cjs/drawer/DrawerHeader.js +2 -0
- package/dist-cjs/drawer/DrawerHeader.js.map +1 -1
- package/dist-cjs/dropdown/Dropdown.css.js +1 -1
- package/dist-cjs/dropdown/Dropdown.js +30 -31
- package/dist-cjs/dropdown/Dropdown.js.map +1 -1
- package/dist-cjs/file-drop-zone/FileDropZone.css.js +1 -1
- package/dist-cjs/form-field/FormField.css.js +1 -1
- package/dist-cjs/form-field/FormField.js +2 -2
- package/dist-cjs/form-field/FormField.js.map +1 -1
- package/dist-cjs/form-field/FormFieldHelperText.css.js +1 -1
- package/dist-cjs/form-field/FormFieldHelperText.js +2 -0
- package/dist-cjs/form-field/FormFieldHelperText.js.map +1 -1
- package/dist-cjs/form-field/FormFieldLabel.css.js +1 -1
- package/dist-cjs/form-field/FormFieldLabel.js +3 -1
- package/dist-cjs/form-field/FormFieldLabel.js.map +1 -1
- package/dist-cjs/form-field-context/FormFieldContext.js.map +1 -1
- package/dist-cjs/index.js +13 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/input/Input.css.js +1 -1
- package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
- package/dist-cjs/interactable-card/InteractableCard.js +18 -7
- package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
- package/dist-cjs/interactable-card/InteractableCardGroup.js +71 -39
- package/dist-cjs/interactable-card/InteractableCardGroup.js.map +1 -1
- package/dist-cjs/interactable-card/InteractableCardGroupContext.js.map +1 -1
- package/dist-cjs/interactable-card/useInteractableCard.js +2 -3
- package/dist-cjs/interactable-card/useInteractableCard.js.map +1 -1
- package/dist-cjs/kbd/Kbd.css.js +1 -1
- package/dist-cjs/link/Link.css.js +1 -1
- package/dist-cjs/link/Link.js +2 -0
- package/dist-cjs/link/Link.js.map +1 -1
- package/dist-cjs/link/LinkAction.js +3 -2
- package/dist-cjs/link/LinkAction.js.map +1 -1
- package/dist-cjs/link-button/LinkButton.js +3 -2
- package/dist-cjs/link-button/LinkButton.js.map +1 -1
- package/dist-cjs/list-box/ListBox.js +20 -27
- package/dist-cjs/list-box/ListBox.js.map +1 -1
- package/dist-cjs/list-control/ListControlContext.js.map +1 -1
- package/dist-cjs/list-control/ListControlNavigationKeys.js +74 -0
- package/dist-cjs/list-control/ListControlNavigationKeys.js.map +1 -0
- package/dist-cjs/list-control/ListControlOptionContext.js +47 -0
- package/dist-cjs/list-control/ListControlOptionContext.js.map +1 -0
- package/dist-cjs/list-control/ListControlOptionStore.js +159 -0
- package/dist-cjs/list-control/ListControlOptionStore.js.map +1 -0
- package/dist-cjs/list-control/ListControlProvider.js +39 -0
- package/dist-cjs/list-control/ListControlProvider.js.map +1 -0
- package/dist-cjs/list-control/ListControlRegistry.js +161 -0
- package/dist-cjs/list-control/ListControlRegistry.js.map +1 -0
- package/dist-cjs/list-control/ListControlState.js +137 -109
- package/dist-cjs/list-control/ListControlState.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuListItem.css.js +1 -1
- package/dist-cjs/menu/MenuGroup.css.js +1 -1
- package/dist-cjs/menu/MenuItem.css.js +1 -1
- package/dist-cjs/multiline-input/MultilineInput.css.js +1 -1
- package/dist-cjs/navigation-item/NavigationItem.css.js +1 -1
- package/dist-cjs/number-input/NumberInput.css.js +1 -1
- package/dist-cjs/number-input/NumberInput.js +2 -2
- package/dist-cjs/number-input/NumberInput.js.map +1 -1
- package/dist-cjs/on-solid-button/OnSolidButton.css.js +6 -0
- package/dist-cjs/on-solid-button/OnSolidButton.css.js.map +1 -0
- package/dist-cjs/on-solid-button/OnSolidButton.js +68 -0
- package/dist-cjs/on-solid-button/OnSolidButton.js.map +1 -0
- package/dist-cjs/option/Option.css.js +1 -1
- package/dist-cjs/option/Option.js +64 -39
- package/dist-cjs/option/Option.js.map +1 -1
- package/dist-cjs/option/OptionGroup.css.js +1 -1
- package/dist-cjs/overlay/Overlay.js +12 -2
- package/dist-cjs/overlay/Overlay.js.map +1 -1
- package/dist-cjs/overlay/OverlayContext.js +6 -0
- package/dist-cjs/overlay/OverlayContext.js.map +1 -1
- package/dist-cjs/overlay/OverlayFooter.css.js +6 -0
- package/dist-cjs/overlay/OverlayFooter.css.js.map +1 -0
- package/dist-cjs/overlay/OverlayFooter.js +30 -0
- package/dist-cjs/overlay/OverlayFooter.js.map +1 -0
- package/dist-cjs/overlay/OverlayHeader.css.js +1 -1
- package/dist-cjs/overlay/OverlayHeader.js +53 -11
- package/dist-cjs/overlay/OverlayHeader.js.map +1 -1
- package/dist-cjs/overlay/OverlayPanel.css.js +1 -1
- package/dist-cjs/overlay/OverlayPanel.js +20 -7
- package/dist-cjs/overlay/OverlayPanel.js.map +1 -1
- package/dist-cjs/overlay/OverlayPanelCloseButton.js +1 -1
- package/dist-cjs/overlay/OverlayPanelCloseButton.js.map +1 -1
- package/dist-cjs/overlay/OverlayPanelContent.css.js +1 -1
- package/dist-cjs/overlay/OverlayPanelContent.js +11 -13
- package/dist-cjs/overlay/OverlayPanelContent.js.map +1 -1
- package/dist-cjs/overlay/hasOverlaySection.js +24 -0
- package/dist-cjs/overlay/hasOverlaySection.js.map +1 -0
- package/dist-cjs/pagination/CompactPaginator.js +2 -0
- package/dist-cjs/pagination/CompactPaginator.js.map +1 -1
- package/dist-cjs/pagination/GoToInput.js +2 -0
- package/dist-cjs/pagination/GoToInput.js.map +1 -1
- package/dist-cjs/pill/PillCheckIcon.js.map +1 -1
- package/dist-cjs/pill-input/PillInput.css.js +1 -1
- package/dist-cjs/pill-input/PillInput.js +2 -2
- package/dist-cjs/pill-input/PillInput.js.map +1 -1
- package/dist-cjs/progress/CircularProgress/CircularProgress.js +2 -0
- package/dist-cjs/progress/CircularProgress/CircularProgress.js.map +1 -1
- package/dist-cjs/progress/LinearProgress/LinearProgress.js +2 -0
- package/dist-cjs/progress/LinearProgress/LinearProgress.js.map +1 -1
- package/dist-cjs/radio-button/RadioButton.css.js +1 -1
- package/dist-cjs/radio-button/RadioButtonIcon.css.js +1 -1
- package/dist-cjs/rating/Rating.css.js +1 -1
- package/dist-cjs/salt-provider/ThemeApplicator.js +10 -6
- package/dist-cjs/salt-provider/ThemeApplicator.js.map +1 -1
- package/dist-cjs/side-panel/SidePanelTitle.js +2 -0
- package/dist-cjs/side-panel/SidePanelTitle.js.map +1 -1
- package/dist-cjs/side-panel/SidePanelTrigger.js.map +1 -1
- package/dist-cjs/side-panel/internal/useIsScrollable.js.map +1 -1
- package/dist-cjs/side-panel/useSidePanel.js +4 -9
- package/dist-cjs/side-panel/useSidePanel.js.map +1 -1
- package/dist-cjs/skip-link/internal/useManageFocusOnTarget.js +2 -2
- package/dist-cjs/skip-link/internal/useManageFocusOnTarget.js.map +1 -1
- package/dist-cjs/slider/internal/SliderThumb.js.map +1 -1
- package/dist-cjs/slider/internal/SliderTooltip.js +2 -0
- package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -1
- package/dist-cjs/slider/internal/SliderTrack.css.js +1 -1
- package/dist-cjs/slider/internal/SliderTrack.js +2 -0
- package/dist-cjs/slider/internal/SliderTrack.js.map +1 -1
- package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +1 -1
- package/dist-cjs/slider/internal/useSliderThumb.js.map +1 -1
- package/dist-cjs/slider/internal/utils.js.map +1 -1
- package/dist-cjs/stepper/Stepper.js +1 -1
- package/dist-cjs/stepper/Stepper.js.map +1 -1
- package/dist-cjs/stepper/internal/StepText.css.js +1 -1
- package/dist-cjs/stepper/internal/StepText.js +2 -0
- package/dist-cjs/stepper/internal/StepText.js.map +1 -1
- package/dist-cjs/switch/Switch.css.js +1 -1
- package/dist-cjs/table/Table.css.js +1 -1
- package/dist-cjs/tabs/Tabs.js +1 -1
- package/dist-cjs/tabs/Tabs.js.map +1 -1
- package/dist-cjs/tabs/internal/overflow/useOverflow.js.map +1 -1
- package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -1
- package/dist-cjs/tag/Tag.css.js +1 -1
- package/dist-cjs/text/Code.js +1 -1
- package/dist-cjs/text/Code.js.map +1 -1
- package/dist-cjs/text/Editorial.js +32 -0
- package/dist-cjs/text/Editorial.js.map +1 -0
- package/dist-cjs/text/Eyebrow.js +12 -0
- package/dist-cjs/text/Eyebrow.js.map +1 -0
- package/dist-cjs/text/Text.css.js +1 -1
- package/dist-cjs/text/Text.js +6 -2
- package/dist-cjs/text/Text.js.map +1 -1
- package/dist-cjs/toast/Toast.css.js +1 -1
- package/dist-cjs/toggle-button/ToggleButton.js +8 -2
- package/dist-cjs/toggle-button/ToggleButton.js.map +1 -1
- package/dist-cjs/toggle-button-group/ToggleButtonGroup.js +71 -8
- package/dist-cjs/toggle-button-group/ToggleButtonGroup.js.map +1 -1
- package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
- package/dist-cjs/toggletip/ToggletipPanel.css.js +1 -1
- package/dist-cjs/toolbar/ToolbarOverflow.js +8 -4
- package/dist-cjs/toolbar/ToolbarOverflow.js.map +1 -1
- package/dist-cjs/toolbar/toolbarUtils.js.map +1 -1
- package/dist-cjs/tooltip/Tooltip.css.js +1 -1
- package/dist-cjs/tooltip/useAriaAnnounce.js +4 -2
- package/dist-cjs/tooltip/useAriaAnnounce.js.map +1 -1
- package/dist-cjs/tooltip/useTooltip.js.map +1 -1
- package/dist-cjs/tree/TreeContext.js.map +1 -1
- package/dist-cjs/utils/forkRef.js +34 -0
- package/dist-cjs/utils/forkRef.js.map +1 -0
- package/dist-cjs/utils/getRefFromChildren.js.map +1 -1
- package/dist-cjs/utils/marginMiddleware.js.map +1 -1
- package/dist-cjs/utils/setRef.js.map +1 -1
- package/dist-cjs/utils/useFloatingUI/useFloatingUI.js.map +1 -1
- package/dist-cjs/utils/useForkRef.js +3 -6
- package/dist-cjs/utils/useForkRef.js.map +1 -1
- package/dist-cjs/utils/useResizeObserver.js.map +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
- package/dist-es/accordion/AccordionHeader.css.js +1 -1
- package/dist-es/avatar/Avatar.css.js +1 -1
- package/dist-es/badge/Badge.css.js +1 -1
- package/dist-es/banner/Banner.css.js +1 -1
- package/dist-es/border-layout/BorderLayout.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumb.css.js +1 -1
- package/dist-es/breadcrumbs/Breadcrumb.js +5 -6
- package/dist-es/breadcrumbs/Breadcrumb.js.map +1 -1
- package/dist-es/breadcrumbs/Breadcrumbs.css.js +1 -1
- package/dist-es/button/Button.css.js +1 -1
- package/dist-es/card/CardContent.css.js +1 -1
- package/dist-es/card/hasCardSection.js +11 -3
- package/dist-es/card/hasCardSection.js.map +1 -1
- package/dist-es/checkbox/Checkbox.css.js +1 -1
- package/dist-es/checkbox/CheckboxIcon.css.js +1 -1
- package/dist-es/checkbox/CheckboxIcon.js.map +1 -1
- package/dist-es/collapsible/CollapsiblePanel.css.js +1 -1
- package/dist-es/collapsible/CollapsiblePanel.js +16 -16
- package/dist-es/collapsible/CollapsiblePanel.js.map +1 -1
- package/dist-es/combo-box/ComboBox.js +18 -36
- package/dist-es/combo-box/ComboBox.js.map +1 -1
- package/dist-es/combo-box/useComboBox.js +21 -21
- package/dist-es/combo-box/useComboBox.js.map +1 -1
- package/dist-es/dialog/DialogHeader.js +2 -0
- package/dist-es/dialog/DialogHeader.js.map +1 -1
- package/dist-es/drawer/DrawerHeader.js +2 -0
- package/dist-es/drawer/DrawerHeader.js.map +1 -1
- package/dist-es/dropdown/Dropdown.css.js +1 -1
- package/dist-es/dropdown/Dropdown.js +30 -31
- package/dist-es/dropdown/Dropdown.js.map +1 -1
- package/dist-es/file-drop-zone/FileDropZone.css.js +1 -1
- package/dist-es/form-field/FormField.css.js +1 -1
- package/dist-es/form-field/FormField.js +2 -2
- package/dist-es/form-field/FormField.js.map +1 -1
- package/dist-es/form-field/FormFieldHelperText.css.js +1 -1
- package/dist-es/form-field/FormFieldHelperText.js +2 -0
- package/dist-es/form-field/FormFieldHelperText.js.map +1 -1
- package/dist-es/form-field/FormFieldLabel.css.js +1 -1
- package/dist-es/form-field/FormFieldLabel.js +3 -1
- package/dist-es/form-field/FormFieldLabel.js.map +1 -1
- package/dist-es/form-field-context/FormFieldContext.js.map +1 -1
- package/dist-es/index.js +4 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/input/Input.css.js +1 -1
- package/dist-es/interactable-card/InteractableCard.css.js +1 -1
- package/dist-es/interactable-card/InteractableCard.js +18 -7
- package/dist-es/interactable-card/InteractableCard.js.map +1 -1
- package/dist-es/interactable-card/InteractableCardGroup.js +72 -40
- package/dist-es/interactable-card/InteractableCardGroup.js.map +1 -1
- package/dist-es/interactable-card/InteractableCardGroupContext.js.map +1 -1
- package/dist-es/interactable-card/useInteractableCard.js +2 -3
- package/dist-es/interactable-card/useInteractableCard.js.map +1 -1
- package/dist-es/kbd/Kbd.css.js +1 -1
- package/dist-es/link/Link.css.js +1 -1
- package/dist-es/link/Link.js +2 -0
- package/dist-es/link/Link.js.map +1 -1
- package/dist-es/link/LinkAction.js +3 -2
- package/dist-es/link/LinkAction.js.map +1 -1
- package/dist-es/link-button/LinkButton.js +3 -2
- package/dist-es/link-button/LinkButton.js.map +1 -1
- package/dist-es/list-box/ListBox.js +20 -27
- package/dist-es/list-box/ListBox.js.map +1 -1
- package/dist-es/list-control/ListControlContext.js.map +1 -1
- package/dist-es/list-control/ListControlNavigationKeys.js +69 -0
- package/dist-es/list-control/ListControlNavigationKeys.js.map +1 -0
- package/dist-es/list-control/ListControlOptionContext.js +44 -0
- package/dist-es/list-control/ListControlOptionContext.js.map +1 -0
- package/dist-es/list-control/ListControlOptionStore.js +153 -0
- package/dist-es/list-control/ListControlOptionStore.js.map +1 -0
- package/dist-es/list-control/ListControlProvider.js +37 -0
- package/dist-es/list-control/ListControlProvider.js.map +1 -0
- package/dist-es/list-control/ListControlRegistry.js +158 -0
- package/dist-es/list-control/ListControlRegistry.js.map +1 -0
- package/dist-es/list-control/ListControlState.js +137 -110
- package/dist-es/list-control/ListControlState.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuListItem.css.js +1 -1
- package/dist-es/menu/MenuGroup.css.js +1 -1
- package/dist-es/menu/MenuItem.css.js +1 -1
- package/dist-es/multiline-input/MultilineInput.css.js +1 -1
- package/dist-es/navigation-item/NavigationItem.css.js +1 -1
- package/dist-es/number-input/NumberInput.css.js +1 -1
- package/dist-es/number-input/NumberInput.js +2 -2
- package/dist-es/number-input/NumberInput.js.map +1 -1
- package/dist-es/on-solid-button/OnSolidButton.css.js +4 -0
- package/dist-es/on-solid-button/OnSolidButton.css.js.map +1 -0
- package/dist-es/on-solid-button/OnSolidButton.js +66 -0
- package/dist-es/on-solid-button/OnSolidButton.js.map +1 -0
- package/dist-es/option/Option.css.js +1 -1
- package/dist-es/option/Option.js +65 -40
- package/dist-es/option/Option.js.map +1 -1
- package/dist-es/option/OptionGroup.css.js +1 -1
- package/dist-es/overlay/Overlay.js +13 -3
- package/dist-es/overlay/Overlay.js.map +1 -1
- package/dist-es/overlay/OverlayContext.js +6 -0
- package/dist-es/overlay/OverlayContext.js.map +1 -1
- package/dist-es/overlay/OverlayFooter.css.js +4 -0
- package/dist-es/overlay/OverlayFooter.css.js.map +1 -0
- package/dist-es/overlay/OverlayFooter.js +28 -0
- package/dist-es/overlay/OverlayFooter.js.map +1 -0
- package/dist-es/overlay/OverlayHeader.css.js +1 -1
- package/dist-es/overlay/OverlayHeader.js +53 -11
- package/dist-es/overlay/OverlayHeader.js.map +1 -1
- package/dist-es/overlay/OverlayPanel.css.js +1 -1
- package/dist-es/overlay/OverlayPanel.js +20 -7
- package/dist-es/overlay/OverlayPanel.js.map +1 -1
- package/dist-es/overlay/OverlayPanelCloseButton.js +1 -1
- package/dist-es/overlay/OverlayPanelCloseButton.js.map +1 -1
- package/dist-es/overlay/OverlayPanelContent.css.js +1 -1
- package/dist-es/overlay/OverlayPanelContent.js +11 -13
- package/dist-es/overlay/OverlayPanelContent.js.map +1 -1
- package/dist-es/overlay/hasOverlaySection.js +22 -0
- package/dist-es/overlay/hasOverlaySection.js.map +1 -0
- package/dist-es/pagination/CompactPaginator.js +2 -0
- package/dist-es/pagination/CompactPaginator.js.map +1 -1
- package/dist-es/pagination/GoToInput.js +2 -0
- package/dist-es/pagination/GoToInput.js.map +1 -1
- package/dist-es/pill/PillCheckIcon.js.map +1 -1
- package/dist-es/pill-input/PillInput.css.js +1 -1
- package/dist-es/pill-input/PillInput.js +2 -2
- package/dist-es/pill-input/PillInput.js.map +1 -1
- package/dist-es/progress/CircularProgress/CircularProgress.js +2 -0
- package/dist-es/progress/CircularProgress/CircularProgress.js.map +1 -1
- package/dist-es/progress/LinearProgress/LinearProgress.js +2 -0
- package/dist-es/progress/LinearProgress/LinearProgress.js.map +1 -1
- package/dist-es/radio-button/RadioButton.css.js +1 -1
- package/dist-es/radio-button/RadioButtonIcon.css.js +1 -1
- package/dist-es/rating/Rating.css.js +1 -1
- package/dist-es/salt-provider/ThemeApplicator.js +10 -6
- package/dist-es/salt-provider/ThemeApplicator.js.map +1 -1
- package/dist-es/side-panel/SidePanelTitle.js +2 -0
- package/dist-es/side-panel/SidePanelTitle.js.map +1 -1
- package/dist-es/side-panel/SidePanelTrigger.js.map +1 -1
- package/dist-es/side-panel/internal/useIsScrollable.js.map +1 -1
- package/dist-es/side-panel/useSidePanel.js +4 -9
- package/dist-es/side-panel/useSidePanel.js.map +1 -1
- package/dist-es/skip-link/internal/useManageFocusOnTarget.js +2 -2
- package/dist-es/skip-link/internal/useManageFocusOnTarget.js.map +1 -1
- package/dist-es/slider/internal/SliderThumb.js.map +1 -1
- package/dist-es/slider/internal/SliderTooltip.js +2 -0
- package/dist-es/slider/internal/SliderTooltip.js.map +1 -1
- package/dist-es/slider/internal/SliderTrack.css.js +1 -1
- package/dist-es/slider/internal/SliderTrack.js +2 -0
- package/dist-es/slider/internal/SliderTrack.js.map +1 -1
- package/dist-es/slider/internal/useRangeSliderThumb.js.map +1 -1
- package/dist-es/slider/internal/useSliderThumb.js.map +1 -1
- package/dist-es/slider/internal/utils.js.map +1 -1
- package/dist-es/stepper/Stepper.js +1 -1
- package/dist-es/stepper/Stepper.js.map +1 -1
- package/dist-es/stepper/internal/StepText.css.js +1 -1
- package/dist-es/stepper/internal/StepText.js +2 -0
- package/dist-es/stepper/internal/StepText.js.map +1 -1
- package/dist-es/switch/Switch.css.js +1 -1
- package/dist-es/table/Table.css.js +1 -1
- package/dist-es/tabs/Tabs.js +1 -1
- package/dist-es/tabs/Tabs.js.map +1 -1
- package/dist-es/tabs/internal/overflow/useOverflow.js.map +1 -1
- package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -1
- package/dist-es/tag/Tag.css.js +1 -1
- package/dist-es/text/Code.js +1 -1
- package/dist-es/text/Code.js.map +1 -1
- package/dist-es/text/Editorial.js +25 -0
- package/dist-es/text/Editorial.js.map +1 -0
- package/dist-es/text/Eyebrow.js +10 -0
- package/dist-es/text/Eyebrow.js.map +1 -0
- package/dist-es/text/Text.css.js +1 -1
- package/dist-es/text/Text.js +6 -2
- package/dist-es/text/Text.js.map +1 -1
- package/dist-es/toast/Toast.css.js +1 -1
- package/dist-es/toggle-button/ToggleButton.js +8 -2
- package/dist-es/toggle-button/ToggleButton.js.map +1 -1
- package/dist-es/toggle-button-group/ToggleButtonGroup.js +71 -8
- package/dist-es/toggle-button-group/ToggleButtonGroup.js.map +1 -1
- package/dist-es/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
- package/dist-es/toggletip/ToggletipPanel.css.js +1 -1
- package/dist-es/toolbar/ToolbarOverflow.js +8 -4
- package/dist-es/toolbar/ToolbarOverflow.js.map +1 -1
- package/dist-es/toolbar/toolbarUtils.js.map +1 -1
- package/dist-es/tooltip/Tooltip.css.js +1 -1
- package/dist-es/tooltip/useAriaAnnounce.js +4 -2
- package/dist-es/tooltip/useAriaAnnounce.js.map +1 -1
- package/dist-es/tooltip/useTooltip.js.map +1 -1
- package/dist-es/tree/TreeContext.js.map +1 -1
- package/dist-es/utils/forkRef.js +32 -0
- package/dist-es/utils/forkRef.js.map +1 -0
- package/dist-es/utils/getRefFromChildren.js.map +1 -1
- package/dist-es/utils/marginMiddleware.js.map +1 -1
- package/dist-es/utils/setRef.js.map +1 -1
- package/dist-es/utils/useFloatingUI/useFloatingUI.js.map +1 -1
- package/dist-es/utils/useForkRef.js +3 -6
- package/dist-es/utils/useForkRef.js.map +1 -1
- package/dist-es/utils/useResizeObserver.js.map +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
- package/dist-types/checkbox/CheckboxIcon.d.ts +2 -1
- package/dist-types/collapsible/CollapsiblePanel.d.ts +8 -1
- package/dist-types/combo-box/ComboBox.d.ts +2 -2
- package/dist-types/combo-box/useComboBox.d.ts +3 -6
- package/dist-types/dropdown/Dropdown.d.ts +2 -2
- package/dist-types/form-field/FormFieldHelperText.d.ts +1 -1
- package/dist-types/form-field/FormFieldLabel.d.ts +1 -1
- package/dist-types/form-field-context/FormFieldContext.d.ts +1 -1
- package/dist-types/index.d.ts +1 -0
- package/dist-types/interactable-card/InteractableCardGroupContext.d.ts +2 -0
- package/dist-types/interactable-card/useInteractableCard.d.ts +1 -2
- package/dist-types/list-box/ListBox.d.ts +2 -2
- package/dist-types/list-control/ListControlContext.d.ts +1 -1
- package/dist-types/list-control/ListControlNavigationKeys.d.ts +30 -0
- package/dist-types/list-control/ListControlOptionContext.d.ts +18 -0
- package/dist-types/list-control/ListControlOptionStore.d.ts +17 -0
- package/dist-types/list-control/ListControlProvider.d.ts +11 -0
- package/dist-types/list-control/ListControlRegistry.d.ts +22 -0
- package/dist-types/list-control/ListControlState.d.ts +6 -6
- package/dist-types/on-solid-button/OnSolidButton.d.ts +12 -0
- package/dist-types/on-solid-button/index.d.ts +1 -0
- package/dist-types/option/Option.d.ts +3 -1
- package/dist-types/overlay/Overlay.d.ts +2 -1
- package/dist-types/overlay/OverlayContext.d.ts +4 -0
- package/dist-types/overlay/OverlayFooter.d.ts +4 -0
- package/dist-types/overlay/hasOverlaySection.d.ts +2 -0
- package/dist-types/overlay/index.d.ts +1 -0
- package/dist-types/pill/PillCheckIcon.d.ts +2 -1
- package/dist-types/registerClassNameInjection.d.ts +0 -2
- package/dist-types/salt-provider/SaltProvider.d.ts +1 -1
- package/dist-types/side-panel/internal/useIsScrollable.d.ts +1 -1
- package/dist-types/skip-link/internal/useManageFocusOnTarget.d.ts +1 -1
- package/dist-types/slider/internal/SliderThumb.d.ts +2 -2
- package/dist-types/slider/internal/SliderTrack.d.ts +2 -2
- package/dist-types/slider/internal/useRangeSliderThumb.d.ts +1 -1
- package/dist-types/slider/internal/useSliderThumb.d.ts +1 -1
- package/dist-types/slider/internal/utils.d.ts +1 -1
- package/dist-types/tabs/internal/overflow/useOverflow.d.ts +2 -2
- package/dist-types/tabs/internal/overflow/useRenderedTabWidth.d.ts +1 -1
- package/dist-types/text/Editorial.d.ts +7 -0
- package/dist-types/text/Eyebrow.d.ts +2 -0
- package/dist-types/text/Text.d.ts +9 -2
- package/dist-types/text/index.d.ts +2 -0
- package/dist-types/toggle-button/ToggleButton.d.ts +1 -1
- package/dist-types/toggle-button-group/ToggleButtonGroupContext.d.ts +2 -1
- package/dist-types/tooltip/useTooltip.d.ts +12 -26
- package/dist-types/tree/TreeContext.d.ts +1 -1
- package/dist-types/utils/forkRef.d.ts +11 -0
- package/dist-types/utils/inferElementType.d.ts +1 -2
- package/dist-types/utils/marginMiddleware.d.ts +1 -1
- package/dist-types/utils/setRef.d.ts +4 -0
- package/dist-types/utils/useFloatingUI/useFloatingUI.d.ts +1 -5
- package/dist-types/utils/useResizeObserver.d.ts +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButtonGroup.js","sources":["../src/toggle-button-group/ToggleButtonGroup.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { ButtonAppearance, ButtonSentiment } from \"../button\";\nimport {\n makePrefixer,\n ownerDocument,\n useControlled,\n useForkRef,\n} from \"../utils\";\nimport toggleButtonGroupCss from \"./ToggleButtonGroup.css\";\nimport {\n ToggleButtonGroupContext,\n type Value,\n} from \"./ToggleButtonGroupContext\";\n\nexport interface ToggleButtonGroupProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * The appearance of all the toggle buttons within the group.\n * @default solid\n */\n appearance?: Extract<ButtonAppearance, \"bordered\" | \"solid\">;\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue?: Value;\n /**\n * If `true`, the Toggle Button Group will be disabled.\n */\n disabled?: boolean;\n /**\n * Value of the toggle button group, to be used when the component is controlled.\n */\n value?: Value;\n /**\n * Callback fired when the selection changes.\n */\n onChange?: (event: SyntheticEvent<HTMLButtonElement>) => void;\n /**\n * If `true`, the toggle button group will be read-only.\n */\n readOnly?: boolean;\n /**\n * The orientation of the toggle buttons.\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The visual sentimenent of all the toggle buttons within the group.\n * @default neutral\n */\n sentiment?: ButtonSentiment;\n}\n\nconst withBaseName = makePrefixer(\"saltToggleButtonGroup\");\n\nexport const ToggleButtonGroup = forwardRef<\n HTMLDivElement,\n ToggleButtonGroupProps\n>(function ToggleButtonGroup(props, ref) {\n const {\n appearance,\n children,\n className,\n value: valueProp,\n defaultValue,\n disabled,\n onChange,\n onKeyDown,\n orientation = \"horizontal\",\n readOnly,\n sentiment,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toggle-button-group\",\n css: toggleButtonGroupCss,\n window: targetWindow,\n });\n\n const groupRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, groupRef);\n\n const [value, setValue] = useControlled({\n default: defaultValue,\n controlled: valueProp,\n name: \"ToggleButtonGroup\",\n state: \"value\",\n });\n const [focused, setFocused] = useState<Value>(value);\n\n const select = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>) => {\n const newValue = event.currentTarget.value;\n setValue(newValue);\n if (value !== newValue) {\n onChange?.(event);\n }\n },\n [onChange, value],\n );\n\n const isSelected = useCallback(\n (id: Value) => {\n return value === id;\n },\n [value],\n );\n\n const focus = useCallback((id: Value) => {\n setFocused(id);\n }, []);\n\n const isFocused = useCallback(\n (id: Value) => {\n return focused === id || !focused;\n },\n [focused],\n );\n\n const contextValue = useMemo(\n () => ({\n appearance,\n disabled,\n focus,\n isFocused,\n isSelected,\n orientation,\n readOnly,\n select,\n sentiment,\n }),\n [\n appearance,\n disabled,\n focus,\n isFocused,\n isSelected,\n orientation,\n readOnly,\n select,\n sentiment,\n ],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const elements: HTMLElement[] = Array.from(\n groupRef.current?.querySelectorAll(\"button:not([disabled])\") ?? [],\n );\n\n const doc = ownerDocument(groupRef.current);\n\n const currentIndex = elements.indexOf(doc.activeElement as HTMLElement);\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n elements[(currentIndex + 1) % elements.length]?.focus();\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n elements[\n (currentIndex - 1 + elements.length) % elements.length\n ]?.focus();\n break;\n }\n\n onKeyDown?.(event);\n };\n\n return (\n <ToggleButtonGroupContext.Provider value={contextValue}>\n <div\n aria-disabled={disabled}\n aria-readonly={readOnly}\n className={clsx(\n withBaseName(),\n withBaseName(orientation),\n disabled && withBaseName(\"disabled\"),\n readOnly && withBaseName(\"readOnly\"),\n className,\n )}\n role=\"radiogroup\"\n ref={handleRef}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n </div>\n </ToggleButtonGroupContext.Provider>\n );\n});\n"],"names":["ToggleButtonGroup","toggleButtonGroupCss"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToggleButtonGroup.js","sources":["../src/toggle-button-group/ToggleButtonGroup.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { ButtonAppearance, ButtonSentiment } from \"../button\";\nimport {\n makePrefixer,\n ownerDocument,\n useControlled,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\nimport toggleButtonGroupCss from \"./ToggleButtonGroup.css\";\nimport {\n ToggleButtonGroupContext,\n type Value,\n} from \"./ToggleButtonGroupContext\";\n\nexport interface ToggleButtonGroupProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * The appearance of all the toggle buttons within the group.\n * @default solid\n */\n appearance?: Extract<ButtonAppearance, \"bordered\" | \"solid\">;\n /**\n * The default value. Use when the component is not controlled.\n */\n defaultValue?: Value;\n /**\n * If `true`, the Toggle Button Group will be disabled.\n */\n disabled?: boolean;\n /**\n * Value of the toggle button group, to be used when the component is controlled.\n */\n value?: Value;\n /**\n * Callback fired when the selection changes.\n */\n onChange?: (event: SyntheticEvent<HTMLButtonElement>) => void;\n /**\n * If `true`, the toggle button group will be read-only.\n */\n readOnly?: boolean;\n /**\n * The orientation of the toggle buttons.\n */\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * The visual sentimenent of all the toggle buttons within the group.\n * @default neutral\n */\n sentiment?: ButtonSentiment;\n}\n\nconst withBaseName = makePrefixer(\"saltToggleButtonGroup\");\n\nfunction isSameValue(a: Value, b: Value) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return (\n a.length === b.length && a.every((value, index) => value === b[index])\n );\n }\n return a === b;\n}\n\ninterface RegisteredButton {\n element: HTMLElement;\n value: Value;\n}\n\nconst sortButtons = (buttons: RegisteredButton[]) =>\n [...buttons].sort((buttonA, buttonB) => {\n const position = buttonA.element.compareDocumentPosition(buttonB.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n });\n\nconst buttonsAreEqual = (\n buttonsA: RegisteredButton[],\n buttonsB: RegisteredButton[],\n) =>\n buttonsA.length === buttonsB.length &&\n buttonsA.every((button, index) => button === buttonsB[index]);\n\nexport const ToggleButtonGroup = forwardRef<\n HTMLDivElement,\n ToggleButtonGroupProps\n>(function ToggleButtonGroup(props, ref) {\n const {\n appearance,\n children,\n className,\n value: valueProp,\n defaultValue,\n disabled,\n onChange,\n onKeyDown,\n orientation = \"horizontal\",\n readOnly,\n sentiment,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toggle-button-group\",\n css: toggleButtonGroupCss,\n window: targetWindow,\n });\n\n const groupRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, groupRef);\n\n const [value, setValue] = useControlled({\n default: defaultValue,\n controlled: valueProp,\n name: \"ToggleButtonGroup\",\n state: \"value\",\n });\n const [focused, setFocused] = useState<Value>(value);\n const [enabledButtons, setEnabledButtons] = useState<RegisteredButton[]>([]);\n\n const registerButton = useCallback(\n (buttonValue: Value, element: HTMLElement) => {\n const button = { element, value: buttonValue };\n setEnabledButtons((currentButtons) =>\n sortButtons([\n ...currentButtons.filter(\n (currentButton) => currentButton.element !== element,\n ),\n button,\n ]),\n );\n\n return () => {\n setEnabledButtons((currentButtons) =>\n currentButtons.includes(button)\n ? currentButtons.filter(\n (registeredButton) => registeredButton !== button,\n )\n : currentButtons,\n );\n };\n },\n [],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-sorts registered buttons after children move.\n useIsomorphicLayoutEffect(() => {\n setEnabledButtons((currentButtons) => {\n const sortedButtons = sortButtons(currentButtons);\n return buttonsAreEqual(currentButtons, sortedButtons)\n ? currentButtons\n : sortedButtons;\n });\n }, [children]);\n\n const select = useCallback(\n (\n event: SyntheticEvent<HTMLButtonElement>,\n ...values: [newValue?: Value]\n ) => {\n const newValue =\n values.length === 0 ? event.currentTarget.value : values[0];\n setValue(newValue);\n if (!isSameValue(value, newValue)) {\n onChange?.(event);\n }\n },\n [onChange, value],\n );\n\n const isSelected = useCallback(\n (id: Value) => {\n return isSameValue(value, id);\n },\n [value],\n );\n\n const focus = useCallback((id: Value) => {\n setFocused(id);\n }, []);\n\n const isFocused = useCallback(\n (id: Value) => {\n // Trust the focused value until buttons register (e.g. server rendering).\n if (enabledButtons.length === 0) {\n return focused === id || focused === undefined || focused === \"\";\n }\n\n const hasFocusTarget = enabledButtons.some((button) =>\n isSameValue(button.value, focused),\n );\n\n return isSameValue(\n hasFocusTarget ? focused : enabledButtons[0].value,\n id,\n );\n },\n [focused, enabledButtons],\n );\n\n const contextValue = useMemo(\n () => ({\n appearance,\n disabled,\n focus,\n isFocused,\n isSelected,\n orientation,\n readOnly,\n registerButton,\n select,\n sentiment,\n }),\n [\n appearance,\n disabled,\n focus,\n isFocused,\n isSelected,\n orientation,\n readOnly,\n registerButton,\n select,\n sentiment,\n ],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n // Leave modified arrow keys (e.g. browser history shortcuts) to the browser.\n if (event.altKey || event.ctrlKey || event.metaKey) {\n onKeyDown?.(event);\n return;\n }\n\n const elements: HTMLElement[] = Array.from(\n groupRef.current?.querySelectorAll(\"button:not([disabled])\") ?? [],\n );\n\n const doc = ownerDocument(groupRef.current);\n\n const currentIndex = elements.indexOf(doc.activeElement as HTMLElement);\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n if (elements.length > 0) {\n event.preventDefault();\n elements[(currentIndex + 1) % elements.length]?.focus();\n }\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n if (elements.length > 0) {\n event.preventDefault();\n elements[\n (currentIndex - 1 + elements.length) % elements.length\n ]?.focus();\n }\n break;\n }\n\n onKeyDown?.(event);\n };\n\n return (\n <ToggleButtonGroupContext.Provider value={contextValue}>\n <div\n aria-disabled={disabled}\n aria-readonly={readOnly}\n className={clsx(\n withBaseName(),\n withBaseName(orientation),\n disabled && withBaseName(\"disabled\"),\n readOnly && withBaseName(\"readOnly\"),\n className,\n )}\n role=\"radiogroup\"\n ref={handleRef}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n </div>\n </ToggleButtonGroupContext.Provider>\n );\n});\n"],"names":["ToggleButtonGroup","toggleButtonGroupCss"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToggleButtonGroupContext.js","sources":["../src/toggle-button-group/ToggleButtonGroupContext.ts"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport type { ButtonAppearance, ButtonSentiment } from \"../button\";\nimport { createContext } from \"../utils\";\n\nexport type Value = string | readonly string[] | number | undefined;\n\nexport interface ToggleButtonGroupContextValue {\n appearance?: Extract<ButtonAppearance, \"bordered\" | \"solid\">;\n disabled?: boolean;\n focus: (id: Value) => void;\n isFocused: (id: Value) => boolean;\n isSelected: (id: Value) => boolean;\n orientation: \"horizontal\" | \"vertical\";\n readOnly?: boolean;\n select: (event: SyntheticEvent<HTMLButtonElement
|
|
1
|
+
{"version":3,"file":"ToggleButtonGroupContext.js","sources":["../src/toggle-button-group/ToggleButtonGroupContext.ts"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport type { ButtonAppearance, ButtonSentiment } from \"../button\";\nimport { createContext } from \"../utils\";\n\nexport type Value = string | readonly string[] | number | undefined;\n\nexport interface ToggleButtonGroupContextValue {\n appearance?: Extract<ButtonAppearance, \"bordered\" | \"solid\">;\n disabled?: boolean;\n focus: (id: Value) => void;\n isFocused: (id: Value) => boolean;\n isSelected: (id: Value) => boolean;\n orientation: \"horizontal\" | \"vertical\";\n readOnly?: boolean;\n registerButton: (value: Value, element: HTMLElement) => () => void;\n select: (event: SyntheticEvent<HTMLButtonElement>, value?: Value) => void;\n sentiment?: ButtonSentiment;\n}\n\nexport const ToggleButtonGroupContext = createContext<\n ToggleButtonGroupContextValue | undefined\n>(\"ToggleButtonGroupContext\", undefined);\n\nexport function useToggleButtonGroup() {\n return useContext(ToggleButtonGroupContext);\n}\n"],"names":[],"mappings":";;;;;;;;;AAmBO,MAAM,wBAAA,GAA2B,aAAA,CAEtC,0BAAA,EAA4B,MAAS;AAEhC,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAO,WAAW,wBAAwB,CAAA;AAC5C;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css_248z = ".saltToggletipPanel {\n --toggletip-background: var(--salt-container-primary-background);\n --toggletip-borderColor: var(--salt-container-bold-borderColor);\n\n box-sizing: border-box;\n padding: var(--salt-spacing-100);\n\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--toggletip-borderColor);\n border-radius: var(--salt-palette-corner-weak);\n\n background: var(--toggletip-background);\n box-shadow: var(--salt-overlayable-shadow-popout);\n\n color: var(--salt-content-primary-foreground);\n z-index: var(--salt-zIndex-flyover);\n\n max-width: 45ch;\n max-height: 100vh;\n}\n\n.saltToggletipPanel-content {\n max-height: 100%;\n overflow-y: auto;\n}\n\n.saltToggletipPanel-content:focus-visible {\n outline-offset: var(--salt-spacing-fixed-100);\n}\n";
|
|
1
|
+
var css_248z = ".saltToggletipPanel {\n --toggletip-background: var(--salt-container-primary-background);\n --toggletip-borderColor: var(--salt-container-bold-borderColor);\n\n box-sizing: border-box;\n padding: var(--salt-spacing-100);\n\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n letter-spacing: var(--salt-text-letterSpacing);\n\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--toggletip-borderColor);\n border-radius: var(--salt-palette-corner-weak);\n\n background: var(--toggletip-background);\n box-shadow: var(--salt-overlayable-shadow-popout);\n\n color: var(--salt-content-primary-foreground);\n z-index: var(--salt-zIndex-flyover);\n\n max-width: 45ch;\n max-height: 100vh;\n}\n\n.saltToggletipPanel-content {\n max-height: 100%;\n overflow-y: auto;\n}\n\n.saltToggletipPanel-content:focus-visible {\n outline-offset: var(--salt-spacing-fixed-100);\n}\n";
|
|
2
2
|
|
|
3
3
|
export { css_248z as default };
|
|
4
4
|
//# sourceMappingURL=ToggletipPanel.css.js.map
|
|
@@ -117,6 +117,7 @@ function ToolbarOverflowItemOwner({
|
|
|
117
117
|
}) {
|
|
118
118
|
const targetWindow = useWindow();
|
|
119
119
|
const [mountNode, setMountNode] = useState(null);
|
|
120
|
+
const mountNodeRef = useRef(null);
|
|
120
121
|
const mainToolbarTabIndexMemoryRef = useRef(
|
|
121
122
|
/* @__PURE__ */ new WeakMap()
|
|
122
123
|
);
|
|
@@ -127,15 +128,18 @@ function ToolbarOverflowItemOwner({
|
|
|
127
128
|
}
|
|
128
129
|
const boundaryKey = host ? currentOverflowBoundaryKey : lastOverflowBoundaryKeyRef.current;
|
|
129
130
|
useIsomorphicLayoutEffect(() => {
|
|
130
|
-
|
|
131
|
-
|
|
131
|
+
var _a;
|
|
132
|
+
const ownerDocument = targetWindow == null ? void 0 : targetWindow.document;
|
|
133
|
+
if (!ownerDocument) {
|
|
132
134
|
return;
|
|
133
135
|
}
|
|
136
|
+
const nextMountNode = ((_a = mountNodeRef.current) == null ? void 0 : _a.ownerDocument) === ownerDocument ? mountNodeRef.current : ownerDocument.createElement("div");
|
|
134
137
|
nextMountNode.className = withBaseName("contentHost");
|
|
138
|
+
mountNodeRef.current = nextMountNode;
|
|
135
139
|
setMountNode(nextMountNode);
|
|
136
140
|
return () => {
|
|
137
|
-
var
|
|
138
|
-
(
|
|
141
|
+
var _a2;
|
|
142
|
+
(_a2 = nextMountNode.parentElement) == null ? void 0 : _a2.removeChild(nextMountNode);
|
|
139
143
|
};
|
|
140
144
|
}, [targetWindow]);
|
|
141
145
|
useIsomorphicLayoutEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarOverflow.js","sources":["../src/toolbar/ToolbarOverflow.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { compute } from \"compute-scroll-into-view\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\nimport { ToolbarContent } from \"./ToolbarContent\";\nimport toolbarOverflowCss from \"./ToolbarOverflow.css\";\nimport {\n getToolbarOverflowBoundaryKey,\n isTargetInsideOverflowBoundary,\n ToolbarOverflowFloatingComponentProvider,\n useToolbarOverflowFloatingBoundary,\n} from \"./ToolbarOverflowFloatingBoundary\";\nimport {\n getDocumentFocusableElements,\n getToolbarFocusMemory,\n getToolbarScopeFocusableElements,\n getToolbarTabMoveTarget,\n scheduleToolbarFocus,\n shouldToolbarPreserveNativeTab,\n TOOLBAR_GROUP_KEY_ATTR,\n TOOLBAR_ITEM_ATTR,\n TOOLBAR_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_SCOPE_ROOT_ATTR,\n type ToolbarFocusMemory,\n toolbarFocusableSelector,\n} from \"./toolbarKeyboardUtils\";\nimport type { ToolbarContentModel, ToolbarOverflowItem } from \"./toolbarUtils\";\nimport { buildContentOverflowRenderSlots } from \"./toolbarUtils\";\nimport { useToolbarKeyboardNavigation } from \"./useToolbarKeyboardNavigation\";\nimport type { ToolbarOverflowGroup } from \"./useToolbarOverflow\";\n\nconst withBaseName = makePrefixer(\"saltToolbarOverflow\");\n\nexport type ToolbarItemHostKind = \"main\" | \"measurement\" | \"overflow\";\n\nconst toolbarStatefulFocusRootSelector = [\n \".saltComboBox-focused\",\n \".saltDateInput-focused\",\n \".saltInput-focused\",\n].join(\", \");\n\nconst toolbarOverflowFocusScrollRootSelector = [\n \".saltComboBox\",\n \".saltDateInput\",\n \".saltDropdown\",\n \".saltInput\",\n \".saltSwitch\",\n].join(\", \");\n\ntype ToolbarOverflowOpenModality = \"keyboard\" | \"pointer\" | null;\n\nfunction createToolbarFocusEvent(\n eventName: \"blur\" | \"focusout\",\n target: HTMLElement,\n relatedTarget: Element | null,\n) {\n const FocusEventCtor = target.ownerDocument.defaultView?.FocusEvent;\n const eventInit = {\n bubbles: eventName === \"focusout\",\n relatedTarget,\n };\n\n return FocusEventCtor\n ? new FocusEventCtor(eventName, eventInit)\n : new Event(eventName, eventInit);\n}\n\nfunction notifyToolbarReparentedFocusLoss(mountNode: HTMLDivElement) {\n const activeElement = mountNode.ownerDocument.activeElement;\n\n if (mountNode.contains(activeElement)) {\n return;\n }\n\n // Browser focus can move to the document when a portaled toolbar item is\n // reparented, without notifying controls that keep their own focused state.\n const staleFocusTargets = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarStatefulFocusRootSelector),\n )\n .map(\n (root) =>\n root.querySelector<HTMLElement>(\"input\") ??\n root.querySelector<HTMLElement>(toolbarFocusableSelector),\n )\n .filter((target): target is HTMLElement => target != null);\n\n for (const target of staleFocusTargets) {\n const relatedTarget =\n activeElement instanceof Element ? activeElement : null;\n\n target.dispatchEvent(\n createToolbarFocusEvent(\"blur\", target, relatedTarget),\n );\n target.dispatchEvent(\n createToolbarFocusEvent(\"focusout\", target, relatedTarget),\n );\n }\n}\n\nfunction getToolbarOverflowFocusScrollTarget(target: HTMLElement) {\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_ITEM_ATTR}]`);\n const controlRoot = target.closest<HTMLElement>(\n toolbarOverflowFocusScrollRootSelector,\n );\n\n return controlRoot && itemRoot?.contains(controlRoot) ? controlRoot : target;\n}\n\nfunction getToolbarOverflowPanelInlinePadding(target: HTMLElement) {\n const panelContent = target.closest<HTMLElement>(\n `[${TOOLBAR_SCOPE_ROOT_ATTR}]`,\n );\n const styles =\n panelContent?.ownerDocument.defaultView?.getComputedStyle(panelContent);\n\n return {\n left: Number.parseFloat(styles?.paddingLeft ?? \"0\") || 0,\n right: Number.parseFloat(styles?.paddingRight ?? \"0\") || 0,\n };\n}\n\nfunction scrollToolbarOverflowTargetIntoView(\n panel: HTMLDivElement | null,\n target: HTMLElement,\n) {\n if (!panel || !panel.contains(target)) {\n return;\n }\n\n const scrollTarget = getToolbarOverflowFocusScrollTarget(target);\n const actions = compute(scrollTarget, {\n block: \"nearest\",\n boundary: panel,\n inline: \"nearest\",\n scrollMode: \"if-needed\",\n });\n\n for (const { el, left, top } of actions) {\n if (el === panel) {\n const targetRect = scrollTarget.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportLeft = panelRect.left + panel.clientLeft;\n const viewportRight = viewportLeft + panel.clientWidth;\n const padding = getToolbarOverflowPanelInlinePadding(scrollTarget);\n const nextLeft =\n targetRect.left < viewportLeft + padding.left\n ? left - padding.left\n : targetRect.right > viewportRight - padding.right\n ? left + padding.right\n : left;\n\n el.scrollLeft = Math.max(0, nextLeft);\n } else {\n el.scrollLeft = left;\n }\n\n el.scrollTop = top;\n }\n}\n\nfunction canSeedOverflowFocusMemory(\n focusMemory: ToolbarFocusMemory | null | undefined,\n group: ToolbarOverflowGroup,\n): focusMemory is Extract<ToolbarFocusMemory, { type: \"item\" }> {\n return (\n focusMemory?.type === \"item\" &&\n group.items.some((item) => item.id === focusMemory.itemId)\n );\n}\n\ninterface ToolbarOverflowOwnersProps {\n hostNodes: Record<string, HTMLDivElement | null>;\n items: ToolbarOverflowItem[];\n}\n\nfunction ToolbarOverflowItemOwner({\n host,\n item,\n}: {\n host: HTMLDivElement | null;\n item: ToolbarOverflowItem;\n}) {\n const targetWindow = useWindow();\n const [mountNode, setMountNode] = useState<HTMLDivElement | null>(null);\n const mainToolbarTabIndexMemoryRef = useRef(\n new WeakMap<HTMLElement, string | null>(),\n );\n const lastOverflowBoundaryKeyRef = useRef<string | null>(null);\n const currentOverflowBoundaryKey = getToolbarOverflowBoundaryKey(host);\n\n if (host) {\n lastOverflowBoundaryKeyRef.current = currentOverflowBoundaryKey;\n }\n\n const boundaryKey = host\n ? currentOverflowBoundaryKey\n : lastOverflowBoundaryKeyRef.current;\n\n useIsomorphicLayoutEffect(() => {\n const nextMountNode = targetWindow?.document.createElement(\"div\");\n\n if (!nextMountNode) {\n return;\n }\n\n nextMountNode.className = withBaseName(\"contentHost\");\n setMountNode(nextMountNode);\n\n return () => {\n nextMountNode.parentElement?.removeChild(nextMountNode);\n };\n }, [targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (!mountNode) {\n return;\n }\n\n if (host) {\n if (mountNode.parentElement !== host) {\n host.appendChild(mountNode);\n notifyToolbarReparentedFocusLoss(mountNode);\n }\n\n const isMainToolbarHost =\n host\n .closest(`[${TOOLBAR_SCOPE_ROOT_ATTR}]`)\n ?.getAttribute(TOOLBAR_SCOPE_ROOT_ATTR) === \"main\";\n\n if (isMainToolbarHost) {\n const focusableElements = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarFocusableSelector),\n );\n\n for (const element of focusableElements) {\n const rememberedTabIndex =\n mainToolbarTabIndexMemoryRef.current.get(element);\n\n if (rememberedTabIndex !== undefined) {\n if (rememberedTabIndex == null) {\n element.removeAttribute(\"tabindex\");\n } else {\n element.setAttribute(\"tabindex\", rememberedTabIndex);\n }\n }\n }\n\n for (const element of focusableElements) {\n mainToolbarTabIndexMemoryRef.current.set(\n element,\n element.getAttribute(\"tabindex\"),\n );\n }\n }\n\n return;\n }\n\n notifyToolbarReparentedFocusLoss(mountNode);\n mountNode.parentElement?.removeChild(mountNode);\n }, [host, mountNode]);\n\n if (!mountNode) {\n return null;\n }\n\n const clonedItem = cloneElement(\n item.element as ReactElement<Record<string, ReactNode>>,\n {\n [TOOLBAR_GROUP_KEY_ATTR]: item.overflowGroupKey,\n [TOOLBAR_ITEM_ATTR]: item.id,\n },\n );\n const itemContent = (\n <ToolbarOverflowFloatingComponentProvider boundaryKey={boundaryKey}>\n {clonedItem}\n </ToolbarOverflowFloatingComponentProvider>\n );\n\n return createPortal(itemContent, mountNode);\n}\n\nexport function ToolbarOverflowOwners({\n hostNodes,\n items,\n}: ToolbarOverflowOwnersProps) {\n return (\n <>\n {items.map((item) => (\n <ToolbarOverflowItemOwner\n host={hostNodes[item.id] ?? null}\n item={item}\n key={item.id}\n />\n ))}\n </>\n );\n}\n\nfunction cloneDecorations(\n itemId: string,\n decorations: ReactElement[],\n slot: \"leading\" | \"trailing\",\n) {\n return Children.toArray(decorations).flatMap((decoration) => {\n if (!isValidElement(decoration)) {\n return [];\n }\n\n return [\n cloneElement(decoration, {\n key: `${itemId}-${slot}-${String(\n decoration.key ??\n (typeof decoration.type === \"string\"\n ? decoration.type\n : \"decoration\"),\n )}`,\n }),\n ];\n });\n}\n\nexport function ToolbarOverflowTriggerContent({\n label,\n named,\n}: {\n label: string;\n named: boolean;\n}) {\n const { OverflowIcon } = useIcon();\n\n if (named) {\n return <>{label}</>;\n }\n\n return <OverflowIcon aria-hidden />;\n}\n\nfunction getOverflowTriggerLabel(group: ToolbarOverflowGroup) {\n return group.named\n ? `${group.label} overflow. Hidden controls.`\n : \"Overflow. Hidden controls.\";\n}\n\ninterface ToolbarOverflowMenuProps {\n focusMemoryRef?: RefObject<ToolbarFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n group: ToolbarOverflowGroup;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n}\n\nexport function ToolbarOverflowMenu({\n focusMemoryRef,\n getItemHostRef,\n group,\n onItemFocus,\n}: ToolbarOverflowMenuProps) {\n const panelId = useId();\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelContentRef = useRef<HTMLDivElement>(null);\n const [panelContentNode, setPanelContentNode] =\n useState<HTMLDivElement | null>(null);\n const wasOpenRef = useRef(false);\n const focusedOpenPanelRef = useRef(false);\n const openModalityRef = useRef<ToolbarOverflowOpenModality>(null);\n const floatingBoundary = useToolbarOverflowFloatingBoundary();\n const {\n focusEntryTarget,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberedFocusRef,\n } = useToolbarKeyboardNavigation({\n includeTabIndexMinusOne: true,\n items: group.items,\n scopeRef: panelContentRef,\n });\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen) {\n openModalityRef.current = null;\n }\n\n if (!nextOpen && reason === \"escape-key\") {\n scheduleToolbarFocus(triggerRef.current);\n }\n },\n placement: \"bottom-end\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context, {\n escapeKey: false,\n outsidePress(event) {\n return !isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.target,\n );\n },\n }),\n ]);\n\n const handleTriggerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open && [\"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n openModalityRef.current = \"keyboard\";\n setOpen(true);\n return;\n }\n\n if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n }\n },\n [open],\n );\n\n const handleTriggerPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handleTriggerMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handlePanelKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (\n panelContent &&\n target instanceof HTMLElement &&\n shouldToolbarPreserveNativeTab(target)\n ) {\n const focusableElements = getDocumentFocusableElements(\n panelContent.ownerDocument,\n );\n const currentIndex = focusableElements.indexOf(target);\n const nextFocusTarget =\n focusableElements[currentIndex + (event.shiftKey ? -1 : 1)];\n\n if (\n currentIndex !== -1 &&\n nextFocusTarget &&\n panelContent.contains(nextFocusTarget)\n ) {\n return;\n }\n }\n }\n\n if (event.key === \"Tab\" && !event.shiftKey) {\n const toolbarRoot = triggerRef.current?.closest<HTMLElement>(\n `[${TOOLBAR_SCOPE_ROOT_ATTR}]`,\n );\n const nextFocusTarget = toolbarRoot\n ? getToolbarTabMoveTarget(toolbarRoot, false)\n : null;\n\n if (nextFocusTarget) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(nextFocusTarget);\n }\n\n return;\n }\n\n if (event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n }\n }, []);\n\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n const handlePanelRef = useForkRef<HTMLDivElement>(panelRef, refs.setFloating);\n const handlePanelContentRef = useForkRef<HTMLDivElement>(\n panelContentRef,\n setPanelContentNode,\n );\n const handlePanelFocus = useCallback(\n (event: FocusEvent) => {\n handleScopeFocus(event);\n\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (!panelContent || !(target instanceof HTMLElement)) {\n return;\n }\n\n const focusMemory = getToolbarFocusMemory(panelContent, target, {\n includeTabIndexMinusOne: true,\n });\n\n if (focusMemory?.type !== \"item\") {\n return;\n }\n\n scrollToolbarOverflowTargetIntoView(panelRef.current, target);\n onItemFocus?.(focusMemory.itemId, focusMemory.controlIndex);\n },\n [handleScopeFocus, onItemFocus],\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n const externalFocusMemory = focusMemoryRef?.current;\n\n if (canSeedOverflowFocusMemory(externalFocusMemory, group)) {\n rememberedFocusRef.current = externalFocusMemory;\n }\n\n if (openModalityRef.current !== \"pointer\") {\n focusEntryTarget();\n }\n }\n\n wasOpenRef.current = open;\n }, [focusEntryTarget, focusMemoryRef, group, open, rememberedFocusRef]);\n\n useEffect(() => {\n if (!open || !panelContentNode) {\n return;\n }\n\n const handleFocusIn = (event: FocusEvent) => {\n handlePanelFocus(event);\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (\n isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.relatedTarget,\n )\n ) {\n return;\n }\n\n handleScopeBlur(event);\n };\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n handleScopeKeyDown(event);\n };\n const handlePointerDownCapture = (event: PointerEvent) => {\n handleScopePointerDown(event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented) {\n handlePanelKeyDown(event);\n }\n };\n\n panelContentNode.addEventListener(\"focusin\", handleFocusIn);\n panelContentNode.addEventListener(\"focusout\", handleFocusOut);\n panelContentNode.addEventListener(\"keydown\", handleKeyDownCapture, true);\n panelContentNode.addEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n panelContentNode.removeEventListener(\"focusin\", handleFocusIn);\n panelContentNode.removeEventListener(\"focusout\", handleFocusOut);\n panelContentNode.removeEventListener(\n \"keydown\",\n handleKeyDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n handlePanelFocus,\n handlePanelKeyDown,\n handleScopeBlur,\n handleScopeKeyDown,\n handleScopePointerDown,\n floatingBoundary,\n group.key,\n open,\n panelContentNode,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n focusedOpenPanelRef.current = false;\n return;\n }\n\n if (\n !panelContentNode ||\n focusedOpenPanelRef.current ||\n openModalityRef.current === \"pointer\"\n ) {\n return;\n }\n\n const getPanelFocusables = () =>\n getToolbarScopeFocusableElements(panelContentNode, {\n includeTabIndexMinusOne: true,\n });\n const focusEntryWhenReady = () => {\n const panelFocusables = getPanelFocusables();\n\n if (panelFocusables.length === 0) {\n return false;\n }\n\n focusedOpenPanelRef.current = true;\n focusEntryTarget();\n return true;\n };\n\n if (focusEntryWhenReady()) {\n return;\n }\n\n const panelWindow = panelContentNode.ownerDocument.defaultView;\n const mutationObserverCtor = panelWindow?.MutationObserver;\n const resizeObserverCtor = panelWindow?.ResizeObserver;\n let mutationObserver: MutationObserver | null = null;\n let resizeObserver: ResizeObserver | null = null;\n\n mutationObserver =\n mutationObserverCtor != null\n ? new mutationObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n resizeObserver =\n resizeObserverCtor != null\n ? new resizeObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n\n mutationObserver?.observe(panelContentNode, {\n childList: true,\n subtree: true,\n });\n resizeObserver?.observe(panelContentNode);\n\n return () => {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n };\n }, [focusEntryTarget, open, panelContentNode]);\n\n return (\n <div\n className={withBaseName(\"menu\")}\n data-overflowgroup={group.overflowGroup}\n >\n <Button\n appearance=\"transparent\"\n aria-controls={panelId}\n aria-expanded={open}\n aria-label={getOverflowTriggerLabel(group)}\n className={withBaseName(\"trigger\")}\n {...{\n [TOOLBAR_GROUP_KEY_ATTR]: group.key,\n [TOOLBAR_OVERFLOW_TRIGGER_ATTR]: \"\",\n }}\n {...getReferenceProps({\n onKeyDown: handleTriggerKeyDown,\n onMouseDown: handleTriggerMouseDown,\n onPointerDown: handleTriggerPointerDown,\n })}\n ref={handleTriggerRef}\n sentiment=\"neutral\"\n >\n <ToolbarOverflowTriggerContent\n label={group.label}\n named={group.named}\n />\n </Button>\n <FloatingComponent\n {...getFloatingProps({\n role: \"presentation\",\n })}\n className={withBaseName(\"panel\")}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: -1,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: false,\n }\n : undefined\n }\n id={panelId}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={handlePanelRef}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n aria-label={`${group.label} overflow`}\n aria-orientation=\"horizontal\"\n className={withBaseName(\"panelContent\")}\n {...{ [TOOLBAR_SCOPE_ROOT_ATTR]: group.key }}\n role=\"toolbar\"\n ref={handlePanelContentRef}\n >\n {group.items.map((item, index) => (\n <div\n className={withBaseName(\"panelItem\")}\n key={`${group.id}-${item.id}`}\n >\n {index > 0 &&\n item.leadingDecorations.length > 0 &&\n cloneDecorations(item.id, item.leadingDecorations, \"leading\")}\n <div\n className={withBaseName(\"itemHost\")}\n ref={open ? getItemHostRef(item.id, \"overflow\") : null}\n />\n {cloneDecorations(item.id, item.trailingDecorations, \"trailing\")}\n </div>\n ))}\n </div>\n </FloatingComponent>\n </div>\n );\n}\n\nexport interface ToolbarOverflowContentProps {\n focusMemoryRef?: RefObject<ToolbarFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n getItemRef: (id: string) => (node: HTMLDivElement | null) => void;\n getNamedTriggerRef: (id: string) => (node: HTMLDivElement | null) => void;\n getContentRef: (contentKey: string) => (node: HTMLDivElement | null) => void;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n overflowGroups: ToolbarOverflowGroup[];\n overflowedIds: Set<string>;\n content: ToolbarContentModel;\n}\n\nexport function ToolbarOverflowContent({\n content,\n focusMemoryRef,\n getItemHostRef,\n getItemRef,\n getNamedTriggerRef,\n getContentRef,\n onItemFocus,\n overflowGroups,\n overflowedIds,\n}: ToolbarOverflowContentProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toolbar-overflow\",\n css: toolbarOverflowCss,\n window: targetWindow,\n });\n\n const { className, ...contentProps } = content.props;\n const handleContentRef = useForkRef(content.ref, getContentRef(content.key));\n const overflowGroupByKey = new Map(\n overflowGroups.map((group) => [group.key, group] as const),\n );\n\n const renderSlots = buildContentOverflowRenderSlots(\n content.items,\n overflowedIds,\n new Set(overflowGroups.map((group) => group.key)),\n );\n\n return (\n <ToolbarContent\n {...contentProps}\n data-implicit={content.implicit || undefined}\n className={clsx(className, withBaseName(\"content\"))}\n position={content.position}\n ref={handleContentRef}\n >\n {renderSlots.map(\n ({\n item,\n overflowed,\n showLeadingDecorations,\n showTrailingDecorations,\n triggerGroupKey,\n }) => {\n const triggerGroup =\n triggerGroupKey != null\n ? overflowGroupByKey.get(triggerGroupKey)\n : undefined;\n\n return (\n <div\n className={withBaseName(\"slot\")}\n data-align={item.align}\n data-priority={item.overflowPriority}\n key={\n triggerGroup\n ? `${content.key}-${triggerGroup.id}-anchor-${item.id}`\n : item.id\n }\n ref={\n triggerGroup ? getNamedTriggerRef(item.id) : getItemRef(item.id)\n }\n >\n {showLeadingDecorations\n ? cloneDecorations(item.id, item.leadingDecorations, \"leading\")\n : null}\n {!overflowed ? (\n <div className={withBaseName(\"item\")}>\n <div\n className={withBaseName(\"itemHost\")}\n ref={getItemHostRef(item.id, \"main\")}\n />\n </div>\n ) : null}\n {triggerGroup ? (\n <div className={withBaseName(\"item\")}>\n <ToolbarOverflowMenu\n focusMemoryRef={focusMemoryRef}\n getItemHostRef={getItemHostRef}\n group={triggerGroup}\n onItemFocus={onItemFocus}\n />\n </div>\n ) : null}\n {showTrailingDecorations\n ? cloneDecorations(\n item.id,\n item.trailingDecorations,\n \"trailing\",\n )\n : null}\n </div>\n );\n },\n )}\n </ToolbarContent>\n );\n}\n"],"names":["elements","_a","toolbarOverflowCss"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ToolbarOverflow.js","sources":["../src/toolbar/ToolbarOverflow.tsx"],"sourcesContent":["import {\n flip,\n offset,\n shift,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { compute } from \"compute-scroll-into-view\";\nimport {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\nimport { ToolbarContent } from \"./ToolbarContent\";\nimport toolbarOverflowCss from \"./ToolbarOverflow.css\";\nimport {\n getToolbarOverflowBoundaryKey,\n isTargetInsideOverflowBoundary,\n ToolbarOverflowFloatingComponentProvider,\n useToolbarOverflowFloatingBoundary,\n} from \"./ToolbarOverflowFloatingBoundary\";\nimport {\n getDocumentFocusableElements,\n getToolbarFocusMemory,\n getToolbarScopeFocusableElements,\n getToolbarTabMoveTarget,\n scheduleToolbarFocus,\n shouldToolbarPreserveNativeTab,\n TOOLBAR_GROUP_KEY_ATTR,\n TOOLBAR_ITEM_ATTR,\n TOOLBAR_OVERFLOW_TRIGGER_ATTR,\n TOOLBAR_SCOPE_ROOT_ATTR,\n type ToolbarFocusMemory,\n toolbarFocusableSelector,\n} from \"./toolbarKeyboardUtils\";\nimport type { ToolbarContentModel, ToolbarOverflowItem } from \"./toolbarUtils\";\nimport { buildContentOverflowRenderSlots } from \"./toolbarUtils\";\nimport { useToolbarKeyboardNavigation } from \"./useToolbarKeyboardNavigation\";\nimport type { ToolbarOverflowGroup } from \"./useToolbarOverflow\";\n\nconst withBaseName = makePrefixer(\"saltToolbarOverflow\");\n\nexport type ToolbarItemHostKind = \"main\" | \"measurement\" | \"overflow\";\n\nconst toolbarStatefulFocusRootSelector = [\n \".saltComboBox-focused\",\n \".saltDateInput-focused\",\n \".saltInput-focused\",\n].join(\", \");\n\nconst toolbarOverflowFocusScrollRootSelector = [\n \".saltComboBox\",\n \".saltDateInput\",\n \".saltDropdown\",\n \".saltInput\",\n \".saltSwitch\",\n].join(\", \");\n\ntype ToolbarOverflowOpenModality = \"keyboard\" | \"pointer\" | null;\n\nfunction createToolbarFocusEvent(\n eventName: \"blur\" | \"focusout\",\n target: HTMLElement,\n relatedTarget: Element | null,\n) {\n const FocusEventCtor = target.ownerDocument.defaultView?.FocusEvent;\n const eventInit = {\n bubbles: eventName === \"focusout\",\n relatedTarget,\n };\n\n return FocusEventCtor\n ? new FocusEventCtor(eventName, eventInit)\n : new Event(eventName, eventInit);\n}\n\nfunction notifyToolbarReparentedFocusLoss(mountNode: HTMLDivElement) {\n const activeElement = mountNode.ownerDocument.activeElement;\n\n if (mountNode.contains(activeElement)) {\n return;\n }\n\n // Browser focus can move to the document when a portaled toolbar item is\n // reparented, without notifying controls that keep their own focused state.\n const staleFocusTargets = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarStatefulFocusRootSelector),\n )\n .map(\n (root) =>\n root.querySelector<HTMLElement>(\"input\") ??\n root.querySelector<HTMLElement>(toolbarFocusableSelector),\n )\n .filter((target): target is HTMLElement => target != null);\n\n for (const target of staleFocusTargets) {\n const relatedTarget =\n activeElement instanceof Element ? activeElement : null;\n\n target.dispatchEvent(\n createToolbarFocusEvent(\"blur\", target, relatedTarget),\n );\n target.dispatchEvent(\n createToolbarFocusEvent(\"focusout\", target, relatedTarget),\n );\n }\n}\n\nfunction getToolbarOverflowFocusScrollTarget(target: HTMLElement) {\n const itemRoot = target.closest<HTMLElement>(`[${TOOLBAR_ITEM_ATTR}]`);\n const controlRoot = target.closest<HTMLElement>(\n toolbarOverflowFocusScrollRootSelector,\n );\n\n return controlRoot && itemRoot?.contains(controlRoot) ? controlRoot : target;\n}\n\nfunction getToolbarOverflowPanelInlinePadding(target: HTMLElement) {\n const panelContent = target.closest<HTMLElement>(\n `[${TOOLBAR_SCOPE_ROOT_ATTR}]`,\n );\n const styles =\n panelContent?.ownerDocument.defaultView?.getComputedStyle(panelContent);\n\n return {\n left: Number.parseFloat(styles?.paddingLeft ?? \"0\") || 0,\n right: Number.parseFloat(styles?.paddingRight ?? \"0\") || 0,\n };\n}\n\nfunction scrollToolbarOverflowTargetIntoView(\n panel: HTMLDivElement | null,\n target: HTMLElement,\n) {\n if (!panel || !panel.contains(target)) {\n return;\n }\n\n const scrollTarget = getToolbarOverflowFocusScrollTarget(target);\n const actions = compute(scrollTarget, {\n block: \"nearest\",\n boundary: panel,\n inline: \"nearest\",\n scrollMode: \"if-needed\",\n });\n\n for (const { el, left, top } of actions) {\n if (el === panel) {\n const targetRect = scrollTarget.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportLeft = panelRect.left + panel.clientLeft;\n const viewportRight = viewportLeft + panel.clientWidth;\n const padding = getToolbarOverflowPanelInlinePadding(scrollTarget);\n const nextLeft =\n targetRect.left < viewportLeft + padding.left\n ? left - padding.left\n : targetRect.right > viewportRight - padding.right\n ? left + padding.right\n : left;\n\n el.scrollLeft = Math.max(0, nextLeft);\n } else {\n el.scrollLeft = left;\n }\n\n el.scrollTop = top;\n }\n}\n\nfunction canSeedOverflowFocusMemory(\n focusMemory: ToolbarFocusMemory | null | undefined,\n group: ToolbarOverflowGroup,\n): focusMemory is Extract<ToolbarFocusMemory, { type: \"item\" }> {\n return (\n focusMemory?.type === \"item\" &&\n group.items.some((item) => item.id === focusMemory.itemId)\n );\n}\n\ninterface ToolbarOverflowOwnersProps {\n hostNodes: Record<string, HTMLDivElement | null>;\n items: ToolbarOverflowItem[];\n}\n\nfunction ToolbarOverflowItemOwner({\n host,\n item,\n}: {\n host: HTMLDivElement | null;\n item: ToolbarOverflowItem;\n}) {\n const targetWindow = useWindow();\n const [mountNode, setMountNode] = useState<HTMLDivElement | null>(null);\n const mountNodeRef = useRef<HTMLDivElement | null>(null);\n const mainToolbarTabIndexMemoryRef = useRef(\n new WeakMap<HTMLElement, string | null>(),\n );\n const lastOverflowBoundaryKeyRef = useRef<string | null>(null);\n const currentOverflowBoundaryKey = getToolbarOverflowBoundaryKey(host);\n\n if (host) {\n lastOverflowBoundaryKeyRef.current = currentOverflowBoundaryKey;\n }\n\n const boundaryKey = host\n ? currentOverflowBoundaryKey\n : lastOverflowBoundaryKeyRef.current;\n\n useIsomorphicLayoutEffect(() => {\n const ownerDocument = targetWindow?.document;\n\n if (!ownerDocument) {\n return;\n }\n\n // Reuse the node when the effect runs again for the same document, as in\n // Strict Mode. A new node would leave the previous one behind in the host,\n // because the effect that attaches it can run again with the previous node.\n const nextMountNode =\n mountNodeRef.current?.ownerDocument === ownerDocument\n ? mountNodeRef.current\n : ownerDocument.createElement(\"div\");\n\n nextMountNode.className = withBaseName(\"contentHost\");\n mountNodeRef.current = nextMountNode;\n setMountNode(nextMountNode);\n\n return () => {\n nextMountNode.parentElement?.removeChild(nextMountNode);\n };\n }, [targetWindow]);\n\n useIsomorphicLayoutEffect(() => {\n if (!mountNode) {\n return;\n }\n\n if (host) {\n if (mountNode.parentElement !== host) {\n host.appendChild(mountNode);\n notifyToolbarReparentedFocusLoss(mountNode);\n }\n\n const isMainToolbarHost =\n host\n .closest(`[${TOOLBAR_SCOPE_ROOT_ATTR}]`)\n ?.getAttribute(TOOLBAR_SCOPE_ROOT_ATTR) === \"main\";\n\n if (isMainToolbarHost) {\n const focusableElements = Array.from(\n mountNode.querySelectorAll<HTMLElement>(toolbarFocusableSelector),\n );\n\n for (const element of focusableElements) {\n const rememberedTabIndex =\n mainToolbarTabIndexMemoryRef.current.get(element);\n\n if (rememberedTabIndex !== undefined) {\n if (rememberedTabIndex == null) {\n element.removeAttribute(\"tabindex\");\n } else {\n element.setAttribute(\"tabindex\", rememberedTabIndex);\n }\n }\n }\n\n for (const element of focusableElements) {\n mainToolbarTabIndexMemoryRef.current.set(\n element,\n element.getAttribute(\"tabindex\"),\n );\n }\n }\n\n return;\n }\n\n notifyToolbarReparentedFocusLoss(mountNode);\n mountNode.parentElement?.removeChild(mountNode);\n }, [host, mountNode]);\n\n if (!mountNode) {\n return null;\n }\n\n const clonedItem = cloneElement(\n item.element as ReactElement<Record<string, ReactNode>>,\n {\n [TOOLBAR_GROUP_KEY_ATTR]: item.overflowGroupKey,\n [TOOLBAR_ITEM_ATTR]: item.id,\n },\n );\n const itemContent = (\n <ToolbarOverflowFloatingComponentProvider boundaryKey={boundaryKey}>\n {clonedItem}\n </ToolbarOverflowFloatingComponentProvider>\n );\n\n return createPortal(itemContent, mountNode);\n}\n\nexport function ToolbarOverflowOwners({\n hostNodes,\n items,\n}: ToolbarOverflowOwnersProps) {\n return (\n <>\n {items.map((item) => (\n <ToolbarOverflowItemOwner\n host={hostNodes[item.id] ?? null}\n item={item}\n key={item.id}\n />\n ))}\n </>\n );\n}\n\nfunction cloneDecorations(\n itemId: string,\n decorations: ReactElement[],\n slot: \"leading\" | \"trailing\",\n) {\n return Children.toArray(decorations).flatMap((decoration) => {\n if (!isValidElement(decoration)) {\n return [];\n }\n\n return [\n cloneElement(decoration, {\n key: `${itemId}-${slot}-${String(\n decoration.key ??\n (typeof decoration.type === \"string\"\n ? decoration.type\n : \"decoration\"),\n )}`,\n }),\n ];\n });\n}\n\nexport function ToolbarOverflowTriggerContent({\n label,\n named,\n}: {\n label: string;\n named: boolean;\n}) {\n const { OverflowIcon } = useIcon();\n\n if (named) {\n return <>{label}</>;\n }\n\n return <OverflowIcon aria-hidden />;\n}\n\nfunction getOverflowTriggerLabel(group: ToolbarOverflowGroup) {\n return group.named\n ? `${group.label} overflow. Hidden controls.`\n : \"Overflow. Hidden controls.\";\n}\n\ninterface ToolbarOverflowMenuProps {\n focusMemoryRef?: RefObject<ToolbarFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n group: ToolbarOverflowGroup;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n}\n\nexport function ToolbarOverflowMenu({\n focusMemoryRef,\n getItemHostRef,\n group,\n onItemFocus,\n}: ToolbarOverflowMenuProps) {\n const panelId = useId();\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelContentRef = useRef<HTMLDivElement>(null);\n const [panelContentNode, setPanelContentNode] =\n useState<HTMLDivElement | null>(null);\n const wasOpenRef = useRef(false);\n const focusedOpenPanelRef = useRef(false);\n const openModalityRef = useRef<ToolbarOverflowOpenModality>(null);\n const floatingBoundary = useToolbarOverflowFloatingBoundary();\n const {\n focusEntryTarget,\n handleScopeBlur,\n handleScopeFocus,\n handleScopeKeyDown,\n handleScopePointerDown,\n rememberedFocusRef,\n } = useToolbarKeyboardNavigation({\n includeTabIndexMinusOne: true,\n items: group.items,\n scopeRef: panelContentRef,\n });\n\n const { refs, x, y, strategy, context, elements } = useFloatingUI({\n open,\n onOpenChange(nextOpen, _, reason) {\n setOpen(nextOpen);\n\n if (!nextOpen) {\n openModalityRef.current = null;\n }\n\n if (!nextOpen && reason === \"escape-key\") {\n scheduleToolbarFocus(triggerRef.current);\n }\n },\n placement: \"bottom-end\",\n middleware: [\n offset(1),\n size({\n apply({ elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${availableHeight}px`,\n });\n },\n }),\n flip(),\n shift({\n padding: 8,\n }),\n ],\n });\n const { getFloatingProps, getReferenceProps } = useInteractions([\n useClick(context),\n useDismiss(context, {\n escapeKey: false,\n outsidePress(event) {\n return !isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.target,\n );\n },\n }),\n ]);\n\n const handleTriggerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!open && [\"Enter\", \" \"].includes(event.key)) {\n event.preventDefault();\n openModalityRef.current = \"keyboard\";\n setOpen(true);\n return;\n }\n\n if (open && event.key === \"Escape\") {\n event.preventDefault();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n }\n },\n [open],\n );\n\n const handleTriggerPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handleTriggerMouseDown = useCallback(\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (!open && event.button === 0) {\n openModalityRef.current = \"pointer\";\n }\n },\n [open],\n );\n\n const handlePanelKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.key === \"Tab\") {\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (\n panelContent &&\n target instanceof HTMLElement &&\n shouldToolbarPreserveNativeTab(target)\n ) {\n const focusableElements = getDocumentFocusableElements(\n panelContent.ownerDocument,\n );\n const currentIndex = focusableElements.indexOf(target);\n const nextFocusTarget =\n focusableElements[currentIndex + (event.shiftKey ? -1 : 1)];\n\n if (\n currentIndex !== -1 &&\n nextFocusTarget &&\n panelContent.contains(nextFocusTarget)\n ) {\n return;\n }\n }\n }\n\n if (event.key === \"Tab\" && !event.shiftKey) {\n const toolbarRoot = triggerRef.current?.closest<HTMLElement>(\n `[${TOOLBAR_SCOPE_ROOT_ATTR}]`,\n );\n const nextFocusTarget = toolbarRoot\n ? getToolbarTabMoveTarget(toolbarRoot, false)\n : null;\n\n if (nextFocusTarget) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(nextFocusTarget);\n }\n\n return;\n }\n\n if (event.key === \"Tab\" && event.shiftKey) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n scheduleToolbarFocus(triggerRef.current);\n }\n }, []);\n\n const handleTriggerRef = useForkRef<HTMLButtonElement>(\n triggerRef,\n refs.setReference,\n );\n const handlePanelRef = useForkRef<HTMLDivElement>(panelRef, refs.setFloating);\n const handlePanelContentRef = useForkRef<HTMLDivElement>(\n panelContentRef,\n setPanelContentNode,\n );\n const handlePanelFocus = useCallback(\n (event: FocusEvent) => {\n handleScopeFocus(event);\n\n const panelContent = panelContentRef.current;\n const target = event.target;\n\n if (!panelContent || !(target instanceof HTMLElement)) {\n return;\n }\n\n const focusMemory = getToolbarFocusMemory(panelContent, target, {\n includeTabIndexMinusOne: true,\n });\n\n if (focusMemory?.type !== \"item\") {\n return;\n }\n\n scrollToolbarOverflowTargetIntoView(panelRef.current, target);\n onItemFocus?.(focusMemory.itemId, focusMemory.controlIndex);\n },\n [handleScopeFocus, onItemFocus],\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n const externalFocusMemory = focusMemoryRef?.current;\n\n if (canSeedOverflowFocusMemory(externalFocusMemory, group)) {\n rememberedFocusRef.current = externalFocusMemory;\n }\n\n if (openModalityRef.current !== \"pointer\") {\n focusEntryTarget();\n }\n }\n\n wasOpenRef.current = open;\n }, [focusEntryTarget, focusMemoryRef, group, open, rememberedFocusRef]);\n\n useEffect(() => {\n if (!open || !panelContentNode) {\n return;\n }\n\n const handleFocusIn = (event: FocusEvent) => {\n handlePanelFocus(event);\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (\n isTargetInsideOverflowBoundary(\n panelContentRef.current,\n floatingBoundary,\n group.key,\n event.relatedTarget,\n )\n ) {\n return;\n }\n\n handleScopeBlur(event);\n };\n const handleKeyDownCapture = (event: KeyboardEvent) => {\n handleScopeKeyDown(event);\n };\n const handlePointerDownCapture = (event: PointerEvent) => {\n handleScopePointerDown(event);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented) {\n handlePanelKeyDown(event);\n }\n };\n\n panelContentNode.addEventListener(\"focusin\", handleFocusIn);\n panelContentNode.addEventListener(\"focusout\", handleFocusOut);\n panelContentNode.addEventListener(\"keydown\", handleKeyDownCapture, true);\n panelContentNode.addEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n panelContentNode.removeEventListener(\"focusin\", handleFocusIn);\n panelContentNode.removeEventListener(\"focusout\", handleFocusOut);\n panelContentNode.removeEventListener(\n \"keydown\",\n handleKeyDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\n \"pointerdown\",\n handlePointerDownCapture,\n true,\n );\n panelContentNode.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n handlePanelFocus,\n handlePanelKeyDown,\n handleScopeBlur,\n handleScopeKeyDown,\n handleScopePointerDown,\n floatingBoundary,\n group.key,\n open,\n panelContentNode,\n ]);\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n focusedOpenPanelRef.current = false;\n return;\n }\n\n if (\n !panelContentNode ||\n focusedOpenPanelRef.current ||\n openModalityRef.current === \"pointer\"\n ) {\n return;\n }\n\n const getPanelFocusables = () =>\n getToolbarScopeFocusableElements(panelContentNode, {\n includeTabIndexMinusOne: true,\n });\n const focusEntryWhenReady = () => {\n const panelFocusables = getPanelFocusables();\n\n if (panelFocusables.length === 0) {\n return false;\n }\n\n focusedOpenPanelRef.current = true;\n focusEntryTarget();\n return true;\n };\n\n if (focusEntryWhenReady()) {\n return;\n }\n\n const panelWindow = panelContentNode.ownerDocument.defaultView;\n const mutationObserverCtor = panelWindow?.MutationObserver;\n const resizeObserverCtor = panelWindow?.ResizeObserver;\n let mutationObserver: MutationObserver | null = null;\n let resizeObserver: ResizeObserver | null = null;\n\n mutationObserver =\n mutationObserverCtor != null\n ? new mutationObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n resizeObserver =\n resizeObserverCtor != null\n ? new resizeObserverCtor(() => {\n if (focusEntryWhenReady()) {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n }\n })\n : null;\n\n mutationObserver?.observe(panelContentNode, {\n childList: true,\n subtree: true,\n });\n resizeObserver?.observe(panelContentNode);\n\n return () => {\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n };\n }, [focusEntryTarget, open, panelContentNode]);\n\n return (\n <div\n className={withBaseName(\"menu\")}\n data-overflowgroup={group.overflowGroup}\n >\n <Button\n appearance=\"transparent\"\n aria-controls={panelId}\n aria-expanded={open}\n aria-label={getOverflowTriggerLabel(group)}\n className={withBaseName(\"trigger\")}\n {...{\n [TOOLBAR_GROUP_KEY_ATTR]: group.key,\n [TOOLBAR_OVERFLOW_TRIGGER_ATTR]: \"\",\n }}\n {...getReferenceProps({\n onKeyDown: handleTriggerKeyDown,\n onMouseDown: handleTriggerMouseDown,\n onPointerDown: handleTriggerPointerDown,\n })}\n ref={handleTriggerRef}\n sentiment=\"neutral\"\n >\n <ToolbarOverflowTriggerContent\n label={group.label}\n named={group.named}\n />\n </Button>\n <FloatingComponent\n {...getFloatingProps({\n role: \"presentation\",\n })}\n className={withBaseName(\"panel\")}\n focusManagerProps={\n context\n ? {\n context,\n initialFocus: -1,\n returnFocus: false,\n modal: false,\n closeOnFocusOut: false,\n }\n : undefined\n }\n id={panelId}\n left={x ?? 0}\n open={open}\n position={strategy}\n ref={handlePanelRef}\n top={y ?? 0}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n >\n <div\n aria-label={`${group.label} overflow`}\n aria-orientation=\"horizontal\"\n className={withBaseName(\"panelContent\")}\n {...{ [TOOLBAR_SCOPE_ROOT_ATTR]: group.key }}\n role=\"toolbar\"\n ref={handlePanelContentRef}\n >\n {group.items.map((item, index) => (\n <div\n className={withBaseName(\"panelItem\")}\n key={`${group.id}-${item.id}`}\n >\n {index > 0 &&\n item.leadingDecorations.length > 0 &&\n cloneDecorations(item.id, item.leadingDecorations, \"leading\")}\n <div\n className={withBaseName(\"itemHost\")}\n ref={open ? getItemHostRef(item.id, \"overflow\") : null}\n />\n {cloneDecorations(item.id, item.trailingDecorations, \"trailing\")}\n </div>\n ))}\n </div>\n </FloatingComponent>\n </div>\n );\n}\n\nexport interface ToolbarOverflowContentProps {\n focusMemoryRef?: RefObject<ToolbarFocusMemory | null>;\n getItemHostRef: (\n id: string,\n kind: ToolbarItemHostKind,\n ) => (node: HTMLDivElement | null) => void;\n getItemRef: (id: string) => (node: HTMLDivElement | null) => void;\n getNamedTriggerRef: (id: string) => (node: HTMLDivElement | null) => void;\n getContentRef: (contentKey: string) => (node: HTMLDivElement | null) => void;\n onItemFocus?: (itemId: string, controlIndex: number) => void;\n overflowGroups: ToolbarOverflowGroup[];\n overflowedIds: Set<string>;\n content: ToolbarContentModel;\n}\n\nexport function ToolbarOverflowContent({\n content,\n focusMemoryRef,\n getItemHostRef,\n getItemRef,\n getNamedTriggerRef,\n getContentRef,\n onItemFocus,\n overflowGroups,\n overflowedIds,\n}: ToolbarOverflowContentProps) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toolbar-overflow\",\n css: toolbarOverflowCss,\n window: targetWindow,\n });\n\n const { className, ...contentProps } = content.props;\n const handleContentRef = useForkRef(content.ref, getContentRef(content.key));\n const overflowGroupByKey = new Map(\n overflowGroups.map((group) => [group.key, group] as const),\n );\n\n const renderSlots = buildContentOverflowRenderSlots(\n content.items,\n overflowedIds,\n new Set(overflowGroups.map((group) => group.key)),\n );\n\n return (\n <ToolbarContent\n {...contentProps}\n data-implicit={content.implicit || undefined}\n className={clsx(className, withBaseName(\"content\"))}\n position={content.position}\n ref={handleContentRef}\n >\n {renderSlots.map(\n ({\n item,\n overflowed,\n showLeadingDecorations,\n showTrailingDecorations,\n triggerGroupKey,\n }) => {\n const triggerGroup =\n triggerGroupKey != null\n ? overflowGroupByKey.get(triggerGroupKey)\n : undefined;\n\n return (\n <div\n className={withBaseName(\"slot\")}\n data-align={item.align}\n data-priority={item.overflowPriority}\n key={\n triggerGroup\n ? `${content.key}-${triggerGroup.id}-anchor-${item.id}`\n : item.id\n }\n ref={\n triggerGroup ? getNamedTriggerRef(item.id) : getItemRef(item.id)\n }\n >\n {showLeadingDecorations\n ? cloneDecorations(item.id, item.leadingDecorations, \"leading\")\n : null}\n {!overflowed ? (\n <div className={withBaseName(\"item\")}>\n <div\n className={withBaseName(\"itemHost\")}\n ref={getItemHostRef(item.id, \"main\")}\n />\n </div>\n ) : null}\n {triggerGroup ? (\n <div className={withBaseName(\"item\")}>\n <ToolbarOverflowMenu\n focusMemoryRef={focusMemoryRef}\n getItemHostRef={getItemHostRef}\n group={triggerGroup}\n onItemFocus={onItemFocus}\n />\n </div>\n ) : null}\n {showTrailingDecorations\n ? cloneDecorations(\n item.id,\n item.trailingDecorations,\n \"trailing\",\n )\n : null}\n </div>\n );\n },\n )}\n </ToolbarContent>\n );\n}\n"],"names":["_a","elements","toolbarOverflowCss"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbarUtils.js","sources":["../src/toolbar/toolbarUtils.ts"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { Divider } from \"../divider\";\nimport { getRefFromChildren } from \"../utils\";\n\nimport { ToolbarContent, type ToolbarContentProps } from \"./ToolbarContent\";\nimport { Tooltray, type TooltrayProps } from \"./Tooltray\";\n\nexport type ToolbarMode = \"explicit\" | \"flat\" | \"invalid\";\n\ntype ToolbarChild = Exclude<ReactNode, boolean | null | undefined>;\ntype ToolbarContentPosition = ToolbarContentProps[\"position\"];\ntype TooltrayOverflowMode = NonNullable<TooltrayProps[\"overflowMode\"]>;\n\nexport interface ToolbarOverflowItem {\n align: NonNullable<TooltrayProps[\"align\"]>;\n element: ReactElement<TooltrayProps>;\n id: string;\n leadingDecorations: ReactElement[];\n order: number;\n overflowGroup: string;\n overflowGroupKey: string;\n overflowLabel?: string;\n overflowMode: TooltrayOverflowMode;\n overflowPriority: number;\n contentKey: string;\n trailingDecorations: ReactElement[];\n}\n\nexport interface ToolbarOverflowRenderSlot {\n item: ToolbarOverflowItem;\n overflowed: boolean;\n showLeadingDecorations: boolean;\n showTrailingDecorations: boolean;\n triggerGroupKey?: string;\n}\n\nexport interface ToolbarContentModel {\n implicit: boolean;\n items: ToolbarOverflowItem[];\n key: string;\n position: ToolbarContentPosition;\n props: Omit<ToolbarContentProps, \"children\" | \"position\">;\n ref: Ref<HTMLDivElement> | null;\n}\n\nexport interface ToolbarModel {\n mode: ToolbarMode;\n content: ToolbarContentModel[];\n}\n\nexport function buildContentOverflowRenderSlots(\n items: ToolbarOverflowItem[],\n overflowedIds: Set<string>,\n activeNamedGroupKeys: Set<string>,\n) {\n const triggerGroupByItemId = new Map<string, string>();\n\n for (const groupKey of activeNamedGroupKeys) {\n const anchorItem = items.find((item) => {\n return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;\n });\n\n if (anchorItem) {\n triggerGroupByItemId.set(anchorItem.id, groupKey);\n }\n }\n\n const slots: ToolbarOverflowRenderSlot[] = [];\n let hasSurvivingPredecessor = false;\n\n for (const item of items) {\n const overflowed = overflowedIds.has(item.id);\n const triggerGroupKey = triggerGroupByItemId.get(item.id);\n const survives = !overflowed || triggerGroupKey != null;\n\n if (overflowed && !triggerGroupKey) {\n continue;\n }\n\n slots.push({\n item,\n overflowed,\n showLeadingDecorations:\n item.leadingDecorations.length > 0 &&\n hasSurvivingPredecessor &&\n survives,\n showTrailingDecorations:\n !overflowed && item.trailingDecorations.length > 0,\n triggerGroupKey,\n });\n\n if (survives) {\n hasSurvivingPredecessor = true;\n }\n }\n\n return slots;\n}\n\nexport function flattenToolbarChildren(children: ReactNode): ToolbarChild[] {\n const flattened: ToolbarChild[] = [];\n\n Children.forEach(children, (child) => {\n if (child == null || typeof child === \"boolean\") {\n return;\n }\n\n if (isValidElement(child) && child.type === Fragment) {\n flattened.push(...flattenToolbarChildren(child.props.children));\n return;\n }\n\n flattened.push(child);\n });\n\n return flattened;\n}\n\nfunction isToolbarContentElement(\n child: ToolbarChild,\n): child is ReactElement<ToolbarContentProps> {\n return isValidElement(child) && child.type === ToolbarContent;\n}\n\nfunction isTooltrayElement(\n child: ToolbarChild,\n): child is ReactElement<TooltrayProps> {\n return isValidElement(child) && child.type === Tooltray;\n}\n\nfunction isDividerElement(child: ToolbarChild): child is ReactElement {\n return isValidElement(child) && child.type === Divider;\n}\n\nfunction buildItemId(\n contentKey: string,\n element: ReactElement<TooltrayProps>,\n order: number,\n) {\n const elementKey =\n element.key != null ? String(element.key) : `tray-${order}`;\n return `${contentKey}-${elementKey}-${order}`;\n}\n\nfunction buildOverflowGroupKey(contentKey: string, overflowGroup: string) {\n return overflowGroup === \"shared\"\n ? \"shared\"\n : `${contentKey}:${overflowGroup}`;\n}\n\nfunction normalizeContentItems(\n children: ReactNode,\n contentKey: string,\n): ToolbarOverflowItem[] | null {\n const flattenedChildren = flattenToolbarChildren(children);\n const items: ToolbarOverflowItem[] = [];\n let pendingLeadingDecorations: ReactElement[] = [];\n\n for (const child of flattenedChildren) {\n if (isDividerElement(child)) {\n pendingLeadingDecorations.push(child);\n continue;\n }\n\n if (!isTooltrayElement(child)) {\n return null;\n }\n\n const {\n align = \"start\",\n overflowGroup = \"shared\",\n overflowLabel,\n overflowMode = \"independent\",\n overflowPriority = 0,\n } = child.props;\n const order = items.length;\n\n items.push({\n align,\n element: child,\n id: buildItemId(contentKey, child, order),\n leadingDecorations: pendingLeadingDecorations,\n order,\n overflowGroup,\n overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),\n overflowLabel,\n overflowMode,\n overflowPriority,\n contentKey,\n trailingDecorations: [],\n });\n\n pendingLeadingDecorations = [];\n }\n\n if (pendingLeadingDecorations.length > 0 && items.length > 0) {\n items[items.length - 1]?.trailingDecorations.push(\n ...pendingLeadingDecorations,\n );\n }\n\n return items;\n}\n\nfunction normalizeExplicitContent(\n children: ToolbarChild[],\n): ToolbarContentModel[] | null {\n const content: ToolbarContentModel[] = [];\n\n for (const [index, child] of children.entries()) {\n if (!isToolbarContentElement(child)) {\n continue;\n }\n\n const {\n children: contentChildren,\n position,\n ...contentProps\n } = child.props;\n const contentKey =\n child.key != null ? String(child.key) : `${position}-content-${index}`;\n const items = normalizeContentItems(contentChildren, contentKey);\n\n if (items == null) {\n return null;\n }\n\n content.push({\n implicit: false,\n items,\n key: contentKey,\n position,\n props: contentProps,\n ref: getRefFromChildren(child),\n });\n }\n\n return content;\n}\n\nfunction normalizeFlatChildren(children: ToolbarChild[]) {\n const buckets: Record<ToolbarContentPosition, ToolbarChild[]> = {\n start: [],\n center: [],\n end: [],\n };\n let currentPosition: ToolbarContentPosition = \"start\";\n\n for (const child of children) {\n if (isTooltrayElement(child)) {\n currentPosition = child.props.align ?? \"start\";\n buckets[currentPosition].push(child);\n continue;\n }\n\n if (isDividerElement(child)) {\n buckets[currentPosition].push(child);\n continue;\n }\n\n return null;\n }\n\n return (Object.keys(buckets) as ToolbarContentPosition[]).reduce<\n ToolbarContentModel[]\n >((content, position) => {\n const contentKey = `${position}-implicit`;\n const contentItems = normalizeContentItems(buckets[position], contentKey);\n\n if (contentItems == null || contentItems.length === 0) {\n return content;\n }\n\n content.push({\n implicit: true,\n items: contentItems,\n key: contentKey,\n position,\n props: {},\n ref: null,\n });\n\n return content;\n }, []);\n}\n\nexport function normalizeToolbarChildren(children: ReactNode): ToolbarModel {\n const flattenedChildren = flattenToolbarChildren(children);\n const hasContentChildren = flattenedChildren.some(isToolbarContentElement);\n const hasOnlyContent =\n hasContentChildren && flattenedChildren.every(isToolbarContentElement);\n const hasOnlyFlatChildren = flattenedChildren.every(\n (child) => isTooltrayElement(child) || isDividerElement(child),\n );\n\n if (hasOnlyContent) {\n const content = normalizeExplicitContent(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"explicit\",\n content,\n };\n }\n\n if (hasOnlyFlatChildren) {\n const content = normalizeFlatChildren(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"flat\",\n content,\n };\n }\n\n return {\n mode: \"invalid\",\n content: [],\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toolbarUtils.js","sources":["../src/toolbar/toolbarUtils.ts"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { Divider } from \"../divider\";\nimport { getRefFromChildren } from \"../utils\";\n\nimport { ToolbarContent, type ToolbarContentProps } from \"./ToolbarContent\";\nimport { Tooltray, type TooltrayProps } from \"./Tooltray\";\n\nexport type ToolbarMode = \"explicit\" | \"flat\" | \"invalid\";\n\ntype ToolbarChild = Exclude<ReactNode, boolean | null | undefined>;\ntype ToolbarContentPosition = ToolbarContentProps[\"position\"];\ntype TooltrayOverflowMode = NonNullable<TooltrayProps[\"overflowMode\"]>;\n\nexport interface ToolbarOverflowItem {\n align: NonNullable<TooltrayProps[\"align\"]>;\n element: ReactElement<TooltrayProps>;\n id: string;\n leadingDecorations: ReactElement[];\n order: number;\n overflowGroup: string;\n overflowGroupKey: string;\n overflowLabel?: string;\n overflowMode: TooltrayOverflowMode;\n overflowPriority: number;\n contentKey: string;\n trailingDecorations: ReactElement[];\n}\n\nexport interface ToolbarOverflowRenderSlot {\n item: ToolbarOverflowItem;\n overflowed: boolean;\n showLeadingDecorations: boolean;\n showTrailingDecorations: boolean;\n triggerGroupKey?: string;\n}\n\nexport interface ToolbarContentModel {\n implicit: boolean;\n items: ToolbarOverflowItem[];\n key: string;\n position: ToolbarContentPosition;\n props: Omit<ToolbarContentProps, \"children\" | \"position\">;\n ref: Ref<HTMLDivElement> | null;\n}\n\nexport interface ToolbarModel {\n mode: ToolbarMode;\n content: ToolbarContentModel[];\n}\n\nexport function buildContentOverflowRenderSlots(\n items: ToolbarOverflowItem[],\n overflowedIds: Set<string>,\n activeNamedGroupKeys: Set<string>,\n) {\n const triggerGroupByItemId = new Map<string, string>();\n\n for (const groupKey of activeNamedGroupKeys) {\n const anchorItem = items.find((item) => {\n return overflowedIds.has(item.id) && item.overflowGroupKey === groupKey;\n });\n\n if (anchorItem) {\n triggerGroupByItemId.set(anchorItem.id, groupKey);\n }\n }\n\n const slots: ToolbarOverflowRenderSlot[] = [];\n let hasSurvivingPredecessor = false;\n\n for (const item of items) {\n const overflowed = overflowedIds.has(item.id);\n const triggerGroupKey = triggerGroupByItemId.get(item.id);\n const survives = !overflowed || triggerGroupKey != null;\n\n if (overflowed && !triggerGroupKey) {\n continue;\n }\n\n slots.push({\n item,\n overflowed,\n showLeadingDecorations:\n item.leadingDecorations.length > 0 &&\n hasSurvivingPredecessor &&\n survives,\n showTrailingDecorations:\n !overflowed && item.trailingDecorations.length > 0,\n triggerGroupKey,\n });\n\n if (survives) {\n hasSurvivingPredecessor = true;\n }\n }\n\n return slots;\n}\n\nexport function flattenToolbarChildren(children: ReactNode): ToolbarChild[] {\n const flattened: ToolbarChild[] = [];\n\n Children.forEach(children, (child) => {\n if (child == null || typeof child === \"boolean\") {\n return;\n }\n\n if (\n isValidElement<{ children?: ReactNode }>(child) &&\n child.type === Fragment\n ) {\n flattened.push(...flattenToolbarChildren(child.props.children));\n return;\n }\n\n flattened.push(child);\n });\n\n return flattened;\n}\n\nfunction isToolbarContentElement(\n child: ToolbarChild,\n): child is ReactElement<ToolbarContentProps> {\n return isValidElement(child) && child.type === ToolbarContent;\n}\n\nfunction isTooltrayElement(\n child: ToolbarChild,\n): child is ReactElement<TooltrayProps> {\n return isValidElement(child) && child.type === Tooltray;\n}\n\nfunction isDividerElement(child: ToolbarChild): child is ReactElement {\n return isValidElement(child) && child.type === Divider;\n}\n\nfunction buildItemId(\n contentKey: string,\n element: ReactElement<TooltrayProps>,\n order: number,\n) {\n const elementKey =\n element.key != null ? String(element.key) : `tray-${order}`;\n return `${contentKey}-${elementKey}-${order}`;\n}\n\nfunction buildOverflowGroupKey(contentKey: string, overflowGroup: string) {\n return overflowGroup === \"shared\"\n ? \"shared\"\n : `${contentKey}:${overflowGroup}`;\n}\n\nfunction normalizeContentItems(\n children: ReactNode,\n contentKey: string,\n): ToolbarOverflowItem[] | null {\n const flattenedChildren = flattenToolbarChildren(children);\n const items: ToolbarOverflowItem[] = [];\n let pendingLeadingDecorations: ReactElement[] = [];\n\n for (const child of flattenedChildren) {\n if (isDividerElement(child)) {\n pendingLeadingDecorations.push(child);\n continue;\n }\n\n if (!isTooltrayElement(child)) {\n return null;\n }\n\n const {\n align = \"start\",\n overflowGroup = \"shared\",\n overflowLabel,\n overflowMode = \"independent\",\n overflowPriority = 0,\n } = child.props;\n const order = items.length;\n\n items.push({\n align,\n element: child,\n id: buildItemId(contentKey, child, order),\n leadingDecorations: pendingLeadingDecorations,\n order,\n overflowGroup,\n overflowGroupKey: buildOverflowGroupKey(contentKey, overflowGroup),\n overflowLabel,\n overflowMode,\n overflowPriority,\n contentKey,\n trailingDecorations: [],\n });\n\n pendingLeadingDecorations = [];\n }\n\n if (pendingLeadingDecorations.length > 0 && items.length > 0) {\n items[items.length - 1]?.trailingDecorations.push(\n ...pendingLeadingDecorations,\n );\n }\n\n return items;\n}\n\nfunction normalizeExplicitContent(\n children: ToolbarChild[],\n): ToolbarContentModel[] | null {\n const content: ToolbarContentModel[] = [];\n\n for (const [index, child] of children.entries()) {\n if (!isToolbarContentElement(child)) {\n continue;\n }\n\n const {\n children: contentChildren,\n position,\n ...contentProps\n } = child.props;\n const contentKey =\n child.key != null ? String(child.key) : `${position}-content-${index}`;\n const items = normalizeContentItems(contentChildren, contentKey);\n\n if (items == null) {\n return null;\n }\n\n content.push({\n implicit: false,\n items,\n key: contentKey,\n position,\n props: contentProps,\n ref: getRefFromChildren(child),\n });\n }\n\n return content;\n}\n\nfunction normalizeFlatChildren(children: ToolbarChild[]) {\n const buckets: Record<ToolbarContentPosition, ToolbarChild[]> = {\n start: [],\n center: [],\n end: [],\n };\n let currentPosition: ToolbarContentPosition = \"start\";\n\n for (const child of children) {\n if (isTooltrayElement(child)) {\n currentPosition = child.props.align ?? \"start\";\n buckets[currentPosition].push(child);\n continue;\n }\n\n if (isDividerElement(child)) {\n buckets[currentPosition].push(child);\n continue;\n }\n\n return null;\n }\n\n return (Object.keys(buckets) as ToolbarContentPosition[]).reduce<\n ToolbarContentModel[]\n >((content, position) => {\n const contentKey = `${position}-implicit`;\n const contentItems = normalizeContentItems(buckets[position], contentKey);\n\n if (contentItems == null || contentItems.length === 0) {\n return content;\n }\n\n content.push({\n implicit: true,\n items: contentItems,\n key: contentKey,\n position,\n props: {},\n ref: null,\n });\n\n return content;\n }, []);\n}\n\nexport function normalizeToolbarChildren(children: ReactNode): ToolbarModel {\n const flattenedChildren = flattenToolbarChildren(children);\n const hasContentChildren = flattenedChildren.some(isToolbarContentElement);\n const hasOnlyContent =\n hasContentChildren && flattenedChildren.every(isToolbarContentElement);\n const hasOnlyFlatChildren = flattenedChildren.every(\n (child) => isTooltrayElement(child) || isDividerElement(child),\n );\n\n if (hasOnlyContent) {\n const content = normalizeExplicitContent(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"explicit\",\n content,\n };\n }\n\n if (hasOnlyFlatChildren) {\n const content = normalizeFlatChildren(flattenedChildren);\n\n if (content == null) {\n return { mode: \"invalid\", content: [] };\n }\n\n return {\n mode: \"flat\",\n content,\n };\n }\n\n return {\n mode: \"invalid\",\n content: [],\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css_248z = "/* Styles applied to root component */\n.saltTooltip {\n --tooltip-background: var(--saltTooltip-background, var(--salt-container-primary-background));\n --tooltip-zIndex: var(--saltTooltip-zIndex, var(--salt-zIndex-flyover));\n /* apply icon margin based on the text line height so it's aligned on all densities */\n --tooltip-icon-marginTop: calc((var(--salt-text-lineHeight) - max(var(--salt-size-icon), 12px)) / 2);\n --tooltip-status-borderColor: var(--salt-container-bold-borderColor);\n /* Single line height should be size-base */\n --tooltip-borderWidth: var(--salt-size-fixed-100);\n --tooltip-padding: calc(var(--salt-spacing-75) - var(--tooltip-borderWidth)) var(--salt-spacing-100);\n}\n\n.saltTooltip {\n box-sizing: border-box;\n background: var(--tooltip-background);\n border-color: var(--saltTooltip-borderColor, var(--tooltip-status-borderColor));\n border-style: var(--saltTooltip-borderStyle, var(--salt-borderStyle-solid));\n border-width: var(--saltTooltip-borderWidth, var(--tooltip-borderWidth));\n border-radius: var(--saltTooltip-borderRadius, var(--salt-palette-corner-weak, 0));\n box-shadow: var(--saltTooltip-shadow, var(--salt-overlayable-shadow-popout));\n color: var(--saltTooltip-text-color, var(--salt-content-primary-foreground));\n font-family: var(--salt-text-fontFamily);\n font-size: var(--saltTooltip-fontSize, var(--salt-text-fontSize));\n font-weight: var(--saltTooltip-fontWeight, var(--salt-text-fontWeight));\n line-height: var(--saltTooltip-lineHeight, var(--salt-text-lineHeight));\n max-width: var(--saltTooltip-maxWidth, 60ch);\n padding: var(--saltTooltip-padding, var(--tooltip-padding));\n position: relative;\n text-align: var(--saltTooltip-textAlign, left);\n z-index: var(--tooltip-zIndex);\n}\n\n/* Styles applied to container */\n.saltTooltip-container {\n display: flex;\n align-items: baseline;\n position: relative;\n}\n\n/* Styles applied to content */\n.saltTooltip-content {\n overflow: hidden;\n}\n\n/* Styles applied to status indicator */\n.saltTooltip-icon {\n --saltIcon-margin: var(--tooltip-icon-marginTop) var(--salt-spacing-75) 0 0;\n vertical-align: top;\n align-self: flex-start;\n}\n\n/* Styles applied when status = \"info\" */\n.saltTooltip-info {\n --tooltip-status-borderColor: var(--salt-status-info-borderColor);\n}\n\n/* Styles applied when status = \"error\" */\n.saltTooltip-error {\n --tooltip-status-borderColor: var(--salt-status-error-borderColor);\n}\n\n/* Styles applied when status = \"warning\" */\n.saltTooltip-warning {\n --tooltip-status-borderColor: var(--salt-status-warning-borderColor);\n}\n\n/* Styles applied when status = \"success\" */\n.saltTooltip-success {\n --tooltip-status-borderColor: var(--salt-status-success-borderColor);\n}\n";
|
|
1
|
+
var css_248z = "/* Styles applied to root component */\n.saltTooltip {\n --tooltip-background: var(--saltTooltip-background, var(--salt-container-primary-background));\n --tooltip-zIndex: var(--saltTooltip-zIndex, var(--salt-zIndex-flyover));\n /* apply icon margin based on the text line height so it's aligned on all densities */\n --tooltip-icon-marginTop: calc((var(--salt-text-lineHeight) - max(var(--salt-size-icon), 12px)) / 2);\n --tooltip-status-borderColor: var(--salt-container-bold-borderColor);\n /* Single line height should be size-base */\n --tooltip-borderWidth: var(--salt-size-fixed-100);\n --tooltip-padding: calc(var(--salt-spacing-75) - var(--tooltip-borderWidth)) var(--salt-spacing-100);\n}\n\n.saltTooltip {\n box-sizing: border-box;\n background: var(--tooltip-background);\n border-color: var(--saltTooltip-borderColor, var(--tooltip-status-borderColor));\n border-style: var(--saltTooltip-borderStyle, var(--salt-borderStyle-solid));\n border-width: var(--saltTooltip-borderWidth, var(--tooltip-borderWidth));\n border-radius: var(--saltTooltip-borderRadius, var(--salt-palette-corner-weak, 0));\n box-shadow: var(--saltTooltip-shadow, var(--salt-overlayable-shadow-popout));\n color: var(--saltTooltip-text-color, var(--salt-content-primary-foreground));\n font-family: var(--salt-text-fontFamily);\n font-size: var(--saltTooltip-fontSize, var(--salt-text-fontSize));\n font-weight: var(--saltTooltip-fontWeight, var(--salt-text-fontWeight));\n line-height: var(--saltTooltip-lineHeight, var(--salt-text-lineHeight));\n letter-spacing: var(--salt-text-letterSpacing);\n max-width: var(--saltTooltip-maxWidth, 60ch);\n padding: var(--saltTooltip-padding, var(--tooltip-padding));\n position: relative;\n text-align: var(--saltTooltip-textAlign, left);\n z-index: var(--tooltip-zIndex);\n}\n\n/* Styles applied to container */\n.saltTooltip-container {\n display: flex;\n align-items: baseline;\n position: relative;\n}\n\n/* Styles applied to content */\n.saltTooltip-content {\n overflow: hidden;\n}\n\n/* Styles applied to status indicator */\n.saltTooltip-icon {\n --saltIcon-margin: var(--tooltip-icon-marginTop) var(--salt-spacing-75) 0 0;\n vertical-align: top;\n align-self: flex-start;\n}\n\n/* Styles applied when status = \"info\" */\n.saltTooltip-info {\n --tooltip-status-borderColor: var(--salt-status-info-borderColor);\n}\n\n/* Styles applied when status = \"error\" */\n.saltTooltip-error {\n --tooltip-status-borderColor: var(--salt-status-error-borderColor);\n}\n\n/* Styles applied when status = \"warning\" */\n.saltTooltip-warning {\n --tooltip-status-borderColor: var(--salt-status-warning-borderColor);\n}\n\n/* Styles applied when status = \"success\" */\n.saltTooltip-success {\n --tooltip-status-borderColor: var(--salt-status-success-borderColor);\n}\n";
|
|
2
2
|
|
|
3
3
|
export { css_248z as default };
|
|
4
4
|
//# sourceMappingURL=Tooltip.css.js.map
|
|
@@ -30,8 +30,10 @@ function getDelay(value, prop, pointerType) {
|
|
|
30
30
|
}
|
|
31
31
|
const useAriaAnnounce = (context, { delay = 0 }) => {
|
|
32
32
|
const { open, dataRef, refs } = context;
|
|
33
|
-
const pointerTypeRef = useRef(
|
|
34
|
-
|
|
33
|
+
const pointerTypeRef = useRef(
|
|
34
|
+
void 0
|
|
35
|
+
);
|
|
36
|
+
const timeoutRef = useRef(void 0);
|
|
35
37
|
const blockMouseMoveRef = useRef(true);
|
|
36
38
|
const { announce } = useAriaAnnouncer();
|
|
37
39
|
useIsomorphicLayoutEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAriaAnnounce.js","sources":["../src/tooltip/useAriaAnnounce.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type PointerEvent, useEffect, useRef } from \"react\";\nimport { useAriaAnnouncer } from \"../aria-announcer\";\nimport { useIsomorphicLayoutEffect } from \"../utils\";\n\nfunction getDocument(floating: HTMLElement | null) {\n return floating?.ownerDocument ?? document;\n}\n\n// TODO: Check whether can be anything more restrictive than `any`\n// biome-ignore lint/suspicious/noExplicitAny: see comment above\nfunction getWindow(value: any) {\n return getDocument(value).defaultView ?? window;\n}\n\nfunction isElement(value: unknown): value is HTMLElement {\n return value ? value instanceof getWindow(value).Element : false;\n}\n\nfunction getDelay(\n value: Props[\"delay\"],\n prop: \"open\" | \"close\",\n pointerType?: PointerEvent[\"pointerType\"],\n) {\n if (pointerType && pointerType !== \"mouse\") {\n return 0;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n return value?.[prop];\n}\n\ntype Props = {\n delay?: number | Partial<{ open: number; close: number }>;\n};\n\nexport const useAriaAnnounce = (\n context: FloatingContext,\n { delay = 0 }: Props,\n): ElementProps => {\n const { open, dataRef, refs } = context;\n\n const pointerTypeRef = useRef<PointerEvent[\"pointerType\"]>();\n const timeoutRef = useRef<number>();\n const blockMouseMoveRef = useRef(true);\n const { announce } = useAriaAnnouncer();\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n }\n });\n\n useEffect(() => {\n const reference = refs.reference.current;\n function announceFloating() {\n const tooltipContent = refs.floating.current?.innerText;\n\n if (tooltipContent) {\n announce(tooltipContent);\n }\n }\n\n function onMouseEnter(event: MouseEvent) {\n clearTimeout(timeoutRef.current);\n\n if (open) {\n return;\n }\n\n blockMouseMoveRef.current = false;\n dataRef.current.openEvent = event;\n\n if (delay) {\n timeoutRef.current = window.setTimeout(\n () => {\n announceFloating();\n },\n getDelay(delay, \"open\", pointerTypeRef.current),\n );\n } else {\n announceFloating();\n }\n }\n\n if (isElement(reference)) {\n reference.addEventListener(\"mouseenter\", onMouseEnter);\n return () => {\n reference.removeEventListener(\"mouseenter\", onMouseEnter);\n };\n }\n }, [dataRef, delay, open, refs.reference, refs.floating, announce]);\n\n function setPointerRef(event: PointerEvent) {\n pointerTypeRef.current = event.pointerType;\n }\n\n return {\n reference: {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n },\n floating: {\n onMouseEnter() {\n clearTimeout(timeoutRef.current);\n },\n },\n };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAKA,SAAS,YAAY,QAAA,EAA8B;AACjD,EAAA,OAAA,CAAO,qCAAU,aAAA,KAAiB,QAAA;AACpC;AAIA,SAAS,UAAU,KAAA,EAAY;AAC7B,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,WAAA,IAAe,MAAA;AAC3C;AAEA,SAAS,UAAU,KAAA,EAAsC;AACvD,EAAA,OAAO,KAAA,GAAQ,KAAA,YAAiB,SAAA,CAAU,KAAK,EAAE,OAAA,GAAU,KAAA;AAC7D;AAEA,SAAS,QAAA,CACP,KAAA,EACA,IAAA,EACA,WAAA,EACA;AACA,EAAA,IAAI,WAAA,IAAe,gBAAgB,OAAA,EAAS;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAQ,IAAA,CAAA;AACjB;AAMO,MAAM,kBAAkB,CAC7B,OAAA,EACA,EAAE,KAAA,GAAQ,GAAE,KACK;AACjB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK,GAAI,OAAA;AAEhC,EAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"useAriaAnnounce.js","sources":["../src/tooltip/useAriaAnnounce.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type PointerEvent, useEffect, useRef } from \"react\";\nimport { useAriaAnnouncer } from \"../aria-announcer\";\nimport { useIsomorphicLayoutEffect } from \"../utils\";\n\nfunction getDocument(floating: HTMLElement | null) {\n return floating?.ownerDocument ?? document;\n}\n\n// TODO: Check whether can be anything more restrictive than `any`\n// biome-ignore lint/suspicious/noExplicitAny: see comment above\nfunction getWindow(value: any) {\n return getDocument(value).defaultView ?? window;\n}\n\nfunction isElement(value: unknown): value is HTMLElement {\n return value ? value instanceof getWindow(value).Element : false;\n}\n\nfunction getDelay(\n value: Props[\"delay\"],\n prop: \"open\" | \"close\",\n pointerType?: PointerEvent[\"pointerType\"],\n) {\n if (pointerType && pointerType !== \"mouse\") {\n return 0;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n return value?.[prop];\n}\n\ntype Props = {\n delay?: number | Partial<{ open: number; close: number }>;\n};\n\nexport const useAriaAnnounce = (\n context: FloatingContext,\n { delay = 0 }: Props,\n): ElementProps => {\n const { open, dataRef, refs } = context;\n\n const pointerTypeRef = useRef<PointerEvent[\"pointerType\"] | undefined>(\n undefined,\n );\n const timeoutRef = useRef<number | undefined>(undefined);\n const blockMouseMoveRef = useRef(true);\n const { announce } = useAriaAnnouncer();\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n }\n });\n\n useEffect(() => {\n const reference = refs.reference.current;\n function announceFloating() {\n const tooltipContent = refs.floating.current?.innerText;\n\n if (tooltipContent) {\n announce(tooltipContent);\n }\n }\n\n function onMouseEnter(event: MouseEvent) {\n clearTimeout(timeoutRef.current);\n\n if (open) {\n return;\n }\n\n blockMouseMoveRef.current = false;\n dataRef.current.openEvent = event;\n\n if (delay) {\n timeoutRef.current = window.setTimeout(\n () => {\n announceFloating();\n },\n getDelay(delay, \"open\", pointerTypeRef.current),\n );\n } else {\n announceFloating();\n }\n }\n\n if (isElement(reference)) {\n reference.addEventListener(\"mouseenter\", onMouseEnter);\n return () => {\n reference.removeEventListener(\"mouseenter\", onMouseEnter);\n };\n }\n }, [dataRef, delay, open, refs.reference, refs.floating, announce]);\n\n function setPointerRef(event: PointerEvent) {\n pointerTypeRef.current = event.pointerType;\n }\n\n return {\n reference: {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n },\n floating: {\n onMouseEnter() {\n clearTimeout(timeoutRef.current);\n },\n },\n };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAKA,SAAS,YAAY,QAAA,EAA8B;AACjD,EAAA,OAAA,CAAO,qCAAU,aAAA,KAAiB,QAAA;AACpC;AAIA,SAAS,UAAU,KAAA,EAAY;AAC7B,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,WAAA,IAAe,MAAA;AAC3C;AAEA,SAAS,UAAU,KAAA,EAAsC;AACvD,EAAA,OAAO,KAAA,GAAQ,KAAA,YAAiB,SAAA,CAAU,KAAK,EAAE,OAAA,GAAU,KAAA;AAC7D;AAEA,SAAS,QAAA,CACP,KAAA,EACA,IAAA,EACA,WAAA,EACA;AACA,EAAA,IAAI,WAAA,IAAe,gBAAgB,OAAA,EAAS;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAQ,IAAA,CAAA;AACjB;AAMO,MAAM,kBAAkB,CAC7B,OAAA,EACA,EAAE,KAAA,GAAQ,GAAE,KACK;AACjB,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK,GAAI,OAAA;AAEhC,EAAA,MAAM,cAAA,GAAiB,MAAA;AAAA,IACrB;AAAA,GACF;AACA,EAAA,MAAM,UAAA,GAAa,OAA2B,MAAS,CAAA;AACvD,EAAA,MAAM,iBAAA,GAAoB,OAAO,IAAI,CAAA;AACrC,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,gBAAA,EAAiB;AAEtC,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,cAAA,CAAe,OAAA,GAAU,MAAA;AAAA,IAC3B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,OAAA;AACjC,IAAA,SAAS,gBAAA,GAAmB;AA5DhC,MAAA,IAAA,EAAA;AA6DM,MAAA,MAAM,cAAA,GAAA,CAAiB,EAAA,GAAA,IAAA,CAAK,QAAA,CAAS,OAAA,KAAd,IAAA,GAAA,MAAA,GAAA,EAAA,CAAuB,SAAA;AAE9C,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,QAAA,CAAS,cAAc,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,SAAS,aAAa,KAAA,EAAmB;AACvC,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAE/B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AAEA,MAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAC5B,MAAA,OAAA,CAAQ,QAAQ,SAAA,GAAY,KAAA;AAE5B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA;AAAA,UAC1B,MAAM;AACJ,YAAA,gBAAA,EAAiB;AAAA,UACnB,CAAA;AAAA,UACA,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ,cAAA,CAAe,OAAO;AAAA,SAChD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,gBAAA,EAAiB;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,YAAY,CAAA;AACrD,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,CAAU,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAAA,MAC1D,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,KAAK,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAC,CAAA;AAElE,EAAA,SAAS,cAAc,KAAA,EAAqB;AAC1C,IAAA,cAAA,CAAe,UAAU,KAAA,CAAM,WAAA;AAAA,EACjC;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW;AAAA,MACT,aAAA,EAAe,aAAA;AAAA,MACf,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,YAAA,GAAe;AACb,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,MACjC;AAAA;AACF,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTooltip.js","sources":["../src/tooltip/useTooltip.ts"],"sourcesContent":["import {\n arrow,\n flip,\n limitShift,\n offset,\n safePolygon,\n shift,\n useDismiss,\n useFocus,\n useHover,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { type HTMLProps, useRef } from \"react\";\nimport {\n type UseFloatingUIProps,\n useControlled,\n useFloatingUI,\n} from \"../utils\";\nimport { useAriaAnnounce } from \"./useAriaAnnounce\";\n\nexport interface UseTooltipProps\n extends Partial<\n Pick<UseFloatingUIProps, \"onOpenChange\" | \"open\" | \"placement\">\n > {\n /**\n * When `true`, the tooltip will be disabled.\n */\n disabled?: boolean;\n /**\n * Do not respond to focus events.\n */\n disableFocusListener?: boolean;\n /**\n * Do not respond to hover events.\n */\n disableHoverListener?: boolean;\n /**\n * The number of milliseconds to wait before showing the tooltip.\n * This prop won't impact the enter touch delay (`enterTouchDelay`).\n */\n enterDelay?: number;\n /**\n * The number of milliseconds to wait before hiding the tooltip.\n * This prop won't impact the leave touch delay (`leaveTouchDelay`).\n */\n leaveDelay?: number;\n}\n\nexport function useTooltip(props?: UseTooltipProps) {\n const {\n enterDelay,\n disabled,\n leaveDelay,\n open: openProp,\n onOpenChange,\n placement: placementProp,\n disableHoverListener,\n disableFocusListener,\n } = props ?? {};\n\n const arrowRef = useRef<SVGSVGElement | null>(null);\n\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: false,\n name: \"Tooltip\",\n state: \"open\",\n });\n const handleOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChange?.(open);\n };\n\n const { floating, reference, x, y, strategy, placement, context, elements } =\n useFloatingUI({\n open: disabled ? false : open,\n onOpenChange: handleOpenChange,\n placement: placementProp,\n middleware: [\n offset(8),\n shift({ limiter: limitShift() }),\n flip({\n fallbackAxisSideDirection: \"end\",\n fallbackStrategy: \"initialPlacement\",\n }),\n arrow({ element: arrowRef }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useHover(context, {\n delay: {\n open: enterDelay,\n close: leaveDelay,\n },\n enabled: !(disableHoverListener || disabled),\n handleClose: safePolygon(),\n }),\n useFocus(context, { enabled: !(disableFocusListener || disabled) }),\n useRole(context, { role: \"tooltip\" }),\n useDismiss(context, { enabled: !disabled }),\n useAriaAnnounce(context, {\n delay: {\n open: enterDelay,\n close: leaveDelay,\n },\n }),\n ]);\n\n const arrowProps = {\n ref: arrowRef,\n context,\n };\n\n const getTooltipProps = (): HTMLProps<HTMLDivElement> => {\n // tabIndex causes axe errors because it is set to \"-1\".\n const { tabIndex: _tabIndex, ...tooltipProps } = getFloatingProps({\n // @ts-expect-error - `data-*` props need extra typing when not used on a DOM element.\n \"data-placement\": placement,\n ref: floating,\n });\n\n return tooltipProps;\n };\n\n const getTriggerProps = () =>\n getReferenceProps({\n ref: reference,\n });\n\n const getTooltipPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n return {\n arrowProps,\n open,\n floating,\n reference,\n getTooltipProps,\n getTriggerProps,\n getTooltipPosition,\n };\n}\n"],"names":["open"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useTooltip.js","sources":["../src/tooltip/useTooltip.ts"],"sourcesContent":["import {\n arrow,\n type FloatingContext,\n flip,\n limitShift,\n offset,\n type Strategy,\n safePolygon,\n shift,\n useDismiss,\n useFocus,\n useHover,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport { type HTMLProps, type MutableRefObject, useRef } from \"react\";\nimport {\n type UseFloatingUIProps,\n type UseFloatingUIReturn,\n useControlled,\n useFloatingUI,\n} from \"../utils\";\nimport { useAriaAnnounce } from \"./useAriaAnnounce\";\n\nexport interface UseTooltipProps\n extends Partial<\n Pick<UseFloatingUIProps, \"onOpenChange\" | \"open\" | \"placement\">\n > {\n /**\n * When `true`, the tooltip will be disabled.\n */\n disabled?: boolean;\n /**\n * Do not respond to focus events.\n */\n disableFocusListener?: boolean;\n /**\n * Do not respond to hover events.\n */\n disableHoverListener?: boolean;\n /**\n * The number of milliseconds to wait before showing the tooltip.\n * This prop won't impact the enter touch delay (`enterTouchDelay`).\n */\n enterDelay?: number;\n /**\n * The number of milliseconds to wait before hiding the tooltip.\n * This prop won't impact the leave touch delay (`leaveTouchDelay`).\n */\n leaveDelay?: number;\n}\n\ninterface UseTooltipReturn {\n arrowProps: {\n ref: MutableRefObject<SVGSVGElement | null>;\n context: FloatingContext;\n };\n open: boolean;\n floating: UseFloatingUIReturn[\"floating\"];\n reference: UseFloatingUIReturn[\"reference\"];\n getTooltipProps: () => HTMLProps<HTMLDivElement>;\n getTriggerProps: () => Record<string, unknown>;\n getTooltipPosition: () => {\n top: number;\n left: number;\n position: Strategy;\n width: number | undefined;\n height: number | undefined;\n };\n}\n\nexport function useTooltip(props?: UseTooltipProps): UseTooltipReturn {\n const {\n enterDelay,\n disabled,\n leaveDelay,\n open: openProp,\n onOpenChange,\n placement: placementProp,\n disableHoverListener,\n disableFocusListener,\n } = props ?? {};\n\n const arrowRef = useRef<SVGSVGElement | null>(null);\n\n const [open, setOpen] = useControlled({\n controlled: openProp,\n default: false,\n name: \"Tooltip\",\n state: \"open\",\n });\n const handleOpenChange = (open: boolean) => {\n setOpen(open);\n onOpenChange?.(open);\n };\n\n const { floating, reference, x, y, strategy, placement, context, elements } =\n useFloatingUI({\n open: disabled ? false : open,\n onOpenChange: handleOpenChange,\n placement: placementProp,\n middleware: [\n offset(8),\n shift({ limiter: limitShift() }),\n flip({\n fallbackAxisSideDirection: \"end\",\n fallbackStrategy: \"initialPlacement\",\n }),\n arrow({ element: arrowRef }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useHover(context, {\n delay: {\n open: enterDelay,\n close: leaveDelay,\n },\n enabled: !(disableHoverListener || disabled),\n handleClose: safePolygon(),\n }),\n useFocus(context, { enabled: !(disableFocusListener || disabled) }),\n useRole(context, { role: \"tooltip\" }),\n useDismiss(context, { enabled: !disabled }),\n useAriaAnnounce(context, {\n delay: {\n open: enterDelay,\n close: leaveDelay,\n },\n }),\n ]);\n\n const arrowProps = {\n ref: arrowRef,\n context,\n };\n\n const getTooltipProps = (): HTMLProps<HTMLDivElement> => {\n // tabIndex causes axe errors because it is set to \"-1\".\n const { tabIndex: _tabIndex, ...tooltipProps } = getFloatingProps({\n // @ts-expect-error - `data-*` props need extra typing when not used on a DOM element.\n \"data-placement\": placement,\n ref: floating,\n });\n\n return tooltipProps;\n };\n\n const getTriggerProps = () =>\n getReferenceProps({\n ref: reference,\n });\n\n const getTooltipPosition = () => ({\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n });\n\n return {\n arrowProps,\n open,\n floating,\n reference,\n getTooltipProps,\n getTriggerProps,\n getTooltipPosition,\n };\n}\n"],"names":["open"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeContext.js","sources":["../src/tree/TreeContext.ts"],"sourcesContent":["import {\n type Dispatch,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n type SyntheticEvent,\n useContext,\n} from \"react\";\nimport { createContext } from \"../utils\";\nimport type { TreeModel, TreeNodeMeta } from \"./useTree\";\n\nexport interface TreeContextValue {\n expandedState: Set<string>;\n /** Toggle a node expansion state */\n toggleExpanded: (event: SyntheticEvent, value: string) => void;\n\n /** Selected node values */\n selectedState: string[];\n /** Selected node values as Set for O(1) lookups */\n selectedSet: Set<string>;\n /** Set selected state directly */\n setSelectedState: Dispatch<SetStateAction<string[]>>;\n /** Set selected state without expanding selection through hidden descendants */\n setVisibleSelectionState: (selected: string[]) => void;\n /** Select node */\n select: (event: SyntheticEvent, value: string) => void;\n\n /** Whether multiselect mode with checkboxes is enabled */\n multiselect: boolean;\n /** Disabled state of the tree */\n disabled: boolean;\n /** Set of disabled node IDs */\n disabledIdsSet: Set<string>;\n\n /** Tree model for traversal */\n treeModel: TreeModel;\n /** Get node metadata from tree model */\n getNodeMeta: (value: string) => TreeNodeMeta | undefined;\n /** Get parent of a node */\n getParent: (value: string) => string | undefined;\n /** Get children of a node */\n getChildren: (value: string) => string[];\n /** Get all descendants of a node */\n getDescendants: (value: string) => string[];\n /** Get all ancestors of a node */\n getAncestors: (value: string) => string[];\n /** Memoized visible (navigable) nodes in tree order */\n visibleNodes: string[];\n /** Memoized tabbable node ID for roving tabindex (computed once at tree level) */\n tabbableNodeId: string | undefined;\n /** Register a DOM element for focus management */\n registerElement: (value: string, element: HTMLElement) => () => void;\n /** Get DOM element for a node (if mounted) */\n getElement: (value: string) => HTMLElement | undefined;\n /** Active node value */\n activeNode: string | undefined;\n /** Set the active node */\n setActiveNode: Dispatch<SetStateAction<string | undefined>>;\n\n /** Set of indeterminate (partially selected) node IDs */\n indeterminateState: Set<string>;\n}\n\nconst TreeContext = createContext<TreeContextValue | undefined>(\n \"Tree Context\",\n undefined,\n);\n\nexport const TreeProvider = TreeContext.Provider;\n\nexport function useTreeContext(): TreeContextValue {\n const context = useContext(TreeContext);\n if (!context) {\n throw new Error(\"useTreeContext must be used within a TreeProvider\");\n }\n return context;\n}\n\nexport interface TreeNodeContextValue {\n /** Current node value */\n value: string;\n /** Current depth level */\n level: number;\n /** Whether node has children */\n hasChildren: boolean;\n /** Whether node is expanded */\n expanded: boolean;\n /** Whether node is disabled */\n disabled: boolean;\n /** Node id for the li element */\n id: string;\n /** Ref for the li element rendered by TreeNodeTrigger */\n nodeRef: RefObject<HTMLLIElement>;\n /** Callback ref that connects TreeNode's forwarded ref to the li element */\n setNodeRef: Ref<HTMLLIElement> | null;\n /** Whether node is selected */\n selected: boolean;\n /** Whether node is in indeterminate state (partially selected children) */\n indeterminate: boolean;\n /** Child TreeNode elements to be rendered inside the group */\n nodeChildren: ReactNode;\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextValue | undefined>(\n \"TreeNodeContext\",\n undefined,\n);\n\nexport const TreeNodeProvider = TreeNodeContext.Provider;\n\nexport function useTreeNodeContext(): TreeNodeContextValue | undefined {\n return useContext(TreeNodeContext);\n}\n"],"names":[],"mappings":";;;;;;;;;AAgEA,MAAM,WAAA,GAAc,aAAA;AAAA,EAClB,cAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,eAAe,WAAA,CAAY;AAEjC,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT;AA2BA,MAAM,eAAA,GAAkB,aAAA;AAAA,EACtB,iBAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,mBAAmB,eAAA,CAAgB;AAEzC,SAAS,kBAAA,GAAuD;AACrE,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;;;;"}
|
|
1
|
+
{"version":3,"file":"TreeContext.js","sources":["../src/tree/TreeContext.ts"],"sourcesContent":["import {\n type Dispatch,\n type ReactNode,\n type Ref,\n type RefObject,\n type SetStateAction,\n type SyntheticEvent,\n useContext,\n} from \"react\";\nimport { createContext } from \"../utils\";\nimport type { TreeModel, TreeNodeMeta } from \"./useTree\";\n\nexport interface TreeContextValue {\n expandedState: Set<string>;\n /** Toggle a node expansion state */\n toggleExpanded: (event: SyntheticEvent, value: string) => void;\n\n /** Selected node values */\n selectedState: string[];\n /** Selected node values as Set for O(1) lookups */\n selectedSet: Set<string>;\n /** Set selected state directly */\n setSelectedState: Dispatch<SetStateAction<string[]>>;\n /** Set selected state without expanding selection through hidden descendants */\n setVisibleSelectionState: (selected: string[]) => void;\n /** Select node */\n select: (event: SyntheticEvent, value: string) => void;\n\n /** Whether multiselect mode with checkboxes is enabled */\n multiselect: boolean;\n /** Disabled state of the tree */\n disabled: boolean;\n /** Set of disabled node IDs */\n disabledIdsSet: Set<string>;\n\n /** Tree model for traversal */\n treeModel: TreeModel;\n /** Get node metadata from tree model */\n getNodeMeta: (value: string) => TreeNodeMeta | undefined;\n /** Get parent of a node */\n getParent: (value: string) => string | undefined;\n /** Get children of a node */\n getChildren: (value: string) => string[];\n /** Get all descendants of a node */\n getDescendants: (value: string) => string[];\n /** Get all ancestors of a node */\n getAncestors: (value: string) => string[];\n /** Memoized visible (navigable) nodes in tree order */\n visibleNodes: string[];\n /** Memoized tabbable node ID for roving tabindex (computed once at tree level) */\n tabbableNodeId: string | undefined;\n /** Register a DOM element for focus management */\n registerElement: (value: string, element: HTMLElement) => () => void;\n /** Get DOM element for a node (if mounted) */\n getElement: (value: string) => HTMLElement | undefined;\n /** Active node value */\n activeNode: string | undefined;\n /** Set the active node */\n setActiveNode: Dispatch<SetStateAction<string | undefined>>;\n\n /** Set of indeterminate (partially selected) node IDs */\n indeterminateState: Set<string>;\n}\n\nconst TreeContext = createContext<TreeContextValue | undefined>(\n \"Tree Context\",\n undefined,\n);\n\nexport const TreeProvider = TreeContext.Provider;\n\nexport function useTreeContext(): TreeContextValue {\n const context = useContext(TreeContext);\n if (!context) {\n throw new Error(\"useTreeContext must be used within a TreeProvider\");\n }\n return context;\n}\n\nexport interface TreeNodeContextValue {\n /** Current node value */\n value: string;\n /** Current depth level */\n level: number;\n /** Whether node has children */\n hasChildren: boolean;\n /** Whether node is expanded */\n expanded: boolean;\n /** Whether node is disabled */\n disabled: boolean;\n /** Node id for the li element */\n id: string;\n /** Ref for the li element rendered by TreeNodeTrigger */\n nodeRef: RefObject<HTMLLIElement | null>;\n /** Callback ref that connects TreeNode's forwarded ref to the li element */\n setNodeRef: Ref<HTMLLIElement> | null;\n /** Whether node is selected */\n selected: boolean;\n /** Whether node is in indeterminate state (partially selected children) */\n indeterminate: boolean;\n /** Child TreeNode elements to be rendered inside the group */\n nodeChildren: ReactNode;\n}\n\nconst TreeNodeContext = createContext<TreeNodeContextValue | undefined>(\n \"TreeNodeContext\",\n undefined,\n);\n\nexport const TreeNodeProvider = TreeNodeContext.Provider;\n\nexport function useTreeNodeContext(): TreeNodeContextValue | undefined {\n return useContext(TreeNodeContext);\n}\n"],"names":[],"mappings":";;;;;;;;;AAgEA,MAAM,WAAA,GAAc,aAAA;AAAA,EAClB,cAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,eAAe,WAAA,CAAY;AAEjC,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT;AA2BA,MAAM,eAAA,GAAkB,aAAA;AAAA,EACtB,iBAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,mBAAmB,eAAA,CAAgB;AAEzC,SAAS,kBAAA,GAAuD;AACrE,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
function attachRef(ref, instance) {
|
|
2
|
+
if (typeof ref === "function") {
|
|
3
|
+
const cleanup = ref(instance);
|
|
4
|
+
return typeof cleanup === "function" ? cleanup : () => ref(null);
|
|
5
|
+
}
|
|
6
|
+
if (ref) {
|
|
7
|
+
const objectRef = ref;
|
|
8
|
+
objectRef.current = instance;
|
|
9
|
+
return () => {
|
|
10
|
+
objectRef.current = null;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
function forkRef(refA, refB) {
|
|
16
|
+
let cleanup;
|
|
17
|
+
return (instance) => {
|
|
18
|
+
cleanup == null ? void 0 : cleanup();
|
|
19
|
+
cleanup = void 0;
|
|
20
|
+
if (instance != null) {
|
|
21
|
+
const cleanupA = attachRef(refA, instance);
|
|
22
|
+
const cleanupB = attachRef(refB, instance);
|
|
23
|
+
cleanup = () => {
|
|
24
|
+
cleanupA == null ? void 0 : cleanupA();
|
|
25
|
+
cleanupB == null ? void 0 : cleanupB();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { forkRef };
|
|
32
|
+
//# sourceMappingURL=forkRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forkRef.js","sources":["../src/utils/forkRef.ts"],"sourcesContent":["import type { Ref, RefCallback } from \"react\";\n\ntype RefCleanup = () => void;\n\nfunction attachRef<Instance>(\n ref: Ref<Instance> | null | undefined,\n instance: Instance,\n): RefCleanup | undefined {\n if (typeof ref === \"function\") {\n // From React 19, a callback ref can return a cleanup function, which React\n // calls instead of calling the ref with `null`.\n const cleanup = ref(instance);\n return typeof cleanup === \"function\" ? cleanup : () => ref(null);\n }\n\n if (ref) {\n // `current` is read-only in the React 18 types.\n const objectRef: { current: Instance | null } = ref;\n objectRef.current = instance;\n return () => {\n objectRef.current = null;\n };\n }\n\n return undefined;\n}\n\n/**\n * Merges two refs into a callback ref. Components and hooks should use\n * `useForkRef`, so the merged ref only changes when one of the refs changes.\n * This is for places that can't call a hook, such as a props getter.\n *\n * The returned ref never returns a cleanup itself, so every React version\n * detaches it by calling it with `null`; that is when the cleanups collected\n * from refA and refB are run.\n */\nexport function forkRef<Instance>(\n refA: Ref<Instance> | null | undefined,\n refB: Ref<Instance> | null | undefined,\n): RefCallback<Instance> {\n let cleanup: RefCleanup | undefined;\n\n return (instance: Instance | null) => {\n cleanup?.();\n cleanup = undefined;\n\n if (instance != null) {\n const cleanupA = attachRef(refA, instance);\n const cleanupB = attachRef(refB, instance);\n cleanup = () => {\n cleanupA?.();\n cleanupB?.();\n };\n }\n };\n}\n"],"names":[],"mappings":"AAIA,SAAS,SAAA,CACP,KACA,QAAA,EACwB;AACxB,EAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAG7B,IAAA,MAAM,OAAA,GAAU,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,GAAU,MAAM,IAAI,IAAI,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,GAAA,EAAK;AAEP,IAAA,MAAM,SAAA,GAA0C,GAAA;AAChD,IAAA,SAAA,CAAU,OAAA,GAAU,QAAA;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,OAAA,CACd,MACA,IAAA,EACuB;AACvB,EAAA,IAAI,OAAA;AAEJ,EAAA,OAAO,CAAC,QAAA,KAA8B;AACpC,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,EAAA;AACA,IAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACzC,MAAA,OAAA,GAAU,MAAM;AACd,QAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,EAAA;AACA,QAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,EAAA;AAAA,MACF,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRefFromChildren.js","sources":["../src/utils/getRefFromChildren.ts"],"sourcesContent":["import { isValidElement, type ReactNode } from \"react\";\n\nexport function getRefFromChildren(child: ReactNode) {\n if (!child || !isValidElement(child)) {\n return null;\n }\n\n return Object.prototype.propertyIsEnumerable.call(child.props, \"ref\")\n ? child.props.ref\n : // @ts-expect-error - ref is not defined on ReactNode\n child.ref;\n}\n"],"names":[],"mappings":";;AAEO,SAAS,mBAAmB,KAAA,EAAkB;AACnD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,cAAA,
|
|
1
|
+
{"version":3,"file":"getRefFromChildren.js","sources":["../src/utils/getRefFromChildren.ts"],"sourcesContent":["import { isValidElement, type ReactNode, type Ref } from \"react\";\n\nexport function getRefFromChildren(child: ReactNode) {\n if (!child || !isValidElement<{ ref?: Ref<unknown> }>(child)) {\n return null;\n }\n\n return Object.prototype.propertyIsEnumerable.call(child.props, \"ref\")\n ? child.props.ref\n : // @ts-expect-error - ref is not defined on ReactNode\n child.ref;\n}\n"],"names":[],"mappings":";;AAEO,SAAS,mBAAmB,KAAA,EAAkB;AACnD,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,cAAA,CAAuC,KAAK,CAAA,EAAG;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,UAAU,oBAAA,CAAqB,IAAA,CAAK,MAAM,KAAA,EAAO,KAAK,CAAA,GAChE,KAAA,CAAM,KAAA,CAAM,GAAA;AAAA;AAAA,IAEZ,KAAA,CAAM;AAAA,GAAA;AACZ;;;;"}
|