@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.
Files changed (579) hide show
  1. package/CHANGELOG.md +125 -8
  2. package/README.md +1 -1
  3. package/accordion/item/AccordionItem.d.ts +4 -0
  4. package/accordion/item/AccordionItem.js +5 -4
  5. package/accordion/panel/AccordionPanel.js +29 -51
  6. package/accordion/root/AccordionRoot.js +5 -6
  7. package/accordion/trigger/AccordionTrigger.js +3 -4
  8. package/alert-dialog/handle.d.ts +14 -1
  9. package/alert-dialog/handle.js +22 -5
  10. package/alert-dialog/index.d.ts +1 -1
  11. package/alert-dialog/index.parts.d.ts +2 -3
  12. package/alert-dialog/index.parts.js +4 -5
  13. package/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  14. package/alert-dialog/root/AlertDialogRoot.js +2 -56
  15. package/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  16. package/alert-dialog/trigger/AlertDialogTrigger.js +15 -0
  17. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  18. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +18 -0
  19. package/autocomplete/root/AutocompleteRoot.js +9 -10
  20. package/avatar/image/AvatarImage.js +4 -4
  21. package/checkbox/indicator/CheckboxIndicator.js +2 -2
  22. package/checkbox/root/CheckboxRoot.js +49 -11
  23. package/checkbox-group/CheckboxGroup.js +1 -5
  24. package/collapsible/panel/CollapsiblePanel.js +29 -51
  25. package/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  26. package/collapsible/panel/useCollapsiblePanel.js +308 -268
  27. package/collapsible/root/CollapsibleRoot.d.ts +1 -1
  28. package/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  29. package/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  30. package/collapsible/root/useCollapsibleRoot.js +2 -64
  31. package/collapsible/trigger/CollapsibleTrigger.js +5 -6
  32. package/combobox/arrow/ComboboxArrow.js +1 -1
  33. package/combobox/backdrop/ComboboxBackdrop.js +1 -1
  34. package/combobox/chip/ComboboxChip.js +7 -2
  35. package/combobox/clear/ComboboxClear.d.ts +4 -0
  36. package/combobox/clear/ComboboxClear.js +1 -0
  37. package/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  38. package/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  39. package/combobox/icon/ComboboxIcon.js +1 -1
  40. package/combobox/input/ComboboxInput.js +15 -6
  41. package/combobox/item/ComboboxItem.js +8 -14
  42. package/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  43. package/combobox/root/AriaCombobox.js +61 -28
  44. package/combobox/store.d.ts +4 -8
  45. package/combobox/store.js +2 -1
  46. package/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  47. package/csp-provider/CSPProvider.js +1 -1
  48. package/dialog/close/DialogClose.js +6 -6
  49. package/dialog/popup/DialogPopup.js +9 -4
  50. package/dialog/root/DialogRoot.d.ts +1 -2
  51. package/dialog/root/DialogRoot.js +3 -73
  52. package/dialog/root/DialogRootContext.d.ts +1 -0
  53. package/dialog/root/DialogRootContext.js +3 -1
  54. package/dialog/root/useDialogRoot.d.ts +12 -4
  55. package/dialog/root/useDialogRoot.js +27 -25
  56. package/dialog/root/useRenderDialogRoot.d.ts +4 -0
  57. package/dialog/root/useRenderDialogRoot.js +96 -0
  58. package/dialog/store/DialogHandle.d.ts +1 -1
  59. package/dialog/store/DialogHandle.js +2 -2
  60. package/dialog/store/DialogStore.d.ts +88 -1
  61. package/dialog/store/DialogStore.js +12 -17
  62. package/dialog/trigger/DialogTrigger.d.ts +1 -1
  63. package/dialog/trigger/DialogTrigger.js +11 -4
  64. package/dialog/viewport/DialogViewport.js +4 -3
  65. package/drawer/popup/DrawerPopup.js +13 -9
  66. package/drawer/root/DrawerRoot.js +11 -11
  67. package/drawer/root/DrawerRootContext.d.ts +1 -1
  68. package/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  69. package/drawer/viewport/DrawerViewport.js +13 -14
  70. package/esm/accordion/item/AccordionItem.d.ts +4 -0
  71. package/esm/accordion/item/AccordionItem.js +5 -4
  72. package/esm/accordion/panel/AccordionPanel.js +29 -51
  73. package/esm/accordion/root/AccordionRoot.js +5 -6
  74. package/esm/accordion/trigger/AccordionTrigger.js +4 -5
  75. package/esm/alert-dialog/handle.d.ts +14 -1
  76. package/esm/alert-dialog/handle.js +20 -5
  77. package/esm/alert-dialog/index.d.ts +1 -1
  78. package/esm/alert-dialog/index.parts.d.ts +2 -3
  79. package/esm/alert-dialog/index.parts.js +2 -3
  80. package/esm/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  81. package/esm/alert-dialog/root/AlertDialogRoot.js +2 -55
  82. package/esm/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  83. package/esm/alert-dialog/trigger/AlertDialogTrigger.js +10 -0
  84. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  85. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +12 -0
  86. package/esm/autocomplete/root/AutocompleteRoot.js +9 -10
  87. package/esm/avatar/image/AvatarImage.js +4 -4
  88. package/esm/checkbox/indicator/CheckboxIndicator.js +2 -2
  89. package/esm/checkbox/root/CheckboxRoot.js +49 -11
  90. package/esm/checkbox-group/CheckboxGroup.js +1 -5
  91. package/esm/collapsible/panel/CollapsiblePanel.js +29 -51
  92. package/esm/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  93. package/esm/collapsible/panel/useCollapsiblePanel.js +309 -269
  94. package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
  95. package/esm/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  96. package/esm/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  97. package/esm/collapsible/root/useCollapsibleRoot.js +2 -64
  98. package/esm/collapsible/trigger/CollapsibleTrigger.js +5 -6
  99. package/esm/combobox/arrow/ComboboxArrow.js +1 -1
  100. package/esm/combobox/backdrop/ComboboxBackdrop.js +1 -1
  101. package/esm/combobox/chip/ComboboxChip.js +7 -2
  102. package/esm/combobox/clear/ComboboxClear.d.ts +4 -0
  103. package/esm/combobox/clear/ComboboxClear.js +1 -0
  104. package/esm/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  105. package/esm/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  106. package/esm/combobox/icon/ComboboxIcon.js +1 -1
  107. package/esm/combobox/input/ComboboxInput.js +16 -7
  108. package/esm/combobox/item/ComboboxItem.js +8 -14
  109. package/esm/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  110. package/esm/combobox/root/AriaCombobox.js +62 -29
  111. package/esm/combobox/store.d.ts +4 -8
  112. package/esm/combobox/store.js +2 -1
  113. package/esm/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  114. package/esm/csp-provider/CSPProvider.js +1 -1
  115. package/esm/dialog/close/DialogClose.js +6 -6
  116. package/esm/dialog/popup/DialogPopup.js +9 -4
  117. package/esm/dialog/root/DialogRoot.d.ts +1 -2
  118. package/esm/dialog/root/DialogRoot.js +4 -72
  119. package/esm/dialog/root/DialogRootContext.d.ts +1 -0
  120. package/esm/dialog/root/DialogRootContext.js +2 -0
  121. package/esm/dialog/root/useDialogRoot.d.ts +12 -4
  122. package/esm/dialog/root/useDialogRoot.js +28 -27
  123. package/esm/dialog/root/useRenderDialogRoot.d.ts +4 -0
  124. package/esm/dialog/root/useRenderDialogRoot.js +90 -0
  125. package/esm/dialog/store/DialogHandle.d.ts +1 -1
  126. package/esm/dialog/store/DialogHandle.js +2 -2
  127. package/esm/dialog/store/DialogStore.d.ts +88 -1
  128. package/esm/dialog/store/DialogStore.js +13 -18
  129. package/esm/dialog/trigger/DialogTrigger.d.ts +1 -1
  130. package/esm/dialog/trigger/DialogTrigger.js +12 -5
  131. package/esm/dialog/viewport/DialogViewport.js +4 -3
  132. package/esm/drawer/popup/DrawerPopup.js +14 -9
  133. package/esm/drawer/root/DrawerRoot.js +11 -11
  134. package/esm/drawer/root/DrawerRootContext.d.ts +1 -1
  135. package/esm/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  136. package/esm/drawer/viewport/DrawerViewport.js +13 -14
  137. package/esm/field/control/FieldControl.js +2 -6
  138. package/esm/field/item/FieldItem.js +1 -4
  139. package/esm/field/root/FieldRoot.js +11 -3
  140. package/esm/field/root/useFieldValidation.d.ts +1 -0
  141. package/esm/field/root/useFieldValidation.js +23 -20
  142. package/esm/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  143. package/esm/field/validity/FieldValidity.d.ts +1 -1
  144. package/esm/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  145. package/esm/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  146. package/esm/floating-ui-react/components/FloatingFocusManager.js +20 -8
  147. package/esm/floating-ui-react/components/FloatingPortal.js +3 -3
  148. package/esm/floating-ui-react/hooks/useClick.js +83 -74
  149. package/esm/floating-ui-react/hooks/useClientPoint.js +29 -20
  150. package/esm/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  151. package/esm/floating-ui-react/hooks/useDismiss.js +82 -93
  152. package/esm/floating-ui-react/hooks/useFloating.js +37 -32
  153. package/esm/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  154. package/esm/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  155. package/esm/floating-ui-react/hooks/useFocus.js +84 -81
  156. package/esm/floating-ui-react/hooks/useHover.js +72 -76
  157. package/esm/floating-ui-react/hooks/useHoverFloatingInteraction.js +49 -44
  158. package/esm/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  159. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  160. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +44 -39
  161. package/esm/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  162. package/esm/floating-ui-react/hooks/useHoverShared.js +4 -0
  163. package/esm/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  164. package/esm/floating-ui-react/hooks/useListNavigation.js +83 -74
  165. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  166. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +25 -20
  167. package/esm/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  168. package/esm/floating-ui-react/hooks/useTypeahead.js +33 -52
  169. package/esm/floating-ui-react/index.d.ts +0 -2
  170. package/esm/floating-ui-react/index.js +0 -2
  171. package/esm/floating-ui-react/types.d.ts +2 -7
  172. package/esm/floating-ui-react/utils/composite.js +2 -0
  173. package/esm/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  174. package/esm/floating-ui-react/utils/enqueueFocus.js +10 -7
  175. package/esm/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  176. package/esm/form/Form.js +2 -2
  177. package/esm/index.js +1 -1
  178. package/esm/internals/composite/composite.d.ts +0 -1
  179. package/esm/internals/composite/composite.js +1 -2
  180. package/esm/internals/composite/root/useCompositeRoot.js +2 -2
  181. package/esm/internals/createBaseUIEventDetails.d.ts +2 -0
  182. package/esm/internals/csp-context/index.d.ts +2 -0
  183. package/esm/internals/csp-context/index.js +1 -0
  184. package/esm/internals/field-register-control/index.d.ts +0 -1
  185. package/esm/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  186. package/esm/internals/field-register-control/useFieldControlRegistration.js +11 -14
  187. package/esm/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  188. package/esm/internals/field-register-control/useRegisterFieldControl.js +6 -11
  189. package/esm/internals/field-root-context/FieldRootContext.d.ts +1 -0
  190. package/esm/internals/field-root-context/FieldRootContext.js +3 -2
  191. package/esm/internals/form-context/FormContext.d.ts +5 -1
  192. package/esm/internals/reason-parts.d.ts +2 -0
  193. package/esm/internals/reason-parts.js +2 -0
  194. package/esm/internals/types.d.ts +1 -0
  195. package/esm/internals/use-button/useButton.js +4 -4
  196. package/esm/internals/usePressAndHold.js +2 -2
  197. package/esm/internals/useRenderElement.js +2 -0
  198. package/esm/menu/arrow/MenuArrow.js +1 -1
  199. package/esm/menu/backdrop/MenuBackdrop.js +1 -1
  200. package/esm/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  201. package/esm/menu/group/MenuGroup.js +1 -4
  202. package/esm/menu/group/MenuGroupContext.d.ts +1 -3
  203. package/esm/menu/group/MenuGroupContext.js +1 -1
  204. package/esm/menu/group-label/MenuGroupLabel.js +4 -6
  205. package/esm/menu/link-item/MenuLinkItem.js +2 -2
  206. package/esm/menu/popup/MenuPopup.js +5 -5
  207. package/esm/menu/radio-group/MenuRadioGroup.js +11 -5
  208. package/esm/menu/radio-item/MenuRadioItem.js +5 -7
  209. package/esm/menu/root/MenuRoot.js +63 -68
  210. package/esm/menu/store/MenuHandle.js +1 -1
  211. package/esm/menu/store/MenuStore.d.ts +87 -0
  212. package/esm/menu/submenu-trigger/MenuSubmenuTrigger.js +8 -5
  213. package/esm/menu/trigger/MenuTrigger.js +13 -10
  214. package/esm/menu/viewport/MenuViewport.d.ts +2 -2
  215. package/esm/menu/viewport/MenuViewport.js +2 -2
  216. package/esm/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  217. package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  218. package/esm/navigation-menu/content/NavigationMenuContent.js +8 -5
  219. package/esm/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  220. package/esm/navigation-menu/item/NavigationMenuItem.js +2 -2
  221. package/esm/navigation-menu/list/NavigationMenuList.js +1 -1
  222. package/esm/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  223. package/esm/navigation-menu/root/NavigationMenuRoot.js +1 -3
  224. package/esm/navigation-menu/trigger/NavigationMenuTrigger.js +24 -17
  225. package/esm/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  226. package/esm/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  227. package/esm/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  228. package/esm/number-field/input/NumberFieldInput.js +3 -5
  229. package/esm/number-field/root/NumberFieldRoot.js +5 -2
  230. package/esm/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  231. package/esm/otp-field/input/OTPFieldInput.js +43 -29
  232. package/esm/otp-field/root/OTPFieldRoot.d.ts +17 -8
  233. package/esm/otp-field/root/OTPFieldRoot.js +33 -33
  234. package/esm/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  235. package/esm/otp-field/utils/otp.d.ts +5 -4
  236. package/esm/otp-field/utils/otp.js +23 -12
  237. package/esm/popover/arrow/PopoverArrow.js +1 -1
  238. package/esm/popover/backdrop/PopoverBackdrop.js +1 -1
  239. package/esm/popover/close/PopoverClose.js +2 -2
  240. package/esm/popover/description/PopoverDescription.js +1 -7
  241. package/esm/popover/popup/PopoverPopup.d.ts +1 -1
  242. package/esm/popover/popup/PopoverPopup.js +16 -10
  243. package/esm/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  244. package/esm/popover/popup/PopoverPopupDataAttributes.js +1 -1
  245. package/esm/popover/positioner/PopoverPositioner.js +5 -5
  246. package/esm/popover/root/PopoverRoot.d.ts +1 -1
  247. package/esm/popover/root/PopoverRoot.js +42 -47
  248. package/esm/popover/store/PopoverHandle.js +1 -1
  249. package/esm/popover/store/PopoverStore.d.ts +91 -4
  250. package/esm/popover/store/PopoverStore.js +17 -18
  251. package/esm/popover/title/PopoverTitle.js +1 -7
  252. package/esm/popover/trigger/PopoverTrigger.js +24 -17
  253. package/esm/popover/viewport/PopoverViewport.d.ts +3 -3
  254. package/esm/popover/viewport/PopoverViewport.js +2 -2
  255. package/esm/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  256. package/esm/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  257. package/esm/preview-card/positioner/PreviewCardPositioner.js +11 -1
  258. package/esm/preview-card/root/PreviewCardRoot.d.ts +1 -1
  259. package/esm/preview-card/root/PreviewCardRoot.js +32 -22
  260. package/esm/preview-card/store/PreviewCardHandle.js +1 -1
  261. package/esm/preview-card/store/PreviewCardStore.d.ts +90 -2
  262. package/esm/preview-card/store/PreviewCardStore.js +19 -31
  263. package/esm/preview-card/trigger/PreviewCardTrigger.js +6 -3
  264. package/esm/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  265. package/esm/preview-card/viewport/PreviewCardViewport.js +2 -2
  266. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  267. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  268. package/esm/progress/indicator/ProgressIndicator.js +6 -11
  269. package/esm/progress/root/ProgressRoot.d.ts +1 -1
  270. package/esm/radio/root/RadioRoot.js +7 -3
  271. package/esm/radio-group/RadioGroup.js +4 -11
  272. package/esm/radio-group/RadioGroupContext.d.ts +0 -1
  273. package/esm/scroll-area/content/ScrollAreaContent.js +4 -4
  274. package/esm/scroll-area/root/ScrollAreaRoot.js +1 -1
  275. package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  276. package/esm/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  277. package/esm/select/arrow/SelectArrow.js +1 -1
  278. package/esm/select/backdrop/SelectBackdrop.js +1 -1
  279. package/esm/select/group/SelectGroup.js +1 -1
  280. package/esm/select/group-label/SelectGroupLabel.js +2 -2
  281. package/esm/select/icon/SelectIcon.js +1 -1
  282. package/esm/select/item/SelectItem.js +46 -32
  283. package/esm/select/item/SelectItemContext.d.ts +1 -1
  284. package/esm/select/item-indicator/SelectItemIndicator.js +1 -2
  285. package/esm/select/item-text/SelectItemText.js +9 -6
  286. package/esm/select/list/SelectList.js +1 -1
  287. package/esm/select/popup/SelectPopup.js +8 -3
  288. package/esm/select/positioner/SelectPositioner.js +3 -0
  289. package/esm/select/root/SelectRoot.js +46 -40
  290. package/esm/select/root/SelectRootContext.d.ts +4 -5
  291. package/esm/select/store.d.ts +3 -0
  292. package/esm/select/store.js +1 -0
  293. package/esm/select/trigger/SelectTrigger.d.ts +5 -0
  294. package/esm/select/trigger/SelectTrigger.js +19 -33
  295. package/esm/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  296. package/esm/select/trigger/SelectTriggerDataAttributes.js +5 -0
  297. package/esm/slider/control/SliderControl.js +10 -12
  298. package/esm/slider/root/SliderRoot.js +1 -4
  299. package/esm/slider/thumb/SliderThumb.js +32 -30
  300. package/esm/slider/value/SliderValue.js +7 -15
  301. package/esm/switch/root/SwitchRoot.js +10 -10
  302. package/esm/switch/thumb/SwitchThumb.js +1 -9
  303. package/esm/tabs/indicator/TabsIndicator.js +14 -19
  304. package/esm/tabs/list/TabsList.js +4 -10
  305. package/esm/tabs/list/TabsListContext.d.ts +2 -1
  306. package/esm/tabs/panel/TabsPanel.js +1 -1
  307. package/esm/tabs/root/TabsRoot.d.ts +16 -1
  308. package/esm/tabs/root/TabsRoot.js +73 -25
  309. package/esm/tabs/root/TabsRootContext.d.ts +0 -2
  310. package/esm/toast/provider/ToastProvider.js +1 -1
  311. package/esm/toast/root/ToastRoot.d.ts +1 -1
  312. package/esm/toast/root/ToastRoot.js +108 -131
  313. package/esm/toast/root/ToastRootDataAttributes.d.ts +1 -1
  314. package/esm/toast/root/ToastRootDataAttributes.js +1 -1
  315. package/esm/toast/store.d.ts +9 -1
  316. package/esm/toast/store.js +19 -13
  317. package/esm/toast/useToastManager.d.ts +1 -1
  318. package/esm/toast/viewport/ToastViewport.js +1 -1
  319. package/esm/toggle/Toggle.js +5 -9
  320. package/esm/toggle-group/ToggleGroup.d.ts +2 -2
  321. package/esm/toggle-group/ToggleGroup.js +6 -13
  322. package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
  323. package/esm/toolbar/link/ToolbarLink.js +1 -2
  324. package/esm/tooltip/arrow/TooltipArrow.js +3 -3
  325. package/esm/tooltip/popup/TooltipPopup.js +5 -4
  326. package/esm/tooltip/root/TooltipRoot.js +35 -26
  327. package/esm/tooltip/store/TooltipHandle.js +1 -1
  328. package/esm/tooltip/store/TooltipStore.d.ts +90 -2
  329. package/esm/tooltip/store/TooltipStore.js +18 -31
  330. package/esm/tooltip/trigger/TooltipTrigger.js +151 -20
  331. package/esm/tooltip/viewport/TooltipViewport.d.ts +2 -2
  332. package/esm/tooltip/viewport/TooltipViewport.js +2 -2
  333. package/esm/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  334. package/esm/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  335. package/esm/unstable-use-media-query/index.js +1 -1
  336. package/esm/utils/popups/index.d.ts +1 -0
  337. package/esm/utils/popups/index.js +1 -0
  338. package/esm/utils/popups/inlineRect.d.ts +15 -0
  339. package/esm/utils/popups/inlineRect.js +191 -0
  340. package/esm/utils/popups/popupStoreUtils.d.ts +28 -10
  341. package/esm/utils/popups/popupStoreUtils.js +105 -20
  342. package/esm/utils/popups/popupTriggerMap.js +2 -0
  343. package/esm/utils/popups/store.d.ts +15 -2
  344. package/esm/utils/popups/store.js +38 -2
  345. package/esm/utils/popups/useTriggerFocusGuards.js +4 -5
  346. package/esm/utils/useAnchorPositioning.d.ts +5 -0
  347. package/esm/utils/useAnchorPositioning.js +12 -9
  348. package/esm/utils/useOpenInteractionType.d.ts +4 -0
  349. package/esm/utils/useOpenInteractionType.js +23 -18
  350. package/field/control/FieldControl.js +2 -6
  351. package/field/item/FieldItem.js +1 -4
  352. package/field/root/FieldRoot.js +11 -3
  353. package/field/root/useFieldValidation.d.ts +1 -0
  354. package/field/root/useFieldValidation.js +23 -20
  355. package/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  356. package/field/validity/FieldValidity.d.ts +1 -1
  357. package/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  358. package/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  359. package/floating-ui-react/components/FloatingFocusManager.js +20 -8
  360. package/floating-ui-react/components/FloatingPortal.js +3 -3
  361. package/floating-ui-react/hooks/useClick.js +82 -73
  362. package/floating-ui-react/hooks/useClientPoint.js +29 -20
  363. package/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  364. package/floating-ui-react/hooks/useDismiss.js +82 -92
  365. package/floating-ui-react/hooks/useFloating.js +36 -32
  366. package/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  367. package/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  368. package/floating-ui-react/hooks/useFocus.js +84 -81
  369. package/floating-ui-react/hooks/useHover.js +74 -78
  370. package/floating-ui-react/hooks/useHoverFloatingInteraction.js +48 -43
  371. package/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  372. package/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  373. package/floating-ui-react/hooks/useHoverReferenceInteraction.js +43 -38
  374. package/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  375. package/floating-ui-react/hooks/useHoverShared.js +11 -0
  376. package/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  377. package/floating-ui-react/hooks/useListNavigation.js +83 -74
  378. package/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  379. package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +26 -20
  380. package/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  381. package/floating-ui-react/hooks/useTypeahead.js +33 -52
  382. package/floating-ui-react/index.d.ts +0 -2
  383. package/floating-ui-react/index.js +0 -14
  384. package/floating-ui-react/types.d.ts +2 -7
  385. package/floating-ui-react/utils/composite.js +2 -0
  386. package/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  387. package/floating-ui-react/utils/enqueueFocus.js +10 -7
  388. package/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  389. package/form/Form.js +2 -2
  390. package/index.js +1 -1
  391. package/internals/composite/composite.d.ts +0 -1
  392. package/internals/composite/composite.js +2 -3
  393. package/internals/composite/root/useCompositeRoot.js +1 -1
  394. package/internals/createBaseUIEventDetails.d.ts +2 -0
  395. package/internals/csp-context/index.d.ts +2 -0
  396. package/internals/csp-context/index.js +18 -0
  397. package/internals/field-register-control/index.d.ts +0 -1
  398. package/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  399. package/internals/field-register-control/useFieldControlRegistration.js +11 -14
  400. package/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  401. package/internals/field-register-control/useRegisterFieldControl.js +6 -11
  402. package/internals/field-root-context/FieldRootContext.d.ts +1 -0
  403. package/internals/field-root-context/FieldRootContext.js +4 -3
  404. package/internals/form-context/FormContext.d.ts +5 -1
  405. package/internals/reason-parts.d.ts +2 -0
  406. package/internals/reason-parts.js +3 -1
  407. package/internals/types.d.ts +1 -0
  408. package/internals/use-button/useButton.js +4 -4
  409. package/internals/usePressAndHold.js +2 -2
  410. package/internals/useRenderElement.js +2 -0
  411. package/menu/arrow/MenuArrow.js +1 -1
  412. package/menu/backdrop/MenuBackdrop.js +1 -1
  413. package/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  414. package/menu/group/MenuGroup.js +1 -4
  415. package/menu/group/MenuGroupContext.d.ts +1 -3
  416. package/menu/group/MenuGroupContext.js +1 -1
  417. package/menu/group-label/MenuGroupLabel.js +4 -6
  418. package/menu/link-item/MenuLinkItem.js +2 -2
  419. package/menu/popup/MenuPopup.js +5 -5
  420. package/menu/radio-group/MenuRadioGroup.js +11 -5
  421. package/menu/radio-item/MenuRadioItem.js +5 -7
  422. package/menu/root/MenuRoot.js +60 -65
  423. package/menu/store/MenuHandle.js +1 -1
  424. package/menu/store/MenuStore.d.ts +87 -0
  425. package/menu/submenu-trigger/MenuSubmenuTrigger.js +7 -4
  426. package/menu/trigger/MenuTrigger.js +12 -9
  427. package/menu/viewport/MenuViewport.d.ts +2 -2
  428. package/menu/viewport/MenuViewport.js +2 -2
  429. package/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  430. package/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  431. package/navigation-menu/content/NavigationMenuContent.js +8 -5
  432. package/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  433. package/navigation-menu/item/NavigationMenuItem.js +2 -2
  434. package/navigation-menu/list/NavigationMenuList.js +1 -1
  435. package/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  436. package/navigation-menu/root/NavigationMenuRoot.js +1 -3
  437. package/navigation-menu/trigger/NavigationMenuTrigger.js +23 -16
  438. package/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  439. package/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  440. package/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  441. package/number-field/input/NumberFieldInput.js +3 -5
  442. package/number-field/root/NumberFieldRoot.js +5 -2
  443. package/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  444. package/otp-field/input/OTPFieldInput.js +42 -28
  445. package/otp-field/root/OTPFieldRoot.d.ts +17 -8
  446. package/otp-field/root/OTPFieldRoot.js +32 -32
  447. package/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  448. package/otp-field/utils/otp.d.ts +5 -4
  449. package/otp-field/utils/otp.js +24 -12
  450. package/package.json +331 -317
  451. package/popover/arrow/PopoverArrow.js +1 -1
  452. package/popover/backdrop/PopoverBackdrop.js +1 -1
  453. package/popover/close/PopoverClose.js +2 -2
  454. package/popover/description/PopoverDescription.js +1 -7
  455. package/popover/popup/PopoverPopup.d.ts +1 -1
  456. package/popover/popup/PopoverPopup.js +16 -10
  457. package/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  458. package/popover/popup/PopoverPopupDataAttributes.js +1 -1
  459. package/popover/positioner/PopoverPositioner.js +5 -5
  460. package/popover/root/PopoverRoot.d.ts +1 -1
  461. package/popover/root/PopoverRoot.js +39 -44
  462. package/popover/store/PopoverHandle.js +1 -1
  463. package/popover/store/PopoverStore.d.ts +91 -4
  464. package/popover/store/PopoverStore.js +16 -19
  465. package/popover/title/PopoverTitle.js +1 -7
  466. package/popover/trigger/PopoverTrigger.js +23 -16
  467. package/popover/viewport/PopoverViewport.d.ts +3 -3
  468. package/popover/viewport/PopoverViewport.js +2 -2
  469. package/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  470. package/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  471. package/preview-card/positioner/PreviewCardPositioner.js +11 -1
  472. package/preview-card/root/PreviewCardRoot.d.ts +1 -1
  473. package/preview-card/root/PreviewCardRoot.js +30 -20
  474. package/preview-card/store/PreviewCardHandle.js +1 -1
  475. package/preview-card/store/PreviewCardStore.d.ts +90 -2
  476. package/preview-card/store/PreviewCardStore.js +18 -30
  477. package/preview-card/trigger/PreviewCardTrigger.js +5 -2
  478. package/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  479. package/preview-card/viewport/PreviewCardViewport.js +2 -2
  480. package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  481. package/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  482. package/progress/indicator/ProgressIndicator.js +6 -11
  483. package/progress/root/ProgressRoot.d.ts +1 -1
  484. package/radio/root/RadioRoot.js +7 -3
  485. package/radio-group/RadioGroup.js +4 -11
  486. package/radio-group/RadioGroupContext.d.ts +0 -1
  487. package/scroll-area/content/ScrollAreaContent.js +4 -4
  488. package/scroll-area/root/ScrollAreaRoot.js +1 -1
  489. package/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  490. package/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  491. package/select/arrow/SelectArrow.js +1 -1
  492. package/select/backdrop/SelectBackdrop.js +1 -1
  493. package/select/group/SelectGroup.js +1 -1
  494. package/select/group-label/SelectGroupLabel.js +2 -2
  495. package/select/icon/SelectIcon.js +1 -1
  496. package/select/item/SelectItem.js +46 -32
  497. package/select/item/SelectItemContext.d.ts +1 -1
  498. package/select/item-indicator/SelectItemIndicator.js +1 -2
  499. package/select/item-text/SelectItemText.js +9 -6
  500. package/select/list/SelectList.js +1 -1
  501. package/select/popup/SelectPopup.js +8 -3
  502. package/select/positioner/SelectPositioner.js +3 -0
  503. package/select/root/SelectRoot.js +45 -39
  504. package/select/root/SelectRootContext.d.ts +4 -5
  505. package/select/store.d.ts +3 -0
  506. package/select/store.js +1 -0
  507. package/select/trigger/SelectTrigger.d.ts +5 -0
  508. package/select/trigger/SelectTrigger.js +19 -33
  509. package/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  510. package/select/trigger/SelectTriggerDataAttributes.js +5 -0
  511. package/slider/control/SliderControl.js +9 -11
  512. package/slider/root/SliderRoot.js +1 -4
  513. package/slider/thumb/SliderThumb.js +32 -30
  514. package/slider/value/SliderValue.js +7 -15
  515. package/switch/root/SwitchRoot.js +10 -10
  516. package/switch/thumb/SwitchThumb.js +1 -9
  517. package/tabs/indicator/TabsIndicator.js +14 -19
  518. package/tabs/list/TabsList.js +4 -10
  519. package/tabs/list/TabsListContext.d.ts +2 -1
  520. package/tabs/panel/TabsPanel.js +1 -1
  521. package/tabs/root/TabsRoot.d.ts +16 -1
  522. package/tabs/root/TabsRoot.js +71 -24
  523. package/tabs/root/TabsRootContext.d.ts +0 -2
  524. package/toast/provider/ToastProvider.js +1 -1
  525. package/toast/root/ToastRoot.d.ts +1 -1
  526. package/toast/root/ToastRoot.js +110 -133
  527. package/toast/root/ToastRootDataAttributes.d.ts +1 -1
  528. package/toast/root/ToastRootDataAttributes.js +1 -1
  529. package/toast/store.d.ts +9 -1
  530. package/toast/store.js +18 -12
  531. package/toast/useToastManager.d.ts +1 -1
  532. package/toast/viewport/ToastViewport.js +1 -1
  533. package/toggle/Toggle.js +5 -9
  534. package/toggle-group/ToggleGroup.d.ts +2 -2
  535. package/toggle-group/ToggleGroup.js +6 -13
  536. package/toolbar/link/ToolbarLink.d.ts +1 -1
  537. package/toolbar/link/ToolbarLink.js +1 -2
  538. package/tooltip/arrow/TooltipArrow.js +3 -3
  539. package/tooltip/popup/TooltipPopup.js +5 -4
  540. package/tooltip/root/TooltipRoot.js +32 -23
  541. package/tooltip/store/TooltipHandle.js +1 -1
  542. package/tooltip/store/TooltipStore.d.ts +90 -2
  543. package/tooltip/store/TooltipStore.js +17 -30
  544. package/tooltip/trigger/TooltipTrigger.js +152 -20
  545. package/tooltip/viewport/TooltipViewport.d.ts +2 -2
  546. package/tooltip/viewport/TooltipViewport.js +2 -2
  547. package/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  548. package/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  549. package/unstable-use-media-query/index.js +1 -1
  550. package/utils/popups/index.d.ts +1 -0
  551. package/utils/popups/index.js +11 -0
  552. package/utils/popups/inlineRect.d.ts +15 -0
  553. package/utils/popups/inlineRect.js +198 -0
  554. package/utils/popups/popupStoreUtils.d.ts +28 -10
  555. package/utils/popups/popupStoreUtils.js +110 -20
  556. package/utils/popups/popupTriggerMap.js +2 -0
  557. package/utils/popups/store.d.ts +15 -2
  558. package/utils/popups/store.js +39 -2
  559. package/utils/popups/useTriggerFocusGuards.js +4 -5
  560. package/utils/useAnchorPositioning.d.ts +5 -0
  561. package/utils/useAnchorPositioning.js +12 -9
  562. package/utils/useOpenInteractionType.d.ts +4 -0
  563. package/utils/useOpenInteractionType.js +24 -17
  564. package/checkbox-group/index.parts.d.ts +0 -1
  565. package/checkbox-group/index.parts.js +0 -12
  566. package/esm/checkbox-group/index.parts.d.ts +0 -1
  567. package/esm/checkbox-group/index.parts.js +0 -1
  568. package/esm/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  569. package/esm/floating-ui-react/hooks/useInteractions.js +0 -88
  570. package/esm/floating-ui-react/hooks/useRole.d.ts +0 -17
  571. package/esm/floating-ui-react/hooks/useRole.js +0 -113
  572. package/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  573. package/floating-ui-react/hooks/useInteractions.js +0 -95
  574. package/floating-ui-react/hooks/useRole.d.ts +0 -17
  575. package/floating-ui-react/hooks/useRole.js +0 -120
  576. /package/{csp-provider → esm/internals/csp-context}/CSPContext.d.ts +0 -0
  577. /package/esm/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
  578. /package/{esm/csp-provider → internals/csp-context}/CSPContext.d.ts +0 -0
  579. /package/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
