@vizejs/composable 0.426.2 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,232 @@
1
+ import {
2
+ hasInjectionContext,
3
+ readonly,
4
+ ref,
5
+ shallowRef,
6
+ toValue,
7
+ watch,
8
+ watchPostEffect,
9
+ } from "vue";
10
+ import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
11
+
12
+ import { resolveElement } from "./element-target.ts";
13
+ import type { MaybeElementTarget } from "./element-target.ts";
14
+ import { tryOnScopeDispose } from "./scope.ts";
15
+
16
+ /** Document-like capability used by {@link usePointerLock}. */
17
+ export interface PointerLockHost extends EventTarget {
18
+ /** Element that currently holds the pointer lock. */
19
+ readonly pointerLockElement: Element | null;
20
+ /** Release the pointer lock. */
21
+ exitPointerLock(): void;
22
+ }
23
+
24
+ /** Stable error codes rejected by {@link PointerLockControls.lock} and `unlock`. */
25
+ export type PointerLockErrorCode =
26
+ | "VIZE_COMPOSE_POINTER_LOCK_UNSUPPORTED"
27
+ | "VIZE_COMPOSE_POINTER_LOCK_NO_TARGET"
28
+ | "VIZE_COMPOSE_POINTER_LOCK_FAILED";
29
+
30
+ /** Error thrown when pointer lock cannot be acquired or released. */
31
+ export class PointerLockError extends Error {
32
+ /** Machine-readable failure code. */
33
+ readonly code: PointerLockErrorCode;
34
+
35
+ /**
36
+ * @param code Machine-readable failure code.
37
+ * @param message Human-readable explanation.
38
+ */
39
+ constructor(code: PointerLockErrorCode, message: string) {
40
+ super(message);
41
+ this.name = "PointerLockError";
42
+ this.code = code;
43
+ }
44
+ }
45
+
46
+ /** Options for {@link usePointerLock}. */
47
+ export interface UsePointerLockOptions {
48
+ /**
49
+ * Request raw (unaccelerated) movement deltas where supported.
50
+ *
51
+ * @default false
52
+ */
53
+ readonly unadjustedMovement?: boolean;
54
+
55
+ /**
56
+ * Reactive document capability for alternate runtimes and tests.
57
+ *
58
+ * @default globalThis.document when available
59
+ */
60
+ readonly host?: MaybeRefOrGetter<PointerLockHost | null | undefined>;
61
+ }
62
+
63
+ /** Reactive state and actions returned by {@link usePointerLock}. */
64
+ export interface PointerLockControls {
65
+ /** Whether the host supports pointer lock. `false` during server rendering. */
66
+ readonly isSupported: Readonly<Ref<boolean>>;
67
+ /** Element currently holding the lock (any element, not only the target). */
68
+ readonly element: Readonly<ShallowRef<Element | null>>;
69
+ /** Whether the composable's own target holds the lock. */
70
+ readonly isLocked: Readonly<Ref<boolean>>;
71
+ /**
72
+ * Lock the pointer to `target` (or the composable target).
73
+ *
74
+ * @returns The locked element once `pointerlockchange` confirms the lock.
75
+ */
76
+ readonly lock: (target?: MaybeElementTarget) => Promise<Element>;
77
+ /**
78
+ * Release the lock.
79
+ *
80
+ * @returns Whether a lock was held and released.
81
+ */
82
+ readonly unlock: () => Promise<boolean>;
83
+ }
84
+
85
+ /**
86
+ * Reactive wrapper around the Pointer Lock API.
87
+ *
88
+ * Tracks `pointerlockchange` on the document and exposes promise-based lock
89
+ * and unlock actions that settle on the platform confirmation events.
90
+ * Rejections are {@link PointerLockError}s with stable codes. Nothing runs
91
+ * during server rendering; listeners are removed with the owning scope.
92
+ *
93
+ * Inside a component the host is read after mounting, so hydration renders
94
+ * the server fallback first and never mismatches.
95
+ *
96
+ * @param target Default reactive element to lock.
97
+ * @param options Movement mode and document capability.
98
+ * @default target undefined
99
+ * @default options {}
100
+ * @returns Support flag, lock state, and actions.
101
+ */
102
+ export function usePointerLock(
103
+ target?: MaybeElementTarget,
104
+ options: UsePointerLockOptions = {},
105
+ ): PointerLockControls {
106
+ const isSupported = ref(false);
107
+ const element = shallowRef<Element | null>(null);
108
+ // Inside a component the host is attached by a post-flush job (after the
109
+ // component mounted), so a hydrating client first renders the same server
110
+ // fallback. Outside components it is attached synchronously.
111
+ const hydrated = shallowRef(!hasInjectionContext());
112
+ if (!hydrated.value) {
113
+ watchPostEffect(() => {
114
+ hydrated.value = true;
115
+ });
116
+ }
117
+ const host = (): PointerLockHost | null | undefined =>
118
+ !hydrated.value
119
+ ? undefined
120
+ : options.host === undefined
121
+ ? browserPointerLockHost()
122
+ : toValue(options.host);
123
+
124
+ const stop = watch(
125
+ host,
126
+ (current, _previous, onCleanup) => {
127
+ isSupported.value = Boolean(current && "pointerLockElement" in current);
128
+ element.value = current?.pointerLockElement ?? null;
129
+ if (!current) return;
130
+ const onChange = (): void => {
131
+ element.value = current.pointerLockElement;
132
+ };
133
+ current.addEventListener("pointerlockchange", onChange);
134
+ onCleanup(() => current.removeEventListener("pointerlockchange", onChange));
135
+ },
136
+ { immediate: true },
137
+ );
138
+ tryOnScopeDispose(() => stop.stop());
139
+
140
+ const isLocked = ref(false);
141
+ watch(
142
+ [element, () => (target === undefined ? null : resolveElement(target))],
143
+ ([locked, own]) => {
144
+ isLocked.value = locked !== null && locked === own;
145
+ },
146
+ { immediate: true, flush: "sync" },
147
+ );
148
+
149
+ const lock = async (override?: MaybeElementTarget): Promise<Element> => {
150
+ const current = host();
151
+ if (!current || !isSupported.value) {
152
+ throw new PointerLockError(
153
+ "VIZE_COMPOSE_POINTER_LOCK_UNSUPPORTED",
154
+ "Pointer lock is not supported.",
155
+ );
156
+ }
157
+ const candidate = resolveElement(override ?? target);
158
+ if (!candidate || !isPointerLockable(candidate)) {
159
+ throw new PointerLockError(
160
+ "VIZE_COMPOSE_POINTER_LOCK_NO_TARGET",
161
+ "No lockable element resolved.",
162
+ );
163
+ }
164
+ const confirmed = waitFor(current, () => current.pointerLockElement === candidate);
165
+ try {
166
+ await candidate.requestPointerLock(
167
+ options.unadjustedMovement ? { unadjustedMovement: true } : undefined,
168
+ );
169
+ } catch (cause) {
170
+ confirmed.cancel();
171
+ throw new PointerLockError("VIZE_COMPOSE_POINTER_LOCK_FAILED", describe(cause));
172
+ }
173
+ await confirmed.promise;
174
+ return candidate;
175
+ };
176
+
177
+ const unlock = async (): Promise<boolean> => {
178
+ const current = host();
179
+ if (!current?.pointerLockElement) return false;
180
+ const confirmed = waitFor(current, () => current.pointerLockElement === null);
181
+ current.exitPointerLock();
182
+ await confirmed.promise;
183
+ return true;
184
+ };
185
+
186
+ return {
187
+ isSupported: readonly(isSupported),
188
+ element,
189
+ isLocked: readonly(isLocked),
190
+ lock,
191
+ unlock,
192
+ };
193
+ }
194
+
195
+ function waitFor(
196
+ host: PointerLockHost,
197
+ done: () => boolean,
198
+ ): { readonly promise: Promise<void>; readonly cancel: () => void } {
199
+ let cleanup = (): void => undefined;
200
+ const promise = new Promise<void>((resolve, reject) => {
201
+ const onChange = (): void => {
202
+ if (!done()) return;
203
+ cleanup();
204
+ resolve();
205
+ };
206
+ const onError = (): void => {
207
+ cleanup();
208
+ reject(
209
+ new PointerLockError("VIZE_COMPOSE_POINTER_LOCK_FAILED", "The pointer lock was refused."),
210
+ );
211
+ };
212
+ host.addEventListener("pointerlockchange", onChange);
213
+ host.addEventListener("pointerlockerror", onError);
214
+ cleanup = () => {
215
+ host.removeEventListener("pointerlockchange", onChange);
216
+ host.removeEventListener("pointerlockerror", onError);
217
+ };
218
+ });
219
+ return { promise, cancel: () => cleanup() };
220
+ }
221
+
222
+ function isPointerLockable(element: Element): boolean {
223
+ return typeof element.requestPointerLock === "function";
224
+ }
225
+
226
+ function describe(cause: unknown): string {
227
+ return cause instanceof Error ? cause.message : "The pointer lock request failed.";
228
+ }
229
+
230
+ function browserPointerLockHost(): PointerLockHost | undefined {
231
+ return typeof document !== "undefined" ? document : undefined;
232
+ }
@@ -0,0 +1,153 @@
1
+ import { readonly, ref, shallowReactive, shallowReadonly, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Pointer device kind reported by Pointer Events. */
7
+ export type PointerKind = "mouse" | "touch" | "pen";
8
+
9
+ /** Snapshot of the latest pointer event. */
10
+ export interface PointerState {
11
+ /** Horizontal client coordinate. */
12
+ readonly x: number;
13
+ /** Vertical client coordinate. */
14
+ readonly y: number;
15
+ /** Normalized pressure in `[0, 1]`. */
16
+ readonly pressure: number;
17
+ /** Identifier of the pointer that produced the latest event. */
18
+ readonly pointerId: number;
19
+ /** Pen tilt around the Y axis in degrees. */
20
+ readonly tiltX: number;
21
+ /** Pen tilt around the X axis in degrees. */
22
+ readonly tiltY: number;
23
+ /** Contact geometry width in CSS pixels. */
24
+ readonly width: number;
25
+ /** Contact geometry height in CSS pixels. */
26
+ readonly height: number;
27
+ /** Pen rotation in degrees. */
28
+ readonly twist: number;
29
+ /** Device kind; `null` before the first event. */
30
+ readonly pointerType: PointerKind | null;
31
+ }
32
+
33
+ /** Options for {@link usePointer}. */
34
+ export interface UsePointerOptions {
35
+ /**
36
+ * Device kinds to track.
37
+ *
38
+ * @default ["mouse", "touch", "pen"]
39
+ */
40
+ readonly pointerTypes?: readonly PointerKind[];
41
+
42
+ /**
43
+ * Event target to listen on.
44
+ *
45
+ * @default globalThis.window when available
46
+ */
47
+ readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
48
+
49
+ /**
50
+ * State exposed before any input and during server rendering.
51
+ *
52
+ * @default all numbers `0`, `pointerType: null`
53
+ */
54
+ readonly initialValue?: Partial<PointerState>;
55
+ }
56
+
57
+ /** Reactive pointer state returned by {@link usePointer}. */
58
+ export interface PointerControls {
59
+ /** Latest pointer snapshot. */
60
+ readonly state: Readonly<PointerState>;
61
+ /** Whether the pointer is inside the target (between enter/move and leave). */
62
+ readonly isInside: Readonly<Ref<boolean>>;
63
+ }
64
+
65
+ /**
66
+ * Track the latest pointer (mouse, touch, or pen) state.
67
+ *
68
+ * Listens passively for `pointerdown`, `pointermove`, `pointerup`, and
69
+ * `pointerleave` on the reactive target and filters by device kind.
70
+ * Listeners are removed with the owning reactive scope; server renders expose
71
+ * the initial snapshot.
72
+ *
73
+ * @param options Device filter, target, and initial snapshot.
74
+ * @default options {}
75
+ * @returns Reactive snapshot and inside flag.
76
+ */
77
+ export function usePointer(options: UsePointerOptions = {}): PointerControls {
78
+ const pointerTypes = options.pointerTypes ?? ["mouse", "touch", "pen"];
79
+ const state = shallowReactive<{ -readonly [Key in keyof PointerState]: PointerState[Key] }>({
80
+ x: 0,
81
+ y: 0,
82
+ pressure: 0,
83
+ pointerId: 0,
84
+ tiltX: 0,
85
+ tiltY: 0,
86
+ width: 0,
87
+ height: 0,
88
+ twist: 0,
89
+ pointerType: null,
90
+ ...options.initialValue,
91
+ });
92
+ const isInside = ref(false);
93
+
94
+ const onPointer = (event: Event): void => {
95
+ if (!isPointerEvent(event)) return;
96
+ const kind = toPointerKind(event.pointerType);
97
+ if (!kind || !pointerTypes.includes(kind)) return;
98
+ isInside.value = true;
99
+ state.x = event.clientX;
100
+ state.y = event.clientY;
101
+ state.pressure = event.pressure;
102
+ state.pointerId = event.pointerId;
103
+ state.tiltX = event.tiltX;
104
+ state.tiltY = event.tiltY;
105
+ state.width = event.width;
106
+ state.height = event.height;
107
+ state.twist = event.twist;
108
+ state.pointerType = kind;
109
+ };
110
+ const onLeave = (): void => {
111
+ isInside.value = false;
112
+ };
113
+
114
+ const stop = watch(
115
+ () => (options.target === undefined ? browserWindow() : toValue(options.target)),
116
+ (target, _previous, onCleanup) => {
117
+ if (!target) return;
118
+ const listenerOptions: AddEventListenerOptions = { passive: true };
119
+ for (const type of ["pointerdown", "pointermove", "pointerup"] as const) {
120
+ target.addEventListener(type, onPointer, listenerOptions);
121
+ }
122
+ target.addEventListener("pointerleave", onLeave, listenerOptions);
123
+ onCleanup(() => {
124
+ for (const type of ["pointerdown", "pointermove", "pointerup"] as const) {
125
+ target.removeEventListener(type, onPointer);
126
+ }
127
+ target.removeEventListener("pointerleave", onLeave);
128
+ });
129
+ },
130
+ { immediate: true },
131
+ );
132
+ tryOnScopeDispose(() => stop.stop());
133
+
134
+ return { state: shallowReadonly(state), isInside: readonly(isInside) };
135
+ }
136
+
137
+ /**
138
+ * Narrow a platform `pointerType` string to the closed {@link PointerKind} union.
139
+ *
140
+ * @param value Raw `PointerEvent.pointerType`.
141
+ * @returns The matching kind, or `null` for unknown/future device kinds.
142
+ */
143
+ export function toPointerKind(value: string): PointerKind | null {
144
+ return value === "mouse" || value === "touch" || value === "pen" ? value : null;
145
+ }
146
+
147
+ function isPointerEvent(event: Event): event is PointerEvent {
148
+ return "pointerId" in event && "pointerType" in event;
149
+ }
150
+
151
+ function browserWindow(): EventTarget | undefined {
152
+ return typeof window !== "undefined" ? window : undefined;
153
+ }
@@ -0,0 +1,98 @@
1
+ import { computed } from "vue";
2
+ import type { ComputedRef, Ref } from "vue";
3
+
4
+ import { useMediaQuery } from "./media-query.ts";
5
+ import type { UseMediaQueryOptions } from "./media-query.ts";
6
+
7
+ /** Color scheme preference exposed by {@link usePreferredColorScheme}. */
8
+ export type ColorSchemePreference = "dark" | "light" | "no-preference";
9
+
10
+ /** Contrast preference exposed by {@link usePreferredContrast}. */
11
+ export type ContrastPreference = "more" | "less" | "custom" | "no-preference";
12
+
13
+ /** Options for the multi-valued preference composables. */
14
+ export interface UsePreferenceOptions<Preference extends string> extends Omit<
15
+ UseMediaQueryOptions,
16
+ "ssrValue"
17
+ > {
18
+ /**
19
+ * Preference exposed during server rendering and whenever no media-query
20
+ * capability exists.
21
+ *
22
+ * @default "no-preference"
23
+ */
24
+ readonly ssrPreference?: Preference;
25
+ }
26
+
27
+ /**
28
+ * Whether the user prefers a dark color scheme.
29
+ *
30
+ * Shares {@link useMediaQuery} semantics: `ssrValue` (default `false`) during
31
+ * server rendering and subscription cleanup with the owning scope.
32
+ *
33
+ * @param options Runtime capability and server fallback.
34
+ * @default options {}
35
+ * @returns Readonly ref for `(prefers-color-scheme: dark)`.
36
+ */
37
+ export function usePreferredDark(options: UseMediaQueryOptions = {}): Readonly<Ref<boolean>> {
38
+ return useMediaQuery("(prefers-color-scheme: dark)", options);
39
+ }
40
+
41
+ /**
42
+ * Reactive color scheme preference.
43
+ *
44
+ * @param options Runtime capability and server fallback.
45
+ * @default options {}
46
+ * @returns Computed closed preference.
47
+ */
48
+ export function usePreferredColorScheme(
49
+ options: UsePreferenceOptions<ColorSchemePreference> = {},
50
+ ): ComputedRef<ColorSchemePreference> {
51
+ const fallback = options.ssrPreference ?? "no-preference";
52
+ const query = (value: "dark" | "light"): Readonly<Ref<boolean>> =>
53
+ useMediaQuery(`(prefers-color-scheme: ${value})`, withSsr(options, fallback === value));
54
+ const dark = query("dark");
55
+ const light = query("light");
56
+ return computed(() => (dark.value ? "dark" : light.value ? "light" : "no-preference"));
57
+ }
58
+
59
+ /**
60
+ * Reactive contrast preference.
61
+ *
62
+ * @param options Runtime capability and server fallback.
63
+ * @default options {}
64
+ * @returns Computed closed preference.
65
+ */
66
+ export function usePreferredContrast(
67
+ options: UsePreferenceOptions<ContrastPreference> = {},
68
+ ): ComputedRef<ContrastPreference> {
69
+ const fallback = options.ssrPreference ?? "no-preference";
70
+ const query = (value: "more" | "less" | "custom"): Readonly<Ref<boolean>> =>
71
+ useMediaQuery(`(prefers-contrast: ${value})`, withSsr(options, fallback === value));
72
+ const more = query("more");
73
+ const less = query("less");
74
+ const custom = query("custom");
75
+ return computed(() =>
76
+ more.value ? "more" : less.value ? "less" : custom.value ? "custom" : "no-preference",
77
+ );
78
+ }
79
+
80
+ /**
81
+ * Whether the user prefers reduced transparency.
82
+ *
83
+ * @param options Runtime capability and server fallback.
84
+ * @default options {}
85
+ * @returns Readonly ref for `(prefers-reduced-transparency: reduce)`.
86
+ */
87
+ export function usePreferredReducedTransparency(
88
+ options: UseMediaQueryOptions = {},
89
+ ): Readonly<Ref<boolean>> {
90
+ return useMediaQuery("(prefers-reduced-transparency: reduce)", options);
91
+ }
92
+
93
+ function withSsr<Preference extends string>(
94
+ options: UsePreferenceOptions<Preference>,
95
+ ssrValue: boolean,
96
+ ): UseMediaQueryOptions {
97
+ return options.host === undefined ? { ssrValue } : { ssrValue, host: options.host };
98
+ }
@@ -0,0 +1,88 @@
1
+ import { hasInjectionContext, readonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Window-like capability observed by {@link usePreferredLanguages}. */
7
+ export interface PreferredLanguagesHost extends EventTarget {
8
+ /** Navigator exposing the user's languages. */
9
+ readonly navigator: { readonly languages: readonly string[]; readonly language?: string };
10
+ }
11
+
12
+ /** Options for {@link usePreferredLanguages}. */
13
+ export interface UsePreferredLanguagesOptions {
14
+ /**
15
+ * Languages exposed during server rendering. Pass the request's
16
+ * `Accept-Language` list to keep hydration stable.
17
+ *
18
+ * @default ["en"]
19
+ */
20
+ readonly ssrLanguages?: readonly string[];
21
+
22
+ /**
23
+ * Reactive window capability for alternate runtimes and tests.
24
+ *
25
+ * @default globalThis.window when available
26
+ */
27
+ readonly host?: MaybeRefOrGetter<PreferredLanguagesHost | null | undefined>;
28
+ }
29
+
30
+ /**
31
+ * Track the user's preferred languages (`navigator.languages`).
32
+ *
33
+ * Updates on `languagechange`. The default host is gated on `window`, so
34
+ * Node's own `navigator` never leaks the server locale into the render;
35
+ * server renders expose `ssrLanguages`. Inside a component the languages are
36
+ * read after mounting, so hydration renders `ssrLanguages` first. The
37
+ * listener is removed with the owning reactive scope.
38
+ *
39
+ * @param options Server fallback and window capability.
40
+ * @default options {}
41
+ * @returns Readonly ref of BCP 47 language tags, most preferred first.
42
+ */
43
+ export function usePreferredLanguages(
44
+ options: UsePreferredLanguagesOptions = {},
45
+ ): Readonly<Ref<readonly string[]>> {
46
+ const fallback = options.ssrLanguages ?? ["en"];
47
+ const languages = shallowRef<readonly string[]>(fallback);
48
+ // Inside a component the host is attached by a post-flush job (after the
49
+ // component mounted), so a hydrating client first renders the same server
50
+ // fallback. Outside components it is attached synchronously.
51
+ const hydrated = shallowRef(!hasInjectionContext());
52
+ if (!hydrated.value) {
53
+ watchPostEffect(() => {
54
+ hydrated.value = true;
55
+ });
56
+ }
57
+
58
+ const stop = watch(
59
+ () =>
60
+ hydrated.value
61
+ ? options.host === undefined
62
+ ? browserLanguagesHost()
63
+ : toValue(options.host)
64
+ : undefined,
65
+ (host, _previous, onCleanup) => {
66
+ if (!host) {
67
+ languages.value = fallback;
68
+ return;
69
+ }
70
+ const update = (): void => {
71
+ const { languages: list, language } = host.navigator;
72
+ languages.value =
73
+ list.length > 0 ? [...list] : language !== undefined ? [language] : fallback;
74
+ };
75
+ update();
76
+ host.addEventListener("languagechange", update, { passive: true });
77
+ onCleanup(() => host.removeEventListener("languagechange", update));
78
+ },
79
+ { immediate: true },
80
+ );
81
+ tryOnScopeDispose(() => stop.stop());
82
+
83
+ return readonly(languages);
84
+ }
85
+
86
+ function browserLanguagesHost(): PreferredLanguagesHost | undefined {
87
+ return typeof window !== "undefined" ? window : undefined;
88
+ }
@@ -0,0 +1,39 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ /** Parameter list of a reactified function: every argument may be a ref or getter. */
5
+ export type ReactifiedArguments<Arguments extends readonly unknown[]> = {
6
+ readonly [Index in keyof Arguments]: MaybeRefOrGetter<Arguments[Index]>;
7
+ };
8
+
9
+ /** Function returned by {@link reactify}. */
10
+ export type Reactified<Arguments extends readonly unknown[], Result> = (
11
+ ...args: ReactifiedArguments<Arguments>
12
+ ) => ComputedRef<Result>;
13
+
14
+ /**
15
+ * Turn a plain function into one that accepts refs/getters and returns a
16
+ * computed result.
17
+ *
18
+ * Arity and parameter names are preserved; each parameter additionally
19
+ * accepts `Ref<T>` or `() => T`. The computed re-runs the original function
20
+ * whenever a reactive argument changes. Pure derived state: SSR-safe and
21
+ * nothing to dispose.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const add = reactify((left: number, right: number) => left + right);
26
+ * const sum = add(count, 1); // ComputedRef<number>
27
+ * ```
28
+ *
29
+ * @param fn Plain function to lift.
30
+ * @returns The reactified function.
31
+ */
32
+ export function reactify<Arguments extends readonly unknown[], Result>(
33
+ fn: (...args: Arguments) => Result,
34
+ ): Reactified<Arguments, Result>;
35
+ export function reactify(
36
+ fn: (...args: readonly unknown[]) => unknown,
37
+ ): (...args: readonly MaybeRefOrGetter<unknown>[]) => ComputedRef<unknown> {
38
+ return (...args) => computed(() => fn(...args.map((argument) => toValue(argument))));
39
+ }