@vizejs/composable 0.426.3 → 0.428.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 (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,197 @@
1
+ import { computed, shallowRef } from "vue";
2
+ import type { ComputedRef } from "vue";
3
+
4
+ /** What happens when an item arrives while a bounded queue is full. */
5
+ export type QueueOverflowPolicy = "drop-oldest" | "reject";
6
+
7
+ /** Options for {@link useQueue}. */
8
+ export interface UseQueueOptions {
9
+ /**
10
+ * Maximum number of queued items. A positive integer, or
11
+ * `Number.POSITIVE_INFINITY` for an unbounded queue.
12
+ *
13
+ * @default Number.POSITIVE_INFINITY
14
+ */
15
+ readonly capacity?: number;
16
+
17
+ /**
18
+ * Policy applied when an item arrives at capacity: `"drop-oldest"` evicts
19
+ * the head to make room, `"reject"` refuses the new item.
20
+ *
21
+ * @default "drop-oldest"
22
+ */
23
+ readonly overflow?: QueueOverflowPolicy;
24
+ }
25
+
26
+ /** Reactive first-in, first-out queue returned by {@link useQueue}. */
27
+ export interface QueueControls<Item> {
28
+ /** Snapshot of the queued items, head first. Recomputed after every change. */
29
+ readonly items: ComputedRef<readonly Item[]>;
30
+
31
+ /** Number of queued items. */
32
+ readonly size: ComputedRef<number>;
33
+
34
+ /** Whether the queue holds no items. */
35
+ readonly isEmpty: ComputedRef<boolean>;
36
+
37
+ /**
38
+ * Read the head without removing it. Reactive when read inside an effect.
39
+ *
40
+ * @returns The head item, or `undefined` when empty.
41
+ */
42
+ readonly peek: () => Item | undefined;
43
+
44
+ /**
45
+ * Append items at the tail in argument order, applying the overflow policy.
46
+ *
47
+ * @param items Items to append.
48
+ * @returns How many of the given items were accepted.
49
+ */
50
+ readonly enqueue: (...items: Item[]) => number;
51
+
52
+ /**
53
+ * Remove and return the head.
54
+ *
55
+ * @returns The removed item, or `undefined` when empty.
56
+ */
57
+ readonly dequeue: () => Item | undefined;
58
+
59
+ /**
60
+ * Remove and return every queued item, head first.
61
+ *
62
+ * @returns The removed items.
63
+ */
64
+ readonly drain: () => Item[];
65
+
66
+ /** Remove every item. */
67
+ readonly clear: () => void;
68
+ }
69
+
70
+ /** Compact the backing buffer once this many dequeued slots accumulate. */
71
+ const COMPACT_THRESHOLD = 32;
72
+
73
+ function validateCapacity(capacity: number): number {
74
+ if (capacity === Number.POSITIVE_INFINITY) return capacity;
75
+ if (!Number.isSafeInteger(capacity) || capacity < 1) {
76
+ throw new RangeError(
77
+ `[VIZE_COMPOSE_QUEUE_INVALID_CAPACITY] capacity must be a positive integer or Infinity; received ${String(capacity)}`,
78
+ );
79
+ }
80
+ return capacity;
81
+ }
82
+
83
+ /**
84
+ * Create a typed reactive FIFO queue.
85
+ *
86
+ * Dequeueing is amortized O(1): the head advances through a backing buffer
87
+ * that is compacted only after enough slots have been consumed, so large
88
+ * queues never pay for `Array.prototype.shift`. Reactivity is driven by a
89
+ * single version counter; `items`, `size`, `isEmpty`, and `peek` all
90
+ * re-evaluate after each mutation.
91
+ *
92
+ * Purely synchronous state: safe during server rendering (no host globals,
93
+ * no timers) and nothing to dispose.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const jobs = useQueue<string>([], { capacity: 100, overflow: "reject" });
98
+ * jobs.enqueue("a", "b");
99
+ * jobs.dequeue(); // "a"
100
+ * ```
101
+ *
102
+ * @typeParam Item Queued item type, inferred from `initial` when given.
103
+ * @param initial Items enqueued at creation, head first (overflow applies).
104
+ * @param options Capacity and overflow policy.
105
+ * @default initial []
106
+ * @default options {}
107
+ * @throws {RangeError} `[VIZE_COMPOSE_QUEUE_INVALID_CAPACITY]` when `capacity`
108
+ * is not a positive integer or `Infinity`.
109
+ * @returns The reactive queue and its controls.
110
+ */
111
+ export function useQueue<Item>(
112
+ initial: Iterable<Item> = [],
113
+ options: UseQueueOptions = {},
114
+ ): QueueControls<Item> {
115
+ const capacity = validateCapacity(options.capacity ?? Number.POSITIVE_INFINITY);
116
+ const overflow = options.overflow ?? "drop-oldest";
117
+ let buffer: Item[] = [];
118
+ let head = 0;
119
+ const version = shallowRef(0);
120
+ const touch = (): void => {
121
+ version.value += 1;
122
+ };
123
+ const length = (): number => buffer.length - head;
124
+
125
+ const compact = (): void => {
126
+ if (head >= COMPACT_THRESHOLD && head * 2 >= buffer.length) {
127
+ buffer = buffer.slice(head);
128
+ head = 0;
129
+ }
130
+ };
131
+
132
+ const append = (items: readonly Item[]): number => {
133
+ let accepted = 0;
134
+ for (const item of items) {
135
+ if (length() >= capacity) {
136
+ if (overflow === "reject") continue;
137
+ head += 1;
138
+ }
139
+ buffer.push(item);
140
+ accepted += 1;
141
+ }
142
+ compact();
143
+ return accepted;
144
+ };
145
+
146
+ append([...initial]);
147
+
148
+ const items = computed<readonly Item[]>(() => {
149
+ void version.value;
150
+ return buffer.slice(head);
151
+ });
152
+ const size = computed(() => {
153
+ void version.value;
154
+ return length();
155
+ });
156
+
157
+ return {
158
+ items,
159
+ size,
160
+ isEmpty: computed(() => size.value === 0),
161
+ peek: () => {
162
+ void version.value;
163
+ return length() > 0 ? buffer[head] : undefined;
164
+ },
165
+ enqueue: (...added) => {
166
+ const accepted = append(added);
167
+ if (accepted > 0) touch();
168
+ return accepted;
169
+ },
170
+ dequeue: () => {
171
+ if (length() === 0) return undefined;
172
+ const item = buffer[head];
173
+ head += 1;
174
+ if (head === buffer.length) {
175
+ buffer = [];
176
+ head = 0;
177
+ } else {
178
+ compact();
179
+ }
180
+ touch();
181
+ return item;
182
+ },
183
+ drain: () => {
184
+ const drained = buffer.slice(head);
185
+ buffer = [];
186
+ head = 0;
187
+ if (drained.length > 0) touch();
188
+ return drained;
189
+ },
190
+ clear: () => {
191
+ if (length() === 0) return;
192
+ buffer = [];
193
+ head = 0;
194
+ touch();
195
+ },
196
+ };
197
+ }
@@ -0,0 +1,176 @@
1
+ import { shallowRef, toValue } from "vue";
2
+ import type { MaybeRefOrGetter } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+ import type { PausableControls } from "./use-interval.ts";
6
+
7
+ /**
8
+ * Animation-frame host used by {@link useRafFn}.
9
+ *
10
+ * Implement this interface to drive frames from a deterministic test clock,
11
+ * a native display link, or an offscreen renderer.
12
+ */
13
+ export interface FrameScheduler {
14
+ /** Requests one frame callback and returns its opaque cancellation handle. */
15
+ readonly requestAnimationFrame: (callback: (timestamp: number) => void) => unknown;
16
+
17
+ /** Cancels a handle previously returned by {@link FrameScheduler.requestAnimationFrame}. */
18
+ readonly cancelAnimationFrame: (handle: unknown) => void;
19
+ }
20
+
21
+ /** Timing information passed to every {@link useRafFn} callback. */
22
+ export interface RafFrame {
23
+ /** Milliseconds since the previous delivered frame (`0` for the first). */
24
+ readonly delta: number;
25
+
26
+ /** High-resolution frame timestamp supplied by the host. */
27
+ readonly timestamp: number;
28
+ }
29
+
30
+ /** Options for {@link useRafFn}. */
31
+ export interface UseRafFnOptions {
32
+ /**
33
+ * Start the frame loop as soon as the composable is created.
34
+ *
35
+ * @default true
36
+ */
37
+ readonly immediate?: boolean;
38
+
39
+ /**
40
+ * Maximum callback rate in frames per second. Frames arriving sooner than
41
+ * `1000 / fpsLimit` ms after the last delivered frame are skipped.
42
+ * `undefined` delivers every frame. Reactive.
43
+ *
44
+ * @default undefined
45
+ */
46
+ readonly fpsLimit?: MaybeRefOrGetter<number | undefined>;
47
+
48
+ /**
49
+ * Deliver a single frame and then pause.
50
+ *
51
+ * @default false
52
+ */
53
+ readonly once?: boolean;
54
+
55
+ /**
56
+ * Requests frames when no browser `window` is available, for example from
57
+ * a native or offscreen frame host passed as `scheduler`.
58
+ *
59
+ * @default false
60
+ */
61
+ readonly runOnServer?: boolean;
62
+
63
+ /**
64
+ * Frame host. When omitted, `globalThis.requestAnimationFrame` is used if
65
+ * it exists; without one (server rendering, workers without frames) the
66
+ * loop only tracks its requested state.
67
+ *
68
+ * @default globalThis animation-frame functions when available
69
+ */
70
+ readonly scheduler?: FrameScheduler;
71
+ }
72
+
73
+ function resolveHost(scheduler: FrameScheduler | undefined): FrameScheduler | undefined {
74
+ if (scheduler !== undefined) return scheduler;
75
+ if (typeof globalThis.requestAnimationFrame !== "function") return undefined;
76
+ return {
77
+ requestAnimationFrame: (callback) => globalThis.requestAnimationFrame(callback),
78
+ cancelAnimationFrame: (handle) => {
79
+ globalThis.cancelAnimationFrame(handle as number);
80
+ },
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Run a callback on every animation frame, with pause/resume controls and an
86
+ * optional frame-rate cap.
87
+ *
88
+ * The host is resolved lazily on `resume()`, so importing and calling this
89
+ * during server rendering is safe: without a browser `window` (and without
90
+ * {@link UseRafFnOptions.runOnServer}), or without any frame host,
91
+ * `isActive` reports the requested state and no callbacks run, matching the
92
+ * client's initial render. The pending frame is cancelled when the owning reactive scope
93
+ * stops.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * const { pause } = useRafFn(({ delta }) => step(delta), { fpsLimit: 30 });
98
+ * ```
99
+ *
100
+ * @param callback Invoked with frame timing for every delivered frame.
101
+ * @param options Start, rate-limit, and host policy.
102
+ * @default options {}
103
+ * @throws `RangeError` tagged `VIZE_COMPOSE_RAF_INVALID_FPS_LIMIT` when a
104
+ * resolved `fpsLimit` is not finite and greater than zero.
105
+ * @returns Pause/resume controls.
106
+ */
107
+ export function useRafFn(
108
+ callback: (frame: RafFrame) => void,
109
+ options: UseRafFnOptions = {},
110
+ ): PausableControls {
111
+ const isActive = shallowRef(false);
112
+ let host: FrameScheduler | undefined;
113
+ let handle: unknown;
114
+ let requested = false;
115
+ let previous: number | undefined;
116
+
117
+ const readInterval = (): number => {
118
+ const limit = toValue(options.fpsLimit);
119
+ if (limit === undefined) return 0;
120
+ if (!Number.isFinite(limit) || limit <= 0) {
121
+ throw new RangeError(
122
+ `[VIZE_COMPOSE_RAF_INVALID_FPS_LIMIT] fpsLimit must be finite and greater than zero; received ${String(limit)}`,
123
+ );
124
+ }
125
+ return 1_000 / limit;
126
+ };
127
+
128
+ readInterval();
129
+
130
+ const request = (): void => {
131
+ if (host === undefined) return;
132
+ requested = true;
133
+ handle = host.requestAnimationFrame(loop);
134
+ };
135
+
136
+ function loop(timestamp: number): void {
137
+ requested = false;
138
+ if (!isActive.value) return;
139
+ previous ??= timestamp;
140
+ const delta = timestamp - previous;
141
+ const interval = readInterval();
142
+ if (interval > 0 && delta > 0 && delta < interval) {
143
+ request();
144
+ return;
145
+ }
146
+ previous = timestamp;
147
+ callback({ delta, timestamp });
148
+ if (options.once ?? false) {
149
+ pause();
150
+ return;
151
+ }
152
+ request();
153
+ }
154
+
155
+ const pause = (): void => {
156
+ isActive.value = false;
157
+ if (requested && host !== undefined) host.cancelAnimationFrame(handle);
158
+ requested = false;
159
+ handle = undefined;
160
+ };
161
+
162
+ const resume = (): void => {
163
+ if (isActive.value) return;
164
+ isActive.value = true;
165
+ previous = undefined;
166
+ if (typeof window === "undefined" && !(options.runOnServer ?? false)) return;
167
+ host ??= resolveHost(options.scheduler);
168
+ request();
169
+ };
170
+
171
+ if (options.immediate ?? true) resume();
172
+
173
+ tryOnScopeDispose(pause);
174
+
175
+ return { isActive, pause, resume };
176
+ }
@@ -0,0 +1,201 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ import { useLocale } from "./locale.ts";
5
+
6
+ /** Units selected by {@link selectRelativeTimeUnit}. */
7
+ export type RelativeTimeUnitSelection =
8
+ | "second"
9
+ | "minute"
10
+ | "hour"
11
+ | "day"
12
+ | "week"
13
+ | "month"
14
+ | "year";
15
+
16
+ /** A signed amount in one relative-time unit. */
17
+ export interface RelativeTimeValue {
18
+ /** Signed, rounded amount; negative values are in the past. */
19
+ readonly value: number;
20
+
21
+ /** Unit the amount is expressed in. */
22
+ readonly unit: RelativeTimeUnitSelection;
23
+ }
24
+
25
+ /** Options for {@link useRelativeTimeFormat}. */
26
+ export interface UseRelativeTimeFormatOptions extends Intl.RelativeTimeFormatOptions {
27
+ /**
28
+ * Locale used for formatting. Pass it explicitly for hydration-stable
29
+ * server rendering.
30
+ *
31
+ * @default the browser language, otherwise "en"
32
+ */
33
+ readonly locale?: string | Intl.Locale;
34
+ }
35
+
36
+ /** Options for {@link RelativeTimeFormatControls.formatFrom}. */
37
+ export interface RelativeTimeFromOptions {
38
+ /**
39
+ * Reference time in Unix milliseconds. Pass it explicitly to keep server
40
+ * and client output identical.
41
+ *
42
+ * @default Date.now()
43
+ */
44
+ readonly now?: number;
45
+ }
46
+
47
+ /** Reactive relative-time formatting returned by {@link useRelativeTimeFormat}. */
48
+ export interface RelativeTimeFormatControls {
49
+ /** Canonical locale in use. */
50
+ readonly locale: ComputedRef<string>;
51
+
52
+ /** Cached formatter for the current locale and options. */
53
+ readonly formatter: ComputedRef<Intl.RelativeTimeFormat>;
54
+
55
+ /** Formatted `value` in `unit`, or `""` while either is missing. */
56
+ readonly formatted: ComputedRef<string>;
57
+
58
+ /**
59
+ * Format an amount in a unit.
60
+ *
61
+ * @param value Signed amount; negative is in the past.
62
+ * @param unit Relative-time unit.
63
+ * @returns The formatted string.
64
+ */
65
+ readonly format: (value: number, unit: Intl.RelativeTimeFormatUnit) => string;
66
+
67
+ /**
68
+ * Format an amount in a unit into parts.
69
+ *
70
+ * @param value Signed amount.
71
+ * @param unit Relative-time unit.
72
+ * @returns The formatted parts.
73
+ */
74
+ readonly formatToParts: (
75
+ value: number,
76
+ unit: Intl.RelativeTimeFormatUnit,
77
+ ) => Intl.RelativeTimeFormatPart[];
78
+
79
+ /**
80
+ * Format a signed millisecond difference using the best-fitting unit
81
+ * (see {@link selectRelativeTimeUnit}).
82
+ *
83
+ * @param diffMs Signed difference; negative is in the past.
84
+ * @returns The formatted string.
85
+ */
86
+ readonly formatDiff: (diffMs: number) => string;
87
+
88
+ /**
89
+ * Format a date relative to a reference time using the best-fitting unit.
90
+ *
91
+ * @param date Date or Unix milliseconds.
92
+ * @param options Reference time.
93
+ * @default options {}
94
+ * @returns The formatted string.
95
+ */
96
+ readonly formatFrom: (date: Date | number, options?: RelativeTimeFromOptions) => string;
97
+ }
98
+
99
+ // Literal millisecond values keep module evaluation free of computation, so
100
+ // bundlers can drop this module entirely when it is unused.
101
+ const SECOND = 1000;
102
+ const MINUTE = 60_000;
103
+ const HOUR = 3_600_000;
104
+ const DAY = 86_400_000;
105
+ const WEEK = 604_800_000;
106
+ /** Gregorian average month: 30.436875 days. */
107
+ const MONTH = 2_629_746_000;
108
+ /** Gregorian average year: 365.2425 days. */
109
+ const YEAR = 31_556_952_000;
110
+
111
+ const thresholds: readonly (readonly [number, number, RelativeTimeUnitSelection])[] = [
112
+ [MINUTE, SECOND, "second"],
113
+ [HOUR, MINUTE, "minute"],
114
+ [DAY, HOUR, "hour"],
115
+ [WEEK, DAY, "day"],
116
+ [MONTH, WEEK, "week"],
117
+ [YEAR, MONTH, "month"],
118
+ ];
119
+
120
+ /**
121
+ * Pick the largest unit that expresses a millisecond difference as a
122
+ * non-zero rounded amount: seconds below a minute, minutes below an hour,
123
+ * hours below a day, days below a week, weeks below a month, months below
124
+ * a year, and years otherwise (Gregorian average month/year lengths).
125
+ *
126
+ * @param diffMs Signed difference; negative is in the past.
127
+ * @returns The rounded amount and its unit.
128
+ * @throws {RangeError} `[VIZE_COMPOSE_RELATIVE_TIME_INVALID_DIFF]` for a
129
+ * non-finite difference.
130
+ */
131
+ export function selectRelativeTimeUnit(diffMs: number): RelativeTimeValue {
132
+ if (!Number.isFinite(diffMs)) {
133
+ throw new RangeError(
134
+ `[VIZE_COMPOSE_RELATIVE_TIME_INVALID_DIFF] the difference must be finite; received ${String(diffMs)}`,
135
+ );
136
+ }
137
+ const magnitude = Math.abs(diffMs);
138
+ for (const [limit, size, unit] of thresholds) {
139
+ if (magnitude < limit) return { value: Math.round(diffMs / size) + 0, unit };
140
+ }
141
+ return { value: Math.round(diffMs / YEAR) + 0, unit: "year" };
142
+ }
143
+
144
+ function browserLanguage(): string | undefined {
145
+ return typeof window === "undefined" ? undefined : window.navigator.language;
146
+ }
147
+
148
+ /**
149
+ * Format relative times ("in 3 days", "yesterday") with `Intl.RelativeTimeFormat`.
150
+ *
151
+ * A pure formatting wrapper: it owns no clock or timer, so it never
152
+ * re-renders on its own and stays deterministic during server rendering
153
+ * (pair it with a clock composable for live "time ago" labels). The
154
+ * formatter follows the reactive options and is cached per locale and
155
+ * option set through {@link useLocale}; invalid options surface as the
156
+ * platform's `RangeError`.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * const { formatted } = useRelativeTimeFormat(-1, "day", { locale: "en", numeric: "auto" });
161
+ * formatted.value; // "yesterday"
162
+ * ```
163
+ *
164
+ * @param value Reactive signed amount; `null`/`undefined` format as `""`.
165
+ * @param unit Reactive unit.
166
+ * @param options Reactive locale and `Intl.RelativeTimeFormat` options.
167
+ * @default options {}
168
+ * @returns Reactive formatted output and formatting helpers.
169
+ */
170
+ export function useRelativeTimeFormat(
171
+ value: MaybeRefOrGetter<number | null | undefined>,
172
+ unit: MaybeRefOrGetter<Intl.RelativeTimeFormatUnit>,
173
+ options: MaybeRefOrGetter<UseRelativeTimeFormatOptions> = {},
174
+ ): RelativeTimeFormatControls {
175
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
176
+ const formatter = computed(() => {
177
+ const { locale: _locale, ...formatOptions } = toValue(options);
178
+ return localeControls.relativeTime(formatOptions);
179
+ });
180
+ const formatDiff = (diffMs: number): string => {
181
+ const selected = selectRelativeTimeUnit(diffMs);
182
+ return formatter.value.format(selected.value, selected.unit);
183
+ };
184
+ return {
185
+ locale: localeControls.locale,
186
+ formatter,
187
+ formatted: computed(() => {
188
+ const current = toValue(value);
189
+ return current === null || current === undefined
190
+ ? ""
191
+ : formatter.value.format(current, toValue(unit));
192
+ }),
193
+ format: (amount, amountUnit) => formatter.value.format(amount, amountUnit),
194
+ formatToParts: (amount, amountUnit) => formatter.value.formatToParts(amount, amountUnit),
195
+ formatDiff,
196
+ formatFrom: (date, fromOptions = {}) => {
197
+ const time = date instanceof Date ? date.getTime() : date;
198
+ return formatDiff(time - (fromOptions.now ?? Date.now()));
199
+ },
200
+ };
201
+ }