@octanejs/base-ui 0.1.49 → 0.1.51

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 (1179) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION.md +47 -0
  3. package/README.md +62 -5
  4. package/UPSTREAM.md +164 -64
  5. package/package.json +458 -27
  6. package/src/accordion/header/AccordionHeader.tsrx +42 -0
  7. package/src/accordion/header/AccordionHeaderDataAttributes.ts +13 -0
  8. package/src/accordion/index.parts.ts +5 -0
  9. package/src/accordion/index.ts +16 -0
  10. package/src/accordion/item/AccordionItem.tsrx +195 -0
  11. package/src/accordion/item/AccordionItemContext.ts +26 -0
  12. package/src/accordion/item/AccordionItemDataAttributes.ts +13 -0
  13. package/src/accordion/item/stateAttributesMapping.ts +12 -0
  14. package/src/accordion/panel/AccordionPanel.tsrx +163 -0
  15. package/src/accordion/panel/AccordionPanelCssVars.ts +10 -0
  16. package/src/accordion/panel/AccordionPanelDataAttributes.ts +27 -0
  17. package/src/accordion/root/AccordionRoot.tsrx +240 -0
  18. package/src/accordion/root/AccordionRootContext.ts +31 -0
  19. package/src/accordion/root/AccordionRootDataAttributes.ts +8 -0
  20. package/src/accordion/trigger/AccordionTrigger.tsrx +81 -0
  21. package/src/accordion/trigger/AccordionTriggerDataAttributes.ts +8 -0
  22. package/src/alert-dialog/handle.ts +22 -0
  23. package/src/alert-dialog/index.parts.ts +10 -0
  24. package/src/alert-dialog/index.ts +39 -0
  25. package/src/alert-dialog/root/AlertDialogRoot.tsrx +58 -0
  26. package/src/alert-dialog/trigger/AlertDialogTrigger.tsrx +38 -0
  27. package/src/alert-dialog/trigger/AlertDialogTriggerDataAttributes.ts +10 -0
  28. package/src/autocomplete/clear/AutocompleteClearDataAttributes.ts +1 -0
  29. package/src/autocomplete/index.parts.ts +25 -0
  30. package/src/autocomplete/index.ts +78 -0
  31. package/src/autocomplete/input-group/AutocompleteInputGroup.tsrx +53 -0
  32. package/src/autocomplete/input-group/AutocompleteInputGroupDataAttributes.ts +49 -0
  33. package/src/autocomplete/item/AutocompleteItem.tsrx +56 -0
  34. package/src/autocomplete/item/AutocompleteItemDataAttributes.ts +10 -0
  35. package/src/autocomplete/root/AutocompleteRoot.tsrx +296 -0
  36. package/src/autocomplete/separator/AutocompleteSeparator.tsrx +37 -0
  37. package/src/autocomplete/trigger/AutocompleteTrigger.tsrx +57 -0
  38. package/src/autocomplete/trigger/AutocompleteTriggerDataAttributes.ts +55 -0
  39. package/src/autocomplete/value/AutocompleteValue.tsrx +38 -0
  40. package/src/avatar/fallback/AvatarFallback.tsrx +68 -0
  41. package/src/avatar/image/AvatarImage.tsrx +210 -0
  42. package/src/avatar/image/AvatarImageDataAttributes.ts +18 -0
  43. package/src/avatar/image/useImageLoadingStatus.ts +72 -0
  44. package/src/avatar/index.parts.ts +3 -0
  45. package/src/avatar/index.ts +5 -0
  46. package/src/avatar/root/AvatarRoot.tsrx +60 -0
  47. package/src/avatar/root/AvatarRootContext.ts +21 -0
  48. package/src/avatar/root/stateAttributesMapping.ts +3 -0
  49. package/src/button/Button.tsrx +63 -0
  50. package/src/button/ButtonDataAttributes.tsrx +4 -0
  51. package/src/button/index.ts +3 -0
  52. package/src/checkbox/index.parts.ts +2 -0
  53. package/src/checkbox/index.ts +4 -0
  54. package/src/checkbox/indicator/CheckboxIndicator.tsrx +96 -0
  55. package/src/checkbox/indicator/CheckboxIndicatorDataAttributes.ts +58 -0
  56. package/src/checkbox/root/CheckboxRoot.tsrx +516 -0
  57. package/src/checkbox/root/CheckboxRootContext.ts +19 -0
  58. package/src/checkbox/root/CheckboxRootDataAttributes.ts +48 -0
  59. package/src/checkbox/utils/getCheckboxStateAttributesMapping.ts +24 -0
  60. package/src/checkbox-group/CheckboxGroup.tsrx +229 -0
  61. package/src/checkbox-group/CheckboxGroupContext.ts +33 -0
  62. package/src/checkbox-group/CheckboxGroupDataAttributes.ts +4 -0
  63. package/src/checkbox-group/index.ts +2 -0
  64. package/src/checkbox-group/useCheckboxGroupParent.ts +176 -0
  65. package/src/collapsible/index.parts.ts +3 -0
  66. package/src/collapsible/index.ts +12 -0
  67. package/src/collapsible/panel/CollapsiblePanel.tsrx +168 -0
  68. package/src/collapsible/panel/CollapsiblePanelCssVars.ts +10 -0
  69. package/src/collapsible/panel/CollapsiblePanelDataAttributes.ts +18 -0
  70. package/src/collapsible/panel/useCollapsiblePanel.ts +577 -0
  71. package/src/collapsible/root/CollapsibleRoot.tsrx +116 -0
  72. package/src/collapsible/root/CollapsibleRootContext.ts +25 -0
  73. package/src/collapsible/root/CollapsibleRootDataAttributes.ts +18 -0
  74. package/src/collapsible/root/stateAttributesMapping.ts +9 -0
  75. package/src/collapsible/root/useCollapsibleRoot.ts +121 -0
  76. package/src/collapsible/trigger/CollapsibleTrigger.tsrx +78 -0
  77. package/src/collapsible/trigger/CollapsibleTriggerDataAttributes.ts +4 -0
  78. package/src/combobox/arrow/ComboboxArrow.tsrx +72 -0
  79. package/src/combobox/arrow/ComboboxArrowDataAttributes.ts +24 -0
  80. package/src/combobox/backdrop/ComboboxBackdrop.tsrx +75 -0
  81. package/src/combobox/backdrop/ComboboxBackdropDataAttributes.ts +18 -0
  82. package/src/combobox/chip/ComboboxChip.tsrx +150 -0
  83. package/src/combobox/chip/ComboboxChipContext.ts +19 -0
  84. package/src/combobox/chip-remove/ComboboxChipRemove.tsrx +138 -0
  85. package/src/combobox/chips/ComboboxChips.tsrx +78 -0
  86. package/src/combobox/chips/ComboboxChipsContext.ts +17 -0
  87. package/src/combobox/clear/ComboboxClear.tsrx +178 -0
  88. package/src/combobox/clear/ComboboxClearDataAttributes.ts +25 -0
  89. package/src/combobox/collection/ComboboxCollection.tsrx +34 -0
  90. package/src/combobox/collection/GroupCollectionContext.tsrx +31 -0
  91. package/src/combobox/empty/ComboboxEmpty.tsrx +58 -0
  92. package/src/combobox/group/ComboboxGroup.tsrx +74 -0
  93. package/src/combobox/group/ComboboxGroupContext.ts +27 -0
  94. package/src/combobox/group-label/ComboboxGroupLabel.tsrx +52 -0
  95. package/src/combobox/icon/ComboboxIcon.tsrx +41 -0
  96. package/src/combobox/index.parts.ts +31 -0
  97. package/src/combobox/index.ts +36 -0
  98. package/src/combobox/input/ComboboxInput.tsrx +507 -0
  99. package/src/combobox/input/ComboboxInputDataAttributes.ts +55 -0
  100. package/src/combobox/input-group/ComboboxInputGroup.tsrx +110 -0
  101. package/src/combobox/input-group/ComboboxInputGroupDataAttributes.ts +53 -0
  102. package/src/combobox/item/ComboboxItem.tsrx +328 -0
  103. package/src/combobox/item/ComboboxItemContext.ts +20 -0
  104. package/src/combobox/item/ComboboxItemDataAttributes.ts +12 -0
  105. package/src/combobox/item-indicator/ComboboxItemIndicator.tsrx +109 -0
  106. package/src/combobox/item-indicator/ComboboxItemIndicatorDataAttributes.ts +10 -0
  107. package/src/combobox/items/createItems.ts +168 -0
  108. package/src/combobox/items/itemCollection.ts +67 -0
  109. package/src/combobox/label/ComboboxLabel.tsrx +88 -0
  110. package/src/combobox/list/ComboboxList.tsrx +152 -0
  111. package/src/combobox/popup/ComboboxPopup.tsrx +214 -0
  112. package/src/combobox/popup/ComboboxPopupDataAttributes.ts +36 -0
  113. package/src/combobox/portal/ComboboxPortal.tsrx +56 -0
  114. package/src/combobox/portal/ComboboxPortalContext.tsrx +12 -0
  115. package/src/combobox/positioner/ComboboxPositioner.tsrx +172 -0
  116. package/src/combobox/positioner/ComboboxPositionerContext.tsrx +30 -0
  117. package/src/combobox/positioner/ComboboxPositionerCssVars.ts +25 -0
  118. package/src/combobox/positioner/ComboboxPositionerDataAttributes.ts +28 -0
  119. package/src/combobox/root/AriaCombobox.tsrx +1970 -0
  120. package/src/combobox/root/ComboboxRoot.tsrx +183 -0
  121. package/src/combobox/root/ComboboxRootContext.tsrx +66 -0
  122. package/src/combobox/root/utils/constants.ts +5 -0
  123. package/src/combobox/root/utils/index.ts +68 -0
  124. package/src/combobox/root/utils/useFilter.ts +50 -0
  125. package/src/combobox/root/utils/useFilteredItems.ts +11 -0
  126. package/src/combobox/row/ComboboxRow.tsrx +37 -0
  127. package/src/combobox/row/ComboboxRowContext.ts +9 -0
  128. package/src/combobox/separator/ComboboxSeparator.tsrx +37 -0
  129. package/src/combobox/status/ComboboxStatus.tsrx +49 -0
  130. package/src/combobox/store.ts +206 -0
  131. package/src/combobox/trigger/ComboboxTrigger.tsrx +302 -0
  132. package/src/combobox/trigger/ComboboxTriggerDataAttributes.ts +59 -0
  133. package/src/combobox/utils/ComboboxInternalDismissButton.tsrx +47 -0
  134. package/src/combobox/utils/handleInputPress.ts +38 -0
  135. package/src/combobox/utils/parts.ts +59 -0
  136. package/src/combobox/utils/stateAttributesMapping.ts +19 -0
  137. package/src/combobox/utils/useInitialLiveRegionTextMutation.ts +66 -0
  138. package/src/combobox/value/ComboboxValue.tsrx +65 -0
  139. package/src/context-menu/index.parts.ts +21 -0
  140. package/src/context-menu/index.ts +66 -0
  141. package/src/context-menu/positioner/ContextMenuPositioner.tsrx +119 -0
  142. package/src/context-menu/positioner/ContextMenuPositionerCssVars.ts +1 -0
  143. package/src/context-menu/positioner/ContextMenuPositionerDataAttributes.ts +1 -0
  144. package/src/context-menu/root/ContextMenuRoot.tsrx +98 -0
  145. package/src/context-menu/root/ContextMenuRootContext.ts +34 -0
  146. package/src/context-menu/trigger/ContextMenuTrigger.tsrx +237 -0
  147. package/src/context-menu/trigger/ContextMenuTriggerDataAttributes.ts +10 -0
  148. package/src/csp-provider/CSPProvider.tsrx +43 -0
  149. package/src/csp-provider/index.parts.ts +1 -0
  150. package/src/csp-provider/index.ts +3 -0
  151. package/src/dialog/backdrop/DialogBackdrop.tsrx +76 -0
  152. package/src/dialog/backdrop/DialogBackdropDataAttributes.ts +18 -0
  153. package/src/dialog/close/DialogClose.tsrx +67 -0
  154. package/src/dialog/close/DialogCloseDataAttributes.ts +4 -0
  155. package/src/dialog/description/DialogDescription.tsrx +41 -0
  156. package/src/dialog/index.parts.ts +10 -0
  157. package/src/dialog/index.ts +14 -0
  158. package/src/dialog/popup/DialogPopup.tsrx +170 -0
  159. package/src/dialog/popup/DialogPopupCssVars.ts +5 -0
  160. package/src/dialog/popup/DialogPopupDataAttributes.ts +26 -0
  161. package/src/dialog/portal/DialogPortal.tsrx +63 -0
  162. package/src/dialog/portal/DialogPortalContext.ts +13 -0
  163. package/src/dialog/root/DialogRoot.tsrx +117 -0
  164. package/src/dialog/root/DialogRootContext.ts +20 -0
  165. package/src/dialog/root/useDialogRoot.ts +128 -0
  166. package/src/dialog/root/useRenderDialogRoot.tsrx +108 -0
  167. package/src/dialog/store/DialogHandle.ts +83 -0
  168. package/src/dialog/store/DialogStore.ts +149 -0
  169. package/src/dialog/title/DialogTitle.tsrx +41 -0
  170. package/src/dialog/trigger/DialogTrigger.tsrx +142 -0
  171. package/src/dialog/trigger/DialogTriggerDataAttributes.ts +10 -0
  172. package/src/dialog/utils/stateAttributesMapping.ts +22 -0
  173. package/src/dialog/viewport/DialogViewport.tsrx +89 -0
  174. package/src/dialog/viewport/DialogViewportDataAttributes.ts +26 -0
  175. package/src/direction-provider/DirectionProvider.tsrx +37 -0
  176. package/src/direction-provider/index.parts.ts +5 -0
  177. package/src/direction-provider/index.ts +2 -0
  178. package/src/drawer/backdrop/DrawerBackdrop.tsrx +81 -0
  179. package/src/drawer/backdrop/DrawerBackdropCssVars.ts +5 -0
  180. package/src/drawer/backdrop/DrawerBackdropDataAttributes.ts +18 -0
  181. package/src/drawer/close/DrawerClose.tsrx +31 -0
  182. package/src/drawer/content/DrawerContent.tsrx +37 -0
  183. package/src/drawer/content/drawerContentAttribute.ts +1 -0
  184. package/src/drawer/description/DrawerDescription.tsrx +25 -0
  185. package/src/drawer/handle.ts +22 -0
  186. package/src/drawer/indent/DrawerIndent.tsrx +104 -0
  187. package/src/drawer/indent-background/DrawerIndentBackground.tsrx +61 -0
  188. package/src/drawer/index.parts.ts +16 -0
  189. package/src/drawer/index.ts +17 -0
  190. package/src/drawer/popup/DrawerPopup.tsrx +485 -0
  191. package/src/drawer/popup/DrawerPopupCssVars.ts +35 -0
  192. package/src/drawer/popup/DrawerPopupDataAttributes.ts +43 -0
  193. package/src/drawer/portal/DrawerPortal.tsrx +39 -0
  194. package/src/drawer/provider/DrawerProvider.tsrx +117 -0
  195. package/src/drawer/provider/DrawerProviderContext.ts +29 -0
  196. package/src/drawer/root/DrawerRoot.tsrx +478 -0
  197. package/src/drawer/root/DrawerRootContext.ts +115 -0
  198. package/src/drawer/root/useDrawerSnapPoints.ts +198 -0
  199. package/src/drawer/swipe-area/DrawerSwipeArea.tsrx +528 -0
  200. package/src/drawer/swipe-area/DrawerSwipeAreaDataAttributes.ts +23 -0
  201. package/src/drawer/title/DrawerTitle.tsrx +25 -0
  202. package/src/drawer/trigger/DrawerTrigger.tsrx +53 -0
  203. package/src/drawer/viewport/DrawerViewport.tsrx +1237 -0
  204. package/src/drawer/viewport/DrawerViewportContext.tsrx +15 -0
  205. package/src/drawer/viewport/DrawerViewportCssVars.ts +6 -0
  206. package/src/drawer/viewport/DrawerViewportDataAttributes.ts +22 -0
  207. package/src/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardContext.tsrx +19 -0
  208. package/src/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardProvider.tsrx +858 -0
  209. package/src/field/control/FieldControl.tsrx +241 -0
  210. package/src/field/control/FieldControlDataAttributes.ts +28 -0
  211. package/src/field/description/FieldDescription.tsrx +67 -0
  212. package/src/field/description/FieldDescriptionDataAttributes.ts +28 -0
  213. package/src/field/error/FieldError.tsrx +160 -0
  214. package/src/field/error/FieldErrorDataAttributes.ts +38 -0
  215. package/src/field/index.parts.ts +9 -0
  216. package/src/field/index.ts +9 -0
  217. package/src/field/item/FieldItem.tsrx +66 -0
  218. package/src/field/item/FieldItemContext.ts +15 -0
  219. package/src/field/item/FieldItemDataAttributes.ts +28 -0
  220. package/src/field/label/FieldLabel.tsrx +107 -0
  221. package/src/field/label/FieldLabelDataAttributes.ts +28 -0
  222. package/src/field/root/FieldRoot.tsrx +336 -0
  223. package/src/field/root/FieldRootDataAttributes.ts +28 -0
  224. package/src/field/root/useFieldValidation.ts +418 -0
  225. package/src/field/utils/getCombinedFieldValidityData.ts +18 -0
  226. package/src/field/validity/FieldValidity.tsrx +69 -0
  227. package/src/fieldset/index.parts.ts +2 -0
  228. package/src/fieldset/index.ts +4 -0
  229. package/src/fieldset/legend/FieldsetLegend.tsrx +51 -0
  230. package/src/fieldset/root/FieldsetRoot.tsrx +74 -0
  231. package/src/fieldset/root/FieldsetRootContext.ts +23 -0
  232. package/src/floating-ui-react/components/FloatingDelayGroup.tsrx +281 -0
  233. package/src/floating-ui-react/components/FloatingFocusManager.tsrx +1004 -0
  234. package/src/floating-ui-react/components/FloatingPortal.tsrx +319 -0
  235. package/src/floating-ui-react/components/FloatingRootStore.ts +136 -0
  236. package/src/floating-ui-react/components/FloatingTree.tsrx +95 -0
  237. package/src/floating-ui-react/components/FloatingTreeStore.ts +24 -0
  238. package/src/floating-ui-react/hooks/gridNavigation.ts +50 -0
  239. package/src/floating-ui-react/hooks/useClick.ts +229 -0
  240. package/src/floating-ui-react/hooks/useClientPoint.ts +261 -0
  241. package/src/floating-ui-react/hooks/useDismiss.ts +808 -0
  242. package/src/floating-ui-react/hooks/useFloating.ts +205 -0
  243. package/src/floating-ui-react/hooks/useFloatingRootContext.ts +84 -0
  244. package/src/floating-ui-react/hooks/useFocus.ts +253 -0
  245. package/src/floating-ui-react/hooks/useHover.ts +468 -0
  246. package/src/floating-ui-react/hooks/useHoverFloatingInteraction.ts +274 -0
  247. package/src/floating-ui-react/hooks/useHoverInteractionSharedState.ts +132 -0
  248. package/src/floating-ui-react/hooks/useHoverReferenceInteraction.ts +523 -0
  249. package/src/floating-ui-react/hooks/useHoverShared.ts +72 -0
  250. package/src/floating-ui-react/hooks/useListNavigation.ts +941 -0
  251. package/src/floating-ui-react/hooks/useSyncedFloatingRootContext.ts +115 -0
  252. package/src/floating-ui-react/hooks/useTypeahead.ts +248 -0
  253. package/src/floating-ui-react/index.ts +48 -0
  254. package/src/floating-ui-react/middleware/arrow.ts +128 -0
  255. package/src/floating-ui-react/middleware/positioning.ts +28 -0
  256. package/src/floating-ui-react/safePolygon.ts +451 -0
  257. package/src/floating-ui-react/types.ts +206 -0
  258. package/src/floating-ui-react/utils/composite.ts +528 -0
  259. package/src/floating-ui-react/utils/constants.ts +10 -0
  260. package/src/floating-ui-react/utils/createAttribute.ts +3 -0
  261. package/src/floating-ui-react/utils/createEventEmitter.ts +19 -0
  262. package/src/floating-ui-react/utils/element.ts +96 -0
  263. package/src/floating-ui-react/utils/enqueueFocus.ts +37 -0
  264. package/src/floating-ui-react/utils/event.ts +60 -0
  265. package/src/floating-ui-react/utils/getEmptyRootContext.ts +17 -0
  266. package/src/floating-ui-react/utils/markOthers.ts +219 -0
  267. package/src/floating-ui-react/utils/nodes.ts +54 -0
  268. package/src/floating-ui-react/utils/tabbable.ts +283 -0
  269. package/src/floating-ui-react/utils.ts +5 -0
  270. package/src/form/Form.tsrx +248 -0
  271. package/src/form/index.ts +3 -0
  272. package/src/global.d.ts +9 -0
  273. package/src/index.ts +45 -39
  274. package/src/input/Input.tsrx +44 -0
  275. package/src/input/InputDataAttributes.ts +28 -0
  276. package/src/input/index.ts +3 -0
  277. package/src/internals/PrehydrationScript.tsrx +59 -0
  278. package/src/internals/RequestQueue.ts +126 -0
  279. package/src/internals/TimeoutManager.ts +29 -0
  280. package/src/internals/TransitionStatusDataAttributes.ts +9 -0
  281. package/src/internals/composite/composite.ts +174 -0
  282. package/src/internals/composite/constants.ts +1 -0
  283. package/src/internals/composite/index.ts +19 -0
  284. package/src/internals/composite/item/CompositeItem.tsrx +57 -0
  285. package/src/internals/composite/item/useCompositeItem.ts +50 -0
  286. package/src/internals/composite/list/CompositeList.tsrx +325 -0
  287. package/src/internals/composite/list/CompositeListContext.ts +28 -0
  288. package/src/internals/composite/list/useCompositeListItem.ts +100 -0
  289. package/src/internals/composite/root/CompositeRoot.tsrx +138 -0
  290. package/src/internals/composite/root/CompositeRootContext.ts +33 -0
  291. package/src/internals/composite/root/gridNavigation.ts +127 -0
  292. package/src/internals/composite/root/useCompositeRoot.ts +378 -0
  293. package/src/internals/constants.ts +41 -0
  294. package/src/internals/createBaseUIEventDetails.ts +166 -0
  295. package/src/internals/csp-context/CSPContext.tsrx +17 -0
  296. package/src/internals/csp-context/index.ts +2 -0
  297. package/src/internals/direction-context/DirectionContext.tsrx +16 -0
  298. package/src/internals/direction-context/index.ts +5 -0
  299. package/src/internals/field-constants/constants.ts +44 -0
  300. package/src/internals/field-constants/index.ts +6 -0
  301. package/src/internals/field-register-control/index.ts +6 -0
  302. package/src/internals/field-register-control/useFieldControlRegistration.ts +185 -0
  303. package/src/internals/field-register-control/useRegisterFieldControl.ts +47 -0
  304. package/src/internals/field-root-context/FieldRootContext.ts +79 -0
  305. package/src/internals/field-root-context/index.ts +2 -0
  306. package/src/internals/filter.ts +82 -0
  307. package/src/internals/form-context/FormContext.ts +51 -0
  308. package/src/internals/form-context/index.ts +2 -0
  309. package/src/internals/getDisabledMountTransitionStyles.ts +10 -0
  310. package/src/internals/getStateAttributesProps.ts +32 -0
  311. package/src/internals/itemEquality.ts +134 -0
  312. package/src/internals/labelable-provider/LabelableContext.ts +49 -0
  313. package/src/internals/labelable-provider/LabelableProvider.tsrx +120 -0
  314. package/src/internals/labelable-provider/index.ts +6 -0
  315. package/src/internals/labelable-provider/useAriaLabelledBy.ts +73 -0
  316. package/src/internals/labelable-provider/useLabel.ts +113 -0
  317. package/src/internals/labelable-provider/useLabelableId.ts +101 -0
  318. package/src/internals/noop.ts +1 -0
  319. package/src/internals/prehydrationScript.stub.ts +6 -0
  320. package/src/internals/reason-parts.ts +42 -0
  321. package/src/internals/reasons.ts +5 -0
  322. package/src/internals/resolveValueLabel.tsrx +158 -0
  323. package/src/internals/serializeValue.ts +13 -0
  324. package/src/internals/stateAttributesMapping.ts +20 -0
  325. package/src/internals/temporal/index.ts +2 -0
  326. package/src/internals/temporal/temporal-adapter.ts +382 -0
  327. package/src/internals/temporal/temporal.ts +49 -0
  328. package/src/internals/temporal-adapter-date-fns/TemporalAdapterDateFns.ts +474 -0
  329. package/src/internals/temporal-adapter-date-fns/index.ts +1 -0
  330. package/src/internals/temporal-adapter-luxon/TemporalAdapterLuxon.ts +380 -0
  331. package/src/internals/temporal-adapter-luxon/index.ts +1 -0
  332. package/src/internals/types.ts +97 -0
  333. package/src/internals/use-button/index.ts +1 -0
  334. package/src/internals/use-button/useButton.ts +309 -0
  335. package/src/internals/useAnchorPositioning.ts +828 -0
  336. package/src/internals/useAnimationsFinished.ts +161 -0
  337. package/src/internals/useBaseUiId.ts +12 -0
  338. package/src/internals/useOpenChangeComplete.tsrx +56 -0
  339. package/src/internals/usePressAndHold.ts +287 -0
  340. package/src/internals/useRenderElement.tsrx +284 -0
  341. package/src/internals/useTransitionStatus.ts +98 -0
  342. package/src/internals/useValueChanged.ts +18 -0
  343. package/src/menu/arrow/MenuArrow.tsrx +71 -0
  344. package/src/menu/arrow/MenuArrowDataAttributes.ts +24 -0
  345. package/src/menu/backdrop/MenuBackdrop.tsrx +75 -0
  346. package/src/menu/backdrop/MenuBackdropDataAttributes.ts +18 -0
  347. package/src/menu/checkbox-item/MenuCheckboxItem.tsrx +184 -0
  348. package/src/menu/checkbox-item/MenuCheckboxItemContext.ts +24 -0
  349. package/src/menu/checkbox-item/MenuCheckboxItemDataAttributes.ts +16 -0
  350. package/src/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.tsrx +96 -0
  351. package/src/menu/checkbox-item-indicator/MenuCheckboxItemIndicatorDataAttributes.ts +22 -0
  352. package/src/menu/group/MenuGroup.tsrx +47 -0
  353. package/src/menu/group/MenuGroupContext.ts +18 -0
  354. package/src/menu/group-label/MenuGroupLabel.tsrx +51 -0
  355. package/src/menu/index.parts.ts +21 -0
  356. package/src/menu/index.ts +24 -0
  357. package/src/menu/item/MenuItem.tsrx +107 -0
  358. package/src/menu/item/MenuItemDataAttributes.ts +8 -0
  359. package/src/menu/item/useMenuItem.ts +142 -0
  360. package/src/menu/item/useMenuItemCommonProps.ts +139 -0
  361. package/src/menu/link-item/MenuLinkItem.tsrx +106 -0
  362. package/src/menu/link-item/MenuLinkItemDataAttributes.ts +4 -0
  363. package/src/menu/popup/MenuPopup.tsrx +199 -0
  364. package/src/menu/popup/MenuPopupDataAttributes.ts +33 -0
  365. package/src/menu/portal/MenuPortal.tsrx +60 -0
  366. package/src/menu/portal/MenuPortalContext.ts +13 -0
  367. package/src/menu/positioner/MenuPositioner.tsrx +378 -0
  368. package/src/menu/positioner/MenuPositionerContext.ts +25 -0
  369. package/src/menu/positioner/MenuPositionerCssVars.ts +37 -0
  370. package/src/menu/positioner/MenuPositionerDataAttributes.ts +24 -0
  371. package/src/menu/radio-group/MenuRadioGroup.tsrx +129 -0
  372. package/src/menu/radio-group/MenuRadioGroupContext.ts +25 -0
  373. package/src/menu/radio-item/MenuRadioItem.tsrx +156 -0
  374. package/src/menu/radio-item/MenuRadioItemContext.ts +24 -0
  375. package/src/menu/radio-item/MenuRadioItemDataAttributes.ts +16 -0
  376. package/src/menu/radio-item-indicator/MenuRadioItemIndicator.tsrx +96 -0
  377. package/src/menu/radio-item-indicator/MenuRadioItemIndicatorDataAttributes.ts +22 -0
  378. package/src/menu/root/MenuRoot.tsrx +818 -0
  379. package/src/menu/root/MenuRootContext.ts +25 -0
  380. package/src/menu/store/MenuHandle.ts +54 -0
  381. package/src/menu/store/MenuStore.ts +234 -0
  382. package/src/menu/submenu-root/MenuSubmenuRoot.tsrx +64 -0
  383. package/src/menu/submenu-root/MenuSubmenuRootContext.ts +16 -0
  384. package/src/menu/submenu-trigger/MenuSubmenuTrigger.tsrx +278 -0
  385. package/src/menu/submenu-trigger/MenuSubmenuTriggerDataAttributes.ts +14 -0
  386. package/src/menu/trigger/MenuTrigger.tsrx +395 -0
  387. package/src/menu/trigger/MenuTriggerDataAttributes.ts +14 -0
  388. package/src/menu/utils/findRootOwnerId.ts +13 -0
  389. package/src/menu/utils/stateAttributesMapping.ts +17 -0
  390. package/src/menu/utils/types.ts +8 -0
  391. package/src/menu/viewport/MenuViewport.tsrx +75 -0
  392. package/src/menu/viewport/MenuViewportCssVars.ts +12 -0
  393. package/src/menu/viewport/MenuViewportDataAttributes.ts +24 -0
  394. package/src/menubar/Menubar.tsrx +173 -0
  395. package/src/menubar/MenubarContext.ts +31 -0
  396. package/src/menubar/MenubarDataAttributes.ts +13 -0
  397. package/src/menubar/index.ts +3 -0
  398. package/src/merge-props/index.ts +1 -0
  399. package/src/merge-props/mergeProps.ts +302 -0
  400. package/src/meter/index.parts.ts +5 -0
  401. package/src/meter/index.ts +7 -0
  402. package/src/meter/indicator/MeterIndicator.tsrx +46 -0
  403. package/src/meter/label/MeterLabel.tsrx +46 -0
  404. package/src/meter/root/MeterRoot.tsrx +129 -0
  405. package/src/meter/root/MeterRootContext.ts +26 -0
  406. package/src/meter/track/MeterTrack.tsrx +34 -0
  407. package/src/meter/value/MeterValue.tsrx +51 -0
  408. package/src/navigation-menu/arrow/NavigationMenuArrow.tsrx +77 -0
  409. package/src/navigation-menu/arrow/NavigationMenuArrowDataAttributes.ts +24 -0
  410. package/src/navigation-menu/backdrop/NavigationMenuBackdrop.tsrx +69 -0
  411. package/src/navigation-menu/backdrop/NavigationMenuBackdropDataAttributes.ts +18 -0
  412. package/src/navigation-menu/content/NavigationMenuContent.tsrx +208 -0
  413. package/src/navigation-menu/content/NavigationMenuContentDataAttributes.ts +23 -0
  414. package/src/navigation-menu/icon/NavigationMenuIcon.tsrx +56 -0
  415. package/src/navigation-menu/icon/NavigationMenuIconDataAttributes.ts +6 -0
  416. package/src/navigation-menu/index.parts.ts +13 -0
  417. package/src/navigation-menu/index.ts +15 -0
  418. package/src/navigation-menu/item/NavigationMenuItem.tsrx +59 -0
  419. package/src/navigation-menu/item/NavigationMenuItemContext.ts +21 -0
  420. package/src/navigation-menu/link/NavigationMenuLink.tsrx +108 -0
  421. package/src/navigation-menu/link/NavigationMenuLinkDataAttributes.ts +4 -0
  422. package/src/navigation-menu/list/NavigationMenuDismissContext.ts +12 -0
  423. package/src/navigation-menu/list/NavigationMenuList.tsrx +144 -0
  424. package/src/navigation-menu/popup/NavigationMenuPopup.tsrx +106 -0
  425. package/src/navigation-menu/popup/NavigationMenuPopupCssVars.ts +10 -0
  426. package/src/navigation-menu/popup/NavigationMenuPopupDataAttributes.ts +32 -0
  427. package/src/navigation-menu/portal/NavigationMenuPortal.tsrx +58 -0
  428. package/src/navigation-menu/portal/NavigationMenuPortalContext.ts +13 -0
  429. package/src/navigation-menu/positioner/NavigationMenuPositioner.tsrx +219 -0
  430. package/src/navigation-menu/positioner/NavigationMenuPositionerContext.ts +26 -0
  431. package/src/navigation-menu/positioner/NavigationMenuPositionerCssVars.ts +35 -0
  432. package/src/navigation-menu/positioner/NavigationMenuPositionerDataAttributes.ts +28 -0
  433. package/src/navigation-menu/root/NavigationMenuRoot.tsrx +439 -0
  434. package/src/navigation-menu/root/NavigationMenuRootContext.ts +84 -0
  435. package/src/navigation-menu/trigger/NavigationMenuTrigger.tsrx +846 -0
  436. package/src/navigation-menu/trigger/NavigationMenuTriggerDataAttributes.ts +14 -0
  437. package/src/navigation-menu/utils/constants.ts +3 -0
  438. package/src/navigation-menu/utils/isOutsideMenuEvent.ts +36 -0
  439. package/src/navigation-menu/utils/setSharedFixedSize.ts +20 -0
  440. package/src/navigation-menu/utils/useNavigationMenuAnchorPositioning.ts +18 -0
  441. package/src/navigation-menu/viewport/NavigationMenuViewport.tsrx +146 -0
  442. package/src/number-field/decrement/NumberFieldDecrement.tsrx +30 -0
  443. package/src/number-field/decrement/NumberFieldDecrementDataAttributes.ts +40 -0
  444. package/src/number-field/group/NumberFieldGroup.tsrx +42 -0
  445. package/src/number-field/group/NumberFieldGroupDataAttributes.ts +40 -0
  446. package/src/number-field/increment/NumberFieldIncrement.tsrx +30 -0
  447. package/src/number-field/increment/NumberFieldIncrementDataAttributes.ts +40 -0
  448. package/src/number-field/index.parts.ts +7 -0
  449. package/src/number-field/index.ts +9 -0
  450. package/src/number-field/input/NumberFieldInput.tsrx +488 -0
  451. package/src/number-field/input/NumberFieldInputDataAttributes.ts +40 -0
  452. package/src/number-field/root/NumberFieldRoot.tsrx +735 -0
  453. package/src/number-field/root/NumberFieldRootContext.ts +52 -0
  454. package/src/number-field/root/NumberFieldRootDataAttributes.ts +40 -0
  455. package/src/number-field/root/useNumberFieldStepperButton.ts +191 -0
  456. package/src/number-field/scrub-area/NumberFieldScrubArea.tsrx +395 -0
  457. package/src/number-field/scrub-area/NumberFieldScrubAreaContext.ts +24 -0
  458. package/src/number-field/scrub-area/NumberFieldScrubAreaDataAttributes.ts +40 -0
  459. package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursor.tsrx +73 -0
  460. package/src/number-field/scrub-area-cursor/NumberFieldScrubAreaCursorDataAttributes.ts +40 -0
  461. package/src/number-field/utils/constants.ts +2 -0
  462. package/src/number-field/utils/getViewportRect.ts +34 -0
  463. package/src/number-field/utils/parse.ts +221 -0
  464. package/src/number-field/utils/stateAttributesMapping.ts +9 -0
  465. package/src/number-field/utils/types.ts +27 -0
  466. package/src/number-field/utils/validate.ts +136 -0
  467. package/src/otp-field/index.parts.ts +3 -0
  468. package/src/otp-field/index.ts +4 -0
  469. package/src/otp-field/input/OTPFieldInput.tsrx +356 -0
  470. package/src/otp-field/input/OTPFieldInputDataAttributes.ts +40 -0
  471. package/src/otp-field/root/OTPFieldRoot.tsrx +679 -0
  472. package/src/otp-field/root/OTPFieldRootContext.ts +58 -0
  473. package/src/otp-field/root/OTPFieldRootDataAttributes.ts +40 -0
  474. package/src/otp-field/utils/otp.ts +118 -0
  475. package/src/otp-field/utils/stateAttributesMapping.ts +16 -0
  476. package/src/popover/arrow/PopoverArrow.tsrx +69 -0
  477. package/src/popover/arrow/PopoverArrowDataAttributes.ts +24 -0
  478. package/src/popover/backdrop/PopoverBackdrop.tsrx +71 -0
  479. package/src/popover/backdrop/PopoverBackdropDataAttributes.ts +18 -0
  480. package/src/popover/close/PopoverClose.tsrx +65 -0
  481. package/src/popover/description/PopoverDescription.tsrx +46 -0
  482. package/src/popover/index.parts.ts +15 -0
  483. package/src/popover/index.ts +16 -0
  484. package/src/popover/popup/PopoverPopup.tsrx +188 -0
  485. package/src/popover/popup/PopoverPopupCssVars.ts +8 -0
  486. package/src/popover/popup/PopoverPopupDataAttributes.ts +33 -0
  487. package/src/popover/portal/PopoverPortal.tsrx +54 -0
  488. package/src/popover/portal/PopoverPortalContext.ts +13 -0
  489. package/src/popover/positioner/PopoverPositioner.tsrx +196 -0
  490. package/src/popover/positioner/PopoverPositionerContext.ts +28 -0
  491. package/src/popover/positioner/PopoverPositionerCssVars.ts +37 -0
  492. package/src/popover/positioner/PopoverPositionerDataAttributes.ts +24 -0
  493. package/src/popover/root/PopoverRoot.tsrx +262 -0
  494. package/src/popover/root/PopoverRootContext.ts +20 -0
  495. package/src/popover/store/PopoverHandle.ts +54 -0
  496. package/src/popover/store/PopoverStore.ts +229 -0
  497. package/src/popover/title/PopoverTitle.tsrx +46 -0
  498. package/src/popover/trigger/PopoverTrigger.tsrx +233 -0
  499. package/src/popover/trigger/PopoverTriggerDataAttributes.ts +14 -0
  500. package/src/popover/utils/constants.ts +1 -0
  501. package/src/popover/viewport/PopoverViewport.tsrx +75 -0
  502. package/src/popover/viewport/PopoverViewportCssVars.ts +12 -0
  503. package/src/popover/viewport/PopoverViewportDataAttributes.ts +24 -0
  504. package/src/preview-card/arrow/PreviewCardArrow.tsrx +70 -0
  505. package/src/preview-card/arrow/PreviewCardArrowDataAttributes.ts +24 -0
  506. package/src/preview-card/backdrop/PreviewCardBackdrop.tsrx +73 -0
  507. package/src/preview-card/backdrop/PreviewCardBackdropDataAttributes.ts +18 -0
  508. package/src/preview-card/index.parts.ts +12 -0
  509. package/src/preview-card/index.ts +16 -0
  510. package/src/preview-card/popup/PreviewCardPopup.tsrx +104 -0
  511. package/src/preview-card/popup/PreviewCardPopupDataAttributes.ts +28 -0
  512. package/src/preview-card/portal/PreviewCardPortal.tsrx +59 -0
  513. package/src/preview-card/portal/PreviewCardPortalContext.ts +13 -0
  514. package/src/preview-card/positioner/PreviewCardPositioner.tsrx +145 -0
  515. package/src/preview-card/positioner/PreviewCardPositionerContext.ts +24 -0
  516. package/src/preview-card/positioner/PreviewCardPositionerCssVars.ts +37 -0
  517. package/src/preview-card/positioner/PreviewCardPositionerDataAttributes.ts +24 -0
  518. package/src/preview-card/root/PreviewCardContext.ts +23 -0
  519. package/src/preview-card/root/PreviewCardRoot.tsrx +210 -0
  520. package/src/preview-card/store/PreviewCardHandle.ts +58 -0
  521. package/src/preview-card/store/PreviewCardStore.ts +140 -0
  522. package/src/preview-card/trigger/PreviewCardTrigger.tsrx +148 -0
  523. package/src/preview-card/trigger/PreviewCardTriggerDataAttributes.ts +6 -0
  524. package/src/preview-card/utils/constants.ts +2 -0
  525. package/src/preview-card/viewport/PreviewCardViewport.tsrx +78 -0
  526. package/src/preview-card/viewport/PreviewCardViewportCssVars.ts +12 -0
  527. package/src/preview-card/viewport/PreviewCardViewportDataAttributes.ts +24 -0
  528. package/src/progress/index.parts.ts +7 -0
  529. package/src/progress/index.ts +7 -0
  530. package/src/progress/indicator/ProgressIndicator.tsrx +59 -0
  531. package/src/progress/indicator/ProgressIndicatorDataAttributes.ts +12 -0
  532. package/src/progress/label/ProgressLabel.tsrx +51 -0
  533. package/src/progress/label/ProgressLabelDataAttributes.ts +12 -0
  534. package/src/progress/root/ProgressRoot.tsrx +154 -0
  535. package/src/progress/root/ProgressRootContext.tsrx +37 -0
  536. package/src/progress/root/ProgressRootDataAttributes.ts +12 -0
  537. package/src/progress/root/stateAttributesMapping.ts +18 -0
  538. package/src/progress/track/ProgressTrack.tsrx +42 -0
  539. package/src/progress/track/ProgressTrackDataAttributes.ts +12 -0
  540. package/src/progress/value/ProgressValue.tsrx +62 -0
  541. package/src/progress/value/ProgressValueDataAttributes.ts +12 -0
  542. package/src/radio/index.parts.ts +2 -0
  543. package/src/radio/index.ts +4 -0
  544. package/src/radio/indicator/RadioIndicator.tsrx +84 -0
  545. package/src/radio/indicator/RadioIndicatorDataAttributes.ts +54 -0
  546. package/src/radio/root/RadioRoot.tsrx +337 -0
  547. package/src/radio/root/RadioRootContext.ts +19 -0
  548. package/src/radio/root/RadioRootDataAttributes.ts +44 -0
  549. package/src/radio/utils/stateAttributesMapping.ts +20 -0
  550. package/src/radio-group/RadioGroup.tsrx +337 -0
  551. package/src/radio-group/RadioGroupContext.ts +29 -0
  552. package/src/radio-group/RadioGroupDataAttributes.ts +4 -0
  553. package/src/radio-group/index.ts +3 -0
  554. package/src/scroll-area/constants.ts +2 -0
  555. package/src/scroll-area/content/ScrollAreaContent.tsrx +90 -0
  556. package/src/scroll-area/content/ScrollAreaContentDataAttributes.ts +28 -0
  557. package/src/scroll-area/corner/ScrollAreaCorner.tsrx +54 -0
  558. package/src/scroll-area/index.parts.ts +6 -0
  559. package/src/scroll-area/index.ts +8 -0
  560. package/src/scroll-area/root/ScrollAreaRoot.tsrx +424 -0
  561. package/src/scroll-area/root/ScrollAreaRootContext.ts +61 -0
  562. package/src/scroll-area/root/ScrollAreaRootCssVars.ts +10 -0
  563. package/src/scroll-area/root/ScrollAreaRootDataAttributes.ts +28 -0
  564. package/src/scroll-area/root/stateAttributes.ts +15 -0
  565. package/src/scroll-area/scrollbar/ScrollAreaScrollbar.tsrx +275 -0
  566. package/src/scroll-area/scrollbar/ScrollAreaScrollbarContext.ts +19 -0
  567. package/src/scroll-area/scrollbar/ScrollAreaScrollbarCssVars.ts +10 -0
  568. package/src/scroll-area/scrollbar/ScrollAreaScrollbarDataAttributes.ts +37 -0
  569. package/src/scroll-area/thumb/ScrollAreaThumb.tsrx +80 -0
  570. package/src/scroll-area/thumb/ScrollAreaThumbDataAttributes.ts +9 -0
  571. package/src/scroll-area/utils/getOffset.ts +21 -0
  572. package/src/scroll-area/viewport/ScrollAreaViewport.tsrx +492 -0
  573. package/src/scroll-area/viewport/ScrollAreaViewportContext.ts +21 -0
  574. package/src/scroll-area/viewport/ScrollAreaViewportCssVars.ts +20 -0
  575. package/src/scroll-area/viewport/ScrollAreaViewportDataAttributes.ts +28 -0
  576. package/src/select/arrow/SelectArrow.tsrx +75 -0
  577. package/src/select/arrow/SelectArrowDataAttributes.ts +24 -0
  578. package/src/select/backdrop/SelectBackdrop.tsrx +77 -0
  579. package/src/select/backdrop/SelectBackdropDataAttributes.ts +18 -0
  580. package/src/select/group/SelectGroup.tsrx +52 -0
  581. package/src/select/group/SelectGroupContext.ts +20 -0
  582. package/src/select/group-label/SelectGroupLabel.tsrx +49 -0
  583. package/src/select/icon/SelectIcon.tsrx +51 -0
  584. package/src/select/icon/SelectIconDataAttributes.ts +6 -0
  585. package/src/select/index.parts.ts +19 -0
  586. package/src/select/index.ts +21 -0
  587. package/src/select/item/SelectItem.tsrx +291 -0
  588. package/src/select/item/SelectItemContext.ts +22 -0
  589. package/src/select/item/SelectItemDataAttributes.ts +12 -0
  590. package/src/select/item-indicator/SelectItemIndicator.tsrx +108 -0
  591. package/src/select/item-indicator/SelectItemIndicatorDataAttributes.ts +10 -0
  592. package/src/select/item-text/SelectItemText.tsrx +56 -0
  593. package/src/select/label/SelectLabel.tsrx +64 -0
  594. package/src/select/list/SelectList.tsrx +62 -0
  595. package/src/select/popup/SelectPopup.tsrx +596 -0
  596. package/src/select/popup/SelectPopupDataAttributes.ts +28 -0
  597. package/src/select/popup/utils.ts +13 -0
  598. package/src/select/portal/SelectPortal.tsrx +45 -0
  599. package/src/select/positioner/SelectPositioner.tsrx +268 -0
  600. package/src/select/positioner/SelectPositionerContext.ts +26 -0
  601. package/src/select/positioner/SelectPositionerCssVars.ts +25 -0
  602. package/src/select/positioner/SelectPositionerDataAttributes.ts +24 -0
  603. package/src/select/root/SelectRoot.tsrx +752 -0
  604. package/src/select/root/SelectRootContext.ts +57 -0
  605. package/src/select/scroll-arrow/SelectScrollArrow.tsrx +236 -0
  606. package/src/select/scroll-down-arrow/SelectScrollDownArrow.tsrx +37 -0
  607. package/src/select/scroll-down-arrow/SelectScrollDownArrowDataAttributes.ts +24 -0
  608. package/src/select/scroll-up-arrow/SelectScrollUpArrow.tsrx +37 -0
  609. package/src/select/scroll-up-arrow/SelectScrollUpArrowDataAttributes.ts +24 -0
  610. package/src/select/separator/SelectSeparator.tsrx +34 -0
  611. package/src/select/store.ts +155 -0
  612. package/src/select/trigger/SelectTrigger.tsrx +270 -0
  613. package/src/select/trigger/SelectTriggerDataAttributes.ts +55 -0
  614. package/src/select/value/SelectValue.tsrx +112 -0
  615. package/src/select/value/SelectValueDataAttributes.ts +4 -0
  616. package/src/separator/Separator.tsrx +49 -0
  617. package/src/separator/SeparatorDataAttributes.ts +5 -0
  618. package/src/separator/index.ts +3 -0
  619. package/src/slider/control/SliderControl.tsrx +540 -0
  620. package/src/slider/control/SliderControlDataAttributes.ts +33 -0
  621. package/src/slider/index.parts.ts +7 -0
  622. package/src/slider/index.ts +9 -0
  623. package/src/slider/indicator/SliderIndicator.tsrx +102 -0
  624. package/src/slider/indicator/SliderIndicatorDataAttributes.ts +33 -0
  625. package/src/slider/label/SliderLabel.tsrx +71 -0
  626. package/src/slider/root/SliderRoot.tsrx +610 -0
  627. package/src/slider/root/SliderRootContext.ts +115 -0
  628. package/src/slider/root/SliderRootDataAttributes.ts +33 -0
  629. package/src/slider/root/stateAttributesMapping.ts +15 -0
  630. package/src/slider/thumb/SliderThumb.tsrx +567 -0
  631. package/src/slider/thumb/SliderThumbDataAttributes.ts +37 -0
  632. package/src/slider/thumb/prehydrationScript.min.ts +5 -0
  633. package/src/slider/track/SliderTrack.tsrx +49 -0
  634. package/src/slider/track/SliderTrackDataAttributes.ts +33 -0
  635. package/src/slider/utils/asc.ts +3 -0
  636. package/src/slider/utils/getMidpoint.ts +4 -0
  637. package/src/slider/utils/getPushedThumbValues.ts +60 -0
  638. package/src/slider/utils/getSliderValue.ts +22 -0
  639. package/src/slider/utils/resolveThumbCollision.ts +154 -0
  640. package/src/slider/utils/roundValueToStep.ts +21 -0
  641. package/src/slider/utils/test-utils.ts +18 -0
  642. package/src/slider/utils/validateMinimumDistance.ts +17 -0
  643. package/src/slider/value/SliderValue.tsrx +82 -0
  644. package/src/slider/value/SliderValueDataAttributes.ts +33 -0
  645. package/src/switch/index.parts.ts +2 -0
  646. package/src/switch/index.ts +4 -0
  647. package/src/switch/root/SwitchRoot.tsrx +335 -0
  648. package/src/switch/root/SwitchRootContext.ts +19 -0
  649. package/src/switch/root/SwitchRootDataAttributes.ts +44 -0
  650. package/src/switch/stateAttributesMapping.ts +15 -0
  651. package/src/switch/thumb/SwitchThumb.tsrx +40 -0
  652. package/src/switch/thumb/SwitchThumbDataAttributes.ts +44 -0
  653. package/src/tabs/index.parts.ts +5 -0
  654. package/src/tabs/index.ts +21 -0
  655. package/src/tabs/indicator/TabsIndicator.tsrx +292 -0
  656. package/src/tabs/indicator/TabsIndicatorCssVars.ts +30 -0
  657. package/src/tabs/indicator/TabsIndicatorDataAttributes.ts +10 -0
  658. package/src/tabs/indicator/prehydrationScript.min.ts +5 -0
  659. package/src/tabs/list/TabsList.tsrx +153 -0
  660. package/src/tabs/list/TabsListContext.ts +23 -0
  661. package/src/tabs/list/TabsListDataAttributes.ts +10 -0
  662. package/src/tabs/panel/TabsPanel.tsrx +145 -0
  663. package/src/tabs/panel/TabsPanelDataAttributes.ts +28 -0
  664. package/src/tabs/root/TabsRoot.tsrx +477 -0
  665. package/src/tabs/root/TabsRootContext.ts +55 -0
  666. package/src/tabs/root/TabsRootDataAttributes.ts +10 -0
  667. package/src/tabs/root/stateAttributesMapping.ts +9 -0
  668. package/src/tabs/tab/TabsTab.tsrx +280 -0
  669. package/src/tabs/tab/TabsTabDataAttributes.ts +18 -0
  670. package/src/toast/action/ToastAction.tsrx +72 -0
  671. package/src/toast/action/ToastActionDataAttributes.ts +5 -0
  672. package/src/toast/arrow/ToastArrow.tsrx +57 -0
  673. package/src/toast/arrow/ToastArrowDataAttributes.ts +16 -0
  674. package/src/toast/close/ToastClose.tsrx +79 -0
  675. package/src/toast/close/ToastCloseDataAttributes.ts +5 -0
  676. package/src/toast/content/ToastContent.tsrx +76 -0
  677. package/src/toast/content/ToastContentDataAttributes.ts +10 -0
  678. package/src/toast/createToastManager.ts +104 -0
  679. package/src/toast/description/ToastDescription.tsrx +54 -0
  680. package/src/toast/description/ToastDescriptionDataAttributes.ts +5 -0
  681. package/src/toast/index.parts.ts +14 -0
  682. package/src/toast/index.ts +18 -0
  683. package/src/toast/portal/ToastPortal.tsrx +33 -0
  684. package/src/toast/positioner/ToastPositioner.tsrx +154 -0
  685. package/src/toast/positioner/ToastPositionerContext.ts +23 -0
  686. package/src/toast/positioner/ToastPositionerCssVars.ts +25 -0
  687. package/src/toast/positioner/ToastPositionerDataAttributes.ts +16 -0
  688. package/src/toast/provider/ToastProvider.tsrx +109 -0
  689. package/src/toast/provider/ToastProviderContext.ts +16 -0
  690. package/src/toast/root/ToastRoot.tsrx +563 -0
  691. package/src/toast/root/ToastRootContext.ts +25 -0
  692. package/src/toast/root/ToastRootCssVars.ts +25 -0
  693. package/src/toast/root/ToastRootDataAttributes.ts +35 -0
  694. package/src/toast/store.ts +527 -0
  695. package/src/toast/title/ToastTitle.tsrx +53 -0
  696. package/src/toast/title/ToastTitleDataAttributes.ts +5 -0
  697. package/src/toast/useToastManager.ts +150 -0
  698. package/src/toast/utils/focusVisible.ts +1 -0
  699. package/src/toast/utils/isRenderableNode.ts +18 -0
  700. package/src/toast/utils/resolvePromiseOptions.ts +22 -0
  701. package/src/toast/utils/test-utils.tsrx +39 -0
  702. package/src/toast/utils/useToastLabelPart.ts +53 -0
  703. package/src/toast/viewport/ToastViewport.tsrx +293 -0
  704. package/src/toast/viewport/ToastViewportCssVars.ts +5 -0
  705. package/src/toast/viewport/ToastViewportDataAttributes.ts +5 -0
  706. package/src/toggle/Toggle.tsrx +198 -0
  707. package/src/toggle/ToggleDataAttributes.ts +8 -0
  708. package/src/toggle/index.ts +3 -0
  709. package/src/toggle-group/ToggleGroup.tsrx +201 -0
  710. package/src/toggle-group/ToggleGroupContext.ts +28 -0
  711. package/src/toggle-group/ToggleGroupDataAttributes.ts +13 -0
  712. package/src/toggle-group/index.ts +3 -0
  713. package/src/toolbar/button/ToolbarButton.tsrx +108 -0
  714. package/src/toolbar/button/ToolbarButtonDataAttributes.ts +13 -0
  715. package/src/toolbar/group/ToolbarGroup.tsrx +69 -0
  716. package/src/toolbar/group/ToolbarGroupContext.ts +13 -0
  717. package/src/toolbar/group/ToolbarGroupDataAttributes.ts +9 -0
  718. package/src/toolbar/index.parts.ts +8 -0
  719. package/src/toolbar/index.ts +9 -0
  720. package/src/toolbar/input/ToolbarInput.tsrx +108 -0
  721. package/src/toolbar/input/ToolbarInputDataAttributes.ts +13 -0
  722. package/src/toolbar/link/ToolbarLink.tsrx +64 -0
  723. package/src/toolbar/link/ToolbarLinkDataAttributes.ts +5 -0
  724. package/src/toolbar/root/ToolbarRoot.tsrx +121 -0
  725. package/src/toolbar/root/ToolbarRootContext.ts +24 -0
  726. package/src/toolbar/root/ToolbarRootDataAttributes.ts +9 -0
  727. package/src/toolbar/separator/ToolbarSeparator.tsrx +37 -0
  728. package/src/toolbar/separator/ToolbarSeparatorDataAttributes.ts +5 -0
  729. package/src/tooltip/arrow/TooltipArrow.tsrx +76 -0
  730. package/src/tooltip/arrow/TooltipArrowDataAttributes.ts +29 -0
  731. package/src/tooltip/index.parts.ts +12 -0
  732. package/src/tooltip/index.ts +13 -0
  733. package/src/tooltip/popup/TooltipPopup.tsrx +108 -0
  734. package/src/tooltip/popup/TooltipPopupDataAttributes.ts +33 -0
  735. package/src/tooltip/portal/TooltipPortal.tsrx +54 -0
  736. package/src/tooltip/portal/TooltipPortalContext.ts +13 -0
  737. package/src/tooltip/positioner/TooltipPositioner.tsrx +150 -0
  738. package/src/tooltip/positioner/TooltipPositionerContext.ts +23 -0
  739. package/src/tooltip/positioner/TooltipPositionerCssVars.ts +37 -0
  740. package/src/tooltip/positioner/TooltipPositionerDataAttributes.ts +24 -0
  741. package/src/tooltip/provider/TooltipProvider.tsrx +49 -0
  742. package/src/tooltip/provider/TooltipProviderContext.ts +12 -0
  743. package/src/tooltip/root/TooltipRoot.tsrx +282 -0
  744. package/src/tooltip/root/TooltipRootContext.ts +21 -0
  745. package/src/tooltip/store/TooltipHandle.ts +54 -0
  746. package/src/tooltip/store/TooltipStore.ts +148 -0
  747. package/src/tooltip/trigger/TooltipTrigger.tsrx +351 -0
  748. package/src/tooltip/trigger/TooltipTriggerDataAttributes.ts +10 -0
  749. package/src/tooltip/utils/constants.ts +1 -0
  750. package/src/tooltip/viewport/TooltipViewport.tsrx +75 -0
  751. package/src/tooltip/viewport/TooltipViewportCssVars.ts +12 -0
  752. package/src/tooltip/viewport/TooltipViewportDataAttributes.ts +24 -0
  753. package/src/types/index.ts +29 -0
  754. package/src/unstable-use-media-query/index.ts +94 -0
  755. package/src/use-render/index.ts +2 -0
  756. package/src/use-render/useRender.ts +113 -0
  757. package/src/utils/CommonPopupCssVars.ts +12 -0
  758. package/src/utils/CommonPopupDataAttributes.ts +38 -0
  759. package/src/utils/CommonPositionerCssVars.ts +37 -0
  760. package/src/utils/CommonTriggerDataAttributes.ts +9 -0
  761. package/src/utils/CommonViewportDataAttributes.ts +7 -0
  762. package/src/utils/FloatingPortalLite.tsrx +51 -0
  763. package/src/utils/FocusGuard.tsrx +44 -0
  764. package/src/utils/InternalBackdrop.tsrx +50 -0
  765. package/src/utils/NullStore.ts +26 -0
  766. package/src/utils/adaptiveOriginConstants.ts +12 -0
  767. package/src/utils/adaptiveOriginMiddleware.ts +5 -14
  768. package/src/utils/closePart.tsrx +37 -0
  769. package/src/utils/collapsibleOpenStateMapping.ts +28 -23
  770. package/src/utils/dispatchClickWithModifiers.ts +36 -0
  771. package/src/utils/getCssDimensions.ts +11 -15
  772. package/src/utils/getElementAtPoint.ts +12 -0
  773. package/src/utils/getElementTransform.ts +33 -0
  774. package/src/utils/getPseudoElementBounds.ts +22 -7
  775. package/src/utils/hideMiddleware.ts +15 -12
  776. package/src/utils/listbox-separator/ListboxSeparator.tsrx +47 -0
  777. package/src/utils/mergeStyles.ts +15 -0
  778. package/src/utils/popupStateMapping.ts +57 -35
  779. package/src/utils/popups/index.ts +4 -8
  780. package/src/utils/popups/inlineRect.ts +19 -16
  781. package/src/utils/popups/popupHandle.ts +291 -0
  782. package/src/utils/popups/popupStoreUtils.ts +482 -320
  783. package/src/utils/popups/popupTriggerMap.ts +102 -28
  784. package/src/utils/popups/store.ts +146 -66
  785. package/src/utils/popups/usePopupHandleStore.ts +37 -0
  786. package/src/utils/popups/useTriggerFocusGuards.ts +36 -21
  787. package/src/utils/resolveAriaLabelledBy.ts +2 -1
  788. package/src/utils/resolveClassName.ts +8 -3
  789. package/src/utils/resolveRef.ts +8 -4
  790. package/src/utils/resolveStyle.ts +10 -6
  791. package/src/utils/scrollEdges.ts +33 -0
  792. package/src/utils/scrollable.ts +77 -0
  793. package/src/utils/styles.tsrx +15 -0
  794. package/src/utils/useAnchoredPopupScrollLock.ts +31 -37
  795. package/src/utils/useFocusableWhenDisabled.ts +81 -65
  796. package/src/utils/useIsHydrating.ts +12 -15
  797. package/src/utils/useMixedToggleClickHandler.ts +45 -60
  798. package/src/utils/useOpenInteractionType.ts +43 -45
  799. package/src/utils/usePopupAutoResize.ts +198 -207
  800. package/src/utils/usePopupViewport.tsrx +396 -0
  801. package/src/utils/usePositioner.tsrx +50 -0
  802. package/src/utils/useRegisteredLabelId.ts +16 -27
  803. package/src/utils/useSwipeDismiss.ts +1161 -0
  804. package/src/utils/valueToPercent.ts +1 -2
  805. package/dist/cjs/accordion.cjs +0 -497
  806. package/dist/cjs/alert-dialog.cjs +0 -65
  807. package/dist/cjs/avatar.cjs +0 -234
  808. package/dist/cjs/button.cjs +0 -54
  809. package/dist/cjs/checkbox-group.cjs +0 -165
  810. package/dist/cjs/checkbox.cjs +0 -475
  811. package/dist/cjs/collapsible.cjs +0 -700
  812. package/dist/cjs/context-menu.cjs +0 -257
  813. package/dist/cjs/csp-provider.cjs +0 -40
  814. package/dist/cjs/dialog.cjs +0 -741
  815. package/dist/cjs/direction-provider.cjs +0 -35
  816. package/dist/cjs/field.cjs +0 -559
  817. package/dist/cjs/fieldset.cjs +0 -101
  818. package/dist/cjs/form.cjs +0 -177
  819. package/dist/cjs/index.cjs +0 -133
  820. package/dist/cjs/input.cjs +0 -32
  821. package/dist/cjs/internal.cjs +0 -43
  822. package/dist/cjs/menu.cjs +0 -2420
  823. package/dist/cjs/menubar.cjs +0 -132
  824. package/dist/cjs/merge-props.cjs +0 -34
  825. package/dist/cjs/meter.cjs +0 -169
  826. package/dist/cjs/number-field.cjs +0 -812
  827. package/dist/cjs/popover.cjs +0 -966
  828. package/dist/cjs/preview-card.cjs +0 -632
  829. package/dist/cjs/progress.cjs +0 -206
  830. package/dist/cjs/radio-group.cjs +0 -264
  831. package/dist/cjs/radio.cjs +0 -327
  832. package/dist/cjs/separator.cjs +0 -44
  833. package/dist/cjs/slider.cjs +0 -1384
  834. package/dist/cjs/switch.cjs +0 -306
  835. package/dist/cjs/tabs.cjs +0 -727
  836. package/dist/cjs/toast.cjs +0 -1766
  837. package/dist/cjs/toggle-group.cjs +0 -118
  838. package/dist/cjs/toggle.cjs +0 -121
  839. package/dist/cjs/tooltip.cjs +0 -835
  840. package/dist/cjs/unstable-use-media-query.cjs +0 -79
  841. package/dist/cjs/use-render.cjs +0 -40
  842. package/dist/cjs/utils/CSPContext.cjs +0 -38
  843. package/dist/cjs/utils/CheckboxGroupContext.cjs +0 -40
  844. package/dist/cjs/utils/CompositeRootContext.cjs +0 -40
  845. package/dist/cjs/utils/ContextMenuRootContext.cjs +0 -42
  846. package/dist/cjs/utils/DirectionContext.cjs +0 -34
  847. package/dist/cjs/utils/FloatingPortalLite.cjs +0 -47
  848. package/dist/cjs/utils/InternalBackdrop.cjs +0 -49
  849. package/dist/cjs/utils/MenubarContext.cjs +0 -40
  850. package/dist/cjs/utils/RadioGroupContext.cjs +0 -34
  851. package/dist/cjs/utils/RequestQueue.cjs +0 -111
  852. package/dist/cjs/utils/TimeoutManager.cjs +0 -50
  853. package/dist/cjs/utils/ToggleGroupContext.cjs +0 -40
  854. package/dist/cjs/utils/adaptiveOriginMiddleware.cjs +0 -94
  855. package/dist/cjs/utils/addEventListener.cjs +0 -33
  856. package/dist/cjs/utils/areArraysEqual.cjs +0 -30
  857. package/dist/cjs/utils/clamp.cjs +0 -30
  858. package/dist/cjs/utils/closePart.cjs +0 -70
  859. package/dist/cjs/utils/collapsibleOpenStateMapping.cjs +0 -42
  860. package/dist/cjs/utils/composeRefs.cjs +0 -68
  861. package/dist/cjs/utils/composite/CompositeItem.cjs +0 -59
  862. package/dist/cjs/utils/composite/CompositeList.cjs +0 -177
  863. package/dist/cjs/utils/composite/CompositeListContext.cjs +0 -43
  864. package/dist/cjs/utils/composite/CompositeRoot.cjs +0 -118
  865. package/dist/cjs/utils/composite/grid-utils.cjs +0 -343
  866. package/dist/cjs/utils/composite/gridNavigation.cjs +0 -92
  867. package/dist/cjs/utils/composite/keys.cjs +0 -174
  868. package/dist/cjs/utils/composite/list-utils.cjs +0 -90
  869. package/dist/cjs/utils/composite/useCompositeItem.cjs +0 -63
  870. package/dist/cjs/utils/composite/useCompositeListItem.cjs +0 -104
  871. package/dist/cjs/utils/composite/useCompositeRoot.cjs +0 -263
  872. package/dist/cjs/utils/constants.cjs +0 -56
  873. package/dist/cjs/utils/contains.cjs +0 -46
  874. package/dist/cjs/utils/createChangeEventDetails.cjs +0 -92
  875. package/dist/cjs/utils/dom.cjs +0 -35
  876. package/dist/cjs/utils/empty.cjs +0 -34
  877. package/dist/cjs/utils/field/FieldItemContext.cjs +0 -34
  878. package/dist/cjs/utils/field/FieldRootContext.cjs +0 -80
  879. package/dist/cjs/utils/field/FormContext.cjs +0 -41
  880. package/dist/cjs/utils/field/LabelableContext.cjs +0 -43
  881. package/dist/cjs/utils/field/LabelableProvider.cjs +0 -115
  882. package/dist/cjs/utils/field/constants.cjs +0 -68
  883. package/dist/cjs/utils/field/getCombinedFieldValidityData.cjs +0 -36
  884. package/dist/cjs/utils/field/useAriaLabelledBy.cjs +0 -87
  885. package/dist/cjs/utils/field/useFieldControlRegistration.cjs +0 -165
  886. package/dist/cjs/utils/field/useFieldValidation.cjs +0 -285
  887. package/dist/cjs/utils/field/useLabel.cjs +0 -99
  888. package/dist/cjs/utils/field/useLabelableId.cjs +0 -105
  889. package/dist/cjs/utils/field/useRegisterFieldControl.cjs +0 -60
  890. package/dist/cjs/utils/findRootOwnerId.cjs +0 -37
  891. package/dist/cjs/utils/floating/FloatingDelayGroup.cjs +0 -219
  892. package/dist/cjs/utils/floating/FloatingFocusManager.cjs +0 -685
  893. package/dist/cjs/utils/floating/FloatingPortal.cjs +0 -230
  894. package/dist/cjs/utils/floating/FloatingRootStore.cjs +0 -87
  895. package/dist/cjs/utils/floating/FloatingTree.cjs +0 -86
  896. package/dist/cjs/utils/floating/FloatingTreeStore.cjs +0 -41
  897. package/dist/cjs/utils/floating/FocusGuard.cjs +0 -54
  898. package/dist/cjs/utils/floating/composite.cjs +0 -42
  899. package/dist/cjs/utils/floating/constants.cjs +0 -34
  900. package/dist/cjs/utils/floating/createAttribute.cjs +0 -30
  901. package/dist/cjs/utils/floating/createEventEmitter.cjs +0 -44
  902. package/dist/cjs/utils/floating/element.cjs +0 -103
  903. package/dist/cjs/utils/floating/enqueueFocus.cjs +0 -51
  904. package/dist/cjs/utils/floating/event.cjs +0 -65
  905. package/dist/cjs/utils/floating/getEmptyRootContext.cjs +0 -42
  906. package/dist/cjs/utils/floating/gridNavigation.cjs +0 -45
  907. package/dist/cjs/utils/floating/markOthers.cjs +0 -181
  908. package/dist/cjs/utils/floating/nodes.cjs +0 -48
  909. package/dist/cjs/utils/floating/safePolygon.cjs +0 -301
  910. package/dist/cjs/utils/floating/tabbable.cjs +0 -242
  911. package/dist/cjs/utils/floating/types.cjs +0 -16
  912. package/dist/cjs/utils/floating/useClick.cjs +0 -153
  913. package/dist/cjs/utils/floating/useClientPoint.cjs +0 -225
  914. package/dist/cjs/utils/floating/useDismiss.cjs +0 -506
  915. package/dist/cjs/utils/floating/useFloating.cjs +0 -186
  916. package/dist/cjs/utils/floating/useFloatingRootContext.cjs +0 -75
  917. package/dist/cjs/utils/floating/useFocus.cjs +0 -184
  918. package/dist/cjs/utils/floating/useHoverFloatingInteraction.cjs +0 -231
  919. package/dist/cjs/utils/floating/useHoverInteractionSharedState.cjs +0 -113
  920. package/dist/cjs/utils/floating/useHoverReferenceInteraction.cjs +0 -380
  921. package/dist/cjs/utils/floating/useHoverShared.cjs +0 -65
  922. package/dist/cjs/utils/floating/useListNavigation.cjs +0 -665
  923. package/dist/cjs/utils/floating/useSyncedFloatingRootContext.cjs +0 -91
  924. package/dist/cjs/utils/floating/useTypeahead.cjs +0 -187
  925. package/dist/cjs/utils/formatNumber.cjs +0 -60
  926. package/dist/cjs/utils/generateId.cjs +0 -32
  927. package/dist/cjs/utils/getCssDimensions.cjs +0 -42
  928. package/dist/cjs/utils/getDefaultFormSubmitter.cjs +0 -42
  929. package/dist/cjs/utils/getDisabledMountTransitionStyles.cjs +0 -32
  930. package/dist/cjs/utils/getElementRef.cjs +0 -35
  931. package/dist/cjs/utils/getPseudoElementBounds.cjs +0 -56
  932. package/dist/cjs/utils/getStateAttributesProps.cjs +0 -46
  933. package/dist/cjs/utils/hideMiddleware.cjs +0 -42
  934. package/dist/cjs/utils/inertValue.cjs +0 -30
  935. package/dist/cjs/utils/matchesFocusVisible.cjs +0 -38
  936. package/dist/cjs/utils/mergeCleanups.cjs +0 -37
  937. package/dist/cjs/utils/mergeObjects.cjs +0 -39
  938. package/dist/cjs/utils/mergeProps.cjs +0 -182
  939. package/dist/cjs/utils/noop.cjs +0 -29
  940. package/dist/cjs/utils/number/constants.cjs +0 -34
  941. package/dist/cjs/utils/number/parse.cjs +0 -258
  942. package/dist/cjs/utils/number/types.cjs +0 -16
  943. package/dist/cjs/utils/number/validate.cjs +0 -104
  944. package/dist/cjs/utils/owner.cjs +0 -35
  945. package/dist/cjs/utils/platform.cjs +0 -83
  946. package/dist/cjs/utils/popupStateMapping.cjs +0 -74
  947. package/dist/cjs/utils/popups/index.cjs +0 -39
  948. package/dist/cjs/utils/popups/inlineRect.cjs +0 -218
  949. package/dist/cjs/utils/popups/popupStoreUtils.cjs +0 -379
  950. package/dist/cjs/utils/popups/popupTriggerMap.cjs +0 -76
  951. package/dist/cjs/utils/popups/store.cjs +0 -118
  952. package/dist/cjs/utils/popups/useTriggerFocusGuards.cjs +0 -72
  953. package/dist/cjs/utils/resolveAriaLabelledBy.cjs +0 -35
  954. package/dist/cjs/utils/resolveClassName.cjs +0 -30
  955. package/dist/cjs/utils/resolveRef.cjs +0 -33
  956. package/dist/cjs/utils/resolveStyle.cjs +0 -30
  957. package/dist/cjs/utils/serializeValue.cjs +0 -40
  958. package/dist/cjs/utils/slider/asc.cjs +0 -30
  959. package/dist/cjs/utils/slider/getMidpoint.cjs +0 -34
  960. package/dist/cjs/utils/slider/getPushedThumbValues.cjs +0 -73
  961. package/dist/cjs/utils/slider/getSliderValue.cjs +0 -42
  962. package/dist/cjs/utils/slider/replaceArrayItemAtIndex.cjs +0 -33
  963. package/dist/cjs/utils/slider/resolveThumbCollision.cjs +0 -155
  964. package/dist/cjs/utils/slider/roundValueToStep.cjs +0 -45
  965. package/dist/cjs/utils/slider/validateMinimumDistance.cjs +0 -40
  966. package/dist/cjs/utils/slider/valueArrayToPercentages.cjs +0 -36
  967. package/dist/cjs/utils/store/ReactStore.cjs +0 -135
  968. package/dist/cjs/utils/store/Store.cjs +0 -83
  969. package/dist/cjs/utils/store/createSelector.cjs +0 -74
  970. package/dist/cjs/utils/store/useStore.cjs +0 -51
  971. package/dist/cjs/utils/stringifyLocale.cjs +0 -36
  972. package/dist/cjs/utils/useAnchorPositioning.cjs +0 -421
  973. package/dist/cjs/utils/useAnchoredPopupScrollLock.cjs +0 -59
  974. package/dist/cjs/utils/useAnimationFrame.cjs +0 -93
  975. package/dist/cjs/utils/useAnimationsFinished.cjs +0 -98
  976. package/dist/cjs/utils/useBaseUiId.cjs +0 -36
  977. package/dist/cjs/utils/useButton.cjs +0 -177
  978. package/dist/cjs/utils/useCheckboxGroupParent.cjs +0 -114
  979. package/dist/cjs/utils/useControlled.cjs +0 -47
  980. package/dist/cjs/utils/useEnhancedClickHandler.cjs +0 -60
  981. package/dist/cjs/utils/useFocusableWhenDisabled.cjs +0 -77
  982. package/dist/cjs/utils/useForcedRerendering.cjs +0 -35
  983. package/dist/cjs/utils/useIsHydrating.cjs +0 -44
  984. package/dist/cjs/utils/useMixedToggleClickHandler.cjs +0 -66
  985. package/dist/cjs/utils/useOnFirstRender.cjs +0 -35
  986. package/dist/cjs/utils/useOnMount.cjs +0 -36
  987. package/dist/cjs/utils/useOpenChangeComplete.cjs +0 -57
  988. package/dist/cjs/utils/useOpenInteractionType.cjs +0 -69
  989. package/dist/cjs/utils/usePopupAutoResize.cjs +0 -191
  990. package/dist/cjs/utils/usePopupViewport.cjs +0 -283
  991. package/dist/cjs/utils/usePositioner.cjs +0 -53
  992. package/dist/cjs/utils/usePressAndHold.cjs +0 -51
  993. package/dist/cjs/utils/usePreviousValue.cjs +0 -47
  994. package/dist/cjs/utils/useRefWithInit.cjs +0 -41
  995. package/dist/cjs/utils/useRegisteredLabelId.cjs +0 -48
  996. package/dist/cjs/utils/useRenderElement.cjs +0 -106
  997. package/dist/cjs/utils/useScrollLock.cjs +0 -232
  998. package/dist/cjs/utils/useStableCallback.cjs +0 -41
  999. package/dist/cjs/utils/useTimeout.cjs +0 -66
  1000. package/dist/cjs/utils/useTransitionStatus.cjs +0 -116
  1001. package/dist/cjs/utils/useValueAsRef.cjs +0 -43
  1002. package/dist/cjs/utils/useValueChanged.cjs +0 -55
  1003. package/dist/cjs/utils/valueToPercent.cjs +0 -30
  1004. package/dist/cjs/utils/visuallyHidden.cjs +0 -49
  1005. package/src/accordion.ts +0 -615
  1006. package/src/alert-dialog.ts +0 -49
  1007. package/src/avatar.ts +0 -308
  1008. package/src/button.ts +0 -63
  1009. package/src/checkbox-group.ts +0 -183
  1010. package/src/checkbox.ts +0 -576
  1011. package/src/collapsible.ts +0 -916
  1012. package/src/context-menu.ts +0 -317
  1013. package/src/csp-provider.ts +0 -37
  1014. package/src/dialog.ts +0 -930
  1015. package/src/direction-provider.ts +0 -32
  1016. package/src/field.ts +0 -650
  1017. package/src/fieldset.ts +0 -150
  1018. package/src/form.ts +0 -183
  1019. package/src/input.ts +0 -9
  1020. package/src/internal.ts +0 -29
  1021. package/src/menu.ts +0 -3387
  1022. package/src/menubar.ts +0 -160
  1023. package/src/merge-props.ts +0 -2
  1024. package/src/meter.ts +0 -211
  1025. package/src/number-field.ts +0 -951
  1026. package/src/popover.ts +0 -1282
  1027. package/src/preview-card.ts +0 -812
  1028. package/src/progress.ts +0 -267
  1029. package/src/radio-group.ts +0 -285
  1030. package/src/radio.ts +0 -393
  1031. package/src/separator.ts +0 -43
  1032. package/src/slider.ts +0 -1624
  1033. package/src/switch.ts +0 -363
  1034. package/src/tabs.ts +0 -947
  1035. package/src/toast.ts +0 -2462
  1036. package/src/toggle-group.ts +0 -136
  1037. package/src/toggle.ts +0 -145
  1038. package/src/tooltip.ts +0 -1053
  1039. package/src/unstable-use-media-query.ts +0 -101
  1040. package/src/use-render.ts +0 -41
  1041. package/src/utils/CSPContext.ts +0 -21
  1042. package/src/utils/CheckboxGroupContext.ts +0 -30
  1043. package/src/utils/CompositeRootContext.ts +0 -27
  1044. package/src/utils/ContextMenuRootContext.ts +0 -44
  1045. package/src/utils/DirectionContext.ts +0 -15
  1046. package/src/utils/FloatingPortalLite.ts +0 -34
  1047. package/src/utils/InternalBackdrop.ts +0 -28
  1048. package/src/utils/MenubarContext.ts +0 -38
  1049. package/src/utils/RadioGroupContext.ts +0 -27
  1050. package/src/utils/RequestQueue.ts +0 -132
  1051. package/src/utils/TimeoutManager.ts +0 -32
  1052. package/src/utils/ToggleGroupContext.ts +0 -33
  1053. package/src/utils/addEventListener.ts +0 -13
  1054. package/src/utils/areArraysEqual.ts +0 -11
  1055. package/src/utils/clamp.ts +0 -8
  1056. package/src/utils/closePart.ts +0 -61
  1057. package/src/utils/composeRefs.ts +0 -53
  1058. package/src/utils/composite/CompositeItem.ts +0 -56
  1059. package/src/utils/composite/CompositeList.ts +0 -190
  1060. package/src/utils/composite/CompositeListContext.ts +0 -23
  1061. package/src/utils/composite/CompositeRoot.ts +0 -132
  1062. package/src/utils/composite/grid-utils.ts +0 -437
  1063. package/src/utils/composite/gridNavigation.ts +0 -127
  1064. package/src/utils/composite/keys.ts +0 -179
  1065. package/src/utils/composite/list-utils.ts +0 -106
  1066. package/src/utils/composite/useCompositeItem.ts +0 -58
  1067. package/src/utils/composite/useCompositeListItem.ts +0 -108
  1068. package/src/utils/composite/useCompositeRoot.ts +0 -344
  1069. package/src/utils/constants.ts +0 -41
  1070. package/src/utils/contains.ts +0 -22
  1071. package/src/utils/createChangeEventDetails.ts +0 -95
  1072. package/src/utils/dom.ts +0 -9
  1073. package/src/utils/empty.ts +0 -7
  1074. package/src/utils/field/FieldItemContext.ts +0 -13
  1075. package/src/utils/field/FieldRootContext.ts +0 -98
  1076. package/src/utils/field/FormContext.ts +0 -37
  1077. package/src/utils/field/LabelableContext.ts +0 -32
  1078. package/src/utils/field/LabelableProvider.ts +0 -108
  1079. package/src/utils/field/constants.ts +0 -80
  1080. package/src/utils/field/getCombinedFieldValidityData.ts +0 -16
  1081. package/src/utils/field/useAriaLabelledBy.ts +0 -86
  1082. package/src/utils/field/useFieldControlRegistration.ts +0 -179
  1083. package/src/utils/field/useFieldValidation.ts +0 -311
  1084. package/src/utils/field/useLabel.ts +0 -95
  1085. package/src/utils/field/useLabelableId.ts +0 -99
  1086. package/src/utils/field/useRegisterFieldControl.ts +0 -41
  1087. package/src/utils/findRootOwnerId.ts +0 -19
  1088. package/src/utils/floating/FloatingDelayGroup.ts +0 -280
  1089. package/src/utils/floating/FloatingFocusManager.ts +0 -837
  1090. package/src/utils/floating/FloatingPortal.ts +0 -280
  1091. package/src/utils/floating/FloatingRootStore.ts +0 -127
  1092. package/src/utils/floating/FloatingTree.ts +0 -70
  1093. package/src/utils/floating/FloatingTreeStore.ts +0 -22
  1094. package/src/utils/floating/FocusGuard.ts +0 -34
  1095. package/src/utils/floating/composite.ts +0 -20
  1096. package/src/utils/floating/constants.ts +0 -8
  1097. package/src/utils/floating/createAttribute.ts +0 -4
  1098. package/src/utils/floating/createEventEmitter.ts +0 -20
  1099. package/src/utils/floating/element.ts +0 -88
  1100. package/src/utils/floating/enqueueFocus.ts +0 -38
  1101. package/src/utils/floating/event.ts +0 -53
  1102. package/src/utils/floating/getEmptyRootContext.ts +0 -19
  1103. package/src/utils/floating/gridNavigation.ts +0 -54
  1104. package/src/utils/floating/markOthers.ts +0 -197
  1105. package/src/utils/floating/nodes.ts +0 -31
  1106. package/src/utils/floating/safePolygon.ts +0 -448
  1107. package/src/utils/floating/tabbable.ts +0 -260
  1108. package/src/utils/floating/types.ts +0 -57
  1109. package/src/utils/floating/useClick.ts +0 -174
  1110. package/src/utils/floating/useClientPoint.ts +0 -276
  1111. package/src/utils/floating/useDismiss.ts +0 -639
  1112. package/src/utils/floating/useFloating.ts +0 -198
  1113. package/src/utils/floating/useFloatingRootContext.ts +0 -81
  1114. package/src/utils/floating/useFocus.ts +0 -248
  1115. package/src/utils/floating/useHoverFloatingInteraction.ts +0 -302
  1116. package/src/utils/floating/useHoverInteractionSharedState.ts +0 -139
  1117. package/src/utils/floating/useHoverReferenceInteraction.ts +0 -510
  1118. package/src/utils/floating/useHoverShared.ts +0 -78
  1119. package/src/utils/floating/useListNavigation.ts +0 -1018
  1120. package/src/utils/floating/useSyncedFloatingRootContext.ts +0 -93
  1121. package/src/utils/floating/useTypeahead.ts +0 -287
  1122. package/src/utils/formatNumber.ts +0 -44
  1123. package/src/utils/generateId.ts +0 -10
  1124. package/src/utils/getDefaultFormSubmitter.ts +0 -19
  1125. package/src/utils/getDisabledMountTransitionStyles.ts +0 -12
  1126. package/src/utils/getElementRef.ts +0 -13
  1127. package/src/utils/getStateAttributesProps.ts +0 -34
  1128. package/src/utils/inertValue.ts +0 -5
  1129. package/src/utils/matchesFocusVisible.ts +0 -16
  1130. package/src/utils/mergeCleanups.ts +0 -13
  1131. package/src/utils/mergeObjects.ts +0 -18
  1132. package/src/utils/mergeProps.ts +0 -206
  1133. package/src/utils/noop.ts +0 -4
  1134. package/src/utils/number/constants.ts +0 -4
  1135. package/src/utils/number/parse.ts +0 -227
  1136. package/src/utils/number/types.ts +0 -21
  1137. package/src/utils/number/validate.ts +0 -129
  1138. package/src/utils/owner.ts +0 -9
  1139. package/src/utils/platform.ts +0 -69
  1140. package/src/utils/serializeValue.ts +0 -15
  1141. package/src/utils/slider/asc.ts +0 -4
  1142. package/src/utils/slider/getMidpoint.ts +0 -14
  1143. package/src/utils/slider/getPushedThumbValues.ts +0 -73
  1144. package/src/utils/slider/getSliderValue.ts +0 -27
  1145. package/src/utils/slider/replaceArrayItemAtIndex.ts +0 -8
  1146. package/src/utils/slider/resolveThumbCollision.ts +0 -178
  1147. package/src/utils/slider/roundValueToStep.ts +0 -22
  1148. package/src/utils/slider/validateMinimumDistance.ts +0 -22
  1149. package/src/utils/slider/valueArrayToPercentages.ts +0 -11
  1150. package/src/utils/store/ReactStore.ts +0 -168
  1151. package/src/utils/store/Store.ts +0 -84
  1152. package/src/utils/store/createSelector.ts +0 -66
  1153. package/src/utils/store/useStore.ts +0 -49
  1154. package/src/utils/stringifyLocale.ts +0 -10
  1155. package/src/utils/useAnchorPositioning.ts +0 -581
  1156. package/src/utils/useAnimationFrame.ts +0 -82
  1157. package/src/utils/useAnimationsFinished.ts +0 -100
  1158. package/src/utils/useBaseUiId.ts +0 -19
  1159. package/src/utils/useButton.ts +0 -217
  1160. package/src/utils/useCheckboxGroupParent.ts +0 -113
  1161. package/src/utils/useControlled.ts +0 -42
  1162. package/src/utils/useEnhancedClickHandler.ts +0 -47
  1163. package/src/utils/useForcedRerendering.ts +0 -11
  1164. package/src/utils/useOnFirstRender.ts +0 -11
  1165. package/src/utils/useOnMount.ts +0 -17
  1166. package/src/utils/useOpenChangeComplete.ts +0 -46
  1167. package/src/utils/usePopupViewport.ts +0 -375
  1168. package/src/utils/usePositioner.ts +0 -48
  1169. package/src/utils/usePressAndHold.ts +0 -35
  1170. package/src/utils/usePreviousValue.ts +0 -33
  1171. package/src/utils/useRefWithInit.ts +0 -23
  1172. package/src/utils/useRenderElement.ts +0 -164
  1173. package/src/utils/useScrollLock.ts +0 -253
  1174. package/src/utils/useStableCallback.ts +0 -26
  1175. package/src/utils/useTimeout.ts +0 -51
  1176. package/src/utils/useTransitionStatus.ts +0 -115
  1177. package/src/utils/useValueAsRef.ts +0 -25
  1178. package/src/utils/useValueChanged.ts +0 -37
  1179. package/src/utils/visuallyHidden.ts +0 -24
