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
@@ -1,5 +1,5 @@
1
1
  import { Context, Previous, watch } from "runed";
2
- import { afterSleep, afterTick, onDestroyEffect, useRefById } from "svelte-toolbelt";
2
+ import { afterSleep, afterTick, onDestroyEffect, attachRef } from "svelte-toolbelt";
3
3
  import { on } from "svelte/events";
4
4
  import { backward, forward, next, prev } from "../../internal/arrays.js";
5
5
  import { getAriaExpanded, getAriaHidden, getDataDisabled, getDataOpenClosed, getDisabled, getRequired, } from "../../internal/attrs.js";
@@ -210,12 +210,6 @@ class SelectInputState {
210
210
  constructor(opts, root) {
211
211
  this.opts = opts;
212
212
  this.root = root;
213
- useRefById({
214
- ...opts,
215
- onRefChange: (node) => {
216
- this.root.inputNode = node;
217
- },
218
- });
219
213
  this.onkeydown = this.onkeydown.bind(this);
220
214
  this.oninput = this.oninput.bind(this);
221
215
  watch([() => this.root.opts.value.current, () => this.opts.clearOnDeselect.current], ([value, clearOnDeselect], [prevValue]) => {
@@ -340,6 +334,7 @@ class SelectInputState {
340
334
  onkeydown: this.onkeydown,
341
335
  oninput: this.oninput,
342
336
  [this.root.bitsAttrs.input]: "",
337
+ ...attachRef(this.opts.ref, (v) => (this.root.inputNode = v)),
343
338
  }));
344
339
  }
345
340
  class SelectComboTriggerState {
@@ -348,7 +343,6 @@ class SelectComboTriggerState {
348
343
  constructor(opts, root) {
349
344
  this.opts = opts;
350
345
  this.root = root;
351
- useRefById(opts);
352
346
  this.onkeydown = this.onkeydown.bind(this);
353
347
  this.onpointerdown = this.onpointerdown.bind(this);
354
348
  }
@@ -383,6 +377,7 @@ class SelectComboTriggerState {
383
377
  [this.root.bitsAttrs.trigger]: "",
384
378
  onpointerdown: this.onpointerdown,
385
379
  onkeydown: this.onkeydown,
380
+ ...attachRef(this.opts.ref),
386
381
  }));
387
382
  }
