@base-ui/react 1.0.0 → 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 +144 -1
  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
@@ -25,6 +25,8 @@ import { REASONS } from "../../utils/reasons.js";
25
25
  import { useToolbarRootContext } from "../../toolbar/root/ToolbarRootContext.js";
26
26
  import { COMPOSITE_KEYS } from "../../composite/composite.js";
27
27
  import { getDisabledMountTransitionStyles } from "../../utils/getDisabledMountTransitionStyles.js";
28
+ import { clamp } from "../../utils/clamp.js";
29
+ import { useCSPContext } from "../../csp-provider/CSPContext.js";
28
30
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
29
31
  const stateAttributesMapping = {
30
32
  ...popupStateMapping,
@@ -53,7 +55,8 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
53
55
  keyboardActiveRef,
54
56
  multiple,
55
57
  handleScrollArrowVisibility,
56
- scrollHandlerRef
58
+ scrollHandlerRef,
59
+ highlightItemOnHover
57
60
  } = useSelectRootContext();
58
61
  const {
59
62
  side,
@@ -65,6 +68,10 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
65
68
  } = useSelectPositionerContext();
66
69
  const insideToolbar = useToolbarRootContext(true) != null;
67
70
  const floatingRootContext = useSelectFloatingContext();
71
+ const {
72
+ nonce,
73
+ disableStyleElements
74
+ } = useCSPContext();
68
75
  const highlightTimeout = useTimeout();
69
76
  const id = useStore(store, selectors.id);
70
77
  const open = useStore(store, selectors.open);
@@ -95,12 +102,13 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
95
102
  const positionerStyles = getComputedStyle(positionerElement);
96
103
  const marginTop = parseFloat(positionerStyles.marginTop);
97
104
  const marginBottom = parseFloat(positionerStyles.marginBottom);
105
+ const maxPopupHeight = getMaxPopupHeight(getComputedStyle(popupRef.current));
98
106
  const viewportHeight = doc.documentElement.clientHeight - marginTop - marginBottom;
99
107
  const scrollTop = scroller.scrollTop;
100
108
  const scrollHeight = scroller.scrollHeight;
101
109
  const clientHeight = scroller.clientHeight;
102
110
  const maxScrollTop = scrollHeight - clientHeight;
103
- let nextPositionerHeight = null;
111
+ let nextPositionerHeight = 0;
104
112
  let nextScrollTop = null;
105
113
  let setReachedMax = false;
106
114
  if (isTopPositioned) {
@@ -128,13 +136,13 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
128
136
  }
129
137
  }
130
138
  }
131
- if (nextPositionerHeight != null) {
139
+ if (nextPositionerHeight !== 0) {
132
140
  positionerElement.style.height = `${nextPositionerHeight}px`;
133
141
  }
134
142
  if (nextScrollTop != null) {
135
143
  scroller.scrollTop = nextScrollTop;
136
144
  }
137
- if (setReachedMax) {
145
+ if (setReachedMax || nextPositionerHeight >= maxPopupHeight) {
138
146
  reachedMaxHeightRef.current = true;
139
147
  }
140
148
  handleScrollArrowVisibility();
@@ -172,7 +180,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
172
180
  };
173
181
  }, [popupRef, positionerElement]);
