@base-ui/react 1.0.0-rc.2 → 1.1.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 (672) hide show
  1. package/CHANGELOG.md +156 -5
  2. package/README.md +2 -3
  3. package/accordion/header/AccordionHeader.d.ts +1 -1
  4. package/accordion/item/AccordionItem.d.ts +1 -1
  5. package/accordion/panel/AccordionPanel.d.ts +1 -1
  6. package/accordion/root/AccordionRoot.d.ts +1 -1
  7. package/accordion/trigger/AccordionTrigger.d.ts +1 -1
  8. package/accordion/trigger/AccordionTrigger.js +3 -4
  9. package/alert-dialog/root/AlertDialogRoot.d.ts +3 -3
  10. package/autocomplete/root/AutocompleteRoot.d.ts +1 -1
  11. package/avatar/fallback/AvatarFallback.d.ts +1 -1
  12. package/avatar/image/AvatarImage.d.ts +1 -1
  13. package/avatar/root/AvatarRoot.d.ts +1 -1
  14. package/button/Button.d.ts +4 -17
  15. package/button/Button.js +1 -2
  16. package/checkbox/indicator/CheckboxIndicator.d.ts +1 -1
  17. package/checkbox/indicator/CheckboxIndicatorDataAttributes.d.ts +4 -0
  18. package/checkbox/indicator/CheckboxIndicatorDataAttributes.js +4 -0
  19. package/checkbox/root/CheckboxRoot.d.ts +1 -1
  20. package/checkbox/root/CheckboxRoot.js +5 -4
  21. package/checkbox/root/CheckboxRootDataAttributes.d.ts +4 -0
  22. package/checkbox/root/CheckboxRootDataAttributes.js +4 -0
  23. package/checkbox-group/CheckboxGroup.d.ts +1 -1
  24. package/collapsible/panel/CollapsiblePanel.d.ts +1 -1
  25. package/collapsible/root/CollapsibleRoot.d.ts +1 -1
  26. package/collapsible/trigger/CollapsibleTrigger.d.ts +1 -1
  27. package/collapsible/trigger/CollapsibleTrigger.js +1 -2
  28. package/combobox/arrow/ComboboxArrow.d.ts +1 -1
  29. package/combobox/backdrop/ComboboxBackdrop.d.ts +1 -1
  30. package/combobox/chip/ComboboxChip.d.ts +1 -1
  31. package/combobox/chip-remove/ComboboxChipRemove.d.ts +1 -1
  32. package/combobox/chip-remove/ComboboxChipRemove.js +3 -2
  33. package/combobox/chips/ComboboxChips.d.ts +1 -1
  34. package/combobox/chips/ComboboxChips.js +7 -1
  35. package/combobox/clear/ComboboxClear.d.ts +1 -1
  36. package/combobox/clear/ComboboxClear.js +2 -2
  37. package/combobox/empty/ComboboxEmpty.d.ts +1 -1
  38. package/combobox/group/ComboboxGroup.d.ts +1 -1
  39. package/combobox/group-label/ComboboxGroupLabel.d.ts +1 -1
  40. package/combobox/icon/ComboboxIcon.d.ts +1 -1
  41. package/combobox/input/ComboboxInput.d.ts +1 -1
  42. package/combobox/input/ComboboxInput.js +12 -18
  43. package/combobox/item/ComboboxItem.d.ts +1 -1
  44. package/combobox/item/ComboboxItem.js +0 -1
  45. package/combobox/item-indicator/ComboboxItemIndicator.d.ts +1 -1
  46. package/combobox/list/ComboboxList.d.ts +1 -1
  47. package/combobox/popup/ComboboxPopup.d.ts +1 -1
  48. package/combobox/popup/ComboboxPopup.js +2 -1
  49. package/combobox/portal/ComboboxPortal.d.ts +1 -1
  50. package/combobox/positioner/ComboboxPositioner.d.ts +1 -1
  51. package/combobox/root/AriaCombobox.d.ts +8 -1
  52. package/combobox/root/AriaCombobox.js +19 -16
  53. package/combobox/root/ComboboxRoot.d.ts +1 -1
  54. package/combobox/row/ComboboxRow.d.ts +1 -1
  55. package/combobox/status/ComboboxStatus.d.ts +1 -1
  56. package/combobox/store.d.ts +3 -0
  57. package/combobox/store.js +21 -0
  58. package/combobox/trigger/ComboboxTrigger.d.ts +14 -1
  59. package/combobox/trigger/ComboboxTrigger.js +31 -11
  60. package/combobox/trigger/ComboboxTriggerDataAttributes.d.ts +13 -0
  61. package/combobox/trigger/ComboboxTriggerDataAttributes.js +13 -0
  62. package/combobox/utils/stateAttributesMapping.d.ts +14 -0
  63. package/combobox/utils/stateAttributesMapping.js +18 -0
  64. package/combobox/value/ComboboxValue.d.ts +5 -0
  65. package/combobox/value/ComboboxValue.js +15 -6
  66. package/composite/root/useCompositeRoot.d.ts +1 -1
  67. package/context-menu/trigger/ContextMenuTrigger.d.ts +1 -1
  68. package/csp-provider/CSPContext.d.ts +13 -0
  69. package/csp-provider/CSPContext.js +25 -0
  70. package/csp-provider/CSPProvider.d.ts +25 -0
  71. package/csp-provider/CSPProvider.js +32 -0
  72. package/csp-provider/index.d.ts +2 -0
  73. package/csp-provider/index.js +12 -0
  74. package/csp-provider/index.parts.d.ts +1 -0
  75. package/csp-provider/index.parts.js +12 -0
  76. package/dialog/backdrop/DialogBackdrop.d.ts +1 -1
  77. package/dialog/close/DialogClose.d.ts +1 -1
  78. package/dialog/description/DialogDescription.d.ts +1 -1
  79. package/dialog/popup/DialogPopup.d.ts +1 -1
  80. package/dialog/portal/DialogPortal.d.ts +1 -1
  81. package/dialog/portal/DialogPortal.js +1 -0
  82. package/dialog/root/DialogRoot.d.ts +4 -4
  83. package/dialog/store/DialogStore.d.ts +2 -2
  84. package/dialog/title/DialogTitle.d.ts +1 -1
  85. package/dialog/viewport/DialogViewport.d.ts +1 -1
  86. package/esm/accordion/header/AccordionHeader.d.ts +1 -1
  87. package/esm/accordion/item/AccordionItem.d.ts +1 -1
  88. package/esm/accordion/panel/AccordionPanel.d.ts +1 -1
  89. package/esm/accordion/root/AccordionRoot.d.ts +1 -1
  90. package/esm/accordion/trigger/AccordionTrigger.d.ts +1 -1
  91. package/esm/accordion/trigger/AccordionTrigger.js +3 -4
  92. package/esm/alert-dialog/root/AlertDialogRoot.d.ts +3 -3
  93. package/esm/autocomplete/root/AutocompleteRoot.d.ts +1 -1
  94. package/esm/avatar/fallback/AvatarFallback.d.ts +1 -1
  95. package/esm/avatar/image/AvatarImage.d.ts +1 -1
  96. package/esm/avatar/root/AvatarRoot.d.ts +1 -1
  97. package/esm/button/Button.d.ts +4 -17
  98. package/esm/button/Button.js +1 -2
  99. package/esm/checkbox/indicator/CheckboxIndicator.d.ts +1 -1
  100. package/esm/checkbox/indicator/CheckboxIndicatorDataAttributes.d.ts +4 -0
  101. package/esm/checkbox/indicator/CheckboxIndicatorDataAttributes.js +4 -0
  102. package/esm/checkbox/root/CheckboxRoot.d.ts +1 -1
  103. package/esm/checkbox/root/CheckboxRoot.js +6 -5
  104. package/esm/checkbox/root/CheckboxRootDataAttributes.d.ts +4 -0
  105. package/esm/checkbox/root/CheckboxRootDataAttributes.js +4 -0
  106. package/esm/checkbox-group/CheckboxGroup.d.ts +1 -1
  107. package/esm/collapsible/panel/CollapsiblePanel.d.ts +1 -1
  108. package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
  109. package/esm/collapsible/trigger/CollapsibleTrigger.d.ts +1 -1
  110. package/esm/collapsible/trigger/CollapsibleTrigger.js +1 -2
  111. package/esm/combobox/arrow/ComboboxArrow.d.ts +1 -1
  112. package/esm/combobox/backdrop/ComboboxBackdrop.d.ts +1 -1
  113. package/esm/combobox/chip/ComboboxChip.d.ts +1 -1
  114. package/esm/combobox/chip-remove/ComboboxChipRemove.d.ts +1 -1
  115. package/esm/combobox/chip-remove/ComboboxChipRemove.js +3 -2
  116. package/esm/combobox/chips/ComboboxChips.d.ts +1 -1
  117. package/esm/combobox/chips/ComboboxChips.js +7 -1
  118. package/esm/combobox/clear/ComboboxClear.d.ts +1 -1
  119. package/esm/combobox/clear/ComboboxClear.js +2 -2
  120. package/esm/combobox/empty/ComboboxEmpty.d.ts +1 -1
  121. package/esm/combobox/group/ComboboxGroup.d.ts +1 -1
  122. package/esm/combobox/group-label/ComboboxGroupLabel.d.ts +1 -1
  123. package/esm/combobox/icon/ComboboxIcon.d.ts +1 -1
  124. package/esm/combobox/input/ComboboxInput.d.ts +1 -1
  125. package/esm/combobox/input/ComboboxInput.js +12 -17
  126. package/esm/combobox/item/ComboboxItem.d.ts +1 -1
  127. package/esm/combobox/item/ComboboxItem.js +0 -1
  128. package/esm/combobox/item-indicator/ComboboxItemIndicator.d.ts +1 -1
  129. package/esm/combobox/list/ComboboxList.d.ts +1 -1
  130. package/esm/combobox/popup/ComboboxPopup.d.ts +1 -1
  131. package/esm/combobox/popup/ComboboxPopup.js +2 -1
  132. package/esm/combobox/portal/ComboboxPortal.d.ts +1 -1
  133. package/esm/combobox/positioner/ComboboxPositioner.d.ts +1 -1
  134. package/esm/combobox/root/AriaCombobox.d.ts +8 -1
  135. package/esm/combobox/root/AriaCombobox.js +20 -17
  136. package/esm/combobox/root/ComboboxRoot.d.ts +1 -1
  137. package/esm/combobox/row/ComboboxRow.d.ts +1 -1
  138. package/esm/combobox/status/ComboboxStatus.d.ts +1 -1
  139. package/esm/combobox/store.d.ts +3 -0
  140. package/esm/combobox/store.js +21 -0
  141. package/esm/combobox/trigger/ComboboxTrigger.d.ts +14 -1
  142. package/esm/combobox/trigger/ComboboxTrigger.js +32 -12
  143. package/esm/combobox/trigger/ComboboxTriggerDataAttributes.d.ts +13 -0
  144. package/esm/combobox/trigger/ComboboxTriggerDataAttributes.js +13 -0
  145. package/esm/combobox/utils/stateAttributesMapping.d.ts +14 -0
  146. package/esm/combobox/utils/stateAttributesMapping.js +12 -0
  147. package/esm/combobox/value/ComboboxValue.d.ts +5 -0
  148. package/esm/combobox/value/ComboboxValue.js +16 -7
  149. package/esm/composite/root/useCompositeRoot.d.ts +1 -1
  150. package/esm/context-menu/trigger/ContextMenuTrigger.d.ts +1 -1
  151. package/esm/csp-provider/CSPContext.d.ts +13 -0
  152. package/esm/csp-provider/CSPContext.js +18 -0
  153. package/esm/csp-provider/CSPProvider.d.ts +25 -0
  154. package/esm/csp-provider/CSPProvider.js +27 -0
  155. package/esm/csp-provider/index.d.ts +2 -0
  156. package/esm/csp-provider/index.js +1 -0
  157. package/esm/csp-provider/index.parts.d.ts +1 -0
  158. package/esm/csp-provider/index.parts.js +1 -0
  159. package/esm/dialog/backdrop/DialogBackdrop.d.ts +1 -1
  160. package/esm/dialog/close/DialogClose.d.ts +1 -1
  161. package/esm/dialog/description/DialogDescription.d.ts +1 -1
  162. package/esm/dialog/popup/DialogPopup.d.ts +1 -1
  163. package/esm/dialog/portal/DialogPortal.d.ts +1 -1
  164. package/esm/dialog/portal/DialogPortal.js +1 -0
  165. package/esm/dialog/root/DialogRoot.d.ts +4 -4
  166. package/esm/dialog/store/DialogStore.d.ts +2 -2
  167. package/esm/dialog/title/DialogTitle.d.ts +1 -1
  168. package/esm/dialog/viewport/DialogViewport.d.ts +1 -1
  169. package/esm/field/control/FieldControl.d.ts +1 -1
  170. package/esm/field/description/FieldDescription.d.ts +1 -1
  171. package/esm/field/error/FieldError.d.ts +1 -1
  172. package/esm/field/index.d.ts +2 -1
  173. package/esm/field/item/FieldItem.d.ts +1 -1
  174. package/esm/field/label/FieldLabel.d.ts +11 -2
  175. package/esm/field/label/FieldLabel.js +51 -11
  176. package/esm/field/root/FieldRoot.d.ts +10 -1
  177. package/esm/field/root/FieldRoot.js +8 -0
  178. package/esm/field/useField.js +7 -3
  179. package/esm/fieldset/legend/FieldsetLegend.d.ts +1 -1
  180. package/esm/fieldset/root/FieldsetRoot.d.ts +1 -1
  181. package/esm/floating-ui-react/components/FloatingFocusManager.js +7 -6
  182. package/esm/floating-ui-react/components/FloatingPortal.d.ts +2 -2
  183. package/esm/floating-ui-react/components/FloatingPortal.js +11 -2
  184. package/esm/floating-ui-react/hooks/useClientPoint.js +5 -4
  185. package/esm/floating-ui-react/hooks/useDismiss.js +16 -3
  186. package/esm/floating-ui-react/hooks/useFocus.d.ts +5 -0
  187. package/esm/floating-ui-react/hooks/useFocus.js +43 -9
  188. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +17 -4
  189. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +3 -0
  190. package/esm/form/Form.d.ts +18 -1
  191. package/esm/form/Form.js +17 -0
  192. package/esm/form/FormContext.d.ts +1 -1
  193. package/esm/index.d.ts +1 -0
  194. package/esm/index.js +2 -1
  195. package/esm/input/Input.d.ts +1 -1
  196. package/esm/menu/arrow/MenuArrow.d.ts +1 -1
  197. package/esm/menu/backdrop/MenuBackdrop.d.ts +1 -1
  198. package/esm/menu/checkbox-item/MenuCheckboxItem.d.ts +1 -1
  199. package/esm/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.d.ts +1 -1
  200. package/esm/menu/group/MenuGroup.d.ts +1 -1
  201. package/esm/menu/group-label/MenuGroupLabel.d.ts +1 -1
  202. package/esm/menu/item/MenuItem.d.ts +1 -1
  203. package/esm/menu/popup/MenuPopup.d.ts +1 -1
  204. package/esm/menu/popup/MenuPopup.js +4 -3
  205. package/esm/menu/portal/MenuPortal.d.ts +1 -1
  206. package/esm/menu/positioner/MenuPositioner.d.ts +1 -1
  207. package/esm/menu/radio-group/MenuRadioGroup.d.ts +1 -1
  208. package/esm/menu/radio-item/MenuRadioItem.d.ts +1 -1
  209. package/esm/menu/radio-item-indicator/MenuRadioItemIndicator.d.ts +1 -1
  210. package/esm/menu/root/MenuRoot.d.ts +7 -6
  211. package/esm/menu/root/MenuRoot.js +4 -2
  212. package/esm/menu/store/MenuStore.js +3 -3
  213. package/esm/menu/submenu-trigger/MenuSubmenuTrigger.d.ts +1 -1
  214. package/esm/menu/trigger/MenuTrigger.js +13 -13
  215. package/esm/menubar/Menubar.d.ts +1 -1
  216. package/esm/merge-props/mergeProps.d.ts +31 -11
  217. package/esm/merge-props/mergeProps.js +29 -8
  218. package/esm/meter/indicator/MeterIndicator.d.ts +1 -1
  219. package/esm/meter/label/MeterLabel.d.ts +1 -1
  220. package/esm/meter/root/MeterRoot.d.ts +1 -1
  221. package/esm/meter/track/MeterTrack.d.ts +1 -1
  222. package/esm/meter/value/MeterValue.d.ts +1 -1
  223. package/esm/navigation-menu/arrow/NavigationMenuArrow.d.ts +1 -1
  224. package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.d.ts +1 -1
  225. package/esm/navigation-menu/content/NavigationMenuContent.d.ts +1 -1
  226. package/esm/navigation-menu/content/NavigationMenuContent.js +6 -0
  227. package/esm/navigation-menu/icon/NavigationMenuIcon.d.ts +1 -1
  228. package/esm/navigation-menu/item/NavigationMenuItem.d.ts +1 -1
  229. package/esm/navigation-menu/link/NavigationMenuLink.d.ts +1 -1
  230. package/esm/navigation-menu/list/NavigationMenuList.d.ts +1 -1
  231. package/esm/navigation-menu/popup/NavigationMenuPopup.d.ts +1 -1
  232. package/esm/navigation-menu/portal/NavigationMenuPortal.d.ts +1 -1
  233. package/esm/navigation-menu/positioner/NavigationMenuPositioner.d.ts +1 -1
  234. package/esm/navigation-menu/root/NavigationMenuRoot.d.ts +2 -2
  235. package/esm/navigation-menu/trigger/NavigationMenuTrigger.d.ts +1 -1
  236. package/esm/navigation-menu/viewport/NavigationMenuViewport.d.ts +1 -1
  237. package/esm/number-field/decrement/NumberFieldDecrement.d.ts +1 -1
  238. package/esm/number-field/decrement/NumberFieldDecrement.js +4 -6
  239. package/esm/number-field/group/NumberFieldGroup.d.ts +1 -1
  240. package/esm/number-field/increment/NumberFieldIncrement.d.ts +1 -1
  241. package/esm/number-field/increment/NumberFieldIncrement.js +4 -6
  242. package/esm/number-field/input/NumberFieldInput.d.ts +1 -1
  243. package/esm/number-field/input/NumberFieldInput.js +5 -2
  244. package/esm/number-field/root/NumberFieldRoot.d.ts +5 -4
  245. package/esm/number-field/root/NumberFieldRoot.js +12 -5
  246. package/esm/number-field/root/useNumberFieldButton.d.ts +0 -3
  247. package/esm/number-field/root/useNumberFieldButton.js +5 -11
  248. package/esm/number-field/scrub-area/NumberFieldScrubArea.d.ts +1 -1
  249. package/esm/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.d.ts +1 -1
  250. package/esm/popover/arrow/PopoverArrow.d.ts +1 -1
  251. package/esm/popover/backdrop/PopoverBackdrop.d.ts +1 -1
  252. package/esm/popover/close/PopoverClose.d.ts +1 -1
  253. package/esm/popover/description/PopoverDescription.d.ts +1 -1
  254. package/esm/popover/popup/PopoverPopup.d.ts +1 -1
  255. package/esm/popover/popup/PopoverPopup.js +0 -30
  256. package/esm/popover/portal/PopoverPortal.d.ts +1 -1
  257. package/esm/popover/positioner/PopoverPositioner.d.ts +1 -1
  258. package/esm/popover/positioner/PopoverPositioner.js +2 -1
  259. package/esm/popover/root/PopoverRoot.d.ts +2 -2
  260. package/esm/popover/store/PopoverStore.d.ts +4 -2
  261. package/esm/popover/store/PopoverStore.js +8 -5
  262. package/esm/popover/title/PopoverTitle.d.ts +1 -1
  263. package/esm/popover/trigger/PopoverTrigger.js +2 -2
  264. package/esm/popover/viewport/PopoverViewport.d.ts +1 -1
  265. package/esm/popover/viewport/PopoverViewport.js +28 -12
  266. package/esm/preview-card/arrow/PreviewCardArrow.d.ts +1 -1
  267. package/esm/preview-card/arrow/PreviewCardArrow.js +2 -3
  268. package/esm/preview-card/backdrop/PreviewCardBackdrop.d.ts +1 -1
  269. package/esm/preview-card/backdrop/PreviewCardBackdrop.js +4 -5
  270. package/esm/preview-card/index.parts.d.ts +3 -1
  271. package/esm/preview-card/index.parts.js +3 -1
  272. package/esm/preview-card/popup/PreviewCardPopup.d.ts +2 -1
  273. package/esm/preview-card/popup/PreviewCardPopup.js +17 -11
  274. package/esm/preview-card/portal/PreviewCardPortal.d.ts +1 -1
  275. package/esm/preview-card/portal/PreviewCardPortal.js +2 -3
  276. package/esm/preview-card/positioner/PreviewCardPositioner.d.ts +2 -1
  277. package/esm/preview-card/positioner/PreviewCardPositioner.js +16 -11
  278. package/esm/preview-card/root/PreviewCardContext.d.ts +5 -26
  279. package/esm/preview-card/root/PreviewCardContext.js +2 -2
  280. package/esm/preview-card/root/PreviewCardRoot.d.ts +35 -10
  281. package/esm/preview-card/root/PreviewCardRoot.js +61 -116
  282. package/esm/preview-card/store/PreviewCardHandle.d.ts +33 -0
  283. package/esm/preview-card/store/PreviewCardHandle.js +55 -0
  284. package/esm/preview-card/store/PreviewCardStore.d.ts +36 -0
  285. package/esm/preview-card/store/PreviewCardStore.js +97 -0
  286. package/esm/preview-card/trigger/PreviewCardTrigger.d.ts +15 -3
  287. package/esm/preview-card/trigger/PreviewCardTrigger.js +49 -13
  288. package/esm/preview-card/viewport/PreviewCardViewport.d.ts +22 -0
  289. package/esm/preview-card/viewport/PreviewCardViewport.js +272 -0
  290. package/esm/preview-card/viewport/PreviewCardViewportCssVars.d.ts +14 -0
  291. package/esm/preview-card/viewport/PreviewCardViewportCssVars.js +15 -0
  292. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +26 -0
  293. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +27 -0
  294. package/esm/progress/indicator/ProgressIndicator.d.ts +1 -1
  295. package/esm/progress/label/ProgressLabel.d.ts +1 -1
  296. package/esm/progress/root/ProgressRoot.d.ts +1 -1
  297. package/esm/progress/track/ProgressTrack.d.ts +1 -1
  298. package/esm/progress/value/ProgressValue.d.ts +1 -1
  299. package/esm/radio/indicator/RadioIndicator.d.ts +1 -1
  300. package/esm/radio/root/RadioRoot.d.ts +1 -1
  301. package/esm/radio/root/RadioRoot.js +9 -9
  302. package/esm/radio-group/RadioGroup.d.ts +4 -4
  303. package/esm/radio-group/RadioGroup.js +2 -2
  304. package/esm/scroll-area/content/ScrollAreaContent.d.ts +1 -1
  305. package/esm/scroll-area/content/ScrollAreaContent.js +10 -1
  306. package/esm/scroll-area/corner/ScrollAreaCorner.d.ts +1 -1
  307. package/esm/scroll-area/corner/ScrollAreaCorner.js +1 -1
  308. package/esm/scroll-area/root/ScrollAreaRoot.d.ts +26 -2
  309. package/esm/scroll-area/root/ScrollAreaRoot.js +33 -29
  310. package/esm/scroll-area/root/ScrollAreaRootContext.d.ts +10 -43
  311. package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.d.ts +1 -1
  312. package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +4 -4
  313. package/esm/scroll-area/thumb/ScrollAreaThumb.d.ts +2 -2
  314. package/esm/scroll-area/thumb/ScrollAreaThumb.js +1 -1
  315. package/esm/scroll-area/viewport/ScrollAreaViewport.d.ts +1 -1
  316. package/esm/scroll-area/viewport/ScrollAreaViewport.js +51 -25
  317. package/esm/select/arrow/SelectArrow.d.ts +1 -1
  318. package/esm/select/backdrop/SelectBackdrop.d.ts +1 -1
  319. package/esm/select/group/SelectGroup.d.ts +1 -1
  320. package/esm/select/group-label/SelectGroupLabel.d.ts +1 -1
  321. package/esm/select/icon/SelectIcon.d.ts +1 -1
  322. package/esm/select/item/SelectItem.d.ts +1 -1
  323. package/esm/select/item/SelectItem.js +0 -1
  324. package/esm/select/item-indicator/SelectItemIndicator.d.ts +1 -1
  325. package/esm/select/item-text/SelectItemText.d.ts +1 -1
  326. package/esm/select/list/SelectList.d.ts +1 -1
  327. package/esm/select/popup/SelectPopup.d.ts +1 -1
  328. package/esm/select/popup/SelectPopup.js +154 -95
  329. package/esm/select/portal/SelectPortal.d.ts +1 -1
  330. package/esm/select/positioner/SelectPositioner.d.ts +1 -1
  331. package/esm/select/root/SelectRoot.d.ts +2 -2
  332. package/esm/select/root/SelectRoot.js +26 -13
  333. package/esm/select/scroll-arrow/SelectScrollArrow.d.ts +1 -1
  334. package/esm/select/scroll-down-arrow/SelectScrollDownArrow.d.ts +1 -1
  335. package/esm/select/scroll-up-arrow/SelectScrollUpArrow.d.ts +1 -1
  336. package/esm/select/store.d.ts +2 -1
  337. package/esm/select/store.js +19 -13
  338. package/esm/select/trigger/SelectTrigger.d.ts +14 -4
  339. package/esm/select/trigger/SelectTrigger.js +50 -18
  340. package/esm/select/value/SelectValue.d.ts +6 -1
  341. package/esm/select/value/SelectValue.js +19 -5
  342. package/esm/separator/Separator.d.ts +1 -1
  343. package/esm/slider/control/SliderControl.d.ts +1 -1
  344. package/esm/slider/control/SliderControl.js +1 -1
  345. package/esm/slider/control/SliderControlDataAttributes.d.ts +0 -8
  346. package/esm/slider/control/SliderControlDataAttributes.js +0 -8
  347. package/esm/slider/indicator/SliderIndicator.d.ts +1 -1
  348. package/esm/slider/indicator/SliderIndicatorDataAttributes.d.ts +0 -8
  349. package/esm/slider/indicator/SliderIndicatorDataAttributes.js +0 -8
  350. package/esm/slider/root/SliderRootDataAttributes.d.ts +0 -8
  351. package/esm/slider/root/SliderRootDataAttributes.js +0 -8
  352. package/esm/slider/thumb/SliderThumb.d.ts +2 -2
  353. package/esm/slider/thumb/SliderThumb.js +7 -1
  354. package/esm/slider/thumb/SliderThumbDataAttributes.d.ts +0 -8
  355. package/esm/slider/thumb/SliderThumbDataAttributes.js +0 -8
  356. package/esm/slider/track/SliderTrack.d.ts +1 -1
  357. package/esm/slider/track/SliderTrackDataAttributes.d.ts +0 -8
  358. package/esm/slider/track/SliderTrackDataAttributes.js +0 -8
  359. package/esm/slider/value/SliderValue.d.ts +1 -1
  360. package/esm/slider/value/SliderValueDataAttributes.d.ts +0 -8
  361. package/esm/slider/value/SliderValueDataAttributes.js +0 -8
  362. package/esm/switch/root/SwitchRoot.d.ts +6 -1
  363. package/esm/switch/root/SwitchRoot.js +15 -6
  364. package/esm/switch/thumb/SwitchThumb.d.ts +1 -1
  365. package/esm/tabs/indicator/TabsIndicator.d.ts +1 -1
  366. package/esm/tabs/indicator/TabsIndicator.js +6 -0
  367. package/esm/tabs/list/TabsList.d.ts +1 -1
  368. package/esm/tabs/panel/TabsPanel.d.ts +1 -1
  369. package/esm/tabs/root/TabsRoot.d.ts +1 -1
  370. package/esm/tabs/tab/TabsTab.d.ts +1 -1
  371. package/esm/toast/action/ToastAction.d.ts +1 -1
  372. package/esm/toast/arrow/ToastArrow.d.ts +1 -1
  373. package/esm/toast/close/ToastClose.d.ts +1 -1
  374. package/esm/toast/content/ToastContent.d.ts +1 -1
  375. package/esm/toast/description/ToastDescription.d.ts +1 -1
  376. package/esm/toast/portal/ToastPortal.d.ts +1 -1
  377. package/esm/toast/positioner/ToastPositioner.d.ts +1 -1
  378. package/esm/toast/provider/ToastProvider.js +46 -19
  379. package/esm/toast/root/ToastRoot.d.ts +1 -1
  380. package/esm/toast/title/ToastTitle.d.ts +1 -1
  381. package/esm/toast/viewport/ToastViewport.d.ts +1 -1
  382. package/esm/toggle/Toggle.d.ts +1 -1
  383. package/esm/toggle-group/ToggleGroup.d.ts +1 -1
  384. package/esm/toolbar/button/ToolbarButton.d.ts +1 -1
  385. package/esm/toolbar/group/ToolbarGroup.d.ts +1 -1
  386. package/esm/toolbar/input/ToolbarInput.d.ts +1 -1
  387. package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
  388. package/esm/toolbar/root/ToolbarRoot.d.ts +1 -1
  389. package/esm/toolbar/separator/ToolbarSeparator.d.ts +1 -1
  390. package/esm/tooltip/arrow/TooltipArrow.d.ts +1 -1
  391. package/esm/tooltip/popup/TooltipPopup.d.ts +1 -1
  392. package/esm/tooltip/popup/TooltipPopup.js +0 -31
  393. package/esm/tooltip/portal/TooltipPortal.d.ts +1 -1
  394. package/esm/tooltip/positioner/TooltipPositioner.d.ts +1 -1
  395. package/esm/tooltip/positioner/TooltipPositioner.js +2 -1
  396. package/esm/tooltip/root/TooltipRoot.d.ts +4 -6
  397. package/esm/tooltip/root/TooltipRoot.js +1 -2
  398. package/esm/tooltip/store/TooltipStore.d.ts +4 -2
  399. package/esm/tooltip/store/TooltipStore.js +7 -4
  400. package/esm/tooltip/trigger/TooltipTrigger.js +1 -1
  401. package/esm/tooltip/viewport/TooltipViewport.d.ts +1 -1
  402. package/esm/tooltip/viewport/TooltipViewport.js +28 -12
  403. package/esm/use-render/index.d.ts +2 -1
  404. package/esm/use-render/index.js +2 -1
  405. package/esm/utils/FloatingPortalLite.d.ts +1 -1
  406. package/esm/utils/popups/popupStoreUtils.js +21 -2
  407. package/esm/utils/resolveValueLabel.d.ts +5 -1
  408. package/esm/utils/resolveValueLabel.js +46 -22
  409. package/esm/utils/styles.d.ts +1 -1
  410. package/esm/utils/styles.js +10 -6
  411. package/esm/utils/types.d.ts +1 -1
  412. package/esm/utils/useAnimationsFinished.d.ts +2 -2
  413. package/esm/utils/useAnimationsFinished.js +56 -33
  414. package/esm/utils/useOpenChangeComplete.js +8 -10
  415. package/esm/utils/useOpenInteractionType.js +6 -1
  416. package/esm/utils/usePopupAutoResize.js +82 -46
  417. package/field/control/FieldControl.d.ts +1 -1
  418. package/field/description/FieldDescription.d.ts +1 -1
  419. package/field/error/FieldError.d.ts +1 -1
  420. package/field/index.d.ts +2 -1
  421. package/field/item/FieldItem.d.ts +1 -1
  422. package/field/label/FieldLabel.d.ts +11 -2
  423. package/field/label/FieldLabel.js +51 -11
  424. package/field/root/FieldRoot.d.ts +10 -1
  425. package/field/root/FieldRoot.js +8 -0
  426. package/field/useField.js +7 -3
  427. package/fieldset/legend/FieldsetLegend.d.ts +1 -1
  428. package/fieldset/root/FieldsetRoot.d.ts +1 -1
  429. package/floating-ui-react/components/FloatingFocusManager.js +7 -6
  430. package/floating-ui-react/components/FloatingPortal.d.ts +2 -2
  431. package/floating-ui-react/components/FloatingPortal.js +11 -2
  432. package/floating-ui-react/hooks/useClientPoint.js +5 -4
  433. package/floating-ui-react/hooks/useDismiss.js +16 -3
  434. package/floating-ui-react/hooks/useFocus.d.ts +5 -0
  435. package/floating-ui-react/hooks/useFocus.js +43 -9
  436. package/floating-ui-react/hooks/useHoverReferenceInteraction.js +17 -4
  437. package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +3 -0
  438. package/form/Form.d.ts +18 -1
  439. package/form/Form.js +17 -0
  440. package/form/FormContext.d.ts +1 -1
  441. package/index.d.ts +1 -0
  442. package/index.js +12 -1
  443. package/input/Input.d.ts +1 -1
  444. package/menu/arrow/MenuArrow.d.ts +1 -1
  445. package/menu/backdrop/MenuBackdrop.d.ts +1 -1
  446. package/menu/checkbox-item/MenuCheckboxItem.d.ts +1 -1
  447. package/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.d.ts +1 -1
  448. package/menu/group/MenuGroup.d.ts +1 -1
  449. package/menu/group-label/MenuGroupLabel.d.ts +1 -1
  450. package/menu/item/MenuItem.d.ts +1 -1
  451. package/menu/popup/MenuPopup.d.ts +1 -1
  452. package/menu/popup/MenuPopup.js +4 -3
  453. package/menu/portal/MenuPortal.d.ts +1 -1
  454. package/menu/positioner/MenuPositioner.d.ts +1 -1
  455. package/menu/radio-group/MenuRadioGroup.d.ts +1 -1
  456. package/menu/radio-item/MenuRadioItem.d.ts +1 -1
  457. package/menu/radio-item-indicator/MenuRadioItemIndicator.d.ts +1 -1
  458. package/menu/root/MenuRoot.d.ts +7 -6
  459. package/menu/root/MenuRoot.js +4 -2
  460. package/menu/store/MenuStore.js +3 -3
  461. package/menu/submenu-trigger/MenuSubmenuTrigger.d.ts +1 -1
  462. package/menu/trigger/MenuTrigger.js +14 -14
  463. package/menubar/Menubar.d.ts +1 -1
  464. package/merge-props/mergeProps.d.ts +31 -11
  465. package/merge-props/mergeProps.js +29 -8
  466. package/meter/indicator/MeterIndicator.d.ts +1 -1
  467. package/meter/label/MeterLabel.d.ts +1 -1
  468. package/meter/root/MeterRoot.d.ts +1 -1
  469. package/meter/track/MeterTrack.d.ts +1 -1
  470. package/meter/value/MeterValue.d.ts +1 -1
  471. package/navigation-menu/arrow/NavigationMenuArrow.d.ts +1 -1
  472. package/navigation-menu/backdrop/NavigationMenuBackdrop.d.ts +1 -1
  473. package/navigation-menu/content/NavigationMenuContent.d.ts +1 -1
  474. package/navigation-menu/content/NavigationMenuContent.js +6 -0
  475. package/navigation-menu/icon/NavigationMenuIcon.d.ts +1 -1
  476. package/navigation-menu/item/NavigationMenuItem.d.ts +1 -1
  477. package/navigation-menu/link/NavigationMenuLink.d.ts +1 -1
  478. package/navigation-menu/list/NavigationMenuList.d.ts +1 -1
  479. package/navigation-menu/popup/NavigationMenuPopup.d.ts +1 -1
  480. package/navigation-menu/portal/NavigationMenuPortal.d.ts +1 -1
  481. package/navigation-menu/positioner/NavigationMenuPositioner.d.ts +1 -1
  482. package/navigation-menu/root/NavigationMenuRoot.d.ts +2 -2
  483. package/navigation-menu/trigger/NavigationMenuTrigger.d.ts +1 -1
  484. package/navigation-menu/viewport/NavigationMenuViewport.d.ts +1 -1
  485. package/number-field/decrement/NumberFieldDecrement.d.ts +1 -1
  486. package/number-field/decrement/NumberFieldDecrement.js +4 -6
  487. package/number-field/group/NumberFieldGroup.d.ts +1 -1
  488. package/number-field/increment/NumberFieldIncrement.d.ts +1 -1
  489. package/number-field/increment/NumberFieldIncrement.js +4 -6
  490. package/number-field/input/NumberFieldInput.d.ts +1 -1
  491. package/number-field/input/NumberFieldInput.js +5 -2
  492. package/number-field/root/NumberFieldRoot.d.ts +5 -4
  493. package/number-field/root/NumberFieldRoot.js +11 -4
  494. package/number-field/root/useNumberFieldButton.d.ts +0 -3
  495. package/number-field/root/useNumberFieldButton.js +5 -11
  496. package/number-field/scrub-area/NumberFieldScrubArea.d.ts +1 -1
  497. package/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.d.ts +1 -1
  498. package/package.json +13 -3
  499. package/popover/arrow/PopoverArrow.d.ts +1 -1
  500. package/popover/backdrop/PopoverBackdrop.d.ts +1 -1
  501. package/popover/close/PopoverClose.d.ts +1 -1
  502. package/popover/description/PopoverDescription.d.ts +1 -1
  503. package/popover/popup/PopoverPopup.d.ts +1 -1
  504. package/popover/popup/PopoverPopup.js +0 -30
  505. package/popover/portal/PopoverPortal.d.ts +1 -1
  506. package/popover/positioner/PopoverPositioner.d.ts +1 -1
  507. package/popover/positioner/PopoverPositioner.js +2 -1
  508. package/popover/root/PopoverRoot.d.ts +2 -2
  509. package/popover/store/PopoverStore.d.ts +4 -2
  510. package/popover/store/PopoverStore.js +8 -5
  511. package/popover/title/PopoverTitle.d.ts +1 -1
  512. package/popover/trigger/PopoverTrigger.js +2 -2
  513. package/popover/viewport/PopoverViewport.d.ts +1 -1
  514. package/popover/viewport/PopoverViewport.js +28 -12
  515. package/preview-card/arrow/PreviewCardArrow.d.ts +1 -1
  516. package/preview-card/arrow/PreviewCardArrow.js +2 -3
  517. package/preview-card/backdrop/PreviewCardBackdrop.d.ts +1 -1
  518. package/preview-card/backdrop/PreviewCardBackdrop.js +4 -5
  519. package/preview-card/index.parts.d.ts +3 -1
  520. package/preview-card/index.parts.js +21 -1
  521. package/preview-card/popup/PreviewCardPopup.d.ts +2 -1
  522. package/preview-card/popup/PreviewCardPopup.js +17 -11
  523. package/preview-card/portal/PreviewCardPortal.d.ts +1 -1
  524. package/preview-card/portal/PreviewCardPortal.js +2 -3
  525. package/preview-card/positioner/PreviewCardPositioner.d.ts +2 -1
  526. package/preview-card/positioner/PreviewCardPositioner.js +16 -11
  527. package/preview-card/root/PreviewCardContext.d.ts +5 -26
  528. package/preview-card/root/PreviewCardContext.js +2 -2
  529. package/preview-card/root/PreviewCardRoot.d.ts +35 -10
  530. package/preview-card/root/PreviewCardRoot.js +59 -113
  531. package/preview-card/store/PreviewCardHandle.d.ts +33 -0
  532. package/preview-card/store/PreviewCardHandle.js +63 -0
  533. package/preview-card/store/PreviewCardStore.d.ts +36 -0
  534. package/preview-card/store/PreviewCardStore.js +105 -0
  535. package/preview-card/trigger/PreviewCardTrigger.d.ts +15 -3
  536. package/preview-card/trigger/PreviewCardTrigger.js +50 -13
  537. package/preview-card/viewport/PreviewCardViewport.d.ts +22 -0
  538. package/preview-card/viewport/PreviewCardViewport.js +278 -0
  539. package/preview-card/viewport/PreviewCardViewportCssVars.d.ts +14 -0
  540. package/preview-card/viewport/PreviewCardViewportCssVars.js +21 -0
  541. package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +26 -0
  542. package/preview-card/viewport/PreviewCardViewportDataAttributes.js +33 -0
  543. package/progress/indicator/ProgressIndicator.d.ts +1 -1
  544. package/progress/label/ProgressLabel.d.ts +1 -1
  545. package/progress/root/ProgressRoot.d.ts +1 -1
  546. package/progress/track/ProgressTrack.d.ts +1 -1
  547. package/progress/value/ProgressValue.d.ts +1 -1
  548. package/radio/indicator/RadioIndicator.d.ts +1 -1
  549. package/radio/root/RadioRoot.d.ts +1 -1
  550. package/radio/root/RadioRoot.js +8 -8
  551. package/radio-group/RadioGroup.d.ts +4 -4
  552. package/radio-group/RadioGroup.js +1 -1
  553. package/scroll-area/content/ScrollAreaContent.d.ts +1 -1
  554. package/scroll-area/content/ScrollAreaContent.js +10 -1
  555. package/scroll-area/corner/ScrollAreaCorner.d.ts +1 -1
  556. package/scroll-area/corner/ScrollAreaCorner.js +1 -1
  557. package/scroll-area/root/ScrollAreaRoot.d.ts +26 -2
  558. package/scroll-area/root/ScrollAreaRoot.js +33 -29
  559. package/scroll-area/root/ScrollAreaRootContext.d.ts +10 -43
  560. package/scroll-area/scrollbar/ScrollAreaScrollbar.d.ts +1 -1
  561. package/scroll-area/scrollbar/ScrollAreaScrollbar.js +4 -4
  562. package/scroll-area/thumb/ScrollAreaThumb.d.ts +2 -2
  563. package/scroll-area/thumb/ScrollAreaThumb.js +1 -1
  564. package/scroll-area/viewport/ScrollAreaViewport.d.ts +1 -1
  565. package/scroll-area/viewport/ScrollAreaViewport.js +51 -25
  566. package/select/arrow/SelectArrow.d.ts +1 -1
  567. package/select/backdrop/SelectBackdrop.d.ts +1 -1
  568. package/select/group/SelectGroup.d.ts +1 -1
  569. package/select/group-label/SelectGroupLabel.d.ts +1 -1
  570. package/select/icon/SelectIcon.d.ts +1 -1
  571. package/select/item/SelectItem.d.ts +1 -1
  572. package/select/item/SelectItem.js +0 -1
  573. package/select/item-indicator/SelectItemIndicator.d.ts +1 -1
  574. package/select/item-text/SelectItemText.d.ts +1 -1
  575. package/select/list/SelectList.d.ts +1 -1
  576. package/select/popup/SelectPopup.d.ts +1 -1
  577. package/select/popup/SelectPopup.js +154 -95
  578. package/select/portal/SelectPortal.d.ts +1 -1
  579. package/select/positioner/SelectPositioner.d.ts +1 -1
  580. package/select/root/SelectRoot.d.ts +2 -2
  581. package/select/root/SelectRoot.js +24 -11
  582. package/select/scroll-arrow/SelectScrollArrow.d.ts +1 -1
  583. package/select/scroll-down-arrow/SelectScrollDownArrow.d.ts +1 -1
  584. package/select/scroll-up-arrow/SelectScrollUpArrow.d.ts +1 -1
  585. package/select/store.d.ts +2 -1
  586. package/select/store.js +18 -12
  587. package/select/trigger/SelectTrigger.d.ts +14 -4
  588. package/select/trigger/SelectTrigger.js +50 -18
  589. package/select/value/SelectValue.d.ts +6 -1
  590. package/select/value/SelectValue.js +18 -4
  591. package/separator/Separator.d.ts +1 -1
  592. package/slider/control/SliderControl.d.ts +1 -1
  593. package/slider/control/SliderControl.js +1 -1
  594. package/slider/control/SliderControlDataAttributes.d.ts +0 -8
  595. package/slider/control/SliderControlDataAttributes.js +0 -8
  596. package/slider/indicator/SliderIndicator.d.ts +1 -1
  597. package/slider/indicator/SliderIndicatorDataAttributes.d.ts +0 -8
  598. package/slider/indicator/SliderIndicatorDataAttributes.js +0 -8
  599. package/slider/root/SliderRootDataAttributes.d.ts +0 -8
  600. package/slider/root/SliderRootDataAttributes.js +0 -8
  601. package/slider/thumb/SliderThumb.d.ts +2 -2
  602. package/slider/thumb/SliderThumb.js +7 -1
  603. package/slider/thumb/SliderThumbDataAttributes.d.ts +0 -8
  604. package/slider/thumb/SliderThumbDataAttributes.js +0 -8
  605. package/slider/track/SliderTrack.d.ts +1 -1
  606. package/slider/track/SliderTrackDataAttributes.d.ts +0 -8
  607. package/slider/track/SliderTrackDataAttributes.js +0 -8
  608. package/slider/value/SliderValue.d.ts +1 -1
  609. package/slider/value/SliderValueDataAttributes.d.ts +0 -8
  610. package/slider/value/SliderValueDataAttributes.js +0 -8
  611. package/switch/root/SwitchRoot.d.ts +6 -1
  612. package/switch/root/SwitchRoot.js +14 -5
  613. package/switch/thumb/SwitchThumb.d.ts +1 -1
  614. package/tabs/indicator/TabsIndicator.d.ts +1 -1
  615. package/tabs/indicator/TabsIndicator.js +6 -0
  616. package/tabs/list/TabsList.d.ts +1 -1
  617. package/tabs/panel/TabsPanel.d.ts +1 -1
  618. package/tabs/root/TabsRoot.d.ts +1 -1
  619. package/tabs/tab/TabsTab.d.ts +1 -1
  620. package/toast/action/ToastAction.d.ts +1 -1
  621. package/toast/arrow/ToastArrow.d.ts +1 -1
  622. package/toast/close/ToastClose.d.ts +1 -1
  623. package/toast/content/ToastContent.d.ts +1 -1
  624. package/toast/description/ToastDescription.d.ts +1 -1
  625. package/toast/portal/ToastPortal.d.ts +1 -1
  626. package/toast/positioner/ToastPositioner.d.ts +1 -1
  627. package/toast/provider/ToastProvider.js +46 -19
  628. package/toast/root/ToastRoot.d.ts +1 -1
  629. package/toast/title/ToastTitle.d.ts +1 -1
  630. package/toast/viewport/ToastViewport.d.ts +1 -1
  631. package/toggle/Toggle.d.ts +1 -1
  632. package/toggle-group/ToggleGroup.d.ts +1 -1
  633. package/toolbar/button/ToolbarButton.d.ts +1 -1
  634. package/toolbar/group/ToolbarGroup.d.ts +1 -1
  635. package/toolbar/input/ToolbarInput.d.ts +1 -1
  636. package/toolbar/link/ToolbarLink.d.ts +1 -1
  637. package/toolbar/root/ToolbarRoot.d.ts +1 -1
  638. package/toolbar/separator/ToolbarSeparator.d.ts +1 -1
  639. package/tooltip/arrow/TooltipArrow.d.ts +1 -1
  640. package/tooltip/popup/TooltipPopup.d.ts +1 -1
  641. package/tooltip/popup/TooltipPopup.js +0 -31
  642. package/tooltip/portal/TooltipPortal.d.ts +1 -1
  643. package/tooltip/positioner/TooltipPositioner.d.ts +1 -1
  644. package/tooltip/positioner/TooltipPositioner.js +2 -1
  645. package/tooltip/root/TooltipRoot.d.ts +4 -6
  646. package/tooltip/root/TooltipRoot.js +1 -2
  647. package/tooltip/store/TooltipStore.d.ts +4 -2
  648. package/tooltip/store/TooltipStore.js +7 -4
  649. package/tooltip/trigger/TooltipTrigger.js +1 -1
  650. package/tooltip/viewport/TooltipViewport.d.ts +1 -1
  651. package/tooltip/viewport/TooltipViewport.js +28 -12
  652. package/use-render/index.d.ts +2 -1
  653. package/utils/FloatingPortalLite.d.ts +1 -1
  654. package/utils/popups/popupStoreUtils.js +21 -2
  655. package/utils/resolveValueLabel.d.ts +5 -1
  656. package/utils/resolveValueLabel.js +48 -22
  657. package/utils/styles.d.ts +1 -1
  658. package/utils/styles.js +10 -6
  659. package/utils/types.d.ts +1 -1
  660. package/utils/useAnimationsFinished.d.ts +2 -2
  661. package/utils/useAnimationsFinished.js +56 -33
  662. package/utils/useOpenChangeComplete.js +8 -10
  663. package/utils/useOpenInteractionType.js +6 -1
  664. package/utils/usePopupAutoResize.js +82 -46
  665. package/esm/utils/interactions/useFocusWithDelay.d.ts +0 -9
  666. package/esm/utils/interactions/useFocusWithDelay.js +0 -81
  667. package/utils/interactions/useFocusWithDelay.d.ts +0 -9
  668. package/utils/interactions/useFocusWithDelay.js +0 -87
  669. /package/esm/utils/{useMixedToggleClickHander.d.ts → useMixedToggleClickHandler.d.ts} +0 -0
  670. /package/esm/utils/{useMixedToggleClickHander.js → useMixedToggleClickHandler.js} +0 -0
  671. /package/utils/{useMixedToggleClickHander.d.ts → useMixedToggleClickHandler.d.ts} +0 -0
  672. /package/utils/{useMixedToggleClickHander.js → useMixedToggleClickHandler.js} +0 -0
