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,116 @@
1
+ import { executeCallbacks } from "svelte-toolbelt";
2
+ import { Previous, watch } from "runed";
3
+ import { on } from "svelte/events";
4
+ import { StateMachine } from "../../../internal/state-machine.js";
5
+ const presenceMachine = {
6
+ mounted: {
7
+ UNMOUNT: "unmounted",
8
+ ANIMATION_OUT: "unmountSuspended",
9
+ },
10
+ unmountSuspended: {
11
+ MOUNT: "mounted",
12
+ ANIMATION_END: "unmounted",
13
+ },
14
+ unmounted: {
15
+ MOUNT: "mounted",
16
+ },
17
+ };
18
+ export class Presence {
19
+ opts;
20
+ prevAnimationNameState = $state("none");
21
+ styles = $state({});
22
+ initialStatus;
23
+ previousPresent;
24
+ machine;
25
+ present;
26
+ constructor(opts) {
27
+ this.opts = opts;
28
+ this.present = this.opts.open;
29
+ this.initialStatus = opts.open.current ? "mounted" : "unmounted";
30
+ this.previousPresent = new Previous(() => this.present.current);
31
+ this.machine = new StateMachine(this.initialStatus, presenceMachine);
32
+ this.handleAnimationEnd = this.handleAnimationEnd.bind(this);
33
+ this.handleAnimationStart = this.handleAnimationStart.bind(this);
34
+ watchPresenceChange(this);
35
+ watchStatusChange(this);
36
+ watchRefChange(this);
37
+ }
38
+ /**
39
+ * Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`
40
+ * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we
41
+ * make sure we only trigger ANIMATION_END for the currently active animation.
42
+ */
43
+ handleAnimationEnd(event) {
44
+ if (!this.opts.ref.current)
45
+ return;
46
+ const currAnimationName = getAnimationName(this.opts.ref.current);
47
+ const isCurrentAnimation = currAnimationName.includes(event.animationName) || currAnimationName === "none";
48
+ if (event.target === this.opts.ref.current && isCurrentAnimation) {
49
+ this.machine.dispatch("ANIMATION_END");
50
+ }
51
+ }
52
+ handleAnimationStart(event) {
53
+ if (!this.opts.ref.current)
54
+ return;
55
+ if (event.target === this.opts.ref.current) {
56
+ this.prevAnimationNameState = getAnimationName(this.opts.ref.current);
57
+ }
58
+ }
59
+ isPresent = $derived.by(() => {
60
+ return ["mounted", "unmountSuspended"].includes(this.machine.state.current);
61
+ });
62
+ }
63
+ function watchPresenceChange(state) {
64
+ watch(() => state.present.current, () => {
65
+ if (!state.opts.ref.current)
66
+ return;
67
+ const hasPresentChanged = state.present.current !== state.previousPresent.current;
68
+ if (!hasPresentChanged)
69
+ return;
70
+ const prevAnimationName = state.prevAnimationNameState;
71
+ const currAnimationName = getAnimationName(state.opts.ref.current);
72
+ if (state.present.current) {
73
+ state.machine.dispatch("MOUNT");
74
+ }
75
+ else if (currAnimationName === "none" || state.styles.display === "none") {
76
+ // If there is no exit animation or the element is hidden, animations won't run
77
+ // so we unmount instantly
78
+ state.machine.dispatch("UNMOUNT");
79
+ }
80
+ else {
81
+ /**
82
+ * When `present` changes to `false`, we check changes to animation-name to
83
+ * determine whether an animation has started. We chose this approach (reading
84
+ * computed styles) because there is no `animationrun` event and `animationstart`
85
+ * fires after `animation-delay` has expired which would be too late.
86
+ */
87
+ const isAnimating = prevAnimationName !== currAnimationName;
88
+ if (state.previousPresent.current && isAnimating) {
89
+ state.machine.dispatch("ANIMATION_OUT");
90
+ }
91
+ else {
92
+ state.machine.dispatch("UNMOUNT");
93
+ }
94
+ }
95
+ });
96
+ }
97
+ function watchStatusChange(state) {
98
+ watch(() => state.machine.state.current, () => {
99
+ if (!state.opts.ref.current)
100
+ return;
101
+ const currAnimationName = getAnimationName(state.opts.ref.current);
102
+ state.prevAnimationNameState =
103
+ state.machine.state.current === "mounted" ? currAnimationName : "none";
104
+ });
105
+ }
106
+ function watchRefChange(state) {
107
+ watch(() => state.opts.ref.current, () => {
108
+ if (!state.opts.ref.current)
109
+ return;
110
+ state.styles = getComputedStyle(state.opts.ref.current);
111
+ return executeCallbacks(on(state.opts.ref.current, "animationstart", state.handleAnimationStart), on(state.opts.ref.current, "animationcancel", state.handleAnimationEnd), on(state.opts.ref.current, "animationend", state.handleAnimationEnd));
112
+ });
113
+ }
114
+ function getAnimationName(node) {
115
+ return node ? getComputedStyle(node).animationName || "none" : "none";
116
+ }
@@ -8,13 +8,11 @@ export type PresenceLayerProps = {
8
8
  };
