@base-ui/react 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/CHANGELOG.md +125 -8
  2. package/README.md +1 -1
  3. package/accordion/item/AccordionItem.d.ts +4 -0
  4. package/accordion/item/AccordionItem.js +5 -4
  5. package/accordion/panel/AccordionPanel.js +29 -51
  6. package/accordion/root/AccordionRoot.js +5 -6
  7. package/accordion/trigger/AccordionTrigger.js +3 -4
  8. package/alert-dialog/handle.d.ts +14 -1
  9. package/alert-dialog/handle.js +22 -5
  10. package/alert-dialog/index.d.ts +1 -1
  11. package/alert-dialog/index.parts.d.ts +2 -3
  12. package/alert-dialog/index.parts.js +4 -5
  13. package/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  14. package/alert-dialog/root/AlertDialogRoot.js +2 -56
  15. package/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  16. package/alert-dialog/trigger/AlertDialogTrigger.js +15 -0
  17. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  18. package/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +18 -0
  19. package/autocomplete/root/AutocompleteRoot.js +9 -10
  20. package/avatar/image/AvatarImage.js +4 -4
  21. package/checkbox/indicator/CheckboxIndicator.js +2 -2
  22. package/checkbox/root/CheckboxRoot.js +49 -11
  23. package/checkbox-group/CheckboxGroup.js +1 -5
  24. package/collapsible/panel/CollapsiblePanel.js +29 -51
  25. package/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  26. package/collapsible/panel/useCollapsiblePanel.js +308 -268
  27. package/collapsible/root/CollapsibleRoot.d.ts +1 -1
  28. package/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  29. package/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  30. package/collapsible/root/useCollapsibleRoot.js +2 -64
  31. package/collapsible/trigger/CollapsibleTrigger.js +5 -6
  32. package/combobox/arrow/ComboboxArrow.js +1 -1
  33. package/combobox/backdrop/ComboboxBackdrop.js +1 -1
  34. package/combobox/chip/ComboboxChip.js +7 -2
  35. package/combobox/clear/ComboboxClear.d.ts +4 -0
  36. package/combobox/clear/ComboboxClear.js +1 -0
  37. package/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  38. package/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  39. package/combobox/icon/ComboboxIcon.js +1 -1
  40. package/combobox/input/ComboboxInput.js +15 -6
  41. package/combobox/item/ComboboxItem.js +8 -14
  42. package/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  43. package/combobox/root/AriaCombobox.js +61 -28
  44. package/combobox/store.d.ts +4 -8
  45. package/combobox/store.js +2 -1
  46. package/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  47. package/csp-provider/CSPProvider.js +1 -1
  48. package/dialog/close/DialogClose.js +6 -6
  49. package/dialog/popup/DialogPopup.js +9 -4
  50. package/dialog/root/DialogRoot.d.ts +1 -2
  51. package/dialog/root/DialogRoot.js +3 -73
  52. package/dialog/root/DialogRootContext.d.ts +1 -0
  53. package/dialog/root/DialogRootContext.js +3 -1
  54. package/dialog/root/useDialogRoot.d.ts +12 -4
  55. package/dialog/root/useDialogRoot.js +27 -25
  56. package/dialog/root/useRenderDialogRoot.d.ts +4 -0
  57. package/dialog/root/useRenderDialogRoot.js +96 -0
  58. package/dialog/store/DialogHandle.d.ts +1 -1
  59. package/dialog/store/DialogHandle.js +2 -2
  60. package/dialog/store/DialogStore.d.ts +88 -1
  61. package/dialog/store/DialogStore.js +12 -17
  62. package/dialog/trigger/DialogTrigger.d.ts +1 -1
  63. package/dialog/trigger/DialogTrigger.js +11 -4
  64. package/dialog/viewport/DialogViewport.js +4 -3
  65. package/drawer/popup/DrawerPopup.js +13 -9
  66. package/drawer/root/DrawerRoot.js +11 -11
  67. package/drawer/root/DrawerRootContext.d.ts +1 -1
  68. package/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  69. package/drawer/viewport/DrawerViewport.js +13 -14
  70. package/esm/accordion/item/AccordionItem.d.ts +4 -0
  71. package/esm/accordion/item/AccordionItem.js +5 -4
  72. package/esm/accordion/panel/AccordionPanel.js +29 -51
  73. package/esm/accordion/root/AccordionRoot.js +5 -6
  74. package/esm/accordion/trigger/AccordionTrigger.js +4 -5
  75. package/esm/alert-dialog/handle.d.ts +14 -1
  76. package/esm/alert-dialog/handle.js +20 -5
  77. package/esm/alert-dialog/index.d.ts +1 -1
  78. package/esm/alert-dialog/index.parts.d.ts +2 -3
  79. package/esm/alert-dialog/index.parts.js +2 -3
  80. package/esm/alert-dialog/root/AlertDialogRoot.d.ts +7 -7
  81. package/esm/alert-dialog/root/AlertDialogRoot.js +2 -55
  82. package/esm/alert-dialog/trigger/AlertDialogTrigger.d.ts +25 -0
  83. package/esm/alert-dialog/trigger/AlertDialogTrigger.js +10 -0
  84. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.d.ts +10 -0
  85. package/esm/alert-dialog/trigger/AlertDialogTriggerDataAttributes.js +12 -0
  86. package/esm/autocomplete/root/AutocompleteRoot.js +9 -10
  87. package/esm/avatar/image/AvatarImage.js +4 -4
  88. package/esm/checkbox/indicator/CheckboxIndicator.js +2 -2
  89. package/esm/checkbox/root/CheckboxRoot.js +49 -11
  90. package/esm/checkbox-group/CheckboxGroup.js +1 -5
  91. package/esm/collapsible/panel/CollapsiblePanel.js +29 -51
  92. package/esm/collapsible/panel/useCollapsiblePanel.d.ts +9 -23
  93. package/esm/collapsible/panel/useCollapsiblePanel.js +309 -269
  94. package/esm/collapsible/root/CollapsibleRoot.d.ts +1 -1
  95. package/esm/collapsible/root/CollapsibleRootContext.d.ts +0 -2
  96. package/esm/collapsible/root/useCollapsibleRoot.d.ts +0 -27
  97. package/esm/collapsible/root/useCollapsibleRoot.js +2 -64
  98. package/esm/collapsible/trigger/CollapsibleTrigger.js +5 -6
  99. package/esm/combobox/arrow/ComboboxArrow.js +1 -1
  100. package/esm/combobox/backdrop/ComboboxBackdrop.js +1 -1
  101. package/esm/combobox/chip/ComboboxChip.js +7 -2
  102. package/esm/combobox/clear/ComboboxClear.d.ts +4 -0
  103. package/esm/combobox/clear/ComboboxClear.js +1 -0
  104. package/esm/combobox/clear/ComboboxClearDataAttributes.d.ts +4 -0
  105. package/esm/combobox/clear/ComboboxClearDataAttributes.js +4 -0
  106. package/esm/combobox/icon/ComboboxIcon.js +1 -1
  107. package/esm/combobox/input/ComboboxInput.js +16 -7
  108. package/esm/combobox/item/ComboboxItem.js +8 -14
  109. package/esm/combobox/item-indicator/ComboboxItemIndicator.js +1 -2
  110. package/esm/combobox/root/AriaCombobox.js +62 -29
  111. package/esm/combobox/store.d.ts +4 -8
  112. package/esm/combobox/store.js +2 -1
  113. package/esm/combobox/utils/ComboboxInternalDismissButton.js +2 -3
  114. package/esm/csp-provider/CSPProvider.js +1 -1
  115. package/esm/dialog/close/DialogClose.js +6 -6
  116. package/esm/dialog/popup/DialogPopup.js +9 -4
  117. package/esm/dialog/root/DialogRoot.d.ts +1 -2
  118. package/esm/dialog/root/DialogRoot.js +4 -72
  119. package/esm/dialog/root/DialogRootContext.d.ts +1 -0
  120. package/esm/dialog/root/DialogRootContext.js +2 -0
  121. package/esm/dialog/root/useDialogRoot.d.ts +12 -4
  122. package/esm/dialog/root/useDialogRoot.js +28 -27
  123. package/esm/dialog/root/useRenderDialogRoot.d.ts +4 -0
  124. package/esm/dialog/root/useRenderDialogRoot.js +90 -0
  125. package/esm/dialog/store/DialogHandle.d.ts +1 -1
  126. package/esm/dialog/store/DialogHandle.js +2 -2
  127. package/esm/dialog/store/DialogStore.d.ts +88 -1
  128. package/esm/dialog/store/DialogStore.js +13 -18
  129. package/esm/dialog/trigger/DialogTrigger.d.ts +1 -1
  130. package/esm/dialog/trigger/DialogTrigger.js +12 -5
  131. package/esm/dialog/viewport/DialogViewport.js +4 -3
  132. package/esm/drawer/popup/DrawerPopup.js +14 -9
  133. package/esm/drawer/root/DrawerRoot.js +11 -11
  134. package/esm/drawer/root/DrawerRootContext.d.ts +1 -1
  135. package/esm/drawer/swipe-area/DrawerSwipeArea.js +6 -5
  136. package/esm/drawer/viewport/DrawerViewport.js +13 -14
  137. package/esm/field/control/FieldControl.js +2 -6
  138. package/esm/field/item/FieldItem.js +1 -4
  139. package/esm/field/root/FieldRoot.js +11 -3
  140. package/esm/field/root/useFieldValidation.d.ts +1 -0
  141. package/esm/field/root/useFieldValidation.js +23 -20
  142. package/esm/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  143. package/esm/field/validity/FieldValidity.d.ts +1 -1
  144. package/esm/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  145. package/esm/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  146. package/esm/floating-ui-react/components/FloatingFocusManager.js +20 -8
  147. package/esm/floating-ui-react/components/FloatingPortal.js +3 -3
  148. package/esm/floating-ui-react/hooks/useClick.js +83 -74
  149. package/esm/floating-ui-react/hooks/useClientPoint.js +29 -20
  150. package/esm/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  151. package/esm/floating-ui-react/hooks/useDismiss.js +82 -93
  152. package/esm/floating-ui-react/hooks/useFloating.js +37 -32
  153. package/esm/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  154. package/esm/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  155. package/esm/floating-ui-react/hooks/useFocus.js +84 -81
  156. package/esm/floating-ui-react/hooks/useHover.js +72 -76
  157. package/esm/floating-ui-react/hooks/useHoverFloatingInteraction.js +49 -44
  158. package/esm/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  159. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  160. package/esm/floating-ui-react/hooks/useHoverReferenceInteraction.js +44 -39
  161. package/esm/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  162. package/esm/floating-ui-react/hooks/useHoverShared.js +4 -0
  163. package/esm/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  164. package/esm/floating-ui-react/hooks/useListNavigation.js +83 -74
  165. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  166. package/esm/floating-ui-react/hooks/useSyncedFloatingRootContext.js +25 -20
  167. package/esm/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  168. package/esm/floating-ui-react/hooks/useTypeahead.js +33 -52
  169. package/esm/floating-ui-react/index.d.ts +0 -2
  170. package/esm/floating-ui-react/index.js +0 -2
  171. package/esm/floating-ui-react/types.d.ts +2 -7
  172. package/esm/floating-ui-react/utils/composite.js +2 -0
  173. package/esm/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  174. package/esm/floating-ui-react/utils/enqueueFocus.js +10 -7
  175. package/esm/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  176. package/esm/form/Form.js +2 -2
  177. package/esm/index.js +1 -1
  178. package/esm/internals/composite/composite.d.ts +0 -1
  179. package/esm/internals/composite/composite.js +1 -2
  180. package/esm/internals/composite/root/useCompositeRoot.js +2 -2
  181. package/esm/internals/createBaseUIEventDetails.d.ts +2 -0
  182. package/esm/internals/csp-context/index.d.ts +2 -0
  183. package/esm/internals/csp-context/index.js +1 -0
  184. package/esm/internals/field-register-control/index.d.ts +0 -1
  185. package/esm/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  186. package/esm/internals/field-register-control/useFieldControlRegistration.js +11 -14
  187. package/esm/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  188. package/esm/internals/field-register-control/useRegisterFieldControl.js +6 -11
  189. package/esm/internals/field-root-context/FieldRootContext.d.ts +1 -0
  190. package/esm/internals/field-root-context/FieldRootContext.js +3 -2
  191. package/esm/internals/form-context/FormContext.d.ts +5 -1
  192. package/esm/internals/reason-parts.d.ts +2 -0
  193. package/esm/internals/reason-parts.js +2 -0
  194. package/esm/internals/types.d.ts +1 -0
  195. package/esm/internals/use-button/useButton.js +4 -4
  196. package/esm/internals/usePressAndHold.js +2 -2
  197. package/esm/internals/useRenderElement.js +2 -0
  198. package/esm/menu/arrow/MenuArrow.js +1 -1
  199. package/esm/menu/backdrop/MenuBackdrop.js +1 -1
  200. package/esm/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  201. package/esm/menu/group/MenuGroup.js +1 -4
  202. package/esm/menu/group/MenuGroupContext.d.ts +1 -3
  203. package/esm/menu/group/MenuGroupContext.js +1 -1
  204. package/esm/menu/group-label/MenuGroupLabel.js +4 -6
  205. package/esm/menu/link-item/MenuLinkItem.js +2 -2
  206. package/esm/menu/popup/MenuPopup.js +5 -5
  207. package/esm/menu/radio-group/MenuRadioGroup.js +11 -5
  208. package/esm/menu/radio-item/MenuRadioItem.js +5 -7
  209. package/esm/menu/root/MenuRoot.js +63 -68
  210. package/esm/menu/store/MenuHandle.js +1 -1
  211. package/esm/menu/store/MenuStore.d.ts +87 -0
  212. package/esm/menu/submenu-trigger/MenuSubmenuTrigger.js +8 -5
  213. package/esm/menu/trigger/MenuTrigger.js +13 -10
  214. package/esm/menu/viewport/MenuViewport.d.ts +2 -2
  215. package/esm/menu/viewport/MenuViewport.js +2 -2
  216. package/esm/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  217. package/esm/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  218. package/esm/navigation-menu/content/NavigationMenuContent.js +8 -5
  219. package/esm/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  220. package/esm/navigation-menu/item/NavigationMenuItem.js +2 -2
  221. package/esm/navigation-menu/list/NavigationMenuList.js +1 -1
  222. package/esm/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  223. package/esm/navigation-menu/root/NavigationMenuRoot.js +1 -3
  224. package/esm/navigation-menu/trigger/NavigationMenuTrigger.js +24 -17
  225. package/esm/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  226. package/esm/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  227. package/esm/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  228. package/esm/number-field/input/NumberFieldInput.js +3 -5
  229. package/esm/number-field/root/NumberFieldRoot.js +5 -2
  230. package/esm/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  231. package/esm/otp-field/input/OTPFieldInput.js +43 -29
  232. package/esm/otp-field/root/OTPFieldRoot.d.ts +17 -8
  233. package/esm/otp-field/root/OTPFieldRoot.js +33 -33
  234. package/esm/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  235. package/esm/otp-field/utils/otp.d.ts +5 -4
  236. package/esm/otp-field/utils/otp.js +23 -12
  237. package/esm/popover/arrow/PopoverArrow.js +1 -1
  238. package/esm/popover/backdrop/PopoverBackdrop.js +1 -1
  239. package/esm/popover/close/PopoverClose.js +2 -2
  240. package/esm/popover/description/PopoverDescription.js +1 -7
  241. package/esm/popover/popup/PopoverPopup.d.ts +1 -1
  242. package/esm/popover/popup/PopoverPopup.js +16 -10
  243. package/esm/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  244. package/esm/popover/popup/PopoverPopupDataAttributes.js +1 -1
  245. package/esm/popover/positioner/PopoverPositioner.js +5 -5
  246. package/esm/popover/root/PopoverRoot.d.ts +1 -1
  247. package/esm/popover/root/PopoverRoot.js +42 -47
  248. package/esm/popover/store/PopoverHandle.js +1 -1
  249. package/esm/popover/store/PopoverStore.d.ts +91 -4
  250. package/esm/popover/store/PopoverStore.js +17 -18
  251. package/esm/popover/title/PopoverTitle.js +1 -7
  252. package/esm/popover/trigger/PopoverTrigger.js +24 -17
  253. package/esm/popover/viewport/PopoverViewport.d.ts +3 -3
  254. package/esm/popover/viewport/PopoverViewport.js +2 -2
  255. package/esm/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  256. package/esm/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  257. package/esm/preview-card/positioner/PreviewCardPositioner.js +11 -1
  258. package/esm/preview-card/root/PreviewCardRoot.d.ts +1 -1
  259. package/esm/preview-card/root/PreviewCardRoot.js +32 -22
  260. package/esm/preview-card/store/PreviewCardHandle.js +1 -1
  261. package/esm/preview-card/store/PreviewCardStore.d.ts +90 -2
  262. package/esm/preview-card/store/PreviewCardStore.js +19 -31
  263. package/esm/preview-card/trigger/PreviewCardTrigger.js +6 -3
  264. package/esm/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  265. package/esm/preview-card/viewport/PreviewCardViewport.js +2 -2
  266. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  267. package/esm/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  268. package/esm/progress/indicator/ProgressIndicator.js +6 -11
  269. package/esm/progress/root/ProgressRoot.d.ts +1 -1
  270. package/esm/radio/root/RadioRoot.js +7 -3
  271. package/esm/radio-group/RadioGroup.js +4 -11
  272. package/esm/radio-group/RadioGroupContext.d.ts +0 -1
  273. package/esm/scroll-area/content/ScrollAreaContent.js +4 -4
  274. package/esm/scroll-area/root/ScrollAreaRoot.js +1 -1
  275. package/esm/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  276. package/esm/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  277. package/esm/select/arrow/SelectArrow.js +1 -1
  278. package/esm/select/backdrop/SelectBackdrop.js +1 -1
  279. package/esm/select/group/SelectGroup.js +1 -1
  280. package/esm/select/group-label/SelectGroupLabel.js +2 -2
  281. package/esm/select/icon/SelectIcon.js +1 -1
  282. package/esm/select/item/SelectItem.js +46 -32
  283. package/esm/select/item/SelectItemContext.d.ts +1 -1
  284. package/esm/select/item-indicator/SelectItemIndicator.js +1 -2
  285. package/esm/select/item-text/SelectItemText.js +9 -6
  286. package/esm/select/list/SelectList.js +1 -1
  287. package/esm/select/popup/SelectPopup.js +8 -3
  288. package/esm/select/positioner/SelectPositioner.js +3 -0
  289. package/esm/select/root/SelectRoot.js +46 -40
  290. package/esm/select/root/SelectRootContext.d.ts +4 -5
  291. package/esm/select/store.d.ts +3 -0
  292. package/esm/select/store.js +1 -0
  293. package/esm/select/trigger/SelectTrigger.d.ts +5 -0
  294. package/esm/select/trigger/SelectTrigger.js +19 -33
  295. package/esm/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  296. package/esm/select/trigger/SelectTriggerDataAttributes.js +5 -0
  297. package/esm/slider/control/SliderControl.js +10 -12
  298. package/esm/slider/root/SliderRoot.js +1 -4
  299. package/esm/slider/thumb/SliderThumb.js +32 -30
  300. package/esm/slider/value/SliderValue.js +7 -15
  301. package/esm/switch/root/SwitchRoot.js +10 -10
  302. package/esm/switch/thumb/SwitchThumb.js +1 -9
  303. package/esm/tabs/indicator/TabsIndicator.js +14 -19
  304. package/esm/tabs/list/TabsList.js +4 -10
  305. package/esm/tabs/list/TabsListContext.d.ts +2 -1
  306. package/esm/tabs/panel/TabsPanel.js +1 -1
  307. package/esm/tabs/root/TabsRoot.d.ts +16 -1
  308. package/esm/tabs/root/TabsRoot.js +73 -25
  309. package/esm/tabs/root/TabsRootContext.d.ts +0 -2
  310. package/esm/toast/provider/ToastProvider.js +1 -1
  311. package/esm/toast/root/ToastRoot.d.ts +1 -1
  312. package/esm/toast/root/ToastRoot.js +108 -131
  313. package/esm/toast/root/ToastRootDataAttributes.d.ts +1 -1
  314. package/esm/toast/root/ToastRootDataAttributes.js +1 -1
  315. package/esm/toast/store.d.ts +9 -1
  316. package/esm/toast/store.js +19 -13
  317. package/esm/toast/useToastManager.d.ts +1 -1
  318. package/esm/toast/viewport/ToastViewport.js +1 -1
  319. package/esm/toggle/Toggle.js +5 -9
  320. package/esm/toggle-group/ToggleGroup.d.ts +2 -2
  321. package/esm/toggle-group/ToggleGroup.js +6 -13
  322. package/esm/toolbar/link/ToolbarLink.d.ts +1 -1
  323. package/esm/toolbar/link/ToolbarLink.js +1 -2
  324. package/esm/tooltip/arrow/TooltipArrow.js +3 -3
  325. package/esm/tooltip/popup/TooltipPopup.js +5 -4
  326. package/esm/tooltip/root/TooltipRoot.js +35 -26
  327. package/esm/tooltip/store/TooltipHandle.js +1 -1
  328. package/esm/tooltip/store/TooltipStore.d.ts +90 -2
  329. package/esm/tooltip/store/TooltipStore.js +18 -31
  330. package/esm/tooltip/trigger/TooltipTrigger.js +151 -20
  331. package/esm/tooltip/viewport/TooltipViewport.d.ts +2 -2
  332. package/esm/tooltip/viewport/TooltipViewport.js +2 -2
  333. package/esm/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  334. package/esm/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  335. package/esm/unstable-use-media-query/index.js +1 -1
  336. package/esm/utils/popups/index.d.ts +1 -0
  337. package/esm/utils/popups/index.js +1 -0
  338. package/esm/utils/popups/inlineRect.d.ts +15 -0
  339. package/esm/utils/popups/inlineRect.js +191 -0
  340. package/esm/utils/popups/popupStoreUtils.d.ts +28 -10
  341. package/esm/utils/popups/popupStoreUtils.js +105 -20
  342. package/esm/utils/popups/popupTriggerMap.js +2 -0
  343. package/esm/utils/popups/store.d.ts +15 -2
  344. package/esm/utils/popups/store.js +38 -2
  345. package/esm/utils/popups/useTriggerFocusGuards.js +4 -5
  346. package/esm/utils/useAnchorPositioning.d.ts +5 -0
  347. package/esm/utils/useAnchorPositioning.js +12 -9
  348. package/esm/utils/useOpenInteractionType.d.ts +4 -0
  349. package/esm/utils/useOpenInteractionType.js +23 -18
  350. package/field/control/FieldControl.js +2 -6
  351. package/field/item/FieldItem.js +1 -4
  352. package/field/root/FieldRoot.js +11 -3
  353. package/field/root/useFieldValidation.d.ts +1 -0
  354. package/field/root/useFieldValidation.js +23 -20
  355. package/field/utils/getCombinedFieldValidityData.d.ts +1 -1
  356. package/field/validity/FieldValidity.d.ts +1 -1
  357. package/floating-ui-react/components/FloatingDelayGroup.js +3 -3
  358. package/floating-ui-react/components/FloatingFocusManager.d.ts +1 -1
  359. package/floating-ui-react/components/FloatingFocusManager.js +20 -8
  360. package/floating-ui-react/components/FloatingPortal.js +3 -3
  361. package/floating-ui-react/hooks/useClick.js +82 -73
  362. package/floating-ui-react/hooks/useClientPoint.js +29 -20
  363. package/floating-ui-react/hooks/useDismiss.d.ts +1 -1
  364. package/floating-ui-react/hooks/useDismiss.js +82 -92
  365. package/floating-ui-react/hooks/useFloating.js +36 -32
  366. package/floating-ui-react/hooks/useFloatingRootContext.d.ts +1 -1
  367. package/floating-ui-react/hooks/useFloatingRootContext.js +2 -2
  368. package/floating-ui-react/hooks/useFocus.js +84 -81
  369. package/floating-ui-react/hooks/useHover.js +74 -78
  370. package/floating-ui-react/hooks/useHoverFloatingInteraction.js +48 -43
  371. package/floating-ui-react/hooks/useHoverInteractionSharedState.js +1 -1
  372. package/floating-ui-react/hooks/useHoverReferenceInteraction.d.ts +7 -2
  373. package/floating-ui-react/hooks/useHoverReferenceInteraction.js +43 -38
  374. package/floating-ui-react/hooks/useHoverShared.d.ts +2 -1
  375. package/floating-ui-react/hooks/useHoverShared.js +11 -0
  376. package/floating-ui-react/hooks/useListNavigation.d.ts +1 -3
  377. package/floating-ui-react/hooks/useListNavigation.js +83 -74
  378. package/floating-ui-react/hooks/useSyncedFloatingRootContext.d.ts +9 -6
  379. package/floating-ui-react/hooks/useSyncedFloatingRootContext.js +26 -20
  380. package/floating-ui-react/hooks/useTypeahead.d.ts +2 -2
  381. package/floating-ui-react/hooks/useTypeahead.js +33 -52
  382. package/floating-ui-react/index.d.ts +0 -2
  383. package/floating-ui-react/index.js +0 -14
  384. package/floating-ui-react/types.d.ts +2 -7
  385. package/floating-ui-react/utils/composite.js +2 -0
  386. package/floating-ui-react/utils/enqueueFocus.d.ts +1 -1
  387. package/floating-ui-react/utils/enqueueFocus.js +10 -7
  388. package/floating-ui-react/utils/getEmptyRootContext.js +1 -1
  389. package/form/Form.js +2 -2
  390. package/index.js +1 -1
  391. package/internals/composite/composite.d.ts +0 -1
  392. package/internals/composite/composite.js +2 -3
  393. package/internals/composite/root/useCompositeRoot.js +1 -1
  394. package/internals/createBaseUIEventDetails.d.ts +2 -0
  395. package/internals/csp-context/index.d.ts +2 -0
  396. package/internals/csp-context/index.js +18 -0
  397. package/internals/field-register-control/index.d.ts +0 -1
  398. package/internals/field-register-control/useFieldControlRegistration.d.ts +2 -1
  399. package/internals/field-register-control/useFieldControlRegistration.js +11 -14
  400. package/internals/field-register-control/useRegisterFieldControl.d.ts +1 -4
  401. package/internals/field-register-control/useRegisterFieldControl.js +6 -11
  402. package/internals/field-root-context/FieldRootContext.d.ts +1 -0
  403. package/internals/field-root-context/FieldRootContext.js +4 -3
  404. package/internals/form-context/FormContext.d.ts +5 -1
  405. package/internals/reason-parts.d.ts +2 -0
  406. package/internals/reason-parts.js +3 -1
  407. package/internals/types.d.ts +1 -0
  408. package/internals/use-button/useButton.js +4 -4
  409. package/internals/usePressAndHold.js +2 -2
  410. package/internals/useRenderElement.js +2 -0
  411. package/menu/arrow/MenuArrow.js +1 -1
  412. package/menu/backdrop/MenuBackdrop.js +1 -1
  413. package/menu/checkbox-item/MenuCheckboxItem.js +5 -7
  414. package/menu/group/MenuGroup.js +1 -4
  415. package/menu/group/MenuGroupContext.d.ts +1 -3
  416. package/menu/group/MenuGroupContext.js +1 -1
  417. package/menu/group-label/MenuGroupLabel.js +4 -6
  418. package/menu/link-item/MenuLinkItem.js +2 -2
  419. package/menu/popup/MenuPopup.js +5 -5
  420. package/menu/radio-group/MenuRadioGroup.js +11 -5
  421. package/menu/radio-item/MenuRadioItem.js +5 -7
  422. package/menu/root/MenuRoot.js +60 -65
  423. package/menu/store/MenuHandle.js +1 -1
  424. package/menu/store/MenuStore.d.ts +87 -0
  425. package/menu/submenu-trigger/MenuSubmenuTrigger.js +7 -4
  426. package/menu/trigger/MenuTrigger.js +12 -9
  427. package/menu/viewport/MenuViewport.d.ts +2 -2
  428. package/menu/viewport/MenuViewport.js +2 -2
  429. package/navigation-menu/arrow/NavigationMenuArrow.js +1 -1
  430. package/navigation-menu/backdrop/NavigationMenuBackdrop.js +1 -1
  431. package/navigation-menu/content/NavigationMenuContent.js +8 -5
  432. package/navigation-menu/icon/NavigationMenuIcon.js +1 -1
  433. package/navigation-menu/item/NavigationMenuItem.js +2 -2
  434. package/navigation-menu/list/NavigationMenuList.js +1 -1
  435. package/navigation-menu/popup/NavigationMenuPopup.js +2 -2
  436. package/navigation-menu/root/NavigationMenuRoot.js +1 -3
  437. package/navigation-menu/trigger/NavigationMenuTrigger.js +23 -16
  438. package/navigation-menu/utils/isOutsideMenuEvent.d.ts +0 -1
  439. package/navigation-menu/utils/isOutsideMenuEvent.js +1 -5
  440. package/navigation-menu/viewport/NavigationMenuViewport.js +2 -3
  441. package/number-field/input/NumberFieldInput.js +3 -5
  442. package/number-field/root/NumberFieldRoot.js +5 -2
  443. package/number-field/scrub-area/NumberFieldScrubArea.js +7 -3
  444. package/otp-field/input/OTPFieldInput.js +42 -28
  445. package/otp-field/root/OTPFieldRoot.d.ts +17 -8
  446. package/otp-field/root/OTPFieldRoot.js +32 -32
  447. package/otp-field/root/OTPFieldRootContext.d.ts +1 -1
  448. package/otp-field/utils/otp.d.ts +5 -4
  449. package/otp-field/utils/otp.js +24 -12
  450. package/package.json +331 -317
  451. package/popover/arrow/PopoverArrow.js +1 -1
  452. package/popover/backdrop/PopoverBackdrop.js +1 -1
  453. package/popover/close/PopoverClose.js +2 -2
  454. package/popover/description/PopoverDescription.js +1 -7
  455. package/popover/popup/PopoverPopup.d.ts +1 -1
  456. package/popover/popup/PopoverPopup.js +16 -10
  457. package/popover/popup/PopoverPopupDataAttributes.d.ts +1 -1
  458. package/popover/popup/PopoverPopupDataAttributes.js +1 -1
  459. package/popover/positioner/PopoverPositioner.js +5 -5
  460. package/popover/root/PopoverRoot.d.ts +1 -1
  461. package/popover/root/PopoverRoot.js +39 -44
  462. package/popover/store/PopoverHandle.js +1 -1
  463. package/popover/store/PopoverStore.d.ts +91 -4
  464. package/popover/store/PopoverStore.js +16 -19
  465. package/popover/title/PopoverTitle.js +1 -7
  466. package/popover/trigger/PopoverTrigger.js +23 -16
  467. package/popover/viewport/PopoverViewport.d.ts +3 -3
  468. package/popover/viewport/PopoverViewport.js +2 -2
  469. package/popover/viewport/PopoverViewportDataAttributes.d.ts +1 -1
  470. package/popover/viewport/PopoverViewportDataAttributes.js +1 -1
  471. package/preview-card/positioner/PreviewCardPositioner.js +11 -1
  472. package/preview-card/root/PreviewCardRoot.d.ts +1 -1
  473. package/preview-card/root/PreviewCardRoot.js +30 -20
  474. package/preview-card/store/PreviewCardHandle.js +1 -1
  475. package/preview-card/store/PreviewCardStore.d.ts +90 -2
  476. package/preview-card/store/PreviewCardStore.js +18 -30
  477. package/preview-card/trigger/PreviewCardTrigger.js +5 -2
  478. package/preview-card/viewport/PreviewCardViewport.d.ts +2 -2
  479. package/preview-card/viewport/PreviewCardViewport.js +2 -2
  480. package/preview-card/viewport/PreviewCardViewportDataAttributes.d.ts +2 -2
  481. package/preview-card/viewport/PreviewCardViewportDataAttributes.js +2 -2
  482. package/progress/indicator/ProgressIndicator.js +6 -11
  483. package/progress/root/ProgressRoot.d.ts +1 -1
  484. package/radio/root/RadioRoot.js +7 -3
  485. package/radio-group/RadioGroup.js +4 -11
  486. package/radio-group/RadioGroupContext.d.ts +0 -1
  487. package/scroll-area/content/ScrollAreaContent.js +4 -4
  488. package/scroll-area/root/ScrollAreaRoot.js +1 -1
  489. package/scroll-area/scrollbar/ScrollAreaScrollbar.js +16 -20
  490. package/scroll-area/viewport/ScrollAreaViewport.js +6 -10
  491. package/select/arrow/SelectArrow.js +1 -1
  492. package/select/backdrop/SelectBackdrop.js +1 -1
  493. package/select/group/SelectGroup.js +1 -1
  494. package/select/group-label/SelectGroupLabel.js +2 -2
  495. package/select/icon/SelectIcon.js +1 -1
  496. package/select/item/SelectItem.js +46 -32
  497. package/select/item/SelectItemContext.d.ts +1 -1
  498. package/select/item-indicator/SelectItemIndicator.js +1 -2
  499. package/select/item-text/SelectItemText.js +9 -6
  500. package/select/list/SelectList.js +1 -1
  501. package/select/popup/SelectPopup.js +8 -3
  502. package/select/positioner/SelectPositioner.js +3 -0
  503. package/select/root/SelectRoot.js +45 -39
  504. package/select/root/SelectRootContext.d.ts +4 -5
  505. package/select/store.d.ts +3 -0
  506. package/select/store.js +1 -0
  507. package/select/trigger/SelectTrigger.d.ts +5 -0
  508. package/select/trigger/SelectTrigger.js +19 -33
  509. package/select/trigger/SelectTriggerDataAttributes.d.ts +5 -0
  510. package/select/trigger/SelectTriggerDataAttributes.js +5 -0
  511. package/slider/control/SliderControl.js +9 -11
  512. package/slider/root/SliderRoot.js +1 -4
  513. package/slider/thumb/SliderThumb.js +32 -30
  514. package/slider/value/SliderValue.js +7 -15
  515. package/switch/root/SwitchRoot.js +10 -10
  516. package/switch/thumb/SwitchThumb.js +1 -9
  517. package/tabs/indicator/TabsIndicator.js +14 -19
  518. package/tabs/list/TabsList.js +4 -10
  519. package/tabs/list/TabsListContext.d.ts +2 -1
  520. package/tabs/panel/TabsPanel.js +1 -1
  521. package/tabs/root/TabsRoot.d.ts +16 -1
  522. package/tabs/root/TabsRoot.js +71 -24
  523. package/tabs/root/TabsRootContext.d.ts +0 -2
  524. package/toast/provider/ToastProvider.js +1 -1
  525. package/toast/root/ToastRoot.d.ts +1 -1
  526. package/toast/root/ToastRoot.js +110 -133
  527. package/toast/root/ToastRootDataAttributes.d.ts +1 -1
  528. package/toast/root/ToastRootDataAttributes.js +1 -1
  529. package/toast/store.d.ts +9 -1
  530. package/toast/store.js +18 -12
  531. package/toast/useToastManager.d.ts +1 -1
  532. package/toast/viewport/ToastViewport.js +1 -1
  533. package/toggle/Toggle.js +5 -9
  534. package/toggle-group/ToggleGroup.d.ts +2 -2
  535. package/toggle-group/ToggleGroup.js +6 -13
  536. package/toolbar/link/ToolbarLink.d.ts +1 -1
  537. package/toolbar/link/ToolbarLink.js +1 -2
  538. package/tooltip/arrow/TooltipArrow.js +3 -3
  539. package/tooltip/popup/TooltipPopup.js +5 -4
  540. package/tooltip/root/TooltipRoot.js +32 -23
  541. package/tooltip/store/TooltipHandle.js +1 -1
  542. package/tooltip/store/TooltipStore.d.ts +90 -2
  543. package/tooltip/store/TooltipStore.js +17 -30
  544. package/tooltip/trigger/TooltipTrigger.js +152 -20
  545. package/tooltip/viewport/TooltipViewport.d.ts +2 -2
  546. package/tooltip/viewport/TooltipViewport.js +2 -2
  547. package/tooltip/viewport/TooltipViewportDataAttributes.d.ts +1 -1
  548. package/tooltip/viewport/TooltipViewportDataAttributes.js +1 -1
  549. package/unstable-use-media-query/index.js +1 -1
  550. package/utils/popups/index.d.ts +1 -0
  551. package/utils/popups/index.js +11 -0
  552. package/utils/popups/inlineRect.d.ts +15 -0
  553. package/utils/popups/inlineRect.js +198 -0
  554. package/utils/popups/popupStoreUtils.d.ts +28 -10
  555. package/utils/popups/popupStoreUtils.js +110 -20
  556. package/utils/popups/popupTriggerMap.js +2 -0
  557. package/utils/popups/store.d.ts +15 -2
  558. package/utils/popups/store.js +39 -2
  559. package/utils/popups/useTriggerFocusGuards.js +4 -5
  560. package/utils/useAnchorPositioning.d.ts +5 -0
  561. package/utils/useAnchorPositioning.js +12 -9
  562. package/utils/useOpenInteractionType.d.ts +4 -0
  563. package/utils/useOpenInteractionType.js +24 -17
  564. package/checkbox-group/index.parts.d.ts +0 -1
  565. package/checkbox-group/index.parts.js +0 -12
  566. package/esm/checkbox-group/index.parts.d.ts +0 -1
  567. package/esm/checkbox-group/index.parts.js +0 -1
  568. package/esm/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  569. package/esm/floating-ui-react/hooks/useInteractions.js +0 -88
  570. package/esm/floating-ui-react/hooks/useRole.d.ts +0 -17
  571. package/esm/floating-ui-react/hooks/useRole.js +0 -113
  572. package/floating-ui-react/hooks/useInteractions.d.ts +0 -20
  573. package/floating-ui-react/hooks/useInteractions.js +0 -95
  574. package/floating-ui-react/hooks/useRole.d.ts +0 -17
  575. package/floating-ui-react/hooks/useRole.js +0 -120
  576. /package/{csp-provider → esm/internals/csp-context}/CSPContext.d.ts +0 -0
  577. /package/esm/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
  578. /package/{esm/csp-provider → internals/csp-context}/CSPContext.d.ts +0 -0
  579. /package/{csp-provider → internals/csp-context}/CSPContext.js +0 -0
