@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
@@ -14,6 +14,7 @@ import { COMPOSITE_KEYS } from "../../internals/composite/composite.js";
14
14
  import { useToolbarRootContext } from "../../toolbar/root/ToolbarRootContext.js";
15
15
  import { getDisabledMountTransitionStyles } from "../../utils/getDisabledMountTransitionStyles.js";
16
16
  import { ClosePartProvider, useClosePartCount } from "../../utils/closePart.js";
17
+ import { FOCUSABLE_POPUP_PROPS } from "../../utils/popups/index.js";
17
18
  import { jsx as _jsx } from "react/jsx-runtime";
18
19
  const stateAttributesMapping = {
19
20
  ...baseMapping,
@@ -28,11 +29,11 @@ const stateAttributesMapping = {
28
29
  */
29
30
  export const PopoverPopup = /*#__PURE__*/React.forwardRef(function PopoverPopup(componentProps, forwardedRef) {
30
31
  const {
31
- className,
32
32
  render,
33
+ className,
34
+ style,
33
35
  initialFocus,
34
36
  finalFocus,
35
- style,
36
37
  ...elementProps
37
38
  } = componentProps;
38
39
  const {
@@ -56,6 +57,11 @@ export const PopoverPopup = /*#__PURE__*/React.forwardRef(function PopoverPopup(
56
57
  const openReason = store.useState('openChangeReason');
57
58
  const activeTriggerElement = store.useState('activeTriggerElement');
58
59
  const floatingContext = store.useState('floatingRootContext');
60
+ const floatingId = floatingContext.useState('floatingId');
61
+ const disabled = store.useState('disabled');
62
+ const openOnHover = store.useState('openOnHover');
63
+ const closeDelay = store.useState('closeDelay');
64
+ const popupId = elementProps.id ?? floatingId;
59
65
  useOpenChangeComplete({
60
66
  open,
61
67
  ref: store.context.popupRef,
@@ -65,9 +71,6 @@ export const PopoverPopup = /*#__PURE__*/React.forwardRef(function PopoverPopup(
65
71
  }
66
72
  }
67
73
  });
68
- const disabled = store.useState('disabled');
69
- const openOnHover = store.useState('openOnHover');
70
- const closeDelay = store.useState('closeDelay');
71
74
  useHoverFloatingInteraction(floatingContext, {
72
75
  enabled: openOnHover && !disabled,
73
76
  closeDelay
@@ -83,6 +86,11 @@ export const PopoverPopup = /*#__PURE__*/React.forwardRef(function PopoverPopup(
83
86
  return true;
84
87
  }
85
88
  const resolvedInitialFocus = initialFocus === undefined ? defaultInitialFocus : initialFocus;
89
+ const focusManagerModal = modal !== false && hasClosePart;
90
+ store.useSyncedValue('focusManagerModal', focusManagerModal);
91
+ const setPopupElement = React.useCallback(element => {
92
+ store.set('popupElement', element);
93
+ }, [store]);
86
94
  const state = {
87
95
  open,
88
96
  side: positioner.side,
@@ -90,15 +98,13 @@ export const PopoverPopup = /*#__PURE__*/React.forwardRef(function PopoverPopup(
90
98
  instant: instantType,
91
99
  transitionStatus
92
100
  };
93
- const focusManagerModal = modal !== false && hasClosePart;
94
- store.useSyncedValue('focusManagerModal', focusManagerModal);
95
- const setPopupElement = React.useCallback(element => {
96
- store.set('popupElement', element);
97
- }, [store]);
98
101
  const element = useRenderElement('div', componentProps, {
99
102
  state,
100
103
  ref: [forwardedRef, store.context.popupRef, setPopupElement],
101
104
  props: [popupProps, {
105
+ id: popupId,
106
+ role: 'dialog',
107
+ ...FOCUSABLE_POPUP_PROPS,
102
108
  'aria-labelledby': titleId,
103
109
  'aria-describedby': descriptionId,
104
110
  onKeyDown(event) {
@@ -27,7 +27,7 @@ export declare enum PopoverPopupDataAttributes {
27
27
  align = "data-align",
28
28
  /**
29
29
  * Present if animations should be instant.
30
- * @type {'click' | 'dismiss'}
30
+ * @type {'click' | 'dismiss' | 'focus' | 'trigger-change'}
31
31
  */
32
32
  instant = "data-instant",
33
33
  }
@@ -28,7 +28,7 @@ export let PopoverPopupDataAttributes = function (PopoverPopupDataAttributes) {
28
28
  PopoverPopupDataAttributes["align"] = "data-align";
29
29
  /**
30
30
  * Present if animations should be instant.
31
- * @type {'click' | 'dismiss'}
31
+ * @type {'click' | 'dismiss' | 'focus' | 'trigger-change'}
32
32
  */
33
33
  PopoverPopupDataAttributes["instant"] = "data-instant";
34
34
  return PopoverPopupDataAttributes;
@@ -27,6 +27,7 @@ export const PopoverPositioner = /*#__PURE__*/React.forwardRef(function PopoverP
27
27
  const {
28
28
  render,
29
29
  className,
30
+ style,
30
31
  anchor,
31
32
  positionMethod = 'absolute',
32
33
  side = 'bottom',
@@ -39,7 +40,6 @@ export const PopoverPositioner = /*#__PURE__*/React.forwardRef(function PopoverP
39
40
  sticky = false,
40
41
  disableAnchorTracking = false,
41
42
  collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
42
- style,
43
43
  ...elementProps
44
44
  } = componentProps;
45
45
  const {
@@ -101,6 +101,10 @@ export const PopoverPositioner = /*#__PURE__*/React.forwardRef(function PopoverP
101
101
  }
102
102
  return undefined;
103
103
  }, [domReference, runOnceAnimationsFinish, store]);
104
+ useAnchoredPopupScrollLock(open && modal === true && openReason !== REASONS.triggerHover, openMethod === 'touch', positionerElement, triggerElement);
105
+ const setPositionerElement = React.useCallback(element => {
106
+ store.set('positionerElement', element);
107
+ }, [store]);
104
108
  const state = {
105
109
  open,
106
110
  side: positioning.side,
@@ -108,10 +112,6 @@ export const PopoverPositioner = /*#__PURE__*/React.forwardRef(function PopoverP
108
112
  anchorHidden: positioning.anchorHidden,
109
113
  instant: instantType
110
114
  };
111
- useAnchoredPopupScrollLock(open && modal === true && openReason !== REASONS.triggerHover, openMethod === 'touch', positionerElement, triggerElement);
112
- const setPositionerElement = React.useCallback(element => {
113
- store.set('positionerElement', element);
114
- }, [store]);
115
115
  const element = usePositioner(componentProps, state, {
116
116
  styles: positioning.positionerStyles,
117
117
  transitionStatus,
@@ -36,7 +36,7 @@ export interface PopoverRootProps<Payload = unknown> {
36
36
  * - `unmount`: When specified, the popover will not be unmounted when closed.
37
37
  * Instead, the `unmount` function must be called to unmount the popover manually.
38
38
  * Useful when the popover's animation is controlled by an external library.
39
- * - `close`: Closes the dialog imperatively when called.
39
+ * - `close`: Closes the popover imperatively when called.
40
40
  */
41
41
  actionsRef?: React.RefObject<PopoverRoot.Actions | null> | undefined;
42
42
  /**
@@ -1,15 +1,16 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { EMPTY_OBJECT } from '@base-ui/utils/empty';
4
5
  import { useOnFirstRender } from '@base-ui/utils/useOnFirstRender';
5
- import { useDismiss, useInteractions, useRole, FloatingTree, useFloatingParentNodeId, useSyncedFloatingRootContext } from "../../floating-ui-react/index.js";
6
+ import { useDismiss, FloatingTree, useFloatingParentNodeId } from "../../floating-ui-react/index.js";
6
7
  import { PopoverRootContext, usePopoverRootContext } from "./PopoverRootContext.js";
7
8
  import { PopoverStore } from "../store/PopoverStore.js";
8
9
  import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js";
9
10
  import { REASONS } from "../../internals/reasons.js";
10
- import { useImplicitActiveTrigger, useOpenStateTransitions } from "../../utils/popups/index.js";
11
- import { useOpenInteractionType } from "../../utils/useOpenInteractionType.js";
12
- import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { FOCUSABLE_POPUP_PROPS, useImplicitActiveTrigger, useOpenStateTransitions, usePopupInteractionProps, usePopupRootSync } from "../../utils/popups/index.js";
12
+ import { mergeProps } from "../../merge-props/index.js";
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
14
  function PopoverRootComponent({
14
15
  props
15
16
  }) {
@@ -44,13 +45,12 @@ function PopoverRootComponent({
44
45
  store.useControlledProp('openProp', openProp);
45
46
  store.useControlledProp('triggerIdProp', triggerIdProp);
46
47
  const open = store.useState('open');
48
+ const mounted = store.useState('mounted');
47
49
  const payload = store.useState('payload');
50
+ const nested = useFloatingParentNodeId() != null;
48
51
  store.useContextCallback('onOpenChange', onOpenChange);
49
52
  store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);
50
- const {
51
- openMethod,
52
- triggerProps: interactionTypeTriggerProps
53
- } = useOpenInteractionType(open);
53
+ usePopupRootSync(store, open);
54
54
  useImplicitActiveTrigger(store);
55
55
  const {
56
56
  forceUnmount
@@ -60,6 +60,10 @@ function PopoverRootComponent({
60
60
  openChangeReason: null
61
61
  });
62
62
  });
63
+ store.useSyncedValues({
64
+ modal,
65
+ nested
66
+ });
63
67
  React.useEffect(() => {
64
68
  if (!open) {
65
69
  store.context.stickIfOpenTimeout.clear();
@@ -72,50 +76,18 @@ function PopoverRootComponent({
72
76
  unmount: forceUnmount,
73
77
  close: handleImperativeClose
74
78
  }), [forceUnmount, handleImperativeClose]);
75
- const floatingRootContext = useSyncedFloatingRootContext({
76
- popupStore: store,
77
- onOpenChange: store.setOpen
78
- });
79
- const dismiss = useDismiss(floatingRootContext, {
80
- outsidePressEvent: {
81
- // Ensure `aria-hidden` on outside elements is removed immediately
82
- // on outside press when trapping focus.
83
- mouse: modal === 'trap-focus' ? 'sloppy' : 'intentional',
84
- touch: 'sloppy'
85
- }
86
- });
87
- const role = useRole(floatingRootContext);
88
- const {
89
- getReferenceProps,
90
- getFloatingProps,
91
- getTriggerProps
92
- } = useInteractions([dismiss, role]);
93
- const activeTriggerProps = React.useMemo(() => {
94
- return getReferenceProps(interactionTypeTriggerProps);
95
- }, [getReferenceProps, interactionTypeTriggerProps]);
96
- const inactiveTriggerProps = React.useMemo(() => {
97
- return getTriggerProps(interactionTypeTriggerProps);
98
- }, [getTriggerProps, interactionTypeTriggerProps]);
99
- const popupProps = React.useMemo(() => {
100
- return getFloatingProps();
101
- }, [getFloatingProps]);
102
- store.useSyncedValues({
103
- modal,
104
- openMethod,
105
- activeTriggerProps,
106
- inactiveTriggerProps,
107
- popupProps,
108
- floatingRootContext,
109
- nested: useFloatingParentNodeId() != null
110
- });
79
+ const shouldRenderInteractions = open || mounted;
111
80
  const popoverContext = React.useMemo(() => ({
112
81
  store
113
82
  }), [store]);
114
- return /*#__PURE__*/_jsx(PopoverRootContext.Provider, {
83
+ return /*#__PURE__*/_jsxs(PopoverRootContext.Provider, {
115
84
  value: popoverContext,
116
- children: typeof children === 'function' ? children({
85
+ children: [shouldRenderInteractions && /*#__PURE__*/_jsx(PopoverInteractions, {
86
+ store: store,
87
+ modal: modal
88
+ }), typeof children === 'function' ? children({
117
89
  payload
118
- }) : children
90
+ }) : children]
119
91
  });
120
92
  }
121
93
 
@@ -136,4 +108,27 @@ export function PopoverRoot(props) {
136
108
  props: props
137
109
  })
138
110
  });
111
+ }
112
+ function PopoverInteractions({
113
+ store,
114
+ modal
115
+ }) {
116
+ const floatingRootContext = store.useState('floatingRootContext');
117
+ const dismiss = useDismiss(floatingRootContext, {
118
+ outsidePressEvent: {
119
+ // Ensure `aria-hidden` on outside elements is removed immediately
120
+ // on outside press when trapping focus.
121
+ mouse: modal === 'trap-focus' ? 'sloppy' : 'intentional',
122
+ touch: 'sloppy'
123
+ }
124
+ });
125
+ const activeTriggerProps = dismiss.reference ?? EMPTY_OBJECT;
126
+ const inactiveTriggerProps = dismiss.trigger ?? EMPTY_OBJECT;
127
+ const popupProps = React.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, dismiss.floating), [dismiss.floating]);
128
+ usePopupInteractionProps(store, {
129
+ activeTriggerProps,
130
+ inactiveTriggerProps,
131
+ popupProps
132
+ });
133
+ return null;
139
134
  }
@@ -37,7 +37,7 @@ export class PopoverHandle {
37
37
  * Indicates whether the popover is currently open.
38
38
  */
39
39
  get isOpen() {
40
- return this.store.state.open;
40
+ return this.store.select('open');
41
41
  }
42
42
  }
43
43
 
@@ -2,11 +2,11 @@ import * as React from 'react';
2
2
  import { ReactStore } from '@base-ui/utils/store';
3
3
  import { Timeout } from '@base-ui/utils/useTimeout';
4
4
  import { type InteractionType } from '@base-ui/utils/useEnhancedClickHandler';
5
- import { PopoverRoot } from "../root/PopoverRoot.js";
5
+ import { type PopoverRoot } from "../root/PopoverRoot.js";
6
6
  import { PopupStoreContext, PopupStoreState } from "../../utils/popups/index.js";
7
7
  export type State<Payload> = PopupStoreState<Payload> & {
8
8
  disabled: boolean;
9
- instantType: 'dismiss' | 'click' | undefined;
9
+ instantType: 'dismiss' | 'click' | 'focus' | 'trigger-change' | undefined;
10
10
  modal: boolean | 'trap-focus';
11
11
  focusManagerModal: boolean;
12
12
  openMethod: InteractionType | null;
@@ -29,7 +29,7 @@ type Context = PopupStoreContext<PopoverRoot.ChangeEventDetails> & {
29
29
  };
30
30
  declare const selectors: {
31
31
  disabled: (state: State<unknown>) => boolean;
32
- instantType: (state: State<unknown>) => "click" | "dismiss" | undefined;
32
+ instantType: (state: State<unknown>) => "click" | "focus" | "dismiss" | "trigger-change" | undefined;
33
33
  openMethod: (state: State<unknown>) => InteractionType | null;
34
34
  openChangeReason: (state: State<unknown>) => import("../index.js").PopoverRootChangeEventReason | null;
35
35
  modal: (state: State<unknown>) => boolean | "trap-focus";
@@ -46,6 +46,8 @@ declare const selectors: {
46
46
  mounted: boolean;
47
47
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
48
48
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
49
+ floatingId: string | undefined;
50
+ triggerCount: number;
49
51
  preventUnmountingOnClose: boolean;
50
52
  payload: unknown;
51
53
  activeTriggerId: string | null;
@@ -63,6 +65,8 @@ declare const selectors: {
63
65
  mounted: boolean;
64
66
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
65
67
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
68
+ floatingId: string | undefined;
69
+ triggerCount: number;
66
70
  preventUnmountingOnClose: boolean;
67
71
  payload: unknown;
68
72
  activeTriggerId: string | null;
@@ -80,6 +84,8 @@ declare const selectors: {
80
84
  mounted: boolean;
81
85
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
82
86
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
87
+ floatingId: string | undefined;
88
+ triggerCount: number;
83
89
  preventUnmountingOnClose: boolean;
84
90
  payload: unknown;
85
91
  activeTriggerId: string | null;
@@ -97,6 +103,8 @@ declare const selectors: {
97
103
  mounted: boolean;
98
104
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
99
105
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
106
+ floatingId: string | undefined;
107
+ triggerCount: number;
100
108
  preventUnmountingOnClose: boolean;
101
109
  payload: unknown;
102
110
  activeTriggerId: string | null;
@@ -108,12 +116,33 @@ declare const selectors: {
108
116
  inactiveTriggerProps: import("../../index.js").HTMLProps;
109
117
  popupProps: import("../../index.js").HTMLProps;
110
118
  }) => import("../../floating-ui-react/components/FloatingRootStore.js").FloatingRootStore;
119
+ triggerCount: (state: {
120
+ open: boolean;
121
+ readonly openProp: boolean | undefined;
122
+ mounted: boolean;
123
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
124
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
125
+ floatingId: string | undefined;
126
+ triggerCount: number;
127
+ preventUnmountingOnClose: boolean;
128
+ payload: unknown;
129
+ activeTriggerId: string | null;
130
+ activeTriggerElement: Element | null;
131
+ readonly triggerIdProp: string | null | undefined;
132
+ popupElement: HTMLElement | null;
133
+ positionerElement: HTMLElement | null;
134
+ activeTriggerProps: import("../../index.js").HTMLProps;
135
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
136
+ popupProps: import("../../index.js").HTMLProps;
137
+ }) => number;
111
138
  preventUnmountingOnClose: (state: {
112
139
  open: boolean;
113
140
  readonly openProp: boolean | undefined;
114
141
  mounted: boolean;
115
142
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
116
143
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
144
+ floatingId: string | undefined;
145
+ triggerCount: number;
117
146
  preventUnmountingOnClose: boolean;
118
147
  payload: unknown;
119
148
  activeTriggerId: string | null;
@@ -131,6 +160,8 @@ declare const selectors: {
131
160
  mounted: boolean;
132
161
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
133
162
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
163
+ floatingId: string | undefined;
164
+ triggerCount: number;
134
165
  preventUnmountingOnClose: boolean;
135
166
  payload: unknown;
136
167
  activeTriggerId: string | null;
@@ -148,6 +179,8 @@ declare const selectors: {
148
179
  mounted: boolean;
149
180
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
150
181
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
182
+ floatingId: string | undefined;
183
+ triggerCount: number;
151
184
  preventUnmountingOnClose: boolean;
152
185
  payload: unknown;
153
186
  activeTriggerId: string | null;
@@ -165,6 +198,8 @@ declare const selectors: {
165
198
  mounted: boolean;
166
199
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
167
200
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
201
+ floatingId: string | undefined;
202
+ triggerCount: number;
168
203
  preventUnmountingOnClose: boolean;
169
204
  payload: unknown;
170
205
  activeTriggerId: string | null;
@@ -176,12 +211,33 @@ declare const selectors: {
176
211
  inactiveTriggerProps: import("../../index.js").HTMLProps;
177
212
  popupProps: import("../../index.js").HTMLProps;
178
213
  }) => Element | null;
214
+ popupId: (state: {
215
+ open: boolean;
216
+ readonly openProp: boolean | undefined;
217
+ mounted: boolean;
218
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
219
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
220
+ floatingId: string | undefined;
221
+ triggerCount: number;
222
+ preventUnmountingOnClose: boolean;
223
+ payload: unknown;
224
+ activeTriggerId: string | null;
225
+ activeTriggerElement: Element | null;
226
+ readonly triggerIdProp: string | null | undefined;
227
+ popupElement: HTMLElement | null;
228
+ positionerElement: HTMLElement | null;
229
+ activeTriggerProps: import("../../index.js").HTMLProps;
230
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
231
+ popupProps: import("../../index.js").HTMLProps;
232
+ }) => string | undefined;
179
233
  isTriggerActive: (state: {
180
234
  open: boolean;
181
235
  readonly openProp: boolean | undefined;
182
236
  mounted: boolean;
183
237
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
184
238
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
239
+ floatingId: string | undefined;
240
+ triggerCount: number;
185
241
  preventUnmountingOnClose: boolean;
186
242
  payload: unknown;
187
243
  activeTriggerId: string | null;
@@ -199,6 +255,8 @@ declare const selectors: {
199
255
  mounted: boolean;
200
256
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
201
257
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
258
+ floatingId: string | undefined;
259
+ triggerCount: number;
202
260
  preventUnmountingOnClose: boolean;
203
261
  payload: unknown;
204
262
  activeTriggerId: string | null;
@@ -216,6 +274,8 @@ declare const selectors: {
216
274
  mounted: boolean;
217
275
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
218
276
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
277
+ floatingId: string | undefined;
278
+ triggerCount: number;
219
279
  preventUnmountingOnClose: boolean;
220
280
  payload: unknown;
221
281
  activeTriggerId: string | null;
@@ -233,6 +293,8 @@ declare const selectors: {
233
293
  mounted: boolean;
234
294
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
235
295
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
296
+ floatingId: string | undefined;
297
+ triggerCount: number;
236
298
  preventUnmountingOnClose: boolean;
237
299
  payload: unknown;
238
300
  activeTriggerId: string | null;
@@ -244,12 +306,33 @@ declare const selectors: {
244
306
  inactiveTriggerProps: import("../../index.js").HTMLProps;
245
307
  popupProps: import("../../index.js").HTMLProps;
246
308
  }, isActive: boolean) => import("../../index.js").HTMLProps;
309
+ triggerPopupId: (state: {
310
+ open: boolean;
311
+ readonly openProp: boolean | undefined;
312
+ mounted: boolean;
313
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
314
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
315
+ floatingId: string | undefined;
316
+ triggerCount: number;
317
+ preventUnmountingOnClose: boolean;
318
+ payload: unknown;
319
+ activeTriggerId: string | null;
320
+ activeTriggerElement: Element | null;
321
+ readonly triggerIdProp: string | null | undefined;
322
+ popupElement: HTMLElement | null;
323
+ positionerElement: HTMLElement | null;
324
+ activeTriggerProps: import("../../index.js").HTMLProps;
325
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
326
+ popupProps: import("../../index.js").HTMLProps;
327
+ }, triggerId: string | undefined) => string | undefined;
247
328
  popupProps: (state: {
248
329
  open: boolean;
249
330
  readonly openProp: boolean | undefined;
250
331
  mounted: boolean;
251
332
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
252
333
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
334
+ floatingId: string | undefined;
335
+ triggerCount: number;
253
336
  preventUnmountingOnClose: boolean;
254
337
  payload: unknown;
255
338
  activeTriggerId: string | null;
@@ -267,6 +350,8 @@ declare const selectors: {
267
350
  mounted: boolean;
268
351
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
269
352
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
353
+ floatingId: string | undefined;
354
+ triggerCount: number;
270
355
  preventUnmountingOnClose: boolean;
271
356
  payload: unknown;
272
357
  activeTriggerId: string | null;
@@ -284,6 +369,8 @@ declare const selectors: {
284
369
  mounted: boolean;
285
370
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
286
371
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
372
+ floatingId: string | undefined;
373
+ triggerCount: number;
287
374
  preventUnmountingOnClose: boolean;
288
375
  payload: unknown;
289
376
  activeTriggerId: string | null;
@@ -297,7 +384,7 @@ declare const selectors: {
297
384
  }) => HTMLElement | null;
298
385
  };
299
386
  export declare class PopoverStore<Payload> extends ReactStore<Readonly<State<Payload>>, Context, Selectors> {
300
- constructor(initialState?: Partial<State<Payload>>);
387
+ constructor(initialState?: Partial<State<Payload>>, floatingId?: string | undefined, nested?: boolean);
301
388
  setOpen: (nextOpen: boolean, eventDetails: Omit<PopoverRoot.ChangeEventDetails, "preventUnmountOnClose">) => void;
302
389
  static useStore<Payload>(externalStore: PopoverStore<Payload> | undefined, initialState: Partial<State<Payload>>): PopoverStore<Payload>;
303
390
  private disposeEffect;
@@ -1,12 +1,12 @@
1
1
  /* eslint-disable react-hooks/rules-of-hooks */
2
+ 'use client';
3
+
2
4
  import * as React from 'react';
3
5
  import * as ReactDOM from 'react-dom';
4
6
  import { ReactStore, createSelector } from '@base-ui/utils/store';
5
7
  import { Timeout } from '@base-ui/utils/useTimeout';
6
- import { useRefWithInit } from '@base-ui/utils/useRefWithInit';
7
- import { useOnMount } from '@base-ui/utils/useOnMount';
8
8
  import { REASONS } from "../../internals/reasons.js";
9
- import { createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap } from "../../utils/popups/index.js";
9
+ import { createPopupFloatingRootContext, createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap, setOpenTriggerState, usePopupStore } from "../../utils/popups/index.js";
10
10
  import { PATIENT_CLICK_THRESHOLD } from "../../internals/constants.js";
11
11
  function createInitialState() {
12
12
  return {
@@ -42,14 +42,16 @@ const selectors = {
42
42
  hasViewport: createSelector(state => state.hasViewport)
43
43
  };
44
44
  export class PopoverStore extends ReactStore {
45
- constructor(initialState) {
45
+ constructor(initialState, floatingId, nested = false) {
46
46
  const initial = {
47
47
  ...createInitialState(),
48
48
  ...initialState
49
49
  };
50
+ const triggerElements = new PopupTriggerMap();
50
51
  if (initial.open && initialState?.mounted === undefined) {
51
52
  initial.mounted = true;
52
53
  }
54
+ initial.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
53
55
  super(initial, {
54
56
  popupRef: /*#__PURE__*/React.createRef(),
55
57
  backdropRef: /*#__PURE__*/React.createRef(),
@@ -59,7 +61,7 @@ export class PopoverStore extends ReactStore {
59
61
  triggerFocusTargetRef: /*#__PURE__*/React.createRef(),
60
62
  beforeContentFocusGuardRef: /*#__PURE__*/React.createRef(),
61
63
  stickIfOpenTimeout: new Timeout(),
62
- triggerElements: new PopupTriggerMap()
64
+ triggerElements
63
65
  }, selectors);
64
66
  }
65
67
  setOpen = (nextOpen, eventDetails) => {
@@ -69,6 +71,10 @@ export class PopoverStore extends ReactStore {
69
71
  eventDetails.preventUnmountOnClose = () => {
70
72
  this.set('preventUnmountingOnClose', true);
71
73
  };
74
+ const activeTriggerId = this.select('activeTriggerId');
75
+ if (!nextOpen && eventDetails.reason === REASONS.closePress && eventDetails.trigger == null && activeTriggerId != null) {
76
+ eventDetails.trigger = this.context.triggerElements.getById(activeTriggerId) ?? this.select('activeTriggerElement') ?? undefined;
77
+ }
72
78
  this.context.onOpenChange?.(nextOpen, eventDetails);
73
79
  if (eventDetails.isCanceled) {
74
80
  return;
@@ -79,14 +85,7 @@ export class PopoverStore extends ReactStore {
79
85
  open: nextOpen,
80
86
  openChangeReason: eventDetails.reason
81
87
  };
82
-
83
- // If a popup is closing, the `trigger` may be null.
84
- // We want to keep the previous value so that exit animations are played and focus is returned correctly.
85
- const newTriggerId = eventDetails.trigger?.id ?? null;
86
- if (newTriggerId || nextOpen) {
87
- updatedState.activeTriggerId = newTriggerId;
88
- updatedState.activeTriggerElement = eventDetails.trigger ?? null;
89
- }
88
+ setOpenTriggerState(updatedState, nextOpen, eventDetails.trigger);
90
89
  this.update(updatedState);
91
90
  };
92
91
  if (isHover) {
@@ -109,11 +108,11 @@ export class PopoverStore extends ReactStore {
109
108
  }
110
109
  };
111
110
  static useStore(externalStore, initialState) {
112
- const internalStore = useRefWithInit(() => {
113
- return new PopoverStore(initialState);
114
- }).current;
115
- const store = externalStore ?? internalStore;
116
- useOnMount(internalStore.disposeEffect);
111
+ const {
112
+ store,
113
+ internalStore
114
+ } = usePopupStore(externalStore, (floatingId, nested) => new PopoverStore(initialState, floatingId, nested));
115
+ React.useEffect(() => internalStore?.disposeEffect(), [internalStore]);
117
116
  return store;
118
117
  }
119
118
  disposeEffect = () => {
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
- import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
5
4
  import { usePopoverRootContext } from "../root/PopoverRootContext.js";
6
5
  import { useRenderElement } from "../../internals/useRenderElement.js";
7
6
  import { useBaseUiId } from "../../internals/useBaseUiId.js";
@@ -23,12 +22,7 @@ export const PopoverTitle = /*#__PURE__*/React.forwardRef(function PopoverTitle(
23
22
  store
24
23
  } = usePopoverRootContext();
25
24
  const id = useBaseUiId(elementProps.id);
26
- useIsoLayoutEffect(() => {
27
- store.set('titleElementId', id);
28
- return () => {
29
- store.set('titleElementId', undefined);
30
- };
31
- }, [store, id]);
25
+ store.useSyncedValueWithCleanup('titleElementId', id);
32
26
  const element = useRenderElement('h2', componentProps, {
33
27
  ref: forwardedRef,
34
28
  props: [{