bits-ui 1.8.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 (287) 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 +6 -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 +5 -3
  123. package/dist/bits/navigation-menu/components/navigation-menu.svelte +4 -2
  124. package/dist/bits/navigation-menu/navigation-menu.svelte.js +13 -50
  125. package/dist/bits/pagination/components/pagination-next-button.svelte +4 -2
  126. package/dist/bits/pagination/components/pagination-page.svelte +4 -2
  127. package/dist/bits/pagination/components/pagination-prev-button.svelte +4 -2
  128. package/dist/bits/pagination/components/pagination.svelte +4 -2
  129. package/dist/bits/pagination/pagination.svelte.js +4 -4
  130. package/dist/bits/pin-input/components/pin-input-cell.svelte +4 -2
  131. package/dist/bits/pin-input/components/pin-input.svelte +5 -3
  132. package/dist/bits/pin-input/pin-input.svelte.js +4 -10
  133. package/dist/bits/popover/components/popover-close.svelte +4 -2
  134. package/dist/bits/popover/components/popover-content-static.svelte +6 -2
  135. package/dist/bits/popover/components/popover-content.svelte +6 -2
  136. package/dist/bits/popover/components/popover-trigger.svelte +5 -3
  137. package/dist/bits/popover/popover.svelte.js +4 -18
  138. package/dist/bits/progress/components/progress.svelte +4 -2
  139. package/dist/bits/progress/progress.svelte.js +2 -2
  140. package/dist/bits/radio-group/components/radio-group-item.svelte +4 -2
  141. package/dist/bits/radio-group/components/radio-group.svelte +4 -2
  142. package/dist/bits/radio-group/radio-group.svelte.js +4 -7
  143. package/dist/bits/range-calendar/components/range-calendar-cell.svelte +4 -2
  144. package/dist/bits/range-calendar/components/range-calendar-day.svelte +4 -2
  145. package/dist/bits/range-calendar/components/range-calendar.svelte +4 -2
  146. package/dist/bits/range-calendar/range-calendar.svelte.js +4 -4
  147. package/dist/bits/scroll-area/components/scroll-area-corner.svelte +8 -2
  148. package/dist/bits/scroll-area/components/scroll-area-scrollbar-auto.svelte +4 -1
  149. package/dist/bits/scroll-area/components/scroll-area-scrollbar-hover.svelte +1 -1
  150. package/dist/bits/scroll-area/components/scroll-area-scrollbar-scroll.svelte +5 -1
  151. package/dist/bits/scroll-area/components/scroll-area-scrollbar.svelte +4 -2
  152. package/dist/bits/scroll-area/components/scroll-area-thumb.svelte +8 -3
  153. package/dist/bits/scroll-area/components/scroll-area-viewport.svelte +4 -2
  154. package/dist/bits/scroll-area/components/scroll-area.svelte +4 -2
  155. package/dist/bits/scroll-area/scroll-area.svelte.js +13 -47
  156. package/dist/bits/select/components/select-content-static.svelte +6 -2
  157. package/dist/bits/select/components/select-content.svelte +6 -2
  158. package/dist/bits/select/components/select-group-heading.svelte +3 -2
  159. package/dist/bits/select/components/select-group.svelte +4 -2
  160. package/dist/bits/select/components/select-item.svelte +4 -2
  161. package/dist/bits/select/components/select-scroll-down-button.svelte +4 -2
  162. package/dist/bits/select/components/select-scroll-up-button.svelte +4 -2
  163. package/dist/bits/select/components/select-trigger.svelte +5 -3
  164. package/dist/bits/select/components/select-viewport.svelte +4 -2
  165. package/dist/bits/select/components/select.svelte +1 -1
  166. package/dist/bits/select/select.svelte.d.ts +0 -18
  167. package/dist/bits/select/select.svelte.js +10 -43
  168. package/dist/bits/separator/components/separator.svelte +4 -2
  169. package/dist/bits/separator/separator.svelte.js +2 -2
  170. package/dist/bits/slider/components/slider-range.svelte +4 -2
  171. package/dist/bits/slider/components/slider-thumb-label.svelte +50 -0
  172. package/dist/bits/slider/components/slider-thumb-label.svelte.d.ts +4 -0
  173. package/dist/bits/slider/components/slider-thumb.svelte +4 -2
  174. package/dist/bits/slider/components/slider-tick-label.svelte +50 -0
  175. package/dist/bits/slider/components/slider-tick-label.svelte.d.ts +4 -0
  176. package/dist/bits/slider/components/slider-tick.svelte +4 -2
  177. package/dist/bits/slider/components/slider.svelte +24 -5
  178. package/dist/bits/slider/exports.d.ts +3 -1
  179. package/dist/bits/slider/exports.js +2 -0
  180. package/dist/bits/slider/helpers.d.ts +14 -0
  181. package/dist/bits/slider/helpers.js +122 -0
  182. package/dist/bits/slider/slider.svelte.d.ts +91 -5
  183. package/dist/bits/slider/slider.svelte.js +194 -101
  184. package/dist/bits/slider/types.d.ts +105 -11
  185. package/dist/bits/switch/components/switch-thumb.svelte +4 -2
  186. package/dist/bits/switch/components/switch.svelte +4 -2
  187. package/dist/bits/switch/switch.svelte.js +3 -3
  188. package/dist/bits/tabs/components/tabs-content.svelte +4 -2
  189. package/dist/bits/tabs/components/tabs-list.svelte +4 -2
  190. package/dist/bits/tabs/components/tabs-trigger.svelte +4 -2
  191. package/dist/bits/tabs/components/tabs.svelte +4 -2
  192. package/dist/bits/tabs/tabs.svelte.js +6 -6
  193. package/dist/bits/time-field/components/time-field-hidden-input.svelte +10 -0
  194. package/dist/bits/{date-field/components/date-field-error.svelte.d.ts → time-field/components/time-field-hidden-input.svelte.d.ts} +6 -14
  195. package/dist/bits/time-field/components/time-field-input.svelte +39 -0
  196. package/dist/bits/time-field/components/time-field-input.svelte.d.ts +4 -0
  197. package/dist/bits/time-field/components/time-field-label.svelte +34 -0
  198. package/dist/bits/time-field/components/time-field-label.svelte.d.ts +4 -0
  199. package/dist/bits/time-field/components/time-field-segment.svelte +37 -0
  200. package/dist/bits/time-field/components/time-field-segment.svelte.d.ts +4 -0
  201. package/dist/bits/time-field/components/time-field.svelte +94 -0
  202. package/dist/bits/time-field/components/time-field.svelte.d.ts +20 -0
  203. package/dist/bits/time-field/exports.d.ts +5 -0
  204. package/dist/bits/time-field/exports.js +4 -0
  205. package/dist/bits/time-field/index.d.ts +1 -0
  206. package/dist/bits/time-field/index.js +1 -0
  207. package/dist/bits/time-field/time-field.svelte.d.ts +415 -0
  208. package/dist/bits/time-field/time-field.svelte.js +971 -0
  209. package/dist/bits/time-field/types.d.ts +137 -0
  210. package/dist/bits/time-field/types.js +1 -0
  211. package/dist/bits/time-range-field/components/time-range-field-input.svelte +43 -0
  212. package/dist/bits/time-range-field/components/time-range-field-input.svelte.d.ts +4 -0
  213. package/dist/bits/time-range-field/components/time-range-field-label.svelte +34 -0
  214. package/dist/bits/time-range-field/components/time-range-field-label.svelte.d.ts +4 -0
  215. package/dist/bits/time-range-field/components/time-range-field.svelte +144 -0
  216. package/dist/bits/time-range-field/components/time-range-field.svelte.d.ts +20 -0
  217. package/dist/bits/time-range-field/exports.d.ts +5 -0
  218. package/dist/bits/time-range-field/exports.js +4 -0
  219. package/dist/bits/time-range-field/index.d.ts +1 -0
  220. package/dist/bits/time-range-field/index.js +1 -0
  221. package/dist/bits/time-range-field/time-range-field.svelte.d.ts +90 -0
  222. package/dist/bits/time-range-field/time-range-field.svelte.js +210 -0
  223. package/dist/bits/time-range-field/types.d.ts +150 -0
  224. package/dist/bits/time-range-field/types.js +1 -0
  225. package/dist/bits/toggle/components/toggle.svelte +4 -2
  226. package/dist/bits/toggle/toggle.svelte.js +2 -2
  227. package/dist/bits/toggle-group/components/toggle-group-item.svelte +4 -2
  228. package/dist/bits/toggle-group/components/toggle-group.svelte +4 -2
  229. package/dist/bits/toggle-group/toggle-group.svelte.js +4 -4
  230. package/dist/bits/toolbar/components/toolbar-button.svelte +4 -2
  231. package/dist/bits/toolbar/components/toolbar-group-item.svelte +4 -2
  232. package/dist/bits/toolbar/components/toolbar-group.svelte +4 -2
  233. package/dist/bits/toolbar/components/toolbar-link.svelte +4 -2
  234. package/dist/bits/toolbar/components/toolbar.svelte +4 -2
  235. package/dist/bits/toolbar/toolbar.svelte.js +7 -7
  236. package/dist/bits/tooltip/components/tooltip-content-static.svelte +6 -2
  237. package/dist/bits/tooltip/components/tooltip-content.svelte +6 -2
  238. package/dist/bits/tooltip/components/tooltip-trigger.svelte +5 -3
  239. package/dist/bits/tooltip/tooltip.svelte.js +3 -14
  240. package/dist/bits/utilities/dismissible-layer/dismissible-layer.svelte +2 -0
  241. package/dist/bits/utilities/dismissible-layer/types.d.ts +2 -0
  242. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.d.ts +3 -3
  243. package/dist/bits/utilities/dismissible-layer/use-dismissable-layer.svelte.js +16 -25
  244. package/dist/bits/utilities/floating-layer/components/floating-layer-anchor.svelte +2 -1
  245. package/dist/bits/utilities/floating-layer/types.d.ts +1 -0
  246. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.d.ts +3 -2
  247. package/dist/bits/utilities/floating-layer/use-floating-layer.svelte.js +5 -26
  248. package/dist/bits/utilities/focus-scope/focus-scope.svelte +2 -0
  249. package/dist/bits/utilities/focus-scope/types.d.ts +2 -0
  250. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.d.ts +2 -1
  251. package/dist/bits/utilities/focus-scope/use-focus-scope.svelte.js +2 -8
  252. package/dist/bits/utilities/popper-layer/popper-layer-inner.svelte +4 -0
  253. package/dist/bits/utilities/popper-layer/popper-layer.svelte +3 -1
  254. package/dist/bits/utilities/presence-layer/presence-layer.svelte +2 -2
  255. package/dist/bits/utilities/presence-layer/types.d.ts +2 -1
  256. package/dist/bits/utilities/presence-layer/use-presence.svelte.d.ts +1 -1
  257. package/dist/bits/utilities/presence-layer/use-presence.svelte.js +19 -36
  258. package/dist/bits/utilities/text-selection-layer/text-selection-layer.svelte +2 -0
  259. package/dist/bits/utilities/text-selection-layer/types.d.ts +2 -0
  260. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.d.ts +3 -1
  261. package/dist/bits/utilities/text-selection-layer/use-text-selection-layer.svelte.js +2 -8
  262. package/dist/index.d.ts +1 -1
  263. package/dist/index.js +1 -1
  264. package/dist/internal/create-id.d.ts +8 -0
  265. package/dist/internal/create-id.js +5 -0
  266. package/dist/internal/date-time/field/helpers.d.ts +1 -0
  267. package/dist/internal/date-time/field/helpers.js +8 -2
  268. package/dist/internal/date-time/field/parts.d.ts +3 -1
  269. package/dist/internal/date-time/field/parts.js +10 -2
  270. package/dist/internal/date-time/field/segments.d.ts +9 -0
  271. package/dist/internal/date-time/field/segments.js +65 -0
  272. package/dist/internal/date-time/field/time-helpers.d.ts +77 -0
  273. package/dist/internal/date-time/field/time-helpers.js +301 -0
  274. package/dist/internal/date-time/field/types.d.ts +2 -2
  275. package/dist/internal/date-time/formatter.d.ts +11 -1
  276. package/dist/internal/date-time/formatter.js +56 -0
  277. package/dist/internal/date-time/utils.d.ts +7 -2
  278. package/dist/internal/date-time/utils.js +15 -1
  279. package/dist/internal/dom-context.svelte.d.ts +9 -0
  280. package/dist/internal/dom-context.svelte.js +26 -0
  281. package/dist/internal/use-roving-focus.svelte.d.ts +3 -3
  282. package/dist/internal/use-roving-focus.svelte.js +10 -11
  283. package/dist/shared/date/types.d.ts +27 -4
  284. package/dist/shared/index.d.ts +2 -2
  285. package/dist/types.d.ts +2 -0
  286. package/package.json +18 -16
  287. package/dist/bits/date-field/components/date-field-error.svelte +0 -0
