@vizejs/composable 0.426.2 → 0.427.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,285 @@
1
+ import { computed, readonly, ref, shallowRef, toValue, unref } from "vue";
2
+ import type { ComputedRef, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Notification permission, plus `"unsupported"` when the API is missing. */
7
+ export type NotificationPermissionState = "default" | "granted" | "denied" | "unsupported";
8
+
9
+ /** Options accepted by the `Notification` constructor. */
10
+ export interface NotificationOptionsLike<Data> {
11
+ /** Body text. */
12
+ readonly body?: string;
13
+
14
+ /** Icon URL. */
15
+ readonly icon?: string;
16
+
17
+ /** Monochrome badge URL for constrained surfaces. */
18
+ readonly badge?: string;
19
+
20
+ /** Grouping tag; a new notification with the same tag replaces the old one. */
21
+ readonly tag?: string;
22
+
23
+ /** BCP 47 language tag. */
24
+ readonly lang?: string;
25
+
26
+ /** Text direction. */
27
+ readonly dir?: "auto" | "ltr" | "rtl";
28
+
29
+ /** Keep the notification visible until the user interacts with it. */
30
+ readonly requireInteraction?: boolean;
31
+
32
+ /** Suppress sounds and vibration. */
33
+ readonly silent?: boolean | null;
34
+
35
+ /** Application data attached to the notification. */
36
+ readonly data?: Data;
37
+ }
38
+
39
+ /** Minimal `Notification` instance consumed by {@link useWebNotification}. */
40
+ export interface NotificationLike extends EventTarget {
41
+ /** Dismiss the notification. */
42
+ close(): void;
43
+ }
44
+
45
+ /** Minimal `Notification` constructor (with its static members). */
46
+ export interface NotificationHost {
47
+ /** Current permission. */
48
+ readonly permission: string;
49
+
50
+ /** Ask the user for permission. */
51
+ requestPermission(): Promise<string>;
52
+
53
+ /** Show a notification. */
54
+ new (title: string, options?: NotificationOptionsLike<unknown>): NotificationLike;
55
+ }
56
+
57
+ /** Default notification content for {@link useWebNotification}. */
58
+ export interface WebNotificationDefaults<Data> extends NotificationOptionsLike<Data> {
59
+ /** Default title. */
60
+ readonly title?: string;
61
+ }
62
+
63
+ /** Options for {@link useWebNotification}. */
64
+ export interface UseWebNotificationOptions<Data> {
65
+ /**
66
+ * Notification constructor for alternate runtimes and tests. A ref (not a
67
+ * getter) because the host itself is a constructor function.
68
+ *
69
+ * @default window.Notification when it exists
70
+ */
71
+ readonly host?: MaybeRef<NotificationHost | null | undefined>;
72
+
73
+ /**
74
+ * Reactive default title and options merged into every `show` call.
75
+ *
76
+ * @default {}
77
+ */
78
+ readonly defaults?: MaybeRefOrGetter<WebNotificationDefaults<Data>>;
79
+
80
+ /**
81
+ * Request permission from `show` when it has not been decided yet.
82
+ *
83
+ * @default true
84
+ */
85
+ readonly requestPermissionOnShow?: boolean;
86
+ }
87
+
88
+ /** Discriminated outcome of {@link WebNotificationControls.show}. */
89
+ export type WebNotificationResult =
90
+ | {
91
+ /** The notification is showing. */
92
+ readonly status: "shown";
93
+ /** The shown notification. */
94
+ readonly notification: NotificationLike;
95
+ }
96
+ | {
97
+ /** Permission is not granted, the API is missing, or construction failed. */
98
+ readonly status: "denied" | "unsupported" | "failed";
99
+ /** Exact error thrown by the host, when one was thrown. */
100
+ readonly error: unknown;
101
+ };
102
+
103
+ /** Notification lifecycle events exposed by {@link useWebNotification}. */
104
+ export type WebNotificationEvent = "click" | "show" | "error" | "close";
105
+
106
+ /** Reactive state and actions returned by {@link useWebNotification}. */
107
+ export interface WebNotificationControls<Data> {
108
+ /** Whether the Notifications API is available. */
109
+ readonly supported: ComputedRef<boolean>;
110
+
111
+ /** Current permission state. */
112
+ readonly permission: Readonly<Ref<NotificationPermissionState>>;
113
+
114
+ /** Most recently shown notification, cleared when it closes. */
115
+ readonly notification: Readonly<ShallowRef<NotificationLike | undefined>>;
116
+
117
+ /** Data attached to the current notification. */
118
+ readonly data: Readonly<ShallowRef<Data | undefined>>;
119
+
120
+ /**
121
+ * Ask the user for permission.
122
+ *
123
+ * @returns The resulting permission state.
124
+ */
125
+ readonly requestPermission: () => Promise<NotificationPermissionState>;
126
+
127
+ /**
128
+ * Show a notification, replacing the current one.
129
+ *
130
+ * @param title Title overriding the default.
131
+ * @param options Options merged over the defaults.
132
+ * @returns The discriminated outcome; never rejects.
133
+ */
134
+ readonly show: (
135
+ title?: string,
136
+ options?: NotificationOptionsLike<Data>,
137
+ ) => Promise<WebNotificationResult>;
138
+
139
+ /** Close the current notification. */
140
+ readonly close: () => void;
141
+
142
+ /**
143
+ * Subscribe to an event of every notification shown by this composable.
144
+ *
145
+ * @param event Lifecycle event.
146
+ * @param handler Called with the native event and its notification.
147
+ * @returns Unsubscribe function.
148
+ */
149
+ readonly on: (
150
+ event: WebNotificationEvent,
151
+ handler: (event: Event, notification: NotificationLike) => void,
152
+ ) => () => void;
153
+ }
154
+
155
+ function browserNotificationHost(): NotificationHost | undefined {
156
+ if (typeof window === "undefined") return undefined;
157
+ return "Notification" in window ? window.Notification : undefined;
158
+ }
159
+
160
+ function normalizePermission(permission: string): NotificationPermissionState {
161
+ return permission === "granted" || permission === "denied" ? permission : "default";
162
+ }
163
+
164
+ const notificationEvents: readonly WebNotificationEvent[] = ["click", "show", "error", "close"];
165
+
166
+ /**
167
+ * Show typed Web Notifications with permission handling.
168
+ *
169
+ * `show` merges reactive defaults with per-call options, asks for
170
+ * permission first when it is still undecided (configurable), and resolves
171
+ * to a discriminated {@link WebNotificationResult}. Handlers registered with
172
+ * `on` apply to every notification this composable shows. The current
173
+ * notification is closed when the owning reactive scope stops.
174
+ *
175
+ * Server rendering: the API is never touched; `permission` is
176
+ * `"unsupported"` and `supported` is false.
177
+ *
178
+ * @example
179
+ * ```ts
180
+ * const notify = useWebNotification<{ id: string }>({ defaults: { icon: "/icon.png" } });
181
+ * notify.on("click", () => window.focus());
182
+ * await notify.show("Build finished", { data: { id: "42" } });
183
+ * ```
184
+ *
185
+ * @typeParam Data Application data attached to notifications.
186
+ * @param options Capability, defaults, and permission policy.
187
+ * @default options {}
188
+ * @returns Notification state and actions.
189
+ */
190
+ export function useWebNotification<Data = unknown>(
191
+ options: UseWebNotificationOptions<Data> = {},
192
+ ): WebNotificationControls<Data> {
193
+ const resolveHost = (): NotificationHost | undefined =>
194
+ options.host === undefined ? browserNotificationHost() : (unref(options.host) ?? undefined);
195
+ const readPermission = (): NotificationPermissionState => {
196
+ const host = resolveHost();
197
+ return host ? normalizePermission(host.permission) : "unsupported";
198
+ };
199
+ const permission = ref<NotificationPermissionState>(readPermission());
200
+ const notification = shallowRef<NotificationLike | undefined>(undefined);
201
+ const data = shallowRef<Data | undefined>(undefined);
202
+ const handlers = new Map<
203
+ WebNotificationEvent,
204
+ Set<(event: Event, notification: NotificationLike) => void>
205
+ >();
206
+
207
+ const requestPermission = async (): Promise<NotificationPermissionState> => {
208
+ const host = resolveHost();
209
+ if (!host) return (permission.value = "unsupported");
210
+ try {
211
+ permission.value = normalizePermission(await host.requestPermission());
212
+ } catch {
213
+ permission.value = readPermission();
214
+ }
215
+ return permission.value;
216
+ };
217
+
218
+ const close = (): void => {
219
+ notification.value?.close();
220
+ notification.value = undefined;
221
+ data.value = undefined;
222
+ };
223
+
224
+ const show = async (
225
+ title?: string,
226
+ overrides?: NotificationOptionsLike<Data>,
227
+ ): Promise<WebNotificationResult> => {
228
+ const host = resolveHost();
229
+ if (!host) return { status: "unsupported", error: undefined };
230
+ permission.value = readPermission();
231
+ if (permission.value === "default" && (options.requestPermissionOnShow ?? true)) {
232
+ await requestPermission();
233
+ }
234
+ if (permission.value !== "granted") return { status: "denied", error: undefined };
235
+ const { title: defaultTitle = "", ...defaults } = toValue(options.defaults) ?? {};
236
+ const merged: NotificationOptionsLike<Data> = { ...defaults, ...overrides };
237
+ let created: NotificationLike;
238
+ try {
239
+ created = new host(title ?? defaultTitle, merged);
240
+ } catch (error) {
241
+ return { status: "failed", error };
242
+ }
243
+ close();
244
+ notification.value = created;
245
+ data.value = merged.data;
246
+ for (const event of notificationEvents) {
247
+ created.addEventListener(event, (nativeEvent) => {
248
+ for (const handler of handlers.get(event) ?? []) handler(nativeEvent, created);
249
+ if (event === "close" && notification.value === created) {
250
+ notification.value = undefined;
251
+ data.value = undefined;
252
+ }
253
+ });
254
+ }
255
+ return { status: "shown", notification: created };
256
+ };
257
+
258
+ const on = (
259
+ event: WebNotificationEvent,
260
+ handler: (event: Event, notification: NotificationLike) => void,
261
+ ): (() => void) => {
262
+ let set = handlers.get(event);
263
+ if (!set) handlers.set(event, (set = new Set()));
264
+ set.add(handler);
265
+ return () => {
266
+ set.delete(handler);
267
+ };
268
+ };
269
+
270
+ tryOnScopeDispose(() => {
271
+ close();
272
+ handlers.clear();
273
+ });
274
+
275
+ return {
276
+ supported: computed(() => resolveHost() !== undefined),
277
+ permission: readonly(permission),
278
+ notification,
279
+ data,
280
+ requestPermission,
281
+ show,
282
+ close,
283
+ on,
284
+ };
285
+ }
@@ -0,0 +1,194 @@
1
+ import { computed, shallowRef } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
3
+
4
+ import { useIntervalFn } from "./use-interval.ts";
5
+ import type { IntervalScheduler, PausableControls } from "./use-interval.ts";
6
+ import { useRafFn } from "./use-raf-fn.ts";
7
+ import type { FrameScheduler } from "./use-raf-fn.ts";
8
+
9
+ /** Options for {@link useTimestamp}. */
10
+ export interface UseTimestampOptions<Controls extends boolean = false> {
11
+ /**
12
+ * Update cadence: a period in milliseconds (reactive), or
13
+ * `"requestAnimationFrame"` to update on every animation frame.
14
+ *
15
+ * @default 1000
16
+ */
17
+ readonly interval?: MaybeRefOrGetter<number> | "requestAnimationFrame";
18
+
19
+ /**
20
+ * Milliseconds added to every reading, for example a server clock skew.
21
+ *
22
+ * @default 0
23
+ */
24
+ readonly offset?: number;
25
+
26
+ /**
27
+ * Clock source returning Unix epoch milliseconds.
28
+ *
29
+ * @default Date.now
30
+ */
31
+ readonly now?: () => number;
32
+
33
+ /**
34
+ * Hydration-stable starting value. When set, the first reading is this
35
+ * value on both server and client instead of the live clock, and the live
36
+ * clock takes over on the first tick. Pass the server's render time here
37
+ * (for example through a payload) to avoid hydration mismatches.
38
+ *
39
+ * @default undefined (read the clock immediately)
40
+ */
41
+ readonly initial?: number;
42
+
43
+ /**
44
+ * Start updating as soon as the composable is created.
45
+ *
46
+ * @default true
47
+ */
48
+ readonly immediate?: boolean;
49
+
50
+ /**
51
+ * Starts host timers or frames when no browser `window` is available.
52
+ *
53
+ * @default false
54
+ */
55
+ readonly runOnServer?: boolean;
56
+
57
+ /**
58
+ * Repeating timer host for millisecond cadences.
59
+ *
60
+ * @default globalThis timer functions
61
+ */
62
+ readonly scheduler?: IntervalScheduler;
63
+
64
+ /**
65
+ * Frame host for the `"requestAnimationFrame"` cadence.
66
+ *
67
+ * @default globalThis animation-frame functions when available
68
+ */
69
+ readonly frameScheduler?: FrameScheduler;
70
+
71
+ /**
72
+ * Invoked after every update with the new timestamp.
73
+ *
74
+ * @default undefined
75
+ */
76
+ readonly callback?: (timestamp: number) => void;
77
+
78
+ /**
79
+ * Return the full control object instead of the bare ref.
80
+ *
81
+ * @default false
82
+ */
83
+ readonly controls?: Controls;
84
+ }
85
+
86
+ /** Options for {@link useNow}; identical to {@link UseTimestampOptions}. */
87
+ export type UseNowOptions<Controls extends boolean = false> = UseTimestampOptions<Controls>;
88
+
89
+ /** Timestamp and controls returned by `useTimestamp({ controls: true })`. */
90
+ export interface TimestampControls extends PausableControls {
91
+ /** Latest reading in Unix epoch milliseconds. */
92
+ readonly timestamp: Readonly<ShallowRef<number>>;
93
+
94
+ /**
95
+ * Read the clock immediately, store the value, and return it.
96
+ *
97
+ * @returns The new timestamp.
98
+ */
99
+ readonly refresh: () => number;
100
+ }
101
+
102
+ /** Date and controls returned by `useNow({ controls: true })`. */
103
+ export interface NowControls extends PausableControls {
104
+ /** Latest reading as a `Date`; a fresh instance per update. */
105
+ readonly now: ComputedRef<Date>;
106
+
107
+ /**
108
+ * Read the clock immediately, store the value, and return it.
109
+ *
110
+ * @returns The new date.
111
+ */
112
+ readonly refresh: () => Date;
113
+ }
114
+
115
+ function createTimestamp(options: UseTimestampOptions<boolean>): TimestampControls {
116
+ const offset = options.offset ?? 0;
117
+ const read = options.now ?? Date.now;
118
+ const timestamp = shallowRef(options.initial ?? read() + offset);
119
+
120
+ const refresh = (): number => {
121
+ timestamp.value = read() + offset;
122
+ options.callback?.(timestamp.value);
123
+ return timestamp.value;
124
+ };
125
+
126
+ const interval = options.interval ?? 1_000;
127
+ const controls =
128
+ interval === "requestAnimationFrame"
129
+ ? useRafFn(refresh, {
130
+ immediate: options.immediate ?? true,
131
+ runOnServer: options.runOnServer ?? false,
132
+ ...(options.frameScheduler === undefined ? {} : { scheduler: options.frameScheduler }),
133
+ })
134
+ : useIntervalFn(refresh, interval, {
135
+ immediate: options.immediate ?? true,
136
+ runOnServer: options.runOnServer ?? false,
137
+ ...(options.scheduler === undefined ? {} : { scheduler: options.scheduler }),
138
+ });
139
+
140
+ return { ...controls, timestamp, refresh };
141
+ }
142
+
143
+ /**
144
+ * Reactive Unix timestamp in milliseconds.
145
+ *
146
+ * Updates on a millisecond interval or every animation frame. For SSR,
147
+ * supply {@link UseTimestampOptions.initial} (or an injected `now`) so the
148
+ * server and the hydrating client render the same value; no timer runs on
149
+ * the server. Timers stop with the owning reactive scope.
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * const timestamp = useTimestamp({ interval: 250 });
154
+ * const { timestamp: t, pause } = useTimestamp({ controls: true });
155
+ * ```
156
+ *
157
+ * @param options Cadence, clock, SSR, and scheduler policy.
158
+ * @default options {}
159
+ * @throws `RangeError` for invalid millisecond cadences (see `useIntervalFn`).
160
+ * @returns The timestamp ref, or the full controls when `controls` is `true`.
161
+ */
162
+ export function useTimestamp(options?: UseTimestampOptions<false>): Readonly<ShallowRef<number>>;
163
+ export function useTimestamp(options: UseTimestampOptions<true>): TimestampControls;
164
+ export function useTimestamp(
165
+ options: UseTimestampOptions<boolean> = {},
166
+ ): Readonly<ShallowRef<number>> | TimestampControls {
167
+ const controls = createTimestamp(options);
168
+ return options.controls === true ? controls : controls.timestamp;
169
+ }
170
+
171
+ /**
172
+ * Reactive current `Date`.
173
+ *
174
+ * Same cadence, SSR, and cleanup rules as {@link useTimestamp}; the value is
175
+ * a fresh `Date` derived from the latest timestamp.
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * const now = useNow({ initial: serverRenderedAt });
180
+ * ```
181
+ *
182
+ * @param options Cadence, clock, SSR, and scheduler policy.
183
+ * @default options {}
184
+ * @throws `RangeError` for invalid millisecond cadences (see `useIntervalFn`).
185
+ * @returns The date ref, or the full controls when `controls` is `true`.
186
+ */
187
+ export function useNow(options?: UseNowOptions<false>): ComputedRef<Date>;
188
+ export function useNow(options: UseNowOptions<true>): NowControls;
189
+ export function useNow(options: UseNowOptions<boolean> = {}): ComputedRef<Date> | NowControls {
190
+ const { timestamp, refresh, ...pausable } = createTimestamp(options);
191
+ const now = computed(() => new Date(timestamp.value));
192
+ if (options.controls !== true) return now;
193
+ return { ...pausable, now, refresh: () => new Date(refresh()) };
194
+ }
@@ -0,0 +1,120 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ import { useLocale } from "./locale.ts";
5
+
6
+ /** Numeric values accepted by `Intl.NumberFormat`. */
7
+ export type FormattableNumber = number | bigint;
8
+
9
+ /** Options for {@link useNumberFormat}. */
10
+ export interface UseNumberFormatOptions extends Intl.NumberFormatOptions {
11
+ /**
12
+ * Locale used for formatting. Pass it explicitly for server rendering:
13
+ * without it the server falls back to `"en"` while the browser detects
14
+ * `navigator.language`, which can make hydration mismatch.
15
+ *
16
+ * @default the browser language, otherwise "en"
17
+ */
18
+ readonly locale?: string | Intl.Locale;
19
+ }
20
+
21
+ /** Reactive number formatting returned by {@link useNumberFormat}. */
22
+ export interface NumberFormatControls {
23
+ /** Canonical locale in use. */
24
+ readonly locale: ComputedRef<string>;
25
+
26
+ /** Cached formatter for the current locale and options. */
27
+ readonly formatter: ComputedRef<Intl.NumberFormat>;
28
+
29
+ /** Formatted `value`, or `""` while the value is `null`/`undefined`. */
30
+ readonly formatted: ComputedRef<string>;
31
+
32
+ /**
33
+ * Format any number with the current formatter.
34
+ *
35
+ * @param value Number to format.
36
+ * @returns The formatted string.
37
+ */
38
+ readonly format: (value: FormattableNumber) => string;
39
+
40
+ /**
41
+ * Format any number into locale-aware parts.
42
+ *
43
+ * @param value Number to format.
44
+ * @returns The formatted parts.
45
+ */
46
+ readonly formatToParts: (value: FormattableNumber) => Intl.NumberFormatPart[];
47
+
48
+ /**
49
+ * Format a numeric range (for example `"3–5"`).
50
+ *
51
+ * @param start Range start.
52
+ * @param end Range end.
53
+ * @returns The formatted range.
54
+ */
55
+ readonly formatRange: (start: FormattableNumber, end: FormattableNumber) => string;
56
+ }
57
+
58
+ function formatRangeWith(
59
+ formatter: Intl.NumberFormat,
60
+ start: FormattableNumber,
61
+ end: FormattableNumber,
62
+ ): string {
63
+ // `formatRange` is ES2023; older engines fall back to joining both ends.
64
+ const native: unknown = Reflect.get(formatter, "formatRange");
65
+ if (typeof native === "function") {
66
+ const result: unknown = Reflect.apply(native, formatter, [start, end]);
67
+ if (typeof result === "string") return result;
68
+ }
69
+ return `${formatter.format(start)}\u2013${formatter.format(end)}`;
70
+ }
71
+
72
+ function browserLanguage(): string | undefined {
73
+ return typeof window === "undefined" ? undefined : window.navigator.language;
74
+ }
75
+
76
+ /**
77
+ * Format numbers reactively with `Intl.NumberFormat`.
78
+ *
79
+ * The formatter follows the reactive options (including `locale`) and is
80
+ * cached per locale and option set through {@link useLocale}. Without an
81
+ * explicit locale the browser language is used, falling back to `"en"`
82
+ * (always the case on the server). Invalid options surface as the
83
+ * platform's `RangeError`/`TypeError` on first read. No listeners or timers
84
+ * are created, so nothing needs cleanup.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const price = ref(1234.5);
89
+ * const { formatted } = useNumberFormat(price, { locale: "de-DE", style: "currency", currency: "EUR" });
90
+ * formatted.value; // "1.234,50 €"
91
+ * ```
92
+ *
93
+ * @param value Reactive number; `null`/`undefined` format as `""`.
94
+ * @param options Reactive locale and `Intl.NumberFormat` options.
95
+ * @default value undefined
96
+ * @default options {}
97
+ * @returns Reactive formatted output and formatter helpers.
98
+ */
99
+ export function useNumberFormat(
100
+ value?: MaybeRefOrGetter<FormattableNumber | null | undefined>,
101
+ options: MaybeRefOrGetter<UseNumberFormatOptions> = {},
102
+ ): NumberFormatControls {
103
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
104
+ const formatter = computed(() => {
105
+ const { locale: _locale, ...formatOptions } = toValue(options);
106
+ return localeControls.number(formatOptions);
107
+ });
108
+ const formatted = computed(() => {
109
+ const current = value === undefined ? undefined : toValue(value);
110
+ return current === null || current === undefined ? "" : formatter.value.format(current);
111
+ });
112
+ return {
113
+ locale: localeControls.locale,
114
+ formatter,
115
+ formatted,
116
+ format: (input) => formatter.value.format(input),
117
+ formatToParts: (input) => formatter.value.formatToParts(input),
118
+ formatRange: (start, end) => formatRangeWith(formatter.value, start, end),
119
+ };
120
+ }
@@ -0,0 +1,87 @@
1
+ import { readonly, ref, toValue, unref, watch } from "vue";
2
+ import type { MaybeRef, MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Objects accepted by `URL.createObjectURL`. */
7
+ export type ObjectUrlSource = Blob | MediaSource;
8
+
9
+ /** Minimal object-URL capability (the `URL` constructor's static methods). */
10
+ export interface ObjectUrlHost {
11
+ /** Create a URL referencing `object`. */
12
+ createObjectURL(object: ObjectUrlSource): string;
13
+
14
+ /** Release a URL previously returned by `createObjectURL`. */
15
+ revokeObjectURL(url: string): void;
16
+ }
17
+
18
+ /** Options for {@link useObjectUrl}. */
19
+ export interface UseObjectUrlOptions {
20
+ /**
21
+ * Object-URL capability for alternate runtimes and tests. A ref (not a
22
+ * getter) because the default host, `URL`, is itself a constructor.
23
+ *
24
+ * @default window.URL when a browser window exists
25
+ */
26
+ readonly host?: MaybeRef<ObjectUrlHost | null | undefined>;
27
+ }
28
+
29
+ function browserObjectUrlHost(): ObjectUrlHost | undefined {
30
+ if (typeof window === "undefined") return undefined;
31
+ const { URL } = window;
32
+ return typeof URL.createObjectURL === "function" ? URL : undefined;
33
+ }
34
+
35
+ /**
36
+ * Create a reactive object URL for a `Blob`, `File`, or `MediaSource`.
37
+ *
38
+ * A new URL is created whenever the reactive object changes and the
39
+ * previous one is revoked immediately, so memory held by the old object is
40
+ * released. The last URL is revoked when the owning reactive scope stops.
41
+ * Outside a scope, the caller owns the last URL (it lives until unload).
42
+ *
43
+ * Server rendering: no URL is created and the ref stays `undefined`.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const file = shallowRef<File>();
48
+ * const preview = useObjectUrl(file);
49
+ * // <img :src="preview">
50
+ * ```
51
+ *
52
+ * @param object Reactive object to reference; `null`/`undefined` clears the URL.
53
+ * @param options Object-URL capability.
54
+ * @default options {}
55
+ * @returns Readonly ref holding the current object URL.
56
+ */
57
+ export function useObjectUrl(
58
+ object: MaybeRefOrGetter<ObjectUrlSource | null | undefined>,
59
+ options: UseObjectUrlOptions = {},
60
+ ): Readonly<Ref<string | undefined>> {
61
+ const url = ref<string | undefined>(undefined);
62
+ const resolveHost = (): ObjectUrlHost | undefined =>
63
+ options.host === undefined ? browserObjectUrlHost() : (unref(options.host) ?? undefined);
64
+
65
+ let revokeCurrent: (() => void) | undefined;
66
+ const release = (): void => {
67
+ revokeCurrent?.();
68
+ revokeCurrent = undefined;
69
+ url.value = undefined;
70
+ };
71
+
72
+ watch(
73
+ [() => toValue(object), resolveHost],
74
+ ([next, host]) => {
75
+ release();
76
+ if (!next || !host) return;
77
+ const created = host.createObjectURL(next);
78
+ url.value = created;
79
+ revokeCurrent = () => host.revokeObjectURL(created);
80
+ },
81
+ { immediate: true, flush: "sync" },
82
+ );
83
+
84
+ tryOnScopeDispose(release);
85
+
86
+ return readonly(url);
87
+ }