bits-ui 2.7.0 → 2.8.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 (366) hide show
  1. package/README.md +4 -4
  2. package/dist/bits/accordion/accordion.svelte.d.ts +66 -58
  3. package/dist/bits/accordion/accordion.svelte.js +56 -51
  4. package/dist/bits/accordion/components/accordion-content.svelte +4 -4
  5. package/dist/bits/accordion/components/accordion-header.svelte +2 -2
  6. package/dist/bits/accordion/components/accordion-item.svelte +2 -2
  7. package/dist/bits/accordion/components/accordion-trigger.svelte +2 -2
  8. package/dist/bits/accordion/components/accordion.svelte +2 -2
  9. package/dist/bits/alert-dialog/components/alert-dialog-action.svelte +2 -2
  10. package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte +2 -2
  11. package/dist/bits/alert-dialog/components/alert-dialog-content.svelte +3 -3
  12. package/dist/bits/alert-dialog/components/alert-dialog.svelte +9 -3
  13. package/dist/bits/aspect-ratio/aspect-ratio.svelte.d.ts +10 -16
  14. package/dist/bits/aspect-ratio/aspect-ratio.svelte.js +4 -11
  15. package/dist/bits/aspect-ratio/components/aspect-ratio.svelte +2 -2
  16. package/dist/bits/avatar/avatar.svelte.d.ts +25 -33
  17. package/dist/bits/avatar/avatar.svelte.js +20 -21
  18. package/dist/bits/avatar/components/avatar-fallback.svelte +2 -2
  19. package/dist/bits/avatar/components/avatar-image.svelte +2 -2
  20. package/dist/bits/avatar/components/avatar.svelte +2 -2
  21. package/dist/bits/calendar/calendar.svelte.d.ts +117 -106
  22. package/dist/bits/calendar/calendar.svelte.js +51 -52
  23. package/dist/bits/calendar/components/calendar-cell.svelte +2 -2
  24. package/dist/bits/calendar/components/calendar-day.svelte +2 -2
  25. package/dist/bits/calendar/components/calendar-grid-body.svelte +2 -2
  26. package/dist/bits/calendar/components/calendar-grid-head.svelte +2 -2
  27. package/dist/bits/calendar/components/calendar-grid-row.svelte +2 -2
  28. package/dist/bits/calendar/components/calendar-grid.svelte +2 -2
  29. package/dist/bits/calendar/components/calendar-head-cell.svelte +2 -2
  30. package/dist/bits/calendar/components/calendar-header.svelte +2 -2
  31. package/dist/bits/calendar/components/calendar-heading.svelte +5 -5
  32. package/dist/bits/calendar/components/calendar-month-select.svelte +2 -2
  33. package/dist/bits/calendar/components/calendar-next-button.svelte +2 -2
  34. package/dist/bits/calendar/components/calendar-prev-button.svelte +2 -2
  35. package/dist/bits/calendar/components/calendar-year-select.svelte +2 -2
  36. package/dist/bits/calendar/components/calendar.svelte +2 -2
  37. package/dist/bits/checkbox/checkbox.svelte.d.ts +37 -34
  38. package/dist/bits/checkbox/checkbox.svelte.js +19 -22
  39. package/dist/bits/checkbox/components/checkbox-group-label.svelte +2 -2
  40. package/dist/bits/checkbox/components/checkbox-group.svelte +2 -2
  41. package/dist/bits/checkbox/components/checkbox-input.svelte +2 -2
  42. package/dist/bits/checkbox/components/checkbox.svelte +2 -2
  43. package/dist/bits/collapsible/collapsible.svelte.d.ts +30 -27
  44. package/dist/bits/collapsible/collapsible.svelte.js +23 -15
  45. package/dist/bits/collapsible/components/collapsible-content.svelte +5 -5
  46. package/dist/bits/collapsible/components/collapsible-content.svelte.d.ts +1 -4
  47. package/dist/bits/collapsible/components/collapsible-trigger.svelte +2 -2
  48. package/dist/bits/collapsible/components/collapsible.svelte +4 -2
  49. package/dist/bits/collapsible/types.d.ts +4 -0
  50. package/dist/bits/combobox/components/combobox-input.svelte +2 -2
  51. package/dist/bits/combobox/components/combobox-trigger.svelte +2 -2
  52. package/dist/bits/combobox/components/combobox.svelte +4 -2
  53. package/dist/bits/command/command.svelte.d.ts +103 -92
  54. package/dist/bits/command/command.svelte.js +55 -57
  55. package/dist/bits/command/components/_command-label.svelte +2 -2
  56. package/dist/bits/command/components/command-empty.svelte +2 -2
  57. package/dist/bits/command/components/command-group-heading.svelte +2 -2
  58. package/dist/bits/command/components/command-group-items.svelte +2 -2
  59. package/dist/bits/command/components/command-group.svelte +2 -2
  60. package/dist/bits/command/components/command-input.svelte +2 -2
  61. package/dist/bits/command/components/command-item.svelte +2 -2
  62. package/dist/bits/command/components/command-link-item.svelte +2 -2
  63. package/dist/bits/command/components/command-list.svelte +2 -2
  64. package/dist/bits/command/components/command-loading.svelte +2 -2
  65. package/dist/bits/command/components/command-separator.svelte +2 -2
  66. package/dist/bits/command/components/command-viewport.svelte +2 -2
  67. package/dist/bits/command/components/command.svelte +2 -2
  68. package/dist/bits/context-menu/components/context-menu-content-static.svelte +3 -3
  69. package/dist/bits/context-menu/components/context-menu-content.svelte +3 -3
  70. package/dist/bits/context-menu/components/context-menu-trigger.svelte +2 -2
  71. package/dist/bits/context-menu/components/context-menu.svelte +16 -11
  72. package/dist/bits/date-field/components/date-field-hidden-input.svelte +2 -2
  73. package/dist/bits/date-field/components/date-field-input.svelte +2 -2
  74. package/dist/bits/date-field/components/date-field-label.svelte +2 -2
  75. package/dist/bits/date-field/components/date-field-segment.svelte +2 -2
  76. package/dist/bits/date-field/components/date-field.svelte +2 -2
  77. package/dist/bits/date-field/date-field.svelte.d.ts +85 -74
  78. package/dist/bits/date-field/date-field.svelte.js +55 -53
  79. package/dist/bits/date-picker/components/date-picker-calendar.svelte +2 -2
  80. package/dist/bits/date-picker/components/date-picker.svelte +8 -6
  81. package/dist/bits/date-picker/date-picker.svelte.d.ts +10 -10
  82. package/dist/bits/date-picker/date-picker.svelte.js +6 -5
  83. package/dist/bits/date-picker/types.d.ts +4 -0
  84. package/dist/bits/date-range-field/components/date-range-field-input.svelte +2 -2
  85. package/dist/bits/date-range-field/components/date-range-field-label.svelte +2 -2
  86. package/dist/bits/date-range-field/components/date-range-field.svelte +2 -2
  87. package/dist/bits/date-range-field/date-range-field.svelte.d.ts +32 -29
  88. package/dist/bits/date-range-field/date-range-field.svelte.js +33 -32
  89. package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +2 -2
  90. package/dist/bits/date-range-picker/components/date-range-picker.svelte +8 -6
  91. package/dist/bits/date-range-picker/date-range-picker.svelte.d.ts +10 -10
  92. package/dist/bits/date-range-picker/date-range-picker.svelte.js +6 -5
  93. package/dist/bits/date-range-picker/types.d.ts +4 -0
  94. package/dist/bits/dialog/components/dialog-close.svelte +2 -2
  95. package/dist/bits/dialog/components/dialog-content.svelte +3 -3
  96. package/dist/bits/dialog/components/dialog-description.svelte +2 -2
  97. package/dist/bits/dialog/components/dialog-overlay.svelte +3 -6
  98. package/dist/bits/dialog/components/dialog-title.svelte +2 -2
  99. package/dist/bits/dialog/components/dialog-trigger.svelte +2 -2
  100. package/dist/bits/dialog/components/dialog.svelte +9 -3
  101. package/dist/bits/dialog/dialog.svelte.d.ts +75 -65
  102. package/dist/bits/dialog/dialog.svelte.js +47 -38
  103. package/dist/bits/dialog/types.d.ts +4 -0
  104. package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +3 -3
  105. package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +3 -3
  106. package/dist/bits/label/components/label.svelte +2 -2
  107. package/dist/bits/label/label.svelte.d.ts +8 -7
  108. package/dist/bits/label/label.svelte.js +4 -4
  109. package/dist/bits/link-preview/components/link-preview-content-static.svelte +3 -3
  110. package/dist/bits/link-preview/components/link-preview-content.svelte +3 -3
  111. package/dist/bits/link-preview/components/link-preview-trigger.svelte +2 -2
  112. package/dist/bits/link-preview/components/link-preview.svelte +4 -2
  113. package/dist/bits/link-preview/link-preview.svelte.d.ts +28 -25
  114. package/dist/bits/link-preview/link-preview.svelte.js +24 -16
  115. package/dist/bits/link-preview/types.d.ts +4 -0
  116. package/dist/bits/menu/components/menu-arrow.svelte +2 -2
  117. package/dist/bits/menu/components/menu-checkbox-group.svelte +2 -2
  118. package/dist/bits/menu/components/menu-checkbox-item.svelte +2 -2
  119. package/dist/bits/menu/components/menu-content-static.svelte +3 -3
  120. package/dist/bits/menu/components/menu-content.svelte +3 -3
  121. package/dist/bits/menu/components/menu-group-heading.svelte +2 -2
  122. package/dist/bits/menu/components/menu-group.svelte +2 -2
  123. package/dist/bits/menu/components/menu-item.svelte +2 -2
  124. package/dist/bits/menu/components/menu-radio-group.svelte +2 -2
  125. package/dist/bits/menu/components/menu-radio-item.svelte +2 -2
  126. package/dist/bits/menu/components/menu-separator.svelte +2 -2
  127. package/dist/bits/menu/components/menu-sub-content-static.svelte +3 -3
  128. package/dist/bits/menu/components/menu-sub-content.svelte +3 -3
  129. package/dist/bits/menu/components/menu-sub-trigger.svelte +2 -2
  130. package/dist/bits/menu/components/menu-sub.svelte +9 -3
  131. package/dist/bits/menu/components/menu-trigger.svelte +2 -2
  132. package/dist/bits/menu/components/menu.svelte +16 -11
  133. package/dist/bits/menu/menu.svelte.d.ts +136 -119
  134. package/dist/bits/menu/menu.svelte.js +106 -96
  135. package/dist/bits/menu/types.d.ts +8 -0
  136. package/dist/bits/menubar/components/menubar-content-static.svelte +2 -2
  137. package/dist/bits/menubar/components/menubar-content.svelte +2 -2
  138. package/dist/bits/menubar/components/menubar-menu.svelte +2 -2
  139. package/dist/bits/menubar/components/menubar-trigger.svelte +4 -4
  140. package/dist/bits/menubar/components/menubar.svelte +2 -2
  141. package/dist/bits/menubar/menubar.svelte.d.ts +37 -34
  142. package/dist/bits/menubar/menubar.svelte.js +21 -21
  143. package/dist/bits/meter/components/meter.svelte +2 -2
  144. package/dist/bits/meter/meter.svelte.d.ts +10 -9
  145. package/dist/bits/meter/meter.svelte.js +4 -4
  146. package/dist/bits/navigation-menu/components/navigation-menu-content-impl.svelte +2 -2
  147. package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +3 -3
  148. package/dist/bits/navigation-menu/components/navigation-menu-indicator-impl.svelte +2 -2
  149. package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +3 -3
  150. package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +2 -2
  151. package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +2 -2
  152. package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +2 -2
  153. package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +2 -2
  154. package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +2 -2
  155. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +3 -3
  156. package/dist/bits/navigation-menu/components/navigation-menu.svelte +2 -2
  157. package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +116 -109
  158. package/dist/bits/navigation-menu/navigation-menu.svelte.js +78 -81
  159. package/dist/bits/pagination/components/pagination-next-button.svelte +2 -2
  160. package/dist/bits/pagination/components/pagination-page.svelte +2 -2
  161. package/dist/bits/pagination/components/pagination-prev-button.svelte +2 -2
  162. package/dist/bits/pagination/components/pagination.svelte +2 -2
  163. package/dist/bits/pagination/pagination.svelte.d.ts +34 -32
  164. package/dist/bits/pagination/pagination.svelte.js +15 -15
  165. package/dist/bits/pin-input/components/pin-input-cell.svelte +2 -2
  166. package/dist/bits/pin-input/components/pin-input.svelte +2 -2
  167. package/dist/bits/pin-input/pin-input.svelte.d.ts +22 -21
  168. package/dist/bits/pin-input/pin-input.svelte.js +9 -9
  169. package/dist/bits/popover/components/popover-close.svelte +2 -2
  170. package/dist/bits/popover/components/popover-content-static.svelte +3 -3
  171. package/dist/bits/popover/components/popover-content.svelte +3 -3
  172. package/dist/bits/popover/components/popover-trigger.svelte +2 -2
  173. package/dist/bits/popover/components/popover.svelte +9 -3
  174. package/dist/bits/popover/popover.svelte.d.ts +36 -31
  175. package/dist/bits/popover/popover.svelte.js +26 -21
  176. package/dist/bits/popover/types.d.ts +4 -0
  177. package/dist/bits/progress/components/progress.svelte +2 -2
  178. package/dist/bits/progress/progress.svelte.d.ts +10 -9
  179. package/dist/bits/progress/progress.svelte.js +4 -4
  180. package/dist/bits/radio-group/components/radio-group-input.svelte +2 -2
  181. package/dist/bits/radio-group/components/radio-group-item.svelte +2 -2
  182. package/dist/bits/radio-group/components/radio-group.svelte +2 -2
  183. package/dist/bits/radio-group/radio-group.svelte.d.ts +21 -19
  184. package/dist/bits/radio-group/radio-group.svelte.js +15 -15
  185. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +2 -2
  186. package/dist/bits/range-calendar/components/range-calendar-day.svelte +2 -2
  187. package/dist/bits/range-calendar/components/range-calendar.svelte +2 -2
  188. package/dist/bits/range-calendar/range-calendar.svelte.d.ts +21 -20
  189. package/dist/bits/range-calendar/range-calendar.svelte.js +12 -12
  190. package/dist/bits/rating-group/components/rating-group-input.svelte +2 -2
  191. package/dist/bits/rating-group/components/rating-group-item.svelte +2 -2
  192. package/dist/bits/rating-group/components/rating-group.svelte +2 -2
  193. package/dist/bits/rating-group/rating-group.svelte.d.ts +19 -18
  194. package/dist/bits/rating-group/rating-group.svelte.js +16 -17
  195. package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte +2 -2
  196. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +3 -3
  197. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +6 -6
  198. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +3 -3
  199. package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte +2 -2
  200. package/dist/bits/scroll-area/components/scroll-area-scrollbar-visible.svelte +2 -2
  201. package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte +2 -2
  202. package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte +2 -2
  203. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +2 -2
  204. package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte +2 -2
  205. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +2 -5
  206. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +2 -2
  207. package/dist/bits/scroll-area/components/scroll-area.svelte +2 -2
  208. package/dist/bits/scroll-area/scroll-area.svelte.d.ts +98 -78
  209. package/dist/bits/scroll-area/scroll-area.svelte.js +78 -74
  210. package/dist/bits/select/components/select-content-static.svelte +3 -3
  211. package/dist/bits/select/components/select-content.svelte +3 -3
  212. package/dist/bits/select/components/select-group-heading.svelte +2 -2
  213. package/dist/bits/select/components/select-group.svelte +2 -2
  214. package/dist/bits/select/components/select-hidden-input.svelte +2 -2
  215. package/dist/bits/select/components/select-item.svelte +2 -2
  216. package/dist/bits/select/components/select-scroll-down-button.svelte +2 -2
  217. package/dist/bits/select/components/select-scroll-up-button.svelte +2 -2
  218. package/dist/bits/select/components/select-trigger.svelte +2 -2
  219. package/dist/bits/select/components/select-viewport.svelte +2 -2
  220. package/dist/bits/select/components/select.svelte +4 -2
  221. package/dist/bits/select/select.svelte.d.ts +127 -113
  222. package/dist/bits/select/select.svelte.js +72 -62
  223. package/dist/bits/select/types.d.ts +4 -0
  224. package/dist/bits/separator/components/separator.svelte +2 -2
  225. package/dist/bits/separator/separator.svelte.d.ts +9 -8
  226. package/dist/bits/separator/separator.svelte.js +4 -4
  227. package/dist/bits/slider/components/slider-range.svelte +2 -2
  228. package/dist/bits/slider/components/slider-thumb-label.svelte +2 -2
  229. package/dist/bits/slider/components/slider-thumb.svelte +2 -2
  230. package/dist/bits/slider/components/slider-tick-label.svelte +2 -2
  231. package/dist/bits/slider/components/slider-tick.svelte +2 -2
  232. package/dist/bits/slider/components/slider.svelte +2 -2
  233. package/dist/bits/slider/slider.svelte.d.ts +82 -73
  234. package/dist/bits/slider/slider.svelte.js +30 -28
  235. package/dist/bits/switch/components/switch-input.svelte +2 -2
  236. package/dist/bits/switch/components/switch-thumb.svelte +2 -2
  237. package/dist/bits/switch/components/switch.svelte +2 -2
  238. package/dist/bits/switch/switch.svelte.d.ts +19 -17
  239. package/dist/bits/switch/switch.svelte.js +13 -13
  240. package/dist/bits/tabs/components/tabs-content.svelte +2 -2
  241. package/dist/bits/tabs/components/tabs-list.svelte +2 -2
  242. package/dist/bits/tabs/components/tabs-trigger.svelte +2 -2
  243. package/dist/bits/tabs/components/tabs.svelte +2 -2
  244. package/dist/bits/tabs/tabs.svelte.d.ts +33 -29
  245. package/dist/bits/tabs/tabs.svelte.js +19 -19
  246. package/dist/bits/time-field/components/time-field-hidden-input.svelte +2 -2
  247. package/dist/bits/time-field/components/time-field-input.svelte +2 -2
  248. package/dist/bits/time-field/components/time-field-label.svelte +2 -2
  249. package/dist/bits/time-field/components/time-field-segment.svelte +2 -2
  250. package/dist/bits/time-field/components/time-field.svelte +2 -2
  251. package/dist/bits/time-field/time-field.svelte.d.ts +72 -66
  252. package/dist/bits/time-field/time-field.svelte.js +37 -42
  253. package/dist/bits/time-range-field/components/time-range-field-input.svelte +2 -2
  254. package/dist/bits/time-range-field/components/time-range-field-label.svelte +2 -2
  255. package/dist/bits/time-range-field/components/time-range-field.svelte +2 -2
  256. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +35 -31
  257. package/dist/bits/time-range-field/time-range-field.svelte.js +34 -32
  258. package/dist/bits/toggle/components/toggle.svelte +2 -2
  259. package/dist/bits/toggle/toggle.svelte.d.ts +11 -10
  260. package/dist/bits/toggle/toggle.svelte.js +4 -4
  261. package/dist/bits/toggle-group/components/toggle-group-item.svelte +2 -2
  262. package/dist/bits/toggle-group/components/toggle-group.svelte +2 -2
  263. package/dist/bits/toggle-group/toggle-group.svelte.d.ts +48 -43
  264. package/dist/bits/toggle-group/toggle-group.svelte.js +24 -25
  265. package/dist/bits/toolbar/components/toolbar-button.svelte +2 -2
  266. package/dist/bits/toolbar/components/toolbar-group-item.svelte +2 -2
  267. package/dist/bits/toolbar/components/toolbar-group.svelte +2 -2
  268. package/dist/bits/toolbar/components/toolbar-link.svelte +2 -2
  269. package/dist/bits/toolbar/components/toolbar.svelte +2 -2
  270. package/dist/bits/toolbar/toolbar.svelte.d.ts +59 -51
  271. package/dist/bits/toolbar/toolbar.svelte.js +32 -30
  272. package/dist/bits/tooltip/components/tooltip-content-static.svelte +3 -3
  273. package/dist/bits/tooltip/components/tooltip-content.svelte +3 -3
  274. package/dist/bits/tooltip/components/tooltip-provider.svelte +2 -2
  275. package/dist/bits/tooltip/components/tooltip-trigger.svelte +2 -2
  276. package/dist/bits/tooltip/components/tooltip.svelte +4 -2
  277. package/dist/bits/tooltip/tooltip.svelte.d.ts +33 -29
  278. package/dist/bits/tooltip/tooltip.svelte.js +33 -28
  279. package/dist/bits/tooltip/types.d.ts +4 -0
  280. package/dist/bits/utilities/config/bits-config.d.ts +1 -1
  281. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -2
  282. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +6 -7
  283. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +3 -3
  284. package/dist/bits/utilities/escape-layer/escape-layer.svelte +2 -2
  285. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.d.ts +6 -7
  286. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.js +3 -3
  287. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -2
  288. package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte +2 -2
  289. package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte +2 -2
  290. package/dist/bits/utilities/floating-layer/components/floating-layer.svelte +2 -2
  291. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +25 -23
  292. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +25 -25
  293. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +1 -1
  294. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +1 -1
  295. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte +1 -1
  296. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte.d.ts +1 -1
  297. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +1 -1
  298. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte.d.ts +1 -1
  299. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -3
  300. package/dist/bits/utilities/presence-layer/presence-layer.svelte +8 -8
  301. package/dist/bits/utilities/presence-layer/presence.svelte.d.ts +42 -0
  302. package/dist/bits/utilities/presence-layer/presence.svelte.js +116 -0
  303. package/dist/bits/utilities/presence-layer/types.d.ts +3 -5
  304. package/dist/bits/utilities/scroll-lock/scroll-lock.svelte +2 -2
  305. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -2
  306. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +7 -7
  307. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +3 -3
  308. package/dist/internal/animations-complete.d.ts +12 -0
  309. package/dist/internal/animations-complete.js +55 -0
  310. package/dist/internal/arrays.js +20 -36
  311. package/dist/internal/attrs.d.ts +9 -2
  312. package/dist/internal/attrs.js +21 -11
  313. package/dist/internal/body-scroll-lock.svelte.d.ts +10 -0
  314. package/dist/internal/body-scroll-lock.svelte.js +106 -0
  315. package/dist/internal/data-typeahead.svelte.d.ts +15 -0
  316. package/dist/internal/data-typeahead.svelte.js +33 -0
  317. package/dist/internal/date-time/calendar-helpers.svelte.d.ts +1 -1
  318. package/dist/internal/dom-typeahead.svelte.d.ts +14 -0
  319. package/dist/internal/dom-typeahead.svelte.js +44 -0
  320. package/dist/internal/dom.d.ts +0 -2
  321. package/dist/internal/dom.js +0 -15
  322. package/dist/internal/{use-grace-area.svelte.d.ts → grace-area.svelte.d.ts} +5 -4
  323. package/dist/internal/{use-grace-area.svelte.js → grace-area.svelte.js} +60 -56
  324. package/dist/internal/open-change-complete.d.ts +13 -0
  325. package/dist/internal/open-change-complete.js +24 -0
  326. package/dist/internal/{use-roving-focus.svelte.d.ts → roving-focus-group.d.ts} +9 -8
  327. package/dist/internal/{use-roving-focus.svelte.js → roving-focus-group.js} +30 -34
  328. package/dist/internal/shared-state.svelte.d.ts +6 -0
  329. package/dist/internal/shared-state.svelte.js +31 -0
  330. package/dist/internal/should-trap-focus.js +1 -2
  331. package/dist/internal/state-machine.d.ts +16 -0
  332. package/dist/internal/state-machine.js +18 -0
  333. package/dist/internal/svelte-resize-observer.svelte.d.ts +6 -0
  334. package/dist/internal/svelte-resize-observer.svelte.js +25 -0
  335. package/dist/internal/tabbable.d.ts +0 -1
  336. package/dist/internal/tabbable.js +0 -11
  337. package/dist/internal/timeout-fn.d.ts +16 -0
  338. package/dist/internal/timeout-fn.js +38 -0
  339. package/dist/internal/types.d.ts +2 -2
  340. package/package.json +1 -1
  341. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +0 -4
  342. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +0 -97
  343. package/dist/internal/box.svelte.d.ts +0 -21
  344. package/dist/internal/box.svelte.js +0 -26
  345. package/dist/internal/create-event-hook.svelte.d.ts +0 -18
  346. package/dist/internal/create-event-hook.svelte.js +0 -29
  347. package/dist/internal/create-shared-hook.svelte.d.ts +0 -2
  348. package/dist/internal/create-shared-hook.svelte.js +0 -27
  349. package/dist/internal/sleep.d.ts +0 -1
  350. package/dist/internal/sleep.js +0 -3
  351. package/dist/internal/use-after-animations.svelte.d.ts +0 -5
  352. package/dist/internal/use-after-animations.svelte.js +0 -27
  353. package/dist/internal/use-body-scroll-lock.svelte.d.ts +0 -6
  354. package/dist/internal/use-body-scroll-lock.svelte.js +0 -106
  355. package/dist/internal/use-data-typeahead.svelte.d.ts +0 -15
  356. package/dist/internal/use-data-typeahead.svelte.js +0 -34
  357. package/dist/internal/use-dom-typeahead.svelte.d.ts +0 -13
  358. package/dist/internal/use-dom-typeahead.svelte.js +0 -32
  359. package/dist/internal/use-form-control.svelte.d.ts +0 -4
  360. package/dist/internal/use-form-control.svelte.js +0 -16
  361. package/dist/internal/use-resize-observer.svelte.d.ts +0 -2
  362. package/dist/internal/use-resize-observer.svelte.js +0 -17
  363. package/dist/internal/use-state-machine.svelte.d.ts +0 -24
  364. package/dist/internal/use-state-machine.svelte.js +0 -28
  365. package/dist/internal/use-timeout-fn.svelte.d.ts +0 -25
  366. package/dist/internal/use-timeout-fn.svelte.js +0 -39