9
9
  export type PresenceLayerImplProps = PresenceLayerProps & {
10
10
  /**
11
- * The presence status.
11
+ * The open state of the component.
12
12
  */
13
- present: boolean;
13
+ open: boolean;
14
14
  presence?: Snippet<[{
15
- present: {
16
- current: boolean;
17
- };
15
+ present: boolean;
18
16
  }]>;
19
17
  ref: ReadableBox<HTMLElement | null>;
20
18
  };
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import type { ScrollLockProps } from "./index.js";
3
- import { useBodyScrollLock } from "../../../internal/use-body-scroll-lock.svelte.js";
3
+ import { BodyScrollLock } from "../../../internal/body-scroll-lock.svelte.js";
4
4
 
5
5
  let { preventScroll = true, restoreScrollDelay = null }: ScrollLockProps = $props();
6
6
 
7
7
  if (preventScroll) {
8
- useBodyScrollLock(preventScroll, () => restoreScrollDelay);
8
+ new BodyScrollLock(preventScroll, () => restoreScrollDelay);
9
9
  }
10
10
  </script>
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { box } from "svelte-toolbelt";
3
3
  import type { TextSelectionLayerImplProps } from "./types.js";
4
- import { useTextSelectionLayer } from "./use-text-selection-layer.svelte.js";
4
+ import { TextSelectionLayerState } from "./use-text-selection-layer.svelte.js";
5
5
  import { noop } from "../../../internal/noop.js";
6
6
 
7
7
  let {
@@ -14,7 +14,7 @@
14
14
  ref,
15
15
  }: TextSelectionLayerImplProps = $props();
16
16
 
