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,102 @@
1
+ import type { EscapeBehaviorType } from './escape-layer/types.js';
2
+ import type { InteractOutsideBehaviorType } from './dismissible-layer/types.js';
3
+ import { getTabbableCandidates } from './tabbable.js';
4
+ import { createSettleRunner } from './animations-settled.svelte.js';
5
+ import type { Getter } from './tools/index.js';
6
+ import { createAttachmentKey, type Attachment } from 'svelte/attachments';
7
+ import { on } from 'svelte/events';
8
+ import { getAbortSignal } from 'svelte';
9
+
10
+ type NativeDialogControllerOptions = {
11
+ open: Getter<boolean>;
12
+ onClose: () => void;
13
+ outsideEvent?: 'pointerdown' | 'click';
14
+ onInteractOutside?: Getter<(event: PointerEvent) => void>;
15
+ interactOutsideBehavior?: Getter<InteractOutsideBehaviorType>;
16
+ onEscapeKeydown?: Getter<(event: KeyboardEvent) => void>;
17
+ escapeKeydownBehavior?: Getter<EscapeBehaviorType>;
18
+ trapFocus?: Getter<boolean>;
19
+ };
20
+
21
+ /**
22
+ * Bridges declarative open state to the native dialog top layer and centralizes native dismissal,
23
+ * veto, cleanup, and optional sequential-focus wrapping. Visual policy stays with each adapter.
24
+ */
25
+ export function nativeDialogControllerAttachment(options: NativeDialogControllerOptions) {
26
+ const controller = ((node: HTMLDialogElement) => {
27
+ // Every dismissal routes through options.onClose() → root state → this effect, never
28
+ // node.close() directly: close() hides the dialog the same frame (`overlay` is
29
+ // Chromium-only and WebKit doesn't start display/top-layer transitions at all —
30
+ // bug 275184), so the exit ride is a data-[state=closed] keyframe animation played
31
+ // while the dialog is still open, and close() fires only once it settles.
32
+ const closeSettle = createSettleRunner({ subtree: false });
33
+ $effect(() => {
34
+ if (options.open()) {
35
+ closeSettle.cancel();
36
+ if (!node.open) node.showModal();
37
+ } else if (node.open) {
38
+ // An open flip re-runs this effect and cancels the runner first; node.open covers a
39
+ // UA-initiated close in the meantime.
40
+ closeSettle.run(node, () => {
41
+ if (node.open) node.close();
42
+ });
43
+ }
44
+ });
45
+
46
+ const signal = getAbortSignal();
47
+ on(node, 'close', options.onClose, { signal });
48
+
49
+ const handleInteractOutside = (event: PointerEvent) => {
50
+ if (event.target !== node) return;
51
+ const shim = new PointerEvent('pointerdown', { cancelable: true });
52
+ options.onInteractOutside?.()(shim);
53
+ if (shim.defaultPrevented || options.interactOutsideBehavior?.() === 'ignore') return;
54
+ options.onClose();
55
+ };
56
+
57
+ if (options.outsideEvent === 'pointerdown') on(node, 'pointerdown', handleInteractOutside, { signal });
58
+ else if (options.outsideEvent === 'click') on(node, 'click', handleInteractOutside, { signal });
59
+
60
+ on(
61
+ node,
62
+ 'cancel',
63
+ (event) => {
64
+ // Always prevent the native instant close; a permitted Escape closes through state
65
+ // so the exit animation runs first.
66
+ event.preventDefault();
67
+ const shim = new KeyboardEvent('keydown', { key: 'Escape', cancelable: true });
68
+ options.onEscapeKeydown?.()(shim);
69
+ if (shim.defaultPrevented || options.escapeKeydownBehavior?.() === 'ignore') return;
70
+ options.onClose();
71
+ },
72
+ { signal },
73
+ );
74
+
75
+ // Load-bearing, not redundant with showModal(): verified in Chromium 2026-07-27 —
76
+ // without this, Tab past the last tabbable parks focus on <body> for one step.
77
+ if (options.trapFocus) {
78
+ on(
79
+ node,
80
+ 'keydown',
81
+ (event) => {
82
+ if (event.key !== 'Tab' || !options.trapFocus?.()) return;
83
+ const tabbables = getTabbableCandidates(node);
84
+ if (tabbables.length === 0) return;
85
+ const first = tabbables[0]!;
86
+ const last = tabbables[tabbables.length - 1]!;
87
+ const active = node.ownerDocument.activeElement;
88
+ if (!event.shiftKey && active === last) {
89
+ event.preventDefault();
90
+ first.focus();
91
+ } else if (event.shiftKey && active === first) {
92
+ event.preventDefault();
93
+ last.focus();
94
+ }
95
+ },
96
+ { signal },
97
+ );
98
+ }
99
+ }) satisfies Attachment<HTMLDialogElement>;
100
+
101
+ return { [createAttachmentKey()]: controller };
102
+ }
@@ -0,0 +1,173 @@
1
+ import type { Getter } from './tools/index.js';
2
+ import { on } from 'svelte/events';
3
+ import { createSettleRunner, useOpenChangeComplete } from './animations-settled.svelte.js';
4
+
5
+ /** Per-surface CSS anchor names; client-only (the lifecycle effect never runs in SSR). */
6
+ let anchorSequence = 0;
7
+
8
+ type NativePopoverAnchor = HTMLElement | string | null | undefined | object;
9
+
10
+ /**
11
+ * The slice of a content state the lifecycle drives — popover, tooltip, and
12
+ * link-preview content states all expose this shape, so the hook takes the
13
+ * state itself instead of a getter per field.
14
+ *
15
+ * `manual` mode requires the two dismissal handlers; `auto` mode requires `dismiss`
16
+ * (the UA decides *when* to close, the state only has to follow).
17
+ */
18
+ interface NativePopoverContentState {
19
+ readonly root: {
20
+ readonly opts: {
21
+ readonly open: { readonly current: boolean };
22
+ readonly onOpenChangeComplete: { readonly current: (open: boolean) => void };
23
+ };
24
+ readonly triggerNode: HTMLElement | null;
25
+ };
26
+ readonly opts: {
27
+ readonly ref: { readonly current: HTMLElement | null };
28
+ };
29
+ onEscapeKeydown?: (event: KeyboardEvent) => void;
30
+ onInteractOutside?: (event: PointerEvent) => void;
31
+ dismiss?: () => void;
32
+ }
33
+
34
+ const resolveNativePopoverAnchor = (anchor: NativePopoverAnchor, fallback: HTMLElement | null | undefined) =>
35
+ typeof anchor === 'string'
36
+ ? document.querySelector<HTMLElement>(anchor)
37
+ : anchor instanceof HTMLElement
38
+ ? anchor
39
+ : (fallback ?? null);
40
+
41
+ /**
42
+ * Drives a native popover surface from a content state: open/close via
43
+ * showPopover()/hidePopover() (anchored to the trigger, or the `anchor` override) and
44
+ * onOpenChangeComplete once the surface's own animations settle.
45
+ *
46
+ * `mode: 'auto'` (Popover) hands dismissal to the UA — light dismiss and Escape run
47
+ * through the browser's top-layer stack, so stacked surfaces close one per Escape —
48
+ * and syncs UA-initiated closes back into state via the `toggle` event. `manual`
49
+ * (Tooltip, LinkPreview — they need `popover="hint"`, which Safari lacks as of
50
+ * 2026-07) keeps document-level Escape / outside-pointerdown listeners; those bypass
51
+ * bitsEscapeLayers, so a manual surface over a JS-stack menu still closes both on one
52
+ * Escape.
53
+ *
54
+ * Returns the anchored-surface prop bag (`popover`, `data-anchored`) — the JS half of
55
+ * the contract whose CSS half lives in ui.css under `[data-anchored]` — so surfaces
56
+ * merge it instead of restating it.
57
+ */
58
+ export function useNativePopoverLifecycle(
59
+ state: NativePopoverContentState,
60
+ options: { anchor?: Getter<NativePopoverAnchor>; mode?: 'auto' | 'manual' } = {},
61
+ ) {
62
+ const mode = options.mode ?? 'manual';
63
+ const ref = () => state.opts.ref.current;
64
+ const open = () => state.root.opts.open.current;
65
+
66
+ // The surface's own animations gate the deferred hide; a long-running descendant
67
+ // animation (a chart entry inside a popover) must not hold the top layer.
68
+ const exitSettle = createSettleRunner({ subtree: false });
69
+ // Anchoring is entirely the source element, so the anchor is frozen at the
70
+ // last show; a reopen against a different trigger/customAnchor must re-show, not no-op.
71
+ let shownSource: HTMLElement | null = null;
72
+
73
+ // Explicit CSS anchor per surface: showPopover({source})'s implicit anchor is Chrome 137+
74
+ // only — without it, anchor() in the [data-anchored] rules has nothing to resolve against
75
+ // in Firefox and Safari, and the surface lands over its own trigger (which also swallowed
76
+ // the trigger's close click). anchor-name is a list, so a source that already carries one
77
+ // (a menu trigger sharing the element) keeps it.
78
+ const anchorName = `--bits-popover-anchor-${++anchorSequence}`;
79
+ const nameAnchor = (source: HTMLElement) => {
80
+ const existing = source.style.anchorName || '';
81
+ if (!existing || existing === 'none') source.style.anchorName = anchorName;
82
+ else if (!existing.split(',').some((n) => n.trim() === anchorName)) source.style.anchorName = `${existing}, ${anchorName}`;
83
+ };
84
+ const unnameAnchor = (source: HTMLElement) => {
85
+ const rest = (source.style.anchorName || '')
86
+ .split(',')
87
+ .map((n) => n.trim())
88
+ .filter((n) => n && n !== anchorName && n !== 'none');
89
+ if (rest.length) source.style.anchorName = rest.join(', ');
90
+ else source.style.removeProperty('anchor-name');
91
+ };
92
+ $effect(() => () => {
93
+ if (shownSource) unnameAnchor(shownSource);
94
+ });
95
+
96
+ $effect(() => {
97
+ const el = ref();
98
+ const isOpen = open();
99
+ if (!el?.isConnected || typeof el.showPopover !== 'function') return;
100
+
101
+ if (isOpen) {
102
+ exitSettle.cancel(); // a reopen mid-exit keeps the surface shown
103
+ const source = resolveNativePopoverAnchor(options.anchor?.(), state.root.triggerNode);
104
+ if (el.matches(':popover-open')) {
105
+ if (source === shownSource) return;
106
+ el.hidePopover(); // re-anchor: hide+show against the new source in one pass
107
+ }
108
+ if (shownSource && shownSource !== source) unnameAnchor(shownSource);
109
+ if (source) {
110
+ nameAnchor(source);
111
+ el.style.positionAnchor = anchorName;
112
+ } else {
113
+ el.style.removeProperty('position-anchor');
114
+ }
115
+ // The implicit source still matters where it works: in `auto` mode it makes the UA
116
+ // exempt the invoker from light dismiss (Chrome 137+).
117
+ source ? (el.showPopover as (options: { source: HTMLElement }) => void).call(el, { source }) : el.showPopover();
118
+ shownSource = source;
119
+ return;
120
+ }
121
+
122
+ if (!el.matches(':popover-open')) return; // the UA already hid it (light dismiss, Escape)
123
+ // The exiting surface is inert-adjacent but still in the tab order; hand focus back to
124
+ // the trigger now rather than letting Tab land inside a closing popover.
125
+ if (el.contains(el.ownerDocument.activeElement)) state.root.triggerNode?.focus();
126
+ // Hold the popover in the top layer while the [data-state=closed] exit runs, then hide.
127
+ // `overlay` transitions are Chrome-only, so an immediate hidePopover() snaps the exit
128
+ // in Firefox and Safari; the surfaces key their exit on data-state, not :popover-open.
129
+ exitSettle.run(el, () => {
130
+ if (!open() && el.matches(':popover-open')) el.hidePopover();
131
+ });
132
+ });
133
+
134
+ useOpenChangeComplete(open, ref, (isOpen) => state.root.opts.onOpenChangeComplete.current(isOpen));
135
+
136
+ if (mode === 'auto') {
137
+ // The UA closes the popover itself (light dismiss, Escape, another auto popover opening);
138
+ // `toggle` is where library state finds out and follows.
139
+ $effect(() => {
140
+ const el = ref();
141
+ if (!el) return;
142
+ return on(el, 'toggle', (event) => {
143
+ if ((event as ToggleEvent).newState === 'closed' && open()) state.dismiss?.();
144
+ });
145
+ });
146
+ } else {
147
+ $effect(() => {
148
+ if (!open()) return;
149
+
150
+ const offKey = on(document, 'keydown', (event) => {
151
+ if (event.key === 'Escape') state.onEscapeKeydown?.(event);
152
+ });
153
+ const offPointer = on(
154
+ document,
155
+ 'pointerdown',
156
+ (event) => {
157
+ const target = event.target as Node | null;
158
+ // inside the popover or its trigger — not an outside interaction
159
+ if (ref()?.contains(target ?? null) || state.root.triggerNode?.contains(target ?? null)) return;
160
+ state.onInteractOutside?.(event);
161
+ },
162
+ { capture: true },
163
+ );
164
+
165
+ return () => {
166
+ offKey();
167
+ offPointer();
168
+ };
169
+ });
170
+ }
171
+
172
+ return { popover: mode, 'data-anchored': '' } as const;
173
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * An overlay's open-state cell: pure signals, no effects. LIBRARY-INTERNAL — the
3
+ * class is deliberately absent from the package exports (state-flow hard rule:
4
+ * consumers never construct or hold library state; apps drive overlays via the
5
+ * `open` source prop and reconcile via onOpenChangeComplete). Roots construct it,
6
+ * and library blocks/wrappers (AlertModal, menubar-menu) may hand one to a root
7
+ * via its `state` prop. Reading and writing `open` is the whole API: the overlay's
8
+ * trigger/close/dismiss machinery and any markup, deriveds, or effects are all
9
+ * dependents of the same signal — there is no change callback and nothing to wire.
10
+ *
11
+ * An optional `source` makes `open` a writable derived: it re-derives whenever
12
+ * the source changes (a route param, `editing !== null`, an external machine's
13
+ * open), and direct writes — Escape, a Close button, `cell.open = false` —
14
+ * override it until the next source change.
15
+ *
16
+ * An optional `write` makes the cell delegate instead of own: direct writes
17
+ * are forwarded to it and the source stays authoritative, so an external
18
+ * machine (e.g. the alertModal store) hears a self-close the moment it
19
+ * happens rather than reconciling after the animation. Without it the cell
20
+ * owns the override — own-or-delegate.
21
+ */
22
+ export class OpenCell {
23
+ readonly #source?: () => boolean;
24
+ readonly #write?: (open: boolean) => void;
25
+ #open: boolean = $derived.by(() => this.#source?.() ?? false);
26
+
27
+ constructor(source?: () => boolean, write?: (open: boolean) => void) {
28
+ this.#source = source;
29
+ this.#write = write;
30
+ }
31
+
32
+ get open(): boolean {
33
+ return this.#open;
34
+ }
35
+
36
+ set open(next: boolean) {
37
+ if (next === this.#open) return;
38
+ if (this.#write) this.#write(next);
39
+ else this.#open = next;
40
+ }
41
+ }
@@ -0,0 +1,5 @@
1
+ export { default as PaneGroup } from './pane-group.svelte';
2
+ export { default as Pane } from './pane.svelte';
3
+ export { default as PaneResizer } from './pane-resizer.svelte';
4
+ export type * from './types.js';
5
+ export type { PaneGroupStorage } from './internal/utils/storage.js';
@@ -0,0 +1,2 @@
1
+ export const LOCAL_STORAGE_DEBOUNCE_INTERVAL = 100;
2
+ export const PRECISION = 10;
@@ -0,0 +1,354 @@
1
+ import type { PaneState } from '../paneforge.svelte.js';
2
+ import type { DOMContext } from '../../tools/index.js';
3
+ import { BROWSER } from 'esm-env';
4
+ import { isHTMLElement } from '../../tools/utils/dom.js';
5
+ import type { Direction, DragState, PaneConstraints, ResizeEvent } from './types.js';
6
+ import { calculateAriaValues } from './utils/aria.js';
7
+ import { areNumbersAlmostEqual } from './utils/compare.js';
8
+ import { isKeyDown, isMouseEvent, isTouchEvent } from './utils/is.js';
9
+ import { resizePane } from './utils/resize.js';
10
+
11
+ interface UpdateResizeHandleAriaValuesOpts {
12
+ groupId: string;
13
+ layout: number[];
14
+ panesArray: PaneState[];
15
+ domContext: DOMContext;
16
+ }
17
+
18
+ export function updateResizeHandleAriaValues({ groupId, layout, panesArray, domContext }: UpdateResizeHandleAriaValuesOpts) {
19
+ const resizeHandleElements = getResizeHandleElementsForGroup(groupId, domContext);
20
+
21
+ for (let index = 0; index < panesArray.length - 1; index++) {
22
+ const { valueMax, valueMin, valueNow } = calculateAriaValues({
23
+ layout,
24
+ panesArray: panesArray,
25
+ pivotIndices: [index, index + 1],
26
+ });
27
+
28
+ const resizeHandleEl = resizeHandleElements[index];
29
+
30
+ if (isHTMLElement(resizeHandleEl)) {
31
+ const paneData = panesArray[index]!;
32
+ resizeHandleEl.setAttribute('aria-controls', paneData.opts.id.current);
33
+ resizeHandleEl.setAttribute('aria-valuemax', `${Math.round(valueMax)}`);
34
+ resizeHandleEl.setAttribute('aria-valuemin', `${Math.round(valueMin)}`);
35
+ resizeHandleEl.setAttribute('aria-valuenow', valueNow != null ? `${Math.round(valueNow)}` : '');
36
+ }
37
+ }
38
+
39
+ return () => {
40
+ for (const el of resizeHandleElements) {
41
+ el.removeAttribute('aria-controls');
42
+ el.removeAttribute('aria-valuemax');
43
+ el.removeAttribute('aria-valuemin');
44
+ el.removeAttribute('aria-valuenow');
45
+ }
46
+ };
47
+ }
48
+
49
+ export function getResizeHandleElementsForGroup(groupId: string, domContext: DOMContext): HTMLElement[] {
50
+ if (!BROWSER) return [];
51
+ return Array.from(domContext.querySelectorAll(`[data-pane-resizer-id][data-pane-group-id="${groupId}"]`) as NodeListOf<HTMLElement>);
52
+ }
53
+
54
+ interface GetResizeHandleElementIndexOpts {
55
+ groupId: string;
56
+ id: string;
57
+ domContext: DOMContext;
58
+ }
59
+
60
+ export function getResizeHandleElementIndex({ groupId, id, domContext }: GetResizeHandleElementIndexOpts): number | null {
61
+ if (!BROWSER) return null;
62
+ const handles = getResizeHandleElementsForGroup(groupId, domContext);
63
+ const index = handles.findIndex((handle) => handle.getAttribute('data-pane-resizer-id') === id);
64
+ return index < 0 ? null : index;
65
+ }
66
+
67
+ type GetPivotIndicesOpts = {
68
+ groupId: string;
69
+ dragHandleId: string;
70
+ domContext: DOMContext;
71
+ };
72
+
73
+ export function getPivotIndices({
74
+ groupId,
75
+ dragHandleId,
76
+ domContext,
77
+ }: GetPivotIndicesOpts): [indexBefore: number, indexAfter: number] | null {
78
+ const index = getResizeHandleElementIndex({
79
+ groupId,
80
+ id: dragHandleId,
81
+ domContext: domContext,
82
+ });
83
+
84
+ return index == null ? null : [index, index + 1];
85
+ }
86
+
87
+ export function paneDataHelper(panesArray: PaneState[], pane: PaneState, layout: number[]) {
88
+ const paneConstraintsArray = panesArray.map((paneData) => paneData.constraints);
89
+
90
+ const paneIndex = findPaneDataIndex(panesArray, pane);
91
+ const paneConstraints = paneConstraintsArray[paneIndex];
92
+
93
+ const isLastPane = paneIndex === panesArray.length - 1;
94
+ const pivotIndices: [number, number] | null =
95
+ paneIndex < 0 || panesArray.length < 2 ? null : isLastPane ? [paneIndex - 1, paneIndex] : [paneIndex, paneIndex + 1];
96
+
97
+ const paneSize = layout[paneIndex];
98
+
99
+ return {
100
+ ...paneConstraints,
101
+ paneSize,
102
+ pivotIndices,
103
+ };
104
+ }
105
+
106
+ export function findPaneDataIndex(panesArray: readonly PaneState[], pane: PaneState) {
107
+ return panesArray.findIndex((prevPaneData) => prevPaneData.opts.id.current === pane.opts.id.current);
108
+ }
109
+
110
+ // Layout should be pre-converted into percentages
111
+ export function callPaneCallbacks(panesArray: PaneState[], layout: number[], paneIdToLastNotifiedSizeMap: Record<string, number>) {
112
+ for (const [index, paneData] of panesArray.entries()) {
113
+ const size = layout[index];
114
+ if (size == null) continue;
115
+
116
+ const { collapsedSize = 0, collapsible } = paneData.constraints;
117
+
118
+ const lastNotifiedSize = paneIdToLastNotifiedSizeMap[paneData.opts.id.current];
119
+ // invert the logic from below
120
+ if (!(lastNotifiedSize == null || size !== lastNotifiedSize)) continue;
121
+ paneIdToLastNotifiedSizeMap[paneData.opts.id.current] = size;
122
+
123
+ const { onCollapse, onExpand, onResize } = paneData.callbacks;
124
+
125
+ onResize?.(size, lastNotifiedSize);
126
+
127
+ if (collapsible && (onCollapse || onExpand)) {
128
+ if (onExpand && (lastNotifiedSize == null || lastNotifiedSize === collapsedSize) && size !== collapsedSize) {
129
+ onExpand();
130
+ }
131
+
132
+ if (onCollapse && (lastNotifiedSize == null || lastNotifiedSize !== collapsedSize) && size === collapsedSize) {
133
+ onCollapse();
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ export function getUnsafeDefaultLayout({ panesArray }: { panesArray: PaneState[] }): number[] {
140
+ const layout = Array<number>(panesArray.length);
141
+
142
+ let numPanesWithSizes = 0;
143
+ let remainingSize = 100;
144
+
145
+ // Distribute default sizes first
146
+ for (const [index, paneData] of panesArray.entries()) {
147
+ const { defaultSize } = paneData.constraints;
148
+
149
+ if (defaultSize != null) {
150
+ numPanesWithSizes++;
151
+ layout[index] = defaultSize;
152
+ remainingSize -= defaultSize;
153
+ }
154
+ }
155
+
156
+ // Remaining size should be distributed evenly between panes without default sizes
157
+ for (const [index, paneData] of panesArray.entries()) {
158
+ const { defaultSize } = paneData.constraints;
159
+
160
+ if (defaultSize != null) {
161
+ continue;
162
+ }
163
+
164
+ const numRemainingPanes = panesArray.length - numPanesWithSizes;
165
+ const size = remainingSize / numRemainingPanes;
166
+
167
+ numPanesWithSizes++;
168
+ layout[index] = size;
169
+ remainingSize -= size;
170
+ }
171
+
172
+ return layout;
173
+ }
174
+
175
+ // All units must be in percentages
176
+ export function validatePaneGroupLayout({
177
+ layout: prevLayout,
178
+ paneConstraints,
179
+ }: {
180
+ layout: number[];
181
+ paneConstraints: PaneConstraints[];
182
+ }): number[] {
183
+ const nextLayout = [...prevLayout];
184
+ const nextLayoutTotalSize = nextLayout.reduce((accumulated, current) => accumulated + current, 0);
185
+
186
+ // Validate layout expectations
187
+ if (nextLayout.length !== paneConstraints.length) {
188
+ throw new Error(`Invalid ${paneConstraints.length} pane layout: ${nextLayout.map((size) => `${size}%`).join(', ')}`);
189
+ }
190
+
191
+ for (let index = 0; index < nextLayout.length; index++) {
192
+ if (nextLayout[index] == null || paneConstraints[index] == null) {
193
+ throw new Error(`Invalid pane layout entry at index ${index}.`);
194
+ }
195
+ }
196
+
197
+ if (!areNumbersAlmostEqual(nextLayoutTotalSize, 100)) {
198
+ for (const [index, unsafeSize] of nextLayout.entries()) {
199
+ const safeSize = (100 / nextLayoutTotalSize) * unsafeSize;
200
+ nextLayout[index] = safeSize;
201
+ }
202
+ }
203
+
204
+ let remainingSize = 0;
205
+
206
+ // First pass: Validate the proposed layout given each pane's constraints
207
+ for (const [index, unsafeSize] of nextLayout.entries()) {
208
+ const safeSize = resizePane({
209
+ paneConstraints,
210
+ paneIndex: index,
211
+ initialSize: unsafeSize,
212
+ });
213
+
214
+ if (unsafeSize !== safeSize) {
215
+ remainingSize += unsafeSize - safeSize;
216
+
217
+ nextLayout[index] = safeSize;
218
+ }
219
+ }
220
+
221
+ // If there is additional, left over space, assign it to any pane(s) that permits it
222
+ // (It's not worth taking multiple additional passes to evenly distribute)
223
+ if (!areNumbersAlmostEqual(remainingSize, 0)) {
224
+ for (const [index, prevSize] of nextLayout.entries()) {
225
+ const unsafeSize = prevSize + remainingSize;
226
+ const safeSize = resizePane({
227
+ paneConstraints,
228
+ paneIndex: index,
229
+ initialSize: unsafeSize,
230
+ });
231
+
232
+ if (prevSize !== safeSize) {
233
+ remainingSize -= safeSize - prevSize;
234
+ nextLayout[index] = safeSize;
235
+
236
+ // Once we've used up the remainder, bail
237
+ if (areNumbersAlmostEqual(remainingSize, 0)) {
238
+ break;
239
+ }
240
+ }
241
+ }
242
+ }
243
+
244
+ return nextLayout;
245
+ }
246
+
247
+ export function getResizeHandleElement(id: string, domContext: DOMContext): HTMLElement | null {
248
+ if (!BROWSER) return null;
249
+ const element = domContext.querySelector(`[data-pane-resizer-id="${id}"]`) as HTMLElement;
250
+ if (element) return element;
251
+ return null;
252
+ }
253
+
254
+ interface GetDragOffsetPercentageOpts {
255
+ event: ResizeEvent;
256
+ dir: Direction;
257
+ initialDragState: DragState;
258
+ }
259
+
260
+ export function getDragOffsetPercentage({ event, dir, initialDragState }: GetDragOffsetPercentageOpts): number {
261
+ const { groupSizeInPixels, initialCursorPosition } = initialDragState;
262
+ if (groupSizeInPixels <= 0) return 0;
263
+
264
+ const cursorPosition = getResizeEventCursorPosition(dir, event);
265
+ if (cursorPosition == null) return 0;
266
+
267
+ const offsetPixels = cursorPosition - initialCursorPosition;
268
+ const offsetPercentage = (offsetPixels / groupSizeInPixels) * 100;
269
+
270
+ return offsetPercentage;
271
+ }
272
+
273
+ interface GetDeltaPercentageOpts {
274
+ event: ResizeEvent;
275
+ dir: Direction;
276
+ initialDragState: DragState | null;
277
+ keyboardResizeBy: number | null;
278
+ }
279
+
280
+ // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX
281
+ export function getDeltaPercentage({ event, dir, initialDragState, keyboardResizeBy }: GetDeltaPercentageOpts): number {
282
+ if (isKeyDown(event)) {
283
+ const isHorizontal = dir === 'horizontal';
284
+
285
+ let delta = 0;
286
+ if (event.shiftKey) {
287
+ delta = 100;
288
+ } else if (keyboardResizeBy != null) {
289
+ delta = keyboardResizeBy;
290
+ } else {
291
+ delta = 10;
292
+ }
293
+
294
+ let movement = 0;
295
+ switch (event.key) {
296
+ case 'ArrowDown':
297
+ movement = isHorizontal ? 0 : delta;
298
+ break;
299
+ case 'ArrowLeft':
300
+ movement = isHorizontal ? -delta : 0;
301
+ break;
302
+ case 'ArrowRight':
303
+ movement = isHorizontal ? delta : 0;
304
+ break;
305
+ case 'ArrowUp':
306
+ movement = isHorizontal ? 0 : -delta;
307
+ break;
308
+ case 'End':
309
+ movement = 100;
310
+ break;
311
+ case 'Home':
312
+ movement = -100;
313
+ break;
314
+ }
315
+
316
+ return movement;
317
+ } else {
318
+ if (initialDragState == null) return 0;
319
+
320
+ return getDragOffsetPercentage({
321
+ event,
322
+ dir,
323
+ initialDragState,
324
+ });
325
+ }
326
+ }
327
+
328
+ export function getResizeEventCursorPosition(dir: Direction, e: ResizeEvent): number | null {
329
+ const point = isMouseEvent(e) ? e : isTouchEvent(e) ? e.touches[0] : null;
330
+ return point ? (dir === 'horizontal' ? point.clientX : point.clientY) : null;
331
+ }
332
+
333
+ interface GetResizeHandlePaneIdsOpts {
334
+ groupId: string;
335
+ handleId: string;
336
+ panesArray: PaneState[];
337
+ domContext: DOMContext;
338
+ }
339
+
340
+ export function getResizeHandlePaneIds({
341
+ groupId,
342
+ handleId,
343
+ panesArray,
344
+ domContext,
345
+ }: GetResizeHandlePaneIdsOpts): [idBefore: string | null, idAfter: string | null] {
346
+ const handle = getResizeHandleElement(handleId, domContext);
347
+ const handles = getResizeHandleElementsForGroup(groupId, domContext);
348
+ const index = handle ? handles.indexOf(handle) : -1;
349
+
350
+ const idBefore: string | null = panesArray[index]?.opts.id.current ?? null;
351
+ const idAfter: string | null = panesArray[index + 1]?.opts.id.current ?? null;
352
+
353
+ return [idBefore, idAfter];
354
+ }