@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
@@ -10,6 +10,7 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _useControlled = require("@base-ui/utils/useControlled");
11
11
  var _useStableCallback = require("@base-ui/utils/useStableCallback");
12
12
  var _MenuRadioGroupContext = require("./MenuRadioGroupContext");
13
+ var _MenuGroupContext = require("../group/MenuGroupContext");
13
14
  var _useRenderElement = require("../../internals/useRenderElement");
14
15
  var _jsxRuntime = require("react/jsx-runtime");
15
16
  /**
@@ -27,16 +28,17 @@ const MenuRadioGroup = exports.MenuRadioGroup = /*#__PURE__*/React.memo(/*#__PUR
27
28
  onValueChange: onValueChangeProp,
28
29
  disabled = false,
29
30
  style,
31
+ 'aria-labelledby': ariaLabelledByProp,
30
32
  ...elementProps
31
33
  } = componentProps;
34
+ const [labelId, setLabelId] = React.useState(undefined);
32
35
  const [value, setValueUnwrapped] = (0, _useControlled.useControlled)({
33
36
  controlled: valueProp,
34
37
  default: defaultValue,
35
38
  name: 'MenuRadioGroup'
36
39
  });
37
- const onValueChange = (0, _useStableCallback.useStableCallback)(onValueChangeProp);
38
40
  const setValue = (0, _useStableCallback.useStableCallback)((newValue, eventDetails) => {
39
- onValueChange?.(newValue, eventDetails);
41
+ onValueChangeProp?.(newValue, eventDetails);
40
42
  if (eventDetails.isCanceled) {
41
43
  return;
42
44
  }
@@ -50,6 +52,7 @@ const MenuRadioGroup = exports.MenuRadioGroup = /*#__PURE__*/React.memo(/*#__PUR
50
52
  ref: forwardedRef,
51
53
  props: {
52
54
  role: 'group',
55
+ 'aria-labelledby': ariaLabelledByProp ?? labelId,
53
56
  'aria-disabled': disabled || undefined,
54
57
  ...elementProps
55
58
  }
@@ -59,9 +62,12 @@ const MenuRadioGroup = exports.MenuRadioGroup = /*#__PURE__*/React.memo(/*#__PUR
59
62
  setValue,
60
63
  disabled
61
64
  }), [value, setValue, disabled]);
62
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuRadioGroupContext.MenuRadioGroupContext.Provider, {
63
- value: context,
64
- children: element
65
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuGroupContext.MenuGroupContext.Provider, {
66
+ value: setLabelId,
67
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuRadioGroupContext.MenuRadioGroupContext.Provider, {
68
+ value: context,
69
+ children: element
70
+ })
65
71
  });
66
72
  }));
67
73
  if (process.env.NODE_ENV !== "production") MenuRadioGroup.displayName = "MenuRadioGroup";
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.MenuRadioItem = void 0;
9
9
  var React = _interopRequireWildcard(require("react"));
10
- var _useStableCallback = require("@base-ui/utils/useStableCallback");
11
10
  var _MenuRootContext = require("../root/MenuRootContext");
12
11
  var _useRenderElement = require("../../internals/useRenderElement");
13
12
  var _useBaseUiId = require("../../internals/useBaseUiId");
@@ -74,13 +73,12 @@ const MenuRadioItem = exports.MenuRadioItem = /*#__PURE__*/React.forwardRef(func
74
73
  highlighted,
75
74
  checked
76
75
  }), [disabled, highlighted, checked]);
77
- const handleClick = (0, _useStableCallback.useStableCallback)(event => {
78
- const details = {
79
- ...(0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.itemPress, event.nativeEvent),
80
- preventUnmountOnClose: () => {}
81
- };
76
+ function handleClick(event) {
77
+ const details = (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.itemPress, event.nativeEvent, undefined, {
78
+ preventUnmountOnClose() {}
79
+ });
82
80
  setSelectedValue(value, details);
83
- });
81
+ }
84
82
  const element = (0, _useRenderElement.useRenderElement)('div', componentProps, {
85
83
  state,
86
84
  stateAttributesMapping: _stateAttributesMapping.itemMapping,
@@ -103,28 +103,11 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
103
103
  store.useControlledProp('openProp', openProp);
104
104
  store.useControlledProp('triggerIdProp', triggerIdProp);
105
105
  store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);
106
+ const rootId = (0, _useId.useId)();
107
+ const floatingId = (0, _useId.useId)();
106
108
  const floatingTreeRoot = store.useState('floatingTreeRoot');
107
109
  const floatingNodeIdFromContext = (0, _floatingUiReact.useFloatingNodeId)(floatingTreeRoot);
108
110
  const floatingParentNodeIdFromContext = (0, _floatingUiReact.useFloatingParentNodeId)();
109
- (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
110
- if (contextMenuContext && !parentMenuRootContext) {
111
- // This is a context menu root.
112
- // It doesn't support detached triggers yet, so we have to sync the parent context manually.
113
- store.update({
114
- parent: {
115
- type: 'context-menu',
116
- context: contextMenuContext
117
- },
118
- floatingNodeId: floatingNodeIdFromContext,
119
- floatingParentNodeId: floatingParentNodeIdFromContext
120
- });
121
- } else if (parentMenuRootContext) {
122
- store.update({
123
- floatingNodeId: floatingNodeIdFromContext,
124
- floatingParentNodeId: floatingParentNodeIdFromContext
125
- });
126
- }
127
- }, [contextMenuContext, parentMenuRootContext, floatingNodeIdFromContext, floatingParentNodeIdFromContext, store]);
128
111
  const open = store.useState('open');
129
112
  const activeTriggerElement = store.useState('activeTriggerElement');
130
113
  const positionerElement = store.useState('positionerElement');
@@ -136,6 +119,10 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
136
119
  const payload = store.useState('payload');
137
120
  const floatingParentNodeId = store.useState('floatingParentNodeId');
138
121
  const openEventRef = React.useRef(null);
122
+ const allowOutsidePressDismissalRef = React.useRef(parent.type !== 'context-menu');
123
+ const allowOutsidePressDismissalTimeout = (0, _useTimeout.useTimeout)();
124
+ const allowTouchToCloseRef = React.useRef(true);
125
+ const allowTouchToCloseTimeout = (0, _useTimeout.useTimeout)();
139
126
  const nested = floatingParentNodeId != null;
140
127
  if (process.env.NODE_ENV !== 'production') {
141
128
  if (parent.type !== undefined && modalProp !== undefined) {
@@ -150,7 +137,7 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
150
137
  disabled: disabledProp,
151
138
  modal: parent.type === undefined ? modalProp : undefined,
152
139
  openMethod,
153
- rootId: (0, _useId.useId)()
140
+ rootId
154
141
  });
155
142
  (0, _popups.useImplicitActiveTrigger)(store);
156
143
  const {
@@ -161,8 +148,25 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
161
148
  stickIfOpen: true
162
149
  });
