@vizejs/composable 0.426.3 → 0.428.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,395 @@
1
+ import {
2
+ computed,
3
+ hasInjectionContext,
4
+ readonly,
5
+ shallowReadonly,
6
+ shallowRef,
7
+ toValue,
8
+ watch,
9
+ watchPostEffect,
10
+ } from "vue";
11
+ import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
12
+
13
+ import { tryOnScopeDispose } from "./scope.ts";
14
+
15
+ /** Device filter for `requestDevice`. */
16
+ export interface USBDeviceFilter {
17
+ /** USB vendor id. */
18
+ readonly vendorId?: number;
19
+ /** USB product id. */
20
+ readonly productId?: number;
21
+ /** Device or interface class code. */
22
+ readonly classCode?: number;
23
+ /** Device or interface subclass code. */
24
+ readonly subclassCode?: number;
25
+ /** Device or interface protocol code. */
26
+ readonly protocolCode?: number;
27
+ /** Serial number. */
28
+ readonly serialNumber?: string;
29
+ }
30
+
31
+ /** Transfer status reported by WebUSB. */
32
+ export type USBTransferStatus = "ok" | "stall" | "babble";
33
+
34
+ /** Result of an IN transfer. */
35
+ export interface USBInTransferResultLike {
36
+ /** Transfer status. */
37
+ readonly status: USBTransferStatus;
38
+ /** Received bytes. */
39
+ readonly data?: DataView | null;
40
+ }
41
+
42
+ /** Result of an OUT transfer. */
43
+ export interface USBOutTransferResultLike {
44
+ /** Transfer status. */
45
+ readonly status: USBTransferStatus;
46
+ /** Number of bytes written. */
47
+ readonly bytesWritten: number;
48
+ }
49
+
50
+ /** Setup packet of a control transfer. */
51
+ export interface USBControlTransferSetup {
52
+ /** Request category. */
53
+ readonly requestType: "standard" | "class" | "vendor";
54
+ /** Request target. */
55
+ readonly recipient: "device" | "interface" | "endpoint" | "other";
56
+ /** `bRequest`. */
57
+ readonly request: number;
58
+ /** `wValue`. */
59
+ readonly value: number;
60
+ /** `wIndex`. */
61
+ readonly index: number;
62
+ }
63
+
64
+ /** Minimal `USBDevice` used by {@link useUSB}. */
65
+ export interface USBDeviceLike {
66
+ /** USB vendor id. */
67
+ readonly vendorId: number;
68
+ /** USB product id. */
69
+ readonly productId: number;
70
+ /** Product name. */
71
+ readonly productName?: string | undefined;
72
+ /** Serial number. */
73
+ readonly serialNumber?: string | undefined;
74
+ /** Whether a session is open. */
75
+ readonly opened: boolean;
76
+ /** Start a session. */
77
+ open(): Promise<void>;
78
+ /** End the session. */
79
+ close(): Promise<void>;
80
+ /** Select a configuration by value. */
81
+ selectConfiguration(configurationValue: number): Promise<void>;
82
+ /** Claim an interface. */
83
+ claimInterface(interfaceNumber: number): Promise<void>;
84
+ /** Release a claimed interface. */
85
+ releaseInterface(interfaceNumber: number): Promise<void>;
86
+ /** Bulk/interrupt IN transfer. */
87
+ transferIn(endpointNumber: number, length: number): Promise<USBInTransferResultLike>;
88
+ /** Bulk/interrupt OUT transfer. */
89
+ transferOut(endpointNumber: number, data: BufferSource): Promise<USBOutTransferResultLike>;
90
+ /** Control IN transfer. */
91
+ controlTransferIn(
92
+ setup: USBControlTransferSetup,
93
+ length: number,
94
+ ): Promise<USBInTransferResultLike>;
95
+ /** Control OUT transfer. */
96
+ controlTransferOut(
97
+ setup: USBControlTransferSetup,
98
+ data?: BufferSource,
99
+ ): Promise<USBOutTransferResultLike>;
100
+ }
101
+
102
+ /** `navigator.usb`-like capability used by {@link useUSB}. */
103
+ export interface USBHost extends EventTarget {
104
+ /** Devices the page already has access to. */
105
+ getDevices(): Promise<USBDeviceLike[]>;
106
+ /** Prompt the user for a device. */
107
+ requestDevice(options: { readonly filters: USBDeviceFilter[] }): Promise<USBDeviceLike>;
108
+ }
109
+
110
+ /** Plain, reactive-friendly description of a granted device. */
111
+ export interface USBDeviceInfo {
112
+ /** The live device, for passing back to the actions. */
113
+ readonly device: USBDeviceLike;
114
+ /** USB vendor id. */
115
+ readonly vendorId: number;
116
+ /** USB product id. */
117
+ readonly productId: number;
118
+ /** Product name (empty when unknown). */
119
+ readonly productName: string;
120
+ /** Serial number (empty when unknown). */
121
+ readonly serialNumber: string;
122
+ /** Whether a session was open when the list was refreshed. */
123
+ readonly opened: boolean;
124
+ }
125
+
126
+ /** Options for {@link useUSB}. */
127
+ export interface UseUSBOptions {
128
+ /**
129
+ * `navigator.usb`-like capability.
130
+ *
131
+ * @default window.navigator.usb when it exists
132
+ */
133
+ readonly host?: MaybeRefOrGetter<USBHost | null | undefined>;
134
+ }
135
+
136
+ /** Reactive state and actions returned by {@link useUSB}. */
137
+ export interface USBControls {
138
+ /** Whether WebUSB is available. */
139
+ readonly supported: ComputedRef<boolean>;
140
+ /** Granted devices, refreshed on `connect` / `disconnect` and after every action. */
141
+ readonly devices: Readonly<ShallowRef<readonly USBDeviceInfo[]>>;
142
+ /** Most recent failure. */
143
+ readonly error: Readonly<ShallowRef<unknown>>;
144
+ /**
145
+ * Prompt the user for a device (requires user activation).
146
+ *
147
+ * @returns The chosen device, or `undefined` when cancelled or failed.
148
+ */
149
+ readonly requestDevice: (filters?: USBDeviceFilter[]) => Promise<USBDeviceLike | undefined>;
150
+ /**
151
+ * Refresh `devices`.
152
+ *
153
+ * @returns The granted devices.
154
+ */
155
+ readonly getDevices: () => Promise<readonly USBDeviceInfo[]>;
156
+ /**
157
+ * Open a session.
158
+ *
159
+ * @returns Whether it succeeded.
160
+ */
161
+ readonly open: (device: USBDeviceLike) => Promise<boolean>;
162
+ /**
163
+ * Close a session.
164
+ *
165
+ * @returns Whether it succeeded.
166
+ */
167
+ readonly close: (device: USBDeviceLike) => Promise<boolean>;
168
+ /**
169
+ * Select a configuration.
170
+ *
171
+ * @returns Whether it succeeded.
172
+ */
173
+ readonly selectConfiguration: (device: USBDeviceLike, value: number) => Promise<boolean>;
174
+ /**
175
+ * Claim an interface.
176
+ *
177
+ * @returns Whether it succeeded.
178
+ */
179
+ readonly claimInterface: (device: USBDeviceLike, interfaceNumber: number) => Promise<boolean>;
180
+ /**
181
+ * Release an interface.
182
+ *
183
+ * @returns Whether it succeeded.
184
+ */
185
+ readonly releaseInterface: (device: USBDeviceLike, interfaceNumber: number) => Promise<boolean>;
186
+ /**
187
+ * Bulk/interrupt IN transfer.
188
+ *
189
+ * @returns The result, or `undefined` on failure.
190
+ */
191
+ readonly transferIn: (
192
+ device: USBDeviceLike,
193
+ endpoint: number,
194
+ length: number,
195
+ ) => Promise<USBInTransferResultLike | undefined>;
196
+ /**
197
+ * Bulk/interrupt OUT transfer.
198
+ *
199
+ * @returns The result, or `undefined` on failure.
200
+ */
201
+ readonly transferOut: (
202
+ device: USBDeviceLike,
203
+ endpoint: number,
204
+ data: BufferSource,
205
+ ) => Promise<USBOutTransferResultLike | undefined>;
206
+ /**
207
+ * Control IN transfer.
208
+ *
209
+ * @returns The result, or `undefined` on failure.
210
+ */
211
+ readonly controlTransferIn: (
212
+ device: USBDeviceLike,
213
+ setup: USBControlTransferSetup,
214
+ length: number,
215
+ ) => Promise<USBInTransferResultLike | undefined>;
216
+ /**
217
+ * Control OUT transfer.
218
+ *
219
+ * @returns The result, or `undefined` on failure.
220
+ */
221
+ readonly controlTransferOut: (
222
+ device: USBDeviceLike,
223
+ setup: USBControlTransferSetup,
224
+ data?: BufferSource,
225
+ ) => Promise<USBOutTransferResultLike | undefined>;
226
+ }
227
+
228
+ function browserUSBHost(): USBHost | undefined {
229
+ if (typeof window === "undefined") return undefined;
230
+ const { navigator } = window;
231
+ // WebUSB is not part of the DOM lib; read it through a structural guard.
232
+ const usb: unknown = "usb" in navigator ? navigator.usb : undefined;
233
+ return isUSBHost(usb) ? usb : undefined;
234
+ }
235
+
236
+ function isUSBHost(value: unknown): value is USBHost {
237
+ return typeof value === "object" && value !== null && "requestDevice" in value;
238
+ }
239
+
240
+ function describe(device: USBDeviceLike): USBDeviceInfo {
241
+ return {
242
+ device,
243
+ vendorId: device.vendorId,
244
+ productId: device.productId,
245
+ productName: device.productName ?? "",
246
+ serialNumber: device.serialNumber ?? "",
247
+ opened: device.opened,
248
+ };
249
+ }
250
+
251
+ /**
252
+ * Talk to USB devices with the WebUSB API.
253
+ *
254
+ * `devices` lists granted devices as plain snapshots and follows the host's
255
+ * `connect` / `disconnect` events. The device actions are thin wrappers over
256
+ * `USBDevice` that resolve to a boolean or the transfer result and record
257
+ * failures in `error` instead of rejecting. Host listeners are removed and
258
+ * sessions opened through `open()` are closed when the owning reactive scope
259
+ * stops; outside a scope call `close()` per device.
260
+ *
261
+ * Server rendering: `supported` is false and `devices` is empty.
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * const usb = useUSB();
266
+ * const device = await usb.requestDevice([{ vendorId: 0x2341 }]);
267
+ * if (device && (await usb.open(device))) await usb.claimInterface(device, 0);
268
+ * ```
269
+ *
270
+ * @param options Capability host.
271
+ * @default options {}
272
+ * @returns USB state and actions.
273
+ */
274
+ export function useUSB(options: UseUSBOptions = {}): USBControls {
275
+ const devices = shallowRef<readonly USBDeviceInfo[]>([]);
276
+ const error = shallowRef<unknown>(undefined);
277
+ const owned = new Set<USBDeviceLike>();
278
+
279
+ // Inside a component the host resolves only after mount (a post-flush
280
+ // job), so a hydrating client first renders the same unsupported state as
281
+ // the server. Outside components it resolves immediately.
282
+ const hydrated = shallowRef(!hasInjectionContext());
283
+ if (!hydrated.value) {
284
+ watchPostEffect(() => {
285
+ hydrated.value = true;
286
+ });
287
+ }
288
+ const resolveHost = (): USBHost | undefined =>
289
+ !hydrated.value
290
+ ? undefined
291
+ : options.host === undefined
292
+ ? browserUSBHost()
293
+ : (toValue(options.host) ?? undefined);
294
+
295
+ const snapshot = (): void => {
296
+ devices.value = devices.value.map((entry) => describe(entry.device));
297
+ };
298
+
299
+ const attempt = async <Value>(action: () => Promise<Value>): Promise<Value | undefined> => {
300
+ try {
301
+ const value = await action();
302
+ error.value = undefined;
303
+ return value;
304
+ } catch (cause) {
305
+ error.value = cause;
306
+ return undefined;
307
+ } finally {
308
+ snapshot();
309
+ }
310
+ };
311
+
312
+ const succeeded = async (action: () => Promise<void>): Promise<boolean> =>
313
+ (await attempt(() => action().then(() => true))) === true;
314
+
315
+ const getDevices = async (): Promise<readonly USBDeviceInfo[]> => {
316
+ const host = resolveHost();
317
+ if (!host) return devices.value;
318
+ try {
319
+ devices.value = (await host.getDevices()).map(describe);
320
+ } catch (cause) {
321
+ error.value = cause;
322
+ }
323
+ return devices.value;
324
+ };
325
+
326
+ const requestDevice = async (
327
+ filters: USBDeviceFilter[] = [],
328
+ ): Promise<USBDeviceLike | undefined> => {
329
+ const host = resolveHost();
330
+ if (!host) return undefined;
331
+ const chosen = await attempt(() => host.requestDevice({ filters }));
332
+ if (chosen) await getDevices();
333
+ return chosen;
334
+ };
335
+
336
+ const open = async (device: USBDeviceLike): Promise<boolean> => {
337
+ const opened = await succeeded(() => device.open());
338
+ if (opened) owned.add(device);
339
+ return opened;
340
+ };
341
+
342
+ const close = (device: USBDeviceLike): Promise<boolean> => {
343
+ owned.delete(device);
344
+ return succeeded(() => device.close());
345
+ };
346
+
347
+ const onConnectionChange = (): void => {
348
+ void getDevices();
349
+ };
350
+
351
+ watch(
352
+ resolveHost,
353
+ (host, _previous, onCleanup) => {
354
+ if (!host) {
355
+ devices.value = [];
356
+ return;
357
+ }
358
+ host.addEventListener("connect", onConnectionChange);
359
+ host.addEventListener("disconnect", onConnectionChange);
360
+ onCleanup(() => {
361
+ host.removeEventListener("connect", onConnectionChange);
362
+ host.removeEventListener("disconnect", onConnectionChange);
363
+ });
364
+ void getDevices();
365
+ },
366
+ { immediate: true, flush: "sync" },
367
+ );
368
+
369
+ tryOnScopeDispose(() => {
370
+ for (const device of owned) if (device.opened) void close(device);
371
+ });
372
+
373
+ return {
374
+ supported: computed(() => resolveHost() !== undefined),
375
+ devices: shallowReadonly(devices),
376
+ error: readonly(error),
377
+ requestDevice,
378
+ getDevices,
379
+ open,
380
+ close,
381
+ selectConfiguration: (device, value) => succeeded(() => device.selectConfiguration(value)),
382
+ claimInterface: (device, number) => succeeded(() => device.claimInterface(number)),
383
+ releaseInterface: (device, number) => succeeded(() => device.releaseInterface(number)),
384
+ transferIn: (device, endpoint, length) => attempt(() => device.transferIn(endpoint, length)),
385
+ transferOut: (device, endpoint, data) => attempt(() => device.transferOut(endpoint, data)),
386
+ controlTransferIn: (device, setup, length) =>
387
+ attempt(() => device.controlTransferIn(setup, length)),
388
+ controlTransferOut: (device, setup, data) =>
389
+ attempt(() =>
390
+ data === undefined
391
+ ? device.controlTransferOut(setup)
392
+ : device.controlTransferOut(setup, data),
393
+ ),
394
+ };
395
+ }
@@ -0,0 +1,215 @@
1
+ import {
2
+ computed,
3
+ hasInjectionContext,
4
+ readonly,
5
+ ref,
6
+ shallowRef,
7
+ toValue,
8
+ watch,
9
+ watchPostEffect,
10
+ } from "vue";
11
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
12
+
13
+ import { tryOnScopeDispose } from "./scope.ts";
14
+ import type { IntervalScheduler } from "./use-interval.ts";
15
+
16
+ /** Minimal `navigator.userActivation` (`UserActivation`). */
17
+ export interface UserActivationLike {
18
+ /** Whether the page ever had sticky activation. */
19
+ readonly hasBeenActive: boolean;
20
+ /** Whether the page currently has transient activation. */
21
+ readonly isActive: boolean;
22
+ }
23
+
24
+ /** Options for {@link useUserActivation}. */
25
+ export interface UseUserActivationOptions {
26
+ /**
27
+ * User activation state for alternate runtimes and tests.
28
+ *
29
+ * @default window.navigator.userActivation when it exists
30
+ */
31
+ readonly userActivation?: MaybeRefOrGetter<UserActivationLike | null | undefined>;
32
+
33
+ /**
34
+ * Target whose activation-triggering events refresh the state.
35
+ *
36
+ * @default window
37
+ */
38
+ readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
39
+
40
+ /**
41
+ * Events that refresh the state.
42
+ *
43
+ * @default ["keydown", "mousedown", "pointerdown", "pointerup", "touchend"]
44
+ */
45
+ readonly events?: readonly string[];
46
+
47
+ /**
48
+ * Poll interval in milliseconds while `isActive` is true, so its expiry is
49
+ * observed. `0` disables polling.
50
+ *
51
+ * @default 1000
52
+ */
53
+ readonly interval?: number;
54
+
55
+ /**
56
+ * Timer host for polling.
57
+ *
58
+ * @default window timer functions
59
+ */
60
+ readonly scheduler?: IntervalScheduler;
61
+ }
62
+
63
+ /** Reactive state returned by {@link useUserActivation}. */
64
+ export interface UserActivationControls {
65
+ /** Whether the User Activation API is available. */
66
+ readonly supported: ComputedRef<boolean>;
67
+ /** Sticky activation: the user interacted with the page at least once. */
68
+ readonly hasBeenActive: Readonly<Ref<boolean>>;
69
+ /** Transient activation: a gated API (popup, fullscreen, clipboard) may be called now. */
70
+ readonly isActive: Readonly<Ref<boolean>>;
71
+ /** Re-read the activation state. */
72
+ readonly refresh: () => void;
73
+ /** Remove listeners and timers. Idempotent. */
74
+ readonly stop: () => void;
75
+ }
76
+
77
+ const defaultEvents: readonly string[] = [
78
+ "keydown",
79
+ "mousedown",
80
+ "pointerdown",
81
+ "pointerup",
82
+ "touchend",
83
+ ];
84
+
85
+ function isUserActivation(candidate: unknown): candidate is UserActivationLike {
86
+ return typeof candidate === "object" && candidate !== null && "isActive" in candidate;
87
+ }
88
+
89
+ function browserUserActivation(): UserActivationLike | undefined {
90
+ if (typeof window === "undefined") return undefined;
91
+ const candidate: unknown = Reflect.get(window.navigator, "userActivation");
92
+ return isUserActivation(candidate) ? candidate : undefined;
93
+ }
94
+
95
+ function browserScheduler(): IntervalScheduler | undefined {
96
+ if (typeof window === "undefined") return undefined;
97
+ return {
98
+ setInterval: (callback, intervalMs) => window.setInterval(callback, intervalMs),
99
+ clearInterval: (handle) => {
100
+ if (typeof handle === "number") window.clearInterval(handle);
101
+ },
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Track sticky and transient user activation with the User Activation API.
107
+ *
108
+ * The state is refreshed on activation-triggering events of `target`
109
+ * (immediately and again after a microtask) and polled while `isActive` is
110
+ * true so its expiry is observed. Listeners and the timer are removed when
111
+ * the owning reactive scope stops; outside a scope call `stop()`.
112
+ *
113
+ * Server rendering: no listeners or timers, `supported`, `hasBeenActive`,
114
+ * and `isActive` are false.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * const { isActive } = useUserActivation();
119
+ * const canOpenPopup = computed(() => isActive.value);
120
+ * ```
121
+ *
122
+ * @param options Capability host, event target, and polling policy.
123
+ * @default options {}
124
+ * @throws `RangeError` tagged `VIZE_COMPOSE_USER_ACTIVATION_INVALID_INTERVAL` when `interval` is negative or not finite.
125
+ * @returns Activation state.
126
+ */
127
+ export function useUserActivation(options: UseUserActivationOptions = {}): UserActivationControls {
128
+ const interval = options.interval ?? 1_000;
129
+ if (!Number.isFinite(interval) || interval < 0) {
130
+ throw new RangeError(
131
+ `[VIZE_COMPOSE_USER_ACTIVATION_INVALID_INTERVAL] interval must be a finite, non-negative number; received ${String(interval)}`,
132
+ );
133
+ }
134
+ const hasBeenActive = ref(false);
135
+ const isActive = ref(false);
136
+ let timer: { scheduler: IntervalScheduler; handle: unknown } | undefined;
137
+
138
+ // Inside a component the host resolves only after mount (a post-flush
139
+ // job), so a hydrating client first renders the same unsupported state as
140
+ // the server. Outside components it resolves immediately.
141
+ const hydrated = shallowRef(!hasInjectionContext());
142
+ if (!hydrated.value) {
143
+ watchPostEffect(() => {
144
+ hydrated.value = true;
145
+ });
146
+ }
147
+ const resolveHost = (): UserActivationLike | undefined =>
148
+ !hydrated.value
149
+ ? undefined
150
+ : options.userActivation === undefined
151
+ ? browserUserActivation()
152
+ : (toValue(options.userActivation) ?? undefined);
153
+
154
+ const stopPolling = (): void => {
155
+ timer?.scheduler.clearInterval(timer.handle);
156
+ timer = undefined;
157
+ };
158
+
159
+ const refresh = (): void => {
160
+ const host = resolveHost();
161
+ hasBeenActive.value = host?.hasBeenActive ?? false;
162
+ isActive.value = host?.isActive ?? false;
163
+ if (!isActive.value) {
164
+ stopPolling();
165
+ return;
166
+ }
167
+ if (timer || interval === 0) return;
168
+ const scheduler = options.scheduler ?? browserScheduler();
169
+ if (scheduler) timer = { scheduler, handle: scheduler.setInterval(refresh, interval) };
170
+ };
171
+
172
+ const onEvent = (): void => {
173
+ refresh();
174
+ void Promise.resolve().then(refresh);
175
+ };
176
+
177
+ const stopWatch = watch(
178
+ () =>
179
+ [
180
+ options.target === undefined
181
+ ? typeof window === "undefined"
182
+ ? undefined
183
+ : window
184
+ : (toValue(options.target) ?? undefined),
185
+ resolveHost(),
186
+ ] as const,
187
+ ([target, host], _previous, onCleanup) => {
188
+ // Read the state once the host resolves (after mount inside a component).
189
+ if (host) refresh();
190
+ if (!target || !host) return;
191
+ const events = options.events ?? defaultEvents;
192
+ for (const type of events)
193
+ target.addEventListener(type, onEvent, { capture: true, passive: true });
194
+ onCleanup(() => {
195
+ for (const type of events) target.removeEventListener(type, onEvent, { capture: true });
196
+ });
197
+ },
198
+ { immediate: true, flush: "sync" },
199
+ );
200
+
201
+ const stop = (): void => {
202
+ stopWatch();
203
+ stopPolling();
204
+ };
205
+
206
+ tryOnScopeDispose(stop);
207
+
208
+ return {
209
+ supported: computed(() => resolveHost() !== undefined),
210
+ hasBeenActive: readonly(hasBeenActive),
211
+ isActive: readonly(isActive),
212
+ refresh,
213
+ stop,
214
+ };
215
+ }