@@ -14,6 +14,8 @@ var _useRenderElement = require("../../internals/useRenderElement");
14
14
  var _CompositeList = require("../../internals/composite/list/CompositeList");
15
15
  var _TabsRootContext = require("./TabsRootContext");
16
16
  var _stateAttributesMapping = require("./stateAttributesMapping");
17
+ var _createBaseUIEventDetails = require("../../internals/createBaseUIEventDetails");
18
+ var _reasons = require("../../internals/reasons");
17
19
  var _jsxRuntime = require("react/jsx-runtime");
18
20
  /**
19
21
  * Groups the tabs and the corresponding panels.
@@ -33,9 +35,9 @@ const TabsRoot = exports.TabsRoot = /*#__PURE__*/React.forwardRef(function TabsR
33
35
  ...elementProps
34
36
  } = componentProps;
35
37
 
36
- // Track whether the user explicitly provided a `defaultValue` prop.
38
+ // Track whether the user explicitly provided a defined `defaultValue` prop.
37
39
  // Used to determine if we should honor a disabled tab selection.
38
- const hasExplicitDefaultValueProp = Object.hasOwn(componentProps, 'defaultValue');
40
+ const hasExplicitDefaultValueProp = componentProps.defaultValue !== undefined;
39
41
  const tabPanelRefs = React.useRef([]);