163
150
  });
164
- const allowOutsidePressDismissalRef = React.useRef(parent.type !== 'context-menu');
165
- const allowOutsidePressDismissalTimeout = (0, _useTimeout.useTimeout)();
151
+ (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
152
+ if (contextMenuContext && !parentMenuRootContext) {
153
+ // This is a context menu root.
154
+ // It doesn't support detached triggers yet, so we have to sync the parent context manually.
155
+ store.update({
156
+ parent: {
157
+ type: 'context-menu',
158
+ context: contextMenuContext
159
+ },
160
+ floatingNodeId: floatingNodeIdFromContext,
161
+ floatingParentNodeId: floatingParentNodeIdFromContext
162
+ });
163
+ } else if (parentMenuRootContext) {
164
+ store.update({
165
+ floatingNodeId: floatingNodeIdFromContext,
166
+ floatingParentNodeId: floatingParentNodeIdFromContext
167
+ });
168
+ }
169
+ }, [contextMenuContext, parentMenuRootContext, floatingNodeIdFromContext, floatingParentNodeIdFromContext, store]);
166
170
  React.useEffect(() => {
167
171
  if (!open) {
168
172
  openEventRef.current = null;
@@ -188,8 +192,6 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
188
192
  store.set('hoverEnabled', true);
189
193
  }
190
194
  }, [open, hoverEnabled, store]);