@@ -0,0 +1,1237 @@
1
+ 'use client';
2
+ import * as React from 'octane';
3
+ import * as ReactDOM from 'octane';
4
+ import { isElement } from '@floating-ui/utils/dom';
5
+ import { addEventListener } from '@octanejs/base-ui-utils/addEventListener';
6
+ import { ownerDocument, ownerWindow } from '@octanejs/base-ui-utils/owner';
7
+ import { useAnimationFrame } from '@octanejs/base-ui-utils/useAnimationFrame';
8
+ import { useIsoLayoutEffect } from '@octanejs/base-ui-utils/useIsoLayoutEffect';
9
+ import { useStableCallback } from '@octanejs/base-ui-utils/useStableCallback';
10
+ import { clamp } from '@octanejs/base-ui-utils/clamp';
11
+ import { useDialogRootContext } from '../../dialog/root/DialogRootContext';
12
+ import { DialogViewport } from '../../dialog/viewport/DialogViewport.tsrx';
13
+ import * as DialogViewportDataAttributes from '../../dialog/viewport/DialogViewportDataAttributes';
14
+ import { mergeProps } from '../../merge-props';
15
+ import { useDrawerRootContext } from '../root/DrawerRootContext';
16
+ import {
17
+ closestSnapPointIndex,
18
+ getSnapPointSwipeMovement,
19
+ useDrawerSnapPoints,
20
+ type ResolvedDrawerSnapPoint,
21
+ } from '../root/useDrawerSnapPoints';
22
+ import { useDrawerProviderContext } from '../provider/DrawerProviderContext';
23
+ import {
24
+ getDisplacement,
25
+ useSwipeDismiss,
26
+ type SwipeDirection,
27
+ type UseSwipeDismissProgressDetails,
28
+ } from '../../utils/useSwipeDismiss';
29
+ import * as DrawerPopupCssVars from '../popup/DrawerPopupCssVars';
30
+ import * as DrawerPopupDataAttributes from '../popup/DrawerPopupDataAttributes';
31
+ import * as DrawerBackdropCssVars from '../backdrop/DrawerBackdropCssVars';
32
+ import { DRAWER_CONTENT_ATTRIBUTE } from '../content/drawerContentAttribute';
33
+ import { REASONS } from '../../internals/reasons';
34
+ import { createChangeEventDetails } from '../../internals/createBaseUIEventDetails';
35
+ import { activeElement, contains, getTarget } from '../../floating-ui-react/utils';
36
+ import { DrawerViewportContext } from './DrawerViewportContext.tsrx';
37
+ import { TransitionStatusDataAttributes } from '../../internals/stateAttributesMapping';
38
+ import { findScrollableTouchTarget, type ScrollAxis } from '../../utils/scrollable';
39
+ import { BASE_UI_SWIPE_IGNORE_SELECTOR } from '../../internals/constants';
40
+ import { getElementAtPoint } from '../../utils/getElementAtPoint';
41
+ import type { BaseUIComponentProps } from '../../internals/types';
42
+ import type { TransitionStatus } from '../../internals/useTransitionStatus';
43
+ import { useDrawerVirtualKeyboardContext } from '../virtual-keyboard-provider/DrawerVirtualKeyboardContext.tsrx';
44
+
45
+ const MIN_SWIPE_THRESHOLD = 10;
46
+ const FAST_SWIPE_VELOCITY = 0.5;
47
+ const SNAP_VELOCITY_THRESHOLD = 0.5;
48
+ const SNAP_VELOCITY_MULTIPLIER = 300;
49
+ const MAX_SNAP_VELOCITY = 4;
50
+ const MIN_SWIPE_RELEASE_VELOCITY = 0.2;
51
+ const MAX_SWIPE_RELEASE_VELOCITY = 4;
52
+ const MIN_SWIPE_RELEASE_DURATION_MS = 80;
53
+ const MAX_SWIPE_RELEASE_DURATION_MS = 360;
54
+ const MIN_SWIPE_RELEASE_SCALAR = 0.1;
55
+ const MAX_SWIPE_RELEASE_SCALAR = 1;
56
+ const AXIS_LOCK_SLOP = 6;
57
+ const AXIS_LOCK_BIAS = 2;
58
+ const DRAWER_CONTENT_SELECTOR = `[${DRAWER_CONTENT_ATTRIBUTE}]`;
59
+
60
+ interface TouchScrollState {
61
+ startX: number;
62
+ startY: number;
63
+ lastX: number;
64
+ lastY: number;
65
+ scrollTarget: HTMLElement | null;
66
+ hasCrossAxisScrollableContent: boolean;
67
+ allowSwipe: boolean | null;
68
+ preserveNativeCrossAxisScroll: boolean;
69
+ drawerAxisAttributed: boolean;
70
+ }
71
+
72
+ /**
73
+ * A positioning container for the drawer popup that can be made scrollable.
74
+ * Renders a `<div>` element.
75
+ *
76
+ * Documentation: [Base UI Drawer](https://base-ui.com/react/components/drawer)
77
+ */
78
+ export const DrawerViewport = function DrawerViewport(
79
+ propsWithRef: React.PropsWithoutRef<DrawerViewport.Props> & { ref?: React.Ref<HTMLDivElement> },
80
+ ) {
81
+ const { ref: forwardedRef = null, ...props } = propsWithRef;
82
+ const { render, className, style, children, ...elementProps } = props;
83
+
84
+ const store = useDialogRootContext();
85
+ const popupRef = store.context.popupRef;
86
+ const backdropRef = store.context.backdropRef;
87
+
88
+ const {
89
+ swipeDirection,
90
+ notifyParentSwipingChange,
91
+ notifyParentSwipeProgressChange,
92
+ frontmostHeight,
93
+ snapToSequentialPoints,
94
+ swipeAreaActiveRef,
95
+ } = useDrawerRootContext();
96
+ const providerContext = useDrawerProviderContext();
97
+ const {
98
+ snapPoints,
99
+ resolvedSnapPoints,
100
+ activeSnapPoint,
101
+ activeSnapPointOffset,
102
+ setActiveSnapPoint,
103
+ popupHeight,
104
+ } = useDrawerSnapPoints();
105
+
106
+ const open = store.useState('open');
107
+ const mounted = store.useState('mounted');
108
+ const nested = store.useState('nested');
109
+ const nestedOpenDrawerCount = store.useState('nestedOpenDrawerCount');
110
+ const viewportElement = store.useState('viewportElement');
111
+ const popupElementState = store.useState('popupElement');
112
+
113
+ const visualStateStore = providerContext?.visualStateStore;
114
+ const nestedDrawerOpen = nestedOpenDrawerCount > 0;
115
+ const scrollAxis =
116
+ swipeDirection === 'left' || swipeDirection === 'right' ? 'horizontal' : 'vertical';
117
+ const isVerticalScrollAxis = scrollAxis === 'vertical';
118
+ const crossScrollAxis: ScrollAxis = isVerticalScrollAxis ? 'horizontal' : 'vertical';
119
+
120
+ const [swipeRelease, setSwipeRelease] = React.useState<number | null>(null);
121
+
122
+ const pendingSwipeCloseSnapPointRef = React.useRef<typeof activeSnapPoint | undefined>(undefined);
123
+ const resetSwipeRef = React.useRef<(() => void) | null>(null);
124
+ const controlledDismissFrame = useAnimationFrame();
125
+
126
+ const swipingRef = React.useRef(false);
127
+ const nestedSwipeActiveRef = React.useRef(false);
128
+ const lastPointerTypeRef = React.useRef<React.PointerEvent['pointerType'] | ''>('');
129
+ const ignoreNextTouchStartFromPenRef = React.useRef(false);
130
+ const ignoreTouchSwipeRef = React.useRef(false);
131
+ const touchScrollStateRef = React.useRef<TouchScrollState | null>(null);
132
+
133
+ const virtualKeyboard = useDrawerVirtualKeyboardContext();
134
+
135
+ const snapPointRange = React.useMemo(() => {
136
+ if (
137
+ !snapPoints ||
138
+ snapPoints.length < 2 ||
139
+ resolvedSnapPoints.length < 2 ||
140
+ (swipeDirection !== 'down' && swipeDirection !== 'up')
141
+ ) {
142
+ return null;
143
+ }
144
+
145
+ const offsets = resolvedSnapPoints.map((point) => point.offset).sort((a, b) => a - b);
146
+
147
+ const minOffset = offsets[0];
148
+ const nextOffset = offsets[1];
149
+ const range = nextOffset - minOffset;
150
+
151
+ return { minOffset, range };
152
+ }, [resolvedSnapPoints, snapPoints, swipeDirection]);
153
+
154
+ const snapPointProgress = React.useMemo(() => {
155
+ if (!snapPointRange || activeSnapPointOffset === null) {
156
+ return null;
157
+ }
158
+
159
+ return clamp((activeSnapPointOffset - snapPointRange.minOffset) / snapPointRange.range, 0, 1);
160
+ }, [activeSnapPointOffset, snapPointRange]);
161
+
162
+ const swipeDirections = React.useMemo<SwipeDirection[]>(() => {
163
+ if (
164
+ snapPoints &&
165
+ snapPoints.length > 0 &&
166
+ (swipeDirection === 'down' || swipeDirection === 'up')
167
+ ) {
168
+ return swipeDirection === 'down' ? ['down', 'up'] : ['up', 'down'];
169
+ }
170
+
171
+ return [swipeDirection];
172
+ }, [snapPoints, swipeDirection]);
173
+
174
+ const setSwipeDismissed = useStableCallback((dismissed: boolean) => {
175
+ popupRef.current?.toggleAttribute(DrawerPopupDataAttributes.swipeDismiss, dismissed);
176
+ backdropRef.current?.toggleAttribute(DrawerPopupDataAttributes.swipeDismiss, dismissed);
177
+ });
178
+
179
+ const clearSwipeRelease = useStableCallback(() => {
180
+ setSwipeDismissed(false);
181
+ popupRef.current?.removeAttribute(TransitionStatusDataAttributes.endingStyle);
182
+ setSwipeRelease(null);
183
+ });
184
+
185
+ const finishNestedSwipe = useStableCallback(() => {
186
+ if (!nestedSwipeActiveRef.current) {
187
+ return;
188
+ }
189
+
190
+ nestedSwipeActiveRef.current = false;
191
+ notifyParentSwipingChange?.(false);
192
+ });
193
+
194
+ const applySwipeProgress = useStableCallback(
195
+ (resolvedProgress: number, shouldTrackProgress: boolean, notifyParent: boolean) => {
196
+ const isActive = open && !nested && shouldTrackProgress;
197
+ const swipeProgress = isActive ? resolvedProgress : 0;
198
+ const nestedSwipeProgress = open && shouldTrackProgress ? resolvedProgress : 0;
199
+
200
+ if (notifyParent && notifyParentSwipeProgressChange) {
201
+ notifyParentSwipeProgressChange(nestedSwipeProgress);
202
+
203
+ if (nestedSwipeProgress <= 0) {
204
+ finishNestedSwipe();
205
+ }
206
+ }
207
+
208
+ visualStateStore?.set({
209
+ swipeProgress,
210
+ frontmostHeight: swipeProgress > 0 ? frontmostHeight : 0,
211
+ });
212
+
213
+ const backdropElement = backdropRef.current;
214
+ if (!backdropElement) {
215
+ return;
216
+ }
217
+
218
+ const showProgress = isActive && swipeProgress > 0;
219
+ backdropElement.style.setProperty(
220
+ DrawerBackdropCssVars.swipeProgress,
221
+ showProgress ? `${swipeProgress}` : '0',
222
+ );
223
+ if (showProgress && frontmostHeight > 0) {
224
+ backdropElement.style.setProperty(DrawerPopupCssVars.height, `${frontmostHeight}px`);
225
+ } else {
226
+ backdropElement.style.removeProperty(DrawerPopupCssVars.height);
227
+ }
228
+ },
229
+ );
230
+
231
+ function resolveSwipeRelease(
232
+ popupElement: HTMLElement,
233
+ direction: SwipeDirection,
234
+ deltaX: number,
235
+ deltaY: number,
236
+ velocityX: number,
237
+ velocityY: number,
238
+ releaseVelocityX: number,
239
+ releaseVelocityY: number,
240
+ ): number | null {
241
+ const size = getBaseSwipeSize(popupElement, direction);
242
+ if (size <= 0) {
243
+ return null;
244
+ }
245
+
246
+ // The snap point base offset shifts the popup along the dismiss direction for both
247
+ // `down` (+offset) and `up` (-offset), so it always adds to the directional translation.
248
+ const snapPointBaseOffset =
249
+ (direction === 'down' || direction === 'up') && snapPoints && snapPoints.length > 0
250
+ ? (activeSnapPointOffset ?? 0)
251
+ : 0;
252
+ const translationAlongDirection =
253
+ snapPointBaseOffset + getDisplacement(direction, deltaX, deltaY);
254
+ const remainingDistance = Math.max(0, size - translationAlongDirection);
255
+ if (remainingDistance <= 0) {
256
+ return null;
257
+ }
258
+
259
+ const releaseVelocity = getDisplacement(direction, releaseVelocityX, releaseVelocityY);
260
+ const directionalVelocity =
261
+ Math.abs(releaseVelocity) > 0
262
+ ? releaseVelocity
263
+ : getDisplacement(direction, velocityX, velocityY);
264
+ if (directionalVelocity <= MIN_SWIPE_RELEASE_VELOCITY) {
265
+ return null;
266
+ }
267
+
268
+ const clampedVelocity = clamp(
269
+ directionalVelocity,
270
+ MIN_SWIPE_RELEASE_VELOCITY,
271
+ MAX_SWIPE_RELEASE_VELOCITY,
272
+ );
273
+ // The gesture hook supplies finite deltas and velocities. The guards above keep the remaining
274
+ // distance and divisor positive, so the duration stays within [MIN, MAX] and the resulting
275
+ // scalar within (0, 1].
276
+ const durationMs = clamp(
277
+ remainingDistance / clampedVelocity,
278
+ MIN_SWIPE_RELEASE_DURATION_MS,
279
+ MAX_SWIPE_RELEASE_DURATION_MS,
280
+ );
281
+ const normalizedDuration =
282
+ (durationMs - MIN_SWIPE_RELEASE_DURATION_MS) /
283
+ (MAX_SWIPE_RELEASE_DURATION_MS - MIN_SWIPE_RELEASE_DURATION_MS);
284
+ return (
285
+ MIN_SWIPE_RELEASE_SCALAR +
286
+ normalizedDuration * (MAX_SWIPE_RELEASE_SCALAR - MIN_SWIPE_RELEASE_SCALAR)
287
+ );
288
+ }
289
+
290
+ function updateNestedSwipeActive(details?: UseSwipeDismissProgressDetails) {
291
+ if (nestedSwipeActiveRef.current || !details) {
292
+ return;
293
+ }
294
+
295
+ const direction = details.direction ?? swipeDirection;
296
+ const delta = getDisplacement(direction, details.deltaX, details.deltaY);
297
+ if (Math.abs(delta) < MIN_SWIPE_THRESHOLD) {
298
+ return;
299
+ }
300
+
301
+ nestedSwipeActiveRef.current = true;
302
+ notifyParentSwipingChange?.(true);
303
+ }
304
+
305
+ const swipe = useSwipeDismiss({
306
+ enabled: mounted && !nestedDrawerOpen,
307
+ directions: swipeDirections,
308
+ elementRef: store.context.popupRef,
309
+ ignoreSelectorWhenTouch: false,
310
+ ignoreScrollableAncestors: true,
311
+ movementCssVars: {
312
+ x: DrawerPopupCssVars.swipeMovementX,
313
+ y: DrawerPopupCssVars.swipeMovementY,
314
+ },
315
+ onSwipeStart(event) {
316
+ if ('touches' in event || event.pointerType === 'touch') {
317
+ return;
318
+ }
319
+
320
+ const popupElement = popupRef.current;
321
+
322
+ const doc = ownerDocument(popupElement);
323
+ const selection = doc.getSelection?.();
324
+ if (!selection || selection.isCollapsed) {
325
+ return;
326
+ }
327
+
328
+ const anchorElement = isElement(selection.anchorNode)
329
+ ? selection.anchorNode
330
+ : selection.anchorNode?.parentElement;
331
+ const focusElement = isElement(selection.focusNode)
332
+ ? selection.focusNode
333
+ : selection.focusNode?.parentElement;
334
+
335
+ if (!contains(popupElement, anchorElement) && !contains(popupElement, focusElement)) {
336
+ return;
337
+ }
338
+
339
+ selection.removeAllRanges();
340
+ },
341
+ onSwipingChange(swiping) {
342
+ swipingRef.current = swiping;
343
+ setBackdropSwipingAttribute(store.context.backdropRef.current, swiping);
344
+
345
+ if (!swiping && !notifyParentSwipeProgressChange) {
346
+ finishNestedSwipe();
347
+ }
348
+ },
349
+ swipeThreshold({ element, direction }) {
350
+ return getBaseSwipeThreshold(element, direction);
351
+ },
352
+ canStart(position, details) {
353
+ const popupElement = store.context.popupRef.current;
354
+ if (!popupElement) {
355
+ return false;
356
+ }
357
+
358
+ const doc = popupElement.ownerDocument;
359
+ const elementAtPoint = getElementAtPoint(popupElement.getRootNode(), position.x, position.y);
360
+ if (!elementAtPoint || !contains(popupElement, elementAtPoint)) {
361
+ return false;
362
+ }
363
+
364
+ const nativeEvent = details.nativeEvent;
365
+ const touchLike = 'touches' in nativeEvent || nativeEvent.pointerType === 'touch';
366
+ if (touchLike && shouldIgnoreSwipeForTextSelection(doc, popupElement)) {
367
+ return false;
368
+ }
369
+
370
+ return true;
371
+ },
372
+ onProgress(progress, details) {
373
+ const swiping = swipingRef.current;
374
+
375
+ if (swiping) {
376
+ updateNestedSwipeActive(details);
377
+ }
378
+
379
+ const hasSnapPoints = Boolean(snapPoints && snapPoints.length > 0);
380
+ if (swiping && swipeDirection === 'down' && hasSnapPoints && details) {
381
+ const popupElement = store.context.popupRef.current;
382
+ if (popupElement) {
383
+ popupElement.style.removeProperty('transform');
384
+ popupElement.style.setProperty(
385
+ DrawerPopupCssVars.swipeMovementY,
386
+ `${getSnapPointSwipeMovement(activeSnapPointOffset ?? 0, details.deltaY)}px`,
387
+ );
388
+ }
389
+ }
390
+
391
+ let resolvedProgress = progress;
392
+ if (snapPointRange && popupHeight > 0) {
393
+ const baseOffset = activeSnapPointOffset ?? snapPointRange.minOffset;
394
+ const offsetToProgress = (nextOffset: number) =>
395
+ clamp((nextOffset - snapPointRange.minOffset) / snapPointRange.range, 0, 1);
396
+
397
+ // Outside a drag the hook still reports the last drag deltas, both after a release and
398
+ // on a gesture that never started (e.g. a press inside `Drawer.Content`). Recomputing
399
+ // from them would re-apply drag progress to a drawer that rests on its snap point.
400
+ if (swiping && details && Number.isFinite(details.deltaY)) {
401
+ resolvedProgress = offsetToProgress(clamp(baseOffset + details.deltaY, 0, popupHeight));
402
+ } else if (snapPointProgress !== null) {
403
+ resolvedProgress = snapPointProgress;
404
+ }
405
+ }
406
+
407
+ // A parent drawer follows an active drag only, so drop it back to zero once the drag ends.
408
+ if (!swiping) {
409
+ notifyParentSwipeProgressChange?.(0);
410
+ finishNestedSwipe();
411
+ }
412
+
413
+ applySwipeProgress(resolvedProgress, true, swiping);
414
+ },
415
+ onRelease({
416
+ event,
417
+ deltaX,
418
+ deltaY,
419
+ direction,
420
+ velocityX,
421
+ velocityY,
422
+ releaseVelocityX,
423
+ releaseVelocityY,
424
+ }) {
425
+ const popupElement = store.context.popupRef.current;
426
+ if (!popupElement) {
427
+ clearSwipeRelease();
428
+ return undefined;
429
+ }
430
+ const releasePopupElement = popupElement;
431
+
432
+ function startSwipeRelease(resolvedDirection: SwipeDirection) {
433
+ // Start ending transition styles earlier and synchronously to prevent a period where
434
+ // the popup appears stuck on release before the actual closing animation starts.
435
+ finishNestedSwipe();
436
+ setSwipeDismissed(true);
437
+
438
+ releasePopupElement.style.removeProperty('transition');
439
+ releasePopupElement.setAttribute(TransitionStatusDataAttributes.endingStyle, '');
440
+ ReactDOM.flushSync(() => {
441
+ setSwipeRelease(
442
+ resolveSwipeRelease(
443
+ releasePopupElement,
444
+ resolvedDirection,
445
+ deltaX,
446
+ deltaY,
447
+ velocityX,
448
+ velocityY,
449
+ releaseVelocityX,
450
+ releaseVelocityY,
451
+ ),
452
+ );
453
+ });
454
+ }
455
+
456
+ if (!snapPoints || snapPoints.length === 0) {
457
+ if (!direction) {
458
+ clearSwipeRelease();
459
+ return undefined;
460
+ }
461
+
462
+ const directionalDelta = getDisplacement(direction, deltaX, deltaY);
463
+ if (directionalDelta <= 0) {
464
+ clearSwipeRelease();
465
+ return false;
466
+ }
467
+
468
+ if (getDisplacement(direction, velocityX, velocityY) >= FAST_SWIPE_VELOCITY) {
469
+ startSwipeRelease(direction);
470
+ return true;
471
+ }
472
+
473
+ const shouldClose =
474
+ directionalDelta > getBaseSwipeThreshold(releasePopupElement, direction);
475
+ if (shouldClose) {
476
+ startSwipeRelease(direction);
477
+ } else {
478
+ clearSwipeRelease();
479
+ }
480
+ return shouldClose;
481
+ }
482
+
483
+ if (swipeDirection !== 'down' && swipeDirection !== 'up') {
484
+ clearSwipeRelease();
485
+ return undefined;
486
+ }
487
+
488
+ if (!popupHeight) {
489
+ clearSwipeRelease();
490
+ return false;
491
+ }
492
+
493
+ if (resolvedSnapPoints.length === 0) {
494
+ clearSwipeRelease();
495
+ return undefined;
496
+ }
497
+
498
+ const dragDelta = swipeDirection === 'down' ? deltaY : -deltaY;
499
+ const dragDirection = Math.sign(dragDelta);
500
+ const releaseDirectionalVelocity =
501
+ swipeDirection === 'down' ? releaseVelocityY : -releaseVelocityY;
502
+ const fallbackDirectionalVelocity = swipeDirection === 'down' ? velocityY : -velocityY;
503
+ let resolvedDirectionalVelocity = releaseDirectionalVelocity;
504
+ if (dragDirection !== 0 && Math.abs(dragDelta) >= MIN_SWIPE_THRESHOLD) {
505
+ const velocityDirection = Math.sign(resolvedDirectionalVelocity);
506
+ if (velocityDirection !== 0 && velocityDirection !== dragDirection) {
507
+ // Ignore touch reversals that would otherwise flip the snap decision.
508
+ resolvedDirectionalVelocity = fallbackDirectionalVelocity;
509
+ }
510
+ }
511
+
512
+ const currentOffset = activeSnapPointOffset ?? 0;
513
+ const dragTargetOffset = clamp(currentOffset + dragDelta, 0, popupHeight);
514
+ const velocityOffset =
515
+ Math.abs(resolvedDirectionalVelocity) >= SNAP_VELOCITY_THRESHOLD
516
+ ? clamp(resolvedDirectionalVelocity, -MAX_SNAP_VELOCITY, MAX_SNAP_VELOCITY) *
517
+ SNAP_VELOCITY_MULTIPLIER
518
+ : 0;
519
+ const targetOffset = snapToSequentialPoints
520
+ ? dragTargetOffset
521
+ : clamp(dragTargetOffset + velocityOffset, 0, popupHeight);
522
+ const snapPointEventDetails = createChangeEventDetails(REASONS.swipe, event);
523
+
524
+ const settleInPlace = () => {
525
+ // Reset nested swipe state now: the hook's trailing progress update is deduped
526
+ // when the drag never produced dismissal progress, so it may not fire.
527
+ applySwipeProgress(0, true, true);
528
+ clearSwipeRelease();
529
+ return false;
530
+ };
531
+
532
+ const settleOnSnapPoint = (snapPoint: ResolvedDrawerSnapPoint) => {
533
+ setActiveSnapPoint(snapPoint.value, snapPointEventDetails);
534
+ return settleInPlace();
535
+ };
536
+
537
+ const closeFromSnapPoints = (fallbackSnapPoint: ResolvedDrawerSnapPoint) => {
538
+ // An unattributed gesture (e.g. a mostly horizontal flick) may settle on a snap
539
+ // point but must not dismiss: `useSwipeDismiss` drops a directionless dismissal,
540
+ // stranding the popup visually closed while `open` stays `true`.
541
+ if (!direction) {
542
+ return settleOnSnapPoint(fallbackSnapPoint);
543
+ }
544
+ setActiveSnapPoint(null, snapPointEventDetails);
545
+ if (snapPointEventDetails.isCanceled) {
546
+ // A canceled null snap point rejects dismissal before exit styles start.
547
+ return settleInPlace();
548
+ }
549
+ pendingSwipeCloseSnapPointRef.current = activeSnapPoint;
550
+ startSwipeRelease(swipeDirection);
551
+ return true;
552
+ };
553
+
554
+ if (snapToSequentialPoints) {
555
+ const orderedSnapPoints = [...resolvedSnapPoints].sort(
556
+ (first, second) => first.offset - second.offset,
557
+ );
558
+ const orderedOffsets = orderedSnapPoints.map((point) => point.offset);
559
+ const currentIndex = closestSnapPointIndex(orderedOffsets, currentOffset);
560
+ let targetSnapPoint =
561
+ orderedSnapPoints[closestSnapPointIndex(orderedOffsets, targetOffset)];
562
+
563
+ const velocityDirection = Math.sign(resolvedDirectionalVelocity);
564
+ const shouldAdvance =
565
+ dragDirection !== 0 &&
566
+ velocityDirection !== 0 &&
567
+ velocityDirection === dragDirection &&
568
+ Math.abs(resolvedDirectionalVelocity) >= SNAP_VELOCITY_THRESHOLD;
569
+ let effectiveTargetOffset = targetOffset;
570
+
571
+ if (shouldAdvance) {
572
+ const adjacentIndex = clamp(
573
+ currentIndex + dragDirection,
574
+ 0,
575
+ orderedSnapPoints.length - 1,
576
+ );
577
+ if (adjacentIndex !== currentIndex) {
578
+ const adjacentPoint = orderedSnapPoints[adjacentIndex];
579
+ const shouldForceAdjacent =
580
+ dragDirection > 0
581
+ ? targetOffset < adjacentPoint.offset
582
+ : targetOffset > adjacentPoint.offset;
583
+ if (shouldForceAdjacent) {
584
+ targetSnapPoint = adjacentPoint;
585
+ effectiveTargetOffset = adjacentPoint.offset;
586
+ }
587
+ } else if (dragDirection > 0) {
588
+ return closeFromSnapPoints(targetSnapPoint);
589
+ }
590
+ }
591
+
592
+ const closeDistance = Math.abs(effectiveTargetOffset - popupHeight);
593
+ const snapDistance = Math.abs(effectiveTargetOffset - targetSnapPoint.offset);
594
+ if (closeDistance < snapDistance) {
595
+ return closeFromSnapPoints(targetSnapPoint);
596
+ }
597
+
598
+ return settleOnSnapPoint(targetSnapPoint);
599
+ }
600
+
601
+ const closestSnapPoint =
602
+ resolvedSnapPoints[
603
+ closestSnapPointIndex(
604
+ resolvedSnapPoints.map((point) => point.offset),
605
+ targetOffset,
606
+ )
607
+ ];
608
+
609
+ if (resolvedDirectionalVelocity >= FAST_SWIPE_VELOCITY && dragDelta > 0) {
610
+ return closeFromSnapPoints(closestSnapPoint);
611
+ }
612
+
613
+ const closeDistance = Math.abs(targetOffset - popupHeight);
614
+ if (closeDistance < Math.abs(targetOffset - closestSnapPoint.offset)) {
615
+ return closeFromSnapPoints(closestSnapPoint);
616
+ }
617
+
618
+ return settleOnSnapPoint(closestSnapPoint);
619
+ },
620
+ onDismiss(event) {
621
+ visualStateStore?.set({ swipeProgress: 0, frontmostHeight: 0 });
622
+
623
+ const backdropElement = store.context.backdropRef.current;
624
+ if (backdropElement) {
625
+ backdropElement.style.setProperty(DrawerBackdropCssVars.swipeProgress, '0');
626
+ backdropElement.style.removeProperty(DrawerPopupCssVars.height);
627
+ }
628
+
629
+ const dismissEventDetails: Parameters<typeof store.setOpen>[1] = createChangeEventDetails(
630
+ REASONS.swipe,
631
+ event,
632
+ );
633
+ store.setOpen(false, dismissEventDetails);
634
+
635
+ if (dismissEventDetails.isCanceled) {
636
+ const pendingSnapPoint = pendingSwipeCloseSnapPointRef.current;
637
+ if (pendingSnapPoint !== undefined) {
638
+ setActiveSnapPoint(pendingSnapPoint, createChangeEventDetails(REASONS.swipe, event));
639
+ }
640
+
641
+ pendingSwipeCloseSnapPointRef.current = undefined;
642
+ resetSwipeRef.current?.();
643
+ clearSwipeRelease();
644
+ return;
645
+ }
646
+
647
+ // In controlled mode, the effective open state may not have changed yet
648
+ // (openProp takes precedence over state.open). Proceed optimistically with the
649
+ // dismiss animation — React's Scheduler flushes before the next rAF, so we can
650
+ // reliably check whether the parent accepted or rejected the close.
651
+ // Note: if onOpenChange is asynchronous (e.g., closes the drawer after a network
652
+ // call), the rAF check will see open === true, revert the animation, and the
653
+ // drawer will close without animation when the parent eventually sets open={false}.
654
+ if (store.select('open')) {
655
+ const savedEvent = event;
656
+ controlledDismissFrame.request(() => {
657
+ if (store.select('open')) {
658
+ // Parent rejected: revert animation and restore snap point.
659
+ const pendingSnapPoint = pendingSwipeCloseSnapPointRef.current;
660
+ if (pendingSnapPoint !== undefined) {
661
+ setActiveSnapPoint(
662
+ pendingSnapPoint,
663
+ createChangeEventDetails(REASONS.swipe, savedEvent),
664
+ );
665
+ }
666
+ pendingSwipeCloseSnapPointRef.current = undefined;
667
+ clearSwipeRelease();
668
+ resetSwipeRef.current?.();
669
+ } else {
670
+ // Parent accepted: clean up the ref.
671
+ pendingSwipeCloseSnapPointRef.current = undefined;
672
+ }
673
+ });
674
+ return;
675
+ }
676
+
677
+ pendingSwipeCloseSnapPointRef.current = undefined;
678
+ setSwipeDismissed(true);
679
+ },
680
+ });
681
+
682
+ const swipePointerProps = swipe.getPointerProps();
683
+ const swipeTouchProps = swipe.getTouchProps();
684
+ const { moveNative: moveSwipeNative, reset: resetSwipe } = swipe;
685
+
686
+ resetSwipeRef.current = resetSwipe;
687
+
688
+ React.useEffect(() => {
689
+ const rootElement = viewportElement ?? popupElementState;
690
+ if (!rootElement) {
691
+ return undefined;
692
+ }
693
+
694
+ const resolvedRootElement: HTMLElement = rootElement;
695
+
696
+ const doc = ownerDocument(resolvedRootElement);
697
+ function processTouchMove(event: TouchEvent, touchState: TouchScrollState, touch: Touch) {
698
+ const drawerAxisDelta = isVerticalScrollAxis
699
+ ? touch.clientY - touchState.lastY
700
+ : touch.clientX - touchState.lastX;
701
+
702
+ // Avoid blocking pinch zoom or text selection adjustments on iOS Safari.
703
+ if (event.touches.length === 2) {
704
+ return;
705
+ }
706
+
707
+ const allowTouchMove = shouldIgnoreSwipeForTextSelection(doc, resolvedRootElement);
708
+
709
+ if (allowTouchMove || !open || !mounted || nestedDrawerOpen) {
710
+ return;
711
+ }
712
+
713
+ if (shouldYieldTouchMove(touchState, event, touch, isVerticalScrollAxis)) {
714
+ return;
715
+ }
716
+
717
+ const scrollTarget = touchState.scrollTarget;
718
+ if (!scrollTarget || scrollTarget === doc.documentElement || scrollTarget === doc.body) {
719
+ if (event.cancelable) {
720
+ event.preventDefault();
721
+ }
722
+ // Claim the gesture before React's delegated touch handlers see it; dispatching the
723
+ // move through React re-rasterizes the popup content on every frame.
724
+ event.stopPropagation();
725
+ moveSwipeNative(event, resolvedRootElement);
726
+ return;
727
+ }
728
+
729
+ if (!hasScrollableContentOnAxis(scrollTarget, scrollAxis)) {
730
+ // If the scroll container doesn't overflow on the drawer axis, prevent the window from
731
+ // scrolling instead.
732
+ if (event.cancelable) {
733
+ event.preventDefault();
734
+ }
735
+ event.stopPropagation();
736
+ return;
737
+ }
738
+
739
+ if (drawerAxisDelta !== 0) {
740
+ const canSwipeFromScrollEdge = canSwipeFromScrollEdgeOnMove(
741
+ scrollTarget,
742
+ scrollAxis,
743
+ swipeDirection,
744
+ drawerAxisDelta,
745
+ );
746
+
747
+ if (!touchState.allowSwipe) {
748
+ if (event.cancelable && canSwipeFromScrollEdge) {
749
+ touchState.allowSwipe = true;
750
+ event.preventDefault();
751
+ } else {
752
+ touchState.allowSwipe = false;
753
+ }
754
+ } else if (event.cancelable) {
755
+ event.preventDefault();
756
+ }
757
+ }
758
+
759
+ if (touchState.allowSwipe === true) {
760
+ event.stopPropagation();
761
+ moveSwipeNative(event, resolvedRootElement);
762
+ }
763
+ }
764
+
765
+ function handleNativeTouchMove(event: TouchEvent) {
766
+ // The virtual keyboard provider observes the move to tell a tap apart from a drag.
767
+ // It must run even when the swipe gesture below claims the event with
768
+ // `stopPropagation()`, which would otherwise prevent React's delegated handlers
769
+ // (and the provider) from ever seeing the move.
770
+ virtualKeyboard?.onTouchMove(event);
771
+
772
+ if (ignoreTouchSwipeRef.current) {
773
+ return;
774
+ }
775
+
776
+ const touchState = touchScrollStateRef.current;
777
+ const touch = event.touches[0];
778
+ if (!touch || !touchState) {
779
+ return;
780
+ }
781
+
782
+ processTouchMove(event, touchState, touch);
783
+ updateTouchScrollPosition(touchState, touch);
784
+ }
785
+
786
+ return addEventListener(doc, 'touchmove', handleNativeTouchMove, {
787
+ passive: false,
788
+ capture: true,
789
+ });
790
+ }, [
791
+ mounted,
792
+ nestedDrawerOpen,
793
+ open,
794
+ popupElementState,
795
+ isVerticalScrollAxis,
796
+ scrollAxis,
797
+ swipeDirection,
798
+ moveSwipeNative,
799
+ viewportElement,
800
+ virtualKeyboard,
801
+ ]);
802
+
803
+ useIsoLayoutEffect(() => {
804
+ if (!snapPointRange || swipe.swiping) {
805
+ return;
806
+ }
807
+
808
+ applySwipeProgress(!open || nested ? 0 : (snapPointProgress ?? 0), true, false);
809
+ }, [
810
+ applySwipeProgress,
811
+ frontmostHeight,
812
+ nested,
813
+ notifyParentSwipeProgressChange,
814
+ open,
815
+ snapPointProgress,
816
+ snapPointRange,
817
+ swipe.swiping,
818
+ store,
819
+ visualStateStore,
820
+ ]);
821
+
822
+ useIsoLayoutEffect(() => {
823
+ if (!notifyParentSwipeProgressChange) {
824
+ return undefined;
825
+ }
826
+
827
+ if (!open) {
828
+ notifyParentSwipeProgressChange(0);
829
+ }
830
+
831
+ return () => {
832
+ notifyParentSwipeProgressChange(0);
833
+ };
834
+ }, [notifyParentSwipeProgressChange, open]);
835
+
836
+ useIsoLayoutEffect(() => {
837
+ if (open) {
838
+ // Skip `resetSwipe` while `Drawer.SwipeArea` is driving the open: it zeroes the popup's
839
+ // `--swipe-movement-*` (via `syncDragStyles(false)`), flashing it fully open for a frame.
840
+ // `clearSwipeRelease` doesn't touch those vars, so always run it to clear any leftover
841
+ // release state from a prior dismiss (e.g. when the popup is kept mounted).
842
+ if (!swipeAreaActiveRef.current) {
843
+ resetSwipe();
844
+ }
845
+ clearSwipeRelease();
846
+ }
847
+ }, [clearSwipeRelease, open, resetSwipe, swipeAreaActiveRef]);
848
+
849
+ useIsoLayoutEffect(() => {
850
+ const backdropElement = backdropRef.current;
851
+
852
+ return () => {
853
+ visualStateStore?.set({ swipeProgress: 0, frontmostHeight: 0 });
854
+ setBackdropSwipingAttribute(backdropElement, false);
855
+ // `data-swiping` is set on whichever backdrop is current when a swipe starts, which can
856
+ // differ from the captured element if the backdrop mounted late or changed identity.
857
+ // Reading the live ref here is intentional so the current backdrop is cleared too.
858
+ // eslint-disable-next-line react-hooks/exhaustive-deps
859
+ const currentBackdrop = backdropRef.current;
860
+ if (currentBackdrop !== backdropElement) {
861
+ setBackdropSwipingAttribute(currentBackdrop, false);
862
+ }
863
+ finishNestedSwipe();
864
+ };
865
+ }, [backdropRef, finishNestedSwipe, visualStateStore]);
866
+
867
+ const swipeProviderValue = React.useMemo(
868
+ () => ({
869
+ swiping: swipe.swiping,
870
+ getDragStyles: swipe.getDragStyles,
871
+ swipeStrength: swipeRelease ?? null,
872
+ setSwipeDismissed,
873
+ }),
874
+ [setSwipeDismissed, swipe.getDragStyles, swipe.swiping, swipeRelease],
875
+ );
876
+
877
+ function resetTouchSwipeState(ignoreSwipe: boolean) {
878
+ ignoreTouchSwipeRef.current = ignoreSwipe;
879
+ touchScrollStateRef.current = null;
880
+ }
881
+
882
+ function resetTouchTrackingState() {
883
+ resetTouchSwipeState(false);
884
+ lastPointerTypeRef.current = '';
885
+ ignoreNextTouchStartFromPenRef.current = false;
886
+ }
887
+
888
+ function handlePointerEnd(event: React.PointerEvent): boolean {
889
+ lastPointerTypeRef.current = '';
890
+ return event.pointerType !== 'touch';
891
+ }
892
+
893
+ return (
894
+ <DialogViewport
895
+ ref={forwardedRef}
896
+ render={render}
897
+ {...mergeProps<'div'>(elementProps, {
898
+ onPointerDown(event) {
899
+ lastPointerTypeRef.current = event.pointerType;
900
+ ignoreNextTouchStartFromPenRef.current = event.pointerType === 'pen';
901
+
902
+ if (!open || !mounted || nestedDrawerOpen) {
903
+ return;
904
+ }
905
+
906
+ const elementAtPoint = getElementAtPoint(
907
+ event.currentTarget.getRootNode(),
908
+ event.clientX,
909
+ event.clientY,
910
+ );
911
+ if (isSwipeIgnoredTarget(elementAtPoint) || isDrawerContentTarget(elementAtPoint)) {
912
+ return;
913
+ }
914
+
915
+ if (event.pointerType === 'touch') {
916
+ return;
917
+ }
918
+
919
+ swipePointerProps.onPointerDown?.(event);
920
+ },
921
+ onPointerMove(event) {
922
+ if (event.pointerType === 'touch') {
923
+ return;
924
+ }
925
+
926
+ swipePointerProps.onPointerMove?.(event);
927
+ },
928
+ onPointerUp(event) {
929
+ if (handlePointerEnd(event)) {
930
+ swipePointerProps.onPointerUp?.(event);
931
+ }
932
+ },
933
+ onPointerCancel(event) {
934
+ if (handlePointerEnd(event)) {
935
+ swipePointerProps.onPointerCancel?.(event);
936
+ }
937
+ },
938
+ onTouchStart(event) {
939
+ const startedFromPenPointerDown =
940
+ lastPointerTypeRef.current === 'pen' && ignoreNextTouchStartFromPenRef.current;
941
+ if (startedFromPenPointerDown) {
942
+ ignoreNextTouchStartFromPenRef.current = false;
943
+ resetTouchSwipeState(false);
944
+ return;
945
+ }
946
+
947
+ if (!open || !mounted || nestedDrawerOpen) {
948
+ resetTouchSwipeState(false);
949
+ return;
950
+ }
951
+
952
+ const touch = event.touches[0];
953
+ if (!touch) {
954
+ return;
955
+ }
956
+
957
+ if (isReactTouchEventOnRangeInput(event)) {
958
+ resetTouchSwipeState(false);
959
+ return;
960
+ }
961
+
962
+ const rootElement = event.currentTarget;
963
+ const elementAtPoint = getElementAtPoint(
964
+ rootElement.getRootNode(),
965
+ touch.clientX,
966
+ touch.clientY,
967
+ );
968
+ const eventTarget = getTarget(event);
969
+ const target = isElement(eventTarget) ? eventTarget : rootElement;
970
+ if (!contains(rootElement, target)) {
971
+ resetTouchSwipeState(true);
972
+ return;
973
+ }
974
+
975
+ virtualKeyboard?.onTouchStart(event);
976
+
977
+ if (isSwipeIgnoredTarget(elementAtPoint)) {
978
+ resetTouchSwipeState(true);
979
+ return;
980
+ }
981
+ ignoreTouchSwipeRef.current = false;
982
+
983
+ const scrollTarget = findScrollableTouchTarget(target, rootElement, scrollAxis);
984
+ const hasCrossAxisScrollableContent =
985
+ findScrollableTouchTarget(target, rootElement, crossScrollAxis) != null;
986
+
987
+ let allowSwipe: boolean | null = null;
988
+ if (scrollTarget) {
989
+ const canSwipeFromEdge = isAtSwipeStartEdge(scrollTarget, scrollAxis, swipeDirection);
990
+
991
+ allowSwipe = canSwipeFromEdge ? null : false;
992
+ }
993
+
994
+ touchScrollStateRef.current = {
995
+ startX: touch.clientX,
996
+ startY: touch.clientY,
997
+ lastX: touch.clientX,
998
+ lastY: touch.clientY,
999
+ scrollTarget,
1000
+ hasCrossAxisScrollableContent,
1001
+ allowSwipe,
1002
+ preserveNativeCrossAxisScroll: false,
1003
+ drawerAxisAttributed: false,
1004
+ };
1005
+
1006
+ swipeTouchProps.onTouchStart?.(event);
1007
+ },
1008
+ onTouchEnd(event) {
1009
+ virtualKeyboard?.onTouchEnd(event);
1010
+ resetTouchTrackingState();
1011
+ swipeTouchProps.onTouchEnd?.(event);
1012
+ },
1013
+ onTouchCancel(event) {
1014
+ virtualKeyboard?.onTouchCancel();
1015
+ resetTouchTrackingState();
1016
+ swipeTouchProps.onTouchCancel?.(event);
1017
+ },
1018
+ // Drawer popups use drawer-specific nested state attributes.
1019
+ // Suppress DialogViewport's generic nested dialog attribute.
1020
+ [DialogViewportDataAttributes.nestedDialogOpen as string]: undefined,
1021
+ })}
1022
+ className={className}
1023
+ style={style}
1024
+ >
1025
+ <DrawerViewportContext.Provider value={swipeProviderValue}>
1026
+ {children}
1027
+ </DrawerViewportContext.Provider>
1028
+ </DialogViewport>
1029
+ );
1030
+ };
1031
+
1032
+ export interface DrawerViewportState {
1033
+ /**
1034
+ * Whether the drawer is currently open.
1035
+ */
1036
+ open: boolean;
1037
+ /**
1038
+ * The transition status of the component.
1039
+ */
1040
+ transitionStatus: TransitionStatus;
1041
+ /**
1042
+ * Whether the drawer is nested within another drawer.
1043
+ */
1044
+ nested: boolean;
1045
+ /**
1046
+ * Whether the drawer has nested drawers open.
1047
+ */
1048
+ nestedDialogOpen: boolean;
1049
+ }
1050
+
1051
+ export interface DrawerViewportProps extends BaseUIComponentProps<'div', DrawerViewportState> {}
1052
+
1053
+ export namespace DrawerViewport {
1054
+ export type Props = DrawerViewportProps;
1055
+ export type State = DrawerViewportState;
1056
+ }
1057
+
1058
+ function setBackdropSwipingAttribute(backdropElement: HTMLElement | null, swiping: boolean) {
1059
+ backdropElement?.toggleAttribute(DrawerPopupDataAttributes.swiping, swiping);
1060
+ }
1061
+
1062
+ function isSwipeIgnoredTarget(target: Element | null): boolean {
1063
+ return Boolean(target?.closest(BASE_UI_SWIPE_IGNORE_SELECTOR));
1064
+ }
1065
+
1066
+ function isDrawerContentTarget(target: Element | null): boolean {
1067
+ return Boolean(target?.closest(DRAWER_CONTENT_SELECTOR));
1068
+ }
1069
+
1070
+ function getBaseSwipeSize(element: HTMLElement, direction: SwipeDirection): number {
1071
+ return direction === 'left' || direction === 'right' ? element.offsetWidth : element.offsetHeight;
1072
+ }
1073
+
1074
+ function getBaseSwipeThreshold(element: HTMLElement, direction: SwipeDirection): number {
1075
+ return Math.max(getBaseSwipeSize(element, direction) * 0.5, MIN_SWIPE_THRESHOLD);
1076
+ }
1077
+
1078
+ function isRangeInput(
1079
+ target: EventTarget | null,
1080
+ win: ReturnType<typeof ownerWindow>,
1081
+ ): target is HTMLInputElement {
1082
+ return target instanceof win.HTMLInputElement && target.type === 'range';
1083
+ }
1084
+
1085
+ function isTextSelectionControl(target: Element): target is HTMLInputElement | HTMLTextAreaElement {
1086
+ return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA';
1087
+ }
1088
+
1089
+ function hasExpandedSelectionWithinTarget(selection: Selection, target: Element): boolean {
1090
+ const anchorElement = isElement(selection.anchorNode)
1091
+ ? selection.anchorNode
1092
+ : selection.anchorNode?.parentElement;
1093
+ const focusElement = isElement(selection.focusNode)
1094
+ ? selection.focusNode
1095
+ : selection.focusNode?.parentElement;
1096
+
1097
+ return (
1098
+ selection.containsNode(target, true) ||
1099
+ contains(target, anchorElement) ||
1100
+ contains(target, focusElement)
1101
+ );
1102
+ }
1103
+
1104
+ function shouldIgnoreSwipeForTextSelection(doc: Document, rootElement: HTMLElement): boolean {
1105
+ const activeEl = activeElement(doc);
1106
+ if (activeEl && contains(rootElement, activeEl) && isTextSelectionControl(activeEl)) {
1107
+ const { selectionStart, selectionEnd } = activeEl;
1108
+ if (selectionStart != null && selectionEnd != null && selectionStart < selectionEnd) {
1109
+ return true;
1110
+ }
1111
+ }
1112
+
1113
+ const selection = doc.getSelection?.();
1114
+ if (!selection || selection.isCollapsed) {
1115
+ return false;
1116
+ }
1117
+
1118
+ return hasExpandedSelectionWithinTarget(selection, rootElement);
1119
+ }
1120
+
1121
+ function isEventOnRangeInput(event: TouchEvent, win: ReturnType<typeof ownerWindow>): boolean {
1122
+ return event.composedPath().some((pathTarget) => isRangeInput(pathTarget, win));
1123
+ }
1124
+
1125
+ function isReactTouchEventOnRangeInput(event: React.TouchEvent<Element>): boolean {
1126
+ return isEventOnRangeInput(event, ownerWindow(event.currentTarget));
1127
+ }
1128
+
1129
+ function updateTouchScrollPosition(touchState: TouchScrollState, touch: Touch): void {
1130
+ touchState.lastX = touch.clientX;
1131
+ touchState.lastY = touch.clientY;
1132
+ }
1133
+
1134
+ /**
1135
+ * Arbitrates a touchmove between the drawer swipe and a native cross-axis scroll.
1136
+ * Returns `true` when the move must be left alone — either because the cross axis already won the
1137
+ * gesture, or because neither axis has passed the slop yet and the gesture cannot be attributed.
1138
+ */
1139
+ function shouldYieldTouchMove(
1140
+ touchState: TouchScrollState,
1141
+ event: TouchEvent,
1142
+ touch: Touch,
1143
+ isVerticalScrollAxis: boolean,
1144
+ ): boolean {
1145
+ if (touchState.preserveNativeCrossAxisScroll) {
1146
+ return true;
1147
+ }
1148
+
1149
+ // Attribution happens once per gesture. Re-arbitrating after the drawer axis has won would let
1150
+ // the pre-attribution branches below fire mid-drag (the slop is measured from the touch origin,
1151
+ // which is never re-baselined), freezing the popup and dropping `preventDefault()`.
1152
+ if (
1153
+ touchState.drawerAxisAttributed ||
1154
+ touchState.allowSwipe === true ||
1155
+ !touchState.hasCrossAxisScrollableContent
1156
+ ) {
1157
+ return false;
1158
+ }
1159
+
1160
+ // A non-cancelable touchmove means the browser has already committed the gesture to a native
1161
+ // scroll; claiming it for the swipe would drag the popup alongside the scrolling content.
1162
+ if (!event.cancelable) {
1163
+ touchState.preserveNativeCrossAxisScroll = true;
1164
+ return true;
1165
+ }
1166
+
1167
+ const drawerAxisGestureDelta = isVerticalScrollAxis
1168
+ ? touch.clientY - touchState.startY
1169
+ : touch.clientX - touchState.startX;
1170
+ const crossAxisGestureDelta = isVerticalScrollAxis
1171
+ ? touch.clientX - touchState.startX
1172
+ : touch.clientY - touchState.startY;
1173
+ const absDrawerAxisGestureDelta = Math.abs(drawerAxisGestureDelta);
1174
+ const absCrossAxisGestureDelta = Math.abs(crossAxisGestureDelta);
1175
+
1176
+ if (
1177
+ absCrossAxisGestureDelta >= AXIS_LOCK_SLOP &&
1178
+ absCrossAxisGestureDelta > absDrawerAxisGestureDelta + AXIS_LOCK_BIAS
1179
+ ) {
1180
+ touchState.preserveNativeCrossAxisScroll = true;
1181
+ return true;
1182
+ }
1183
+
1184
+ if (absDrawerAxisGestureDelta >= AXIS_LOCK_SLOP) {
1185
+ touchState.drawerAxisAttributed = true;
1186
+ return false;
1187
+ }
1188
+
1189
+ // Neither axis has traveled past the slop yet, so the gesture cannot be attributed. Leave the
1190
+ // event alone: on iOS, `preventDefault()` on the first cancelable touchmove cancels native
1191
+ // scrolling for the entire gesture, which would lock a cross-axis scroll that only passes the
1192
+ // slop on a later move.
1193
+ return true;
1194
+ }
1195
+
1196
+ function hasScrollableContentOnAxis(scrollTarget: HTMLElement, axis: ScrollAxis): boolean {
1197
+ return getScrollMetrics(scrollTarget, axis).max > 0;
1198
+ }
1199
+
1200
+ function getScrollMetrics(scrollTarget: HTMLElement, axis: ScrollAxis) {
1201
+ if (axis === 'vertical') {
1202
+ const max = Math.max(0, scrollTarget.scrollHeight - scrollTarget.clientHeight);
1203
+ return { offset: scrollTarget.scrollTop, max };
1204
+ }
1205
+
1206
+ const max = Math.max(0, scrollTarget.scrollWidth - scrollTarget.clientWidth);
1207
+ return { offset: scrollTarget.scrollLeft, max };
1208
+ }
1209
+
1210
+ function isAtSwipeStartEdge(
1211
+ scrollTarget: HTMLElement,
1212
+ axis: ScrollAxis,
1213
+ direction: SwipeDirection,
1214
+ ): boolean {
1215
+ const dismissFromStartEdge = shouldDismissFromStartEdge(direction, axis);
1216
+ const { offset, max } = getScrollMetrics(scrollTarget, axis);
1217
+ return dismissFromStartEdge ? offset <= 0 : offset >= max;
1218
+ }
1219
+
1220
+ function canSwipeFromScrollEdgeOnMove(
1221
+ scrollTarget: HTMLElement,
1222
+ axis: ScrollAxis,
1223
+ direction: SwipeDirection,
1224
+ delta: number,
1225
+ ): boolean {
1226
+ const dismissFromStartEdge = shouldDismissFromStartEdge(direction, axis);
1227
+ const movingTowardDismiss = dismissFromStartEdge ? delta > 0 : delta < 0;
1228
+ if (!movingTowardDismiss) {
1229
+ return false;
1230
+ }
1231
+
1232
+ return isAtSwipeStartEdge(scrollTarget, axis, direction);
1233
+ }
1234
+
1235
+ function shouldDismissFromStartEdge(direction: SwipeDirection, axis: ScrollAxis): boolean {
1236
+ return axis === 'vertical' ? direction === 'down' : direction === 'right';
1237
+ }