@@ -7,7 +7,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
7
7
  *
8
8
  * Documentation: [Base UI Field](https://base-ui.com/react/components/field)
9
9
  */
10
- export declare const FieldError: React.ForwardRefExoticComponent<FieldErrorProps & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const FieldError: React.ForwardRefExoticComponent<Omit<FieldErrorProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
11
  export type FieldErrorState = FieldRoot.State;
12
12
  export interface FieldErrorProps extends BaseUIComponentProps<'div', FieldError.State> {
13
13
  /**
@@ -4,4 +4,5 @@ export type * from "./label/FieldLabel.js";
4
4
  export type * from "./description/FieldDescription.js";
5
5
  export type * from "./error/FieldError.js";
6
6
  export type * from "./control/FieldControl.js";
7
- export type * from "./validity/FieldValidity.js";
7
+ export type * from "./validity/FieldValidity.js";
8
+ export type * from "./item/FieldItem.js";
@@ -7,7 +7,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
7
7
  *
8
8
  * Documentation: [Base UI Field](https://base-ui.com/react/components/field)
9
9
  */
10
- export declare const FieldItem: React.ForwardRefExoticComponent<FieldItemProps & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const FieldItem: React.ForwardRefExoticComponent<Omit<FieldItemProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
11
  export interface FieldItemProps extends BaseUIComponentProps<'div', FieldItem.State> {
12
12
  /**
13
13
  * Whether the wrapped control should ignore user interaction.
@@ -7,9 +7,18 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
7
7
  *
8
8
  * Documentation: [Base UI Field](https://base-ui.com/react/components/field)
9
9
  */
10
- export declare const FieldLabel: React.ForwardRefExoticComponent<FieldLabelProps & React.RefAttributes<any>>;
10
+ export declare const FieldLabel: React.ForwardRefExoticComponent<Omit<FieldLabelProps, "ref"> & React.RefAttributes<HTMLElement>>;
11
11
  export type FieldLabelState = FieldRoot.State;
12
- export interface FieldLabelProps extends BaseUIComponentProps<'label', FieldLabel.State> {}
12
+ export interface FieldLabelProps extends BaseUIComponentProps<'label', FieldLabel.State> {
13
+ /**
14
+ * Whether the component renders a native `<label>` element when replacing it via the `render` prop.
15
+ * Set to `false` if the rendered element is not a label (e.g. `<div>`).
16
+ *
17
+ * This is useful to avoid inheriting label behaviors on `<button>` controls (such as `<Select.Trigger>` and `<Combobox.Trigger>`), including avoiding `:hover` on the button when hovering the label, and preventing clicks on the label from firing on the button.
18
+ * @default true
19
+ */
20
+ nativeLabel?: boolean;
21
+ }
13
22
  export declare namespace FieldLabel {
14
23
  type State = FieldLabelState;
15
24
  type Props = FieldLabelProps;
@@ -1,7 +1,11 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
+ import { error } from '@base-ui/utils/error';
5
+ import { isHTMLElement } from '@floating-ui/utils/dom';
4
6
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
7
+ import { ownerDocument } from '@base-ui/utils/owner';
8
+ import { useStableCallback } from '@base-ui/utils/useStableCallback';
5
9
  import { getTarget } from "../../floating-ui-react/utils.js";
6
10
  import { useFieldRootContext } from "../root/FieldRootContext.js";
7
11
  import { useLabelableContext } from "../../labelable-provider/LabelableContext.js";
@@ -20,6 +24,7 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
20
24
  render,
21
25
  className,
22
26
  id: idProp,
27
+ nativeLabel = true,
23
28
  ...elementProps
24
29
  } = componentProps;
25
30
  const fieldRootContext = useFieldRootContext(false);
@@ -30,6 +35,45 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
30
35
  } = useLabelableContext();
31
36
  const id = useBaseUiId(idProp);
32
37
  const labelRef = React.useRef(null);
38
+ const handleInteraction = useStableCallback(event => {
39
+ const target = getTarget(event.nativeEvent);
40
+ if (target?.closest('button,input,select,textarea')) {
41
+ return;
42
+ }
43
+
44
+ // Prevent text selection when double clicking label.
45
+ if (!event.defaultPrevented && event.detail > 1) {
46
+ event.preventDefault();
47
+ }
48
+ if (nativeLabel || !controlId) {
49
+ return;
50
+ }
51
+ const controlElement = ownerDocument(event.currentTarget).getElementById(controlId);
52
+ if (isHTMLElement(controlElement)) {
53
+ controlElement.focus({
54
+ // Available from Chrome 144+ (January 2026).
55
+ // Safari and Firefox already support it.
56
+ // @ts-expect-error not available in types yet
57
+ focusVisible: true
58
+ });
59
+ }
60
+ });
61
+ if (process.env.NODE_ENV !== 'production') {
62
+ // eslint-disable-next-line react-hooks/rules-of-hooks
63
+ React.useEffect(() => {
64
+ if (!labelRef.current) {
65
+ return;
66
+ }
67
+ const isLabelTag = labelRef.current.tagName === 'LABEL';
68
+ if (nativeLabel) {
69
+ if (!isLabelTag) {
70
+ error('<Field.Label> was not rendered as a <label> element, which does not match the `nativeLabel` prop on the component. Ensure that the element passed to the `render` prop of <Field.Label> is a real <label>, or set the `nativeLabel` prop on the component to `false`.');
71
+ }
72
+ } else if (isLabelTag) {
73
+ error('<Field.Label> was rendered as a <label> element, which does not match the `nativeLabel` prop on the component. Ensure that the element passed to the `render` prop of <Field.Label> is not a real <label>, or set the `nativeLabel` prop on the component to `true`.');
74
+ }
75
+ }, [nativeLabel]);
76
+ }
33
77
  useIsoLayoutEffect(() => {
34
78
  if (id) {
35
79
  setLabelId(id);
@@ -42,18 +86,14 @@ export const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(comp
42
86
  ref: [forwardedRef, labelRef],
43
87
  state: fieldRootContext.state,
44
88
  props: [{
45
- id: labelId,
89
+ id: labelId
90
+ }, nativeLabel ? {
46
91
  htmlFor: controlId ?? undefined,
47
- onMouseDown(event) {
48
- const target = getTarget(event.nativeEvent);
49
- if (target?.closest('button,input,select,textarea')) {
50
- return;
51
- }
52
-
53
- // Prevent text selection when double clicking label.
54
- if (!event.defaultPrevented && event.detail > 1) {
55
- event.preventDefault();
56
- }
92
+ onMouseDown: handleInteraction
93
+ } : {
94
+ onClick: handleInteraction,
95
+ onPointerDown(event) {
96
+ event.preventDefault();
57
97
  }
58
98
  }, elementProps],
59
99
  stateAttributesMapping: fieldValidityMapping
@@ -7,7 +7,7 @@ import { BaseUIComponentProps } from "../../utils/types.js";
7
7
  *
8
8
  * Documentation: [Base UI Field](https://base-ui.com/react/components/field)
9
9
  */
10
- export declare const FieldRoot: React.ForwardRefExoticComponent<FieldRootProps & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const FieldRoot: React.ForwardRefExoticComponent<Omit<FieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
11
  export interface FieldValidityData {
12
12
  state: {
13
13
  badInput: boolean;
@@ -27,6 +27,9 @@ export interface FieldValidityData {
27
27
  value: unknown;
28
28
  initialValue: unknown;
29
29
  }
30
+ export interface FieldRootActions {
31
+ validate: () => void;
32
+ }
30
33
  export interface FieldRootState {
31
34
  /** Whether the component should ignore user interaction. */
32
35
  disabled: boolean;
@@ -87,8 +90,14 @@ export interface FieldRootProps extends BaseUIComponentProps<'div', FieldRoot.St
87
90
  * Useful when the field state is controlled by an external library.
88
91
  */
89
92
  touched?: boolean;
93
+ /**
94
+ * A ref to imperative actions.
95
+ * - `validate`: Validates the field when called.
96
+ */
97
+ actionsRef?: React.RefObject<FieldRoot.Actions | null>;
90
98
  }
91
99
  export declare namespace FieldRoot {
92
100
  type State = FieldRootState;
93
101
  type Props = FieldRootProps;
102
+ type Actions = FieldRootActions;
94
103
  }
@@ -31,6 +31,7 @@ const FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(com
31
31
  invalid: invalidProp,
32
32
  dirty: dirtyProp,
33
33
  touched: touchedProp,
34
+ actionsRef,
34
35
  ...elementProps
35
36
  } = componentProps;
36
37
  const {
@@ -89,6 +90,13 @@ const FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(com
89
90
  name,
90
91
  shouldValidateOnChange
91
92
  });
93
+ const handleImperativeValidate = React.useCallback(() => {
94
+ markedDirtyRef.current = true;
95
+ validation.commit(validityData.value);
96
+ }, [validation, validityData]);
97
+ React.useImperativeHandle(actionsRef, () => ({
98
+ validate: handleImperativeValidate
99
+ }), [handleImperativeValidate]);
92
100
  const contextValue = React.useMemo(() => ({
93
101
  invalid,
94
102
  name,
@@ -47,14 +47,18 @@ export function useField(params) {
47
47
  name,
48
48
  controlRef,
49
49
  validityData: getCombinedFieldValidityData(validityData, invalid),
50
- validate() {
50
+ validate(flushSync = true) {
51
51
  let nextValue = value;
52
52
  if (nextValue === undefined) {
53
53
  nextValue = getValue();
54
54
  }
55
55
  markedDirtyRef.current = true;
56
- // Synchronously update the validity state so the submit event can be prevented.
57
- ReactDOM.flushSync(() => commit(nextValue));
56
+ if (!flushSync) {
57
+ commit(nextValue);
58
+ } else {
59
+ // Synchronously update the validity state so the submit event can be prevented.
60
+ ReactDOM.flushSync(() => commit(nextValue));
61
+ }
58
62
  }
59
63
  });
60
64
  }, [commit, controlRef, enabled, formRef, getValue, id, invalid, markedDirtyRef, name, validityData, value]);
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
6
6
  *
7
7
  * Documentation: [Base UI Fieldset](https://base-ui.com/react/components/fieldset)
8
8
  */
9
- export declare const FieldsetLegend: React.ForwardRefExoticComponent<FieldsetLegendProps & React.RefAttributes<HTMLDivElement>>;
9
+ export declare const FieldsetLegend: React.ForwardRefExoticComponent<Omit<FieldsetLegendProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
10
  export interface FieldsetLegendState {
11
11
  /**
12
12
  * Whether the component should ignore user interaction.
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
6
6
  *
7
7
  * Documentation: [Base UI Fieldset](https://base-ui.com/react/components/fieldset)
8
8
  */
9
- export declare const FieldsetRoot: React.ForwardRefExoticComponent<FieldsetRootProps & React.RefAttributes<HTMLElement>>;
9
+ export declare const FieldsetRoot: React.ForwardRefExoticComponent<Omit<FieldsetRootProps, "ref"> & React.RefAttributes<HTMLElement>>;
10
10
  export interface FieldsetRootState {
11
11
  /**
12
12
  * Whether the component should ignore user interaction.
@@ -156,6 +156,10 @@ export function FloatingFocusManager(props) {
156
156
  const tabbableIndexRef = React.useRef(-1);
157
157
  const closeTypeRef = React.useRef('');
158
158
  const lastInteractionTypeRef = React.useRef('');
159
+ const beforeGuardRef = React.useRef(null);
160
+ const afterGuardRef = React.useRef(null);
161
+ const mergedBeforeGuardRef = useMergedRefs(beforeGuardRef, beforeContentFocusGuardRef, portalContext?.beforeInsideRef);
162
+ const mergedAfterGuardRef = useMergedRefs(afterGuardRef, portalContext?.afterInsideRef);
159
163
  const blurTimeout = useTimeout();
160
164
  const pointerDownTimeout = useTimeout();
161
165
  const restoreFocusFrame = useAnimationFrame();
@@ -261,7 +265,8 @@ export function FloatingFocusManager(props) {
261
265
  queueMicrotask(() => {
262
266
  const nodeId = getNodeId();
263
267
  const triggers = store.context.triggerElements;
264
- const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext?.portalNode, relatedTarget) || relatedTarget != null && triggers.hasElement(relatedTarget) || triggers.hasMatchingElement(trigger => contains(trigger, relatedTarget)) || relatedTarget?.hasAttribute(createAttribute('focus-guard')) || tree && (getNodeChildren(tree.nodesRef.current, nodeId).find(node => contains(node.context?.elements.floating, relatedTarget) || contains(node.context?.elements.domReference, relatedTarget)) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => [node.context?.elements.floating, getFloatingFocusElement(node.context?.elements.floating)].includes(relatedTarget) || node.context?.elements.domReference === relatedTarget)));
268
+ const isRelatedFocusGuard = relatedTarget?.hasAttribute(createAttribute('focus-guard')) && [beforeGuardRef.current, afterGuardRef.current, portalContext?.beforeInsideRef.current, portalContext?.afterInsideRef.current, portalContext?.beforeOutsideRef.current, portalContext?.afterOutsideRef.current, resolveRef(previousFocusableElement), resolveRef(nextFocusableElement)].includes(relatedTarget);
269
+ const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext?.portalNode, relatedTarget) || relatedTarget != null && triggers.hasElement(relatedTarget) || triggers.hasMatchingElement(trigger => contains(trigger, relatedTarget)) || isRelatedFocusGuard || tree && (getNodeChildren(tree.nodesRef.current, nodeId).find(node => contains(node.context?.elements.floating, relatedTarget) || contains(node.context?.elements.domReference, relatedTarget)) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => [node.context?.elements.floating, getFloatingFocusElement(node.context?.elements.floating)].includes(relatedTarget) || node.context?.elements.domReference === relatedTarget)));
265
270
  if (currentTarget === domReference && floatingFocusElement) {
266
271
  handleTabIndex(floatingFocusElement, orderRef);
267
272
  }
@@ -355,11 +360,7 @@ export function FloatingFocusManager(props) {
355
360
  cleanup();
356
361
  });
357
362
  };
358
- }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, store, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef, blurTimeout, pointerDownTimeout, restoreFocusFrame]);
359
- const beforeGuardRef = React.useRef(null);
360
- const afterGuardRef = React.useRef(null);
361
- const mergedBeforeGuardRef = useMergedRefs(beforeGuardRef, beforeContentFocusGuardRef, portalContext?.beforeInsideRef);
362
- const mergedAfterGuardRef = useMergedRefs(afterGuardRef, portalContext?.afterInsideRef);
363
+ }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, store, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef, blurTimeout, pointerDownTimeout, restoreFocusFrame, nextFocusableElement, previousFocusableElement]);
363
364
  React.useEffect(() => {
364
365
  if (disabled || !floating || !open) {
365
366
  return undefined;
@@ -40,9 +40,9 @@ export declare function useFloatingPortalNode(props?: UseFloatingPortalNodeProps
40
40
  * @see https://floating-ui.com/docs/FloatingPortal
41
41
  * @internal
42
42
  */
43
- export declare const FloatingPortal: React.ForwardRefExoticComponent<FloatingPortal.Props<any> & {
43
+ export declare const FloatingPortal: React.ForwardRefExoticComponent<Omit<FloatingPortal.Props<any> & {
44
44
  renderGuards?: boolean;
45
- } & React.RefAttributes<HTMLDivElement>>;
45
+ }, "ref"> & React.RefAttributes<HTMLDivElement>>;
46
46
  export declare namespace FloatingPortal {
47
47
  interface Props<State> extends BaseUIComponentProps<'div', State> {
48
48
  /**
@@ -5,6 +5,7 @@ import * as ReactDOM from 'react-dom';
5
5
  import { isNode } from '@floating-ui/utils/dom';
6
6
  import { useId } from '@base-ui/utils/useId';
7
7
  import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
8
+ import { useStableCallback } from '@base-ui/utils/useStableCallback';
8
9
  import { FocusGuard } from "../../utils/FocusGuard.js";
9
10
  import { enableFocusInside, disableFocusInside, getPreviousTabbable, getNextTabbable, isOutsideEvent } from "../utils.js";
10
11
  import { createChangeEventDetails } from "../../utils/createBaseUIEventDetails.js";
@@ -30,6 +31,14 @@ export function useFloatingPortalNode(props = {}) {
30
31
  const parentPortalNode = portalContext?.portalNode;
31
32
  const [containerElement, setContainerElement] = React.useState(null);
32
33
  const [portalNode, setPortalNode] = React.useState(null);
34
+ const setPortalNodeRef = useStableCallback(node => {
35
+ if (node !== null) {
36
+ // the useIsoLayoutEffect below watching containerProp / parentPortalNode
37
+ // sets setPortalNode(null) when the container becomes null or changes.
38
+ // So even though the ref callback now ignores null, the portal node still gets cleared.
39
+ setPortalNode(node);
40
+ }
41
+ });
33
42
  const containerRef = React.useRef(null);
34
43
  useIsoLayoutEffect(() => {
35
44
  // Wait for the container to be resolved if explicitly `null`.
@@ -62,7 +71,7 @@ export function useFloatingPortalNode(props = {}) {
62
71
  }
63
72
  }, [containerProp, parentPortalNode, uniqueId]);
64
73
  const portalElement = useRenderElement('div', componentProps, {
65
- ref: [ref, setPortalNode],
74
+ ref: [ref, setPortalNodeRef],
66
75
  state: elementState,
67
76
  props: [{
68
77
  id: uniqueId,
@@ -125,7 +134,7 @@ export const FloatingPortal = /*#__PURE__*/React.forwardRef(function FloatingPor
125
134
  // portal has already been focused, either by tabbing into a focus trap
126
135
  // element outside or using the mouse.
127
136
  function onFocus(event) {
128
- if (portalNode && isOutsideEvent(event)) {
137
+ if (portalNode && event.relatedTarget && isOutsideEvent(event)) {
129
138
  const focusing = event.type === 'focusin';
130
139
  const manageFocus = focusing ? enableFocusInside : disableFocusInside;
131
140
  manageFocus(portalNode);
@@ -80,7 +80,7 @@ export function useClientPoint(context, props = {}) {
80
80
  const cleanupListenerRef = React.useRef(null);
81
81
  const [pointerType, setPointerType] = React.useState();
82
82
  const [reactive, setReactive] = React.useState([]);
83
- const setReference = useStableCallback((newX, newY) => {
83
+ const setReference = useStableCallback((newX, newY, referenceElement) => {
84
84
  if (initialRef.current) {
85
85
  return;
86
86
  }
@@ -91,7 +91,7 @@ export function useClientPoint(context, props = {}) {
91
91
  if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {
92
92
  return;
93
93
  }
94
- store.set('positionReference', createVirtualElement(domReference, {
94
+ store.set('positionReference', createVirtualElement(referenceElement ?? domReference, {
95
95
  x: newX,
96
96
  y: newY,
97
97
  axis,
@@ -104,7 +104,7 @@ export function useClientPoint(context, props = {}) {
104
104
  return;
105
105
  }
106
106
  if (!open) {
107
- setReference(event.clientX, event.clientY);
107
+ setReference(event.clientX, event.clientY, event.currentTarget);
108
108
  } else if (!cleanupListenerRef.current) {
109
109
  // If there's no cleanup, there's no listener, but we want to ensure
110
110
  // we add the listener if the cursor landed on the floating element and
@@ -176,6 +176,7 @@ export function useClientPoint(context, props = {}) {
176
176
  };
177
177
  }, [handleReferenceEnterOrMove]);
178
178
  return React.useMemo(() => enabled ? {
179
- reference
179
+ reference,
180
+ trigger: reference
180
181
  } : {}, [enabled, reference]);
181
182
  }
@@ -385,6 +385,7 @@ export function useDismiss(context, props = {}) {
385
385
  ancestor.removeEventListener('scroll', onScroll);
386
386
  });
387
387
  compositionTimeout.clear();
388
+ endedOrStartedInsideRef.current = false;
388
389
  };
389
390
  }, [dataRef, floatingElement, referenceElement, domReferenceElement, escapeKey, outsidePress, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, closeOnPressOutside, closeOnPressOutsideCapture, handlePointerDown, handleTouchStartCapture, handleTouchMoveCapture, handleTouchEndCapture, trackPointerType, store]);
390
391
  React.useEffect(clearInsideReactTree, [outsidePress, clearInsideReactTree]);
@@ -408,6 +409,12 @@ export function useDismiss(context, props = {}) {
408
409
  }
409
410
  endedOrStartedInsideRef.current = true;
410
411
  });
412
+ const markPressStartedInsideReactTree = useStableCallback(event => {
413
+ if (!open || !enabled || event.button !== 0) {
414
+ return;
415
+ }
416
+ endedOrStartedInsideRef.current = true;
417
+ });
411
418
  const floating = React.useMemo(() => ({
412
419
  onKeyDown: closeOnEscapeKeyDown,
413
420
  // `onMouseDown` may be blocked if `event.preventDefault()` is called in
@@ -417,12 +424,18 @@ export function useDismiss(context, props = {}) {
417
424
  onMouseDown: handlePressedInside,
418
425
  onMouseUp: handlePressedInside,
419
426
  onClickCapture: markInsideReactTree,
420
- onMouseDownCapture: markInsideReactTree,
421
- onPointerDownCapture: markInsideReactTree,
427
+ onMouseDownCapture(event) {
428
+ markInsideReactTree();
429
+ markPressStartedInsideReactTree(event);
430
+ },
431
+ onPointerDownCapture(event) {
432
+ markInsideReactTree();
433
+ markPressStartedInsideReactTree(event);
434
+ },
422
435
  onMouseUpCapture: markInsideReactTree,
423
436
  onTouchEndCapture: markInsideReactTree,
424
437
  onTouchMoveCapture: markInsideReactTree
425
- }), [closeOnEscapeKeyDown, handlePressedInside, markInsideReactTree]);
438
+ }), [closeOnEscapeKeyDown, handlePressedInside, markInsideReactTree, markPressStartedInsideReactTree]);
426
439
  return React.useMemo(() => enabled ? {
427
440
  reference,
428
441
  floating,
@@ -12,6 +12,11 @@ export interface UseFocusProps {
12
12
  * @default true
13
13
  */
14
14
  visibleOnly?: boolean;
15
+ /**
16
+ * Waits for the specified time before opening.
17
+ * @default undefined
18
+ */
19
+ delay?: number | (() => number | undefined);
15
20
  }
16
21
  /**
17
22
  * Opens the floating element while the reference element has focus, like CSS
@@ -20,9 +20,12 @@ export function useFocus(context, props = {}) {
20
20
  } = store.context;
21
21
  const {
22
22
  enabled = true,
23
- visibleOnly = true
23
+ visibleOnly = true,
24
+ delay
24
25
  } = props;
25
26
  const blockFocusRef = React.useRef(false);
27
+ // Track which reference should be blocked from re-opening after Escape/press dismissal.
28
+ const blockedReferenceRef = React.useRef(null);
26
29
  const timeout = useTimeout();
27
30
  const keyboardModalityRef = React.useRef(true);
28
31
  React.useEffect(() => {
@@ -36,7 +39,8 @@ export function useFocus(context, props = {}) {
36
39
  // floating element was not open, the focus should be blocked when they
37
40
  // return to the tab/window.
38
41
  function onBlur() {
39
- if (!store.select('open') && isHTMLElement(domReference) && domReference === activeElement(getDocument(domReference))) {
42
+ const currentDomReference = store.select('domReferenceElement');
43
+ if (!store.select('open') && isHTMLElement(currentDomReference) && currentDomReference === activeElement(getDocument(currentDomReference))) {
40
44
  blockFocusRef.current = true;
41
45
  }
42
46
  }
@@ -65,21 +69,31 @@ export function useFocus(context, props = {}) {
65
69
  }
66
70
  function onOpenChangeLocal(details) {
67
71
  if (details.reason === REASONS.triggerPress || details.reason === REASONS.escapeKey) {
68
- blockFocusRef.current = true;
72
+ const referenceElement = store.select('domReferenceElement');
73
+ if (isElement(referenceElement)) {
74
+ blockedReferenceRef.current = referenceElement;
75
+ blockFocusRef.current = true;
76
+ }
69
77
  }
70
78
  }
71
79
  events.on('openchange', onOpenChangeLocal);
72
80
  return () => {
73
81
  events.off('openchange', onOpenChangeLocal);
74
82
  };
75
- }, [events, enabled]);
83
+ }, [events, enabled, store]);
76
84
  const reference = React.useMemo(() => ({
77
85
  onMouseLeave() {
78
86
  blockFocusRef.current = false;
87
+ blockedReferenceRef.current = null;
79
88
  },
80
89
  onFocus(event) {
90
+ const focusTarget = event.currentTarget;
81
91
  if (blockFocusRef.current) {
82
- return;
92
+ if (blockedReferenceRef.current === focusTarget) {
93
+ return;
94
+ }
95
+ blockFocusRef.current = false;
96
+ blockedReferenceRef.current = null;
83
97
  }
84
98
  const target = getTarget(event.nativeEvent);
85
99
  if (visibleOnly && isElement(target)) {
@@ -93,10 +107,26 @@ export function useFocus(context, props = {}) {
93
107
  return;
94
108
  }
95
109
  }
96
- store.setOpen(true, createChangeEventDetails(REASONS.triggerFocus, event.nativeEvent, event.currentTarget));
110
+ const movedFromOtherTrigger = event.relatedTarget && store.context.triggerElements.hasElement(event.relatedTarget);
111
+ const {
112
+ nativeEvent,
113
+ currentTarget
114
+ } = event;
115
+ const delayValue = typeof delay === 'function' ? delay() : delay;
116
+ if (store.select('open') && movedFromOtherTrigger || delayValue === 0 || delayValue === undefined) {
117
+ store.setOpen(true, createChangeEventDetails(REASONS.triggerFocus, nativeEvent, currentTarget));
118
+ return;
119
+ }
120
+ timeout.start(delayValue, () => {
121
+ if (blockFocusRef.current) {
122
+ return;
123
+ }
124
+ store.setOpen(true, createChangeEventDetails(REASONS.triggerFocus, nativeEvent, currentTarget));
125
+ });
97
126
  },
98
127
  onBlur(event) {
99
128
  blockFocusRef.current = false;
129
+ blockedReferenceRef.current = null;
100
130
  const relatedTarget = event.relatedTarget;
101
131
  const nativeEvent = event.nativeEvent;
102
132
 
@@ -128,13 +158,17 @@ export function useFocus(context, props = {}) {
128
158
  // If the next focused element is one of the triggers, do not close
129
159
  // the floating element. The focus handler of that trigger will
130
160
  // handle the open state.
131
- if (store.context.triggerElements.hasElement(event.relatedTarget)) {
132
- return;
161
+ const nextFocusedElement = relatedTarget ?? activeEl;
162
+ if (isElement(nextFocusedElement)) {
163
+ const triggerElements = store.context.triggerElements;
164
+ if (triggerElements.hasElement(nextFocusedElement) || triggerElements.hasMatchingElement(trigger => contains(trigger, nextFocusedElement))) {
165
+ return;
166
+ }
133
167
  }
134
168
  store.setOpen(false, createChangeEventDetails(REASONS.triggerFocus, nativeEvent));
135
169
  });
136
170
  }
137
- }), [dataRef, store, visibleOnly, timeout]);
171
+ }), [dataRef, store, visibleOnly, timeout, delay]);
138
172
  return React.useMemo(() => enabled ? {
139
173
  reference,
140
174
  trigger: reference
@@ -158,8 +158,13 @@ export function useHoverReferenceInteraction(context, props = {}) {
158
158
  const allTriggers = store.context.triggerElements;
159
159
  const isOverInactiveTrigger = (allTriggers.hasElement(event.target) || allTriggers.hasMatchingElement(t => contains(t, event.target))) && (!currentDomReference || !contains(currentDomReference, event.target));
160
160
  const triggerNode = event.currentTarget ?? null;
161
- const shouldOpen = !store.select('open') || isOverInactiveTrigger;
162
- if (openDelay) {
161
+ const isOpen = store.select('open');
162
+ const shouldOpen = !isOpen || isOverInactiveTrigger;
163
+
164
+ // When moving between triggers while already open, open immediately without delay
165
+ if (isOverInactiveTrigger && isOpen) {
166
+ store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
167
+ } else if (openDelay) {
163
168
  openChangeTimeout.start(openDelay, () => {
164
169
  if (shouldOpen) {
165
170
  store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, event, triggerNode));
@@ -263,7 +268,15 @@ export function useHoverReferenceInteraction(context, props = {}) {
263
268
  }
264
269
  restTimeout.clear();
265
270
  function handleMouseMove() {
266
- if (!blockMouseMoveRef.current && (!currentOpen || isOverInactiveTrigger)) {
271
+ restTimeoutPendingRef.current = false;
272
+
273
+ // A delayed hover open should not override a click-like open that happened
274
+ // while the hover delay was pending.
275
+ if (isClickLikeOpenEvent()) {
276
+ return;
277
+ }
278
+ const latestOpen = store.select('open');
279
+ if (!blockMouseMoveRef.current && (!latestOpen || isOverInactiveTrigger)) {
267
280
  store.setOpen(true, createChangeEventDetails(REASONS.triggerHover, nativeEvent, trigger));
268
281
  }
269
282
  }
@@ -279,5 +292,5 @@ export function useHoverReferenceInteraction(context, props = {}) {
279
292
  }
280
293
  }
281
294
  };
282
- }, [blockMouseMoveRef, mouseOnly, store, pointerTypeRef, restMsRef, restTimeout, restTimeoutPendingRef]);
295
+ }, [blockMouseMoveRef, isClickLikeOpenEvent, mouseOnly, store, pointerTypeRef, restMsRef, restTimeout, restTimeoutPendingRef]);
283
296
  }
@@ -41,6 +41,9 @@ export function useSyncedFloatingRootContext(options) {
41
41
  if (isElement(referenceElement)) {
42
42
  valuesToSync.domReferenceElement = referenceElement;
43
43
  }
44
+ if (store.state.positionReference === store.state.referenceElement) {
45
+ valuesToSync.positionReference = referenceElement;
46
+ }
44
47
  store.update(valuesToSync);
45
48
  }, [open, floatingId, referenceElement, floatingElement, store]);
46
49
 
@@ -16,6 +16,10 @@ export declare const Form: {
16
16
  };
17
17
  export type FormSubmitEventReason = typeof REASONS.none;
18
18
  export type FormSubmitEventDetails = BaseUIGenericEventDetails<Form.SubmitEventReason>;
19
+ export type FormValidationMode = 'onSubmit' | 'onBlur' | 'onChange';
20
+ export interface FormActions {
21
+ validate: (fieldName?: string | undefined) => void;
22
+ }
19
23
  export interface FormState {}
20
24
  export interface FormProps<FormValues extends Record<string, any> = Record<string, any>> extends BaseUIComponentProps<'form', Form.State> {
21
25
  /**
@@ -40,11 +44,24 @@ export interface FormProps<FormValues extends Record<string, any> = Record<strin
40
44
  * `preventDefault()` is called on the native submit event when used.
41
45
  */
42
46
  onFormSubmit?: (formValues: FormValues, eventDetails: Form.SubmitEventDetails) => void;
47
+ /**
48
+ * A ref to imperative actions.
49
+ * - `validate`: Validates all fields when called. Optionally pass a field name to validate a single field.
50
+ * @example
51
+ * ```tsx
52
+ * // validate all fields
53
+ * actionsRef.current.validate();
54
+ *
55
+ * // validate one field
56
+ * actionsRef.current.validate('email');
57
+ * ```
58
+ */
59
+ actionsRef?: React.RefObject<Form.Actions | null>;
43
60
  }
44
- export type FormValidationMode = 'onSubmit' | 'onBlur' | 'onChange';
45
61
  export declare namespace Form {
46
62
  type Props<FormValues extends Record<string, any> = Record<string, any>> = FormProps<FormValues>;
47
63
  type State = FormState;
64
+ type Actions = FormActions;
48
65
  type ValidationMode = FormValidationMode;
49
66
  type SubmitEventReason = FormSubmitEventReason;
50
67
  type SubmitEventDetails = FormSubmitEventDetails;
package/esm/form/Form.js CHANGED
@@ -24,6 +24,7 @@ export const Form = /*#__PURE__*/React.forwardRef(function Form(componentProps,
24
24
  errors: externalErrors,
25
25
  onSubmit,
26
26
  onFormSubmit,
27
+ actionsRef,
27
28
  ...elementProps
28
29
  } = componentProps;
29
30
  const formRef = React.useRef({
@@ -54,6 +55,22 @@ export const Form = /*#__PURE__*/React.forwardRef(function Form(componentProps,
54
55
  focusControl(invalidFields[0].controlRef.current);
55
56
  }
56
57
  }, [errors, focusControl]);
58
+ const handleImperativeValidate = React.useCallback(fieldName => {
59
+ const values = Array.from(formRef.current.fields.values());
60
+ if (fieldName) {
61
+ const namedField = values.find(field => field.name === fieldName);
62
+ if (namedField) {
63
+ namedField.validate(false);
64
+ }
65
+ } else {
66
+ values.forEach(field => {
67
+ field.validate(false);
68
+ });
69
+ }
70
+ }, []);
71
+ React.useImperativeHandle(actionsRef, () => ({
72
+ validate: handleImperativeValidate
73
+ }), [handleImperativeValidate]);
57
74
  const element = useRenderElement('form', componentProps, {
58
75
  ref: forwardedRef,
59
76
  props: [{