191
- const allowTouchToCloseRef = React.useRef(true);
192
- const allowTouchToCloseTimeout = (0, _useTimeout.useTimeout)();
193
195
  const setOpen = (0, _useStableCallback.useStableCallback)((nextOpen, eventDetails) => {
194
196
  const reason = eventDetails.reason;
195
197
  if (open === nextOpen && eventDetails.trigger === activeTriggerElement && lastOpenChangeReason === reason) {
@@ -263,23 +265,10 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
263
265
  store.set('instantType', undefined);
264
266
  }
265
267
  });
266
- const handleImperativeClose = React.useCallback(() => {
267
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.imperativeAction));
268
- }, [store]);
269
- React.useImperativeHandle(actionsRef, () => ({
270
- unmount: forceUnmount,
271
- close: handleImperativeClose
272
- }), [forceUnmount, handleImperativeClose]);
273
- let ctx;
274
- if (parent.type === 'context-menu') {
275
- ctx = parent.context;
276
- }
277
- React.useImperativeHandle(ctx?.positionerRef, () => positionerElement, [positionerElement]);
278
- React.useImperativeHandle(ctx?.actionsRef, () => ({
279
- setOpen
280
- }), [setOpen]);
281
268
  const floatingRootContext = (0, _floatingUiReact.useSyncedFloatingRootContext)({
282
269
  popupStore: store,
270
+ floatingId,
271
+ nested: floatingParentNodeIdFromContext != null,
283
272
  onOpenChange: setOpen
284
273
  });
285
274
  const floatingEvents = floatingRootContext.context.events;
@@ -293,6 +282,21 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
293
282
  floatingEvents?.off('setOpen', handleSetOpenEvent);
294
283
  };
295
284
  }, [floatingEvents, setOpen]);
285
+ const handleImperativeClose = React.useCallback(() => {
286
+ store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.imperativeAction));
287
+ }, [store]);
288
+ React.useImperativeHandle(actionsRef, () => ({
289
+ unmount: forceUnmount,
290
+ close: handleImperativeClose
291
+ }), [forceUnmount, handleImperativeClose]);
292
+ let ctx;
293
+ if (parent.type === 'context-menu') {
294
+ ctx = parent.context;
295
+ }
296
+ React.useImperativeHandle(ctx?.positionerRef, () => positionerElement, [positionerElement]);
297
+ React.useImperativeHandle(ctx?.actionsRef, () => ({
298
+ setOpen
299
+ }), [setOpen]);
296
300
  const dismiss = (0, _floatingUiReact.useDismiss)(floatingRootContext, {
297
301
  enabled: !disabled,
298
302
  bubbles: {
@@ -306,9 +310,6 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
306
310
  },
307
311
  externalTree: nested ? floatingTreeRoot : undefined
308
312
  });
309
- const role = (0, _floatingUiReact.useRole)(floatingRootContext, {
310
- role: 'menu'
311
- });
312
313
  const direction = (0, _DirectionContext.useDirection)();