174
182
  useIsoLayoutEffect(() => {
175
- if (mounted || alignItemWithTriggerActive) {
183
+ if (open || alignItemWithTriggerActive) {
176
184
  return;
177
185
  }
178
186
  initialPlacedRef.current = false;
@@ -180,109 +188,128 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
180
188
  initialHeightRef.current = 0;
181
189
  maxHeightRef.current = 0;
182
190
  clearStyles(positionerElement, originalPositionerStylesRef.current);
183
- }, [mounted, alignItemWithTriggerActive, positionerElement, popupRef]);
191
+ }, [open, alignItemWithTriggerActive, positionerElement, popupRef]);
184
192
  useIsoLayoutEffect(() => {
185
193
  const popupElement = popupRef.current;
186
- if (!mounted || !triggerElement || !positionerElement || !popupElement) {
194
+ if (!open || !triggerElement || !positionerElement || !popupElement || store.state.transitionStatus === 'ending') {
187
195
  return;
188
196
  }
189
197
  if (!alignItemWithTriggerActive) {
190
198
  initialPlacedRef.current = true;
191
199
  scrollArrowFrame.request(handleScrollArrowVisibility);
200
+ popupElement.style.removeProperty('--transform-origin');
192
201
  return;
193
202
  }
194
203
 
195
204
  // Wait for `selectedItemTextRef.current` to be set.
196
205
  queueMicrotask(() => {
197
- const positionerStyles = getComputedStyle(positionerElement);
198
- const popupStyles = getComputedStyle(popupElement);
199
- const doc = ownerDocument(triggerElement);
200
- const win = ownerWindow(positionerElement);
201
- const triggerRect = triggerElement.getBoundingClientRect();
202
- const positionerRect = positionerElement.getBoundingClientRect();
203
- const triggerX = triggerRect.left;
204
- const triggerHeight = triggerRect.height;
205
- const scroller = listElement || popupElement;
206
- const scrollHeight = scroller.scrollHeight;
207
- const borderBottom = parseFloat(popupStyles.borderBottomWidth);
208
- const marginTop = parseFloat(positionerStyles.marginTop) || 10;
209
- const marginBottom = parseFloat(positionerStyles.marginBottom) || 10;
210
- const minHeight = parseFloat(positionerStyles.minHeight) || 100;
211
- const paddingLeft = 5;
212
- const paddingRight = 5;
213
- const triggerCollisionThreshold = 20;
214
- const viewportHeight = doc.documentElement.clientHeight - marginTop - marginBottom;
215
- const viewportWidth = doc.documentElement.clientWidth;
216
- const availableSpaceBeneathTrigger = viewportHeight - triggerRect.bottom + triggerHeight;
217
- const textElement = selectedItemTextRef.current;
218
- const valueElement = valueRef.current;
219
- let offsetX = 0;
220
- let offsetY = 0;
221
- if (textElement && valueElement) {
222
- const valueRect = valueElement.getBoundingClientRect();
223
- const textRect = textElement.getBoundingClientRect();
224
- const valueLeftFromTriggerLeft = valueRect.left - triggerX;
225
- const textLeftFromPositionerLeft = textRect.left - positionerRect.left;
226
- const valueCenterFromPositionerTop = valueRect.top - triggerRect.top + valueRect.height / 2;
227
- const textCenterFromTriggerTop = textRect.top - positionerRect.top + textRect.height / 2;
228
- offsetX = valueLeftFromTriggerLeft - textLeftFromPositionerLeft;
229
- offsetY = textCenterFromTriggerTop - valueCenterFromPositionerTop;
230
- }
231
- const idealHeight = availableSpaceBeneathTrigger + offsetY + marginBottom + borderBottom;
232
- let height = Math.min(viewportHeight, idealHeight);
233
- const maxHeight = viewportHeight - marginTop - marginBottom;
234
- const scrollTop = idealHeight - height;
235
- const left = Math.max(paddingLeft, triggerX + offsetX);
236
- const maxRight = viewportWidth - paddingRight;
237
- const rightOverflow = Math.max(0, left + positionerRect.width - maxRight);
238
- positionerElement.style.left = `${left - rightOverflow}px`;
239
- positionerElement.style.height = `${height}px`;
240
- positionerElement.style.maxHeight = 'auto';
241
- positionerElement.style.marginTop = `${marginTop}px`;
242
- positionerElement.style.marginBottom = `${marginBottom}px`;
243
- popupElement.style.height = '100%';
244
- const maxScrollTop = scroller.scrollHeight - scroller.clientHeight;
245
- const isTopPositioned = scrollTop >= maxScrollTop;
246
- if (isTopPositioned) {
247
- height = Math.min(viewportHeight, positionerRect.height) - (scrollTop - maxScrollTop);
248
- }
206
+ // Ensure we remove any transforms that can affect the location of the popup
207
+ // and therefore the calculations.
208
+ const restoreTransformStyles = unsetTransformStyles(popupElement);
209
+ popupElement.style.removeProperty('--transform-origin');
210
+ try {
211
+ const positionerStyles = getComputedStyle(positionerElement);
212
+ const popupStyles = getComputedStyle(popupElement);
213
+ const doc = ownerDocument(triggerElement);
214
+ const win = ownerWindow(positionerElement);
215
+ const triggerRect = triggerElement.getBoundingClientRect();
216
+ const positionerRect = positionerElement.getBoundingClientRect();
217
+ const triggerX = triggerRect.left;
218
+ const triggerHeight = triggerRect.height;
219
+ const scroller = listElement || popupElement;
220
+ const scrollHeight = scroller.scrollHeight;
221
+ const borderBottom = parseFloat(popupStyles.borderBottomWidth);
222
+ const marginTop = parseFloat(positionerStyles.marginTop) || 10;
223
+ const marginBottom = parseFloat(positionerStyles.marginBottom) || 10;
224
+ const minHeight = parseFloat(positionerStyles.minHeight) || 100;
225
+ const maxPopupHeight = getMaxPopupHeight(popupStyles);
226
+ const paddingLeft = 5;
227
+ const paddingRight = 5;
228
+ const triggerCollisionThreshold = 20;
229
+ const viewportHeight = doc.documentElement.clientHeight - marginTop - marginBottom;
230
+ const viewportWidth = doc.documentElement.clientWidth;
231
+ const availableSpaceBeneathTrigger = viewportHeight - triggerRect.bottom + triggerHeight;
232
+ const textElement = selectedItemTextRef.current;
233
+ const valueElement = valueRef.current;
234
+ let textRect;
235
+ let offsetX = 0;
236
+ let offsetY = 0;
237
+ if (textElement && valueElement) {
238
+ const valueRect = valueElement.getBoundingClientRect();
239
+ textRect = textElement.getBoundingClientRect();
240
+ const valueLeftFromTriggerLeft = valueRect.left - triggerX;
241
+ const textLeftFromPositionerLeft = textRect.left - positionerRect.left;
242
+ const valueCenterFromPositionerTop = valueRect.top - triggerRect.top + valueRect.height / 2;
243
+ const textCenterFromTriggerTop = textRect.top - positionerRect.top + textRect.height / 2;
244
+ offsetX = valueLeftFromTriggerLeft - textLeftFromPositionerLeft;
245
+ offsetY = textCenterFromTriggerTop - valueCenterFromPositionerTop;
246
+ }
247
+ const idealHeight = availableSpaceBeneathTrigger + offsetY + marginBottom + borderBottom;
248
+ let height = Math.min(viewportHeight, idealHeight);
249
+ const maxHeight = viewportHeight - marginTop - marginBottom;
250
+ const scrollTop = idealHeight - height;
251
+ const left = Math.max(paddingLeft, triggerX + offsetX);
252
+ const maxRight = viewportWidth - paddingRight;
253
+ const rightOverflow = Math.max(0, left + positionerRect.width - maxRight);
254
+ positionerElement.style.left = `${left - rightOverflow}px`;
255
+ positionerElement.style.height = `${height}px`;
256
+ positionerElement.style.maxHeight = 'auto';
257
+ positionerElement.style.marginTop = `${marginTop}px`;
258
+ positionerElement.style.marginBottom = `${marginBottom}px`;
259
+ popupElement.style.height = '100%';
260
+ const maxScrollTop = scroller.scrollHeight - scroller.clientHeight;
261
+ const isTopPositioned = scrollTop >= maxScrollTop;
262
+ if (isTopPositioned) {
263
+ height = Math.min(viewportHeight, positionerRect.height) - (scrollTop - maxScrollTop);
264
+ }
249
265
 
250
- // When the trigger is too close to the top or bottom of the viewport, or the minHeight is
251
- // reached, we fallback to aligning the popup to the trigger as the UX is poor otherwise.
252
- const fallbackToAlignPopupToTrigger = triggerRect.top < triggerCollisionThreshold || triggerRect.bottom > viewportHeight - triggerCollisionThreshold || height < Math.min(scrollHeight, minHeight);
266
+ // When the trigger is too close to the top or bottom of the viewport, or the minHeight is
267
+ // reached, we fallback to aligning the popup to the trigger as the UX is poor otherwise.
268
+ const fallbackToAlignPopupToTrigger = triggerRect.top < triggerCollisionThreshold || triggerRect.bottom > viewportHeight - triggerCollisionThreshold || height < Math.min(scrollHeight, minHeight);
253
269
 
254
- // Safari doesn't position the popup correctly when pinch-zoomed.
255
- const isPinchZoomed = (win.visualViewport?.scale ?? 1) !== 1 && isWebKit;
256
- if (fallbackToAlignPopupToTrigger || isPinchZoomed) {
257
- initialPlacedRef.current = true;
258
- clearStyles(positionerElement, originalPositionerStylesRef.current);
259
- ReactDOM.flushSync(() => setControlledAlignItemWithTrigger(false));
260
- return;
261
- }
262
- if (isTopPositioned) {
263
- const topOffset = Math.max(0, viewportHeight - idealHeight);
264
- positionerElement.style.top = positionerRect.height >= maxHeight ? '0' : `${topOffset}px`;
265
- positionerElement.style.height = `${height}px`;
266
- scroller.scrollTop = scroller.scrollHeight - scroller.clientHeight;
267
- initialHeightRef.current = Math.max(minHeight, height);
268
- } else {
269
- positionerElement.style.bottom = '0';
270
- initialHeightRef.current = Math.max(minHeight, height);
271
- scroller.scrollTop = scrollTop;
272
- }
273
- if (initialHeightRef.current === viewportHeight) {
274
- reachedMaxHeightRef.current = true;
275
- }
276
- handleScrollArrowVisibility();
270
+ // Safari doesn't position the popup correctly when pinch-zoomed.
271
+ const isPinchZoomed = (win.visualViewport?.scale ?? 1) !== 1 && isWebKit;
272
+ if (fallbackToAlignPopupToTrigger || isPinchZoomed) {
273
+ initialPlacedRef.current = true;
274
+ clearStyles(positionerElement, originalPositionerStylesRef.current);
275
+ ReactDOM.flushSync(() => setControlledAlignItemWithTrigger(false));
276
+ return;
277
+ }
278
+ if (isTopPositioned) {
279
+ const topOffset = Math.max(0, viewportHeight - idealHeight);
280
+ positionerElement.style.top = positionerRect.height >= maxHeight ? '0' : `${topOffset}px`;
281
+ positionerElement.style.height = `${height}px`;
282
+ scroller.scrollTop = scroller.scrollHeight - scroller.clientHeight;
283
+ initialHeightRef.current = Math.max(minHeight, height);
284
+ } else {
285
+ positionerElement.style.bottom = '0';
286
+ initialHeightRef.current = Math.max(minHeight, height);
287
+ scroller.scrollTop = scrollTop;
288
+ }
289
+ if (textRect) {
290
+ const popupTop = positionerRect.top;
291
+ const popupHeight = positionerRect.height;
292
+ const textCenterY = textRect.top + textRect.height / 2;
293
+ const transformOriginY = popupHeight > 0 ? (textCenterY - popupTop) / popupHeight * 100 : 50;
294
+ const clampedY = clamp(transformOriginY, 0, 100);
295
+ popupElement.style.setProperty('--transform-origin', `50% ${clampedY}%`);
296
+ }
297
+ if (initialHeightRef.current === viewportHeight || height >= maxPopupHeight) {
298
+ reachedMaxHeightRef.current = true;
299
+ }
300
+ handleScrollArrowVisibility();
277
301
 
278
- // Avoid the `onScroll` event logic from triggering before the popup is placed.
279
- setTimeout(() => {
280
- initialPlacedRef.current = true;
281
- });
302
+ // Avoid the `onScroll` event logic from triggering before the popup is placed.
303
+ setTimeout(() => {
304
+ initialPlacedRef.current = true;
305
+ });
306
+ } finally {
307
+ restoreTransformStyles();
308
+ }
282
309
  });
283
- }, [store, mounted, positionerElement, triggerElement, valueRef, selectedItemTextRef, popupRef, handleScrollArrowVisibility, alignItemWithTriggerActive, setControlledAlignItemWithTrigger, scrollArrowFrame, scrollDownArrowRef, scrollUpArrowRef, listElement]);
310
+ }, [store, open, positionerElement, triggerElement, valueRef, selectedItemTextRef, popupRef, handleScrollArrowVisibility, alignItemWithTriggerActive, setControlledAlignItemWithTrigger, scrollArrowFrame, scrollDownArrowRef, scrollUpArrowRef, listElement]);
284
311
  React.useEffect(() => {
285
- if (!alignItemWithTriggerActive || !positionerElement || !mounted) {
312
+ if (!alignItemWithTriggerActive || !positionerElement || !open) {
286
313
  return undefined;
287
314
  }
288
315
  const win = ownerWindow(positionerElement);
@@ -293,7 +320,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
293
320
  return () => {
294
321
  win.removeEventListener('resize', handleResize);
295
322
  };
296
- }, [setOpen, alignItemWithTriggerActive, positionerElement, mounted]);
323
+ }, [setOpen, alignItemWithTriggerActive, positionerElement, open]);
297
324
  const defaultProps = {
298
325
  ...(listElement ? {
299
326
  role: 'presentation',
@@ -313,7 +340,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
313
340
  keyboardActiveRef.current = false;
314
341
  },
315
342
  onPointerLeave(event) {
316
- if (isMouseWithinBounds(event) || event.pointerType === 'touch') {
343
+ if (!highlightItemOnHover || isMouseWithinBounds(event) || event.pointerType === 'touch') {
317
344
  return;
318
345
  }
319
346
  const popup = event.currentTarget;
@@ -345,7 +372,7 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
345
372
  }, elementProps]
346
373
  });