@@ -7,24 +7,29 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.useHoverFloatingInteraction = useHoverFloatingInteraction;
9
9
  var React = _interopRequireWildcard(require("react"));
10
- var _dom = require("@floating-ui/utils/dom");
11
10
  var _addEventListener = require("@base-ui/utils/addEventListener");
12
11
  var _mergeCleanups = require("@base-ui/utils/mergeCleanups");
13
- var _useStableCallback = require("@base-ui/utils/useStableCallback");
14
12
  var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
15
- var _useTimeout = require("@base-ui/utils/useTimeout");
16
13
  var _owner = require("@base-ui/utils/owner");
17
- var _element = require("../utils/element");
18
- var _nodes = require("../utils/nodes");
14
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
15
+ var _useTimeout = require("@base-ui/utils/useTimeout");
16
+ var _dom = require("@floating-ui/utils/dom");
19
17
  var _createBaseUIEventDetails = require("../../internals/createBaseUIEventDetails");
20
18
  var _reasons = require("../../internals/reasons");
21
19
  var _FloatingTree = require("../components/FloatingTree");
20
+ var _element = require("../utils/element");
21
+ var _nodes = require("../utils/nodes");
22
22
  var _useHoverInteractionSharedState = require("./useHoverInteractionSharedState");
23
23
  var _useHoverShared = require("./useHoverShared");
