@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
@@ -31,8 +31,7 @@ export const SelectItemIndicator = /*#__PURE__*/React.forwardRef(function Select
31
31
  });
32
32
  });
33
33
 
34
- /** The core implementation of the indicator is split here to avoid paying the hooks
35
- * costs unless the element needs to be mounted. */
34
+ // Split the core implementation to avoid paying the hook costs unless the element needs to mount.
36
35
  if (process.env.NODE_ENV !== "production") SelectItemIndicator.displayName = "SelectItemIndicator";
37
36
  const Inner = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef((componentProps, forwardedRef) => {
38
37
  const {
@@ -13,29 +13,32 @@ import { useRenderElement } from "../../internals/useRenderElement.js";
13
13
  */
14
14
  export const SelectItemText = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function SelectItemText(componentProps, forwardedRef) {
15
15
  const {
16
- indexRef,
16
+ index,
17
17
  textRef,
18
18
  selectedByFocus,
19
19
  hasRegistered
20
20
  } = useSelectItemContext();
21
21
  const {
22
+ firstItemTextRef,
22
23
  selectedItemTextRef
23
24
  } = useSelectRootContext();
24
25
  const {
25
- className,
26
26
  render,
27
+ className,
27
28
  style,
28
29
  ...elementProps
29
30
  } = componentProps;
30
31
  const localRef = React.useCallback(node => {
31
- if (!node || !hasRegistered) {
32
+ if (!node) {
32
33
  return;
33
34
  }
34
- const hasNoSelectedItemText = selectedItemTextRef.current === null || !selectedItemTextRef.current.isConnected;
35
- if (selectedByFocus || hasNoSelectedItemText && indexRef.current === 0) {
35
+ if (hasRegistered && index === 0) {
36
+ firstItemTextRef.current = node;
37
+ }
38
+ if (hasRegistered && selectedByFocus) {
36
39
  selectedItemTextRef.current = node;
37
40
  }
38
- }, [selectedItemTextRef, indexRef, selectedByFocus, hasRegistered]);
41
+ }, [firstItemTextRef, selectedItemTextRef, index, selectedByFocus, hasRegistered]);
39
42
  const element = useRenderElement('div', componentProps, {
40
43
  ref: [localRef, forwardedRef, textRef],
41
44
  props: elementProps
@@ -18,8 +18,8 @@ import { selectors } from "../store.js";
18
18
  */
19
19
  export const SelectList = /*#__PURE__*/React.forwardRef(function SelectList(componentProps, forwardedRef) {
20
20
  const {
21
- className,
22
21
  render,
22
+ className,
23
23
  style,
24
24
  ...elementProps
25
25
  } = componentProps;
@@ -26,7 +26,7 @@ import { COMPOSITE_KEYS } from "../../internals/composite/composite.js";
26
26
  import { getDisabledMountTransitionStyles } from "../../utils/getDisabledMountTransitionStyles.js";
27
27
  import { clamp } from "../../internals/clamp.js";
28
28
  import { getMaxScrollOffset, SCROLL_EDGE_TOLERANCE_PX } from "../../utils/scrollEdges.js";
29
- import { useCSPContext } from "../../csp-provider/CSPContext.js";
29
+ import { useCSPContext } from "../../internals/csp-context/CSPContext.js";
30
30
  import { useDirection } from "../../internals/direction-context/DirectionContext.js";
31
31
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
32
32
  const stateAttributesMapping = {
@@ -54,6 +54,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
54
54
  onOpenChangeComplete,
55
55
  setOpen,
56
56
  valueRef,
57
+ firstItemTextRef,
57
58
  selectedItemTextRef,
58
59
  keyboardActiveRef,
59
60
  multiple,
@@ -233,7 +234,11 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
233
234
  const restoreTransformStyles = unsetTransformStyles(popupElement);
234
235
  popupElement.style.removeProperty('--transform-origin');
235
236
  try {
236
- const textElement = selectedItemTextRef.current;
237
+ let textElement = selectedItemTextRef.current;
238
+ if (!textElement?.isConnected) {
239
+ const hasSelectedValue = selectors.hasSelectedValue(store.state);
240
+ textElement = !hasSelectedValue && firstItemTextRef.current?.isConnected ? firstItemTextRef.current : null;
241
+ }
237
242
  const valueElement = valueRef.current;
238
243
  const positionerStyles = getComputedStyle(positionerElement);
239
244
  const popupStyles = getComputedStyle(popupElement);
@@ -325,7 +330,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
325
330
  } finally {
326
331
  restoreTransformStyles();
327
332
  }
328
- }, [store, open, positionerElement, triggerElement, valueRef, selectedItemTextRef, popupRef, handleScrollArrowVisibility, alignItemWithTriggerActive, setControlledAlignItemWithTrigger, scrollArrowFrame, scrollDownArrowRef, scrollUpArrowRef, listElement, listRef, highlightItemOnHover, direction, isPositioned]);
333
+ }, [store, open, positionerElement, triggerElement, valueRef, firstItemTextRef, selectedItemTextRef, popupRef, handleScrollArrowVisibility, alignItemWithTriggerActive, setControlledAlignItemWithTrigger, scrollArrowFrame, scrollDownArrowRef, scrollUpArrowRef, listElement, listRef, highlightItemOnHover, direction, isPositioned]);
329
334
  React.useEffect(() => {
330
335
  if (!alignItemWithTriggerActive || !positionerElement || !open) {
331
336
  return undefined;
@@ -114,6 +114,9 @@ export const SelectPositioner = /*#__PURE__*/React.forwardRef(function SelectPos
114
114
  align: positioning.align,
115
115
  anchorHidden: positioning.anchorHidden
116
116
  };
117
+ useIsoLayoutEffect(() => {
118
+ store.set('popupSide', positioning.side);
119
+ }, [store, positioning.side]);
117
120
  const setPositionerElement = useStableCallback(element => {
118
121
  store.set('positionerElement', element);
119
122
  });
@@ -12,7 +12,7 @@ import { useStableCallback } from '@base-ui/utils/useStableCallback';
12
12
  import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
13
13
  import { useStore, Store } from '@base-ui/utils/store';
14
14
  import { EMPTY_ARRAY, EMPTY_OBJECT } from '@base-ui/utils/empty';
15
- import { useClick, useDismiss, useFloatingRootContext, useInteractions, useListNavigation, useTypeahead } from "../../floating-ui-react/index.js";
15
+ import { useClick, useDismiss, useFloatingRootContext, useListNavigation, useTypeahead } from "../../floating-ui-react/index.js";
16
16
  import { SelectRootContext, SelectFloatingContext } from "./SelectRootContext.js";
17
17
  import { useFieldRootContext } from "../../internals/field-root-context/FieldRootContext.js";
18
18
  import { useRegisterFieldControl } from "../../internals/field-register-control/useRegisterFieldControl.js";
@@ -28,6 +28,7 @@ import { defaultItemEquality, findItemIndex } from "../../internals/itemEquality
28
28
  import { useValueChanged } from "../../internals/useValueChanged.js";
29
29
  import { useOpenInteractionType } from "../../utils/useOpenInteractionType.js";
30
30
  import { getMaxScrollOffset, normalizeScrollOffset } from "../../utils/scrollEdges.js";
31
+ import { FOCUSABLE_POPUP_PROPS } from "../../utils/popups/index.js";
31
32
  import { mergeProps } from "../../merge-props/index.js";
32
33
 
33
34
  /**
@@ -105,10 +106,12 @@ export function SelectRoot(props) {
105
106
  const valuesRef = React.useRef([]);
106
107
  const typingRef = React.useRef(false);
107
108
  const keyboardActiveRef = React.useRef(false);
109
+ const firstItemTextRef = React.useRef(null);
108
110
  const selectedItemTextRef = React.useRef(null);
109
111
  const selectionRef = React.useRef({
110
112
  allowSelectedMouseUp: false,
111
- allowUnselectedMouseUp: false
113
+ allowUnselectedMouseUp: false,
114
+ dragY: 0
112
115
  });
113
116
  const alignItemWithTriggerActiveRef = React.useRef(false);
114
117
  const {
@@ -142,6 +145,7 @@ export function SelectRoot(props) {
142
145
  triggerElement: null,
143
146
  positionerElement: null,
144
147
  listElement: null,
148
+ popupSide: null,
145
149
  scrollUpArrowVisible: false,
146
150
  scrollDownArrowVisible: false,
147
151
  hasScrollArrows: false
@@ -165,13 +169,10 @@ export function SelectRoot(props) {
165
169
  return stringifyAsValue(value, itemToStringValue);
166
170
  }, [multiple, value, itemToStringValue]);
167
171
  const controlRef = useValueAsRef(store.state.triggerElement);
168
- const getFieldValue = useStableCallback(() => fieldStringValue);
169
- useRegisterFieldControl(controlRef, {
170
- id: generatedId,
171
- value,
172
- getValue: getFieldValue
173
- });
172
+ const getStringifiedValueForForm = useStableCallback(() => fieldStringValue);
173
+ useRegisterFieldControl(controlRef, generatedId, value, getStringifiedValueForForm);
174
174
  const initialValueRef = React.useRef(value);
175
+ const hasSelectedValue = multiple ? Array.isArray(value) && value.length > 0 : value != null;
175
176
  useIsoLayoutEffect(() => {
176
177
  // Ensure the values and labels are registered for programmatic value changes.
177
178
  if (value !== initialValueRef.current) {
@@ -179,27 +180,32 @@ export function SelectRoot(props) {
179
180
  }
180
181
  }, [store, value]);
181
182
  useIsoLayoutEffect(() => {
182
- setFilled(multiple ? Array.isArray(value) && value.length > 0 : value != null);
183
- }, [multiple, value, setFilled]);
183
+ setFilled(hasSelectedValue);
184
+ }, [hasSelectedValue, setFilled]);
184
185
  useIsoLayoutEffect(function syncSelectedIndex() {
185
- if (open) {
186
- return;
187
- }
188
186
  const registry = valuesRef.current;
187
+ let nextIndex;
189
188
  if (multiple) {
190
189
  const currentValue = Array.isArray(value) ? value : [];
191
190
  if (currentValue.length === 0) {
192
- store.set('selectedIndex', null);
193
- return;
191
+ nextIndex = null;
192
+ } else {
193
+ const lastValue = currentValue[currentValue.length - 1];
194
+ const lastIndex = findItemIndex(registry, lastValue, isItemEqualToValue);
195
+ nextIndex = lastIndex === -1 ? null : lastIndex;
194
196
  }
195
- const lastValue = currentValue[currentValue.length - 1];
196
- const lastIndex = findItemIndex(registry, lastValue, isItemEqualToValue);
197
- store.set('selectedIndex', lastIndex === -1 ? null : lastIndex);
197
+ } else {
198
+ const index = findItemIndex(registry, value, isItemEqualToValue);
199
+ nextIndex = index === -1 ? null : index;
200
+ }
201
+ if (nextIndex === null) {
202
+ selectedItemTextRef.current = null;
203
+ }
204
+ if (open) {
198
205
  return;
199
206
  }
200
- const index = findItemIndex(registry, value, isItemEqualToValue);
201
- store.set('selectedIndex', index === -1 ? null : index);
202
- }, [multiple, open, value, valuesRef, isItemEqualToValue, store]);
207
+ store.set('selectedIndex', nextIndex);
208
+ }, [hasSelectedValue, multiple, open, value, valuesRef, isItemEqualToValue, store, selectedItemTextRef]);
203
209
  useValueChanged(value, () => {
204
210
  clearErrors(name);
205
211
  setDirty(value !== validityData.initialValue);
@@ -293,9 +299,7 @@ export function SelectRoot(props) {
293
299
  enabled: !readOnly && !disabled,
294
300
  event: 'mousedown'
295
301
  });
296
- const dismiss = useDismiss(floatingContext, {
297
- bubbles: false
298
- });
302
+ const dismiss = useDismiss(floatingContext);
299
303
  const listNavigation = useListNavigation(floatingContext, {
300
304
  enabled: !readOnly && !disabled,
301
305
  listRef,
@@ -323,23 +327,22 @@ export function SelectRoot(props) {
323
327
  setValue(valuesRef.current[index], createChangeEventDetails('none'));
324
328
  }
325
329
  },
326
- onTypingChange(typing) {
330
+ onTyping(typing) {
327
331
  typingRef.current = typing;
328
332
  }
329
333
  });
330
- const {
331
- getReferenceProps,
332
- getFloatingProps,
333
- getItemProps
334
- } = useInteractions([click, dismiss, listNavigation, typeahead]);
335
334
  const mergedTriggerProps = React.useMemo(() => {
336
- return mergeProps(getReferenceProps(), interactionTypeProps, generatedId ? {
337
- id: generatedId
338
- } : EMPTY_OBJECT);
339
- }, [getReferenceProps, interactionTypeProps, generatedId]);
335
+ const triggerInteractionProps = mergeProps(typeahead.reference, listNavigation.reference, dismiss.reference, click.reference, interactionTypeProps);
336
+ if (generatedId) {
337
+ triggerInteractionProps.id = generatedId;
338
+ }
339
+ return triggerInteractionProps;
340
+ }, [click.reference, typeahead.reference, listNavigation.reference, dismiss.reference, interactionTypeProps, generatedId]);
341
+ const popupProps = React.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, typeahead.floating, listNavigation.floating, dismiss.floating), [typeahead.floating, listNavigation.floating, dismiss.floating]);
342
+ const itemProps = listNavigation.item ?? EMPTY_OBJECT;
340
343
  useOnFirstRender(() => {
341
344
  store.update({
342
- popupProps: getFloatingProps(),
345
+ popupProps,
343
346
  triggerProps: mergedTriggerProps
344
347
  });
345
348
  });
@@ -352,7 +355,7 @@ export function SelectRoot(props) {
352
355
  open,
353
356
  mounted,
354
357
  transitionStatus,
355
- popupProps: getFloatingProps(),
358
+ popupProps,
356
359
  triggerProps: mergedTriggerProps,
357
360
  items,
358
361
  itemToStringLabel,
@@ -360,7 +363,7 @@ export function SelectRoot(props) {
360
363
  isItemEqualToValue,
361
364
  openMethod: renderedOpenMethod
362
365
  });
363
- }, [store, generatedId, modal, multiple, value, open, mounted, transitionStatus, getFloatingProps, mergedTriggerProps, items, itemToStringLabel, itemToStringValue, isItemEqualToValue, renderedOpenMethod]);
366
+ }, [store, generatedId, modal, multiple, value, open, mounted, transitionStatus, popupProps, mergedTriggerProps, items, itemToStringLabel, itemToStringValue, isItemEqualToValue, renderedOpenMethod]);
364
367
  const contextValue = React.useMemo(() => ({
365
368
  store,
366
369
  name,
@@ -376,20 +379,21 @@ export function SelectRoot(props) {
376
379
  scrollHandlerRef,
377
380
  handleScrollArrowVisibility,
378
381
  scrollArrowsMountedCountRef,
379
- getItemProps,
382
+ itemProps,
380
383
  events: floatingContext.context.events,
381
384
  valueRef,
382
385
  valuesRef,
383
386
  labelsRef,
384
387
  typingRef,
385
388
  selectionRef,
389
+ firstItemTextRef,
386
390
  selectedItemTextRef,
387
391
  validation,
388
392
  onOpenChangeComplete,
389
393
  keyboardActiveRef,
390
394
  alignItemWithTriggerActiveRef,
391
395
  initialValueRef
392
- }), [store, name, required, disabled, readOnly, multiple, highlightItemOnHover, setValue, setOpen, getItemProps, floatingContext.context.events, validation, onOpenChangeComplete, handleScrollArrowVisibility]);
396
+ }), [store, name, required, disabled, readOnly, multiple, highlightItemOnHover, setValue, setOpen, itemProps, floatingContext.context.events, validation, onOpenChangeComplete, handleScrollArrowVisibility]);
393
397
  const ref = useMergedRefs(inputRef, validation.inputRef);
394
398
  const hasMultipleSelection = multiple && Array.isArray(value) && value.length > 0;
395
399
  const hiddenInputName = multiple ? undefined : name;
@@ -423,7 +427,9 @@ export function SelectRoot(props) {
423
427
  // Handle browser autofill.
424
428
  onChange(event) {
425
429
  // Workaround for https://github.com/facebook/react/issues/9023
426
- if (event.nativeEvent.defaultPrevented) {
430
+ if (event.nativeEvent.defaultPrevented || disabled || readOnly) {
431
+ // Outside Field.Root, the event is not wrapped by mergeProps.
432
+ event.preventBaseUIHandler?.();
427
433
  return;
428
434
  }
429
435
  const nextValue = event.currentTarget.value;
@@ -19,10 +19,7 @@ export interface SelectRootContext {
19
19
  scrollHandlerRef: React.RefObject<((el: HTMLDivElement) => void) | null>;
20
20
  handleScrollArrowVisibility: () => void;
21
21
  scrollArrowsMountedCountRef: React.RefObject<number>;
22
- getItemProps: (props?: HTMLProps & {
23
- active?: boolean | undefined;
24
- selected?: boolean | undefined;
25
- }) => Record<string, unknown>;
22
+ itemProps: HTMLProps;
26
23
  events: FloatingEvents;
27
24
  valueRef: React.RefObject<HTMLSpanElement | null>;
28
25
  valuesRef: React.RefObject<Array<any>>;
@@ -31,8 +28,10 @@ export interface SelectRootContext {
31
28
  selectionRef: React.RefObject<{
32
29
  allowUnselectedMouseUp: boolean;
33
30
  allowSelectedMouseUp: boolean;
31
+ dragY: number;
34
32
  }>;
35
- selectedItemTextRef: React.RefObject<HTMLSpanElement | null>;
33
+ firstItemTextRef: React.RefObject<HTMLElement | null>;
34
+ selectedItemTextRef: React.RefObject<HTMLElement | null>;
36
35
  validation: UseFieldValidationReturnValue;
37
36
  onOpenChangeComplete?: ((open: boolean) => void) | undefined;
38
37
  keyboardActiveRef: React.RefObject<boolean>;
@@ -2,6 +2,7 @@ import { Store } from '@base-ui/utils/store';
2
2
  import { type InteractionType } from '@base-ui/utils/useEnhancedClickHandler';
3
3
  import type { TransitionStatus } from "../internals/useTransitionStatus.js";
4
4
  import type { HTMLProps } from "../internals/types.js";
5
+ import type { Side } from "../utils/useAnchorPositioning.js";
5
6
  import { type Group } from "../internals/resolveValueLabel.js";
6
7
  export type State = {
7
8
  id: string | undefined;
@@ -28,6 +29,7 @@ export type State = {
28
29
  triggerElement: HTMLElement | null;
29
30
  positionerElement: HTMLElement | null;
30
31
  listElement: HTMLDivElement | null;
32
+ popupSide: Side | null;
31
33
  scrollUpArrowVisible: boolean;
32
34
  scrollDownArrowVisible: boolean;
33
35
  hasScrollArrows: boolean;
@@ -63,6 +65,7 @@ export declare const selectors: {
63
65
  triggerElement: (state: State) => HTMLElement | null;
64
66
  positionerElement: (state: State) => HTMLElement | null;
65
67
  listElement: (state: State) => HTMLDivElement | null;
68
+ popupSide: (state: State) => Side | null;
66
69
  scrollUpArrowVisible: (state: State) => boolean;
67
70
  scrollDownArrowVisible: (state: State) => boolean;
68
71
  hasScrollArrows: (state: State) => boolean;
@@ -58,6 +58,7 @@ export const selectors = {
58
58
  triggerElement: createSelector(state => state.triggerElement),
59
59
  positionerElement: createSelector(state => state.positionerElement),
60
60
  listElement: createSelector(state => state.listElement),
61
+ popupSide: createSelector(state => state.popupSide),
61
62
  scrollUpArrowVisible: createSelector(state => state.scrollUpArrowVisible),
62
63
  scrollDownArrowVisible: createSelector(state => state.scrollDownArrowVisible),
63
64
  hasScrollArrows: createSelector(state => state.hasScrollArrows)
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { BaseUIComponentProps, NativeButtonProps } from "../../internals/types.js";
3
3
  import type { FieldRootState } from "../../field/root/FieldRoot.js";
4
+ import type { Side } from "../../utils/useAnchorPositioning.js";
4
5
  /**
5
6
  * A button that opens the select popup.
6
7
  * Renders a `<button>` element.
@@ -17,6 +18,10 @@ export interface SelectTriggerState extends FieldRootState {
17
18
  * Whether the select popup is readonly.
18
19
  */
19
20
  readOnly: boolean;
21
+ /**
22
+ * Indicates which side the corresponding popup is positioned relative to its anchor.
23
+ */
24
+ popupSide: Side | null;
20
25
  /**
21
26
  * The value of the currently selected item.
22
27
  */
@@ -24,10 +24,12 @@ import { useLabelableId } from "../../internals/labelable-provider/useLabelableI
24
24
  import { resolveAriaLabelledBy } from "../../utils/resolveAriaLabelledBy.js";
25
25
  const BOUNDARY_OFFSET = 2;
26
26
  const SELECTED_DELAY = 400;
27
- const UNSELECTED_DELAY = 200;
28
27
  const stateAttributesMapping = {
29
28
  ...pressableTriggerOpenStateMapping,
30
29
  ...fieldValidityMapping,
30
+ popupSide: side => side ? {
31
+ 'data-popup-side': side
32
+ } : null,
31
33
  value: () => null
32
34
  };
33
35
 
@@ -70,15 +72,16 @@ export const SelectTrigger = /*#__PURE__*/React.forwardRef(function SelectTrigge
70
72
  } = useSelectRootContext();
71
73
  const disabled = fieldDisabled || selectDisabled || disabledProp;
72
74
  const open = useStore(store, selectors.open);
75
+ const mounted = useStore(store, selectors.mounted);
73
76
  const value = useStore(store, selectors.value);
74
77
  const triggerProps = useStore(store, selectors.triggerProps);
75
78
  const positionerElement = useStore(store, selectors.positionerElement);
76
79
  const listElement = useStore(store, selectors.listElement);
80
+ const popupSideValue = useStore(store, selectors.popupSide);
77
81
  const rootId = useStore(store, selectors.id);
78
82
  const selectLabelId = useStore(store, selectors.labelId);
79
83
  const hasSelectedValue = useStore(store, selectors.hasSelectedValue);
80
- const shouldCheckNullItemLabel = !hasSelectedValue && open;
81
- const hasNullItemLabel = useStore(store, selectors.hasNullItemLabel, shouldCheckNullItemLabel);
84
+ const popupSide = mounted && positionerElement ? popupSideValue : null;
82
85
  const id = idProp ?? rootId;
83
86
  const ariaLabelledBy = resolveAriaLabelledBy(fieldLabelId, selectLabelId);
84
87
  useLabelableId({
@@ -100,52 +103,34 @@ export const SelectTrigger = /*#__PURE__*/React.forwardRef(function SelectTrigge
100
103
  const timeoutFocus = useTimeout();
101
104
  const timeoutMouseDown = useTimeout();
102
105
  const selectedDelayTimeout = useTimeout();
103
- const unselectedDelayTimeout = useTimeout();
104
106
  React.useEffect(() => {
105
107
  if (open) {
106
- const hasSelectedItemInList = hasSelectedValue || hasNullItemLabel;
107
- const shouldDelayUnselectedMouseUpLonger = !hasSelectedItemInList;
108
-
109
- // When there is no selected item in the list (placeholder-only selects), a mousedown
110
- // on the trigger followed by a quick mouseup over the first option can accidentally select
111
- // within 200ms. Delay unselected mouseup to match the safer 400ms window.
112
- if (shouldDelayUnselectedMouseUpLonger) {
113
- selectedDelayTimeout.start(SELECTED_DELAY, () => {
114
- selectionRef.current.allowUnselectedMouseUp = true;
115
- selectionRef.current.allowSelectedMouseUp = true;
116
- });
117
- } else {
118
- // mousedown -> move to unselected item -> mouseup should not select within 200ms.
119
- unselectedDelayTimeout.start(UNSELECTED_DELAY, () => {
120
- selectionRef.current.allowUnselectedMouseUp = true;
121
-
122
- // mousedown -> mouseup on selected item should not select within 400ms.
123
- selectedDelayTimeout.start(UNSELECTED_DELAY, () => {
124
- selectionRef.current.allowSelectedMouseUp = true;
125
- });
126
- });
127
- }
108
+ // A mousedown on the trigger can open the popup under the cursor. Keep mouseup selection
109
+ // disabled briefly so releasing over either the selected item or a neighboring item doesn't
110
+ // commit an accidental selection. SelectItem can still opt into unselected mouseup sooner
111
+ // after a real drag over the item.
112
+ selectedDelayTimeout.start(SELECTED_DELAY, () => {
113
+ selectionRef.current.allowUnselectedMouseUp = true;
114
+ selectionRef.current.allowSelectedMouseUp = true;
115
+ });
128
116
  return () => {
129
117
  selectedDelayTimeout.clear();
130
- unselectedDelayTimeout.clear();
131
118
  };
132
119
  }
133
120
  selectionRef.current = {
134
121
  allowSelectedMouseUp: false,
135
- allowUnselectedMouseUp: false
122
+ allowUnselectedMouseUp: false,
123
+ dragY: 0
136
124
  };
137
125
  timeoutMouseDown.clear();
138
126
  return undefined;
139
- }, [open, hasSelectedValue, hasNullItemLabel, selectionRef, timeoutMouseDown, selectedDelayTimeout, unselectedDelayTimeout]);
140
- const ariaControlsId = React.useMemo(() => {
141
- return listElement?.id ?? getFloatingFocusElement(positionerElement)?.id;
142
- }, [listElement, positionerElement]);
127
+ }, [open, selectionRef, timeoutMouseDown, selectedDelayTimeout]);
143
128
  const props = mergeProps(triggerProps, {
144
129
  id,
145
130
  role: 'combobox',
146
131
  'aria-expanded': open ? 'true' : 'false',
147
132
  'aria-haspopup': 'listbox',
148
- 'aria-controls': open ? ariaControlsId : undefined,
133
+ 'aria-controls': open ? listElement?.id ?? getFloatingFocusElement(positionerElement)?.id : undefined,
149
134
  'aria-labelledby': ariaLabelledBy,
150
135
  'aria-readonly': readOnly || undefined,
151
136
  'aria-required': required || undefined,
@@ -225,6 +210,7 @@ export const SelectTrigger = /*#__PURE__*/React.forwardRef(function SelectTrigge
225
210
  disabled,
226
211
  value,
227
212
  readOnly,
213
+ popupSide,
228
214
  placeholder: !hasSelectedValue
229
215
  };
230
216
  return useRenderElement('button', componentProps, {
@@ -15,6 +15,11 @@ export declare enum SelectTriggerDataAttributes {
15
15
  * Present when the select is readonly.
16
16
  */
17
17
  readonly = "data-readonly",
18
+ /**
19
+ * Indicates which side the corresponding popup is positioned relative to its anchor.
20
+ * @type {'top' | 'bottom' | 'left' | 'right' | 'inline-end' | 'inline-start' | null}
21
+ */
22
+ popupSide = "data-popup-side",
18
23
  /**
19
24
  * Present when the select is required.
20
25
  */
@@ -16,6 +16,11 @@ export let SelectTriggerDataAttributes = function (SelectTriggerDataAttributes)
16
16
  * Present when the select is readonly.
17
17
  */
18
18
  SelectTriggerDataAttributes["readonly"] = "data-readonly";
19
+ /**
20
+ * Indicates which side the corresponding popup is positioned relative to its anchor.
21
+ * @type {'top' | 'bottom' | 'left' | 'right' | 'inline-end' | 'inline-start' | null}
22
+ */
23
+ SelectTriggerDataAttributes["popupSide"] = "data-popup-side";
19
24
  /**
20
25
  * Present when the select is required.
21
26
  */
@@ -3,7 +3,7 @@
3
3
  import * as React from 'react';
4
4
  import { isElement } from '@floating-ui/utils/dom';
5
5
  import { addEventListener } from '@base-ui/utils/addEventListener';
6
- import { ownerDocument } from '@base-ui/utils/owner';
6
+ import { ownerDocument, ownerWindow } from '@base-ui/utils/owner';
7
7
  import { useAnimationFrame } from '@base-ui/utils/useAnimationFrame';
8
8
  import { useStableCallback } from '@base-ui/utils/useStableCallback';
9
9
  import { useValueAsRef } from '@base-ui/utils/useValueAsRef';
@@ -107,9 +107,7 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
107
107
  const stylesRef = React.useRef(null);
108
108
  const setStylesRef = useStableCallback(element => {
109
109
  if (element && stylesRef.current == null) {
110
- if (stylesRef.current == null) {
111
- stylesRef.current = getComputedStyle(element);
112
- }
110
+ stylesRef.current = ownerWindow(element).getComputedStyle(element);
113
111
  }
114
112
  });
115
113
 
@@ -121,7 +119,7 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
121
119
  // This value should be equal to the radius or half the width/height of the thumb.
122
120
  const insetThumbOffsetRef = React.useRef(0);
123
121
  const latestValuesRef = useValueAsRef(values);
124
- const updatePressedThumb = useStableCallback(nextIndex => {
122
+ function updatePressedThumb(nextIndex) {
125
123
  if (pressedThumbIndexRef.current !== nextIndex) {
126
124
  pressedThumbIndexRef.current = nextIndex;
127
125
  }
@@ -132,8 +130,8 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
132
130
  return;
133
131
  }
134
132
  pressedInputRef.current = thumbElement.querySelector('input[type="range"]');
135
- });
136
- const getFingerState = useStableCallback(fingerCoords => {
133
+ }
134
+ function getFingerState(fingerCoords) {
137
135
  const control = controlRef.current;
138
136
  if (!control) {
139
137
  return null;
@@ -186,8 +184,8 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
186
184
  pressedThumbIndexRef.current = collisionResult.thumbIndex;
187
185
  }
188
186
  return collisionResult;
189
- });
190
- const startPressing = useStableCallback(fingerCoords => {
187
+ }
188
+ function startPressing(fingerCoords) {
191
189
  pressedValuesRef.current = range ? values.slice() : null;
192
190
  latestValuesRef.current = values;
193
191
  const pressedThumbIndex = pressedThumbIndexRef.current;
@@ -228,8 +226,8 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
228
226
  insetThumbOffsetRef.current = thumbRect[side] / 2;
229
227
  }
230
228
  }
231
- });
232
- const focusThumb = useStableCallback(thumbIndex => {
229
+ }
230
+ function focusThumb(thumbIndex) {
233
231
  const input = thumbRefs.current?.[thumbIndex]?.querySelector('input[type="range"]');
234
232
  if (!input) {
235
233
  return;
@@ -240,7 +238,7 @@ export const SliderControl = /*#__PURE__*/React.forwardRef(function SliderContro
240
238
  // Supported in Chrome from 144+.
241
239
  focusVisible: false
242
240
  });
243
- });
241
+ }
244
242
  const handleTouchMove = useStableCallback(nativeEvent => {
245
243
  const fingerCoords = getFingerCoords(nativeEvent, touchIdRef);
246
244
  if (fingerCoords == null) {
@@ -135,10 +135,7 @@ export const SliderRoot = /*#__PURE__*/React.forwardRef(function SliderRoot(comp
135
135
  setLastUsedThumbIndex(value);
136
136
  }
137
137
  });
138
- useRegisterFieldControl(controlRef, {
139
- id,
140
- value: valueUnwrapped
141
- });
138
+ useRegisterFieldControl(controlRef, id, valueUnwrapped);
142
139
  useValueChanged(valueUnwrapped, () => {
143
140
  clearErrors(name);
144
141
  if (shouldValidateOnChange()) {