@base-ui/react 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/CHANGELOG.md +125 -8
  2. package/README.md +1 -1
  3. package/accordion/item/AccordionItem.d.ts +4 -0
  4. package/accordion/item/AccordionItem.js +5 -4
  5. package/accordion/panel/AccordionPanel.js +29 -51
  6. package/accordion/root/AccordionRoot.js +5 -6
  7. package/accordion/trigger/AccordionTrigger.js +3 -4
  8. package/alert-dialog/handle.d.ts +14 -1
  9. package/alert-dialog/handle.js +22 -5
  10. package/alert-dialog/index.d.ts +1 -1
  11. package/alert-dialog/index.parts.d.ts +2 -3
  12. package/alert-dialog/index.parts.js +4 -5
  13. package/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  14. package/alert-dialog/root/AlertDialogRoot.js +2 -56
  15. package/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  16. package/alert-dialog/trigger/AlertDialogTrigger.js +15 -0
  17. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  18. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +18 -0
  19. package/autocomplete/root/AutocompleteRoot.js +9 -10
  20. package/avatar/image/AvatarImage.js +4 -4
  21. package/checkbox/indicator/CheckboxIndicator.js +2 -2
  22. package/checkbox/root/CheckboxRoot.js +49 -11
  23. package/checkbox-group/CheckboxGroup.js +1 -5
  24. package/collapsible/panel/CollapsiblePanel.js +29 -51
  25. package/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  26. package/collapsible/panel/useCollapsiblePanel.js +308 -268
  27. package/collapsible/root/CollapsibleRoot.d.ts +1 -1
  28. package/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  29. package/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  30. package/collapsible/root/useCollapsibleRoot.js +2 -64
  31. package/collapsible/trigger/CollapsibleTrigger.js +5 -6
  32. package/combobox/arrow/ComboboxArrow.js +1 -1
  33. package/combobox/backdrop/ComboboxBackdrop.js +1 -1
  34. package/combobox/chip/ComboboxChip.js +7 -2
  35. package/combobox/clear/ComboboxClear.d.ts +4 -0
  36. package/combobox/clear/ComboboxClear.js +1 -0
  37. package/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  38. package/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  39. package/combobox/icon/ComboboxIcon.js +1 -1
  40. package/combobox/input/ComboboxInput.js +15 -6
  41. package/combobox/item/ComboboxItem.js +8 -14
  42. package/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  43. package/combobox/root/AriaCombobox.js +61 -28
  44. package/combobox/store.d.ts +4 -8
  45. package/combobox/store.js +2 -1
  46. package/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  47. package/csp-provider/CSPProvider.js +1 -1
  48. package/dialog/close/DialogClose.js +6 -6
  49. package/dialog/popup/DialogPopup.js +9 -4
  50. package/dialog/root/DialogRoot.d.ts +1 -2
  51. package/dialog/root/DialogRoot.js +3 -73
  52. package/dialog/root/DialogRootContext.d.ts +1 -0
  53. package/dialog/root/DialogRootContext.js +3 -1
  54. package/dialog/root/useDialogRoot.d.ts +12 -4
  55. package/dialog/root/useDialogRoot.js +27 -25
  56. package/dialog/root/useRenderDialogRoot.d.ts +4 -0
  57. package/dialog/root/useRenderDialogRoot.js +96 -0
  58. package/dialog/store/DialogHandle.d.ts +1 -1
  59. package/dialog/store/DialogHandle.js +2 -2
  60. package/dialog/store/DialogStore.d.ts +88 -1
  61. package/dialog/store/DialogStore.js +12 -17
  62. package/dialog/trigger/DialogTrigger.d.ts +1 -1
  63. package/dialog/trigger/DialogTrigger.js +11 -4
  64. package/dialog/viewport/DialogViewport.js +4 -3
  65. package/drawer/popup/DrawerPopup.js +13 -9
  66. package/drawer/root/DrawerRoot.js +11 -11
  67. package/drawer/root/DrawerRootContext.d.ts +1 -1
  68. package/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  69. package/drawer/viewport/DrawerViewport.js +13 -14
  70. package/esm/accordion/item/AccordionItem.d.ts +4 -0
  71. package/esm/accordion/item/AccordionItem.js +5 -4
  72. package/esm/accordion/panel/AccordionPanel.js +29 -51
  73. package/esm/accordion/root/AccordionRoot.js +5 -6
  74. package/esm/accordion/trigger/AccordionTrigger.js +4 -5
  75. package/esm/alert-dialog/handle.d.ts +14 -1
  76. package/esm/alert-dialog/handle.js +20 -5
  77. package/esm/alert-dialog/index.d.ts +1 -1
  78. package/esm/alert-dialog/index.parts.d.ts +2 -3
  79. package/esm/alert-dialog/index.parts.js +2 -3
  80. package/esm/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  81. package/esm/alert-dialog/root/AlertDialogRoot.js +2 -55
  82. package/esm/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  83. package/esm/alert-dialog/trigger/AlertDialogTrigger.js +10 -0
  84. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  85. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +12 -0
  86. package/esm/autocomplete/root/AutocompleteRoot.js +9 -10
  87. package/esm/avatar/image/AvatarImage.js +4 -4
  88. package/esm/checkbox/indicator/CheckboxIndicator.js +2 -2
  89. package/esm/checkbox/root/CheckboxRoot.js +49 -11
  90. package/esm/checkbox-group/CheckboxGroup.js +1 -5
  91. package/esm/collapsible/panel/CollapsiblePanel.js +29 -51
  92. package/esm/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  93. package/esm/collapsible/panel/useCollapsiblePanel.js +309 -269
  94. package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
  95. package/esm/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  96. package/esm/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  97. package/esm/collapsible/root/useCollapsibleRoot.js +2 -64
  98. package/esm/collapsible/trigger/CollapsibleTrigger.js +5 -6
  99. package/esm/combobox/arrow/ComboboxArrow.js +1 -1
  100. package/esm/combobox/backdrop/ComboboxBackdrop.js +1 -1
  101. package/esm/combobox/chip/ComboboxChip.js +7 -2
  102. package/esm/combobox/clear/ComboboxClear.d.ts +4 -0
  103. package/esm/combobox/clear/ComboboxClear.js +1 -0
  104. package/esm/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  105. package/esm/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  106. package/esm/combobox/icon/ComboboxIcon.js +1 -1
  107. package/esm/combobox/input/ComboboxInput.js +16 -7
  108. package/esm/combobox/item/ComboboxItem.js +8 -14
  109. package/esm/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  110. package/esm/combobox/root/AriaCombobox.js +62 -29
  111. package/esm/combobox/store.d.ts +4 -8
  112. package/esm/combobox/store.js +2 -1
  113. package/esm/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  114. package/esm/csp-provider/CSPProvider.js +1 -1
  115. package/esm/dialog/close/DialogClose.js +6 -6
  116. package/esm/dialog/popup/DialogPopup.js +9 -4
  117. package/esm/dialog/root/DialogRoot.d.ts +1 -2
  118. package/esm/dialog/root/DialogRoot.js +4 -72
  119. package/esm/dialog/root/DialogRootContext.d.ts +1 -0
  120. package/esm/dialog/root/DialogRootContext.js +2 -0
  121. package/esm/dialog/root/useDialogRoot.d.ts +12 -4
  122. package/esm/dialog/root/useDialogRoot.js +28 -27
  123. package/esm/dialog/root/useRenderDialogRoot.d.ts +4 -0
  124. package/esm/dialog/root/useRenderDialogRoot.js +90 -0
  125. package/esm/dialog/store/DialogHandle.d.ts +1 -1
  126. package/esm/dialog/store/DialogHandle.js +2 -2
  127. package/esm/dialog/store/DialogStore.d.ts +88 -1
  128. package/esm/dialog/store/DialogStore.js +13 -18
  129. package/esm/dialog/trigger/DialogTrigger.d.ts +1 -1
  130. package/esm/dialog/trigger/DialogTrigger.js +12 -5
  131. package/esm/dialog/viewport/DialogViewport.js +4 -3
  132. package/esm/drawer/popup/DrawerPopup.js +14 -9
  133. package/esm/drawer/root/DrawerRoot.js +11 -11
  134. package/esm/drawer/root/DrawerRootContext.d.ts +1 -1
  135. package/esm/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  136. package/esm/drawer/viewport/DrawerViewport.js +13 -14
  137. package/esm/field/control/FieldControl.js +2 -6
  138. package/esm/field/item/FieldItem.js +1 -4
  139. package/esm/field/root/FieldRoot.js +11 -3
  140. package/esm/field/root/useFieldValidation.d.ts +1 -0
  141. package/esm/field/root/useFieldValidation.js +23 -20
  142. package/esm/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  143. package/esm/field/validity/FieldValidity.d.ts +1 -1
  144. package/esm/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  145. package/esm/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  146. package/esm/floating-ui-react/components/FloatingFocusManager.js +20 -8
  147. package/esm/floating-ui-react/components/FloatingPortal.js +3 -3
  148. package/esm/floating-ui-react/hooks/useClick.js +83 -74
  149. package/esm/floating-ui-react/hooks/useClientPoint.js +29 -20
  150. package/esm/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  151. package/esm/floating-ui-react/hooks/useDismiss.js +82 -93
  152. package/esm/floating-ui-react/hooks/useFloating.js +37 -32
  153. package/esm/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  154. package/esm/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  155. package/esm/floating-ui-react/hooks/useFocus.js +84 -81
  156. package/esm/floating-ui-react/hooks/useHover.js +72 -76
  157. package/esm/floating-ui-react/hooks/useHoverFloatingInteraction.js +49 -44
  158. package/esm/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  159. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  160. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +44 -39
  161. package/esm/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  162. package/esm/floating-ui-react/hooks/useHoverShared.js +4 -0
  163. package/esm/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  164. package/esm/floating-ui-react/hooks/useListNavigation.js +83 -74
  165. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  166. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +25 -20
  167. package/esm/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  168. package/esm/floating-ui-react/hooks/useTypeahead.js +33 -52
  169. package/esm/floating-ui-react/index.d.ts +0 -2
  170. package/esm/floating-ui-react/index.js +0 -2
  171. package/esm/floating-ui-react/types.d.ts +2 -7
  172. package/esm/floating-ui-react/utils/composite.js +2 -0
  173. package/esm/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  174. package/esm/floating-ui-react/utils/enqueueFocus.js +10 -7
  175. package/esm/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  176. package/esm/form/Form.js +2 -2
  177. package/esm/index.js +1 -1
  178. package/esm/internals/composite/composite.d.ts +0 -1
  179. package/esm/internals/composite/composite.js +1 -2
  180. package/esm/internals/composite/root/useCompositeRoot.js +2 -2
  181. package/esm/internals/createBaseUIEventDetails.d.ts +2 -0
  182. package/esm/internals/csp-context/index.d.ts +2 -0
  183. package/esm/internals/csp-context/index.js +1 -0
  184. package/esm/internals/field-register-control/index.d.ts +0 -1
  185. package/esm/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  186. package/esm/internals/field-register-control/useFieldControlRegistration.js +11 -14
  187. package/esm/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  188. package/esm/internals/field-register-control/useRegisterFieldControl.js +6 -11
  189. package/esm/internals/field-root-context/FieldRootContext.d.ts +1 -0
  190. package/esm/internals/field-root-context/FieldRootContext.js +3 -2
  191. package/esm/internals/form-context/FormContext.d.ts +5 -1
  192. package/esm/internals/reason-parts.d.ts +2 -0
  193. package/esm/internals/reason-parts.js +2 -0
  194. package/esm/internals/types.d.ts +1 -0
  195. package/esm/internals/use-button/useButton.js +4 -4
  196. package/esm/internals/usePressAndHold.js +2 -2
  197. package/esm/internals/useRenderElement.js +2 -0
  198. package/esm/menu/arrow/MenuArrow.js +1 -1
  199. package/esm/menu/backdrop/MenuBackdrop.js +1 -1
  200. package/esm/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  201. package/esm/menu/group/MenuGroup.js +1 -4
  202. package/esm/menu/group/MenuGroupContext.d.ts +1 -3
  203. package/esm/menu/group/MenuGroupContext.js +1 -1
  204. package/esm/menu/group-label/MenuGroupLabel.js +4 -6
  205. package/esm/menu/link-item/MenuLinkItem.js +2 -2
  206. package/esm/menu/popup/MenuPopup.js +5 -5
  207. package/esm/menu/radio-group/MenuRadioGroup.js +11 -5
  208. package/esm/menu/radio-item/MenuRadioItem.js +5 -7
  209. package/esm/menu/root/MenuRoot.js +63 -68
  210. package/esm/menu/store/MenuHandle.js +1 -1
  211. package/esm/menu/store/MenuStore.d.ts +87 -0
  212. package/esm/menu/submenu-trigger/MenuSubmenuTrigger.js +8 -5
  213. package/esm/menu/trigger/MenuTrigger.js +13 -10
  214. package/esm/menu/viewport/MenuViewport.d.ts +2 -2
  215. package/esm/menu/viewport/MenuViewport.js +2 -2
  216. package/esm/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  217. package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  218. package/esm/navigation-menu/content/NavigationMenuContent.js +8 -5
  219. package/esm/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  220. package/esm/navigation-menu/item/NavigationMenuItem.js +2 -2
  221. package/esm/navigation-menu/list/NavigationMenuList.js +1 -1
  222. package/esm/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  223. package/esm/navigation-menu/root/NavigationMenuRoot.js +1 -3
  224. package/esm/navigation-menu/trigger/NavigationMenuTrigger.js +24 -17
  225. package/esm/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  226. package/esm/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  227. package/esm/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  228. package/esm/number-field/input/NumberFieldInput.js +3 -5
  229. package/esm/number-field/root/NumberFieldRoot.js +5 -2
  230. package/esm/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  231. package/esm/otp-field/input/OTPFieldInput.js +43 -29
  232. package/esm/otp-field/root/OTPFieldRoot.d.ts +17 -8
  233. package/esm/otp-field/root/OTPFieldRoot.js +33 -33
  234. package/esm/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  235. package/esm/otp-field/utils/otp.d.ts +5 -4
  236. package/esm/otp-field/utils/otp.js +23 -12
  237. package/esm/popover/arrow/PopoverArrow.js +1 -1
  238. package/esm/popover/backdrop/PopoverBackdrop.js +1 -1
  239. package/esm/popover/close/PopoverClose.js +2 -2
  240. package/esm/popover/description/PopoverDescription.js +1 -7
  241. package/esm/popover/popup/PopoverPopup.d.ts +1 -1
  242. package/esm/popover/popup/PopoverPopup.js +16 -10
  243. package/esm/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  244. package/esm/popover/popup/PopoverPopupDataAttributes.js +1 -1
  245. package/esm/popover/positioner/PopoverPositioner.js +5 -5
  246. package/esm/popover/root/PopoverRoot.d.ts +1 -1
  247. package/esm/popover/root/PopoverRoot.js +42 -47
  248. package/esm/popover/store/PopoverHandle.js +1 -1
  249. package/esm/popover/store/PopoverStore.d.ts +91 -4
  250. package/esm/popover/store/PopoverStore.js +17 -18
  251. package/esm/popover/title/PopoverTitle.js +1 -7
  252. package/esm/popover/trigger/PopoverTrigger.js +24 -17
  253. package/esm/popover/viewport/PopoverViewport.d.ts +3 -3
  254. package/esm/popover/viewport/PopoverViewport.js +2 -2
  255. package/esm/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  256. package/esm/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  257. package/esm/preview-card/positioner/PreviewCardPositioner.js +11 -1
  258. package/esm/preview-card/root/PreviewCardRoot.d.ts +1 -1
  259. package/esm/preview-card/root/PreviewCardRoot.js +32 -22
  260. package/esm/preview-card/store/PreviewCardHandle.js +1 -1
  261. package/esm/preview-card/store/PreviewCardStore.d.ts +90 -2
  262. package/esm/preview-card/store/PreviewCardStore.js +19 -31
  263. package/esm/preview-card/trigger/PreviewCardTrigger.js +6 -3
  264. package/esm/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  265. package/esm/preview-card/viewport/PreviewCardViewport.js +2 -2
  266. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  267. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  268. package/esm/progress/indicator/ProgressIndicator.js +6 -11
  269. package/esm/progress/root/ProgressRoot.d.ts +1 -1
  270. package/esm/radio/root/RadioRoot.js +7 -3
  271. package/esm/radio-group/RadioGroup.js +4 -11
  272. package/esm/radio-group/RadioGroupContext.d.ts +0 -1
  273. package/esm/scroll-area/content/ScrollAreaContent.js +4 -4
  274. package/esm/scroll-area/root/ScrollAreaRoot.js +1 -1
  275. package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  276. package/esm/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  277. package/esm/select/arrow/SelectArrow.js +1 -1
  278. package/esm/select/backdrop/SelectBackdrop.js +1 -1
  279. package/esm/select/group/SelectGroup.js +1 -1
  280. package/esm/select/group-label/SelectGroupLabel.js +2 -2
  281. package/esm/select/icon/SelectIcon.js +1 -1
  282. package/esm/select/item/SelectItem.js +46 -32
  283. package/esm/select/item/SelectItemContext.d.ts +1 -1
  284. package/esm/select/item-indicator/SelectItemIndicator.js +1 -2
  285. package/esm/select/item-text/SelectItemText.js +9 -6
  286. package/esm/select/list/SelectList.js +1 -1
  287. package/esm/select/popup/SelectPopup.js +8 -3
  288. package/esm/select/positioner/SelectPositioner.js +3 -0
  289. package/esm/select/root/SelectRoot.js +46 -40
  290. package/esm/select/root/SelectRootContext.d.ts +4 -5
  291. package/esm/select/store.d.ts +3 -0
  292. package/esm/select/store.js +1 -0
  293. package/esm/select/trigger/SelectTrigger.d.ts +5 -0
  294. package/esm/select/trigger/SelectTrigger.js +19 -33
  295. package/esm/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  296. package/esm/select/trigger/SelectTriggerDataAttributes.js +5 -0
  297. package/esm/slider/control/SliderControl.js +10 -12
  298. package/esm/slider/root/SliderRoot.js +1 -4
  299. package/esm/slider/thumb/SliderThumb.js +32 -30
  300. package/esm/slider/value/SliderValue.js +7 -15
  301. package/esm/switch/root/SwitchRoot.js +10 -10
  302. package/esm/switch/thumb/SwitchThumb.js +1 -9
  303. package/esm/tabs/indicator/TabsIndicator.js +14 -19
  304. package/esm/tabs/list/TabsList.js +4 -10
  305. package/esm/tabs/list/TabsListContext.d.ts +2 -1
  306. package/esm/tabs/panel/TabsPanel.js +1 -1
  307. package/esm/tabs/root/TabsRoot.d.ts +16 -1
  308. package/esm/tabs/root/TabsRoot.js +73 -25
  309. package/esm/tabs/root/TabsRootContext.d.ts +0 -2
  310. package/esm/toast/provider/ToastProvider.js +1 -1
  311. package/esm/toast/root/ToastRoot.d.ts +1 -1
  312. package/esm/toast/root/ToastRoot.js +108 -131
  313. package/esm/toast/root/ToastRootDataAttributes.d.ts +1 -1
  314. package/esm/toast/root/ToastRootDataAttributes.js +1 -1
  315. package/esm/toast/store.d.ts +9 -1
  316. package/esm/toast/store.js +19 -13
  317. package/esm/toast/useToastManager.d.ts +1 -1
  318. package/esm/toast/viewport/ToastViewport.js +1 -1
  319. package/esm/toggle/Toggle.js +5 -9
  320. package/esm/toggle-group/ToggleGroup.d.ts +2 -2
  321. package/esm/toggle-group/ToggleGroup.js +6 -13
  322. package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
  323. package/esm/toolbar/link/ToolbarLink.js +1 -2
  324. package/esm/tooltip/arrow/TooltipArrow.js +3 -3
  325. package/esm/tooltip/popup/TooltipPopup.js +5 -4
  326. package/esm/tooltip/root/TooltipRoot.js +35 -26
  327. package/esm/tooltip/store/TooltipHandle.js +1 -1
  328. package/esm/tooltip/store/TooltipStore.d.ts +90 -2
  329. package/esm/tooltip/store/TooltipStore.js +18 -31
  330. package/esm/tooltip/trigger/TooltipTrigger.js +151 -20
  331. package/esm/tooltip/viewport/TooltipViewport.d.ts +2 -2
  332. package/esm/tooltip/viewport/TooltipViewport.js +2 -2
  333. package/esm/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  334. package/esm/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  335. package/esm/unstable-use-media-query/index.js +1 -1
  336. package/esm/utils/popups/index.d.ts +1 -0
  337. package/esm/utils/popups/index.js +1 -0
  338. package/esm/utils/popups/inlineRect.d.ts +15 -0
  339. package/esm/utils/popups/inlineRect.js +191 -0
  340. package/esm/utils/popups/popupStoreUtils.d.ts +28 -10
  341. package/esm/utils/popups/popupStoreUtils.js +105 -20
  342. package/esm/utils/popups/popupTriggerMap.js +2 -0
  343. package/esm/utils/popups/store.d.ts +15 -2
  344. package/esm/utils/popups/store.js +38 -2
  345. package/esm/utils/popups/useTriggerFocusGuards.js +4 -5
  346. package/esm/utils/useAnchorPositioning.d.ts +5 -0
  347. package/esm/utils/useAnchorPositioning.js +12 -9
  348. package/esm/utils/useOpenInteractionType.d.ts +4 -0
  349. package/esm/utils/useOpenInteractionType.js +23 -18
  350. package/field/control/FieldControl.js +2 -6
  351. package/field/item/FieldItem.js +1 -4
  352. package/field/root/FieldRoot.js +11 -3
  353. package/field/root/useFieldValidation.d.ts +1 -0
  354. package/field/root/useFieldValidation.js +23 -20
  355. package/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  356. package/field/validity/FieldValidity.d.ts +1 -1
  357. package/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  358. package/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  359. package/floating-ui-react/components/FloatingFocusManager.js +20 -8
  360. package/floating-ui-react/components/FloatingPortal.js +3 -3
  361. package/floating-ui-react/hooks/useClick.js +82 -73
  362. package/floating-ui-react/hooks/useClientPoint.js +29 -20
  363. package/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  364. package/floating-ui-react/hooks/useDismiss.js +82 -92
  365. package/floating-ui-react/hooks/useFloating.js +36 -32
  366. package/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  367. package/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  368. package/floating-ui-react/hooks/useFocus.js +84 -81
  369. package/floating-ui-react/hooks/useHover.js +74 -78
  370. package/floating-ui-react/hooks/useHoverFloatingInteraction.js +48 -43
  371. package/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  372. package/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  373. package/floating-ui-react/hooks/useHoverReferenceInteraction.js +43 -38
  374. package/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  375. package/floating-ui-react/hooks/useHoverShared.js +11 -0
  376. package/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  377. package/floating-ui-react/hooks/useListNavigation.js +83 -74
  378. package/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  379. package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +26 -20
  380. package/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  381. package/floating-ui-react/hooks/useTypeahead.js +33 -52
  382. package/floating-ui-react/index.d.ts +0 -2
  383. package/floating-ui-react/index.js +0 -14
  384. package/floating-ui-react/types.d.ts +2 -7
  385. package/floating-ui-react/utils/composite.js +2 -0
  386. package/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  387. package/floating-ui-react/utils/enqueueFocus.js +10 -7
  388. package/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  389. package/form/Form.js +2 -2
  390. package/index.js +1 -1
  391. package/internals/composite/composite.d.ts +0 -1
  392. package/internals/composite/composite.js +2 -3
  393. package/internals/composite/root/useCompositeRoot.js +1 -1
  394. package/internals/createBaseUIEventDetails.d.ts +2 -0
  395. package/internals/csp-context/index.d.ts +2 -0
  396. package/internals/csp-context/index.js +18 -0
  397. package/internals/field-register-control/index.d.ts +0 -1
  398. package/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  399. package/internals/field-register-control/useFieldControlRegistration.js +11 -14
  400. package/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  401. package/internals/field-register-control/useRegisterFieldControl.js +6 -11
  402. package/internals/field-root-context/FieldRootContext.d.ts +1 -0
  403. package/internals/field-root-context/FieldRootContext.js +4 -3
  404. package/internals/form-context/FormContext.d.ts +5 -1
  405. package/internals/reason-parts.d.ts +2 -0
  406. package/internals/reason-parts.js +3 -1
  407. package/internals/types.d.ts +1 -0
  408. package/internals/use-button/useButton.js +4 -4
  409. package/internals/usePressAndHold.js +2 -2
  410. package/internals/useRenderElement.js +2 -0
  411. package/menu/arrow/MenuArrow.js +1 -1
  412. package/menu/backdrop/MenuBackdrop.js +1 -1
  413. package/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  414. package/menu/group/MenuGroup.js +1 -4
  415. package/menu/group/MenuGroupContext.d.ts +1 -3
  416. package/menu/group/MenuGroupContext.js +1 -1
  417. package/menu/group-label/MenuGroupLabel.js +4 -6
  418. package/menu/link-item/MenuLinkItem.js +2 -2
  419. package/menu/popup/MenuPopup.js +5 -5
  420. package/menu/radio-group/MenuRadioGroup.js +11 -5
  421. package/menu/radio-item/MenuRadioItem.js +5 -7
  422. package/menu/root/MenuRoot.js +60 -65
  423. package/menu/store/MenuHandle.js +1 -1
  424. package/menu/store/MenuStore.d.ts +87 -0
  425. package/menu/submenu-trigger/MenuSubmenuTrigger.js +7 -4
  426. package/menu/trigger/MenuTrigger.js +12 -9
  427. package/menu/viewport/MenuViewport.d.ts +2 -2
  428. package/menu/viewport/MenuViewport.js +2 -2
  429. package/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  430. package/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  431. package/navigation-menu/content/NavigationMenuContent.js +8 -5
  432. package/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  433. package/navigation-menu/item/NavigationMenuItem.js +2 -2
  434. package/navigation-menu/list/NavigationMenuList.js +1 -1
  435. package/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  436. package/navigation-menu/root/NavigationMenuRoot.js +1 -3
  437. package/navigation-menu/trigger/NavigationMenuTrigger.js +23 -16
  438. package/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  439. package/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  440. package/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  441. package/number-field/input/NumberFieldInput.js +3 -5
  442. package/number-field/root/NumberFieldRoot.js +5 -2
  443. package/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  444. package/otp-field/input/OTPFieldInput.js +42 -28
  445. package/otp-field/root/OTPFieldRoot.d.ts +17 -8
  446. package/otp-field/root/OTPFieldRoot.js +32 -32
  447. package/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  448. package/otp-field/utils/otp.d.ts +5 -4
  449. package/otp-field/utils/otp.js +24 -12
  450. package/package.json +331 -317
  451. package/popover/arrow/PopoverArrow.js +1 -1
  452. package/popover/backdrop/PopoverBackdrop.js +1 -1
  453. package/popover/close/PopoverClose.js +2 -2
  454. package/popover/description/PopoverDescription.js +1 -7
  455. package/popover/popup/PopoverPopup.d.ts +1 -1
  456. package/popover/popup/PopoverPopup.js +16 -10
  457. package/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  458. package/popover/popup/PopoverPopupDataAttributes.js +1 -1
  459. package/popover/positioner/PopoverPositioner.js +5 -5
  460. package/popover/root/PopoverRoot.d.ts +1 -1
  461. package/popover/root/PopoverRoot.js +39 -44
  462. package/popover/store/PopoverHandle.js +1 -1
  463. package/popover/store/PopoverStore.d.ts +91 -4
  464. package/popover/store/PopoverStore.js +16 -19
  465. package/popover/title/PopoverTitle.js +1 -7
  466. package/popover/trigger/PopoverTrigger.js +23 -16
  467. package/popover/viewport/PopoverViewport.d.ts +3 -3
  468. package/popover/viewport/PopoverViewport.js +2 -2
  469. package/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  470. package/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  471. package/preview-card/positioner/PreviewCardPositioner.js +11 -1
  472. package/preview-card/root/PreviewCardRoot.d.ts +1 -1
  473. package/preview-card/root/PreviewCardRoot.js +30 -20
  474. package/preview-card/store/PreviewCardHandle.js +1 -1
  475. package/preview-card/store/PreviewCardStore.d.ts +90 -2
  476. package/preview-card/store/PreviewCardStore.js +18 -30
  477. package/preview-card/trigger/PreviewCardTrigger.js +5 -2
  478. package/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  479. package/preview-card/viewport/PreviewCardViewport.js +2 -2
  480. package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  481. package/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  482. package/progress/indicator/ProgressIndicator.js +6 -11
  483. package/progress/root/ProgressRoot.d.ts +1 -1
  484. package/radio/root/RadioRoot.js +7 -3
  485. package/radio-group/RadioGroup.js +4 -11
  486. package/radio-group/RadioGroupContext.d.ts +0 -1
  487. package/scroll-area/content/ScrollAreaContent.js +4 -4
  488. package/scroll-area/root/ScrollAreaRoot.js +1 -1
  489. package/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  490. package/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  491. package/select/arrow/SelectArrow.js +1 -1
  492. package/select/backdrop/SelectBackdrop.js +1 -1
  493. package/select/group/SelectGroup.js +1 -1
  494. package/select/group-label/SelectGroupLabel.js +2 -2
  495. package/select/icon/SelectIcon.js +1 -1
  496. package/select/item/SelectItem.js +46 -32
  497. package/select/item/SelectItemContext.d.ts +1 -1
  498. package/select/item-indicator/SelectItemIndicator.js +1 -2
  499. package/select/item-text/SelectItemText.js +9 -6
  500. package/select/list/SelectList.js +1 -1
  501. package/select/popup/SelectPopup.js +8 -3
  502. package/select/positioner/SelectPositioner.js +3 -0
  503. package/select/root/SelectRoot.js +45 -39
  504. package/select/root/SelectRootContext.d.ts +4 -5
  505. package/select/store.d.ts +3 -0
  506. package/select/store.js +1 -0
  507. package/select/trigger/SelectTrigger.d.ts +5 -0
  508. package/select/trigger/SelectTrigger.js +19 -33
  509. package/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  510. package/select/trigger/SelectTriggerDataAttributes.js +5 -0
  511. package/slider/control/SliderControl.js +9 -11
  512. package/slider/root/SliderRoot.js +1 -4
  513. package/slider/thumb/SliderThumb.js +32 -30
  514. package/slider/value/SliderValue.js +7 -15
  515. package/switch/root/SwitchRoot.js +10 -10
  516. package/switch/thumb/SwitchThumb.js +1 -9
  517. package/tabs/indicator/TabsIndicator.js +14 -19
  518. package/tabs/list/TabsList.js +4 -10
  519. package/tabs/list/TabsListContext.d.ts +2 -1
  520. package/tabs/panel/TabsPanel.js +1 -1
  521. package/tabs/root/TabsRoot.d.ts +16 -1
  522. package/tabs/root/TabsRoot.js +71 -24
  523. package/tabs/root/TabsRootContext.d.ts +0 -2
  524. package/toast/provider/ToastProvider.js +1 -1
  525. package/toast/root/ToastRoot.d.ts +1 -1
  526. package/toast/root/ToastRoot.js +110 -133
  527. package/toast/root/ToastRootDataAttributes.d.ts +1 -1
  528. package/toast/root/ToastRootDataAttributes.js +1 -1
  529. package/toast/store.d.ts +9 -1
  530. package/toast/store.js +18 -12
  531. package/toast/useToastManager.d.ts +1 -1
  532. package/toast/viewport/ToastViewport.js +1 -1
  533. package/toggle/Toggle.js +5 -9
  534. package/toggle-group/ToggleGroup.d.ts +2 -2
  535. package/toggle-group/ToggleGroup.js +6 -13
  536. package/toolbar/link/ToolbarLink.d.ts +1 -1
  537. package/toolbar/link/ToolbarLink.js +1 -2
  538. package/tooltip/arrow/TooltipArrow.js +3 -3
  539. package/tooltip/popup/TooltipPopup.js +5 -4
  540. package/tooltip/root/TooltipRoot.js +32 -23
  541. package/tooltip/store/TooltipHandle.js +1 -1
  542. package/tooltip/store/TooltipStore.d.ts +90 -2
  543. package/tooltip/store/TooltipStore.js +17 -30
  544. package/tooltip/trigger/TooltipTrigger.js +152 -20
  545. package/tooltip/viewport/TooltipViewport.d.ts +2 -2
  546. package/tooltip/viewport/TooltipViewport.js +2 -2
  547. package/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  548. package/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  549. package/unstable-use-media-query/index.js +1 -1
  550. package/utils/popups/index.d.ts +1 -0
  551. package/utils/popups/index.js +11 -0
  552. package/utils/popups/inlineRect.d.ts +15 -0
  553. package/utils/popups/inlineRect.js +198 -0
  554. package/utils/popups/popupStoreUtils.d.ts +28 -10
  555. package/utils/popups/popupStoreUtils.js +110 -20
  556. package/utils/popups/popupTriggerMap.js +2 -0
  557. package/utils/popups/store.d.ts +15 -2
  558. package/utils/popups/store.js +39 -2
  559. package/utils/popups/useTriggerFocusGuards.js +4 -5
  560. package/utils/useAnchorPositioning.d.ts +5 -0
  561. package/utils/useAnchorPositioning.js +12 -9
  562. package/utils/useOpenInteractionType.d.ts +4 -0
  563. package/utils/useOpenInteractionType.js +24 -17
  564. package/checkbox-group/index.parts.d.ts +0 -1
  565. package/checkbox-group/index.parts.js +0 -12
  566. package/esm/checkbox-group/index.parts.d.ts +0 -1
  567. package/esm/checkbox-group/index.parts.js +0 -1
  568. package/esm/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  569. package/esm/floating-ui-react/hooks/useInteractions.js +0 -88
  570. package/esm/floating-ui-react/hooks/useRole.d.ts +0 -17
  571. package/esm/floating-ui-react/hooks/useRole.js +0 -113
  572. package/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  573. package/floating-ui-react/hooks/useInteractions.js +0 -95
  574. package/floating-ui-react/hooks/useRole.d.ts +0 -17
  575. package/floating-ui-react/hooks/useRole.js +0 -120
  576. /package/{csp-provider → esm/internals/csp-context}/CSPContext.d.ts +0 -0
  577. /package/esm/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
  578. /package/{esm/csp-provider → internals/csp-context}/CSPContext.d.ts +0 -0
  579. /package/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
