bits-ui 2.6.2 → 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 (367) 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 +4 -2
  183. package/dist/bits/radio-group/radio-group.svelte.d.ts +26 -19
  184. package/dist/bits/radio-group/radio-group.svelte.js +26 -19
  185. package/dist/bits/radio-group/types.d.ts +13 -6
  186. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +2 -2
  187. package/dist/bits/range-calendar/components/range-calendar-day.svelte +2 -2
  188. package/dist/bits/range-calendar/components/range-calendar.svelte +2 -2
  189. package/dist/bits/range-calendar/range-calendar.svelte.d.ts +21 -20
  190. package/dist/bits/range-calendar/range-calendar.svelte.js +12 -12
  191. package/dist/bits/rating-group/components/rating-group-input.svelte +2 -2
  192. package/dist/bits/rating-group/components/rating-group-item.svelte +2 -2
  193. package/dist/bits/rating-group/components/rating-group.svelte +2 -2
  194. package/dist/bits/rating-group/rating-group.svelte.d.ts +19 -18
  195. package/dist/bits/rating-group/rating-group.svelte.js +16 -17
  196. package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte +2 -2
  197. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +3 -3
  198. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +6 -6
  199. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +3 -3
  200. package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte +2 -2
  201. package/dist/bits/scroll-area/components/scroll-area-scrollbar-visible.svelte +2 -2
  202. package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte +2 -2
  203. package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte +2 -2
  204. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +2 -2
  205. package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte +2 -2
  206. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +2 -5
  207. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +2 -2
  208. package/dist/bits/scroll-area/components/scroll-area.svelte +2 -2
  209. package/dist/bits/scroll-area/scroll-area.svelte.d.ts +98 -78
  210. package/dist/bits/scroll-area/scroll-area.svelte.js +78 -74
  211. package/dist/bits/select/components/select-content-static.svelte +3 -3
  212. package/dist/bits/select/components/select-content.svelte +3 -3
  213. package/dist/bits/select/components/select-group-heading.svelte +2 -2
  214. package/dist/bits/select/components/select-group.svelte +2 -2
  215. package/dist/bits/select/components/select-hidden-input.svelte +2 -2
  216. package/dist/bits/select/components/select-item.svelte +2 -2
  217. package/dist/bits/select/components/select-scroll-down-button.svelte +2 -2
  218. package/dist/bits/select/components/select-scroll-up-button.svelte +2 -2
  219. package/dist/bits/select/components/select-trigger.svelte +2 -2
  220. package/dist/bits/select/components/select-viewport.svelte +2 -2
  221. package/dist/bits/select/components/select.svelte +4 -2
  222. package/dist/bits/select/select.svelte.d.ts +127 -113
  223. package/dist/bits/select/select.svelte.js +74 -62
  224. package/dist/bits/select/types.d.ts +4 -0
  225. package/dist/bits/separator/components/separator.svelte +2 -2
  226. package/dist/bits/separator/separator.svelte.d.ts +9 -8
  227. package/dist/bits/separator/separator.svelte.js +4 -4
  228. package/dist/bits/slider/components/slider-range.svelte +2 -2
  229. package/dist/bits/slider/components/slider-thumb-label.svelte +2 -2
  230. package/dist/bits/slider/components/slider-thumb.svelte +2 -2
  231. package/dist/bits/slider/components/slider-tick-label.svelte +2 -2
  232. package/dist/bits/slider/components/slider-tick.svelte +2 -2
  233. package/dist/bits/slider/components/slider.svelte +2 -2
  234. package/dist/bits/slider/slider.svelte.d.ts +82 -73
  235. package/dist/bits/slider/slider.svelte.js +30 -28
  236. package/dist/bits/switch/components/switch-input.svelte +2 -2
  237. package/dist/bits/switch/components/switch-thumb.svelte +2 -2
  238. package/dist/bits/switch/components/switch.svelte +2 -2
  239. package/dist/bits/switch/switch.svelte.d.ts +19 -17
  240. package/dist/bits/switch/switch.svelte.js +13 -13
  241. package/dist/bits/tabs/components/tabs-content.svelte +2 -2
  242. package/dist/bits/tabs/components/tabs-list.svelte +2 -2
  243. package/dist/bits/tabs/components/tabs-trigger.svelte +2 -2
  244. package/dist/bits/tabs/components/tabs.svelte +2 -2
  245. package/dist/bits/tabs/tabs.svelte.d.ts +33 -29
  246. package/dist/bits/tabs/tabs.svelte.js +19 -19
  247. package/dist/bits/time-field/components/time-field-hidden-input.svelte +2 -2
  248. package/dist/bits/time-field/components/time-field-input.svelte +2 -2
  249. package/dist/bits/time-field/components/time-field-label.svelte +2 -2
  250. package/dist/bits/time-field/components/time-field-segment.svelte +2 -2
  251. package/dist/bits/time-field/components/time-field.svelte +2 -2
  252. package/dist/bits/time-field/time-field.svelte.d.ts +72 -66
  253. package/dist/bits/time-field/time-field.svelte.js +37 -42
  254. package/dist/bits/time-range-field/components/time-range-field-input.svelte +2 -2
  255. package/dist/bits/time-range-field/components/time-range-field-label.svelte +2 -2
  256. package/dist/bits/time-range-field/components/time-range-field.svelte +2 -2
  257. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +35 -31
  258. package/dist/bits/time-range-field/time-range-field.svelte.js +34 -32
  259. package/dist/bits/toggle/components/toggle.svelte +2 -2
  260. package/dist/bits/toggle/toggle.svelte.d.ts +11 -10
  261. package/dist/bits/toggle/toggle.svelte.js +4 -4
  262. package/dist/bits/toggle-group/components/toggle-group-item.svelte +2 -2
  263. package/dist/bits/toggle-group/components/toggle-group.svelte +2 -2
  264. package/dist/bits/toggle-group/toggle-group.svelte.d.ts +48 -43
  265. package/dist/bits/toggle-group/toggle-group.svelte.js +24 -25
  266. package/dist/bits/toolbar/components/toolbar-button.svelte +2 -2
  267. package/dist/bits/toolbar/components/toolbar-group-item.svelte +2 -2
  268. package/dist/bits/toolbar/components/toolbar-group.svelte +2 -2
  269. package/dist/bits/toolbar/components/toolbar-link.svelte +2 -2
  270. package/dist/bits/toolbar/components/toolbar.svelte +2 -2
  271. package/dist/bits/toolbar/toolbar.svelte.d.ts +59 -51
  272. package/dist/bits/toolbar/toolbar.svelte.js +32 -30
  273. package/dist/bits/tooltip/components/tooltip-content-static.svelte +3 -3
  274. package/dist/bits/tooltip/components/tooltip-content.svelte +3 -3
  275. package/dist/bits/tooltip/components/tooltip-provider.svelte +2 -2
  276. package/dist/bits/tooltip/components/tooltip-trigger.svelte +2 -2
  277. package/dist/bits/tooltip/components/tooltip.svelte +4 -2
  278. package/dist/bits/tooltip/tooltip.svelte.d.ts +33 -29
  279. package/dist/bits/tooltip/tooltip.svelte.js +33 -28
  280. package/dist/bits/tooltip/types.d.ts +4 -0
  281. package/dist/bits/utilities/config/bits-config.d.ts +1 -1
  282. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -2
  283. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +6 -7
  284. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +3 -3
  285. package/dist/bits/utilities/escape-layer/escape-layer.svelte +2 -2
  286. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.d.ts +6 -7
  287. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.js +3 -3
  288. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -2
  289. package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte +2 -2
  290. package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte +2 -2
  291. package/dist/bits/utilities/floating-layer/components/floating-layer.svelte +2 -2
  292. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +25 -23
  293. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +25 -25
  294. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +1 -1
  295. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +1 -1
  296. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte +1 -1
  297. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte.d.ts +1 -1
  298. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +1 -1
  299. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte.d.ts +1 -1
  300. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -3
  301. package/dist/bits/utilities/presence-layer/presence-layer.svelte +8 -8
  302. package/dist/bits/utilities/presence-layer/presence.svelte.d.ts +42 -0
  303. package/dist/bits/utilities/presence-layer/presence.svelte.js +116 -0
  304. package/dist/bits/utilities/presence-layer/types.d.ts +3 -5
  305. package/dist/bits/utilities/scroll-lock/scroll-lock.svelte +2 -2
  306. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -2
  307. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +7 -7
  308. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +3 -3
  309. package/dist/internal/animations-complete.d.ts +12 -0
  310. package/dist/internal/animations-complete.js +55 -0
  311. package/dist/internal/arrays.js +20 -36
  312. package/dist/internal/attrs.d.ts +9 -2
  313. package/dist/internal/attrs.js +21 -11
  314. package/dist/internal/body-scroll-lock.svelte.d.ts +10 -0
  315. package/dist/internal/body-scroll-lock.svelte.js +106 -0
  316. package/dist/internal/data-typeahead.svelte.d.ts +15 -0
  317. package/dist/internal/data-typeahead.svelte.js +33 -0
  318. package/dist/internal/date-time/calendar-helpers.svelte.d.ts +1 -1
  319. package/dist/internal/dom-typeahead.svelte.d.ts +14 -0
  320. package/dist/internal/dom-typeahead.svelte.js +44 -0
  321. package/dist/internal/dom.d.ts +0 -2
  322. package/dist/internal/dom.js +0 -15
  323. package/dist/internal/{use-grace-area.svelte.d.ts → grace-area.svelte.d.ts} +5 -4
  324. package/dist/internal/{use-grace-area.svelte.js → grace-area.svelte.js} +60 -56
  325. package/dist/internal/open-change-complete.d.ts +13 -0
  326. package/dist/internal/open-change-complete.js +24 -0
  327. package/dist/internal/{use-roving-focus.svelte.d.ts → roving-focus-group.d.ts} +9 -8
  328. package/dist/internal/{use-roving-focus.svelte.js → roving-focus-group.js} +30 -34
  329. package/dist/internal/shared-state.svelte.d.ts +6 -0
  330. package/dist/internal/shared-state.svelte.js +31 -0
  331. package/dist/internal/should-trap-focus.js +1 -2
  332. package/dist/internal/state-machine.d.ts +16 -0
  333. package/dist/internal/state-machine.js +18 -0
  334. package/dist/internal/svelte-resize-observer.svelte.d.ts +6 -0
  335. package/dist/internal/svelte-resize-observer.svelte.js +25 -0
  336. package/dist/internal/tabbable.d.ts +0 -1
  337. package/dist/internal/tabbable.js +0 -11
  338. package/dist/internal/timeout-fn.d.ts +16 -0
  339. package/dist/internal/timeout-fn.js +38 -0
  340. package/dist/internal/types.d.ts +2 -2
  341. package/package.json +1 -1
  342. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +0 -4
  343. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +0 -97
  344. package/dist/internal/box.svelte.d.ts +0 -21
  345. package/dist/internal/box.svelte.js +0 -26
  346. package/dist/internal/create-event-hook.svelte.d.ts +0 -18
  347. package/dist/internal/create-event-hook.svelte.js +0 -29
  348. package/dist/internal/create-shared-hook.svelte.d.ts +0 -2
  349. package/dist/internal/create-shared-hook.svelte.js +0 -27
  350. package/dist/internal/sleep.d.ts +0 -1
  351. package/dist/internal/sleep.js +0 -3
  352. package/dist/internal/use-after-animations.svelte.d.ts +0 -5
  353. package/dist/internal/use-after-animations.svelte.js +0 -27
  354. package/dist/internal/use-body-scroll-lock.svelte.d.ts +0 -6
  355. package/dist/internal/use-body-scroll-lock.svelte.js +0 -106
  356. package/dist/internal/use-data-typeahead.svelte.d.ts +0 -15
  357. package/dist/internal/use-data-typeahead.svelte.js +0 -34
  358. package/dist/internal/use-dom-typeahead.svelte.d.ts +0 -13
  359. package/dist/internal/use-dom-typeahead.svelte.js +0 -32
  360. package/dist/internal/use-form-control.svelte.d.ts +0 -4
  361. package/dist/internal/use-form-control.svelte.js +0 -16
  362. package/dist/internal/use-resize-observer.svelte.d.ts +0 -2
  363. package/dist/internal/use-resize-observer.svelte.js +0 -17
  364. package/dist/internal/use-state-machine.svelte.d.ts +0 -24
  365. package/dist/internal/use-state-machine.svelte.js +0 -28
  366. package/dist/internal/use-timeout-fn.svelte.d.ts +0 -25
  367. package/dist/internal/use-timeout-fn.svelte.js +0 -39
