bits-ui 1.7.0 → 2.1.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 (289) 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.js +4 -4
  14. package/dist/bits/avatar/components/avatar-fallback.svelte +4 -2
  15. package/dist/bits/avatar/components/avatar-image.svelte +4 -2
  16. package/dist/bits/avatar/components/avatar.svelte +4 -2
  17. package/dist/bits/button/components/button.svelte +1 -1
  18. package/dist/bits/calendar/calendar.svelte.d.ts +1 -9
  19. package/dist/bits/calendar/calendar.svelte.js +47 -38
  20. package/dist/bits/calendar/components/calendar-cell.svelte +4 -2
  21. package/dist/bits/calendar/components/calendar-day.svelte +4 -2
  22. package/dist/bits/calendar/components/calendar-grid-body.svelte +4 -2
  23. package/dist/bits/calendar/components/calendar-grid-head.svelte +4 -2
  24. package/dist/bits/calendar/components/calendar-grid-row.svelte +4 -2
  25. package/dist/bits/calendar/components/calendar-grid.svelte +4 -2
  26. package/dist/bits/calendar/components/calendar-head-cell.svelte +4 -2
  27. package/dist/bits/calendar/components/calendar-header.svelte +4 -2
  28. package/dist/bits/calendar/components/calendar-heading.svelte +4 -2
  29. package/dist/bits/calendar/components/calendar-next-button.svelte +4 -2
  30. package/dist/bits/calendar/components/calendar-prev-button.svelte +4 -2
  31. package/dist/bits/checkbox/checkbox.svelte.js +4 -14
  32. package/dist/bits/checkbox/components/checkbox-group-label.svelte +4 -2
  33. package/dist/bits/checkbox/components/checkbox-group.svelte +4 -2
  34. package/dist/bits/checkbox/components/checkbox.svelte +4 -2
  35. package/dist/bits/collapsible/collapsible.svelte.js +4 -10
  36. package/dist/bits/collapsible/components/collapsible-content.svelte +5 -3
  37. package/dist/bits/collapsible/components/collapsible-trigger.svelte +4 -2
  38. package/dist/bits/collapsible/components/collapsible.svelte +4 -2
  39. package/dist/bits/combobox/components/combobox-input.svelte +1 -1
  40. package/dist/bits/combobox/components/combobox.svelte +1 -1
  41. package/dist/bits/command/command.svelte.js +13 -45
  42. package/dist/bits/command/components/_command-label.svelte +6 -7
  43. package/dist/bits/command/components/_command-label.svelte.d.ts +1 -1
  44. package/dist/bits/command/components/command-empty.svelte +4 -2
  45. package/dist/bits/command/components/command-group-heading.svelte +4 -2
  46. package/dist/bits/command/components/command-group-items.svelte +4 -2
  47. package/dist/bits/command/components/command-group.svelte +4 -2
  48. package/dist/bits/command/components/command-input.svelte +4 -2
  49. package/dist/bits/command/components/command-item.svelte +4 -2
  50. package/dist/bits/command/components/command-link-item.svelte +4 -2
  51. package/dist/bits/command/components/command-list.svelte +4 -2
  52. package/dist/bits/command/components/command-loading.svelte +4 -2
  53. package/dist/bits/command/components/command-separator.svelte +4 -2
  54. package/dist/bits/command/components/command-viewport.svelte +4 -2
  55. package/dist/bits/command/components/command.svelte +4 -2
  56. package/dist/bits/context-menu/components/context-menu-content-static.svelte +2 -3
  57. package/dist/bits/context-menu/components/context-menu-content.svelte +2 -3
  58. package/dist/bits/context-menu/components/context-menu-trigger.svelte +1 -1
  59. package/dist/bits/date-field/components/date-field-input.svelte +4 -2
  60. package/dist/bits/date-field/components/date-field-label.svelte +4 -2
  61. package/dist/bits/date-field/components/date-field-segment.svelte +4 -2
  62. package/dist/bits/date-field/date-field.svelte.d.ts +4 -4
  63. package/dist/bits/date-field/date-field.svelte.js +15 -33
  64. package/dist/bits/date-picker/components/date-picker-calendar.svelte +4 -2
  65. package/dist/bits/date-range-field/components/date-range-field-input.svelte +4 -2
  66. package/dist/bits/date-range-field/components/date-range-field-label.svelte +4 -2
  67. package/dist/bits/date-range-field/components/date-range-field.svelte +4 -2
  68. package/dist/bits/date-range-field/date-range-field.svelte.js +3 -13
  69. package/dist/bits/date-range-picker/components/date-range-picker-calendar.svelte +4 -2
  70. package/dist/bits/dialog/components/dialog-close.svelte +4 -2
  71. package/dist/bits/dialog/components/dialog-content.svelte +8 -2
  72. package/dist/bits/dialog/components/dialog-description.svelte +4 -2
  73. package/dist/bits/dialog/components/dialog-overlay.svelte +8 -3
  74. package/dist/bits/dialog/components/dialog-title.svelte +4 -2
  75. package/dist/bits/dialog/components/dialog-trigger.svelte +4 -2
  76. package/dist/bits/dialog/dialog.svelte.d.ts +1 -1
  77. package/dist/bits/dialog/dialog.svelte.js +19 -47
  78. package/dist/bits/dropdown-menu/components/dropdown-menu-content-static.svelte +6 -5
  79. package/dist/bits/dropdown-menu/components/dropdown-menu-content.svelte +6 -5
  80. package/dist/bits/index.d.ts +2 -0
  81. package/dist/bits/index.js +2 -0
  82. package/dist/bits/label/components/label.svelte +4 -2
  83. package/dist/bits/label/label.svelte.js +2 -2
  84. package/dist/bits/link-preview/components/link-preview-content-static.svelte +6 -2
  85. package/dist/bits/link-preview/components/link-preview-content.svelte +6 -2
  86. package/dist/bits/link-preview/components/link-preview-trigger.svelte +5 -3
  87. package/dist/bits/link-preview/link-preview.svelte.js +3 -14
  88. package/dist/bits/menu/components/menu-checkbox-group.svelte +4 -2
  89. package/dist/bits/menu/components/menu-checkbox-item.svelte +6 -4
  90. package/dist/bits/menu/components/menu-content-static.svelte +6 -5
  91. package/dist/bits/menu/components/menu-content.svelte +6 -5
  92. package/dist/bits/menu/components/menu-group-heading.svelte +4 -2
  93. package/dist/bits/menu/components/menu-group.svelte +4 -2
  94. package/dist/bits/menu/components/menu-item.svelte +4 -2
  95. package/dist/bits/menu/components/menu-radio-group.svelte +4 -2
  96. package/dist/bits/menu/components/menu-radio-item.svelte +4 -2
  97. package/dist/bits/menu/components/menu-separator.svelte +4 -2
  98. package/dist/bits/menu/components/menu-sub-content-static.svelte +6 -5
  99. package/dist/bits/menu/components/menu-sub-content.svelte +6 -5
  100. package/dist/bits/menu/components/menu-sub-trigger.svelte +6 -3
  101. package/dist/bits/menu/components/menu-trigger.svelte +5 -3
  102. package/dist/bits/menu/menu.svelte.d.ts +7 -20
  103. package/dist/bits/menu/menu.svelte.js +26 -54
  104. package/dist/bits/menubar/components/menubar-content-static.svelte +4 -2
  105. package/dist/bits/menubar/components/menubar-content.svelte +4 -2
  106. package/dist/bits/menubar/components/menubar-menu.svelte +4 -2
  107. package/dist/bits/menubar/components/menubar-trigger.svelte +14 -6
  108. package/dist/bits/menubar/components/menubar.svelte +4 -2
  109. package/dist/bits/menubar/menubar.svelte.d.ts +24 -20
  110. package/dist/bits/menubar/menubar.svelte.js +40 -56
  111. package/dist/bits/meter/components/meter.svelte +4 -2
  112. package/dist/bits/meter/meter.svelte.js +2 -2
  113. package/dist/bits/navigation-menu/components/navigation-menu-content-impl.svelte +5 -2
  114. package/dist/bits/navigation-menu/components/navigation-menu-content.svelte +8 -3
  115. package/dist/bits/navigation-menu/components/navigation-menu-indicator-impl.svelte +4 -2
  116. package/dist/bits/navigation-menu/components/navigation-menu-indicator.svelte +6 -4
  117. package/dist/bits/navigation-menu/components/navigation-menu-item.svelte +8 -3
  118. package/dist/bits/navigation-menu/components/navigation-menu-link.svelte +4 -2
  119. package/dist/bits/navigation-menu/components/navigation-menu-list.svelte +4 -2
  120. package/dist/bits/navigation-menu/components/navigation-menu-sub.svelte +4 -2
  121. package/dist/bits/navigation-menu/components/navigation-menu-trigger.svelte +4 -2
  122. package/dist/bits/navigation-menu/components/navigation-menu-viewport.svelte +7 -3
  123. package/dist/bits/navigation-menu/components/navigation-menu.svelte +4 -2
  124. package/dist/bits/navigation-menu/navigation-menu.svelte.d.ts +29 -17
  125. package/dist/bits/navigation-menu/navigation-menu.svelte.js +107 -74
  126. package/dist/bits/navigation-menu/types.d.ts +14 -7
  127. package/dist/bits/pagination/components/pagination-next-button.svelte +4 -2
  128. package/dist/bits/pagination/components/pagination-page.svelte +4 -2
  129. package/dist/bits/pagination/components/pagination-prev-button.svelte +4 -2
  130. package/dist/bits/pagination/components/pagination.svelte +4 -2
  131. package/dist/bits/pagination/pagination.svelte.js +4 -4
  132. package/dist/bits/pin-input/components/pin-input-cell.svelte +4 -2
  133. package/dist/bits/pin-input/components/pin-input.svelte +5 -3
  134. package/dist/bits/pin-input/pin-input.svelte.js +4 -10
  135. package/dist/bits/popover/components/popover-close.svelte +4 -2
  136. package/dist/bits/popover/components/popover-content-static.svelte +6 -2
  137. package/dist/bits/popover/components/popover-content.svelte +6 -2
  138. package/dist/bits/popover/components/popover-trigger.svelte +5 -3
  139. package/dist/bits/popover/popover.svelte.js +4 -18
  140. package/dist/bits/progress/components/progress.svelte +4 -2
  141. package/dist/bits/progress/progress.svelte.js +2 -2
  142. package/dist/bits/radio-group/components/radio-group-item.svelte +4 -2
  143. package/dist/bits/radio-group/components/radio-group.svelte +4 -2
  144. package/dist/bits/radio-group/radio-group.svelte.js +4 -7
  145. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +4 -2
  146. package/dist/bits/range-calendar/components/range-calendar-day.svelte +4 -2
  147. package/dist/bits/range-calendar/components/range-calendar.svelte +4 -2
  148. package/dist/bits/range-calendar/range-calendar.svelte.js +4 -4
  149. package/dist/bits/scroll-area/components/scroll-area-corner.svelte +8 -2
  150. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +4 -1
  151. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +1 -1
  152. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +5 -1
  153. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +4 -2
  154. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +8 -3
  155. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +4 -2
  156. package/dist/bits/scroll-area/components/scroll-area.svelte +4 -2
  157. package/dist/bits/scroll-area/scroll-area.svelte.js +13 -47
  158. package/dist/bits/select/components/select-content-static.svelte +6 -2
  159. package/dist/bits/select/components/select-content.svelte +6 -2
  160. package/dist/bits/select/components/select-group-heading.svelte +3 -2
  161. package/dist/bits/select/components/select-group.svelte +4 -2
  162. package/dist/bits/select/components/select-item.svelte +4 -2
  163. package/dist/bits/select/components/select-scroll-down-button.svelte +4 -2
  164. package/dist/bits/select/components/select-scroll-up-button.svelte +4 -2
  165. package/dist/bits/select/components/select-trigger.svelte +5 -3
  166. package/dist/bits/select/components/select-viewport.svelte +4 -2
  167. package/dist/bits/select/components/select.svelte +1 -1
  168. package/dist/bits/select/select.svelte.d.ts +0 -18
  169. package/dist/bits/select/select.svelte.js +10 -43
  170. package/dist/bits/separator/components/separator.svelte +4 -2
  171. package/dist/bits/separator/separator.svelte.js +2 -2
  172. package/dist/bits/slider/components/slider-range.svelte +4 -2
  173. package/dist/bits/slider/components/slider-thumb-label.svelte +50 -0
  174. package/dist/bits/slider/components/slider-thumb-label.svelte.d.ts +4 -0
  175. package/dist/bits/slider/components/slider-thumb.svelte +4 -2
  176. package/dist/bits/slider/components/slider-tick-label.svelte +50 -0
  177. package/dist/bits/slider/components/slider-tick-label.svelte.d.ts +4 -0
  178. package/dist/bits/slider/components/slider-tick.svelte +4 -2
  179. package/dist/bits/slider/components/slider.svelte +26 -5
  180. package/dist/bits/slider/exports.d.ts +3 -1
  181. package/dist/bits/slider/exports.js +2 -0
  182. package/dist/bits/slider/helpers.d.ts +14 -0
  183. package/dist/bits/slider/helpers.js +122 -0
  184. package/dist/bits/slider/slider.svelte.d.ts +93 -6
  185. package/dist/bits/slider/slider.svelte.js +198 -101
  186. package/dist/bits/slider/types.d.ts +111 -11
  187. package/dist/bits/switch/components/switch-thumb.svelte +4 -2
  188. package/dist/bits/switch/components/switch.svelte +4 -2
  189. package/dist/bits/switch/switch.svelte.js +3 -3
  190. package/dist/bits/tabs/components/tabs-content.svelte +4 -2
  191. package/dist/bits/tabs/components/tabs-list.svelte +4 -2
  192. package/dist/bits/tabs/components/tabs-trigger.svelte +4 -2
  193. package/dist/bits/tabs/components/tabs.svelte +4 -2
  194. package/dist/bits/tabs/tabs.svelte.js +6 -6
  195. package/dist/bits/time-field/components/time-field-hidden-input.svelte +10 -0
  196. package/dist/bits/{date-field/components/date-field-error.svelte.d.ts → time-field/components/time-field-hidden-input.svelte.d.ts} +6 -14
  197. package/dist/bits/time-field/components/time-field-input.svelte +39 -0
  198. package/dist/bits/time-field/components/time-field-input.svelte.d.ts +4 -0
  199. package/dist/bits/time-field/components/time-field-label.svelte +34 -0
  200. package/dist/bits/time-field/components/time-field-label.svelte.d.ts +4 -0
  201. package/dist/bits/time-field/components/time-field-segment.svelte +37 -0
  202. package/dist/bits/time-field/components/time-field-segment.svelte.d.ts +4 -0
  203. package/dist/bits/time-field/components/time-field.svelte +94 -0
  204. package/dist/bits/time-field/components/time-field.svelte.d.ts +20 -0
  205. package/dist/bits/time-field/exports.d.ts +5 -0
  206. package/dist/bits/time-field/exports.js +4 -0
  207. package/dist/bits/time-field/index.d.ts +1 -0
  208. package/dist/bits/time-field/index.js +1 -0
  209. package/dist/bits/time-field/time-field.svelte.d.ts +415 -0
  210. package/dist/bits/time-field/time-field.svelte.js +971 -0
  211. package/dist/bits/time-field/types.d.ts +137 -0
  212. package/dist/bits/time-field/types.js +1 -0
  213. package/dist/bits/time-range-field/components/time-range-field-input.svelte +43 -0
  214. package/dist/bits/time-range-field/components/time-range-field-input.svelte.d.ts +4 -0
  215. package/dist/bits/time-range-field/components/time-range-field-label.svelte +34 -0
  216. package/dist/bits/time-range-field/components/time-range-field-label.svelte.d.ts +4 -0
  217. package/dist/bits/time-range-field/components/time-range-field.svelte +144 -0
  218. package/dist/bits/time-range-field/components/time-range-field.svelte.d.ts +20 -0
  219. package/dist/bits/time-range-field/exports.d.ts +5 -0
  220. package/dist/bits/time-range-field/exports.js +4 -0
  221. package/dist/bits/time-range-field/index.d.ts +1 -0
  222. package/dist/bits/time-range-field/index.js +1 -0
  223. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +90 -0
  224. package/dist/bits/time-range-field/time-range-field.svelte.js +210 -0
  225. package/dist/bits/time-range-field/types.d.ts +150 -0
  226. package/dist/bits/time-range-field/types.js +1 -0
  227. package/dist/bits/toggle/components/toggle.svelte +4 -2
  228. package/dist/bits/toggle/toggle.svelte.js +2 -2
  229. package/dist/bits/toggle-group/components/toggle-group-item.svelte +4 -2
  230. package/dist/bits/toggle-group/components/toggle-group.svelte +4 -2
  231. package/dist/bits/toggle-group/toggle-group.svelte.js +4 -4
  232. package/dist/bits/toolbar/components/toolbar-button.svelte +4 -2
  233. package/dist/bits/toolbar/components/toolbar-group-item.svelte +4 -2
  234. package/dist/bits/toolbar/components/toolbar-group.svelte +4 -2
  235. package/dist/bits/toolbar/components/toolbar-link.svelte +4 -2
  236. package/dist/bits/toolbar/components/toolbar.svelte +4 -2
  237. package/dist/bits/toolbar/toolbar.svelte.js +7 -7
  238. package/dist/bits/tooltip/components/tooltip-content-static.svelte +6 -2
  239. package/dist/bits/tooltip/components/tooltip-content.svelte +6 -2
  240. package/dist/bits/tooltip/components/tooltip-trigger.svelte +5 -3
  241. package/dist/bits/tooltip/tooltip.svelte.js +3 -14
  242. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -0
  243. package/dist/bits/utilities/dismissible-layer/types.d.ts +2 -0
  244. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +3 -3
  245. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +16 -25
  246. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -1
  247. package/dist/bits/utilities/floating-layer/types.d.ts +1 -0
  248. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +3 -2
  249. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +5 -26
  250. package/dist/bits/utilities/focus-scope/focus-scope.svelte +2 -0
  251. package/dist/bits/utilities/focus-scope/types.d.ts +2 -0
  252. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +2 -1
  253. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +2 -8
  254. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +4 -0
  255. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -1
  256. package/dist/bits/utilities/presence-layer/presence-layer.svelte +2 -2
  257. package/dist/bits/utilities/presence-layer/types.d.ts +2 -1
  258. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +1 -1
  259. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +19 -36
  260. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -0
  261. package/dist/bits/utilities/text-selection-layer/types.d.ts +2 -0
  262. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +3 -1
  263. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +2 -8
  264. package/dist/index.d.ts +1 -1
  265. package/dist/index.js +1 -1
  266. package/dist/internal/create-id.d.ts +8 -0
  267. package/dist/internal/create-id.js +5 -0
  268. package/dist/internal/date-time/field/helpers.d.ts +1 -0
  269. package/dist/internal/date-time/field/helpers.js +8 -2
  270. package/dist/internal/date-time/field/parts.d.ts +3 -1
  271. package/dist/internal/date-time/field/parts.js +10 -2
  272. package/dist/internal/date-time/field/segments.d.ts +9 -0
  273. package/dist/internal/date-time/field/segments.js +65 -0
  274. package/dist/internal/date-time/field/time-helpers.d.ts +77 -0
  275. package/dist/internal/date-time/field/time-helpers.js +301 -0
  276. package/dist/internal/date-time/field/types.d.ts +2 -2
  277. package/dist/internal/date-time/formatter.d.ts +11 -1
  278. package/dist/internal/date-time/formatter.js +56 -0
  279. package/dist/internal/date-time/utils.d.ts +7 -2
  280. package/dist/internal/date-time/utils.js +15 -1
  281. package/dist/internal/dom-context.svelte.d.ts +9 -0
  282. package/dist/internal/dom-context.svelte.js +26 -0
  283. package/dist/internal/use-roving-focus.svelte.d.ts +3 -3
  284. package/dist/internal/use-roving-focus.svelte.js +10 -11
  285. package/dist/shared/date/types.d.ts +27 -4
  286. package/dist/shared/index.d.ts +9 -2
  287. package/dist/types.d.ts +2 -0
  288. package/package.json +18 -16
  289. package/dist/bits/date-field/components/date-field-error.svelte +0 -0
