bits-ui 1.8.0 → 2.2.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 (317) hide show
  1. package/dist/bits/accordion/accordion.svelte.d.ts +56 -53
  2. package/dist/bits/accordion/accordion.svelte.js +78 -89
  3. package/dist/bits/accordion/components/accordion-content.svelte +5 -3
  4. package/dist/bits/accordion/components/accordion-header.svelte +4 -2
  5. package/dist/bits/accordion/components/accordion-item.svelte +6 -3
  6. package/dist/bits/accordion/components/accordion-trigger.svelte +4 -2
  7. package/dist/bits/accordion/components/accordion.svelte +4 -2
  8. package/dist/bits/alert-dialog/components/alert-dialog-action.svelte +4 -2
  9. package/dist/bits/alert-dialog/components/alert-dialog-cancel.svelte +4 -2
  10. package/dist/bits/alert-dialog/components/alert-dialog-content.svelte +8 -3
  11. package/dist/bits/aspect-ratio/aspect-ratio.svelte.js +2 -2
  12. package/dist/bits/aspect-ratio/components/aspect-ratio.svelte +4 -2
  13. package/dist/bits/avatar/avatar.svelte.d.ts +2 -1
  14. package/dist/bits/avatar/avatar.svelte.js +8 -6
  15. package/dist/bits/avatar/components/avatar-fallback.svelte +4 -2
  16. package/dist/bits/avatar/components/avatar-image.svelte +4 -2
  17. package/dist/bits/avatar/components/avatar.svelte +4 -2
  18. package/dist/bits/button/components/button.svelte +1 -1
  19. package/dist/bits/calendar/calendar.svelte.d.ts +3 -9
  20. package/dist/bits/calendar/calendar.svelte.js +55 -41
  21. package/dist/bits/calendar/components/calendar-cell.svelte +4 -2
  22. package/dist/bits/calendar/components/calendar-day.svelte +4 -2
  23. package/dist/bits/calendar/components/calendar-grid-body.svelte +4 -2
  24. package/dist/bits/calendar/components/calendar-grid-head.svelte +4 -2
  25. package/dist/bits/calendar/components/calendar-grid-row.svelte +4 -2
  26. package/dist/bits/calendar/components/calendar-grid.svelte +4 -2
  27. package/dist/bits/calendar/components/calendar-head-cell.svelte +4 -2
  28. package/dist/bits/calendar/components/calendar-header.svelte +4 -2
  29. package/dist/bits/calendar/components/calendar-heading.svelte +4 -2
  30. package/dist/bits/calendar/components/calendar-next-button.svelte +4 -2
  31. package/dist/bits/calendar/components/calendar-prev-button.svelte +4 -2
  32. package/dist/bits/checkbox/checkbox.svelte.js +4 -14
  33. package/dist/bits/checkbox/components/checkbox-group-label.svelte +4 -2
  34. package/dist/bits/checkbox/components/checkbox-group.svelte +4 -2
  35. package/dist/bits/checkbox/components/checkbox.svelte +4 -2
  36. package/dist/bits/collapsible/collapsible.svelte.js +4 -10
  37. package/dist/bits/collapsible/components/collapsible-content.svelte +5 -3
  38. package/dist/bits/collapsible/components/collapsible-trigger.svelte +4 -2
  39. package/dist/bits/collapsible/components/collapsible.svelte +4 -2
  40. package/dist/bits/combobox/components/combobox-input.svelte +3 -3
  41. package/dist/bits/combobox/components/combobox.svelte +6 -1
  42. package/dist/bits/combobox/types.d.ts +18 -1
  43. package/dist/bits/command/command.svelte.js +13 -45
  44. package/dist/bits/command/components/_command-label.svelte +6 -7
  45. package/dist/bits/command/components/_command-label.svelte.d.ts +1 -1
  46. package/dist/bits/command/components/command-empty.svelte +4 -2
  47. package/dist/bits/command/components/command-group-heading.svelte +4 -2
  48. package/dist/bits/command/components/command-group-items.svelte +4 -2
  49. package/dist/bits/command/components/command-group.svelte +4 -2
  50. package/dist/bits/command/components/command-input.svelte +4 -2
  51. package/dist/bits/command/components/command-item.svelte +4 -2
  52. package/dist/bits/command/components/command-link-item.svelte +4 -2
  53. package/dist/bits/command/components/command-list.svelte +4 -2
  54. package/dist/bits/command/components/command-loading.svelte +4 -2
  55. package/dist/bits/command/components/command-separator.svelte +4 -2
  56. package/dist/bits/command/components/command-viewport.svelte +4 -2
  57. package/dist/bits/command/components/command.svelte +4 -2
  58. package/dist/bits/context-menu/components/context-menu-content-static.svelte +2 -3
  59. package/dist/bits/context-menu/components/context-menu-content.svelte +2 -3
  60. package/dist/bits/context-menu/components/context-menu-trigger.svelte +1 -1
  61. package/dist/bits/date-field/components/date-field-input.svelte +4 -2
  62. package/dist/bits/date-field/components/date-field-label.svelte +4 -2
  63. package/dist/bits/date-field/components/date-field-segment.svelte +4 -2
  64. package/dist/bits/date-field/date-field.svelte.d.ts +7 -5
  65. package/dist/bits/date-field/date-field.svelte.js +29 -38
  66. package/dist/bits/date-picker/components/date-picker-calendar.svelte +4 -2
  67. package/dist/bits/date-range-field/components/date-range-field-input.svelte +4 -2
  68. package/dist/bits/date-range-field/components/date-range-field-label.svelte +4 -2
  69. package/dist/bits/date-range-field/components/date-range-field.svelte +4 -2
  70. package/dist/bits/date-range-field/date-range-field.svelte.d.ts +2 -0
  71. package/dist/bits/date-range-field/date-range-field.svelte.js +6 -14
  72. package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +4 -2
  73. package/dist/bits/dialog/components/dialog-close.svelte +4 -2
  74. package/dist/bits/dialog/components/dialog-content.svelte +8 -2
  75. package/dist/bits/dialog/components/dialog-description.svelte +4 -2
  76. package/dist/bits/dialog/components/dialog-overlay.svelte +8 -3
  77. package/dist/bits/dialog/components/dialog-title.svelte +4 -2
  78. package/dist/bits/dialog/components/dialog-trigger.svelte +4 -2
  79. package/dist/bits/dialog/dialog.svelte.d.ts +1 -1
  80. package/dist/bits/dialog/dialog.svelte.js +19 -47
  81. package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +6 -5
  82. package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +6 -5
  83. package/dist/bits/index.d.ts +2 -0
  84. package/dist/bits/index.js +2 -0
  85. package/dist/bits/label/components/label.svelte +4 -2
  86. package/dist/bits/label/label.svelte.js +2 -2
  87. package/dist/bits/link-preview/components/link-preview-content-static.svelte +6 -2
  88. package/dist/bits/link-preview/components/link-preview-content.svelte +6 -2
  89. package/dist/bits/link-preview/components/link-preview-trigger.svelte +5 -3
  90. package/dist/bits/link-preview/link-preview.svelte.d.ts +2 -0
  91. package/dist/bits/link-preview/link-preview.svelte.js +13 -19
  92. package/dist/bits/menu/components/menu-checkbox-group.svelte +4 -2
  93. package/dist/bits/menu/components/menu-checkbox-item.svelte +6 -4
  94. package/dist/bits/menu/components/menu-content-static.svelte +6 -5
  95. package/dist/bits/menu/components/menu-content.svelte +6 -5
  96. package/dist/bits/menu/components/menu-group-heading.svelte +4 -2
  97. package/dist/bits/menu/components/menu-group.svelte +4 -2
  98. package/dist/bits/menu/components/menu-item.svelte +4 -2
  99. package/dist/bits/menu/components/menu-radio-group.svelte +4 -2
  100. package/dist/bits/menu/components/menu-radio-item.svelte +4 -2
  101. package/dist/bits/menu/components/menu-separator.svelte +4 -2
  102. package/dist/bits/menu/components/menu-sub-content-static.svelte +6 -5
  103. package/dist/bits/menu/components/menu-sub-content.svelte +6 -5
  104. package/dist/bits/menu/components/menu-sub-trigger.svelte +6 -3
  105. package/dist/bits/menu/components/menu-trigger.svelte +5 -3
  106. package/dist/bits/menu/menu.svelte.d.ts +9 -20
  107. package/dist/bits/menu/menu.svelte.js +40 -63
  108. package/dist/bits/menubar/components/menubar-content-static.svelte +4 -2
  109. package/dist/bits/menubar/components/menubar-content.svelte +4 -2
  110. package/dist/bits/menubar/components/menubar-menu.svelte +4 -2
  111. package/dist/bits/menubar/components/menubar-trigger.svelte +14 -6
  112. package/dist/bits/menubar/components/menubar.svelte +4 -2
  113. package/dist/bits/menubar/menubar.svelte.d.ts +24 -20
  114. package/dist/bits/menubar/menubar.svelte.js +40 -56
  115. package/dist/bits/meter/components/meter.svelte +4 -2
  116. package/dist/bits/meter/meter.svelte.js +2 -2
  117. package/dist/bits/navigation-menu/components/navigation-menu-content-impl.svelte +5 -2
  118. package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +8 -3
  119. package/dist/bits/navigation-menu/components/navigation-menu-indicator-impl.svelte +4 -2
  120. package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +6 -4
  121. package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +6 -3
  122. package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +4 -2
  123. package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +4 -2
  124. package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +4 -2
  125. package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +4 -2
  126. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +5 -3
  127. package/dist/bits/navigation-menu/components/navigation-menu.svelte +4 -2
  128. package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +3 -1
  129. package/dist/bits/navigation-menu/navigation-menu.svelte.js +33 -60
  130. package/dist/bits/pagination/components/pagination-next-button.svelte +4 -2
  131. package/dist/bits/pagination/components/pagination-page.svelte +4 -2
  132. package/dist/bits/pagination/components/pagination-prev-button.svelte +4 -2
  133. package/dist/bits/pagination/components/pagination.svelte +4 -2
  134. package/dist/bits/pagination/pagination.svelte.js +4 -4
  135. package/dist/bits/pin-input/components/pin-input-cell.svelte +4 -2
  136. package/dist/bits/pin-input/components/pin-input.svelte +5 -3
  137. package/dist/bits/pin-input/pin-input.svelte.d.ts +4 -2
  138. package/dist/bits/pin-input/pin-input.svelte.js +20 -22
  139. package/dist/bits/pin-input/usePasswordManager.svelte.d.ts +3 -2
  140. package/dist/bits/pin-input/usePasswordManager.svelte.js +6 -5
  141. package/dist/bits/popover/components/popover-close.svelte +4 -2
  142. package/dist/bits/popover/components/popover-content-static.svelte +6 -2
  143. package/dist/bits/popover/components/popover-content.svelte +6 -2
  144. package/dist/bits/popover/components/popover-trigger.svelte +5 -3
  145. package/dist/bits/popover/popover.svelte.js +4 -18
  146. package/dist/bits/progress/components/progress.svelte +4 -2
  147. package/dist/bits/progress/progress.svelte.js +2 -2
  148. package/dist/bits/radio-group/components/radio-group-item.svelte +4 -2
  149. package/dist/bits/radio-group/components/radio-group.svelte +4 -2
  150. package/dist/bits/radio-group/radio-group.svelte.js +4 -7
  151. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +4 -2
  152. package/dist/bits/range-calendar/components/range-calendar-day.svelte +4 -2
  153. package/dist/bits/range-calendar/components/range-calendar.svelte +4 -2
  154. package/dist/bits/range-calendar/range-calendar.svelte.d.ts +2 -0
  155. package/dist/bits/range-calendar/range-calendar.svelte.js +12 -6
  156. package/dist/bits/scroll-area/components/scroll-area-corner.svelte +8 -2
  157. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +4 -1
  158. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +1 -1
  159. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +5 -1
  160. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +4 -2
  161. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +8 -3
  162. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +4 -2
  163. package/dist/bits/scroll-area/components/scroll-area.svelte +4 -2
  164. package/dist/bits/scroll-area/scroll-area.svelte.d.ts +2 -0
  165. package/dist/bits/scroll-area/scroll-area.svelte.js +27 -58
  166. package/dist/bits/select/components/select-content-static.svelte +6 -2
  167. package/dist/bits/select/components/select-content.svelte +6 -2
  168. package/dist/bits/select/components/select-group-heading.svelte +3 -2
  169. package/dist/bits/select/components/select-group.svelte +4 -2
  170. package/dist/bits/select/components/select-item.svelte +4 -2
  171. package/dist/bits/select/components/select-scroll-down-button.svelte +4 -2
  172. package/dist/bits/select/components/select-scroll-up-button.svelte +4 -2
  173. package/dist/bits/select/components/select-trigger.svelte +5 -3
  174. package/dist/bits/select/components/select-viewport.svelte +4 -2
  175. package/dist/bits/select/components/select.svelte +7 -1
  176. package/dist/bits/select/select.svelte.d.ts +5 -19
  177. package/dist/bits/select/select.svelte.js +43 -60
  178. package/dist/bits/separator/components/separator.svelte +4 -2
  179. package/dist/bits/separator/separator.svelte.js +2 -2
  180. package/dist/bits/slider/components/slider-range.svelte +4 -2
  181. package/dist/bits/slider/components/slider-thumb-label.svelte +50 -0
  182. package/dist/bits/slider/components/slider-thumb-label.svelte.d.ts +4 -0
  183. package/dist/bits/slider/components/slider-thumb.svelte +4 -2
  184. package/dist/bits/slider/components/slider-tick-label.svelte +50 -0
  185. package/dist/bits/slider/components/slider-tick-label.svelte.d.ts +4 -0
  186. package/dist/bits/slider/components/slider-tick.svelte +4 -2
  187. package/dist/bits/slider/components/slider.svelte +24 -5
  188. package/dist/bits/slider/exports.d.ts +3 -1
  189. package/dist/bits/slider/exports.js +2 -0
  190. package/dist/bits/slider/helpers.d.ts +14 -0
  191. package/dist/bits/slider/helpers.js +122 -0
  192. package/dist/bits/slider/slider.svelte.d.ts +91 -5
  193. package/dist/bits/slider/slider.svelte.js +194 -101
  194. package/dist/bits/slider/types.d.ts +105 -11
  195. package/dist/bits/switch/components/switch-thumb.svelte +4 -2
  196. package/dist/bits/switch/components/switch.svelte +4 -2
  197. package/dist/bits/switch/switch.svelte.js +3 -3
  198. package/dist/bits/tabs/components/tabs-content.svelte +4 -2
  199. package/dist/bits/tabs/components/tabs-list.svelte +4 -2
  200. package/dist/bits/tabs/components/tabs-trigger.svelte +4 -2
  201. package/dist/bits/tabs/components/tabs.svelte +4 -2
  202. package/dist/bits/tabs/tabs.svelte.js +6 -6
  203. package/dist/bits/time-field/components/time-field-hidden-input.svelte +10 -0
  204. package/dist/bits/{date-field/components/date-field-error.svelte.d.ts → time-field/components/time-field-hidden-input.svelte.d.ts} +6 -14
  205. package/dist/bits/time-field/components/time-field-input.svelte +39 -0
  206. package/dist/bits/time-field/components/time-field-input.svelte.d.ts +4 -0
  207. package/dist/bits/time-field/components/time-field-label.svelte +34 -0
  208. package/dist/bits/time-field/components/time-field-label.svelte.d.ts +4 -0
  209. package/dist/bits/time-field/components/time-field-segment.svelte +37 -0
  210. package/dist/bits/time-field/components/time-field-segment.svelte.d.ts +4 -0
  211. package/dist/bits/time-field/components/time-field.svelte +94 -0
  212. package/dist/bits/time-field/components/time-field.svelte.d.ts +20 -0
  213. package/dist/bits/time-field/exports.d.ts +5 -0
  214. package/dist/bits/time-field/exports.js +4 -0
  215. package/dist/bits/time-field/index.d.ts +1 -0
  216. package/dist/bits/time-field/index.js +1 -0
  217. package/dist/bits/time-field/time-field.svelte.d.ts +417 -0
  218. package/dist/bits/time-field/time-field.svelte.js +980 -0
  219. package/dist/bits/time-field/types.d.ts +137 -0
  220. package/dist/bits/time-field/types.js +1 -0
  221. package/dist/bits/time-range-field/components/time-range-field-input.svelte +43 -0
  222. package/dist/bits/time-range-field/components/time-range-field-input.svelte.d.ts +4 -0
  223. package/dist/bits/time-range-field/components/time-range-field-label.svelte +34 -0
  224. package/dist/bits/time-range-field/components/time-range-field-label.svelte.d.ts +4 -0
  225. package/dist/bits/time-range-field/components/time-range-field.svelte +144 -0
  226. package/dist/bits/time-range-field/components/time-range-field.svelte.d.ts +20 -0
  227. package/dist/bits/time-range-field/exports.d.ts +5 -0
  228. package/dist/bits/time-range-field/exports.js +4 -0
  229. package/dist/bits/time-range-field/index.d.ts +1 -0
  230. package/dist/bits/time-range-field/index.js +1 -0
  231. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +92 -0
  232. package/dist/bits/time-range-field/time-range-field.svelte.js +212 -0
  233. package/dist/bits/time-range-field/types.d.ts +150 -0
  234. package/dist/bits/time-range-field/types.js +1 -0
  235. package/dist/bits/toggle/components/toggle.svelte +4 -2
  236. package/dist/bits/toggle/toggle.svelte.js +2 -2
  237. package/dist/bits/toggle-group/components/toggle-group-item.svelte +4 -2
  238. package/dist/bits/toggle-group/components/toggle-group.svelte +4 -2
  239. package/dist/bits/toggle-group/toggle-group.svelte.js +4 -4
  240. package/dist/bits/toolbar/components/toolbar-button.svelte +4 -2
  241. package/dist/bits/toolbar/components/toolbar-group-item.svelte +4 -2
  242. package/dist/bits/toolbar/components/toolbar-group.svelte +4 -2
  243. package/dist/bits/toolbar/components/toolbar-link.svelte +4 -2
  244. package/dist/bits/toolbar/components/toolbar.svelte +4 -2
  245. package/dist/bits/toolbar/toolbar.svelte.js +7 -7
  246. package/dist/bits/tooltip/components/tooltip-content-static.svelte +6 -2
  247. package/dist/bits/tooltip/components/tooltip-content.svelte +6 -2
  248. package/dist/bits/tooltip/components/tooltip-trigger.svelte +5 -3
  249. package/dist/bits/tooltip/tooltip.svelte.d.ts +2 -0
  250. package/dist/bits/tooltip/tooltip.svelte.js +6 -15
  251. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -0
  252. package/dist/bits/utilities/dismissible-layer/types.d.ts +2 -0
  253. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +3 -3
  254. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +16 -25
  255. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -1
  256. package/dist/bits/utilities/floating-layer/types.d.ts +1 -0
  257. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +3 -2
  258. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +7 -27
  259. package/dist/bits/utilities/focus-scope/focus-scope.svelte +2 -0
  260. package/dist/bits/utilities/focus-scope/types.d.ts +2 -0
  261. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +2 -1
  262. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +15 -16
  263. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +4 -0
  264. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -1
  265. package/dist/bits/utilities/portal/types.d.ts +1 -1
  266. package/dist/bits/utilities/presence-layer/presence-layer.svelte +2 -2
  267. package/dist/bits/utilities/presence-layer/types.d.ts +2 -1
  268. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +1 -1
  269. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +19 -36
  270. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -0
  271. package/dist/bits/utilities/text-selection-layer/types.d.ts +2 -0
  272. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +5 -1
  273. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +8 -14
  274. package/dist/index.d.ts +1 -1
  275. package/dist/index.js +1 -1
  276. package/dist/internal/box-auto-reset.svelte.d.ts +7 -1
  277. package/dist/internal/box-auto-reset.svelte.js +11 -6
  278. package/dist/internal/create-id.d.ts +8 -0
  279. package/dist/internal/create-id.js +5 -0
  280. package/dist/internal/date-time/announcer.d.ts +1 -1
  281. package/dist/internal/date-time/announcer.js +20 -20
  282. package/dist/internal/date-time/calendar-helpers.svelte.js +7 -5
  283. package/dist/internal/date-time/field/helpers.d.ts +9 -2
  284. package/dist/internal/date-time/field/helpers.js +16 -9
  285. package/dist/internal/date-time/field/parts.d.ts +3 -1
  286. package/dist/internal/date-time/field/parts.js +10 -2
  287. package/dist/internal/date-time/field/segments.d.ts +9 -0
  288. package/dist/internal/date-time/field/segments.js +65 -0
  289. package/dist/internal/date-time/field/time-helpers.d.ts +83 -0
  290. package/dist/internal/date-time/field/time-helpers.js +301 -0
  291. package/dist/internal/date-time/field/types.d.ts +2 -2
  292. package/dist/internal/date-time/formatter.d.ts +11 -1
  293. package/dist/internal/date-time/formatter.js +56 -0
  294. package/dist/internal/date-time/utils.d.ts +7 -2
  295. package/dist/internal/date-time/utils.js +15 -1
  296. package/dist/internal/dom.d.ts +0 -1
  297. package/dist/internal/dom.js +0 -3
  298. package/dist/internal/focus.d.ts +2 -2
  299. package/dist/internal/focus.js +14 -9
  300. package/dist/internal/math.d.ts +0 -4
  301. package/dist/internal/math.js +0 -28
  302. package/dist/internal/tabbable.d.ts +0 -2
  303. package/dist/internal/tabbable.js +10 -14
  304. package/dist/internal/use-data-typeahead.svelte.d.ts +1 -0
  305. package/dist/internal/use-data-typeahead.svelte.js +4 -1
  306. package/dist/internal/use-dom-typeahead.svelte.d.ts +3 -1
  307. package/dist/internal/use-dom-typeahead.svelte.js +5 -2
  308. package/dist/internal/use-grace-area.svelte.js +9 -5
  309. package/dist/internal/use-roving-focus.svelte.d.ts +3 -3
  310. package/dist/internal/use-roving-focus.svelte.js +10 -11
  311. package/dist/shared/date/types.d.ts +27 -4
  312. package/dist/shared/index.d.ts +2 -2
  313. package/dist/types.d.ts +2 -0
  314. package/package.json +18 -16
  315. package/dist/bits/date-field/components/date-field-error.svelte +0 -0
  316. package/dist/internal/use-size.svelte.d.ts +0 -7
  317. package/dist/internal/use-size.svelte.js +0 -54
