@base-ui/react 1.4.1 → 1.5.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 +125 -8
- package/README.md +1 -1
- package/accordion/item/AccordionItem.d.ts +4 -0
- package/accordion/item/AccordionItem.js +5 -4
- package/accordion/panel/AccordionPanel.js +29 -51
- package/accordion/root/AccordionRoot.js +5 -6
- package/accordion/trigger/AccordionTrigger.js +3 -4
- package/alert-dialog/handle.d.ts +14 -1
- package/alert-dialog/handle.js +22 -5
- package/alert-dialog/index.d.ts +1 -1
- package/alert-dialog/index.parts.d.ts +2 -3
- package/alert-dialog/index.parts.js +4 -5
- package/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
- package/alert-dialog/root/AlertDialogRoot.js +2 -56
- package/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
- package/alert-dialog/trigger/AlertDialogTrigger.js +15 -0
- package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
- package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +18 -0
- package/autocomplete/root/AutocompleteRoot.js +9 -10
- package/avatar/image/AvatarImage.js +4 -4
- package/checkbox/indicator/CheckboxIndicator.js +2 -2
- package/checkbox/root/CheckboxRoot.js +49 -11
- package/checkbox-group/CheckboxGroup.js +1 -5
- package/collapsible/panel/CollapsiblePanel.js +29 -51
- package/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
- package/collapsible/panel/useCollapsiblePanel.js +308 -268
- package/collapsible/root/CollapsibleRoot.d.ts +1 -1
- package/collapsible/root/CollapsibleRootContext.d.ts +0 -2
- package/collapsible/root/useCollapsibleRoot.d.ts +0 -27
- package/collapsible/root/useCollapsibleRoot.js +2 -64
- package/collapsible/trigger/CollapsibleTrigger.js +5 -6
- package/combobox/arrow/ComboboxArrow.js +1 -1
- package/combobox/backdrop/ComboboxBackdrop.js +1 -1
- package/combobox/chip/ComboboxChip.js +7 -2
- package/combobox/clear/ComboboxClear.d.ts +4 -0
- package/combobox/clear/ComboboxClear.js +1 -0
- package/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
- package/combobox/clear/ComboboxClearDataAttributes.js +4 -0
- package/combobox/icon/ComboboxIcon.js +1 -1
- package/combobox/input/ComboboxInput.js +15 -6
- package/combobox/item/ComboboxItem.js +8 -14
- package/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
- package/combobox/root/AriaCombobox.js +61 -28
- package/combobox/store.d.ts +4 -8
- package/combobox/store.js +2 -1
- package/combobox/utils/ComboboxInternalDismissButton.js +2 -3
- package/csp-provider/CSPProvider.js +1 -1
- package/dialog/close/DialogClose.js +6 -6
- package/dialog/popup/DialogPopup.js +9 -4
- package/dialog/root/DialogRoot.d.ts +1 -2
- package/dialog/root/DialogRoot.js +3 -73
- package/dialog/root/DialogRootContext.d.ts +1 -0
- package/dialog/root/DialogRootContext.js +3 -1
- package/dialog/root/useDialogRoot.d.ts +12 -4
- package/dialog/root/useDialogRoot.js +27 -25
- package/dialog/root/useRenderDialogRoot.d.ts +4 -0
- package/dialog/root/useRenderDialogRoot.js +96 -0
- package/dialog/store/DialogHandle.d.ts +1 -1
- package/dialog/store/DialogHandle.js +2 -2
- package/dialog/store/DialogStore.d.ts +88 -1
- package/dialog/store/DialogStore.js +12 -17
- package/dialog/trigger/DialogTrigger.d.ts +1 -1
- package/dialog/trigger/DialogTrigger.js +11 -4
- package/dialog/viewport/DialogViewport.js +4 -3
- package/drawer/popup/DrawerPopup.js +13 -9
- package/drawer/root/DrawerRoot.js +11 -11
- package/drawer/root/DrawerRootContext.d.ts +1 -1
- package/drawer/swipe-area/DrawerSwipeArea.js +6 -5
- package/drawer/viewport/DrawerViewport.js +13 -14
- package/esm/accordion/item/AccordionItem.d.ts +4 -0
- package/esm/accordion/item/AccordionItem.js +5 -4
- package/esm/accordion/panel/AccordionPanel.js +29 -51
- package/esm/accordion/root/AccordionRoot.js +5 -6
- package/esm/accordion/trigger/AccordionTrigger.js +4 -5
- package/esm/alert-dialog/handle.d.ts +14 -1
- package/esm/alert-dialog/handle.js +20 -5
- package/esm/alert-dialog/index.d.ts +1 -1
- package/esm/alert-dialog/index.parts.d.ts +2 -3
- package/esm/alert-dialog/index.parts.js +2 -3
- package/esm/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
- package/esm/alert-dialog/root/AlertDialogRoot.js +2 -55
- package/esm/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
- package/esm/alert-dialog/trigger/AlertDialogTrigger.js +10 -0
- package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
- package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +12 -0
- package/esm/autocomplete/root/AutocompleteRoot.js +9 -10
- package/esm/avatar/image/AvatarImage.js +4 -4
- package/esm/checkbox/indicator/CheckboxIndicator.js +2 -2
- package/esm/checkbox/root/CheckboxRoot.js +49 -11
- package/esm/checkbox-group/CheckboxGroup.js +1 -5
- package/esm/collapsible/panel/CollapsiblePanel.js +29 -51
- package/esm/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
- package/esm/collapsible/panel/useCollapsiblePanel.js +309 -269
- package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
- package/esm/collapsible/root/CollapsibleRootContext.d.ts +0 -2
- package/esm/collapsible/root/useCollapsibleRoot.d.ts +0 -27
- package/esm/collapsible/root/useCollapsibleRoot.js +2 -64
- package/esm/collapsible/trigger/CollapsibleTrigger.js +5 -6
- package/esm/combobox/arrow/ComboboxArrow.js +1 -1
- package/esm/combobox/backdrop/ComboboxBackdrop.js +1 -1
- package/esm/combobox/chip/ComboboxChip.js +7 -2
- package/esm/combobox/clear/ComboboxClear.d.ts +4 -0
- package/esm/combobox/clear/ComboboxClear.js +1 -0
- package/esm/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
- package/esm/combobox/clear/ComboboxClearDataAttributes.js +4 -0
- package/esm/combobox/icon/ComboboxIcon.js +1 -1
- package/esm/combobox/input/ComboboxInput.js +16 -7
- package/esm/combobox/item/ComboboxItem.js +8 -14
- package/esm/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
- package/esm/combobox/root/AriaCombobox.js +62 -29
- package/esm/combobox/store.d.ts +4 -8
- package/esm/combobox/store.js +2 -1
- package/esm/combobox/utils/ComboboxInternalDismissButton.js +2 -3
- package/esm/csp-provider/CSPProvider.js +1 -1
- package/esm/dialog/close/DialogClose.js +6 -6
- package/esm/dialog/popup/DialogPopup.js +9 -4
- package/esm/dialog/root/DialogRoot.d.ts +1 -2
- package/esm/dialog/root/DialogRoot.js +4 -72
- package/esm/dialog/root/DialogRootContext.d.ts +1 -0
- package/esm/dialog/root/DialogRootContext.js +2 -0
- package/esm/dialog/root/useDialogRoot.d.ts +12 -4
- package/esm/dialog/root/useDialogRoot.js +28 -27
- package/esm/dialog/root/useRenderDialogRoot.d.ts +4 -0
- package/esm/dialog/root/useRenderDialogRoot.js +90 -0
- package/esm/dialog/store/DialogHandle.d.ts +1 -1
- package/esm/dialog/store/DialogHandle.js +2 -2
- package/esm/dialog/store/DialogStore.d.ts +88 -1
- package/esm/dialog/store/DialogStore.js +13 -18
- package/esm/dialog/trigger/DialogTrigger.d.ts +1 -1
- package/esm/dialog/trigger/DialogTrigger.js +12 -5
- package/esm/dialog/viewport/DialogViewport.js +4 -3
- package/esm/drawer/popup/DrawerPopup.js +14 -9
- package/esm/drawer/root/DrawerRoot.js +11 -11
- package/esm/drawer/root/DrawerRootContext.d.ts +1 -1
- package/esm/drawer/swipe-area/DrawerSwipeArea.js +6 -5
- package/esm/drawer/viewport/DrawerViewport.js +13 -14
- package/esm/field/control/FieldControl.js +2 -6
- package/esm/field/item/FieldItem.js +1 -4
- package/esm/field/root/FieldRoot.js +11 -3
- package/esm/field/root/useFieldValidation.d.ts +1 -0
- package/esm/field/root/useFieldValidation.js +23 -20
- package/esm/field/utils/getCombinedFieldValidityData.d.ts +1 -1
- package/esm/field/validity/FieldValidity.d.ts +1 -1
- package/esm/floating-ui-react/components/FloatingDelayGroup.js +3 -3
- package/esm/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
- package/esm/floating-ui-react/components/FloatingFocusManager.js +20 -8
- package/esm/floating-ui-react/components/FloatingPortal.js +3 -3
- package/esm/floating-ui-react/hooks/useClick.js +83 -74
- package/esm/floating-ui-react/hooks/useClientPoint.js +29 -20
- package/esm/floating-ui-react/hooks/useDismiss.d.ts +1 -1
- package/esm/floating-ui-react/hooks/useDismiss.js +82 -93
- package/esm/floating-ui-react/hooks/useFloating.js +37 -32
- package/esm/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
- package/esm/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
- package/esm/floating-ui-react/hooks/useFocus.js +84 -81
- package/esm/floating-ui-react/hooks/useHover.js +72 -76
- package/esm/floating-ui-react/hooks/useHoverFloatingInteraction.js +49 -44
- package/esm/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
- package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
- package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +44 -39
- package/esm/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
- package/esm/floating-ui-react/hooks/useHoverShared.js +4 -0
- package/esm/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
- package/esm/floating-ui-react/hooks/useListNavigation.js +83 -74
- package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
- package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +25 -20
- package/esm/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
- package/esm/floating-ui-react/hooks/useTypeahead.js +33 -52
- package/esm/floating-ui-react/index.d.ts +0 -2
- package/esm/floating-ui-react/index.js +0 -2
- package/esm/floating-ui-react/types.d.ts +2 -7
- package/esm/floating-ui-react/utils/composite.js +2 -0
- package/esm/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
- package/esm/floating-ui-react/utils/enqueueFocus.js +10 -7
- package/esm/floating-ui-react/utils/getEmptyRootContext.js +1 -1
- package/esm/form/Form.js +2 -2
- package/esm/index.js +1 -1
- package/esm/internals/composite/composite.d.ts +0 -1
- package/esm/internals/composite/composite.js +1 -2
- package/esm/internals/composite/root/useCompositeRoot.js +2 -2
- package/esm/internals/createBaseUIEventDetails.d.ts +2 -0
- package/esm/internals/csp-context/index.d.ts +2 -0
- package/esm/internals/csp-context/index.js +1 -0
- package/esm/internals/field-register-control/index.d.ts +0 -1
- package/esm/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
- package/esm/internals/field-register-control/useFieldControlRegistration.js +11 -14
- package/esm/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
- package/esm/internals/field-register-control/useRegisterFieldControl.js +6 -11
- package/esm/internals/field-root-context/FieldRootContext.d.ts +1 -0
- package/esm/internals/field-root-context/FieldRootContext.js +3 -2
- package/esm/internals/form-context/FormContext.d.ts +5 -1
- package/esm/internals/reason-parts.d.ts +2 -0
- package/esm/internals/reason-parts.js +2 -0
- package/esm/internals/types.d.ts +1 -0
- package/esm/internals/use-button/useButton.js +4 -4
- package/esm/internals/usePressAndHold.js +2 -2
- package/esm/internals/useRenderElement.js +2 -0
- package/esm/menu/arrow/MenuArrow.js +1 -1
- package/esm/menu/backdrop/MenuBackdrop.js +1 -1
- package/esm/menu/checkbox-item/MenuCheckboxItem.js +5 -7
- package/esm/menu/group/MenuGroup.js +1 -4
- package/esm/menu/group/MenuGroupContext.d.ts +1 -3
- package/esm/menu/group/MenuGroupContext.js +1 -1
- package/esm/menu/group-label/MenuGroupLabel.js +4 -6
- package/esm/menu/link-item/MenuLinkItem.js +2 -2
- package/esm/menu/popup/MenuPopup.js +5 -5
- package/esm/menu/radio-group/MenuRadioGroup.js +11 -5
- package/esm/menu/radio-item/MenuRadioItem.js +5 -7
- package/esm/menu/root/MenuRoot.js +63 -68
- package/esm/menu/store/MenuHandle.js +1 -1
- package/esm/menu/store/MenuStore.d.ts +87 -0
- package/esm/menu/submenu-trigger/MenuSubmenuTrigger.js +8 -5
- package/esm/menu/trigger/MenuTrigger.js +13 -10
- package/esm/menu/viewport/MenuViewport.d.ts +2 -2
- package/esm/menu/viewport/MenuViewport.js +2 -2
- package/esm/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
- package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
- package/esm/navigation-menu/content/NavigationMenuContent.js +8 -5
- package/esm/navigation-menu/icon/NavigationMenuIcon.js +1 -1
- package/esm/navigation-menu/item/NavigationMenuItem.js +2 -2
- package/esm/navigation-menu/list/NavigationMenuList.js +1 -1
- package/esm/navigation-menu/popup/NavigationMenuPopup.js +2 -2
- package/esm/navigation-menu/root/NavigationMenuRoot.js +1 -3
- package/esm/navigation-menu/trigger/NavigationMenuTrigger.js +24 -17
- package/esm/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
- package/esm/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
- package/esm/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
- package/esm/number-field/input/NumberFieldInput.js +3 -5
- package/esm/number-field/root/NumberFieldRoot.js +5 -2
- package/esm/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
- package/esm/otp-field/input/OTPFieldInput.js +43 -29
- package/esm/otp-field/root/OTPFieldRoot.d.ts +17 -8
- package/esm/otp-field/root/OTPFieldRoot.js +33 -33
- package/esm/otp-field/root/OTPFieldRootContext.d.ts +1 -1
- package/esm/otp-field/utils/otp.d.ts +5 -4
- package/esm/otp-field/utils/otp.js +23 -12
- package/esm/popover/arrow/PopoverArrow.js +1 -1
- package/esm/popover/backdrop/PopoverBackdrop.js +1 -1
- package/esm/popover/close/PopoverClose.js +2 -2
- package/esm/popover/description/PopoverDescription.js +1 -7
- package/esm/popover/popup/PopoverPopup.d.ts +1 -1
- package/esm/popover/popup/PopoverPopup.js +16 -10
- package/esm/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
- package/esm/popover/popup/PopoverPopupDataAttributes.js +1 -1
- package/esm/popover/positioner/PopoverPositioner.js +5 -5
- package/esm/popover/root/PopoverRoot.d.ts +1 -1
- package/esm/popover/root/PopoverRoot.js +42 -47
- package/esm/popover/store/PopoverHandle.js +1 -1
- package/esm/popover/store/PopoverStore.d.ts +91 -4
- package/esm/popover/store/PopoverStore.js +17 -18
- package/esm/popover/title/PopoverTitle.js +1 -7
- package/esm/popover/trigger/PopoverTrigger.js +24 -17
- package/esm/popover/viewport/PopoverViewport.d.ts +3 -3
- package/esm/popover/viewport/PopoverViewport.js +2 -2
- package/esm/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
- package/esm/popover/viewport/PopoverViewportDataAttributes.js +1 -1
- package/esm/preview-card/positioner/PreviewCardPositioner.js +11 -1
- package/esm/preview-card/root/PreviewCardRoot.d.ts +1 -1
- package/esm/preview-card/root/PreviewCardRoot.js +32 -22
- package/esm/preview-card/store/PreviewCardHandle.js +1 -1
- package/esm/preview-card/store/PreviewCardStore.d.ts +90 -2
- package/esm/preview-card/store/PreviewCardStore.js +19 -31
- package/esm/preview-card/trigger/PreviewCardTrigger.js +6 -3
- package/esm/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
- package/esm/preview-card/viewport/PreviewCardViewport.js +2 -2
- package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
- package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
- package/esm/progress/indicator/ProgressIndicator.js +6 -11
- package/esm/progress/root/ProgressRoot.d.ts +1 -1
- package/esm/radio/root/RadioRoot.js +7 -3
- package/esm/radio-group/RadioGroup.js +4 -11
- package/esm/radio-group/RadioGroupContext.d.ts +0 -1
- package/esm/scroll-area/content/ScrollAreaContent.js +4 -4
- package/esm/scroll-area/root/ScrollAreaRoot.js +1 -1
- package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
- package/esm/scroll-area/viewport/ScrollAreaViewport.js +6 -10
- package/esm/select/arrow/SelectArrow.js +1 -1
- package/esm/select/backdrop/SelectBackdrop.js +1 -1
- package/esm/select/group/SelectGroup.js +1 -1
- package/esm/select/group-label/SelectGroupLabel.js +2 -2
- package/esm/select/icon/SelectIcon.js +1 -1
- package/esm/select/item/SelectItem.js +46 -32
- package/esm/select/item/SelectItemContext.d.ts +1 -1
- package/esm/select/item-indicator/SelectItemIndicator.js +1 -2
- package/esm/select/item-text/SelectItemText.js +9 -6
- package/esm/select/list/SelectList.js +1 -1
- package/esm/select/popup/SelectPopup.js +8 -3
- package/esm/select/positioner/SelectPositioner.js +3 -0
- package/esm/select/root/SelectRoot.js +46 -40
- package/esm/select/root/SelectRootContext.d.ts +4 -5
- package/esm/select/store.d.ts +3 -0
- package/esm/select/store.js +1 -0
- package/esm/select/trigger/SelectTrigger.d.ts +5 -0
- package/esm/select/trigger/SelectTrigger.js +19 -33
- package/esm/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
- package/esm/select/trigger/SelectTriggerDataAttributes.js +5 -0
- package/esm/slider/control/SliderControl.js +10 -12
- package/esm/slider/root/SliderRoot.js +1 -4
- package/esm/slider/thumb/SliderThumb.js +32 -30
- package/esm/slider/value/SliderValue.js +7 -15
- package/esm/switch/root/SwitchRoot.js +10 -10
- package/esm/switch/thumb/SwitchThumb.js +1 -9
- package/esm/tabs/indicator/TabsIndicator.js +14 -19
- package/esm/tabs/list/TabsList.js +4 -10
- package/esm/tabs/list/TabsListContext.d.ts +2 -1
- package/esm/tabs/panel/TabsPanel.js +1 -1
- package/esm/tabs/root/TabsRoot.d.ts +16 -1
- package/esm/tabs/root/TabsRoot.js +73 -25
- package/esm/tabs/root/TabsRootContext.d.ts +0 -2
- package/esm/toast/provider/ToastProvider.js +1 -1
- package/esm/toast/root/ToastRoot.d.ts +1 -1
- package/esm/toast/root/ToastRoot.js +108 -131
- package/esm/toast/root/ToastRootDataAttributes.d.ts +1 -1
- package/esm/toast/root/ToastRootDataAttributes.js +1 -1
- package/esm/toast/store.d.ts +9 -1
- package/esm/toast/store.js +19 -13
- package/esm/toast/useToastManager.d.ts +1 -1
- package/esm/toast/viewport/ToastViewport.js +1 -1
- package/esm/toggle/Toggle.js +5 -9
- package/esm/toggle-group/ToggleGroup.d.ts +2 -2
- package/esm/toggle-group/ToggleGroup.js +6 -13
- package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
- package/esm/toolbar/link/ToolbarLink.js +1 -2
- package/esm/tooltip/arrow/TooltipArrow.js +3 -3
- package/esm/tooltip/popup/TooltipPopup.js +5 -4
- package/esm/tooltip/root/TooltipRoot.js +35 -26
- package/esm/tooltip/store/TooltipHandle.js +1 -1
- package/esm/tooltip/store/TooltipStore.d.ts +90 -2
- package/esm/tooltip/store/TooltipStore.js +18 -31
- package/esm/tooltip/trigger/TooltipTrigger.js +151 -20
- package/esm/tooltip/viewport/TooltipViewport.d.ts +2 -2
- package/esm/tooltip/viewport/TooltipViewport.js +2 -2
- package/esm/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
- package/esm/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
- package/esm/unstable-use-media-query/index.js +1 -1
- package/esm/utils/popups/index.d.ts +1 -0
- package/esm/utils/popups/index.js +1 -0
- package/esm/utils/popups/inlineRect.d.ts +15 -0
- package/esm/utils/popups/inlineRect.js +191 -0
- package/esm/utils/popups/popupStoreUtils.d.ts +28 -10
- package/esm/utils/popups/popupStoreUtils.js +105 -20
- package/esm/utils/popups/popupTriggerMap.js +2 -0
- package/esm/utils/popups/store.d.ts +15 -2
- package/esm/utils/popups/store.js +38 -2
- package/esm/utils/popups/useTriggerFocusGuards.js +4 -5
- package/esm/utils/useAnchorPositioning.d.ts +5 -0
- package/esm/utils/useAnchorPositioning.js +12 -9
- package/esm/utils/useOpenInteractionType.d.ts +4 -0
- package/esm/utils/useOpenInteractionType.js +23 -18
- package/field/control/FieldControl.js +2 -6
- package/field/item/FieldItem.js +1 -4
- package/field/root/FieldRoot.js +11 -3
- package/field/root/useFieldValidation.d.ts +1 -0
- package/field/root/useFieldValidation.js +23 -20
- package/field/utils/getCombinedFieldValidityData.d.ts +1 -1
- package/field/validity/FieldValidity.d.ts +1 -1
- package/floating-ui-react/components/FloatingDelayGroup.js +3 -3
- package/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
- package/floating-ui-react/components/FloatingFocusManager.js +20 -8
- package/floating-ui-react/components/FloatingPortal.js +3 -3
- package/floating-ui-react/hooks/useClick.js +82 -73
- package/floating-ui-react/hooks/useClientPoint.js +29 -20
- package/floating-ui-react/hooks/useDismiss.d.ts +1 -1
- package/floating-ui-react/hooks/useDismiss.js +82 -92
- package/floating-ui-react/hooks/useFloating.js +36 -32
- package/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
- package/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
- package/floating-ui-react/hooks/useFocus.js +84 -81
- package/floating-ui-react/hooks/useHover.js +74 -78
- package/floating-ui-react/hooks/useHoverFloatingInteraction.js +48 -43
- package/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
- package/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
- package/floating-ui-react/hooks/useHoverReferenceInteraction.js +43 -38
- package/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
- package/floating-ui-react/hooks/useHoverShared.js +11 -0
- package/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
- package/floating-ui-react/hooks/useListNavigation.js +83 -74
- package/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
- package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +26 -20
- package/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
- package/floating-ui-react/hooks/useTypeahead.js +33 -52
- package/floating-ui-react/index.d.ts +0 -2
- package/floating-ui-react/index.js +0 -14
- package/floating-ui-react/types.d.ts +2 -7
- package/floating-ui-react/utils/composite.js +2 -0
- package/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
- package/floating-ui-react/utils/enqueueFocus.js +10 -7
- package/floating-ui-react/utils/getEmptyRootContext.js +1 -1
- package/form/Form.js +2 -2
- package/index.js +1 -1
- package/internals/composite/composite.d.ts +0 -1
- package/internals/composite/composite.js +2 -3
- package/internals/composite/root/useCompositeRoot.js +1 -1
- package/internals/createBaseUIEventDetails.d.ts +2 -0
- package/internals/csp-context/index.d.ts +2 -0
- package/internals/csp-context/index.js +18 -0
- package/internals/field-register-control/index.d.ts +0 -1
- package/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
- package/internals/field-register-control/useFieldControlRegistration.js +11 -14
- package/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
- package/internals/field-register-control/useRegisterFieldControl.js +6 -11
- package/internals/field-root-context/FieldRootContext.d.ts +1 -0
- package/internals/field-root-context/FieldRootContext.js +4 -3
- package/internals/form-context/FormContext.d.ts +5 -1
- package/internals/reason-parts.d.ts +2 -0
- package/internals/reason-parts.js +3 -1
- package/internals/types.d.ts +1 -0
- package/internals/use-button/useButton.js +4 -4
- package/internals/usePressAndHold.js +2 -2
- package/internals/useRenderElement.js +2 -0
- package/menu/arrow/MenuArrow.js +1 -1
- package/menu/backdrop/MenuBackdrop.js +1 -1
- package/menu/checkbox-item/MenuCheckboxItem.js +5 -7
- package/menu/group/MenuGroup.js +1 -4
- package/menu/group/MenuGroupContext.d.ts +1 -3
- package/menu/group/MenuGroupContext.js +1 -1
- package/menu/group-label/MenuGroupLabel.js +4 -6
- package/menu/link-item/MenuLinkItem.js +2 -2
- package/menu/popup/MenuPopup.js +5 -5
- package/menu/radio-group/MenuRadioGroup.js +11 -5
- package/menu/radio-item/MenuRadioItem.js +5 -7
- package/menu/root/MenuRoot.js +60 -65
- package/menu/store/MenuHandle.js +1 -1
- package/menu/store/MenuStore.d.ts +87 -0
- package/menu/submenu-trigger/MenuSubmenuTrigger.js +7 -4
- package/menu/trigger/MenuTrigger.js +12 -9
- package/menu/viewport/MenuViewport.d.ts +2 -2
- package/menu/viewport/MenuViewport.js +2 -2
- package/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
- package/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
- package/navigation-menu/content/NavigationMenuContent.js +8 -5
- package/navigation-menu/icon/NavigationMenuIcon.js +1 -1
- package/navigation-menu/item/NavigationMenuItem.js +2 -2
- package/navigation-menu/list/NavigationMenuList.js +1 -1
- package/navigation-menu/popup/NavigationMenuPopup.js +2 -2
- package/navigation-menu/root/NavigationMenuRoot.js +1 -3
- package/navigation-menu/trigger/NavigationMenuTrigger.js +23 -16
- package/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
- package/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
- package/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
- package/number-field/input/NumberFieldInput.js +3 -5
- package/number-field/root/NumberFieldRoot.js +5 -2
- package/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
- package/otp-field/input/OTPFieldInput.js +42 -28
- package/otp-field/root/OTPFieldRoot.d.ts +17 -8
- package/otp-field/root/OTPFieldRoot.js +32 -32
- package/otp-field/root/OTPFieldRootContext.d.ts +1 -1
- package/otp-field/utils/otp.d.ts +5 -4
- package/otp-field/utils/otp.js +24 -12
- package/package.json +331 -317
- package/popover/arrow/PopoverArrow.js +1 -1
- package/popover/backdrop/PopoverBackdrop.js +1 -1
- package/popover/close/PopoverClose.js +2 -2
- package/popover/description/PopoverDescription.js +1 -7
- package/popover/popup/PopoverPopup.d.ts +1 -1
- package/popover/popup/PopoverPopup.js +16 -10
- package/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
- package/popover/popup/PopoverPopupDataAttributes.js +1 -1
- package/popover/positioner/PopoverPositioner.js +5 -5
- package/popover/root/PopoverRoot.d.ts +1 -1
- package/popover/root/PopoverRoot.js +39 -44
- package/popover/store/PopoverHandle.js +1 -1
- package/popover/store/PopoverStore.d.ts +91 -4
- package/popover/store/PopoverStore.js +16 -19
- package/popover/title/PopoverTitle.js +1 -7
- package/popover/trigger/PopoverTrigger.js +23 -16
- package/popover/viewport/PopoverViewport.d.ts +3 -3
- package/popover/viewport/PopoverViewport.js +2 -2
- package/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
- package/popover/viewport/PopoverViewportDataAttributes.js +1 -1
- package/preview-card/positioner/PreviewCardPositioner.js +11 -1
- package/preview-card/root/PreviewCardRoot.d.ts +1 -1
- package/preview-card/root/PreviewCardRoot.js +30 -20
- package/preview-card/store/PreviewCardHandle.js +1 -1
- package/preview-card/store/PreviewCardStore.d.ts +90 -2
- package/preview-card/store/PreviewCardStore.js +18 -30
- package/preview-card/trigger/PreviewCardTrigger.js +5 -2
- package/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
- package/preview-card/viewport/PreviewCardViewport.js +2 -2
- package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
- package/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
- package/progress/indicator/ProgressIndicator.js +6 -11
- package/progress/root/ProgressRoot.d.ts +1 -1
- package/radio/root/RadioRoot.js +7 -3
- package/radio-group/RadioGroup.js +4 -11
- package/radio-group/RadioGroupContext.d.ts +0 -1
- package/scroll-area/content/ScrollAreaContent.js +4 -4
- package/scroll-area/root/ScrollAreaRoot.js +1 -1
- package/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
- package/scroll-area/viewport/ScrollAreaViewport.js +6 -10
- package/select/arrow/SelectArrow.js +1 -1
- package/select/backdrop/SelectBackdrop.js +1 -1
- package/select/group/SelectGroup.js +1 -1
- package/select/group-label/SelectGroupLabel.js +2 -2
- package/select/icon/SelectIcon.js +1 -1
- package/select/item/SelectItem.js +46 -32
- package/select/item/SelectItemContext.d.ts +1 -1
- package/select/item-indicator/SelectItemIndicator.js +1 -2
- package/select/item-text/SelectItemText.js +9 -6
- package/select/list/SelectList.js +1 -1
- package/select/popup/SelectPopup.js +8 -3
- package/select/positioner/SelectPositioner.js +3 -0
- package/select/root/SelectRoot.js +45 -39
- package/select/root/SelectRootContext.d.ts +4 -5
- package/select/store.d.ts +3 -0
- package/select/store.js +1 -0
- package/select/trigger/SelectTrigger.d.ts +5 -0
- package/select/trigger/SelectTrigger.js +19 -33
- package/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
- package/select/trigger/SelectTriggerDataAttributes.js +5 -0
- package/slider/control/SliderControl.js +9 -11
- package/slider/root/SliderRoot.js +1 -4
- package/slider/thumb/SliderThumb.js +32 -30
- package/slider/value/SliderValue.js +7 -15
- package/switch/root/SwitchRoot.js +10 -10
- package/switch/thumb/SwitchThumb.js +1 -9
- package/tabs/indicator/TabsIndicator.js +14 -19
- package/tabs/list/TabsList.js +4 -10
- package/tabs/list/TabsListContext.d.ts +2 -1
- package/tabs/panel/TabsPanel.js +1 -1
- package/tabs/root/TabsRoot.d.ts +16 -1
- package/tabs/root/TabsRoot.js +71 -24
- package/tabs/root/TabsRootContext.d.ts +0 -2
- package/toast/provider/ToastProvider.js +1 -1
- package/toast/root/ToastRoot.d.ts +1 -1
- package/toast/root/ToastRoot.js +110 -133
- package/toast/root/ToastRootDataAttributes.d.ts +1 -1
- package/toast/root/ToastRootDataAttributes.js +1 -1
- package/toast/store.d.ts +9 -1
- package/toast/store.js +18 -12
- package/toast/useToastManager.d.ts +1 -1
- package/toast/viewport/ToastViewport.js +1 -1
- package/toggle/Toggle.js +5 -9
- package/toggle-group/ToggleGroup.d.ts +2 -2
- package/toggle-group/ToggleGroup.js +6 -13
- package/toolbar/link/ToolbarLink.d.ts +1 -1
- package/toolbar/link/ToolbarLink.js +1 -2
- package/tooltip/arrow/TooltipArrow.js +3 -3
- package/tooltip/popup/TooltipPopup.js +5 -4
- package/tooltip/root/TooltipRoot.js +32 -23
- package/tooltip/store/TooltipHandle.js +1 -1
- package/tooltip/store/TooltipStore.d.ts +90 -2
- package/tooltip/store/TooltipStore.js +17 -30
- package/tooltip/trigger/TooltipTrigger.js +152 -20
- package/tooltip/viewport/TooltipViewport.d.ts +2 -2
- package/tooltip/viewport/TooltipViewport.js +2 -2
- package/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
- package/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
- package/unstable-use-media-query/index.js +1 -1
- package/utils/popups/index.d.ts +1 -0
- package/utils/popups/index.js +11 -0
- package/utils/popups/inlineRect.d.ts +15 -0
- package/utils/popups/inlineRect.js +198 -0
- package/utils/popups/popupStoreUtils.d.ts +28 -10
- package/utils/popups/popupStoreUtils.js +110 -20
- package/utils/popups/popupTriggerMap.js +2 -0
- package/utils/popups/store.d.ts +15 -2
- package/utils/popups/store.js +39 -2
- package/utils/popups/useTriggerFocusGuards.js +4 -5
- package/utils/useAnchorPositioning.d.ts +5 -0
- package/utils/useAnchorPositioning.js +12 -9
- package/utils/useOpenInteractionType.d.ts +4 -0
- package/utils/useOpenInteractionType.js +24 -17
- package/checkbox-group/index.parts.d.ts +0 -1
- package/checkbox-group/index.parts.js +0 -12
- package/esm/checkbox-group/index.parts.d.ts +0 -1
- package/esm/checkbox-group/index.parts.js +0 -1
- package/esm/floating-ui-react/hooks/useInteractions.d.ts +0 -20
- package/esm/floating-ui-react/hooks/useInteractions.js +0 -88
- package/esm/floating-ui-react/hooks/useRole.d.ts +0 -17
- package/esm/floating-ui-react/hooks/useRole.js +0 -113
- package/floating-ui-react/hooks/useInteractions.d.ts +0 -20
- package/floating-ui-react/hooks/useInteractions.js +0 -95
- package/floating-ui-react/hooks/useRole.d.ts +0 -17
- package/floating-ui-react/hooks/useRole.js +0 -120
- /package/{csp-provider → esm/internals/csp-context}/CSPContext.d.ts +0 -0
- /package/esm/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
- /package/{esm/csp-provider → internals/csp-context}/CSPContext.d.ts +0 -0
- /package/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import * as ReactDOM from 'react-dom';
|
|
5
|
-
import { isElement } from '@floating-ui/utils/dom';
|
|
6
5
|
import { addEventListener } from '@base-ui/utils/addEventListener';
|
|
7
6
|
import { mergeCleanups } from '@base-ui/utils/mergeCleanups';
|
|
8
|
-
import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
|
|
9
|
-
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
10
7
|
import { ownerDocument } from '@base-ui/utils/owner';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
8
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
9
|
+
import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
|
|
10
|
+
import { isElement } from '@floating-ui/utils/dom';
|
|
13
11
|
import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js";
|
|
14
12
|
import { REASONS } from "../../internals/reasons.js";
|
|
15
13
|
import { useFloatingTree } from "../components/FloatingTree.js";
|
|
14
|
+
import { contains, getTarget } from "../utils/element.js";
|
|
15
|
+
import { isMouseLikePointerType } from "../utils/event.js";
|
|
16
16
|
import { applySafePolygonPointerEventsMutation, clearSafePolygonPointerEventsMutation, useHoverInteractionSharedState } from "./useHoverInteractionSharedState.js";
|
|
17
|
-
import { getDelay, getRestMs, isClickLikeOpenEvent as isClickLikeOpenEventShared } from "./useHoverShared.js";
|
|
17
|
+
import { getDelay, getRestMs, isClickLikeOpenEvent as isClickLikeOpenEventShared, isInsideEnabledTrigger } from "./useHoverShared.js";
|
|
18
18
|
const EMPTY_REF = {
|
|
19
19
|
current: null
|
|
20
20
|
};
|
|
@@ -24,11 +24,6 @@ const EMPTY_REF = {
|
|
|
24
24
|
* elements.
|
|
25
25
|
*/
|
|
26
26
|
export function useHoverReferenceInteraction(context, props = {}) {
|
|
27
|
-
const store = 'rootStore' in context ? context.rootStore : context;
|
|
28
|
-
const {
|
|
29
|
-
dataRef,
|
|
30
|
-
events
|
|
31
|
-
} = store.context;
|
|
32
27
|
const {
|
|
33
28
|
enabled = true,
|
|
34
29
|
delay = 0,
|
|
@@ -40,8 +35,14 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
40
35
|
externalTree,
|
|
41
36
|
isActiveTrigger = true,
|
|
42
37
|
getHandleCloseContext,
|
|
43
|
-
isClosing
|
|
38
|
+
isClosing,
|
|
39
|
+
shouldOpen: shouldOpenProp
|
|
44
40
|
} = props;
|
|
41
|
+
const store = 'rootStore' in context ? context.rootStore : context;
|
|
42
|
+
const {
|
|
43
|
+
dataRef,
|
|
44
|
+
events
|
|
45
|
+
} = store.context;
|
|
45
46
|
const tree = useFloatingTree(externalTree);
|
|
46
47
|
const instance = useHoverInteractionSharedState(store);
|
|
47
48
|
const isHoverCloseActiveRef = React.useRef(false);
|
|
@@ -49,16 +50,13 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
49
50
|
const delayRef = useValueAsRef(delay);
|
|
50
51
|
const restMsRef = useValueAsRef(restMs);
|
|
51
52
|
const enabledRef = useValueAsRef(enabled);
|
|
53
|
+
const shouldOpenRef = useValueAsRef(shouldOpenProp);
|
|
52
54
|
const isClosingRef = useValueAsRef(isClosing);
|
|
53
|
-
if (isActiveTrigger) {
|
|
54
|
-
// eslint-disable-next-line no-underscore-dangle
|
|
55
|
-
instance.handleCloseOptions = handleCloseRef.current?.__options;
|
|
56
|
-
}
|
|
57
55
|
const isClickLikeOpenEvent = useStableCallback(() => {
|
|
58
56
|
return isClickLikeOpenEventShared(dataRef.current.openEvent?.type, instance.interactedInside);
|
|
59
57
|
});
|
|
60
|
-
const
|
|
61
|
-
return
|
|
58
|
+
const checkShouldOpen = useStableCallback(() => {
|
|
59
|
+
return shouldOpenRef.current?.() !== false;
|
|
62
60
|
});
|
|
63
61
|
const isOverInactiveTrigger = useStableCallback((currentDomReference, currentTarget, target) => {
|
|
64
62
|
const allTriggers = store.context.triggerElements;
|
|
@@ -75,19 +73,6 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
75
73
|
const targetElement = target;
|
|
76
74
|
return allTriggers.hasMatchingElement(trigger => contains(trigger, targetElement)) && (!currentDomReference || !contains(currentDomReference, targetElement));
|
|
77
75
|
});
|
|
78
|
-
const closeWithDelay = useStableCallback((event, runElseBranch = true) => {
|
|
79
|
-
const closeDelay = getDelay(delayRef.current, 'close', instance.pointerType);
|
|
80
|
-
if (closeDelay) {
|
|
81
|
-
instance.openChangeTimeout.start(closeDelay, () => {
|
|
82
|
-
store.setOpen(false, createChangeEventDetails(REASONS.triggerHover, event));
|
|
83
|
-
tree?.events.emit('floating.closed', event);
|
|
84
|
-
});
|
|
85
|
-
} else if (runElseBranch) {
|
|
86
|
-
instance.openChangeTimeout.clear();
|
|
87
|
-
store.setOpen(false, createChangeEventDetails(REASONS.triggerHover, event));
|
|
88
|
-
tree?.events.emit('floating.closed', event);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
76
|
const cleanupMouseMoveHandler = useStableCallback(() => {
|
|
92
77
|
if (!instance.handler) {
|
|
93
78
|
return;
|
|
@@ -99,6 +84,10 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
99
84
|
const clearPointerEvents = useStableCallback(() => {
|
|
100
85
|
clearSafePolygonPointerEventsMutation(instance);
|
|
101
86
|
});
|
|
87
|
+
if (isActiveTrigger) {
|
|
88
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
89
|
+
instance.handleCloseOptions = handleCloseRef.current?.__options;
|
|
90
|
+
}
|
|
102
91
|
React.useEffect(() => cleanupMouseMoveHandler, [cleanupMouseMoveHandler]);
|
|
103
92
|
|
|
104
93
|
// When closing before opening, clear the delay timeouts to cancel it
|
|
@@ -128,6 +117,19 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
128
117
|
if (!enabled) {
|
|
129
118
|
return undefined;
|
|
130
119
|
}
|
|
120
|
+
function closeWithDelay(event, runElseBranch = true) {
|
|
121
|
+
const closeDelay = getDelay(delayRef.current, 'close', instance.pointerType);
|
|
122
|
+
if (closeDelay) {
|
|
123
|
+
instance.openChangeTimeout.start(closeDelay, () => {
|
|
124
|
+
store.setOpen(false, createChangeEventDetails(REASONS.triggerHover, event));
|
|
125
|
+
tree?.events.emit('floating.closed', event);
|
|
126
|
+
});
|
|
127
|
+
} else if (runElseBranch) {
|
|
128
|
+
instance.openChangeTimeout.clear();
|
|
129
|
+
store.setOpen(false, createChangeEventDetails(REASONS.triggerHover, event));
|
|
130
|
+
tree?.events.emit('floating.closed', event);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
131
133
|
const trigger = triggerElementRef.current ?? (isActiveTrigger ? store.select('domReferenceElement') : null);
|
|
132
134
|
if (!isElement(trigger)) {
|
|
133
135
|
return undefined;
|
|
@@ -175,7 +177,9 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
175
177
|
// Open immediately when moving between triggers while open, or during
|
|
176
178
|
// a hover-driven close transition (including same-trigger re-entry).
|
|
177
179
|
if (shouldOpenImmediately) {
|
|
178
|
-
|
|
180
|
+
if (checkShouldOpen()) {
|
|
181
|
+
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
|
|
182
|
+
}
|
|
179
183
|
return;
|
|
180
184
|
}
|
|
181
185
|
if (isRestOnlyDelay) {
|
|
@@ -183,12 +187,14 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
183
187
|
}
|
|
184
188
|
if (openDelay) {
|
|
185
189
|
instance.openChangeTimeout.start(openDelay, () => {
|
|
186
|
-
if (shouldOpen) {
|
|
190
|
+
if (shouldOpen && checkShouldOpen()) {
|
|
187
191
|
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
|
|
188
192
|
}
|
|
189
193
|
});
|
|
190
194
|
} else if (shouldOpen) {
|
|
191
|
-
|
|
195
|
+
if (checkShouldOpen()) {
|
|
196
|
+
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
|
|
197
|
+
}
|
|
192
198
|
}
|
|
193
199
|
}
|
|
194
200
|
function onMouseLeave(event) {
|
|
@@ -202,8 +208,7 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
202
208
|
instance.restTimeout.clear();
|
|
203
209
|
instance.restTimeoutPending = false;
|
|
204
210
|
const handleCloseContextBase = dataRef.current.floatingContext ?? getHandleCloseContext?.();
|
|
205
|
-
|
|
206
|
-
if (ignoreRelatedTargetTrigger) {
|
|
211
|
+
if (isInsideEnabledTrigger(event.relatedTarget, store.context.triggerElements)) {
|
|
207
212
|
return;
|
|
208
213
|
}
|
|
209
214
|
if (handleCloseRef.current && handleCloseContextBase) {
|
|
@@ -239,7 +244,7 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
239
244
|
}), addEventListener(trigger, 'mouseenter', onMouseEnter), addEventListener(trigger, 'mouseleave', onMouseLeave));
|
|
240
245
|
}
|
|
241
246
|
return mergeCleanups(addEventListener(trigger, 'mouseenter', onMouseEnter), addEventListener(trigger, 'mouseleave', onMouseLeave));
|
|
242
|
-
}, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef,
|
|
247
|
+
}, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, store, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef, checkShouldOpen]);
|
|
243
248
|
return React.useMemo(() => {
|
|
244
249
|
if (!enabled) {
|
|
245
250
|
return undefined;
|
|
@@ -289,7 +294,7 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
289
294
|
return;
|
|
290
295
|
}
|
|
291
296
|
const latestOpen = store.select('open');
|
|
292
|
-
if (!instance.blockMouseMove && (!latestOpen || isOverInactive)) {
|
|
297
|
+
if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) {
|
|
293
298
|
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, nativeEvent, trigger));
|
|
294
299
|
}
|
|
295
300
|
}
|
|
@@ -305,5 +310,5 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
312
|
};
|
|
308
|
-
}, [enabled, instance, isClickLikeOpenEvent, isOverInactiveTrigger, mouseOnly, store, restMsRef]);
|
|
313
|
+
}, [enabled, instance, isClickLikeOpenEvent, isOverInactiveTrigger, mouseOnly, store, restMsRef, checkShouldOpen]);
|
|
309
314
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtendedElements, FloatingTreeType, Placement } from "../types.js";
|
|
2
|
+
export { isTargetInsideEnabledTrigger as isInsideEnabledTrigger } from "../utils/element.js";
|
|
2
3
|
export interface HandleCloseOptions {
|
|
3
4
|
blockPointerEvents?: boolean | undefined;
|
|
4
5
|
getScope?: (() => HTMLElement | SVGSVGElement | null) | undefined;
|
|
@@ -25,4 +26,4 @@ type HoverDelay = number | Partial<{
|
|
|
25
26
|
export declare function getDelay(value: HoverDelay | (() => HoverDelay) | undefined, prop: 'open' | 'close', pointerType?: PointerEvent['pointerType']): number | undefined;
|
|
26
27
|
export declare function getRestMs(value: number | (() => number)): number;
|
|
27
28
|
export declare function isClickLikeOpenEvent(openEventType: string | undefined, interactedInside: boolean): boolean;
|
|
28
|
-
export
|
|
29
|
+
export declare function isHoverOpenEvent(openEventType: string | undefined): boolean | undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isMouseLikePointerType } from "../utils/event.js";
|
|
2
|
+
export { isTargetInsideEnabledTrigger as isInsideEnabledTrigger } from "../utils/element.js";
|
|
2
3
|
function resolveValue(value, pointerType) {
|
|
3
4
|
if (pointerType != null && !isMouseLikePointerType(pointerType)) {
|
|
4
5
|
return 0;
|
|
@@ -23,4 +24,7 @@ export function getRestMs(value) {
|
|
|
23
24
|
}
|
|
24
25
|
export function isClickLikeOpenEvent(openEventType, interactedInside) {
|
|
25
26
|
return interactedInside || openEventType === 'click' || openEventType === 'mousedown';
|
|
27
|
+
}
|
|
28
|
+
export function isHoverOpenEvent(openEventType) {
|
|
29
|
+
return openEventType?.includes('mouse') && openEventType !== 'mousedown';
|
|
26
30
|
}
|
|
@@ -99,8 +99,6 @@ export interface UseListNavigationProps {
|
|
|
99
99
|
* (such as an input), but allow arrow keys to navigate list items.
|
|
100
100
|
* This is common in autocomplete listbox components.
|
|
101
101
|
* Your virtually-focused list items must have a unique `id` set on them.
|
|
102
|
-
* If you're using a component role with the `useRole()` Hook, then an `id` is
|
|
103
|
-
* generated automatically.
|
|
104
102
|
* @default false
|
|
105
103
|
*/
|
|
106
104
|
virtual?: boolean | undefined;
|
|
@@ -128,7 +126,7 @@ export interface UseListNavigationProps {
|
|
|
128
126
|
*/
|
|
129
127
|
resetOnPointerLeave?: boolean | undefined;
|
|
130
128
|
/**
|
|
131
|
-
* External
|
|
129
|
+
* External FloatingTree to use when the one provided by context can't be used.
|
|
132
130
|
*/
|
|
133
131
|
externalTree?: FloatingTreeStore | undefined;
|
|
134
132
|
}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
|
|
6
|
-
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
4
|
+
import { useAnimationFrame } from '@base-ui/utils/useAnimationFrame';
|
|
7
5
|
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
|
|
8
6
|
import { ownerDocument } from '@base-ui/utils/owner';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { useFloatingParentNodeId, useFloatingTree } from "../components/FloatingTree.js";
|
|
7
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
8
|
+
import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
|
|
9
|
+
import { isHTMLElement } from '@floating-ui/utils/dom';
|
|
13
10
|
import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js";
|
|
14
11
|
import { REASONS } from "../../internals/reasons.js";
|
|
12
|
+
import { useFloatingParentNodeId, useFloatingTree } from "../components/FloatingTree.js";
|
|
13
|
+
import { createGridCellMap, findNonDisabledListIndex, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, isIndexOutOfListBounds, isListIndexDisabled } from "../utils/composite.js";
|
|
14
|
+
import { ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP } from "../utils/constants.js";
|
|
15
|
+
import { activeElement, contains, getFloatingFocusElement, getTarget, isTypeableCombobox } from "../utils/element.js";
|
|
15
16
|
import { enqueueFocus } from "../utils/enqueueFocus.js";
|
|
16
|
-
import {
|
|
17
|
+
import { isVirtualClick, isVirtualPointerEvent, stopEvent } from "../utils/event.js";
|
|
17
18
|
export const ESCAPE = 'Escape';
|
|
18
19
|
function doSwitch(orientation, vertical, horizontal) {
|
|
19
20
|
switch (orientation) {
|
|
@@ -54,11 +55,6 @@ function isCrossOrientationCloseKey(key, orientation, rtl, cols) {
|
|
|
54
55
|
* @see https://floating-ui.com/docs/useListNavigation
|
|
55
56
|
*/
|
|
56
57
|
export function useListNavigation(context, props) {
|
|
57
|
-
const store = 'rootStore' in context ? context.rootStore : context;
|
|
58
|
-
const open = store.useState('open');
|
|
59
|
-
const floatingElement = store.useState('floatingElement');
|
|
60
|
-
const domReferenceElement = store.useState('domReferenceElement');
|
|
61
|
-
const dataRef = store.context.dataRef;
|
|
62
58
|
const {
|
|
63
59
|
listRef,
|
|
64
60
|
activeIndex,
|
|
@@ -94,14 +90,16 @@ export function useListNavigation(context, props) {
|
|
|
94
90
|
console.warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either "horizontal" or "both".');
|
|
95
91
|
}
|
|
96
92
|
}
|
|
93
|
+
const store = 'rootStore' in context ? context.rootStore : context;
|
|
94
|
+
const open = store.useState('open');
|
|
95
|
+
const floatingElement = store.useState('floatingElement');
|
|
96
|
+
const domReferenceElement = store.useState('domReferenceElement');
|
|
97
|
+
const dataRef = store.context.dataRef;
|
|
97
98
|
const floatingFocusElement = getFloatingFocusElement(floatingElement);
|
|
99
|
+
const typeableComboboxReference = isTypeableCombobox(domReferenceElement);
|
|
98
100
|
const floatingFocusElementRef = useValueAsRef(floatingFocusElement);
|
|
99
101
|
const parentId = useFloatingParentNodeId();
|
|
100
102
|
const tree = useFloatingTree(externalTree);
|
|
101
|
-
useIsoLayoutEffect(() => {
|
|
102
|
-
dataRef.current.orientation = orientation;
|
|
103
|
-
}, [dataRef, orientation]);
|
|
104
|
-
const typeableComboboxReference = isTypeableCombobox(domReferenceElement);
|
|
105
103
|
const focusItemOnOpenRef = React.useRef(focusItemOnOpen);
|
|
106
104
|
const indexRef = React.useRef(selectedIndex ?? -1);
|
|
107
105
|
const keyRef = React.useRef(null);
|
|
@@ -119,6 +117,8 @@ export function useListNavigation(context, props) {
|
|
|
119
117
|
const latestOpenRef = useValueAsRef(open);
|
|
120
118
|
const selectedIndexRef = useValueAsRef(selectedIndex);
|
|
121
119
|
const resetOnPointerLeaveRef = useValueAsRef(resetOnPointerLeave);
|
|
120
|
+
const focusFrame = useAnimationFrame();
|
|
121
|
+
const waitForListPopulatedFrame = useAnimationFrame();
|
|
122
122
|
const focusItem = useStableCallback(() => {
|
|
123
123
|
function runFocus(item) {
|
|
124
124
|
if (virtual) {
|
|
@@ -135,7 +135,7 @@ export function useListNavigation(context, props) {
|
|
|
135
135
|
if (initialItem) {
|
|
136
136
|
runFocus(initialItem);
|
|
137
137
|
}
|
|
138
|
-
const scheduler = forceSyncFocusRef.current ?
|
|
138
|
+
const scheduler = forceSyncFocusRef.current ? callback => callback() : callback => focusFrame.request(callback);
|
|
139
139
|
scheduler(() => {
|
|
140
140
|
const waitedItem = listRef.current[indexRef.current] || initialItem;
|
|
141
141
|
if (!waitedItem) {
|
|
@@ -157,6 +157,9 @@ export function useListNavigation(context, props) {
|
|
|
157
157
|
}
|
|
158
158
|
});
|
|
159
159
|
});
|
|
160
|
+
useIsoLayoutEffect(() => {
|
|
161
|
+
dataRef.current.orientation = orientation;
|
|
162
|
+
}, [dataRef, orientation]);
|
|
160
163
|
|
|
161
164
|
// Sync `selectedIndex` to be the `activeIndex` upon opening the floating
|
|
162
165
|
// element. Also, reset `activeIndex` upon closing the floating element.
|
|
@@ -215,7 +218,7 @@ export function useListNavigation(context, props) {
|
|
|
215
218
|
// otherwise use rAF. Don't try more than twice, since something
|
|
216
219
|
// is wrong otherwise.
|
|
217
220
|
if (runs < 2) {
|
|
218
|
-
const scheduler = runs ?
|
|
221
|
+
const scheduler = runs ? callback => waitForListPopulatedFrame.request(callback) : queueMicrotask;
|
|
219
222
|
scheduler(waitForListPopulated);
|
|
220
223
|
}
|
|
221
224
|
runs += 1;
|
|
@@ -233,7 +236,7 @@ export function useListNavigation(context, props) {
|
|
|
233
236
|
focusItem();
|
|
234
237
|
forceScrollIntoViewRef.current = false;
|
|
235
238
|
}
|
|
236
|
-
}, [enabled, open, floatingElement, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem,
|
|
239
|
+
}, [enabled, open, floatingElement, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, waitForListPopulatedFrame]);
|
|
237
240
|
|
|
238
241
|
// Ensure the parent floating element has focus when a nested child closes
|
|
239
242
|
// to allow arrow key navigation to work after the pointer leaves the child.
|
|
@@ -273,57 +276,12 @@ export function useListNavigation(context, props) {
|
|
|
273
276
|
onNavigate(event);
|
|
274
277
|
}
|
|
275
278
|
});
|
|
276
|
-
const
|
|
277
|
-
const itemProps = {
|
|
278
|
-
onFocus(event) {
|
|
279
|
-
forceSyncFocusRef.current = true;
|
|
280
|
-
syncCurrentTarget(event);
|
|
281
|
-
},
|
|
282
|
-
onClick: ({
|
|
283
|
-
currentTarget
|
|
284
|
-
}) => currentTarget.focus({
|
|
285
|
-
preventScroll: true
|
|
286
|
-
}),
|
|
287
|
-
// Safari
|
|
288
|
-
onMouseMove(event) {
|
|
289
|
-
forceSyncFocusRef.current = true;
|
|
290
|
-
forceScrollIntoViewRef.current = false;
|
|
291
|
-
if (focusItemOnHover) {
|
|
292
|
-
syncCurrentTarget(event);
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
onPointerLeave(event) {
|
|
296
|
-
if (!latestOpenRef.current || !isPointerModalityRef.current || event.pointerType === 'touch') {
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
forceSyncFocusRef.current = true;
|
|
300
|
-
const relatedTarget = event.relatedTarget;
|
|
301
|
-
if (!focusItemOnHover || listRef.current.includes(relatedTarget)) {
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
if (!resetOnPointerLeaveRef.current) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
cancelQueuedFocusRef.current?.();
|
|
308
|
-
cancelQueuedFocusRef.current = null;
|
|
309
|
-
indexRef.current = -1;
|
|
310
|
-
onNavigate(event);
|
|
311
|
-
if (!virtual) {
|
|
312
|
-
const floatingFocusEl = floatingFocusElementRef.current;
|
|
313
|
-
const activeEl = activeElement(ownerDocument(floatingFocusEl));
|
|
314
|
-
if (floatingFocusEl && contains(floatingFocusEl, activeEl)) {
|
|
315
|
-
floatingFocusEl.focus({
|
|
316
|
-
preventScroll: true
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
return itemProps;
|
|
323
|
-
}, [syncCurrentTarget, latestOpenRef, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, resetOnPointerLeaveRef, virtual]);
|
|
324
|
-
const getParentOrientation = React.useCallback(() => {
|
|
279
|
+
const getParentOrientation = useStableCallback(() => {
|
|
325
280
|
return parentOrientation ?? tree?.nodesRef.current.find(node => node.id === parentId)?.context?.dataRef?.current.orientation;
|
|
326
|
-
}
|
|
281
|
+
});
|
|
282
|
+
const getMinEnabledIndex = useStableCallback(() => {
|
|
283
|
+
return getMinListIndex(listRef, disabledIndicesRef.current);
|
|
284
|
+
});
|
|
327
285
|
const commonOnKeyDown = useStableCallback(event => {
|
|
328
286
|
isPointerModalityRef.current = false;
|
|
329
287
|
forceSyncFocusRef.current = true;
|
|
@@ -475,6 +433,54 @@ export function useListNavigation(context, props) {
|
|
|
475
433
|
onNavigate(event);
|
|
476
434
|
}
|
|
477
435
|
});
|
|
436
|
+
const item = React.useMemo(() => {
|
|
437
|
+
const itemProps = {
|
|
438
|
+
onFocus(event) {
|
|
439
|
+
forceSyncFocusRef.current = true;
|
|
440
|
+
syncCurrentTarget(event);
|
|
441
|
+
},
|
|
442
|
+
onClick: ({
|
|
443
|
+
currentTarget
|
|
444
|
+
}) => currentTarget.focus({
|
|
445
|
+
preventScroll: true
|
|
446
|
+
}),
|
|
447
|
+
// Safari
|
|
448
|
+
onMouseMove(event) {
|
|
449
|
+
forceSyncFocusRef.current = true;
|
|
450
|
+
forceScrollIntoViewRef.current = false;
|
|
451
|
+
if (focusItemOnHover) {
|
|
452
|
+
syncCurrentTarget(event);
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
onPointerLeave(event) {
|
|
456
|
+
if (!latestOpenRef.current || !isPointerModalityRef.current || event.pointerType === 'touch') {
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
forceSyncFocusRef.current = true;
|
|
460
|
+
const relatedTarget = event.relatedTarget;
|
|
461
|
+
if (!focusItemOnHover || listRef.current.includes(relatedTarget)) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (!resetOnPointerLeaveRef.current) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
cancelQueuedFocusRef.current?.();
|
|
468
|
+
cancelQueuedFocusRef.current = null;
|
|
469
|
+
indexRef.current = -1;
|
|
470
|
+
onNavigate(event);
|
|
471
|
+
if (!virtual) {
|
|
472
|
+
const floatingFocusEl = floatingFocusElementRef.current;
|
|
473
|
+
const activeEl = activeElement(ownerDocument(floatingFocusEl));
|
|
474
|
+
if (floatingFocusEl && contains(floatingFocusEl, activeEl)) {
|
|
475
|
+
floatingFocusEl.focus({
|
|
476
|
+
preventScroll: true
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
return itemProps;
|
|
483
|
+
}, [syncCurrentTarget, latestOpenRef, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, resetOnPointerLeaveRef, virtual]);
|
|
478
484
|
const ariaActiveDescendantProp = React.useMemo(() => {
|
|
479
485
|
return virtual && open && hasActiveIndex && {
|
|
480
486
|
'aria-activedescendant': `${id}-${activeIndex}`
|
|
@@ -509,6 +515,9 @@ export function useListNavigation(context, props) {
|
|
|
509
515
|
};
|
|
510
516
|
}, [ariaActiveDescendantProp, commonOnKeyDown, floatingFocusElementRef, orientation, typeableComboboxReference, store, open, virtual, domReferenceElement]);
|
|
511
517
|
const trigger = React.useMemo(() => {
|
|
518
|
+
function openOnNavigationKeyDown(event) {
|
|
519
|
+
store.setOpen(true, createChangeEventDetails(REASONS.listNavigation, event.nativeEvent, event.currentTarget));
|
|
520
|
+
}
|
|
512
521
|
function checkVirtualMouse(event) {
|
|
513
522
|
if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {
|
|
514
523
|
focusItemOnOpenRef.current = !virtual;
|
|
@@ -547,10 +556,10 @@ export function useListNavigation(context, props) {
|
|
|
547
556
|
if (isParentCrossOpenKey) {
|
|
548
557
|
stopEvent(event);
|
|
549
558
|
if (currentOpen) {
|
|
550
|
-
indexRef.current =
|
|
559
|
+
indexRef.current = getMinEnabledIndex();
|
|
551
560
|
onNavigate(event);
|
|
552
561
|
} else {
|
|
553
|
-
|
|
562
|
+
openOnNavigationKeyDown(event);
|
|
554
563
|
}
|
|
555
564
|
}
|
|
556
565
|
return undefined;
|
|
@@ -561,7 +570,7 @@ export function useListNavigation(context, props) {
|
|
|
561
570
|
}
|
|
562
571
|
stopEvent(event);
|
|
563
572
|
if (!currentOpen && openOnArrowKeyDown) {
|
|
564
|
-
|
|
573
|
+
openOnNavigationKeyDown(event);
|
|
565
574
|
} else {
|
|
566
575
|
commonOnKeyDown(event);
|
|
567
576
|
}
|
|
@@ -582,7 +591,7 @@ export function useListNavigation(context, props) {
|
|
|
582
591
|
onMouseDown: checkVirtualMouse,
|
|
583
592
|
onClick: checkVirtualMouse
|
|
584
593
|
};
|
|
585
|
-
}, [commonOnKeyDown,
|
|
594
|
+
}, [commonOnKeyDown, focusItemOnOpen, getMinEnabledIndex, nested, onNavigate, store, openOnArrowKeyDown, orientation, getParentOrientation, rtl, selectedIndexRef, virtual]);
|
|
586
595
|
const reference = React.useMemo(() => {
|
|
587
596
|
return {
|
|
588
597
|
...ariaActiveDescendantProp,
|
|
@@ -2,16 +2,19 @@ import { ReactStore } from '@base-ui/utils/store';
|
|
|
2
2
|
import { BaseUIChangeEventDetails } from "../../types/index.js";
|
|
3
3
|
import { PopupStoreContext, PopupStoreSelectors, PopupStoreState } from "../../utils/popups/index.js";
|
|
4
4
|
import { FloatingRootStore } from "../components/FloatingRootStore.js";
|
|
5
|
-
export interface UseSyncedFloatingRootContextOptions<State extends PopupStoreState<
|
|
6
|
-
popupStore: ReactStore<State, PopupStoreContext<
|
|
5
|
+
export interface UseSyncedFloatingRootContextOptions<State extends PopupStoreState<unknown>, ContextEventDetails extends BaseUIChangeEventDetails<string>, OpenChangeEventDetails extends BaseUIChangeEventDetails<string>> {
|
|
6
|
+
popupStore: ReactStore<State, PopupStoreContext<ContextEventDetails>, PopupStoreSelectors>;
|
|
7
7
|
/**
|
|
8
8
|
* Whether the Popup element is passed to Floating UI as the floating element instead of the default Positioner.
|
|
9
9
|
*/
|
|
10
10
|
treatPopupAsFloatingElement?: boolean | undefined;
|
|
11
|
-
|
|
11
|
+
floatingRootContext?: FloatingRootStore | undefined;
|
|
12
|
+
floatingId: string | undefined;
|
|
13
|
+
nested: boolean;
|
|
14
|
+
onOpenChange(open: boolean, eventDetails: OpenChangeEventDetails): void;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
17
|
+
* Keeps a FloatingRootStore in sync with the provided PopupStore.
|
|
18
|
+
* Uses the provided FloatingRootStore when one exists, otherwise creates one once and updates it on every render.
|
|
16
19
|
*/
|
|
17
|
-
export declare function useSyncedFloatingRootContext<State extends PopupStoreState<
|
|
20
|
+
export declare function useSyncedFloatingRootContext<State extends PopupStoreState<unknown>, ContextEventDetails extends BaseUIChangeEventDetails<string>, OpenChangeEventDetails extends BaseUIChangeEventDetails<string>>(options: UseSyncedFloatingRootContextOptions<State, ContextEventDetails, OpenChangeEventDetails>): FloatingRootStore;
|
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import { useRefWithInit } from '@base-ui/utils/useRefWithInit';
|
|
3
|
+
import * as React from 'react';
|
|
5
4
|
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
|
|
6
5
|
import { isElement } from '@floating-ui/utils/dom';
|
|
7
|
-
import { useFloatingParentNodeId } from "../components/FloatingTree.js";
|
|
8
6
|
import { FloatingRootStore } from "../components/FloatingRootStore.js";
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Keeps a FloatingRootStore in sync with the provided PopupStore.
|
|
9
|
+
* Uses the provided FloatingRootStore when one exists, otherwise creates one once and updates it on every render.
|
|
12
10
|
*/
|
|
13
11
|
export function useSyncedFloatingRootContext(options) {
|
|
14
12
|
const {
|
|
15
13
|
popupStore,
|
|
16
14
|
treatPopupAsFloatingElement = false,
|
|
15
|
+
floatingRootContext: floatingRootContextProp,
|
|
16
|
+
floatingId,
|
|
17
|
+
nested,
|
|
17
18
|
onOpenChange
|
|
18
19
|
} = options;
|
|
19
|
-
const floatingId = useId();
|
|
20
|
-
const nested = useFloatingParentNodeId() != null;
|
|
21
20
|
const open = popupStore.useState('open');
|
|
22
21
|
const referenceElement = popupStore.useState('activeTriggerElement');
|
|
23
22
|
const floatingElement = popupStore.useState(treatPopupAsFloatingElement ? 'popupElement' : 'positionerElement');
|
|
24
23
|
const triggerElements = popupStore.context.triggerElements;
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
const handleOpenChange = onOpenChange;
|
|
25
|
+
const internalStoreRef = React.useRef(null);
|
|
26
|
+
if (floatingRootContextProp === undefined && internalStoreRef.current === null) {
|
|
27
|
+
internalStoreRef.current = new FloatingRootStore({
|
|
28
|
+
open,
|
|
29
|
+
transitionStatus: undefined,
|
|
30
|
+
referenceElement,
|
|
31
|
+
floatingElement,
|
|
32
|
+
triggerElements,
|
|
33
|
+
onOpenChange: handleOpenChange,
|
|
34
|
+
floatingId,
|
|
35
|
+
syncOnly: true,
|
|
36
|
+
nested
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const store = floatingRootContextProp ?? internalStoreRef.current;
|
|
40
|
+
popupStore.useSyncedValue('floatingId', floatingId);
|
|
36
41
|
useIsoLayoutEffect(() => {
|
|
37
42
|
const valuesToSync = {
|
|
38
43
|
open,
|
|
@@ -49,8 +54,8 @@ export function useSyncedFloatingRootContext(options) {
|
|
|
49
54
|
store.update(valuesToSync);
|
|
50
55
|
}, [open, floatingId, referenceElement, floatingElement, store]);
|
|
51
56
|
|
|
52
|
-
//
|
|
53
|
-
store.context.onOpenChange =
|
|
57
|
+
// Keep non-reactive context values fresh for interactions that call `store.setOpen`.
|
|
58
|
+
store.context.onOpenChange = handleOpenChange;
|
|
54
59
|
store.context.nested = nested;
|
|
55
60
|
return store;
|
|
56
61
|
}
|
|
@@ -24,9 +24,9 @@ export interface UseTypeaheadProps {
|
|
|
24
24
|
*/
|
|
25
25
|
elementsRef?: React.RefObject<Array<HTMLElement | null>> | undefined;
|
|
26
26
|
/**
|
|
27
|
-
* Callback invoked with the typing
|
|
27
|
+
* Callback invoked with the current typing activity as the user types.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
onTyping?: ((isTyping: boolean) => void) | undefined;
|
|
30
30
|
/**
|
|
31
31
|
* Whether the Hook is enabled, including all internal Effects and event
|
|
32
32
|
* handlers.
|