bits-ui 2.7.0 → 2.8.1

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 (378) 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 +9 -12
  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 +5 -3
  34. package/dist/bits/calendar/components/calendar-prev-button.svelte +5 -3
  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 +4 -4
  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 +8 -10
  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 +6 -5
  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 +105 -105
  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 -36
  142. package/dist/bits/menubar/menubar.svelte.js +21 -24
  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 +4 -3
  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 +4 -3
  155. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +3 -3
  156. package/dist/bits/navigation-menu/components/navigation-menu.svelte +2 -2
  157. package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +116 -109
  158. package/dist/bits/navigation-menu/navigation-menu.svelte.js +78 -81
  159. package/dist/bits/pagination/components/pagination-next-button.svelte +2 -2
  160. package/dist/bits/pagination/components/pagination-page.svelte +2 -2
  161. package/dist/bits/pagination/components/pagination-prev-button.svelte +2 -2
  162. package/dist/bits/pagination/components/pagination.svelte +2 -2
  163. package/dist/bits/pagination/pagination.svelte.d.ts +34 -32
  164. package/dist/bits/pagination/pagination.svelte.js +15 -15
  165. package/dist/bits/pin-input/components/pin-input-cell.svelte +2 -2
  166. package/dist/bits/pin-input/components/pin-input.svelte +2 -2
  167. package/dist/bits/pin-input/pin-input.svelte.d.ts +22 -21
  168. package/dist/bits/pin-input/pin-input.svelte.js +9 -9
  169. package/dist/bits/popover/components/popover-close.svelte +2 -2
  170. package/dist/bits/popover/components/popover-content-static.svelte +3 -3
  171. package/dist/bits/popover/components/popover-content.svelte +3 -3
  172. package/dist/bits/popover/components/popover-trigger.svelte +2 -2
  173. package/dist/bits/popover/components/popover.svelte +9 -3
  174. package/dist/bits/popover/popover.svelte.d.ts +36 -31
  175. package/dist/bits/popover/popover.svelte.js +26 -21
  176. package/dist/bits/popover/types.d.ts +4 -0
  177. package/dist/bits/progress/components/progress.svelte +2 -2
  178. package/dist/bits/progress/progress.svelte.d.ts +10 -9
  179. package/dist/bits/progress/progress.svelte.js +4 -4
  180. package/dist/bits/radio-group/components/radio-group-input.svelte +2 -2
  181. package/dist/bits/radio-group/components/radio-group-item.svelte +2 -2
  182. package/dist/bits/radio-group/components/radio-group.svelte +2 -2
  183. package/dist/bits/radio-group/radio-group.svelte.d.ts +21 -19
  184. package/dist/bits/radio-group/radio-group.svelte.js +15 -15
  185. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +2 -2
  186. package/dist/bits/range-calendar/components/range-calendar-day.svelte +2 -2
  187. package/dist/bits/range-calendar/components/range-calendar.svelte +2 -2
  188. package/dist/bits/range-calendar/range-calendar.svelte.d.ts +21 -20
  189. package/dist/bits/range-calendar/range-calendar.svelte.js +12 -12
  190. package/dist/bits/rating-group/components/rating-group-input.svelte +2 -2
  191. package/dist/bits/rating-group/components/rating-group-item.svelte +2 -2
  192. package/dist/bits/rating-group/components/rating-group.svelte +2 -2
  193. package/dist/bits/rating-group/rating-group.svelte.d.ts +19 -18
  194. package/dist/bits/rating-group/rating-group.svelte.js +16 -17
  195. package/dist/bits/scroll-area/components/scroll-area-corner-impl.svelte +2 -2
  196. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +3 -3
  197. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +6 -6
  198. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +3 -3
  199. package/dist/bits/scroll-area/components/scroll-area-scrollbar-shared.svelte +2 -2
  200. package/dist/bits/scroll-area/components/scroll-area-scrollbar-visible.svelte +2 -2
  201. package/dist/bits/scroll-area/components/scroll-area-scrollbar-x.svelte +2 -2
  202. package/dist/bits/scroll-area/components/scroll-area-scrollbar-y.svelte +2 -2
  203. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +2 -2
  204. package/dist/bits/scroll-area/components/scroll-area-thumb-impl.svelte +2 -2
  205. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +2 -5
  206. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +2 -2
  207. package/dist/bits/scroll-area/components/scroll-area.svelte +2 -2
  208. package/dist/bits/scroll-area/scroll-area.svelte.d.ts +98 -78
  209. package/dist/bits/scroll-area/scroll-area.svelte.js +78 -74
  210. package/dist/bits/select/components/select-content-static.svelte +3 -3
  211. package/dist/bits/select/components/select-content.svelte +3 -3
  212. package/dist/bits/select/components/select-group-heading.svelte +2 -2
  213. package/dist/bits/select/components/select-group.svelte +2 -2
  214. package/dist/bits/select/components/select-hidden-input.svelte +2 -2
  215. package/dist/bits/select/components/select-item.svelte +2 -2
  216. package/dist/bits/select/components/select-scroll-down-button.svelte +2 -2
  217. package/dist/bits/select/components/select-scroll-up-button.svelte +2 -2
  218. package/dist/bits/select/components/select-trigger.svelte +2 -2
  219. package/dist/bits/select/components/select-viewport.svelte +2 -2
  220. package/dist/bits/select/components/select.svelte +4 -2
  221. package/dist/bits/select/select.svelte.d.ts +127 -113
  222. package/dist/bits/select/select.svelte.js +72 -62
  223. package/dist/bits/select/types.d.ts +4 -0
  224. package/dist/bits/separator/components/separator.svelte +2 -2
  225. package/dist/bits/separator/separator.svelte.d.ts +9 -8
  226. package/dist/bits/separator/separator.svelte.js +4 -4
  227. package/dist/bits/slider/components/slider-range.svelte +2 -2
  228. package/dist/bits/slider/components/slider-thumb-label.svelte +2 -2
  229. package/dist/bits/slider/components/slider-thumb.svelte +2 -2
  230. package/dist/bits/slider/components/slider-tick-label.svelte +2 -2
  231. package/dist/bits/slider/components/slider-tick.svelte +2 -2
  232. package/dist/bits/slider/components/slider.svelte +2 -2
  233. package/dist/bits/slider/slider.svelte.d.ts +82 -73
  234. package/dist/bits/slider/slider.svelte.js +30 -28
  235. package/dist/bits/switch/components/switch-input.svelte +2 -2
  236. package/dist/bits/switch/components/switch-thumb.svelte +2 -2
  237. package/dist/bits/switch/components/switch.svelte +2 -2
  238. package/dist/bits/switch/switch.svelte.d.ts +19 -17
  239. package/dist/bits/switch/switch.svelte.js +13 -13
  240. package/dist/bits/tabs/components/tabs-content.svelte +2 -2
  241. package/dist/bits/tabs/components/tabs-list.svelte +2 -2
  242. package/dist/bits/tabs/components/tabs-trigger.svelte +2 -2
  243. package/dist/bits/tabs/components/tabs.svelte +2 -2
  244. package/dist/bits/tabs/tabs.svelte.d.ts +33 -29
  245. package/dist/bits/tabs/tabs.svelte.js +19 -19
  246. package/dist/bits/time-field/components/time-field-hidden-input.svelte +2 -2
  247. package/dist/bits/time-field/components/time-field-input.svelte +2 -2
  248. package/dist/bits/time-field/components/time-field-label.svelte +2 -2
  249. package/dist/bits/time-field/components/time-field-segment.svelte +2 -2
  250. package/dist/bits/time-field/components/time-field.svelte +2 -2
  251. package/dist/bits/time-field/time-field.svelte.d.ts +72 -66
  252. package/dist/bits/time-field/time-field.svelte.js +37 -42
  253. package/dist/bits/time-range-field/components/time-range-field-input.svelte +2 -2
  254. package/dist/bits/time-range-field/components/time-range-field-label.svelte +2 -2
  255. package/dist/bits/time-range-field/components/time-range-field.svelte +2 -2
  256. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +35 -31
  257. package/dist/bits/time-range-field/time-range-field.svelte.js +34 -32
  258. package/dist/bits/toggle/components/toggle.svelte +2 -2
  259. package/dist/bits/toggle/toggle.svelte.d.ts +11 -10
  260. package/dist/bits/toggle/toggle.svelte.js +4 -4
  261. package/dist/bits/toggle-group/components/toggle-group-item.svelte +2 -2
  262. package/dist/bits/toggle-group/components/toggle-group.svelte +2 -2
  263. package/dist/bits/toggle-group/toggle-group.svelte.d.ts +48 -43
  264. package/dist/bits/toggle-group/toggle-group.svelte.js +24 -25
  265. package/dist/bits/toolbar/components/toolbar-button.svelte +2 -2
  266. package/dist/bits/toolbar/components/toolbar-group-item.svelte +2 -2
  267. package/dist/bits/toolbar/components/toolbar-group.svelte +2 -2
  268. package/dist/bits/toolbar/components/toolbar-link.svelte +2 -2
  269. package/dist/bits/toolbar/components/toolbar.svelte +2 -2
  270. package/dist/bits/toolbar/toolbar.svelte.d.ts +59 -51
  271. package/dist/bits/toolbar/toolbar.svelte.js +32 -30
  272. package/dist/bits/tooltip/components/tooltip-content-static.svelte +3 -3
  273. package/dist/bits/tooltip/components/tooltip-content.svelte +3 -3
  274. package/dist/bits/tooltip/components/tooltip-provider.svelte +2 -2
  275. package/dist/bits/tooltip/components/tooltip-trigger.svelte +2 -2
  276. package/dist/bits/tooltip/components/tooltip.svelte +4 -2
  277. package/dist/bits/tooltip/tooltip.svelte.d.ts +33 -29
  278. package/dist/bits/tooltip/tooltip.svelte.js +33 -28
  279. package/dist/bits/tooltip/types.d.ts +4 -0
  280. package/dist/bits/utilities/config/bits-config.d.ts +1 -1
  281. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -2
  282. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +6 -7
  283. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +3 -3
  284. package/dist/bits/utilities/escape-layer/escape-layer.svelte +2 -2
  285. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.d.ts +6 -7
  286. package/dist/bits/utilities/escape-layer/use-escape-layer.svelte.js +3 -3
  287. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -2
  288. package/dist/bits/utilities/floating-layer/components/floating-layer-arrow.svelte +2 -2
  289. package/dist/bits/utilities/floating-layer/components/floating-layer-content.svelte +2 -2
  290. package/dist/bits/utilities/floating-layer/components/floating-layer.svelte +2 -2
  291. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +25 -23
  292. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +25 -25
  293. package/dist/bits/utilities/focus-scope/focus-scope-manager.d.ts +12 -0
  294. package/dist/bits/utilities/focus-scope/focus-scope-manager.js +40 -0
  295. package/dist/bits/utilities/focus-scope/focus-scope.svelte +6 -8
  296. package/dist/bits/utilities/focus-scope/focus-scope.svelte.d.ts +1 -0
  297. package/dist/bits/utilities/focus-scope/focus-scope.svelte.js +204 -0
  298. package/dist/bits/utilities/focus-scope/types.d.ts +2 -6
  299. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte +1 -1
  300. package/dist/bits/utilities/popper-layer/popper-layer-force-mount.svelte.d.ts +1 -1
  301. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +3 -3
  302. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte.d.ts +1 -1
  303. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -3
  304. package/dist/bits/utilities/presence-layer/presence-layer.svelte +8 -8
  305. package/dist/bits/utilities/presence-layer/presence.svelte.d.ts +42 -0
  306. package/dist/bits/utilities/presence-layer/presence.svelte.js +116 -0
  307. package/dist/bits/utilities/presence-layer/types.d.ts +3 -5
  308. package/dist/bits/utilities/scroll-lock/scroll-lock.svelte +2 -2
  309. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -2
  310. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +7 -7
  311. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +3 -3
  312. package/dist/internal/animations-complete.d.ts +12 -0
  313. package/dist/internal/animations-complete.js +55 -0
  314. package/dist/internal/arrays.js +20 -36
  315. package/dist/internal/attrs.d.ts +9 -2
  316. package/dist/internal/attrs.js +21 -11
  317. package/dist/internal/body-scroll-lock.svelte.d.ts +10 -0
  318. package/dist/internal/body-scroll-lock.svelte.js +106 -0
  319. package/dist/internal/data-typeahead.svelte.d.ts +15 -0
  320. package/dist/internal/data-typeahead.svelte.js +33 -0
  321. package/dist/internal/date-time/calendar-helpers.svelte.d.ts +1 -1
  322. package/dist/internal/dom-typeahead.svelte.d.ts +14 -0
  323. package/dist/internal/dom-typeahead.svelte.js +44 -0
  324. package/dist/internal/dom.d.ts +0 -2
  325. package/dist/internal/dom.js +0 -15
  326. package/dist/internal/focus.js +1 -1
  327. package/dist/internal/{use-grace-area.svelte.d.ts → grace-area.svelte.d.ts} +5 -4
  328. package/dist/internal/{use-grace-area.svelte.js → grace-area.svelte.js} +60 -56
  329. package/dist/internal/open-change-complete.d.ts +13 -0
  330. package/dist/internal/open-change-complete.js +24 -0
  331. package/dist/internal/{use-roving-focus.svelte.d.ts → roving-focus-group.d.ts} +9 -8
  332. package/dist/internal/{use-roving-focus.svelte.js → roving-focus-group.js} +30 -34
  333. package/dist/internal/shared-state.svelte.d.ts +6 -0
  334. package/dist/internal/shared-state.svelte.js +31 -0
  335. package/dist/internal/should-enable-focus-trap.d.ts +5 -0
  336. package/dist/internal/should-enable-focus-trap.js +5 -0
  337. package/dist/internal/state-machine.d.ts +16 -0
  338. package/dist/internal/state-machine.js +18 -0
  339. package/dist/internal/svelte-resize-observer.svelte.d.ts +6 -0
  340. package/dist/internal/svelte-resize-observer.svelte.js +25 -0
  341. package/dist/internal/tabbable.d.ts +0 -1
  342. package/dist/internal/tabbable.js +0 -11
  343. package/dist/internal/timeout-fn.d.ts +16 -0
  344. package/dist/internal/timeout-fn.js +38 -0
  345. package/dist/internal/types.d.ts +2 -2
  346. package/package.json +2 -2
  347. package/dist/bits/utilities/focus-scope/focus-scope-stack.svelte.d.ts +0 -14
  348. package/dist/bits/utilities/focus-scope/focus-scope-stack.svelte.js +0 -50
  349. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +0 -49
  350. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +0 -218
  351. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +0 -4
  352. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +0 -97
  353. package/dist/internal/box.svelte.d.ts +0 -21
  354. package/dist/internal/box.svelte.js +0 -26
  355. package/dist/internal/create-event-hook.svelte.d.ts +0 -18
  356. package/dist/internal/create-event-hook.svelte.js +0 -29
  357. package/dist/internal/create-shared-hook.svelte.d.ts +0 -2
  358. package/dist/internal/create-shared-hook.svelte.js +0 -27
  359. package/dist/internal/should-trap-focus.d.ts +0 -6
  360. package/dist/internal/should-trap-focus.js +0 -6
  361. package/dist/internal/sleep.d.ts +0 -1
  362. package/dist/internal/sleep.js +0 -3
  363. package/dist/internal/use-after-animations.svelte.d.ts +0 -5
  364. package/dist/internal/use-after-animations.svelte.js +0 -27
  365. package/dist/internal/use-body-scroll-lock.svelte.d.ts +0 -6
  366. package/dist/internal/use-body-scroll-lock.svelte.js +0 -106
  367. package/dist/internal/use-data-typeahead.svelte.d.ts +0 -15
  368. package/dist/internal/use-data-typeahead.svelte.js +0 -34
  369. package/dist/internal/use-dom-typeahead.svelte.d.ts +0 -13
  370. package/dist/internal/use-dom-typeahead.svelte.js +0 -32
  371. package/dist/internal/use-form-control.svelte.d.ts +0 -4
  372. package/dist/internal/use-form-control.svelte.js +0 -16
  373. package/dist/internal/use-resize-observer.svelte.d.ts +0 -2
  374. package/dist/internal/use-resize-observer.svelte.js +0 -17
  375. package/dist/internal/use-state-machine.svelte.d.ts +0 -24
  376. package/dist/internal/use-state-machine.svelte.js +0 -28
  377. package/dist/internal/use-timeout-fn.svelte.d.ts +0 -25
  378. package/dist/internal/use-timeout-fn.svelte.js +0 -39
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
- import { useFloatingRootState } from "../use-floating-layer.svelte.js";
3
+ import { FloatingRootState } from "../use-floating-layer.svelte.js";
4
4
 
