sheer-ui 0.0.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 (635) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/package.json +369 -0
  4. package/src/lib/VENDORED.md +109 -0
  5. package/src/lib/assets/ui.css +733 -0
  6. package/src/lib/blocks/Appearance.svelte +104 -0
  7. package/src/lib/blocks/BoundaryFailed.svelte +33 -0
  8. package/src/lib/blocks/ErrorPage.svelte +65 -0
  9. package/src/lib/blocks/Footer.svelte +71 -0
  10. package/src/lib/blocks/Header.svelte +67 -0
  11. package/src/lib/blocks/Heading.svelte +86 -0
  12. package/src/lib/blocks/MobileNav.svelte +169 -0
  13. package/src/lib/blocks/PhoneInput.svelte +68 -0
  14. package/src/lib/blocks/Section.svelte +34 -0
  15. package/src/lib/blocks/alert-modal/AlertModal.svelte +83 -0
  16. package/src/lib/blocks/alert-modal/alert-modal.svelte.ts +81 -0
  17. package/src/lib/blocks/alert-modal/index.ts +2 -0
  18. package/src/lib/blocks/calendar.svelte +155 -0
  19. package/src/lib/blocks/copy-button/copy-button.svelte +43 -0
  20. package/src/lib/blocks/copy-button/copy.svelte.ts +52 -0
  21. package/src/lib/blocks/copy-button/index.ts +2 -0
  22. package/src/lib/blocks/date-picker/date-picker-with-presets.svelte +109 -0
  23. package/src/lib/blocks/date-picker/date-picker.svelte +91 -0
  24. package/src/lib/blocks/date-picker/index.ts +13 -0
  25. package/src/lib/blocks/date-picker/range-date-picker.svelte +128 -0
  26. package/src/lib/blocks/index.ts +12 -0
  27. package/src/lib/blocks/mockups/Browser.svelte +22 -0
  28. package/src/lib/blocks/mockups/Phone.svelte +44 -0
  29. package/src/lib/blocks/mockups/index.ts +2 -0
  30. package/src/lib/blocks/tab-nav/index.ts +1 -0
  31. package/src/lib/blocks/tab-nav/tab-nav.svelte +46 -0
  32. package/src/lib/blocks/time-picker/index.ts +16 -0
  33. package/src/lib/blocks/time-picker/time-input.svelte +118 -0
  34. package/src/lib/blocks/time-picker/time-picker.svelte +93 -0
  35. package/src/lib/blocks/time-picker/time-range-input.svelte +34 -0
  36. package/src/lib/blocks/time-picker/time-range-picker.svelte +180 -0
  37. package/src/lib/blocks/time-picker/time-slots.ts +61 -0
  38. package/src/lib/blocks/user-avatar/UserAvatar.svelte +36 -0
  39. package/src/lib/blocks/user-avatar/index.ts +1 -0
  40. package/src/lib/blocks/verification-code-field/VerificationCodeField.svelte +57 -0
  41. package/src/lib/blocks/verification-code-field/index.ts +1 -0
  42. package/src/lib/components/accordion/accordion.svelte.ts +43 -0
  43. package/src/lib/components/accordion/components/accordion-content.svelte +17 -0
  44. package/src/lib/components/accordion/components/accordion-item.svelte +58 -0
  45. package/src/lib/components/accordion/components/accordion-trigger.svelte +38 -0
  46. package/src/lib/components/accordion/components/accordion.svelte +24 -0
  47. package/src/lib/components/accordion/index.ts +11 -0
  48. package/src/lib/components/accordion/types.ts +19 -0
  49. package/src/lib/components/alert/alert-action.svelte +11 -0
  50. package/src/lib/components/alert/alert-description.svelte +18 -0
  51. package/src/lib/components/alert/alert-title.svelte +18 -0
  52. package/src/lib/components/alert/alert.svelte +37 -0
  53. package/src/lib/components/alert/index.ts +17 -0
  54. package/src/lib/components/avatar/avatar.svelte.ts +154 -0
  55. package/src/lib/components/avatar/components/avatar-fallback.svelte +38 -0
  56. package/src/lib/components/avatar/components/avatar-image.svelte +47 -0
  57. package/src/lib/components/avatar/components/avatar.svelte +57 -0
  58. package/src/lib/components/avatar/index.ts +9 -0
  59. package/src/lib/components/avatar/types.ts +46 -0
  60. package/src/lib/components/badge/badge.svelte +49 -0
  61. package/src/lib/components/badge/index.ts +1 -0
  62. package/src/lib/components/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
  63. package/src/lib/components/breadcrumb/breadcrumb-item.svelte +11 -0
  64. package/src/lib/components/breadcrumb/breadcrumb-link.svelte +32 -0
  65. package/src/lib/components/breadcrumb/breadcrumb-list.svelte +15 -0
  66. package/src/lib/components/breadcrumb/breadcrumb-page.svelte +18 -0
  67. package/src/lib/components/breadcrumb/breadcrumb-separator.svelte +22 -0
  68. package/src/lib/components/breadcrumb/breadcrumb.svelte +10 -0
  69. package/src/lib/components/breadcrumb/index.ts +25 -0
  70. package/src/lib/components/button/button.svelte +55 -0
  71. package/src/lib/components/button/index.ts +12 -0
  72. package/src/lib/components/button/variants.ts +51 -0
  73. package/src/lib/components/calendar/calendar.svelte.ts +1081 -0
  74. package/src/lib/components/calendar/components/calendar-cell.svelte +34 -0
  75. package/src/lib/components/calendar/components/calendar-day.svelte +36 -0
  76. package/src/lib/components/calendar/components/calendar-grid-body.svelte +29 -0
  77. package/src/lib/components/calendar/components/calendar-grid-head.svelte +29 -0
  78. package/src/lib/components/calendar/components/calendar-grid-row.svelte +29 -0
  79. package/src/lib/components/calendar/components/calendar-grid.svelte +29 -0
  80. package/src/lib/components/calendar/components/calendar-head-cell.svelte +29 -0
  81. package/src/lib/components/calendar/components/calendar-header.svelte +29 -0
  82. package/src/lib/components/calendar/components/calendar-heading.svelte +33 -0
  83. package/src/lib/components/calendar/components/calendar-month-select.svelte +50 -0
  84. package/src/lib/components/calendar/components/calendar-next-button.svelte +37 -0
  85. package/src/lib/components/calendar/components/calendar-prev-button.svelte +37 -0
  86. package/src/lib/components/calendar/components/calendar-year-select.svelte +50 -0
  87. package/src/lib/components/calendar/components/calendar.svelte +123 -0
  88. package/src/lib/components/calendar/exports.ts +31 -0
  89. package/src/lib/components/calendar/index.ts +2 -0
  90. package/src/lib/components/calendar/types.ts +417 -0
  91. package/src/lib/components/card/card-action.svelte +15 -0
  92. package/src/lib/components/card/card-content.svelte +11 -0
  93. package/src/lib/components/card/card-description.svelte +11 -0
  94. package/src/lib/components/card/card-footer.svelte +11 -0
  95. package/src/lib/components/card/card-header.svelte +18 -0
  96. package/src/lib/components/card/card-title.svelte +11 -0
  97. package/src/lib/components/card/card.svelte +15 -0
  98. package/src/lib/components/card/index.ts +25 -0
  99. package/src/lib/components/carousel/carousel-arrow.svelte +42 -0
  100. package/src/lib/components/carousel/carousel-content.svelte +25 -0
  101. package/src/lib/components/carousel/carousel-dots.svelte +21 -0
  102. package/src/lib/components/carousel/carousel-item.svelte +21 -0
  103. package/src/lib/components/carousel/carousel-next.svelte +9 -0
  104. package/src/lib/components/carousel/carousel-previous.svelte +9 -0
  105. package/src/lib/components/carousel/carousel.svelte +245 -0
  106. package/src/lib/components/carousel/carouselState.svelte.ts +30 -0
  107. package/src/lib/components/carousel/index.ts +24 -0
  108. package/src/lib/components/chart/chart-container.svelte +52 -0
  109. package/src/lib/components/chart/chart-style.svelte +29 -0
  110. package/src/lib/components/chart/chart-tooltip.svelte +163 -0
  111. package/src/lib/components/chart/chart-utils.ts +50 -0
  112. package/src/lib/components/chart/index.ts +6 -0
  113. package/src/lib/components/checkbox/checkbox.svelte.ts +199 -0
  114. package/src/lib/components/checkbox/components/checkbox-group-label.svelte +29 -0
  115. package/src/lib/components/checkbox/components/checkbox-group.svelte +48 -0
  116. package/src/lib/components/checkbox/components/checkbox.svelte +85 -0
  117. package/src/lib/components/checkbox/index.ts +9 -0
  118. package/src/lib/components/checkbox/types.ts +131 -0
  119. package/src/lib/components/checkbox-native/checkbox.svelte +96 -0
  120. package/src/lib/components/checkbox-native/index.ts +8 -0
  121. package/src/lib/components/collapsible/components/collapsible-content.svelte +16 -0
  122. package/src/lib/components/collapsible/components/collapsible-trigger.svelte +14 -0
  123. package/src/lib/components/collapsible/components/collapsible.svelte +68 -0
  124. package/src/lib/components/collapsible/index.ts +9 -0
  125. package/src/lib/components/collapsible/types.ts +25 -0
  126. package/src/lib/components/combobox/components/combobox-arrow.svelte +8 -0
  127. package/src/lib/components/combobox/components/combobox-input.svelte +46 -0
  128. package/src/lib/components/combobox/components/combobox-trigger.svelte +44 -0
  129. package/src/lib/components/combobox/components/combobox.svelte +83 -0
  130. package/src/lib/components/combobox/index.ts +30 -0
  131. package/src/lib/components/combobox/select/components/select-content-static.svelte +56 -0
  132. package/src/lib/components/combobox/select/components/select-content.svelte +95 -0
  133. package/src/lib/components/combobox/select/components/select-group-heading.svelte +51 -0
  134. package/src/lib/components/combobox/select/components/select-group.svelte +51 -0
  135. package/src/lib/components/combobox/select/components/select-hidden-input.svelte +16 -0
  136. package/src/lib/components/combobox/select/components/select-item.svelte +86 -0
  137. package/src/lib/components/combobox/select/components/select-scroll-down-button.svelte +41 -0
  138. package/src/lib/components/combobox/select/components/select-scroll-up-button.svelte +34 -0
  139. package/src/lib/components/combobox/select/components/select-trigger.svelte +32 -0
  140. package/src/lib/components/combobox/select/components/select-value.svelte +40 -0
  141. package/src/lib/components/combobox/select/components/select-viewport.svelte +29 -0
  142. package/src/lib/components/combobox/select/components/select.svelte +92 -0
  143. package/src/lib/components/combobox/select/select.svelte.ts +1596 -0
  144. package/src/lib/components/combobox/select/types.ts +291 -0
  145. package/src/lib/components/combobox/types.ts +77 -0
  146. package/src/lib/components/command/command-dialog.svelte +42 -0
  147. package/src/lib/components/command/command.svelte.ts +1506 -0
  148. package/src/lib/components/command/components/_command-label.svelte +31 -0
  149. package/src/lib/components/command/components/command-empty.svelte +34 -0
  150. package/src/lib/components/command/components/command-group-heading.svelte +29 -0
  151. package/src/lib/components/command/components/command-group-items.svelte +31 -0
  152. package/src/lib/components/command/components/command-group.svelte +76 -0
  153. package/src/lib/components/command/components/command-input.svelte +55 -0
  154. package/src/lib/components/command/components/command-item.svelte +61 -0
  155. package/src/lib/components/command/components/command-link-item.svelte +61 -0
  156. package/src/lib/components/command/components/command-list.svelte +41 -0
  157. package/src/lib/components/command/components/command-loading.svelte +30 -0
  158. package/src/lib/components/command/components/command-separator.svelte +34 -0
  159. package/src/lib/components/command/components/command-viewport.svelte +29 -0
  160. package/src/lib/components/command/components/command.svelte +143 -0
  161. package/src/lib/components/command/compute-command-score.ts +207 -0
  162. package/src/lib/components/command/index.ts +29 -0
  163. package/src/lib/components/command/types.ts +222 -0
  164. package/src/lib/components/command/utils.ts +30 -0
  165. package/src/lib/components/context-menu/components/context-menu-content-static.svelte +22 -0
  166. package/src/lib/components/context-menu/components/context-menu-content.svelte +22 -0
  167. package/src/lib/components/context-menu/components/context-menu-trigger.svelte +46 -0
  168. package/src/lib/components/context-menu/components/context-menu.svelte +8 -0
  169. package/src/lib/components/context-menu/index.ts +39 -0
  170. package/src/lib/components/context-menu/types.ts +56 -0
  171. package/src/lib/components/data-table/column-helpers.ts +97 -0
  172. package/src/lib/components/data-table/data-table-checkbox.svelte +25 -0
  173. package/src/lib/components/data-table/data-table-sort-button.svelte +16 -0
  174. package/src/lib/components/data-table/flex-render.svelte +42 -0
  175. package/src/lib/components/data-table/index.ts +29 -0
  176. package/src/lib/components/data-table/render-helpers.ts +105 -0
  177. package/src/lib/components/data-table/table-cell.svelte +9 -0
  178. package/src/lib/components/data-table/table-column-header.svelte +51 -0
  179. package/src/lib/components/data-table/table-faceted-filter.svelte +109 -0
  180. package/src/lib/components/data-table/table-pagination.svelte +54 -0
  181. package/src/lib/components/data-table/table-priority-cell.svelte +22 -0
  182. package/src/lib/components/data-table/table-row-actions.svelte +29 -0
  183. package/src/lib/components/data-table/table-status-cell.svelte +34 -0
  184. package/src/lib/components/data-table/table-title-cell.svelte +24 -0
  185. package/src/lib/components/data-table/table-toolbar.svelte +55 -0
  186. package/src/lib/components/data-table/table-view-options.svelte +25 -0
  187. package/src/lib/components/date-field/components/date-field-hidden-input.svelte +9 -0
  188. package/src/lib/components/date-field/components/date-field-input.svelte +33 -0
  189. package/src/lib/components/date-field/components/date-field-label.svelte +29 -0
  190. package/src/lib/components/date-field/components/date-field-segment.svelte +29 -0
  191. package/src/lib/components/date-field/components/date-field.svelte +106 -0
  192. package/src/lib/components/date-field/date-field.svelte.ts +1474 -0
  193. package/src/lib/components/date-field/index.ts +11 -0
  194. package/src/lib/components/date-field/types.ts +165 -0
  195. package/src/lib/components/date-range-field/components/date-range-field-input.svelte +36 -0
  196. package/src/lib/components/date-range-field/components/date-range-field-label.svelte +29 -0
  197. package/src/lib/components/date-range-field/components/date-range-field.svelte +106 -0
  198. package/src/lib/components/date-range-field/date-range-field.svelte.ts +212 -0
  199. package/src/lib/components/date-range-field/index.ts +11 -0
  200. package/src/lib/components/date-range-field/types.ts +171 -0
  201. package/src/lib/components/dialog/components/dialog-close.svelte +31 -0
  202. package/src/lib/components/dialog/components/dialog-content-headless.svelte +104 -0
  203. package/src/lib/components/dialog/components/dialog-content.svelte +69 -0
  204. package/src/lib/components/dialog/components/dialog-description.svelte +29 -0
  205. package/src/lib/components/dialog/components/dialog-overlay.svelte +31 -0
  206. package/src/lib/components/dialog/components/dialog-title.svelte +30 -0
  207. package/src/lib/components/dialog/components/dialog-trigger.svelte +30 -0
  208. package/src/lib/components/dialog/components/dialog.svelte +21 -0
  209. package/src/lib/components/dialog/components/modal-surface.svelte +131 -0
  210. package/src/lib/components/dialog/dialog.svelte.ts +371 -0
  211. package/src/lib/components/dialog/index.ts +19 -0
  212. package/src/lib/components/dialog/types.ts +105 -0
  213. package/src/lib/components/drawer/drawer-close.svelte +7 -0
  214. package/src/lib/components/drawer/drawer-content.svelte +91 -0
  215. package/src/lib/components/drawer/drawer-description.svelte +8 -0
  216. package/src/lib/components/drawer/drawer-footer.svelte +11 -0
  217. package/src/lib/components/drawer/drawer-header.svelte +11 -0
  218. package/src/lib/components/drawer/drawer-nested.svelte +44 -0
  219. package/src/lib/components/drawer/drawer-overlay.svelte +60 -0
  220. package/src/lib/components/drawer/drawer-portal.svelte +10 -0
  221. package/src/lib/components/drawer/drawer-title.svelte +8 -0
  222. package/src/lib/components/drawer/drawer-trigger.svelte +7 -0
  223. package/src/lib/components/drawer/drawer.svelte +290 -0
  224. package/src/lib/components/drawer/index.ts +37 -0
  225. package/src/lib/components/dropdown-menu/components/dropdown-menu-content-static.svelte +22 -0
  226. package/src/lib/components/dropdown-menu/components/dropdown-menu-content.svelte +22 -0
  227. package/src/lib/components/dropdown-menu/index.ts +39 -0
  228. package/src/lib/components/dropdown-menu/types.ts +41 -0
  229. package/src/lib/components/empty/empty-content.svelte +15 -0
  230. package/src/lib/components/empty/empty-description.svelte +15 -0
  231. package/src/lib/components/empty/empty-header.svelte +15 -0
  232. package/src/lib/components/empty/empty-media.svelte +21 -0
  233. package/src/lib/components/empty/empty-title.svelte +11 -0
  234. package/src/lib/components/empty/empty.svelte +18 -0
  235. package/src/lib/components/empty/index.ts +22 -0
  236. package/src/lib/components/empty/variants.ts +16 -0
  237. package/src/lib/components/field/field-content.svelte +14 -0
  238. package/src/lib/components/field/field-description.svelte +19 -0
  239. package/src/lib/components/field/field-error.svelte +47 -0
  240. package/src/lib/components/field/field-group.svelte +17 -0
  241. package/src/lib/components/field/field-label.svelte +18 -0
  242. package/src/lib/components/field/field-legend.svelte +23 -0
  243. package/src/lib/components/field/field-separator.svelte +32 -0
  244. package/src/lib/components/field/field-set.svelte +14 -0
  245. package/src/lib/components/field/field-title.svelte +14 -0
  246. package/src/lib/components/field/field.svelte +36 -0
  247. package/src/lib/components/field/index.ts +32 -0
  248. package/src/lib/components/field/variants.ts +19 -0
  249. package/src/lib/components/input/file-input.svelte +26 -0
  250. package/src/lib/components/input/index.ts +12 -0
  251. package/src/lib/components/input/input.svelte +24 -0
  252. package/src/lib/components/input/variants.ts +28 -0
  253. package/src/lib/components/item/index.ts +34 -0
  254. package/src/lib/components/item/item-actions.svelte +11 -0
  255. package/src/lib/components/item/item-content.svelte +15 -0
  256. package/src/lib/components/item/item-description.svelte +18 -0
  257. package/src/lib/components/item/item-footer.svelte +11 -0
  258. package/src/lib/components/item/item-group.svelte +16 -0
  259. package/src/lib/components/item/item-header.svelte +11 -0
  260. package/src/lib/components/item/item-media.svelte +37 -0
  261. package/src/lib/components/item/item-separator.svelte +9 -0
  262. package/src/lib/components/item/item-title.svelte +15 -0
  263. package/src/lib/components/item/item.svelte +61 -0
  264. package/src/lib/components/kbd/index.ts +10 -0
  265. package/src/lib/components/kbd/kbd-group.svelte +11 -0
  266. package/src/lib/components/kbd/kbd.svelte +18 -0
  267. package/src/lib/components/label/exports.ts +2 -0
  268. package/src/lib/components/label/index.ts +2 -0
  269. package/src/lib/components/label/label.svelte +39 -0
  270. package/src/lib/components/label/label.svelte.ts +39 -0
  271. package/src/lib/components/label/types.ts +7 -0
  272. package/src/lib/components/link-preview/components/link-preview-content.svelte +60 -0
  273. package/src/lib/components/link-preview/components/link-preview-trigger.svelte +29 -0
  274. package/src/lib/components/link-preview/components/link-preview.svelte +34 -0
  275. package/src/lib/components/link-preview/exports.ts +11 -0
  276. package/src/lib/components/link-preview/index.ts +2 -0
  277. package/src/lib/components/link-preview/link-preview.svelte.ts +270 -0
  278. package/src/lib/components/link-preview/types.ts +102 -0
  279. package/src/lib/components/menu/components/menu-arrow.svelte +14 -0
  280. package/src/lib/components/menu/components/menu-checkbox-group.svelte +42 -0
  281. package/src/lib/components/menu/components/menu-checkbox-item.svelte +85 -0
  282. package/src/lib/components/menu/components/menu-content.svelte +98 -0
  283. package/src/lib/components/menu/components/menu-group-heading.svelte +47 -0
  284. package/src/lib/components/menu/components/menu-group.svelte +36 -0
  285. package/src/lib/components/menu/components/menu-item.svelte +58 -0
  286. package/src/lib/components/menu/components/menu-radio-group.svelte +44 -0
  287. package/src/lib/components/menu/components/menu-radio-item.svelte +65 -0
  288. package/src/lib/components/menu/components/menu-separator.svelte +38 -0
  289. package/src/lib/components/menu/components/menu-sub-content-static.svelte +8 -0
  290. package/src/lib/components/menu/components/menu-sub-content.svelte +133 -0
  291. package/src/lib/components/menu/components/menu-sub-trigger.svelte +60 -0
  292. package/src/lib/components/menu/components/menu-sub.svelte +23 -0
  293. package/src/lib/components/menu/components/menu-trigger.svelte +50 -0
  294. package/src/lib/components/menu/components/menu.svelte +58 -0
  295. package/src/lib/components/menu/exports.ts +38 -0
  296. package/src/lib/components/menu/menu.svelte.ts +1599 -0
  297. package/src/lib/components/menu/types.ts +285 -0
  298. package/src/lib/components/menu/utils.ts +68 -0
  299. package/src/lib/components/menubar/components/menubar-content-static.svelte +50 -0
  300. package/src/lib/components/menubar/components/menubar-content.svelte +54 -0
  301. package/src/lib/components/menubar/components/menubar-menu.svelte +34 -0
  302. package/src/lib/components/menubar/components/menubar-trigger.svelte +50 -0
  303. package/src/lib/components/menubar/components/menubar.svelte +57 -0
  304. package/src/lib/components/menubar/exports.ts +44 -0
  305. package/src/lib/components/menubar/index.ts +2 -0
  306. package/src/lib/components/menubar/menubar.svelte.ts +394 -0
  307. package/src/lib/components/menubar/types.ts +97 -0
  308. package/src/lib/components/meter/components/meter.svelte +41 -0
  309. package/src/lib/components/meter/exports.ts +2 -0
  310. package/src/lib/components/meter/index.ts +2 -0
  311. package/src/lib/components/meter/meter.svelte.ts +47 -0
  312. package/src/lib/components/meter/types.ts +28 -0
  313. package/src/lib/components/navigation-menu/components/navigation-menu-content-impl.svelte +85 -0
  314. package/src/lib/components/navigation-menu/components/navigation-menu-content.svelte +58 -0
  315. package/src/lib/components/navigation-menu/components/navigation-menu-indicator-impl.svelte +29 -0
  316. package/src/lib/components/navigation-menu/components/navigation-menu-indicator.svelte +56 -0
  317. package/src/lib/components/navigation-menu/components/navigation-menu-item.svelte +56 -0
  318. package/src/lib/components/navigation-menu/components/navigation-menu-link.svelte +64 -0
  319. package/src/lib/components/navigation-menu/components/navigation-menu-list.svelte +59 -0
  320. package/src/lib/components/navigation-menu/components/navigation-menu-sub.svelte +46 -0
  321. package/src/lib/components/navigation-menu/components/navigation-menu-trigger.svelte +80 -0
  322. package/src/lib/components/navigation-menu/components/navigation-menu-viewport.svelte +63 -0
  323. package/src/lib/components/navigation-menu/components/navigation-menu.svelte +80 -0
  324. package/src/lib/components/navigation-menu/index.ts +28 -0
  325. package/src/lib/components/navigation-menu/navigation-menu.svelte.ts +1092 -0
  326. package/src/lib/components/navigation-menu/types.ts +189 -0
  327. package/src/lib/components/pagination/components/pagination-next-button.svelte +60 -0
  328. package/src/lib/components/pagination/components/pagination-page.svelte +65 -0
  329. package/src/lib/components/pagination/components/pagination-prev-button.svelte +60 -0
  330. package/src/lib/components/pagination/components/pagination.svelte +65 -0
  331. package/src/lib/components/pagination/index.ts +11 -0
  332. package/src/lib/components/pagination/pagination.svelte.ts +275 -0
  333. package/src/lib/components/pagination/types.ts +100 -0
  334. package/src/lib/components/pin-input/components/pin-input-cell.svelte +49 -0
  335. package/src/lib/components/pin-input/components/pin-input.svelte +76 -0
  336. package/src/lib/components/pin-input/exports.ts +4 -0
  337. package/src/lib/components/pin-input/index.ts +2 -0
  338. package/src/lib/components/pin-input/pin-input.svelte.ts +541 -0
  339. package/src/lib/components/pin-input/types.ts +118 -0
  340. package/src/lib/components/pin-input/usePasswordManager.svelte.ts +122 -0
  341. package/src/lib/components/popover/components/popover-close.svelte +38 -0
  342. package/src/lib/components/popover/components/popover-content.svelte +70 -0
  343. package/src/lib/components/popover/components/popover-header.svelte +11 -0
  344. package/src/lib/components/popover/components/popover-title.svelte +11 -0
  345. package/src/lib/components/popover/components/popover-trigger.svelte +44 -0
  346. package/src/lib/components/popover/components/popover.svelte +26 -0
  347. package/src/lib/components/popover/exports.ts +13 -0
  348. package/src/lib/components/popover/index.ts +2 -0
  349. package/src/lib/components/popover/popover.svelte.ts +392 -0
  350. package/src/lib/components/popover/types.ts +92 -0
  351. package/src/lib/components/progress/components/progress.svelte +56 -0
  352. package/src/lib/components/progress/exports.ts +3 -0
  353. package/src/lib/components/progress/index.ts +2 -0
  354. package/src/lib/components/progress/progress.svelte.ts +58 -0
  355. package/src/lib/components/progress/types.ts +28 -0
  356. package/src/lib/components/radio-group/context.ts +13 -0
  357. package/src/lib/components/radio-group/index.ts +10 -0
  358. package/src/lib/components/radio-group/radio-group-item.svelte +67 -0
  359. package/src/lib/components/radio-group/radio-group.svelte +87 -0
  360. package/src/lib/components/range-calendar/components/range-calendar-cell.svelte +31 -0
  361. package/src/lib/components/range-calendar/components/range-calendar-day.svelte +33 -0
  362. package/src/lib/components/range-calendar/components/range-calendar.svelte +120 -0
  363. package/src/lib/components/range-calendar/exports.ts +31 -0
  364. package/src/lib/components/range-calendar/index.ts +2 -0
  365. package/src/lib/components/range-calendar/range-calendar.svelte.ts +739 -0
  366. package/src/lib/components/range-calendar/types.ts +258 -0
  367. package/src/lib/components/resizable/index.ts +15 -0
  368. package/src/lib/components/resizable/resizable-handle.svelte +30 -0
  369. package/src/lib/components/resizable/resizable-pane-group.svelte +19 -0
  370. package/src/lib/components/scroll-area/components/scroll-area-corner-impl.svelte +34 -0
  371. package/src/lib/components/scroll-area/components/scroll-area-corner.svelte +18 -0
  372. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-auto.svelte +15 -0
  373. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-hover.svelte +22 -0
  374. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-scroll.svelte +16 -0
  375. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-shared.svelte +19 -0
  376. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-visible.svelte +16 -0
  377. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-x.svelte +23 -0
  378. package/src/lib/components/scroll-area/components/scroll-area-scrollbar-y.svelte +24 -0
  379. package/src/lib/components/scroll-area/components/scroll-area-scrollbar.svelte +56 -0
  380. package/src/lib/components/scroll-area/components/scroll-area-thumb-impl.svelte +49 -0
  381. package/src/lib/components/scroll-area/components/scroll-area-thumb.svelte +21 -0
  382. package/src/lib/components/scroll-area/components/scroll-area-viewport.svelte +39 -0
  383. package/src/lib/components/scroll-area/components/scroll-area.svelte +82 -0
  384. package/src/lib/components/scroll-area/exports.ts +13 -0
  385. package/src/lib/components/scroll-area/index.ts +2 -0
  386. package/src/lib/components/scroll-area/scroll-area.svelte.ts +946 -0
  387. package/src/lib/components/scroll-area/types.ts +67 -0
  388. package/src/lib/components/select/index.ts +5 -0
  389. package/src/lib/components/select/select-opt-group.svelte +10 -0
  390. package/src/lib/components/select/select-option.svelte +15 -0
  391. package/src/lib/components/select/select.svelte +281 -0
  392. package/src/lib/components/separator/components/separator.svelte +49 -0
  393. package/src/lib/components/separator/index.ts +3 -0
  394. package/src/lib/components/separator/separator.svelte.ts +43 -0
  395. package/src/lib/components/separator/types.ts +22 -0
  396. package/src/lib/components/sheet/components/sheet-close.svelte +8 -0
  397. package/src/lib/components/sheet/components/sheet-content.svelte +108 -0
  398. package/src/lib/components/sheet/components/sheet-description.svelte +9 -0
  399. package/src/lib/components/sheet/components/sheet-footer.svelte +11 -0
  400. package/src/lib/components/sheet/components/sheet-header.svelte +11 -0
  401. package/src/lib/components/sheet/components/sheet-overlay.svelte +13 -0
  402. package/src/lib/components/sheet/components/sheet-title.svelte +9 -0
  403. package/src/lib/components/sheet/components/sheet-trigger.svelte +8 -0
  404. package/src/lib/components/sheet/index.ts +47 -0
  405. package/src/lib/components/sheet/variants.ts +20 -0
  406. package/src/lib/components/sidebar/constants.ts +6 -0
  407. package/src/lib/components/sidebar/context.svelte.ts +54 -0
  408. package/src/lib/components/sidebar/index.ts +77 -0
  409. package/src/lib/components/sidebar/sidebar-content.svelte +16 -0
  410. package/src/lib/components/sidebar/sidebar-desktop-surface.svelte +60 -0
  411. package/src/lib/components/sidebar/sidebar-footer.svelte +11 -0
  412. package/src/lib/components/sidebar/sidebar-group-action.svelte +34 -0
  413. package/src/lib/components/sidebar/sidebar-group-content.svelte +16 -0
  414. package/src/lib/components/sidebar/sidebar-group-label.svelte +34 -0
  415. package/src/lib/components/sidebar/sidebar-group.svelte +16 -0
  416. package/src/lib/components/sidebar/sidebar-header.svelte +11 -0
  417. package/src/lib/components/sidebar/sidebar-input.svelte +14 -0
  418. package/src/lib/components/sidebar/sidebar-inset.svelte +18 -0
  419. package/src/lib/components/sidebar/sidebar-menu-action.svelte +38 -0
  420. package/src/lib/components/sidebar/sidebar-menu-badge.svelte +19 -0
  421. package/src/lib/components/sidebar/sidebar-menu-button.svelte +99 -0
  422. package/src/lib/components/sidebar/sidebar-menu-item.svelte +21 -0
  423. package/src/lib/components/sidebar/sidebar-menu-skeleton.svelte +34 -0
  424. package/src/lib/components/sidebar/sidebar-menu-sub-button.svelte +40 -0
  425. package/src/lib/components/sidebar/sidebar-menu-sub-item.svelte +16 -0
  426. package/src/lib/components/sidebar/sidebar-menu-sub.svelte +19 -0
  427. package/src/lib/components/sidebar/sidebar-menu.svelte +21 -0
  428. package/src/lib/components/sidebar/sidebar-mobile-surface.svelte +48 -0
  429. package/src/lib/components/sidebar/sidebar-provider.svelte +60 -0
  430. package/src/lib/components/sidebar/sidebar-rail.svelte +36 -0
  431. package/src/lib/components/sidebar/sidebar-separator.svelte +9 -0
  432. package/src/lib/components/sidebar/sidebar-trigger.svelte +35 -0
  433. package/src/lib/components/sidebar/sidebar.svelte +30 -0
  434. package/src/lib/components/sidebar/types.ts +14 -0
  435. package/src/lib/components/skeleton/index.ts +7 -0
  436. package/src/lib/components/skeleton/skeleton.svelte +9 -0
  437. package/src/lib/components/slider/components/slider-range.svelte +37 -0
  438. package/src/lib/components/slider/components/slider-thumb-label.svelte +42 -0
  439. package/src/lib/components/slider/components/slider-thumb.svelte +46 -0
  440. package/src/lib/components/slider/components/slider-tick-label.svelte +42 -0
  441. package/src/lib/components/slider/components/slider-tick.svelte +28 -0
  442. package/src/lib/components/slider/components/slider.svelte +136 -0
  443. package/src/lib/components/slider/helpers.ts +249 -0
  444. package/src/lib/components/slider/index.ts +15 -0
  445. package/src/lib/components/slider/slider.svelte.ts +979 -0
  446. package/src/lib/components/slider/types.ts +294 -0
  447. package/src/lib/components/sonner/Toast.svelte +558 -0
  448. package/src/lib/components/sonner/Toaster.svelte +603 -0
  449. package/src/lib/components/sonner/index.ts +15 -0
  450. package/src/lib/components/sonner/toast-state.svelte.ts +217 -0
  451. package/src/lib/components/sonner/types.ts +384 -0
  452. package/src/lib/components/switch/index.ts +8 -0
  453. package/src/lib/components/switch/switch.svelte +78 -0
  454. package/src/lib/components/table/index.ts +28 -0
  455. package/src/lib/components/table/table-body.svelte +15 -0
  456. package/src/lib/components/table/table-caption.svelte +10 -0
  457. package/src/lib/components/table/table-cell.svelte +14 -0
  458. package/src/lib/components/table/table-footer.svelte +19 -0
  459. package/src/lib/components/table/table-head.svelte +17 -0
  460. package/src/lib/components/table/table-header.svelte +15 -0
  461. package/src/lib/components/table/table-row.svelte +14 -0
  462. package/src/lib/components/table/table.svelte +12 -0
  463. package/src/lib/components/tabs/components/tabs-content.svelte +30 -0
  464. package/src/lib/components/tabs/components/tabs-list.svelte +38 -0
  465. package/src/lib/components/tabs/components/tabs-trigger.svelte +51 -0
  466. package/src/lib/components/tabs/components/tabs.svelte +52 -0
  467. package/src/lib/components/tabs/index.ts +11 -0
  468. package/src/lib/components/tabs/tabs.svelte.ts +253 -0
  469. package/src/lib/components/tabs/types.ts +86 -0
  470. package/src/lib/components/textarea/index.ts +7 -0
  471. package/src/lib/components/textarea/textarea.svelte +23 -0
  472. package/src/lib/components/theme-toggle/index.ts +5 -0
  473. package/src/lib/components/theme-toggle/theme-toggle.svelte +49 -0
  474. package/src/lib/components/theme-toggle/theme.svelte.ts +81 -0
  475. package/src/lib/components/time-field/components/time-field-hidden-input.svelte +9 -0
  476. package/src/lib/components/time-field/components/time-field-input.svelte +33 -0
  477. package/src/lib/components/time-field/components/time-field-label.svelte +29 -0
  478. package/src/lib/components/time-field/components/time-field-segment.svelte +29 -0
  479. package/src/lib/components/time-field/components/time-field.svelte +99 -0
  480. package/src/lib/components/time-field/index.ts +11 -0
  481. package/src/lib/components/time-field/time-field.svelte.ts +1198 -0
  482. package/src/lib/components/time-field/types.ts +174 -0
  483. package/src/lib/components/time-range-field/components/time-range-field-input.svelte +36 -0
  484. package/src/lib/components/time-range-field/components/time-range-field-label.svelte +29 -0
  485. package/src/lib/components/time-range-field/components/time-range-field.svelte +104 -0
  486. package/src/lib/components/time-range-field/index.ts +11 -0
  487. package/src/lib/components/time-range-field/time-range-field.svelte.ts +235 -0
  488. package/src/lib/components/time-range-field/types.ts +181 -0
  489. package/src/lib/components/toggle/components/toggle.svelte +55 -0
  490. package/src/lib/components/toggle/index.ts +3 -0
  491. package/src/lib/components/toggle/toggle.svelte.ts +57 -0
  492. package/src/lib/components/toggle/types.ts +33 -0
  493. package/src/lib/components/toggle/variants.ts +25 -0
  494. package/src/lib/components/toggle-group/components/toggle-group-item.svelte +67 -0
  495. package/src/lib/components/toggle-group/components/toggle-group.svelte +109 -0
  496. package/src/lib/components/toggle-group/index.ts +7 -0
  497. package/src/lib/components/toggle-group/toggle-group.svelte.ts +235 -0
  498. package/src/lib/components/toggle-group/types.ts +89 -0
  499. package/src/lib/components/toolbar/components/toolbar-button.svelte +46 -0
  500. package/src/lib/components/toolbar/components/toolbar-group-item.svelte +56 -0
  501. package/src/lib/components/toolbar/components/toolbar-group.svelte +69 -0
  502. package/src/lib/components/toolbar/components/toolbar-link.svelte +39 -0
  503. package/src/lib/components/toolbar/components/toolbar.svelte +39 -0
  504. package/src/lib/components/toolbar/index.ts +13 -0
  505. package/src/lib/components/toolbar/toolbar.svelte.ts +373 -0
  506. package/src/lib/components/toolbar/types.ts +60 -0
  507. package/src/lib/components/tooltip/components/tooltip-content.svelte +81 -0
  508. package/src/lib/components/tooltip/components/tooltip-provider.svelte +26 -0
  509. package/src/lib/components/tooltip/components/tooltip-trigger.svelte +48 -0
  510. package/src/lib/components/tooltip/components/tooltip.svelte +55 -0
  511. package/src/lib/components/tooltip/index.ts +17 -0
  512. package/src/lib/components/tooltip/tooltip.svelte.ts +796 -0
  513. package/src/lib/components/tooltip/types.ts +175 -0
  514. package/src/lib/components/tooltip/utils.ts +1 -0
  515. package/src/lib/icons/google-icon.svelte +10 -0
  516. package/src/lib/icons/google-workspace.svelte +18 -0
  517. package/src/lib/icons/icon.d.ts +19 -0
  518. package/src/lib/icons/instagram.svelte +9 -0
  519. package/src/lib/icons/instantly.svelte +10 -0
  520. package/src/lib/icons/linkedin.svelte +9 -0
  521. package/src/lib/icons/mailshake.svelte +10 -0
  522. package/src/lib/icons/microsoft-365.svelte +7 -0
  523. package/src/lib/icons/passcode.svelte +12 -0
  524. package/src/lib/icons/replyio.svelte +10 -0
  525. package/src/lib/icons/smartlead.svelte +19 -0
  526. package/src/lib/icons/smtp.svelte +10 -0
  527. package/src/lib/icons/x-logo.svelte +9 -0
  528. package/src/lib/internal/animations-settled.svelte.ts +119 -0
  529. package/src/lib/internal/arrays.ts +253 -0
  530. package/src/lib/internal/attribute-types.ts +53 -0
  531. package/src/lib/internal/attrs.ts +64 -0
  532. package/src/lib/internal/body-scroll-lock.svelte.ts +330 -0
  533. package/src/lib/internal/create-id.ts +12 -0
  534. package/src/lib/internal/date-time/announcer.ts +74 -0
  535. package/src/lib/internal/date-time/calendar-helpers.svelte.ts +399 -0
  536. package/src/lib/internal/date-time/field/helpers.ts +431 -0
  537. package/src/lib/internal/date-time/field/parts.ts +15 -0
  538. package/src/lib/internal/date-time/field/range-field.svelte.ts +45 -0
  539. package/src/lib/internal/date-time/field/segments.ts +89 -0
  540. package/src/lib/internal/date-time/field/time-helpers.ts +311 -0
  541. package/src/lib/internal/date-time/formatter.ts +86 -0
  542. package/src/lib/internal/date-time/placeholders.ts +131 -0
  543. package/src/lib/internal/date-time/types.ts +121 -0
  544. package/src/lib/internal/date-time/utils.ts +243 -0
  545. package/src/lib/internal/dismissible-layer/index.ts +3 -0
  546. package/src/lib/internal/dismissible-layer/scheduler.ts +48 -0
  547. package/src/lib/internal/dismissible-layer/types.ts +57 -0
  548. package/src/lib/internal/dismissible-layer/use-dismissable-layer.svelte.ts +291 -0
  549. package/src/lib/internal/escape-layer/index.ts +3 -0
  550. package/src/lib/internal/escape-layer/types.ts +34 -0
  551. package/src/lib/internal/escape-layer/use-escape-layer.svelte.ts +91 -0
  552. package/src/lib/internal/floating-layer/components/floating-layer-arrow.svelte +35 -0
  553. package/src/lib/internal/floating-layer/components/floating-layer-content-static.svelte +19 -0
  554. package/src/lib/internal/floating-layer/components/floating-layer-content.svelte +52 -0
  555. package/src/lib/internal/floating-layer/components/floating-layer.svelte +12 -0
  556. package/src/lib/internal/floating-layer/components/index.ts +6 -0
  557. package/src/lib/internal/floating-layer/index.ts +2 -0
  558. package/src/lib/internal/floating-layer/types.ts +126 -0
  559. package/src/lib/internal/floating-layer/use-floating-layer.svelte.ts +471 -0
  560. package/src/lib/internal/focus-scope/focus-scope.svelte.ts +310 -0
  561. package/src/lib/internal/focus-scope/index.ts +4 -0
  562. package/src/lib/internal/focus-scope/types.ts +45 -0
  563. package/src/lib/internal/focus.ts +14 -0
  564. package/src/lib/internal/global-singleton.ts +10 -0
  565. package/src/lib/internal/group-value.svelte.ts +36 -0
  566. package/src/lib/internal/hover-intent-geometry.ts +96 -0
  567. package/src/lib/internal/index.ts +44 -0
  568. package/src/lib/internal/kbd.ts +60 -0
  569. package/src/lib/internal/layer-stack.ts +37 -0
  570. package/src/lib/internal/math.ts +11 -0
  571. package/src/lib/internal/merge-props.ts +7 -0
  572. package/src/lib/internal/native-dialog-controller.svelte.ts +102 -0
  573. package/src/lib/internal/native-popover.svelte.ts +173 -0
  574. package/src/lib/internal/open-cell.svelte.ts +41 -0
  575. package/src/lib/internal/paneforge/index.ts +5 -0
  576. package/src/lib/internal/paneforge/internal/constants.ts +2 -0
  577. package/src/lib/internal/paneforge/internal/helpers.ts +354 -0
  578. package/src/lib/internal/paneforge/internal/types.ts +33 -0
  579. package/src/lib/internal/paneforge/internal/utils/adjust-layout.ts +122 -0
  580. package/src/lib/internal/paneforge/internal/utils/aria.ts +36 -0
  581. package/src/lib/internal/paneforge/internal/utils/compare.ts +15 -0
  582. package/src/lib/internal/paneforge/internal/utils/is.ts +13 -0
  583. package/src/lib/internal/paneforge/internal/utils/resize.ts +31 -0
  584. package/src/lib/internal/paneforge/internal/utils/storage.ts +116 -0
  585. package/src/lib/internal/paneforge/internal/utils/style.ts +104 -0
  586. package/src/lib/internal/paneforge/pane-group.svelte +48 -0
  587. package/src/lib/internal/paneforge/pane-resizer.svelte +40 -0
  588. package/src/lib/internal/paneforge/pane.svelte +60 -0
  589. package/src/lib/internal/paneforge/paneforge.svelte.ts +821 -0
  590. package/src/lib/internal/paneforge/types.ts +179 -0
  591. package/src/lib/internal/popper-layer/index.ts +2 -0
  592. package/src/lib/internal/popper-layer/popper-content.svelte +19 -0
  593. package/src/lib/internal/popper-layer/popper-layer-inner.svelte +122 -0
  594. package/src/lib/internal/popper-layer/popper-layer.svelte +71 -0
  595. package/src/lib/internal/popper-layer/types.ts +65 -0
  596. package/src/lib/internal/portal/index.ts +2 -0
  597. package/src/lib/internal/portal/portal.svelte +61 -0
  598. package/src/lib/internal/prop-resolvers.ts +14 -0
  599. package/src/lib/internal/roving-focus-group.ts +147 -0
  600. package/src/lib/internal/roving-focus-item.svelte.ts +51 -0
  601. package/src/lib/internal/safe-polygon.svelte.ts +239 -0
  602. package/src/lib/internal/shared-state.svelte.ts +39 -0
  603. package/src/lib/internal/state-machine.ts +32 -0
  604. package/src/lib/internal/svelte-resize-observer.svelte.ts +37 -0
  605. package/src/lib/internal/tabbable.ts +398 -0
  606. package/src/lib/internal/table/core.ts +53 -0
  607. package/src/lib/internal/table/filter-fns.ts +10 -0
  608. package/src/lib/internal/table/index.ts +2 -0
  609. package/src/lib/internal/table/sorting-fns.ts +84 -0
  610. package/src/lib/internal/table/table.svelte.ts +330 -0
  611. package/src/lib/internal/table/types.ts +33 -0
  612. package/src/lib/internal/timeout-fn.svelte.ts +36 -0
  613. package/src/lib/internal/tools/box.svelte.ts +153 -0
  614. package/src/lib/internal/tools/index.ts +22 -0
  615. package/src/lib/internal/tools/types.ts +44 -0
  616. package/src/lib/internal/tools/utils/attach-ref.ts +74 -0
  617. package/src/lib/internal/tools/utils/compose-handlers.ts +36 -0
  618. package/src/lib/internal/tools/utils/dom-context.svelte.ts +63 -0
  619. package/src/lib/internal/tools/utils/dom.ts +62 -0
  620. package/src/lib/internal/tools/utils/events.ts +1 -0
  621. package/src/lib/internal/tools/utils/index.ts +5 -0
  622. package/src/lib/internal/tools/utils/strings.ts +28 -0
  623. package/src/lib/internal/typeahead.svelte.ts +48 -0
  624. package/src/lib/internal/types.ts +119 -0
  625. package/src/lib/internal/utils.ts +10 -0
  626. package/src/lib/internal/vaul/browser.ts +8 -0
  627. package/src/lib/internal/vaul/constants.ts +19 -0
  628. package/src/lib/internal/vaul/helpers.ts +39 -0
  629. package/src/lib/internal/vaul/types.ts +142 -0
  630. package/src/lib/internal/vaul/use-drawer-content.svelte.ts +219 -0
  631. package/src/lib/internal/vaul/use-drawer-root.svelte.ts +682 -0
  632. package/src/lib/internal/vaul/use-position-fixed.svelte.ts +142 -0
  633. package/src/lib/internal/vaul/use-prevent-scroll.svelte.ts +267 -0
  634. package/src/lib/internal/vaul/use-snap-points.svelte.ts +246 -0
  635. package/src/lib/time.ts +73 -0
