@vizejs/composable 0.426.3 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,75 @@
1
+ import { inject, provide } from "vue";
2
+ import type { InjectionKey } from "vue";
3
+
4
+ /** Options for {@link createInjectionState}. */
5
+ export interface CreateInjectionStateOptions<State> {
6
+ /**
7
+ * Key used for `provide`/`inject`.
8
+ *
9
+ * @default a fresh unique symbol
10
+ */
11
+ readonly injectionKey?: InjectionKey<State>;
12
+
13
+ /**
14
+ * Value injected when no ancestor provides the state; also narrows the
15
+ * injector's return type to `State`.
16
+ *
17
+ * @default undefined
18
+ */
19
+ readonly defaultValue?: State;
20
+ }
21
+
22
+ /** Provider, injector, and key returned by {@link createInjectionState}. */
23
+ export type InjectionState<Arguments extends readonly unknown[], State, Injected> = readonly [
24
+ useProvidingState: (...args: Arguments) => State,
25
+ useInjectedState: () => Injected,
26
+ injectionKey: InjectionKey<State>,
27
+ ];
28
+
29
+ /**
30
+ * Create a typed provide/inject pair around a composable, for component
31
+ * subtrees that share request-local state.
32
+ *
33
+ * The provider runs the composable with its arguments, provides the result
34
+ * under a typed `InjectionKey`, and returns it. The injector returns the
35
+ * nearest provided state, or `defaultValue`, or `undefined` (reflected in
36
+ * its return type). State lives in the component tree, so unlike module
37
+ * globals it is naturally per request during SSR. Both must be called
38
+ * during `setup` (or inside `app.runWithContext`).
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const [useProvideCounter, useCounter] = createInjectionState((initial: number) => {
43
+ * const count = ref(initial);
44
+ * return { count, increment: () => count.value++ };
45
+ * });
46
+ * ```
47
+ *
48
+ * @param composable Creates the state in the providing component.
49
+ * @param options Custom key and default value.
50
+ * @default options {}
51
+ * @returns `[useProvidingState, useInjectedState, injectionKey]`.
52
+ */
53
+ export function createInjectionState<Arguments extends readonly unknown[], State>(
54
+ composable: (...args: Arguments) => State,
55
+ options: CreateInjectionStateOptions<State> & { readonly defaultValue: State },
56
+ ): InjectionState<Arguments, State, State>;
57
+ export function createInjectionState<Arguments extends readonly unknown[], State>(
58
+ composable: (...args: Arguments) => State,
59
+ options?: CreateInjectionStateOptions<State>,
60
+ ): InjectionState<Arguments, State, State | undefined>;
61
+ export function createInjectionState<Arguments extends readonly unknown[], State>(
62
+ composable: (...args: Arguments) => State,
63
+ options: CreateInjectionStateOptions<State> = {},
64
+ ): InjectionState<Arguments, State, State | undefined> {
65
+ const generatedKey: InjectionKey<State> = Symbol("InjectionState");
66
+ const key = options.injectionKey ?? generatedKey;
67
+ const useProvidingState = (...args: Arguments): State => {
68
+ const state = composable(...args);
69
+ provide(key, state);
70
+ return state;
71
+ };
72
+ const useInjectedState = (): State | undefined =>
73
+ options.defaultValue === undefined ? inject(key) : inject(key, options.defaultValue);
74
+ return [useProvidingState, useInjectedState, key];
75
+ }
@@ -0,0 +1,74 @@
1
+ import { effectScope } from "vue";
2
+ import type { EffectScope } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Options for {@link createSharedComposable}. */
7
+ export interface CreateSharedComposableOptions {
8
+ /**
9
+ * Share one instance across callers on the server too. Disabled by
10
+ * default because module-level sharing leaks state between requests;
11
+ * without a browser `window` every call then gets its own instance.
12
+ *
13
+ * @default false
14
+ */
15
+ readonly shareOnServer?: boolean;
16
+ }
17
+
18
+ /**
19
+ * Share one instance of a composable between all simultaneously mounted
20
+ * callers, reference-counted by their effect scopes.
21
+ *
22
+ * The first caller creates the instance inside a detached scope using its
23
+ * arguments (later callers' arguments are ignored while it lives). When the
24
+ * last subscribing scope stops, the instance's scope is stopped and the next
25
+ * call starts fresh. Calls outside any effect scope subscribe permanently.
26
+ * On the server every call gets its own instance unless `shareOnServer` is
27
+ * set, so request state never leaks.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const useSharedMouse = createSharedComposable(useMouse);
32
+ * ```
33
+ *
34
+ * @param composable Composable to share.
35
+ * @param options Server sharing policy.
36
+ * @default options {}
37
+ * @throws `Error` tagged `VIZE_COMPOSE_SHARED_COMPOSABLE_INACTIVE_SCOPE` if
38
+ * the private scope cannot run (never expected in practice).
39
+ * @returns A composable with the same signature that shares its result.
40
+ */
41
+ export function createSharedComposable<Arguments extends readonly unknown[], Result>(
42
+ composable: (...args: Arguments) => Result,
43
+ options: CreateSharedComposableOptions = {},
44
+ ): (...args: Arguments) => Result {
45
+ let subscribers = 0;
46
+ let shared: { readonly result: Result; readonly scope: EffectScope } | undefined;
47
+
48
+ const release = (): void => {
49
+ subscribers -= 1;
50
+ if (subscribers > 0 || shared === undefined) return;
51
+ shared.scope.stop();
52
+ shared = undefined;
53
+ };
54
+
55
+ return (...args) => {
56
+ if (typeof window === "undefined" && !(options.shareOnServer ?? false)) {
57
+ return composable(...args);
58
+ }
59
+ subscribers += 1;
60
+ if (shared === undefined) {
61
+ const scope = effectScope(true);
62
+ const result = scope.run(() => ({ value: composable(...args) }));
63
+ if (result === undefined) {
64
+ throw new Error(
65
+ "[VIZE_COMPOSE_SHARED_COMPOSABLE_INACTIVE_SCOPE] the shared scope did not run",
66
+ );
67
+ }
68
+ shared = { result: result.value, scope };
69
+ }
70
+ const { result } = shared;
71
+ tryOnScopeDispose(release);
72
+ return result;
73
+ };
74
+ }
@@ -0,0 +1,152 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { requestMotionPermission } from "./device-orientation.ts";
5
+ import type { MotionPermissionConstructor, MotionPermissionState } from "./device-orientation.ts";
6
+ import { tryOnScopeDispose } from "./scope.ts";
7
+
8
+ /** Window-like capability observed by {@link useDeviceMotion}. */
9
+ export interface DeviceMotionHost extends EventTarget {
10
+ /** Constructor used to detect support and request permission. */
11
+ readonly DeviceMotionEvent?: MotionPermissionConstructor;
12
+ }
13
+
14
+ /** Acceleration along the device axes in m/s². */
15
+ export interface MotionVector {
16
+ /** X axis (left to right). */
17
+ readonly x: number | null;
18
+ /** Y axis (bottom to top). */
19
+ readonly y: number | null;
20
+ /** Z axis (back to front). */
21
+ readonly z: number | null;
22
+ }
23
+
24
+ /** Rotation rate around the device axes in degrees per second. */
25
+ export interface MotionRotationRate {
26
+ /** Around the Z axis. */
27
+ readonly alpha: number | null;
28
+ /** Around the X axis. */
29
+ readonly beta: number | null;
30
+ /** Around the Y axis. */
31
+ readonly gamma: number | null;
32
+ }
33
+
34
+ /** Options for {@link useDeviceMotion}. */
35
+ export interface UseDeviceMotionOptions {
36
+ /**
37
+ * Reactive window capability for alternate runtimes and tests.
38
+ *
39
+ * @default globalThis.window when available
40
+ */
41
+ readonly host?: MaybeRefOrGetter<DeviceMotionHost | null | undefined>;
42
+ }
43
+
44
+ /** Reactive motion state returned by {@link useDeviceMotion}. */
45
+ export interface DeviceMotionControls {
46
+ /** Whether the host exposes `DeviceMotionEvent`. `false` during server rendering. */
47
+ readonly isSupported: Readonly<Ref<boolean>>;
48
+ /** Acceleration without gravity; `null` before the first reading. */
49
+ readonly acceleration: Readonly<ShallowRef<MotionVector | null>>;
50
+ /** Acceleration including gravity; `null` before the first reading. */
51
+ readonly accelerationIncludingGravity: Readonly<ShallowRef<MotionVector | null>>;
52
+ /** Rotation rate; `null` before the first reading. */
53
+ readonly rotationRate: Readonly<ShallowRef<MotionRotationRate | null>>;
54
+ /** Sampling interval in milliseconds. */
55
+ readonly interval: Readonly<Ref<number>>;
56
+ /** Latest permission outcome; `"granted"` where no prompt exists. */
57
+ readonly permission: Readonly<Ref<MotionPermissionState>>;
58
+ /**
59
+ * Request sensor permission where the platform requires it.
60
+ *
61
+ * @returns The resulting permission state.
62
+ */
63
+ readonly requestPermission: () => Promise<MotionPermissionState>;
64
+ }
65
+
66
+ /**
67
+ * Track device acceleration and rotation rate.
68
+ *
69
+ * Readings are copied into plain snapshots. Server renders expose `null`
70
+ * readings and `isSupported: false`; the listener is removed with the owning
71
+ * reactive scope. Shares the permission model of `useDeviceOrientation`.
72
+ *
73
+ * @param options Window capability.
74
+ * @default options {}
75
+ * @returns Reactive readings, support/permission state, and a permission action.
76
+ */
77
+ export function useDeviceMotion(options: UseDeviceMotionOptions = {}): DeviceMotionControls {
78
+ const isSupported = ref(false);
79
+ const acceleration = shallowRef<MotionVector | null>(null);
80
+ const accelerationIncludingGravity = shallowRef<MotionVector | null>(null);
81
+ const rotationRate = shallowRef<MotionRotationRate | null>(null);
82
+ const interval = ref(0);
83
+ const permission = ref<MotionPermissionState>("prompt");
84
+ // Inside a component the host is read once it has mounted, so a hydrating
85
+ // client first renders the same fallback as the server. `hasInjectionContext`
86
+ // also detects Vapor components (unlike `getCurrentInstance`).
87
+ const mounted = shallowRef(!hasInjectionContext());
88
+ if (!mounted.value) {
89
+ onMounted(() => {
90
+ mounted.value = true;
91
+ });
92
+ }
93
+ const host = (): DeviceMotionHost | null | undefined =>
94
+ !mounted.value
95
+ ? undefined
96
+ : options.host === undefined
97
+ ? browserMotionHost()
98
+ : toValue(options.host);
99
+
100
+ const onMotion = (event: Event): void => {
101
+ if (!isMotionEvent(event)) return;
102
+ acceleration.value = vector(event.acceleration);
103
+ accelerationIncludingGravity.value = vector(event.accelerationIncludingGravity);
104
+ rotationRate.value = event.rotationRate
105
+ ? {
106
+ alpha: event.rotationRate.alpha,
107
+ beta: event.rotationRate.beta,
108
+ gamma: event.rotationRate.gamma,
109
+ }
110
+ : null;
111
+ interval.value = event.interval;
112
+ };
113
+
114
+ const stop = watch(
115
+ host,
116
+ (current, _previous, onCleanup) => {
117
+ const constructor = current?.DeviceMotionEvent;
118
+ isSupported.value = constructor !== undefined;
119
+ if (!current || !constructor) return;
120
+ if (typeof constructor.requestPermission !== "function") permission.value = "granted";
121
+ current.addEventListener("devicemotion", onMotion, { passive: true });
122
+ onCleanup(() => current.removeEventListener("devicemotion", onMotion));
123
+ },
124
+ { immediate: true },
125
+ );
126
+ tryOnScopeDispose(() => stop.stop());
127
+
128
+ return {
129
+ isSupported: readonly(isSupported),
130
+ acceleration,
131
+ accelerationIncludingGravity,
132
+ rotationRate,
133
+ interval: readonly(interval),
134
+ permission: readonly(permission),
135
+ requestPermission: async () => {
136
+ permission.value = await requestMotionPermission(host()?.DeviceMotionEvent);
137
+ return permission.value;
138
+ },
139
+ };
140
+ }
141
+
142
+ function vector(value: DeviceMotionEventAcceleration | null): MotionVector | null {
143
+ return value ? { x: value.x, y: value.y, z: value.z } : null;
144
+ }
145
+
146
+ function isMotionEvent(event: Event): event is DeviceMotionEvent {
147
+ return "accelerationIncludingGravity" in event && "interval" in event;
148
+ }
149
+
150
+ function browserMotionHost(): DeviceMotionHost | undefined {
151
+ return typeof window !== "undefined" ? window : undefined;
152
+ }
@@ -0,0 +1,168 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Permission outcome of the iOS-style motion/orientation permission prompt. */
7
+ export type MotionPermissionState = "granted" | "denied" | "prompt";
8
+
9
+ /** Event constructor that may expose the iOS `requestPermission` static. */
10
+ export interface MotionPermissionConstructor {
11
+ /** Constructor prototype; present on every platform event constructor. */
12
+ readonly prototype: object;
13
+ /** Ask the user for sensor access (Safari on iOS/iPadOS 13+). */
14
+ readonly requestPermission?: () => Promise<string>;
15
+ }
16
+
17
+ /** Window-like capability observed by {@link useDeviceOrientation}. */
18
+ export interface DeviceOrientationHost extends EventTarget {
19
+ /** Constructor used to detect support and request permission. */
20
+ readonly DeviceOrientationEvent?: MotionPermissionConstructor;
21
+ }
22
+
23
+ /** Options for {@link useDeviceOrientation}. */
24
+ export interface UseDeviceOrientationOptions {
25
+ /**
26
+ * Listen to `deviceorientationabsolute` (earth-frame) instead of
27
+ * `deviceorientation`.
28
+ *
29
+ * @default false
30
+ */
31
+ readonly absolute?: boolean;
32
+
33
+ /**
34
+ * Reactive window capability for alternate runtimes and tests.
35
+ *
36
+ * @default globalThis.window when available
37
+ */
38
+ readonly host?: MaybeRefOrGetter<DeviceOrientationHost | null | undefined>;
39
+ }
40
+
41
+ /** Reactive orientation state returned by {@link useDeviceOrientation}. */
42
+ export interface DeviceOrientationControls {
43
+ /** Whether the host exposes `DeviceOrientationEvent`. `false` during server rendering. */
44
+ readonly isSupported: Readonly<Ref<boolean>>;
45
+ /** Whether the latest reading is relative to the earth frame. */
46
+ readonly isAbsolute: Readonly<Ref<boolean>>;
47
+ /** Rotation around the Z axis in degrees `[0, 360)`. */
48
+ readonly alpha: Readonly<Ref<number | null>>;
49
+ /** Rotation around the X axis in degrees `[-180, 180)`. */
50
+ readonly beta: Readonly<Ref<number | null>>;
51
+ /** Rotation around the Y axis in degrees `[-90, 90)`. */
52
+ readonly gamma: Readonly<Ref<number | null>>;
53
+ /** Latest permission outcome; `"granted"` where no prompt exists. */
54
+ readonly permission: Readonly<Ref<MotionPermissionState>>;
55
+ /**
56
+ * Request sensor permission where the platform requires it. Must be called
57
+ * from a user gesture on iOS.
58
+ *
59
+ * @returns The resulting permission state.
60
+ */
61
+ readonly requestPermission: () => Promise<MotionPermissionState>;
62
+ }
63
+
64
+ /**
65
+ * Track device orientation angles.
66
+ *
67
+ * Server renders expose `null` angles and `isSupported: false`. The listener
68
+ * follows the reactive host and is removed with the owning reactive scope.
69
+ * On platforms with a permission prompt, `permission` starts as `"prompt"`
70
+ * and readings arrive only after `requestPermission` resolves `"granted"`.
71
+ *
72
+ * @param options Frame selection and window capability.
73
+ * @default options {}
74
+ * @returns Reactive angles, support/permission state, and a permission action.
75
+ */
76
+ export function useDeviceOrientation(
77
+ options: UseDeviceOrientationOptions = {},
78
+ ): DeviceOrientationControls {
79
+ const isSupported = ref(false);
80
+ const isAbsolute = ref(false);
81
+ const alpha = ref<number | null>(null);
82
+ const beta = ref<number | null>(null);
83
+ const gamma = ref<number | null>(null);
84
+ const permission = ref<MotionPermissionState>("prompt");
85
+ // Inside a component the host is read once it has mounted, so a hydrating
86
+ // client first renders the same fallback as the server. `hasInjectionContext`
87
+ // also detects Vapor components (unlike `getCurrentInstance`).
88
+ const mounted = shallowRef(!hasInjectionContext());
89
+ if (!mounted.value) {
90
+ onMounted(() => {
91
+ mounted.value = true;
92
+ });
93
+ }
94
+ const host = (): DeviceOrientationHost | null | undefined =>
95
+ !mounted.value
96
+ ? undefined
97
+ : options.host === undefined
98
+ ? browserOrientationHost()
99
+ : toValue(options.host);
100
+ const eventName = options.absolute ? "deviceorientationabsolute" : "deviceorientation";
101
+
102
+ const onOrientation = (event: Event): void => {
103
+ if (!isOrientationEvent(event)) return;
104
+ isAbsolute.value = event.absolute;
105
+ alpha.value = event.alpha;
106
+ beta.value = event.beta;
107
+ gamma.value = event.gamma;
108
+ };
109
+
110
+ const stop = watch(
111
+ host,
112
+ (current, _previous, onCleanup) => {
113
+ const constructor = current?.DeviceOrientationEvent;
114
+ isSupported.value = constructor !== undefined;
115
+ if (!current || !constructor) return;
116
+ if (typeof constructor.requestPermission !== "function") permission.value = "granted";
117
+ current.addEventListener(eventName, onOrientation, { passive: true });
118
+ onCleanup(() => current.removeEventListener(eventName, onOrientation));
119
+ },
120
+ { immediate: true },
121
+ );
122
+ tryOnScopeDispose(() => stop.stop());
123
+
124
+ return {
125
+ isSupported: readonly(isSupported),
126
+ isAbsolute: readonly(isAbsolute),
127
+ alpha: readonly(alpha),
128
+ beta: readonly(beta),
129
+ gamma: readonly(gamma),
130
+ permission: readonly(permission),
131
+ requestPermission: async () => {
132
+ permission.value = await requestMotionPermission(host()?.DeviceOrientationEvent);
133
+ return permission.value;
134
+ },
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Request motion/orientation sensor permission from an event constructor.
140
+ *
141
+ * Normalizes the platform result to {@link MotionPermissionState}. Missing
142
+ * constructors resolve `"denied"`; constructors without a prompt resolve
143
+ * `"granted"`; unknown results resolve `"prompt"`. Rejections (for example
144
+ * when not called from a user gesture) resolve `"denied"` instead of throwing.
145
+ *
146
+ * @param constructor `DeviceOrientationEvent` or `DeviceMotionEvent`.
147
+ * @returns The normalized permission state.
148
+ */
149
+ export async function requestMotionPermission(
150
+ constructor: MotionPermissionConstructor | undefined,
151
+ ): Promise<MotionPermissionState> {
152
+ if (!constructor) return "denied";
153
+ if (typeof constructor.requestPermission !== "function") return "granted";
154
+ try {
155
+ const result = await constructor.requestPermission();
156
+ return result === "granted" || result === "denied" ? result : "prompt";
157
+ } catch {
158
+ return "denied";
159
+ }
160
+ }
161
+
162
+ function isOrientationEvent(event: Event): event is DeviceOrientationEvent {
163
+ return "alpha" in event && "beta" in event && "gamma" in event;
164
+ }
165
+
166
+ function browserOrientationHost(): DeviceOrientationHost | undefined {
167
+ return typeof window !== "undefined" ? window : undefined;
168
+ }
@@ -0,0 +1,100 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import type { MediaQueryHost } from "./media-query.ts";
5
+ import { tryOnScopeDispose } from "./scope.ts";
6
+
7
+ /** Window-like capability observed by {@link useDevicePixelRatio}. */
8
+ export interface DevicePixelRatioHost extends MediaQueryHost {
9
+ /** Ratio of physical to CSS pixels. */
10
+ readonly devicePixelRatio: number;
11
+ }
12
+
13
+ /** Options for {@link useDevicePixelRatio}. */
14
+ export interface UseDevicePixelRatioOptions {
15
+ /**
16
+ * Ratio exposed during server rendering.
17
+ *
18
+ * @default 1
19
+ */
20
+ readonly ssrPixelRatio?: number;
21
+
22
+ /**
23
+ * Reactive window capability for alternate runtimes and tests.
24
+ *
25
+ * @default globalThis.window when available
26
+ */
27
+ readonly host?: MaybeRefOrGetter<DevicePixelRatioHost | null | undefined>;
28
+ }
29
+
30
+ /** Reactive ratio returned by {@link useDevicePixelRatio}. */
31
+ export interface DevicePixelRatioControls {
32
+ /** Current device pixel ratio. */
33
+ readonly pixelRatio: Readonly<Ref<number>>;
34
+ /** Whether a window capability is attached. `false` during server rendering. */
35
+ readonly isSupported: Readonly<Ref<boolean>>;
36
+ }
37
+
38
+ /**
39
+ * Track `window.devicePixelRatio` (zoom and moving between displays).
40
+ *
41
+ * Subscribes to a `(resolution: <ratio>dppx)` media query and re-subscribes
42
+ * with the new ratio after each change, which is the only change signal the
43
+ * platform offers. Server renders expose `ssrPixelRatio`.
44
+ *
45
+ * @param options Server fallback and window capability.
46
+ * @default options {}
47
+ * @returns Reactive ratio and support flag.
48
+ */
49
+ export function useDevicePixelRatio(
50
+ options: UseDevicePixelRatioOptions = {},
51
+ ): DevicePixelRatioControls {
52
+ const fallback = options.ssrPixelRatio ?? 1;
53
+ const pixelRatio = ref(fallback);
54
+ const isSupported = ref(false);
55
+ // Inside a component the host is read once it has mounted, so a hydrating
56
+ // client first renders the same fallback as the server. `hasInjectionContext`
57
+ // also detects Vapor components (unlike `getCurrentInstance`).
58
+ const mounted = shallowRef(!hasInjectionContext());
59
+ if (!mounted.value) {
60
+ onMounted(() => {
61
+ mounted.value = true;
62
+ });
63
+ }
64
+
65
+ const stop = watch(
66
+ () =>
67
+ !mounted.value
68
+ ? undefined
69
+ : options.host === undefined
70
+ ? browserPixelRatioHost()
71
+ : toValue(options.host),
72
+ (host, _previous, onCleanup) => {
73
+ isSupported.value = Boolean(host);
74
+ if (!host) {
75
+ pixelRatio.value = fallback;
76
+ return;
77
+ }
78
+ let release = (): void => undefined;
79
+ const subscribe = (): void => {
80
+ release();
81
+ pixelRatio.value = host.devicePixelRatio;
82
+ const media = host.matchMedia(`(resolution: ${host.devicePixelRatio}dppx)`);
83
+ media.addEventListener("change", subscribe, { once: true });
84
+ release = () => media.removeEventListener("change", subscribe);
85
+ };
86
+ subscribe();
87
+ onCleanup(() => release());
88
+ },
89
+ { immediate: true },
90
+ );
91
+ tryOnScopeDispose(() => stop.stop());
92
+
93
+ return { pixelRatio: readonly(pixelRatio), isSupported: readonly(isSupported) };
94
+ }
95
+
96
+ function browserPixelRatioHost(): DevicePixelRatioHost | undefined {
97
+ return typeof window !== "undefined" && typeof window.matchMedia === "function"
98
+ ? window
99
+ : undefined;
100
+ }