@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
@@ -1,5 +1,6 @@
1
1
  import { createSelector } from '@base-ui/utils/store';
2
2
  import { EMPTY_OBJECT } from '@base-ui/utils/empty';
3
+ import { FloatingRootStore } from "../../floating-ui-react/components/FloatingRootStore.js";
3
4
  import { getEmptyRootContext } from "../../floating-ui-react/utils/getEmptyRootContext.js";
4
5
 
5
6
  /**
@@ -13,6 +14,8 @@ export function createInitialPopupStoreState() {
13
14
  mounted: false,
14
15
  transitionStatus: undefined,
15
16
  floatingRootContext: getEmptyRootContext(),
17
+ floatingId: undefined,
18
+ triggerCount: 0,
16
19
  preventUnmountingOnClose: false,
17
20
  payload: undefined,
18
21
  activeTriggerId: null,
@@ -25,16 +28,45 @@ export function createInitialPopupStoreState() {
25
28
  popupProps: EMPTY_OBJECT
26
29
  };
27
30
  }
31
+ export function createPopupFloatingRootContext(triggerElements, floatingId, nested = false) {
32
+ return new FloatingRootStore({
33
+ open: false,
34
+ transitionStatus: undefined,
35
+ floatingElement: null,
36
+ referenceElement: null,
37
+ triggerElements,
38
+ floatingId,
39
+ syncOnly: true,
40
+ nested,
41
+ onOpenChange: undefined
42
+ });
43
+ }
28
44
  const activeTriggerIdSelector = createSelector(state => state.triggerIdProp ?? state.activeTriggerId);
45
+ const openSelector = createSelector(state => state.openProp ?? state.open);
46
+ const popupIdSelector = createSelector(state => {
47
+ const popupId = state.popupElement?.id ?? state.floatingId;
48
+ return popupId || undefined;
49
+ });
50
+ function triggerOwnsOpenPopup(state, triggerId) {
51
+ return triggerId !== undefined && openSelector(state) && activeTriggerIdSelector(state) === triggerId;
52
+ }
53
+ function triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) {
54
+ if (triggerOwnsOpenPopup(state, triggerId)) {
55
+ return true;
56
+ }
57
+ return triggerId !== undefined && openSelector(state) && activeTriggerIdSelector(state) == null && state.triggerCount === 1;
58
+ }
29
59
  export const popupStoreSelectors = {
30
- open: createSelector(state => state.openProp ?? state.open),
60
+ open: openSelector,
31
61
  mounted: createSelector(state => state.mounted),
32
62
  transitionStatus: createSelector(state => state.transitionStatus),
33
63
  floatingRootContext: createSelector(state => state.floatingRootContext),
64
+ triggerCount: createSelector(state => state.triggerCount),
34
65
  preventUnmountingOnClose: createSelector(state => state.preventUnmountingOnClose),
35
66
  payload: createSelector(state => state.payload),
36
67
  activeTriggerId: activeTriggerIdSelector,
37
68
  activeTriggerElement: createSelector(state => state.mounted ? state.activeTriggerElement : null),
69
+ popupId: popupIdSelector,
38
70
  /**
39
71
  * Whether the trigger with the given ID was used to open the popup.
40
72
  */
@@ -42,12 +74,16 @@ export const popupStoreSelectors = {
42
74
  /**
43
75
  * Whether the popup is open and was activated by a trigger with the given ID.
44
76
  */
45
- isOpenedByTrigger: createSelector((state, triggerId) => triggerId !== undefined && activeTriggerIdSelector(state) === triggerId && state.open),
77
+ isOpenedByTrigger: createSelector((state, triggerId) => triggerOwnsOpenPopup(state, triggerId)),
46
78
  /**
47
79
  * Whether the popup is mounted and was activated by a trigger with the given ID.
48
80
  */
49
81
  isMountedByTrigger: createSelector((state, triggerId) => triggerId !== undefined && activeTriggerIdSelector(state) === triggerId && state.mounted),
50
82
  triggerProps: createSelector((state, isActive) => isActive ? state.activeTriggerProps : state.inactiveTriggerProps),
83
+ /**
84
+ * Popup id for the trigger that currently owns the open popup.
85
+ */
86
+ triggerPopupId: createSelector((state, triggerId) => triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) ? popupIdSelector(state) : undefined),
51
87
  popupProps: createSelector(state => state.popupProps),