5
5
  let { children, tooltip = false }: { children?: Snippet; tooltip?: boolean } = $props();
6
6
 
7
- useFloatingRootState(tooltip);
7
+ FloatingRootState.create(tooltip);
8
8
  </script>
9
9
 
10
10
  {@render children?.()}
@@ -1,7 +1,6 @@
1
1
  import { type Middleware, type Placement } from "@floating-ui/dom";
2
- import { type ReadableBox } from "svelte-toolbelt";
3
- import type { Arrayable, WithRefProps } from "../../../internal/types.js";
4
- import type { Box, ReadableBoxedValues } from "../../../internal/box.svelte.js";
2
+ import { type ReadableBoxedValues, type ReadableBox, type Box } from "svelte-toolbelt";
3
+ import type { Arrayable, WithRefOpts } from "../../../internal/types.js";
5
4
  import type { Measurable, UseFloatingReturn } from "../../../internal/floating-svelte/types.js";
6
5
  import type { Direction, StyleProperties } from "../../../shared/index.js";
7
6
  export declare const SIDE_OPTIONS: readonly ["top", "right", "bottom", "left"];
@@ -9,13 +8,14 @@ export declare const ALIGN_OPTIONS: readonly ["start", "center", "end"];
9
8
  export type Side = (typeof SIDE_OPTIONS)[number];
