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,7 +2,7 @@
2
2
  * Based on Radix UI's Navigation Menu
3
3
  * https://www.radix-ui.com/docs/primitives/components/navigation-menu
4
4
  */
5
- import { afterSleep, afterTick, box, useRefById, } from "svelte-toolbelt";
5
+ import { afterSleep, afterTick, box, attachRef, DOMContext, getWindow, } from "svelte-toolbelt";
6
6
  import { Context, useDebounce, watch } from "runed";
7
7
  import { untrack } from "svelte";
8
8
  import { SvelteMap } from "svelte/reactivity";
@@ -71,8 +71,10 @@ class NavigationMenuRootState {
71
71
  });
72
72
  constructor(opts) {
73
73
  this.opts = opts;
74
- this.isDelaySkipped = boxAutoReset(false, this.opts.skipDelayDuration.current);
75
- useRefById(opts);
74
+ this.isDelaySkipped = boxAutoReset(false, {
75
+ afterMs: this.opts.skipDelayDuration.current,
76
+ getWindow: () => getWindow(opts.ref.current),
77
+ });
76
78
  this.provider = useNavigationMenuProvider({
77
79
  value: this.opts.value,
78
80
  previousValue: this.previousValue,
@@ -135,6 +137,7 @@ class NavigationMenuRootState {
135
137
  dir: this.opts.dir.current,
136
138
  [NAVIGATION_MENU_ROOT_ATTR]: "",
137
139
  [NAVIGATION_MENU_ATTR]: "",
140
+ ...attachRef(this.opts.ref),
138
141
  }));
139
142
  }