@@ -2,42 +2,35 @@
2
2
  * Checks if two arrays are equal by comparing their values.
3
3
  */
4
4
  export function arraysAreEqual(arr1, arr2) {
5
- if (arr1.length !== arr2.length) {
5
+ if (arr1.length !== arr2.length)
6
6
  return false;
7
- }
8
7
  return arr1.every((value, index) => isEqual(value, arr2[index]));
9
8
  }
10
9
  /**
11
10
  * A utility function that compares two values for equality.
12
11
  */
13
12
  function isEqual(a, b) {
14
- if (Number.isNaN(a) && Number.isNaN(b)) {
13
+ if (Number.isNaN(a) && Number.isNaN(b))
15
14
  return true;
16
- }
17
- if (Array.isArray(a) && Array.isArray(b)) {
15
+ if (Array.isArray(a) && Array.isArray(b))
18
16
  return arraysAreEqual(a, b);
19
- }
20
- if (typeof a === "object" && typeof b === "object") {
17
+ if (typeof a === "object" && typeof b === "object")
21
18
  return isDeepEqual(a, b);
22
- }
23
19
  return Object.is(a, b);
24
20
  }
25
21
  /**
26
22
  * A utility function that compares two values for deep equality.
27
23
  */
28
24
  function isDeepEqual(a, b) {
29
- if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
25
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null)
30
26
  return false;
