@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
@@ -19,8 +19,6 @@ var _reasons = require("../../internals/reasons");
19
19
  * @see https://floating-ui.com/docs/useClick
20
20
  */
21
21
  function useClick(context, props = {}) {
22
- const store = 'rootStore' in context ? context.rootStore : context;
23
- const dataRef = store.context.dataRef;
24
22
  const {
25
23
  enabled = true,
26
24
  event: eventOption = 'click',
@@ -30,89 +28,100 @@ function useClick(context, props = {}) {
30
28
  touchOpenDelay = 0,
31
29
  reason = _reasons.REASONS.triggerPress
32
30
  } = props;
31
+ const store = 'rootStore' in context ? context.rootStore : context;
32
+ const dataRef = store.context.dataRef;
33
33
  const pointerTypeRef = React.useRef(undefined);
34
34
  const frame = (0, _useAnimationFrame.useAnimationFrame)();
35
35
  const touchOpenTimeout = (0, _useTimeout.useTimeout)();
36
- const reference = React.useMemo(() => ({
37
- onPointerDown(event) {
38
- pointerTypeRef.current = event.pointerType;
39
- },
40
- onMouseDown(event) {
41
- const pointerType = pointerTypeRef.current;
42
- const nativeEvent = event.nativeEvent;
43
- const open = store.select('open');
44
-
45
- // Ignore all buttons except for the "main" button.
46
- // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
47
- if (event.button !== 0 || eventOption === 'click' || (0, _event.isMouseLikePointerType)(pointerType, true) && ignoreMouse) {
48
- return;
36
+ const reference = React.useMemo(() => {
37
+ function setOpenWithTouchDelay(nextOpen, nativeEvent, target, pointerType) {
38
+ const details = (0, _createBaseUIEventDetails.createChangeEventDetails)(reason, nativeEvent, target);
39
+ if (nextOpen && pointerType === 'touch' && touchOpenDelay > 0) {
40
+ touchOpenTimeout.start(touchOpenDelay, () => {
41
+ store.setOpen(true, details);
42
+ });
43
+ } else {
44
+ store.setOpen(nextOpen, details);
49
45
  }
46
+ }
47
+ function getNextOpen(open, currentTarget, isClickLikeOpenEvent) {
50
48
  const openEvent = dataRef.current.openEvent;
51
- const openEventType = openEvent?.type;
52
- const hasClickedOnInactiveTrigger = store.select('domReferenceElement') !== event.currentTarget;
53
- const nextOpen = open && hasClickedOnInactiveTrigger || !(open && toggle && (openEvent && stickIfOpen ? openEventType === 'click' || openEventType === 'mousedown' : true));
49
+ const hasClickedOnInactiveTrigger = store.select('domReferenceElement') !== currentTarget;
50
+ if (open && hasClickedOnInactiveTrigger) {
51
+ // Moving between triggers should always open the newly active one.
52
+ return true;
53
+ }
54
+ if (!open) {
55
+ // A closed popup should open on the next press.
56
+ return true;
57
+ }
58
+ if (!toggle) {
59
+ // Non-toggle mode never closes on a repeated trigger press.
60
+ return true;
61
+ }
62
+ if (openEvent && stickIfOpen) {
63
+ // Preserve hover/focus-opened popups until the matching click-like event closes them.
64
+ return !isClickLikeOpenEvent(openEvent.type);
65
+ }
66
+
67
+ // Otherwise, a repeated click toggles the popup closed.
68
+ return false;
69
+ }
70
+ return {
71
+ onPointerDown(event) {
72
+ pointerTypeRef.current = event.pointerType;
73
+ },
74
+ onMouseDown(event) {
75
+ const pointerType = pointerTypeRef.current;
76
+ const nativeEvent = event.nativeEvent;
77
+ const open = store.select('open');
54
78
 
55
- // Animations sometimes won't run on a typeable element if using a rAF.
56
- // Focus is always set on these elements. For touch, we may delay opening.
57
- const target = (0, _element.getTarget)(nativeEvent);
58
- if ((0, _element.isTypeableElement)(target)) {
59
- const details = (0, _createBaseUIEventDetails.createChangeEventDetails)(reason, nativeEvent, target);
60
- if (nextOpen && pointerType === 'touch' && touchOpenDelay > 0) {
61
- touchOpenTimeout.start(touchOpenDelay, () => {
62
- store.setOpen(true, details);
63
- });
64
- } else {
65
- store.setOpen(nextOpen, details);
79
+ // Ignore all buttons except for the "main" button.
80
+ // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
81
+ if (event.button !== 0 || eventOption === 'click' || (0, _event.isMouseLikePointerType)(pointerType, true) && ignoreMouse) {
82
+ return;
83
+ }
84
+ const nextOpen = getNextOpen(open, event.currentTarget, openEventType => openEventType === 'click' || openEventType === 'mousedown');
85
+
86
+ // Animations sometimes won't run on a typeable element if using a rAF.
87
+ // Focus is always set on these elements. For touch, we may delay opening.
88
+ const target = (0, _element.getTarget)(nativeEvent);
89
+ if ((0, _element.isTypeableElement)(target)) {
90
+ setOpenWithTouchDelay(nextOpen, nativeEvent, target, pointerType);
91
+ return;
66
92
  }
67
- return;
68
- }
69
93
 
70
- // Capture the currentTarget before the rAF.
71
- // as React sets it to null after the event handler completes.
72
- const eventCurrentTarget = event.currentTarget;
94
+ // Capture the currentTarget before the rAF.
95
+ // as React sets it to null after the event handler completes.
96
+ const eventCurrentTarget = event.currentTarget;
73
97
 
74
- // Wait until focus is set on the element. This is an alternative to
75
- // `event.preventDefault()` to avoid :focus-visible from appearing when using a pointer.
76
- frame.request(() => {
77
- const details = (0, _createBaseUIEventDetails.createChangeEventDetails)(reason, nativeEvent, eventCurrentTarget);
78
- if (nextOpen && pointerType === 'touch' && touchOpenDelay > 0) {
79
- touchOpenTimeout.start(touchOpenDelay, () => {
80
- store.setOpen(true, details);
81
- });
82
- } else {
83
- store.setOpen(nextOpen, details);
98
+ // Wait until focus is set on the element. This is an alternative to
99
+ // `event.preventDefault()` to avoid :focus-visible from appearing when using a pointer.
100
+ frame.request(() => {
101
+ setOpenWithTouchDelay(nextOpen, nativeEvent, eventCurrentTarget, pointerType);
102
+ });
103
+ },
104
+ onClick(event) {
105
+ if (eventOption === 'mousedown-only') {
106
+ return;
84
107
  }
85
- });
86
- },
87
- onClick(event) {
88
- if (eventOption === 'mousedown-only') {
89
- return;
90
- }
91
- const pointerType = pointerTypeRef.current;
92
- if (eventOption === 'mousedown' && pointerType) {
108
+ const pointerType = pointerTypeRef.current;
109
+ if (eventOption === 'mousedown' && pointerType) {
110
+ pointerTypeRef.current = undefined;
111
+ return;
112
+ }
113
+ if ((0, _event.isMouseLikePointerType)(pointerType, true) && ignoreMouse) {
114
+ return;
115
+ }
116
+ const open = store.select('open');
117
+ const nextOpen = getNextOpen(open, event.currentTarget, openEventType => openEventType === 'click' || openEventType === 'mousedown' || openEventType === 'keydown' || openEventType === 'keyup');
118
+ setOpenWithTouchDelay(nextOpen, event.nativeEvent, event.currentTarget, pointerType);
119
+ },
120
+ onKeyDown() {
93
121
  pointerTypeRef.current = undefined;
94
- return;
95
122
  }
96
- if ((0, _event.isMouseLikePointerType)(pointerType, true) && ignoreMouse) {
97
- return;
98
- }
99
- const open = store.select('open');
100
- const openEvent = dataRef.current.openEvent;
101
- const hasClickedOnInactiveTrigger = store.select('domReferenceElement') !== event.currentTarget;
102
- const nextOpen = open && hasClickedOnInactiveTrigger || !(open && toggle && (openEvent && stickIfOpen ? (0, _event.isClickLikeEvent)(openEvent) : true));
103
- const details = (0, _createBaseUIEventDetails.createChangeEventDetails)(reason, event.nativeEvent, event.currentTarget);
104
- if (nextOpen && pointerType === 'touch' && touchOpenDelay > 0) {
105
- touchOpenTimeout.start(touchOpenDelay, () => {
106
- store.setOpen(true, details);
107
- });
108
- } else {
109
- store.setOpen(nextOpen, details);
110
- }
111
- },
112
- onKeyDown() {
113
- pointerTypeRef.current = undefined;
114
- }
115
- }), [dataRef, eventOption, ignoreMouse, store, stickIfOpen, toggle, frame, touchOpenTimeout, touchOpenDelay, reason]);
123
+ };
124
+ }, [dataRef, eventOption, ignoreMouse, reason, store, stickIfOpen, toggle, frame, touchOpenTimeout, touchOpenDelay]);
116
125
  return React.useMemo(() => enabled ? {
117
126
  reference
118
127
  } : _empty.EMPTY_OBJECT, [enabled, reference]);
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.useClientPoint = useClientPoint;
9
9
  var React = _interopRequireWildcard(require("react"));
10
- var _dom = require("@floating-ui/utils/dom");
11
10
  var _addEventListener = require("@base-ui/utils/addEventListener");
12
11
  var _useStableCallback = require("@base-ui/utils/useStableCallback");
12
+ var _dom = require("@floating-ui/utils/dom");
13
13
  var _element = require("../utils/element");
14
14
  var _event = require("../utils/event");
15
15
  function createVirtualElement(domElement, data) {
@@ -74,19 +74,22 @@ function isMouseBasedEvent(event) {
74
74
  * @see https://floating-ui.com/docs/useClientPoint
75
75
  */
76
76
  function useClientPoint(context, props = {}) {
77
+ const {
78
+ enabled = true,
79
+ axis = 'both'
80
+ } = props;
77
81
  const store = 'rootStore' in context ? context.rootStore : context;
78
82
  const open = store.useState('open');
79
83
  const floating = store.useState('floatingElement');
80
84
  const domReference = store.useState('domReferenceElement');
81
85
  const dataRef = store.context.dataRef;
82
- const {
83
- enabled = true,
84
- axis = 'both'
85
- } = props;
86
86
  const initialRef = React.useRef(false);
87
87
  const cleanupListenerRef = React.useRef(null);
88
88
  const [pointerType, setPointerType] = React.useState();
89
89
  const [reactive, setReactive] = React.useState([]);
90
+ const resetReference = (0, _useStableCallback.useStableCallback)(reference => {
91
+ store.set('positionReference', reference);
92
+ });
90
93
  const setReference = (0, _useStableCallback.useStableCallback)((newX, newY, referenceElement) => {
91
94
  if (initialRef.current) {
92
95
  return;
@@ -113,6 +116,7 @@ function useClientPoint(context, props = {}) {
113
116
  // If there's no cleanup, there's no listener, but we want to ensure
114
117
  // we add the listener if the cursor landed on the floating element and
115
118
  // then back on the reference (i.e. it's interactive).
119
+ setReference(event.clientX, event.clientY, event.currentTarget);
116
120
  setReactive([]);
117
121
  }
118
122
  });
@@ -122,34 +126,39 @@ function useClientPoint(context, props = {}) {
122
126
  // devices, this is undesirable because the floating element will move to
123
127
  // the dismissal touch point.
124
128
  const openCheck = (0, _event.isMouseLikePointerType)(pointerType) ? floating : open;
125
- const addListener = React.useCallback(() => {
126
- if (!openCheck || !enabled) {
129
+ React.useEffect(() => {
130
+ if (!enabled) {
131
+ resetReference(domReference);
132
+ return undefined;
133
+ }
134
+ if (!openCheck) {
127
135
  return undefined;
128
136
  }
137
+ function cleanupListener() {
138
+ cleanupListenerRef.current?.();
139
+ cleanupListenerRef.current = null;
140
+ }
129
141
  const win = (0, _dom.getWindow)(floating);
130
142
  function handleMouseMove(event) {
131
143
  const target = (0, _element.getTarget)(event);
132
144
  if (!(0, _element.contains)(floating, target)) {
133
145
  setReference(event.clientX, event.clientY);
134
146
  } else {
135
- cleanupListenerRef.current?.();
136
- cleanupListenerRef.current = null;
147
+ cleanupListener();
137
148
  }
138
149
  }
139
150
  if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {
140
- const cleanup = () => {
141
- cleanupListenerRef.current?.();
142
- cleanupListenerRef.current = null;
143
- };
144
151
  cleanupListenerRef.current = (0, _addEventListener.addEventListener)(win, 'mousemove', handleMouseMove);
145
- return cleanup;
152
+ } else {
153
+ resetReference(domReference);
146
154
  }
147
- store.set('positionReference', domReference);
148
- return undefined;
149
- }, [openCheck, enabled, floating, dataRef, domReference, store, setReference]);
150
- React.useEffect(() => {
151
- return addListener();
152
- }, [addListener, reactive]);
155
+ return cleanupListener;
156
+ }, [openCheck, enabled, floating, dataRef, domReference, store, setReference, resetReference, reactive]);
157
+
158
+ // Clear virtual cursor references when the hook unmounts. Enabled flips are handled above.
159
+ React.useEffect(() => () => {
160
+ store.set('positionReference', null);
161
+ }, [store]);
153
162
  React.useEffect(() => {
154
163
  if (enabled && !floating) {
155
164
  initialRef.current = false;
@@ -71,7 +71,7 @@ export interface UseDismissProps {
71
71
  outsidePress?: boolean | undefined;
72
72
  } | undefined;
73
73
  /**
74
- * External FlatingTree to use when the one provided by context can't be used.
74
+ * External FloatingTree to use when the one provided by context can't be used.
75
75
  */
76
76
  externalTree?: FloatingTreeStore | undefined;
77
77
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  'use client';
3
3
 
4
+ /* eslint-disable no-underscore-dangle */
4
5
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
6
  Object.defineProperty(exports, "__esModule", {
6
7
  value: true
@@ -8,21 +9,19 @@ Object.defineProperty(exports, "__esModule", {
8
9
  exports.normalizeProp = normalizeProp;
9
10
  exports.useDismiss = useDismiss;
10
11
  var React = _interopRequireWildcard(require("react"));
11
- var _dom = require("@floating-ui/utils/dom");
12
12
  var _addEventListener = require("@base-ui/utils/addEventListener");
13
13
  var _mergeCleanups = require("@base-ui/utils/mergeCleanups");
14
- var _useTimeout = require("@base-ui/utils/useTimeout");
15
- var _useStableCallback = require("@base-ui/utils/useStableCallback");
16
14
  var _owner = require("@base-ui/utils/owner");
17
- var _element = require("../utils/element");
18
- var _event = require("../utils/event");
19
- var _nodes = require("../utils/nodes");
15
+ var _useStableCallback = require("@base-ui/utils/useStableCallback");
16
+ var _useTimeout = require("@base-ui/utils/useTimeout");
17
+ var _dom = require("@floating-ui/utils/dom");
20
18
  var _FloatingTree = require("../components/FloatingTree");
21
19
  var _createBaseUIEventDetails = require("../../internals/createBaseUIEventDetails");
22
20
  var _reasons = require("../../internals/reasons");
23
21
  var _createAttribute = require("../utils/createAttribute");
24
- /* eslint-disable no-underscore-dangle */
25
-
22
+ var _element = require("../utils/element");
23
+ var _event = require("../utils/event");
24
+ var _nodes = require("../utils/nodes");
26
25
  const bubbleHandlerKeys = {
27
26
  intentional: 'onClick',
28
27
  sloppy: 'onPointerDown'
@@ -42,12 +41,6 @@ function normalizeProp(normalizable) {
42
41
  * @see https://floating-ui.com/docs/useDismiss
43
42
  */
44
43
  function useDismiss(context, props = {}) {
45
- const store = 'rootStore' in context ? context.rootStore : context;
46
- const open = store.useState('open');
47
- const floatingElement = store.useState('floatingElement');
48
- const {
49
- dataRef
50
- } = store.context;
51
44
  const {
52
45
  enabled = true,
53
46
  escapeKey = true,
@@ -58,19 +51,27 @@ function useDismiss(context, props = {}) {
58
51
  bubbles,
59
52
  externalTree
60
53
  } = props;
54
+ const store = 'rootStore' in context ? context.rootStore : context;
55
+ const open = store.useState('open');
56
+ const floatingElement = store.useState('floatingElement');
57
+ const {
58
+ dataRef
59
+ } = store.context;
61
60
  const tree = (0, _FloatingTree.useFloatingTree)(externalTree);
62
61
  const outsidePressFn = (0, _useStableCallback.useStableCallback)(typeof outsidePressProp === 'function' ? outsidePressProp : () => false);
63
62
  const outsidePress = typeof outsidePressProp === 'function' ? outsidePressFn : outsidePressProp;
64
63
  const outsidePressEnabled = outsidePress !== false;
65
64
  const getOutsidePressEventProp = (0, _useStableCallback.useStableCallback)(() => outsidePressEvent);
66
- const pressStartedInsideRef = React.useRef(false);
67
- const pressStartPreventedRef = React.useRef(false);
68
- // Ignore only the very next outside click after dragging from inside to outside.
69
- const suppressNextOutsideClickRef = React.useRef(false);
70
65
  const {
71
66
  escapeKey: escapeKeyBubbles,
72
67
  outsidePress: outsidePressBubbles
73
68
  } = normalizeProp(bubbles);
69
+ const pressStartedInsideRef = React.useRef(false);
70
+ const pressStartPreventedRef = React.useRef(false);
71
+ // Ignore only the very next outside click after dragging from inside to outside.
72
+ const suppressNextOutsideClickRef = React.useRef(false);
73
+ const isComposingRef = React.useRef(false);
74
+ const currentPointerTypeRef = React.useRef('');
74
75
  const touchStateRef = React.useRef(null);
75
76
  const cancelDismissOnEndTimeout = (0, _useTimeout.useTimeout)();
76
77
  const clearInsideReactTreeTimeout = (0, _useTimeout.useTimeout)();
@@ -78,9 +79,20 @@ function useDismiss(context, props = {}) {
78
79
  clearInsideReactTreeTimeout.clear();
79
80
  dataRef.current.insideReactTree = false;
80
81
  });
81
- const isComposingRef = React.useRef(false);
82
- const currentPointerTypeRef = React.useRef('');
83
- const isReferencePressEnabled = (0, _useStableCallback.useStableCallback)(referencePress);
82
+ const hasBlockingChild = (0, _useStableCallback.useStableCallback)(bubbleKey => {
83
+ const nodeId = dataRef.current.floatingContext?.nodeId;
84
+ const children = tree ? (0, _nodes.getNodeChildren)(tree.nodesRef.current, nodeId) : [];
85
+ return children.some(child => child.context?.open && !child.context.dataRef.current[bubbleKey]);
86
+ });
87
+ const isEventWithinOwnElements = (0, _useStableCallback.useStableCallback)(event => {
88
+ return (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement'));
89
+ });
90
+ const closeOnReferencePress = (0, _useStableCallback.useStableCallback)(event => {
91
+ if (!referencePress()) {
92
+ return;
93
+ }
94
+ store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerPress, event.nativeEvent));
95
+ });
84
96
  const closeOnEscapeKeyDown = (0, _useStableCallback.useStableCallback)(event => {
85
97
  if (!open || !enabled || !escapeKey || event.key !== 'Escape') {
86
98
  return;
@@ -91,24 +103,15 @@ function useDismiss(context, props = {}) {
91
103
  if (isComposingRef.current) {
92
104
  return;
93
105
  }
94
- const nodeId = dataRef.current.floatingContext?.nodeId;
95
- const children = tree ? (0, _nodes.getNodeChildren)(tree.nodesRef.current, nodeId) : [];
96
- if (!escapeKeyBubbles) {
97
- if (children.length > 0) {
98
- let shouldDismiss = true;
99
- children.forEach(child => {
100
- if (child.context?.open && !child.context.dataRef.current.__escapeKeyBubbles) {
101
- shouldDismiss = false;
102
- }
103
- });
104
- if (!shouldDismiss) {
105
- return;
106
- }
107
- }
106
+ if (!escapeKeyBubbles && hasBlockingChild('__escapeKeyBubbles')) {
107
+ return;
108
108
  }
109
109
  const native = (0, _event.isReactEvent)(event) ? event.nativeEvent : event;
110
110
  const eventDetails = (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.escapeKey, native);
111
111
  store.setOpen(false, eventDetails);
112
+ if (!eventDetails.isCanceled) {
113
+ event.preventDefault();
114
+ }
112
115
  if (!escapeKeyBubbles && !eventDetails.isPropagationAllowed) {
113
116
  event.stopPropagation();
114
117
  }
@@ -117,6 +120,33 @@ function useDismiss(context, props = {}) {
117
120
  dataRef.current.insideReactTree = true;
118
121
  clearInsideReactTreeTimeout.start(0, clearInsideReactTree);
119
122
  });
123
+ const markPressStartedInsideReactTree = (0, _useStableCallback.useStableCallback)(event => {
124
+ if (!open || !enabled || event.button !== 0) {
125
+ return;
126
+ }
127
+ const target = (0, _element.getTarget)(event.nativeEvent);
128
+
129
+ // Only treat presses that start within the floating DOM subtree as inside.
130
+ // This avoids suppressing parent dismissal when interacting with nested portals.
131
+ if (!(0, _element.contains)(store.select('floatingElement'), target)) {
132
+ return;
133
+ }
134
+ if (!pressStartedInsideRef.current) {
135
+ pressStartedInsideRef.current = true;
136
+ pressStartPreventedRef.current = false;
137
+ }
138
+ });
139
+ const markInsidePressStartPrevented = (0, _useStableCallback.useStableCallback)(event => {
140
+ if (!open || !enabled) {
141
+ return;
142
+ }
143
+ if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) {
144
+ return;
145
+ }
146
+ if (pressStartedInsideRef.current) {
147
+ pressStartPreventedRef.current = true;
148
+ }
149
+ });
120
150
  React.useEffect(() => {
121
151
  if (!open || !enabled) {
122
152
  return undefined;
@@ -169,10 +199,16 @@ function useDismiss(context, props = {}) {
169
199
  function isEventWithinFloatingTree(event) {
170
200
  const nodeId = dataRef.current.floatingContext?.nodeId;
171
201
  const targetIsInsideChildren = tree && (0, _nodes.getNodeChildren)(tree.nodesRef.current, nodeId).some(node => (0, _element.isEventTargetWithin)(event, node.context?.elements.floating));
172
- return (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement')) || targetIsInsideChildren;
202
+ return isEventWithinOwnElements(event) || targetIsInsideChildren;
173
203
  }
174
204
  function closeOnPressOutside(event) {
175
205
  if (shouldIgnoreEvent(event)) {
206
+ // A new press began outside the floating element and its trigger. Clear any
207
+ // leftover drag-out suppression so this press's eventual click can dismiss.
208
+ if (event.type !== 'click' && !isEventWithinOwnElements(event)) {
209
+ preventedPressSuppressionTimeout.clear();
210
+ suppressNextOutsideClickRef.current = false;
211
+ }
176
212
  clearInsideReactTree();
177
213
  return;
178
214
  }
@@ -248,30 +284,20 @@ function useDismiss(context, props = {}) {
248
284
  if (typeof outsidePress === 'function' && !outsidePress(event)) {
249
285
  return;
250
286
  }
251
- const nodeId = dataRef.current.floatingContext?.nodeId;
252
- const children = tree ? (0, _nodes.getNodeChildren)(tree.nodesRef.current, nodeId) : [];
253
- if (children.length > 0) {
254
- let shouldDismiss = true;
255
- children.forEach(child => {
256
- if (child.context?.open && !child.context.dataRef.current.__outsidePressBubbles) {
257
- shouldDismiss = false;
258
- }
259
- });
260
- if (!shouldDismiss) {
261
- return;
262
- }
287
+ if (hasBlockingChild('__outsidePressBubbles')) {
288
+ return;
263
289
  }
264
290
  store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.outsidePress, event));
265
291
  clearInsideReactTree();
266
292
  }
267
293
  function handlePointerDown(event) {
268
- if (getOutsidePressEvent() !== 'sloppy' || event.pointerType === 'touch' || !store.select('open') || !enabled || (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement'))) {
294
+ if (getOutsidePressEvent() !== 'sloppy' || event.pointerType === 'touch' || !store.select('open') || !enabled || isEventWithinOwnElements(event)) {
269
295
  return;
270
296
  }
271
297
  closeOnPressOutside(event);
272
298
  }
273
299
  function handleTouchStart(event) {
274
- if (getOutsidePressEvent() !== 'sloppy' || !store.select('open') || !enabled || (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement'))) {
300
+ if (getOutsidePressEvent() !== 'sloppy' || !store.select('open') || !enabled || isEventWithinOwnElements(event)) {
275
301
  return;
276
302
  }
277
303
  const touch = event.touches[0];
@@ -358,7 +384,7 @@ function useDismiss(context, props = {}) {
358
384
  clearInsideReactTree();
359
385
  }
360
386
  function handleTouchMove(event) {
361
- if (getOutsidePressEvent() !== 'sloppy' || !touchStateRef.current || (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement'))) {
387
+ if (getOutsidePressEvent() !== 'sloppy' || !touchStateRef.current || isEventWithinOwnElements(event)) {
362
388
  return;
363
389
  }
364
390
  const touch = event.touches[0];
@@ -381,7 +407,7 @@ function useDismiss(context, props = {}) {
381
407
  addTargetEventListenerOnce(event, handleTouchMove);
382
408
  }
383
409
  function handleTouchEnd(event) {
384
- if (getOutsidePressEvent() !== 'sloppy' || !touchStateRef.current || (0, _element.isEventTargetWithin)(event, store.select('floatingElement')) || (0, _element.isEventTargetWithin)(event, store.select('domReferenceElement'))) {
410
+ if (getOutsidePressEvent() !== 'sloppy' || !touchStateRef.current || isEventWithinOwnElements(event)) {
385
411
  return;
386
412
  }
387
413
  if (touchStateRef.current.dismissOnTouchEnd) {
@@ -402,51 +428,15 @@ function useDismiss(context, props = {}) {
402
428
  resetPressStartState();
403
429
  suppressNextOutsideClickRef.current = false;
404
430
  };
405
- }, [dataRef, floatingElement, escapeKey, outsidePressEnabled, outsidePress, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, tree, store, cancelDismissOnEndTimeout]);
431
+ }, [dataRef, floatingElement, escapeKey, outsidePressEnabled, outsidePress, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, hasBlockingChild, isEventWithinOwnElements, tree, store, cancelDismissOnEndTimeout]);
406
432
  React.useEffect(clearInsideReactTree, [outsidePress, clearInsideReactTree]);
407
433
  const reference = React.useMemo(() => ({
408
434
  onKeyDown: closeOnEscapeKeyDown,
409
- [bubbleHandlerKeys[referencePressEvent]]: event => {
410
- if (!isReferencePressEnabled()) {
411
- return;
412
- }
413
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerPress, event.nativeEvent));
414
- },
435
+ [bubbleHandlerKeys[referencePressEvent]]: closeOnReferencePress,
415
436
  ...(referencePressEvent !== 'intentional' && {
416
- onClick(event) {
417
- if (!isReferencePressEnabled()) {
418
- return;
419
- }
420
- store.setOpen(false, (0, _createBaseUIEventDetails.createChangeEventDetails)(_reasons.REASONS.triggerPress, event.nativeEvent));
421
- }
437
+ onClick: closeOnReferencePress
422
438
  })
423
- }), [closeOnEscapeKeyDown, store, referencePressEvent, isReferencePressEnabled]);
424
- const markPressStartedInsideReactTree = (0, _useStableCallback.useStableCallback)(event => {
425
- if (!open || !enabled || event.button !== 0) {
426
- return;
427
- }
428
- const target = (0, _element.getTarget)(event.nativeEvent);
429
- // Only treat presses that start within the floating DOM subtree as inside.
430
- // This avoids suppressing parent dismissal when interacting with nested portals.
431
- if (!(0, _element.contains)(store.select('floatingElement'), target)) {
432
- return;
433
- }
434
- if (!pressStartedInsideRef.current) {
435
- pressStartedInsideRef.current = true;
436
- pressStartPreventedRef.current = false;
437
- }
438
- });
439
- const markInsidePressStartPrevented = (0, _useStableCallback.useStableCallback)(event => {
440
- if (!open || !enabled) {
441
- return;
442
- }
443
- if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) {
444
- return;
445
- }
446
- if (pressStartedInsideRef.current) {
447
- pressStartPreventedRef.current = true;
448
- }
449
- });
439
+ }), [closeOnEscapeKeyDown, closeOnReferencePress, referencePressEvent]);
450
440
  const floating = React.useMemo(() => ({
451
441
  onKeyDown: closeOnEscapeKeyDown,
452
442
  // `onMouseDown` may be blocked if `event.preventDefault()` is called in