@@ -1,20 +1,12 @@
1
- import { afterTick, executeCallbacks } from "svelte-toolbelt";
1
+ import { executeCallbacks } from "svelte-toolbelt";
2
2
  import { Previous, watch } from "runed";
3
3
  import { on } from "svelte/events";
4
4
  import { useStateMachine } from "../../../internal/use-state-machine.svelte.js";
5
- export function usePresence(present, id) {
5
+ export function usePresence(present, ref) {
6
6
  let styles = $state({});
7
7
  let prevAnimationNameState = $state("none");
8
8
  const initialState = present.current ? "mounted" : "unmounted";
9
- let node = $state(null);
10
9
  const prevPresent = new Previous(() => present.current);
11
- watch([() => id.current, () => present.current], ([id, present]) => {
12
- if (!id || !present)
13
- return;
14
- afterTick(() => {
15
- node = document.getElementById(id);
16
- });
17
- });
18
10
  const { state, dispatch } = useStateMachine(initialState, {
19
11
  mounted: {
20
12
  UNMOUNT: "unmounted",
@@ -28,18 +20,15 @@ export function usePresence(present, id) {
28
20
  MOUNT: "mounted",
29
21
  },
30
22
  });
31
- watch(() => present.current, (currPresent) => {
32
- if (!node) {
33
- node = document.getElementById(id.current);
34
- }
35
- if (!node)
23
+ watch(() => present.current, () => {
24
+ if (!ref.current)
36
25
  return;
37
- const hasPresentChanged = currPresent !== prevPresent.current;
26
+ const hasPresentChanged = present.current !== prevPresent.current;
38
27
  if (!hasPresentChanged)
39
28
  return;
40
29
  const prevAnimationName = prevAnimationNameState;
41
- const currAnimationName = getAnimationName(node);
42
- if (currPresent) {
30
+ const currAnimationName = getAnimationName(ref.current);
31
+ if (present.current) {
43
32
  dispatch("MOUNT");
44
33
  }
45
34
  else if (currAnimationName === "none" || styles.display === "none") {
@@ -69,38 +58,32 @@ export function usePresence(present, id) {
69
58
  * make sure we only trigger ANIMATION_END for the currently active animation.
70
59
  */
71
60
  function handleAnimationEnd(event) {
72
- if (!node)
73
- node = document.getElementById(id.current);
74
- if (!node)
61
+ if (!ref.current)
75
62
  return;
76
- const currAnimationName = getAnimationName(node);
63
+ const currAnimationName = getAnimationName(ref.current);
77
64
  const isCurrentAnimation = currAnimationName.includes(event.animationName) || currAnimationName === "none";
78
- if (event.target === node && isCurrentAnimation) {
65
+ if (event.target === ref.current && isCurrentAnimation) {
79
66
  dispatch("ANIMATION_END");
80
67
  }
81
68
  }
82
69
  function handleAnimationStart(event) {
83
- if (!node)
84
- node = document.getElementById(id.current);
85
- if (!node)
70
+ if (!ref.current)
86
71
  return;
87
- if (event.target === node) {
88
- prevAnimationNameState = getAnimationName(node);
72
+ if (event.target === ref.current) {
73
+ prevAnimationNameState = getAnimationName(ref.current);
89
74
  }
90
75
  }
91
76
  watch(() => state.current, () => {
92
- if (!node)
93
- node = document.getElementById(id.current);
94
- if (!node)
77
+ if (!ref.current)
95
78
  return;
96
- const currAnimationName = getAnimationName(node);
79
+ const currAnimationName = getAnimationName(ref.current);
97
80
  prevAnimationNameState = state.current === "mounted" ? currAnimationName : "none";
98
81
  });
99
- watch(() => node, (node) => {
100
- if (!node)
82
+ watch(() => ref.current, () => {
83
+ if (!ref.current)
101
84
  return;
102
- styles = getComputedStyle(node);
103
- return executeCallbacks(on(node, "animationstart", handleAnimationStart), on(node, "animationcancel", handleAnimationEnd), on(node, "animationend", handleAnimationEnd));
85
+ styles = getComputedStyle(ref.current);
86
+ return executeCallbacks(on(ref.current, "animationstart", handleAnimationStart), on(ref.current, "animationcancel", handleAnimationEnd), on(ref.current, "animationend", handleAnimationEnd));
104
87
  });
105
88
  const isPresentDerived = $derived(["mounted", "unmountSuspended"].includes(state.current));
106
89
  return {
@@ -11,6 +11,7 @@
11
11
  id,
12
12
  children,
13
13
  enabled,
14
+ ref,
14
15
  }: TextSelectionLayerImplProps = $props();
15
16
 
16
17
  useTextSelectionLayer({
@@ -18,6 +19,7 @@
18
19
  onPointerDown: box.with(() => onPointerDown),
19
20
  onPointerUp: box.with(() => onPointerUp),
20
21
  enabled: box.with(() => enabled && preventOverflowTextSelection),
22
+ ref,
21
23
  });
22
24
  </script>
23
25
 
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from "svelte";
2
+ import type { ReadableBox } from "svelte-toolbelt";
2
3
  export type PointerHandler = (e: PointerEvent) => void;
3
4
  export type TextSelectionLayerProps = {
4
5
  /**
@@ -28,4 +29,5 @@ export type TextSelectionLayerImplProps = {
28
29
  * Callback fired when pointerup event triggers.
29
30
  */
30
31
  onPointerUp?: PointerHandler;
32
+ ref: ReadableBox<HTMLElement | null>;
31
33
  } & TextSelectionLayerProps;
@@ -1,6 +1,8 @@
1
1
  import type { TextSelectionLayerImplProps } from "./types.js";
2
2
  import type { ReadableBoxedValues } from "../../../internal/box.svelte.js";
3
- type TextSelectionLayerStateProps = ReadableBoxedValues<Required<Omit<TextSelectionLayerImplProps, "children" | "preventOverflowTextSelection">>>;
3
+ type TextSelectionLayerStateProps = ReadableBoxedValues<Required<Omit<TextSelectionLayerImplProps, "children" | "preventOverflowTextSelection" | "ref">> & {
4
+ ref: HTMLElement | null;
5
+ }>;
4
6
  export declare class TextSelectionLayerState {
5
7
  #private;
6
8
  readonly opts: TextSelectionLayerStateProps;
@@ -1,4 +1,4 @@
1
- import { box, composeHandlers, executeCallbacks, useRefById, } from "svelte-toolbelt";
1
+ import { composeHandlers, executeCallbacks } from "svelte-toolbelt";
2
2
  import { watch } from "runed";
3
3
  import { on } from "svelte/events";
4
4
  import { noop } from "../../../internal/noop.js";
@@ -8,14 +8,8 @@ globalThis.bitsTextSelectionLayers ??= new Map();
8
8
  export class TextSelectionLayerState {
9
9
  opts;
10
10
  #unsubSelectionLock = noop;
11
- #ref = box(null);
12
11
  constructor(opts) {
13
12
  this.opts = opts;
14
- useRefById({
15
- id: opts.id,
16
- ref: this.#ref,
17
- deps: () => this.opts.enabled.current,
18
- });
19
13
  let unsubEvents = noop;
20
14
  watch(() => this.opts.enabled.current, (isEnabled) => {
21
15
  if (isEnabled) {
@@ -34,7 +28,7 @@ export class TextSelectionLayerState {
34
28
  return executeCallbacks(on(document, "pointerdown", this.#pointerdown), on(document, "pointerup", composeHandlers(this.#resetSelectionLock, this.opts.onPointerUp.current)));
35
29
  }
36
30
  #pointerdown = (e) => {
37
- const node = this.#ref.current;
31
+ const node = this.opts.ref.current;
38
32
  const target = e.target;
39
33
  if (!isHTMLElement(node) || !isHTMLElement(target) || !this.opts.enabled.current)
40
34
  return;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { Accordion, AlertDialog, AspectRatio, Avatar, Button, Calendar, Checkbox, Collapsible, Combobox, Command, ContextMenu, DateField, DatePicker, DateRangeField, DateRangePicker, Dialog, DropdownMenu, Label, LinkPreview, Menubar, Meter, NavigationMenu, Pagination, PinInput, Popover, Progress, RadioGroup, RangeCalendar, ScrollArea, Select, Separator, Slider, Switch, Tabs, Toggle, ToggleGroup, Toolbar, Tooltip, Portal, IsUsingKeyboard, computeCommandScore, } from "./bits/index.js";
1
+ export { Accordion, AlertDialog, AspectRatio, Avatar, Button, Calendar, Checkbox, Collapsible, Combobox, Command, ContextMenu, DateField, DatePicker, DateRangeField, DateRangePicker, Dialog, DropdownMenu, Label, LinkPreview, Menubar, Meter, NavigationMenu, Pagination, PinInput, Popover, Progress, RadioGroup, RangeCalendar, ScrollArea, Select, Separator, Slider, Switch, Tabs, TimeField, TimeRangeField, Toggle, ToggleGroup, Toolbar, Tooltip, Portal, IsUsingKeyboard, computeCommandScore, } from "./bits/index.js";
2
2
  export * from "./shared/index.js";
3
3
  export type * from "./shared/index.js";
4
4
  export * from "./types.js";
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Accordion, AlertDialog, AspectRatio, Avatar, Button, Calendar, Checkbox, Collapsible, Combobox, Command, ContextMenu, DateField, DatePicker, DateRangeField, DateRangePicker, Dialog, DropdownMenu, Label, LinkPreview, Menubar, Meter, NavigationMenu, Pagination, PinInput, Popover, Progress, RadioGroup, RangeCalendar, ScrollArea, Select, Separator, Slider, Switch, Tabs, Toggle, ToggleGroup, Toolbar, Tooltip, Portal, IsUsingKeyboard, computeCommandScore, } from "./bits/index.js";
1
+ export { Accordion, AlertDialog, AspectRatio, Avatar, Button, Calendar, Checkbox, Collapsible, Combobox, Command, ContextMenu, DateField, DatePicker, DateRangeField, DateRangePicker, Dialog, DropdownMenu, Label, LinkPreview, Menubar, Meter, NavigationMenu, Pagination, PinInput, Popover, Progress, RadioGroup, RangeCalendar, ScrollArea, Select, Separator, Slider, Switch, Tabs, TimeField, TimeRangeField, Toggle, ToggleGroup, Toolbar, Tooltip, Portal, IsUsingKeyboard, computeCommandScore, } from "./bits/index.js";
2
2
  export * from "./shared/index.js";
3
3
  export * from "./types.js";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Creates a unique ID for a given uid and optional prefix.
3
+ *
4
+ * @param uid - the uid generated by $props.id()
5
+ * @param prefix - optional prefix to use for the id (defaults to "bits")
6
+ */
7
+ export declare function createId(uid: string): string;
8
+ export declare function createId(prefix: string, uid: string): string;
@@ -0,0 +1,5 @@
1
+ export function createId(prefixOrUid, uid) {
2
+ if (uid === undefined)
3
+ return `bits-${prefixOrUid}`;
4
+ return `bits-${prefixOrUid}-${uid}`;
5
+ }
@@ -76,4 +76,5 @@ export declare function setDescription(id: string, formatter: Formatter, value:
76
76
  * date field is unmounted.
77
77
  */
78
78
  export declare function removeDescriptionElement(id: string): void;
79
+ export declare function getDefaultHourCycle(locale: string): 12 | 24;
79
80
  export {};
@@ -1,7 +1,7 @@
1
1
  import { styleToString } from "svelte-toolbelt";
2
2
  import { getPlaceholder } from "../placeholders.js";
3
3
  import { hasTime, isZonedDateTime } from "../utils.js";
4
- import { ALL_SEGMENT_PARTS, DATE_SEGMENT_PARTS, EDITABLE_SEGMENT_PARTS, TIME_SEGMENT_PARTS, } from "./parts.js";
4
+ import { ALL_SEGMENT_PARTS, DATE_SEGMENT_PARTS, EDITABLE_SEGMENT_PARTS, EDITABLE_TIME_SEGMENT_PARTS, } from "./parts.js";
5
5
  import { getSegments } from "./segments.js";
6
6
  import { isBrowser, isNull, isNumberString } from "../../is.js";
7
7
  import { useId } from "../../use-id.js";
@@ -289,7 +289,7 @@ export function isDateAndTimeSegmentObj(obj) {
289
289
  return false;
290
290
  }
291
291
  return Object.entries(obj).every(([key, value]) => {
292
- const validKey = TIME_SEGMENT_PARTS.includes(key) ||
292
+ const validKey = EDITABLE_TIME_SEGMENT_PARTS.includes(key) ||
293
293
  DATE_SEGMENT_PARTS.includes(key);
294
294
  const validValue = key === "dayPeriod"
295
295
  ? value === "AM" || value === "PM" || value === null
@@ -376,3 +376,9 @@ export function removeDescriptionElement(id) {
376
376
  return;
377
377
  document.body.removeChild(el);
378
378
  }
379
+ export function getDefaultHourCycle(locale) {
380
+ const formatter = new Intl.DateTimeFormat(locale, { hour: "numeric" });
381
+ const parts = formatter.formatToParts(new Date("2023-01-01T13:00:00"));
382
+ const hourPart = parts.find((part) => part.type === "hour");
383
+ return hourPart?.value === "1" ? 12 : 24;
384
+ }
@@ -1,6 +1,8 @@
1
1
  export declare const DATE_SEGMENT_PARTS: readonly ["day", "month", "year"];
2
- export declare const TIME_SEGMENT_PARTS: readonly ["hour", "minute", "second", "dayPeriod"];
2
+ export declare const EDITABLE_TIME_SEGMENT_PARTS: readonly ["hour", "minute", "second", "dayPeriod"];
3
3
  export declare const NON_EDITABLE_SEGMENT_PARTS: readonly ["literal", "timeZoneName"];
4
4
  export declare const EDITABLE_SEGMENT_PARTS: readonly ["day", "month", "year", "hour", "minute", "second", "dayPeriod"];
5
5
  export declare const ALL_SEGMENT_PARTS: readonly ["day", "month", "year", "hour", "minute", "second", "dayPeriod", "literal", "timeZoneName"];
6
+ export declare const ALL_TIME_SEGMENT_PARTS: readonly ["hour", "minute", "second", "dayPeriod", "literal", "timeZoneName"];
6
7
  export declare const ALL_EXCEPT_LITERAL_PARTS: ("day" | "month" | "year" | "hour" | "minute" | "second" | "dayPeriod" | "timeZoneName")[];
8
+ export declare const ALL_TIME_EXCEPT_LITERAL_PARTS: ("hour" | "minute" | "second" | "dayPeriod" | "timeZoneName")[];
@@ -1,9 +1,17 @@
1
1
  export const DATE_SEGMENT_PARTS = ["day", "month", "year"];
2
- export const TIME_SEGMENT_PARTS = ["hour", "minute", "second", "dayPeriod"];
2
+ export const EDITABLE_TIME_SEGMENT_PARTS = ["hour", "minute", "second", "dayPeriod"];
3
3
  export const NON_EDITABLE_SEGMENT_PARTS = ["literal", "timeZoneName"];
4
- export const EDITABLE_SEGMENT_PARTS = [...DATE_SEGMENT_PARTS, ...TIME_SEGMENT_PARTS];
4
+ export const EDITABLE_SEGMENT_PARTS = [
5
+ ...DATE_SEGMENT_PARTS,
6
+ ...EDITABLE_TIME_SEGMENT_PARTS,
7
+ ];
5
8
  export const ALL_SEGMENT_PARTS = [
6
9
  ...EDITABLE_SEGMENT_PARTS,
7
10
  ...NON_EDITABLE_SEGMENT_PARTS,
8
11
  ];
12
+ export const ALL_TIME_SEGMENT_PARTS = [
13
+ ...EDITABLE_TIME_SEGMENT_PARTS,
14
+ ...NON_EDITABLE_SEGMENT_PARTS,
15
+ ];
9
16
  export const ALL_EXCEPT_LITERAL_PARTS = ALL_SEGMENT_PARTS.filter((part) => part !== "literal");
17
+ export const ALL_TIME_EXCEPT_LITERAL_PARTS = ALL_TIME_SEGMENT_PARTS.filter((part) => part !== "literal");
@@ -5,6 +5,7 @@
5
5
  * @param fieldNode - The ID of the field we're navigating within
6
6
  */
7
7
  export declare function handleSegmentNavigation(e: KeyboardEvent, fieldNode: HTMLElement | null): void;
8
+ export declare function handleTimeSegmentNavigation(e: KeyboardEvent, fieldNode: HTMLElement | null): void;
8
9
  /**
9
10
  * Retrieves the next segment in the list of segments relative to the provided node.
10
11
  *
@@ -29,11 +30,17 @@ export declare function getPrevNextSegments(startingNode: HTMLElement, fieldNode
29
30
  next: HTMLElement | null | undefined;
30
31
  prev: HTMLElement | null | undefined;
31
32
  };
33
+ export declare function getPrevNextTimeSegments(startingNode: HTMLElement, fieldNode: HTMLElement | null): {
34
+ next: HTMLElement | null | undefined;
35
+ prev: HTMLElement | null | undefined;
36
+ };
32
37
  /**
33
38
  * Shifts the focus to the next segment in the list of segments
34
39
  * within the field identified by the provided ID.
35
40
  */
36
41
  export declare function moveToNextSegment(e: KeyboardEvent, fieldNode: HTMLElement | null): void;
42
+ export declare function moveToNextTimeSegment(e: KeyboardEvent, fieldNode: HTMLElement | null): void;
43
+ export declare function moveToPrevTimeSegment(e: KeyboardEvent, fieldNode: HTMLElement | null): void;
37
44
  /**
38
45
  * Shifts the focus to the previous segment in the list of segments
39
46
  * within the field identified by the provided ID. If this is the first
@@ -45,6 +52,8 @@ export declare function isSegmentNavigationKey(key: string): boolean;
45
52
  * Retrieves all the interactive segments within the field identified by the provided ID.
46
53
  */
47
54
  export declare function getSegments(fieldNode: HTMLElement | null): HTMLElement[];
55
+ export declare function getTimeSegments(fieldNode: HTMLElement | null): HTMLElement[];
56
+ export declare function getFirstTimeSegment(fieldNode: HTMLElement | null): HTMLElement | undefined;
48
57
  /**
49
58
  * Get the first interactive segment within the field identified by the provided ID.
50
59
  */
@@ -23,6 +23,22 @@ export function handleSegmentNavigation(e, fieldNode) {
23
23
  next.focus();
24
24
  }
25
25
  }
26
+ export function handleTimeSegmentNavigation(e, fieldNode) {
27
+ const currentTarget = e.currentTarget;
28
+ if (!isHTMLElement(currentTarget))
29
+ return;
30
+ const { prev, next } = getPrevNextTimeSegments(currentTarget, fieldNode);
31
+ if (e.key === kbd.ARROW_LEFT) {
32
+ if (!prev)
33
+ return;
34
+ prev.focus();
35
+ }
36
+ else if (e.key === kbd.ARROW_RIGHT) {
37
+ if (!next)
38
+ return;
39
+ next.focus();
40
+ }
41
+ }
26
42
  /**
27
43
  * Retrieves the next segment in the list of segments relative to the provided node.
28
44
  *
@@ -70,6 +86,19 @@ export function getPrevNextSegments(startingNode, fieldNode) {
70
86
  prev: getPrevSegment(startingNode, segments),
71
87
  };
72
88
  }
89
+ export function getPrevNextTimeSegments(startingNode, fieldNode) {
90
+ const segments = getTimeSegments(fieldNode);
91
+ if (!segments.length) {
92
+ return {
93
+ next: null,
94
+ prev: null,
95
+ };
96
+ }
97
+ return {
98
+ next: getNextSegment(startingNode, segments),
99
+ prev: getPrevSegment(startingNode, segments),
100
+ };
101
+ }
73
102
  /**
74
103
  * Shifts the focus to the next segment in the list of segments
75
104
  * within the field identified by the provided ID.
@@ -83,6 +112,24 @@ export function moveToNextSegment(e, fieldNode) {
83
112
  return;
84
113
  next.focus();
85
114
  }
115
+ export function moveToNextTimeSegment(e, fieldNode) {
116
+ const node = e.currentTarget;
117
+ if (!isHTMLElement(node))
118
+ return;
119
+ const { next } = getPrevNextTimeSegments(node, fieldNode);
120
+ if (!next)
121
+ return;
122
+ next.focus();
123
+ }
124
+ export function moveToPrevTimeSegment(e, fieldNode) {
125
+ const node = e.currentTarget;
126
+ if (!isHTMLElement(node))
127
+ return;
128
+ const { prev } = getPrevNextTimeSegments(node, fieldNode);
129
+ if (!prev)
130
+ return;
131
+ prev.focus();
132
+ }
86
133
  /**
87
134
  * Shifts the focus to the previous segment in the list of segments
88
135
  * within the field identified by the provided ID. If this is the first
@@ -120,6 +167,24 @@ export function getSegments(fieldNode) {
120
167
  });
121
168
  return segments;
122
169
  }
170
+ export function getTimeSegments(fieldNode) {
171
+ if (!fieldNode)
172
+ return [];
173
+ const segments = Array.from(fieldNode.querySelectorAll("[data-segment]")).filter((el) => {
174
+ if (!isHTMLElement(el))
175
+ return false;
176
+ const segment = el.dataset.segment;
177
+ if (segment === "trigger")
178
+ return true;
179
+ if (segment === "literal")
180
+ return false;
181
+ return true;
182
+ });
183
+ return segments;
184
+ }
185
+ export function getFirstTimeSegment(fieldNode) {
186
+ return getTimeSegments(fieldNode)[0];
187
+ }
123
188
  /**
124
189
  * Get the first interactive segment within the field identified by the provided ID.
125
190
  */
@@ -0,0 +1,77 @@
1
+ import type { EditableTimeSegmentPart, HourCycle, TimeGranularity, TimeSegmentContentObj, TimeSegmentStateMap, TimeSegmentValueObj, TimeValue } from "../../../shared/date/types.js";
2
+ import { CalendarDateTime, Time, ZonedDateTime } from "@internationalized/date";
3
+ import type { TimeFormatter } from "../formatter.js";
4
+ import type { TimeSegmentPart } from "./types.js";
5
+ export declare function initializeSegmentValues(): TimeSegmentValueObj;
6
+ type SharedTimeContentProps = {
7
+ granularity: TimeGranularity;
8
+ timeRef: TimeValue;
9
+ formatter: TimeFormatter;
10
+ hideTimeZone: boolean;
11
+ hourCycle: HourCycle | undefined;
12
+ };
13
+ type CreateTimeContentObjProps = SharedTimeContentProps & {
14
+ segmentValues: TimeSegmentValueObj;
15
+ locale: string;
16
+ };
17
+ type CreateTimeContentProps = CreateTimeContentObjProps;
18
+ export declare function createTimeContent(props: CreateTimeContentProps): {
19
+ obj: TimeSegmentContentObj;
20
+ arr: {
21
+ part: TimeSegmentPart;
22
+ value: string;
23
+ }[];
24
+ };
25
+ export declare function initTimeSegmentStates(): TimeSegmentStateMap;
26
+ export declare function initTimeSegmentIds(): any;
27
+ export declare function isEditableTimeSegmentPart(part: unknown): part is EditableTimeSegmentPart;
28
+ export declare function isAnyTimeSegmentPart(part: unknown): part is TimeSegmentPart;
29
+ type GetTimeValueFromSegments<T extends TimeValue = Time> = {
30
+ segmentObj: TimeSegmentValueObj;
31
+ fieldNode: HTMLElement | null;
32
+ timeRef: T;
33
+ };
34
+ export declare function getTimeValueFromSegments<T extends TimeValue = Time>(props: GetTimeValueFromSegments<T>): T;
35
+ /**
36
+ * Check if all the segments being used have been filled.
37
+ * We use this to determine when we should set the value
38
+ * store of the date field(s).
39
+ *
40
+ * @param segmentValues - The current `SegmentValueObj`
41
+ * @param fieldNode - The id of the date field
42
+ */
43
+ export declare function areAllTimeSegmentsFilled(segmentValues: TimeSegmentValueObj, fieldNode: HTMLElement | null): boolean;
44
+ /**
45
+ * Infer the granularity to use based on the
46
+ * value and granularity props.
47
+ */
48
+ export declare function inferTimeGranularity(granularity: TimeGranularity | undefined): TimeGranularity;
49
+ /**
50
+ * Determines if the element with the provided id is the first focusable
51
+ * segment in the date field with the provided fieldId.
52
+ *
53
+ * @param id - The id of the element to check if it's the first segment
54
+ * @param fieldNode - The id of the date field associated with the segment
55
+ */
56
+ export declare function isFirstTimeSegment(id: string, fieldNode: HTMLElement | null): boolean;
57
+ /**
58
+ * Creates or updates a description element for a date field
59
+ * which enables screen readers to read the date field's value.
60
+ *
61
+ * This element is hidden from view, and is portalled to the body
62
+ * so it can be associated via `aria-describedby` and read by
63
+ * screen readers as the user interacts with the date field.
64
+ */
65
+ export declare function setTimeDescription(id: string, formatter: TimeFormatter, value: TimeValue): void;
66
+ /**
67
+ * Removes the description element for the date field with
68
+ * the provided ID. This function should be called when the
69
+ * date field is unmounted.
70
+ */
71
+ export declare function removeTimeDescriptionElement(id: string): void;
72
+ export declare function convertTimeValueToDateValue(time: TimeValue): CalendarDateTime | ZonedDateTime;
73
+ export declare function convertTimeValueToTime(time: TimeValue): Time;
74
+ export declare function isTimeBefore(timeToCompare: Time, referenceTime: Time): boolean;
75
+ export declare function isTimeAfter(timeToCompare: Time, referenceTime: Time): boolean;
76
+ export declare function getISOTimeValue(time: TimeValue): string;
77
+ export {};