@@ -7,13 +7,14 @@ import { useButton } from "../../internals/use-button/useButton.js";
7
7
  import { triggerOpenStateMapping, pressableTriggerOpenStateMapping } from "../../utils/popupStateMapping.js";
8
8
  import { useRenderElement } from "../../internals/useRenderElement.js";
9
9
  import { CLICK_TRIGGER_IDENTIFIER } from "../../internals/constants.js";
10
- import { safePolygon, useClick, useHoverReferenceInteraction, useInteractions } from "../../floating-ui-react/index.js";
10
+ import { safePolygon, useClick, useHoverReferenceInteraction } from "../../floating-ui-react/index.js";
11
11
  import { OPEN_DELAY } from "../utils/constants.js";
12
12
  import { useBaseUiId } from "../../internals/useBaseUiId.js";
13
13
  import { FocusGuard } from "../../utils/FocusGuard.js";
14
14
  import { REASONS } from "../../internals/reasons.js";
15
15
  import { useTriggerDataForwarding } from "../../utils/popups/index.js";
16
16
  import { useTriggerFocusGuards } from "../../utils/popups/useTriggerFocusGuards.js";
17
+ import { useOpenMethodTriggerProps } from "../../utils/useOpenInteractionType.js";
17
18
 
18
19
  /**
19
20
  * A button that opens the popover.
@@ -26,6 +27,7 @@ export const PopoverTrigger = /*#__PURE__*/React.forwardRef(function PopoverTrig
26
27
  const {
27
28
  render,
28
29
  className,
30
+ style,
29
31
  disabled = false,
30
32
  nativeButton = true,
31
33
  handle,
@@ -34,7 +36,6 @@ export const PopoverTrigger = /*#__PURE__*/React.forwardRef(function PopoverTrig
34
36
  delay = OPEN_DELAY,
35
37
  closeDelay = 0,
36
38
  id: idProp,
37
- style,
38
39
  ...elementProps
39
40
  } = componentProps;
40
41
  const rootContext = usePopoverRootContext(true);
@@ -46,6 +47,7 @@ export const PopoverTrigger = /*#__PURE__*/React.forwardRef(function PopoverTrig
46
47
  const isTriggerActive = store.useState('isTriggerActive', thisTriggerId);
47
48
  const floatingContext = store.useState('floatingRootContext');
48
49
  const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId);
50
+ const popupId = store.useState('triggerPopupId', thisTriggerId);
49
51
  const triggerElementRef = React.useRef(null);
50
52
  const {
51
53
  registerTrigger,
@@ -77,12 +79,10 @@ export const PopoverTrigger = /*#__PURE__*/React.forwardRef(function PopoverTrig
77
79
  enabled: floatingContext != null,
78
80
  stickIfOpen
79
81
  });
80
- const localProps = useInteractions([click]);
82
+ const interactionTypeProps = useOpenMethodTriggerProps(() => store.select('open'), interactionType => {
83
+ store.set('openMethod', interactionType);
84
+ });
81
85
  const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);
82
- const state = {
83
- disabled,
84
- open: isOpenedByThisTrigger
85
- };
86
86
  const {
87
87
  getButtonProps,
88
88
  buttonRef
@@ -90,33 +90,40 @@ export const PopoverTrigger = /*#__PURE__*/React.forwardRef(function PopoverTrig
90
90
  disabled,
91
91
  native: nativeButton
92
92
  });
93
- const stateAttributesMapping = React.useMemo(() => ({
93
+ const stateAttributesMapping = {
94
94
  open(value) {
95
95
  if (value && openReason === REASONS.triggerPress) {
96
96
  return pressableTriggerOpenStateMapping.open(value);
97
97
  }
98
98
  return triggerOpenStateMapping.open(value);
99
99
  }
100
- }), [openReason]);
100
+ };
101
+ const {
102
+ preFocusGuardRef,
103
+ handlePreFocusGuardFocus,
104
+ handleFocusTargetFocus
105
+ } = useTriggerFocusGuards(store, triggerElementRef);
106
+ const state = {
107
+ disabled,
108
+ open: isOpenedByThisTrigger
109
+ };
101
110
  const element = useRenderElement('button', componentProps, {
102
111
  state,
103
112
  ref: [buttonRef, forwardedRef, registerTrigger, triggerElementRef],
104
- props: [localProps.getReferenceProps(), hoverProps, rootTriggerProps, {
113
+ props: [click.reference, hoverProps, rootTriggerProps, interactionTypeProps, {
105
114
  [CLICK_TRIGGER_IDENTIFIER]: '',
106
- id: thisTriggerId
115
+ id: thisTriggerId,
116
+ 'aria-haspopup': 'dialog',
117
+ 'aria-expanded': isOpenedByThisTrigger,
118
+ 'aria-controls': popupId
107
119
  }, elementProps, getButtonProps],
108
120
  stateAttributesMapping
109
121
  });
110
- const {
111
- preFocusGuardRef,
112
- handlePreFocusGuardFocus,
113
- handleFocusTargetFocus
114
- } = useTriggerFocusGuards(store, triggerElementRef);
115
122
 
116
123
  // A fragment with key is required to ensure that the `element` is mounted to the same DOM node
117
124
  // regardless of whether the focus guards are rendered or not.
118
125
 
119
- if (isTriggerActive && !focusManagerModal) {
126
+ if (isMountedByThisTrigger && !focusManagerModal) {
120
127
  return /*#__PURE__*/_jsxs(React.Fragment, {
121
128
  children: [/*#__PURE__*/_jsx(FocusGuard, {
122
129
  ref: preFocusGuardRef,
@@ -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 Popover](https://base-ui.com/react/components/popover)
@@ -21,7 +21,7 @@ export interface PopoverViewportState {
21
21
  /**
22
22
  * Present if animations should be instant.
23
23
  */
24
- instant: 'dismiss' | 'click' | undefined;
24
+ instant: 'dismiss' | 'click' | 'focus' | 'trigger-change' | undefined;
25
25
  }
26
26
  export declare namespace PopoverViewport {
27
27
  interface Props extends BaseUIComponentProps<'div', PopoverViewportState> {
@@ -14,8 +14,8 @@ const stateAttributesMapping = {
14
14
 
15
15
  /**
16
16
  * A viewport for displaying content transitions.
17
- * This component is only required if one popup can be opened by multiple triggers, its content change based on the trigger
18
- * and switching between them is animated.
17
+ * This component is only required if one popup can be opened by multiple triggers, its content
18
+ * changes based on the trigger, and switching between them is animated.
19
19
  * Renders a `<div>` element.
20
20
  *
21
21
  * Documentation: [Base UI Popover](https://base-ui.com/react/components/popover)
@@ -20,7 +20,7 @@ export declare enum PopoverViewportDataAttributes {
20
20
  transitioning = "data-transitioning",
21
21
  /**
22
22
  * Present if animations should be instant.
23
- * @type {'dismiss' | 'click'}
23
+ * @type {'click' | 'dismiss' | 'focus' | 'trigger-change'}
24
24
  */
25
25
  instant = "data-instant",
26
26
  }
@@ -20,7 +20,7 @@ export let PopoverViewportDataAttributes = /*#__PURE__*/function (PopoverViewpor
20
20
  PopoverViewportDataAttributes["transitioning"] = "data-transitioning";
21
21
  /**
22
22
  * Present if animations should be instant.
23
- * @type {'dismiss' | 'click'}
23
+ * @type {'click' | 'dismiss' | 'focus' | 'trigger-change'}
24
24
  */
25
25
  PopoverViewportDataAttributes["instant"] = "data-instant";
26
26
  return PopoverViewportDataAttributes;
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
4
5
  import { usePreviewCardRootContext } from "../root/PreviewCardContext.js";
5
6
  import { PreviewCardPositionerContext } from "./PreviewCardPositionerContext.js";
6
7
  import { FloatingNode, useFloatingNodeId } from "../../floating-ui-react/index.js";
@@ -9,6 +10,7 @@ import { usePreviewCardPortalContext } from "../portal/PreviewCardPortalContext.
9
10
  import { POPUP_COLLISION_AVOIDANCE } from "../../internals/constants.js";
10
11
  import { adaptiveOrigin } from "../../utils/adaptiveOriginMiddleware.js";
11
12
  import { usePositioner } from "../../utils/usePositioner.js";
13
+ import { createInlineMiddleware } from "../../utils/popups/index.js";
12
14
 
13
15
  /**
14
16
  * Positions the popup against the trigger.
@@ -45,6 +47,7 @@ export const PreviewCardPositioner = /*#__PURE__*/React.forwardRef(function Prev
45
47
  const instantType = store.useState('instantType');
46
48
  const transitionStatus = store.useState('transitionStatus');
47
49
  const hasViewport = store.useState('hasViewport');
50
+ const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
48
51
  const positioning = useAnchorPositioning({
49
52
  anchor,
50
53
  floatingRootContext,
@@ -62,8 +65,15 @@ export const PreviewCardPositioner = /*#__PURE__*/React.forwardRef(function Prev
62
65
  keepMounted,
63
66
  nodeId,
64
67
  collisionAvoidance,
65
- adaptiveOrigin: hasViewport ? adaptiveOrigin : undefined
68
+ adaptiveOrigin: hasViewport ? adaptiveOrigin : undefined,
69
+ inline: createInlineMiddleware(inlineRectCoordsRef)
66
70
  });
71
+ const updatePosition = positioning.update;
72
+ useIsoLayoutEffect(() => {
73
+ if (open && mounted) {
74
+ updatePosition();
75
+ }
76
+ }, [open, mounted, updatePosition]);
67
77
  const state = {
68
78
  open,
69
79
  side: positioning.side,
@@ -9,7 +9,7 @@ import { PreviewCardHandle } from "../store/PreviewCardHandle.js";
9
9
  *
10
10
  * Documentation: [Base UI Preview Card](https://base-ui.com/react/components/preview-card)
11
11
  */
12
- export declare function PreviewCardRoot<Payload>(props: PreviewCardRoot.Props<Payload>): import("react/jsx-runtime").JSX.Element;
12
+ export declare const PreviewCardRoot: <Payload>(props: PreviewCardRoot.Props<Payload>) => import("react/jsx-runtime").JSX.Element;
13
13
  export interface PreviewCardRootState {}
14
14
  export interface PreviewCardRootProps<Payload = unknown> {
15
15
  /**
@@ -1,15 +1,18 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { fastComponent } from '@base-ui/utils/fastHooks';
5
+ import { EMPTY_OBJECT } from '@base-ui/utils/empty';
4
6
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
5
7
  import { useOnFirstRender } from '@base-ui/utils/useOnFirstRender';
6
- import { useDismiss, useInteractions, FloatingTree } from "../../floating-ui-react/index.js";
8
+ import { useDismiss, FloatingTree } from "../../floating-ui-react/index.js";
7
9
  import { PreviewCardRootContext, usePreviewCardRootContext } from "./PreviewCardContext.js";
8
10
  import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js";
9
11
  import { REASONS } from "../../internals/reasons.js";
10
12
  import { PreviewCardStore } from "../store/PreviewCardStore.js";
11
- import { useImplicitActiveTrigger, useOpenStateTransitions } from "../../utils/popups/index.js";
12
- import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { FOCUSABLE_POPUP_PROPS, useImplicitActiveTrigger, useOpenStateTransitions, usePopupInteractionProps } from "../../utils/popups/index.js";
14
+ import { mergeProps } from "../../merge-props/index.js";
15
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
16
  function PreviewCardRootComponent(props) {
14
17
  const {
15
18
  open: openProp,
@@ -43,13 +46,15 @@ function PreviewCardRootComponent(props) {
43
46
  store.useContextCallback('onOpenChange', onOpenChange);
44
47
  store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);
45
48
  const open = store.useState('open');
46
- const floatingRootContext = store.select('floatingRootContext');
47
49
  const activeTriggerId = store.useState('activeTriggerId');
50
+ const mounted = store.useState('mounted');
48
51
  const payload = store.useState('payload');
49
52
  useImplicitActiveTrigger(store);
50
53
  const {
51
54
  forceUnmount
52
- } = useOpenStateTransitions(open, store);
55
+ } = useOpenStateTransitions(open, store, () => {
56
+ store.context.inlineRectCoordsRef.current = undefined;
57
+ });
53
58
  useIsoLayoutEffect(() => {
54
59
  if (open) {
55
60
  if (activeTriggerId == null) {
@@ -64,26 +69,30 @@ function PreviewCardRootComponent(props) {
64
69
  unmount: forceUnmount,
65
70
  close: handleImperativeClose
66
71
  }), [forceUnmount, handleImperativeClose]);
72
+ const shouldRenderInteractions = open || mounted;
73
+ return /*#__PURE__*/_jsxs(PreviewCardRootContext.Provider, {
74
+ value: store,
75
+ children: [shouldRenderInteractions && /*#__PURE__*/_jsx(PreviewCardInteractions, {
76
+ store: store
77
+ }), typeof children === 'function' ? children({
78
+ payload
79
+ }) : children]
80
+ });
81
+ }
82
+ function PreviewCardInteractions({
83
+ store
84
+ }) {
85
+ const floatingRootContext = store.useState('floatingRootContext');
67
86
  const dismiss = useDismiss(floatingRootContext);
68
- const {
69
- getReferenceProps,
70
- getTriggerProps,
71
- getFloatingProps
72
- } = useInteractions([dismiss]);
73
- const activeTriggerProps = React.useMemo(() => getReferenceProps(), [getReferenceProps]);
74
- const inactiveTriggerProps = React.useMemo(() => getTriggerProps(), [getTriggerProps]);
75
- const popupProps = React.useMemo(() => getFloatingProps(), [getFloatingProps]);
76
- store.useSyncedValues({
87
+ const activeTriggerProps = dismiss.reference ?? EMPTY_OBJECT;
88
+ const inactiveTriggerProps = dismiss.trigger ?? EMPTY_OBJECT;
89
+ const popupProps = React.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, dismiss.floating), [dismiss.floating]);
90
+ usePopupInteractionProps(store, {
77
91
  activeTriggerProps,
78
92
  inactiveTriggerProps,
79
93
  popupProps
80
94
  });
81
- return /*#__PURE__*/_jsx(PreviewCardRootContext.Provider, {
82
- value: store,
83
- children: typeof children === 'function' ? children({
84
- payload
85
- }) : children
86
- });
95
+ return null;
87
96
  }
88
97
 
89
98
  /**
@@ -92,7 +101,7 @@ function PreviewCardRootComponent(props) {
92
101
  *
93
102
  * Documentation: [Base UI Preview Card](https://base-ui.com/react/components/preview-card)
94
103
  */
95
- export function PreviewCardRoot(props) {
104
+ export const PreviewCardRoot = fastComponent(function PreviewCardRoot(props) {
96
105
  if (usePreviewCardRootContext(true)) {
97
106
  return /*#__PURE__*/_jsx(PreviewCardRootComponent, {
98
107
  ...props
@@ -103,4 +112,5 @@ export function PreviewCardRoot(props) {
103
112
  ...props
104
113
  })
105
114
  });
106
- }
115
+ });
116
+ if (process.env.NODE_ENV !== "production") PreviewCardRoot.displayName = "PreviewCardRoot";
@@ -43,7 +43,7 @@ export class PreviewCardHandle {
43
43
  * Indicates whether the preview card is currently open.
44
44
  */
45
45
  get isOpen() {
46
- return this.store.state.open;
46
+ return this.store.select('open');
47
47
  }
48
48
  }
49
49
 
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ReactStore } from '@base-ui/utils/store';
3
- import { PopupStoreContext, PopupStoreState } from "../../utils/popups/index.js";
3
+ import { InlineRectCoords, PopupStoreContext, PopupStoreState } from "../../utils/popups/index.js";
4
4
  import { type PreviewCardRoot } from "../root/PreviewCardRoot.js";
5
5
  export type State<Payload> = PopupStoreState<Payload> & {
6
6
  instantType: 'dismiss' | 'focus' | undefined;
@@ -8,6 +8,7 @@ export type State<Payload> = PopupStoreState<Payload> & {
8
8
  };
9
9
  export type Context = PopupStoreContext<PreviewCardRoot.ChangeEventDetails> & {
10
10
  closeDelayRef: React.RefObject<number>;
11
+ inlineRectCoordsRef: React.MutableRefObject<InlineRectCoords | undefined>;
11
12
  };
12
13
  declare const selectors: {
13
14
  instantType: (state: State<unknown>) => "focus" | "dismiss" | undefined;
@@ -18,6 +19,8 @@ declare const selectors: {
18
19
  mounted: boolean;
19
20
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
20
21
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
22
+ floatingId: string | undefined;
23
+ triggerCount: number;
21
24
  preventUnmountingOnClose: boolean;
22
25
  payload: unknown;
23
26
  activeTriggerId: string | null;
@@ -35,6 +38,8 @@ declare const selectors: {
35
38
  mounted: boolean;
36
39
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
37
40
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
41
+ floatingId: string | undefined;
42
+ triggerCount: number;
38
43
  preventUnmountingOnClose: boolean;
39
44
  payload: unknown;
40
45
  activeTriggerId: string | null;
@@ -52,6 +57,8 @@ declare const selectors: {
52
57
  mounted: boolean;
53
58
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
54
59
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
60
+ floatingId: string | undefined;
61
+ triggerCount: number;
55
62
  preventUnmountingOnClose: boolean;
56
63
  payload: unknown;
57
64
  activeTriggerId: string | null;
@@ -69,6 +76,8 @@ declare const selectors: {
69
76
  mounted: boolean;
70
77
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
71
78
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
79
+ floatingId: string | undefined;
80
+ triggerCount: number;
72
81
  preventUnmountingOnClose: boolean;
73
82
  payload: unknown;
74
83
  activeTriggerId: string | null;
@@ -80,12 +89,33 @@ declare const selectors: {
80
89
  inactiveTriggerProps: import("../../index.js").HTMLProps;
81
90
  popupProps: import("../../index.js").HTMLProps;
82
91
  }) => import("../../floating-ui-react/components/FloatingRootStore.js").FloatingRootStore;
92
+ triggerCount: (state: {
93
+ open: boolean;
94
+ readonly openProp: boolean | undefined;
95
+ mounted: boolean;
96
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
97
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
98
+ floatingId: string | undefined;
99
+ triggerCount: number;
100
+ preventUnmountingOnClose: boolean;
101
+ payload: unknown;
102
+ activeTriggerId: string | null;
103
+ activeTriggerElement: Element | null;
104
+ readonly triggerIdProp: string | null | undefined;
105
+ popupElement: HTMLElement | null;
106
+ positionerElement: HTMLElement | null;
107
+ activeTriggerProps: import("../../index.js").HTMLProps;
108
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
109
+ popupProps: import("../../index.js").HTMLProps;
110
+ }) => number;
83
111
  preventUnmountingOnClose: (state: {
84
112
  open: boolean;
85
113
  readonly openProp: boolean | undefined;
86
114
  mounted: boolean;
87
115
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
88
116
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
117
+ floatingId: string | undefined;
118
+ triggerCount: number;
89
119
  preventUnmountingOnClose: boolean;
90
120
  payload: unknown;
91
121
  activeTriggerId: string | null;
@@ -103,6 +133,8 @@ declare const selectors: {
103
133
  mounted: boolean;
104
134
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
105
135
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
136
+ floatingId: string | undefined;
137
+ triggerCount: number;
106
138
  preventUnmountingOnClose: boolean;
107
139
  payload: unknown;
108
140
  activeTriggerId: string | null;
@@ -120,6 +152,8 @@ declare const selectors: {
120
152
  mounted: boolean;
121
153
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
122
154
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
155
+ floatingId: string | undefined;
156
+ triggerCount: number;
123
157
  preventUnmountingOnClose: boolean;
124
158
  payload: unknown;
125
159
  activeTriggerId: string | null;
@@ -137,6 +171,8 @@ declare const selectors: {
137
171
  mounted: boolean;
138
172
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
139
173
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
174
+ floatingId: string | undefined;
175
+ triggerCount: number;
140
176
  preventUnmountingOnClose: boolean;
141
177
  payload: unknown;
142
178
  activeTriggerId: string | null;
@@ -148,12 +184,33 @@ declare const selectors: {
148
184
  inactiveTriggerProps: import("../../index.js").HTMLProps;
149
185
  popupProps: import("../../index.js").HTMLProps;
150
186
  }) => Element | null;
187
+ popupId: (state: {
188
+ open: boolean;
189
+ readonly openProp: boolean | undefined;
190
+ mounted: boolean;
191
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
192
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
193
+ floatingId: string | undefined;
194
+ triggerCount: number;
195
+ preventUnmountingOnClose: boolean;
196
+ payload: unknown;
197
+ activeTriggerId: string | null;
198
+ activeTriggerElement: Element | null;
199
+ readonly triggerIdProp: string | null | undefined;
200
+ popupElement: HTMLElement | null;
201
+ positionerElement: HTMLElement | null;
202
+ activeTriggerProps: import("../../index.js").HTMLProps;
203
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
204
+ popupProps: import("../../index.js").HTMLProps;
205
+ }) => string | undefined;
151
206
  isTriggerActive: (state: {
152
207
  open: boolean;
153
208
  readonly openProp: boolean | undefined;
154
209
  mounted: boolean;
155
210
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
156
211
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
212
+ floatingId: string | undefined;
213
+ triggerCount: number;
157
214
  preventUnmountingOnClose: boolean;
158
215
  payload: unknown;
159
216
  activeTriggerId: string | null;
@@ -171,6 +228,8 @@ declare const selectors: {
171
228
  mounted: boolean;
172
229
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
173
230
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
231
+ floatingId: string | undefined;
232
+ triggerCount: number;
174
233
  preventUnmountingOnClose: boolean;
175
234
  payload: unknown;
176
235
  activeTriggerId: string | null;
@@ -188,6 +247,8 @@ declare const selectors: {
188
247
  mounted: boolean;
189
248
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
190
249
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
250
+ floatingId: string | undefined;
251
+ triggerCount: number;
191
252
  preventUnmountingOnClose: boolean;
192
253
  payload: unknown;
193
254
  activeTriggerId: string | null;
@@ -205,6 +266,8 @@ declare const selectors: {
205
266
  mounted: boolean;
206
267
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
207
268
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
269
+ floatingId: string | undefined;
270
+ triggerCount: number;
208
271
  preventUnmountingOnClose: boolean;
209
272
  payload: unknown;
210
273
  activeTriggerId: string | null;
@@ -216,12 +279,33 @@ declare const selectors: {
216
279
  inactiveTriggerProps: import("../../index.js").HTMLProps;
217
280
  popupProps: import("../../index.js").HTMLProps;
218
281
  }, isActive: boolean) => import("../../index.js").HTMLProps;
282
+ triggerPopupId: (state: {
283
+ open: boolean;
284
+ readonly openProp: boolean | undefined;
285
+ mounted: boolean;
286
+ transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
287
+ floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
288
+ floatingId: string | undefined;
289
+ triggerCount: number;
290
+ preventUnmountingOnClose: boolean;
291
+ payload: unknown;
292
+ activeTriggerId: string | null;
293
+ activeTriggerElement: Element | null;
294
+ readonly triggerIdProp: string | null | undefined;
295
+ popupElement: HTMLElement | null;
296
+ positionerElement: HTMLElement | null;
297
+ activeTriggerProps: import("../../index.js").HTMLProps;
298
+ inactiveTriggerProps: import("../../index.js").HTMLProps;
299
+ popupProps: import("../../index.js").HTMLProps;
300
+ }, triggerId: string | undefined) => string | undefined;
219
301
  popupProps: (state: {
220
302
  open: boolean;
221
303
  readonly openProp: boolean | undefined;
222
304
  mounted: boolean;
223
305
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
224
306
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
307
+ floatingId: string | undefined;
308
+ triggerCount: number;
225
309
  preventUnmountingOnClose: boolean;
226
310
  payload: unknown;
227
311
  activeTriggerId: string | null;
@@ -239,6 +323,8 @@ declare const selectors: {
239
323
  mounted: boolean;
240
324
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
241
325
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
326
+ floatingId: string | undefined;
327
+ triggerCount: number;
242
328
  preventUnmountingOnClose: boolean;
243
329
  payload: unknown;
244
330
  activeTriggerId: string | null;
@@ -256,6 +342,8 @@ declare const selectors: {
256
342
  mounted: boolean;
257
343
  transitionStatus: import("../../internals/useTransitionStatus.js").TransitionStatus;
258
344
  floatingRootContext: import("../../floating-ui-react/index.js").FloatingRootContext;
345
+ floatingId: string | undefined;
346
+ triggerCount: number;
259
347
  preventUnmountingOnClose: boolean;
260
348
  payload: unknown;
261
349
  activeTriggerId: string | null;
@@ -269,7 +357,7 @@ declare const selectors: {
269
357
  }) => HTMLElement | null;
270
358
  };
271
359
  export declare class PreviewCardStore<Payload> extends ReactStore<Readonly<State<Payload>>, Context, typeof selectors> {
272
- constructor(initialState?: Partial<State<Payload>>);
360
+ constructor(initialState?: Partial<State<Payload>>, floatingId?: string | undefined, nested?: boolean);
273
361
  setOpen: (nextOpen: boolean, eventDetails: Omit<PreviewCardRoot.ChangeEventDetails, "preventUnmountOnClose">) => void;
274
362
  static useStore<Payload>(externalStore: PreviewCardStore<Payload> | undefined, initialState?: Partial<State<Payload>>): PreviewCardStore<Payload>;
275
363
  }
@@ -1,9 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import * as ReactDOM from 'react-dom';
3
3
  import { createSelector, ReactStore } from '@base-ui/utils/store';
4
- import { useRefWithInit } from '@base-ui/utils/useRefWithInit';
5
- import { createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap } from "../../utils/popups/index.js";
6
- import { useSyncedFloatingRootContext } from "../../floating-ui-react/index.js";
4
+ import { createPopupFloatingRootContext, createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap, setOpenTriggerState, updateInlineRectCoords, usePopupStore } from "../../utils/popups/index.js";
7
5
  import { REASONS } from "../../internals/reasons.js";
8
6
  import { CLOSE_DELAY } from "../utils/constants.js";
9
7
  const selectors = {
@@ -12,17 +10,23 @@ const selectors = {
12
10
  hasViewport: createSelector(state => state.hasViewport)
13
11
  };
14
12
  export class PreviewCardStore extends ReactStore {
15
- constructor(initialState) {
16
- super({
13
+ constructor(initialState, floatingId, nested = false) {
14
+ const triggerElements = new PopupTriggerMap();
15
+ const state = {
17
16
  ...createInitialState(),
18
17
  ...initialState
19
- }, {
18
+ };
19
+ state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
20
+ super(state, {
20
21
  popupRef: /*#__PURE__*/React.createRef(),
21
22
  onOpenChange: undefined,
22
23
  onOpenChangeComplete: undefined,
23
- triggerElements: new PopupTriggerMap(),
24
+ triggerElements,
24
25
  closeDelayRef: {
25
26
  current: CLOSE_DELAY
27
+ },
28
+ inlineRectCoordsRef: {
29
+ current: undefined
26
30
  }
27
31
  }, selectors);
28
32
  }
@@ -38,6 +42,10 @@ export class PreviewCardStore extends ReactStore {
38
42
  if (eventDetails.isCanceled) {
39
43
  return;
40
44
  }
45
+ const event = eventDetails.event;
46
+ if (nextOpen && isHover && eventDetails.trigger && 'clientX' in event && 'clientY' in event && this.context.inlineRectCoordsRef.current?.element !== eventDetails.trigger) {
47
+ updateInlineRectCoords(this.context.inlineRectCoordsRef, eventDetails.trigger, event.clientX, event.clientY);
48
+ }
41
49
  this.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);
42
50
  const changeState = () => {
43
51
  const updatedState = {
@@ -50,14 +58,7 @@ export class PreviewCardStore extends ReactStore {
50
58
  } else if (reason === REASONS.triggerHover) {
51
59
  updatedState.instantType = undefined;
52
60
  }
53
-
54
- // If a popup is closing, the `trigger` may be null.
55
- // We want to keep the previous value so that exit animations are played and focus is returned correctly.
56
- const newTriggerId = eventDetails.trigger?.id ?? null;
57
- if (newTriggerId || nextOpen) {
58
- updatedState.activeTriggerId = newTriggerId;
59
- updatedState.activeTriggerElement = eventDetails.trigger ?? null;
60
- }
61
+ setOpenTriggerState(updatedState, nextOpen, eventDetails.trigger);
61
62
  this.update(updatedState);
62
63
  };
63
64
  if (isHover) {
@@ -69,23 +70,10 @@ export class PreviewCardStore extends ReactStore {
69
70
  }
70
71
  };
71
72
  static useStore(externalStore, initialState) {
72
- // eslint-disable-next-line react-hooks/rules-of-hooks
73
- const internalStore = useRefWithInit(() => {
74
- return new PreviewCardStore(initialState);
75
- }).current;
76
- const store = externalStore ?? internalStore;
77
-
78
- // eslint-disable-next-line react-hooks/rules-of-hooks
79
- const floatingRootContext = useSyncedFloatingRootContext({
80
- popupStore: store,
81
- onOpenChange: store.setOpen
82
- });
73
+ /* eslint-disable react-hooks/rules-of-hooks */
74
+ const store = usePopupStore(externalStore, (floatingId, nested) => new PreviewCardStore(initialState, floatingId, nested)).store;
75
+ /* eslint-enable react-hooks/rules-of-hooks */
83
76
 
84
- // It's safe to set this here because when this code runs for the first time,
85
- // nothing has had a chance to subscribe to the `store` yet.
86
- // For subsequent renders, the `floatingRootContext` reference remains the same,
87
- // so it's basically a no-op.
88
- store.state.floatingRootContext = floatingRootContext;
89
77
  return store;
90
78
  }
91
79
  }