24
24
  /**
25
25
  * Provides hover interactions that should be attached to the floating element.
26
26
  */
27
27
  function useHoverFloatingInteraction(context, parameters = {}) {
28
+ const {
29
+ enabled = true,
30
+ closeDelay: closeDelayProp = 0,
31
+ nodeId: nodeIdProp
32
+ } = parameters;
28
33
  const store = 'rootStore' in context ? context.rootStore : context;
29
34
  const open = store.useState('open');
30
35
  const floatingElement = store.useState('floatingElement');
@@ -32,48 +37,19 @@ function useHoverFloatingInteraction(context, parameters = {}) {
32
37
  const {
33
38
  dataRef
34
39
  } = store.context;
35
- const {
36
- enabled = true,
37
- closeDelay: closeDelayProp = 0,
38
- nodeId: nodeIdProp
39
- } = parameters;
40
- const instance = (0, _useHoverInteractionSharedState.useHoverInteractionSharedState)(store);
41
40
  const tree = (0, _FloatingTree.useFloatingTree)();
42
41
  const parentId = (0, _FloatingTree.useFloatingParentNodeId)();
42
+ const instance = (0, _useHoverInteractionSharedState.useHoverInteractionSharedState)(store);
43
+ const childClosedTimeout = (0, _useTimeout.useTimeout)();
43
44
  const isClickLikeOpenEvent = (0, _useStableCallback.useStableCallback)(() => {
44
45
  return (0, _useHoverShared.isClickLikeOpenEvent)(dataRef.current.openEvent?.type, instance.interactedInside);
45
46
  });
46
47
  const isHoverOpen = (0, _useStableCallback.useStableCallback)(() => {
47
- const type = dataRef.current.openEvent?.type;
48
- return type?.includes('mouse') && type !== 'mousedown';
48
+ return (0, _useHoverShared.isHoverOpenEvent)(dataRef.current.openEvent?.type);
49
49
  });
50
- const isRelatedTargetInsideEnabledTrigger = (0, _useStableCallback.useStableCallback)(target => {
51
- return (0, _element.isTargetInsideEnabledTrigger)(target, store.context.triggerElements);
52
- });
53
- const closeWithDelay = React.useCallback(event => {
54
- const closeDelay = (0, _useHoverShared.getDelay)(closeDelayProp, 'close', instance.pointerType);
55
- const close = () => {
56
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
57
- tree?.events.emit('floating.closed', event);
58
- };
59
- if (closeDelay) {
60
- instance.openChangeTimeout.start(closeDelay, close);
61
- } else {
62
- instance.openChangeTimeout.clear();
63
- close();
64
- }
65
- }, [closeDelayProp, store, instance, tree]);
66
50
  const clearPointerEvents = (0, _useStableCallback.useStableCallback)(() => {
67
51
  (0, _useHoverInteractionSharedState.clearSafePolygonPointerEventsMutation)(instance);
68
52
  });
69
- const handleInteractInside = (0, _useStableCallback.useStableCallback)(event => {
70
- const target = (0, _element.getTarget)(event);
71
- if (!(0, _useHoverInteractionSharedState.isInteractiveElement)(target)) {
72
- instance.interactedInside = false;
73
- return;
74
- }
75
- instance.interactedInside = target?.closest('[aria-haspopup]') != null;
76
- });
77
53
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
78
54
  if (!open) {
79
55
  instance.pointerType = undefined;
@@ -97,7 +73,13 @@ function useHoverFloatingInteraction(context, parameters = {}) {
97
73
  if (parentFloating) {
98
74
  parentFloating.style.pointerEvents = '';
99
75
  }
100
- const scopeElement = instance.handleCloseOptions?.getScope?.() ?? instance.pointerEventsScopeElement ?? parentFloating ?? ref.closest('[data-rootownerid]') ?? doc.body;
76
+
77
+ // A keep-mounted submenu can appear in the tree before it opens, so a
78
+ // cached scope or parent lookup may resolve to the submenu itself. That
79
+ // would not shield sibling items in the parent menu.
80
+ const cachedScopeElement = instance.pointerEventsScopeElement !== floatingEl ? instance.pointerEventsScopeElement : null;
81
+ const parentScopeElement = parentFloating !== floatingEl ? parentFloating : null;
82
+ const scopeElement = instance.handleCloseOptions?.getScope?.() ?? cachedScopeElement ?? parentScopeElement ?? ref.closest('[data-rootownerid]') ?? doc.body;
101
83
  (0, _useHoverInteractionSharedState.applySafePolygonPointerEventsMutation)(instance, {
102
84
  scopeElement,
103
85
  referenceElement: ref,
@@ -109,11 +91,34 @@ function useHoverFloatingInteraction(context, parameters = {}) {
109
91
  }
110
92
  return undefined;
111
93
  }, [enabled, open, domReferenceElement, floatingElement, instance, isHoverOpen, tree, parentId, clearPointerEvents]);
112
- const childClosedTimeout = (0, _useTimeout.useTimeout)();
113
94
  React.useEffect(() => {
114
95
  if (!enabled) {
115
96
  return undefined;
116
97
  }
98
+ function hasParentChildren() {
99
+ return !!(tree && parentId && (0, _nodes.getNodeChildren)(tree.nodesRef.current, parentId).length > 0);
100
+ }
101
+ function closeWithDelay(event) {
102
+ const closeDelay = (0, _useHoverShared.getDelay)(closeDelayProp, 'close', instance.pointerType);
103
+ const close = () => {
104
+ store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
105
+ tree?.events.emit('floating.closed', event);
106
+ };
107
+ if (closeDelay) {
108
+ instance.openChangeTimeout.start(closeDelay, close);
109
+ } else {
110
+ instance.openChangeTimeout.clear();
111
+ close();
112
+ }
113
+ }
114
+ function handleInteractInside(event) {
115
+ const target = (0, _element.getTarget)(event);
116
+ if (!(0, _useHoverInteractionSharedState.isInteractiveElement)(target)) {
117
+ instance.interactedInside = false;
118
+ return;
119
+ }
120
+ instance.interactedInside = target?.closest('[aria-haspopup]') != null;
121
+ }
117
122
  function onFloatingMouseEnter() {
118
123
  instance.openChangeTimeout.clear();
119
124
  childClosedTimeout.clear();
@@ -121,11 +126,11 @@ function useHoverFloatingInteraction(context, parameters = {}) {
121
126
  clearPointerEvents();
122
127
  }
123
128
  function onFloatingMouseLeave(event) {
124
- if (tree && parentId && (0, _nodes.getNodeChildren)(tree.nodesRef.current, parentId).length > 0) {
129
+ if (hasParentChildren() && tree) {
125
130
  tree.events.on('floating.closed', onNodeClosed);
126
131
  return;
127
132
  }
128
- if (isRelatedTargetInsideEnabledTrigger(event.relatedTarget)) {
133
+ if ((0, _useHoverShared.isInsideEnabledTrigger)(event.relatedTarget, store.context.triggerElements)) {
129
134
  // If the mouse is leaving the reference element to another trigger, don't explicitly close the popup
130
135
  // as it will be moved.
131
136
  return;
@@ -148,7 +153,7 @@ function useHoverFloatingInteraction(context, parameters = {}) {
148
153
  }
149
154
  }
150
155
  function onNodeClosed(event) {
151
- if (!tree || !parentId || (0, _nodes.getNodeChildren)(tree.nodesRef.current, parentId).length > 0) {
156
+ if (!tree || !parentId || hasParentChildren()) {
152
157
  return;
153
158
  }
154
159
  // Allow the mouseenter event to fire in case child was closed because mouse moved into parent.
@@ -162,5 +167,5 @@ function useHoverFloatingInteraction(context, parameters = {}) {
162
167
  return (0, _mergeCleanups.mergeCleanups)(floating && (0, _addEventListener.addEventListener)(floating, 'mouseenter', onFloatingMouseEnter), floating && (0, _addEventListener.addEventListener)(floating, 'mouseleave', onFloatingMouseLeave), floating && (0, _addEventListener.addEventListener)(floating, 'pointerdown', handleInteractInside, true), () => {
163
168
  tree?.events.off('floating.closed', onNodeClosed);
164
169
  });
165
- }, [enabled, floatingElement, store, dataRef, nodeIdProp, isClickLikeOpenEvent, isRelatedTargetInsideEnabledTrigger, closeWithDelay, clearPointerEvents, handleInteractInside, instance, tree, parentId, childClosedTimeout]);
170
+ }, [enabled, floatingElement, store, dataRef, closeDelayProp, nodeIdProp, isClickLikeOpenEvent, clearPointerEvents, instance, tree, parentId, childClosedTimeout]);
166
171
  }
@@ -83,8 +83,8 @@ function applySafePolygonPointerEventsMutation(instance, options) {
83
83
  floatingElement.style.pointerEvents = 'auto';
84
84
  }
85
85
  function useHoverInteractionSharedState(store) {
86
- const instance = (0, _useRefWithInit.useRefWithInit)(HoverInteraction.create).current;
87
86
  const data = store.context.dataRef.current;
87
+ const instance = (0, _useRefWithInit.useRefWithInit)(() => data.hoverInteractionState ?? HoverInteraction.create()).current;
88
88
  if (!data.hoverInteractionState) {
89
89
  data.hoverInteractionState = instance;
90
90
  }
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
- import type { Delay, FloatingContext, FloatingRootContext } from "../types.js";
2
+ import { HTMLProps } from "../../internals/types.js";
3
3
  import type { FloatingTreeStore } from "../components/FloatingTreeStore.js";
4
+ import type { Delay, FloatingContext, FloatingRootContext } from "../types.js";
4
5
  import type { HandleClose, HandleCloseContextBase } from "./useHoverShared.js";
5
- import { HTMLProps } from "../../internals/types.js";
6
6
  export interface UseHoverReferenceInteractionProps {
7
7
  enabled?: boolean | undefined;
8
8
  handleClose?: HandleClose | null | undefined;
@@ -21,6 +21,11 @@ export interface UseHoverReferenceInteractionProps {
21
21
  triggerElementRef?: Readonly<React.RefObject<Element | null>> | undefined;
22
22
  getHandleCloseContext?: (() => HandleCloseContextBase | null) | undefined;
23
23
  isClosing?: (() => boolean) | undefined;
24
+ /**
25
+ * Called before each hover-driven open attempt (immediate, delayed, and rest-ms
26
+ * paths). Return `false` to veto; any other return value permits the open.
27
+ */
28
+ shouldOpen?: (() => boolean) | undefined;
24
29
  }
25
30
  /**
26
31
  * Provides hover interactions that should be attached to reference or trigger
@@ -8,17 +8,17 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.useHoverReferenceInteraction = useHoverReferenceInteraction;
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var ReactDOM = _interopRequireWildcard(require("react-dom"));
11
- var _dom = require("@floating-ui/utils/dom");
12
11
  var _addEventListener = require("@base-ui/utils/addEventListener");
13
12
  var _mergeCleanups = require("@base-ui/utils/mergeCleanups");
14
- var _useValueAsRef = require("@base-ui/utils/useValueAsRef");
15
- var _useStableCallback = require("@base-ui/utils/useStableCallback");
16
13
  var _owner = require("@base-ui/utils/owner");
17
- var _element = require("../utils/element");
18
- var _event = require("../utils/event");
14
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
15
+ var _useValueAsRef = require("@base-ui/utils/useValueAsRef");
16
+ var _dom = require("@floating-ui/utils/dom");
19
17
  var _createBaseUIEventDetails = require("../../internals/createBaseUIEventDetails");
20
18
  var _reasons = require("../../internals/reasons");
21
19
  var _FloatingTree = require("../components/FloatingTree");
20
+ var _element = require("../utils/element");
21
+ var _event = require("../utils/event");
22
22
  var _useHoverInteractionSharedState = require("./useHoverInteractionSharedState");
23
23
  var _useHoverShared = require("./useHoverShared");
24
24
  const EMPTY_REF = {
@@ -30,11 +30,6 @@ const EMPTY_REF = {
30
30
  * elements.
31
31
  */
32
32
  function useHoverReferenceInteraction(context, props = {}) {
33
- const store = 'rootStore' in context ? context.rootStore : context;
34
- const {
35
- dataRef,
36
- events
37
- } = store.context;
38
33
  const {
39
34
  enabled = true,
40
35
  delay = 0,
@@ -46,8 +41,14 @@ function useHoverReferenceInteraction(context, props = {}) {
46
41
  externalTree,
47
42
  isActiveTrigger = true,
48
43
  getHandleCloseContext,
49
- isClosing
44
+ isClosing,
45
+ shouldOpen: shouldOpenProp
50
46
  } = props;
47
+ const store = 'rootStore' in context ? context.rootStore : context;
48
+ const {
49
+ dataRef,
50
+ events
51
+ } = store.context;
51
52
  const tree = (0, _FloatingTree.useFloatingTree)(externalTree);
52
53
  const instance = (0, _useHoverInteractionSharedState.useHoverInteractionSharedState)(store);
53
54
  const isHoverCloseActiveRef = React.useRef(false);
@@ -55,16 +56,13 @@ function useHoverReferenceInteraction(context, props = {}) {
55
56
  const delayRef = (0, _useValueAsRef.useValueAsRef)(delay);
56
57
  const restMsRef = (0, _useValueAsRef.useValueAsRef)(restMs);
57
58
  const enabledRef = (0, _useValueAsRef.useValueAsRef)(enabled);
59
+ const shouldOpenRef = (0, _useValueAsRef.useValueAsRef)(shouldOpenProp);
58
60
  const isClosingRef = (0, _useValueAsRef.useValueAsRef)(isClosing);
59
- if (isActiveTrigger) {
60
- // eslint-disable-next-line no-underscore-dangle
61
- instance.handleCloseOptions = handleCloseRef.current?.__options;
62
- }
63
61
  const isClickLikeOpenEvent = (0, _useStableCallback.useStableCallback)(() => {
64
62
  return (0, _useHoverShared.isClickLikeOpenEvent)(dataRef.current.openEvent?.type, instance.interactedInside);
65
63
  });
66
- const isRelatedTargetInsideEnabledTrigger = (0, _useStableCallback.useStableCallback)(target => {
67
- return (0, _element.isTargetInsideEnabledTrigger)(target, store.context.triggerElements);
64
+ const checkShouldOpen = (0, _useStableCallback.useStableCallback)(() => {
65
+ return shouldOpenRef.current?.() !== false;
68
66
  });
69
67
  const isOverInactiveTrigger = (0, _useStableCallback.useStableCallback)((currentDomReference, currentTarget, target) => {
70
68
  const allTriggers = store.context.triggerElements;
@@ -81,19 +79,6 @@ function useHoverReferenceInteraction(context, props = {}) {
81
79
  const targetElement = target;
82
80
  return allTriggers.hasMatchingElement(trigger => (0, _element.contains)(trigger, targetElement)) && (!currentDomReference || !(0, _element.contains)(currentDomReference, targetElement));
83
81
  });
84
- const closeWithDelay = (0, _useStableCallback.useStableCallback)((event, runElseBranch = true) => {
85
- const closeDelay = (0, _useHoverShared.getDelay)(delayRef.current, 'close', instance.pointerType);
86
- if (closeDelay) {
87
- instance.openChangeTimeout.start(closeDelay, () => {
88
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
89
- tree?.events.emit('floating.closed', event);
90
- });
91
- } else if (runElseBranch) {
92
- instance.openChangeTimeout.clear();
93
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
94
- tree?.events.emit('floating.closed', event);
95
- }
96
- });
97
82
  const cleanupMouseMoveHandler = (0, _useStableCallback.useStableCallback)(() => {
98
83
  if (!instance.handler) {
99
84
  return;
@@ -105,6 +90,10 @@ function useHoverReferenceInteraction(context, props = {}) {
105
90
  const clearPointerEvents = (0, _useStableCallback.useStableCallback)(() => {
106
91
  (0, _useHoverInteractionSharedState.clearSafePolygonPointerEventsMutation)(instance);
107
92
  });
93
+ if (isActiveTrigger) {
94
+ // eslint-disable-next-line no-underscore-dangle
95
+ instance.handleCloseOptions = handleCloseRef.current?.__options;
96
+ }
108
97
  React.useEffect(() => cleanupMouseMoveHandler, [cleanupMouseMoveHandler]);
109
98
 
110
99
  // When closing before opening, clear the delay timeouts to cancel it
@@ -134,6 +123,19 @@ function useHoverReferenceInteraction(context, props = {}) {
134
123
  if (!enabled) {
135
124
  return undefined;
136
125
  }
126
+ function closeWithDelay(event, runElseBranch = true) {
127
+ const closeDelay = (0, _useHoverShared.getDelay)(delayRef.current, 'close', instance.pointerType);
128
+ if (closeDelay) {
129
+ instance.openChangeTimeout.start(closeDelay, () => {
130
+ store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
131
+ tree?.events.emit('floating.closed', event);
132
+ });
133
+ } else if (runElseBranch) {
134
+ instance.openChangeTimeout.clear();
135
+ store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event));
136
+ tree?.events.emit('floating.closed', event);
137
+ }
138
+ }
137
139
  const trigger = triggerElementRef.current ?? (isActiveTrigger ? store.select('domReferenceElement') : null);
138
140
  if (!(0, _dom.isElement)(trigger)) {
139
141
  return undefined;
@@ -181,7 +183,9 @@ function useHoverReferenceInteraction(context, props = {}) {
181
183
  // Open immediately when moving between triggers while open, or during
182
184
  // a hover-driven close transition (including same-trigger re-entry).
183
185
  if (shouldOpenImmediately) {
184
- store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event, triggerNode));
186
+ if (checkShouldOpen()) {
187
+ store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event, triggerNode));
188
+ }
185
189
  return;
186
190
  }
187
191
  if (isRestOnlyDelay) {
@@ -189,12 +193,14 @@ function useHoverReferenceInteraction(context, props = {}) {
189
193
  }
190
194
  if (openDelay) {
191
195
  instance.openChangeTimeout.start(openDelay, () => {
192
- if (shouldOpen) {
196
+ if (shouldOpen && checkShouldOpen()) {
193
197
  store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event, triggerNode));
194
198
  }
195
199
  });
196
200
  } else if (shouldOpen) {
197
- store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event, triggerNode));
201
+ if (checkShouldOpen()) {
202
+ store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, event, triggerNode));
203
+ }
198
204
  }
199
205
  }
200
206
  function onMouseLeave(event) {
@@ -208,8 +214,7 @@ function useHoverReferenceInteraction(context, props = {}) {
208
214
  instance.restTimeout.clear();
209
215
  instance.restTimeoutPending = false;
210
216
  const handleCloseContextBase = dataRef.current.floatingContext ?? getHandleCloseContext?.();
211
- const ignoreRelatedTargetTrigger = isRelatedTargetInsideEnabledTrigger(event.relatedTarget);
212
- if (ignoreRelatedTargetTrigger) {
217
+ if ((0, _useHoverShared.isInsideEnabledTrigger)(event.relatedTarget, store.context.triggerElements)) {
213
218
  return;
214
219
  }
215
220
  if (handleCloseRef.current && handleCloseContextBase) {
@@ -245,7 +250,7 @@ function useHoverReferenceInteraction(context, props = {}) {
245
250
  }), (0, _addEventListener.addEventListener)(trigger, 'mouseenter', onMouseEnter), (0, _addEventListener.addEventListener)(trigger, 'mouseleave', onMouseLeave));
246
251
  }
247
252
  return (0, _mergeCleanups.mergeCleanups)((0, _addEventListener.addEventListener)(trigger, 'mouseenter', onMouseEnter), (0, _addEventListener.addEventListener)(trigger, 'mouseleave', onMouseLeave));
248
- }, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, closeWithDelay, store, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent, isRelatedTargetInsideEnabledTrigger, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef]);
253
+ }, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, store, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef, checkShouldOpen]);
249
254
  return React.useMemo(() => {
250
255
  if (!enabled) {
251
256
  return undefined;
@@ -295,7 +300,7 @@ function useHoverReferenceInteraction(context, props = {}) {
295
300
  return;
296
301
  }
297
302
  const latestOpen = store.select('open');
298
- if (!instance.blockMouseMove && (!latestOpen || isOverInactive)) {
303
+ if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) {
299
304
  store.setOpen(true, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerHover, nativeEvent, trigger));
300
305
  }
301
306
  }
@@ -311,5 +316,5 @@ function useHoverReferenceInteraction(context, props = {}) {
311
316
  }
312
317
  }
313
318
  };
314
- }, [enabled, instance, isClickLikeOpenEvent, isOverInactiveTrigger, mouseOnly, store, restMsRef]);
319
+ }, [enabled, instance, isClickLikeOpenEvent, isOverInactiveTrigger, mouseOnly, store, restMsRef, checkShouldOpen]);
315
320
  }
@@ -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;
@@ -6,7 +6,15 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getDelay = getDelay;
7
7
  exports.getRestMs = getRestMs;
8
8
  exports.isClickLikeOpenEvent = isClickLikeOpenEvent;
9
+ exports.isHoverOpenEvent = isHoverOpenEvent;
10
+ Object.defineProperty(exports, "isInsideEnabledTrigger", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _element.isTargetInsideEnabledTrigger;
14
+ }
15
+ });
9
16
  var _event = require("../utils/event");
17
+ var _element = require("../utils/element");
10
18
  function resolveValue(value, pointerType) {
11
19
  if (pointerType != null && !(0, _event.isMouseLikePointerType)(pointerType)) {
12
20
  return 0;
@@ -31,4 +39,7 @@ function getRestMs(value) {
31
39
  }
32
40
  function isClickLikeOpenEvent(openEventType, interactedInside) {
33
41
  return interactedInside || openEventType === 'click' || openEventType === 'mousedown';
42
+ }
43
+ function isHoverOpenEvent(openEventType) {
44
+ return openEventType?.includes('mouse') && openEventType !== 'mousedown';
34
45
  }
@@ -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 FlatingTree to use when the one provided by context can't be used.
129
+ * External FloatingTree to use when the one provided by context can't be used.
132
130
  */
133
131
  externalTree?: FloatingTreeStore | undefined;
134
132
  }