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,243 @@
1
+ import {
2
+ CalendarDate,
3
+ CalendarDateTime,
4
+ type DateValue,
5
+ Time,
6
+ ZonedDateTime,
7
+ getDayOfWeek,
8
+ getLocalTimeZone,
9
+ parseDate,
10
+ parseDateTime,
11
+ parseZonedDateTime,
12
+ toCalendar,
13
+ } from '@internationalized/date';
14
+ import type { DateMatcher, Granularity, TimeGranularity, TimeValue } from './types.js';
15
+
16
+ type GetDefaultDateProps = {
17
+ defaultValue?: DateValue | DateValue[] | undefined;
18
+ minValue?: DateValue;
19
+ maxValue?: DateValue;
20
+ granularity?: Granularity;
21
+ };
22
+
23
+ type GetDefaultTimeProps = {
24
+ defaultValue?: TimeValue | undefined;
25
+ granularity?: TimeGranularity;
26
+ };
27
+
28
+ const defaultDateDefaults = {
29
+ defaultValue: undefined,
30
+ granularity: 'day',
31
+ };
32
+
33
+ /**
34
+ * A helper function used throughout the various date builders
35
+ * to generate a default `DateValue` using the `defaultValue`,
36
+ * `defaultPlaceholder`, `minValue`, `maxValue`, and `granularity` props.
37
+ *
38
+ * It's important to match the `DateValue` type being used
39
+ * elsewhere in the builder, so they behave according to the
40
+ * behavior the user expects based on the props they've provided.
41
+ *
42
+ */
43
+ export function getDefaultDate(opts: GetDefaultDateProps): DateValue {
44
+ const withDefaults = { ...defaultDateDefaults, ...opts };
45
+ const { defaultValue, granularity, minValue, maxValue } = withDefaults;
46
+
47
+ if (Array.isArray(defaultValue) && defaultValue.length) {
48
+ return defaultValue[defaultValue.length - 1]!;
49
+ }
50
+
51
+ if (defaultValue && !Array.isArray(defaultValue)) {
52
+ return defaultValue;
53
+ }
54
+
55
+ let date = new Date();
56
+ if (minValue && date < minValue.toDate(getLocalTimeZone())) {
57
+ date = minValue.toDate(getLocalTimeZone());
58
+ } else if (maxValue && date > maxValue.toDate(getLocalTimeZone())) {
59
+ date = maxValue.toDate(getLocalTimeZone());
60
+ }
61
+ const year = date.getFullYear();
62
+ const month = date.getMonth() + 1;
63
+ const day = date.getDate();
64
+ const calendarDateTimeGranularities = ['hour', 'minute', 'second'];
65
+
66
+ if (calendarDateTimeGranularities.includes(granularity ?? 'day')) {
67
+ return new CalendarDateTime(year, month, day, 0, 0, 0);
68
+ }
69
+
70
+ return new CalendarDate(year, month, day);
71
+ }
72
+
73
+ export const getDefaultTime = ({ defaultValue }: GetDefaultTimeProps): TimeValue => defaultValue ?? new Time(0, 0, 0);
74
+
75
+ /**
76
+ * Given a date string and a reference `DateValue` object, parse the
77
+ * string to the same type as the reference object.
78
+ *
79
+ * Useful for parsing strings from data attributes, which are always
80
+ * strings, to the same type being used by the date component.
81
+ */
82
+ export function parseStringToDateValue(dateStr: string, referenceVal: DateValue): DateValue {
83
+ let dateValue: DateValue;
84
+ if (referenceVal instanceof ZonedDateTime) {
85
+ dateValue = parseZonedDateTime(dateStr);
86
+ } else if (referenceVal instanceof CalendarDateTime) {
87
+ dateValue = parseDateTime(dateStr);
88
+ } else {
89
+ dateValue = parseDate(dateStr);
90
+ }
91
+
92
+ // ensure the parsed date is in the same calendar as the reference date set by the user.
93
+ return dateValue.calendar !== referenceVal.calendar ? toCalendar(dateValue, referenceVal.calendar) : dateValue;
94
+ }
95
+
96
+ /**
97
+ * Given a `DateValue` object, convert it to a native `Date` object.
98
+ * If a timezone is provided, the date will be converted to that timezone.
99
+ * If no timezone is provided, the date will be converted to the local timezone.
100
+ */
101
+ export const toDate = (dateValue: DateValue, tz: string = getLocalTimeZone()) =>
102
+ dateValue instanceof ZonedDateTime ? dateValue.toDate() : dateValue.toDate(tz);
103
+
104
+ export function getDateValueType(date: DateValue): string {
105
+ if (date instanceof CalendarDate) return 'date';
106
+ if (date instanceof CalendarDateTime) return 'datetime';
107
+ if (date instanceof ZonedDateTime) return 'zoneddatetime';
108
+ throw new Error('Unknown date type');
109
+ }
110
+
111
+ export function parseAnyDateValue(value: string, type: string): DateValue {
112
+ switch (type) {
113
+ case 'date':
114
+ return parseDate(value);
115
+ case 'datetime':
116
+ return parseDateTime(value);
117
+ case 'zoneddatetime':
118
+ return parseZonedDateTime(value);
119
+ default:
120
+ throw new Error(`Unknown date type: ${type}`);
121
+ }
122
+ }
123
+ export const isZonedDateTime = (dateValue: DateValue | TimeValue): dateValue is ZonedDateTime => dateValue instanceof ZonedDateTime;
124
+
125
+ export const hasTime = (dateValue: DateValue): dateValue is CalendarDateTime | ZonedDateTime =>
126
+ dateValue instanceof CalendarDateTime || isZonedDateTime(dateValue);
127
+
128
+ /**
129
+ * Given a date, return the number of days in the month.
130
+ */
131
+ export function getDaysInMonth(date: Date | DateValue) {
132
+ if (date instanceof Date) {
133
+ const year = date.getFullYear();
134
+ const month = date.getMonth() + 1;
135
+ /**
136
+ * By using zero as the day, we get the
137
+ * last day of the previous month, which
138
+ * is the month we originally passed in.
139
+ */
140
+ return new Date(year, month, 0).getDate();
141
+ }
142
+ return date.set({ day: 100 }).day;
143
+ }
144
+
145
+ /**
146
+ * Determine if a date is before the reference date.
147
+ * @param dateToCompare - is this date before the `referenceDate`
148
+ * @param referenceDate - is the `dateToCompare` before this date
149
+ *
150
+ * @see {@link isBeforeOrSame} for inclusive
151
+ */
152
+ export const isBefore = (dateToCompare: DateValue, referenceDate: DateValue) => dateToCompare.compare(referenceDate) < 0;
153
+
154
+ /**
155
+ * Determine if a date is after the reference date.
156
+ * @param dateToCompare - is this date after the `referenceDate`
157
+ * @param referenceDate - is the `dateToCompare` after this date
158
+ *
159
+ * @see {@link isAfterOrSame} for inclusive
160
+ */
161
+ export const isAfter = (dateToCompare: DateValue, referenceDate: DateValue) => dateToCompare.compare(referenceDate) > 0;
162
+
163
+ /**
164
+ * Determine if a date is before or the same as the reference date.
165
+ *
166
+ * @param dateToCompare - the date to compare
167
+ * @param referenceDate - the reference date to make the comparison against
168
+ *
169
+ * @see {@link isBefore} for non-inclusive
170
+ */
171
+ const isBeforeOrSame = (dateToCompare: DateValue, referenceDate: DateValue) => dateToCompare.compare(referenceDate) <= 0;
172
+
173
+ /**
174
+ * Determine if a date is after or the same as the reference date.
175
+ *
176
+ * @param dateToCompare - is this date after or the same as the `referenceDate`
177
+ * @param referenceDate - is the `dateToCompare` after or the same as this date
178
+ *
179
+ * @see {@link isAfter} for non-inclusive
180
+ */
181
+ const isAfterOrSame = (dateToCompare: DateValue, referenceDate: DateValue) => dateToCompare.compare(referenceDate) >= 0;
182
+
183
+ /**
184
+ * Determine if a date is inclusively between a start and end reference date.
185
+ *
186
+ * @param date - is this date inclusively between the `start` and `end` dates
187
+ * @param start - the start reference date to make the comparison against
188
+ * @param end - the end reference date to make the comparison against
189
+ *
190
+ * @see {@link isBetween} for non-inclusive
191
+ */
192
+ export const isBetweenInclusive = (date: DateValue, start: DateValue, end: DateValue) =>
193
+ isAfterOrSame(date, start) && isBeforeOrSame(date, end);
194
+
195
+ export function getLastFirstDayOfWeek<T extends DateValue = DateValue>(date: T, firstDayOfWeek: number, locale: string): T {
196
+ const day = getDayOfWeek(date, locale);
197
+
198
+ if (firstDayOfWeek > day) {
199
+ return date.subtract({ days: day + 7 - firstDayOfWeek }) as T;
200
+ }
201
+ if (firstDayOfWeek === day) {
202
+ return date as T;
203
+ }
204
+ return date.subtract({ days: day - firstDayOfWeek }) as T;
205
+ }
206
+
207
+ export function getNextLastDayOfWeek<T extends DateValue = DateValue>(date: T, firstDayOfWeek: number, locale: string): T {
208
+ const day = getDayOfWeek(date, locale);
209
+ const lastDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;
210
+
211
+ if (day === lastDayOfWeek) {
212
+ return date as T;
213
+ }
214
+
215
+ if (day > lastDayOfWeek) {
216
+ return date.add({ days: 7 - day + lastDayOfWeek }) as T;
217
+ }
218
+
219
+ return date.add({ days: lastDayOfWeek - day }) as T;
220
+ }
221
+
222
+ export function areAllDaysBetweenValid(
223
+ start: DateValue,
224
+ end: DateValue,
225
+ isUnavailable: DateMatcher | undefined,
226
+ isDisabled: DateMatcher | undefined,
227
+ ) {
228
+ if (isUnavailable === undefined && isDisabled === undefined) {
229
+ return true;
230
+ }
231
+ let dCurrent = start.add({ days: 1 });
232
+ if (isDisabled?.(dCurrent) || isUnavailable?.(dCurrent)) {
233
+ return false;
234
+ }
235
+ const dEnd = end;
236
+ while (dCurrent.compare(dEnd) < 0) {
237
+ dCurrent = dCurrent.add({ days: 1 });
238
+ if (isDisabled?.(dCurrent) || isUnavailable?.(dCurrent)) {
239
+ return false;
240
+ }
241
+ }
242
+ return true;
243
+ }
@@ -0,0 +1,3 @@
1
+ export { interactOutsideAttachment } from './use-dismissable-layer.svelte.js';
2
+
3
+ export type { DismissibleLayerProps } from './types.js';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The timer seam for the dismissible (interact-outside) layer.
3
+ *
4
+ * The layer decides "am I the responsible top layer for this outside pointer event" across a
5
+ * few timers: a 1ms registration gate, a 10ms interact-outside debounce, and a 20ms reset. That
6
+ * timing is the fragile part, so — mirroring the `SettleRunner` seam in
7
+ * `animations-settled.svelte.ts` — the timers are funnelled through this small contract. The default
8
+ * adapter {@link realTimers} is the real global timers, byte-for-byte the behaviour before the
9
+ * seam existed; tests inject a manual/fake clock to drive the windows deterministically.
10
+ */
11
+
12
+ export type TimerHandle = ReturnType<typeof setTimeout>;
13
+
14
+ // oxlint-disable-next-line no-explicit-any -- variadic debounce, matches the original signature
15
+ export interface Debounced<T extends (...args: any[]) => any> {
16
+ (...args: Parameters<T>): void;
17
+ destroy(): void;
18
+ }
19
+
20
+ /** The whole timer surface the dismissible layer needs; `debounce` is built on top of it. */
21
+ export interface Timers {
22
+ setTimeout(fn: () => void, ms: number): TimerHandle;
23
+ clearTimeout(handle: TimerHandle | undefined): void;
24
+ }
25
+
26
+ /**
27
+ * The layer's debounce — the *same* logic it has always used, with the timer pair parameterised,
28
+ * so the real and fake clocks run identical code and a fake clock just supplies fake time.
29
+ */
30
+ // oxlint-disable-next-line no-explicit-any -- variadic debounce, matches the original signature
31
+ export function debounce<T extends (...args: any[]) => any>(timers: Timers, fn: T, wait: number): Debounced<T> {
32
+ let timeout: TimerHandle | undefined;
33
+
34
+ const debounced = ((...args: Parameters<T>) => {
35
+ timers.clearTimeout(timeout);
36
+ timeout = timers.setTimeout(() => fn(...args), wait);
37
+ }) as Debounced<T>;
38
+
39
+ debounced.destroy = () => timers.clearTimeout(timeout);
40
+
41
+ return debounced;
42
+ }
43
+
44
+ /** Default adapter. Wrapped, not referenced: a detached `window.setTimeout` throws Illegal invocation. */
45
+ export const realTimers: Timers = {
46
+ setTimeout: (fn, ms) => setTimeout(fn, ms),
47
+ clearTimeout: (handle) => clearTimeout(handle),
48
+ };
@@ -0,0 +1,57 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { WritableBox } from '../tools/index.js';
3
+
4
+ export type InteractOutsideEvent = PointerEvent;
5
+ export type InteractOutsideEventHandler = (e: PointerEvent) => void;
6
+
7
+ export type InteractOutsideBehaviorType = 'close' | 'defer-otherwise-close' | 'defer-otherwise-ignore' | 'ignore';
8
+
9
+ export type DismissibleLayerProps = {
10
+ /**
11
+ * Callback fired when an outside interaction event completes,
12
+ * which is either a `pointerup`, `mouseup`, or `touchend`
13
+ * event, depending on the user's input device.
14
+ */
15
+ onInteractOutside?: InteractOutsideEventHandler;
16
+
17
+ /**
18
+ * Interact outside behavior type.
19
+ * `close`: Closes the element immediately.
20
+ * `defer-otherwise-close`: Delegates the action to the parent element. If no parent is found, it closes the element.
21
+ * `defer-otherwise-ignore`: Delegates the action to the parent element. If no parent is found, nothing is done.
22
+ * `ignore`: Prevents the element from closing and also blocks the parent element from closing in response to an outside interaction.
23
+ *
24
+ * @defaultValue `close`
25
+ */
26
+ interactOutsideBehavior?: InteractOutsideBehaviorType;
27
+
28
+ /**
29
+ * Callback fired when focus leaves the dismissible layer.
30
+ */
31
+ onFocusOutside?: (event: FocusEvent) => void;
32
+ };
33
+
34
+ export type DismissibleLayerImplProps = {
35
+ /**
36
+ * Whether the layer is enabled.
37
+ */
38
+ enabled: boolean;
39
+
40
+ /**
41
+ * ID of the layer.
42
+ */
43
+ id: string;
44
+
45
+ /**
46
+ * Provide a custom event validator function to determine if the event should be
47
+ * considered a dismissal event. This was added to handle the case where a user
48
+ * has one context menu open and right clicks on another context menu. We normally ignore
49
+ * right clicks for "close" events, but in this case we want to close the context menu when
50
+ * another is open.
51
+ */
52
+ isValidEvent?: (e: PointerEvent, node: HTMLElement) => boolean;
53
+
54
+ children?: Snippet<[{ props: Record<string, unknown> }]>;
55
+
56
+ ref: WritableBox<HTMLElement | null>;
57
+ } & DismissibleLayerProps;
@@ -0,0 +1,291 @@
1
+ import {
2
+ simpleBox,
3
+ boxWith,
4
+ attachRef,
5
+ type Getter,
6
+ type ReadableBox,
7
+ type RefAttachment,
8
+ type WritableBox,
9
+ mergeHandlers,
10
+ type ReadableBoxedValues,
11
+ } from '../tools/index.js';
12
+ import { on } from 'svelte/events';
13
+ import { getAbortSignal, onMount, tick } from 'svelte';
14
+ import type { DismissibleLayerImplProps, InteractOutsideBehaviorType, InteractOutsideEventHandler } from './types.js';
15
+ import { type EventCallback } from '../tools/utils/events.js';
16
+ import { createLayerStack } from '../layer-stack.js';
17
+ import { globalSingleton } from '../global-singleton.js';
18
+ import { isElementOrSVGElement } from '../tools/utils/dom.js';
19
+ import { CONTEXT_MENU_CONTENT_ATTR, CONTEXT_MENU_TRIGGER_ATTR } from '../../components/menu/menu.svelte.js';
20
+ import { debounce, realTimers, type Timers, type Debounced } from './scheduler.js';
21
+
22
+ const isPointerOutsideRect = ({ clientX: x, clientY: y }: PointerEvent, node: HTMLElement) =>
23
+ (({ left, right, top, bottom }) => x < left || x > right || y < top || y > bottom)(node.getBoundingClientRect());
24
+
25
+ const dismissableLayers = globalSingleton('bitsDismissableLayers', () =>
26
+ createLayerStack<DismissibleLayerState, ReadableBox<InteractOutsideBehaviorType>>(
27
+ (box) => box.current === 'close' || box.current === 'ignore',
28
+ ),
29
+ );
30
+
31
+ interface DismissibleLayerStateOpts
32
+ extends ReadableBoxedValues<Required<Pick<DismissibleLayerImplProps, 'enabled' | 'id' | 'interactOutsideBehavior'>>> {
33
+ ref: WritableBox<HTMLElement | null>;
34
+ // `onInteractOutside` stays a required key (a layer that notifies nobody is pointless) but may
35
+ // resolve to undefined; the other two are extras the layer no-ops without.
36
+ onInteractOutside: ReadableBox<EventCallback<PointerEvent> | undefined>;
37
+ onFocusOutside?: ReadableBox<((event: FocusEvent) => void) | undefined>;
38
+ isValidEvent?: ReadableBox<((e: PointerEvent, node: HTMLElement) => boolean) | undefined>;
39
+ /** Timer seam; defaults to {@link realTimers} (the real global timers). Tests inject a fake clock. */
40
+ timers?: Timers;
41
+ }
42
+
43
+ export class DismissibleLayerState {
44
+ static create(opts: DismissibleLayerStateOpts) {
45
+ return new DismissibleLayerState(opts);
46
+ }
47
+ readonly opts: DismissibleLayerStateOpts;
48
+ #interactOutsideProp: DismissibleLayerStateOpts['onInteractOutside'];
49
+ #behaviorType: ReadableBox<InteractOutsideBehaviorType>;
50
+ #interceptedEvents: Record<string, boolean> = {
51
+ pointerdown: false,
52
+ };
53
+ #isResponsibleLayer = false;
54
+ #isFocusInsideDOMTree = false;
55
+ #onFocusOutside: DismissibleLayerStateOpts['onFocusOutside'];
56
+ #unsubClickListener = () => {};
57
+ #timers: Timers;
58
+ #handleInteractOutside: Debounced<(e: PointerEvent) => void>;
59
+ #resetState: Debounced<() => void>;
60
+
61
+ constructor(opts: DismissibleLayerStateOpts) {
62
+ this.opts = opts;
63
+ this.#timers = opts.timers ?? realTimers;
64
+
65
+ this.#behaviorType = opts.interactOutsideBehavior;
66
+ this.#interactOutsideProp = opts.onInteractOutside;
67
+ this.#onFocusOutside = opts.onFocusOutside;
68
+
69
+ this.#handleInteractOutside = debounce(this.#timers, (e: PointerEvent) => {
70
+ if (!this.opts.ref.current) {
71
+ this.#unsubClickListener();
72
+ return;
73
+ }
74
+ const isEventValid = this.opts.isValidEvent?.current?.(e, this.opts.ref.current) || isValidEvent(e, this.opts.ref.current);
75
+
76
+ if (!this.#isResponsibleLayer || this.#isAnyEventIntercepted() || !isEventValid) {
77
+ this.#unsubClickListener();
78
+ return;
79
+ }
80
+
81
+ let event = e;
82
+ if (event.defaultPrevented) {
83
+ event = createWrappedEvent(event);
84
+ }
85
+
86
+ if (this.#behaviorType.current !== 'close' && this.#behaviorType.current !== 'defer-otherwise-close') {
87
+ this.#unsubClickListener();
88
+ return;
89
+ }
90
+
91
+ if (e.pointerType === 'touch') {
92
+ this.#unsubClickListener();
93
+
94
+ const doc = this.opts.ref.current?.ownerDocument ?? document;
95
+
96
+ this.#unsubClickListener = on(doc, 'click', this.#handleDismiss, {
97
+ once: true,
98
+ });
99
+ } else {
100
+ this.#interactOutsideProp.current?.(event);
101
+ }
102
+ }, 10);
103
+
104
+ this.#resetState = debounce(this.#timers, () => {
105
+ for (const eventType in this.#interceptedEvents) {
106
+ this.#interceptedEvents[eventType] = false;
107
+ }
108
+ this.#isResponsibleLayer = false;
109
+ }, 20);
110
+
111
+ const cleanup = () => {
112
+ this.#resetState();
113
+ dismissableLayers.unregister(this);
114
+ this.#handleInteractOutside.destroy();
115
+ };
116
+
117
+ $effect(() => {
118
+ this.opts.enabled.current;
119
+ this.opts.ref.current;
120
+ if (!this.opts.enabled.current || !this.opts.ref.current) return;
121
+ // Minted here, passed into the timeout: a stale timeout firing after this run
122
+ // was superseded adds listeners against an aborted signal, i.e. not at all.
123
+ const signal = getAbortSignal();
124
+ this.#timers.setTimeout(() => {
125
+ if (!this.opts.ref.current || signal.aborted) return;
126
+ dismissableLayers.register(this, this.#behaviorType);
127
+ this.#addEventListeners(signal);
128
+ }, 1);
129
+ return cleanup;
130
+ });
131
+
132
+ onMount(() => () => {
133
+ this.#resetState.destroy();
134
+ dismissableLayers.unregister(this);
135
+ this.#handleInteractOutside.destroy();
136
+ this.#unsubClickListener();
137
+ });
138
+ }
139
+
140
+ #handleFocus = (event: FocusEvent) => {
141
+ if (event.defaultPrevented) return;
142
+ if (!this.opts.ref.current) return;
143
+ tick().then(() => {
144
+ if (!this.opts.ref.current || this.#isTargetWithinLayer(event.target as HTMLElement)) return;
145
+
146
+ if (event.target && !this.#isFocusInsideDOMTree) {
147
+ this.#onFocusOutside?.current?.(event);
148
+ }
149
+ });
150
+ };
151
+
152
+ #addEventListeners(signal: AbortSignal) {
153
+ const doc = this.opts.ref.current?.ownerDocument ?? document;
154
+
155
+ on(doc, 'pointerdown', mergeHandlers(this.#markInterceptedEvent, this.#markResponsibleLayer), { capture: true, signal });
156
+ on(doc, 'pointerdown', mergeHandlers(this.#markNonInterceptedEvent, this.#handleInteractOutside), { signal });
157
+ on(doc, 'focusin', this.#handleFocus, { signal });
158
+ }
159
+
160
+ #handleDismiss = (e: MouseEvent) => {
161
+ let event = e;
162
+ if (event.defaultPrevented) {
163
+ event = createWrappedEvent(e);
164
+ }
165
+ this.#interactOutsideProp.current?.(e as PointerEvent);
166
+ };
167
+
168
+ #markInterceptedEvent = (e: PointerEvent) => {
169
+ this.#interceptedEvents[e.type] = true;
170
+ };
171
+
172
+ #markNonInterceptedEvent = (e: PointerEvent) => {
173
+ this.#interceptedEvents[e.type] = false;
174
+ };
175
+
176
+ #markResponsibleLayer = () => {
177
+ if (!this.opts.ref.current) return;
178
+ this.#isResponsibleLayer = dismissableLayers.isResponsible(this);
179
+ };
180
+ #isTargetWithinLayer = (target: HTMLElement) => {
181
+ return this.opts.ref.current?.contains(target) ?? false;
182
+ };
183
+
184
+ #isAnyEventIntercepted() {
185
+ const i = Object.values(this.#interceptedEvents).some(Boolean);
186
+ return i;
187
+ }
188
+
189
+ #onfocuscapture = () => {
190
+ this.#isFocusInsideDOMTree = true;
191
+ };
192
+
193
+ #onblurcapture = () => {
194
+ this.#isFocusInsideDOMTree = false;
195
+ };
196
+
197
+ props = {
198
+ onfocuscapture: this.#onfocuscapture,
199
+ onblurcapture: this.#onblurcapture,
200
+ };
201
+ }
202
+
203
+ /**
204
+ * The dismissible (interact-outside) behavior, without the renderless `<DismissibleLayer>` wrapper.
205
+ * Returns the focus-capture props (`onfocuscapture`/`onblurcapture`) and a node-lifecycle attachment
206
+ * separately, because the wrapper's two consumers differ: most overlays merge BOTH onto the content
207
+ * element, but dialog/sheet/alert-dialog historically merged only the activation (their default-slot
208
+ * usage dropped the capture props) — so callers keep that choice by merging `props` or not.
209
+ *
210
+ * Must be called during component init (the state uses `onMount`). The global `bitsDismissableLayers`
211
+ * stack (a shared `LayerStack`, see `internal/layer-stack.ts`) and the listeners are unchanged; the
212
+ * attachment just owns the node (registers on mount, deregisters on removal).
213
+ */
214
+ export function interactOutsideAttachment(opts: {
215
+ id: Getter<string>;
216
+ interactOutsideBehavior: Getter<InteractOutsideBehaviorType>;
217
+ onInteractOutside: Getter<InteractOutsideEventHandler | undefined>;
218
+ onFocusOutside?: Getter<((event: FocusEvent) => void) | undefined>;
219
+ enabled: Getter<boolean>;
220
+ isValidEvent?: Getter<((e: PointerEvent, node: HTMLElement) => boolean) | undefined>;
221
+ }): { props: { onfocuscapture: () => void; onblurcapture: () => void }; attachment: RefAttachment<HTMLElement> } {
222
+ const ref = simpleBox<HTMLElement | null>(null);
223
+ const state = DismissibleLayerState.create({
224
+ id: boxWith(opts.id),
225
+ interactOutsideBehavior: boxWith(opts.interactOutsideBehavior),
226
+ onInteractOutside: boxWith(opts.onInteractOutside),
227
+ enabled: boxWith(opts.enabled),
228
+ onFocusOutside: boxWith(() => opts.onFocusOutside?.()),
229
+ isValidEvent: boxWith(() => opts.isValidEvent?.()),
230
+ ref,
231
+ });
232
+ return { props: state.props, attachment: attachRef(ref) };
233
+ }
234
+
235
+ function isValidEvent(e: PointerEvent, node: HTMLElement): boolean {
236
+ const target = e.target;
237
+ if (!isElementOrSVGElement(target)) return false;
238
+
239
+ const targetIsContextMenuTrigger = Boolean(target.closest(`[${CONTEXT_MENU_TRIGGER_ATTR}]`));
240
+
241
+ // A context menu re-triggering over its own content: only the primary button counts.
242
+ if (targetIsContextMenuTrigger && node.closest(`[${CONTEXT_MENU_CONTENT_ATTR}]`)) return e.button === 0;
243
+ // Secondary buttons never dismiss, unless they landed on a context-menu trigger.
244
+ if (e.button > 0 && !targetIsContextMenuTrigger) return false;
245
+
246
+ return target.ownerDocument.documentElement.contains(target) && !node.contains(target) && isPointerOutsideRect(e, node);
247
+ }
248
+
249
+ export type FocusOutsideEvent = CustomEvent<{ originalEvent: FocusEvent }>;
250
+
251
+ function createWrappedEvent(e: PointerEvent | MouseEvent): PointerEvent {
252
+ const capturedCurrentTarget = e.currentTarget;
253
+ const capturedTarget = e.target;
254
+
255
+ // A `click` is already a PointerEvent in modern browsers; a synthetic MouseEvent replays as pointerdown.
256
+ const newEvent = new PointerEvent(e instanceof PointerEvent ? e.type : 'pointerdown', e);
257
+
258
+ // track the prevented state separately
259
+ let isPrevented = false;
260
+
261
+ // Create a proxy to intercept property access and method calls
262
+ const wrappedEvent = new Proxy(newEvent, {
263
+ get: (target, prop) => {
264
+ if (prop === 'currentTarget') {
265
+ return capturedCurrentTarget;
266
+ }
267
+ if (prop === 'target') {
268
+ return capturedTarget;
269
+ }
270
+ if (prop === 'preventDefault') {
271
+ return () => {
272
+ isPrevented = true;
273
+ if (typeof target.preventDefault === 'function') {
274
+ target.preventDefault();
275
+ }
276
+ };
277
+ }
278
+ if (prop === 'defaultPrevented') {
279
+ return isPrevented;
280
+ }
281
+ if (prop in target) {
282
+ // oxlint-disable-next-line no-explicit-any
283
+ return (target as any)[prop];
284
+ }
285
+ // oxlint-disable-next-line no-explicit-any
286
+ return (e as any)[prop];
287
+ },
288
+ });
289
+
290
+ return wrappedEvent as PointerEvent;
291
+ }
@@ -0,0 +1,3 @@
1
+ export { escapeKeydownAttachment } from './use-escape-layer.svelte.js';
2
+
3
+ export type { EscapeLayerProps } from './types.js';
@@ -0,0 +1,34 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { Box } from '../tools/index.js';
3
+
4
+ export type EscapeBehaviorType = 'close' | 'defer-otherwise-close' | 'defer-otherwise-ignore' | 'ignore';
5
+
6
+ export type EscapeLayerProps = {
7
+ /**
8
+ * Callback fired when escape is pressed.
9
+ */
10
+ onEscapeKeydown?: (e: KeyboardEvent) => void;
11
+
12
+ /**
13
+ * Escape behavior type.
14
+ * `close`: Closes the element immediately.
15
+ * `defer-otherwise-close`: Delegates the action to its parent component that has an
16
+ * escape keydown handler. If no parent is found, it closes the element.
17
+ * `defer-otherwise-ignore`: Delegates the action to the parent element. If no parent is found, nothing is done.
18
+ * `ignore`: Prevents the element from closing and also blocks the parent element from closing in response to an escape key press.
19
+ *
20
+ * @defaultValue `close`
21
+ */
22
+ escapeKeydownBehavior?: EscapeBehaviorType;
23
+ };
24
+
25
+ // internal props not exposed to the user but used in the implementation
26
+ export type EscapeLayerImplProps = {
27
+ /**
28
+ * Whether the layer is enabled. Currently, we determine this with the
29
+ * `presence` returned from the `presence` layer.
30
+ */
31
+ enabled: boolean;
32
+ children?: Snippet;
33
+ ref: Box<HTMLElement | null>;
34
+ } & EscapeLayerProps;