@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,422 @@
1
+ import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Minimal `MediaStreamTrack`. */
7
+ export interface MediaStreamTrackLike extends EventTarget {
8
+ /** `"audio"` or `"video"`. */
9
+ readonly kind: string;
10
+
11
+ /** `"live"` or `"ended"`. */
12
+ readonly readyState: string;
13
+
14
+ /** Stop the track and release its device. */
15
+ stop(): void;
16
+ }
17
+
18
+ /** Minimal `MediaStream`. */
19
+ export interface MediaStreamLike {
20
+ /** Every track of the stream. */
21
+ getTracks(): readonly MediaStreamTrackLike[];
22
+ }
23
+
24
+ /** Anything that can asynchronously produce a media stream. */
25
+ export interface MediaStreamSource<Constraints> {
26
+ /** Acquire a stream; rejects with a DOMException on failure. */
27
+ request(constraints: Constraints): Promise<MediaStreamLike>;
28
+ }
29
+
30
+ /** Lifecycle state of a managed media stream. */
31
+ export type MediaStreamStatus = "idle" | "requesting" | "active" | "error";
32
+
33
+ /** Normalized reason why a stream could not be acquired. */
34
+ export type MediaStreamErrorCode =
35
+ | "aborted"
36
+ | "failed"
37
+ | "invalid-constraints"
38
+ | "not-found"
39
+ | "not-readable"
40
+ | "overconstrained"
41
+ | "permission-denied"
42
+ | "unsupported";
43
+
44
+ /** Stream acquisition failure. */
45
+ export interface MediaStreamFailure {
46
+ /** Normalized reason. */
47
+ readonly code: MediaStreamErrorCode;
48
+
49
+ /** Exact error thrown by the source, when one was thrown. */
50
+ readonly cause: unknown;
51
+ }
52
+
53
+ /** Options for {@link useMediaStream}. */
54
+ export interface UseMediaStreamOptions<Constraints> {
55
+ /** Reactive stream source; `null`/`undefined` means unsupported. */
56
+ readonly source: MaybeRefOrGetter<MediaStreamSource<Constraints> | null | undefined>;
57
+
58
+ /** Reactive constraints passed to the source. */
59
+ readonly constraints: MaybeRefOrGetter<Constraints>;
60
+
61
+ /**
62
+ * Start while `true`, stop while `false`.
63
+ *
64
+ * @default false
65
+ */
66
+ readonly enabled?: MaybeRefOrGetter<boolean>;
67
+
68
+ /**
69
+ * Restart an active stream when the constraints change.
70
+ *
71
+ * @default true
72
+ */
73
+ readonly autoSwitch?: boolean;
74
+ }
75
+
76
+ /** Reactive state and actions of a managed media stream. */
77
+ export interface MediaStreamControls {
78
+ /** Whether a stream source is available. */
79
+ readonly supported: ComputedRef<boolean>;
80
+
81
+ /** The active stream, if any. */
82
+ readonly stream: Readonly<ShallowRef<MediaStreamLike | undefined>>;
83
+
84
+ /** Lifecycle state. */
85
+ readonly status: Readonly<Ref<MediaStreamStatus>>;
86
+
87
+ /** Most recent acquisition failure, cleared by the next request. */
88
+ readonly error: Readonly<ShallowRef<MediaStreamFailure | undefined>>;
89
+
90
+ /**
91
+ * Acquire a stream unless one is active. Overlapping calls resolve to the
92
+ * newest stream; superseded streams are stopped immediately.
93
+ *
94
+ * @returns The active stream, or `undefined` on failure or supersession.
95
+ */
96
+ readonly start: () => Promise<MediaStreamLike | undefined>;
97
+
98
+ /** Stop every track and release the stream. Repeated calls are safe. */
99
+ readonly stop: () => void;
100
+
101
+ /**
102
+ * Stop and acquire a fresh stream with the current constraints.
103
+ *
104
+ * @returns The new stream, or `undefined` on failure or supersession.
105
+ */
106
+ readonly restart: () => Promise<MediaStreamLike | undefined>;
107
+ }
108
+
109
+ function errorName(error: unknown): string | undefined {
110
+ return typeof error === "object" && error !== null && "name" in error
111
+ ? String(error.name)
112
+ : undefined;
113
+ }
114
+
115
+ function classify(error: unknown): MediaStreamErrorCode {
116
+ switch (errorName(error)) {
117
+ case "NotAllowedError":
118
+ case "SecurityError":
119
+ return "permission-denied";
120
+ case "NotFoundError":
121
+ return "not-found";
122
+ case "NotReadableError":
123
+ return "not-readable";
124
+ case "OverconstrainedError":
125
+ return "overconstrained";
126
+ case "AbortError":
127
+ return "aborted";
128
+ case "TypeError":
129
+ return "invalid-constraints";
130
+ default:
131
+ return "failed";
132
+ }
133
+ }
134
+
135
+ function stopTracks(stream: MediaStreamLike): void {
136
+ for (const track of stream.getTracks()) track.stop();
137
+ }
138
+
139
+ /**
140
+ * Manage the lifecycle of a media stream from any asynchronous source.
141
+ *
142
+ * This is the engine behind {@link useUserMedia} and `useDisplayMedia`, and
143
+ * can wrap any other stream producer (canvas capture, WebRTC). Acquisition
144
+ * failures are classified into {@link MediaStreamErrorCode}s; the stream
145
+ * returns to `"idle"` once all of its tracks ended (device unplugged, the
146
+ * user stopped screen sharing). Latest-wins: a stream that resolves after a
147
+ * newer request or a `stop` is stopped immediately. All tracks are stopped
148
+ * when the owning reactive scope stops.
149
+ *
150
+ * Server rendering: without a browser window a missing source keeps the
151
+ * status `"idle"` (no error), so server markup matches the first client
152
+ * render.
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * const canvasStream = useMediaStream({
157
+ * source: { request: async (fps: number) => canvas.captureStream(fps) },
158
+ * constraints: 30,
159
+ * });
160
+ * ```
161
+ *
162
+ * @typeParam Constraints Constraint type accepted by the source.
163
+ * @param options Source, constraints, and activation.
164
+ * @returns Stream state and actions.
165
+ */
166
+ export function useMediaStream<Constraints>(
167
+ options: UseMediaStreamOptions<Constraints>,
168
+ ): MediaStreamControls {
169
+ const stream = shallowRef<MediaStreamLike | undefined>(undefined);
170
+ const status = ref<MediaStreamStatus>("idle");
171
+ const error = shallowRef<MediaStreamFailure | undefined>(undefined);
172
+ let generation = 0;
173
+ let detach: (() => void) | undefined;
174
+
175
+ const resolveSource = (): MediaStreamSource<Constraints> | undefined =>
176
+ toValue(options.source) ?? undefined;
177
+
178
+ const stop = (): void => {
179
+ generation += 1;
180
+ detach?.();
181
+ detach = undefined;
182
+ const current = stream.value;
183
+ stream.value = undefined;
184
+ if (current) stopTracks(current);
185
+ status.value = "idle";
186
+ };
187
+
188
+ const attach = (next: MediaStreamLike): void => {
189
+ const tracks = next.getTracks();
190
+ const onEnded = (): void => {
191
+ if (stream.value === next && tracks.every((track) => track.readyState === "ended")) stop();
192
+ };
193
+ for (const track of tracks) track.addEventListener("ended", onEnded);
194
+ detach = () => {
195
+ for (const track of tracks) track.removeEventListener("ended", onEnded);
196
+ };
197
+ };
198
+
199
+ const start = async (): Promise<MediaStreamLike | undefined> => {
200
+ if (status.value === "active" && stream.value) return stream.value;
201
+ const current = ++generation;
202
+ const source = resolveSource();
203
+ if (!source) {
204
+ if (typeof window !== "undefined") {
205
+ error.value = { code: "unsupported", cause: undefined };
206
+ status.value = "error";
207
+ }
208
+ return undefined;
209
+ }
210
+ error.value = undefined;
211
+ status.value = "requesting";
212
+ let next: MediaStreamLike;
213
+ try {
214
+ next = await source.request(toValue(options.constraints));
215
+ } catch (cause) {
216
+ if (current === generation) {
217
+ error.value = { code: classify(cause), cause };
218
+ status.value = "error";
219
+ }
220
+ return undefined;
221
+ }
222
+ if (current !== generation) {
223
+ stopTracks(next);
224
+ return undefined;
225
+ }
226
+ detach?.();
227
+ const previous = stream.value;
228
+ if (previous && previous !== next) stopTracks(previous);
229
+ stream.value = next;
230
+ attach(next);
231
+ status.value = "active";
232
+ return next;
233
+ };
234
+
235
+ const restart = async (): Promise<MediaStreamLike | undefined> => {
236
+ stop();
237
+ return start();
238
+ };
239
+
240
+ watch(
241
+ () => toValue(options.enabled) ?? false,
242
+ (enabled) => {
243
+ if (enabled) void start();
244
+ else if (status.value !== "idle") stop();
245
+ },
246
+ { immediate: true },
247
+ );
248
+
249
+ watch(
250
+ () => toValue(options.constraints),
251
+ () => {
252
+ if ((options.autoSwitch ?? true) && status.value === "active") void restart();
253
+ },
254
+ { deep: true },
255
+ );
256
+
257
+ tryOnScopeDispose(stop);
258
+
259
+ return {
260
+ supported: computed(() => resolveSource() !== undefined),
261
+ stream,
262
+ status: readonly(status),
263
+ error,
264
+ start,
265
+ stop,
266
+ restart,
267
+ };
268
+ }
269
+
270
+ /** Minimal `MediaDeviceInfo`. */
271
+ export interface MediaDeviceInfoLike {
272
+ /** Device identifier. */
273
+ readonly deviceId: string;
274
+
275
+ /** `"audioinput"`, `"audiooutput"`, or `"videoinput"`. */
276
+ readonly kind: string;
277
+
278
+ /** Human-readable label (empty until permission is granted). */
279
+ readonly label: string;
280
+
281
+ /** Identifier shared by devices of one physical unit. */
282
+ readonly groupId: string;
283
+ }
284
+
285
+ /** Minimal `MediaDevices` consumed by {@link useUserMedia}. */
286
+ export interface UserMediaHost extends EventTarget {
287
+ /** Request camera/microphone access. */
288
+ getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStreamLike>;
289
+
290
+ /** List media devices. */
291
+ enumerateDevices?(): Promise<readonly MediaDeviceInfoLike[]>;
292
+ }
293
+
294
+ /** Options for {@link useUserMedia}. */
295
+ export interface UseUserMediaOptions {
296
+ /**
297
+ * Reactive constraints for `getUserMedia`.
298
+ *
299
+ * @default { audio: true, video: true }
300
+ */
301
+ readonly constraints?: MaybeRefOrGetter<MediaStreamConstraints>;
302
+
303
+ /**
304
+ * Start while `true`, stop while `false`.
305
+ *
306
+ * @default false
307
+ */
308
+ readonly enabled?: MaybeRefOrGetter<boolean>;
309
+
310
+ /**
311
+ * Restart an active stream when the constraints change.
312
+ *
313
+ * @default true
314
+ */
315
+ readonly autoSwitch?: boolean;
316
+
317
+ /**
318
+ * Keep `devices` current via `enumerateDevices` and `devicechange`.
319
+ *
320
+ * @default false
321
+ */
322
+ readonly listDevices?: boolean;
323
+
324
+ /**
325
+ * `MediaDevices` capability for alternate runtimes and tests.
326
+ *
327
+ * @default window.navigator.mediaDevices
328
+ */
329
+ readonly host?: MaybeRefOrGetter<UserMediaHost | null | undefined>;
330
+ }
331
+
332
+ /** Reactive state and actions returned by {@link useUserMedia}. */
333
+ export interface UserMediaControls extends MediaStreamControls {
334
+ /** Media devices, populated when `listDevices` is enabled. */
335
+ readonly devices: Readonly<ShallowRef<readonly MediaDeviceInfoLike[]>>;
336
+
337
+ /**
338
+ * Re-enumerate media devices.
339
+ *
340
+ * @returns The device list, empty when unsupported or on failure.
341
+ */
342
+ readonly refreshDevices: () => Promise<readonly MediaDeviceInfoLike[]>;
343
+ }
344
+
345
+ function browserUserMediaHost(): UserMediaHost | undefined {
346
+ if (typeof window === "undefined") return undefined;
347
+ // `mediaDevices` is undefined in insecure contexts despite its DOM typing.
348
+ const devices: MediaDevices | undefined = window.navigator.mediaDevices;
349
+ return devices ?? undefined;
350
+ }
351
+
352
+ /**
353
+ * Access the camera and microphone with `getUserMedia`.
354
+ *
355
+ * Built on {@link useMediaStream}: reactive constraints (restarting an
356
+ * active stream when they change), `enabled` activation, classified
357
+ * failures such as `"permission-denied"`, and latest-wins requests. With
358
+ * `listDevices`, `devices` follows `devicechange`. Tracks and listeners are
359
+ * released when the owning reactive scope stops.
360
+ *
361
+ * Server rendering: no device is touched; `status` is `"idle"`, `stream` is
362
+ * undefined, and `supported` is false.
363
+ *
364
+ * @example
365
+ * ```ts
366
+ * const camera = useUserMedia({ constraints: { video: true, audio: false } });
367
+ * await camera.start();
368
+ * video.srcObject = camera.stream.value;
369
+ * ```
370
+ *
371
+ * @param options Constraints, activation, device listing, and capability.
372
+ * @default options {}
373
+ * @returns Stream state, device list, and actions.
374
+ */
375
+ export function useUserMedia(options: UseUserMediaOptions = {}): UserMediaControls {
376
+ const resolveHost = (): UserMediaHost | undefined =>
377
+ options.host === undefined ? browserUserMediaHost() : (toValue(options.host) ?? undefined);
378
+ const devices = shallowRef<readonly MediaDeviceInfoLike[]>([]);
379
+
380
+ const controls = useMediaStream<MediaStreamConstraints>({
381
+ source: () => {
382
+ const host = resolveHost();
383
+ return host ? { request: (constraints) => host.getUserMedia(constraints) } : undefined;
384
+ },
385
+ constraints: () => toValue(options.constraints) ?? { audio: true, video: true },
386
+ enabled: () => toValue(options.enabled) ?? false,
387
+ autoSwitch: options.autoSwitch ?? true,
388
+ });
389
+
390
+ const refreshDevices = async (): Promise<readonly MediaDeviceInfoLike[]> => {
391
+ const host = resolveHost();
392
+ if (!host?.enumerateDevices) return (devices.value = []);
393
+ try {
394
+ devices.value = [...(await host.enumerateDevices())];
395
+ } catch {
396
+ devices.value = [];
397
+ }
398
+ return devices.value;
399
+ };
400
+
401
+ if (options.listDevices ?? false) {
402
+ watch(
403
+ resolveHost,
404
+ (host, _previous, onCleanup) => {
405
+ if (!host) return;
406
+ const update = (): void => {
407
+ void refreshDevices();
408
+ };
409
+ update();
410
+ host.addEventListener("devicechange", update);
411
+ onCleanup(() => host.removeEventListener("devicechange", update));
412
+ },
413
+ { immediate: true, flush: "sync" },
414
+ );
415
+ // Labels become available once a stream was granted.
416
+ watch(controls.status, (status) => {
417
+ if (status === "active") void refreshDevices();
418
+ });
419
+ }
420
+
421
+ return { ...controls, devices, refreshDevices };
422
+ }
@@ -0,0 +1,210 @@
1
+ import { computed, ref, shallowRef, toRaw, watch } from "vue";
2
+ import type { Ref, WritableComputedRef } from "vue";
3
+
4
+ /** Emit function able to send `event` with a value of type `Value`. */
5
+ export type VModelEmit<Event extends string, Value> = (event: Event, value: Value) => void;
6
+
7
+ /** Options for {@link useVModel}. */
8
+ export interface UseVModelOptions<
9
+ Value,
10
+ Event extends string = string,
11
+ Default extends Exclude<Value, undefined> | undefined = Exclude<Value, undefined>,
12
+ > {
13
+ /**
14
+ * Keep a local copy that works even when the parent does not bind
15
+ * `v-model`: writes update the copy and emit, prop changes overwrite it.
16
+ *
17
+ * @default false
18
+ */
19
+ readonly passive?: boolean;
20
+
21
+ /**
22
+ * Event name to emit.
23
+ *
24
+ * @default `update:${key}`
25
+ */
26
+ readonly eventName?: Event;
27
+
28
+ /**
29
+ * In passive mode, store the local copy deeply reactive and also emit on
30
+ * nested mutations of it.
31
+ *
32
+ * @default false
33
+ */
34
+ readonly deep?: boolean;
35
+
36
+ /**
37
+ * Value read while the prop is `undefined`.
38
+ *
39
+ * @default undefined
40
+ */
41
+ readonly defaultValue?: Default;
42
+
43
+ /**
44
+ * In passive mode, copy prop values before storing them locally so local
45
+ * mutations never touch the parent's object: `true` uses
46
+ * `structuredClone` on the raw (unproxied) value, a function is used as
47
+ * the cloner.
48
+ *
49
+ * @default false
50
+ */
51
+ readonly clone?: boolean | ((value: Value) => Value);
52
+
53
+ /**
54
+ * Veto emitting a value.
55
+ *
56
+ * @default undefined (always emit)
57
+ */
58
+ readonly shouldEmit?: (value: Value) => boolean;
59
+ }
60
+
61
+ /** Model value type: `undefined` is removed when a default is configured. */
62
+ export type VModelValue<Value, Default> = [Default] extends [undefined]
63
+ ? Value
64
+ : Exclude<Value, undefined>;
65
+
66
+ /**
67
+ * Two-way binding helper for a component prop.
68
+ *
69
+ * Reads the prop and emits `update:<key>` (or `eventName`) on write, typed
70
+ * end to end: the key must be a prop, the emitted value has the prop's type,
71
+ * and `emit` must accept that exact event (a `defineEmits` result with the
72
+ * matching overload qualifies). With `passive: true` a local ref mirrors the
73
+ * prop so the component also works uncontrolled. Relies only on the props
74
+ * and emit you pass (no component internals), so it is SSR- and
75
+ * Vapor-friendly; the passive watchers follow the owning scope.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const props = defineProps<{ modelValue: string }>();
80
+ * const emit = defineEmits<{ "update:modelValue": [value: string] }>();
81
+ * const model = useVModel(props, "modelValue", emit);
82
+ * model.value = "next"; // emits update:modelValue
83
+ * ```
84
+ *
85
+ * @param props Component props object.
86
+ * @param key Prop to bind.
87
+ * @param emit Component emit function.
88
+ * @param options Passive mode, event name, default, clone, and emit guard.
89
+ * @default options {}
90
+ * @returns A writable ref over the prop.
91
+ */
92
+ export function useVModel<
93
+ Props extends object,
94
+ Key extends keyof Props & string,
95
+ Event extends string = `update:${Key}`,
96
+ Default extends Exclude<Props[Key], undefined> | undefined = undefined,
97
+ >(
98
+ props: Props,
99
+ key: Key,
100
+ emit: VModelEmit<NoInfer<Event>, NoInfer<Props[Key]>>,
101
+ options?: UseVModelOptions<Props[Key], Event, Default>,
102
+ ): Ref<VModelValue<Props[Key], Default>>;
103
+ export function useVModel(
104
+ props: Readonly<Record<string, unknown>>,
105
+ key: string,
106
+ emit: VModelEmit<string, unknown>,
107
+ options: UseVModelOptions<unknown, string, unknown> = {},
108
+ ): Ref<unknown> | WritableComputedRef<unknown> {
109
+ const event = options.eventName ?? `update:${key}`;
110
+ const read = (): unknown => props[key] ?? options.defaultValue;
111
+ const send = (value: unknown): void => {
112
+ if (options.shouldEmit?.(value) ?? true) emit(event, value);
113
+ };
114
+
115
+ if (!(options.passive ?? false)) {
116
+ return computed({ get: read, set: send });
117
+ }
118
+
119
+ const clone =
120
+ options.clone === true
121
+ ? (value: unknown): unknown => structuredClone(toRaw(value))
122
+ : typeof options.clone === "function"
123
+ ? options.clone
124
+ : (value: unknown): unknown => value;
125
+ const deep = options.deep ?? false;
126
+ const local: Ref<unknown> = deep ? ref(clone(read())) : shallowRef(clone(read()));
127
+ let fromProp = false;
128
+
129
+ watch(read, (value) => {
130
+ fromProp = true;
131
+ local.value = clone(value);
132
+ fromProp = false;
133
+ });
134
+ watch(
135
+ local,
136
+ (value) => {
137
+ if (!fromProp && (deep || value !== props[key])) send(value);
138
+ },
139
+ { deep, flush: "sync" },
140
+ );
141
+ return local;
142
+ }
143
+
144
+ /** Options for {@link useVModels}. */
145
+ export interface UseVModelsOptions<Key extends string> extends Omit<
146
+ UseVModelOptions<unknown>,
147
+ "eventName" | "defaultValue" | "shouldEmit" | "clone"
148
+ > {
149
+ /**
150
+ * Props to bind. Defaults to every prop, which then requires an
151
+ * `update:<prop>` emit for each of them.
152
+ *
153
+ * @default all prop keys
154
+ */
155
+ readonly keys?: readonly Key[];
156
+ }
157
+
158
+ /** Turn a union into the intersection of its members. */
159
+ type UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (
160
+ value: infer Intersection,
161
+ ) => void
162
+ ? Intersection
163
+ : never;
164
+
165
+ /** Emit overloads required by {@link useVModels} for the bound keys. */
166
+ export type VModelsEmit<Props, Key extends keyof Props & string> = UnionToIntersection<
167
+ { [Name in Key]: VModelEmit<`update:${Name}`, Props[Name]> }[Key]
168
+ >;
169
+
170
+ /**
171
+ * {@link useVModel} for several props at once.
172
+ *
173
+ * Returns one writable ref per bound prop, each emitting its own
174
+ * `update:<prop>` event. `emit` must declare an update event for every bound
175
+ * key; restrict the set with `keys`.
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * const { open, value } = useVModels(props, emit, { keys: ["open", "value"] });
180
+ * ```
181
+ *
182
+ * @param props Component props object.
183
+ * @param emit Component emit function.
184
+ * @param options Passive mode, depth, and the keys to bind.
185
+ * @default options {}
186
+ * @returns One writable ref per bound prop.
187
+ */
188
+ export function useVModels<
189
+ Props extends object,
190
+ const Key extends keyof Props & string = keyof Props & string,
191
+ >(
192
+ props: Props,
193
+ emit: NoInfer<VModelsEmit<Props, Key>>,
194
+ options?: UseVModelsOptions<Key>,
195
+ ): { readonly [Name in Key]: Ref<Props[Name]> };
196
+ export function useVModels(
197
+ props: Readonly<Record<string, unknown>>,
198
+ emit: VModelEmit<`update:${string}`, unknown>,
199
+ options: UseVModelsOptions<string> = {},
200
+ ): { readonly [key: string]: Ref<unknown> } {
201
+ const keys = options.keys ?? Object.keys(props);
202
+ const models: Record<string, Ref<unknown> | WritableComputedRef<unknown>> = {};
203
+ for (const key of keys) {
204
+ models[key] = useVModel(props, key, emit, {
205
+ ...(options.passive === undefined ? {} : { passive: options.passive }),
206
+ ...(options.deep === undefined ? {} : { deep: options.deep }),
207
+ });
208
+ }
209
+ return models;
210
+ }