@base-ui/react 1.0.0 → 1.1.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 +144 -1
- package/README.md +2 -3
- package/accordion/header/AccordionHeader.d.ts +1 -1
- package/accordion/item/AccordionItem.d.ts +1 -1
- package/accordion/panel/AccordionPanel.d.ts +1 -1
- package/accordion/root/AccordionRoot.d.ts +1 -1
- package/accordion/trigger/AccordionTrigger.d.ts +1 -1
- package/accordion/trigger/AccordionTrigger.js +3 -4
- package/alert-dialog/root/AlertDialogRoot.d.ts +3 -3
- package/autocomplete/root/AutocompleteRoot.d.ts +1 -1
- package/avatar/fallback/AvatarFallback.d.ts +1 -1
- package/avatar/image/AvatarImage.d.ts +1 -1
- package/avatar/root/AvatarRoot.d.ts +1 -1
- package/button/Button.d.ts +4 -17
- package/button/Button.js +1 -2
- package/checkbox/indicator/CheckboxIndicator.d.ts +1 -1
- package/checkbox/indicator/CheckboxIndicatorDataAttributes.d.ts +4 -0
- package/checkbox/indicator/CheckboxIndicatorDataAttributes.js +4 -0
- package/checkbox/root/CheckboxRoot.d.ts +1 -1
- package/checkbox/root/CheckboxRoot.js +5 -4
- package/checkbox/root/CheckboxRootDataAttributes.d.ts +4 -0
- package/checkbox/root/CheckboxRootDataAttributes.js +4 -0
- package/checkbox-group/CheckboxGroup.d.ts +1 -1
- package/collapsible/panel/CollapsiblePanel.d.ts +1 -1
- package/collapsible/root/CollapsibleRoot.d.ts +1 -1
- package/collapsible/trigger/CollapsibleTrigger.d.ts +1 -1
- package/collapsible/trigger/CollapsibleTrigger.js +1 -2
- package/combobox/arrow/ComboboxArrow.d.ts +1 -1
- package/combobox/backdrop/ComboboxBackdrop.d.ts +1 -1
- package/combobox/chip/ComboboxChip.d.ts +1 -1
- package/combobox/chip-remove/ComboboxChipRemove.d.ts +1 -1
- package/combobox/chip-remove/ComboboxChipRemove.js +3 -2
- package/combobox/chips/ComboboxChips.d.ts +1 -1
- package/combobox/chips/ComboboxChips.js +7 -1
- package/combobox/clear/ComboboxClear.d.ts +1 -1
- package/combobox/clear/ComboboxClear.js +2 -2
- package/combobox/empty/ComboboxEmpty.d.ts +1 -1
- package/combobox/group/ComboboxGroup.d.ts +1 -1
- package/combobox/group-label/ComboboxGroupLabel.d.ts +1 -1
- package/combobox/icon/ComboboxIcon.d.ts +1 -1
- package/combobox/input/ComboboxInput.d.ts +1 -1
- package/combobox/input/ComboboxInput.js +12 -18
- package/combobox/item/ComboboxItem.d.ts +1 -1
- package/combobox/item/ComboboxItem.js +0 -1
- package/combobox/item-indicator/ComboboxItemIndicator.d.ts +1 -1
- package/combobox/list/ComboboxList.d.ts +1 -1
- package/combobox/popup/ComboboxPopup.d.ts +1 -1
- package/combobox/popup/ComboboxPopup.js +2 -1
- package/combobox/portal/ComboboxPortal.d.ts +1 -1
- package/combobox/positioner/ComboboxPositioner.d.ts +1 -1
- package/combobox/root/AriaCombobox.d.ts +8 -1
- package/combobox/root/AriaCombobox.js +19 -16
- package/combobox/root/ComboboxRoot.d.ts +1 -1
- package/combobox/row/ComboboxRow.d.ts +1 -1
- package/combobox/status/ComboboxStatus.d.ts +1 -1
- package/combobox/store.d.ts +3 -0
- package/combobox/store.js +21 -0
- package/combobox/trigger/ComboboxTrigger.d.ts +14 -1
- package/combobox/trigger/ComboboxTrigger.js +31 -11
- package/combobox/trigger/ComboboxTriggerDataAttributes.d.ts +13 -0
- package/combobox/trigger/ComboboxTriggerDataAttributes.js +13 -0
- package/combobox/utils/stateAttributesMapping.d.ts +14 -0
- package/combobox/utils/stateAttributesMapping.js +18 -0
- package/combobox/value/ComboboxValue.d.ts +5 -0
- package/combobox/value/ComboboxValue.js +15 -6
- package/composite/root/useCompositeRoot.d.ts +1 -1
- package/context-menu/trigger/ContextMenuTrigger.d.ts +1 -1
- package/csp-provider/CSPContext.d.ts +13 -0
- package/csp-provider/CSPContext.js +25 -0
- package/csp-provider/CSPProvider.d.ts +25 -0
- package/csp-provider/CSPProvider.js +32 -0
- package/csp-provider/index.d.ts +2 -0
- package/csp-provider/index.js +12 -0
- package/csp-provider/index.parts.d.ts +1 -0
- package/csp-provider/index.parts.js +12 -0
- package/dialog/backdrop/DialogBackdrop.d.ts +1 -1
- package/dialog/close/DialogClose.d.ts +1 -1
- package/dialog/description/DialogDescription.d.ts +1 -1
- package/dialog/popup/DialogPopup.d.ts +1 -1
- package/dialog/portal/DialogPortal.d.ts +1 -1
- package/dialog/portal/DialogPortal.js +1 -0
- package/dialog/root/DialogRoot.d.ts +4 -4
- package/dialog/store/DialogStore.d.ts +2 -2
- package/dialog/title/DialogTitle.d.ts +1 -1
- package/dialog/viewport/DialogViewport.d.ts +1 -1
- package/esm/accordion/header/AccordionHeader.d.ts +1 -1
- package/esm/accordion/item/AccordionItem.d.ts +1 -1
- package/esm/accordion/panel/AccordionPanel.d.ts +1 -1
- package/esm/accordion/root/AccordionRoot.d.ts +1 -1
- package/esm/accordion/trigger/AccordionTrigger.d.ts +1 -1
- package/esm/accordion/trigger/AccordionTrigger.js +3 -4
- package/esm/alert-dialog/root/AlertDialogRoot.d.ts +3 -3
- package/esm/autocomplete/root/AutocompleteRoot.d.ts +1 -1
- package/esm/avatar/fallback/AvatarFallback.d.ts +1 -1
- package/esm/avatar/image/AvatarImage.d.ts +1 -1
- package/esm/avatar/root/AvatarRoot.d.ts +1 -1
- package/esm/button/Button.d.ts +4 -17
- package/esm/button/Button.js +1 -2
- package/esm/checkbox/indicator/CheckboxIndicator.d.ts +1 -1
- package/esm/checkbox/indicator/CheckboxIndicatorDataAttributes.d.ts +4 -0
- package/esm/checkbox/indicator/CheckboxIndicatorDataAttributes.js +4 -0
- package/esm/checkbox/root/CheckboxRoot.d.ts +1 -1
- package/esm/checkbox/root/CheckboxRoot.js +6 -5
- package/esm/checkbox/root/CheckboxRootDataAttributes.d.ts +4 -0
- package/esm/checkbox/root/CheckboxRootDataAttributes.js +4 -0
- package/esm/checkbox-group/CheckboxGroup.d.ts +1 -1
- package/esm/collapsible/panel/CollapsiblePanel.d.ts +1 -1
- package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
- package/esm/collapsible/trigger/CollapsibleTrigger.d.ts +1 -1
- package/esm/collapsible/trigger/CollapsibleTrigger.js +1 -2
- package/esm/combobox/arrow/ComboboxArrow.d.ts +1 -1
- package/esm/combobox/backdrop/ComboboxBackdrop.d.ts +1 -1
- package/esm/combobox/chip/ComboboxChip.d.ts +1 -1
- package/esm/combobox/chip-remove/ComboboxChipRemove.d.ts +1 -1
- package/esm/combobox/chip-remove/ComboboxChipRemove.js +3 -2
- package/esm/combobox/chips/ComboboxChips.d.ts +1 -1
- package/esm/combobox/chips/ComboboxChips.js +7 -1
- package/esm/combobox/clear/ComboboxClear.d.ts +1 -1
- package/esm/combobox/clear/ComboboxClear.js +2 -2
- package/esm/combobox/empty/ComboboxEmpty.d.ts +1 -1
- package/esm/combobox/group/ComboboxGroup.d.ts +1 -1
- package/esm/combobox/group-label/ComboboxGroupLabel.d.ts +1 -1
- package/esm/combobox/icon/ComboboxIcon.d.ts +1 -1
- package/esm/combobox/input/ComboboxInput.d.ts +1 -1
- package/esm/combobox/input/ComboboxInput.js +12 -17
- package/esm/combobox/item/ComboboxItem.d.ts +1 -1
- package/esm/combobox/item/ComboboxItem.js +0 -1
- package/esm/combobox/item-indicator/ComboboxItemIndicator.d.ts +1 -1
- package/esm/combobox/list/ComboboxList.d.ts +1 -1
- package/esm/combobox/popup/ComboboxPopup.d.ts +1 -1
- package/esm/combobox/popup/ComboboxPopup.js +2 -1
- package/esm/combobox/portal/ComboboxPortal.d.ts +1 -1
- package/esm/combobox/positioner/ComboboxPositioner.d.ts +1 -1
- package/esm/combobox/root/AriaCombobox.d.ts +8 -1
- package/esm/combobox/root/AriaCombobox.js +20 -17
- package/esm/combobox/root/ComboboxRoot.d.ts +1 -1
- package/esm/combobox/row/ComboboxRow.d.ts +1 -1
- package/esm/combobox/status/ComboboxStatus.d.ts +1 -1
- package/esm/combobox/store.d.ts +3 -0
- package/esm/combobox/store.js +21 -0
- package/esm/combobox/trigger/ComboboxTrigger.d.ts +14 -1
- package/esm/combobox/trigger/ComboboxTrigger.js +32 -12
- package/esm/combobox/trigger/ComboboxTriggerDataAttributes.d.ts +13 -0
- package/esm/combobox/trigger/ComboboxTriggerDataAttributes.js +13 -0
- package/esm/combobox/utils/stateAttributesMapping.d.ts +14 -0
- package/esm/combobox/utils/stateAttributesMapping.js +12 -0
- package/esm/combobox/value/ComboboxValue.d.ts +5 -0
- package/esm/combobox/value/ComboboxValue.js +16 -7
- package/esm/composite/root/useCompositeRoot.d.ts +1 -1
- package/esm/context-menu/trigger/ContextMenuTrigger.d.ts +1 -1
- package/esm/csp-provider/CSPContext.d.ts +13 -0
- package/esm/csp-provider/CSPContext.js +18 -0
- package/esm/csp-provider/CSPProvider.d.ts +25 -0
- package/esm/csp-provider/CSPProvider.js +27 -0
- package/esm/csp-provider/index.d.ts +2 -0
- package/esm/csp-provider/index.js +1 -0
- package/esm/csp-provider/index.parts.d.ts +1 -0
- package/esm/csp-provider/index.parts.js +1 -0
- package/esm/dialog/backdrop/DialogBackdrop.d.ts +1 -1
- package/esm/dialog/close/DialogClose.d.ts +1 -1
- package/esm/dialog/description/DialogDescription.d.ts +1 -1
- package/esm/dialog/popup/DialogPopup.d.ts +1 -1
- package/esm/dialog/portal/DialogPortal.d.ts +1 -1
- package/esm/dialog/portal/DialogPortal.js +1 -0
- package/esm/dialog/root/DialogRoot.d.ts +4 -4
- package/esm/dialog/store/DialogStore.d.ts +2 -2
- package/esm/dialog/title/DialogTitle.d.ts +1 -1
- package/esm/dialog/viewport/DialogViewport.d.ts +1 -1
- package/esm/field/control/FieldControl.d.ts +1 -1
- package/esm/field/description/FieldDescription.d.ts +1 -1
- package/esm/field/error/FieldError.d.ts +1 -1
- package/esm/field/index.d.ts +2 -1
- package/esm/field/item/FieldItem.d.ts +1 -1
- package/esm/field/label/FieldLabel.d.ts +11 -2
- package/esm/field/label/FieldLabel.js +51 -11
- package/esm/field/root/FieldRoot.d.ts +10 -1
- package/esm/field/root/FieldRoot.js +8 -0
- package/esm/field/useField.js +7 -3
- package/esm/fieldset/legend/FieldsetLegend.d.ts +1 -1
- package/esm/fieldset/root/FieldsetRoot.d.ts +1 -1
- package/esm/floating-ui-react/components/FloatingFocusManager.js +7 -6
- package/esm/floating-ui-react/components/FloatingPortal.d.ts +2 -2
- package/esm/floating-ui-react/components/FloatingPortal.js +11 -2
- package/esm/floating-ui-react/hooks/useClientPoint.js +5 -4
- package/esm/floating-ui-react/hooks/useDismiss.js +16 -3
- package/esm/floating-ui-react/hooks/useFocus.d.ts +5 -0
- package/esm/floating-ui-react/hooks/useFocus.js +43 -9
- package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +17 -4
- package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +3 -0
- package/esm/form/Form.d.ts +18 -1
- package/esm/form/Form.js +17 -0
- package/esm/form/FormContext.d.ts +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +2 -1
- package/esm/input/Input.d.ts +1 -1
- package/esm/menu/arrow/MenuArrow.d.ts +1 -1
- package/esm/menu/backdrop/MenuBackdrop.d.ts +1 -1
- package/esm/menu/checkbox-item/MenuCheckboxItem.d.ts +1 -1
- package/esm/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.d.ts +1 -1
- package/esm/menu/group/MenuGroup.d.ts +1 -1
- package/esm/menu/group-label/MenuGroupLabel.d.ts +1 -1
- package/esm/menu/item/MenuItem.d.ts +1 -1
- package/esm/menu/popup/MenuPopup.d.ts +1 -1
- package/esm/menu/popup/MenuPopup.js +4 -3
- package/esm/menu/portal/MenuPortal.d.ts +1 -1
- package/esm/menu/positioner/MenuPositioner.d.ts +1 -1
- package/esm/menu/radio-group/MenuRadioGroup.d.ts +1 -1
- package/esm/menu/radio-item/MenuRadioItem.d.ts +1 -1
- package/esm/menu/radio-item-indicator/MenuRadioItemIndicator.d.ts +1 -1
- package/esm/menu/root/MenuRoot.d.ts +7 -6
- package/esm/menu/root/MenuRoot.js +4 -2
- package/esm/menu/store/MenuStore.js +3 -3
- package/esm/menu/submenu-trigger/MenuSubmenuTrigger.d.ts +1 -1
- package/esm/menu/trigger/MenuTrigger.js +13 -13
- package/esm/menubar/Menubar.d.ts +1 -1
- package/esm/merge-props/mergeProps.d.ts +31 -11
- package/esm/merge-props/mergeProps.js +29 -8
- package/esm/meter/indicator/MeterIndicator.d.ts +1 -1
- package/esm/meter/label/MeterLabel.d.ts +1 -1
- package/esm/meter/root/MeterRoot.d.ts +1 -1
- package/esm/meter/track/MeterTrack.d.ts +1 -1
- package/esm/meter/value/MeterValue.d.ts +1 -1
- package/esm/navigation-menu/arrow/NavigationMenuArrow.d.ts +1 -1
- package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.d.ts +1 -1
- package/esm/navigation-menu/content/NavigationMenuContent.d.ts +1 -1
- package/esm/navigation-menu/content/NavigationMenuContent.js +6 -0
- package/esm/navigation-menu/icon/NavigationMenuIcon.d.ts +1 -1
- package/esm/navigation-menu/item/NavigationMenuItem.d.ts +1 -1
- package/esm/navigation-menu/link/NavigationMenuLink.d.ts +1 -1
- package/esm/navigation-menu/list/NavigationMenuList.d.ts +1 -1
- package/esm/navigation-menu/popup/NavigationMenuPopup.d.ts +1 -1
- package/esm/navigation-menu/portal/NavigationMenuPortal.d.ts +1 -1
- package/esm/navigation-menu/positioner/NavigationMenuPositioner.d.ts +1 -1
- package/esm/navigation-menu/root/NavigationMenuRoot.d.ts +2 -2
- package/esm/navigation-menu/trigger/NavigationMenuTrigger.d.ts +1 -1
- package/esm/navigation-menu/viewport/NavigationMenuViewport.d.ts +1 -1
- package/esm/number-field/decrement/NumberFieldDecrement.d.ts +1 -1
- package/esm/number-field/decrement/NumberFieldDecrement.js +4 -6
- package/esm/number-field/group/NumberFieldGroup.d.ts +1 -1
- package/esm/number-field/increment/NumberFieldIncrement.d.ts +1 -1
- package/esm/number-field/increment/NumberFieldIncrement.js +4 -6
- package/esm/number-field/input/NumberFieldInput.d.ts +1 -1
- package/esm/number-field/input/NumberFieldInput.js +5 -2
- package/esm/number-field/root/NumberFieldRoot.d.ts +5 -4
- package/esm/number-field/root/NumberFieldRoot.js +12 -5
- package/esm/number-field/root/useNumberFieldButton.d.ts +0 -3
- package/esm/number-field/root/useNumberFieldButton.js +5 -11
- package/esm/number-field/scrub-area/NumberFieldScrubArea.d.ts +1 -1
- package/esm/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.d.ts +1 -1
- package/esm/popover/arrow/PopoverArrow.d.ts +1 -1
- package/esm/popover/backdrop/PopoverBackdrop.d.ts +1 -1
- package/esm/popover/close/PopoverClose.d.ts +1 -1
- package/esm/popover/description/PopoverDescription.d.ts +1 -1
- package/esm/popover/popup/PopoverPopup.d.ts +1 -1
- package/esm/popover/popup/PopoverPopup.js +0 -30
- package/esm/popover/portal/PopoverPortal.d.ts +1 -1
- package/esm/popover/positioner/PopoverPositioner.d.ts +1 -1
- package/esm/popover/positioner/PopoverPositioner.js +2 -1
- package/esm/popover/root/PopoverRoot.d.ts +2 -2
- package/esm/popover/store/PopoverStore.d.ts +4 -2
- package/esm/popover/store/PopoverStore.js +8 -5
- package/esm/popover/title/PopoverTitle.d.ts +1 -1
- package/esm/popover/trigger/PopoverTrigger.js +2 -2
- package/esm/popover/viewport/PopoverViewport.d.ts +1 -1
- package/esm/popover/viewport/PopoverViewport.js +28 -12
- package/esm/preview-card/arrow/PreviewCardArrow.d.ts +1 -1
- package/esm/preview-card/arrow/PreviewCardArrow.js +2 -3
- package/esm/preview-card/backdrop/PreviewCardBackdrop.d.ts +1 -1
- package/esm/preview-card/backdrop/PreviewCardBackdrop.js +4 -5
- package/esm/preview-card/index.parts.d.ts +3 -1
- package/esm/preview-card/index.parts.js +3 -1
- package/esm/preview-card/popup/PreviewCardPopup.d.ts +2 -1
- package/esm/preview-card/popup/PreviewCardPopup.js +17 -11
- package/esm/preview-card/portal/PreviewCardPortal.d.ts +1 -1
- package/esm/preview-card/portal/PreviewCardPortal.js +2 -3
- package/esm/preview-card/positioner/PreviewCardPositioner.d.ts +2 -1
- package/esm/preview-card/positioner/PreviewCardPositioner.js +16 -11
- package/esm/preview-card/root/PreviewCardContext.d.ts +5 -26
- package/esm/preview-card/root/PreviewCardContext.js +2 -2
- package/esm/preview-card/root/PreviewCardRoot.d.ts +35 -10
- package/esm/preview-card/root/PreviewCardRoot.js +61 -116
- package/esm/preview-card/store/PreviewCardHandle.d.ts +33 -0
- package/esm/preview-card/store/PreviewCardHandle.js +55 -0
- package/esm/preview-card/store/PreviewCardStore.d.ts +36 -0
- package/esm/preview-card/store/PreviewCardStore.js +97 -0
- package/esm/preview-card/trigger/PreviewCardTrigger.d.ts +15 -3
- package/esm/preview-card/trigger/PreviewCardTrigger.js +49 -13
- package/esm/preview-card/viewport/PreviewCardViewport.d.ts +22 -0
- package/esm/preview-card/viewport/PreviewCardViewport.js +272 -0
- package/esm/preview-card/viewport/PreviewCardViewportCssVars.d.ts +14 -0
- package/esm/preview-card/viewport/PreviewCardViewportCssVars.js +15 -0
- package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +26 -0
- package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +27 -0
- package/esm/progress/indicator/ProgressIndicator.d.ts +1 -1
- package/esm/progress/label/ProgressLabel.d.ts +1 -1
- package/esm/progress/root/ProgressRoot.d.ts +1 -1
- package/esm/progress/track/ProgressTrack.d.ts +1 -1
- package/esm/progress/value/ProgressValue.d.ts +1 -1
- package/esm/radio/indicator/RadioIndicator.d.ts +1 -1
- package/esm/radio/root/RadioRoot.d.ts +1 -1
- package/esm/radio/root/RadioRoot.js +9 -9
- package/esm/radio-group/RadioGroup.d.ts +4 -4
- package/esm/radio-group/RadioGroup.js +2 -2
- package/esm/scroll-area/content/ScrollAreaContent.d.ts +1 -1
- package/esm/scroll-area/content/ScrollAreaContent.js +10 -1
- package/esm/scroll-area/corner/ScrollAreaCorner.d.ts +1 -1
- package/esm/scroll-area/corner/ScrollAreaCorner.js +1 -1
- package/esm/scroll-area/root/ScrollAreaRoot.d.ts +26 -2
- package/esm/scroll-area/root/ScrollAreaRoot.js +33 -29
- package/esm/scroll-area/root/ScrollAreaRootContext.d.ts +10 -43
- package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.d.ts +1 -1
- package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +4 -4
- package/esm/scroll-area/thumb/ScrollAreaThumb.d.ts +2 -2
- package/esm/scroll-area/thumb/ScrollAreaThumb.js +1 -1
- package/esm/scroll-area/viewport/ScrollAreaViewport.d.ts +1 -1
- package/esm/scroll-area/viewport/ScrollAreaViewport.js +51 -25
- package/esm/select/arrow/SelectArrow.d.ts +1 -1
- package/esm/select/backdrop/SelectBackdrop.d.ts +1 -1
- package/esm/select/group/SelectGroup.d.ts +1 -1
- package/esm/select/group-label/SelectGroupLabel.d.ts +1 -1
- package/esm/select/icon/SelectIcon.d.ts +1 -1
- package/esm/select/item/SelectItem.d.ts +1 -1
- package/esm/select/item/SelectItem.js +0 -1
- package/esm/select/item-indicator/SelectItemIndicator.d.ts +1 -1
- package/esm/select/item-text/SelectItemText.d.ts +1 -1
- package/esm/select/list/SelectList.d.ts +1 -1
- package/esm/select/popup/SelectPopup.d.ts +1 -1
- package/esm/select/popup/SelectPopup.js +154 -95
- package/esm/select/portal/SelectPortal.d.ts +1 -1
- package/esm/select/positioner/SelectPositioner.d.ts +1 -1
- package/esm/select/root/SelectRoot.d.ts +2 -2
- package/esm/select/root/SelectRoot.js +26 -13
- package/esm/select/scroll-arrow/SelectScrollArrow.d.ts +1 -1
- package/esm/select/scroll-down-arrow/SelectScrollDownArrow.d.ts +1 -1
- package/esm/select/scroll-up-arrow/SelectScrollUpArrow.d.ts +1 -1
- package/esm/select/store.d.ts +2 -1
- package/esm/select/store.js +19 -13
- package/esm/select/trigger/SelectTrigger.d.ts +14 -4
- package/esm/select/trigger/SelectTrigger.js +50 -18
- package/esm/select/value/SelectValue.d.ts +6 -1
- package/esm/select/value/SelectValue.js +19 -5
- package/esm/separator/Separator.d.ts +1 -1
- package/esm/slider/control/SliderControl.d.ts +1 -1
- package/esm/slider/control/SliderControl.js +1 -1
- package/esm/slider/control/SliderControlDataAttributes.d.ts +0 -8
- package/esm/slider/control/SliderControlDataAttributes.js +0 -8
- package/esm/slider/indicator/SliderIndicator.d.ts +1 -1
- package/esm/slider/indicator/SliderIndicatorDataAttributes.d.ts +0 -8
- package/esm/slider/indicator/SliderIndicatorDataAttributes.js +0 -8
- package/esm/slider/root/SliderRootDataAttributes.d.ts +0 -8
- package/esm/slider/root/SliderRootDataAttributes.js +0 -8
- package/esm/slider/thumb/SliderThumb.d.ts +2 -2
- package/esm/slider/thumb/SliderThumb.js +7 -1
- package/esm/slider/thumb/SliderThumbDataAttributes.d.ts +0 -8
- package/esm/slider/thumb/SliderThumbDataAttributes.js +0 -8
- package/esm/slider/track/SliderTrack.d.ts +1 -1
- package/esm/slider/track/SliderTrackDataAttributes.d.ts +0 -8
- package/esm/slider/track/SliderTrackDataAttributes.js +0 -8
- package/esm/slider/value/SliderValue.d.ts +1 -1
- package/esm/slider/value/SliderValueDataAttributes.d.ts +0 -8
- package/esm/slider/value/SliderValueDataAttributes.js +0 -8
- package/esm/switch/root/SwitchRoot.d.ts +6 -1
- package/esm/switch/root/SwitchRoot.js +15 -6
- package/esm/switch/thumb/SwitchThumb.d.ts +1 -1
- package/esm/tabs/indicator/TabsIndicator.d.ts +1 -1
- package/esm/tabs/indicator/TabsIndicator.js +6 -0
- package/esm/tabs/list/TabsList.d.ts +1 -1
- package/esm/tabs/panel/TabsPanel.d.ts +1 -1
- package/esm/tabs/root/TabsRoot.d.ts +1 -1
- package/esm/tabs/tab/TabsTab.d.ts +1 -1
- package/esm/toast/action/ToastAction.d.ts +1 -1
- package/esm/toast/arrow/ToastArrow.d.ts +1 -1
- package/esm/toast/close/ToastClose.d.ts +1 -1
- package/esm/toast/content/ToastContent.d.ts +1 -1
- package/esm/toast/description/ToastDescription.d.ts +1 -1
- package/esm/toast/portal/ToastPortal.d.ts +1 -1
- package/esm/toast/positioner/ToastPositioner.d.ts +1 -1
- package/esm/toast/provider/ToastProvider.js +46 -19
- package/esm/toast/root/ToastRoot.d.ts +1 -1
- package/esm/toast/title/ToastTitle.d.ts +1 -1
- package/esm/toast/viewport/ToastViewport.d.ts +1 -1
- package/esm/toggle/Toggle.d.ts +1 -1
- package/esm/toggle-group/ToggleGroup.d.ts +1 -1
- package/esm/toolbar/button/ToolbarButton.d.ts +1 -1
- package/esm/toolbar/group/ToolbarGroup.d.ts +1 -1
- package/esm/toolbar/input/ToolbarInput.d.ts +1 -1
- package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
- package/esm/toolbar/root/ToolbarRoot.d.ts +1 -1
- package/esm/toolbar/separator/ToolbarSeparator.d.ts +1 -1
- package/esm/tooltip/arrow/TooltipArrow.d.ts +1 -1
- package/esm/tooltip/popup/TooltipPopup.d.ts +1 -1
- package/esm/tooltip/popup/TooltipPopup.js +0 -31
- package/esm/tooltip/portal/TooltipPortal.d.ts +1 -1
- package/esm/tooltip/positioner/TooltipPositioner.d.ts +1 -1
- package/esm/tooltip/positioner/TooltipPositioner.js +2 -1
- package/esm/tooltip/root/TooltipRoot.d.ts +4 -6
- package/esm/tooltip/root/TooltipRoot.js +1 -2
- package/esm/tooltip/store/TooltipStore.d.ts +4 -2
- package/esm/tooltip/store/TooltipStore.js +7 -4
- package/esm/tooltip/trigger/TooltipTrigger.js +1 -1
- package/esm/tooltip/viewport/TooltipViewport.d.ts +1 -1
- package/esm/tooltip/viewport/TooltipViewport.js +28 -12
- package/esm/use-render/index.d.ts +2 -1
- package/esm/use-render/index.js +2 -1
- package/esm/utils/FloatingPortalLite.d.ts +1 -1
- package/esm/utils/popups/popupStoreUtils.js +21 -2
- package/esm/utils/resolveValueLabel.d.ts +5 -1
- package/esm/utils/resolveValueLabel.js +46 -22
- package/esm/utils/styles.d.ts +1 -1
- package/esm/utils/styles.js +10 -6
- package/esm/utils/types.d.ts +1 -1
- package/esm/utils/useAnimationsFinished.d.ts +2 -2
- package/esm/utils/useAnimationsFinished.js +56 -33
- package/esm/utils/useOpenChangeComplete.js +8 -10
- package/esm/utils/useOpenInteractionType.js +6 -1
- package/esm/utils/usePopupAutoResize.js +82 -46
- package/field/control/FieldControl.d.ts +1 -1
- package/field/description/FieldDescription.d.ts +1 -1
- package/field/error/FieldError.d.ts +1 -1
- package/field/index.d.ts +2 -1
- package/field/item/FieldItem.d.ts +1 -1
- package/field/label/FieldLabel.d.ts +11 -2
- package/field/label/FieldLabel.js +51 -11
- package/field/root/FieldRoot.d.ts +10 -1
- package/field/root/FieldRoot.js +8 -0
- package/field/useField.js +7 -3
- package/fieldset/legend/FieldsetLegend.d.ts +1 -1
- package/fieldset/root/FieldsetRoot.d.ts +1 -1
- package/floating-ui-react/components/FloatingFocusManager.js +7 -6
- package/floating-ui-react/components/FloatingPortal.d.ts +2 -2
- package/floating-ui-react/components/FloatingPortal.js +11 -2
- package/floating-ui-react/hooks/useClientPoint.js +5 -4
- package/floating-ui-react/hooks/useDismiss.js +16 -3
- package/floating-ui-react/hooks/useFocus.d.ts +5 -0
- package/floating-ui-react/hooks/useFocus.js +43 -9
- package/floating-ui-react/hooks/useHoverReferenceInteraction.js +17 -4
- package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +3 -0
- package/form/Form.d.ts +18 -1
- package/form/Form.js +17 -0
- package/form/FormContext.d.ts +1 -1
- package/index.d.ts +1 -0
- package/index.js +12 -1
- package/input/Input.d.ts +1 -1
- package/menu/arrow/MenuArrow.d.ts +1 -1
- package/menu/backdrop/MenuBackdrop.d.ts +1 -1
- package/menu/checkbox-item/MenuCheckboxItem.d.ts +1 -1
- package/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.d.ts +1 -1
- package/menu/group/MenuGroup.d.ts +1 -1
- package/menu/group-label/MenuGroupLabel.d.ts +1 -1
- package/menu/item/MenuItem.d.ts +1 -1
- package/menu/popup/MenuPopup.d.ts +1 -1
- package/menu/popup/MenuPopup.js +4 -3
- package/menu/portal/MenuPortal.d.ts +1 -1
- package/menu/positioner/MenuPositioner.d.ts +1 -1
- package/menu/radio-group/MenuRadioGroup.d.ts +1 -1
- package/menu/radio-item/MenuRadioItem.d.ts +1 -1
- package/menu/radio-item-indicator/MenuRadioItemIndicator.d.ts +1 -1
- package/menu/root/MenuRoot.d.ts +7 -6
- package/menu/root/MenuRoot.js +4 -2
- package/menu/store/MenuStore.js +3 -3
- package/menu/submenu-trigger/MenuSubmenuTrigger.d.ts +1 -1
- package/menu/trigger/MenuTrigger.js +14 -14
- package/menubar/Menubar.d.ts +1 -1
- package/merge-props/mergeProps.d.ts +31 -11
- package/merge-props/mergeProps.js +29 -8
- package/meter/indicator/MeterIndicator.d.ts +1 -1
- package/meter/label/MeterLabel.d.ts +1 -1
- package/meter/root/MeterRoot.d.ts +1 -1
- package/meter/track/MeterTrack.d.ts +1 -1
- package/meter/value/MeterValue.d.ts +1 -1
- package/navigation-menu/arrow/NavigationMenuArrow.d.ts +1 -1
- package/navigation-menu/backdrop/NavigationMenuBackdrop.d.ts +1 -1
- package/navigation-menu/content/NavigationMenuContent.d.ts +1 -1
- package/navigation-menu/content/NavigationMenuContent.js +6 -0
- package/navigation-menu/icon/NavigationMenuIcon.d.ts +1 -1
- package/navigation-menu/item/NavigationMenuItem.d.ts +1 -1
- package/navigation-menu/link/NavigationMenuLink.d.ts +1 -1
- package/navigation-menu/list/NavigationMenuList.d.ts +1 -1
- package/navigation-menu/popup/NavigationMenuPopup.d.ts +1 -1
- package/navigation-menu/portal/NavigationMenuPortal.d.ts +1 -1
- package/navigation-menu/positioner/NavigationMenuPositioner.d.ts +1 -1
- package/navigation-menu/root/NavigationMenuRoot.d.ts +2 -2
- package/navigation-menu/trigger/NavigationMenuTrigger.d.ts +1 -1
- package/navigation-menu/viewport/NavigationMenuViewport.d.ts +1 -1
- package/number-field/decrement/NumberFieldDecrement.d.ts +1 -1
- package/number-field/decrement/NumberFieldDecrement.js +4 -6
- package/number-field/group/NumberFieldGroup.d.ts +1 -1
- package/number-field/increment/NumberFieldIncrement.d.ts +1 -1
- package/number-field/increment/NumberFieldIncrement.js +4 -6
- package/number-field/input/NumberFieldInput.d.ts +1 -1
- package/number-field/input/NumberFieldInput.js +5 -2
- package/number-field/root/NumberFieldRoot.d.ts +5 -4
- package/number-field/root/NumberFieldRoot.js +11 -4
- package/number-field/root/useNumberFieldButton.d.ts +0 -3
- package/number-field/root/useNumberFieldButton.js +5 -11
- package/number-field/scrub-area/NumberFieldScrubArea.d.ts +1 -1
- package/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.d.ts +1 -1
- package/package.json +13 -3
- package/popover/arrow/PopoverArrow.d.ts +1 -1
- package/popover/backdrop/PopoverBackdrop.d.ts +1 -1
- package/popover/close/PopoverClose.d.ts +1 -1
- package/popover/description/PopoverDescription.d.ts +1 -1
- package/popover/popup/PopoverPopup.d.ts +1 -1
- package/popover/popup/PopoverPopup.js +0 -30
- package/popover/portal/PopoverPortal.d.ts +1 -1
- package/popover/positioner/PopoverPositioner.d.ts +1 -1
- package/popover/positioner/PopoverPositioner.js +2 -1
- package/popover/root/PopoverRoot.d.ts +2 -2
- package/popover/store/PopoverStore.d.ts +4 -2
- package/popover/store/PopoverStore.js +8 -5
- package/popover/title/PopoverTitle.d.ts +1 -1
- package/popover/trigger/PopoverTrigger.js +2 -2
- package/popover/viewport/PopoverViewport.d.ts +1 -1
- package/popover/viewport/PopoverViewport.js +28 -12
- package/preview-card/arrow/PreviewCardArrow.d.ts +1 -1
- package/preview-card/arrow/PreviewCardArrow.js +2 -3
- package/preview-card/backdrop/PreviewCardBackdrop.d.ts +1 -1
- package/preview-card/backdrop/PreviewCardBackdrop.js +4 -5
- package/preview-card/index.parts.d.ts +3 -1
- package/preview-card/index.parts.js +21 -1
- package/preview-card/popup/PreviewCardPopup.d.ts +2 -1
- package/preview-card/popup/PreviewCardPopup.js +17 -11
- package/preview-card/portal/PreviewCardPortal.d.ts +1 -1
- package/preview-card/portal/PreviewCardPortal.js +2 -3
- package/preview-card/positioner/PreviewCardPositioner.d.ts +2 -1
- package/preview-card/positioner/PreviewCardPositioner.js +16 -11
- package/preview-card/root/PreviewCardContext.d.ts +5 -26
- package/preview-card/root/PreviewCardContext.js +2 -2
- package/preview-card/root/PreviewCardRoot.d.ts +35 -10
- package/preview-card/root/PreviewCardRoot.js +59 -113
- package/preview-card/store/PreviewCardHandle.d.ts +33 -0
- package/preview-card/store/PreviewCardHandle.js +63 -0
- package/preview-card/store/PreviewCardStore.d.ts +36 -0
- package/preview-card/store/PreviewCardStore.js +105 -0
- package/preview-card/trigger/PreviewCardTrigger.d.ts +15 -3
- package/preview-card/trigger/PreviewCardTrigger.js +50 -13
- package/preview-card/viewport/PreviewCardViewport.d.ts +22 -0
- package/preview-card/viewport/PreviewCardViewport.js +278 -0
- package/preview-card/viewport/PreviewCardViewportCssVars.d.ts +14 -0
- package/preview-card/viewport/PreviewCardViewportCssVars.js +21 -0
- package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +26 -0
- package/preview-card/viewport/PreviewCardViewportDataAttributes.js +33 -0
- package/progress/indicator/ProgressIndicator.d.ts +1 -1
- package/progress/label/ProgressLabel.d.ts +1 -1
- package/progress/root/ProgressRoot.d.ts +1 -1
- package/progress/track/ProgressTrack.d.ts +1 -1
- package/progress/value/ProgressValue.d.ts +1 -1
- package/radio/indicator/RadioIndicator.d.ts +1 -1
- package/radio/root/RadioRoot.d.ts +1 -1
- package/radio/root/RadioRoot.js +8 -8
- package/radio-group/RadioGroup.d.ts +4 -4
- package/radio-group/RadioGroup.js +1 -1
- package/scroll-area/content/ScrollAreaContent.d.ts +1 -1
- package/scroll-area/content/ScrollAreaContent.js +10 -1
- package/scroll-area/corner/ScrollAreaCorner.d.ts +1 -1
- package/scroll-area/corner/ScrollAreaCorner.js +1 -1
- package/scroll-area/root/ScrollAreaRoot.d.ts +26 -2
- package/scroll-area/root/ScrollAreaRoot.js +33 -29
- package/scroll-area/root/ScrollAreaRootContext.d.ts +10 -43
- package/scroll-area/scrollbar/ScrollAreaScrollbar.d.ts +1 -1
- package/scroll-area/scrollbar/ScrollAreaScrollbar.js +4 -4
- package/scroll-area/thumb/ScrollAreaThumb.d.ts +2 -2
- package/scroll-area/thumb/ScrollAreaThumb.js +1 -1
- package/scroll-area/viewport/ScrollAreaViewport.d.ts +1 -1
- package/scroll-area/viewport/ScrollAreaViewport.js +51 -25
- package/select/arrow/SelectArrow.d.ts +1 -1
- package/select/backdrop/SelectBackdrop.d.ts +1 -1
- package/select/group/SelectGroup.d.ts +1 -1
- package/select/group-label/SelectGroupLabel.d.ts +1 -1
- package/select/icon/SelectIcon.d.ts +1 -1
- package/select/item/SelectItem.d.ts +1 -1
- package/select/item/SelectItem.js +0 -1
- package/select/item-indicator/SelectItemIndicator.d.ts +1 -1
- package/select/item-text/SelectItemText.d.ts +1 -1
- package/select/list/SelectList.d.ts +1 -1
- package/select/popup/SelectPopup.d.ts +1 -1
- package/select/popup/SelectPopup.js +154 -95
- package/select/portal/SelectPortal.d.ts +1 -1
- package/select/positioner/SelectPositioner.d.ts +1 -1
- package/select/root/SelectRoot.d.ts +2 -2
- package/select/root/SelectRoot.js +24 -11
- package/select/scroll-arrow/SelectScrollArrow.d.ts +1 -1
- package/select/scroll-down-arrow/SelectScrollDownArrow.d.ts +1 -1
- package/select/scroll-up-arrow/SelectScrollUpArrow.d.ts +1 -1
- package/select/store.d.ts +2 -1
- package/select/store.js +18 -12
- package/select/trigger/SelectTrigger.d.ts +14 -4
- package/select/trigger/SelectTrigger.js +50 -18
- package/select/value/SelectValue.d.ts +6 -1
- package/select/value/SelectValue.js +18 -4
- package/separator/Separator.d.ts +1 -1
- package/slider/control/SliderControl.d.ts +1 -1
- package/slider/control/SliderControl.js +1 -1
- package/slider/control/SliderControlDataAttributes.d.ts +0 -8
- package/slider/control/SliderControlDataAttributes.js +0 -8
- package/slider/indicator/SliderIndicator.d.ts +1 -1
- package/slider/indicator/SliderIndicatorDataAttributes.d.ts +0 -8
- package/slider/indicator/SliderIndicatorDataAttributes.js +0 -8
- package/slider/root/SliderRootDataAttributes.d.ts +0 -8
- package/slider/root/SliderRootDataAttributes.js +0 -8
- package/slider/thumb/SliderThumb.d.ts +2 -2
- package/slider/thumb/SliderThumb.js +7 -1
- package/slider/thumb/SliderThumbDataAttributes.d.ts +0 -8
- package/slider/thumb/SliderThumbDataAttributes.js +0 -8
- package/slider/track/SliderTrack.d.ts +1 -1
- package/slider/track/SliderTrackDataAttributes.d.ts +0 -8
- package/slider/track/SliderTrackDataAttributes.js +0 -8
- package/slider/value/SliderValue.d.ts +1 -1
- package/slider/value/SliderValueDataAttributes.d.ts +0 -8
- package/slider/value/SliderValueDataAttributes.js +0 -8
- package/switch/root/SwitchRoot.d.ts +6 -1
- package/switch/root/SwitchRoot.js +14 -5
- package/switch/thumb/SwitchThumb.d.ts +1 -1
- package/tabs/indicator/TabsIndicator.d.ts +1 -1
- package/tabs/indicator/TabsIndicator.js +6 -0
- package/tabs/list/TabsList.d.ts +1 -1
- package/tabs/panel/TabsPanel.d.ts +1 -1
- package/tabs/root/TabsRoot.d.ts +1 -1
- package/tabs/tab/TabsTab.d.ts +1 -1
- package/toast/action/ToastAction.d.ts +1 -1
- package/toast/arrow/ToastArrow.d.ts +1 -1
- package/toast/close/ToastClose.d.ts +1 -1
- package/toast/content/ToastContent.d.ts +1 -1
- package/toast/description/ToastDescription.d.ts +1 -1
- package/toast/portal/ToastPortal.d.ts +1 -1
- package/toast/positioner/ToastPositioner.d.ts +1 -1
- package/toast/provider/ToastProvider.js +46 -19
- package/toast/root/ToastRoot.d.ts +1 -1
- package/toast/title/ToastTitle.d.ts +1 -1
- package/toast/viewport/ToastViewport.d.ts +1 -1
- package/toggle/Toggle.d.ts +1 -1
- package/toggle-group/ToggleGroup.d.ts +1 -1
- package/toolbar/button/ToolbarButton.d.ts +1 -1
- package/toolbar/group/ToolbarGroup.d.ts +1 -1
- package/toolbar/input/ToolbarInput.d.ts +1 -1
- package/toolbar/link/ToolbarLink.d.ts +1 -1
- package/toolbar/root/ToolbarRoot.d.ts +1 -1
- package/toolbar/separator/ToolbarSeparator.d.ts +1 -1
- package/tooltip/arrow/TooltipArrow.d.ts +1 -1
- package/tooltip/popup/TooltipPopup.d.ts +1 -1
- package/tooltip/popup/TooltipPopup.js +0 -31
- package/tooltip/portal/TooltipPortal.d.ts +1 -1
- package/tooltip/positioner/TooltipPositioner.d.ts +1 -1
- package/tooltip/positioner/TooltipPositioner.js +2 -1
- package/tooltip/root/TooltipRoot.d.ts +4 -6
- package/tooltip/root/TooltipRoot.js +1 -2
- package/tooltip/store/TooltipStore.d.ts +4 -2
- package/tooltip/store/TooltipStore.js +7 -4
- package/tooltip/trigger/TooltipTrigger.js +1 -1
- package/tooltip/viewport/TooltipViewport.d.ts +1 -1
- package/tooltip/viewport/TooltipViewport.js +28 -12
- package/use-render/index.d.ts +2 -1
- package/utils/FloatingPortalLite.d.ts +1 -1
- package/utils/popups/popupStoreUtils.js +21 -2
- package/utils/resolveValueLabel.d.ts +5 -1
- package/utils/resolveValueLabel.js +48 -22
- package/utils/styles.d.ts +1 -1
- package/utils/styles.js +10 -6
- package/utils/types.d.ts +1 -1
- package/utils/useAnimationsFinished.d.ts +2 -2
- package/utils/useAnimationsFinished.js +56 -33
- package/utils/useOpenChangeComplete.js +8 -10
- package/utils/useOpenInteractionType.js +6 -1
- package/utils/usePopupAutoResize.js +82 -46
- package/esm/utils/interactions/useFocusWithDelay.d.ts +0 -9
- package/esm/utils/interactions/useFocusWithDelay.js +0 -81
- package/utils/interactions/useFocusWithDelay.d.ts +0 -9
- package/utils/interactions/useFocusWithDelay.js +0 -87
- /package/esm/utils/{useMixedToggleClickHander.d.ts → useMixedToggleClickHandler.d.ts} +0 -0
- /package/esm/utils/{useMixedToggleClickHander.js → useMixedToggleClickHandler.js} +0 -0
- /package/utils/{useMixedToggleClickHander.d.ts → useMixedToggleClickHandler.d.ts} +0 -0
- /package/utils/{useMixedToggleClickHander.js → useMixedToggleClickHandler.js} +0 -0
|
@@ -7,9 +7,18 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
|
|
|
7
7
|
*
|
|
8
8
|
* Documentation: [Base UI Field](https://base-ui.com/react/components/field)
|
|
9
9
|
*/
|
|
10
|
-
export declare const FieldLabel: React.ForwardRefExoticComponent<FieldLabelProps & React.RefAttributes<
|
|
10
|
+
export declare const FieldLabel: React.ForwardRefExoticComponent<Omit<FieldLabelProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
11
11
|
export type FieldLabelState = FieldRoot.State;
|
|
12
|
-
export interface FieldLabelProps extends BaseUIComponentProps<'label', FieldLabel.State> {
|
|
12
|
+
export interface FieldLabelProps extends BaseUIComponentProps<'label', FieldLabel.State> {
|
|
13
|
+
/**
|
|
14
|
+
* Whether the component renders a native `<label>` element when replacing it via the `render` prop.
|
|
15
|
+
* Set to `false` if the rendered element is not a label (e.g. `<div>`).
|
|
16
|
+
*
|
|
17
|
+
* This is useful to avoid inheriting label behaviors on `<button>` controls (such as `<Select.Trigger>` and `<Combobox.Trigger>`), including avoiding `:hover` on the button when hovering the label, and preventing clicks on the label from firing on the button.
|
|
18
|
+
* @default true
|
|
19
|
+
*/
|
|
20
|
+
nativeLabel?: boolean;
|
|
21
|
+
}
|
|
13
22
|
export declare namespace FieldLabel {
|
|
14
23
|
type State = FieldLabelState;
|
|
15
24
|
type Props = FieldLabelProps;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import * as React from 'react';
|
|
4
|
+
import { error } from '@base-ui/utils/error';
|
|
5
|
+
import { isHTMLElement } from '@floating-ui/utils/dom';
|
|
4
6
|
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
|
|
7
|
+
import { ownerDocument } from '@base-ui/utils/owner';
|
|
8
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
5
9
|
import { getTarget } from "../../floating-ui-react/utils.js";
|
|
6
10
|
import { useFieldRootContext } from "../root/FieldRootContext.js";
|
|
7
11
|
import { useLabelableContext } from "../../labelable-provider/LabelableContext.js";
|
|
@@ -20,6 +24,7 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
|
|
|
20
24
|
render,
|
|
21
25
|
className,
|
|
22
26
|
id: idProp,
|
|
27
|
+
nativeLabel = true,
|
|
23
28
|
...elementProps
|
|
24
29
|
} = componentProps;
|
|
25
30
|
const fieldRootContext = useFieldRootContext(false);
|
|
@@ -30,6 +35,45 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
|
|
|
30
35
|
} = useLabelableContext();
|
|
31
36
|
const id = useBaseUiId(idProp);
|
|
32
37
|
const labelRef = React.useRef(null);
|
|
38
|
+
const handleInteraction = useStableCallback(event => {
|
|
39
|
+
const target = getTarget(event.nativeEvent);
|
|
40
|
+
if (target?.closest('button,input,select,textarea')) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Prevent text selection when double clicking label.
|
|
45
|
+
if (!event.defaultPrevented && event.detail > 1) {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
}
|
|
48
|
+
if (nativeLabel || !controlId) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const controlElement = ownerDocument(event.currentTarget).getElementById(controlId);
|
|
52
|
+
if (isHTMLElement(controlElement)) {
|
|
53
|
+
controlElement.focus({
|
|
54
|
+
// Available from Chrome 144+ (January 2026).
|
|
55
|
+
// Safari and Firefox already support it.
|
|
56
|
+
// @ts-expect-error not available in types yet
|
|
57
|
+
focusVisible: true
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
62
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
if (!labelRef.current) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const isLabelTag = labelRef.current.tagName === 'LABEL';
|
|
68
|
+
if (nativeLabel) {
|
|
69
|
+
if (!isLabelTag) {
|
|
70
|
+
error('<Field.Label> was not rendered as a <label> element, which does not match the `nativeLabel` prop on the component. Ensure that the element passed to the `render` prop of <Field.Label> is a real <label>, or set the `nativeLabel` prop on the component to `false`.');
|
|
71
|
+
}
|
|
72
|
+
} else if (isLabelTag) {
|
|
73
|
+
error('<Field.Label> was rendered as a <label> element, which does not match the `nativeLabel` prop on the component. Ensure that the element passed to the `render` prop of <Field.Label> is not a real <label>, or set the `nativeLabel` prop on the component to `true`.');
|
|
74
|
+
}
|
|
75
|
+
}, [nativeLabel]);
|
|
76
|
+
}
|
|
33
77
|
useIsoLayoutEffect(() => {
|
|
34
78
|
if (id) {
|
|
35
79
|
setLabelId(id);
|
|
@@ -42,18 +86,14 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
|
|
|
42
86
|
ref: [forwardedRef, labelRef],
|
|
43
87
|
state: fieldRootContext.state,
|
|
44
88
|
props: [{
|
|
45
|
-
id: labelId
|
|
89
|
+
id: labelId
|
|
90
|
+
}, nativeLabel ? {
|
|
46
91
|
htmlFor: controlId ?? undefined,
|
|
47
|
-
onMouseDown
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Prevent text selection when double clicking label.
|
|
54
|
-
if (!event.defaultPrevented && event.detail > 1) {
|
|
55
|
-
event.preventDefault();
|
|
56
|
-
}
|
|
92
|
+
onMouseDown: handleInteraction
|
|
93
|
+
} : {
|
|
94
|
+
onClick: handleInteraction,
|
|
95
|
+
onPointerDown(event) {
|
|
96
|
+
event.preventDefault();
|
|
57
97
|
}
|
|
58
98
|
}, elementProps],
|
|
59
99
|
stateAttributesMapping: fieldValidityMapping
|
|
@@ -7,7 +7,7 @@ import { BaseUIComponentProps } from "../../utils/types.js";
|
|
|
7
7
|
*
|
|
8
8
|
* Documentation: [Base UI Field](https://base-ui.com/react/components/field)
|
|
9
9
|
*/
|
|
10
|
-
export declare const FieldRoot: React.ForwardRefExoticComponent<FieldRootProps & React.RefAttributes<HTMLDivElement>>;
|
|
10
|
+
export declare const FieldRoot: React.ForwardRefExoticComponent<Omit<FieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
11
11
|
export interface FieldValidityData {
|
|
12
12
|
state: {
|
|
13
13
|
badInput: boolean;
|
|
@@ -27,6 +27,9 @@ export interface FieldValidityData {
|
|
|
27
27
|
value: unknown;
|
|
28
28
|
initialValue: unknown;
|
|
29
29
|
}
|
|
30
|
+
export interface FieldRootActions {
|
|
31
|
+
validate: () => void;
|
|
32
|
+
}
|
|
30
33
|
export interface FieldRootState {
|
|
31
34
|
/** Whether the component should ignore user interaction. */
|
|
32
35
|
disabled: boolean;
|
|
@@ -87,8 +90,14 @@ export interface FieldRootProps extends BaseUIComponentProps<'div', FieldRoot.St
|
|
|
87
90
|
* Useful when the field state is controlled by an external library.
|
|
88
91
|
*/
|
|
89
92
|
touched?: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* A ref to imperative actions.
|
|
95
|
+
* - `validate`: Validates the field when called.
|
|
96
|
+
*/
|
|
97
|
+
actionsRef?: React.RefObject<FieldRoot.Actions | null>;
|
|
90
98
|
}
|
|
91
99
|
export declare namespace FieldRoot {
|
|
92
100
|
type State = FieldRootState;
|
|
93
101
|
type Props = FieldRootProps;
|
|
102
|
+
type Actions = FieldRootActions;
|
|
94
103
|
}
|
|
@@ -31,6 +31,7 @@ const FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(com
|
|
|
31
31
|
invalid: invalidProp,
|
|
32
32
|
dirty: dirtyProp,
|
|
33
33
|
touched: touchedProp,
|
|
34
|
+
actionsRef,
|
|
34
35
|
...elementProps
|
|
35
36
|
} = componentProps;
|
|
36
37
|
const {
|
|
@@ -89,6 +90,13 @@ const FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(com
|
|
|
89
90
|
name,
|
|
90
91
|
shouldValidateOnChange
|
|
91
92
|
});
|
|
93
|
+
const handleImperativeValidate = React.useCallback(() => {
|
|
94
|
+
markedDirtyRef.current = true;
|
|
95
|
+
validation.commit(validityData.value);
|
|
96
|
+
}, [validation, validityData]);
|
|
97
|
+
React.useImperativeHandle(actionsRef, () => ({
|
|
98
|
+
validate: handleImperativeValidate
|
|
99
|
+
}), [handleImperativeValidate]);
|
|
92
100
|
const contextValue = React.useMemo(() => ({
|
|
93
101
|
invalid,
|
|
94
102
|
name,
|
package/esm/field/useField.js
CHANGED
|
@@ -47,14 +47,18 @@ export function useField(params) {
|
|
|
47
47
|
name,
|
|
48
48
|
controlRef,
|
|
49
49
|
validityData: getCombinedFieldValidityData(validityData, invalid),
|
|
50
|
-
validate() {
|
|
50
|
+
validate(flushSync = true) {
|
|
51
51
|
let nextValue = value;
|
|
52
52
|
if (nextValue === undefined) {
|
|
53
53
|
nextValue = getValue();
|
|
54
54
|
}
|
|
55
55
|
markedDirtyRef.current = true;
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
if (!flushSync) {
|
|
57
|
+
commit(nextValue);
|
|
58
|
+
} else {
|
|
59
|
+
// Synchronously update the validity state so the submit event can be prevented.
|
|
60
|
+
ReactDOM.flushSync(() => commit(nextValue));
|
|
61
|
+
}
|
|
58
62
|
}
|
|
59
63
|
});
|
|
60
64
|
}, [commit, controlRef, enabled, formRef, getValue, id, invalid, markedDirtyRef, name, validityData, value]);
|
|
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
|
|
|
6
6
|
*
|
|
7
7
|
* Documentation: [Base UI Fieldset](https://base-ui.com/react/components/fieldset)
|
|
8
8
|
*/
|
|
9
|
-
export declare const FieldsetLegend: React.ForwardRefExoticComponent<FieldsetLegendProps & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
export declare const FieldsetLegend: React.ForwardRefExoticComponent<Omit<FieldsetLegendProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
10
10
|
export interface FieldsetLegendState {
|
|
11
11
|
/**
|
|
12
12
|
* Whether the component should ignore user interaction.
|
|
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
|
|
|
6
6
|
*
|
|
7
7
|
* Documentation: [Base UI Fieldset](https://base-ui.com/react/components/fieldset)
|
|
8
8
|
*/
|
|
9
|
-
export declare const FieldsetRoot: React.ForwardRefExoticComponent<FieldsetRootProps & React.RefAttributes<HTMLElement>>;
|
|
9
|
+
export declare const FieldsetRoot: React.ForwardRefExoticComponent<Omit<FieldsetRootProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
10
10
|
export interface FieldsetRootState {
|
|
11
11
|
/**
|
|
12
12
|
* Whether the component should ignore user interaction.
|
|
@@ -156,6 +156,10 @@ export function FloatingFocusManager(props) {
|
|
|
156
156
|
const tabbableIndexRef = React.useRef(-1);
|
|
157
157
|
const closeTypeRef = React.useRef('');
|
|
158
158
|
const lastInteractionTypeRef = React.useRef('');
|
|
159
|
+
const beforeGuardRef = React.useRef(null);
|
|
160
|
+
const afterGuardRef = React.useRef(null);
|
|
161
|
+
const mergedBeforeGuardRef = useMergedRefs(beforeGuardRef, beforeContentFocusGuardRef, portalContext?.beforeInsideRef);
|
|
162
|
+
const mergedAfterGuardRef = useMergedRefs(afterGuardRef, portalContext?.afterInsideRef);
|
|
159
163
|
const blurTimeout = useTimeout();
|
|
160
164
|
const pointerDownTimeout = useTimeout();
|
|
161
165
|
const restoreFocusFrame = useAnimationFrame();
|
|
@@ -261,7 +265,8 @@ export function FloatingFocusManager(props) {
|
|
|
261
265
|
queueMicrotask(() => {
|
|
262
266
|
const nodeId = getNodeId();
|
|
263
267
|
const triggers = store.context.triggerElements;
|
|
264
|
-
const
|
|
268
|
+
const isRelatedFocusGuard = relatedTarget?.hasAttribute(createAttribute('focus-guard')) && [beforeGuardRef.current, afterGuardRef.current, portalContext?.beforeInsideRef.current, portalContext?.afterInsideRef.current, portalContext?.beforeOutsideRef.current, portalContext?.afterOutsideRef.current, resolveRef(previousFocusableElement), resolveRef(nextFocusableElement)].includes(relatedTarget);
|
|
269
|
+
const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext?.portalNode, relatedTarget) || relatedTarget != null && triggers.hasElement(relatedTarget) || triggers.hasMatchingElement(trigger => contains(trigger, relatedTarget)) || isRelatedFocusGuard || tree && (getNodeChildren(tree.nodesRef.current, nodeId).find(node => contains(node.context?.elements.floating, relatedTarget) || contains(node.context?.elements.domReference, relatedTarget)) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => [node.context?.elements.floating, getFloatingFocusElement(node.context?.elements.floating)].includes(relatedTarget) || node.context?.elements.domReference === relatedTarget)));
|
|
265
270
|
if (currentTarget === domReference && floatingFocusElement) {
|
|
266
271
|
handleTabIndex(floatingFocusElement, orderRef);
|
|
267
272
|
}
|
|
@@ -355,11 +360,7 @@ export function FloatingFocusManager(props) {
|
|
|
355
360
|
cleanup();
|
|
356
361
|
});
|
|
357
362
|
};
|
|
358
|
-
}, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, store, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef, blurTimeout, pointerDownTimeout, restoreFocusFrame]);
|
|
359
|
-
const beforeGuardRef = React.useRef(null);
|
|
360
|
-
const afterGuardRef = React.useRef(null);
|
|
361
|
-
const mergedBeforeGuardRef = useMergedRefs(beforeGuardRef, beforeContentFocusGuardRef, portalContext?.beforeInsideRef);
|
|
362
|
-
const mergedAfterGuardRef = useMergedRefs(afterGuardRef, portalContext?.afterInsideRef);
|
|
363
|
+
}, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, store, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef, blurTimeout, pointerDownTimeout, restoreFocusFrame, nextFocusableElement, previousFocusableElement]);
|
|
363
364
|
React.useEffect(() => {
|
|
364
365
|
if (disabled || !floating || !open) {
|
|
365
366
|
return undefined;
|
|
@@ -40,9 +40,9 @@ export declare function useFloatingPortalNode(props?: UseFloatingPortalNodeProps
|
|
|
40
40
|
* @see https://floating-ui.com/docs/FloatingPortal
|
|
41
41
|
* @internal
|
|
42
42
|
*/
|
|
43
|
-
export declare const FloatingPortal: React.ForwardRefExoticComponent<FloatingPortal.Props<any> & {
|
|
43
|
+
export declare const FloatingPortal: React.ForwardRefExoticComponent<Omit<FloatingPortal.Props<any> & {
|
|
44
44
|
renderGuards?: boolean;
|
|
45
|
-
} & React.RefAttributes<HTMLDivElement>>;
|
|
45
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
46
46
|
export declare namespace FloatingPortal {
|
|
47
47
|
interface Props<State> extends BaseUIComponentProps<'div', State> {
|
|
48
48
|
/**
|
|
@@ -5,6 +5,7 @@ import * as ReactDOM from 'react-dom';
|
|
|
5
5
|
import { isNode } from '@floating-ui/utils/dom';
|
|
6
6
|
import { useId } from '@base-ui/utils/useId';
|
|
7
7
|
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
|
|
8
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
8
9
|
import { FocusGuard } from "../../utils/FocusGuard.js";
|
|
9
10
|
import { enableFocusInside, disableFocusInside, getPreviousTabbable, getNextTabbable, isOutsideEvent } from "../utils.js";
|
|
10
11
|
import { createChangeEventDetails } from "../../utils/createBaseUIEventDetails.js";
|
|
@@ -30,6 +31,14 @@ export function useFloatingPortalNode(props = {}) {
|
|
|
30
31
|
const parentPortalNode = portalContext?.portalNode;
|
|
31
32
|
const [containerElement, setContainerElement] = React.useState(null);
|
|
32
33
|
const [portalNode, setPortalNode] = React.useState(null);
|
|
34
|
+
const setPortalNodeRef = useStableCallback(node => {
|
|
35
|
+
if (node !== null) {
|
|
36
|
+
// the useIsoLayoutEffect below watching containerProp / parentPortalNode
|
|
37
|
+
// sets setPortalNode(null) when the container becomes null or changes.
|
|
38
|
+
// So even though the ref callback now ignores null, the portal node still gets cleared.
|
|
39
|
+
setPortalNode(node);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
33
42
|
const containerRef = React.useRef(null);
|
|
34
43
|
useIsoLayoutEffect(() => {
|
|
35
44
|
// Wait for the container to be resolved if explicitly `null`.
|
|
@@ -62,7 +71,7 @@ export function useFloatingPortalNode(props = {}) {
|
|
|
62
71
|
}
|
|
63
72
|
}, [containerProp, parentPortalNode, uniqueId]);
|
|
64
73
|
const portalElement = useRenderElement('div', componentProps, {
|
|
65
|
-
ref: [ref,
|
|
74
|
+
ref: [ref, setPortalNodeRef],
|
|
66
75
|
state: elementState,
|
|
67
76
|
props: [{
|
|
68
77
|
id: uniqueId,
|
|
@@ -125,7 +134,7 @@ export const FloatingPortal = /*#__PURE__*/React.forwardRef(function FloatingPor
|
|
|
125
134
|
// portal has already been focused, either by tabbing into a focus trap
|
|
126
135
|
// element outside or using the mouse.
|
|
127
136
|
function onFocus(event) {
|
|
128
|
-
if (portalNode && isOutsideEvent(event)) {
|
|
137
|
+
if (portalNode && event.relatedTarget && isOutsideEvent(event)) {
|
|
129
138
|
const focusing = event.type === 'focusin';
|
|
130
139
|
const manageFocus = focusing ? enableFocusInside : disableFocusInside;
|
|
131
140
|
manageFocus(portalNode);
|
|
@@ -80,7 +80,7 @@ export function useClientPoint(context, props = {}) {
|
|
|
80
80
|
const cleanupListenerRef = React.useRef(null);
|
|
81
81
|
const [pointerType, setPointerType] = React.useState();
|
|
82
82
|
const [reactive, setReactive] = React.useState([]);
|
|
83
|
-
const setReference = useStableCallback((newX, newY) => {
|
|
83
|
+
const setReference = useStableCallback((newX, newY, referenceElement) => {
|
|
84
84
|
if (initialRef.current) {
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
@@ -91,7 +91,7 @@ export function useClientPoint(context, props = {}) {
|
|
|
91
91
|
if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
|
-
store.set('positionReference', createVirtualElement(domReference, {
|
|
94
|
+
store.set('positionReference', createVirtualElement(referenceElement ?? domReference, {
|
|
95
95
|
x: newX,
|
|
96
96
|
y: newY,
|
|
97
97
|
axis,
|
|
@@ -104,7 +104,7 @@ export function useClientPoint(context, props = {}) {
|
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
106
|
if (!open) {
|
|
107
|
-
setReference(event.clientX, event.clientY);
|
|
107
|
+
setReference(event.clientX, event.clientY, event.currentTarget);
|
|
108
108
|
} else if (!cleanupListenerRef.current) {
|
|
109
109
|
// If there's no cleanup, there's no listener, but we want to ensure
|
|
110
110
|
// we add the listener if the cursor landed on the floating element and
|
|
@@ -176,6 +176,7 @@ export function useClientPoint(context, props = {}) {
|
|
|
176
176
|
};
|
|
177
177
|
}, [handleReferenceEnterOrMove]);
|
|
178
178
|
return React.useMemo(() => enabled ? {
|
|
179
|
-
reference
|
|
179
|
+
reference,
|
|
180
|
+
trigger: reference
|
|
180
181
|
} : {}, [enabled, reference]);
|
|
181
182
|
}
|
|
@@ -385,6 +385,7 @@ export function useDismiss(context, props = {}) {
|
|
|
385
385
|
ancestor.removeEventListener('scroll', onScroll);
|
|
386
386
|
});
|
|
387
387
|
compositionTimeout.clear();
|
|
388
|
+
endedOrStartedInsideRef.current = false;
|
|
388
389
|
};
|
|
389
390
|
}, [dataRef, floatingElement, referenceElement, domReferenceElement, escapeKey, outsidePress, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, closeOnPressOutside, closeOnPressOutsideCapture, handlePointerDown, handleTouchStartCapture, handleTouchMoveCapture, handleTouchEndCapture, trackPointerType, store]);
|
|
390
391
|
React.useEffect(clearInsideReactTree, [outsidePress, clearInsideReactTree]);
|
|
@@ -408,6 +409,12 @@ export function useDismiss(context, props = {}) {
|
|
|
408
409
|
}
|
|
409
410
|
endedOrStartedInsideRef.current = true;
|
|
410
411
|
});
|
|
412
|
+
const markPressStartedInsideReactTree = useStableCallback(event => {
|
|
413
|
+
if (!open || !enabled || event.button !== 0) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
endedOrStartedInsideRef.current = true;
|
|
417
|
+
});
|
|
411
418
|
const floating = React.useMemo(() => ({
|
|
412
419
|
onKeyDown: closeOnEscapeKeyDown,
|
|
413
420
|
// `onMouseDown` may be blocked if `event.preventDefault()` is called in
|
|
@@ -417,12 +424,18 @@ export function useDismiss(context, props = {}) {
|
|
|
417
424
|
onMouseDown: handlePressedInside,
|
|
418
425
|
onMouseUp: handlePressedInside,
|
|
419
426
|
onClickCapture: markInsideReactTree,
|
|
420
|
-
onMouseDownCapture
|
|
421
|
-
|
|
427
|
+
onMouseDownCapture(event) {
|
|
428
|
+
markInsideReactTree();
|
|
429
|
+
markPressStartedInsideReactTree(event);
|
|
430
|
+
},
|
|
431
|
+
onPointerDownCapture(event) {
|
|
432
|
+
markInsideReactTree();
|
|
433
|
+
markPressStartedInsideReactTree(event);
|
|
434
|
+
},
|
|
422
435
|
onMouseUpCapture: markInsideReactTree,
|
|
423
436
|
onTouchEndCapture: markInsideReactTree,
|
|
424
437
|
onTouchMoveCapture: markInsideReactTree
|
|
425
|
-
}), [closeOnEscapeKeyDown, handlePressedInside, markInsideReactTree]);
|
|
438
|
+
}), [closeOnEscapeKeyDown, handlePressedInside, markInsideReactTree, markPressStartedInsideReactTree]);
|
|
426
439
|
return React.useMemo(() => enabled ? {
|
|
427
440
|
reference,
|
|
428
441
|
floating,
|
|
@@ -12,6 +12,11 @@ export interface UseFocusProps {
|
|
|
12
12
|
* @default true
|
|
13
13
|
*/
|
|
14
14
|
visibleOnly?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Waits for the specified time before opening.
|
|
17
|
+
* @default undefined
|
|
18
|
+
*/
|
|
19
|
+
delay?: number | (() => number | undefined);
|
|
15
20
|
}
|
|
16
21
|
/**
|
|
17
22
|
* Opens the floating element while the reference element has focus, like CSS
|
|
@@ -20,9 +20,12 @@ export function useFocus(context, props = {}) {
|
|
|
20
20
|
} = store.context;
|
|
21
21
|
const {
|
|
22
22
|
enabled = true,
|
|
23
|
-
visibleOnly = true
|
|
23
|
+
visibleOnly = true,
|
|
24
|
+
delay
|
|
24
25
|
} = props;
|
|
25
26
|
const blockFocusRef = React.useRef(false);
|
|
27
|
+
// Track which reference should be blocked from re-opening after Escape/press dismissal.
|
|
28
|
+
const blockedReferenceRef = React.useRef(null);
|
|
26
29
|
const timeout = useTimeout();
|
|
27
30
|
const keyboardModalityRef = React.useRef(true);
|
|
28
31
|
React.useEffect(() => {
|
|
@@ -36,7 +39,8 @@ export function useFocus(context, props = {}) {
|
|
|
36
39
|
// floating element was not open, the focus should be blocked when they
|
|
37
40
|
// return to the tab/window.
|
|
38
41
|
function onBlur() {
|
|
39
|
-
|
|
42
|
+
const currentDomReference = store.select('domReferenceElement');
|
|
43
|
+
if (!store.select('open') && isHTMLElement(currentDomReference) && currentDomReference === activeElement(getDocument(currentDomReference))) {
|
|
40
44
|
blockFocusRef.current = true;
|
|
41
45
|
}
|
|
42
46
|
}
|
|
@@ -65,21 +69,31 @@ export function useFocus(context, props = {}) {
|
|
|
65
69
|
}
|
|
66
70
|
function onOpenChangeLocal(details) {
|
|
67
71
|
if (details.reason === REASONS.triggerPress || details.reason === REASONS.escapeKey) {
|
|
68
|
-
|
|
72
|
+
const referenceElement = store.select('domReferenceElement');
|
|
73
|
+
if (isElement(referenceElement)) {
|
|
74
|
+
blockedReferenceRef.current = referenceElement;
|
|
75
|
+
blockFocusRef.current = true;
|
|
76
|
+
}
|
|
69
77
|
}
|
|
70
78
|
}
|
|
71
79
|
events.on('openchange', onOpenChangeLocal);
|
|
72
80
|
return () => {
|
|
73
81
|
events.off('openchange', onOpenChangeLocal);
|
|
74
82
|
};
|
|
75
|
-
}, [events, enabled]);
|
|
83
|
+
}, [events, enabled, store]);
|
|
76
84
|
const reference = React.useMemo(() => ({
|
|
77
85
|
onMouseLeave() {
|
|
78
86
|
blockFocusRef.current = false;
|
|
87
|
+
blockedReferenceRef.current = null;
|
|
79
88
|
},
|
|
80
89
|
onFocus(event) {
|
|
90
|
+
const focusTarget = event.currentTarget;
|
|
81
91
|
if (blockFocusRef.current) {
|
|
82
|
-
|
|
92
|
+
if (blockedReferenceRef.current === focusTarget) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
blockFocusRef.current = false;
|
|
96
|
+
blockedReferenceRef.current = null;
|
|
83
97
|
}
|
|
84
98
|
const target = getTarget(event.nativeEvent);
|
|
85
99
|
if (visibleOnly && isElement(target)) {
|
|
@@ -93,10 +107,26 @@ export function useFocus(context, props = {}) {
|
|
|
93
107
|
return;
|
|
94
108
|
}
|
|
95
109
|
}
|
|
96
|
-
|
|
110
|
+
const movedFromOtherTrigger = event.relatedTarget && store.context.triggerElements.hasElement(event.relatedTarget);
|
|
111
|
+
const {
|
|
112
|
+
nativeEvent,
|
|
113
|
+
currentTarget
|
|
114
|
+
} = event;
|
|
115
|
+
const delayValue = typeof delay === 'function' ? delay() : delay;
|
|
116
|
+
if (store.select('open') && movedFromOtherTrigger || delayValue === 0 || delayValue === undefined) {
|
|
117
|
+
store.setOpen(true, createChangeEventDetails(REASONS.triggerFocus, nativeEvent, currentTarget));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
timeout.start(delayValue, () => {
|
|
121
|
+
if (blockFocusRef.current) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
store.setOpen(true, createChangeEventDetails(REASONS.triggerFocus, nativeEvent, currentTarget));
|
|
125
|
+
});
|
|
97
126
|
},
|
|
98
127
|
onBlur(event) {
|
|
99
128
|
blockFocusRef.current = false;
|
|
129
|
+
blockedReferenceRef.current = null;
|
|
100
130
|
const relatedTarget = event.relatedTarget;
|
|
101
131
|
const nativeEvent = event.nativeEvent;
|
|
102
132
|
|
|
@@ -128,13 +158,17 @@ export function useFocus(context, props = {}) {
|
|
|
128
158
|
// If the next focused element is one of the triggers, do not close
|
|
129
159
|
// the floating element. The focus handler of that trigger will
|
|
130
160
|
// handle the open state.
|
|
131
|
-
|
|
132
|
-
|
|
161
|
+
const nextFocusedElement = relatedTarget ?? activeEl;
|
|
162
|
+
if (isElement(nextFocusedElement)) {
|
|
163
|
+
const triggerElements = store.context.triggerElements;
|
|
164
|
+
if (triggerElements.hasElement(nextFocusedElement) || triggerElements.hasMatchingElement(trigger => contains(trigger, nextFocusedElement))) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
133
167
|
}
|
|
134
168
|
store.setOpen(false, createChangeEventDetails(REASONS.triggerFocus, nativeEvent));
|
|
135
169
|
});
|
|
136
170
|
}
|
|
137
|
-
}), [dataRef, store, visibleOnly, timeout]);
|
|
171
|
+
}), [dataRef, store, visibleOnly, timeout, delay]);
|
|
138
172
|
return React.useMemo(() => enabled ? {
|
|
139
173
|
reference,
|
|
140
174
|
trigger: reference
|
|
@@ -158,8 +158,13 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
158
158
|
const allTriggers = store.context.triggerElements;
|
|
159
159
|
const isOverInactiveTrigger = (allTriggers.hasElement(event.target) || allTriggers.hasMatchingElement(t => contains(t, event.target))) && (!currentDomReference || !contains(currentDomReference, event.target));
|
|
160
160
|
const triggerNode = event.currentTarget ?? null;
|
|
161
|
-
const
|
|
162
|
-
|
|
161
|
+
const isOpen = store.select('open');
|
|
162
|
+
const shouldOpen = !isOpen || isOverInactiveTrigger;
|
|
163
|
+
|
|
164
|
+
// When moving between triggers while already open, open immediately without delay
|
|
165
|
+
if (isOverInactiveTrigger && isOpen) {
|
|
166
|
+
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
|
|
167
|
+
} else if (openDelay) {
|
|
163
168
|
openChangeTimeout.start(openDelay, () => {
|
|
164
169
|
if (shouldOpen) {
|
|
165
170
|
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
|
|
@@ -263,7 +268,15 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
263
268
|
}
|
|
264
269
|
restTimeout.clear();
|
|
265
270
|
function handleMouseMove() {
|
|
266
|
-
|
|
271
|
+
restTimeoutPendingRef.current = false;
|
|
272
|
+
|
|
273
|
+
// A delayed hover open should not override a click-like open that happened
|
|
274
|
+
// while the hover delay was pending.
|
|
275
|
+
if (isClickLikeOpenEvent()) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const latestOpen = store.select('open');
|
|
279
|
+
if (!blockMouseMoveRef.current && (!latestOpen || isOverInactiveTrigger)) {
|
|
267
280
|
store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, nativeEvent, trigger));
|
|
268
281
|
}
|
|
269
282
|
}
|
|
@@ -279,5 +292,5 @@ export function useHoverReferenceInteraction(context, props = {}) {
|
|
|
279
292
|
}
|
|
280
293
|
}
|
|
281
294
|
};
|
|
282
|
-
}, [blockMouseMoveRef, mouseOnly, store, pointerTypeRef, restMsRef, restTimeout, restTimeoutPendingRef]);
|
|
295
|
+
}, [blockMouseMoveRef, isClickLikeOpenEvent, mouseOnly, store, pointerTypeRef, restMsRef, restTimeout, restTimeoutPendingRef]);
|
|
283
296
|
}
|
|
@@ -41,6 +41,9 @@ export function useSyncedFloatingRootContext(options) {
|
|
|
41
41
|
if (isElement(referenceElement)) {
|
|
42
42
|
valuesToSync.domReferenceElement = referenceElement;
|
|
43
43
|
}
|
|
44
|
+
if (store.state.positionReference === store.state.referenceElement) {
|
|
45
|
+
valuesToSync.positionReference = referenceElement;
|
|
46
|
+
}
|
|
44
47
|
store.update(valuesToSync);
|
|
45
48
|
}, [open, floatingId, referenceElement, floatingElement, store]);
|
|
46
49
|
|
package/esm/form/Form.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export declare const Form: {
|
|
|
16
16
|
};
|
|
17
17
|
export type FormSubmitEventReason = typeof REASONS.none;
|
|
18
18
|
export type FormSubmitEventDetails = BaseUIGenericEventDetails<Form.SubmitEventReason>;
|
|
19
|
+
export type FormValidationMode = 'onSubmit' | 'onBlur' | 'onChange';
|
|
20
|
+
export interface FormActions {
|
|
21
|
+
validate: (fieldName?: string | undefined) => void;
|
|
22
|
+
}
|
|
19
23
|
export interface FormState {}
|
|
20
24
|
export interface FormProps<FormValues extends Record<string, any> = Record<string, any>> extends BaseUIComponentProps<'form', Form.State> {
|
|
21
25
|
/**
|
|
@@ -40,11 +44,24 @@ export interface FormProps<FormValues extends Record<string, any> = Record<strin
|
|
|
40
44
|
* `preventDefault()` is called on the native submit event when used.
|
|
41
45
|
*/
|
|
42
46
|
onFormSubmit?: (formValues: FormValues, eventDetails: Form.SubmitEventDetails) => void;
|
|
47
|
+
/**
|
|
48
|
+
* A ref to imperative actions.
|
|
49
|
+
* - `validate`: Validates all fields when called. Optionally pass a field name to validate a single field.
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* // validate all fields
|
|
53
|
+
* actionsRef.current.validate();
|
|
54
|
+
*
|
|
55
|
+
* // validate one field
|
|
56
|
+
* actionsRef.current.validate('email');
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
actionsRef?: React.RefObject<Form.Actions | null>;
|
|
43
60
|
}
|
|
44
|
-
export type FormValidationMode = 'onSubmit' | 'onBlur' | 'onChange';
|
|
45
61
|
export declare namespace Form {
|
|
46
62
|
type Props<FormValues extends Record<string, any> = Record<string, any>> = FormProps<FormValues>;
|
|
47
63
|
type State = FormState;
|
|
64
|
+
type Actions = FormActions;
|
|
48
65
|
type ValidationMode = FormValidationMode;
|
|
49
66
|
type SubmitEventReason = FormSubmitEventReason;
|
|
50
67
|
type SubmitEventDetails = FormSubmitEventDetails;
|
package/esm/form/Form.js
CHANGED
|
@@ -24,6 +24,7 @@ export const Form = /*#__PURE__*/React.forwardRef(function Form(componentProps,
|
|
|
24
24
|
errors: externalErrors,
|
|
25
25
|
onSubmit,
|
|
26
26
|
onFormSubmit,
|
|
27
|
+
actionsRef,
|
|
27
28
|
...elementProps
|
|
28
29
|
} = componentProps;
|
|
29
30
|
const formRef = React.useRef({
|
|
@@ -54,6 +55,22 @@ export const Form = /*#__PURE__*/React.forwardRef(function Form(componentProps,
|
|
|
54
55
|
focusControl(invalidFields[0].controlRef.current);
|
|
55
56
|
}
|
|
56
57
|
}, [errors, focusControl]);
|
|
58
|
+
const handleImperativeValidate = React.useCallback(fieldName => {
|
|
59
|
+
const values = Array.from(formRef.current.fields.values());
|
|
60
|
+
if (fieldName) {
|
|
61
|
+
const namedField = values.find(field => field.name === fieldName);
|
|
62
|
+
if (namedField) {
|
|
63
|
+
namedField.validate(false);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
values.forEach(field => {
|
|
67
|
+
field.validate(false);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}, []);
|
|
71
|
+
React.useImperativeHandle(actionsRef, () => ({
|
|
72
|
+
validate: handleImperativeValidate
|
|
73
|
+
}), [handleImperativeValidate]);
|
|
57
74
|
const element = useRenderElement('form', componentProps, {
|
|
58
75
|
ref: forwardedRef,
|
|
59
76
|
props: [{
|
|
@@ -8,7 +8,7 @@ export interface FormContext {
|
|
|
8
8
|
formRef: React.RefObject<{
|
|
9
9
|
fields: Map<string, {
|
|
10
10
|
name: string | undefined;
|
|
11
|
-
validate: () => void;
|
|
11
|
+
validate: (flushSync?: boolean | undefined) => void;
|
|
12
12
|
validityData: FieldValidityData;
|
|
13
13
|
controlRef: React.RefObject<HTMLElement | null>;
|
|
14
14
|
getValue: () => unknown;
|
package/esm/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from "./checkbox-group/index.js";
|
|
|
8
8
|
export * from "./collapsible/index.js";
|
|
9
9
|
export * from "./combobox/index.js";
|
|
10
10
|
export * from "./context-menu/index.js";
|
|
11
|
+
export * from "./csp-provider/index.js";
|
|
11
12
|
export * from "./dialog/index.js";
|
|
12
13
|
export * from "./direction-provider/index.js";
|
|
13
14
|
export * from "./field/index.js";
|