388
383
  class SelectTriggerState {
@@ -393,12 +388,6 @@ class SelectTriggerState {
393
388
  constructor(opts, root) {
394
389
  this.opts = opts;
395
390
  this.root = root;
396
- useRefById({
397
- ...opts,
398
- onRefChange: (node) => {
399
- this.root.triggerNode = node;
400
- },
401
- });
402
391
  this.#domTypeahead = useDOMTypeahead({
403
392
  getCurrentItem: () => this.root.highlightedNode,
404
393
  onMatch: (node) => {
@@ -617,6 +606,7 @@ class SelectTriggerState {
617
606
  onkeydown: this.onkeydown,
618
607
  onclick: this.onclick,
619
608
  onpointerup: this.onpointerup,
609
+ ...attachRef(this.opts.ref, (v) => (this.root.triggerNode = v)),
620
610
  }));
621
611
  }
622
612
  class SelectContentState {
@@ -627,13 +617,6 @@ class SelectContentState {
627
617
  constructor(opts, root) {
628
618
  this.opts = opts;
629
619
  this.root = root;
630
- useRefById({
631
- ...opts,
632
- onRefChange: (node) => {
633
- this.root.contentNode = node;
634
- },
635
- deps: () => this.root.opts.open.current,
636
- });
637
620
  onDestroyEffect(() => {
638
621
  this.root.contentNode = null;
639
622
  this.isPositioned = false;
@@ -696,6 +679,7 @@ class SelectContentState {
696
679
  ...this.#styles,
697
680
  },
698
681
  onpointermove: this.onpointermove,
682
+ ...attachRef(this.opts.ref, (v) => (this.root.contentNode = v)),
699
683
  }));
700
684
  popperProps = {
701
685
  onInteractOutside: this.onInteractOutside,
@@ -723,10 +707,6 @@ class SelectItemState {
723
707
  constructor(opts, root) {
724
708
  this.opts = opts;
725
709
  this.root = root;
726
- useRefById({
727
- ...opts,
728
- deps: () => this.mounted,
729
- });
730
710
  watch([() => this.isHighlighted, () => this.prevHighlighted.current], () => {
731
711
  if (this.isHighlighted) {
732
712
  this.opts.onHighlight.current();
@@ -830,6 +810,7 @@ class SelectItemState {
830
810
  onpointermove: this.onpointermove,
831
811
  onpointerdown: this.onpointerdown,
832
812
  onpointerup: this.onpointerup,
813
+ ...attachRef(this.opts.ref),
833
814
  }));
834
815
  }
835
816
  class SelectGroupState {
@@ -839,13 +820,13 @@ class SelectGroupState {
839
820
  constructor(opts, root) {
840
821
  this.opts = opts;
841
822
  this.root = root;
842
- useRefById(opts);
843
823
  }
844
824
  props = $derived.by(() => ({
845
825
  id: this.opts.id.current,
846
826
  role: "group",
847
827
  [this.root.bitsAttrs.group]: "",
848
828
  "aria-labelledby": this.labelNode?.id ?? undefined,
829
+ ...attachRef(this.opts.ref),
849
830
  }));
850
831
  }
851
832
  class SelectGroupHeadingState {
@@ -854,16 +835,11 @@ class SelectGroupHeadingState {
854
835
  constructor(opts, group) {
855
836
  this.opts = opts;
856
837
  this.group = group;
857
- useRefById({
858
- ...opts,
859
- onRefChange: (node) => {
860
- group.labelNode = node;
861
- },
862
- });
863
838
  }
864
839
  props = $derived.by(() => ({
865
840
  id: this.opts.id.current,
866
841
  [this.group.root.bitsAttrs["group-label"]]: "",
842
+ ...attachRef(this.opts.ref, (v) => (this.group.labelNode = v)),
867
843
  }));
868
844
  }
869
845
  class SelectHiddenInputState {
@@ -901,13 +877,6 @@ class SelectViewportState {
901
877
  this.opts = opts;
902
878
  this.content = content;
903
879
  this.root = content.root;
904
- useRefById({
905
- ...opts,
906
- onRefChange: (node) => {
907
- this.content.viewportNode = node;
908
- },
909
- deps: () => this.root.opts.open.current,
910
- });
911
880
  }
912
881
  props = $derived.by(() => ({
913
882
  id: this.opts.id.current,
@@ -921,6 +890,7 @@ class SelectViewportState {
921
890
  flex: 1,
922
891
  overflow: "auto",
923
892
  },
893
+ ...attachRef(this.opts.ref, (v) => (this.content.viewportNode = v)),
924
894
  }));
925
895
  }
926
896
  class SelectScrollButtonImplState {
@@ -936,10 +906,6 @@ class SelectScrollButtonImplState {
936
906
  this.opts = opts;
937
907
  this.content = content;
938
908
  this.root = content.root;
939
- useRefById({
940
- ...opts,
941
- deps: () => this.mounted,
942
- });
943
909
  watch([() => this.mounted], () => {
944
910
  if (!this.mounted) {
945
911
  this.isUserScrolling = false;
@@ -994,6 +960,7 @@ class SelectScrollButtonImplState {
994
960
  onpointerdown: this.onpointerdown,
995
961
  onpointermove: this.onpointermove,
996
962
  onpointerleave: this.onpointerleave,
963
+ ...attachRef(this.opts.ref),
997
964
  }));
998
965
  }
999
966
  class SelectScrollDownButtonState {
@@ -2,10 +2,12 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import { useSeparatorRoot } from "../separator.svelte.js";
4
4
  import type { SeparatorRootProps } from "../types.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
  child,
11
13
  children,
@@ -1,11 +1,10 @@
1
- import { useRefById } from "svelte-toolbelt";
1
+ import { attachRef } from "svelte-toolbelt";
2
2
  import { getAriaHidden, getAriaOrientation, getDataOrientation } from "../../internal/attrs.js";
3
3
  const SEPARATOR_ROOT_ATTR = "data-separator-root";
4
4
  class SeparatorRootState {
5
5
  opts;
6
6
  constructor(opts) {
7
7
  this.opts = opts;
8
- useRefById(opts);
9
8
  }
10
9
  props = $derived.by(() => ({
11
10
  id: this.opts.id.current,
@@ -14,6 +13,7 @@ class SeparatorRootState {
14
13
  "aria-hidden": getAriaHidden(this.opts.decorative.current),
15
14
  "data-orientation": getDataOrientation(this.opts.orientation.current),
16
15
  [SEPARATOR_ROOT_ATTR]: "",
16
+ ...attachRef(this.opts.ref),
17
17
  }));
18
18
  }
19
19
  export function useSeparatorRoot(props) {
@@ -2,13 +2,15 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { SliderRangeProps } from "../types.js";
4
4
  import { useSliderRange } from "../slider.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
  children,
9
11
  child,
10
12
  ref = $bindable(null),
11
- id = useId(),
13
+ id = createId(uid),
12
14
  ...restProps
13
15
  }: SliderRangeProps = $props();
14
16
 
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import { box, mergeProps } from "svelte-toolbelt";
3
+ import type { SliderThumbLabelProps } from "../types.js";
4
+ import { SliderRootContext, useSliderThumbLabel } from "../slider.svelte.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
8
+
9
+ let {
10
+ children,
11
+ child,
12
+ ref = $bindable(null),
13
+ id = createId(uid),
14
+ index,
15
+ position: positionProp,
16
+ ...restProps
17
+ }: SliderThumbLabelProps = $props();
18
+
19
+ const root = SliderRootContext.get();
20
+
21
+ const position = $derived.by(() => {
22
+ if (positionProp !== undefined) return positionProp;
23
+ switch (root.direction) {
24
+ case "lr":
25
+ case "rl":
26
+ return "top";
27
+ case "tb":
28
+ case "bt":
29
+ return "left";
30
+ }
31
+ });
32
+
33
+ const tickLabelState = useSliderThumbLabel({
34
+ id: box.with(() => id),
35
+ ref: box.with(
36
+ () => ref,
37
+ (v) => (ref = v)
38
+ ),
39
+ index: box.with(() => index),
40
+ position: box.with(() => position),
41
+ });
42
+
43
+ const mergedProps = $derived(mergeProps(restProps, tickLabelState.props));
44
+ </script>
45
+
46
+ {#if child}
47
+ {@render child({ props: mergedProps })}
48
+ {:else}
49
+ <span {...mergedProps}>{@render children?.()}</span>
50
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { SliderThumbLabelProps } from "../types.js";
2
+ declare const SliderThumbLabel: import("svelte").Component<SliderThumbLabelProps, {}, "ref">;
3
+ type SliderThumbLabel = ReturnType<typeof SliderThumbLabel>;
4
+ export default SliderThumbLabel;
@@ -2,13 +2,15 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { SliderThumbProps } from "../types.js";
4
4
  import { useSliderThumb } from "../slider.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
  children,
9
11
  child,
10
12
  ref = $bindable(null),
11
- id = useId(),
13
+ id = createId(uid),
12
14
  index,
13
15
  disabled = false,
14
16
  ...restProps
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import { box, mergeProps } from "svelte-toolbelt";
3
+ import type { SliderTickLabelProps } from "../types.js";
4
+ import { SliderRootContext, useSliderTickLabel } from "../slider.svelte.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+
7
+ const uid = $props.id();
8
+
9
+ let {
10
+ children,
11
+ child,
12
+ ref = $bindable(null),
13
+ id = createId(uid),
14
+ index,
15
+ position: positionProp,
16
+ ...restProps
17
+ }: SliderTickLabelProps = $props();
18
+
19
+ const root = SliderRootContext.get();
20
+
21
+ const position = $derived.by(() => {
22
+ if (positionProp !== undefined) return positionProp;
23
+ switch (root.direction) {
24
+ case "lr":
25
+ case "rl":
26
+ return "top";
27
+ case "tb":
28
+ case "bt":
29
+ return "left";
30
+ }
31
+ });
32
+
33
+ const tickLabelState = useSliderTickLabel({
34
+ id: box.with(() => id),
35
+ ref: box.with(
36
+ () => ref,
37
+ (v) => (ref = v)
38
+ ),
39
+ index: box.with(() => index),
40
+ position: box.with(() => position),
41
+ });
42
+
43
+ const mergedProps = $derived(mergeProps(restProps, tickLabelState.props));
44
+ </script>
45
+
46
+ {#if child}
47
+ {@render child({ props: mergedProps })}
48
+ {:else}
49
+ <span {...mergedProps}>{@render children?.()}</span>
50
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { SliderTickLabelProps } from "../types.js";
2
+ declare const SliderTickLabel: import("svelte").Component<SliderTickLabelProps, {}, "ref">;
3
+ type SliderTickLabel = ReturnType<typeof SliderTickLabel>;
4
+ export default SliderTickLabel;
@@ -2,13 +2,15 @@
2
2
  import { box, mergeProps } from "svelte-toolbelt";
3
3
  import type { SliderTickProps } from "../types.js";
4
4
  import { useSliderTick } from "../slider.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
  children,
9
11
  child,
10
12
  ref = $bindable(null),
11
- id = useId(),
13
+ id = createId(uid),
12
14
  index,
13
15
  ...restProps
14
16
  }: SliderTickProps = $props();
@@ -2,32 +2,51 @@
2
2
  import { box, mergeProps, type WritableBox } from "svelte-toolbelt";
3
3
  import type { SliderRootProps } from "../types.js";
4
4
  import { useSliderRoot } from "../slider.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
  import { watch } from "runed";
8
8
 
9
+ const uid = $props.id();
10
+
9
11
  let {
10
12
  children,
11
13
  child,
12
- id = useId(),
14
+ id = createId(uid),
13
15
  ref = $bindable(null),
14
16
  value = $bindable(),
15
17
  type,
16
18
  onValueChange = noop,
17
19
  onValueCommit = noop,
18
20
  disabled = false,
19
- min = 0,
20
- max = 100,
21
+ min: minProp,
22
+ max: maxProp,
21
23
  step = 1,
22
24
  dir = "ltr",
23
25
  autoSort = true,
24
26
  orientation = "horizontal",
27
+ thumbPositioning = "contain",
28
+ trackPadding,
25
29
  ...restProps
26
30
  }: SliderRootProps = $props();
27
31
 
32
+ const min = $derived.by(() => {
33
+ if (minProp !== undefined) return minProp;
34
+ if (Array.isArray(step)) return Math.min(...step);
35
+ return 0;
36
+ });
37
+
38
+ const max = $derived.by(() => {
39
+ if (maxProp !== undefined) return maxProp;
40
+ if (Array.isArray(step)) return Math.max(...step);
41
+ return 100;
42
+ });
43
+
28
44
  function handleDefaultValue() {
29
45
  if (value !== undefined) return;
30
- value = type === "single" ? 0 : [];
46
+ if (type === "single") {
47
+ return min;
48
+ }
49
+ return [];
31
50
  }
32
51
 
33
52
  // SSR
@@ -63,7 +82,9 @@
63
82
  dir: box.with(() => dir),
64
83
  autoSort: box.with(() => autoSort),
65
84
  orientation: box.with(() => orientation),
85
+ thumbPositioning: box.with(() => thumbPositioning),
66
86
  type,
87
+ trackPadding: box.with(() => trackPadding),
67
88
  });
68
89
 
69
90
  const mergedProps = $derived(mergeProps(restProps, rootState.props));
@@ -2,4 +2,6 @@ export { default as Root } from "./components/slider.svelte";
2
2
  export { default as Range } from "./components/slider-range.svelte";
3
3
  export { default as Thumb } from "./components/slider-thumb.svelte";
4
4
  export { default as Tick } from "./components/slider-tick.svelte";
5
- export type { SliderRootProps as RootProps, SliderRangeProps as RangeProps, SliderThumbProps as ThumbProps, SliderTickProps as TickProps, } from "./types.js";
5
+ export { default as TickLabel } from "./components/slider-tick-label.svelte";
6
+ export { default as ThumbLabel } from "./components/slider-thumb-label.svelte";
7
+ export type { SliderRootProps as RootProps, SliderRangeProps as RangeProps, SliderThumbProps as ThumbProps, SliderTickProps as TickProps, SliderTickLabelProps as TickLabelProps, SliderThumbLabelProps as ThumbLabelProps, } from "./types.js";
@@ -2,3 +2,5 @@ export { default as Root } from "./components/slider.svelte";
2
2
  export { default as Range } from "./components/slider-range.svelte";
3
3
  export { default as Thumb } from "./components/slider-thumb.svelte";
4
4
  export { default as Tick } from "./components/slider-tick.svelte";
5
+ export { default as TickLabel } from "./components/slider-tick-label.svelte";
6
+ export { default as ThumbLabel } from "./components/slider-thumb-label.svelte";
@@ -2,3 +2,17 @@ import type { StyleProperties } from "../../shared/index.js";
2
2
  export declare function getRangeStyles(direction: "lr" | "rl" | "tb" | "bt", min: number, max: number): StyleProperties;
3
3
  export declare function getThumbStyles(direction: "lr" | "rl" | "tb" | "bt", thumbPos: number): StyleProperties;
4
4
  export declare function getTickStyles(direction: "lr" | "rl" | "tb" | "bt", tickPosition: number, offsetPercentage: number): StyleProperties;
5
+ export declare function getTickLabelStyles(direction: "lr" | "rl" | "tb" | "bt", tickPosition: number, labelPosition?: "top" | "bottom" | "left" | "right"): StyleProperties;
6
+ export declare function getThumbLabelStyles(direction: "lr" | "rl" | "tb" | "bt", thumbPosition: number, labelPosition?: "top" | "bottom" | "left" | "right"): StyleProperties;
7
+ /**
8
+ * Normalizes step to always be a sorted array of valid values within min/max range
9
+ */
10
+ export declare function normalizeSteps(step: number | number[], min: number, max: number): number[];
11
+ /**
12
+ * Snaps a value to the nearest step in a custom steps array
13
+ */
14
+ export declare function snapValueToCustomSteps(value: number, steps: number[]): number;
15
+ /**
16
+ * Gets the next/previous step value for keyboard navigation
17
+ */
18
+ export declare function getAdjacentStepValue(currentValue: number, steps: number[], direction: "next" | "prev"): number;
@@ -64,3 +64,125 @@ export function getTickStyles(direction, tickPosition, offsetPercentage) {
64
64
  }
65
65
  return style;
66
66
  }
67
+ export function getTickLabelStyles(direction, tickPosition, labelPosition = "top") {
68
+ const style = {
69
+ position: "absolute",
70
+ };
71
+ if (direction === "lr" || direction === "rl") {
72
+ // Horizontal slider
73
+ style.left = direction === "lr" ? `${tickPosition}%` : undefined;
74
+ style.right = direction === "rl" ? `${tickPosition}%` : undefined;
75
+ style.translate = "-50% 0";
76
+ if (labelPosition === "top") {
77
+ style.bottom = "100%";
78
+ }
79
+ else if (labelPosition === "bottom") {
80
+ style.top = "100%";
81
+ }
82
+ }
83
+ else {
84
+ // Vertical slider - use same positioning as ticks
85
+ if (direction === "tb") {
86
+ style.top = `${tickPosition}%`;
87
+ }
88
+ else {
89
+ style.bottom = `${tickPosition}%`;
90
+ }
91
+ style.translate = "0 50%";
92
+ if (labelPosition === "left") {
93
+ style.right = "100%";
94
+ }
95
+ else if (labelPosition === "right") {
96
+ style.left = "100%";
97
+ }
98
+ }
99
+ return style;
100
+ }
101
+ export function getThumbLabelStyles(direction, thumbPosition, labelPosition = "top") {
102
+ const style = {
103
+ position: "absolute",
104
+ };
105
+ if (direction === "lr" || direction === "rl") {
106
+ // Horizontal slider
107
+ style.left = direction === "lr" ? `${thumbPosition}%` : undefined;
108
+ style.right = direction === "rl" ? `${thumbPosition}%` : undefined;
109
+ style.translate = "-50% 0";
110
+ if (labelPosition === "top") {
111
+ style.bottom = "100%";
112
+ }
113
+ else if (labelPosition === "bottom") {
114
+ style.top = "100%";
115
+ }
116
+ }
117
+ else {
118
+ // Vertical slider
119
+ if (direction === "tb") {
120
+ style.top = `${thumbPosition}%`;
121
+ }
122
+ else {
123
+ style.bottom = `${thumbPosition}%`;
124
+ }
125
+ style.translate = "0 -50%";
126
+ if (labelPosition === "left") {
127
+ style.right = "100%";
128
+ }
129
+ else if (labelPosition === "right") {
130
+ style.left = "100%";
131
+ }
132
+ }
133
+ return style;
134
+ }
135
+ /**
136
+ * Normalizes step to always be a sorted array of valid values within min/max range
137
+ */
138
+ export function normalizeSteps(step, min, max) {
139
+ if (typeof step === "number") {
140
+ // generate regular steps - match original behavior exactly
141
+ const difference = max - min;
142
+ let count = Math.ceil(difference / step);
143
+ if (difference % step === 0) {
144
+ count++;
145
+ }
146
+ const steps = [];
147
+ for (let i = 0; i < count; i++) {
148
+ const value = min + i * step;
149
+ steps.push(value);
150
+ }
151
+ return steps;
152
+ }
153
+ return [...new Set(step)].filter((value) => value >= min && value <= max).sort((a, b) => a - b);
154
+ }
155
+ /**
156
+ * Snaps a value to the nearest step in a custom steps array
157
+ */
158
+ export function snapValueToCustomSteps(value, steps) {
159
+ if (steps.length === 0)
160
+ return value;
161
+ // Find the closest step
162
+ let closest = steps[0];
163
+ let minDistance = Math.abs(value - closest);
164
+ for (const step of steps) {
165
+ const distance = Math.abs(value - step);
166
+ if (distance < minDistance) {
167
+ minDistance = distance;
168
+ closest = step;
169
+ }
170
+ }
171
+ return closest;
172
+ }
173
+ /**
174
+ * Gets the next/previous step value for keyboard navigation
175
+ */
176
+ export function getAdjacentStepValue(currentValue, steps, direction) {
177
+ const currentIndex = steps.indexOf(currentValue);
178
+ if (currentIndex === -1) {
179
+ // current value is not in steps, snap to nearest
180
+ return snapValueToCustomSteps(currentValue, steps);
181
+ }
182
+ if (direction === "next") {
183
+ return currentIndex < steps.length - 1 ? steps[currentIndex + 1] : currentValue;
184
+ }
185
+ else {
186
+ return currentIndex > 0 ? steps[currentIndex - 1] : currentValue;
187
+ }
188
+ }