@vizejs/composable 0.426.3 → 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,281 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ /** Date input accepted by {@link formatDate} and {@link useDateFormat}. */
5
+ export type DateFormatInput = Date | number | string;
6
+
7
+ /**
8
+ * Tokens understood by the pattern form of {@link formatDate}.
9
+ *
10
+ * | Token | Output | Token | Output |
11
+ * | --- | --- | --- | --- |
12
+ * | `YYYY` | 2026 | `YY` | 26 |
13
+ * | `M` / `MM` | 1 / 01 | `MMM` / `MMMM` | Jan / January (localized) |
14
+ * | `D` / `DD` | 5 / 05 | `d` | 0–6, Sunday is 0 |
15
+ * | `dd` / `ddd` / `dddd` | S / Sun / Sunday (localized) | `H` / `HH` | 0–23 |
16
+ * | `h` / `hh` | 1–12 | `m` / `mm`, `s` / `ss` | minutes, seconds |
17
+ * | `SSS` | milliseconds | `A` / `a` | AM / am (localized) |
18
+ * | `Z` / `ZZ` | +09:00 / +0900 | `[text]` | literal text |
19
+ */
20
+ export type DateFormatToken =
21
+ | "YYYY"
22
+ | "YY"
23
+ | "M"
24
+ | "MM"
25
+ | "MMM"
26
+ | "MMMM"
27
+ | "D"
28
+ | "DD"
29
+ | "d"
30
+ | "dd"
31
+ | "ddd"
32
+ | "dddd"
33
+ | "H"
34
+ | "HH"
35
+ | "h"
36
+ | "hh"
37
+ | "m"
38
+ | "mm"
39
+ | "s"
40
+ | "ss"
41
+ | "SSS"
42
+ | "A"
43
+ | "a"
44
+ | "Z"
45
+ | "ZZ";
46
+
47
+ /** Options for {@link formatDate}. */
48
+ export interface FormatDateOptions {
49
+ /**
50
+ * BCP 47 locale(s) for names and `Intl` option formats. Defaults to a fixed
51
+ * locale (not the host default) so server and client output agree.
52
+ *
53
+ * @default "en"
54
+ */
55
+ readonly locale?: string | readonly string[];
56
+
57
+ /**
58
+ * IANA time zone the date is rendered in. Defaults to UTC (not the host
59
+ * zone) for SSR determinism; pass the user's zone explicitly.
60
+ *
61
+ * @default "UTC"
62
+ */
63
+ readonly timeZone?: string;
64
+ }
65
+
66
+ /** Options for {@link useDateFormat}. */
67
+ export interface UseDateFormatOptions {
68
+ /**
69
+ * Reactive BCP 47 locale(s).
70
+ *
71
+ * @default "en"
72
+ */
73
+ readonly locale?: MaybeRefOrGetter<string | readonly string[]>;
74
+
75
+ /**
76
+ * Reactive IANA time zone.
77
+ *
78
+ * @default "UTC"
79
+ */
80
+ readonly timeZone?: MaybeRefOrGetter<string>;
81
+ }
82
+
83
+ const tokenPattern =
84
+ /\[([^\]]*)]|YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|dd|d|HH|H|hh|h|mm|m|ss|s|SSS|A|a|ZZ|Z/g;
85
+
86
+ const weekdayIndex: Readonly<Record<string, number>> = {
87
+ Sun: 0,
88
+ Mon: 1,
89
+ Tue: 2,
90
+ Wed: 3,
91
+ Thu: 4,
92
+ Fri: 5,
93
+ Sat: 6,
94
+ };
95
+
96
+ function toDate(input: DateFormatInput): Date {
97
+ const date = input instanceof Date ? new Date(input.getTime()) : new Date(input);
98
+ if (Number.isNaN(date.getTime())) {
99
+ throw new RangeError(
100
+ `[VIZE_COMPOSE_DATE_FORMAT_INVALID_DATE] expected a valid date; received ${String(input)}`,
101
+ );
102
+ }
103
+ return date;
104
+ }
105
+
106
+ function pad(value: number, length: number): string {
107
+ return String(value).padStart(length, "0");
108
+ }
109
+
110
+ function partsOf(formatter: Intl.DateTimeFormat, date: Date): Map<string, string> {
111
+ return new Map(formatter.formatToParts(date).map((part) => [part.type, part.value]));
112
+ }
113
+
114
+ /**
115
+ * Format a date with a token pattern or `Intl.DateTimeFormat` options.
116
+ *
117
+ * Pure and deterministic: locale and time zone default to fixed values
118
+ * (`"en"`, `"UTC"`) rather than host settings, so the same input renders
119
+ * identically on server and client. Calendar fields are computed in the
120
+ * requested time zone through `Intl`, so no host-zone arithmetic leaks in.
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * formatDate(0, "YYYY-MM-DD HH:mm:ss"); // "1970-01-01 00:00:00"
125
+ * formatDate(0, "dddd, MMMM D [at] h:mm A", { locale: "en", timeZone: "Asia/Tokyo" });
126
+ * formatDate(0, { dateStyle: "long" }, { locale: "ja" }); // "1970年1月1日"
127
+ * ```
128
+ *
129
+ * @param input Date to format.
130
+ * @param format Token pattern (see {@link DateFormatToken}) or `Intl` options.
131
+ * @param options Locale and time zone.
132
+ * @default format "HH:mm:ss"
133
+ * @default options {}
134
+ * @throws `RangeError` tagged `VIZE_COMPOSE_DATE_FORMAT_INVALID_DATE` for
135
+ * invalid dates, and `RangeError` from `Intl` for invalid locales or zones.
136
+ * @returns The formatted string.
137
+ */
138
+ export function formatDate(
139
+ input: DateFormatInput,
140
+ format: string | Intl.DateTimeFormatOptions = "HH:mm:ss",
141
+ options: FormatDateOptions = {},
142
+ ): string {
143
+ const date = toDate(input);
144
+ const locales =
145
+ typeof options.locale === "string" ? options.locale : [...(options.locale ?? ["en"])];
146
+ const timeZone = options.timeZone ?? "UTC";
147
+
148
+ if (typeof format !== "string") {
149
+ return new Intl.DateTimeFormat(locales, { ...format, timeZone }).format(date);
150
+ }
151
+
152
+ const numeric = partsOf(
153
+ new Intl.DateTimeFormat("en-US", {
154
+ timeZone,
155
+ hourCycle: "h23",
156
+ year: "numeric",
157
+ month: "numeric",
158
+ day: "numeric",
159
+ hour: "numeric",
160
+ minute: "numeric",
161
+ second: "numeric",
162
+ weekday: "short",
163
+ timeZoneName: "longOffset",
164
+ }),
165
+ date,
166
+ );
167
+ const field = (type: string): number => Number(numeric.get(type) ?? "0");
168
+ const localized = (formatOptions: Intl.DateTimeFormatOptions): string =>
169
+ new Intl.DateTimeFormat(locales, { ...formatOptions, timeZone }).format(date);
170
+
171
+ const year = field("year");
172
+ const month = field("month");
173
+ const day = field("day");
174
+ const hour = field("hour") % 24;
175
+ const minute = field("minute");
176
+ const second = field("second");
177
+ const offset = (numeric.get("timeZoneName") ?? "GMT").replace("GMT", "") || "+00:00";
178
+
179
+ const meridiem = (): string =>
180
+ partsOf(
181
+ new Intl.DateTimeFormat(locales, { hour: "numeric", hourCycle: "h12", timeZone }),
182
+ date,
183
+ ).get("dayPeriod") ?? (hour < 12 ? "AM" : "PM");
184
+
185
+ const render = (token: string): string => {
186
+ switch (token) {
187
+ case "YYYY":
188
+ return pad(year, 4);
189
+ case "YY":
190
+ return pad(year % 100, 2);
191
+ case "M":
192
+ return String(month);
193
+ case "MM":
194
+ return pad(month, 2);
195
+ case "MMM":
196
+ return localized({ month: "short" });
197
+ case "MMMM":
198
+ return localized({ month: "long" });
199
+ case "D":
200
+ return String(day);
201
+ case "DD":
202
+ return pad(day, 2);
203
+ case "d":
204
+ return String(weekdayIndex[numeric.get("weekday") ?? "Sun"] ?? 0);
205
+ case "dd":
206
+ return localized({ weekday: "narrow" });
207
+ case "ddd":
208
+ return localized({ weekday: "short" });
209
+ case "dddd":
210
+ return localized({ weekday: "long" });
211
+ case "H":
212
+ return String(hour);
213
+ case "HH":
214
+ return pad(hour, 2);
215
+ case "h":
216
+ return String(hour % 12 || 12);
217
+ case "hh":
218
+ return pad(hour % 12 || 12, 2);
219
+ case "m":
220
+ return String(minute);
221
+ case "mm":
222
+ return pad(minute, 2);
223
+ case "s":
224
+ return String(second);
225
+ case "ss":
226
+ return pad(second, 2);
227
+ case "SSS":
228
+ return pad(date.getUTCMilliseconds(), 3);
229
+ case "A":
230
+ return meridiem();
231
+ case "a":
232
+ return meridiem().toLowerCase();
233
+ case "Z":
234
+ return offset;
235
+ default:
236
+ return offset.replace(":", "");
237
+ }
238
+ };
239
+
240
+ return format.replaceAll(
241
+ tokenPattern,
242
+ (match: string, literal: string | undefined) => literal ?? render(match),
243
+ );
244
+ }
245
+
246
+ /**
247
+ * Reactive formatted date.
248
+ *
249
+ * Wraps {@link formatDate} in a computed ref; the date, the format, the
250
+ * locale, and the time zone are all reactive. Deterministic defaults (`"en"`,
251
+ * `"UTC"`) keep server and client output identical. No timers, no globals,
252
+ * nothing to dispose.
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const label = useDateFormat(() => event.value.startsAt, "ddd, MMM D HH:mm", {
257
+ * locale: () => locale.value,
258
+ * timeZone: "Europe/Paris",
259
+ * });
260
+ * ```
261
+ *
262
+ * @param input Reactive date.
263
+ * @param format Reactive token pattern or `Intl` options.
264
+ * @param options Reactive locale and time zone.
265
+ * @default format "HH:mm:ss"
266
+ * @default options {}
267
+ * @throws `RangeError` on read for invalid dates, locales, or zones.
268
+ * @returns Computed formatted string.
269
+ */
270
+ export function useDateFormat(
271
+ input: MaybeRefOrGetter<DateFormatInput>,
272
+ format: MaybeRefOrGetter<string | Intl.DateTimeFormatOptions> = "HH:mm:ss",
273
+ options: UseDateFormatOptions = {},
274
+ ): ComputedRef<string> {
275
+ return computed(() =>
276
+ formatDate(toValue(input), toValue(format), {
277
+ locale: toValue(options.locale) ?? "en",
278
+ timeZone: toValue(options.timeZone) ?? "UTC",
279
+ }),
280
+ );
281
+ }
@@ -0,0 +1,113 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ import { useLocale } from "./locale.ts";
5
+
6
+ /** Values accepted by `Intl.DateTimeFormat`: a `Date` or Unix milliseconds. */
7
+ export type FormattableDate = Date | number;
8
+
9
+ /** Options for {@link useDateTimeFormat}. */
10
+ export interface UseDateTimeFormatOptions extends Intl.DateTimeFormatOptions {
11
+ /**
12
+ * Locale used for formatting. Pass it explicitly (and a `timeZone`) for
13
+ * server rendering: the server falls back to `"en"` and its own time zone.
14
+ *
15
+ * @default the browser language, otherwise "en"
16
+ */
17
+ readonly locale?: string | Intl.Locale;
18
+ }
19
+
20
+ /** Reactive date formatting returned by {@link useDateTimeFormat}. */
21
+ export interface DateTimeFormatControls {
22
+ /** Canonical locale in use. */
23
+ readonly locale: ComputedRef<string>;
24
+
25
+ /** Cached formatter for the current locale and options. */
26
+ readonly formatter: ComputedRef<Intl.DateTimeFormat>;
27
+
28
+ /**
29
+ * Formatted `value`, or `""` while the value is `null`/`undefined` or an
30
+ * invalid date.
31
+ */
32
+ readonly formatted: ComputedRef<string>;
33
+
34
+ /**
35
+ * Format any date with the current formatter.
36
+ *
37
+ * @param value Date or Unix milliseconds.
38
+ * @returns The formatted string.
39
+ * @throws {RangeError} For an invalid date, as `Intl.DateTimeFormat` does.
40
+ */
41
+ readonly format: (value: FormattableDate) => string;
42
+
43
+ /**
44
+ * Format any date into locale-aware parts.
45
+ *
46
+ * @param value Date or Unix milliseconds.
47
+ * @returns The formatted parts.
48
+ */
49
+ readonly formatToParts: (value: FormattableDate) => Intl.DateTimeFormatPart[];
50
+
51
+ /**
52
+ * Format a date range, collapsing shared fields (for example `"Jan 3 – 5, 2026"`).
53
+ *
54
+ * @param start Range start.
55
+ * @param end Range end.
56
+ * @returns The formatted range.
57
+ */
58
+ readonly formatRange: (start: FormattableDate, end: FormattableDate) => string;
59
+ }
60
+
61
+ function browserLanguage(): string | undefined {
62
+ return typeof window === "undefined" ? undefined : window.navigator.language;
63
+ }
64
+
65
+ function isValidDate(value: FormattableDate): boolean {
66
+ return !Number.isNaN(value instanceof Date ? value.getTime() : value);
67
+ }
68
+
69
+ /**
70
+ * Format dates and times reactively with `Intl.DateTimeFormat`.
71
+ *
72
+ * The formatter follows the reactive options (including `locale`) and is
73
+ * cached per locale and option set through {@link useLocale}. For
74
+ * hydration-stable output pass both `locale` and `timeZone`: otherwise the
75
+ * server uses `"en"` and its own zone. Invalid options surface as the
76
+ * platform's `RangeError` on first read; invalid dates render as `""`.
77
+ * No listeners or timers are created — combine with a clock composable for
78
+ * live-updating output.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const { formatted } = useDateTimeFormat(date, { locale: "en-GB", dateStyle: "long", timeZone: "UTC" });
83
+ * ```
84
+ *
85
+ * @param value Reactive date; `null`/`undefined` format as `""`.
86
+ * @param options Reactive locale and `Intl.DateTimeFormat` options.
87
+ * @default value undefined
88
+ * @default options {}
89
+ * @returns Reactive formatted output and formatter helpers.
90
+ */
91
+ export function useDateTimeFormat(
92
+ value?: MaybeRefOrGetter<FormattableDate | null | undefined>,
93
+ options: MaybeRefOrGetter<UseDateTimeFormatOptions> = {},
94
+ ): DateTimeFormatControls {
95
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
96
+ const formatter = computed(() => {
97
+ const { locale: _locale, ...formatOptions } = toValue(options);
98
+ return localeControls.dateTime(formatOptions);
99
+ });
100
+ const formatted = computed(() => {
101
+ const current = value === undefined ? undefined : toValue(value);
102
+ if (current === null || current === undefined || !isValidDate(current)) return "";
103
+ return formatter.value.format(current);
104
+ });
105
+ return {
106
+ locale: localeControls.locale,
107
+ formatter,
108
+ formatted,
109
+ format: (input) => formatter.value.format(input),
110
+ formatToParts: (input) => formatter.value.formatToParts(input),
111
+ formatRange: (start, end) => formatter.value.formatRange(start, end),
112
+ };
113
+ }
@@ -0,0 +1,163 @@
1
+ import { shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
6
+
7
+ /** Options for {@link useDebounced}. */
8
+ export interface UseDebouncedOptions {
9
+ /**
10
+ * Applies the timing policy when no browser `window` is available.
11
+ *
12
+ * Keep this disabled during server rendering, where the debounced view
13
+ * mirrors the source synchronously instead of starting timers. Enable it
14
+ * for native, desktop, worker, and test runtimes whose scheduler is
15
+ * lifecycle-bound.
16
+ *
17
+ * @default false
18
+ */
19
+ readonly runOnServer?: boolean;
20
+
21
+ /**
22
+ * Owns the single-shot timer.
23
+ *
24
+ * @default globalThis timer functions
25
+ */
26
+ readonly scheduler?: TimeoutScheduler;
27
+ }
28
+
29
+ /** Reactive debounced view and controls returned by {@link useDebounced}. */
30
+ export interface DebouncedControls<Value> {
31
+ /** Readonly view of the source that settles `waitMs` after the last change. */
32
+ readonly debounced: Readonly<ShallowRef<Value>>;
33
+
34
+ /** Whether a trailing update is currently scheduled. */
35
+ readonly pending: Readonly<ShallowRef<boolean>>;
36
+
37
+ /**
38
+ * Discard the scheduled trailing update and keep the last settled value.
39
+ * Later source changes debounce again as usual.
40
+ *
41
+ * @returns Whether a scheduled update was discarded.
42
+ */
43
+ readonly cancel: () => boolean;
44
+
45
+ /**
46
+ * Apply the current source value immediately instead of waiting out the
47
+ * delay.
48
+ *
49
+ * @returns Whether a scheduled update was applied.
50
+ */
51
+ readonly flush: () => boolean;
52
+ }
53
+
54
+ const defaultScheduler: TimeoutScheduler = {
55
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
56
+ clearTimeout: (handle) => {
57
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
58
+ },
59
+ };
60
+
61
+ /**
62
+ * Create a readonly debounced view of a reactive source.
63
+ *
64
+ * The view starts at the current source value. Each source change (observed
65
+ * with `flush: "sync"`, so every synchronous write counts) restarts a
66
+ * single-shot timer of `waitMs` milliseconds; when it fires, the view takes
67
+ * the source value current at that moment. `waitMs` is reactive and is read
68
+ * when a timer is scheduled; changing it does not restart an already-pending
69
+ * timer. A wait of `0` still defers to the next scheduler tick.
70
+ *
71
+ * Server rendering is explicit: without a browser `window` (and with
72
+ * {@link UseDebouncedOptions.runOnServer} disabled) no timer ever starts and
73
+ * the view mirrors the source synchronously, so server-rendered output shows
74
+ * current values and nothing leaks. `pending` stays `false` and the controls
75
+ * report `false` in that mode.
76
+ *
77
+ * Cleanup rule: the watcher and any pending timer are released when the
78
+ * owning reactive scope stops; call inside an active scope. Outside one, the
79
+ * watcher lives as long as the source and `cancel()` only clears the pending
80
+ * timer.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const query = shallowRef("");
85
+ * const { debounced, flush } = useDebounced(query, 300);
86
+ * query.value = "vize"; // debounced.value still "" for 300ms
87
+ * flush(); // debounced.value === "vize" immediately
88
+ * ```
89
+ *
90
+ * @param source Reactive source to debounce.
91
+ * @param waitMs Reactive delay in milliseconds; must be finite and at least
92
+ * zero. Fractions are truncated.
93
+ * @param options Runtime scheduling overrides.
94
+ * @default options {}
95
+ * @throws `RangeError` tagged `VIZE_COMPOSE_DEBOUNCE_INVALID_WAIT` when the
96
+ * resolved wait is not finite or is negative, both synchronously at creation
97
+ * (even in mirror mode) and again for every scheduled delay.
98
+ * @returns Readonly debounced view, pending flag, and cancel/flush controls.
99
+ */
100
+ export function useDebounced<Value>(
101
+ source: MaybeRefOrGetter<Value>,
102
+ waitMs: MaybeRefOrGetter<number>,
103
+ options: UseDebouncedOptions = {},
104
+ ): DebouncedControls<Value> {
105
+ const scheduler = options.scheduler ?? defaultScheduler;
106
+ const debounced = shallowRef(toValue(source));
107
+ const pending = shallowRef(false);
108
+ let handle: unknown;
109
+
110
+ // Fail synchronously for invalid initial input, even in mirror mode.
111
+ resolveWaitMs(toValue(waitMs));
112
+
113
+ const apply = (): void => {
114
+ handle = undefined;
115
+ pending.value = false;
116
+ debounced.value = toValue(source);
117
+ };
118
+
119
+ const cancel = (): boolean => {
120
+ if (!pending.value) return false;
121
+ scheduler.clearTimeout(handle);
122
+ handle = undefined;
123
+ pending.value = false;
124
+ return true;
125
+ };
126
+
127
+ const flush = (): boolean => {
128
+ if (!pending.value) return false;
129
+ scheduler.clearTimeout(handle);
130
+ apply();
131
+ return true;
132
+ };
133
+
134
+ watch(
135
+ () => toValue(source),
136
+ (next) => {
137
+ if (typeof window === "undefined" && !(options.runOnServer ?? false)) {
138
+ debounced.value = next;
139
+ return;
140
+ }
141
+ const delayMs = resolveWaitMs(toValue(waitMs));
142
+ if (pending.value) scheduler.clearTimeout(handle);
143
+ pending.value = true;
144
+ handle = scheduler.setTimeout(apply, delayMs);
145
+ },
146
+ { flush: "sync" },
147
+ );
148
+
149
+ tryOnScopeDispose(() => {
150
+ cancel();
151
+ });
152
+
153
+ return { debounced, pending, cancel, flush };
154
+ }
155
+
156
+ function resolveWaitMs(value: number): number {
157
+ if (!Number.isFinite(value) || value < 0) {
158
+ throw new RangeError(
159
+ `[VIZE_COMPOSE_DEBOUNCE_INVALID_WAIT] waitMs must be finite and at least zero; received ${String(value)}`,
160
+ );
161
+ }
162
+ return Math.trunc(value);
163
+ }
@@ -0,0 +1,89 @@
1
+ import { toValue } from "vue";
2
+ import type { MaybeRefOrGetter } from "vue";
3
+
4
+ import { useMediaStream } from "./use-user-media.ts";
5
+ import type { MediaStreamControls, MediaStreamLike } from "./use-user-media.ts";
6
+
7
+ /** Minimal `MediaDevices` consumed by {@link useDisplayMedia}. */
8
+ export interface DisplayMediaHost {
9
+ /** Ask the user to pick a screen, window, or tab to capture. */
10
+ getDisplayMedia(options?: DisplayMediaStreamOptions): Promise<MediaStreamLike>;
11
+ }
12
+
13
+ /** Options for {@link useDisplayMedia}. */
14
+ export interface UseDisplayMediaOptions {
15
+ /**
16
+ * Video capture constraints.
17
+ *
18
+ * @default true
19
+ */
20
+ readonly video?: MaybeRefOrGetter<boolean | MediaTrackConstraints>;
21
+
22
+ /**
23
+ * Audio capture constraints (tab or system audio where supported).
24
+ *
25
+ * @default false
26
+ */
27
+ readonly audio?: MaybeRefOrGetter<boolean | MediaTrackConstraints>;
28
+
29
+ /**
30
+ * Start while `true`, stop while `false`. Browsers require a user gesture
31
+ * for screen capture, so prefer calling `start` from an event handler.
32
+ *
33
+ * @default false
34
+ */
35
+ readonly enabled?: MaybeRefOrGetter<boolean>;
36
+
37
+ /**
38
+ * `MediaDevices` capability for alternate runtimes and tests.
39
+ *
40
+ * @default window.navigator.mediaDevices when it implements `getDisplayMedia`
41
+ */
42
+ readonly host?: MaybeRefOrGetter<DisplayMediaHost | null | undefined>;
43
+ }
44
+
45
+ function browserDisplayMediaHost(): DisplayMediaHost | undefined {
46
+ if (typeof window === "undefined") return undefined;
47
+ // `mediaDevices` is undefined in insecure contexts despite its DOM typing.
48
+ const devices: MediaDevices | undefined = window.navigator.mediaDevices;
49
+ return devices && typeof devices.getDisplayMedia === "function" ? devices : undefined;
50
+ }
51
+
52
+ /**
53
+ * Capture a screen, window, or tab with `getDisplayMedia`.
54
+ *
55
+ * Shares the stream lifecycle of `useMediaStream` (from `use-user-media`):
56
+ * classified failures (`"permission-denied"` when the user dismisses the
57
+ * picker), latest-wins requests, and automatic return to `"idle"` when the
58
+ * user ends sharing from the browser UI (every track `ended`). Tracks are
59
+ * stopped when the owning reactive scope stops.
60
+ *
61
+ * Server rendering: nothing is captured; `status` is `"idle"` and
62
+ * `supported` is false.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const screen = useDisplayMedia({ audio: true });
67
+ * const share = () => screen.start();
68
+ * ```
69
+ *
70
+ * @param options Capture constraints, activation, and capability.
71
+ * @default options {}
72
+ * @returns Stream state and actions.
73
+ */
74
+ export function useDisplayMedia(options: UseDisplayMediaOptions = {}): MediaStreamControls {
75
+ const resolveHost = (): DisplayMediaHost | undefined =>
76
+ options.host === undefined ? browserDisplayMediaHost() : (toValue(options.host) ?? undefined);
77
+
78
+ return useMediaStream<DisplayMediaStreamOptions>({
79
+ source: () => {
80
+ const host = resolveHost();
81
+ return host ? { request: (constraints) => host.getDisplayMedia(constraints) } : undefined;
82
+ },
83
+ constraints: () => ({
84
+ video: toValue(options.video) ?? true,
85
+ audio: toValue(options.audio) ?? false,
86
+ }),
87
+ enabled: () => toValue(options.enabled) ?? false,
88
+ });
89
+ }