@@ -2,16 +2,18 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { TooltipContentStaticProps } from "../types.js";
4
4
  import { useTooltipContent } from "../tooltip.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
6
  import PopperLayer from "../../utilities/popper-layer/popper-layer.svelte";
7
7
  import { getFloatingContentCSSVars } from "../../../internal/floating-svelte/floating-utils.svelte.js";
8
8
  import PopperLayerForceMount from "../../utilities/popper-layer/popper-layer-force-mount.svelte";
9
9
  import { noop } from "../../../internal/noop.js";
10
10
 
11
+ const uid = $props.id();
12
+
11
13
  let {
12
14
  children,
13
15
  child,
14
- id = useId(),
16
+ id = createId(uid),
15
17
  ref = $bindable(null),
16
18
  onInteractOutside = noop,
17
19
  onEscapeKeydown = noop,
@@ -43,6 +45,7 @@
43
45
  loop={false}
44
46
  preventScroll={false}
45
47
  forceMount={true}
48
+ ref={contentState.opts.ref}
46
49
  >
47
50
  {#snippet popper({ props })}
48
51
  {@const mergedProps = mergeProps(props, {
@@ -68,6 +71,7 @@
68
71
  loop={false}
69
72
  preventScroll={false}
70
73
  forceMount={false}
74
+ ref={contentState.opts.ref}
71
75
  >
72
76
  {#snippet popper({ props })}
73
77
  {@const mergedProps = mergeProps(props, {
@@ -2,16 +2,18 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { TooltipContentProps } from "../types.js";
4
4
  import { useTooltipContent } from "../tooltip.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
6
  import PopperLayer from "../../utilities/popper-layer/popper-layer.svelte";
7
7
  import { getFloatingContentCSSVars } from "../../../internal/floating-svelte/floating-utils.svelte.js";
8
8
  import PopperLayerForceMount from "../../utilities/popper-layer/popper-layer-force-mount.svelte";
9
9
  import { noop } from "../../../internal/noop.js";
10
10
 
11
+ const uid = $props.id();
12
+
11
13
  let {
12
14
  children,
13
15
  child,
14
- id = useId(),
16
+ id = createId(uid),
15
17
  ref = $bindable(null),
16
18
  side = "top",
17
19
  sideOffset = 0,
@@ -61,6 +63,7 @@
61
63
  loop={false}
62
64
  preventScroll={false}
63
65
  forceMount={true}
66
+ ref={contentState.opts.ref}
64
67
  >
65
68
  {#snippet popper({ props, wrapperProps })}
66
69
  {@const mergedProps = mergeProps(props, {
@@ -87,6 +90,7 @@
87
90
  loop={false}
88
91
  preventScroll={false}
89
92
  forceMount={false}
93
+ ref={contentState.opts.ref}
90
94
  >
91
95
  {#snippet popper({ props, wrapperProps })}
92
96
  {@const mergedProps = mergeProps(props, {
@@ -2,13 +2,15 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { TooltipTriggerProps } from "../types.js";
4
4
  import { useTooltipTrigger } from "../tooltip.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
6
  import FloatingLayerAnchor from "../../utilities/floating-layer/components/floating-layer-anchor.svelte";
7
7
 
8
+ const uid = $props.id();
9
+
8
10
  let {
9
11
  children,
10
12
  child,
11
- id = useId(),
13
+ id = createId(uid),
12
14
  disabled = false,
13
15
  type = "button",
14
16
  ref = $bindable(null),
@@ -27,7 +29,7 @@
27
29
  const mergedProps = $derived(mergeProps(restProps, triggerState.props, { type }));
28
30
  </script>
29
31
 
30
- <FloatingLayerAnchor {id}>
32
+ <FloatingLayerAnchor {id} ref={triggerState.opts.ref}>
31
33
  {#if child}
32
34
  {@render child({ props: mergedProps })}
33
35
  {:else}
@@ -1,3 +1,4 @@
1
+ import { DOMContext } from "svelte-toolbelt";
1
2
  import type { ReadableBoxedValues, WritableBoxedValues } from "../../internal/box.svelte.js";
2
3
  import type { WithRefProps } from "../../internal/types.js";
3
4
  import type { PointerEventHandler } from "svelte/elements";
@@ -53,6 +54,7 @@ declare class TooltipTriggerState {
53
54
  #private;
54
55
  readonly opts: TooltipTriggerStateProps;
55
56
  readonly root: TooltipRootState;
57
+ domContext: DOMContext;
56
58
  constructor(opts: TooltipTriggerStateProps, root: TooltipRootState);
57
59
  handlePointerUp: () => void;
58
60
  props: {
@@ -1,4 +1,4 @@
1
- import { box, onMountEffect, useRefById } from "svelte-toolbelt";
1
+ import { box, onMountEffect, attachRef, DOMContext } from "svelte-toolbelt";
2
2
  import { on } from "svelte/events";
3
3
  import { Context, watch } from "runed";
4
4
  import { useTimeoutFn } from "../../internal/use-timeout-fn.svelte.js";
@@ -135,15 +135,11 @@ class TooltipTriggerState {
135
135
  #isPointerDown = box(false);
136
136
  #hasPointerMoveOpened = $state(false);
137
137
  #isDisabled = $derived.by(() => this.opts.disabled.current || this.root.disabled);
138
+ domContext;
138
139
  constructor(opts, root) {
139
140
  this.opts = opts;
140
141
  this.root = root;
141
- useRefById({
142
- ...opts,
143
- onRefChange: (node) => {
144
- this.root.triggerNode = node;
145
- },
146
- });
142
+ this.domContext = new DOMContext(opts.ref);
147
143
  }
148
144
  handlePointerUp = () => {
149
145
  this.#isPointerDown.current = false;
@@ -157,7 +153,7 @@ class TooltipTriggerState {
157
153
  if (this.#isDisabled)
158
154
  return;
159
155
  this.#isPointerDown.current = true;
160
- document.addEventListener("pointerup", () => {
156
+ this.domContext.getDocument().addEventListener("pointerup", () => {
161
157
  this.handlePointerUp();
162
158
  }, { once: true });
163
159
  };
@@ -212,6 +208,7 @@ class TooltipTriggerState {
212
208
  onfocus: this.#onfocus,
213
209
  onblur: this.#onblur,
214
210
  onclick: this.#onclick,
211
+ ...attachRef(this.opts.ref, (v) => (this.root.triggerNode = v)),
215
212
  }));
216
213
  }
217
214
  class TooltipContentState {
@@ -220,13 +217,6 @@ class TooltipContentState {
220
217
  constructor(opts, root) {
221
218
  this.opts = opts;
222
219
  this.root = root;
223
- useRefById({
224
- ...opts,
225
- onRefChange: (node) => {
226
- this.root.contentNode = node;
227
- },
228
- deps: () => this.root.opts.open.current,
229
- });
230
220
  useGraceArea({
231
221
  triggerNode: () => this.root.triggerNode,
232
222
  contentNode: () => this.root.contentNode,
@@ -284,6 +274,7 @@ class TooltipContentState {
284
274
  outline: "none",
285
275
  },
286
276
  [TOOLTIP_CONTENT_ATTR]: "",
277
+ ...attachRef(this.opts.ref, (v) => (this.root.contentNode = v)),
287
278
  }));
288
279
  popperProps = {
289
280
  onInteractOutside: this.onInteractOutside,
@@ -12,6 +12,7 @@
12
12
  children,
13
13
  enabled,
14
14
  isValidEvent = () => false,
15
+ ref,
15
16
  }: DismissibleLayerImplProps = $props();
16
17
 
17
18
  const dismissibleLayerState = useDismissibleLayer({
@@ -21,6 +22,7 @@
21
22
  enabled: box.with(() => enabled),
22
23
  onFocusOutside: box.with(() => onFocusOutside),
23
24
  isValidEvent: box.with(() => isValidEvent),
25
+ ref,
24
26
  });
25
27
  </script>
26
28
 
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from "svelte";
2
+ import type { WritableBox } from "svelte-toolbelt";
2
3
  export type InteractOutsideEvent = PointerEvent;
3
4
  export type InteractOutsideEventHandler = (e: PointerEvent) => void;
4
5
  export type InteractOutsideBehaviorType = "close" | "defer-otherwise-close" | "defer-otherwise-ignore" | "ignore";
@@ -44,4 +45,5 @@ export type DismissibleLayerImplProps = {
44
45
  children?: Snippet<[{
45
46
  props: Record<string, unknown>;
46
47
  }]>;
48
+ ref: WritableBox<HTMLElement | null>;
47
49
  } & DismissibleLayerProps;
@@ -1,12 +1,12 @@
1
1
  import { type WritableBox } from "svelte-toolbelt";
2
2
  import type { DismissibleLayerImplProps } from "./types.js";
3
3
  import type { ReadableBoxedValues } from "../../../internal/box.svelte.js";
4
- type DismissibleLayerStateProps = ReadableBoxedValues<Required<Omit<DismissibleLayerImplProps, "children">>>;
4
+ type DismissibleLayerStateProps = ReadableBoxedValues<Required<Omit<DismissibleLayerImplProps, "children" | "ref">>> & {
5
+ ref: WritableBox<HTMLElement | null>;
6
+ };
5
7
  export declare class DismissibleLayerState {
6
8
  #private;
7
9
  readonly opts: DismissibleLayerStateProps;
8
- node: WritableBox<HTMLElement | null>;
9
- currNode: HTMLElement | null;
10
10
  constructor(opts: DismissibleLayerStateProps);
11
11
  props: {
12
12
  onfocuscapture: () => void;
@@ -1,4 +1,4 @@
1
- import { afterSleep, afterTick, box, executeCallbacks, onDestroyEffect, useRefById, } from "svelte-toolbelt";
1
+ import { afterSleep, afterTick, executeCallbacks, onDestroyEffect, } from "svelte-toolbelt";
2
2
  import { watch } from "runed";
3
3
  import { on } from "svelte/events";
4
4
  import { addEventListener } from "../../../internal/events.js";
@@ -17,26 +17,16 @@ export class DismissibleLayerState {
17
17
  };
18
18
  #isResponsibleLayer = false;
19
19
  #isFocusInsideDOMTree = false;
20
- node = box(null);
21
20
  #documentObj = undefined;
22
21
  #onFocusOutside;
23
- currNode = $state(null);
24
22
  #unsubClickListener = noop;
25
23
  constructor(opts) {
26
24
  this.opts = opts;
27
- useRefById({
28
- id: opts.id,
29
- ref: this.node,
30
- deps: () => opts.enabled.current,
31
- onRefChange: (node) => {
32
- this.currNode = node;
33
- },
34
- });
35
25
  this.#behaviorType = opts.interactOutsideBehavior;
36
26
  this.#interactOutsideProp = opts.onInteractOutside;
37
27
  this.#onFocusOutside = opts.onFocusOutside;
38
28
  $effect(() => {
39
- this.#documentObj = getOwnerDocument(this.currNode);
29
+ this.#documentObj = getOwnerDocument(this.opts.ref.current);
40
30
  });
41
31
  let unsubEvents = noop;
42
32
  const cleanup = () => {
@@ -45,11 +35,11 @@ export class DismissibleLayerState {
45
35
  this.#handleInteractOutside.destroy();
46
36
  unsubEvents();
47
37
  };
48
- watch([() => this.opts.enabled.current, () => this.currNode], ([enabled, currNode]) => {
49
- if (!enabled || !currNode)
38
+ watch([() => this.opts.enabled.current, () => this.opts.ref.current], () => {
39
+ if (!this.opts.enabled.current || !this.opts.ref.current)
50
40
  return;
51
41
  afterSleep(1, () => {
52
- if (!this.currNode)
42
+ if (!this.opts.ref.current)
53
43
  return;
54
44
  globalThis.bitsDismissableLayers.set(this, this.#behaviorType);
55
45
  unsubEvents();
@@ -68,10 +58,10 @@ export class DismissibleLayerState {
68
58
  #handleFocus = (event) => {
69
59
  if (event.defaultPrevented)
70
60
  return;
71
- if (!this.currNode)
61
+ if (!this.opts.ref.current)
72
62
  return;
73
63
  afterTick(() => {
74
- if (!this.currNode || this.#isTargetWithinLayer(event.target))
64
+ if (!this.opts.ref.current || this.#isTargetWithinLayer(event.target))
75
65
  return;
76
66
  if (event.target && !this.#isFocusInsideDOMTree) {
77
67
  this.#onFocusOutside.current?.(event);
@@ -107,11 +97,12 @@ export class DismissibleLayerState {
107
97
  this.#interactOutsideProp.current(e);
108
98
  };
109
99
  #handleInteractOutside = debounce((e) => {
110
- if (!this.currNode) {
100
+ if (!this.opts.ref.current) {
111
101
  this.#unsubClickListener();
112
102
  return;
113
103
  }
114
- const isEventValid = this.opts.isValidEvent.current(e, this.currNode) || isValidEvent(e, this.currNode);
104
+ const isEventValid = this.opts.isValidEvent.current(e, this.opts.ref.current) ||
105
+ isValidEvent(e, this.opts.ref.current);
115
106
  if (!this.#isResponsibleLayer || this.#isAnyEventIntercepted() || !isEventValid) {
116
107
  this.#unsubClickListener();
117
108
  return;
@@ -141,14 +132,14 @@ export class DismissibleLayerState {
141
132
  this.#interceptedEvents[e.type] = false;
142
133
  };
143
134
  #markResponsibleLayer = () => {
144
- if (!this.node.current)
135
+ if (!this.opts.ref.current)
145
136
  return;
146
- this.#isResponsibleLayer = isResponsibleLayer(this.node.current);
137
+ this.#isResponsibleLayer = isResponsibleLayer(this.opts.ref.current);
147
138
  };
148
139
  #isTargetWithinLayer = (target) => {
149
- if (!this.node.current)
140
+ if (!this.opts.ref.current)
150
141
  return false;
151
- return isOrContainsTarget(this.node.current, target);
142
+ return isOrContainsTarget(this.opts.ref.current, target);
152
143
  };
153
144
  #resetState = debounce(() => {
154
145
  for (const eventType in this.#interceptedEvents) {
@@ -187,9 +178,9 @@ function isResponsibleLayer(node) {
187
178
  */
188
179
  const topMostLayer = getTopMostLayer(layersArr);
189
180
  if (topMostLayer)
190
- return topMostLayer[0].node.current === node;
181
+ return topMostLayer[0].opts.ref.current === node;
191
182
  const [firstLayerNode] = layersArr[0];
192
- return firstLayerNode.node.current === node;
183
+ return firstLayerNode.opts.ref.current === node;
193
184
  }
194
185
  function isValidEvent(e, node) {
195
186
  if ("button" in e && e.button > 0)
@@ -4,11 +4,12 @@
4
4
  import type { AnchorProps } from "./index.js";
5
5
  import type { Measurable } from "../../../../internal/floating-svelte/types.js";
6
6
 
7
- let { id, children, virtualEl }: AnchorProps = $props();
7
+ let { id, children, virtualEl, ref }: AnchorProps = $props();
8
8
 
9
9
  useFloatingAnchorState({
10
10
  id: box.with(() => id),
11
11
  virtualEl: box.with(() => virtualEl as unknown as Measurable | null),
12
+ ref,
12
13
  });
13
14
  </script>
14
15
 
@@ -112,4 +112,5 @@ export type FloatingLayerAnchorProps = {
112
112
  id: string;
113
113
  children?: Snippet;
114
114
  virtualEl?: ReadableBox<Measurable | null>;
115
+ ref: ReadableBox<HTMLElement | null>;
115
116
  };
@@ -1,4 +1,5 @@
1
1
  import { type Middleware, type Placement } from "@floating-ui/dom";
2
+ import { type ReadableBox } from "svelte-toolbelt";
2
3
  import type { Arrayable, WithRefProps } from "../../../internal/types.js";
3
4
  import type { Box, ReadableBoxedValues } from "../../../internal/box.svelte.js";
4
5
  import type { Measurable, UseFloatingReturn } from "../../../internal/floating-svelte/types.js";
@@ -11,7 +12,7 @@ export type Boundary = Element | null;
11
12
  declare class FloatingRootState {
12
13
  anchorNode: import("svelte-toolbelt").WritableBox<HTMLElement | Measurable | null>;
13
14
  customAnchorNode: import("svelte-toolbelt").WritableBox<string | HTMLElement | Measurable | null>;
14
- triggerNode: import("svelte-toolbelt").WritableBox<HTMLElement | Measurable | null>;
15
+ triggerNode: ReadableBox<Measurable | HTMLElement | null>;
15
16
  constructor();
16
17
  }
17
18
  export type FloatingContentStateProps = ReadableBoxedValues<{
@@ -934,11 +935,11 @@ declare class FloatingArrowState {
934
935
  type FloatingAnchorStateProps = ReadableBoxedValues<{
935
936
  id: string;
936
937
  virtualEl?: Measurable | null;
938
+ ref: Measurable | HTMLElement | null;
937
939
  }>;
938
940
  declare class FloatingAnchorState {
939
941
  readonly opts: FloatingAnchorStateProps;
940
942
  readonly root: FloatingRootState;
941
- ref: import("svelte-toolbelt").WritableBox<HTMLElement | null>;
942
943
  constructor(opts: FloatingAnchorStateProps, root: FloatingRootState);
943
944
  }
944
945
  export declare function useFloatingRootState(): FloatingRootState;
@@ -1,5 +1,5 @@
1
1
  import { arrow, autoUpdate, flip, hide, limitShift, offset, shift, size, } from "@floating-ui/dom";
2
- import { box, cssToStyleObj, styleToString, useRefById } from "svelte-toolbelt";
2
+ import { attachRef, box, cssToStyleObj, getWindow, styleToString, } from "svelte-toolbelt";
3
3
  import { Context, ElementSize, watch } from "runed";
4
4
  import { isNotNull } from "../../../internal/is.js";
5
5
  import { useId } from "../../../internal/use-id.js";
@@ -133,6 +133,7 @@ class FloatingContentState {
133
133
  },
134
134
  // Floating UI calculates logical alignment based the `dir` attribute
135
135
  dir: this.opts.dir.current,
136
+ ...attachRef(this.wrapperRef),
136
137
  }));
137
138
  props = $derived.by(() => ({
138
139
  "data-side": this.placedSide,
@@ -143,6 +144,7 @@ class FloatingContentState {
143
144
  // we prevent animations so that users's animation don't kick in too early referring wrong sides
144
145
  // animation: !this.floating.isPositioned ? "none" : undefined,
145
146
  }),
147
+ ...attachRef(this.contentRef),
146
148
  }));
147
149
  arrowStyle = $derived({
148
150
  position: "absolute",
@@ -172,16 +174,6 @@ class FloatingContentState {
172
174
  watch(() => opts.customAnchor.current, (customAnchor) => {
173
175
  this.root.customAnchorNode.current = customAnchor;
174
176
  });
175
- useRefById({
176
- id: this.opts.wrapperId,
177
- ref: this.wrapperRef,
178
- deps: () => this.opts.enabled.current,
179
- });
180
- useRefById({
181
- id: this.opts.id,
182
- ref: this.contentRef,
183
- deps: () => this.opts.enabled.current,
184
- });
185
177
  this.floating = useFloating({
186
178
  strategy: () => this.opts.strategy.current,
187
179
  placement: () => this.#desiredPlacement,
@@ -203,7 +195,8 @@ class FloatingContentState {
203
195
  watch(() => this.contentRef.current, (contentNode) => {
204
196
  if (!contentNode)
205
197
  return;
206
- this.contentZIndex = window.getComputedStyle(contentNode).zIndex;
198
+ const win = getWindow(contentNode);
199
+ this.contentZIndex = win.getComputedStyle(contentNode).zIndex;
207
200
  });
208
201
  $effect(() => {
209
202
  this.floating.floating.current = this.wrapperRef.current;
@@ -216,24 +209,17 @@ class FloatingArrowState {
216
209
  constructor(opts, content) {
217
210
  this.opts = opts;
218
211
  this.content = content;
219
- useRefById({
220
- ...opts,
221
- onRefChange: (node) => {
222
- this.content.arrowRef.current = node;
223
- },
224
- deps: () => this.content.opts.enabled.current,
225
- });
226
212
  }
227
213
  props = $derived.by(() => ({
228
214
  id: this.opts.id.current,
229
215
  style: this.content.arrowStyle,
230
216
  "data-side": this.content.placedSide,
217
+ ...attachRef(this.content.arrowRef),
231
218
  }));
232
219
  }
233
220
  class FloatingAnchorState {
234
221
  opts;
235
222
  root;
236
- ref = box(null);
237
223
  constructor(opts, root) {
238
224
  this.opts = opts;
239
225
  this.root = root;
@@ -241,13 +227,7 @@ class FloatingAnchorState {
241
227
  root.triggerNode = box.from(opts.virtualEl.current);
242
228
  }
243
229
  else {
244
- useRefById({
245
- id: opts.id,
246
- ref: this.ref,
247
- onRefChange: (node) => {
248
- root.triggerNode.current = node;
249
- },
250
- });
230
+ root.triggerNode = opts.ref;
251
231
  }
252
232
  }
253
233
  }
@@ -12,6 +12,7 @@
12
12
  onOpenAutoFocus = noop,
13
13
  focusScope,
14
14
  forceMount = false,
15
+ ref,
15
16
  }: FocusScopeImplProps = $props();
16
17
 
17
18
  const focusScopeState = useFocusScope({
@@ -21,6 +22,7 @@
21
22
  onOpenAutoFocus: box.with(() => onOpenAutoFocus),
22
23
  id: box.with(() => id),
23
24
  forceMount: box.with(() => forceMount),
25
+ ref,
24
26
  });
25
27
  </script>
26
28
 
@@ -1,6 +1,7 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { FocusScopeContainerProps } from "./use-focus-scope.svelte.js";
3
3
  import type { EventCallback } from "../../../internal/events.js";
4
+ import type { ReadableBox } from "svelte-toolbelt";
4
5
  export type FocusScopeProps = {
5
6
  /**
6
7
  * Event handler called when auto-focusing on open.
@@ -38,4 +39,5 @@ export type FocusScopeImplProps = {
38
39
  * Whether the content within the focus trap is being force mounted or not.
39
40
  */
40
41
  forceMount?: boolean;
42
+ ref: ReadableBox<HTMLElement | null>;
41
43
  } & FocusScopeProps;
@@ -36,13 +36,14 @@ type UseFocusScopeProps = ReadableBoxedValues<{
36
36
  * Whether force mount is enabled or not
37
37
  */
38
38
  forceMount: boolean;
39
+ ref: HTMLElement | null;
39
40
  }>;
40
41
  export type FocusScopeContainerProps = {
41
42
  id: string;
42
43
  tabindex: number;
43
44
  onkeydown: EventCallback<KeyboardEvent>;
44
45
  };
45
- export declare function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, }: UseFocusScopeProps): {
46
+ export declare function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, ref, }: UseFocusScopeProps): {
46
47
  readonly props: FocusScopeContainerProps;
47
48
  };
48
49
  export {};
@@ -1,4 +1,4 @@
1
- import { afterSleep, afterTick, box, executeCallbacks, useRefById } from "svelte-toolbelt";
1
+ import { afterSleep, afterTick, DOMContext, executeCallbacks } from "svelte-toolbelt";
2
2
  import { Context, watch } from "runed";
3
3
  import { on } from "svelte/events";
4
4
  import { createFocusScopeAPI, createFocusScopeStack, removeLinks, } from "./focus-scope-stack.svelte.js";
@@ -16,17 +16,12 @@ const AutoFocusOnDestroyEvent = new CustomEventDispatcher("focusScope.autoFocusO
16
16
  cancelable: true,
17
17
  });
18
18
  export const FocusScopeContext = new Context("FocusScope");
19
- export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, }) {
19
+ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoFocus, forceMount, ref, }) {
20
20
  const focusScopeStack = createFocusScopeStack();
21
21
  const focusScope = createFocusScopeAPI();
22
- const ref = box(null);
23
22
  const ctx = FocusScopeContext.getOr({ ignoreCloseAutoFocus: false });
24
23
  let lastFocusedElement = null;
25
- useRefById({
26
- id,
27
- ref,
28
- deps: () => enabled.current,
29
- });
24
+ const domContext = new DOMContext(ref);
30
25
  function manageFocus(event) {
31
26
  if (focusScope.paused || !ref.current || focusScope.isHandlingFocus)
32
27
  return;
@@ -95,14 +90,16 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
95
90
  * If the element was removed and focus is now outside the container,
96
91
  * (e.g., browser moved it to body), refocus the container.
97
92
  */
98
- if (elementWasRemoved && ref.current && !ref.current.contains(document.activeElement)) {
93
+ if (elementWasRemoved &&
94
+ ref.current &&
95
+ !ref.current.contains(domContext.getActiveElement())) {
99
96
  focus(ref.current);
100
97
  }
101
98
  }
102
99
  watch([() => ref.current, () => enabled.current], ([container, enabled]) => {
103
100
  if (!container || !enabled)
104
101
  return;
105
- const removeEvents = executeCallbacks(on(document, "focusin", manageFocus), on(document, "focusout", manageFocus));
102
+ const removeEvents = executeCallbacks(on(domContext.getDocument(), "focusin", manageFocus), on(domContext.getDocument(), "focusout", manageFocus));
106
103
  const mutationObserver = new MutationObserver(handleMutations);
107
104
  mutationObserver.observe(container, {
108
105
  childList: true,
@@ -117,7 +114,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
117
114
  watch([() => forceMount.current, () => ref.current], ([forceMount, container]) => {
118
115
  if (forceMount)
119
116
  return;
120
- const prevFocusedElement = document.activeElement;
117
+ const prevFocusedElement = domContext.getActiveElement();
121
118
  handleOpen(container, prevFocusedElement);
122
119
  return () => {
123
120
  if (!container)
@@ -128,7 +125,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
128
125
  watch([() => forceMount.current, () => ref.current, () => enabled.current], ([forceMount, container]) => {
129
126
  if (!forceMount)
130
127
  return;
131
- const prevFocusedElement = document.activeElement;
128
+ const prevFocusedElement = domContext.getActiveElement();
132
129
  handleOpen(container, prevFocusedElement);
133
130
  return () => {
134
131
  if (!container)
@@ -138,7 +135,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
138
135
  });
139
136
  function handleOpen(container, prevFocusedElement) {
140
137
  if (!container)
141
- container = document.getElementById(id.current);
138
+ container = domContext.getElementById(id.current);
142
139
  if (!container || !enabled.current)
143
140
  return;
144
141
  focusScopeStack.add(focusScope);
@@ -152,7 +149,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
152
149
  return;
153
150
  const result = focusFirst(removeLinks(getTabbableCandidates(container)), {
154
151
  select: true,
155
- });
152
+ }, () => domContext.getActiveElement());
156
153
  if (!result)
157
154
  focus(container);
158
155
  });
@@ -165,7 +162,9 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
165
162
  const shouldIgnore = ctx.ignoreCloseAutoFocus;
166
163
  afterSleep(0, () => {
167
164
  if (!destroyEvent.defaultPrevented && prevFocusedElement && !shouldIgnore) {
168
- focus(isTabbable(prevFocusedElement) ? prevFocusedElement : document.body, {
165
+ focus(isTabbable(prevFocusedElement)
166
+ ? prevFocusedElement
167
+ : domContext.getDocument().body, {
169
168
  select: true,
170
169
  });
171
170
  }
@@ -180,7 +179,7 @@ export function useFocusScope({ id, loop, enabled, onOpenAutoFocus, onCloseAutoF
180
179
  if (focusScope.paused)
181
180
  return;
182
181
  const isTabKey = e.key === kbd.TAB && !e.ctrlKey && !e.altKey && !e.metaKey;
183
- const focusedElement = document.activeElement;
182
+ const focusedElement = domContext.getActiveElement();
184
183
  if (!(isTabKey && focusedElement))
185
184
  return;
186
185
  const container = ref.current;
@@ -44,6 +44,7 @@
44
44
  customAnchor = null,
45
45
  isStatic = false,
46
46
  enabled,
47
+ ref,
47
48
  ...restProps
48
49
  }: Omit<PopperLayerImplProps, "present" | "children"> & {
49
50
  enabled: boolean;
@@ -85,6 +86,7 @@
85
86
  {loop}
86
87
  trapFocus={enabled && trapFocus}
87
88
  forceMount={restProps.forceMount}
89
+ {ref}
88
90
  >
89
91
  {#snippet focusScope({ props: focusScopeProps })}
90
92
  <EscapeLayer {onEscapeKeydown} {escapeKeydownBehavior} {enabled}>
@@ -95,6 +97,7 @@
95
97
  {interactOutsideBehavior}
96
98
  {isValidEvent}
97
99
  {enabled}
100
+ {ref}
98
101
  >
99
102
  {#snippet children({ props: dismissibleProps })}
100
103
  <TextSelectionLayer
@@ -103,6 +106,7 @@
103
106
  {onPointerDown}
104
107
  {onPointerUp}
105
108
  {enabled}
109
+ {ref}
106
110
  >
107
111
  {@render popper?.({
108
112
  props: mergeProps(
@@ -39,11 +39,12 @@
39
39
  isValidEvent = () => false,
40
40
  customAnchor = null,
41
41
  isStatic = false,
42
+ ref,
42
43
  ...restProps
43
44
  }: PopperLayerImplProps = $props();
44
45
  </script>
45
46
 
46
- <PresenceLayer {id} {present} {...restProps}>
47
+ <PresenceLayer {present} {ref}>
47
48
  {#snippet presence()}
48
49
  <PopperLayerInner
49
50
  {popper}
@@ -82,6 +83,7 @@
82
83
  {isValidEvent}
83
84
  {onFocusOutside}
84
85
  forceMount={false}
86
+ {ref}
85
87
  {...restProps}
86
88
  />
87
89
  {/snippet}