@@ -7,51 +7,72 @@ type AccordionBaseStateProps = WithRefProps<ReadableBoxedValues<{
7
7
  orientation: Orientation;
8
8
  loop: boolean;
9
9
  }>>;
10
- declare class AccordionBaseState {
10
+ type AccordionSingleStateProps = AccordionBaseStateProps & WritableBoxedValues<{
11
+ value: string;
12
+ }>;
13
+ type AccordionMultiStateProps = AccordionBaseStateProps & WritableBoxedValues<{
14
+ value: string[];
15
+ }>;
16
+ type AccordionState = AccordionSingleState | AccordionMultiState;
17
+ type AccordionItemStateProps = WithRefProps<ReadableBoxedValues<{
18
+ value: string;
19
+ disabled: boolean;
20
+ }> & {
21
+ rootState: AccordionState;
22
+ }>;
23
+ type AccordionTriggerStateProps = WithRefProps<ReadableBoxedValues<{
24
+ disabled: boolean | null | undefined;
25
+ }>>;
26
+ type AccordionContentStateProps = WithRefProps<ReadableBoxedValues<{
27
+ forceMount: boolean;
28
+ }>>;
29
+ type AccordionHeaderStateProps = WithRefProps<ReadableBoxedValues<{
30
+ level: 1 | 2 | 3 | 4 | 5 | 6;
31
+ }>>;
32
+ type InitAccordionProps = WithRefProps<{
33
+ type: "single" | "multiple";
34
+ value: Box<string> | Box<string[]>;
35
+ } & ReadableBoxedValues<{
36
+ disabled: boolean;
37
+ orientation: Orientation;
38
+ loop: boolean;
39
+ }>>;
40
+ declare abstract class AccordionBaseState {
11
41
  readonly opts: AccordionBaseStateProps;
12
- rovingFocusGroup: UseRovingFocusReturn;
42
+ readonly rovingFocusGroup: UseRovingFocusReturn;
43
+ abstract readonly isMulti: boolean;
13
44
  constructor(opts: AccordionBaseStateProps);
14
- props: {
45
+ abstract includesItem(item: string): boolean;
46
+ abstract toggleItem(item: string): void;
47
+ readonly props: {
15
48
  readonly id: string;
16
49
  readonly "data-orientation": "horizontal" | "vertical";
17
50
  readonly "data-disabled": "" | undefined;
18
51
  readonly "data-accordion-root": "";
19
52
  };
20
53
  }
21
- type AccordionSingleStateProps = AccordionBaseStateProps & WritableBoxedValues<{
22
- value: string;
23
- }>;
24
54
  export declare class AccordionSingleState extends AccordionBaseState {
25
55
  readonly opts: AccordionSingleStateProps;
26
- isMulti: false;
56
+ readonly isMulti: false;
27
57
  constructor(opts: AccordionSingleStateProps);
28
- includesItem(item: string): boolean;
29
- toggleItem(item: string): void;
58
+ includesItem: (item: string) => boolean;
59
+ toggleItem: (item: string) => void;
30
60
  }
31
- type AccordionMultiStateProps = AccordionBaseStateProps & WritableBoxedValues<{
32
- value: string[];
33
- }>;
34
61
  export declare class AccordionMultiState extends AccordionBaseState {
35
62
  #private;
36
- isMulti: true;
63
+ readonly isMulti: true;
37
64
  constructor(props: AccordionMultiStateProps);
38
- includesItem(item: string): boolean;
39
- toggleItem(item: string): void;
65
+ includesItem: (item: string) => boolean;
66
+ toggleItem: (item: string) => void;
40
67
  }
41
- type AccordionItemStateProps = WithRefProps<ReadableBoxedValues<{
42
- value: string;
43
- disabled: boolean;
44
- }> & {
45
- rootState: AccordionState;
46
- }>;
47
68
  export declare class AccordionItemState {
48
69
  readonly opts: AccordionItemStateProps;
49
- root: AccordionState;
50
- isActive: boolean;
51
- isDisabled: boolean;
70
+ readonly root: AccordionState;
71
+ readonly isActive: boolean;
72
+ readonly isDisabled: boolean;
52
73
  constructor(opts: AccordionItemStateProps);
53
- updateValue(): void;
54
- props: {
74
+ updateValue: () => void;
75
+ readonly props: {
55
76
  readonly id: string;
56
77
  readonly "data-state": "open" | "closed";
57
78
  readonly "data-disabled": "" | undefined;
@@ -59,17 +80,14 @@ export declare class AccordionItemState {
59
80
  readonly "data-accordion-item": "";
60
81
  };
61
82
  }
62
- type AccordionTriggerStateProps = WithRefProps<ReadableBoxedValues<{
63
- disabled: boolean | null | undefined;
64
- }>>;
65
83
  declare class AccordionTriggerState {
66
84
  #private;
67
85
  readonly opts: AccordionTriggerStateProps;
68
86
  readonly itemState: AccordionItemState;
69
87
  constructor(opts: AccordionTriggerStateProps, itemState: AccordionItemState);
70
- onclick(e: BitsMouseEvent): void;
71
- onkeydown(e: BitsKeyboardEvent): void;
72
- props: {
88
+ onclick: (e: BitsMouseEvent) => void;
89
+ onkeydown: (e: BitsKeyboardEvent) => void;
90
+ readonly props: {
73
91
  readonly id: string;
74
92
  readonly disabled: boolean;
75
93
  readonly "aria-expanded": "true" | "false";
@@ -83,19 +101,16 @@ declare class AccordionTriggerState {
83
101
  readonly onkeydown: (e: BitsKeyboardEvent) => void;
84
102
  };
85
103
  }
86
- type AccordionContentStateProps = WithRefProps<ReadableBoxedValues<{
87
- forceMount: boolean;
88
- }>>;
89
104
  declare class AccordionContentState {
90
105
  #private;
91
106
  readonly opts: AccordionContentStateProps;
92
107
  readonly item: AccordionItemState;
93
- present: boolean;
108
+ readonly present: boolean;
94
109
  constructor(opts: AccordionContentStateProps, item: AccordionItemState);
95
- snippetProps: {
110
+ readonly snippetProps: {
96
111
  open: boolean;
97
112
  };
98
- props: {
113
+ readonly props: {
99
114
  readonly id: string;
100
115
  readonly "data-state": "open" | "closed";
101
116
  readonly "data-disabled": "" | undefined;
@@ -107,32 +122,20 @@ declare class AccordionContentState {
107
122
  };
108
123
  };
109
124
  }
110
- type AccordionHeaderStateProps = WithRefProps<ReadableBoxedValues<{
111
- level: 1 | 2 | 3 | 4 | 5 | 6;
112
- }>>;
113
125
  declare class AccordionHeaderState {
114
126
  readonly opts: AccordionHeaderStateProps;
115
127
  readonly item: AccordionItemState;
116
128
  constructor(opts: AccordionHeaderStateProps, item: AccordionItemState);
117
- props: {
129
+ readonly props: {
118
130
  readonly id: string;
119
131
  readonly role: "heading";
120
- readonly "aria-level": 1 | 2 | 3 | 4 | 5 | 6;
121
- readonly "data-heading-level": 1 | 2 | 3 | 4 | 5 | 6;
132
+ readonly "aria-level": 1 | 2 | 3 | 4 | 6 | 5;
133
+ readonly "data-heading-level": 1 | 2 | 3 | 4 | 6 | 5;
122
134
  readonly "data-state": "open" | "closed";
123
135
  readonly "data-orientation": "horizontal" | "vertical";
124
136
  readonly "data-accordion-header": "";
125
137
  };
126
138
  }
127
- type AccordionState = AccordionSingleState | AccordionMultiState;
128
- type InitAccordionProps = WithRefProps<{
129
- type: "single" | "multiple";
130
- value: Box<string> | Box<string[]>;
131
- } & ReadableBoxedValues<{
132
- disabled: boolean;
133
- orientation: Orientation;
134
- loop: boolean;
135
- }>>;
136
139
  export declare function useAccordionRoot(props: InitAccordionProps): AccordionState;
137
140
  export declare function useAccordionItem(props: Omit<AccordionItemStateProps, "rootState">): AccordionItemState;
138
141
  export declare function useAccordionTrigger(props: AccordionTriggerStateProps): AccordionTriggerState;
@@ -1,22 +1,25 @@
1
- import { afterTick, useRefById } from "svelte-toolbelt";
1
+ import { afterTick, attachRef } from "svelte-toolbelt";
2
2
  import { Context, watch } from "runed";
3
3
  import { getAriaDisabled, getAriaExpanded, getDataDisabled, getDataOpenClosed, getDataOrientation, } from "../../internal/attrs.js";
4
4
  import { kbd } from "../../internal/kbd.js";
5
5
  import { useRovingFocus, } from "../../internal/use-roving-focus.svelte.js";
6
- const ACCORDION_ROOT_ATTR = "data-accordion-root";
7
- const ACCORDION_TRIGGER_ATTR = "data-accordion-trigger";
8
- const ACCORDION_CONTENT_ATTR = "data-accordion-content";
9
- const ACCORDION_ITEM_ATTR = "data-accordion-item";
10
- const ACCORDION_HEADER_ATTR = "data-accordion-header";
6
+ // Constants
7
+ const ACCORDION_ATTRS = {
8
+ ROOT: "data-accordion-root",
9
+ TRIGGER: "data-accordion-trigger",
10
+ CONTENT: "data-accordion-content",
11
+ ITEM: "data-accordion-item",
12
+ HEADER: "data-accordion-header",
13
+ };
14
+ // Base class
11
15
  class AccordionBaseState {
12
16
  opts;
13
17
  rovingFocusGroup;
14
18
  constructor(opts) {
15
19
  this.opts = opts;
16
- useRefById(this.opts);
17
20
  this.rovingFocusGroup = useRovingFocus({
18
- rootNodeId: this.opts.id,
19
- candidateAttr: ACCORDION_TRIGGER_ATTR,
21
+ rootNode: this.opts.ref,
22
+ candidateAttr: ACCORDION_ATTRS.TRIGGER,
20
23
  loop: this.opts.loop,
21
24
  orientation: this.opts.orientation,
22
25
  });
@@ -25,46 +28,39 @@ class AccordionBaseState {
25
28
  id: this.opts.id.current,
26
29
  "data-orientation": getDataOrientation(this.opts.orientation.current),
27
30
  "data-disabled": getDataDisabled(this.opts.disabled.current),
28
- [ACCORDION_ROOT_ATTR]: "",
31
+ [ACCORDION_ATTRS.ROOT]: "",
32
+ ...attachRef(this.opts.ref),
29
33
  }));
30
34
  }
35
+ // Single accordion
31
36
  export class AccordionSingleState extends AccordionBaseState {
32
37
  opts;
33
38
  isMulti = false;
34
39
  constructor(opts) {
35
40
  super(opts);
36
41
  this.opts = opts;
37
- this.includesItem = this.includesItem.bind(this);
38
- this.toggleItem = this.toggleItem.bind(this);
39
42
  }
40
- includesItem(item) {
41
- return this.opts.value.current === item;
42
- }
43
- toggleItem(item) {
43
+ includesItem = (item) => this.opts.value.current === item;
44
+ toggleItem = (item) => {
44
45
  this.opts.value.current = this.includesItem(item) ? "" : item;
45
- }
46
+ };
46
47
  }
48
+ // Multiple accordion
47
49
  export class AccordionMultiState extends AccordionBaseState {
48
50
  #value;
49
51
  isMulti = true;
50
52
  constructor(props) {
51
53
  super(props);
52
54
  this.#value = props.value;
53
- this.includesItem = this.includesItem.bind(this);
54
- this.toggleItem = this.toggleItem.bind(this);
55
- }
56
- includesItem(item) {
57
- return this.#value.current.includes(item);
58
- }
59
- toggleItem(item) {
60
- if (this.includesItem(item)) {
61
- this.#value.current = this.#value.current.filter((v) => v !== item);
62
- }
63
- else {
64
- this.#value.current = [...this.#value.current, item];
65
- }
66
55
  }
56
+ includesItem = (item) => this.#value.current.includes(item);
57
+ toggleItem = (item) => {
58
+ this.#value.current = this.includesItem(item)
59
+ ? this.#value.current.filter((v) => v !== item)
60
+ : [...this.#value.current, item];
61
+ };
67
62
  }
63
+ // Item state
68
64
  export class AccordionItemState {
69
65
  opts;
70
66
  root;
@@ -73,23 +69,20 @@ export class AccordionItemState {
73
69
  constructor(opts) {
74
70
  this.opts = opts;
75
71
  this.root = opts.rootState;
76
- this.updateValue = this.updateValue.bind(this);
77
- useRefById({
78
- ...opts,
79
- deps: () => this.isActive,
80
- });
81
72
  }
82
- updateValue() {
73
+ updateValue = () => {
83
74
  this.root.toggleItem(this.opts.value.current);
84
- }
75
+ };
85
76
  props = $derived.by(() => ({
86
77
  id: this.opts.id.current,
87
78
  "data-state": getDataOpenClosed(this.isActive),
88
79
  "data-disabled": getDataDisabled(this.isDisabled),
89
80
  "data-orientation": getDataOrientation(this.root.opts.orientation.current),
90
- [ACCORDION_ITEM_ATTR]: "",
81
+ [ACCORDION_ATTRS.ITEM]: "",
82
+ ...attachRef(this.opts.ref),
91
83
  }));
92
84
  }
85
+ // Trigger state
93
86
  class AccordionTriggerState {
94
87
  opts;
95
88
  itemState;
@@ -101,18 +94,15 @@ class AccordionTriggerState {
101
94
  this.opts = opts;
102
95
  this.itemState = itemState;
103
96
  this.#root = itemState.root;
104
- this.onkeydown = this.onkeydown.bind(this);
105
- this.onclick = this.onclick.bind(this);
106
- useRefById(opts);
107
97
  }
108
- onclick(e) {
109
- if (this.#isDisabled)
98
+ onclick = (e) => {
99
+ if (this.#isDisabled || e.button !== 0) {
100
+ e.preventDefault();
110
101
  return;
111
- if (e.button !== 0)
112
- return e.preventDefault();
102
+ }
113
103
  this.itemState.updateValue();
114
- }
115
- onkeydown(e) {
104
+ };
105
+ onkeydown = (e) => {
116
106
  if (this.#isDisabled)
117
107
  return;
118
108
  if (e.key === kbd.SPACE || e.key === kbd.ENTER) {
@@ -121,7 +111,7 @@ class AccordionTriggerState {
121
111
  return;
122
112
  }
123
113
  this.#root.rovingFocusGroup.handleKeydown(this.opts.ref.current, e);
124
- }
114
+ };
125
115
  props = $derived.by(() => ({
126
116
  id: this.opts.id.current,
127
117
  disabled: this.#isDisabled,
@@ -130,82 +120,80 @@ class AccordionTriggerState {
130
120
  "data-disabled": getDataDisabled(this.#isDisabled),
131
121
  "data-state": getDataOpenClosed(this.itemState.isActive),
132
122
  "data-orientation": getDataOrientation(this.#root.opts.orientation.current),
133
- [ACCORDION_TRIGGER_ATTR]: "",
123
+ [ACCORDION_ATTRS.TRIGGER]: "",
134
124
  tabindex: 0,
135
- //
136
125
  onclick: this.onclick,
137
126
  onkeydown: this.onkeydown,
127
+ ...attachRef(this.opts.ref),
138
128
  }));
139
129
  }
130
+ // Content state with improved animation handling
140
131
  class AccordionContentState {
141
132
  opts;
142
133
  item;
143
134
  #originalStyles = undefined;
144
135
  #isMountAnimationPrevented = false;
145
- #width = $state(0);
146
- #height = $state(0);
136
+ #dimensions = $state({ width: 0, height: 0 });
147
137
  present = $derived.by(() => this.opts.forceMount.current || this.item.isActive);
148
138
  constructor(opts, item) {
149
139
  this.opts = opts;
150
140
  this.item = item;
151
141
  this.#isMountAnimationPrevented = this.item.isActive;
152
- useRefById(opts);
153
- $effect.pre(() => {
142
+ // Prevent mount animations on initial render
143
+ $effect(() => {
154
144
  const rAF = requestAnimationFrame(() => {
155
145
  this.#isMountAnimationPrevented = false;
156
146
  });
157
- return () => {
158
- cancelAnimationFrame(rAF);
159
- };
147
+ return () => cancelAnimationFrame(rAF);
160
148
  });
161
- watch([() => this.present, () => this.opts.ref.current], ([_, node]) => {
162
- if (!node)
149
+ // Handle dimension updates
150
+ watch([() => this.present, () => this.opts.ref.current], this.#updateDimensions);
151
+ }
152
+ #updateDimensions = ([_, node]) => {
153
+ if (!node)
154
+ return;
155
+ afterTick(() => {
156
+ const element = this.opts.ref.current;
157
+ if (!element)
163
158
  return;
164
- afterTick(() => {
165
- if (!this.opts.ref.current)
166
- return;
167
- // get the dimensions of the element
168
- this.#originalStyles = this.#originalStyles || {
169
- transitionDuration: node.style.transitionDuration,
170
- animationName: node.style.animationName,
171
- };
172
- // block any animations/transitions so the element renders at full dimensions
173
- node.style.transitionDuration = "0s";
174
- node.style.animationName = "none";
175
- const rect = node.getBoundingClientRect();
176
- this.#height = rect.height;
177
- this.#width = rect.width;
178
- // unblock any animations/transitions that were originally set if not the initial render
179
- if (!this.#isMountAnimationPrevented) {
180
- const { animationName, transitionDuration } = this.#originalStyles;
181
- node.style.transitionDuration = transitionDuration;
182
- node.style.animationName = animationName;
183
- }
184
- });
159
+ // store original styles on first run
160
+ this.#originalStyles ??= {
161
+ transitionDuration: element.style.transitionDuration,
162
+ animationName: element.style.animationName,
163
+ };
164
+ // temporarily disable animations for measurement
165
+ element.style.transitionDuration = "0s";
166
+ element.style.animationName = "none";
167
+ const rect = element.getBoundingClientRect();
168
+ this.#dimensions = { width: rect.width, height: rect.height };
169
+ // restore animations if not initial mount
170
+ if (!this.#isMountAnimationPrevented && this.#originalStyles) {
171
+ element.style.transitionDuration = this.#originalStyles.transitionDuration;
172
+ element.style.animationName = this.#originalStyles.animationName;
173
+ }
185
174
  });
186
- }
187
- snippetProps = $derived.by(() => ({
188
- open: this.item.isActive,
189
- }));
175
+ };
176
+ snippetProps = $derived.by(() => ({ open: this.item.isActive }));
190
177
  props = $derived.by(() => ({
191
178
  id: this.opts.id.current,
192
179
  "data-state": getDataOpenClosed(this.item.isActive),
193
180
  "data-disabled": getDataDisabled(this.item.isDisabled),
194
181
  "data-orientation": getDataOrientation(this.item.root.opts.orientation.current),
195
- [ACCORDION_CONTENT_ATTR]: "",
182
+ [ACCORDION_ATTRS.CONTENT]: "",
196
183
  style: {
197
- "--bits-accordion-content-height": `${this.#height}px`,
198
- "--bits-accordion-content-width": `${this.#width}px`,
184
+ "--bits-accordion-content-height": `${this.#dimensions.height}px`,
185
+ "--bits-accordion-content-width": `${this.#dimensions.width}px`,
199
186
  },
187
+ ...attachRef(this.opts.ref),
200
188
  }));
201
189
  }
190
+ // Header state
202
191
  class AccordionHeaderState {
203
192
  opts;
204
193
  item;
205
194
  constructor(opts, item) {
206
195
  this.opts = opts;
207
196
  this.item = item;
208
- useRefById(opts);
209
197
  }
210
198
  props = $derived.by(() => ({
211
199
  id: this.opts.id.current,
@@ -214,7 +202,8 @@ class AccordionHeaderState {
214
202
  "data-heading-level": this.opts.level.current,
215
203
  "data-state": getDataOpenClosed(this.item.isActive),
216
204
  "data-orientation": getDataOrientation(this.item.root.opts.orientation.current),
217
- [ACCORDION_HEADER_ATTR]: "",
205
+ [ACCORDION_ATTRS.HEADER]: "",
206
+ ...attachRef(this.opts.ref),
218
207
  }));
219
208
  }
220
209
  const AccordionRootContext = new Context("Accordion.Root");
@@ -3,12 +3,14 @@
3
3
  import { useAccordionContent } from "../accordion.svelte.js";
4
4
  import type { AccordionContentProps } from "../types.js";
5
5
  import { PresenceLayer } from "../../utilities/presence-layer/index.js";
6
- import { useId } from "../../../internal/use-id.js";
6
+ import { createId } from "../../../internal/create-id.js";
7
+
8
+ const uid = $props.id();
7
9
 
8
10
  let {
9
11
  child,
10
12
  ref = $bindable(null),
11
- id = useId(),
13
+ id = createId(uid),
12
14
  forceMount = false,
13
15
  children,
14
16
  ...restProps
@@ -24,7 +26,7 @@
24
26
  });
25
27
  </script>
26
28
 
27
- <PresenceLayer forceMount={true} present={contentState.present} {id}>
29
+ <PresenceLayer forceMount={true} present={contentState.present} ref={contentState.opts.ref}>
28
30
  {#snippet presence({ present })}
29
31
  {@const mergedProps = mergeProps(restProps, contentState.props, {
30
32
  hidden: forceMount ? undefined : !present.current,
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { AccordionHeaderProps } from "../types.js";
4
4
  import { useAccordionHeader } from "../accordion.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
6
8
 
7
9
  let {
8
- id = useId(),
10
+ id = createId(uid),
9
11
  level = 2,
10
12
  children,
11
13
  child,
@@ -2,12 +2,15 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { AccordionItemProps } from "../types.js";
4
4
  import { useAccordionItem } from "../accordion.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
8
+ const defaultId = createId(uid);
6
9
 
7
10
  let {
8
- id = useId(),
11
+ id = defaultId,
9
12
  disabled = false,
10
- value = useId(),
13
+ value = defaultId,
11
14
  children,
12
15
  child,
13
16
  ref = $bindable(null),
@@ -2,12 +2,14 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { AccordionTriggerProps } from "../types.js";
4
4
  import { useAccordionTrigger } from "../accordion.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
6
8
 
7
9
  let {
8
10
  disabled = false,
9
11
  ref = $bindable(null),
10
- id = useId(),
12
+ id = createId(uid),
11
13
  children,
12
14
  child,
13
15
  ...restProps
@@ -2,9 +2,11 @@
2
2
  import { type WritableBox, box, mergeProps } from "svelte-toolbelt";
3
3
  import { useAccordionRoot } from "../accordion.svelte.js";
4
4
  import type { AccordionRootProps } from "../types.js";
5
- import { useId } from "../../../internal/use-id.js";
6
5
  import { noop } from "../../../internal/noop.js";
7
6
  import { watch } from "runed";
7
+ import { createId } from "../../../internal/create-id.js";
8
+
9
+ const uid = $props.id();
8
10
 
9
11
  let {
10
12
  disabled = false,
@@ -13,7 +15,7 @@
13
15
  type,
14
16
  value = $bindable(),
15
17
  ref = $bindable(null),
16
- id = useId(),
18
+ id = createId(uid),
17
19
  onValueChange = noop,
18
20
  loop = true,
19
21
  orientation = "vertical",
@@ -1,13 +1,15 @@
1
1
  <script lang="ts">
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { AlertDialogActionProps } from "../types.js";
4
- import { useId } from "../../../internal/use-id.js";
5
4
  import { useAlertDialogAction } from "../../dialog/dialog.svelte.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
6
8
 
7
9
  let {
8
10
  children,
9
11
  child,
10
- id = useId(),
12
+ id = createId(uid),
11
13
  ref = $bindable(null),
12
14
  ...restProps
13
15
  }: AlertDialogActionProps = $props();
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { AlertDialogCancelProps } from "../types.js";
4
4
  import { useAlertDialogCancel } from "../../dialog/dialog.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
6
8
 
7
9
  let {
8
- id = useId(),
10
+ id = createId(uid),
9
11
  ref = $bindable(null),
10
12
  children,
11
13
  child,
@@ -6,14 +6,16 @@
6
6
  import FocusScope from "../../utilities/focus-scope/focus-scope.svelte";
7
7
  import PresenceLayer from "../../utilities/presence-layer/presence-layer.svelte";
8
8
  import TextSelectionLayer from "../../utilities/text-selection-layer/text-selection-layer.svelte";
9
- import { useId } from "../../../internal/use-id.js";
9
+ import { createId } from "../../../internal/create-id.js";
10
10
  import { noop } from "../../../internal/noop.js";
11
11
  import ScrollLock from "../../utilities/scroll-lock/scroll-lock.svelte";
12
12
  import { useDialogContent } from "../../dialog/dialog.svelte.js";
13
13
  import { shouldTrapFocus } from "../../../internal/should-trap-focus.js";
14
14
 
15
+ const uid = $props.id();
16
+
15
17
  let {
16
- id = useId(),
18
+ id = createId(uid),
17
19
  children,
18
20
  child,
19
21
  ref = $bindable(null),
@@ -41,12 +43,13 @@
41
43
  </script>
42
44
 
43
45
  <PresenceLayer
44
- {...mergedProps}
45
46
  {forceMount}
46
47
  present={contentState.root.opts.open.current || forceMount}
48
+ ref={contentState.opts.ref}
47
49
  >
48
50
  {#snippet presence()}
49
51
  <FocusScope
52
+ ref={contentState.opts.ref}
50
53
  loop
51
54
  trapFocus={shouldTrapFocus({
52
55
  forceMount,
@@ -81,6 +84,7 @@
81
84
  >
82
85
  <DismissibleLayer
83
86
  {...mergedProps}
87
+ ref={contentState.opts.ref}
84
88
  enabled={contentState.root.opts.open.current}
85
89
  {interactOutsideBehavior}
86
90
  onInteractOutside={(e) => {
@@ -91,6 +95,7 @@
91
95
  >
92
96
  <TextSelectionLayer
93
97
  {...mergedProps}
98
+ ref={contentState.opts.ref}
94
99
  enabled={contentState.root.opts.open.current}
95
100
  >
96
101
  {#if child}
@@ -1,10 +1,9 @@
1
- import { useRefById } from "svelte-toolbelt";
1
+ import { attachRef } from "svelte-toolbelt";
2
2
  const ASPECT_RATIO_ROOT_ATTR = "data-aspect-ratio-root";
3
3
  class AspectRatioRootState {
4
4
  opts;
5
5
  constructor(opts) {
6
6
  this.opts = opts;
7
- useRefById(opts);
8
7
  }
9
8
  wrapperProps = $derived.by(() => ({
10
9
  style: {
@@ -23,6 +22,7 @@ class AspectRatioRootState {
23
22
  left: 0,
24
23
  },
25
24
  [ASPECT_RATIO_ROOT_ATTR]: "",
25
+ ...attachRef(this.opts.ref),
26
26
  }));
27
27
  }
28
28
  export function useAspectRatioRoot(props) {