40
42
  const [mountedTabPanels, setMountedTabPanels] = React.useState(() => new Map());
41
43
  const [value, setValue] = (0, _useControlled.useControlled)({
@@ -103,6 +105,11 @@ const TabsRoot = exports.TabsRoot = /*#__PURE__*/React.forwardRef(function TabsR
103
105
  }
104
106
  setValue(newValue);
105
107
  });
108
+ const notifyAutomaticValueChange = (0, _useStableCallback.useStableCallback)((nextValue, reason) => {
109
+ onValueChangeProp?.(nextValue, (0, _createBaseUIEventDetails.createChangeEventDetails)(reason, undefined, undefined, {
110
+ activationDirection: 'none'
111
+ }));
112
+ });
106
113
  const registerMountedTabPanel = (0, _useStableCallback.useStableCallback)((panelValue, panelId) => {
107
114
  setMountedTabPanels(prev => {
108
115
  if (prev.get(panelValue) === panelId) {
@@ -170,38 +177,78 @@ const TabsRoot = exports.TabsRoot = /*#__PURE__*/React.forwardRef(function TabsR
170
177
  return undefined;
171
178
  }, [tabMap]);
172
179
 
173
- // Automatically switch to the first enabled tab when:
174
- // - The current selection is disabled (and wasn't explicitly set via defaultValue)
175
- // - The current selection is missing (tab was removed from DOM)
176
- // Falls back to null if all tabs are disabled.
180
+ // Implicit uncontrolled selections are still automatic changes, so notify
181
+ // once when the tabs first register. Explicit defaults are treated as user-owned.
182
+ const shouldNotifyInitialValueChangeRef = React.useRef(!hasExplicitDefaultValueProp);
183
+ // An explicit defaultValue can intentionally point at a disabled tab on mount.
184
+ // Once that selection becomes valid, later disabled states should fall back.
185
+ const shouldHonorDisabledDefaultValueRef = React.useRef(hasExplicitDefaultValueProp);
186
+ const didRegisterTabsRef = React.useRef(false);
187
+
188
+ // Uncontrolled roots own automatic fallback. Controlled roots keep the exact
189
+ // value supplied by the parent, even when that tab is disabled or missing.
177
190
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
178
- if (isControlled || tabMap.size === 0) {
191
+ if (isControlled) {
179
192
  return;
180
193
  }
194
+ function commitAutomaticValueChange(fallbackValue, fallbackReason) {
195
+ setValue(fallbackValue);
196
+ // Automatic fallbacks are not directional transitions; reset the direction
197
+ // alongside the value so the batched commit keeps both in sync.
198
+ setActivationDirectionState(prev => {
199
+ if (prev.previousValue === fallbackValue && prev.tabActivationDirection === 'none') {
200
+ return prev;
201
+ }
202
+ return {
203
+ previousValue: fallbackValue,
204
+ tabActivationDirection: 'none'
205
+ };
206
+ });
207
+ notifyAutomaticValueChange(fallbackValue, fallbackReason);
208
+ // Mark the initial notification as delivered only after the consumer
209
+ // callback returns. The fallback value is queued first so automatic
210
+ // consistency updates are not cancelable through a throwing handler.
211
+ shouldNotifyInitialValueChangeRef.current = false;
212
+ }
213
+ if (tabMap.size === 0) {
214
+ if (!didRegisterTabsRef.current || value === null) {
215
+ return;
216
+ }
217
+ commitAutomaticValueChange(null, _reasons.REASONS.missing);
218
+ return;
219
+ }
220
+ didRegisterTabsRef.current = true;
181
221
  const selectionIsDisabled = selectedTabMetadata?.disabled;
182
222
  const selectionIsMissing = selectedTabMetadata == null && value !== null;
183
- const shouldHonorExplicitDefaultSelection = hasExplicitDefaultValueProp && selectionIsDisabled && value === defaultValueProp;
184
- if (shouldHonorExplicitDefaultSelection) {
185
- return;
223
+ if (!selectionIsDisabled && value === defaultValueProp) {
224
+ shouldHonorDisabledDefaultValueRef.current = false;
186
225
  }
187
- if (!selectionIsDisabled && !selectionIsMissing) {
226
+ if (shouldHonorDisabledDefaultValueRef.current && selectionIsDisabled && value === defaultValueProp) {
188
227
  return;
189
228
  }
190
- const fallbackValue = firstEnabledTabValue ?? null;
191
- if (value === fallbackValue) {
229
+ const shouldNotifyInitialValueChange = shouldNotifyInitialValueChangeRef.current;
230
+ if (selectionIsDisabled || selectionIsMissing) {
231
+ const fallbackValue = firstEnabledTabValue ?? null;
232
+ if (value === fallbackValue) {
233
+ // Already at the fallback value; no commit or notification needed,
234
+ // but record that the implicit-initial transition has resolved.
235
+ shouldNotifyInitialValueChangeRef.current = false;
236
+ return;
237
+ }
238
+ let fallbackReason = _reasons.REASONS.missing;
239
+ if (shouldNotifyInitialValueChange) {
240
+ fallbackReason = _reasons.REASONS.initial;
241
+ } else if (selectionIsDisabled) {
242
+ fallbackReason = _reasons.REASONS.disabled;
243
+ }
244
+ commitAutomaticValueChange(fallbackValue, fallbackReason);
192
245
  return;
193
246
  }
194
- setValue(fallbackValue);
195
- setActivationDirectionState(prev => {
196
- if (prev.tabActivationDirection === 'none') {
197
- return prev;
198
- }
199
- return {
200
- ...prev,
201
- tabActivationDirection: 'none'
202
- };
203
- });
204
- }, [defaultValueProp, firstEnabledTabValue, hasExplicitDefaultValueProp, isControlled, selectedTabMetadata, setValue, tabMap, value]);
247
+ if (shouldNotifyInitialValueChange && selectedTabMetadata != null) {
248
+ notifyAutomaticValueChange(value, _reasons.REASONS.initial);
249
+ shouldNotifyInitialValueChangeRef.current = false;
250
+ }
251
+ }, [defaultValueProp, firstEnabledTabValue, isControlled, notifyAutomaticValueChange, selectedTabMetadata, setValue, tabMap, value]);
205
252
  const state = {
206
253
  orientation,
207
254
  tabActivationDirection
@@ -20,12 +20,10 @@ export interface TabsRootContext {
20
20
  getTabElementBySelectedValue: (selectedValue: TabsTab.Value | undefined) => HTMLElement | null;
21
21
  /**
22
22
  * Gets the `id` attribute of the Tab that corresponds to the given TabPanel value.
23
- * @param (any) panelValue Value to find the Tab for.
24
23
  */
25
24
  getTabIdByPanelValue: (panelValue: TabsTab.Value) => string | undefined;
26
25
  /**
27
26
  * Gets the `id` attribute of the TabPanel that corresponds to the given Tab value.
28
- * @param (any) tabValue Value to find the TabPanel for.
29
27
  */
30
28
  getTabPanelIdByValue: (tabValue: TabsTab.Value) => string | undefined;
31
29
  registerMountedTabPanel: (panelValue: TabsTab.Value | number, panelId: string) => void;
@@ -55,7 +55,7 @@ const ToastProvider = exports.ToastProvider = function ToastProvider(props) {
55
55
  }
56
56
  });
57
57
  return unsubscribe;
58
- }, [store, timeout, toastManager]);
58
+ }, [store, toastManager]);
59
59
  store.useSyncedValues({
60
60
  timeout,
61
61
  limit
@@ -20,7 +20,7 @@ export interface ToastRootState {
20
20
  */
21
21
  expanded: boolean;
22
22
  /**
23
- * Whether the toast was removed due to exceeding the limit.
23
+ * Whether the toast was limited because the toast limit was exceeded.
24
24
  */
25
25
  limited: boolean;
26
26
  /**
@@ -21,6 +21,7 @@ var _useRenderElement = require("../../internals/useRenderElement");
21
21
  var _useOpenChangeComplete = require("../../internals/useOpenChangeComplete");
22
22
  var _ToastRootCssVars = require("./ToastRootCssVars");
23
23
  var _constants = require("../../internals/constants");
24
+ var _useSwipeDismiss = require("../../utils/useSwipeDismiss");
24
25
  var _jsxRuntime = require("react/jsx-runtime");
25
26
  const stateAttributesMapping = {
26
27
  ..._stateAttributesMapping.transitionStatusMapping,
@@ -35,47 +36,6 @@ const REVERSE_CANCEL_THRESHOLD = 10;
35
36
  const OPPOSITE_DIRECTION_DAMPING_FACTOR = 0.5;
36
37
  const MIN_DRAG_THRESHOLD = 1;
37
38
  const TOAST_SWIPE_IGNORE_SELECTOR = `${_constants.BASE_UI_SWIPE_IGNORE_SELECTOR},${_constants.LEGACY_SWIPE_IGNORE_SELECTOR}`;
38
- function getDisplacement(direction, deltaX, deltaY) {
39
- switch (direction) {
40
- case 'up':
41
- return -deltaY;
42
- case 'down':
43
- return deltaY;
44
- case 'left':
45
- return -deltaX;
46
- case 'right':
47
- return deltaX;
48
- default:
49
- return 0;
50
- }
51
- }
52
- function getElementTransform(element) {
53
- const computedStyle = (0, _owner.ownerWindow)(element).getComputedStyle(element);
54
- const transform = computedStyle.transform;
55
- let translateX = 0;
56
- let translateY = 0;
57
- let scale = 1;
58
- if (transform && transform !== 'none') {
59
- const matrix = transform.match(/matrix(?:3d)?\(([^)]+)\)/);
60
- if (matrix) {
61
- const values = matrix[1].split(', ').map(parseFloat);
62
- if (values.length === 6) {
63
- translateX = values[4];
64
- translateY = values[5];
65
- scale = Math.sqrt(values[0] * values[0] + values[1] * values[1]);
66
- } else if (values.length === 16) {
67
- translateX = values[12];
68
- translateY = values[13];
69
- scale = values[0];
70
- }
71
- }
72
- }
73
- return {
74
- x: translateX,
75
- y: translateY,
76
- scale
77
- };
78
- }
79
39
 
80
40
  /**
81
41
  * Groups all parts of an individual toast.
@@ -133,6 +93,12 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
133
93
  y: 0
134
94
  });
135
95
  const isFirstPointerMoveRef = React.useRef(false);
96
+ const dragOffsetRef = React.useRef({
97
+ x: 0,
98
+ y: 0
99
+ });
100
+ const activePointerIdRef = React.useRef(null);
101
+ const dragAbortControllerRef = React.useRef(null);
136
102
  const domIndex = store.useState('toastIndex', toast.id);
137
103
  const visibleIndex = store.useState('toastVisibleIndex', toast.id);
138
104
  const offsetY = store.useState('toastOffsetY', toast.id);
@@ -148,11 +114,8 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
148
114
  }
149
115
  });
150
116
 
151
- /**
152
- * Recalculates the natural height of the toast and updates it in the toast manager.
153
- * @param flushSync Whether to flush the update synchronously. Use in observer
154
- * callbacks to avoid visual flickers.
155
- */
117
+ // Recalculates the natural height of the toast and updates it in the toast manager.
118
+ // `flushSync` avoids visual flickers when called from observer callbacks.
156
119
  const recalculateHeight = (0, _useStableCallback.useStableCallback)((flushSync = false) => {
157
120
  const element = rootRef.current;
158
121
  if (!element) {
@@ -178,6 +141,15 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
178
141
  }
179
142
  });
180
143
  (0, _useIsoLayoutEffect.useIsoLayoutEffect)(recalculateHeight, [recalculateHeight]);
144
+ function setResolvedDragOffset(nextDragOffset) {
145
+ dragOffsetRef.current = nextDragOffset;
146
+ setDragOffset(nextDragOffset);
147
+ }
148
+ (0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
149
+ return () => {
150
+ dragAbortControllerRef.current?.abort();
151
+ };
152
+ }, []);
181
153
  function applyDirectionalDamping(deltaX, deltaY) {
182
154
  let newDeltaX = deltaX;
183
155
  let newDeltaY = deltaY;
@@ -206,6 +178,75 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
206
178
  y: newDeltaY
207
179
  };
208
180
  }
181
+ const handleSwipeEnd = (0, _useStableCallback.useStableCallback)(event => {
182
+ if (event.pointerId !== activePointerIdRef.current) {
183
+ return;
184
+ }
185
+ activePointerIdRef.current = null;
186
+ dragAbortControllerRef.current?.abort();
187
+ dragAbortControllerRef.current = null;
188
+ setIsSwiping(false);
189
+ setIsRealSwipe(false);
190
+ setLockedDirection(null);
191
+ const resolvedInitialTransform = initialTransformRef.current;
192
+ if (event.type === 'pointercancel' || cancelledSwipeRef.current) {
193
+ setResolvedDragOffset({
194
+ x: resolvedInitialTransform.x,
195
+ y: resolvedInitialTransform.y
196
+ });
197
+ setCurrentSwipeDirection(undefined);
198
+ return;
199
+ }
200
+ let shouldClose = false;
201
+ const resolvedDragOffset = dragOffsetRef.current;
202
+ const deltaX = resolvedDragOffset.x - resolvedInitialTransform.x;
203
+ const deltaY = resolvedDragOffset.y - resolvedInitialTransform.y;
204
+ let dismissDirection;
205
+ for (const direction of swipeDirections) {
206
+ switch (direction) {
207
+ case 'right':
208
+ if (deltaX > SWIPE_THRESHOLD) {
209
+ shouldClose = true;
210
+ dismissDirection = 'right';
211
+ }
212
+ break;
213
+ case 'left':
214
+ if (deltaX < -SWIPE_THRESHOLD) {
215
+ shouldClose = true;
216
+ dismissDirection = 'left';
217
+ }
218
+ break;
219
+ case 'down':
220
+ if (deltaY > SWIPE_THRESHOLD) {
221
+ shouldClose = true;
222
+ dismissDirection = 'down';
223
+ }
224
+ break;
225
+ case 'up':
226
+ if (deltaY < -SWIPE_THRESHOLD) {
227
+ shouldClose = true;
228
+ dismissDirection = 'up';
229
+ }
230
+ break;
231
+ default:
232
+ break;
233
+ }
234
+ if (shouldClose) {
235
+ break;
236
+ }
237
+ }
238
+ if (shouldClose) {
239
+ setCurrentSwipeDirection(dismissDirection);
240
+ setDragDismissed(true);
241
+ store.closeToast(toast.id);
242
+ } else {
243
+ setResolvedDragOffset({
244
+ x: resolvedInitialTransform.x,
245
+ y: resolvedInitialTransform.y
246
+ });
247
+ setCurrentSwipeDirection(undefined);
248
+ }
249
+ });
209
250
  function handlePointerDown(event) {
210
251
  if (event.button !== 0) {
211
252
  return;
@@ -221,16 +262,17 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
221
262
  cancelledSwipeRef.current = false;
222
263
  intendedSwipeDirectionRef.current = undefined;
223
264
  maxSwipeDisplacementRef.current = 0;
265
+ activePointerIdRef.current = event.pointerId;
224
266
  dragStartPosRef.current = {
225
267
  x: event.clientX,
226
268
  y: event.clientY
227
269
  };
228
270
  swipeCancelBaselineRef.current = dragStartPosRef.current;
229
271
  if (rootRef.current) {
230
- const transform = getElementTransform(rootRef.current);
272
+ const transform = (0, _useSwipeDismiss.getElementTransform)(rootRef.current);
231
273
  initialTransformRef.current = transform;
232
274
  setInitialTransform(transform);
233
- setDragOffset({
275
+ setResolvedDragOffset({
234
276
  x: transform.x,
235
277
  y: transform.y
236
278
  });
@@ -240,10 +282,23 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
240
282
  setIsRealSwipe(false);
241
283
  setLockedDirection(null);
242
284
  isFirstPointerMoveRef.current = true;
243
- rootRef.current?.setPointerCapture(event.pointerId);
285
+ const element = rootRef.current;
286
+ if (element) {
287
+ dragAbortControllerRef.current?.abort();
288
+ const dragAbortController = new AbortController();
289
+ dragAbortControllerRef.current = dragAbortController;
290
+ const doc = (0, _owner.ownerDocument)(element);
291
+ doc.addEventListener('pointerup', handleSwipeEnd, {
292
+ signal: dragAbortController.signal
293
+ });
294
+ doc.addEventListener('pointercancel', handleSwipeEnd, {
295
+ signal: dragAbortController.signal
296
+ });
297
+ element.setPointerCapture?.(event.pointerId);
298
+ }
244
299
  }
245
300
  function handlePointerMove(event) {
246
- if (!isSwiping) {
301
+ if (event.pointerId !== activePointerIdRef.current) {
247
302
  return;
248
303
  }
249
304
 
@@ -316,12 +371,12 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
316
371
  }
317
372
  if (candidate && swipeDirections.includes(candidate)) {
318
373
  intendedSwipeDirectionRef.current = candidate;
319
- maxSwipeDisplacementRef.current = getDisplacement(candidate, deltaX, deltaY);
374
+ maxSwipeDisplacementRef.current = (0, _useSwipeDismiss.getDisplacement)(candidate, deltaX, deltaY);
320
375
  setCurrentSwipeDirection(candidate);
321
376
  }
322
377
  } else {
323
378
  const direction = intendedSwipeDirectionRef.current;
324
- const currentDisplacement = getDisplacement(direction, cancelDeltaX, cancelDeltaY);
379
+ const currentDisplacement = (0, _useSwipeDismiss.getDisplacement)(direction, cancelDeltaX, cancelDeltaY);
325
380
  if (currentDisplacement > SWIPE_THRESHOLD) {
326
381
  cancelledSwipeRef.current = false;
327
382
  setCurrentSwipeDirection(direction);
@@ -349,89 +404,11 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
349
404
  newOffsetY += dampedDelta.y;
350
405
  }
351
406
  }
352
- setDragOffset({
407
+ setResolvedDragOffset({
353
408
  x: newOffsetX,
354
409
  y: newOffsetY
355
410
  });
356
411
  }
357
- function handlePointerUp(event) {
358
- if (!isSwiping) {
359
- return;
360
- }
361
- setIsSwiping(false);
362
- setIsRealSwipe(false);
363
- setLockedDirection(null);
364
- rootRef.current?.releasePointerCapture(event.pointerId);
365
- if (cancelledSwipeRef.current) {
366
- setDragOffset({
367
- x: initialTransform.x,
368
- y: initialTransform.y
369
- });
370
- setCurrentSwipeDirection(undefined);
371
- return;
372
- }
373
- let shouldClose = false;
374
- const deltaX = dragOffset.x - initialTransform.x;
375
- const deltaY = dragOffset.y - initialTransform.y;
376
- let dismissDirection;
377
- for (const direction of swipeDirections) {
378
- switch (direction) {
379
- case 'right':
380
- if (deltaX > SWIPE_THRESHOLD) {
381
- shouldClose = true;
382
- dismissDirection = 'right';
383
- }
384
- break;
385
- case 'left':
386
- if (deltaX < -SWIPE_THRESHOLD) {
387
- shouldClose = true;
388
- dismissDirection = 'left';
389
- }
390
- break;
391
- case 'down':
392
- if (deltaY > SWIPE_THRESHOLD) {
393
- shouldClose = true;
394
- dismissDirection = 'down';
395
- }
396
- break;
397
- case 'up':
398
- if (deltaY < -SWIPE_THRESHOLD) {
399
- shouldClose = true;
400
- dismissDirection = 'up';
401
- }
402
- break;
403
- default:
404
- break;
405
- }
406
- if (shouldClose) {
407
- break;
408
- }
409
- }
410
- if (shouldClose) {
411
- setCurrentSwipeDirection(dismissDirection);
412
- setDragDismissed(true);
413
- store.closeToast(toast.id);
414
- } else {
415
- setDragOffset({
416
- x: initialTransform.x,
417
- y: initialTransform.y
418
- });
419
- setCurrentSwipeDirection(undefined);
420
- }
421
- }
422
- function handlePointerCancel() {
423
- if (!isSwiping) {
424
- return;
425
- }
426
- setIsSwiping(false);
427
- setIsRealSwipe(false);
428
- setLockedDirection(null);
429
- setDragOffset({
430
- x: initialTransform.x,
431
- y: initialTransform.y
432
- });
433
- setCurrentSwipeDirection(undefined);
434
- }
435
412
  function handleKeyDown(event) {
436
413
  if (event.key === 'Escape') {
437
414
  if (!rootRef.current || !(0, _utils.contains)(rootRef.current, (0, _utils.activeElement)((0, _owner.ownerDocument)(rootRef.current)))) {
@@ -485,8 +462,8 @@ const ToastRoot = exports.ToastRoot = /*#__PURE__*/React.forwardRef(function Toa
485
462
  'aria-hidden': isHighPriority && !focused ? true : undefined,
486
463
  onPointerDown: swipeEnabled ? handlePointerDown : undefined,
487
464
  onPointerMove: swipeEnabled ? handlePointerMove : undefined,
488
- onPointerUp: swipeEnabled ? handlePointerUp : undefined,
489
- onPointerCancel: swipeEnabled ? handlePointerCancel : undefined,
465
+ onPointerUp: swipeEnabled ? handleSwipeEnd : undefined,
466
+ onPointerCancel: swipeEnabled ? handleSwipeEnd : undefined,
490
467
  onKeyDown: handleKeyDown,
491
468
  inert: (0, _inertValue.inertValue)(toast.limited),
492
469
  style: {
@@ -5,7 +5,7 @@ export declare enum ToastRootDataAttributes {
5
5
  */
6
6
  expanded = "data-expanded",
7
7
  /**
8
- * Present when the toast was removed due to exceeding the limit.
8
+ * Present when the toast was limited because the toast limit was exceeded.
9
9
  * @type {boolean}
10
10
  */
11
11
  limited = "data-limited",
@@ -12,7 +12,7 @@ let ToastRootDataAttributes = exports.ToastRootDataAttributes = function (ToastR
12
12
  */
13
13
  ToastRootDataAttributes["expanded"] = "data-expanded";
14
14
  /**
15
- * Present when the toast was removed due to exceeding the limit.
15
+ * Present when the toast was limited because the toast limit was exceeded.
16
16
  * @type {boolean}
17
17
  */
18
18
  ToastRootDataAttributes["limited"] = "data-limited";
package/toast/store.d.ts CHANGED
@@ -10,6 +10,7 @@ type RemoveToastBehavior = {
10
10
  };
11
11
  export type State = {
12
12
  toasts: ToastObject<any>[];
13
+ toastMetadata: Map<string, ToastMetadata>;
13
14
  hovering: boolean;
14
15
  focused: boolean;
15
16
  timeout: number;
@@ -18,6 +19,13 @@ export type State = {
18
19
  viewport: HTMLElement | null;
19
20
  prevFocusElement: HTMLElement | null;
20
21
  };
22
+ type ToastMetadata = {
23
+ value: ToastObject<any>;
24
+ domIndex: number;
25
+ visibleIndex: number;
26
+ offsetY: number;
27
+ };
28
+ type InitialState = Omit<State, 'toastMetadata'>;
21
29
  export declare const selectors: {
22
30
  toasts: (state: State) => ToastObject<any>[];
23
31
  isEmpty: (state: State) => boolean;
@@ -34,7 +42,7 @@ export declare const selectors: {
34
42
  export declare class ToastStore extends ReactStore<State, {}, typeof selectors> {
35
43
  private timers;
36
44
  private areTimersPaused;
37
- constructor(initialState: State);
45
+ constructor(initialState: InitialState);
38
46
  setFocused(focused: boolean): void;
39
47
  setHovering(hovering: boolean): void;
40
48
  setIsWindowFocused(isWindowFocused: boolean): void;
package/toast/store.js CHANGED
@@ -11,13 +11,13 @@ var _useTimeout = require("@base-ui/utils/useTimeout");
11
11
  var _resolvePromiseOptions = require("./utils/resolvePromiseOptions");
12
12
  var _utils = require("../floating-ui-react/utils");
13
13
  var _focusVisible = require("./utils/focusVisible");
14
- const toastMapSelector = (0, _store.createSelectorMemoized)(state => state.toasts, toasts => {
15
- const map = new Map();
14
+ function createToastMetadata(toasts) {
15
+ const metadata = new Map();
16
16
  let visibleIndex = 0;
17
17
  let offsetY = 0;
18
18
  toasts.forEach((toast, toastIndex) => {
19
19
  const isEnding = toast.transitionStatus === 'ending';
20
- map.set(toast.id, {
20
+ metadata.set(toast.id, {
21
21
  value: toast,
22
22
  domIndex: toastIndex,
23
23
  visibleIndex: isEnding ? -1 : visibleIndex,
@@ -28,15 +28,16 @@ const toastMapSelector = (0, _store.createSelectorMemoized)(state => state.toast
28
28
  visibleIndex += 1;
29
29
  }
30
30
  });
31
- return map;
32
- });
31
+ return metadata;
32
+ }
33
+ const toastMetadataSelector = state => state.toastMetadata;
33
34
  const selectors = exports.selectors = {
34
35
  toasts: (0, _store.createSelector)(state => state.toasts),
35
36
  isEmpty: (0, _store.createSelector)(state => state.toasts.length === 0),
36
- toast: (0, _store.createSelector)(toastMapSelector, (toastMap, id) => toastMap.get(id)?.value),
37
- toastIndex: (0, _store.createSelector)(toastMapSelector, (toastMap, id) => toastMap.get(id)?.domIndex ?? -1),
38
- toastOffsetY: (0, _store.createSelector)(toastMapSelector, (toastMap, id) => toastMap.get(id)?.offsetY ?? 0),
39
- toastVisibleIndex: (0, _store.createSelector)(toastMapSelector, (toastMap, id) => toastMap.get(id)?.visibleIndex ?? -1),
37
+ toast: (0, _store.createSelector)(toastMetadataSelector, (toastMetadata, id) => toastMetadata.get(id)?.value),
38
+ toastIndex: (0, _store.createSelector)(toastMetadataSelector, (toastMetadata, id) => toastMetadata.get(id)?.domIndex ?? -1),
39
+ toastOffsetY: (0, _store.createSelector)(toastMetadataSelector, (toastMetadata, id) => toastMetadata.get(id)?.offsetY ?? 0),
40
+ toastVisibleIndex: (0, _store.createSelector)(toastMetadataSelector, (toastMetadata, id) => toastMetadata.get(id)?.visibleIndex ?? -1),
40
41
  hovering: (0, _store.createSelector)(state => state.hovering),
41
42
  focused: (0, _store.createSelector)(state => state.focused),
42
43
  expanded: (0, _store.createSelector)(state => state.hovering || state.focused),
@@ -47,7 +48,10 @@ class ToastStore extends _store.ReactStore {
47
48
  timers = new Map();
48
49
  areTimersPaused = false;
49
50
  constructor(initialState) {
50
- super(initialState, {}, selectors);
51
+ super({
52
+ ...initialState,
53
+ toastMetadata: createToastMetadata(initialState.toasts)
54
+ }, {}, selectors);
51
55
  }
52
56
  setFocused(focused) {
53
57
  this.set('focused', focused);
@@ -252,7 +256,8 @@ class ToastStore extends _store.ReactStore {
252
256
  } : item;
253
257
  });
254
258
  const updates = {
255
- toasts: newToasts
259
+ toasts: newToasts,
260
+ toastMetadata: createToastMetadata(newToasts)
256
261
  };
257
262
  if (closeAll || toasts.length === 1) {
258
263
  updates.hovering = false;
@@ -364,7 +369,8 @@ class ToastStore extends _store.ReactStore {
364
369
  }
365
370
  setToasts(newToasts) {
366
371
  const updates = {
367
- toasts: newToasts
372
+ toasts: newToasts,
373
+ toastMetadata: createToastMetadata(newToasts)
368
374
  };
369
375
  if (newToasts.length === 0) {
370
376
  updates.hovering = false;
@@ -48,7 +48,7 @@ export interface ToastObject<Data extends object> {
48
48
  */
49
49
  updateKey?: number | undefined;
50
50
  /**
51
- * Determines if the toast was closed due to the limit being reached.
51
+ * Determines if the toast was limited because the toast limit was exceeded.
52
52
  */
53
53
  limited?: boolean | undefined;
54
54
  /**
@@ -45,6 +45,7 @@ const ToastViewport = exports.ToastViewport = /*#__PURE__*/React.forwardRef(func
45
45
  const prevFocusElement = store.useState('prevFocusElement');
46
46
  const frontmostHeight = toasts[0]?.height ?? 0;
47
47
  const hasTransitioningToasts = React.useMemo(() => toasts.some(toast => toast.transitionStatus === 'ending'), [toasts]);
48
+ const highPriorityToasts = React.useMemo(() => toasts.filter(toast => toast.priority === 'high'), [toasts]);
48
49
 
49
50
  // Listen globally for F6 so we can force-focus the viewport.
50
51
  React.useEffect(() => {
@@ -234,7 +235,6 @@ const ToastViewport = exports.ToastViewport = /*#__PURE__*/React.forwardRef(func
234
235
  })
235
236
  }]
236
237
  });
237
- const highPriorityToasts = React.useMemo(() => toasts.filter(toast => toast.priority === 'high'), [toasts]);
238
238
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
239
239
  children: [!isEmpty && prevFocusElement && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FocusGuard.FocusGuard, {
240
240
  onFocus: handleFocusGuard