@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,174 @@
1
+ import { computed, readonly, ref, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
6
+
7
+ /** A single duration or an alternating vibrate/pause pattern in milliseconds. */
8
+ export type VibrationPattern = number | readonly number[];
9
+
10
+ /** Minimal Vibration API (`navigator`). */
11
+ export interface VibrationHost {
12
+ /** Start (or with `0`/`[]`, cancel) a vibration. Returns whether it was accepted. */
13
+ vibrate(pattern: VibrationPattern): boolean;
14
+ }
15
+
16
+ /** Options for {@link useVibrate}. */
17
+ export interface UseVibrateOptions {
18
+ /**
19
+ * Default pattern used by `vibrate()`.
20
+ *
21
+ * @default []
22
+ */
23
+ readonly pattern?: MaybeRefOrGetter<VibrationPattern>;
24
+
25
+ /**
26
+ * Repeat the pattern every `interval` milliseconds until `stop`; `0`
27
+ * vibrates once.
28
+ *
29
+ * @default 0
30
+ */
31
+ readonly interval?: number;
32
+
33
+ /**
34
+ * Vibration capability for alternate runtimes and tests.
35
+ *
36
+ * @default window.navigator when it implements `vibrate`
37
+ */
38
+ readonly host?: MaybeRefOrGetter<VibrationHost | null | undefined>;
39
+
40
+ /**
41
+ * Timer host used for repetition.
42
+ *
43
+ * @default globalThis timer functions
44
+ */
45
+ readonly scheduler?: TimeoutScheduler;
46
+ }
47
+
48
+ /** Reactive state and actions returned by {@link useVibrate}. */
49
+ export interface VibrateControls {
50
+ /** Whether the Vibration API is available. */
51
+ readonly supported: ComputedRef<boolean>;
52
+
53
+ /** Whether a (possibly repeating) vibration started by this composable is active. */
54
+ readonly vibrating: Readonly<Ref<boolean>>;
55
+
56
+ /**
57
+ * Vibrate with `pattern` or the default pattern.
58
+ *
59
+ * @param pattern Pattern overriding the default.
60
+ * @returns Whether the platform accepted the pattern.
61
+ * @throws {RangeError} `[VIZE_COMPOSE_VIBRATE_INVALID_PATTERN]` for negative,
62
+ * fractional, or non-finite durations.
63
+ */
64
+ readonly vibrate: (pattern?: VibrationPattern) => boolean;
65
+
66
+ /** Cancel the vibration and any repetition. */
67
+ readonly stop: () => void;
68
+ }
69
+
70
+ const defaultScheduler: TimeoutScheduler = {
71
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
72
+ clearTimeout: (handle) => {
73
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
74
+ },
75
+ };
76
+
77
+ function browserVibrationHost(): VibrationHost | undefined {
78
+ if (typeof window === "undefined") return undefined;
79
+ const { navigator } = window;
80
+ return typeof navigator.vibrate === "function" ? navigator : undefined;
81
+ }
82
+
83
+ function validatePattern(pattern: VibrationPattern): readonly number[] {
84
+ const durations = typeof pattern === "number" ? [pattern] : pattern;
85
+ for (const duration of durations) {
86
+ if (!Number.isSafeInteger(duration) || duration < 0) {
87
+ throw new RangeError(
88
+ `[VIZE_COMPOSE_VIBRATE_INVALID_PATTERN] vibration durations must be non-negative integers; received ${String(duration)}`,
89
+ );
90
+ }
91
+ }
92
+ return durations;
93
+ }
94
+
95
+ /**
96
+ * Drive the Vibration API with validated, optionally repeating patterns.
97
+ *
98
+ * Patterns alternate vibration and pause durations. With `interval > 0`
99
+ * the pattern repeats until `stop` is called or the owning reactive scope
100
+ * stops, which also cancels an ongoing vibration.
101
+ *
102
+ * Server rendering: nothing vibrates and no timer starts; `supported` is false.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const { vibrate, stop } = useVibrate({ pattern: [200, 100, 200] });
107
+ * vibrate();
108
+ * ```
109
+ *
110
+ * @param options Default pattern, repetition, and capability.
111
+ * @default options {}
112
+ * @returns Vibration state and actions.
113
+ * @throws {RangeError} `[VIZE_COMPOSE_VIBRATE_INVALID_INTERVAL]` for a negative
114
+ * or non-finite interval.
115
+ */
116
+ export function useVibrate(options: UseVibrateOptions = {}): VibrateControls {
117
+ const interval = options.interval ?? 0;
118
+ if (!Number.isFinite(interval) || interval < 0) {
119
+ throw new RangeError(
120
+ `[VIZE_COMPOSE_VIBRATE_INVALID_INTERVAL] interval must be a non-negative finite number; received ${String(interval)}`,
121
+ );
122
+ }
123
+ const scheduler = options.scheduler ?? defaultScheduler;
124
+ const vibrating = ref(false);
125
+ let handle: unknown;
126
+ let scheduled = false;
127
+
128
+ const resolveHost = (): VibrationHost | undefined =>
129
+ options.host === undefined ? browserVibrationHost() : (toValue(options.host) ?? undefined);
130
+
131
+ const clearRepeat = (): void => {
132
+ if (scheduled) scheduler.clearTimeout(handle);
133
+ scheduled = false;
134
+ };
135
+
136
+ const stop = (): void => {
137
+ clearRepeat();
138
+ if (vibrating.value) resolveHost()?.vibrate(0);
139
+ vibrating.value = false;
140
+ };
141
+
142
+ const vibrate = (pattern?: VibrationPattern): boolean => {
143
+ const durations = validatePattern(pattern ?? toValue(options.pattern) ?? []);
144
+ const host = resolveHost();
145
+ clearRepeat();
146
+ if (!host) return false;
147
+ const accepted = host.vibrate(durations);
148
+ const total = durations.reduce((sum, duration) => sum + duration, 0);
149
+ vibrating.value = accepted && total > 0;
150
+ if (vibrating.value && interval > 0) {
151
+ const repeat = (): void => {
152
+ scheduled = false;
153
+ if (!vibrating.value) return;
154
+ vibrating.value = host.vibrate(durations);
155
+ if (vibrating.value) {
156
+ scheduled = true;
157
+ handle = scheduler.setTimeout(repeat, interval);
158
+ }
159
+ };
160
+ scheduled = true;
161
+ handle = scheduler.setTimeout(repeat, interval);
162
+ }
163
+ return accepted;
164
+ };
165
+
166
+ tryOnScopeDispose(stop);
167
+
168
+ return {
169
+ supported: computed(() => resolveHost() !== undefined),
170
+ vibrating: readonly(vibrating),
171
+ vibrate,
172
+ stop,
173
+ };
174
+ }
@@ -0,0 +1,229 @@
1
+ import { computed, hasInjectionContext, readonly, shallowRef, toValue, watchPostEffect } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
3
+
4
+ import { useReducedMotion } from "./media-query.ts";
5
+ import { tryOnScopeDispose } from "./scope.ts";
6
+
7
+ /** Minimal `ViewTransition`. */
8
+ export interface ViewTransitionLike {
9
+ /** Settles when the transition animation finished (or was skipped). */
10
+ readonly finished: Promise<void>;
11
+ /** Resolves when the animation is about to start; rejects when skipped. */
12
+ readonly ready: Promise<void>;
13
+ /** Settles when the update callback settled. */
14
+ readonly updateCallbackDone: Promise<void>;
15
+ /** Skip the animation; the update still runs. */
16
+ skipTransition(): void;
17
+ }
18
+
19
+ /** Argument accepted by `document.startViewTransition`. */
20
+ export type StartViewTransitionArgument =
21
+ | (() => unknown)
22
+ | {
23
+ /** DOM update callback. */
24
+ readonly update?: () => unknown;
25
+ /** Active transition types (`:active-view-transition-type()`). */
26
+ readonly types?: string[];
27
+ };
28
+
29
+ /** Minimal document consumed by {@link useViewTransition}. */
30
+ export interface ViewTransitionDocumentHost {
31
+ /** Start a same-document view transition. */
32
+ startViewTransition(update?: StartViewTransitionArgument): ViewTransitionLike;
33
+ }
34
+
35
+ /** Options for {@link useViewTransition}. */
36
+ export interface UseViewTransitionOptions {
37
+ /**
38
+ * Document for alternate runtimes and tests.
39
+ *
40
+ * @default window.document when it implements startViewTransition
41
+ */
42
+ readonly document?: MaybeRefOrGetter<ViewTransitionDocumentHost | null | undefined>;
43
+
44
+ /**
45
+ * Run updates without a transition while reduced motion is preferred.
46
+ *
47
+ * @default true
48
+ */
49
+ readonly respectReducedMotion?: boolean;
50
+
51
+ /**
52
+ * Whether reduced motion is preferred.
53
+ *
54
+ * @default useReducedMotion() === "reduce"
55
+ */
56
+ readonly reducedMotion?: MaybeRefOrGetter<boolean>;
57
+ }
58
+
59
+ /** Per-call options of {@link ViewTransitionControls.start}. */
60
+ export interface ViewTransitionStartOptions {
61
+ /**
62
+ * Transition types. Runtimes without typed transitions fall back to an
63
+ * untyped transition.
64
+ *
65
+ * @default []
66
+ */
67
+ readonly types?: readonly string[];
68
+ }
69
+
70
+ /** Reactive state and actions returned by {@link useViewTransition}. */
71
+ export interface ViewTransitionControls {
72
+ /** Whether `document.startViewTransition` is available. */
73
+ readonly supported: ComputedRef<boolean>;
74
+
75
+ /**
76
+ * The running transition (the host object itself, not a readonly proxy, so
77
+ * native methods keep working), cleared once it finished.
78
+ */
79
+ readonly transition: ComputedRef<ViewTransitionLike | null>;
80
+
81
+ /** Whether a transition started by this composable is running. */
82
+ readonly isTransitioning: Readonly<ShallowRef<boolean>>;
83
+
84
+ /**
85
+ * Run `update` inside a view transition, or directly when unsupported or
86
+ * reduced motion is preferred.
87
+ *
88
+ * @param update DOM update; may return a value or a promise.
89
+ * @param options Transition types.
90
+ * @default options {}
91
+ * @returns Resolves with the update result once the DOM was updated (the
92
+ * animation may still run; await `transition.value?.finished` for it);
93
+ * rejects with the update error.
94
+ */
95
+ readonly start: <Result>(
96
+ update: () => Result | PromiseLike<Result>,
97
+ options?: ViewTransitionStartOptions,
98
+ ) => Promise<Result>;
99
+
100
+ /** Skip the running transition's animation. */
101
+ readonly skip: () => void;
102
+ }
103
+
104
+ function browserDocument(): ViewTransitionDocumentHost | undefined {
105
+ return typeof window !== "undefined" && typeof window.document.startViewTransition === "function"
106
+ ? window.document
107
+ : undefined;
108
+ }
109
+
110
+ function ignore(): void {
111
+ // Settlement is observed elsewhere.
112
+ }
113
+
114
+ /**
115
+ * Animate DOM updates with the View Transition API.
116
+ *
117
+ * Starting a new transition skips the running one (browser behavior). The
118
+ * running transition is skipped when the owning reactive scope stops.
119
+ *
120
+ * Server rendering: `start` runs the update directly; `supported` and
121
+ * `isTransitioning` are false.
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * const { start } = useViewTransition();
126
+ * await start(async () => {
127
+ * page.value = next;
128
+ * await nextTick();
129
+ * }, { types: ["forward"] });
130
+ * ```
131
+ *
132
+ * @param options Document host and reduced-motion policy.
133
+ * @default options {}
134
+ * @returns Transition state and actions.
135
+ */
136
+ export function useViewTransition(options: UseViewTransitionOptions = {}): ViewTransitionControls {
137
+ const transition = shallowRef<ViewTransitionLike | null>(null);
138
+ const isTransitioning = shallowRef(false);
139
+ const respect = options.respectReducedMotion ?? true;
140
+ const preference =
141
+ respect && options.reducedMotion === undefined ? useReducedMotion() : undefined;
142
+
143
+ // Inside a component the host resolves only after mount (a post-flush
144
+ // job), so a hydrating client first renders the same unsupported state as
145
+ // the server. Outside components it resolves immediately.
146
+ const hydrated = shallowRef(!hasInjectionContext());
147
+ if (!hydrated.value) {
148
+ watchPostEffect(() => {
149
+ hydrated.value = true;
150
+ });
151
+ }
152
+ const resolveDocument = (): ViewTransitionDocumentHost | undefined =>
153
+ !hydrated.value
154
+ ? undefined
155
+ : options.document === undefined
156
+ ? browserDocument()
157
+ : (toValue(options.document) ?? undefined);
158
+
159
+ const prefersReducedMotion = (): boolean => {
160
+ if (!respect) return false;
161
+ return preference ? preference.value === "reduce" : toValue(options.reducedMotion) === true;
162
+ };
163
+
164
+ const begin = (
165
+ host: ViewTransitionDocumentHost,
166
+ run: () => Promise<void>,
167
+ types: readonly string[],
168
+ ): ViewTransitionLike => {
169
+ if (types.length === 0) return host.startViewTransition(run);
170
+ try {
171
+ return host.startViewTransition({ update: run, types: [...types] });
172
+ } catch {
173
+ // Runtimes without typed transitions reject the options object.
174
+ return host.startViewTransition(run);
175
+ }
176
+ };
177
+
178
+ const start = async <Result>(
179
+ update: () => Result | PromiseLike<Result>,
180
+ startOptions: ViewTransitionStartOptions = {},
181
+ ): Promise<Result> => {
182
+ const host = resolveDocument();
183
+ if (!host || prefersReducedMotion()) return update();
184
+
185
+ let run: () => Promise<void> = async () => undefined;
186
+ const outcome = new Promise<Result>((resolve, reject) => {
187
+ run = async () => {
188
+ try {
189
+ resolve(await update());
190
+ } catch (cause) {
191
+ reject(cause);
192
+ throw cause;
193
+ }
194
+ };
195
+ });
196
+
197
+ let current: ViewTransitionLike;
198
+ try {
199
+ current = begin(host, run, startOptions.types ?? []);
200
+ } catch {
201
+ return update();
202
+ }
203
+ transition.value = current;
204
+ isTransitioning.value = true;
205
+ const clear = (): void => {
206
+ if (transition.value !== current) return;
207
+ transition.value = null;
208
+ isTransitioning.value = false;
209
+ };
210
+ current.ready.catch(ignore);
211
+ current.updateCallbackDone.catch(ignore);
212
+ current.finished.then(clear, clear);
213
+ return outcome;
214
+ };
215
+
216
+ const skip = (): void => {
217
+ transition.value?.skipTransition();
218
+ };
219
+
220
+ tryOnScopeDispose(skip);
221
+
222
+ return {
223
+ supported: computed(() => resolveDocument() !== undefined),
224
+ transition: computed(() => transition.value),
225
+ isTransitioning: readonly(isTransitioning),
226
+ start,
227
+ skip,
228
+ };
229
+ }
@@ -0,0 +1,228 @@
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
+
15
+ /** Structural `VisualViewport` observed by {@link useVisualViewport}. */
16
+ export interface VisualViewportHost extends EventTarget {
17
+ /** Visible width in CSS pixels. */
18
+ readonly width: number;
19
+ /** Visible height in CSS pixels (shrinks when an on-screen keyboard overlays the page). */
20
+ readonly height: number;
21
+ /** Offset of the visual viewport from the layout viewport's top edge. */
22
+ readonly offsetTop: number;
23
+ /** Offset of the visual viewport from the layout viewport's left edge. */
24
+ readonly offsetLeft: number;
25
+ /** Pinch-zoom scale factor. */
26
+ readonly scale: number;
27
+ }
28
+
29
+ /** Structural VirtualKeyboard API (`navigator.virtualKeyboard`). */
30
+ export interface VirtualKeyboardHost extends EventTarget {
31
+ /** Whether the keyboard overlays content instead of resizing the viewport. */
32
+ overlaysContent: boolean;
33
+ /** Keyboard rectangle in CSS pixels. */
34
+ readonly boundingRect: { readonly height: number };
35
+ }
36
+
37
+ /** Window-like capability read by {@link useVisualViewport}. */
38
+ export interface VisualViewportWindowHost {
39
+ /** Layout viewport height. */
40
+ readonly innerHeight: number;
41
+ /** Visual viewport, when the engine supports it. */
42
+ readonly visualViewport?: VisualViewportHost | null;
43
+ /** Navigator that may expose the VirtualKeyboard API as `virtualKeyboard`. */
44
+ readonly navigator?: object;
45
+ }
46
+
47
+ /** Options for {@link useVisualViewport}. */
48
+ export interface UseVisualViewportOptions {
49
+ /**
50
+ * Minimum occluded height (CSS px) reported as an open keyboard, filtering
51
+ * browser toolbars that collapse while scrolling.
52
+ *
53
+ * @default 120
54
+ */
55
+ readonly keyboardThreshold?: number;
56
+
57
+ /**
58
+ * Opt in to `navigator.virtualKeyboard.overlaysContent = true` (Chromium) so
59
+ * the keyboard height comes from the VirtualKeyboard API and the layout
60
+ * viewport no longer resizes. The previous value is restored on cleanup.
61
+ *
62
+ * @default false
63
+ */
64
+ readonly overlaysContent?: boolean;
65
+
66
+ /**
67
+ * Reactive window capability for alternate runtimes and tests.
68
+ *
69
+ * @default globalThis.window when available
70
+ */
71
+ readonly host?: MaybeRefOrGetter<VisualViewportWindowHost | null | undefined>;
72
+ }
73
+
74
+ /** Reactive viewport geometry returned by {@link useVisualViewport}. */
75
+ export interface VisualViewportControls {
76
+ /** Visual viewport width (0 on the server). */
77
+ readonly width: Readonly<Ref<number>>;
78
+ /** Visual viewport height (0 on the server). */
79
+ readonly height: Readonly<Ref<number>>;
80
+ /** Visual viewport top offset within the layout viewport. */
81
+ readonly offsetTop: Readonly<Ref<number>>;
82
+ /** Visual viewport left offset within the layout viewport. */
83
+ readonly offsetLeft: Readonly<Ref<number>>;
84
+ /** Pinch-zoom scale (1 on the server). */
85
+ readonly scale: Readonly<Ref<number>>;
86
+ /** Height of the bottom area hidden by an on-screen keyboard, in CSS px. */
87
+ readonly keyboardHeight: Readonly<Ref<number>>;
88
+ /** Whether `keyboardHeight` exceeds `keyboardThreshold`. */
89
+ readonly keyboardOpen: ComputedRef<boolean>;
90
+ /** Whether a VisualViewport (or VirtualKeyboard) capability is attached. */
91
+ readonly isSupported: Readonly<Ref<boolean>>;
92
+ }
93
+
94
+ /**
95
+ * Track the visual viewport and on-screen keyboard.
96
+ *
97
+ * On mobile browsers the visual viewport shrinks (or scrolls) when a virtual
98
+ * keyboard opens while the layout viewport stays put; `keyboardHeight` is the
99
+ * occluded bottom area (`innerHeight - height - offsetTop`), or the
100
+ * VirtualKeyboard API rectangle when `overlaysContent` is enabled. Pin
101
+ * toolbars above the keyboard with `bottom: calc(var(--kb, 0px))` bound to it.
102
+ *
103
+ * Server rendering reports zeros (scale 1) and attaches nothing; inside a
104
+ * component the host attaches after mount, so hydration renders the same
105
+ * zeros first. Listeners
106
+ * (`resize`, `scroll`, `geometrychange`) are passive and removed with the
107
+ * owning reactive scope.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * const { keyboardHeight, keyboardOpen } = useVisualViewport();
112
+ * const toolbarStyle = computed(() => ({ bottom: `${keyboardHeight.value}px` }));
113
+ * ```
114
+ *
115
+ * @param options Keyboard threshold, VirtualKeyboard opt-in, and capability.
116
+ * @default options {}
117
+ * @returns Reactive viewport geometry and keyboard state.
118
+ */
119
+ export function useVisualViewport(options: UseVisualViewportOptions = {}): VisualViewportControls {
120
+ const threshold =
121
+ typeof options.keyboardThreshold === "number" && Number.isFinite(options.keyboardThreshold)
122
+ ? Math.max(options.keyboardThreshold, 0)
123
+ : 120;
124
+ const width = ref(0);
125
+ const height = ref(0);
126
+ const offsetTop = ref(0);
127
+ const offsetLeft = ref(0);
128
+ const scale = ref(1);
129
+ const keyboardHeight = ref(0);
130
+ const isSupported = ref(false);
131
+
132
+ // Inside a component the host is attached after mount (a post-flush
133
+ // job), so a hydrating client first renders the same zeroed geometry as
134
+ // the server. Outside components it attaches immediately.
135
+ const hydrated = shallowRef(!hasInjectionContext());
136
+ if (!hydrated.value) {
137
+ watchPostEffect(() => {
138
+ hydrated.value = true;
139
+ });
140
+ }
141
+ const stopWatch = watch(
142
+ () =>
143
+ !hydrated.value
144
+ ? undefined
145
+ : options.host === undefined
146
+ ? browserViewportHost()
147
+ : toValue(options.host),
148
+ (host, _previous, onCleanup) => {
149
+ const viewport = host?.visualViewport ?? undefined;
150
+ const keyboard =
151
+ options.overlaysContent === true ? virtualKeyboardOf(host?.navigator) : undefined;
152
+ isSupported.value = viewport !== undefined || keyboard !== undefined;
153
+ if (host === null || host === undefined || !isSupported.value) {
154
+ width.value = 0;
155
+ height.value = 0;
156
+ offsetTop.value = 0;
157
+ offsetLeft.value = 0;
158
+ scale.value = 1;
159
+ keyboardHeight.value = 0;
160
+ return;
161
+ }
162
+ const previousOverlay = keyboard?.overlaysContent;
163
+ if (keyboard !== undefined) keyboard.overlaysContent = true;
164
+ const update = (): void => {
165
+ if (viewport !== undefined) {
166
+ width.value = viewport.width;
167
+ height.value = viewport.height;
168
+ offsetTop.value = viewport.offsetTop;
169
+ offsetLeft.value = viewport.offsetLeft;
170
+ scale.value = viewport.scale;
171
+ }
172
+ const occluded =
173
+ keyboard !== undefined
174
+ ? keyboard.boundingRect.height
175
+ : viewport === undefined
176
+ ? 0
177
+ : host.innerHeight - viewport.height - viewport.offsetTop;
178
+ keyboardHeight.value = Math.max(Math.round(occluded), 0);
179
+ };
180
+ update();
181
+ const passive: AddEventListenerOptions = { passive: true };
182
+ viewport?.addEventListener("resize", update, passive);
183
+ viewport?.addEventListener("scroll", update, passive);
184
+ keyboard?.addEventListener("geometrychange", update, passive);
185
+ onCleanup(() => {
186
+ viewport?.removeEventListener("resize", update);
187
+ viewport?.removeEventListener("scroll", update);
188
+ keyboard?.removeEventListener("geometrychange", update);
189
+ if (keyboard !== undefined && previousOverlay !== undefined) {
190
+ keyboard.overlaysContent = previousOverlay;
191
+ }
192
+ });
193
+ },
194
+ { immediate: true },
195
+ );
196
+ tryOnScopeDispose(() => stopWatch.stop());
197
+
198
+ return {
199
+ width: readonly(width),
200
+ height: readonly(height),
201
+ offsetTop: readonly(offsetTop),
202
+ offsetLeft: readonly(offsetLeft),
203
+ scale: readonly(scale),
204
+ keyboardHeight: readonly(keyboardHeight),
205
+ keyboardOpen: computed(() => keyboardHeight.value > threshold),
206
+ isSupported: readonly(isSupported),
207
+ };
208
+ }
209
+
210
+ function browserViewportHost(): VisualViewportWindowHost | undefined {
211
+ return typeof window !== "undefined" ? window : undefined;
212
+ }
213
+
214
+ function isVirtualKeyboard(value: unknown): value is VirtualKeyboardHost {
215
+ return (
216
+ typeof value === "object" &&
217
+ value !== null &&
218
+ "overlaysContent" in value &&
219
+ "boundingRect" in value &&
220
+ typeof Reflect.get(value, "addEventListener") === "function"
221
+ );
222
+ }
223
+
224
+ function virtualKeyboardOf(navigator: object | undefined): VirtualKeyboardHost | undefined {
225
+ if (navigator === undefined || !("virtualKeyboard" in navigator)) return undefined;
226
+ const keyboard: unknown = navigator.virtualKeyboard;
227
+ return isVirtualKeyboard(keyboard) ? keyboard : undefined;
228
+ }