140
143
  class NavigationMenuSubState {
@@ -145,7 +148,6 @@ class NavigationMenuSubState {
145
148
  constructor(opts, context) {
146
149
  this.opts = opts;
147
150
  this.context = context;
148
- useRefById(opts);
149
151
  this.subProvider = useNavigationMenuProvider({
150
152
  isRootMenu: false,
151
153
  value: this.opts.value,
@@ -173,6 +175,7 @@ class NavigationMenuSubState {
173
175
  "data-orientation": getDataOrientation(this.opts.orientation.current),
174
176
  [NAVIGATION_MENU_SUB_ATTR]: "",
175
177
  [NAVIGATION_MENU_ATTR]: "",
178
+ ...attachRef(this.opts.ref),
176
179
  }));
177
180
  }
178
181
  class NavigationMenuListState {
@@ -186,17 +189,8 @@ class NavigationMenuListState {
186
189
  constructor(opts, context) {
187
190
  this.opts = opts;
188
191
  this.context = context;
189
- useRefById(opts);
190
- useRefById({
191
- id: this.wrapperId,
192
- ref: this.wrapperRef,
193
- onRefChange: (node) => {
194
- this.context.indicatorTrackRef.current = node;
195
- },
196
- deps: () => this.wrapperMounted,
197
- });
198
192
  this.rovingFocusGroup = useRovingFocus({
199
- rootNodeId: opts.id,
193
+ rootNode: opts.ref,
200
194
  candidateSelector: `[${NAVIGATION_MENU_TRIGGER_ATTR}]:not([data-disabled]), [${NAVIGATION_MENU_LINK_ATTR}]:not([data-disabled])`,
201
195
  loop: box.with(() => false),
202
196
  orientation: this.context.opts.orientation,
@@ -211,11 +205,13 @@ class NavigationMenuListState {
211
205
  }
212
206
  wrapperProps = $derived.by(() => ({
213
207
  id: this.wrapperId.current,
208
+ ...attachRef(this.wrapperRef, (v) => (this.context.indicatorTrackRef.current = v)),
214
209
  }));
215
210
  props = $derived.by(() => ({
216
211
  id: this.opts.id.current,
217
212
  "data-orientation": getDataOrientation(this.context.opts.orientation.current),
218
213
  [NAVIGATION_MENU_LIST_ATTR]: "",
214
+ ...attachRef(this.opts.ref),
219
215
  }));
220
216
  }
221
217
  export class NavigationMenuItemState {
@@ -231,9 +227,11 @@ export class NavigationMenuItemState {
231
227
  contentChildren = box(undefined);
232
228
  contentChild = box(undefined);
233
229
  contentProps = box({});
230
+ domContext;
234
231
  constructor(opts, listContext) {
235
232
  this.opts = opts;
236
233
  this.listContext = listContext;
234
+ this.domContext = new DOMContext(opts.ref);
237
235
  }
238
236
  #handleContentEntry = (side = "start") => {
239
237
  if (!this.contentNode)
@@ -241,7 +239,7 @@ export class NavigationMenuItemState {
241
239
  this.restoreContentTabOrder();
242
240
  const candidates = getTabbableCandidates(this.contentNode);
243
241
  if (candidates.length)
244
- focusFirst(side === "start" ? candidates : candidates.reverse());
242
+ focusFirst(side === "start" ? candidates : candidates.reverse(), () => this.domContext.getActiveElement());
245
243
  };
246
244
  #handleContentExit = () => {
247
245
  if (!this.contentNode)
@@ -272,24 +270,13 @@ class NavigationMenuTriggerState {
272
270
  focusProxyMounted = $state(false);
273
271
  constructor(opts, context) {
274
272
  this.opts = opts;
275
- this.hasPointerMoveOpened = boxAutoReset(false, 300);
273
+ this.hasPointerMoveOpened = boxAutoReset(false, {
274
+ afterMs: 300,
275
+ getWindow: () => getWindow(opts.ref.current),
276
+ });
276
277
  this.context = context.provider;
277
278
  this.itemContext = context.item;
278
279
  this.listContext = context.list;
279
- useRefById({
280
- ...opts,
281
- onRefChange: (node) => {
282
- this.itemContext.triggerNode = node;
283
- },
284
- });
285
- useRefById({
286
- id: this.focusProxyId,
287
- ref: this.focusProxyRef,
288
- onRefChange: (node) => {
289
- this.itemContext.focusProxyNode = node;
290
- },
291
- deps: () => this.focusProxyMounted,
292
- });
293
280
  watch(() => this.opts.ref.current, () => {
294
281
  const node = this.opts.ref.current;
295
282
  if (!node)
@@ -366,11 +353,13 @@ class NavigationMenuTriggerState {
366
353
  onpointerenter: this.onpointerenter,
367
354
  onclick: this.onclick,
368
355
  onkeydown: this.onkeydown,
356
+ ...attachRef(this.opts.ref, (v) => (this.itemContext.triggerNode = v)),
369
357
  }));
370
358
  focusProxyProps = $derived.by(() => ({
371
359
  id: this.focusProxyId.current,
372
360
  tabindex: 0,
373
361
  onfocus: this.focusProxyOnFocus,
362
+ ...attachRef(this.focusProxyRef, (v) => (this.itemContext.focusProxyNode = v)),
374
363
  }));
375
364
  restructureSpanProps = $derived.by(() => ({
376
365
  "aria-owns": this.itemContext.contentId,
@@ -391,7 +380,6 @@ class NavigationMenuLinkState {
391
380
  constructor(opts, context) {
392
381
  this.opts = opts;
393
382
  this.context = context;
394
- useRefById(opts);
395
383
  }
396
384
  onclick = (e) => {
397
385
  const currTarget = e.currentTarget;
@@ -441,6 +429,7 @@ class NavigationMenuLinkState {
441
429
  onpointerenter: this.onpointerenter,
442
430
  onpointermove: this.onpointermove,
443
431
  [NAVIGATION_MENU_LINK_ATTR]: "",
432
+ ...attachRef(this.opts.ref),
444
433
  }));
445
434
  }
446
435
  class NavigationMenuIndicatorState {
@@ -469,10 +458,6 @@ class NavigationMenuIndicatorImplState {
469
458
  this.listContext = context.list;
470
459
  useResizeObserver(() => this.activeTrigger, this.handlePositionChange);
471
460
  useResizeObserver(() => this.context.indicatorTrackRef.current, this.handlePositionChange);
472
- useRefById({
473
- ...opts,
474
- deps: () => this.context.opts.value.current,
475
- });
476
461
  }
477
462
  handlePositionChange = () => {
478
463
  if (!this.activeTrigger)
@@ -505,6 +490,7 @@ class NavigationMenuIndicatorImplState {
505
490
  }),
506
491
  },
507
492
  [NAVIGATION_MENU_INDICATOR_ATTR]: "",
493
+ ...attachRef(this.opts.ref),
508
494
  }));
509
495
  }
510
496
  class NavigationMenuContentState {
@@ -530,13 +516,6 @@ class NavigationMenuContentState {
530
516
  this.context = context.provider;
531
517
  this.itemContext = context.item;
532
518
  this.listContext = context.list;
533
- useRefById({
534
- ...opts,
535
- onRefChange: (node) => {
536
- this.itemContext.contentNode = node;
537
- },
538
- deps: () => this.mounted,
539
- });
540
519
  }
541
520
  onpointerenter = (_) => {
542
521
  this.context.onContentEnter();
@@ -550,6 +529,7 @@ class NavigationMenuContentState {
550
529
  id: this.opts.id.current,
551
530
  onpointerenter: this.onpointerenter,
552
531
  onpointerleave: this.onpointerleave,
532
+ ...attachRef(this.opts.ref, (v) => (this.itemContext.contentNode = v)),
553
533
  }));
554
534
  }
555
535
  class NavigationMenuContentImplState {
@@ -593,15 +573,13 @@ class NavigationMenuContentImplState {
593
573
  untrack(() => (this.prevMotionAttribute = attribute));
594
574
  return attribute;
595
575
  });
576
+ domContext;
596
577
  constructor(opts, itemContext) {
597
578
  this.opts = opts;
598
579
  this.itemContext = itemContext;
599
580
  this.listContext = itemContext.listContext;
600
581
  this.context = itemContext.listContext.context;
601
- useRefById({
602
- ...opts,
603
- deps: () => this.context.opts.value.current,
604
- });
582
+ this.domContext = new DOMContext(opts.ref);
605
583
  watch([
606
584
  () => this.itemContext.opts.value.current,
607
585
  () => this.itemContext.triggerNode,
@@ -613,7 +591,7 @@ class NavigationMenuContentImplState {
613
591
  const handleClose = () => {
614
592
  this.context.onItemDismiss();
615
593
  this.itemContext.onRootContentClose();
616
- if (content.contains(document.activeElement)) {
594
+ if (content.contains(this.domContext.getActiveElement())) {
617
595
  this.itemContext.triggerNode?.focus();
618
596
  }
619
597
  };
@@ -661,13 +639,13 @@ class NavigationMenuContentImplState {
661
639
  const isTabKey = e.key === kbd.TAB && !isMetaKey;
662
640
  const candidates = getTabbableCandidates(e.currentTarget);
663
641
  if (isTabKey) {
664
- const focusedElement = document.activeElement;
642
+ const focusedElement = this.domContext.getActiveElement();
665
643
  const index = candidates.findIndex((candidate) => candidate === focusedElement);
666
644
  const isMovingBackwards = e.shiftKey;
667
645
  const nextCandidates = isMovingBackwards
668
646
  ? candidates.slice(0, index).reverse()
669
647
  : candidates.slice(index + 1, candidates.length);
670
- if (focusFirst(nextCandidates)) {
648
+ if (focusFirst(nextCandidates, () => this.domContext.getActiveElement())) {
671
649
  // prevent browser tab keydown because we've handled focus
672
650
  e.preventDefault();
673
651
  return;
@@ -680,7 +658,7 @@ class NavigationMenuContentImplState {
680
658
  return;
681
659
  }
682
660
  }
683
- let activeEl = document.activeElement;
661
+ let activeEl = this.domContext.getActiveElement();
684
662
  if (this.itemContext.contentNode) {
685
663
  const focusedNode = this.itemContext.contentNode.querySelector("[data-focused]");
686
664
  if (focusedNode) {
@@ -711,6 +689,7 @@ class NavigationMenuContentImplState {
711
689
  "data-state": getDataOpenClosed(this.context.opts.value.current === this.itemContext.opts.value.current),
712
690
  onkeydown: this.onkeydown,
713
691
  [NAVIGATION_MENU_CONTENT_ATTR]: "",
692
+ ...attachRef(this.opts.ref),
714
693
  }));
715
694
  }
716
695
  class NavigationMenuViewportState {
@@ -726,13 +705,6 @@ class NavigationMenuViewportState {
726
705
  constructor(opts, context) {
727
706
  this.opts = opts;
728
707
  this.context = context;
729
- useRefById({
730
- ...opts,
731
- onRefChange: (node) => {
732
- this.context.viewportRef.current = node;
733
- },
734
- deps: () => this.open,
735
- });
736
708
  watch([() => this.activeContentValue, () => this.open], () => {
737
709
  afterTick(() => {
738
710
  const currNode = this.context.viewportRef.current;
@@ -776,6 +748,7 @@ class NavigationMenuViewportState {
776
748
  [NAVIGATION_MENU_VIEWPORT_ATTR]: "",
777
749
  onpointerenter: this.context.onContentEnter,
778
750
  onpointerleave: this.context.onContentLeave,
751
+ ...attachRef(this.opts.ref, (v) => (this.context.viewportRef.current = v)),
779
752
  }));
780
753
  }
781
754
  const NavigationMenuProviderContext = new Context("NavigationMenu.Root");
@@ -835,14 +808,14 @@ export function useNavigationMenuIndicator() {
835
808
  return new NavigationMenuIndicatorState(NavigationMenuProviderContext.get());
836
809
  }
837
810
  //
838
- function focusFirst(candidates) {
839
- const previouslyFocusedElement = document.activeElement;
811
+ function focusFirst(candidates, getActiveElement) {
812
+ const previouslyFocusedElement = getActiveElement();
840
813
  return candidates.some((candidate) => {
841
814
  // if focus is already where we want to go, we don't want to keep going through the candidates
842
815
  if (candidate === previouslyFocusedElement)
843
816
  return true;
844
817
  candidate.focus();
845
- return document.activeElement !== previouslyFocusedElement;
818
+ return getActiveElement() !== previouslyFocusedElement;
846
819
  });
847
820
  }
848
821
  function removeFromTabOrder(candidates) {
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PaginationNextButtonProps } from "../types.js";
4
4
  import { usePaginationButton } from "../pagination.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
  child,
10
12
  children,
11
13
  ref = $bindable(null),
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PaginationPageProps } from "../types.js";
4
4
  import { usePaginationPage } from "../pagination.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
  page,
10
12
  child,
11
13
  children,
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PaginationPrevButtonProps } from "../types.js";
4
4
  import { usePaginationButton } from "../pagination.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
  child,
10
12
  children,
11
13
  ref = $bindable(null),
@@ -2,11 +2,13 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PaginationRootProps } from "../types.js";
4
4
  import { usePaginationRoot } from "../pagination.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
6
5
  import { noop } from "../../../internal/noop.js";
6
+ import { createId } from "../../../internal/create-id.js";
7
+
8
+ const uid = $props.id();
7
9
 
8
10
  let {
9
- id = useId(),
11
+ id = createId(uid),
10
12
  count,
11
13
  perPage = 1,
12
14
  page = $bindable(1),
@@ -1,4 +1,4 @@
1
- import { useRefById } from "svelte-toolbelt";
1
+ import { attachRef } from "svelte-toolbelt";
2
2
  import { Context } from "runed";
3
3
  import { getDataOrientation } from "../../internal/attrs.js";
4
4
  import { getElemDirection } from "../../internal/locale.js";
@@ -28,7 +28,6 @@ class PaginationRootState {
28
28
  }));
29
29
  constructor(opts) {
30
30
  this.opts = opts;
31
- useRefById(opts);
32
31
  }
33
32
  setPage(page) {
34
33
  this.opts.page.current = page;
@@ -62,6 +61,7 @@ class PaginationRootState {
62
61
  id: this.opts.id.current,
63
62
  "data-orientation": getDataOrientation(this.opts.orientation.current),
64
63
  [PAGINATION_ROOT_ATTR]: "",
64
+ ...attachRef(this.opts.ref),
65
65
  }));
66
66
  }
67
67
  class PaginationPageState {
@@ -71,7 +71,6 @@ class PaginationPageState {
71
71
  constructor(opts, root) {
72
72
  this.opts = opts;
73
73
  this.root = root;
74
- useRefById(opts);
75
74
  this.onclick = this.onclick.bind(this);
76
75
  this.onkeydown = this.onkeydown.bind(this);
77
76
  }
@@ -100,6 +99,7 @@ class PaginationPageState {
100
99
  //
101
100
  onclick: this.onclick,
102
101
  onkeydown: this.onkeydown,
102
+ ...attachRef(this.opts.ref),
103
103
  }));
104
104
  }
105
105
  class PaginationButtonState {
@@ -108,7 +108,6 @@ class PaginationButtonState {
108
108
  constructor(opts, root) {
109
109
  this.opts = opts;
110
110
  this.root = root;
111
- useRefById(opts);
112
111
  this.onclick = this.onclick.bind(this);
113
112
  this.onkeydown = this.onkeydown.bind(this);
114
113
  }
@@ -148,6 +147,7 @@ class PaginationButtonState {
148
147
  //
149
148
  onclick: this.onclick,
150
149
  onkeydown: this.onkeydown,
150
+ ...attachRef(this.opts.ref),
151
151
  }));
152
152
  }
153
153
  //
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PinInputCellProps } from "../types.js";
4
4
  import { usePinInputCell } from "../pin-input.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
  cell,
11
13
  child,
@@ -2,12 +2,14 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { PinInputRootProps } from "../types.js";
4
4
  import { usePinInput } from "../pin-input.svelte.js";
5
- import { useId } from "../../../internal/use-id.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
6
  import { noop } from "../../../internal/noop.js";
7
7
 
8
+ const uid = $props.id();
9
+
8
10
  let {
9
- id = useId(),
10
- inputId = useId(),
11
+ id = createId(uid),
12
+ inputId = `${createId(uid)}-input`,
11
13
  ref = $bindable(null),
12
14
  maxlength = 6,
13
15
  textalign = "left",
@@ -1,3 +1,4 @@
1
+ import { DOMContext } from "svelte-toolbelt";
1
2
  import type { PinInputCell, PinInputRootProps as RootComponentProps } from "./types.js";
2
3
  import type { ReadableBoxedValues, WritableBoxedValues } from "../../internal/box.svelte.js";
3
4
  import type { BitsEvent, BitsFocusEvent, BitsKeyboardEvent, BitsMouseEvent, WithRefProps } from "../../internal/types.js";
@@ -21,6 +22,7 @@ type PinInputRootStateProps = WithRefProps<WritableBoxedValues<{
21
22
  declare class PinInputRootState {
22
23
  #private;
23
24
  readonly opts: PinInputRootStateProps;
25
+ domContext: DOMContext;
24
26
  constructor(opts: PinInputRootStateProps);
25
27
  onkeydown: (e: BitsKeyboardEvent) => void;
26
28
  rootProps: {
@@ -75,7 +77,7 @@ declare class PinInputRootState {
75
77
  "data-pin-input-input": string;
76
78
  "data-pin-input-input-mss": number | null;
77
79
  "data-pin-input-input-mse": number | null;
78
- inputmode: "none" | "search" | "text" | "email" | "tel" | "url" | "numeric" | "decimal" | null | undefined;
80
+ inputmode: "none" | "email" | "tel" | "url" | "text" | "numeric" | "decimal" | "search" | null | undefined;
79
81
  pattern: any;
80
82
  maxlength: number;
81
83
  value: string;
@@ -111,7 +113,7 @@ declare class PinInputCellState {
111
113
  readonly "data-inactive": "" | undefined;
112
114
  };
113
115
  }
114
- export declare function syncTimeouts(cb: (...args: any[]) => unknown): number[];
116
+ export declare function syncTimeouts(cb: (...args: any[]) => unknown, domContext: DOMContext): number[];
115
117
  export declare function usePinInput(props: PinInputRootStateProps): PinInputRootState;
116
118
  export declare function usePinInputCell(props: PinInputCellStateProps): PinInputCellState;
117
119
  export {};
@@ -1,6 +1,6 @@
1
1
  import { Previous, watch } from "runed";
2
2
  import { onMount } from "svelte";
3
- import { box, useRefById } from "svelte-toolbelt";
3
+ import { box, attachRef, DOMContext } from "svelte-toolbelt";
4
4
  import { usePasswordManagerBadge } from "./usePasswordManager.svelte.js";
5
5
  import { getDisabled } from "../../internal/attrs.js";
6
6
  import { on } from "svelte/events";
@@ -47,8 +47,10 @@ class PinInputRootState {
47
47
  });
48
48
  #pwmb;
49
49
  #initialLoad;
50
+ domContext;
50
51
  constructor(opts) {
51
52
  this.opts = opts;
53
+ this.domContext = new DOMContext(opts.ref);
52
54
  this.#initialLoad = {
53
55
  value: this.opts.value,
54
56
  isIOS: typeof window !== "undefined" &&
@@ -59,11 +61,7 @@ class PinInputRootState {
59
61
  inputRef: this.#inputRef,
60
62
  isFocused: this.#isFocused,
61
63
  pushPasswordManagerStrategy: this.opts.pushPasswordManagerStrategy,
62
- });
63
- useRefById(opts);
64
- useRefById({
65
- id: this.opts.inputId,
66
- ref: this.#inputRef,
64
+ domContext: this.domContext,
67
65
  });
68
66
  onMount(() => {
69
67
  const input = this.#inputRef.current;
@@ -78,14 +76,14 @@ class PinInputRootState {
78
76
  input.selectionEnd,
79
77
  input.selectionDirection ?? "none",
80
78
  ];
81
- const unsub = on(document, "selectionchange", this.#onDocumentSelectionChange, {
79
+ const unsub = on(this.domContext.getDocument(), "selectionchange", this.#onDocumentSelectionChange, {
82
80
  capture: true,
83
81
  });
84
82
  this.#onDocumentSelectionChange();
85
- if (document.activeElement === input) {
83
+ if (this.domContext.getActiveElement() === input) {
86
84
  this.#isFocused.current = true;
87
85
  }
88
- if (!document.getElementById("pin-input-style")) {
86
+ if (!this.domContext.getElementById("pin-input-style")) {
89
87
  this.#applyStyles();
90
88
  }
91
89
  const updateRootHeight = () => {
@@ -117,7 +115,7 @@ class PinInputRootState {
117
115
  this.#mirrorSelectionEnd = end;
118
116
  this.#prevInputMetadata.prev = [start, end, dir];
119
117
  }
120
- });
118
+ }, this.domContext);
121
119
  });
122
120
  $effect(() => {
123
121
  // invoke `onComplete` when the input is completely filled.
@@ -155,6 +153,7 @@ class PinInputRootState {
155
153
  id: this.opts.id.current,
156
154
  [ROOT_ATTR]: "",
157
155
  style: this.#rootStyles,
156
+ ...attachRef(this.opts.ref),
158
157
  }));
159
158
  inputWrapperProps = $derived.by(() => ({
160
159
  style: {
@@ -190,9 +189,10 @@ class PinInputRootState {
190
189
  fontVariantNumeric: "tabular-nums",
191
190
  }));
192
191
  #applyStyles() {
193
- const styleEl = document.createElement("style");
192
+ const doc = this.domContext.getDocument();
193
+ const styleEl = doc.createElement("style");
194
194
  styleEl.id = "pin-input-style";
195
- document.head.appendChild(styleEl);
195
+ doc.head.appendChild(styleEl);
196
196
  if (styleEl.sheet) {
197
197
  const autoFillStyles = "background: transparent !important; color: transparent !important; border-color: transparent !important; opacity: 0 !important; box-shadow: none !important; -webkit-box-shadow: none !important; -webkit-text-fill-color: transparent !important;";
198
198
  safeInsertRule(styleEl.sheet, "[data-pin-input-input]::selection { background: transparent !important; color: transparent !important; }");
@@ -209,7 +209,7 @@ class PinInputRootState {
209
209
  const container = this.opts.ref.current;
210
210
  if (!input || !container)
211
211
  return;
212
- if (document.activeElement !== input) {
212
+ if (this.domContext.getActiveElement() !== input) {
213
213
  this.#mirrorSelectionStart = null;
214
214
  this.#mirrorSelectionEnd = null;
215
215
  return;
@@ -276,7 +276,7 @@ class PinInputRootState {
276
276
  // selectionchange event, we'll have to dispatch it manually.
277
277
  // NOTE: The following line also triggers when cmd+A then pasting
278
278
  // a value with smaller length, which is not ideal for performance.
279
- document.dispatchEvent(new Event("selectionchange"));
279
+ this.domContext.getDocument().dispatchEvent(new Event("selectionchange"));
280
280
  }
281
281
  this.opts.value.current = newValue;
282
282
  };
@@ -365,6 +365,7 @@ class PinInputRootState {
365
365
  onmouseleave: this.onmouseleave,
366
366
  onfocus: this.onfocus,
367
367
  onblur: this.onblur,
368
+ ...attachRef(this.#inputRef),
368
369
  }));
369
370
  #cells = $derived.by(() => Array.from({ length: this.opts.maxLength.current }).map((_, idx) => {
370
371
  const isActive = this.#isFocused.current &&
@@ -390,23 +391,20 @@ class PinInputCellState {
390
391
  opts;
391
392
  constructor(opts) {
392
393
  this.opts = opts;
393
- useRefById({
394
- id: this.opts.id,
395
- ref: this.opts.ref,
396
- });
397
394
  }
398
395
  props = $derived.by(() => ({
399
396
  id: this.opts.id.current,
400
397
  [CELL_ATTR]: "",
401
398
  "data-active": this.opts.cell.current.isActive ? "" : undefined,
402
399
  "data-inactive": !this.opts.cell.current.isActive ? "" : undefined,
400
+ ...attachRef(this.opts.ref),
403
401
  }));
404
402
  }
405
403
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
406
- export function syncTimeouts(cb) {
407
- const t1 = setTimeout(cb, 0); // For faster machines
408
- const t2 = setTimeout(cb, 1_0);
409
- const t3 = setTimeout(cb, 5_0);
404
+ export function syncTimeouts(cb, domContext) {
405
+ const t1 = domContext.setTimeout(cb, 0); // For faster machines
406
+ const t2 = domContext.setTimeout(cb, 1_0);
407
+ const t3 = domContext.setTimeout(cb, 5_0);
410
408
  return [t1, t2, t3];
411
409
  }
412
410
  function safeInsertRule(sheet, rule) {
@@ -1,12 +1,13 @@
1
- import type { ReadableBox, WritableBox } from "svelte-toolbelt";
1
+ import { type DOMContext, type ReadableBox, type WritableBox } from "svelte-toolbelt";
2
2
  import type { PinInputRootPropsWithoutHTML } from "./types.js";
3
3
  type UsePasswordManagerBadgeProps = {
4
4
  containerRef: WritableBox<HTMLElement | null>;
5
5
  inputRef: WritableBox<HTMLInputElement | null>;
6
6
  pushPasswordManagerStrategy: ReadableBox<PinInputRootPropsWithoutHTML["pushPasswordManagerStrategy"]>;
7
7
  isFocused: ReadableBox<boolean>;
8
+ domContext: DOMContext;
8
9
  };
9
- export declare function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, }: UsePasswordManagerBadgeProps): {
10
+ export declare function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, domContext, }: UsePasswordManagerBadgeProps): {
10
11
  readonly hasPwmBadge: boolean;
11
12
  readonly willPushPwmBadge: boolean;
12
13
  PWM_BADGE_SPACE_WIDTH: "40px";
@@ -1,3 +1,4 @@
1
+ import { getWindow } from "svelte-toolbelt";
1
2
  const PWM_BADGE_MARGIN_RIGHT = 18;
2
3
  const PWM_BADGE_SPACE_WIDTH_PX = 40;
3
4
  const PWM_BADGE_SPACE_WIDTH = `${PWM_BADGE_SPACE_WIDTH_PX}px`;
@@ -7,7 +8,7 @@ const PASSWORD_MANAGER_SELECTORS = [
7
8
  "[data-dashlanecreated]", // Dashlane,
8
9
  '[style$="2147483647 !important;"]', // Bitwarden
9
10
  ].join(",");
10
- export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, }) {
11
+ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordManagerStrategy, isFocused, domContext, }) {
11
12
  let hasPwmBadge = $state(false);
12
13
  let hasPwmBadgeSpace = $state(false);
13
14
  let done = $state(false);
@@ -31,11 +32,11 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
31
32
  const x = rightCornerX - PWM_BADGE_MARGIN_RIGHT;
32
33
  const y = centeredY;
33
34
  // do an extra search to check for all the password manager badges
34
- const passwordManagerStrategy = document.querySelectorAll(PASSWORD_MANAGER_SELECTORS);
35
+ const passwordManagerStrategy = domContext.querySelectorAll(PASSWORD_MANAGER_SELECTORS);
35
36
  // if no password manager is detected, dispatch document.elementFromPoint to
36
37
  // identify the badges
37
38
  if (passwordManagerStrategy.length === 0) {
38
- const maybeBadgeEl = document.elementFromPoint(x, y);
39
+ const maybeBadgeEl = domContext.getDocument().elementFromPoint(x, y);
39
40
  // if the found element is the container,
40
41
  // then it is not a badge, most times there is no badge in this case
41
42
  if (maybeBadgeEl === container)
@@ -50,7 +51,7 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
50
51
  return;
51
52
  // check if the pwm area is fully visible
52
53
  function checkHasSpace() {
53
- const viewportWidth = window.innerWidth;
54
+ const viewportWidth = getWindow(container).innerWidth;
54
55
  const distanceToRightEdge = viewportWidth - container.getBoundingClientRect().right;
55
56
  hasPwmBadgeSpace = distanceToRightEdge >= PWM_BADGE_SPACE_WIDTH_PX;
56
57
  }
@@ -61,7 +62,7 @@ export function usePasswordManagerBadge({ containerRef, inputRef, pushPasswordMa
61
62
  };
62
63
  });
63
64
  $effect(() => {
64
- const focused = isFocused.current || document.activeElement === inputRef.current;
65
+ const focused = isFocused.current || domContext.getActiveElement() === inputRef.current;
65
66
  if (pushPasswordManagerStrategy.current === "none" || !focused)
66
67
  return;
67
68
  const t1 = setTimeout(trackPwmBadge, 0);