31
- }
32
27
  const aKeys = Object.keys(a);
33
28
  const bKeys = Object.keys(b);
34
- if (aKeys.length !== bKeys.length) {
29
+ if (aKeys.length !== bKeys.length)
35
30
  return false;
36
- }
37
31
  for (const key of aKeys) {
38
- if (!bKeys.includes(key)) {
32
+ if (!bKeys.includes(key))
39
33
  return false;
40
- }
41
34
  if (!isEqual(a[key], b[key])) {
42
35
  return false;
43
36
  }
@@ -56,9 +49,8 @@ function isDeepEqual(a, b) {
56
49
  * ```
57
50
  */
58
51
  export function chunk(arr, size) {
59
- if (size <= 0) {
52
+ if (size <= 0)
60
53
  return [];
61
- }
62
54
  const result = [];
63
55
  for (let i = 0; i < arr.length; i += size) {
64
56
  result.push(arr.slice(i, i + size));
@@ -88,15 +80,12 @@ export function isValidIndex(index, arr) {
88
80
  * @param loop loop to the beginning of the array if the next index is out of bounds?
89
81
  */
90
82
  export function next(array, index, loop = true) {
91
- if (array.length === 0 || index < 0 || index >= array.length) {
92
- return undefined;
93
- }
94
- if (array.length === 1 && index === 0) {
83
+ if (array.length === 0 || index < 0 || index >= array.length)
84
+ return;
85
+ if (array.length === 1 && index === 0)
95
86
  return array[0];
96
- }
97
- if (index === array.length - 1) {
87
+ if (index === array.length - 1)
98
88
  return loop ? array[0] : undefined;
99
- }
100
89
  return array[index + 1];
101
90
  }
102
91
  /**
@@ -107,15 +96,12 @@ export function next(array, index, loop = true) {
107
96
  * @param loop loop to the end of the array if the previous index is out of bounds?
108
97
  */
109
98
  export function prev(array, index, loop = true) {
110
- if (array.length === 0 || index < 0 || index >= array.length) {
111
- return undefined;
112
- }
113
- if (array.length === 1 && index === 0) {
99
+ if (array.length === 0 || index < 0 || index >= array.length)
100
+ return;
101
+ if (array.length === 1 && index === 0)
114
102
  return array[0];
115
- }
116
- if (index === 0) {
103
+ if (index === 0)
117
104
  return loop ? array[array.length - 1] : undefined;
118
- }
119
105
  return array[index - 1];
120
106
  }
121
107
  /**
@@ -129,9 +115,8 @@ export function prev(array, index, loop = true) {
129
115
  * @param loop loop around the array if the target index is out of bounds?
130
116
  */
131
117
  export function forward(array, index, increment, loop = true) {
132
- if (array.length === 0 || index < 0 || index >= array.length) {
133
- return undefined;
134
- }
118
+ if (array.length === 0 || index < 0 || index >= array.length)
119
+ return;
135
120
  let targetIndex = index + increment;
136
121
  if (loop) {
137
122
  // Ensure positive modulus
@@ -154,9 +139,8 @@ export function forward(array, index, increment, loop = true) {
154
139
  * @param loop loop around the array if the target index is out of bounds?
155
140
  */
156
141
  export function backward(array, index, decrement, loop = true) {
157
- if (array.length === 0 || index < 0 || index >= array.length) {
158
- return undefined;
159
- }
142
+ if (array.length === 0 || index < 0 || index >= array.length)
143
+ return;
160
144
  let targetIndex = index - decrement;
161
145
  if (loop) {
162
146
  // Ensure positive modulus
@@ -25,12 +25,19 @@ export type BitsAttrsConfig<T extends readonly string[]> = {
25
25
  parts: T;
26
26
  getVariant?: () => string | null;
27
27
  };
28
- export type BitsAttrs<T extends readonly string[]> = {
28
+ export type CreateBitsAttrsReturn<T extends readonly string[]> = {
29
29
  [K in T[number]]: string;
30
30
  } & {
31
31
  selector: (part: T[number]) => string;
32
32
  getAttr: (part: T[number], variant?: string) => string;
33
33
  };
34
+ export declare class BitsAttrs<T extends readonly string[]> {
35
+ #private;
36
+ attrs: Record<T[number], string>;
37
+ constructor(config: BitsAttrsConfig<T>);
38
+ getAttr(part: T[number], variantOverride?: string): string;
39
+ selector(part: T[number], variantOverride?: string): string;
40
+ }
34
41
  export declare function createBitsAttrs<const T extends readonly string[]>(config: Omit<BitsAttrsConfig<T>, "parts"> & {
35
42
  parts: T;
36
- }): BitsAttrs<T>;
43
+ }): CreateBitsAttrsReturn<T>;
@@ -67,21 +67,31 @@ export function getAriaPressed(condition) {
67
67
  export function getRequired(condition) {
68
68
  return condition ? true : undefined;
69
69
  }
70
- export function createBitsAttrs(config) {
71
- const variant = config.getVariant?.();
72
- const prefix = variant ? `data-${variant}-` : `data-${config.component}-`;
73
- function getAttr(part, variantOverride) {
70
+ export class BitsAttrs {
71
+ #variant;
72
+ #prefix;
73
+ attrs;
74
+ constructor(config) {
75
+ this.#variant = config.getVariant ? config.getVariant() : null;
76
+ this.#prefix = this.#variant ? `data-${this.#variant}-` : `data-${config.component}-`;
77
+ this.getAttr = this.getAttr.bind(this);
78
+ this.selector = this.selector.bind(this);
79
+ this.attrs = Object.fromEntries(config.parts.map((part) => [part, this.getAttr(part)]));
80
+ }
81
+ getAttr(part, variantOverride) {
74
82
  if (variantOverride)
75
83
  return `data-${variantOverride}-${part}`;
76
- return `${prefix}${part}`;
84
+ return `${this.#prefix}${part}`;
77
85
  }
78
- function selector(part, variantOverride) {
79
- return `[${getAttr(part, variantOverride)}]`;
86
+ selector(part, variantOverride) {
87
+ return `[${this.getAttr(part, variantOverride)}]`;
80
88
  }
81
- const attrs = Object.fromEntries(config.parts.map((part) => [part, getAttr(part)]));
89
+ }
90
+ export function createBitsAttrs(config) {
91
+ const bitsAttrs = new BitsAttrs(config);
82
92
  return {
83
- ...attrs,
84
- selector,
85
- getAttr,
93
+ ...bitsAttrs.attrs,
94
+ selector: bitsAttrs.selector,
95
+ getAttr: bitsAttrs.getAttr,
86
96
  };
87
97
  }
@@ -0,0 +1,10 @@
1
+ import { type Getter, type ReadableBox } from "svelte-toolbelt";
2
+ export interface ScrollBodyOption {
3
+ padding?: boolean | number;
4
+ margin?: boolean | number;
5
+ }
6
+ export declare class BodyScrollLock {
7
+ #private;
8
+ readonly locked: ReadableBox<boolean> | undefined;
9
+ constructor(initialState?: boolean | undefined, restoreScrollDelay?: Getter<number | null>);
10
+ }
@@ -0,0 +1,106 @@
1
+ import { SvelteMap } from "svelte/reactivity";
2
+ import { afterSleep, afterTick, box, onDestroyEffect, } from "svelte-toolbelt";
3
+ import { isBrowser, isIOS } from "./is.js";
4
+ import { addEventListener } from "./events.js";
5
+ import { useId } from "./use-id.js";
6
+ import { watch } from "runed";
7
+ import { SharedState } from "./shared-state.svelte.js";
8
+ const bodyLockStackCount = new SharedState(() => {
9
+ const map = new SvelteMap();
10
+ const locked = $derived.by(() => {
11
+ for (const value of map.values()) {
12
+ if (value)
13
+ return true;
14
+ }
15
+ return false;
16
+ });
17
+ let initialBodyStyle = $state(null);
18
+ let stopTouchMoveListener = null;
19
+ function resetBodyStyle() {
20
+ if (!isBrowser)
21
+ return;
22
+ document.body.setAttribute("style", initialBodyStyle ?? "");
23
+ document.body.style.removeProperty("--scrollbar-width");
24
+ isIOS && stopTouchMoveListener?.();
25
+ }
26
+ watch(() => locked, () => {
27
+ if (!locked)
28
+ return;
29
+ initialBodyStyle = document.body.getAttribute("style");
30
+ const bodyStyle = getComputedStyle(document.body);
31
+ // TODO: account for RTL direction, etc.
32
+ const verticalScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
33
+ const paddingRight = Number.parseInt(bodyStyle.paddingRight ?? "0", 10);
34
+ const config = {
35
+ padding: paddingRight + verticalScrollbarWidth,
36
+ margin: Number.parseInt(bodyStyle.marginRight ?? "0", 10),
37
+ };
38
+ if (verticalScrollbarWidth > 0) {
39
+ document.body.style.paddingRight = `${config.padding}px`;
40
+ document.body.style.marginRight = `${config.margin}px`;
41
+ document.body.style.setProperty("--scrollbar-width", `${verticalScrollbarWidth}px`);
42
+ document.body.style.overflow = "hidden";
43
+ }
44
+ if (isIOS) {
45
+ stopTouchMoveListener = addEventListener(document, "touchmove", (e) => {
46
+ if (e.target !== document.documentElement)
47
+ return;
48
+ if (e.touches.length > 1)
49
+ return;
50
+ e.preventDefault();
51
+ }, { passive: false });
52
+ }
53
+ afterTick(() => {
54
+ document.body.style.pointerEvents = "none";
55
+ document.body.style.overflow = "hidden";
56
+ });
57
+ });
58
+ onDestroyEffect(() => {
59
+ return () => {
60
+ stopTouchMoveListener?.();
61
+ };
62
+ });
63
+ return {
64
+ get map() {
65
+ return map;
66
+ },
67
+ resetBodyStyle,
68
+ };
69
+ });
70
+ export class BodyScrollLock {
71
+ #id = useId();
72
+ #initialState;
73
+ #restoreScrollDelay = () => null;
74
+ #countState;
75
+ locked;
76
+ constructor(initialState, restoreScrollDelay = () => null) {
77
+ this.#initialState = initialState;
78
+ this.#restoreScrollDelay = restoreScrollDelay;
79
+ this.#countState = bodyLockStackCount.get();
80
+ if (!this.#countState)
81
+ return;
82
+ this.#countState.map.set(this.#id, this.#initialState ?? false);
83
+ this.locked = box.with(() => this.#countState.map.get(this.#id) ?? false, (v) => this.#countState.map.set(this.#id, v));
84
+ onDestroyEffect(() => {
85
+ this.#countState.map.delete(this.#id);
86
+ // if any locks are still active, we don't reset the body style
87
+ if (isAnyLocked(this.#countState.map))
88
+ return;
89
+ const restoreScrollDelay = this.#restoreScrollDelay();
90
+ // if no locks are active (meaning this was the last lock), we reset the body style
91
+ if (restoreScrollDelay === null) {
92
+ requestAnimationFrame(() => this.#countState.resetBodyStyle());
93
+ }
94
+ else {
95
+ afterSleep(restoreScrollDelay, () => this.#countState.resetBodyStyle());
96
+ }
97
+ });
98
+ }
99
+ }
100
+ function isAnyLocked(map) {
101
+ for (const [_, value] of map) {
102
+ if (value)
103
+ return true;
104
+ }
105
+ return false;
106
+ }
@@ -0,0 +1,15 @@
1
+ import type { Getter } from "svelte-toolbelt";
2
+ interface DataTypeaheadOpts {
3
+ onMatch: (value: string) => void;
4
+ getCurrentItem: () => string;
5
+ candidateValues: Getter<string[]>;
6
+ enabled: Getter<boolean>;
7
+ getWindow: () => Window & typeof globalThis;
8
+ }
9
+ export declare class DataTypeahead {
10
+ #private;
11
+ constructor(opts: DataTypeaheadOpts);
12
+ handleTypeaheadSearch(key: string): string | undefined;
13
+ resetTypeahead(): void;
14
+ }
15
+ export {};
@@ -0,0 +1,33 @@
1
+ import { getNextMatch } from "./arrays.js";
2
+ import { boxAutoReset } from "./box-auto-reset.svelte.js";
3
+ export class DataTypeahead {
4
+ #opts;
5
+ #candidateValues = $derived.by(() => this.#opts.candidateValues());
6
+ #search;
7
+ constructor(opts) {
8
+ this.#opts = opts;
9
+ this.#search = boxAutoReset("", {
10
+ afterMs: 1000,
11
+ getWindow: this.#opts.getWindow,
12
+ });
13
+ this.handleTypeaheadSearch = this.handleTypeaheadSearch.bind(this);
14
+ this.resetTypeahead = this.resetTypeahead.bind(this);
15
+ }
16
+ handleTypeaheadSearch(key) {
17
+ if (!this.#opts.enabled() || !this.#candidateValues.length)
18
+ return;
19
+ this.#search.current = this.#search.current + key;
20
+ const currentItem = this.#opts.getCurrentItem();
21
+ const currentMatch = this.#candidateValues.find((item) => item === currentItem) ?? "";
22
+ const values = this.#candidateValues.map((item) => item ?? "");
23
+ const nextMatch = getNextMatch(values, this.#search.current, currentMatch);
24
+ const newItem = this.#candidateValues.find((item) => item === nextMatch);
25
+ if (newItem) {
26
+ this.#opts.onMatch(newItem);
27
+ }
28
+ return newItem;
29
+ }
30
+ resetTypeahead() {
31
+ this.#search.current = "";
32
+ }
33
+ }
@@ -198,7 +198,7 @@ export declare function useEnsureNonDisabledPlaceholder({ ref, placeholder, defa
198
198
  defaultPlaceholder: DateValue;
199
199
  }): void;
200
200
  export declare function getDateWithPreviousTime(date: DateValue | undefined, prev: DateValue | undefined): DateValue | undefined;
201
- export declare const calendarAttrs: import("../attrs.js").BitsAttrs<readonly ["root", "grid", "cell", "next-button", "prev-button", "day", "grid-body", "grid-head", "grid-row", "head-cell", "header", "heading", "month-select", "year-select"]>;
201
+ export declare const calendarAttrs: import("../attrs.js").CreateBitsAttrsReturn<readonly ["root", "grid", "cell", "next-button", "prev-button", "day", "grid-body", "grid-head", "grid-row", "head-cell", "header", "heading", "month-select", "year-select"]>;
202
202
  type GetDefaultYearsProps = {
203
203
  placeholderYear: number;
204
204
  minValue: DateValue | undefined;
@@ -0,0 +1,14 @@
1
+ type DOMTypeaheadOptions = {
2
+ onMatch?: (item: HTMLElement) => void;
3
+ getCurrentItem?: () => HTMLElement | null;
4
+ getActiveElement: () => HTMLElement | null;
5
+ getWindow: () => Window & typeof globalThis;
6
+ };
7
+ export declare class DOMTypeahead {
8
+ #private;
9
+ constructor(opts: DOMTypeaheadOptions);
10
+ handleTypeaheadSearch(key: string, candidates: HTMLElement[]): HTMLElement | undefined;
11
+ resetTypeahead(): void;
12
+ get search(): string;
13
+ }
14
+ export {};
@@ -0,0 +1,44 @@
1
+ import { getNextMatch } from "./arrays.js";
2
+ import { boxAutoReset } from "./box-auto-reset.svelte.js";
3
+ export class DOMTypeahead {
4
+ #opts;
5
+ #search;
6
+ #onMatch = $derived.by(() => {
7
+ if (this.#opts.onMatch)
8
+ return this.#opts.onMatch;
9
+ return (node) => node.focus();
10
+ });
11
+ #getCurrentItem = $derived.by(() => {
12
+ if (this.#opts.getCurrentItem)
13
+ return this.#opts.getCurrentItem;
14
+ return this.#opts.getActiveElement;
15
+ });
16
+ constructor(opts) {
17
+ this.#opts = opts;
18
+ this.#search = boxAutoReset("", {
19
+ afterMs: 1000,
20
+ getWindow: opts.getWindow,
21
+ });
22
+ this.handleTypeaheadSearch = this.handleTypeaheadSearch.bind(this);
23
+ this.resetTypeahead = this.resetTypeahead.bind(this);
24
+ }
25
+ handleTypeaheadSearch(key, candidates) {
26
+ if (!candidates.length)
27
+ return;
28
+ this.#search.current = this.#search.current + key;
29
+ const currentItem = this.#getCurrentItem();
30
+ const currentMatch = candidates.find((item) => item === currentItem)?.textContent?.trim() ?? "";
31
+ const values = candidates.map((item) => item.textContent?.trim() ?? "");
32
+ const nextMatch = getNextMatch(values, this.#search.current, currentMatch);
33
+ const newItem = candidates.find((item) => item.textContent?.trim() === nextMatch);
34
+ if (newItem)
35
+ this.#onMatch(newItem);
36
+ return newItem;
37
+ }
38
+ resetTypeahead() {
39
+ this.#search.current = "";
40
+ }
41
+ get search() {
42
+ return this.#search.current;
43
+ }
44
+ }
@@ -1,4 +1,3 @@
1
- export declare function activeElement(doc: Document): Element | null;
2
1
  export declare function getFirstNonCommentChild(element: HTMLElement | null): ChildNode | null;
3
2
  /**
4
3
  * Determines if the click event truly occurred outside the content node.
@@ -6,4 +5,3 @@ export declare function getFirstNonCommentChild(element: HTMLElement | null): Ch
6
5
  * into the DOM but visually appear inside the content.
7
6
  */
8
7
  export declare function isClickTrulyOutside(event: PointerEvent, contentNode: HTMLElement): boolean;
9
- export declare function getTarget(event: Event): EventTarget | null | undefined;
@@ -1,10 +1,3 @@
1
- export function activeElement(doc) {
2
- let activeElement = doc.activeElement;
3
- while (activeElement?.shadowRoot?.activeElement != null) {
4
- activeElement = activeElement.shadowRoot.activeElement;
5
- }
6
- return activeElement;
7
- }
8
1
  export function getFirstNonCommentChild(element) {
9
2
  if (!element)
10
3
  return null;
@@ -25,11 +18,3 @@ export function isClickTrulyOutside(event, contentNode) {
25
18
  const rect = contentNode.getBoundingClientRect();
26
19
  return (clientX < rect.left || clientX > rect.right || clientY < rect.top || clientY > rect.bottom);
27
20
  }
28
- export function getTarget(event) {
29
- if ("composedPath" in event) {
30
- return event.composedPath()[0];
31
- }
32
- // TS thinks `event` is of type never as it assumes all browsers support
33
- // `composedPath()`, but browsers without shadow DOM don't.
34
- return event.target;
35
- }
@@ -1,5 +1,5 @@
1
1
  import { type Getter } from "svelte-toolbelt";
2
- interface UseGraceAreaOpts {
2
+ interface GraceAreaOptions {
3
3
  enabled: Getter<boolean>;
4
4
  triggerNode: Getter<HTMLElement | null>;
5
5
  contentNode: Getter<HTMLElement | null>;
@@ -7,7 +7,8 @@ interface UseGraceAreaOpts {
7
7
  setIsPointerInTransit?: (value: boolean) => void;
8
8
  transitTimeout?: number;
9
9
  }
10
- export declare function useGraceArea(opts: UseGraceAreaOpts): {
11
- isPointerInTransit: import("svelte-toolbelt").WritableBox<boolean>;
12
- };
10
+ export declare class GraceArea {
11
+ #private;
12
+ constructor(opts: GraceAreaOptions);
13
+ }
13
14
  export {};
@@ -1,25 +1,66 @@
1
- import { executeCallbacks, getDocument, getWindow } from "svelte-toolbelt";
1
+ import { executeCallbacks, getDocument, getWindow, } from "svelte-toolbelt";
2
2
  import { on } from "svelte/events";
3
3
  import { watch } from "runed";
4
4
  import { boxAutoReset } from "./box-auto-reset.svelte.js";
5
5
  import { isElement, isHTMLElement } from "./is.js";
6
- export function useGraceArea(opts) {
7
- const enabled = $derived(opts.enabled());
8
- const isPointerInTransit = boxAutoReset(false, {
9
- afterMs: opts.transitTimeout ?? 300,
10
- onChange: (value) => {
11
- if (enabled) {
12
- opts.setIsPointerInTransit?.(value);
13
- }
14
- },
15
- getWindow: () => getWindow(opts.triggerNode()),
16
- });
17
- let pointerGraceArea = $state(null);
18
- function handleRemoveGraceArea() {
19
- pointerGraceArea = null;
20
- isPointerInTransit.current = false;
6
+ export class GraceArea {
7
+ #opts;
8
+ #enabled;
9
+ #isPointerInTransit;
10
+ #pointerGraceArea = $state(null);
11
+ constructor(opts) {
12
+ this.#opts = opts;
13
+ this.#enabled = $derived(this.#opts.enabled());
14
+ this.#isPointerInTransit = boxAutoReset(false, {
15
+ afterMs: opts.transitTimeout ?? 300,
16
+ onChange: (value) => {
17
+ if (!this.#enabled)
18
+ return;
19
+ this.#opts.setIsPointerInTransit?.(value);
20
+ },
21
+ getWindow: () => getWindow(this.#opts.triggerNode()),
22
+ });
23
+ watch([opts.triggerNode, opts.contentNode, opts.enabled], ([triggerNode, contentNode, enabled]) => {
24
+ if (!triggerNode || !contentNode || !enabled)
25
+ return;
26
+ const handleTriggerLeave = (e) => {
27
+ this.#createGraceArea(e, contentNode);
28
+ };
29
+ const handleContentLeave = (e) => {
30
+ this.#createGraceArea(e, triggerNode);
31
+ };
32
+ return executeCallbacks(on(triggerNode, "pointerleave", handleTriggerLeave), on(contentNode, "pointerleave", handleContentLeave));
33
+ });
34
+ watch(() => this.#pointerGraceArea, () => {
35
+ const handleTrackPointerGrace = (e) => {
36
+ if (!this.#pointerGraceArea)
37
+ return;
38
+ const target = e.target;
39
+ if (!isElement(target))
40
+ return;
41
+ const pointerPosition = { x: e.clientX, y: e.clientY };
42
+ const hasEnteredTarget = opts.triggerNode()?.contains(target) ||
43
+ opts.contentNode()?.contains(target);
44
+ const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, this.#pointerGraceArea);
45
+ if (hasEnteredTarget) {
46
+ this.#removeGraceArea();
47
+ }
48
+ else if (isPointerOutsideGraceArea) {
49
+ this.#removeGraceArea();
50
+ opts.onPointerExit();
51
+ }
52
+ };
53
+ const doc = getDocument(opts.triggerNode() ?? opts.contentNode());
54
+ if (!doc)
55
+ return;
56
+ return on(doc, "pointermove", handleTrackPointerGrace);
57
+ });
21
58
  }
22
- function handleCreateGraceArea(e, hoverTarget) {
59
+ #removeGraceArea() {
60
+ this.#pointerGraceArea = null;
61
+ this.#isPointerInTransit.current = false;
62
+ }
63
+ #createGraceArea(e, hoverTarget) {
23
64
  const currentTarget = e.currentTarget;
24
65
  if (!isHTMLElement(currentTarget))
25
66
  return;
@@ -28,46 +69,9 @@ export function useGraceArea(opts) {
28
69
  const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);
29
70
  const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());
30
71
  const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);
31
- pointerGraceArea = graceArea;
32
- isPointerInTransit.current = true;
72
+ this.#pointerGraceArea = graceArea;
73
+ this.#isPointerInTransit.current = true;
33
74
  }
34
- watch([opts.triggerNode, opts.contentNode, opts.enabled], ([triggerNode, contentNode, enabled]) => {
35
- if (!triggerNode || !contentNode || !enabled)
36
- return;
37
- const handleTriggerLeave = (e) => {
38
- handleCreateGraceArea(e, contentNode);
39
- };
40
- const handleContentLeave = (e) => {
41
- handleCreateGraceArea(e, triggerNode);
42
- };
43
- return executeCallbacks(on(triggerNode, "pointerleave", handleTriggerLeave), on(contentNode, "pointerleave", handleContentLeave));
44
- });
45
- watch(() => pointerGraceArea, () => {
46
- const handleTrackPointerGrace = (e) => {
47
- if (!pointerGraceArea)
48
- return;
49
- const target = e.target;
50
- if (!isElement(target))
51
- return;
52
- const pointerPosition = { x: e.clientX, y: e.clientY };
53
- const hasEnteredTarget = opts.triggerNode()?.contains(target) || opts.contentNode()?.contains(target);
54
- const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);
55
- if (hasEnteredTarget) {
56
- handleRemoveGraceArea();
57
- }
58
- else if (isPointerOutsideGraceArea) {
59
- handleRemoveGraceArea();
60
- opts.onPointerExit();
61
- }
62
- };
63
- const doc = getDocument(opts.triggerNode() ?? opts.contentNode());
64
- if (!doc)
65
- return;
66
- return on(doc, "pointermove", handleTrackPointerGrace);
67
- });
68
- return {
69
- isPointerInTransit,
70
- };
71
75
  }
72
76
  function getExitSideFromRect(point, rect) {
73
77
  const top = Math.abs(rect.top - point.y);
@@ -0,0 +1,13 @@
1
+ import type { ReadableBoxedValues } from "svelte-toolbelt";
2
+ interface OpenChangeCompleteOpts extends ReadableBoxedValues<{
3
+ open: boolean;
4
+ ref: HTMLElement | null;
5
+ }> {
6
+ onComplete: () => void;
7
+ enabled?: boolean;
8
+ }
9
+ export declare class OpenChangeComplete {
10
+ #private;
11
+ constructor(opts: OpenChangeCompleteOpts);
12
+ }
13
+ export {};
@@ -0,0 +1,24 @@
1
+ import { watch } from "runed";
2
+ import { AnimationsComplete } from "./animations-complete.js";
3
+ export class OpenChangeComplete {
4
+ #opts;
5
+ #enabled;
6
+ #afterAnimations;
7
+ constructor(opts) {
8
+ this.#opts = opts;
9
+ this.#enabled = opts.enabled ?? true;
10
+ this.#afterAnimations = new AnimationsComplete({
11
+ ref: this.#opts.ref,
12
+ afterTick: this.#opts.open,
13
+ });
14
+ watch([() => this.#opts.open.current], ([open]) => {
15
+ if (!this.#enabled)
16
+ return;
17
+ this.#afterAnimations.run(() => {
18
+ if (open === this.#opts.open.current) {
19
+ this.#opts.onComplete();
20
+ }
21
+ });
22
+ });
23
+ }
24
+ }