52
88
  popupElement: createSelector(state => state.popupElement),
53
89
  positionerElement: createSelector(state => state.positionerElement)
@@ -2,7 +2,6 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import * as ReactDOM from 'react-dom';
5
- import { useStableCallback } from '@base-ui/utils/useStableCallback';
6
5
  import { contains, getNextTabbable, getTabbableAfterElement, getTabbableBeforeElement, isOutsideEvent } from "../../floating-ui-react/utils.js";
7
6
  import { createChangeEventDetails } from "../../internals/createBaseUIEventDetails.js";
8
7
  import { REASONS } from "../../internals/reasons.js";
@@ -21,14 +20,14 @@ import { REASONS } from "../../internals/reasons.js";
21
20
  */
22
21
  export function useTriggerFocusGuards(store, triggerElementRef) {
23
22
  const preFocusGuardRef = React.useRef(null);
24
- const handlePreFocusGuardFocus = useStableCallback(event => {
23
+ function handlePreFocusGuardFocus(event) {
25
24
  ReactDOM.flushSync(() => {
26
25
  store.setOpen(false, createChangeEventDetails(REASONS.focusOut, event.nativeEvent, event.currentTarget));
27
26
  });
28
27
  const previousTabbable = getTabbableBeforeElement(preFocusGuardRef.current);
29
28
  previousTabbable?.focus();
30
- });
31
- const handleFocusTargetFocus = useStableCallback(event => {
29
+ }
30
+ function handleFocusTargetFocus(event) {
32
31
  const positionerElement = store.select('positionerElement');
33
32
  if (positionerElement && isOutsideEvent(event, positionerElement)) {
34
33
  store.context.beforeContentFocusGuardRef.current?.focus();
@@ -46,7 +45,7 @@ export function useTriggerFocusGuards(store, triggerElementRef) {
46
45
  }
47
46
  nextTabbable?.focus();
48
47
  }
49
- });
48
+ }
50
49
  return {
51
50
  preFocusGuardRef,
52
51
  handlePreFocusGuardFocus,
@@ -220,6 +220,11 @@ export interface UseAnchorPositioningParameters extends UseAnchorPositioningShar
220
220
  shiftCrossAxis?: boolean | undefined;
221
221
  lazyFlip?: boolean | undefined;
222
222
  externalTree?: FloatingTreeStore | undefined;
223
+ /**
224
+ * Optional middleware that can replace the measured reference rect before offsets and collision
225
+ * middleware run. Used by Preview Card to position against a specific inline line box.
226
+ */
227
+ inline?: Middleware | undefined;
223
228
  }
224
229
  export interface UseAnchorPositioningReturnValue {
225
230
  positionerStyles: React.CSSProperties;
@@ -59,6 +59,7 @@ export function useAnchorPositioning(params) {
59
59
  sticky = false,
60
60
  arrowPadding = 5,
61
61
  disableAnchorTracking = false,
62
+ inline: inlineMiddleware,
62
63
  // Private parameters
63
64
  keepMounted = false,
64
65
  floatingRootContext,
@@ -133,7 +134,11 @@ export function useAnchorPositioning(params) {
133
134
  const alignOffsetRef = useValueAsRef(alignOffset);
134
135
  const sideOffsetDep = typeof sideOffset !== 'function' ? sideOffset : 0;
135
136
  const alignOffsetDep = typeof alignOffset !== 'function' ? alignOffset : 0;
136
- const middleware = [offset(state => {
137
+ const middleware = [];
138
+ if (inlineMiddleware) {
139
+ middleware.push(inlineMiddleware);
140
+ }
141
+ middleware.push(offset(state => {
137
142
  const data = getOffsetData(state, sideParam, isRtl);
138
143
  const sideAxis = typeof sideOffsetRef.current === 'function' ? sideOffsetRef.current(data) : sideOffsetRef.current;
139
144
  const alignAxis = typeof alignOffsetRef.current === 'function' ? alignOffsetRef.current(data) : alignOffsetRef.current;
@@ -142,7 +147,7 @@ export function useAnchorPositioning(params) {
142
147
  crossAxis: alignAxis,
143
148
  alignmentAxis: alignAxis
144
149
  };
145
- }, [sideOffsetDep, alignOffsetDep, isRtl, sideParam])];
150
+ }, [sideOffsetDep, alignOffsetDep, isRtl, sideParam]));
146
151
  const shiftDisabled = collisionAvoidanceAlign === 'none' && collisionAvoidanceSide !== 'shift';
147
152
  const crossAxisShiftEnabled = !shiftDisabled && (sticky || shiftCrossAxis || collisionAvoidanceSide === 'shift');
148
153
  const flipMiddleware = collisionAvoidanceSide === 'none' ? null : flip({
@@ -227,10 +232,10 @@ export function useAnchorPositioning(params) {
227
232
  floatingStyle.setProperty('--anchor-width', `${anchorWidth}px`);
228
233
  floatingStyle.setProperty('--anchor-height', `${anchorHeight}px`);
229
234
  }
230
- }), arrow(() => ({
235
+ }), arrow(state => ({
231
236
  // `transform-origin` calculations rely on an element existing. If the arrow hasn't been set,
232
237
  // we'll create a fake element.
233
- element: arrowRef.current || ownerDocument(arrowRef.current).createElement('div'),
238
+ element: arrowRef.current || ownerDocument(state.elements.floating).createElement('div'),
234
239
  padding: arrowPadding,
235
240
  offsetParent: 'floating'
236
241
  }), [arrowPadding]), {
@@ -367,11 +372,9 @@ export function useAnchorPositioning(params) {
367
372
  const renderedAlign = getAlignment(renderedPlacement) || 'center';
368
373
  const anchorHidden = Boolean(middlewareData.hide?.referenceHidden);
369
374
 
370
- /**
371
- * Locks the flip (makes it "sticky") so it doesn't prefer a given placement
372
- * and flips back lazily, not eagerly. Ideal for filtered lists that change
373
- * the size of the popup dynamically to avoid unwanted flipping when typing.
374
- */
375
+ // Locks the flip (makes it "sticky") so it doesn't prefer a given placement
376
+ // and flips back lazily, not eagerly. Ideal for filtered lists that change
377
+ // the size of the popup dynamically to avoid unwanted flipping when typing.
375
378
  useIsoLayoutEffect(() => {
376
379
  if (lazyFlip && mounted && isPositioned) {
377
380
  setMountSide(renderedSide);
@@ -1,5 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import { InteractionType } from '@base-ui/utils/useEnhancedClickHandler';
3
+ export declare function useOpenMethodTriggerProps(open: boolean | (() => boolean), setOpenMethod: (interactionType: InteractionType | null) => void): {
4
+ onClick: (event: React.MouseEvent | React.PointerEvent) => void;
5
+ onPointerDown: (event: React.PointerEvent) => void;
6
+ };
3
7
  /**
4
8
  * Determines the interaction type (keyboard, mouse, touch, etc.) that opened the component.
5
9
  *
@@ -5,16 +5,10 @@ import { useStableCallback } from '@base-ui/utils/useStableCallback';
5
5
  import { useEnhancedClickHandler } from '@base-ui/utils/useEnhancedClickHandler';
6
6
  import { isIOS } from '@base-ui/utils/detectBrowser';
7
7
  import { useValueChanged } from "../internals/useValueChanged.js";
8
-
9
- /**
10
- * Determines the interaction type (keyboard, mouse, touch, etc.) that opened the component.
11
- *
12
- * @param open The open state of the component.
13
- */
14
- export function useOpenInteractionType(open) {
15
- const [openMethod, setOpenMethod] = React.useState(null);
8
+ export function useOpenMethodTriggerProps(open, setOpenMethod) {
16
9
  const handleTriggerClick = useStableCallback((_, interactionType) => {
17
- if (!open) {
10
+ const isOpen = typeof open === 'function' ? open() : open;
11
+ if (!isOpen) {
18
12
  setOpenMethod(interactionType || (
19
13
  // On iOS Safari, the hitslop around touch targets means tapping outside an element's
20
14
  // bounds does not fire `pointerdown` but does fire `mousedown`. The `interactionType`
@@ -22,20 +16,31 @@ export function useOpenInteractionType(open) {
22
16
  isIOS ? 'touch' : ''));
23
17
  }
24
18
  });
19
+ const {
20
+ onClick,
21
+ onPointerDown
22
+ } = useEnhancedClickHandler(handleTriggerClick);
23
+ return React.useMemo(() => ({
24
+ onClick,
25
+ onPointerDown
26
+ }), [onClick, onPointerDown]);
27
+ }
28
+
29
+ /**
30
+ * Determines the interaction type (keyboard, mouse, touch, etc.) that opened the component.
31
+ *
32
+ * @param open The open state of the component.
33
+ */
34
+ export function useOpenInteractionType(open) {
35
+ const [openMethod, setOpenMethod] = React.useState(null);
36
+ const triggerProps = useOpenMethodTriggerProps(open, setOpenMethod);
25
37
  useValueChanged(open, previousOpen => {
26
38
  if (previousOpen && !open) {
27
39
  setOpenMethod(null);
28
40
  }
29
41
  });
30
- const {
31
- onClick,
32
- onPointerDown
33
- } = useEnhancedClickHandler(handleTriggerClick);
34
42
  return React.useMemo(() => ({
35
43
  openMethod,
36
- triggerProps: {
37
- onClick,
38
- onPointerDown
39
- }
40
- }), [openMethod, onClick, onPointerDown]);
44
+ triggerProps
45
+ }), [openMethod, triggerProps]);
41
46
  }
@@ -90,12 +90,8 @@ const FieldControl = exports.FieldControl = /*#__PURE__*/React.forwardRef(functi
90
90
  });
91
91
  const isControlled = valueProp !== undefined;
92
92
  const value = isControlled ? valueUnwrapped : undefined;
93
- const getFieldValue = (0, _useStableCallback.useStableCallback)(() => validation.inputRef.current?.value);
94
- (0, _useRegisterFieldControl.useRegisterFieldControl)(validation.inputRef, {
95
- id,
96
- value,
97
- getValue: getFieldValue
98
- });
93
+ const getValueFromInput = (0, _useStableCallback.useStableCallback)(() => validation.inputRef.current?.value);
94
+ (0, _useRegisterFieldControl.useRegisterFieldControl)(validation.inputRef, id, value, getValueFromInput);
99
95
  const element = (0, _useRenderElement.useRenderElement)('input', componentProps, {
100
96
  ref: [forwardedRef, inputRef],
101
97
  state,
@@ -34,11 +34,8 @@ const FieldItem = exports.FieldItem = /*#__PURE__*/React.forwardRef(function Fie
34
34
  } = (0, _FieldRootContext.useFieldRootContext)(false);
35
35
  const disabled = rootDisabled || disabledProp;
36
36
  const checkboxGroupContext = (0, _CheckboxGroupContext.useCheckboxGroupContext)();
37
- // checkboxGroupContext.parent is truthy even if no parent checkbox is involved
38
- const parentId = checkboxGroupContext?.parent.id;
39
- // this a more reliable check
40
37
  const hasParentCheckbox = checkboxGroupContext?.allValues !== undefined;
41
- const controlId = hasParentCheckbox ? parentId : undefined;
38
+ const controlId = hasParentCheckbox ? checkboxGroupContext?.parent.id : undefined;
42
39
  const fieldItemContext = React.useMemo(() => ({
43
40
  disabled
44
41
  }), [disabled]);
@@ -52,6 +52,11 @@ var _jsxRuntime = require("react/jsx-runtime");
52
52
  const dirty = dirtyProp ?? dirtyState;
53
53
  const touched = touchedProp ?? touchedState;
54
54
  const markedDirtyRef = React.useRef(false);
55
+ const registeredFieldIdRef = React.useRef(undefined);
56
+ const getRegisteredFieldId = React.useCallback(() => registeredFieldIdRef.current, []);
57
+ const setRegisteredFieldId = React.useCallback(id => {
58
+ registeredFieldIdRef.current = id;
59
+ }, []);
55
60
  const setDirty = (0, _useStableCallback.useStableCallback)(value => {
56
61
  if (dirtyProp !== undefined) {
57
62
  return;
@@ -95,17 +100,20 @@ var _jsxRuntime = require("react/jsx-runtime");
95
100
  markedDirtyRef,
96
101
  state,
97
102
  name,
98
- shouldValidateOnChange
103
+ shouldValidateOnChange,
104
+ getRegisteredFieldId
99
105
  });
106
+ const validityValue = validityData.value;
100
107
  const handleImperativeValidate = React.useCallback(() => {
101
108
  markedDirtyRef.current = true;
102
- validation.commit(validityData.value);
103
- }, [validation, validityData]);
109
+ validation.commit(validityValue);
110
+ }, [validation, validityValue]);
104
111
  const registerFieldControl = (0, _useFieldControlRegistration.useFieldControlRegistration)({
105
112
  commit: validation.commit,
106
113
  invalid,
107
114
  markedDirtyRef,
108
115
  name,
116
+ setRegisteredFieldId,
109
117
  setValidityData,
110
118
  validityData
111
119
  });
@@ -13,6 +13,7 @@ export interface UseFieldValidationParameters {
13
13
  state: FieldRootState;
14
14
  name: string | undefined;
15
15
  shouldValidateOnChange: () => boolean;
16
+ getRegisteredFieldId: () => string | undefined;
16
17
  }
17
18
  export interface UseFieldValidationReturnValue {
18
19
  getValidationProps: (props?: HTMLProps) => HTMLProps;
@@ -48,7 +48,8 @@ function useFieldValidation(params) {
48
48
  markedDirtyRef,
49
49
  state,
50
50
  name,
51
- shouldValidateOnChange
51
+ shouldValidateOnChange,
52
+ getRegisteredFieldId
52
53
  } = params;
53
54
  const {
54
55
  controlId,
@@ -61,6 +62,21 @@ function useFieldValidation(params) {
61
62
  if (!element) {
62
63
  return;
63
64
  }
65
+ function updateRegisteredFieldValidity(nextValidityData, externalInvalid = invalid) {
66
+ const fieldId = getRegisteredFieldId() ?? controlId;
67
+ if (fieldId == null) {
68
+ return;
69
+ }
70
+ const currentFieldData = formRef.current.fields.get(fieldId);
71
+ if (!currentFieldData) {
72
+ return;
73
+ }
74
+ const validityDataWithFormErrors = (0, _getCombinedFieldValidityData.getCombinedFieldValidityData)(nextValidityData, externalInvalid);
75
+ formRef.current.fields.set(fieldId, {
76
+ ...currentFieldData,
77
+ validityData: validityDataWithFormErrors
78
+ });
79
+ }
64
80
  if (revalidate) {
65
81
  if (state.valid !== false) {
66
82
  return;
@@ -81,15 +97,9 @@ function useFieldValidation(params) {
81
97
  initialValue: validityData.initialValue
82
98
  };
83
99
  element.setCustomValidity('');
84
- if (controlId) {
85
- const currentFieldData = formRef.current.fields.get(controlId);
86
- if (currentFieldData) {
87
- formRef.current.fields.set(controlId, {
88
- ...currentFieldData,
89
- ...(0, _getCombinedFieldValidityData.getCombinedFieldValidityData)(nextValidityData, false) // invalid = false
90
- });
91
- }
92
- }
100
+
101
+ // The required value is now present; ignore stale external invalid state for this pass.
102
+ updateRegisteredFieldValidity(nextValidityData, false);
93
103
  setValidityData(nextValidityData);
94
104
  return;
95
105
  }
@@ -192,16 +202,9 @@ function useFieldValidation(params) {
192
202
  errors: validationErrors,
193
203
  initialValue: validityData.initialValue
194
204
  };
195
- if (controlId) {
196
- const currentFieldData = formRef.current.fields.get(controlId);
197
- if (currentFieldData) {
198
- formRef.current.fields.set(controlId, {
199
- ...currentFieldData,
200
- // Keep Form-level errors part of overall field validity for submit blocking/focus logic.
201
- ...(0, _getCombinedFieldValidityData.getCombinedFieldValidityData)(nextValidityData, invalid)
202
- });
203
- }
204
- }
205
+
206
+ // Keep Form-level errors part of overall field validity for submit blocking/focus logic.
207
+ updateRegisteredFieldValidity(nextValidityData);
205
208
  setValidityData(nextValidityData);
206
209
  });
207
210
  const getValidationProps = React.useCallback((externalProps = {}) => (0, _mergeProps.mergeProps)(getDescriptionProps, state.valid === false ? {
@@ -1,4 +1,4 @@
1
- import { FieldValidityData } from "../root/FieldRoot.js";
1
+ import type { FieldValidityData } from "../root/FieldRoot.js";
2
2
  /**
3
3
  * Combines the field's client-side, stateful validity data with the external invalid state to
4
4
  * determine the field's true validity.
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { FieldValidityData } from "../root/FieldRoot.js";
2
+ import type { FieldValidityData } from "../root/FieldRoot.js";
3
3
  import { type TransitionStatus } from "../../internals/useTransitionStatus.js";
4
4
  /**
5
5
  * Used to display a custom message based on the field's validity.
@@ -75,11 +75,11 @@ function FloatingDelayGroup(props) {
75
75
  function useDelayGroup(context, options = {
76
76
  open: false
77
77
  }) {
78
- const store = 'rootStore' in context ? context.rootStore : context;
79
- const floatingId = store.useState('floatingId');
80
78
  const {
81
79
  open
82
80
  } = options;
81
+ const store = 'rootStore' in context ? context.rootStore : context;
82
+ const floatingId = store.useState('floatingId');
83
83
  const groupContext = React.useContext(FloatingDelayGroupContext);
84
84
  const {
85
85
  currentIdRef,
@@ -148,7 +148,7 @@ function useDelayGroup(context, options = {
148
148
  setIsInstantPhase(false);
149
149
  prevContext?.setIsInstantPhase(false);
150
150
  }
151
- }, [open, floatingId, store, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeout]);
151
+ }, [open, floatingId, store, currentIdRef, delayRef, initialDelayRef, currentContextRef, timeout]);
152
152
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
153
153
  return () => {
154
154
  currentContextRef.current = null;
@@ -83,7 +83,7 @@ export interface FloatingFocusManagerProps {
83
83
  */
84
84
  beforeContentFocusGuardRef?: React.RefObject<HTMLSpanElement | null> | undefined;
85
85
  /**
86
- * External FlatingTree to use when the one provided by context can't be used.
86
+ * External FloatingTree to use when the one provided by context can't be used.
87
87
  */
88
88
  externalTree?: FloatingTreeStore | undefined;
89
89
  /**
@@ -186,7 +186,7 @@ function FloatingFocusManager(props) {
186
186
  }
187
187
  const doc = (0, _owner.ownerDocument)(floatingFocusElement);
188
188
  return (0, _addEventListener.addEventListener)(doc, 'keydown', onKeyDown);
189
- }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent]);
189
+ }, [disabled, floatingFocusElement, modal, isUntrappedTypeableCombobox, getTabbableContent]);
190
190
 
191
191
  // Track pointer/keyboard interactions to disambiguate focus and outside presses.
192
192
  React.useEffect(() => {
@@ -335,7 +335,7 @@ function FloatingFocusManager(props) {
335
335
  markerCleanup();
336
336
  ariaHiddenCleanup();
337
337
  };
338
- }, [open, disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, tree, getNodeId, nextFocusableElement, previousFocusableElement, getResolvedInsideElements]);
338
+ }, [open, disabled, domReference, floating, modal, portalContext, isUntrappedTypeableCombobox, tree, getNodeId, nextFocusableElement, previousFocusableElement, getResolvedInsideElements]);
339
339
 
340
340
  // Focus the initial element when the floating element opens.
341
341
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
@@ -372,11 +372,20 @@ function FloatingFocusManager(props) {
372
372
  elToFocus = (0, _resolveRef.resolveRef)(resolvedInitialFocus);
373
373
  }
374
374
  elToFocus = elToFocus || getDefaultFocusElement();
375
+ const hadFocusInside = (0, _element.contains)(floatingFocusElement, (0, _element.activeElement)(doc));
375
376
  (0, _enqueueFocus.enqueueFocus)(elToFocus, {
376
- preventScroll: elToFocus === floatingFocusElement
377
+ preventScroll: elToFocus === floatingFocusElement,
378
+ shouldFocus() {
379
+ if (hadFocusInside) {
380
+ return true;
381
+ }
382
+ const currentActiveElement = (0, _element.activeElement)(doc);
383
+ const focusMovedInside = currentActiveElement !== elToFocus && (0, _element.contains)(floatingFocusElement, currentActiveElement);
384
+ return !focusMovedInside;
385
+ }
377
386
  });
378
387
  });
379
- }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableContent, initialFocusRef, openInteractionTypeRef]);
388
+ }, [disabled, open, floatingFocusElement, getTabbableContent, initialFocusRef, openInteractionTypeRef]);
380
389
 
381
390
  // Track return focus targets and restore focus on unmount/close.
382
391
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
@@ -431,10 +440,12 @@ function FloatingFocusManager(props) {
431
440
  resolvedReturnFocusValue = true;
432
441
  }
433
442
  if (typeof resolvedReturnFocusValue === 'boolean') {
434
- const el = domReference || getPreviouslyFocusedElement();
435
- return el && el.isConnected ? el : null;
443
+ if (domReference?.isConnected) {
444
+ return domReference;
445
+ }
446
+ return getPreviouslyFocusedElement() || null;
436
447
  }
437
- const fallback = domReference || getPreviouslyFocusedElement();
448
+ const fallback = domReference?.isConnected ? domReference : getPreviouslyFocusedElement();
438
449
  return (0, _resolveRef.resolveRef)(resolvedReturnFocusValue) || fallback || null;
439
450
  }
440
451
  return () => {
@@ -462,7 +473,7 @@ function FloatingFocusManager(props) {
462
473
  preventReturnFocusRef.current = false;
463
474
  });
464
475
  };
465
- }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, events, tree, domReference, getNodeId, getResolvedInsideElements]);
476
+ }, [disabled, floating, floatingFocusElement, returnFocusRef, events, tree, domReference, getNodeId, getResolvedInsideElements]);
466
477
 
467
478
  // Safari may randomly scroll to the bottom of the page if an input inside a popup has focus
468
479
  // when the popup unmounts from the DOM.
@@ -479,6 +490,7 @@ function FloatingFocusManager(props) {
479
490
  activeEl.blur();
480
491
  }
481
492
  }, [open, floating]);
493
+
482
494
  // Synchronize the `context` & `modal` value to the FloatingPortal context.
483
495
  // It will decide whether or not it needs to render its own guards.
484
496
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
@@ -109,12 +109,12 @@ function useFloatingPortalNode(props = {}) {
109
109
  */
110
110
  const FloatingPortal = exports.FloatingPortal = /*#__PURE__*/React.forwardRef(function FloatingPortal(componentProps, forwardedRef) {
111
111
  const {
112
+ render,
113
+ className,
114
+ style,
112
115
  children,
113
116
  container,
114
- className,
115
- render,
116
117
  renderGuards,
117
- style,
118
118
  ...elementProps
119
119
  } = componentProps;
120
120
  const {