313
314
  const setActiveIndex = React.useCallback(index => {
314
315
  if (store.select('activeIndex') === index) {
@@ -331,7 +332,7 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
331
332
  externalTree: nested ? floatingTreeRoot : undefined,
332
333
  focusItemOnHover: highlightItemOnHover
333
334
  });
334
- const onTypingChange = React.useCallback(nextTyping => {
335
+ const onTyping = React.useCallback(nextTyping => {
335
336
  store.context.typingRef.current = nextTyping;
336
337
  }, [store]);
337
338
  const typeahead = (0, _floatingUiReact.useTypeahead)(floatingRootContext, {
@@ -344,34 +345,28 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
344
345
  store.set('activeIndex', index);
345
346
  }
346
347
  },
347
- onTypingChange
348
+ onTyping
348
349
  });
349
- const {
350
- getReferenceProps,
351
- getFloatingProps,
352
- getItemProps,
353
- getTriggerProps
354
- } = (0, _floatingUiReact.useInteractions)([dismiss, role, listNavigation, typeahead]);
355
350
  const activeTriggerProps = React.useMemo(() => {
356
- const mergedProps = (0, _mergeProps.mergeProps)(getReferenceProps(), {
351
+ const mergedProps = (0, _mergeProps.mergeProps)(typeahead.reference, listNavigation.reference, dismiss.reference, {
357
352
  onMouseMove() {
358
353
  store.set('allowMouseEnter', true);
359
354
  }
360
355
  }, interactionTypeProps);
361
- delete mergedProps.role;
356
+ mergedProps['aria-haspopup'] = 'menu';
357
+ mergedProps['aria-expanded'] = open;
362
358
  return mergedProps;
363
- }, [getReferenceProps, store, interactionTypeProps]);
359
+ }, [store, typeahead.reference, listNavigation.reference, dismiss.reference, interactionTypeProps, open]);
364
360
  const inactiveTriggerProps = React.useMemo(() => {
365
- const triggerProps = getTriggerProps();
366
- if (!triggerProps) {
367
- return triggerProps;
368
- }
369
- const mergedProps = (0, _mergeProps.mergeProps)(triggerProps, interactionTypeProps);
370
- delete mergedProps.role;
371
- delete mergedProps['aria-controls'];
361
+ const mergedProps = (0, _mergeProps.mergeProps)(listNavigation.trigger, dismiss.trigger, interactionTypeProps);
362
+ mergedProps['aria-haspopup'] = 'menu';
363
+ mergedProps['aria-expanded'] = false;
372
364
  return mergedProps;
373
- }, [getTriggerProps, interactionTypeProps]);
374
- const popupProps = React.useMemo(() => getFloatingProps({
365
+ }, [listNavigation.trigger, dismiss.trigger, interactionTypeProps]);
366
+ const popupProps = React.useMemo(() => (0, _mergeProps.mergeProps)(_popups.FOCUSABLE_POPUP_PROPS, {
367
+ id: floatingId,
368
+ role: 'menu',
369
+ 'aria-labelledby': activeTriggerElement?.id,
375
370
  onMouseMove() {
376
371
  store.set('allowMouseEnter', true);
377
372
  if (parent.type === 'menu') {
@@ -392,9 +387,9 @@ const MenuRoot = exports.MenuRoot = (0, _fastHooks.fastComponent)(function MenuR
392
387
  relay(event);
393
388
  }
394
389
  }
395
- }), [getFloatingProps, parent.type, store]);
396
- const itemProps = React.useMemo(() => getItemProps(), [getItemProps]);
397
- store.useSyncedValues({
390
+ }, typeahead.floating, listNavigation.floating, dismiss.floating), [activeTriggerElement, floatingId, parent.type, store, typeahead.floating, listNavigation.floating, dismiss.floating]);
391
+ const itemProps = listNavigation.item ?? _empty.EMPTY_OBJECT;
392
+ (0, _popups.usePopupInteractionProps)(store, {
398
393
  floatingRootContext,
399
394
  activeTriggerProps,
400
395
  inactiveTriggerProps,
@@ -44,7 +44,7 @@ class MenuHandle {
44
44
  * Indicates whether the menu is currently open.
45
45
  */
46
46
  get isOpen() {
47
- return this.store.state.open;
47
+ return this.store.select('open');
48
48
  }
49
49
  }
50
50
 
@@ -61,6 +61,8 @@ declare const selectors: {
61
61
  mounted: boolean;
62
62
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
63
63
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
64
+ floatingId: string | undefined;
65
+ triggerCount: number;
64
66
  preventUnmountingOnClose: boolean;
65
67
  payload: unknown;
66
68
  activeTriggerId: string | null;
@@ -78,6 +80,8 @@ declare const selectors: {
78
80
  mounted: boolean;
79
81
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
80
82
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
83
+ floatingId: string | undefined;
84
+ triggerCount: number;
81
85
  preventUnmountingOnClose: boolean;
82
86
  payload: unknown;
83
87
  activeTriggerId: string | null;
@@ -95,6 +99,8 @@ declare const selectors: {
95
99
  mounted: boolean;
96
100
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
97
101
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
102
+ floatingId: string | undefined;
103
+ triggerCount: number;
98
104
  preventUnmountingOnClose: boolean;
99
105
  payload: unknown;
100
106
  activeTriggerId: string | null;
@@ -112,6 +118,8 @@ declare const selectors: {
112
118
  mounted: boolean;
113
119
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
114
120
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
121
+ floatingId: string | undefined;
122
+ triggerCount: number;
115
123
  preventUnmountingOnClose: boolean;
116
124
  payload: unknown;
117
125
  activeTriggerId: string | null;
@@ -123,12 +131,33 @@ declare const selectors: {
123
131
  inactiveTriggerProps: HTMLProps;
124
132
  popupProps: HTMLProps;
125
133
  }) => import("../../floating-ui-react/components/FloatingRootStore.js").FloatingRootStore;
134
+ triggerCount: (state: {
135
+ open: boolean;
136
+ readonly openProp: boolean | undefined;
137
+ mounted: boolean;
138
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
139
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
140
+ floatingId: string | undefined;
141
+ triggerCount: number;
142
+ preventUnmountingOnClose: boolean;
143
+ payload: unknown;
144
+ activeTriggerId: string | null;
145
+ activeTriggerElement: Element | null;
146
+ readonly triggerIdProp: string | null | undefined;
147
+ popupElement: HTMLElement | null;
148
+ positionerElement: HTMLElement | null;
149
+ activeTriggerProps: HTMLProps;
150
+ inactiveTriggerProps: HTMLProps;
151
+ popupProps: HTMLProps;
152
+ }) => number;
126
153
  preventUnmountingOnClose: (state: {
127
154
  open: boolean;
128
155
  readonly openProp: boolean | undefined;
129
156
  mounted: boolean;
130
157
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
131
158
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
159
+ floatingId: string | undefined;
160
+ triggerCount: number;
132
161
  preventUnmountingOnClose: boolean;
133
162
  payload: unknown;
134
163
  activeTriggerId: string | null;
@@ -146,6 +175,8 @@ declare const selectors: {
146
175
  mounted: boolean;
147
176
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
148
177
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
178
+ floatingId: string | undefined;
179
+ triggerCount: number;
149
180
  preventUnmountingOnClose: boolean;
150
181
  payload: unknown;
151
182
  activeTriggerId: string | null;
@@ -163,6 +194,8 @@ declare const selectors: {
163
194
  mounted: boolean;
164
195
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
165
196
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
197
+ floatingId: string | undefined;
198
+ triggerCount: number;
166
199
  preventUnmountingOnClose: boolean;
167
200
  payload: unknown;
168
201
  activeTriggerId: string | null;
@@ -180,6 +213,8 @@ declare const selectors: {
180
213
  mounted: boolean;
181
214
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
182
215
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
216
+ floatingId: string | undefined;
217
+ triggerCount: number;
183
218
  preventUnmountingOnClose: boolean;
184
219
  payload: unknown;
185
220
  activeTriggerId: string | null;
@@ -191,12 +226,33 @@ declare const selectors: {
191
226
  inactiveTriggerProps: HTMLProps;
192
227
  popupProps: HTMLProps;
193
228
  }) => Element | null;
229
+ popupId: (state: {
230
+ open: boolean;
231
+ readonly openProp: boolean | undefined;
232
+ mounted: boolean;
233
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
234
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
235
+ floatingId: string | undefined;
236
+ triggerCount: number;
237
+ preventUnmountingOnClose: boolean;
238
+ payload: unknown;
239
+ activeTriggerId: string | null;
240
+ activeTriggerElement: Element | null;
241
+ readonly triggerIdProp: string | null | undefined;
242
+ popupElement: HTMLElement | null;
243
+ positionerElement: HTMLElement | null;
244
+ activeTriggerProps: HTMLProps;
245
+ inactiveTriggerProps: HTMLProps;
246
+ popupProps: HTMLProps;
247
+ }) => string | undefined;
194
248
  isTriggerActive: (state: {
195
249
  open: boolean;
196
250
  readonly openProp: boolean | undefined;
197
251
  mounted: boolean;
198
252
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
199
253
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
254
+ floatingId: string | undefined;
255
+ triggerCount: number;
200
256
  preventUnmountingOnClose: boolean;
201
257
  payload: unknown;
202
258
  activeTriggerId: string | null;
@@ -214,6 +270,8 @@ declare const selectors: {
214
270
  mounted: boolean;
215
271
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
216
272
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
273
+ floatingId: string | undefined;
274
+ triggerCount: number;
217
275
  preventUnmountingOnClose: boolean;
218
276
  payload: unknown;
219
277
  activeTriggerId: string | null;
@@ -231,6 +289,8 @@ declare const selectors: {
231
289
  mounted: boolean;
232
290
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
233
291
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
292
+ floatingId: string | undefined;
293
+ triggerCount: number;
234
294
  preventUnmountingOnClose: boolean;
235
295
  payload: unknown;
236
296
  activeTriggerId: string | null;
@@ -248,6 +308,8 @@ declare const selectors: {
248
308
  mounted: boolean;
249
309
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
250
310
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
311
+ floatingId: string | undefined;
312
+ triggerCount: number;
251
313
  preventUnmountingOnClose: boolean;
252
314
  payload: unknown;
253
315
  activeTriggerId: string | null;
@@ -259,12 +321,33 @@ declare const selectors: {
259
321
  inactiveTriggerProps: HTMLProps;
260
322
  popupProps: HTMLProps;
261
323
  }, isActive: boolean) => HTMLProps;
324
+ triggerPopupId: (state: {
325
+ open: boolean;
326
+ readonly openProp: boolean | undefined;
327
+ mounted: boolean;
328
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
329
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
330
+ floatingId: string | undefined;
331
+ triggerCount: number;
332
+ preventUnmountingOnClose: boolean;
333
+ payload: unknown;
334
+ activeTriggerId: string | null;
335
+ activeTriggerElement: Element | null;
336
+ readonly triggerIdProp: string | null | undefined;
337
+ popupElement: HTMLElement | null;
338
+ positionerElement: HTMLElement | null;
339
+ activeTriggerProps: HTMLProps;
340
+ inactiveTriggerProps: HTMLProps;
341
+ popupProps: HTMLProps;
342
+ }, triggerId: string | undefined) => string | undefined;
262
343
  popupProps: (state: {
263
344
  open: boolean;
264
345
  readonly openProp: boolean | undefined;
265
346
  mounted: boolean;
266
347
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
267
348
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
349
+ floatingId: string | undefined;
350
+ triggerCount: number;
268
351
  preventUnmountingOnClose: boolean;
269
352
  payload: unknown;
270
353
  activeTriggerId: string | null;
@@ -282,6 +365,8 @@ declare const selectors: {
282
365
  mounted: boolean;
283
366
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
284
367
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
368
+ floatingId: string | undefined;
369
+ triggerCount: number;
285
370
  preventUnmountingOnClose: boolean;
286
371
  payload: unknown;
287
372
  activeTriggerId: string | null;
@@ -299,6 +384,8 @@ declare const selectors: {
299
384
  mounted: boolean;
300
385
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
301
386
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
387
+ floatingId: string | undefined;
388
+ triggerCount: number;
302
389
  preventUnmountingOnClose: boolean;
303
390
  payload: unknown;
304
391
  activeTriggerId: string | null;
@@ -13,6 +13,7 @@ var _isElementDisabled = require("@base-ui/utils/isElementDisabled");
13
13
  var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
14
14
  var _warn = require("@base-ui/utils/warn");
15
15
  var _safeReact = require("@base-ui/utils/safeReact");
16
+ var _empty = require("@base-ui/utils/empty");
16
17
  var _floatingUiReact = require("../../floating-ui-react");
17
18
  var _MenuRootContext = require("../root/MenuRootContext");
18
19
  var _useBaseUiId = require("../../internals/useBaseUiId");
@@ -29,10 +30,11 @@ var _MenuSubmenuRootContext = require("../submenu-root/MenuSubmenuRootContext");
29
30
  *
30
31
  * Documentation: [Base UI Menu](https://base-ui.com/react/components/menu)
31
32
  */
32
- const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwardRef(function SubmenuTriggerComponent(componentProps, forwardedRef) {
33
+ const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwardRef(function MenuSubmenuTrigger(componentProps, forwardedRef) {
33
34
  const {
34
35
  render,
35
36
  className,
37
+ style,
36
38
  label,
37
39
  id: idProp,
38
40
  nativeButton = false,
@@ -40,7 +42,6 @@ const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwa
40
42
  delay = 100,
41
43
  closeDelay = 0,
42
44
  disabled: disabledProp = false,
43
- style,
44
45
  ...elementProps
45
46
  } = componentProps;
46
47
  const listItem = (0, _useCompositeListItem.useCompositeListItem)();
@@ -52,6 +53,7 @@ const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwa
52
53
  const open = store.useState('open');
53
54
  const floatingRootContext = store.useState('floatingRootContext');
54
55
  const floatingTreeRoot = store.useState('floatingTreeRoot');
56
+ const popupId = store.useState('triggerPopupId', thisTriggerId);
55
57
  const baseRegisterTrigger = (0, _popups.useTriggerRegistration)(thisTriggerId, store);
56
58
  const registerTrigger = React.useCallback(element => {
57
59
  const cleanup = baseRegisterTrigger(element);
@@ -134,7 +136,7 @@ const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwa
134
136
  ignoreMouse: openOnHover,
135
137
  stickIfOpen: false
136
138
  });
137
- const localInteractionProps = (0, _floatingUiReact.useInteractions)([click]);
139
+ const localInteractionProps = click.reference ?? _empty.EMPTY_OBJECT;
138
140
  const rootTriggerProps = store.useState('triggerProps', true);
139
141
  delete rootTriggerProps.id;
140
142
  const state = {
@@ -145,7 +147,8 @@ const MenuSubmenuTrigger = exports.MenuSubmenuTrigger = /*#__PURE__*/React.forwa
145
147
  const element = (0, _useRenderElement.useRenderElement)('div', componentProps, {
146
148
  state,
147
149
  stateAttributesMapping: _popupStateMapping.triggerOpenStateMapping,
148
- props: [localInteractionProps.getReferenceProps(), hoverProps, rootTriggerProps, itemProps, {
150
+ props: [localInteractionProps, hoverProps, rootTriggerProps, itemProps, {
151
+ 'aria-controls': popupId,
149
152
  tabIndex: open || highlighted ? 0 : -1,
150
153
  onBlur() {
151
154
  if (highlighted) {
@@ -35,6 +35,7 @@ var _ContextMenuRootContext = require("../../context-menu/root/ContextMenuRootCo
35
35
  var _MenubarContext = require("../../menubar/MenubarContext");
36
36
  var _constants = require("../../internals/constants");
37
37
  var _FocusGuard = require("../../utils/FocusGuard");
38
+ var _mergeProps = require("../../merge-props");
38
39
  var _jsxRuntime = require("react/jsx-runtime");
39
40
  const BOUNDARY_OFFSET = 2;
40
41
 
@@ -48,6 +49,7 @@ const MenuTrigger = exports.MenuTrigger = (0, _fastHooks.fastComponentRef)(funct
48
49
  const {
49
50
  render,
50
51
  className,
52
+ style,
51
53
  disabled: disabledProp = false,
52
54
  nativeButton = true,
53
55
  id: idProp,
@@ -56,7 +58,6 @@ const MenuTrigger = exports.MenuTrigger = (0, _fastHooks.fastComponentRef)(funct
56
58
  closeDelay = 0,
57
59
  handle,
58
60
  payload,
59
- style,
60
61
  ...elementProps
61
62
  } = componentProps;
62
63
  const rootContext = (0, _MenuRootContext.useMenuRootContext)(true);
@@ -68,6 +69,7 @@ const MenuTrigger = exports.MenuTrigger = (0, _fastHooks.fastComponentRef)(funct
68
69
  const isTriggerActive = store.useState('isTriggerActive', thisTriggerId);
69
70
  const floatingRootContext = store.useState('floatingRootContext');
70
71
  const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId);
72
+ const popupId = store.useState('triggerPopupId', thisTriggerId);
71
73
  const triggerElementRef = React.useRef(null);
72
74
  const parent = useMenuParent();
73
75
  const compositeRootContext = (0, _CompositeRootContext.useCompositeRootContext)(true);
@@ -174,15 +176,21 @@ const MenuTrigger = exports.MenuTrigger = (0, _fastHooks.fastComponentRef)(funct
174
176
  enabled: isInMenubar,
175
177
  mouseDownAction: 'open'
176
178
  });
177
- const localInteractionProps = (0, _floatingUiReact.useInteractions)([click, focus]);
179
+ const localInteractionProps = React.useMemo(() => (0, _mergeProps.mergeProps)(focus.reference, click.reference), [focus.reference, click.reference]);
180
+ const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);
181
+ const {
182
+ preFocusGuardRef,
183
+ handlePreFocusGuardFocus,
184
+ handleFocusTargetFocus
185
+ } = (0, _useTriggerFocusGuards.useTriggerFocusGuards)(store, triggerElementRef);
178
186
  const state = {
179
187
  disabled,
180
188
  open: isOpenedByThisTrigger
181
189
  };
182
- const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);
183
190
  const ref = [triggerRef, forwardedRef, buttonRef, registerTrigger, triggerElementRef];
184
- const props = [localInteractionProps.getReferenceProps(), hoverProps ?? _empty.EMPTY_OBJECT, rootTriggerProps, {
191
+ const props = [localInteractionProps, hoverProps ?? _empty.EMPTY_OBJECT, rootTriggerProps, {
185
192
  'aria-haspopup': 'menu',
193
+ 'aria-controls': popupId,
186
194
  id: thisTriggerId,
187
195
  onMouseDown: event => {
188
196
  if (store.select('open')) {
@@ -201,11 +209,6 @@ const MenuTrigger = exports.MenuTrigger = (0, _fastHooks.fastComponentRef)(funct
201
209
  }, isInMenubar ? {
202
210
  role: 'menuitem'
203
211
  } : {}, mixedToggleHandlers, elementProps, getButtonProps];
204
- const {
205
- preFocusGuardRef,
206
- handlePreFocusGuardFocus,
207
- handleFocusTargetFocus
208
- } = (0, _useTriggerFocusGuards.useTriggerFocusGuards)(store, triggerElementRef);
209
212
  const element = (0, _useRenderElement.useRenderElement)('button', componentProps, {
210
213
  enabled: !isInMenubar,
211
214
  stateAttributesMapping: _popupStateMapping.pressableTriggerOpenStateMapping,
@@ -2,8 +2,8 @@ import * as React from 'react';
2
2
  import { BaseUIComponentProps } from "../../internals/types.js";
3
3
  /**
4
4
  * A viewport for displaying content transitions.
5
- * This component is only required if one popup can be opened by multiple triggers, its content change based on the trigger
6
- * and switching between them is animated.
5
+ * This component is only required if one popup can be opened by multiple triggers, its content
6
+ * changes based on the trigger, and switching between them is animated.
7
7
  * Renders a `<div>` element.
8
8
  *
9
9
  * Documentation: [Base UI Menu](https://base-ui.com/react/components/menu)
@@ -20,8 +20,8 @@ const stateAttributesMapping = {
20
20
 
21
21
  /**
22
22
  * A viewport for displaying content transitions.
23
- * This component is only required if one popup can be opened by multiple triggers, its content change based on the trigger
24
- * and switching between them is animated.
23
+ * This component is only required if one popup can be opened by multiple triggers, its content
24
+ * changes based on the trigger, and switching between them is animated.
25
25
  * Renders a `<div>` element.
26
26
  *
27
27
  * Documentation: [Base UI Menu](https://base-ui.com/react/components/menu)
@@ -19,8 +19,8 @@ var _useRenderElement = require("../../internals/useRenderElement");
19
19
  */
20
20
  const NavigationMenuArrow = exports.NavigationMenuArrow = /*#__PURE__*/React.forwardRef(function NavigationMenuArrow(componentProps, forwardedRef) {
21
21
  const {
22
- className,
23
22
  render,
23
+ className,
24
24
  style,
25
25
  ...elementProps
26
26
  } = componentProps;