10
9
  export type Align = (typeof ALIGN_OPTIONS)[number];
11
10
  export type Boundary = Element | null;
12
- declare class FloatingRootState {
11
+ export declare class FloatingRootState {
12
+ static create(tooltip?: boolean): FloatingRootState;
13
13
  anchorNode: import("svelte-toolbelt").WritableBox<HTMLElement | Measurable | null>;
14
14
  customAnchorNode: import("svelte-toolbelt").WritableBox<string | HTMLElement | Measurable | null>;
15
15
  triggerNode: ReadableBox<Measurable | HTMLElement | null>;
16
16
  constructor();
17
17
  }
18
- export type FloatingContentStateProps = ReadableBoxedValues<{
18
+ export interface FloatingContentStateOpts extends ReadableBoxedValues<{
19
19
  id: string;
20
20
  wrapperId: string;
21
21
  side: Side;
@@ -35,10 +35,12 @@ export type FloatingContentStateProps = ReadableBoxedValues<{
35
35
  style: StyleProperties | null | undefined | string;
36
36
  enabled: boolean;
37
37
  customAnchor: string | HTMLElement | null | Measurable;
38
- }>;
39
- declare class FloatingContentState {
38
+ }> {
39
+ }
40
+ export declare class FloatingContentState {
40
41
  #private;
41
- readonly opts: FloatingContentStateProps;
42
+ static create(opts: FloatingContentStateOpts, tooltip?: boolean): FloatingContentState;
43
+ readonly opts: FloatingContentStateOpts;
42
44
  readonly root: FloatingRootState;
43
45
  contentRef: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
44
46
  wrapperRef: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
@@ -911,14 +913,16 @@ declare class FloatingContentState {
911
913
  transform: string;
912
914
  visibility: string | undefined;
913
915
  };
914
- constructor(opts: FloatingContentStateProps, root: FloatingRootState);
916
+ constructor(opts: FloatingContentStateOpts, root: FloatingRootState);
917
+ }
918
+ interface FloatingArrowStateOpts extends WithRefOpts {
915
919
  }
916
- type FloatingArrowStateProps = WithRefProps;
917
- declare class FloatingArrowState {
918
- readonly opts: FloatingArrowStateProps;
920
+ export declare class FloatingArrowState {
921
+ static create(opts: FloatingArrowStateOpts): FloatingArrowState;
922
+ readonly opts: FloatingArrowStateOpts;
919
923
  readonly content: FloatingContentState;
920
- constructor(opts: FloatingArrowStateProps, content: FloatingContentState);
921
- props: {
924
+ constructor(opts: FloatingArrowStateOpts, content: FloatingContentState);
925
+ readonly props: {
922
926
  readonly id: string;
923
927
  readonly style: {
924
928
  [x: string]: string | number | undefined;
@@ -932,20 +936,18 @@ declare class FloatingArrowState {
932
936
  readonly "data-side": "left" | "right" | "top" | "bottom";
933
937
  };
934
938
  }
935
- type FloatingAnchorStateProps = ReadableBoxedValues<{
939
+ interface FloatingAnchorStateOpts extends ReadableBoxedValues<{
936
940
  id: string;
937
941
  virtualEl?: Measurable | null;
938
942
  ref: Measurable | HTMLElement | null;
939
- }>;
940
- declare class FloatingAnchorState {
941
- readonly opts: FloatingAnchorStateProps;
943
+ }> {
944
+ }
945
+ export declare class FloatingAnchorState {
946
+ static create(opts: FloatingAnchorStateOpts, tooltip?: boolean): FloatingAnchorState;
947
+ readonly opts: FloatingAnchorStateOpts;
942
948
  readonly root: FloatingRootState;
943
- constructor(opts: FloatingAnchorStateProps, root: FloatingRootState);
949
+ constructor(opts: FloatingAnchorStateOpts, root: FloatingRootState);
944
950
  }
945
- export declare function useFloatingRootState(tooltip?: boolean): FloatingRootState;
946
- export declare function useFloatingContentState(props: FloatingContentStateProps, tooltip?: boolean): FloatingContentState;
947
- export declare function useFloatingArrowState(props: FloatingArrowStateProps): FloatingArrowState;
948
- export declare function useFloatingAnchorState(props: FloatingAnchorStateProps, tooltip?: boolean): FloatingAnchorState;
949
951
  export declare function getSideFromPlacement(placement: Placement): "left" | "right" | "top" | "bottom";
950
952
  export declare function getAlignFromPlacement(placement: Placement): "end" | "center" | "start";
951
953
  export {};
@@ -12,7 +12,15 @@ const OPPOSITE_SIDE = {
12
12
  bottom: "top",
13
13
  left: "right",
14
14
  };
15
- class FloatingRootState {
15
+ const FloatingRootContext = new Context("Floating.Root");
16
+ const FloatingContentContext = new Context("Floating.Content");
17
+ const FloatingTooltipRootContext = new Context("Floating.Root");
18
+ export class FloatingRootState {
19
+ static create(tooltip = false) {
20
+ return tooltip
21
+ ? FloatingTooltipRootContext.set(new FloatingRootState())
22
+ : FloatingRootContext.set(new FloatingRootState());
23
+ }
16
24
  anchorNode = box(null);
17
25
  customAnchorNode = box(null);
18
26
  triggerNode = box(null);
@@ -32,7 +40,12 @@ class FloatingRootState {
32
40
  });
33
41
  }
34
42
  }
35
- class FloatingContentState {
43
+ export class FloatingContentState {
44
+ static create(opts, tooltip = false) {
45
+ return tooltip
46
+ ? FloatingContentContext.set(new FloatingContentState(opts, FloatingTooltipRootContext.get()))
47
+ : FloatingContentContext.set(new FloatingContentState(opts, FloatingRootContext.get()));
48
+ }
36
49
  opts;
37
50
  root;
38
51
  // nodes
@@ -202,7 +215,10 @@ class FloatingContentState {
202
215
  });
203
216
  }
204
217
  }
205
- class FloatingArrowState {
218
+ export class FloatingArrowState {
219
+ static create(opts) {
220
+ return new FloatingArrowState(opts, FloatingContentContext.get());
221
+ }
206
222
  opts;
207
223
  content;
208
224
  constructor(opts, content) {
@@ -216,7 +232,12 @@ class FloatingArrowState {
216
232
  ...attachRef(this.content.arrowRef),
217
233
  }));
218
234
  }
219
- class FloatingAnchorState {
235
+ export class FloatingAnchorState {
236
+ static create(opts, tooltip = false) {
237
+ return tooltip
238
+ ? new FloatingAnchorState(opts, FloatingTooltipRootContext.get())
239
+ : new FloatingAnchorState(opts, FloatingRootContext.get());
240
+ }
220
241
  opts;
221
242
  root;
222
243
  constructor(opts, root) {
@@ -230,27 +251,6 @@ class FloatingAnchorState {
230
251
  }
231
252
  }
232
253
  }
233
- const FloatingRootContext = new Context("Floating.Root");
234
- const FloatingContentContext = new Context("Floating.Content");
235
- const FloatingTooltipRootContext = new Context("Floating.Root");
236
- export function useFloatingRootState(tooltip = false) {
237
- return tooltip
238
- ? FloatingTooltipRootContext.set(new FloatingRootState())
239
- : FloatingRootContext.set(new FloatingRootState());
240
- }
241
- export function useFloatingContentState(props, tooltip = false) {
242
- return tooltip
243
- ? FloatingContentContext.set(new FloatingContentState(props, FloatingTooltipRootContext.get()))
244
- : FloatingContentContext.set(new FloatingContentState(props, FloatingRootContext.get()));
245
- }
246
- export function useFloatingArrowState(props) {
247
- return new FloatingArrowState(props, FloatingContentContext.get());
248
- }
249
- export function useFloatingAnchorState(props, tooltip = false) {
250
- return tooltip
251
- ? new FloatingAnchorState(props, FloatingTooltipRootContext.get())
252
- : new FloatingAnchorState(props, FloatingRootContext.get());
253
- }
254
254
  //
255
255
  // HELPERS
256
256
  //
@@ -0,0 +1,12 @@
1
+ import { FocusScope } from "./focus-scope.svelte.js";
2
+ export declare class FocusScopeManager {
3
+ #private;
4
+ static instance: FocusScopeManager;
5
+ static getInstance(): FocusScopeManager;
6
+ register(scope: FocusScope): void;
7
+ unregister(scope: FocusScope): void;
8
+ getActive(): FocusScope | undefined;
9
+ setFocusMemory(scope: FocusScope, element: HTMLElement): void;
10
+ getFocusMemory(scope: FocusScope): HTMLElement | undefined;
11
+ isActiveScope(scope: FocusScope): boolean;
12
+ }
@@ -0,0 +1,40 @@
1
+ import { box } from "svelte-toolbelt";
2
+ import { FocusScope } from "./focus-scope.svelte.js";
3
+ export class FocusScopeManager {
4
+ static instance;
5
+ #scopeStack = box([]);
6
+ #focusHistory = new WeakMap();
7
+ static getInstance() {
8
+ if (!this.instance) {
9
+ this.instance = new FocusScopeManager();
10
+ }
11
+ return this.instance;
12
+ }
13
+ register(scope) {
14
+ const current = this.getActive();
15
+ if (current && current !== scope) {
16
+ current.pause();
17
+ }
18
+ this.#scopeStack.current = this.#scopeStack.current.filter((s) => s !== scope);
19
+ this.#scopeStack.current.unshift(scope);
20
+ }
21
+ unregister(scope) {
22
+ this.#scopeStack.current = this.#scopeStack.current.filter((s) => s !== scope);
23
+ const next = this.getActive();
24
+ if (next) {
25
+ next.resume();
26
+ }
27
+ }
28
+ getActive() {
29
+ return this.#scopeStack.current[0];
30
+ }
31
+ setFocusMemory(scope, element) {
32
+ this.#focusHistory.set(scope, element);
33
+ }
34
+ getFocusMemory(scope) {
35
+ return this.#focusHistory.get(scope);
36
+ }
37
+ isActiveScope(scope) {
38
+ return this.getActive() === scope;
39
+ }
40
+ }
@@ -1,27 +1,25 @@
1
1
  <script lang="ts">
2
2
  import { box } from "svelte-toolbelt";
3
3
  import type { FocusScopeImplProps } from "./types.js";
4
- import { useFocusScope } from "./use-focus-scope.svelte.js";
5
4
  import { noop } from "../../../internal/noop.js";
5
+ import { FocusScope } from "./focus-scope.svelte.js";
6
6
 
7
7
  let {
8
- id,
8
+ enabled = false,
9
9
  trapFocus = false,
10
10
  loop = false,
11
11
  onCloseAutoFocus = noop,
12
12
  onOpenAutoFocus = noop,
13
13
  focusScope,
14
- forceMount = false,
15
14
  ref,
16
15
  }: FocusScopeImplProps = $props();
17
16
 
18
- const focusScopeState = useFocusScope({
19
- enabled: box.with(() => trapFocus),
20
- loop: box.with(() => loop),
17
+ const focusScopeState = FocusScope.use({
18
+ enabled: box.with(() => enabled),
19
+ trap: box.with(() => trapFocus),
20
+ loop: loop,
21
21
  onCloseAutoFocus: box.with(() => onCloseAutoFocus),
22
22
  onOpenAutoFocus: box.with(() => onOpenAutoFocus),
23
- id: box.with(() => id),
24
- forceMount: box.with(() => forceMount),
25
23
  ref,
26
24
  });
27
25
  </script>
@@ -1,4 +1,5 @@
1
1
  import type { FocusScopeImplProps } from "./types.js";
2
+ import { FocusScope } from "./focus-scope.svelte.js";
2
3
  declare const FocusScope: import("svelte").Component<FocusScopeImplProps, {}, "">;
3
4
  type FocusScope = ReturnType<typeof FocusScope>;
4
5
  export default FocusScope;
@@ -0,0 +1,204 @@
1
+ import { onDestroyEffect } from "svelte-toolbelt";
2
+ import { FocusScopeManager } from "./focus-scope-manager.js";
3
+ import { focusable, isFocusable, tabbable } from "tabbable";
4
+ import { on } from "svelte/events";
5
+ import { watch } from "runed";
6
+ export class FocusScope {
7
+ #paused = false;
8
+ #container = null;
9
+ #manager = FocusScopeManager.getInstance();
10
+ #cleanupFns = [];
11
+ #opts;
12
+ constructor(opts) {
13
+ this.#opts = opts;
14
+ }
15
+ get paused() {
16
+ return this.#paused;
17
+ }
18
+ pause() {
19
+ this.#paused = true;
20
+ }
21
+ resume() {
22
+ this.#paused = false;
23
+ }
24
+ #cleanup() {
25
+ for (const fn of this.#cleanupFns) {
26
+ fn();
27
+ }
28
+ this.#cleanupFns = [];
29
+ }
30
+ mount(container) {
31
+ if (this.#container) {
32
+ this.unmount();
33
+ }
34
+ this.#container = container;
35
+ this.#manager.register(this);
36
+ this.#setupEventListeners();
37
+ this.#handleOpenAutoFocus();
38
+ }
39
+ unmount() {
40
+ if (!this.#container)
41
+ return;
42
+ this.#cleanup();
43
+ // handle close auto-focus
44
+ this.#handleCloseAutoFocus();
45
+ this.#manager.unregister(this);
46
+ this.#container = null;
47
+ }
48
+ #handleOpenAutoFocus() {
49
+ if (!this.#container)
50
+ return;
51
+ const event = new CustomEvent("focusScope.onOpenAutoFocus", {
52
+ bubbles: false,
53
+ cancelable: true,
54
+ });
55
+ this.#opts.onOpenAutoFocus.current(event);
56
+ if (!event.defaultPrevented) {
57
+ requestAnimationFrame(() => {
58
+ if (!this.#container)
59
+ return;
60
+ const firstTabbable = this.#getFirstTabbable();
61
+ if (firstTabbable) {
62
+ firstTabbable.focus();
63
+ this.#manager.setFocusMemory(this, firstTabbable);
64
+ }
65
+ else {
66
+ this.#container.focus();
67
+ }
68
+ });
69
+ }
70
+ }
71
+ #handleCloseAutoFocus() {
72
+ const event = new CustomEvent("focusScope.onCloseAutoFocus", {
73
+ bubbles: false,
74
+ cancelable: true,
75
+ });
76
+ this.#opts.onCloseAutoFocus.current(event);
77
+ if (!event.defaultPrevented) {
78
+ // return focus to previously focused element
79
+ const prevFocused = document.activeElement;
80
+ if (prevFocused && prevFocused !== document.body) {
81
+ prevFocused.focus();
82
+ }
83
+ }
84
+ }
85
+ #setupEventListeners() {
86
+ if (!this.#container || !this.#opts.trap.current)
87
+ return;
88
+ const container = this.#container;
89
+ const doc = container.ownerDocument;
90
+ const handleFocus = (e) => {
91
+ if (this.#paused || !this.#manager.isActiveScope(this))
92
+ return;
93
+ const target = e.target;
94
+ if (!target)
95
+ return;
96
+ const isInside = container.contains(target);
97
+ if (isInside) {
98
+ // store last focused element
99
+ this.#manager.setFocusMemory(this, target);
100
+ }
101
+ else {
102
+ // focus escaped - bring it back
103
+ const lastFocused = this.#manager.getFocusMemory(this);
104
+ if (lastFocused && container.contains(lastFocused) && isFocusable(lastFocused)) {
105
+ e.preventDefault();
106
+ lastFocused.focus();
107
+ }
108
+ else {
109
+ // fallback to first tabbable or first focusable or container
110
+ const firstTabbable = this.#getFirstTabbable();
111
+ const firstFocusable = this.#getAllFocusables()[0];
112
+ (firstTabbable || firstFocusable || container).focus();
113
+ }
114
+ }
115
+ };
116
+ const handleKeydown = (e) => {
117
+ if (!this.#opts.loop || this.#paused || e.key !== "Tab")
118
+ return;
119
+ if (!this.#manager.isActiveScope(this))
120
+ return;
121
+ const tabbables = this.#getTabbables();
122
+ if (tabbables.length < 2)
123
+ return;
124
+ const first = tabbables[0];
125
+ const last = tabbables[tabbables.length - 1];
126
+ if (!e.shiftKey && doc.activeElement === last) {
127
+ e.preventDefault();
128
+ first.focus();
129
+ }
130
+ else if (e.shiftKey && doc.activeElement === first) {
131
+ e.preventDefault();
132
+ last.focus();
133
+ }
134
+ };
135
+ this.#cleanupFns.push(on(doc, "focusin", handleFocus, { capture: true }), on(container, "keydown", handleKeydown));
136
+ const observer = new MutationObserver(() => {
137
+ const lastFocused = this.#manager.getFocusMemory(this);
138
+ if (lastFocused && !container.contains(lastFocused)) {
139
+ // last focused element was removed
140
+ const firstTabbable = this.#getFirstTabbable();
141
+ const firstFocusable = this.#getAllFocusables()[0];
142
+ const elementToFocus = firstTabbable || firstFocusable;
143
+ if (elementToFocus) {
144
+ elementToFocus.focus();
145
+ this.#manager.setFocusMemory(this, elementToFocus);
146
+ }
147
+ else {
148
+ // no focusable elements left, focus container
149
+ container.focus();
150
+ }
151
+ }
152
+ });
153
+ observer.observe(container, {
154
+ childList: true,
155
+ subtree: true,
156
+ });
157
+ this.#cleanupFns.push(() => observer.disconnect());
158
+ }
159
+ #getTabbables() {
160
+ if (!this.#container)
161
+ return [];
162
+ return tabbable(this.#container, {
163
+ includeContainer: false,
164
+ getShadowRoot: true,
165
+ });
166
+ }
167
+ #getFirstTabbable() {
168
+ const tabbables = this.#getTabbables();
169
+ return tabbables[0] || null;
170
+ }
171
+ #getAllFocusables() {
172
+ if (!this.#container)
173
+ return [];
174
+ return focusable(this.#container, {
175
+ includeContainer: false,
176
+ getShadowRoot: true,
177
+ });
178
+ }
179
+ static use(opts) {
180
+ let scope = null;
181
+ watch([() => opts.ref.current, () => opts.enabled.current], ([ref, enabled]) => {
182
+ if (ref && enabled) {
183
+ if (!scope) {
184
+ scope = new FocusScope(opts);
185
+ }
186
+ scope.mount(ref);
187
+ }
188
+ else if (scope) {
189
+ scope.unmount();
190
+ scope = null;
191
+ }
192
+ });
193
+ onDestroyEffect(() => {
194
+ scope?.unmount();
195
+ });
196
+ return {
197
+ get props() {
198
+ return {
199
+ tabindex: -1,
200
+ };
201
+ },
202
+ };
203
+ }
204
+ }
@@ -1,5 +1,4 @@
1
1
  import type { Snippet } from "svelte";
2
- import type { FocusScopeContainerProps } from "./use-focus-scope.svelte.js";
3
2
  import type { EventCallback } from "../../../internal/events.js";
4
3
  import type { ReadableBox } from "svelte-toolbelt";
5
4
  export type FocusScopeProps = {
@@ -21,15 +20,11 @@ export type FocusScopeProps = {
21
20
  trapFocus?: boolean;
22
21
  };
23
22
  export type FocusScopeImplProps = {
24
- /**
25
- * The ID of the focus scope container node.
26
- */
27
- id: string;
28
23
  /**
29
24
  * The snippet to render the focus scope container with its props.
30
25
  */
31
26
  focusScope?: Snippet<[{
32
- props: FocusScopeContainerProps;
27
+ props: Record<string, unknown>;
33
28
  }]>;
34
29
  /**
35
30
  * When `true` will loop through the tabbable elements in the focus scope.
@@ -39,5 +34,6 @@ export type FocusScopeImplProps = {
39
34
  * Whether the content within the focus trap is being force mounted or not.
40
35
  */
41
36
  forceMount?: boolean;
37
+ enabled: boolean;
42
38
  ref: ReadableBox<HTMLElement | null>;
43
39
  } & FocusScopeProps;
@@ -39,7 +39,7 @@
39
39
  isStatic = false,
40
40
  enabled,
41
41
  ...restProps
42
- }: Omit<PopperLayerImplProps, "present"> & {
42
+ }: Omit<PopperLayerImplProps, "open"> & {
43
43
  enabled: boolean;
44
44
  } = $props();
45
45
  </script>
@@ -1,5 +1,5 @@
1
1
  import type { PopperLayerImplProps } from "./types.js";
2
- type $$ComponentProps = Omit<PopperLayerImplProps, "present"> & {
2
+ type $$ComponentProps = Omit<PopperLayerImplProps, "open"> & {
3
3
  enabled: boolean;
4
4
  };
5
5
  declare const PopperLayerForceMount: import("svelte").Component<$$ComponentProps, {}, "">;
@@ -47,7 +47,7 @@
47
47
  ref,
48
48
  tooltip = false,
49
49
  ...restProps
50
- }: Omit<PopperLayerImplProps, "present" | "children"> & {
50
+ }: Omit<PopperLayerImplProps, "open" | "children"> & {
51
51
  enabled: boolean;
52
52
  } = $props();
53
53
  </script>
@@ -82,11 +82,11 @@
82
82
  <ScrollLock {preventScroll} />
83
83
  {/if}
84
84
  <FocusScope
85
- {id}
86
85
  {onOpenAutoFocus}
87
86
  {onCloseAutoFocus}
88
87
  {loop}
89
- trapFocus={enabled && trapFocus}
88
+ {enabled}
89
+ {trapFocus}
90
90
  forceMount={restProps.forceMount}
91
91
  {ref}
92
92
  >
@@ -1,5 +1,5 @@
1
1
  import type { PopperLayerImplProps } from "./types.js";
2
- type $$ComponentProps = Omit<PopperLayerImplProps, "present" | "children"> & {
2
+ type $$ComponentProps = Omit<PopperLayerImplProps, "open" | "children"> & {
3
3
  enabled: boolean;
4
4
  };
5
5
  declare const PopperLayerInner: import("svelte").Component<$$ComponentProps, {}, "">;
@@ -5,7 +5,7 @@
5
5
 
6
6
  let {
7
7
  popper,
8
- present,
8
+ open,
9
9
  onEscapeKeydown,
10
10
  escapeKeydownBehavior,
11
11
  preventOverflowTextSelection,
@@ -44,7 +44,7 @@
44
44
  }: PopperLayerImplProps = $props();
45
45
  </script>
46
46
 
47
- <PresenceLayer {present} {ref}>
47
+ <PresenceLayer {open} {ref}>
48
48
  {#snippet presence()}
49
49
  <PopperLayerInner
50
50
  {popper}
@@ -73,7 +73,7 @@
73
73
  {onPlaced}
74
74
  {customAnchor}
75
75
  {isStatic}
76
- enabled={present}
76
+ enabled={open}
77
77
  {onInteractOutside}
78
78
  {onCloseAutoFocus}
79
79
  {onOpenAutoFocus}
@@ -1,16 +1,16 @@
1
1
  <script lang="ts">
2
2
  import { box } from "svelte-toolbelt";
3
3
  import type { PresenceLayerImplProps } from "./types.js";
4
- import { usePresence } from "./use-presence.svelte.js";
4
+ import { Presence } from "./presence.svelte.js";
5
5
 
6
- let { present, forceMount, presence, ref }: PresenceLayerImplProps = $props();
6
+ let { open, forceMount, presence, ref }: PresenceLayerImplProps = $props();
7
7
 
8
- const isPresent = usePresence(
9
- box.with(() => present),
10
- ref
11
- );
8
+ const presenceState = new Presence({
9
+ open: box.with(() => open),
10
+ ref,
11
+ });
12
12
  </script>
13
13
 
14
- {#if forceMount || present || isPresent.current}
15
- {@render presence?.({ present: isPresent })}
14
+ {#if forceMount || open || presenceState.isPresent}
15
+ {@render presence?.({ present: presenceState.isPresent })}
16
16
  {/if}
@@ -0,0 +1,42 @@
1
+ import { type ReadableBox, type ReadableBoxedValues } from "svelte-toolbelt";
2
+ import { Previous } from "runed";
3
+ import { StateMachine } from "../../../internal/state-machine.js";
4
+ export interface PresenceOptions extends ReadableBoxedValues<{
5
+ open: boolean;
6
+ ref: HTMLElement | null;
7
+ }> {
8
+ }
9
+ type PresenceStatus = "unmounted" | "mounted" | "unmountSuspended";
10
+ declare const presenceMachine: {
11
+ readonly mounted: {
12
+ readonly UNMOUNT: "unmounted";
13
+ readonly ANIMATION_OUT: "unmountSuspended";
14
+ };
15
+ readonly unmountSuspended: {
16
+ readonly MOUNT: "mounted";
17
+ readonly ANIMATION_END: "unmounted";
18
+ };
19
+ readonly unmounted: {
20
+ readonly MOUNT: "mounted";
21
+ };
22
+ };
23
+ type PresenceMachine = StateMachine<typeof presenceMachine>;
24
+ export declare class Presence {
25
+ readonly opts: PresenceOptions;
26
+ prevAnimationNameState: string;
27
+ styles: CSSStyleDeclaration;
28
+ initialStatus: PresenceStatus;
29
+ previousPresent: Previous<boolean>;
30
+ machine: PresenceMachine;
31
+ present: ReadableBox<boolean>;
32
+ constructor(opts: PresenceOptions);
33
+ /**
34
+ * Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`
35
+ * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we
36
+ * make sure we only trigger ANIMATION_END for the currently active animation.
37
+ */
38
+ handleAnimationEnd(event: AnimationEvent): void;
39
+ handleAnimationStart(event: AnimationEvent): void;
40
+ isPresent: boolean;
41
+ }
42
+ export {};