reka-ui 2.9.9 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/dist/AlertDialog/AlertDialogContent.cjs +2 -1
  2. package/dist/AlertDialog/AlertDialogContent.cjs.map +1 -1
  3. package/dist/AlertDialog/AlertDialogContent.js +2 -1
  4. package/dist/AlertDialog/AlertDialogContent.js.map +1 -1
  5. package/dist/AlertDialog/AlertDialogRoot.cjs +4 -0
  6. package/dist/AlertDialog/AlertDialogRoot.cjs.map +1 -1
  7. package/dist/AlertDialog/AlertDialogRoot.js +4 -0
  8. package/dist/AlertDialog/AlertDialogRoot.js.map +1 -1
  9. package/dist/Checkbox/CheckboxRoot.cjs +27 -18
  10. package/dist/Checkbox/CheckboxRoot.cjs.map +1 -1
  11. package/dist/Checkbox/CheckboxRoot.js +28 -19
  12. package/dist/Checkbox/CheckboxRoot.js.map +1 -1
  13. package/dist/Collection/Collection.cjs +2 -1
  14. package/dist/Collection/Collection.cjs.map +1 -1
  15. package/dist/Collection/Collection.js +2 -1
  16. package/dist/Collection/Collection.js.map +1 -1
  17. package/dist/Combobox/ComboboxContent.cjs +8 -0
  18. package/dist/Combobox/ComboboxContent.cjs.map +1 -1
  19. package/dist/Combobox/ComboboxContent.js +8 -0
  20. package/dist/Combobox/ComboboxContent.js.map +1 -1
  21. package/dist/Combobox/ComboboxContentImpl.cjs +18 -2
  22. package/dist/Combobox/ComboboxContentImpl.cjs.map +1 -1
  23. package/dist/Combobox/ComboboxContentImpl.js +18 -2
  24. package/dist/Combobox/ComboboxContentImpl.js.map +1 -1
  25. package/dist/Combobox/ComboboxItem.cjs +11 -2
  26. package/dist/Combobox/ComboboxItem.cjs.map +1 -1
  27. package/dist/Combobox/ComboboxItem.js +12 -3
  28. package/dist/Combobox/ComboboxItem.js.map +1 -1
  29. package/dist/ConfigProvider/ConfigProvider.cjs +7 -1
  30. package/dist/ConfigProvider/ConfigProvider.cjs.map +1 -1
  31. package/dist/ConfigProvider/ConfigProvider.js +7 -1
  32. package/dist/ConfigProvider/ConfigProvider.js.map +1 -1
  33. package/dist/ContextMenu/ContextMenuContent.cjs +4 -0
  34. package/dist/ContextMenu/ContextMenuContent.cjs.map +1 -1
  35. package/dist/ContextMenu/ContextMenuContent.js +4 -0
  36. package/dist/ContextMenu/ContextMenuContent.js.map +1 -1
  37. package/dist/ContextMenu/ContextMenuSubContent.cjs +4 -0
  38. package/dist/ContextMenu/ContextMenuSubContent.cjs.map +1 -1
  39. package/dist/ContextMenu/ContextMenuSubContent.js +4 -0
  40. package/dist/ContextMenu/ContextMenuSubContent.js.map +1 -1
  41. package/dist/DateField/DateFieldInput.cjs +3 -1
  42. package/dist/DateField/DateFieldInput.cjs.map +1 -1
  43. package/dist/DateField/DateFieldInput.js +3 -1
  44. package/dist/DateField/DateFieldInput.js.map +1 -1
  45. package/dist/DateField/DateFieldRoot.cjs +7 -1
  46. package/dist/DateField/DateFieldRoot.cjs.map +1 -1
  47. package/dist/DateField/DateFieldRoot.js +7 -1
  48. package/dist/DateField/DateFieldRoot.js.map +1 -1
  49. package/dist/DatePicker/DatePickerContent.cjs +8 -0
  50. package/dist/DatePicker/DatePickerContent.cjs.map +1 -1
  51. package/dist/DatePicker/DatePickerContent.js +8 -0
  52. package/dist/DatePicker/DatePickerContent.js.map +1 -1
  53. package/dist/DatePicker/DatePickerRoot.cjs +4 -0
  54. package/dist/DatePicker/DatePickerRoot.cjs.map +1 -1
  55. package/dist/DatePicker/DatePickerRoot.js +4 -0
  56. package/dist/DatePicker/DatePickerRoot.js.map +1 -1
  57. package/dist/DateRangePicker/DateRangePickerContent.cjs +8 -0
  58. package/dist/DateRangePicker/DateRangePickerContent.cjs.map +1 -1
  59. package/dist/DateRangePicker/DateRangePickerContent.js +8 -0
  60. package/dist/DateRangePicker/DateRangePickerContent.js.map +1 -1
  61. package/dist/Dialog/DialogContent.cjs +16 -10
  62. package/dist/Dialog/DialogContent.cjs.map +1 -1
  63. package/dist/Dialog/DialogContent.js +17 -11
  64. package/dist/Dialog/DialogContent.js.map +1 -1
  65. package/dist/Dialog/DialogContentImpl.cjs +8 -1
  66. package/dist/Dialog/DialogContentImpl.cjs.map +1 -1
  67. package/dist/Dialog/DialogContentImpl.js +8 -1
  68. package/dist/Dialog/DialogContentImpl.js.map +1 -1
  69. package/dist/Dialog/DialogContentModal.cjs +23 -5
  70. package/dist/Dialog/DialogContentModal.cjs.map +1 -1
  71. package/dist/Dialog/DialogContentModal.js +24 -6
  72. package/dist/Dialog/DialogContentModal.js.map +1 -1
  73. package/dist/Dialog/DialogContentNonModal.cjs +18 -2
  74. package/dist/Dialog/DialogContentNonModal.cjs.map +1 -1
  75. package/dist/Dialog/DialogContentNonModal.js +19 -3
  76. package/dist/Dialog/DialogContentNonModal.js.map +1 -1
  77. package/dist/Dialog/DialogOverlay.cjs +12 -6
  78. package/dist/Dialog/DialogOverlay.cjs.map +1 -1
  79. package/dist/Dialog/DialogOverlay.js +13 -7
  80. package/dist/Dialog/DialogOverlay.js.map +1 -1
  81. package/dist/Dialog/DialogOverlayImpl.cjs +8 -1
  82. package/dist/Dialog/DialogOverlayImpl.cjs.map +1 -1
  83. package/dist/Dialog/DialogOverlayImpl.js +9 -2
  84. package/dist/Dialog/DialogOverlayImpl.js.map +1 -1
  85. package/dist/Dialog/DialogRoot.cjs +7 -1
  86. package/dist/Dialog/DialogRoot.cjs.map +1 -1
  87. package/dist/Dialog/DialogRoot.js +7 -1
  88. package/dist/Dialog/DialogRoot.js.map +1 -1
  89. package/dist/DismissableLayer/DismissableLayer.cjs +27 -10
  90. package/dist/DismissableLayer/DismissableLayer.cjs.map +1 -1
  91. package/dist/DismissableLayer/DismissableLayer.js +28 -11
  92. package/dist/DismissableLayer/DismissableLayer.js.map +1 -1
  93. package/dist/Drawer/DrawerClose.cjs +48 -0
  94. package/dist/Drawer/DrawerClose.cjs.map +1 -0
  95. package/dist/Drawer/DrawerClose.js +42 -0
  96. package/dist/Drawer/DrawerClose.js.map +1 -0
  97. package/dist/Drawer/DrawerContent.cjs +139 -0
  98. package/dist/Drawer/DrawerContent.cjs.map +1 -0
  99. package/dist/Drawer/DrawerContent.js +133 -0
  100. package/dist/Drawer/DrawerContent.js.map +1 -0
  101. package/dist/Drawer/DrawerContentImpl.cjs +298 -0
  102. package/dist/Drawer/DrawerContentImpl.cjs.map +1 -0
  103. package/dist/Drawer/DrawerContentImpl.js +292 -0
  104. package/dist/Drawer/DrawerContentImpl.js.map +1 -0
  105. package/dist/Drawer/DrawerDescription.cjs +45 -0
  106. package/dist/Drawer/DrawerDescription.cjs.map +1 -0
  107. package/dist/Drawer/DrawerDescription.js +39 -0
  108. package/dist/Drawer/DrawerDescription.js.map +1 -0
  109. package/dist/Drawer/DrawerHandle.cjs +48 -0
  110. package/dist/Drawer/DrawerHandle.cjs.map +1 -0
  111. package/dist/Drawer/DrawerHandle.js +42 -0
  112. package/dist/Drawer/DrawerHandle.js.map +1 -0
  113. package/dist/Drawer/DrawerIndent.cjs +78 -0
  114. package/dist/Drawer/DrawerIndent.cjs.map +1 -0
  115. package/dist/Drawer/DrawerIndent.js +72 -0
  116. package/dist/Drawer/DrawerIndent.js.map +1 -0
  117. package/dist/Drawer/DrawerIndentBackground.cjs +49 -0
  118. package/dist/Drawer/DrawerIndentBackground.cjs.map +1 -0
  119. package/dist/Drawer/DrawerIndentBackground.js +43 -0
  120. package/dist/Drawer/DrawerIndentBackground.js.map +1 -0
  121. package/dist/Drawer/DrawerOverlay.cjs +66 -0
  122. package/dist/Drawer/DrawerOverlay.cjs.map +1 -0
  123. package/dist/Drawer/DrawerOverlay.js +60 -0
  124. package/dist/Drawer/DrawerOverlay.js.map +1 -0
  125. package/dist/Drawer/DrawerOverlayImpl.cjs +69 -0
  126. package/dist/Drawer/DrawerOverlayImpl.cjs.map +1 -0
  127. package/dist/Drawer/DrawerOverlayImpl.js +63 -0
  128. package/dist/Drawer/DrawerOverlayImpl.js.map +1 -0
  129. package/dist/Drawer/DrawerPortal.cjs +47 -0
  130. package/dist/Drawer/DrawerPortal.cjs.map +1 -0
  131. package/dist/Drawer/DrawerPortal.js +41 -0
  132. package/dist/Drawer/DrawerPortal.js.map +1 -0
  133. package/dist/Drawer/DrawerProvider.cjs +80 -0
  134. package/dist/Drawer/DrawerProvider.cjs.map +1 -0
  135. package/dist/Drawer/DrawerProvider.js +68 -0
  136. package/dist/Drawer/DrawerProvider.js.map +1 -0
  137. package/dist/Drawer/DrawerRoot.cjs +197 -0
  138. package/dist/Drawer/DrawerRoot.cjs.map +1 -0
  139. package/dist/Drawer/DrawerRoot.js +185 -0
  140. package/dist/Drawer/DrawerRoot.js.map +1 -0
  141. package/dist/Drawer/DrawerSwipeArea.cjs +87 -0
  142. package/dist/Drawer/DrawerSwipeArea.cjs.map +1 -0
  143. package/dist/Drawer/DrawerSwipeArea.js +81 -0
  144. package/dist/Drawer/DrawerSwipeArea.js.map +1 -0
  145. package/dist/Drawer/DrawerTitle.cjs +45 -0
  146. package/dist/Drawer/DrawerTitle.cjs.map +1 -0
  147. package/dist/Drawer/DrawerTitle.js +39 -0
  148. package/dist/Drawer/DrawerTitle.js.map +1 -0
  149. package/dist/Drawer/DrawerTrigger.cjs +64 -0
  150. package/dist/Drawer/DrawerTrigger.cjs.map +1 -0
  151. package/dist/Drawer/DrawerTrigger.js +58 -0
  152. package/dist/Drawer/DrawerTrigger.js.map +1 -0
  153. package/dist/Drawer/DrawerViewport.cjs +49 -0
  154. package/dist/Drawer/DrawerViewport.cjs.map +1 -0
  155. package/dist/Drawer/DrawerViewport.js +43 -0
  156. package/dist/Drawer/DrawerViewport.js.map +1 -0
  157. package/dist/Drawer/utils.cjs +185 -0
  158. package/dist/Drawer/utils.cjs.map +1 -0
  159. package/dist/Drawer/utils.js +149 -0
  160. package/dist/Drawer/utils.js.map +1 -0
  161. package/dist/DropdownMenu/DropdownMenuContent.cjs +4 -0
  162. package/dist/DropdownMenu/DropdownMenuContent.cjs.map +1 -1
  163. package/dist/DropdownMenu/DropdownMenuContent.js +4 -0
  164. package/dist/DropdownMenu/DropdownMenuContent.js.map +1 -1
  165. package/dist/DropdownMenu/DropdownMenuSubContent.cjs +4 -0
  166. package/dist/DropdownMenu/DropdownMenuSubContent.cjs.map +1 -1
  167. package/dist/DropdownMenu/DropdownMenuSubContent.js +4 -0
  168. package/dist/DropdownMenu/DropdownMenuSubContent.js.map +1 -1
  169. package/dist/FocusScope/FocusScope.cjs +31 -11
  170. package/dist/FocusScope/FocusScope.cjs.map +1 -1
  171. package/dist/FocusScope/FocusScope.js +32 -12
  172. package/dist/FocusScope/FocusScope.js.map +1 -1
  173. package/dist/HoverCard/HoverCardContent.cjs +8 -0
  174. package/dist/HoverCard/HoverCardContent.cjs.map +1 -1
  175. package/dist/HoverCard/HoverCardContent.js +8 -0
  176. package/dist/HoverCard/HoverCardContent.js.map +1 -1
  177. package/dist/HoverCard/HoverCardContentImpl.cjs +8 -0
  178. package/dist/HoverCard/HoverCardContentImpl.cjs.map +1 -1
  179. package/dist/HoverCard/HoverCardContentImpl.js +8 -0
  180. package/dist/HoverCard/HoverCardContentImpl.js.map +1 -1
  181. package/dist/HoverCard/HoverCardRoot.cjs +9 -2
  182. package/dist/HoverCard/HoverCardRoot.cjs.map +1 -1
  183. package/dist/HoverCard/HoverCardRoot.js +9 -2
  184. package/dist/HoverCard/HoverCardRoot.js.map +1 -1
  185. package/dist/HoverCard/HoverCardTrigger.cjs +6 -0
  186. package/dist/HoverCard/HoverCardTrigger.cjs.map +1 -1
  187. package/dist/HoverCard/HoverCardTrigger.js +6 -0
  188. package/dist/HoverCard/HoverCardTrigger.js.map +1 -1
  189. package/dist/Listbox/ListboxRoot.cjs +4 -1
  190. package/dist/Listbox/ListboxRoot.cjs.map +1 -1
  191. package/dist/Listbox/ListboxRoot.js +4 -1
  192. package/dist/Listbox/ListboxRoot.js.map +1 -1
  193. package/dist/Listbox/ListboxVirtualizer.cjs +7 -3
  194. package/dist/Listbox/ListboxVirtualizer.cjs.map +1 -1
  195. package/dist/Listbox/ListboxVirtualizer.js +7 -3
  196. package/dist/Listbox/ListboxVirtualizer.js.map +1 -1
  197. package/dist/Menu/MenuContent.cjs +4 -0
  198. package/dist/Menu/MenuContent.cjs.map +1 -1
  199. package/dist/Menu/MenuContent.js +4 -0
  200. package/dist/Menu/MenuContent.js.map +1 -1
  201. package/dist/Menu/MenuContentImpl.cjs +4 -0
  202. package/dist/Menu/MenuContentImpl.cjs.map +1 -1
  203. package/dist/Menu/MenuContentImpl.js +4 -0
  204. package/dist/Menu/MenuContentImpl.js.map +1 -1
  205. package/dist/Menu/MenuRootContentModal.cjs +4 -0
  206. package/dist/Menu/MenuRootContentModal.cjs.map +1 -1
  207. package/dist/Menu/MenuRootContentModal.js +4 -0
  208. package/dist/Menu/MenuRootContentModal.js.map +1 -1
  209. package/dist/Menu/MenuRootContentNonModal.cjs +4 -0
  210. package/dist/Menu/MenuRootContentNonModal.cjs.map +1 -1
  211. package/dist/Menu/MenuRootContentNonModal.js +4 -0
  212. package/dist/Menu/MenuRootContentNonModal.js.map +1 -1
  213. package/dist/Menu/MenuSubContent.cjs +4 -0
  214. package/dist/Menu/MenuSubContent.cjs.map +1 -1
  215. package/dist/Menu/MenuSubContent.js +4 -0
  216. package/dist/Menu/MenuSubContent.js.map +1 -1
  217. package/dist/Menubar/MenubarContent.cjs +4 -0
  218. package/dist/Menubar/MenubarContent.cjs.map +1 -1
  219. package/dist/Menubar/MenubarContent.js +4 -0
  220. package/dist/Menubar/MenubarContent.js.map +1 -1
  221. package/dist/Menubar/MenubarSubContent.cjs +4 -0
  222. package/dist/Menubar/MenubarSubContent.cjs.map +1 -1
  223. package/dist/Menubar/MenubarSubContent.js +4 -0
  224. package/dist/Menubar/MenubarSubContent.js.map +1 -1
  225. package/dist/Popover/PopoverContent.cjs +8 -0
  226. package/dist/Popover/PopoverContent.cjs.map +1 -1
  227. package/dist/Popover/PopoverContent.js +8 -0
  228. package/dist/Popover/PopoverContent.js.map +1 -1
  229. package/dist/Popover/PopoverContentImpl.cjs +8 -0
  230. package/dist/Popover/PopoverContentImpl.cjs.map +1 -1
  231. package/dist/Popover/PopoverContentImpl.js +8 -0
  232. package/dist/Popover/PopoverContentImpl.js.map +1 -1
  233. package/dist/Popover/PopoverContentModal.cjs +8 -0
  234. package/dist/Popover/PopoverContentModal.cjs.map +1 -1
  235. package/dist/Popover/PopoverContentModal.js +8 -0
  236. package/dist/Popover/PopoverContentModal.js.map +1 -1
  237. package/dist/Popover/PopoverContentNonModal.cjs +8 -0
  238. package/dist/Popover/PopoverContentNonModal.cjs.map +1 -1
  239. package/dist/Popover/PopoverContentNonModal.js +8 -0
  240. package/dist/Popover/PopoverContentNonModal.js.map +1 -1
  241. package/dist/Popper/PopperContent.cjs +49 -6
  242. package/dist/Popper/PopperContent.cjs.map +1 -1
  243. package/dist/Popper/PopperContent.js +50 -7
  244. package/dist/Popper/PopperContent.js.map +1 -1
  245. package/dist/Popper/utils.cjs +10 -5
  246. package/dist/Popper/utils.cjs.map +1 -1
  247. package/dist/Popper/utils.js +10 -5
  248. package/dist/Popper/utils.js.map +1 -1
  249. package/dist/RadioGroup/Radio.cjs +27 -22
  250. package/dist/RadioGroup/Radio.cjs.map +1 -1
  251. package/dist/RadioGroup/Radio.js +28 -23
  252. package/dist/RadioGroup/Radio.js.map +1 -1
  253. package/dist/Rating/RatingItem.cjs +66 -0
  254. package/dist/Rating/RatingItem.cjs.map +1 -0
  255. package/dist/Rating/RatingItem.js +54 -0
  256. package/dist/Rating/RatingItem.js.map +1 -0
  257. package/dist/Rating/RatingItemIndicator.cjs +89 -0
  258. package/dist/Rating/RatingItemIndicator.cjs.map +1 -0
  259. package/dist/Rating/RatingItemIndicator.js +83 -0
  260. package/dist/Rating/RatingItemIndicator.js.map +1 -0
  261. package/dist/Rating/RatingRoot.cjs +136 -0
  262. package/dist/Rating/RatingRoot.cjs.map +1 -0
  263. package/dist/Rating/RatingRoot.js +124 -0
  264. package/dist/Rating/RatingRoot.js.map +1 -0
  265. package/dist/RovingFocus/RovingFocusItem.cjs +5 -0
  266. package/dist/RovingFocus/RovingFocusItem.cjs.map +1 -1
  267. package/dist/RovingFocus/RovingFocusItem.js +6 -1
  268. package/dist/RovingFocus/RovingFocusItem.js.map +1 -1
  269. package/dist/Select/SelectContent.cjs +8 -0
  270. package/dist/Select/SelectContent.cjs.map +1 -1
  271. package/dist/Select/SelectContent.js +8 -0
  272. package/dist/Select/SelectContent.js.map +1 -1
  273. package/dist/Select/SelectContentImpl.cjs +8 -0
  274. package/dist/Select/SelectContentImpl.cjs.map +1 -1
  275. package/dist/Select/SelectContentImpl.js +8 -0
  276. package/dist/Select/SelectContentImpl.js.map +1 -1
  277. package/dist/Select/SelectPopperPosition.cjs +8 -0
  278. package/dist/Select/SelectPopperPosition.cjs.map +1 -1
  279. package/dist/Select/SelectPopperPosition.js +8 -0
  280. package/dist/Select/SelectPopperPosition.js.map +1 -1
  281. package/dist/Select/SelectRoot.cjs +10 -5
  282. package/dist/Select/SelectRoot.cjs.map +1 -1
  283. package/dist/Select/SelectRoot.js +10 -5
  284. package/dist/Select/SelectRoot.js.map +1 -1
  285. package/dist/Select/SelectTrigger.cjs +25 -14
  286. package/dist/Select/SelectTrigger.cjs.map +1 -1
  287. package/dist/Select/SelectTrigger.js +25 -14
  288. package/dist/Select/SelectTrigger.js.map +1 -1
  289. package/dist/Switch/SwitchRoot.cjs +25 -18
  290. package/dist/Switch/SwitchRoot.cjs.map +1 -1
  291. package/dist/Switch/SwitchRoot.js +26 -19
  292. package/dist/Switch/SwitchRoot.js.map +1 -1
  293. package/dist/Tabs/TabsIndicator.cjs +4 -0
  294. package/dist/Tabs/TabsIndicator.cjs.map +1 -1
  295. package/dist/Tabs/TabsIndicator.js +4 -0
  296. package/dist/Tabs/TabsIndicator.js.map +1 -1
  297. package/dist/Teleport/Teleport.cjs +6 -3
  298. package/dist/Teleport/Teleport.cjs.map +1 -1
  299. package/dist/Teleport/Teleport.js +7 -4
  300. package/dist/Teleport/Teleport.js.map +1 -1
  301. package/dist/Toggle/Toggle.cjs +21 -16
  302. package/dist/Toggle/Toggle.cjs.map +1 -1
  303. package/dist/Toggle/Toggle.js +22 -17
  304. package/dist/Toggle/Toggle.js.map +1 -1
  305. package/dist/Toolbar/ToolbarToggleItem.cjs +5 -2
  306. package/dist/Toolbar/ToolbarToggleItem.cjs.map +1 -1
  307. package/dist/Toolbar/ToolbarToggleItem.js +5 -2
  308. package/dist/Toolbar/ToolbarToggleItem.js.map +1 -1
  309. package/dist/Tree/TreeItem.cjs +18 -2
  310. package/dist/Tree/TreeItem.cjs.map +1 -1
  311. package/dist/Tree/TreeItem.js +18 -2
  312. package/dist/Tree/TreeItem.js.map +1 -1
  313. package/dist/Tree/TreeVirtualizer.cjs +2 -1
  314. package/dist/Tree/TreeVirtualizer.cjs.map +1 -1
  315. package/dist/Tree/TreeVirtualizer.js +2 -1
  316. package/dist/Tree/TreeVirtualizer.js.map +1 -1
  317. package/dist/VisuallyHidden/VisuallyHidden.cjs +1 -1
  318. package/dist/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  319. package/dist/VisuallyHidden/VisuallyHidden.js +1 -1
  320. package/dist/VisuallyHidden/VisuallyHidden.js.map +1 -1
  321. package/dist/composables/useDrawerSnapPoints.cjs +130 -0
  322. package/dist/composables/useDrawerSnapPoints.cjs.map +1 -0
  323. package/dist/composables/useDrawerSnapPoints.js +124 -0
  324. package/dist/composables/useDrawerSnapPoints.js.map +1 -0
  325. package/dist/composables/useSwipeDismiss.cjs +397 -0
  326. package/dist/composables/useSwipeDismiss.cjs.map +1 -0
  327. package/dist/composables/useSwipeDismiss.js +391 -0
  328. package/dist/composables/useSwipeDismiss.js.map +1 -0
  329. package/dist/constant/components.cjs +20 -0
  330. package/dist/constant/components.cjs.map +1 -1
  331. package/dist/constant/components.js +20 -0
  332. package/dist/constant/components.js.map +1 -1
  333. package/dist/constant.d.cts +2 -0
  334. package/dist/constant.d.cts.map +1 -1
  335. package/dist/constant.d.ts +2 -0
  336. package/dist/constant.d.ts.map +1 -1
  337. package/dist/date/utils.cjs +1 -1
  338. package/dist/date/utils.cjs.map +1 -1
  339. package/dist/date/utils.js +1 -1
  340. package/dist/date/utils.js.map +1 -1
  341. package/dist/index.cjs +45 -1
  342. package/dist/index.d.cts +2 -2
  343. package/dist/index.d.ts +2 -2
  344. package/dist/index.js +24 -2
  345. package/dist/index2.d.cts.map +1 -1
  346. package/dist/index3.d.cts +68 -29
  347. package/dist/index3.d.cts.map +1 -1
  348. package/dist/index3.d.ts +68 -29
  349. package/dist/index3.d.ts.map +1 -1
  350. package/dist/index4.d.cts +1648 -1190
  351. package/dist/index4.d.cts.map +1 -1
  352. package/dist/index4.d.ts +1660 -1202
  353. package/dist/index4.d.ts.map +1 -1
  354. package/dist/internal.cjs +1 -1
  355. package/dist/internal.d.cts +3 -3
  356. package/dist/internal.d.ts +3 -3
  357. package/dist/internal.js +1 -1
  358. package/dist/namespaced/index.cjs +22 -0
  359. package/dist/namespaced/index.d.cts +22 -2
  360. package/dist/namespaced/index.d.mts +22 -2
  361. package/dist/namespaced/index.mjs +22 -2
  362. package/dist/nuxt/index.d.cts +2 -1
  363. package/dist/nuxt/index.d.mts +2 -1
  364. package/dist/resolver/index.d.cts +2 -1
  365. package/dist/resolver/index.d.mts +2 -1
  366. package/dist/shared/useEmitAsProps.cjs +5 -0
  367. package/dist/shared/useEmitAsProps.cjs.map +1 -1
  368. package/dist/shared/useEmitAsProps.js +5 -0
  369. package/dist/shared/useEmitAsProps.js.map +1 -1
  370. package/dist/shared/useForwardPropsEmits.cjs +0 -12
  371. package/dist/shared/useForwardPropsEmits.cjs.map +1 -1
  372. package/dist/shared/useForwardPropsEmits.js +0 -12
  373. package/dist/shared/useForwardPropsEmits.js.map +1 -1
  374. package/dist/shared/useForwardScopeId.cjs +34 -0
  375. package/dist/shared/useForwardScopeId.cjs.map +1 -0
  376. package/dist/shared/useForwardScopeId.js +28 -0
  377. package/dist/shared/useForwardScopeId.js.map +1 -0
  378. package/dist/shared/useId.cjs +7 -8
  379. package/dist/shared/useId.cjs.map +1 -1
  380. package/dist/shared/useId.js +7 -8
  381. package/dist/shared/useId.js.map +1 -1
  382. package/dist/shared/useSize.cjs +6 -2
  383. package/dist/shared/useSize.cjs.map +1 -1
  384. package/dist/shared/useSize.js +7 -3
  385. package/dist/shared/useSize.js.map +1 -1
  386. package/dist/shared.cjs +2 -2
  387. package/dist/shared.d.cts +2 -2
  388. package/dist/shared.d.ts +2 -2
  389. package/dist/shared.js +2 -2
  390. package/dist/utils/style.cjs +1 -1
  391. package/dist/utils/style.cjs.map +1 -1
  392. package/dist/utils/style.js +1 -1
  393. package/dist/utils/style.js.map +1 -1
  394. package/package.json +7 -5
  395. package/src/AlertDialog/AlertDialogContent.vue +6 -1
  396. package/src/Checkbox/CheckboxRoot.vue +28 -16
  397. package/src/Collection/Collection.ts +2 -1
  398. package/src/Combobox/ComboboxContentImpl.vue +20 -4
  399. package/src/Combobox/ComboboxItem.vue +1 -0
  400. package/src/ConfigProvider/ConfigProvider.vue +11 -1
  401. package/src/DateField/DateFieldInput.vue +6 -1
  402. package/src/DateField/DateFieldRoot.vue +6 -1
  403. package/src/Dialog/DialogContent.vue +16 -2
  404. package/src/Dialog/DialogContentImpl.vue +9 -2
  405. package/src/Dialog/DialogContentModal.vue +23 -4
  406. package/src/Dialog/DialogContentNonModal.vue +21 -3
  407. package/src/Dialog/DialogOverlay.vue +4 -0
  408. package/src/Dialog/DialogOverlayImpl.vue +7 -2
  409. package/src/Dialog/DialogRoot.vue +10 -1
  410. package/src/DismissableLayer/DismissableLayer.vue +75 -23
  411. package/src/Drawer/DrawerClose.vue +25 -0
  412. package/src/Drawer/DrawerContent.vue +98 -0
  413. package/src/Drawer/DrawerContentImpl.vue +386 -0
  414. package/src/Drawer/DrawerDescription.vue +24 -0
  415. package/src/Drawer/DrawerHandle.vue +25 -0
  416. package/src/Drawer/DrawerIndent.vue +61 -0
  417. package/src/Drawer/DrawerIndentBackground.vue +26 -0
  418. package/src/Drawer/DrawerOverlay.vue +42 -0
  419. package/src/Drawer/DrawerOverlayImpl.vue +54 -0
  420. package/src/Drawer/DrawerPortal.vue +17 -0
  421. package/src/Drawer/DrawerProvider.vue +87 -0
  422. package/src/Drawer/DrawerRoot.vue +244 -0
  423. package/src/Drawer/DrawerSwipeArea.vue +73 -0
  424. package/src/Drawer/DrawerTitle.vue +24 -0
  425. package/src/Drawer/DrawerTrigger.vue +44 -0
  426. package/src/Drawer/DrawerViewport.vue +34 -0
  427. package/src/Drawer/composables/useDrawerSnapPoints.ts +200 -0
  428. package/src/Drawer/composables/useSwipeDismiss.ts +557 -0
  429. package/src/Drawer/index.ts +74 -0
  430. package/src/Drawer/utils.ts +205 -0
  431. package/src/FocusScope/FocusScope.vue +76 -19
  432. package/src/HoverCard/HoverCardRoot.vue +7 -1
  433. package/src/HoverCard/HoverCardTrigger.vue +11 -0
  434. package/src/Listbox/ListboxRoot.vue +7 -4
  435. package/src/Listbox/ListboxVirtualizer.vue +19 -3
  436. package/src/Popper/PopperContent.vue +45 -4
  437. package/src/Popper/utils.ts +17 -7
  438. package/src/RadioGroup/Radio.vue +22 -14
  439. package/src/Rating/RatingItem.vue +1 -0
  440. package/src/Rating/RatingItemIndicator.vue +3 -2
  441. package/src/Rating/RatingRoot.vue +6 -3
  442. package/src/Rating/index.ts +3 -3
  443. package/src/RovingFocus/RovingFocusItem.vue +12 -1
  444. package/src/Select/SelectRoot.vue +4 -1
  445. package/src/Select/SelectTrigger.vue +49 -33
  446. package/src/Splitter/utils/style.ts +1 -1
  447. package/src/Switch/SwitchRoot.vue +20 -12
  448. package/src/Tabs/TabsIndicator.vue +5 -0
  449. package/src/Teleport/Teleport.vue +8 -4
  450. package/src/Toggle/Toggle.vue +18 -9
  451. package/src/Toolbar/ToolbarToggleItem.vue +4 -1
  452. package/src/Tree/TreeItem.vue +18 -0
  453. package/src/Tree/TreeRoot.vue +2 -2
  454. package/src/Tree/TreeVirtualizer.vue +3 -1
  455. package/src/VisuallyHidden/VisuallyHidden.vue +1 -1
  456. package/src/index.ts +2 -0
  457. package/src/shared/date/utils.ts +1 -1
  458. package/src/shared/index.ts +2 -2
  459. package/src/shared/useEmitAsProps.test-d.ts +77 -0
  460. package/src/shared/useEmitAsProps.ts +83 -4
  461. package/src/shared/useForwardProps.ts +1 -1
  462. package/src/shared/useForwardPropsEmits.ts +17 -2
  463. package/src/shared/useForwardScopeId.ts +26 -0
  464. package/src/shared/useId.ts +14 -6
  465. package/src/shared/useSize.ts +9 -4
  466. package/dist/shared/trap-focus.cjs +0 -35
  467. package/dist/shared/trap-focus.cjs.map +0 -1
  468. package/dist/shared/trap-focus.js +0 -30
  469. package/dist/shared/trap-focus.js.map +0 -1
  470. package/src/shared/trap-focus.ts +0 -43