347
374
  return /*#__PURE__*/_jsxs(React.Fragment, {
348
- children: [styleDisableScrollbar.element, /*#__PURE__*/_jsx(FloatingFocusManager, {
375
+ children: [!disableStyleElements && styleDisableScrollbar.getElement(nonce), /*#__PURE__*/_jsx(FloatingFocusManager, {
349
376
  context: floatingRootContext,
350
377
  modal: false,
351
378
  disabled: !mounted,
@@ -354,4 +381,36 @@ export const SelectPopup = /*#__PURE__*/React.forwardRef(function SelectPopup(co
354
381
  })]
355
382
  });
356
383
  });
357
- if (process.env.NODE_ENV !== "production") SelectPopup.displayName = "SelectPopup";
384
+ if (process.env.NODE_ENV !== "production") SelectPopup.displayName = "SelectPopup";
385
+ function getMaxPopupHeight(popupStyles) {
386
+ const maxHeightStyle = popupStyles.maxHeight || '';
387
+ return maxHeightStyle.endsWith('px') ? parseFloat(maxHeightStyle) || Infinity : Infinity;
388
+ }
389
+ const UNSET_TRANSFORM_STYLES = {
390
+ transform: 'none',
391
+ scale: '1',
392
+ translate: '0 0'
393
+ };
394
+ function restoreInlineStyleProperty(style, property, value) {
395
+ if (value) {
396
+ style.setProperty(property, value);
397
+ } else {
398
+ style.removeProperty(property);
399
+ }
400
+ }
401
+ function unsetTransformStyles(popupElement) {
402
+ const {
403
+ style
404
+ } = popupElement;
405
+ const originalStyles = {};
406
+ const props = Object.keys(UNSET_TRANSFORM_STYLES);
407
+ for (const prop of props) {
408
+ originalStyles[prop] = style.getPropertyValue(prop);
409
+ style.setProperty(prop, UNSET_TRANSFORM_STYLES[prop]);
410
+ }
411
+ return () => {
412
+ for (const prop of props) {
413
+ restoreInlineStyleProperty(style, prop, originalStyles[prop]);
414
+ }
415
+ };
416
+ }
@@ -7,7 +7,7 @@ import { FloatingPortal } from "../../floating-ui-react/index.js";
7
7
  *
8
8
  * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
9
9
  */
10
- export declare const SelectPortal: React.ForwardRefExoticComponent<SelectPortalProps & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const SelectPortal: React.ForwardRefExoticComponent<Omit<SelectPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
11
  export declare namespace SelectPortal {
12
12
  interface State {}
13
13
  }
@@ -7,7 +7,7 @@ import { useAnchorPositioning, type Align, type Side } from "../../utils/useAnch
7
7
  *
8
8
  * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
9
9
  */
10
- export declare const SelectPositioner: React.ForwardRefExoticComponent<SelectPositionerProps & React.RefAttributes<HTMLDivElement>>;
10
+ export declare const SelectPositioner: React.ForwardRefExoticComponent<Omit<SelectPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
11
  export interface SelectPositionerState {
12
12
  open: boolean;
13
13
  side: Side | 'none';
@@ -70,7 +70,7 @@ export interface SelectRootProps<Value, Multiple extends boolean | undefined = f
70
70
  open?: boolean;
71
71
  /**
72
72
  * Determines if the select enters a modal state when open.
73
- * - `true`: user interaction is limited to the select: document page scroll is locked and and pointer interactions on outside elements are disabled.
73
+ * - `true`: user interaction is limited to the select: document page scroll is locked and pointer interactions on outside elements are disabled.
74
74
  * - `false`: user interaction with the rest of the document is allowed.
75
75
  * @default true
76
76
  */
@@ -81,7 +81,7 @@ export interface SelectRootProps<Value, Multiple extends boolean | undefined = f
81
81
  * Instead, the `unmount` function must be called to unmount the select manually.
82
82
  * Useful when the select's animation is controlled by an external library.
83
83
  */
84
- actionsRef?: React.RefObject<SelectRootActions>;
84
+ actionsRef?: React.RefObject<SelectRootActions | null>;
85
85
  /**
86
86
  * Data structure of the items rendered in the select popup.
87
87
  * When specified, `<Select.Value>` renders the label of the selected item instead of the raw value.
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import * as React from 'react';
4
- import { visuallyHidden } from '@base-ui/utils/visuallyHidden';
4
+ import { visuallyHidden, visuallyHiddenInput } from '@base-ui/utils/visuallyHidden';
5
5
  import { useMergedRefs } from '@base-ui/utils/useMergedRefs';
6
6
  import { useRefWithInit } from '@base-ui/utils/useRefWithInit';
7
7
  import { useOnFirstRender } from '@base-ui/utils/useOnFirstRender';
@@ -13,7 +13,6 @@ import { useStore, Store } from '@base-ui/utils/store';
13
13
  import { useClick, useDismiss, useFloatingRootContext, useInteractions, useListNavigation, useTypeahead } from "../../floating-ui-react/index.js";
14
14
  import { SelectRootContext, SelectFloatingContext } from "./SelectRootContext.js";
15
15
  import { useFieldRootContext } from "../../field/root/FieldRootContext.js";
16
- import { useLabelableContext } from "../../labelable-provider/LabelableContext.js";
17
16
  import { useLabelableId } from "../../labelable-provider/useLabelableId.js";
18
17
  import { useTransitionStatus } from "../../utils/useTransitionStatus.js";
19
18
  import { selectors } from "../store.js";
@@ -23,7 +22,7 @@ import { useOpenChangeComplete } from "../../utils/useOpenChangeComplete.js";
23
22
  import { useFormContext } from "../../form/FormContext.js";
24
23
  import { useField } from "../../field/useField.js";
25
24
  import { stringifyAsValue } from "../../utils/resolveValueLabel.js";
26
- import { EMPTY_ARRAY } from "../../utils/constants.js";
25
+ import { EMPTY_ARRAY, EMPTY_OBJECT } from "../../utils/constants.js";
27
26
  import { defaultItemEquality, findItemIndex } from "../../utils/itemEquality.js";
28
27
  import { useValueChanged } from "../../utils/useValueChanged.js";
29
28
  import { useOpenInteractionType } from "../../utils/useOpenInteractionType.js";
@@ -66,16 +65,16 @@ export function SelectRoot(props) {
66
65
  } = useFormContext();
67
66
  const {
68
67
  setDirty,
68
+ setTouched,
69
+ setFocused,
69
70
  shouldValidateOnChange,
70
71
  validityData,
71
72
  setFilled,
72
73
  name: fieldName,
73
74
  disabled: fieldDisabled,
74
- validation
75
+ validation,
76
+ validationMode
75
77
  } = useFieldRootContext();
76
- const {
77
- controlId
78
- } = useLabelableContext();
79
78
  const generatedId = useLabelableId({
80
79
  id
81
80
  });
@@ -176,8 +175,8 @@ export function SelectRoot(props) {
176
175
  }
177
176
  }, [store, value]);
178
177
  useIsoLayoutEffect(() => {
179
- setFilled(value !== null);
180
- }, [value, setFilled]);
178
+ setFilled(multiple ? Array.isArray(value) && value.length > 0 : value != null);
179
+ }, [multiple, value, setFilled]);
181
180
  useIsoLayoutEffect(function syncSelectedIndex() {
182
181
  if (open) {
183
182
  return;
@@ -212,6 +211,13 @@ export function SelectRoot(props) {
212
211
  return;
213
212
  }
214
213
  setOpenUnwrapped(nextOpen);
214
+ if (!nextOpen && (eventDetails.reason === REASONS.focusOut || eventDetails.reason === REASONS.outsidePress)) {
215
+ setTouched(true);
216
+ setFocused(false);
217
+ if (validationMode === 'onBlur') {
218
+ validation.commit(value);
219
+ }
220
+ }
215
221
 
216
222
  // The active index will sync to the last selected index on the next open.
217
223
  // Workaround `enableFocusInside` in Floating UI setting `tabindex=0` of a non-highlighted
@@ -324,7 +330,11 @@ export function SelectRoot(props) {
324
330
  getFloatingProps,
325
331
  getItemProps
326
332
  } = useInteractions([click, dismiss, listNavigation, typeahead]);
327
- const mergedTriggerProps = React.useMemo(() => mergeProps(getReferenceProps(), interactionTypeProps), [getReferenceProps, interactionTypeProps]);
333
+ const mergedTriggerProps = React.useMemo(() => {
334
+ return mergeProps(getReferenceProps(), interactionTypeProps, generatedId ? {
335
+ id: generatedId
336
+ } : EMPTY_OBJECT);
337
+ }, [getReferenceProps, interactionTypeProps, generatedId]);
328
338
  useOnFirstRender(() => {
329
339
  store.update({
330
340
  popupProps: getFloatingProps(),
@@ -403,7 +413,11 @@ export function SelectRoot(props) {
403
413
  ...validation.getInputValidationProps({
404
414
  onFocus() {
405
415
  // Move focus to the trigger element when the hidden input is focused.
406
- store.state.triggerElement?.focus();
416
+ store.state.triggerElement?.focus({
417
+ // Supported in Chrome from 144 (January 2026)
418
+ // @ts-expect-error - focusVisible is not yet in the lib.dom.d.ts
419
+ focusVisible: true
420
+ });
407
421
  },
408
422
  // Handle browser autofill.
409
423
  onChange(event) {
@@ -439,14 +453,13 @@ export function SelectRoot(props) {
439
453
  queueMicrotask(handleChange);
440
454
  }
441
455
  }),
442
- id: id || controlId || undefined,
443
456
  name: multiple ? undefined : name,
444
457
  value: serializedValue,
445
458
  disabled: disabled,
446
459
  required: required && !hasMultipleSelection,
447
460
  readOnly: readOnly,
448
461
  ref: ref,
449
- style: visuallyHidden,
462
+ style: name ? visuallyHiddenInput : visuallyHidden,
450
463
  tabIndex: -1,
451
464
  "aria-hidden": true
452
465
  }), hiddenInputs]
@@ -5,7 +5,7 @@ import { type TransitionStatus } from "../../utils/useTransitionStatus.js";
5
5
  /**
6
6
  * @internal
7
7
  */
8
- export declare const SelectScrollArrow: React.ForwardRefExoticComponent<SelectScrollArrowProps & React.RefAttributes<HTMLDivElement>>;
8
+ export declare const SelectScrollArrow: React.ForwardRefExoticComponent<Omit<SelectScrollArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
9
  export interface SelectScrollArrowState {
10
10
  direction: 'up' | 'down';
11
11
  visible: boolean;
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
6
6
  *
7
7
  * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
8
8
  */
9
- export declare const SelectScrollDownArrow: React.ForwardRefExoticComponent<SelectScrollDownArrowProps & React.RefAttributes<HTMLDivElement>>;
9
+ export declare const SelectScrollDownArrow: React.ForwardRefExoticComponent<Omit<SelectScrollDownArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
10
  export interface SelectScrollDownArrowState {}
11
11
  export interface SelectScrollDownArrowProps extends BaseUIComponentProps<'div', SelectScrollDownArrow.State> {
12
12
  /**
@@ -6,7 +6,7 @@ import type { BaseUIComponentProps } from "../../utils/types.js";
6
6
  *
7
7
  * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
8
8
  */
9
- export declare const SelectScrollUpArrow: React.ForwardRefExoticComponent<SelectScrollUpArrowProps & React.RefAttributes<HTMLDivElement>>;
9
+ export declare const SelectScrollUpArrow: React.ForwardRefExoticComponent<Omit<SelectScrollUpArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
10
  export interface SelectScrollUpArrowState {}
11
11
  export interface SelectScrollUpArrowProps extends BaseUIComponentProps<'div', SelectScrollUpArrow.State> {
12
12
  /**
@@ -43,6 +43,8 @@ export declare const selectors: {
43
43
  itemToStringValue: (state: State) => ((item: any) => string) | undefined;
44
44
  isItemEqualToValue: (state: State) => (item: any, value: any) => boolean;
45
45
  value: (state: State) => any;
46
+ hasSelectedValue: (state: State) => boolean;
47
+ hasNullItemLabel: (state: State, enabled: boolean) => boolean;
46
48
  open: (state: State) => boolean;
47
49
  mounted: (state: State) => boolean;
48
50
  forceMount: (state: State) => boolean;
@@ -61,5 +63,4 @@ export declare const selectors: {
61
63
  scrollUpArrowVisible: (state: State) => boolean;
62
64
  scrollDownArrowVisible: (state: State) => boolean;
63
65
  hasScrollArrows: (state: State) => boolean;
64
- serializedValue: (state: State) => string;
65
66
  };
@@ -1,6 +1,6 @@
1
1
  import { createSelector } from '@base-ui/utils/store';
2
2
  import { compareItemEquality } from "../utils/itemEquality.js";
3
- import { stringifyAsValue } from "../utils/resolveValueLabel.js";
3
+ import { hasNullItemLabel, stringifyAsValue } from "../utils/resolveValueLabel.js";
4
4
  export const selectors = {
5
5
  id: createSelector(state => state.id),
6
6
  modal: createSelector(state => state.modal),
@@ -10,6 +10,23 @@ export const selectors = {
10
10
  itemToStringValue: createSelector(state => state.itemToStringValue),
11
11
  isItemEqualToValue: createSelector(state => state.isItemEqualToValue),
12
12
  value: createSelector(state => state.value),
13
+ hasSelectedValue: createSelector(state => {
14
+ const {
15
+ value,
16
+ multiple,
17
+ itemToStringValue
18
+ } = state;
19
+ if (value == null) {
20
+ return false;
21
+ }
22
+ if (multiple && Array.isArray(value)) {
23
+ return value.length > 0;
24
+ }
25
+ return stringifyAsValue(value, itemToStringValue) !== '';
26
+ }),
27
+ hasNullItemLabel: createSelector((state, enabled) => {
28
+ return enabled ? hasNullItemLabel(state.items) : false;
29
+ }),
13
30
  open: createSelector(state => state.open),
14
31
  mounted: createSelector(state => state.mounted),
15
32
  forceMount: createSelector(state => state.forceMount),
@@ -42,16 +59,5 @@ export const selectors = {
42
59
  listElement: createSelector(state => state.listElement),
43
60
  scrollUpArrowVisible: createSelector(state => state.scrollUpArrowVisible),
44
61
  scrollDownArrowVisible: createSelector(state => state.scrollDownArrowVisible),
45
- hasScrollArrows: createSelector(state => state.hasScrollArrows),
46
- serializedValue: createSelector(state => {
47
- const {
48
- multiple,
49
- value,
50
- itemToStringValue
51
- } = state;
52
- if (multiple && Array.isArray(value) && value.length === 0) {
53
- return '';
54
- }
55
- return stringifyAsValue(value, itemToStringValue);
56
- })
62
+ hasScrollArrows: createSelector(state => state.hasScrollArrows)
57
63
  };
@@ -7,14 +7,24 @@ import type { FieldRoot } from "../../field/root/FieldRoot.js";
7
7
  *
8
8
  * Documentation: [Base UI Select](https://base-ui.com/react/components/select)
9
9
  */
10
- export declare const SelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<HTMLButtonElement>>;
10
+ export declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
11
11
  export interface SelectTriggerState extends FieldRoot.State {
12
- /** Whether the select popup is currently open. */
12
+ /**
13
+ * Whether the select popup is currently open.
14
+ */
13
15
  open: boolean;
14
- /** Whether the select popup is readonly. */
16
+ /**
17
+ * Whether the select popup is readonly.
18
+ */
15
19
  readOnly: boolean;
16
- /** The value of the currently selected item. */
20
+ /**
21
+ * The value of the currently selected item.
22
+ */
17
23
  value: any;
24
+ /**
25
+ * Whether the select doesn't have a value.
26
+ */
27
+ placeholder: boolean;
18
28
  }
19
29
  export interface SelectTriggerProps extends NativeButtonProps, BaseUIComponentProps<'button', SelectTrigger.State> {
20
30
  children?: React.ReactNode;