@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,62 +1,34 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
- import { useStableCallback } from '@base-ui/utils/useStableCallback';
5
4
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
5
+ import { useStableCallback } from '@base-ui/utils/useStableCallback';
6
6
  import { useTimeout } from '@base-ui/utils/useTimeout';
7
+ import { isElementVisible } from "../utils/composite.js";
7
8
  import { contains } from "../utils/element.js";
8
9
  import { stopEvent } from "../utils/event.js";
9
- import { isElementVisible } from "../utils/composite.js";
10
10
  /**
11
11
  * Provides a matching callback that can be used to focus an item as the user
12
12
  * types, often used in tandem with `useListNavigation()`.
13
13
  * @see https://floating-ui.com/docs/useTypeahead
14
14
  */
15
15
  export function useTypeahead(context, props) {
16
- const store = 'rootStore' in context ? context.rootStore : context;
17
- const dataRef = store.context.dataRef;
18
- const open = store.useState('open');
19
16
  const {
20
17
  listRef,
21
18
  elementsRef,
22
19
  activeIndex,
23
20
  onMatch: onMatchProp,
24
- onTypingChange,
21
+ onTyping,
25
22
  enabled = true,
26
23
  resetMs = 750,
27
24
  selectedIndex = null
28
25
  } = props;
26
+ const store = 'rootStore' in context ? context.rootStore : context;
27
+ const open = store.useState('open');
29
28
  const timeout = useTimeout();
30
29
  const stringRef = React.useRef('');
31
30
  const prevIndexRef = React.useRef(selectedIndex ?? activeIndex ?? -1);
32
31
  const matchIndexRef = React.useRef(null);
33
- useIsoLayoutEffect(() => {
34
- if (!open && selectedIndex !== null) {
35
- return;
36
- }
37
- timeout.clear();
38
- matchIndexRef.current = null;
39
- if (stringRef.current !== '') {
40
- stringRef.current = '';
41
- }
42
- }, [open, selectedIndex, timeout]);
43
- useIsoLayoutEffect(() => {
44
- // Sync arrow key navigation but not typeahead navigation.
45
- if (open && stringRef.current === '') {
46
- prevIndexRef.current = selectedIndex ?? activeIndex ?? -1;
47
- }
48
- }, [open, selectedIndex, activeIndex]);
49
- const setTypingChange = useStableCallback(value => {
50
- if (value) {
51
- if (!dataRef.current.typing) {
52
- dataRef.current.typing = value;
53
- onTypingChange?.(value);
54
- }
55
- } else if (dataRef.current.typing) {
56
- dataRef.current.typing = value;
57
- onTypingChange?.(value);
58
- }
59
- });
60
32
  const onKeyDown = useStableCallback(event => {
61
33
  function isVisible(index) {
62
34
  const element = elementsRef?.current[index];
@@ -82,11 +54,11 @@ export function useTypeahead(context, props) {
82
54
  if (stringRef.current.length > 0 && event.key === ' ') {
83
55
  // Space should continue the in-progress typeahead session.
84
56
  stopEvent(event);
85
- setTypingChange(true);
57
+ onTyping?.(true);
86
58
  }
87
59
  if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {
88
60
  if (getMatchingIndex(listContent, stringRef.current) === -1 && event.key !== ' ') {
89
- setTypingChange(false);
61
+ onTyping?.(false);
90
62
  }
91
63
  }
92
64
  if (listContent == null ||
@@ -98,7 +70,7 @@ export function useTypeahead(context, props) {
98
70
  }
99
71
  if (open && event.key !== ' ') {
100
72
  stopEvent(event);
101
- setTypingChange(true);
73
+ onTyping?.(true);
102
74
  }
103
75
 
104
76
  // Capture whether this is a new typing session before mutating the string.
@@ -121,7 +93,7 @@ export function useTypeahead(context, props) {
121
93
  timeout.start(resetMs, () => {
122
94
  stringRef.current = '';
123
95
  prevIndexRef.current = matchIndexRef.current;
124
- setTypingChange(false);
96
+ onTyping?.(false);
125
97
  });
126
98
 
127
99
  // Compute the starting index for this search.
@@ -135,18 +107,17 @@ export function useTypeahead(context, props) {
135
107
  matchIndexRef.current = index;
136
108
  } else if (event.key !== ' ') {
137
109
  stringRef.current = '';
138
- setTypingChange(false);
110
+ onTyping?.(false);
139
111
  }
140
112
  });
141
113
  const onBlur = useStableCallback(event => {
142
114
  const next = event.relatedTarget;
143
115
  const currentDomReferenceElement = store.select('domReferenceElement');
144
116
  const currentFloatingElement = store.select('floatingElement');
145
- const withinReference = contains(currentDomReferenceElement, next);
146
- const withinFloating = contains(currentFloatingElement, next);
117
+ const withinComposite = contains(currentDomReferenceElement, next) || contains(currentFloatingElement, next);
147
118
 
148
119
  // Keep the session if focus moves within the composite (reference <-> floating).
149
- if (withinReference || withinFloating) {
120
+ if (withinComposite) {
150
121
  return;
151
122
  }
152
123
 
@@ -154,20 +125,30 @@ export function useTypeahead(context, props) {
154
125
  timeout.clear();
155
126
  stringRef.current = '';
156
127
  prevIndexRef.current = matchIndexRef.current;
157
- setTypingChange(false);
128
+ onTyping?.(false);
158
129
  });
159
- const reference = React.useMemo(() => ({
130
+ useIsoLayoutEffect(() => {
131
+ if (!open && selectedIndex !== null) {
132
+ return;
133
+ }
134
+ timeout.clear();
135
+ matchIndexRef.current = null;
136
+ if (stringRef.current !== '') {
137
+ stringRef.current = '';
138
+ }
139
+ }, [open, selectedIndex, timeout]);
140
+ useIsoLayoutEffect(() => {
141
+ // Sync arrow key navigation but not typeahead navigation.
142
+ if (open && stringRef.current === '') {
143
+ prevIndexRef.current = selectedIndex ?? activeIndex ?? -1;
144
+ }
145
+ }, [open, selectedIndex, activeIndex]);
146
+ const sharedProps = React.useMemo(() => ({
160
147
  onKeyDown,
161
148
  onBlur
162
149
  }), [onKeyDown, onBlur]);
163
- const floating = React.useMemo(() => {
164
- return {
165
- onKeyDown,
166
- onBlur
167
- };
168
- }, [onKeyDown, onBlur]);
169
150
  return React.useMemo(() => enabled ? {
170
- reference,
171
- floating
172
- } : {}, [enabled, reference, floating]);
151
+ reference: sharedProps,
152
+ floating: sharedProps
153
+ } : {}, [enabled, sharedProps]);
173
154
  }
@@ -13,9 +13,7 @@ export { useFocus } from "./hooks/useFocus.js";
13
13
  export { useHoverFloatingInteraction } from "./hooks/useHoverFloatingInteraction.js";
14
14
  export { useHoverReferenceInteraction } from "./hooks/useHoverReferenceInteraction.js";
15
15
  export { useHover } from "./hooks/useHover.js";
16
- export { useInteractions } from "./hooks/useInteractions.js";
17
16
  export { useListNavigation } from "./hooks/useListNavigation.js";
18
- export { useRole } from "./hooks/useRole.js";
19
17
  export { useTypeahead } from "./hooks/useTypeahead.js";
20
18
  export { safePolygon } from "./safePolygon.js";
21
19
  export type * from "./types.js";
@@ -13,9 +13,7 @@ export { useFocus } from "./hooks/useFocus.js";
13
13
  export { useHoverFloatingInteraction } from "./hooks/useHoverFloatingInteraction.js";
14
14
  export { useHoverReferenceInteraction } from "./hooks/useHoverReferenceInteraction.js";
15
15
  export { useHover } from "./hooks/useHover.js";
16
- export { useInteractions } from "./hooks/useInteractions.js";
17
16
  export { useListNavigation } from "./hooks/useListNavigation.js";
18
- export { useRole } from "./hooks/useRole.js";
19
17
  export { useTypeahead } from "./hooks/useTypeahead.js";
20
18
  export { safePolygon } from "./safePolygon.js";
21
19
  export { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';
@@ -1,7 +1,6 @@
1
1
  import type { UseFloatingOptions as UsePositionOptions, UseFloatingReturn as UsePositionFloatingReturn, VirtualElement } from '@floating-ui/react-dom';
2
2
  import type * as React from 'react';
3
3
  import type { BaseUIChangeEventDetails } from "../internals/createBaseUIEventDetails.js";
4
- import type { ExtendedUserProps } from "./hooks/useInteractions.js";
5
4
  import type { FloatingTreeStore } from "./components/FloatingTreeStore.js";
6
5
  import type { FloatingRootStore } from "./components/FloatingRootStore.js";
7
6
  export * from "./index.js";
@@ -16,10 +15,8 @@ export type { HandleCloseContext, HandleClose } from "./hooks/useHoverShared.js"
16
15
  export type { UseHoverFloatingInteractionProps } from "./hooks/useHoverFloatingInteraction.js";
17
16
  export type { UseHoverReferenceInteractionProps } from "./hooks/useHoverReferenceInteraction.js";
18
17
  export type { UseListNavigationProps } from "./hooks/useListNavigation.js";
19
- export type { UseRoleProps } from "./hooks/useRole.js";
20
18
  export type { UseTypeaheadProps } from "./hooks/useTypeahead.js";
21
19
  export type { UseFloatingRootContextOptions } from "./hooks/useFloatingRootContext.js";
22
- export type { UseInteractionsReturn } from "./hooks/useInteractions.js";
23
20
  export type { SafePolygonOptions } from "./safePolygon.js";
24
21
  export type { FloatingTreeProps, FloatingNodeProps } from "./components/FloatingTree.js";
25
22
  export type { AlignedPlacement, Alignment, ArrowOptions, AutoPlacementOptions, AutoUpdateOptions, Axis, Boundary, ClientRectObject, ComputePositionConfig, ComputePositionReturn, Coords, DetectOverflowOptions, Dimensions, ElementContext, ElementRects, Elements, FlipOptions, FloatingElement, HideOptions, InlineOptions, Length, Middleware, MiddlewareArguments, MiddlewareData, MiddlewareReturn, MiddlewareState, NodeScroll, OffsetOptions, Padding, Placement, Platform, Rect, ReferenceElement, RootBoundary, ShiftOptions, Side, SideObject, SizeOptions, Strategy, VirtualElement } from '@floating-ui/react-dom';
@@ -51,8 +48,6 @@ export interface FloatingEvents {
51
48
  export interface ContextData {
52
49
  openEvent?: Event | undefined;
53
50
  floatingContext?: FloatingContext | undefined;
54
- /** @deprecated use `onTypingChange` prop in `useTypeahead` */
55
- typing?: boolean | undefined;
56
51
  [key: string]: any;
57
52
  }
58
53
  export type FloatingRootContext = FloatingRootStore;
@@ -76,7 +71,7 @@ export type FloatingTreeType = FloatingTreeStore;
76
71
  export interface ElementProps {
77
72
  reference?: React.HTMLProps<Element> | undefined;
78
73
  floating?: React.HTMLProps<HTMLElement> | undefined;
79
- item?: React.HTMLProps<HTMLElement> | ((props: ExtendedUserProps) => React.HTMLProps<HTMLElement>) | undefined;
74
+ item?: React.HTMLProps<HTMLElement> | undefined;
80
75
  trigger?: React.HTMLProps<Element> | undefined;
81
76
  }
82
77
  export type ReferenceType = Element | VirtualElement;
@@ -117,7 +112,7 @@ export interface UseFloatingOptions extends Omit<UsePositionOptions, 'elements'>
117
112
  */
118
113
  nodeId?: string | undefined;
119
114
  /**
120
- * External FlatingTree to use when the one provided by context can't be used.
115
+ * External FloatingTree to use when the one provided by context can't be used.
121
116
  */
122
117
  externalTree?: FloatingTreeStore | undefined;
123
118
  }
@@ -296,6 +296,8 @@ export function createGridCellMap(sizes, cols, dense) {
296
296
  }, index) => {
297
297
  if (width > cols) {
298
298
  if (process.env.NODE_ENV !== 'production') {
299
+ // TODO: fix mui/no-guarded-throw
300
+ // eslint-disable-next-line mui/no-guarded-throw
299
301
  throw new Error(`[Floating UI]: Invalid grid - item width at index ${index} is greater than grid columns`);
300
302
  }
301
303
  }
@@ -2,8 +2,8 @@ import { NOOP } from '@base-ui/utils/empty';
2
2
  import type { FocusableElement } from "./tabbable.js";
3
3
  interface Options {
4
4
  preventScroll?: boolean | undefined;
5
- cancelPrevious?: boolean | undefined;
6
5
  sync?: boolean | undefined;
6
+ shouldFocus?: (() => boolean) | undefined;
7
7
  }
8
8
  export declare function enqueueFocus(el: FocusableElement | null, options?: Options): typeof NOOP;
9
9
  export {};
@@ -3,15 +3,18 @@ let rafId = 0;
3
3
  export function enqueueFocus(el, options = {}) {
4
4
  const {
5
5
  preventScroll = false,
6
- cancelPrevious = true,
7
- sync = false
6
+ sync = false,
7
+ shouldFocus
8
8
  } = options;
9
- if (cancelPrevious) {
10
- cancelAnimationFrame(rafId);
9
+ cancelAnimationFrame(rafId);
10
+ function exec() {
11
+ if (shouldFocus && !shouldFocus()) {
12
+ return;
13
+ }
14
+ el?.focus({
15
+ preventScroll
16
+ });
11
17
  }
12
- const exec = () => el?.focus({
13
- preventScroll
14
- });
15
18
  if (sync) {
16
19
  exec();
17
20
  return NOOP;
@@ -7,7 +7,7 @@ export function getEmptyRootContext() {
7
7
  floatingElement: null,
8
8
  referenceElement: null,
9
9
  triggerElements: new PopupTriggerMap(),
10
- floatingId: '',
10
+ floatingId: undefined,
11
11
  syncOnly: false,
12
12
  nested: false,
13
13
  onOpenChange: undefined
package/esm/form/Form.js CHANGED
@@ -61,11 +61,11 @@ export const Form = /*#__PURE__*/React.forwardRef(function Form(componentProps,
61
61
  if (fieldName) {
62
62
  const namedField = values.find(field => field.name === fieldName);
63
63
  if (namedField) {
64
- namedField.validate(false);
64
+ namedField.validate();
65
65
  }
66
66
  } else {
67
67
  values.forEach(field => {
68
- field.validate(false);
68
+ field.validate();
69
69
  });
70
70
  }
71
71
  }, []);
package/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @base-ui/react v1.4.1
2
+ * @base-ui/react v1.5.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -17,7 +17,6 @@ export declare const HORIZONTAL_KEYS_WITH_EXTRA_KEYS: Set<string>;
17
17
  export declare const VERTICAL_KEYS: Set<string>;
18
18
  export declare const VERTICAL_KEYS_WITH_EXTRA_KEYS: Set<string>;
19
19
  export declare const ARROW_KEYS: Set<string>;
20
- export declare const ALL_KEYS: Set<string>;
21
20
  export declare const COMPOSITE_KEYS: Set<string>;
22
21
  export declare const SHIFT: "Shift";
23
22
  export declare const CONTROL: "Control";
@@ -13,8 +13,7 @@ export const HORIZONTAL_KEYS_WITH_EXTRA_KEYS = new Set([ARROW_LEFT, ARROW_RIGHT,
13
13
  export const VERTICAL_KEYS = new Set([ARROW_UP, ARROW_DOWN]);
14
14
  export const VERTICAL_KEYS_WITH_EXTRA_KEYS = new Set([ARROW_UP, ARROW_DOWN, HOME, END]);
15
15
  export const ARROW_KEYS = new Set([...HORIZONTAL_KEYS, ...VERTICAL_KEYS]);
16
- export const ALL_KEYS = new Set([...ARROW_KEYS, HOME, END]);
17
- export const COMPOSITE_KEYS = new Set([ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, HOME, END]);
16
+ export const COMPOSITE_KEYS = new Set([...ARROW_KEYS, HOME, END]);
18
17
  export const SHIFT = 'Shift';
19
18
  export const CONTROL = 'Control';
20
19
  export const ALT = 'Alt';
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { isElementDisabled } from '@base-ui/utils/isElementDisabled';
5
5
  import { useStableCallback } from '@base-ui/utils/useStableCallback';
6
6
  import { useMergedRefs } from '@base-ui/utils/useMergedRefs';
7
- import { ALL_KEYS, ARROW_DOWN, ARROW_KEYS, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, END, HOME, HORIZONTAL_KEYS, HORIZONTAL_KEYS_WITH_EXTRA_KEYS, MODIFIER_KEYS, VERTICAL_KEYS, VERTICAL_KEYS_WITH_EXTRA_KEYS, createGridCellMap, findNonDisabledListIndex, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, isListIndexDisabled, isIndexOutOfListBounds, isNativeInput, scrollIntoViewIfNeeded } from "../composite.js";
7
+ import { COMPOSITE_KEYS, ARROW_DOWN, ARROW_KEYS, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, END, HOME, HORIZONTAL_KEYS, HORIZONTAL_KEYS_WITH_EXTRA_KEYS, MODIFIER_KEYS, VERTICAL_KEYS, VERTICAL_KEYS_WITH_EXTRA_KEYS, createGridCellMap, findNonDisabledListIndex, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, isListIndexDisabled, isIndexOutOfListBounds, isNativeInput, scrollIntoViewIfNeeded } from "../composite.js";
8
8
  import { ACTIVE_COMPOSITE_ITEM } from "../constants.js";
9
9
  import { getTarget } from "../../../floating-ui-react/utils.js";
10
10
  const EMPTY_ARRAY = [];
@@ -71,7 +71,7 @@ export function useCompositeRoot(params) {
71
71
  target.setSelectionRange(0, target.value.length ?? 0);
72
72
  },
73
73
  onKeyDown(event) {
74
- const RELEVANT_KEYS = enableHomeAndEndKeys ? ALL_KEYS : ARROW_KEYS;
74
+ const RELEVANT_KEYS = enableHomeAndEndKeys ? COMPOSITE_KEYS : ARROW_KEYS;
75
75
  if (!RELEVANT_KEYS.has(event.key)) {
76
76
  return;
77
77
  }
@@ -31,6 +31,8 @@ interface ReasonToEventMap {
31
31
  [REASONS.cancelOpen]: MouseEvent;
32
32
  [REASONS.siblingOpen]: Event;
33
33
  [REASONS.disabled]: Event;
34
+ [REASONS.missing]: Event;
35
+ [REASONS.initial]: Event;
34
36
  [REASONS.imperativeAction]: Event;
35
37
  [REASONS.windowResize]: UIEvent;
36
38
  }
@@ -0,0 +1,2 @@
1
+ export { CSPContext, useCSPContext } from "./CSPContext.js";
2
+ export type { CSPContextValue } from "./CSPContext.js";
@@ -0,0 +1 @@
1
+ export { CSPContext, useCSPContext } from "./CSPContext.js";
@@ -1,4 +1,3 @@
1
1
  export { useRegisterFieldControl } from "./useRegisterFieldControl.js";
2
- export type { UseRegisterFieldControlParameters } from "./useRegisterFieldControl.js";
3
2
  export { useFieldControlRegistration } from "./useFieldControlRegistration.js";
4
3
  export type { FieldControlRegistration, UseFieldControlRegistrationParameters } from "./useFieldControlRegistration.js";
@@ -2,8 +2,8 @@ import * as React from 'react';
2
2
  import type { FieldValidityData } from "../../field/root/FieldRoot.js";
3
3
  export interface FieldControlRegistration {
4
4
  controlRef: React.RefObject<any>;
5
- getValue?: (() => unknown) | undefined;
6
5
  id: string | undefined;
6
+ getValue?: (() => unknown) | undefined;
7
7
  value: unknown;
8
8
  }
9
9
  export declare function useFieldControlRegistration(params: UseFieldControlRegistrationParameters): (source: symbol, registration: FieldControlRegistration | undefined) => void;
@@ -12,6 +12,7 @@ export interface UseFieldControlRegistrationParameters {
12
12
  invalid: boolean;
13
13
  markedDirtyRef: React.RefObject<boolean>;
14
14
  name: string | undefined;
15
+ setRegisteredFieldId: (id: string | undefined) => void;
15
16
  setValidityData: React.Dispatch<React.SetStateAction<FieldValidityData>>;
16
17
  validityData: FieldValidityData;
17
18
  }
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
- import * as ReactDOM from 'react-dom';
5
4
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
6
5
  import { useStableCallback } from '@base-ui/utils/useStableCallback';
7
6
  import { getCombinedFieldValidityData } from "../../field/utils/getCombinedFieldValidityData.js";
@@ -12,6 +11,7 @@ export function useFieldControlRegistration(params) {
12
11
  invalid,
13
12
  markedDirtyRef,
14
13
  name,
14
+ setRegisteredFieldId,
15
15
  setValidityData,
16
16
  validityData
17
17
  } = params;
@@ -21,7 +21,7 @@ export function useFieldControlRegistration(params) {
21
21
  const activeFieldControlSourceRef = React.useRef(null);
22
22
  const registrationRef = React.useRef(null);
23
23
  const fallbackControlRef = React.useRef(null);
24
- const getValue = useStableCallback(() => {
24
+ const getValueForForm = useStableCallback(() => {
25
25
  const registration = registrationRef.current;
26
26
  if (!registration) {
27
27
  return undefined;
@@ -31,22 +31,17 @@ export function useFieldControlRegistration(params) {
31
31
  }
32
32
  return registration.value;
33
33
  });
34
- const validate = useStableCallback((flushSync = true) => {
34
+ const validate = useStableCallback(() => {
35
35
  const registration = registrationRef.current;
36
36
  if (!registration) {
37
37
  return;
38
38
  }
39
39
  let nextValue = registration.value;
40
40
  if (nextValue === undefined) {
41
- nextValue = getValue();
41
+ nextValue = getValueForForm();
42
42
  }
43
43
  markedDirtyRef.current = true;
44
- if (!flushSync) {
45
- commit(nextValue);
46
- } else {
47
- // Synchronously update the validity state so the submit event can be prevented.
48
- ReactDOM.flushSync(() => commit(nextValue));
49
- }
44
+ commit(nextValue);
50
45
  });
51
46
  function refreshRegistration() {
52
47
  const registration = registrationRef.current;
@@ -54,7 +49,7 @@ export function useFieldControlRegistration(params) {
54
49
  return;
55
50
  }
56
51
  formRef.current.fields.set(registration.id, {
57
- getValue,
52
+ getValue: getValueForForm,
58
53
  name,
59
54
  controlRef: registration.controlRef ?? fallbackControlRef,
60
55
  validityData: getCombinedFieldValidityData(validityData, invalid),
@@ -73,7 +68,7 @@ export function useFieldControlRegistration(params) {
73
68
  }
74
69
  let initialValue = registration.value;
75
70
  if (initialValue === undefined) {
76
- initialValue = getValue();
71
+ initialValue = getValueForForm();
77
72
  }
78
73
  if (validityData.initialValue === null && initialValue !== null) {
79
74
  setValidityData(prev => ({
@@ -88,13 +83,13 @@ export function useFieldControlRegistration(params) {
88
83
  return;
89
84
  }
90
85
  formRef.current.fields.set(registration.id, {
91
- getValue,
86
+ getValue: getValueForForm,
92
87
  name,
93
88
  controlRef: registration.controlRef ?? fallbackControlRef,
94
89
  validityData: getCombinedFieldValidityData(validityData, invalid),
95
90
  validate
96
91
  });
97
- }, [formRef, getValue, invalid, name, validate, validityData]);
92
+ }, [formRef, getValueForForm, invalid, name, validate, validityData]);
98
93
  useIsoLayoutEffect(() => {
99
94
  const fields = formRef.current.fields;
100
95
  return () => {
@@ -110,12 +105,14 @@ export function useFieldControlRegistration(params) {
110
105
  activeFieldControlSourceRef.current = null;
111
106
  deleteRegistration();
112
107
  registrationRef.current = null;
108
+ setRegisteredFieldId(undefined);
113
109
  }
114
110
  return;
115
111
  }
116
112
  const previousId = registrationRef.current?.id;
117
113
  activeFieldControlSourceRef.current = source;
118
114
  registrationRef.current = registration;
115
+ setRegisteredFieldId(registration.id);
119
116
  if (previousId && previousId !== registration.id) {
120
117
  deleteRegistration(previousId);
121
118
  }
@@ -1,5 +1,2 @@
1
1
  import type { FieldControlRegistration } from "./useFieldControlRegistration.js";
2
- export interface UseRegisterFieldControlParameters extends FieldControlRegistration {
3
- enabled?: boolean | undefined;
4
- }
5
- export declare function useRegisterFieldControl(controlRef: FieldControlRegistration['controlRef'], params: Omit<UseRegisterFieldControlParameters, 'controlRef'>): void;
2
+ export declare function useRegisterFieldControl(controlRef: FieldControlRegistration['controlRef'], id: FieldControlRegistration['id'], value: FieldControlRegistration['value'], getFormValueOverride?: FieldControlRegistration['getValue'], enabled?: boolean): void;
@@ -3,13 +3,7 @@
3
3
  import * as React from 'react';
4
4
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
5
5
  import { useFieldRootContext } from "../field-root-context/FieldRootContext.js";
6
- export function useRegisterFieldControl(controlRef, params) {
7
- const {
8
- enabled = true,
9
- getValue,
10
- id,
11
- value
12
- } = params;
6
+ export function useRegisterFieldControl(controlRef, id, value, getFormValueOverride, enabled = true) {
13
7
  const {
14
8
  registerFieldControl
15
9
  } = useFieldRootContext();
@@ -22,14 +16,15 @@ export function useRegisterFieldControl(controlRef, params) {
22
16
  if (!source || !enabled) {
23
17
  return undefined;
24
18
  }
25
- registerFieldControl(source, {
19
+ const registration = {
26
20
  controlRef,
27
- getValue,
21
+ getValue: getFormValueOverride,
28
22
  id,
29
23
  value
30
- });
24
+ };
25
+ registerFieldControl(source, registration);
31
26
  return () => {
32
27
  registerFieldControl(source, undefined);
33
28
  };
34
- }, [controlRef, enabled, getValue, id, registerFieldControl, value]);
29
+ }, [controlRef, enabled, getFormValueOverride, id, registerFieldControl, value]);
35
30
  }
@@ -26,5 +26,6 @@ export interface FieldRootContext {
26
26
  registerFieldControl: (source: symbol, registration: FieldControlRegistration | undefined) => void;
27
27
  validation: UseFieldValidationReturnValue;
28
28
  }
29
+ export declare const DEFAULT_FIELD_ROOT_CONTEXT: FieldRootContext;
29
30
  export declare const FieldRootContext: React.Context<FieldRootContext>;
30
31
  export declare function useFieldRootContext(optional?: boolean): FieldRootContext;
@@ -5,7 +5,7 @@ import * as React from 'react';
5
5
  import { EMPTY_OBJECT } from '@base-ui/utils/empty';
6
6
  import { NOOP } from "../noop.js";
7
7
  import { DEFAULT_FIELD_ROOT_STATE, DEFAULT_FIELD_STATE_ATTRIBUTES, DEFAULT_VALIDITY_STATE } from "../field-constants/constants.js";
8
- export const FieldRootContext = /*#__PURE__*/React.createContext({
8
+ export const DEFAULT_FIELD_ROOT_CONTEXT = {
9
9
  invalid: undefined,
10
10
  name: undefined,
11
11
  validityData: {
@@ -42,7 +42,8 @@ export const FieldRootContext = /*#__PURE__*/React.createContext({
42
42
  },
43
43
  commit: async () => {}
44
44
  }
45
- });
45
+ };
46
+ export const FieldRootContext = /*#__PURE__*/React.createContext(DEFAULT_FIELD_ROOT_CONTEXT);
46
47
  if (process.env.NODE_ENV !== "production") FieldRootContext.displayName = "FieldRootContext";
47
48
  export function useFieldRootContext(optional = true) {
48
49
  const context = React.useContext(FieldRootContext);
@@ -8,7 +8,11 @@ export interface FormContext {
8
8
  formRef: React.RefObject<{
9
9
  fields: Map<string, {
10
10
  name: string | undefined;
11
- validate: (flushSync?: boolean | undefined) => void;
11
+ /**
12
+ * After this returns, the field registry entry reflects the latest synchronous
13
+ * validity verdict. Async validators do not block submit.
14
+ */
15
+ validate: () => void;
12
16
  validityData: FieldValidityData;
13
17
  controlRef: React.RefObject<HTMLElement | null>;
14
18
  getValue: () => unknown;
@@ -28,6 +28,8 @@ export declare const scrub: "scrub";
28
28
  export declare const cancelOpen: "cancel-open";
29
29
  export declare const siblingOpen: "sibling-open";
30
30
  export declare const disabled: "disabled";
31
+ export declare const missing: "missing";
32
+ export declare const initial: "initial";
31
33
  export declare const imperativeAction: "imperative-action";
32
34
  export declare const swipe: "swipe";
33
35
  export declare const windowResize: "window-resize";
@@ -28,6 +28,8 @@ export const scrub = 'scrub';
28
28
  export const cancelOpen = 'cancel-open';
29
29
  export const siblingOpen = 'sibling-open';
30
30
  export const disabled = 'disabled';
31
+ export const missing = 'missing';
32
+ export const initial = 'initial';
31
33
  export const imperativeAction = 'imperative-action';
32
34
  export const swipe = 'swipe';
33
35
  export const windowResize = 'window-resize';
@@ -1,6 +1,7 @@
1
1
  import type * as React from 'react';
2
2
  import type { BaseUIEvent, ComponentRenderFn, HTMLProps } from "../types/index.js";
3
3
  export type { HTMLProps, BaseUIEvent, ComponentRenderFn };
4
+ export type MaybeBaseUIEvent<E extends React.SyntheticEvent<Element, Event>> = E & Partial<Pick<BaseUIEvent<E>, 'preventBaseUIHandler' | 'baseUIHandlerPrevented'>>;
4
5
  export interface FloatingUIOpenChangeDetails {
5
6
  open: boolean;
6
7
  reason: string;
@@ -73,9 +73,7 @@ export function useButton(parameters = {}) {
73
73
  onPointerDown: externalOnPointerDown,
74
74
  ...otherExternalProps
75
75
  } = externalProps;
76
- const type = isNativeButton ? 'button' : undefined;
77
76
  return mergeProps({
78
- type,
79
77
  onClick(event) {
80
78
  if (disabled) {
81
79
  event.preventDefault();
@@ -160,9 +158,11 @@ export function useButton(parameters = {}) {
160
158
  }
161
159
  externalOnPointerDown?.(event);
162
160
  }
163
- }, !isNativeButton ? {
161
+ }, isNativeButton ? {
162
+ type: 'button'
163
+ } : {
164
164
  role: 'button'
165
- } : undefined, focusableWhenDisabledProps, otherExternalProps);
165
+ }, focusableWhenDisabledProps, otherExternalProps);
166
166
  }, [disabled, focusableWhenDisabledProps, isCompositeItem, isNativeButton]);
167
167
  const buttonRef = useStableCallback(element => {
168
168
  elementRef.current = element;
@@ -55,7 +55,7 @@ export function usePressAndHold(params) {
55
55
  unsubscribeFromGlobalContextMenuRef.current();
56
56
  movesAfterTouchRef.current = 0;
57
57
  });
58
- const startAutoChange = useStableCallback(triggerNativeEvent => {
58
+ function startAutoChange(triggerNativeEvent) {
59
59
  stopAutoChange();
60
60
  const element = elementRef.current;
61
61
  if (!element) {
@@ -87,7 +87,7 @@ export function usePressAndHold(params) {
87
87
  }
88
88
  });
89
89
  });
90
- });
90
+ }
91
91
  React.useEffect(() => () => stopAutoChange(), [stopAutoChange]);
92
92
  const pointerHandlers = {
93
93
  onTouchStart() {