17
- useTextSelectionLayer({
17
+ TextSelectionLayerState.create({
18
18
  id: box.with(() => id),
19
19
  onPointerDown: box.with(() => onPointerDown),
20
20
  onPointerUp: box.with(() => onPointerUp),
@@ -1,14 +1,14 @@
1
- import { DOMContext } from "svelte-toolbelt";
1
+ import { DOMContext, type ReadableBoxedValues } from "svelte-toolbelt";
2
2
  import type { TextSelectionLayerImplProps } from "./types.js";
3
- import type { ReadableBoxedValues } from "../../../internal/box.svelte.js";
4
- type TextSelectionLayerStateProps = ReadableBoxedValues<Required<Omit<TextSelectionLayerImplProps, "children" | "preventOverflowTextSelection" | "ref">> & {
3
+ interface TextSelectionLayerStateOpts extends ReadableBoxedValues<Required<Omit<TextSelectionLayerImplProps, "children" | "preventOverflowTextSelection" | "ref">> & {
5
4
  ref: HTMLElement | null;
6
- }>;
5
+ }> {
6
+ }
7
7
  export declare class TextSelectionLayerState {
8
8
  #private;
9
- readonly opts: TextSelectionLayerStateProps;
9
+ static create(opts: TextSelectionLayerStateOpts): TextSelectionLayerState;
10
+ readonly opts: TextSelectionLayerStateOpts;
10
11
  readonly domContext: DOMContext;
11
- constructor(opts: TextSelectionLayerStateProps);
12
+ constructor(opts: TextSelectionLayerStateOpts);
12
13
  }
13
- export declare function useTextSelectionLayer(props: TextSelectionLayerStateProps): TextSelectionLayerState;
14
14
  export {};
@@ -5,6 +5,9 @@ import { noop } from "../../../internal/noop.js";
5
5
  import { isHTMLElement } from "../../../internal/is.js";
6
6
  globalThis.bitsTextSelectionLayers ??= new Map();
7
7
  export class TextSelectionLayerState {
8
+ static create(opts) {
9
+ return new TextSelectionLayerState(opts);
10
+ }
8
11
  opts;
9
12
  domContext;
10
13
  #unsubSelectionLock = noop;
@@ -50,9 +53,6 @@ export class TextSelectionLayerState {
50
53
  this.#unsubSelectionLock = noop;
51
54
  };
52
55
  }
53
- export function useTextSelectionLayer(props) {
54
- return new TextSelectionLayerState(props);
55
- }
56
56
  const getUserSelect = (node) => node.style.userSelect || node.style.webkitUserSelect;
57
57
  function preventTextSelectionOverflow(node, body) {
58
58
  const originalBodyUserSelect = getUserSelect(body);
@@ -0,0 +1,12 @@
1
+ import { type ReadableBoxedValues } from "svelte-toolbelt";
2
+ interface AnimationsCompleteOpts extends ReadableBoxedValues<{
3
+ ref: HTMLElement | null;
4
+ afterTick: boolean;
5
+ }> {
6
+ }
7
+ export declare class AnimationsComplete {
8
+ #private;
9
+ constructor(opts: AnimationsCompleteOpts);
10
+ run(fn: () => void | Promise<void>): void;
11
+ }
12
+ export {};
@@ -0,0 +1,55 @@
1
+ import { afterTick, onDestroyEffect } from "svelte-toolbelt";
2
+ export class AnimationsComplete {
3
+ #opts;
4
+ #currentFrame = undefined;
5
+ #isRunning = false;
6
+ constructor(opts) {
7
+ this.#opts = opts;
8
+ onDestroyEffect(() => this.#cleanup());
9
+ }
10
+ #cleanup() {
11
+ if (this.#currentFrame) {
12
+ window.cancelAnimationFrame(this.#currentFrame);
13
+ this.#currentFrame = undefined;
14
+ }
15
+ this.#isRunning = false;
16
+ }
17
+ run(fn) {
18
+ // prevent multiple concurrent runs
19
+ if (this.#isRunning)
20
+ return;
21
+ this.#cleanup();
22
+ this.#isRunning = true;
23
+ const node = this.#opts.ref.current;
24
+ if (!node) {
25
+ this.#isRunning = false;
26
+ return;
27
+ }
28
+ if (typeof node.getAnimations !== "function") {
29
+ this.#executeCallback(fn);
30
+ return;
31
+ }
32
+ this.#currentFrame = window.requestAnimationFrame(() => {
33
+ const animations = node.getAnimations();
34
+ if (animations.length === 0) {
35
+ this.#executeCallback(fn);
36
+ return;
37
+ }
38
+ Promise.allSettled(animations.map((animation) => animation.finished)).then(() => {
39
+ this.#executeCallback(fn);
40
+ });
41
+ });
42
+ }
43
+ #executeCallback(fn) {
44
+ const execute = () => {
45
+ fn();
46
+ this.#isRunning = false;
47
+ };
48
+ if (this.#opts.afterTick) {
49
+ afterTick(execute);
50
+ }
51
+ else {
52
+ execute();
53
+ }
54
+ }
55
+ }
@@ -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 {};