@@ -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
+ }
@@ -1,6 +1,6 @@
1
1
  import { type Box, type ReadableBox } from "svelte-toolbelt";
2
2
  import type { Orientation } from "../shared/index.js";
3
- type UseRovingFocusProps = ({
3
+ type RovingFocusGroupOptions = ({
4
4
  /**
5
5
  * The selector used to find the focusable candidates.
6
6
  */
@@ -31,12 +31,13 @@ type UseRovingFocusProps = ({
31
31
  */
32
32
  onCandidateFocus?: (node: HTMLElement) => void;
33
33
  };
34
- export type UseRovingFocusReturn = ReturnType<typeof useRovingFocus>;
35
- export declare function useRovingFocus(opts: UseRovingFocusProps): {
34
+ export declare class RovingFocusGroup {
35
+ #private;
36
+ constructor(opts: RovingFocusGroupOptions);
37
+ getCandidateNodes(): HTMLElement[];
38
+ focusFirstCandidate(): void;
39
+ handleKeydown(node: HTMLElement | null | undefined, e: KeyboardEvent, both?: boolean): HTMLElement | undefined;
40
+ getTabIndex(node: HTMLElement | null | undefined): 0 | -1;
36
41
  setCurrentTabStopId(id: string): void;
37
- getTabIndex: (node: HTMLElement | null | undefined) => 0 | -1;
38
- handleKeydown: (node: HTMLElement | null | undefined, e: KeyboardEvent, both?: boolean) => HTMLElement | undefined;
39
- focusFirstCandidate: () => void;
40
- currentTabStopId: import("svelte-toolbelt").WritableBox<string | null>;
41
- };
42
+ }
42
43
  export {};
@@ -2,41 +2,43 @@ import { box } from "svelte-toolbelt";
2
2
  import { getElemDirection } from "./locale.js";
3
3
  import { getDirectionalKeys } from "./get-directional-keys.js";
4
4
  import { kbd } from "./kbd.js";
5
- import { isBrowser } from "./is.js";
6
- export function useRovingFocus(opts) {
7
- const currentTabStopId = box(null);
8
- function getCandidateNodes() {
9
- if (!isBrowser)
10
- return [];
11
- if (!opts.rootNode.current)
5
+ import { BROWSER } from "esm-env";
6
+ export class RovingFocusGroup {
7
+ #opts;
8
+ #currentTabStopId = box(null);
9
+ constructor(opts) {
10
+ this.#opts = opts;
11
+ }
12
+ getCandidateNodes() {
13
+ if (!BROWSER || !this.#opts.rootNode.current)
12
14
  return [];
13
- if (opts.candidateSelector) {
14
- const candidates = Array.from(opts.rootNode.current.querySelectorAll(opts.candidateSelector));
15
+ if (this.#opts.candidateSelector) {
16
+ const candidates = Array.from(this.#opts.rootNode.current.querySelectorAll(this.#opts.candidateSelector));
15
17
  return candidates;
16
18
  }
17
- else if (opts.candidateAttr) {
18
- const candidates = Array.from(opts.rootNode.current.querySelectorAll(`[${opts.candidateAttr}]:not([data-disabled])`));
19
+ else if (this.#opts.candidateAttr) {
20
+ const candidates = Array.from(this.#opts.rootNode.current.querySelectorAll(`[${this.#opts.candidateAttr}]:not([data-disabled])`));
19
21
  return candidates;
20
22
  }
21
23
  return [];
22
24
  }
23
- function focusFirstCandidate() {
24
- const items = getCandidateNodes();
25
+ focusFirstCandidate() {
26
+ const items = this.getCandidateNodes();
25
27
  if (!items.length)
26
28
  return;
27
29
  items[0]?.focus();
28
30
  }
29
- function handleKeydown(node, e, both = false) {
30
- const rootNode = opts.rootNode.current;
31
+ handleKeydown(node, e, both = false) {
32
+ const rootNode = this.#opts.rootNode.current;
31
33
  if (!rootNode || !node)
32
34
  return;
33
- const items = getCandidateNodes();
35
+ const items = this.getCandidateNodes();
34
36
  if (!items.length)
35
37
  return;
36
38
  const currentIndex = items.indexOf(node);
37
39
  const dir = getElemDirection(rootNode);
38
- const { nextKey, prevKey } = getDirectionalKeys(dir, opts.orientation.current);
39
- const loop = opts.loop.current;
40
+ const { nextKey, prevKey } = getDirectionalKeys(dir, this.#opts.orientation.current);
41
+ const loop = this.#opts.loop.current;
40
42
  const keyToIndex = {
41
43
  [nextKey]: currentIndex + 1,
42
44
  [prevKey]: currentIndex - 1,
@@ -63,29 +65,23 @@ export function useRovingFocus(opts) {
63
65
  if (!itemToFocus)
64
66
  return;
65
67
  itemToFocus.focus();
66
- currentTabStopId.current = itemToFocus.id;
67
- opts.onCandidateFocus?.(itemToFocus);
68
+ this.#currentTabStopId.current = itemToFocus.id;
69
+ this.#opts.onCandidateFocus?.(itemToFocus);
68
70
  return itemToFocus;
69
71
  }
70
- function getTabIndex(node) {
71
- const items = getCandidateNodes();
72
- const anyActive = currentTabStopId.current !== null;
72
+ getTabIndex(node) {
73
+ const items = this.getCandidateNodes();
74
+ const anyActive = this.#currentTabStopId.current !== null;
73
75
  if (node && !anyActive && items[0] === node) {
74
- currentTabStopId.current = node.id;
76
+ this.#currentTabStopId.current = node.id;
75
77
  return 0;
76
78
  }
77
- else if (node?.id === currentTabStopId.current) {
79
+ else if (node?.id === this.#currentTabStopId.current) {
78
80
  return 0;
79
81
  }
80
82
  return -1;
81
83
  }
82
- return {
83
- setCurrentTabStopId(id) {
84
- currentTabStopId.current = id;
85
- },
86
- getTabIndex,
87
- handleKeydown,
88
- focusFirstCandidate,
89
- currentTabStopId,
90
- };
84
+ setCurrentTabStopId(id) {
85
+ this.#currentTabStopId.current = id;
86
+ }
91
87
  }
@@ -0,0 +1,6 @@
1
+ import type { AnyFn } from "./types.js";
2
+ export declare class SharedState<T extends AnyFn> {
3
+ #private;
4
+ constructor(factory: T);
5
+ get(...args: Parameters<T>): ReturnType<T>;
6
+ }
@@ -0,0 +1,31 @@
1
+ export class SharedState {
2
+ #factory;
3
+ #subscribers = 0;
4
+ #state = $state();
5
+ #scope;
6
+ constructor(factory) {
7
+ this.#factory = factory;
8
+ }
9
+ #dispose() {
10
+ this.#subscribers -= 1;
11
+ if (this.#scope && this.#subscribers <= 0) {
12
+ this.#scope();
13
+ this.#state = undefined;
14
+ this.#scope = undefined;
15
+ }
16
+ }
17
+ get(...args) {
18
+ this.#subscribers += 1;
19
+ if (this.#state === undefined) {
20
+ this.#scope = $effect.root(() => {
21
+ this.#state = this.#factory(...args);
22
+ });
23
+ }
24
+ $effect(() => {
25
+ return () => {
26
+ this.#dispose();
27
+ };
28
+ });
29
+ return this.#state;
30
+ }
31
+ }
@@ -1,6 +1,5 @@
1
1
  export function shouldTrapFocus({ forceMount, present, trapFocus, open, }) {
2
- if (forceMount) {
2
+ if (forceMount)
3
3
  return open && trapFocus;
4
- }
5
4
  return present && trapFocus && open;
6
5
  }
@@ -0,0 +1,16 @@
1
+ import { type WritableBox } from "svelte-toolbelt";
2
+ interface Machine<S> {
3
+ [k: string]: {
4
+ [k: string]: S;
5
+ };
6
+ }
7
+ type MachineState<T> = keyof T;
8
+ type MachineEvent<T> = keyof UnionToIntersection<T[keyof T]>;
9
+ type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
10
+ export declare class StateMachine<M> {
11
+ #private;
12
+ readonly state: WritableBox<MachineState<M>>;
13
+ constructor(initialState: MachineState<M>, machine: M & Machine<MachineState<M>>);
14
+ dispatch(event: MachineEvent<M>): void;
15
+ }
16
+ export {};
@@ -0,0 +1,18 @@
1
+ import { box } from "svelte-toolbelt";
2
+ export class StateMachine {
3
+ state;
4
+ #machine;
5
+ constructor(initialState, machine) {
6
+ this.state = box(initialState);
7
+ this.#machine = machine;
8
+ this.dispatch = this.dispatch.bind(this);
9
+ }
10
+ #reducer(event) {
11
+ // @ts-expect-error state.current is keyof M
12
+ const nextState = this.#machine[this.state.current][event];
13
+ return nextState ?? this.state.current;
14
+ }
15
+ dispatch(event) {
16
+ this.state.current = this.#reducer(event);
17
+ }
18
+ }
@@ -0,0 +1,6 @@
1
+ import type { Getter } from "svelte-toolbelt";
2
+ export declare class SvelteResizeObserver {
3
+ #private;
4
+ constructor(node: Getter<HTMLElement | null>, onResize: () => void);
5
+ handler(): (() => void) | undefined;
6
+ }
@@ -0,0 +1,25 @@
1
+ export class SvelteResizeObserver {
2
+ #node;
3
+ #onResize;
4
+ constructor(node, onResize) {
5
+ this.#node = node;
6
+ this.#onResize = onResize;
7
+ this.handler = this.handler.bind(this);
8
+ $effect(this.handler);
9
+ }
10
+ handler() {
11
+ let rAF = 0;
12
+ const _node = this.#node();
13
+ if (!_node)
14
+ return;
15
+ const resizeObserver = new ResizeObserver(() => {
16
+ cancelAnimationFrame(rAF);
17
+ rAF = window.requestAnimationFrame(this.#onResize);
18
+ });
19
+ resizeObserver.observe(_node);
20
+ return () => {
21
+ window.cancelAnimationFrame(rAF);
22
+ resizeObserver.unobserve(_node);
23
+ };
24
+ }
25
+ }
@@ -1,4 +1,3 @@
1
- export declare function getTabbableIn(container: HTMLElement, direction: "next" | "prev"): import("tabbable").FocusableElement | undefined;
2
1
  /**
3
2
  * Gets all tabbable elements in the body and finds the next/previous tabbable element
4
3
  * from the `currentNode` based on the `direction` provided.
@@ -1,5 +1,4 @@
1
1
  import { focusable, isFocusable, isTabbable, tabbable } from "tabbable";
2
- import { activeElement } from "./dom.js";
3
2
  import { getDocument } from "svelte-toolbelt";
4
3
  function getTabbableOptions() {
5
4
  return {
@@ -14,16 +13,6 @@ function getTabbableOptions() {
14
13
  : "none",
15
14
  };
16
15
  }
17
- export function getTabbableIn(container, direction) {
18
- const allTabbable = tabbable(container, getTabbableOptions());
19
- if (direction === "prev") {
20
- allTabbable.reverse();
21
- }
22
- const activeEl = activeElement(getDocument(container));
23
- const activeIndex = allTabbable.indexOf(activeEl);
24
- const nextTabbableElements = allTabbable.slice(activeIndex + 1);
25
- return nextTabbableElements[0];
26
- }
27
16
  /**
28
17
  * Gets all tabbable elements in the body and finds the next/previous tabbable element
29
18
  * from the `currentNode` based on the `direction` provided.
@@ -0,0 +1,16 @@
1
+ import type { AnyFn } from "./types.js";
2
+ type TimeoutFnOptions = {
3
+ /**
4
+ * Start the timer immediate after calling this function
5
+ *
6
+ * @default true
7
+ */
8
+ immediate?: boolean;
9
+ };
10
+ export declare class TimeoutFn<T extends AnyFn> {
11
+ #private;
12
+ constructor(cb: T, interval: number, opts?: TimeoutFnOptions);
13
+ stop(): void;
14
+ start(...args: Parameters<T> | []): void;
15
+ }
16
+ export {};
@@ -0,0 +1,38 @@
1
+ import { onDestroyEffect } from "svelte-toolbelt";
2
+ import { BROWSER } from "esm-env";
3
+ const defaultOpts = {
4
+ immediate: true,
5
+ };
6
+ export class TimeoutFn {
7
+ #opts;
8
+ #interval;
9
+ #cb;
10
+ #timer = null;
11
+ constructor(cb, interval, opts = {}) {
12
+ this.#cb = cb;
13
+ this.#interval = interval;
14
+ this.#opts = { ...defaultOpts, ...opts };
15
+ this.stop = this.stop.bind(this);
16
+ this.start = this.start.bind(this);
17
+ if (this.#opts.immediate && BROWSER) {
18
+ this.start();
19
+ }
20
+ onDestroyEffect(this.stop);
21
+ }
22
+ #clear() {
23
+ if (this.#timer !== null) {
24
+ window.clearTimeout(this.#timer);
25
+ this.#timer = null;
26
+ }
27
+ }
28
+ stop() {
29
+ this.#clear();
30
+ }
31
+ start(...args) {
32
+ this.#clear();
33
+ this.#timer = window.setTimeout(() => {
34
+ this.#timer = null;
35
+ this.#cb(...args);
36
+ }, this.#interval);
37
+ }
38
+ }
@@ -1,5 +1,5 @@
1
1
  import type { Snippet } from "svelte";
2
- import type { Box, ReadableBoxedValues, WritableBoxedValues } from "./box.svelte.js";
2
+ import type { Box, ReadableBoxedValues, WritableBoxedValues } from "svelte-toolbelt";
3
3
  import type { StyleProperties } from "../shared/index.js";
4
4
  export type OnChangeFn<T> = (value: T) => void;
5
5
  export type ElementRef = Box<HTMLElement | null>;
@@ -78,7 +78,7 @@ export type Without<T extends object, U extends object> = Omit<T, keyof U>;
78
78
  export type Arrayable<T> = T[] | T;
79
79
  export type Fn = () => void;
80
80
  export type AnyFn = (...args: any[]) => any;
81
- export type WithRefProps<T = {}> = T & ReadableBoxedValues<{
81
+ export type WithRefOpts<T = {}> = T & ReadableBoxedValues<{
82
82
  id: string;
83
83
  }> & WritableBoxedValues<{
84
84
  ref: HTMLElement | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bits-ui",
3
- "version": "2.6.2",
3
+ "version": "2.8.0",
4
4
  "license": "MIT",
5
5
  "repository": "github:huntabyte/bits-ui",
6
6
  "funding": "https://github.com/sponsors/huntabyte",
@@ -1,4 +0,0 @@
1
- import { type ReadableBox } from "svelte-toolbelt";
2
- export declare function usePresence(present: ReadableBox<boolean>, ref: ReadableBox<HTMLElement | null>): {
3
- readonly current: boolean;
4
- };