@@ -0,0 +1,682 @@
1
+ import { simpleBox, type ReadableBoxedValues, type WritableBoxedValues } from '../tools/index.js';
2
+ import type { DrawerDirection } from './types.js';
3
+ import { useSnapPoints } from './use-snap-points.svelte.js';
4
+ import { isInput, usePreventScroll } from './use-prevent-scroll.svelte.js';
5
+ import { usePositionFixed } from './use-position-fixed.svelte.js';
6
+ import {
7
+ BORDER_RADIUS,
8
+ DRAG_CLASS,
9
+ NESTED_DISPLACEMENT,
10
+ TRANSITIONS,
11
+ VELOCITY_THRESHOLD,
12
+ WINDOW_TOP_OFFSET,
13
+ } from './constants.js';
14
+ import { isIOSFirefox } from './browser.js';
15
+ import { isIOS, selfAndAncestors } from '../tools/utils/dom.js';
16
+ import { on } from 'svelte/events';
17
+ import { createContext, tick, untrack } from 'svelte';
18
+ import { assignStyle, applyStyle, dampenValue, getTranslate, isVertical } from './helpers.js';
19
+
20
+ export type DrawerContext = ReturnType<typeof useDrawerRoot>;
21
+ const [getDrawer, setDrawer] = createContext<DrawerContext>();
22
+ export { getDrawer };
23
+
24
+ type UseDrawerRootProps = ReadableBoxedValues<{
25
+ closeThreshold: number;
26
+ shouldScaleBackground: boolean;
27
+ scrollLockTimeout: number;
28
+ snapPoints: (string | number)[] | undefined;
29
+ fadeFromIndex: number | undefined;
30
+ fixed: boolean;
31
+ dismissible: boolean;
32
+ direction: DrawerDirection;
33
+ onDrag: (event: PointerEvent, percentageDragged: number) => void;
34
+ onRelease: (event: PointerEvent, open: boolean) => void;
35
+ nested: boolean;
36
+ onClose: () => void;
37
+ modal: boolean;
38
+ handleOnly: boolean;
39
+ noBodyStyles: boolean;
40
+ preventScrollRestoration: boolean;
41
+ setBackgroundColorOnScale: boolean;
42
+ container: HTMLElement | null;
43
+ snapToSequentialPoint: boolean;
44
+ repositionInputs: boolean;
45
+ autoFocus: boolean;
46
+ disablePreventScroll: boolean;
47
+ onOpenChange: (o: boolean) => void;
48
+ onAnimationEnd: (open: boolean) => void;
49
+ }> &
50
+ WritableBoxedValues<{
51
+ open: boolean;
52
+ activeSnapPoint: number | string | null;
53
+ }>;
54
+
55
+ export function useDrawerRoot(opts: UseDrawerRootProps) {
56
+ let hasBeenOpened = $state(false);
57
+ let isDragging = $state(false);
58
+ let justReleased = $state(false);
59
+ let overlayNode = $state<HTMLElement | null>(null);
60
+ let drawerNode = $state<HTMLElement | null>(null);
61
+ let openTime: number | null = null;
62
+ let dragStartTime: number | null = null;
63
+ let lastTimeDragPrevented: number | null = null;
64
+ let isAllowedToDrag = false;
65
+ let nestedTransitionCleanup: (() => void) | null = null;
66
+ let pointerStart = 0;
67
+ let keyboardIsOpen = simpleBox(false);
68
+ let shouldAnimate = $state(!opts.open.current);
69
+ let previousDiffFromInitial = 0;
70
+ let drawerHeight = 0;
71
+ let drawerWidth = 0;
72
+ let initialDrawerHeight = 0;
73
+ let isReleasing = false;
74
+
75
+ const snapPointsState = useSnapPoints({
76
+ snapPoints: opts.snapPoints,
77
+ drawerNode: () => drawerNode,
78
+ activeSnapPoint: opts.activeSnapPoint,
79
+ container: opts.container,
80
+ direction: opts.direction,
81
+ fadeFromIndex: opts.fadeFromIndex,
82
+ overlayNode: () => overlayNode,
83
+ setOpenTime: (time) => {
84
+ openTime = time;
85
+ },
86
+ snapToSequentialPoint: opts.snapToSequentialPoint,
87
+ open: opts.open,
88
+ isReleasing: () => isReleasing,
89
+ });
90
+
91
+ usePreventScroll({
92
+ isDisabled: () =>
93
+ !opts.open.current ||
94
+ isDragging ||
95
+ !opts.modal.current ||
96
+ justReleased ||
97
+ !hasBeenOpened ||
98
+ !opts.repositionInputs.current ||
99
+ !opts.disablePreventScroll.current,
100
+ });
101
+
102
+ const { restorePositionSetting } = usePositionFixed({
103
+ ...opts,
104
+ hasBeenOpened: () => hasBeenOpened,
105
+ });
106
+
107
+ function getScale() {
108
+ return (window.innerWidth - WINDOW_TOP_OFFSET) / window.innerWidth;
109
+ }
110
+
111
+ function onPress(event: PointerEvent) {
112
+ if (!opts.dismissible.current && !opts.snapPoints.current) return;
113
+ if (drawerNode && !drawerNode.contains(event.target as Node)) return;
114
+
115
+ drawerHeight = drawerNode?.getBoundingClientRect().height || 0;
116
+ drawerWidth = drawerNode?.getBoundingClientRect().width || 0;
117
+ isDragging = true;
118
+ dragStartTime = event.timeStamp;
119
+
120
+ // iOS doesn't trigger mouseUp after scrolling so we need to listen to touched in order to disallow dragging
121
+ if (isIOS) {
122
+ on(window, 'touchend', () => (isAllowedToDrag = false), { once: true });
123
+ }
124
+ // Ensure we maintain correct pointer capture even when going outside of the drawer
125
+ (event.target as HTMLElement).setPointerCapture(event.pointerId);
126
+ pointerStart = isVertical(opts.direction.current) ? event.pageY : event.pageX;
127
+ }
128
+
129
+ function shouldDrag(el: EventTarget, isDraggingInDirection: boolean) {
130
+ const element = el as HTMLElement;
131
+ const highlightedText = window.getSelection()?.toString();
132
+ const swipeAmount = drawerNode ? getTranslate(drawerNode, opts.direction.current) : null;
133
+ // performance.now() shares PointerEvent.timeStamp's monotonic time origin, so the two mix safely.
134
+ const now = performance.now();
135
+
136
+ // Fixes https://github.com/emilkowalski/vaul/issues/483
137
+ if (element.tagName === 'SELECT') return false;
138
+
139
+ if (element.hasAttribute('data-vaul-no-drag') || element.closest('[data-vaul-no-drag]')) {
140
+ return false;
141
+ }
142
+
143
+ if (opts.direction.current === 'right' || opts.direction.current === 'left') {
144
+ return true;
145
+ }
146
+
147
+ // Allow scrolling when animating
148
+ if (openTime && now - openTime < TRANSITIONS.DURATION * 1000) {
149
+ return false;
150
+ }
151
+
152
+ if (swipeAmount !== null) {
153
+ if (opts.direction.current === 'bottom' ? swipeAmount > 0 : swipeAmount < 0) {
154
+ return true;
155
+ }
156
+ }
157
+
158
+ // Don't drag if there's highlighted text
159
+ if (highlightedText && highlightedText.length > 0) {
160
+ return false;
161
+ }
162
+
163
+ // Disallow dragging if drawer was scrolled within `scrollLockTimeout`
164
+ if (lastTimeDragPrevented && now - lastTimeDragPrevented < opts.scrollLockTimeout.current && swipeAmount === 0) {
165
+ lastTimeDragPrevented = now;
166
+ return false;
167
+ }
168
+
169
+ if (isDraggingInDirection) {
170
+ lastTimeDragPrevented = now;
171
+
172
+ // We are dragging down so we should allow scrolling
173
+ return false;
174
+ }
175
+
176
+ // Keep climbing up the DOM tree as long as there's a parent
177
+ for (const ancestor of selfAndAncestors(element)) {
178
+ // Check if the element is scrollable
179
+ if (ancestor.scrollHeight > ancestor.clientHeight) {
180
+ if (ancestor.scrollTop !== 0) {
181
+ lastTimeDragPrevented = performance.now();
182
+
183
+ // The element is scrollable and not scrolled to the top, so don't drag
184
+ return false;
185
+ }
186
+
187
+ if (ancestor.getAttribute('role') === 'dialog') {
188
+ return true;
189
+ }
190
+ }
191
+ }
192
+
193
+ // No scrollable parents not scrolled to the top found, so drag
194
+ return true;
195
+ }
196
+
197
+ function onDrag(event: PointerEvent) {
198
+ if (!drawerNode || !isDragging) return;
199
+
200
+ // We need to know how much of the drawer has been dragged in percentages so that we can transform background accordingly
201
+ const directionMultiplier = opts.direction.current === 'bottom' || opts.direction.current === 'right' ? 1 : -1;
202
+ const draggedDistance = (pointerStart - (isVertical(opts.direction.current) ? event.pageY : event.pageX)) * directionMultiplier;
203
+ const isDraggingInDirection = draggedDistance > 0;
204
+
205
+ // Pre condition for disallowing dragging in the close direction.
206
+ const noCloseSnapPointsPreCondition = opts.snapPoints.current && !opts.dismissible.current && !isDraggingInDirection;
207
+
208
+ // Disallow dragging down to close when first snap point is the active one and dismissible prop is set to false.
209
+ if (noCloseSnapPointsPreCondition && snapPointsState.activeSnapPointIndex === 0) return;
210
+
211
+ // We need to capture last time when drag with scroll was triggered and have a timeout between
212
+ const absDraggedDistance = Math.abs(draggedDistance);
213
+ const wrapper = document.querySelector('[data-vaul-drawer-wrapper]');
214
+ const drawerDimension = opts.direction.current === 'bottom' || opts.direction.current === 'top' ? drawerHeight : drawerWidth;
215
+
216
+ // Calculate the percentage dragged, where 1 is the closed position
217
+ let percentageDragged = absDraggedDistance / drawerDimension;
218
+ const snapPointPercentageDragged = snapPointsState.getPercentageDragged(absDraggedDistance, isDraggingInDirection);
219
+
220
+ if (snapPointPercentageDragged !== null) {
221
+ percentageDragged = snapPointPercentageDragged;
222
+ }
223
+
224
+ // Disallow close dragging beyond the smallest snap point.
225
+ if (noCloseSnapPointsPreCondition && percentageDragged >= 1) {
226
+ return;
227
+ }
228
+
229
+ if (!isAllowedToDrag && !shouldDrag(event.target!, isDraggingInDirection)) return;
230
+ // The class suppresses the stylesheet transitions on both nodes while dragging.
231
+ drawerNode.classList.add(DRAG_CLASS);
232
+ overlayNode?.classList.add(DRAG_CLASS);
233
+ // If shouldDrag gave true once after pressing down on the drawer, we set isAllowedToDrag to true and it will remain true until we let go, there's no reason to disable dragging mid way, ever, and that's the solution to it
234
+ isAllowedToDrag = true;
235
+
236
+ if (opts.snapPoints.current) {
237
+ snapPointsState.onDrag({ draggedDistance });
238
+ }
239
+
240
+ // Run this only if snapPoints are not defined or if we are at the last snap point (highest one)
241
+ if (isDraggingInDirection && !opts.snapPoints.current) {
242
+ const dampenedDraggedDistance = dampenValue(draggedDistance);
243
+
244
+ const translateValue = Math.min(dampenedDraggedDistance * -1, 0) * directionMultiplier;
245
+ assignStyle(drawerNode, {
246
+ transform: isVertical(opts.direction.current) ? `translate3d(0, ${translateValue}px, 0)` : `translate3d(${translateValue}px, 0, 0)`,
247
+ });
248
+ return;
249
+ }
250
+
251
+ const opacityValue = 1 - percentageDragged;
252
+
253
+ if (
254
+ snapPointsState.shouldFade ||
255
+ (opts.fadeFromIndex.current && snapPointsState.activeSnapPointIndex === opts.fadeFromIndex.current - 1)
256
+ ) {
257
+ opts.onDrag.current?.(event, percentageDragged);
258
+
259
+ applyStyle(overlayNode, {
260
+ opacity: `${opacityValue}`,
261
+ });
262
+ }
263
+
264
+ if (wrapper && overlayNode && opts.shouldScaleBackground.current) {
265
+ // Calculate percentageDragged as a fraction (0 to 1)
266
+ const scaleValue = Math.min(getScale() + percentageDragged * (1 - getScale()), 1);
267
+ const borderRadiusValue = 8 - percentageDragged * 8;
268
+
269
+ const translateValue = Math.max(0, 14 - percentageDragged * 14);
270
+
271
+ applyStyle(wrapper, {
272
+ borderRadius: `${borderRadiusValue}px`,
273
+ transform: isVertical(opts.direction.current)
274
+ ? `scale(${scaleValue}) translate3d(0, ${translateValue}px, 0)`
275
+ : `scale(${scaleValue}) translate3d(${translateValue}px, 0, 0)`,
276
+ transition: 'none',
277
+ });
278
+ }
279
+
280
+ if (!opts.snapPoints.current) {
281
+ const translateValue = absDraggedDistance * directionMultiplier;
282
+ applyStyle(drawerNode, {
283
+ transform: isVertical(opts.direction.current) ? `translate3d(0, ${translateValue}px, 0)` : `translate3d(${translateValue}px, 0, 0)`,
284
+ });
285
+ }
286
+ }
287
+
288
+ $effect(() => {
289
+ window.requestAnimationFrame(() => {
290
+ shouldAnimate = true;
291
+ });
292
+ });
293
+
294
+ function onDialogOpenChange(o: boolean) {
295
+ if (!opts.dismissible.current && !o) return;
296
+ if (o) {
297
+ hasBeenOpened = true;
298
+ } else {
299
+ closeDrawer(true);
300
+ }
301
+
302
+ opts.open.current = o;
303
+ handleOpenChange(o);
304
+ }
305
+
306
+ function onVisualViewportChange() {
307
+ if (!drawerNode || !opts.repositionInputs.current) return;
308
+
309
+ const focusedElement = document.activeElement as HTMLElement;
310
+ if (isInput(focusedElement) || keyboardIsOpen.current) {
311
+ const visualViewportHeight = window.visualViewport?.height || 0;
312
+ const totalHeight = window.innerHeight;
313
+ // This is the height of the keyboard
314
+ let diffFromInitial = totalHeight - visualViewportHeight;
315
+ const drawerHeight = drawerNode.getBoundingClientRect().height || 0;
316
+ // Adjust drawer height only if it's tall enough
317
+ const isTallEnough = drawerHeight > totalHeight * 0.8;
318
+
319
+ if (!initialDrawerHeight) {
320
+ initialDrawerHeight = drawerHeight;
321
+ }
322
+ const offsetFromTop = drawerNode.getBoundingClientRect().top;
323
+
324
+ // visualViewport height may change due to some subtle changes to the keyboard. Checking if the height changed by 60 or more will make sure that they keyboard really changed its open state.
325
+ if (Math.abs(previousDiffFromInitial - diffFromInitial) > 60) {
326
+ keyboardIsOpen.current = !keyboardIsOpen.current;
327
+ }
328
+
329
+ if (
330
+ opts.snapPoints.current &&
331
+ opts.snapPoints.current.length > 0 &&
332
+ snapPointsState.snapPointsOffset &&
333
+ snapPointsState.activeSnapPointIndex
334
+ ) {
335
+ const activeSnapPointHeight = snapPointsState.snapPointsOffset[snapPointsState.activeSnapPointIndex] || 0;
336
+ diffFromInitial += activeSnapPointHeight;
337
+ }
338
+ previousDiffFromInitial = diffFromInitial;
339
+ // We don't have to change the height if the input is in view, when we are here we are in the opened keyboard state so we can correctly check if the input is in view
340
+ if (drawerHeight > visualViewportHeight || keyboardIsOpen.current) {
341
+ const height = drawerNode.getBoundingClientRect().height;
342
+ let newDrawerHeight = height;
343
+
344
+ if (height > visualViewportHeight) {
345
+ newDrawerHeight = visualViewportHeight - (isTallEnough ? offsetFromTop : WINDOW_TOP_OFFSET);
346
+ }
347
+ // When fixed, don't move the drawer upwards if there's space, but rather only change it's height so it's fully scrollable when the keyboard is open
348
+ if (opts.fixed.current) {
349
+ drawerNode.style.height = `${height - Math.max(diffFromInitial, 0)}px`;
350
+ } else {
351
+ drawerNode.style.height = `${Math.max(newDrawerHeight, visualViewportHeight - offsetFromTop)}px`;
352
+ }
353
+ } else if (!isIOSFirefox()) {
354
+ drawerNode.style.height = `${initialDrawerHeight}px`;
355
+ }
356
+
357
+ if (opts.snapPoints.current && opts.snapPoints.current.length > 0 && !keyboardIsOpen.current) {
358
+ drawerNode.style.bottom = `0px`;
359
+ } else {
360
+ // Negative bottom value would never make sense
361
+ drawerNode.style.bottom = `${Math.max(diffFromInitial, 0)}px`;
362
+ }
363
+ }
364
+ }
365
+
366
+ $effect(() => {
367
+ if (!window.visualViewport) return;
368
+ return on(window.visualViewport, 'resize', onVisualViewportChange);
369
+ });
370
+
371
+ function cancelDrag() {
372
+ if (!isDragging || !drawerNode) return;
373
+
374
+ drawerNode.classList.remove(DRAG_CLASS);
375
+ overlayNode?.classList.remove(DRAG_CLASS);
376
+ isAllowedToDrag = false;
377
+ isDragging = false;
378
+ }
379
+
380
+ function closeDrawer(fromWithin?: boolean) {
381
+ cancelDrag();
382
+ opts.onClose?.current();
383
+
384
+ if (!fromWithin) {
385
+ opts.open.current = false;
386
+ handleOpenChange(false);
387
+ }
388
+ }
389
+
390
+ function resetDrawer() {
391
+ if (!drawerNode) return;
392
+
393
+ const wrapper = document.querySelector('[data-vaul-drawer-wrapper]');
394
+ const currentSwipeAmount = getTranslate(drawerNode, opts.direction.current);
395
+
396
+ applyStyle(drawerNode, {
397
+ transform: 'translate3d(0, 0, 0)',
398
+ });
399
+ // Clear inline values so the stylesheet transitions and rest-state opacity take
400
+ // back over (a nested-close freeze can leave an inline `transition: none` behind).
401
+ drawerNode.style.removeProperty('transition');
402
+ overlayNode?.style.removeProperty('opacity');
403
+ overlayNode?.style.removeProperty('transition');
404
+
405
+ if (opts.shouldScaleBackground.current && currentSwipeAmount && currentSwipeAmount > 0 && opts.open.current) {
406
+ applyStyle(wrapper, {
407
+ borderRadius: `${BORDER_RADIUS}px`,
408
+ overflow: 'hidden',
409
+ ...(isVertical(opts.direction.current)
410
+ ? {
411
+ transform: `scale(${getScale()}) translate3d(0, calc(env(safe-area-inset-top) + 14px), 0)`,
412
+ transformOrigin: 'top',
413
+ }
414
+ : {
415
+ transform: `scale(${getScale()}) translate3d(calc(env(safe-area-inset-top) + 14px), 0, 0)`,
416
+ transformOrigin: 'left',
417
+ }),
418
+ transitionProperty: 'transform, border-radius',
419
+ transitionDuration: `${TRANSITIONS.DURATION}s`,
420
+ transitionTimingFunction: `cubic-bezier(${TRANSITIONS.EASE.join(',')})`,
421
+ });
422
+ }
423
+ }
424
+
425
+ function onRelease(event: PointerEvent | null) {
426
+ // We keep track of whether we are releasing or not
427
+ // because we need to differentiate release from outside click/escape keydown
428
+ isReleasing = true;
429
+ handleRelease(event);
430
+ tick().then(() => {
431
+ isReleasing = false;
432
+ });
433
+ }
434
+
435
+ function handleRelease(event: PointerEvent | null) {
436
+ if (!isDragging || !drawerNode) return;
437
+
438
+ drawerNode.classList.remove(DRAG_CLASS);
439
+ overlayNode?.classList.remove(DRAG_CLASS);
440
+ isAllowedToDrag = false;
441
+ isDragging = false;
442
+ const swipeAmount = getTranslate(drawerNode, opts.direction.current);
443
+
444
+ if (!event || (event.target && !shouldDrag(event.target, false)) || !swipeAmount || Number.isNaN(swipeAmount)) {
445
+ return;
446
+ }
447
+
448
+ if (dragStartTime === null) return;
449
+
450
+ const timeTaken = event.timeStamp - dragStartTime;
451
+ const distMoved = pointerStart - (isVertical(opts.direction.current) ? event.pageY : event.pageX);
452
+ const velocity = Math.abs(distMoved) / timeTaken;
453
+
454
+ if (velocity > 0.05) {
455
+ // `justReleased` is needed to prevent the drawer from focusing on an input when the drag ends, as it's not the intent most of the time.
456
+ justReleased = true;
457
+
458
+ setTimeout(() => {
459
+ justReleased = false;
460
+ }, 200);
461
+ }
462
+
463
+ if (opts.snapPoints.current) {
464
+ const directionMultiplier = opts.direction.current === 'bottom' || opts.direction.current === 'right' ? 1 : -1;
465
+ snapPointsState.onRelease({
466
+ draggedDistance: distMoved * directionMultiplier,
467
+ closeDrawer,
468
+ velocity,
469
+ dismissible: opts.dismissible.current,
470
+ });
471
+ opts.onRelease.current?.(event, true);
472
+ return;
473
+ }
474
+
475
+ // Moved upwards, don't do anything
476
+ if (opts.direction.current === 'bottom' || opts.direction.current === 'right' ? distMoved > 0 : distMoved < 0) {
477
+ resetDrawer();
478
+ opts.onRelease.current?.(event, true);
479
+ return;
480
+ }
481
+
482
+ if (velocity > VELOCITY_THRESHOLD) {
483
+ closeDrawer();
484
+ opts.onRelease.current?.(event, false);
485
+ return;
486
+ }
487
+
488
+ const visibleDrawerHeight = Math.min(drawerNode.getBoundingClientRect().height ?? 0, window.innerHeight);
489
+ const visibleDrawerWidth = Math.min(drawerNode.getBoundingClientRect().width ?? 0, window.innerWidth);
490
+
491
+ const isHorizontalSwipe = opts.direction.current === 'left' || opts.direction.current === 'right';
492
+ if (Math.abs(swipeAmount) >= (isHorizontalSwipe ? visibleDrawerWidth : visibleDrawerHeight) * opts.closeThreshold.current) {
493
+ closeDrawer();
494
+ opts.onRelease.current?.(event, false);
495
+ return;
496
+ }
497
+
498
+ opts.onRelease.current?.(event, true);
499
+ resetDrawer();
500
+ }
501
+
502
+ $effect(() => {
503
+ const _open = opts.open.current;
504
+
505
+ return untrack(() => {
506
+ if (!opts.open.current) return;
507
+
508
+ openTime = performance.now();
509
+
510
+ return assignStyle(document.documentElement, {
511
+ scrollBehavior: 'auto',
512
+ });
513
+ });
514
+ });
515
+
516
+ function onNestedOpenChange(o: boolean) {
517
+ const scale = o ? (window.innerWidth - NESTED_DISPLACEMENT) / window.innerWidth : 1;
518
+
519
+ const initialTranslate = o ? -NESTED_DISPLACEMENT : 0;
520
+
521
+ nestedTransitionCleanup?.();
522
+
523
+ applyStyle(drawerNode, {
524
+ transition: `transform ${TRANSITIONS.DURATION}s cubic-bezier(${TRANSITIONS.EASE.join(',')})`,
525
+ transform: isVertical(opts.direction.current)
526
+ ? `scale(${scale}) translate3d(0, ${initialTranslate}px, 0)`
527
+ : `scale(${scale}) translate3d(${initialTranslate}px, 0, 0)`,
528
+ });
529
+
530
+ if (!o && drawerNode) {
531
+ // Freeze the un-scale transition's end state as a plain translate once it actually
532
+ // finishes; a canceled transition (a new drag grabbed the node) must not be frozen.
533
+ const node = drawerNode;
534
+ const offEnd = on(node, 'transitionend', (e) => {
535
+ if (e.target !== node || e.propertyName !== 'transform') return;
536
+ cleanup();
537
+ const translateValue = getTranslate(node, opts.direction.current);
538
+ applyStyle(node, {
539
+ transition: 'none',
540
+ transform: isVertical(opts.direction.current)
541
+ ? `translate3d(0, ${translateValue}px, 0)`
542
+ : `translate3d(${translateValue}px, 0, 0)`,
543
+ });
544
+ });
545
+ const offCancel = on(node, 'transitioncancel', (e) => {
546
+ if (e.target !== node || e.propertyName !== 'transform') return;
547
+ cleanup();
548
+ });
549
+ const cleanup = () => {
550
+ offEnd();
551
+ offCancel();
552
+ nestedTransitionCleanup = null;
553
+ };
554
+ nestedTransitionCleanup = cleanup;
555
+ }
556
+ }
557
+
558
+ function onNestedDrag(_event: PointerEvent, percentageDragged: number) {
559
+ if (percentageDragged < 0) return;
560
+
561
+ const initialScale = (window.innerWidth - NESTED_DISPLACEMENT) / window.innerWidth;
562
+ const newScale = initialScale + percentageDragged * (1 - initialScale);
563
+ const newTranslate = -NESTED_DISPLACEMENT + percentageDragged * NESTED_DISPLACEMENT;
564
+
565
+ applyStyle(drawerNode, {
566
+ transform: isVertical(opts.direction.current)
567
+ ? `scale(${newScale}) translate3d(0, ${newTranslate}px, 0)`
568
+ : `scale(${newScale}) translate3d(${newTranslate}px, 0, 0)`,
569
+ transition: 'none',
570
+ });
571
+ }
572
+
573
+ function onNestedRelease(_event: PointerEvent, o: boolean) {
574
+ const dim = isVertical(opts.direction.current) ? window.innerHeight : window.innerWidth;
575
+ const scale = o ? (dim - NESTED_DISPLACEMENT) / dim : 1;
576
+ const translate = o ? -NESTED_DISPLACEMENT : 0;
577
+
578
+ if (o) {
579
+ applyStyle(drawerNode, {
580
+ transition: `transform ${TRANSITIONS.DURATION}s cubic-bezier(${TRANSITIONS.EASE.join(',')})`,
581
+ transform: isVertical(opts.direction.current)
582
+ ? `scale(${scale}) translate3d(0, ${translate}px, 0)`
583
+ : `scale(${scale}) translate3d(${translate}px, 0, 0)`,
584
+ });
585
+ }
586
+ }
587
+
588
+ let bodyStyles = '';
589
+
590
+ function handleOpenChange(o: boolean) {
591
+ opts.onOpenChange.current?.(o);
592
+ if (o && !opts.nested.current) {
593
+ bodyStyles = document.body.style.cssText;
594
+ }
595
+
596
+ if (!o && !opts.nested.current) {
597
+ restorePositionSetting();
598
+ }
599
+
600
+ if (o && !opts.modal.current) {
601
+ window.requestAnimationFrame(() => {
602
+ document.body.style.pointerEvents = 'auto';
603
+ });
604
+ }
605
+
606
+ if (!o) {
607
+ // Restored with the rest of body styles after the exit animation completes.
608
+ document.body.style.pointerEvents = 'auto';
609
+ }
610
+ }
611
+
612
+ function handleOpenChangeComplete(o: boolean) {
613
+ if (!o && opts.snapPoints.current && opts.snapPoints.current.length > 0) {
614
+ opts.activeSnapPoint.current = opts.snapPoints.current[0]!;
615
+ }
616
+
617
+ if (!o && !opts.nested.current) {
618
+ document.body.style.cssText = bodyStyles;
619
+ }
620
+
621
+ opts.onAnimationEnd.current?.(o);
622
+ }
623
+
624
+ $effect(() => {
625
+ const _modal = opts.modal.current;
626
+ untrack(() => {
627
+ if (!opts.modal.current) {
628
+ window.requestAnimationFrame(() => {
629
+ document.body.style.pointerEvents = 'auto';
630
+ });
631
+ }
632
+ });
633
+ });
634
+
635
+ function setOverlayNode(node: HTMLElement | null) {
636
+ overlayNode = node;
637
+ }
638
+
639
+ function setDrawerNode(node: HTMLElement | null) {
640
+ drawerNode = node;
641
+ }
642
+
643
+ // Only what descendants (getDrawer) and the root component actually read; the
644
+ // machine's remaining locals stay private.
645
+ const ctx = {
646
+ open: opts.open,
647
+ snapPoints: opts.snapPoints,
648
+ modal: opts.modal,
649
+ direction: opts.direction,
650
+ shouldScaleBackground: opts.shouldScaleBackground,
651
+ setBackgroundColorOnScale: opts.setBackgroundColorOnScale,
652
+ noBodyStyles: opts.noBodyStyles,
653
+ handleOnly: opts.handleOnly,
654
+ container: opts.container,
655
+ autoFocus: opts.autoFocus,
656
+ keyboardIsOpen,
657
+ setDrawerNode,
658
+ setOverlayNode,
659
+ onPress,
660
+ onDrag,
661
+ onRelease,
662
+ onNestedDrag,
663
+ onNestedOpenChange,
664
+ onNestedRelease,
665
+ onDialogOpenChange,
666
+ handleOpenChangeComplete,
667
+ get shouldAnimate() {
668
+ return shouldAnimate;
669
+ },
670
+ get shouldFade() {
671
+ return snapPointsState.shouldFade;
672
+ },
673
+ get snapPointsOffset() {
674
+ return snapPointsState.snapPointsOffset;
675
+ },
676
+ get activeSnapPointIndex() {
677
+ return snapPointsState.activeSnapPointIndex;
678
+ },
679
+ };
680
+ setDrawer(ctx);
681
+ return ctx;
682
+ }