@@ -0,0 +1,386 @@
1
+ <script lang="ts">
2
+ import type {
3
+ DismissableLayerEmits,
4
+ DismissableLayerProps,
5
+ } from '@/DismissableLayer'
6
+
7
+ export type DrawerContentImplEmits = DismissableLayerEmits & {
8
+ openAutoFocus: [event: Event]
9
+ closeAutoFocus: [event: Event]
10
+ }
11
+
12
+ export interface DrawerContentImplProps extends DismissableLayerProps {
13
+ trapFocus?: boolean
14
+ /**
15
+ * Initial focus target when the drawer opens.
16
+ * - `true` / default: focus the first focusable element inside
17
+ * - `false`: do not focus anything
18
+ * - element ref: focus that specific element
19
+ */
20
+ initialFocus?: boolean | HTMLElement | null
21
+ /**
22
+ * Final focus target when the drawer closes.
23
+ * - `true` / default: focus the trigger
24
+ * - `false`: do not restore focus
25
+ * - element ref: focus that specific element
26
+ */
27
+ finalFocus?: boolean | HTMLElement | null
28
+ }
29
+ </script>
30
+
31
+ <script setup lang="ts">
32
+ import type { SwipeDirection } from './utils'
33
+ import { useResizeObserver } from '@vueuse/core'
34
+ import { computed, onMounted, onUnmounted, watch } from 'vue'
35
+ import { DismissableLayer } from '@/DismissableLayer'
36
+ import { FocusScope } from '@/FocusScope'
37
+ import { useForwardExpose } from '@/shared'
38
+ import { useDrawerSnapPoints } from './composables/useDrawerSnapPoints'
39
+ import { useSwipeDismiss } from './composables/useSwipeDismiss'
40
+ import { injectDrawerRootContext } from './DrawerRoot.vue'
41
+ import { computeSwipeReleaseScalar, DRAWER_CSS_VARS, getDisplacement, registerDrawerCssProperties } from './utils'
42
+
43
+ const props = defineProps<DrawerContentImplProps>()
44
+ const emits = defineEmits<DrawerContentImplEmits>()
45
+
46
+ const rootContext = injectDrawerRootContext()
47
+ const { forwardRef, currentElement } = useForwardExpose()
48
+
49
+ registerDrawerCssProperties()
50
+
51
+ // Snap points
52
+ const { activeSnapPointOffset, snapToNearest } = useDrawerSnapPoints({
53
+ snapPoints: rootContext.snapPoints,
54
+ activeSnapPoint: rootContext.activeSnapPoint,
55
+ popupHeight: rootContext.popupHeight,
56
+ viewportRef: currentElement,
57
+ onSnapPointChange: (point) => {
58
+ if (point === null)
59
+ rootContext.onOpenChange(false)
60
+ else
61
+ rootContext.setActiveSnapPoint(point)
62
+ },
63
+ })
64
+
65
+ // Write the active snap offset to the popup's inline style. Called both via a
66
+ // watcher (for live updates as the snap point or popup height changes) and
67
+ // explicitly from onMounted (to set the initial value — a lazy watcher would
68
+ // only fire on CHANGE, which may never happen on a reopen where popupHeight
69
+ // is already measured from a previous open and activeSnapPoint is unchanged).
70
+ //
71
+ // BaseUI parity: snap points are applied purely via a translate using
72
+ // --drawer-snap-point-offset. The popup's height is independent (consumers
73
+ // should set max-height: 100dvh or similar and let the transform slide the
74
+ // popup visually).
75
+ function writeSnapPointOffset() {
76
+ const el = currentElement.value
77
+ if (!el)
78
+ return
79
+ const offset = activeSnapPointOffset.value
80
+ if (offset != null) {
81
+ const dir = rootContext.swipeDirection.value
82
+ const signedOffset = (dir === 'up' || dir === 'left') ? -offset : offset
83
+ el.style.setProperty(DRAWER_CSS_VARS.snapPointOffset, `${signedOffset}px`)
84
+ }
85
+ else {
86
+ el.style.setProperty(DRAWER_CSS_VARS.snapPointOffset, '0px')
87
+ }
88
+ }
89
+
90
+ watch(activeSnapPointOffset, writeSnapPointOffset)
91
+
92
+ // Measure popup height via ResizeObserver. BaseUI parity: skip writes while a
93
+ // nested drawer is open and we already have a measured height, to keep the
94
+ // parent's snap-point geometry stable while the child drawer animates.
95
+ useResizeObserver(currentElement, ([entry]) => {
96
+ if (!entry)
97
+ return
98
+ if (rootContext.hasNestedDrawer.value && rootContext.popupHeight.value > 0)
99
+ return
100
+ const h = entry.contentRect.height
101
+ rootContext.onPopupHeightChange(h)
102
+ currentElement.value?.style.setProperty(DRAWER_CSS_VARS.height, `${h}px`)
103
+ })
104
+
105
+ // Watch frontmostHeight -> set CSS var
106
+ watch(() => rootContext.frontmostHeight.value, (h) => {
107
+ currentElement.value?.style.setProperty(DRAWER_CSS_VARS.frontmostHeight, `${h}px`)
108
+ })
109
+
110
+ // Swipe directions: when snap points exist, allow both dismiss AND expand directions
111
+ const hasSnapPoints = computed(() => (rootContext.snapPoints.value?.length ?? 0) > 0)
112
+ const swipeDirections = computed<SwipeDirection[]>(() => {
113
+ const dismiss = rootContext.swipeDirection.value
114
+ if (!hasSnapPoints.value)
115
+ return [dismiss]
116
+ // Allow swiping in both directions for snap point navigation
117
+ const opposite: Record<string, SwipeDirection> = { up: 'down', down: 'up', left: 'right', right: 'left' }
118
+ return [dismiss, opposite[dismiss]]
119
+ })
120
+
121
+ // Track the latest raw signed delta for snap release (BaseUI parity: the
122
+ // release math needs the delta as of the last move, not the accumulated
123
+ // CSS offset).
124
+ let lastRawDelta = { x: 0, y: 0 }
125
+
126
+ // Swipe dismiss
127
+ const { isSwiping, dragOffset } = useSwipeDismiss({
128
+ enabled: computed(() => rootContext.open.value),
129
+ elementRef: currentElement,
130
+ directions: swipeDirections,
131
+ movementCssVars: {
132
+ x: DRAWER_CSS_VARS.swipeMovementX,
133
+ y: DRAWER_CSS_VARS.swipeMovementY,
134
+ },
135
+ canStart: () => !rootContext.nestedSwiping.value,
136
+ onDismiss() {
137
+ if (!hasSnapPoints.value) {
138
+ rootContext.onOpenChange(false, 'swipe')
139
+ }
140
+ // With snap points, onRelease handles snapping
141
+ },
142
+ onRelease(velocity) {
143
+ // Write the `--drawer-swipe-strength` CSS var so consumer transitions can
144
+ // scale their duration with release velocity. Ported from BaseUI
145
+ // `DrawerViewport.tsx:resolveSwipeRelease`.
146
+ const el = currentElement.value
147
+ if (el) {
148
+ const dir = rootContext.swipeDirection.value
149
+ const size = (dir === 'left' || dir === 'right') ? el.offsetWidth : el.offsetHeight
150
+ const axisDelta = (dir === 'left' || dir === 'right') ? lastRawDelta.x : lastRawDelta.y
151
+ const releaseVelocity = (dir === 'left' || dir === 'right') ? velocity.x : velocity.y
152
+ const scalar = computeSwipeReleaseScalar({
153
+ direction: dir,
154
+ size,
155
+ axisDelta,
156
+ snapPointOffset: activeSnapPointOffset.value ?? 0,
157
+ releaseVelocity,
158
+ })
159
+ if (scalar != null)
160
+ el.style.setProperty(DRAWER_CSS_VARS.swipeStrength, `${scalar}`)
161
+ else
162
+ el.style.setProperty(DRAWER_CSS_VARS.swipeStrength, '1')
163
+ }
164
+
165
+ if (hasSnapPoints.value) {
166
+ // Convert the latest signed delta to a dismiss-direction-positive scalar
167
+ // (BaseUI: `dragDelta = direction==='down' ? deltaY : direction==='up' ? -deltaY : ...`).
168
+ // getDisplacement handles the sign flip per direction.
169
+ const dir = rootContext.swipeDirection.value
170
+ const dragDelta = getDisplacement(dir, lastRawDelta.x, lastRawDelta.y)
171
+ snapToNearest(dragDelta, velocity, dir, rootContext.snapToSequentialPoints.value)
172
+
173
+ // Sequencing matters for smooth drag-to-next-snap animation.
174
+ //
175
+ // After snapToNearest, activeSnapPoint has updated synchronously (Vue
176
+ // refs are synchronous) but the `watch(activeSnapPointOffset, ...)`
177
+ // runs on the next microtask. If we cleared --drawer-swipe-movement-y
178
+ // first, the transform would visually jump from the drag position
179
+ // (e.g. translateY(50)) back to the OLD snap offset (translateY(400))
180
+ // for a single frame, then the watch would fire and CSS would
181
+ // transition from 400 down to the new snap offset (translateY(0)) —
182
+ // the user sees a snap-back-then-animate instead of a continuous
183
+ // motion from their finger to the new snap.
184
+ //
185
+ // Fix: write the new snap offset CSS var synchronously FIRST (via
186
+ // writeSnapPointOffset, which reads activeSnapPointOffset.value — the
187
+ // computed recalculates on access), then clear the movement vars.
188
+ // Both writes happen in the same animation frame, and the CSS
189
+ // transition on `transform` smoothly interpolates from the current
190
+ // rendered transform (drag position) to the new snap target.
191
+ if (el) {
192
+ writeSnapPointOffset()
193
+ el.style.setProperty(DRAWER_CSS_VARS.swipeMovementX, '0px')
194
+ el.style.setProperty(DRAWER_CSS_VARS.swipeMovementY, '0px')
195
+ }
196
+ }
197
+
198
+ // For snap-point drawers, this callback fully decides the open/close +
199
+ // transform outcome above, so tell finishSwipe to skip its own
200
+ // dismiss-vs-cancel branch.
201
+ return hasSnapPoints.value
202
+ },
203
+ onSwipingChange(swiping) {
204
+ rootContext.onSwipingChange(swiping)
205
+ rootContext.onNestedSwipingChange(swiping)
206
+ },
207
+ onProgress(progress, details) {
208
+ if (details) {
209
+ lastRawDelta = { x: details.deltaX, y: details.deltaY }
210
+ }
211
+ rootContext.onNestedSwipeProgressChange(progress)
212
+ },
213
+ })
214
+
215
+ // Track the source of the next dismiss so we can attach a reason.
216
+ // DismissableLayer fires `escape-key-down` / `pointer-down-outside` / `focus-outside`
217
+ // before it fires `dismiss`, so we capture the reason in those handlers and read
218
+ // it here.
219
+ let pendingDismissReason: 'escape-key' | 'outside-press' | undefined
220
+
221
+ function onDismiss() {
222
+ if (isSwiping.value)
223
+ return
224
+ rootContext.onOpenChange(false, pendingDismissReason ?? 'outside-press')
225
+ pendingDismissReason = undefined
226
+ }
227
+
228
+ function onEscapeKeyDown(event: KeyboardEvent) {
229
+ pendingDismissReason = 'escape-key'
230
+ emits('escapeKeyDown', event)
231
+ }
232
+
233
+ function onPointerDownOutside(event: any) {
234
+ if (isSwiping.value) {
235
+ event.preventDefault()
236
+ return
237
+ }
238
+ pendingDismissReason = 'outside-press'
239
+ emits('pointerDownOutside', event)
240
+ }
241
+
242
+ function onFocusOutside(event: any) {
243
+ if (isSwiping.value) {
244
+ event.preventDefault()
245
+ return
246
+ }
247
+ emits('focusOutside', event)
248
+ }
249
+
250
+ function onInteractOutside(event: any) {
251
+ if (isSwiping.value) {
252
+ event.preventDefault()
253
+ return
254
+ }
255
+ emits('interactOutside', event)
256
+ }
257
+
258
+ // --- update:openComplete wiring ---
259
+ // Fire `update:openComplete` on the popup's own transitionend/animationend,
260
+ // not on a microtask — consumers rely on this marker to know the enter/exit
261
+ // transition has actually finished. We track the current listener so a rapid
262
+ // open→close doesn't leak or double-fire, and guard with `event.target === el`
263
+ // so child element transitions don't spuriously resolve the drawer lifecycle.
264
+ let openCompleteCleanup: (() => void) | undefined
265
+
266
+ function clearOpenCompleteListener() {
267
+ openCompleteCleanup?.()
268
+ openCompleteCleanup = undefined
269
+ }
270
+
271
+ watch(() => rootContext.open.value, (isOpen) => {
272
+ clearOpenCompleteListener()
273
+ const el = currentElement.value
274
+ if (!el) {
275
+ // If there's no element (e.g. closed without ever mounting), fire
276
+ // synchronously so consumers still get the contract.
277
+ rootContext.notifyOpenComplete(isOpen)
278
+ return
279
+ }
280
+ const handler = (event: Event) => {
281
+ if (event.target !== el)
282
+ return
283
+ clearOpenCompleteListener()
284
+ rootContext.notifyOpenComplete(isOpen)
285
+ }
286
+ el.addEventListener('transitionend', handler)
287
+ el.addEventListener('animationend', handler)
288
+ openCompleteCleanup = () => {
289
+ el.removeEventListener('transitionend', handler)
290
+ el.removeEventListener('animationend', handler)
291
+ }
292
+ })
293
+
294
+ // Data attributes
295
+ const dataAttributes = computed(() => {
296
+ const attrs: Record<string, string | undefined> = {
297
+ 'data-state': rootContext.open.value ? 'open' : 'closed',
298
+ 'data-swipe-direction': rootContext.swipeDirection.value,
299
+ }
300
+ if (isSwiping.value)
301
+ attrs['data-swiping'] = ''
302
+ if (rootContext.hasNestedDrawer.value)
303
+ attrs['data-nested-drawer-open'] = ''
304
+ return attrs
305
+ })
306
+
307
+ // Sync nestedOpenDrawerCount onto the popup CSS var so nested scale effects
308
+ // can read it. BaseUI uses a running count, not a boolean.
309
+ watch(() => rootContext.nestedOpenDrawerCount.value, (n) => {
310
+ currentElement.value?.style.setProperty(DRAWER_CSS_VARS.nestedDrawers, `${n}`)
311
+ })
312
+
313
+ // Subscribe to the nested swipe progress store: when a CHILD drawer reports
314
+ // dismiss-swipe progress, the parent popup reads it and writes the value onto
315
+ // its own `--drawer-swipe-progress` CSS var so consumer CSS can animate the
316
+ // parent "in reverse" while the child swipes away. Ported from BaseUI
317
+ // `DrawerPopup.tsx` (useIsoLayoutEffect subscribing to nestedSwipeProgressStore).
318
+ let unsubscribeNestedProgress: (() => void) | undefined
319
+
320
+ onMounted(() => {
321
+ rootContext.contentElement.value = currentElement.value
322
+ rootContext.notifyParentHasNestedDrawer?.(true)
323
+
324
+ // Initial nested-drawer count
325
+ currentElement.value?.style.setProperty(
326
+ DRAWER_CSS_VARS.nestedDrawers,
327
+ `${rootContext.nestedOpenDrawerCount.value}`,
328
+ )
329
+
330
+ // Initial snap-point offset. Required on reopen when popupHeight is already
331
+ // measured and activeSnapPoint is unchanged — the lazy watcher would never
332
+ // fire and the drawer would render at offset 0 (appearing as snap=1.0).
333
+ writeSnapPointOffset()
334
+
335
+ unsubscribeNestedProgress = rootContext.nestedSwipeProgressStore.subscribe(() => {
336
+ const progress = rootContext.nestedSwipeProgressStore.getSnapshot()
337
+ currentElement.value?.style.setProperty(DRAWER_CSS_VARS.swipeProgress, `${progress}`)
338
+ })
339
+ })
340
+
341
+ onUnmounted(() => {
342
+ rootContext.notifyParentHasNestedDrawer?.(false)
343
+ unsubscribeNestedProgress?.()
344
+ clearOpenCompleteListener()
345
+ })
346
+
347
+ // Dev warning for missing DrawerTitle
348
+ if (process.env.NODE_ENV !== 'production') {
349
+ onMounted(() => {
350
+ if (!document.getElementById(rootContext.titleId)) {
351
+ console.warn(
352
+ `Warning: \`DrawerContent\` requires a \`DrawerTitle\` for accessibility.`,
353
+ )
354
+ }
355
+ })
356
+ }
357
+ </script>
358
+
359
+ <template>
360
+ <FocusScope
361
+ as-child
362
+ loop
363
+ :trapped="props.trapFocus"
364
+ @mount-auto-focus="emits('openAutoFocus', $event)"
365
+ @unmount-auto-focus="emits('closeAutoFocus', $event)"
366
+ >
367
+ <DismissableLayer
368
+ :id="rootContext.contentId"
369
+ :ref="forwardRef"
370
+ :as="as"
371
+ :as-child="asChild"
372
+ :disable-outside-pointer-events="disableOutsidePointerEvents"
373
+ role="dialog"
374
+ :aria-describedby="rootContext.descriptionId"
375
+ :aria-labelledby="rootContext.titleId"
376
+ v-bind="{ ...dataAttributes, ...$attrs }"
377
+ @dismiss="onDismiss"
378
+ @escape-key-down="onEscapeKeyDown"
379
+ @focus-outside="onFocusOutside"
380
+ @interact-outside="onInteractOutside"
381
+ @pointer-down-outside="onPointerDownOutside"
382
+ >
383
+ <slot />
384
+ </DismissableLayer>
385
+ </FocusScope>
386
+ </template>
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import type { PrimitiveProps } from '@/Primitive'
3
+
4
+ export interface DrawerDescriptionProps extends PrimitiveProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { Primitive } from '@/Primitive'
9
+ import { useForwardExpose } from '@/shared'
10
+ import { injectDrawerRootContext } from './DrawerRoot.vue'
11
+
12
+ const props = withDefaults(defineProps<DrawerDescriptionProps>(), { as: 'p' })
13
+ useForwardExpose()
14
+ const rootContext = injectDrawerRootContext()
15
+ </script>
16
+
17
+ <template>
18
+ <Primitive
19
+ v-bind="props"
20
+ :id="rootContext.descriptionId"
21
+ >
22
+ <slot />
23
+ </Primitive>
24
+ </template>
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ import type { PrimitiveProps } from '@/Primitive'
3
+
4
+ export interface DrawerHandleProps extends PrimitiveProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { Primitive } from '@/Primitive'
9
+ import { useForwardExpose } from '@/shared'
10
+ import { injectDrawerRootContext } from './DrawerRoot.vue'
11
+
12
+ const props = withDefaults(defineProps<DrawerHandleProps>(), { as: 'div' })
13
+ useForwardExpose()
14
+ const rootContext = injectDrawerRootContext()
15
+ </script>
16
+
17
+ <template>
18
+ <Primitive
19
+ v-bind="props"
20
+ aria-hidden="true"
21
+ :data-state="rootContext.open.value ? 'open' : 'closed'"
22
+ >
23
+ <slot />
24
+ </Primitive>
25
+ </template>
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import type { PrimitiveProps } from '@/Primitive'
3
+
4
+ export interface DrawerIndentProps extends PrimitiveProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { onMounted, onUnmounted } from 'vue'
9
+ import { Primitive } from '@/Primitive'
10
+ import { useForwardExpose } from '@/shared'
11
+ import { injectDrawerProviderContext } from './DrawerProvider.vue'
12
+ import { DRAWER_CSS_VARS } from './utils'
13
+
14
+ const props = withDefaults(defineProps<DrawerIndentProps>(), { as: 'div' })
15
+ const { forwardRef, currentElement } = useForwardExpose()
16
+ const providerContext = injectDrawerProviderContext(null)
17
+
18
+ let unsubscribe: (() => void) | undefined
19
+
20
+ onMounted(() => {
21
+ const store = providerContext?.visualStateStore
22
+ if (!store)
23
+ return
24
+ const el = currentElement.value
25
+ if (!el)
26
+ return
27
+
28
+ const sync = () => {
29
+ const { swipeProgress, frontmostHeight } = store.getSnapshot()
30
+ el.style.setProperty(DRAWER_CSS_VARS.swipeProgress, swipeProgress > 0 ? `${swipeProgress}` : '0')
31
+ if (frontmostHeight > 0)
32
+ el.style.setProperty(DRAWER_CSS_VARS.height, `${frontmostHeight}px`)
33
+ else
34
+ el.style.removeProperty(DRAWER_CSS_VARS.height)
35
+ }
36
+
37
+ sync()
38
+ unsubscribe = store.subscribe(sync)
39
+ })
40
+
41
+ onUnmounted(() => {
42
+ unsubscribe?.()
43
+ const el = currentElement.value
44
+ if (el) {
45
+ el.style.setProperty(DRAWER_CSS_VARS.swipeProgress, '0')
46
+ el.style.removeProperty(DRAWER_CSS_VARS.height)
47
+ }
48
+ })
49
+ </script>
50
+
51
+ <template>
52
+ <Primitive
53
+ v-bind="props"
54
+ :ref="forwardRef"
55
+ :data-active="providerContext?.active.value ? '' : undefined"
56
+ :data-inactive="providerContext?.active.value === false ? '' : undefined"
57
+ :style="{ [DRAWER_CSS_VARS.swipeProgress]: '0' }"
58
+ >
59
+ <slot />
60
+ </Primitive>
61
+ </template>
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ import type { PrimitiveProps } from '@/Primitive'
3
+
4
+ export interface DrawerIndentBackgroundProps extends PrimitiveProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { Primitive } from '@/Primitive'
9
+ import { useForwardExpose } from '@/shared'
10
+ import { injectDrawerProviderContext } from './DrawerProvider.vue'
11
+
12
+ const props = withDefaults(defineProps<DrawerIndentBackgroundProps>(), { as: 'div' })
13
+ const { forwardRef } = useForwardExpose()
14
+ const providerContext = injectDrawerProviderContext(null)
15
+ </script>
16
+
17
+ <template>
18
+ <Primitive
19
+ v-bind="props"
20
+ :ref="forwardRef"
21
+ :data-active="providerContext?.active.value ? '' : undefined"
22
+ :data-inactive="!providerContext?.active.value ? '' : undefined"
23
+ >
24
+ <slot />
25
+ </Primitive>
26
+ </template>
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import type { DrawerOverlayImplProps } from './DrawerOverlayImpl.vue'
3
+
4
+ export interface DrawerOverlayProps extends DrawerOverlayImplProps {
5
+ /** Keep mounted for animation control. */
6
+ forceMount?: boolean
7
+ /** Render even when inside a nested drawer. @default false */
8
+ forceRender?: boolean
9
+ }
10
+ </script>
11
+
12
+ <script setup lang="ts">
13
+ import { Presence } from '@/Presence'
14
+ import { useForwardExpose } from '@/shared'
15
+ import DrawerOverlayImpl from './DrawerOverlayImpl.vue'
16
+ import { injectDrawerRootContext } from './DrawerRoot.vue'
17
+
18
+ const props = withDefaults(defineProps<DrawerOverlayProps>(), {
19
+ forceMount: false,
20
+ forceRender: false,
21
+ })
22
+
23
+ const rootContext = injectDrawerRootContext()
24
+ const isNested = !!rootContext.notifyParentHasNestedDrawer
25
+ const { forwardRef } = useForwardExpose()
26
+ </script>
27
+
28
+ <template>
29
+ <Presence
30
+ v-if="rootContext.modal.value && (!isNested || forceRender)"
31
+ :present="forceMount || rootContext.open.value"
32
+ >
33
+ <DrawerOverlayImpl
34
+ v-bind="$attrs"
35
+ :ref="forwardRef"
36
+ :as="as"
37
+ :as-child="asChild"
38
+ >
39
+ <slot />
40
+ </DrawerOverlayImpl>
41
+ </Presence>
42
+ </template>
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import type { PrimitiveProps } from '@/Primitive'
3
+
4
+ export interface DrawerOverlayImplProps extends PrimitiveProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { computed, watch } from 'vue'
9
+ import { Primitive } from '@/Primitive'
10
+ import { useBodyScrollLock, useForwardExpose } from '@/shared'
11
+ import { injectDrawerRootContext } from './DrawerRoot.vue'
12
+ import { DRAWER_CSS_VARS } from './utils'
13
+
14
+ defineProps<DrawerOverlayImplProps>()
15
+ const rootContext = injectDrawerRootContext()
16
+
17
+ // Only lock body scroll while the drawer is actually open. With `forceMount`,
18
+ // the overlay may stay mounted while closed — unconditional lock would keep
19
+ // the page scroll blocked.
20
+ const locked = useBodyScrollLock(rootContext.open.value)
21
+ watch(() => rootContext.open.value, (open) => {
22
+ locked.value = open
23
+ }, { immediate: true })
24
+
25
+ useForwardExpose()
26
+
27
+ // BaseUI parity: the backdrop carries data-swiping / data-swipe-direction so
28
+ // downstream CSS can target `[data-swiping] [data-slot="drawer-backdrop"]`.
29
+ const dataAttributes = computed(() => {
30
+ const attrs: Record<string, string | undefined> = {
31
+ 'data-state': rootContext.open.value ? 'open' : 'closed',
32
+ 'data-swipe-direction': rootContext.swipeDirection.value,
33
+ }
34
+ if (rootContext.isSwiping.value)
35
+ attrs['data-swiping'] = ''
36
+ return attrs
37
+ })
38
+ </script>
39
+
40
+ <template>
41
+ <Primitive
42
+ :as="as"
43
+ :as-child="asChild"
44
+ v-bind="dataAttributes"
45
+ :style="{
46
+ pointerEvents: 'auto',
47
+ userSelect: 'none',
48
+ [DRAWER_CSS_VARS.swipeProgress]: '0',
49
+ [DRAWER_CSS_VARS.swipeStrength]: '1',
50
+ }"
51
+ >
52
+ <slot />
53
+ </Primitive>
54
+ </template>
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ import type { TeleportProps } from '@/Teleport'
3
+
4
+ export interface DrawerPortalProps extends TeleportProps {}
5
+ </script>
6
+
7
+ <script setup lang="ts">
8
+ import { TeleportPrimitive } from '@/Teleport'
9
+
10
+ defineProps<DrawerPortalProps>()
11
+ </script>
12
+
13
+ <template>
14
+ <TeleportPrimitive v-bind="$props">
15
+ <slot />
16
+ </TeleportPrimitive>
17
+ </template>