@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,168 @@
1
+ import { computed, readonly, ref, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ /** Data shared through the Web Share API. */
5
+ export interface ShareDataLike {
6
+ /** Title of the shared content. */
7
+ readonly title?: string;
8
+
9
+ /** Body text of the shared content. */
10
+ readonly text?: string;
11
+
12
+ /** URL of the shared content. */
13
+ readonly url?: string;
14
+
15
+ /** Files to share (Level 2 of the Web Share API). */
16
+ readonly files?: File[];
17
+ }
18
+
19
+ /** Minimal Web Share capability (`navigator`). */
20
+ export interface ShareHost {
21
+ /** Open the platform share sheet. */
22
+ share(data: ShareDataLike): Promise<void>;
23
+
24
+ /** Whether the platform can share `data`. Absent in older engines. */
25
+ canShare?(data?: ShareDataLike): boolean;
26
+ }
27
+
28
+ /** Discriminated outcome of {@link ShareControls.share}. */
29
+ export type ShareResult =
30
+ | {
31
+ /** The share sheet completed. */
32
+ readonly status: "shared";
33
+ /** Data that was shared. */
34
+ readonly data: ShareDataLike;
35
+ }
36
+ | {
37
+ /**
38
+ * `"cancelled"`: the user dismissed the sheet (AbortError).
39
+ * `"unsupported"`: no Web Share capability.
40
+ * `"invalid"`: the platform cannot share this data (canShare / TypeError).
41
+ * `"not-allowed"`: no transient user activation or blocked by policy.
42
+ * `"failed"`: any other failure.
43
+ */
44
+ readonly status: "cancelled" | "unsupported" | "invalid" | "not-allowed" | "failed";
45
+ /** Exact error thrown by the host, when one was thrown. */
46
+ readonly error: unknown;
47
+ };
48
+
49
+ /** Options for {@link useShare}. */
50
+ export interface UseShareOptions {
51
+ /**
52
+ * Web Share capability for alternate runtimes and tests.
53
+ *
54
+ * @default window.navigator when it implements `share`
55
+ */
56
+ readonly host?: MaybeRefOrGetter<ShareHost | null | undefined>;
57
+ }
58
+
59
+ /** Reactive state and actions returned by {@link useShare}. */
60
+ export interface ShareControls {
61
+ /** Whether the Web Share API is available. */
62
+ readonly supported: ComputedRef<boolean>;
63
+
64
+ /** Whether a share sheet opened by this composable is currently open. */
65
+ readonly sharing: Readonly<Ref<boolean>>;
66
+
67
+ /**
68
+ * Whether the platform can share the given (or default) data.
69
+ *
70
+ * @param data Data merged over the defaults.
71
+ * @returns `false` when unsupported.
72
+ */
73
+ readonly canShare: (data?: ShareDataLike) => boolean;
74
+
75
+ /**
76
+ * Open the share sheet. Must run inside a user gesture in browsers.
77
+ *
78
+ * @param overrides Data merged over the defaults.
79
+ * @returns The discriminated outcome; never rejects.
80
+ */
81
+ readonly share: (overrides?: ShareDataLike) => Promise<ShareResult>;
82
+ }
83
+
84
+ function browserShareHost(): ShareHost | undefined {
85
+ if (typeof window === "undefined") return undefined;
86
+ const { navigator } = window;
87
+ return typeof navigator.share === "function" ? navigator : undefined;
88
+ }
89
+
90
+ function errorName(error: unknown): string | undefined {
91
+ return typeof error === "object" && error !== null && "name" in error
92
+ ? String(error.name)
93
+ : undefined;
94
+ }
95
+
96
+ /**
97
+ * Share text, links, and files through the platform share sheet.
98
+ *
99
+ * Reactive defaults are merged with per-call overrides. Outcomes are
100
+ * reported as a discriminated {@link ShareResult}, so a user dismissing the
101
+ * sheet (`"cancelled"`) is distinguishable from missing support or invalid
102
+ * data without try/catch.
103
+ *
104
+ * Server rendering: no capability is resolved, `supported` is false, and
105
+ * nothing is shared. No resources are retained, so nothing needs cleanup.
106
+ *
107
+ * @example
108
+ * ```ts
109
+ * const { share, supported } = useShare(() => ({ title: document.title, url: location.href }));
110
+ * const onClick = () => share();
111
+ * ```
112
+ *
113
+ * @param defaults Reactive default share data.
114
+ * @param options Web Share capability.
115
+ * @default defaults {}
116
+ * @default options {}
117
+ * @returns Share state and actions.
118
+ */
119
+ export function useShare(
120
+ defaults: MaybeRefOrGetter<ShareDataLike> = {},
121
+ options: UseShareOptions = {},
122
+ ): ShareControls {
123
+ const sharing = ref(false);
124
+ const resolveHost = (): ShareHost | undefined =>
125
+ options.host === undefined ? browserShareHost() : (toValue(options.host) ?? undefined);
126
+ const merge = (data: ShareDataLike | undefined): ShareDataLike => ({
127
+ ...toValue(defaults),
128
+ ...data,
129
+ });
130
+
131
+ const canShare = (data?: ShareDataLike): boolean => {
132
+ const host = resolveHost();
133
+ if (!host) return false;
134
+ if (!host.canShare) return true;
135
+ try {
136
+ return host.canShare(merge(data));
137
+ } catch {
138
+ return false;
139
+ }
140
+ };
141
+
142
+ const share = async (overrides?: ShareDataLike): Promise<ShareResult> => {
143
+ const host = resolveHost();
144
+ if (!host) return { status: "unsupported", error: undefined };
145
+ const data = merge(overrides);
146
+ if (host.canShare && !canShare(overrides)) return { status: "invalid", error: undefined };
147
+ sharing.value = true;
148
+ try {
149
+ await host.share(data);
150
+ return { status: "shared", data };
151
+ } catch (error) {
152
+ const name = errorName(error);
153
+ if (name === "AbortError") return { status: "cancelled", error };
154
+ if (name === "NotAllowedError") return { status: "not-allowed", error };
155
+ if (name === "TypeError" || name === "DataError") return { status: "invalid", error };
156
+ return { status: "failed", error };
157
+ } finally {
158
+ sharing.value = false;
159
+ }
160
+ };
161
+
162
+ return {
163
+ supported: computed(() => resolveHost() !== undefined),
164
+ sharing: readonly(sharing),
165
+ canShare,
166
+ share,
167
+ };
168
+ }
@@ -0,0 +1,130 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ import { useLocale } from "./locale.ts";
5
+
6
+ /** Options for {@link useSortedLocale}. */
7
+ export interface UseSortedLocaleOptions<Item> extends Intl.CollatorOptions {
8
+ /**
9
+ * Locale whose collation order is used. Pass it explicitly for
10
+ * hydration-stable server rendering.
11
+ *
12
+ * @default the browser language, otherwise "en"
13
+ */
14
+ readonly locale?: string | Intl.Locale;
15
+
16
+ /**
17
+ * Sort from Z to A.
18
+ *
19
+ * @default false
20
+ */
21
+ readonly descending?: boolean;
22
+
23
+ /**
24
+ * Text to compare for each item. Required for non-string items.
25
+ *
26
+ * @default String(item)
27
+ */
28
+ readonly key?: (item: Item) => string;
29
+ }
30
+
31
+ /** Reactive locale-aware sorting returned by {@link useSortedLocale}. */
32
+ export interface SortedLocaleControls<Item> {
33
+ /** Canonical locale in use. */
34
+ readonly locale: ComputedRef<string>;
35
+
36
+ /** Collator for the current locale and options. */
37
+ readonly collator: ComputedRef<Intl.Collator>;
38
+
39
+ /** New array sorted by locale collation; the source is never mutated. */
40
+ readonly sorted: ComputedRef<readonly Item[]>;
41
+
42
+ /**
43
+ * Compare two strings with the current collator (ignores `descending`).
44
+ *
45
+ * @param left First string.
46
+ * @param right Second string.
47
+ * @returns Negative, zero, or positive.
48
+ */
49
+ readonly compare: (left: string, right: string) => number;
50
+ }
51
+
52
+ function browserLanguage(): string | undefined {
53
+ return typeof window === "undefined" ? undefined : window.navigator.language;
54
+ }
55
+
56
+ /**
57
+ * Sort strings locale-aware with `Intl.Collator`.
58
+ *
59
+ * @param items Reactive strings.
60
+ * @param options Reactive locale, collation, and direction options.
61
+ * @returns Reactive sorted copy and collation helpers.
62
+ */
63
+ export function useSortedLocale(
64
+ items: MaybeRefOrGetter<readonly string[]>,
65
+ options?: MaybeRefOrGetter<UseSortedLocaleOptions<string>>,
66
+ ): SortedLocaleControls<string>;
67
+
68
+ /**
69
+ * Sort any items locale-aware by a string key with `Intl.Collator`.
70
+ *
71
+ * @param items Reactive items.
72
+ * @param options Reactive locale, collation, direction, and required key.
73
+ * @returns Reactive sorted copy and collation helpers.
74
+ */
75
+ export function useSortedLocale<Item>(
76
+ items: MaybeRefOrGetter<readonly Item[]>,
77
+ options: MaybeRefOrGetter<
78
+ UseSortedLocaleOptions<Item> & { readonly key: (item: Item) => string }
79
+ >,
80
+ ): SortedLocaleControls<Item>;
81
+
82
+ /**
83
+ * Sort items with locale-aware collation (`Intl.Collator`): `"ä"` sorts
84
+ * next to `"a"` in German but after `"z"` in Swedish, and `numeric: true`
85
+ * orders `"item 10"` after `"item 9"`.
86
+ *
87
+ * The result is a new, stable-sorted array recomputed when the items,
88
+ * options, or locale change; the source array is never mutated. Invalid
89
+ * options surface as the platform `RangeError`. Derived state only: safe
90
+ * and deterministic on the server when the locale is explicit.
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const { sorted } = useSortedLocale(users, { key: (user) => user.name, locale: "de", sensitivity: "base" });
95
+ * ```
96
+ *
97
+ * @param items Reactive items.
98
+ * @param options Reactive locale, collation, direction, and key.
99
+ * @default options {}
100
+ * @returns Reactive sorted copy and collation helpers.
101
+ */
102
+ export function useSortedLocale<Item>(
103
+ items: MaybeRefOrGetter<readonly Item[]>,
104
+ options: MaybeRefOrGetter<UseSortedLocaleOptions<Item>> = {},
105
+ ): SortedLocaleControls<Item> {
106
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
107
+ const collator = computed(() => {
108
+ const {
109
+ locale: _locale,
110
+ descending: _descending,
111
+ key: _key,
112
+ ...collatorOptions
113
+ } = toValue(options);
114
+ return new Intl.Collator(localeControls.locale.value, collatorOptions);
115
+ });
116
+ const sorted = computed(() => {
117
+ const { key = String, descending = false } = toValue(options);
118
+ const active = collator.value;
119
+ const direction = descending ? -1 : 1;
120
+ const keyed = toValue(items).map((item) => ({ item, text: key(item) }));
121
+ keyed.sort((left, right) => direction * active.compare(left.text, right.text));
122
+ return keyed.map(({ item }) => item);
123
+ });
124
+ return {
125
+ locale: localeControls.locale,
126
+ collator,
127
+ sorted,
128
+ compare: (left, right) => collator.value.compare(left, right),
129
+ };
130
+ }
@@ -0,0 +1,49 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ /** Comparator with `Array.prototype.sort` semantics. */
5
+ export type SortComparator<Item> = (left: Item, right: Item) => number;
6
+
7
+ /** Values with a natural order used by the default comparator. */
8
+ export type NaturallyOrdered = number | bigint | string | Date;
9
+
10
+ function naturalOrder(left: NaturallyOrdered, right: NaturallyOrdered): number {
11
+ const a = left instanceof Date ? left.getTime() : left;
12
+ const b = right instanceof Date ? right.getTime() : right;
13
+ if (a < b) return -1;
14
+ if (a > b) return 1;
15
+ return 0;
16
+ }
17
+
18
+ /**
19
+ * Sorted copy of a reactive array; the source is never mutated.
20
+ *
21
+ * Numbers, bigints, strings, and dates sort in natural ascending order by
22
+ * default (numerically, unlike `Array.prototype.sort`); any other item type
23
+ * requires a comparator. The sort is stable. Pure derived state: SSR-safe
24
+ * and nothing to dispose.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const ranked = useSorted(players, (a, b) => b.score - a.score);
29
+ * const ascending = useSorted([10, 9, 100]); // [9, 10, 100]
30
+ * ```
31
+ *
32
+ * @param source Reactive array.
33
+ * @param compare Comparator; optional for naturally ordered items.
34
+ * @returns Computed sorted copy.
35
+ */
36
+ export function useSorted<Item extends NaturallyOrdered>(
37
+ source: MaybeRefOrGetter<readonly Item[]>,
38
+ compare?: SortComparator<Item>,
39
+ ): ComputedRef<Item[]>;
40
+ export function useSorted<Item>(
41
+ source: MaybeRefOrGetter<readonly Item[]>,
42
+ compare: SortComparator<Item>,
43
+ ): ComputedRef<Item[]>;
44
+ export function useSorted(
45
+ source: MaybeRefOrGetter<readonly NaturallyOrdered[]>,
46
+ compare: SortComparator<NaturallyOrdered> = naturalOrder,
47
+ ): ComputedRef<NaturallyOrdered[]> {
48
+ return computed(() => [...toValue(source)].sort(compare));
49
+ }
@@ -0,0 +1,357 @@
1
+ import { computed, readonly, ref, shallowRef, toValue, unref, watch } from "vue";
2
+ import type { ComputedRef, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ /** One recognition hypothesis. */
5
+ export interface SpeechRecognitionAlternativeLike {
6
+ /** Recognized text. */
7
+ readonly transcript: string;
8
+
9
+ /** Confidence between 0 and 1. */
10
+ readonly confidence: number;
11
+ }
12
+
13
+ /** One recognition result: an array-like list of alternatives. */
14
+ export interface SpeechRecognitionResultLike {
15
+ /** Number of alternatives. */
16
+ readonly length: number;
17
+
18
+ /** Whether the result is final (no longer interim). */
19
+ readonly isFinal: boolean;
20
+
21
+ /** Alternative at `index`, most likely first. */
22
+ readonly [index: number]: SpeechRecognitionAlternativeLike;
23
+ }
24
+
25
+ /** Array-like list of every result of the current session. */
26
+ export interface SpeechRecognitionResultListLike {
27
+ /** Number of results. */
28
+ readonly length: number;
29
+
30
+ /** Result at `index`. */
31
+ readonly [index: number]: SpeechRecognitionResultLike;
32
+ }
33
+
34
+ /** Minimal `SpeechRecognition` instance consumed by {@link useSpeechRecognition}. */
35
+ export interface SpeechRecognitionLike extends EventTarget {
36
+ /** BCP 47 language tag. */
37
+ lang: string;
38
+
39
+ /** Keep listening after the first final result. */
40
+ continuous: boolean;
41
+
42
+ /** Report interim (non-final) results. */
43
+ interimResults: boolean;
44
+
45
+ /** Maximum alternatives per result. */
46
+ maxAlternatives: number;
47
+
48
+ /** Start listening. Throws `InvalidStateError` when already started. */
49
+ start(): void;
50
+
51
+ /** Stop listening and deliver a final result. */
52
+ stop(): void;
53
+
54
+ /** Stop listening without delivering a result. */
55
+ abort(): void;
56
+ }
57
+
58
+ /** Minimal `SpeechRecognition` constructor. */
59
+ export interface SpeechRecognitionHost {
60
+ /** Create a recognizer. */
61
+ new (): SpeechRecognitionLike;
62
+ }
63
+
64
+ /** Error codes defined by the Web Speech API, plus `"unknown"` for future codes. */
65
+ export type SpeechRecognitionErrorCode =
66
+ | "aborted"
67
+ | "audio-capture"
68
+ | "bad-grammar"
69
+ | "language-not-supported"
70
+ | "network"
71
+ | "no-speech"
72
+ | "not-allowed"
73
+ | "phrases-not-supported"
74
+ | "service-not-allowed"
75
+ | "unknown";
76
+
77
+ /** Recognition failure reported by {@link useSpeechRecognition}. */
78
+ export interface SpeechRecognitionFailure {
79
+ /** Normalized error code. */
80
+ readonly code: SpeechRecognitionErrorCode;
81
+
82
+ /** Implementation-provided message, possibly empty. */
83
+ readonly message: string;
84
+ }
85
+
86
+ /** Options for {@link useSpeechRecognition}. */
87
+ export interface UseSpeechRecognitionOptions {
88
+ /**
89
+ * Recognition language, applied when listening starts.
90
+ *
91
+ * @default "en-US"
92
+ */
93
+ readonly lang?: MaybeRefOrGetter<string>;
94
+
95
+ /**
96
+ * Keep listening after the first final result.
97
+ *
98
+ * @default true
99
+ */
100
+ readonly continuous?: boolean;
101
+
102
+ /**
103
+ * Report interim results through `interimResult`.
104
+ *
105
+ * @default true
106
+ */
107
+ readonly interimResults?: boolean;
108
+
109
+ /**
110
+ * Maximum alternatives per result.
111
+ *
112
+ * @default 1
113
+ */
114
+ readonly maxAlternatives?: number;
115
+
116
+ /**
117
+ * Recognizer constructor for alternate runtimes and tests. A ref (not a
118
+ * getter) because the host itself is a constructor function.
119
+ *
120
+ * @default window.SpeechRecognition ?? window.webkitSpeechRecognition
121
+ */
122
+ readonly host?: MaybeRef<SpeechRecognitionHost | null | undefined>;
123
+ }
124
+
125
+ /** Reactive state and actions returned by {@link useSpeechRecognition}. */
126
+ export interface SpeechRecognitionControls {
127
+ /** Whether a speech recognizer is available. */
128
+ readonly supported: ComputedRef<boolean>;
129
+
130
+ /** Whether the recognizer is listening. */
131
+ readonly listening: Readonly<Ref<boolean>>;
132
+
133
+ /** Concatenated final transcript of the current session. */
134
+ readonly result: Readonly<Ref<string>>;
135
+
136
+ /** Concatenated interim transcript not yet final. */
137
+ readonly interimResult: Readonly<Ref<string>>;
138
+
139
+ /** Alternatives of the most recent result. */
140
+ readonly alternatives: Readonly<ShallowRef<readonly SpeechRecognitionAlternativeLike[]>>;
141
+
142
+ /** Most recent recognition failure, cleared when listening starts. */
143
+ readonly error: Readonly<ShallowRef<SpeechRecognitionFailure | undefined>>;
144
+
145
+ /**
146
+ * Start listening with the current options, clearing previous results.
147
+ *
148
+ * @returns Whether listening started.
149
+ */
150
+ readonly start: () => boolean;
151
+
152
+ /** Stop listening and keep the final result. */
153
+ readonly stop: () => void;
154
+
155
+ /** Stop listening immediately without a final result. */
156
+ readonly abort: () => void;
157
+
158
+ /**
159
+ * Start or stop listening.
160
+ *
161
+ * @param value Force listening on or off.
162
+ * @default value !listening
163
+ */
164
+ readonly toggle: (value?: boolean) => void;
165
+ }
166
+
167
+ const errorCodes: ReadonlySet<string> = new Set<SpeechRecognitionErrorCode>([
168
+ "aborted",
169
+ "audio-capture",
170
+ "bad-grammar",
171
+ "language-not-supported",
172
+ "network",
173
+ "no-speech",
174
+ "not-allowed",
175
+ "phrases-not-supported",
176
+ "service-not-allowed",
177
+ ]);
178
+
179
+ function isErrorCode(code: string): code is SpeechRecognitionErrorCode {
180
+ return errorCodes.has(code);
181
+ }
182
+
183
+ function isRecognitionConstructor(candidate: unknown): candidate is SpeechRecognitionHost {
184
+ return typeof candidate === "function";
185
+ }
186
+
187
+ function browserRecognitionHost(): SpeechRecognitionHost | undefined {
188
+ if (typeof window === "undefined") return undefined;
189
+ const candidate: unknown =
190
+ Reflect.get(window, "SpeechRecognition") ?? Reflect.get(window, "webkitSpeechRecognition");
191
+ return isRecognitionConstructor(candidate) ? candidate : undefined;
192
+ }
193
+
194
+ interface ResultEventLike extends Event {
195
+ readonly results: SpeechRecognitionResultListLike;
196
+ }
197
+
198
+ function isResultEvent(event: Event): event is ResultEventLike {
199
+ if (!("results" in event)) return false;
200
+ const { results } = event;
201
+ return typeof results === "object" && results !== null && "length" in results;
202
+ }
203
+
204
+ function readString(event: Event, key: "error" | "message"): string {
205
+ const value: unknown = key in event ? Reflect.get(event, key) : undefined;
206
+ return typeof value === "string" ? value : "";
207
+ }
208
+
209
+ /**
210
+ * Transcribe speech with the Web Speech API.
211
+ *
212
+ * `result` accumulates the final transcript of the current session and
213
+ * `interimResult` the text still being recognized. Options are applied each
214
+ * time listening starts, so a reactive `lang` takes effect on the next
215
+ * `start`. Errors are normalized to a closed {@link SpeechRecognitionErrorCode}
216
+ * union and exposed through `error` rather than thrown. The recognizer is
217
+ * aborted and its listeners removed when the owning reactive scope stops.
218
+ *
219
+ * Server rendering: no recognizer is created; `supported` and `listening`
220
+ * are false and the transcripts are empty.
221
+ *
222
+ * @example
223
+ * ```ts
224
+ * const speech = useSpeechRecognition({ lang: "ja-JP" });
225
+ * speech.start();
226
+ * watch(speech.result, (text) => console.log(text));
227
+ * ```
228
+ *
229
+ * @param options Recognition settings and recognizer constructor.
230
+ * @default options {}
231
+ * @returns Recognition state and actions.
232
+ */
233
+ export function useSpeechRecognition(
234
+ options: UseSpeechRecognitionOptions = {},
235
+ ): SpeechRecognitionControls {
236
+ const listening = ref(false);
237
+ const result = ref("");
238
+ const interimResult = ref("");
239
+ const alternatives = shallowRef<readonly SpeechRecognitionAlternativeLike[]>([]);
240
+ const error = shallowRef<SpeechRecognitionFailure | undefined>(undefined);
241
+ let recognition: SpeechRecognitionLike | undefined;
242
+
243
+ const resolveHost = (): SpeechRecognitionHost | undefined =>
244
+ options.host === undefined ? browserRecognitionHost() : (unref(options.host) ?? undefined);
245
+
246
+ const onResult = (event: Event): void => {
247
+ if (!isResultEvent(event)) return;
248
+ const finals: string[] = [];
249
+ const interim: string[] = [];
250
+ let last: SpeechRecognitionResultLike | undefined;
251
+ for (let index = 0; index < event.results.length; index += 1) {
252
+ const entry = event.results[index];
253
+ if (!entry) continue;
254
+ last = entry;
255
+ const best = entry[0];
256
+ if (best) (entry.isFinal ? finals : interim).push(best.transcript);
257
+ }
258
+ result.value = finals.join("");
259
+ interimResult.value = interim.join("");
260
+ const collected: SpeechRecognitionAlternativeLike[] = [];
261
+ for (let index = 0; last && index < last.length; index += 1) {
262
+ const alternative = last[index];
263
+ if (alternative) collected.push(alternative);
264
+ }
265
+ alternatives.value = collected;
266
+ };
267
+
268
+ const onError = (event: Event): void => {
269
+ const code = readString(event, "error");
270
+ error.value = {
271
+ code: isErrorCode(code) ? code : "unknown",
272
+ message: readString(event, "message"),
273
+ };
274
+ };
275
+
276
+ const onStart = (): void => {
277
+ listening.value = true;
278
+ };
279
+
280
+ const onEnd = (): void => {
281
+ listening.value = false;
282
+ interimResult.value = "";
283
+ };
284
+
285
+ watch(
286
+ resolveHost,
287
+ (Host, _previous, onCleanup) => {
288
+ listening.value = false;
289
+ recognition = undefined;
290
+ if (!Host) return;
291
+ const instance = new Host();
292
+ instance.addEventListener("result", onResult);
293
+ instance.addEventListener("error", onError);
294
+ instance.addEventListener("start", onStart);
295
+ instance.addEventListener("end", onEnd);
296
+ recognition = instance;
297
+ onCleanup(() => {
298
+ instance.removeEventListener("result", onResult);
299
+ instance.removeEventListener("error", onError);
300
+ instance.removeEventListener("start", onStart);
301
+ instance.removeEventListener("end", onEnd);
302
+ if (listening.value) instance.abort();
303
+ listening.value = false;
304
+ if (recognition === instance) recognition = undefined;
305
+ });
306
+ },
307
+ { immediate: true, flush: "sync" },
308
+ );
309
+
310
+ const start = (): boolean => {
311
+ const instance = recognition;
312
+ if (!instance || listening.value) return listening.value;
313
+ instance.lang = toValue(options.lang) ?? "en-US";
314
+ instance.continuous = options.continuous ?? true;
315
+ instance.interimResults = options.interimResults ?? true;
316
+ instance.maxAlternatives = options.maxAlternatives ?? 1;
317
+ result.value = "";
318
+ interimResult.value = "";
319
+ alternatives.value = [];
320
+ error.value = undefined;
321
+ try {
322
+ instance.start();
323
+ } catch {
324
+ // InvalidStateError: the recognizer is already running.
325
+ return false;
326
+ }
327
+ listening.value = true;
328
+ return true;
329
+ };
330
+
331
+ const stop = (): void => {
332
+ recognition?.stop();
333
+ };
334
+
335
+ const abort = (): void => {
336
+ recognition?.abort();
337
+ listening.value = false;
338
+ };
339
+
340
+ const toggle = (value: boolean = !listening.value): void => {
341
+ if (value) start();
342
+ else stop();
343
+ };
344
+
345
+ return {
346
+ supported: computed(() => resolveHost() !== undefined),
347
+ listening: readonly(listening),
348
+ result: readonly(result),
349
+ interimResult: readonly(interimResult),
350
+ alternatives,
351
+ error,
352
+ start,
353
+ stop,
354
+ abort,
355
+ toggle,
356
+ };
357
+ }