@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,148 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ /** Text flow reported by the internationalization runtime. */
5
+ export type TextDirection = "ltr" | "rtl";
6
+
7
+ /** Locale selection options for {@link useLocale}. */
8
+ export interface UseLocaleOptions {
9
+ /**
10
+ * Locale detector used when the reactive source has no value.
11
+ *
12
+ * @default navigator.language when available; otherwise undefined
13
+ */
14
+ readonly detect?: () => Intl.Locale | string | null | undefined;
15
+
16
+ /**
17
+ * Locale used when neither the source nor detector provides one.
18
+ *
19
+ * @default "en"
20
+ */
21
+ readonly fallback?: Intl.Locale | string;
22
+ }
23
+
24
+ /**
25
+ * Reactive locale metadata and cached formatter factories.
26
+ *
27
+ * Formatter factories propagate `TypeError` and `RangeError` from the
28
+ * platform `Intl` constructors when the supplied options are invalid.
29
+ */
30
+ export interface LocaleControls {
31
+ /** Canonical Unicode locale identifier. */
32
+ readonly locale: ComputedRef<string>;
33
+
34
+ /** Parsed locale details supplied by the internationalization runtime. */
35
+ readonly details: ComputedRef<Intl.Locale>;
36
+
37
+ /** Native writing direction for the active locale. */
38
+ readonly direction: ComputedRef<TextDirection>;
39
+
40
+ /** Return a cached number formatter for the active locale and options. */
41
+ readonly number: (options?: Intl.NumberFormatOptions) => Intl.NumberFormat;
42
+
43
+ /** Return a cached date and time formatter for the active locale and options. */
44
+ readonly dateTime: (options?: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
45
+
46
+ /** Return a cached list formatter for the active locale and options. */
47
+ readonly list: (options?: Intl.ListFormatOptions) => Intl.ListFormat;
48
+
49
+ /** Return a cached relative-time formatter for the active locale and options. */
50
+ readonly relativeTime: (options?: Intl.RelativeTimeFormatOptions) => Intl.RelativeTimeFormat;
51
+ }
52
+
53
+ const FORMATTER_CACHE_LIMIT = 32;
54
+
55
+ /**
56
+ * Create reactive locale metadata and platform-native formatter factories.
57
+ *
58
+ * Equivalent formatter options reuse instances. The bounded cache follows the
59
+ * active locale automatically and prevents repeated constructor overhead in
60
+ * reactive render paths.
61
+ *
62
+ * Detection is lazy and guarded: the default detector reads
63
+ * `navigator.language` behind a `typeof` check at call time, so importing and
64
+ * calling this during server rendering is safe, and runtimes without a
65
+ * `navigator` resolve to the fallback locale. The composable owns no timers
66
+ * or listeners, so no scope cleanup is required.
67
+ *
68
+ * @param source Reactive locale source. Empty values defer to the detector.
69
+ * @param options Detection and fallback behavior.
70
+ * @default options {}
71
+ * @throws `RangeError` on first read of the reactive values when the winning
72
+ * candidate is not a structurally valid locale identifier.
73
+ * @returns Reactive locale metadata and cached formatter factories.
74
+ */
75
+ export function useLocale(
76
+ source?: MaybeRefOrGetter<Intl.Locale | string | null | undefined>,
77
+ options: UseLocaleOptions = {},
78
+ ): LocaleControls {
79
+ const locale = computed(() => {
80
+ const candidate =
81
+ (source === undefined ? undefined : toValue(source)) ??
82
+ (options.detect ?? detectBrowserLocale)() ??
83
+ options.fallback ??
84
+ "en";
85
+ return candidate instanceof Intl.Locale
86
+ ? candidate.toString()
87
+ : new Intl.Locale(candidate).toString();
88
+ });
89
+ const details = computed(() => new Intl.Locale(locale.value));
90
+ const direction = computed<TextDirection>(() => details.value.getTextInfo().direction ?? "ltr");
91
+
92
+ const number = createFormatterCache<Intl.NumberFormatOptions, Intl.NumberFormat>(
93
+ (activeLocale, formatOptions) => new Intl.NumberFormat(activeLocale, formatOptions),
94
+ );
95
+ const dateTime = createFormatterCache<Intl.DateTimeFormatOptions, Intl.DateTimeFormat>(
96
+ (activeLocale, formatOptions) => new Intl.DateTimeFormat(activeLocale, formatOptions),
97
+ );
98
+ const list = createFormatterCache<Intl.ListFormatOptions, Intl.ListFormat>(
99
+ (activeLocale, formatOptions) => new Intl.ListFormat(activeLocale, formatOptions),
100
+ );
101
+ const relativeTime = createFormatterCache<
102
+ Intl.RelativeTimeFormatOptions,
103
+ Intl.RelativeTimeFormat
104
+ >((activeLocale, formatOptions) => new Intl.RelativeTimeFormat(activeLocale, formatOptions));
105
+
106
+ return {
107
+ locale,
108
+ details,
109
+ direction,
110
+ number: (formatOptions) => number(locale.value, formatOptions),
111
+ dateTime: (formatOptions) => dateTime(locale.value, formatOptions),
112
+ list: (formatOptions) => list(locale.value, formatOptions),
113
+ relativeTime: (formatOptions) => relativeTime(locale.value, formatOptions),
114
+ };
115
+ }
116
+
117
+ function detectBrowserLocale(): string | undefined {
118
+ return typeof navigator === "undefined" ? undefined : navigator.language;
119
+ }
120
+
121
+ function createFormatterCache<Options extends object, Formatter>(
122
+ create: (locale: string, options?: Options) => Formatter,
123
+ ): (locale: string, options?: Options) => Formatter {
124
+ const cache = new Map<string, Formatter>();
125
+ return (locale, options) => {
126
+ const key = `${locale}\u0000${serializeOptions(options)}`;
127
+ const cached = cache.get(key);
128
+ if (cached !== undefined) {
129
+ cache.delete(key);
130
+ cache.set(key, cached);
131
+ return cached;
132
+ }
133
+ const formatter = create(locale, options);
134
+ if (cache.size >= FORMATTER_CACHE_LIMIT) {
135
+ const oldest = cache.keys().next().value;
136
+ if (oldest !== undefined) cache.delete(oldest);
137
+ }
138
+ cache.set(key, formatter);
139
+ return formatter;
140
+ };
141
+ }
142
+
143
+ function serializeOptions(options: object | undefined): string {
144
+ if (options === undefined) return "";
145
+ return JSON.stringify(
146
+ Object.entries(options).sort(([left], [right]) => left.localeCompare(right)),
147
+ );
148
+ }
@@ -0,0 +1,298 @@
1
+ import { computed, reactive, readonly, ref, toValue, watch } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Modifier key names recognized in combos (after alias resolution). */
7
+ export type ModifierKeyName = "control" | "shift" | "alt" | "meta";
8
+
9
+ /**
10
+ * Validate a key combo string at the type level.
11
+ *
12
+ * Combos join lowercase-insensitive key names with `+` or `_`
13
+ * (`"ctrl+s"`, `"shift_arrowup"`). Empty segments such as `"ctrl+"` or
14
+ * `"+s"` resolve to `never`, turning typos into compile errors. Non-literal
15
+ * `string` values are accepted unchanged.
16
+ */
17
+ export type KeyCombo<Combo extends string> = string extends Combo
18
+ ? string
19
+ : Combo extends ""
20
+ ? never
21
+ : Combo extends `${infer Head}${"+" | "_"}${infer Tail}`
22
+ ? Head extends ""
23
+ ? never
24
+ : Tail extends ""
25
+ ? never
26
+ : KeyCombo<Tail> extends never
27
+ ? never
28
+ : Combo
29
+ : Combo;
30
+
31
+ /** Default aliases resolved before matching combos. */
32
+ export const DEFAULT_KEY_ALIASES = {
33
+ ctrl: "control",
34
+ command: "meta",
35
+ cmd: "meta",
36
+ option: "alt",
37
+ esc: "escape",
38
+ up: "arrowup",
39
+ down: "arrowdown",
40
+ left: "arrowleft",
41
+ right: "arrowright",
42
+ " ": "space",
43
+ spacebar: "space",
44
+ } as const satisfies Readonly<Record<string, string>>;
45
+
46
+ /** Options shared by the keyboard composables. */
47
+ export interface UseKeyboardTargetOptions {
48
+ /**
49
+ * Event target that receives `keydown`/`keyup`.
50
+ *
51
+ * @default globalThis.window when available
52
+ */
53
+ readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
54
+
55
+ /**
56
+ * Register passive listeners.
57
+ *
58
+ * @default true
59
+ */
60
+ readonly passive?: boolean;
61
+ }
62
+
63
+ /** Options for {@link useMagicKeys}. */
64
+ export interface UseMagicKeysOptions extends UseKeyboardTargetOptions {
65
+ /**
66
+ * Extra aliases merged over {@link DEFAULT_KEY_ALIASES}. Keys and values are
67
+ * matched case-insensitively.
68
+ *
69
+ * @default {}
70
+ */
71
+ readonly aliasMap?: Readonly<Record<string, string>>;
72
+
73
+ /**
74
+ * Called for every `keydown`/`keyup` after the pressed set has been
75
+ * updated. Useful for `preventDefault()` with `passive: false`.
76
+ *
77
+ * @default undefined
78
+ */
79
+ readonly onEventFired?: (event: KeyboardEvent) => void;
80
+ }
81
+
82
+ /** Reactive keyboard state returned by {@link useMagicKeys}. */
83
+ export interface MagicKeys {
84
+ /** Normalized names (`event.key` and `event.code`, lowercase) currently pressed. */
85
+ readonly current: ReadonlySet<string>;
86
+
87
+ /**
88
+ * Proxy of combo refs created lazily on property access, e.g.
89
+ * `const { shift, ctrl_s } = keys.combos`.
90
+ */
91
+ readonly combos: Readonly<Record<string, ComputedRef<boolean>>>;
92
+
93
+ /**
94
+ * Create (or reuse) a ref that is `true` while every key of the combo is
95
+ * pressed.
96
+ *
97
+ * @param combo Key combo such as `"ctrl+shift+p"`.
98
+ * @returns Readonly computed ref.
99
+ */
100
+ readonly isPressed: <const Combo extends string>(
101
+ combo: Combo & KeyCombo<Combo>,
102
+ ) => ComputedRef<boolean>;
103
+
104
+ /** Forget every pressed key (for example after a modal steals focus). */
105
+ readonly reset: () => void;
106
+ }
107
+
108
+ const modifierNames: ReadonlySet<string> = new Set<ModifierKeyName>([
109
+ "control",
110
+ "shift",
111
+ "alt",
112
+ "meta",
113
+ ]);
114
+
115
+ /**
116
+ * Normalize a key name the way combos are matched.
117
+ *
118
+ * @param name Raw `KeyboardEvent.key`/`code` or combo segment.
119
+ * @param aliases Alias table (keys lowercased).
120
+ * @default aliases DEFAULT_KEY_ALIASES
121
+ * @returns Lowercase, alias-resolved name.
122
+ */
123
+ export function normalizeKeyName(
124
+ name: string,
125
+ aliases: Readonly<Record<string, string>> = DEFAULT_KEY_ALIASES,
126
+ ): string {
127
+ const lower = name.toLowerCase();
128
+ return (aliases[lower] ?? lower).toLowerCase();
129
+ }
130
+
131
+ /**
132
+ * Track pressed keys and expose reactive key combos.
133
+ *
134
+ * Both `event.key` and `event.code` are recorded (lowercased), so `"a"` and
135
+ * `"keya"` both match. Because some platforms (notably macOS with `meta`)
136
+ * swallow `keyup` for other keys while a modifier is held, releasing a
137
+ * modifier clears every non-modifier key; losing window focus clears
138
+ * everything. Nothing is pressed during server rendering, and listeners are
139
+ * removed with the owning reactive scope.
140
+ *
141
+ * @param options Target, passivity, aliases, and event hook.
142
+ * @default options {}
143
+ * @returns Pressed set, lazily created combo refs, and controls.
144
+ */
145
+ export function useMagicKeys(options: UseMagicKeysOptions = {}): MagicKeys {
146
+ const aliases: Record<string, string> = { ...DEFAULT_KEY_ALIASES };
147
+ for (const [alias, key] of Object.entries(options.aliasMap ?? {})) {
148
+ aliases[alias.toLowerCase()] = key.toLowerCase();
149
+ }
150
+ const current = reactive(new Set<string>());
151
+ const cache = new Map<string, ComputedRef<boolean>>();
152
+
153
+ const namesOf = (event: KeyboardEvent): string[] => {
154
+ const names = new Set<string>();
155
+ if (event.key) names.add(normalizeKeyName(event.key, aliases));
156
+ if (event.code) names.add(normalizeKeyName(event.code, aliases));
157
+ return [...names];
158
+ };
159
+ const reset = (): void => current.clear();
160
+ const onKey = (event: Event): void => {
161
+ if (!isKeyboardEvent(event)) return;
162
+ const names = namesOf(event);
163
+ if (event.type === "keydown") {
164
+ for (const name of names) current.add(name);
165
+ } else {
166
+ for (const name of names) current.delete(name);
167
+ if (names.some((name) => modifierNames.has(name))) {
168
+ for (const name of current) if (!modifierNames.has(name)) current.delete(name);
169
+ }
170
+ }
171
+ options.onEventFired?.(event);
172
+ };
173
+
174
+ const stop = watch(
175
+ () => (options.target === undefined ? browserWindow() : toValue(options.target)),
176
+ (target, _previous, onCleanup) => {
177
+ if (!target) return;
178
+ const listenerOptions: AddEventListenerOptions = { passive: options.passive ?? true };
179
+ target.addEventListener("keydown", onKey, listenerOptions);
180
+ target.addEventListener("keyup", onKey, listenerOptions);
181
+ target.addEventListener("blur", reset, { passive: true });
182
+ onCleanup(() => {
183
+ target.removeEventListener("keydown", onKey);
184
+ target.removeEventListener("keyup", onKey);
185
+ target.removeEventListener("blur", reset);
186
+ reset();
187
+ });
188
+ },
189
+ { immediate: true },
190
+ );
191
+ tryOnScopeDispose(() => stop.stop());
192
+
193
+ const comboRef = (combo: string): ComputedRef<boolean> => {
194
+ const key = combo.toLowerCase();
195
+ const cached = cache.get(key);
196
+ if (cached) return cached;
197
+ const parts = key
198
+ .split(/[+_]/)
199
+ .filter((part) => part !== "")
200
+ .map((part) => normalizeKeyName(part, aliases));
201
+ const pressed = computed(() => parts.length > 0 && parts.every((part) => current.has(part)));
202
+ cache.set(key, pressed);
203
+ return pressed;
204
+ };
205
+
206
+ const combos = new Proxy<Record<string, ComputedRef<boolean>>>(
207
+ {},
208
+ {
209
+ get: (_target, property) => (typeof property === "string" ? comboRef(property) : undefined),
210
+ has: (_target, property) => typeof property === "string",
211
+ },
212
+ );
213
+
214
+ return {
215
+ current: readonly(current),
216
+ combos,
217
+ isPressed: (combo) => comboRef(combo),
218
+ reset,
219
+ };
220
+ }
221
+
222
+ /** Key filter accepted by {@link useKeyPressed}. */
223
+ export type KeyFilter = string | readonly string[] | ((event: KeyboardEvent) => boolean);
224
+
225
+ /**
226
+ * Track whether any key matching a filter is held down.
227
+ *
228
+ * String filters are normalized like combos (`"esc"` matches `Escape`) and
229
+ * compared against both `event.key` and `event.code`. The state resets on
230
+ * window blur and during server rendering is always `false`.
231
+ *
232
+ * @param filter Key name(s) or predicate.
233
+ * @param options Target and passivity.
234
+ * @default options {}
235
+ * @returns Readonly ref that is `true` while a matching key is held.
236
+ */
237
+ export function useKeyPressed(
238
+ filter: KeyFilter,
239
+ options: UseKeyboardTargetOptions = {},
240
+ ): Readonly<Ref<boolean>> {
241
+ const held = new Set<string>();
242
+ const pressed = ref(false);
243
+ const names =
244
+ typeof filter === "function"
245
+ ? undefined
246
+ : new Set(
247
+ (typeof filter === "string" ? [filter] : filter).map((name) => normalizeKeyName(name)),
248
+ );
249
+ const matches = (event: KeyboardEvent): boolean =>
250
+ names === undefined
251
+ ? typeof filter === "function" && filter(event)
252
+ : names.has(normalizeKeyName(event.key)) || names.has(normalizeKeyName(event.code));
253
+ const identity = (event: KeyboardEvent): string => event.code || event.key;
254
+
255
+ const onDown = (event: Event): void => {
256
+ if (!isKeyboardEvent(event) || !matches(event)) return;
257
+ held.add(identity(event));
258
+ pressed.value = true;
259
+ };
260
+ const onUp = (event: Event): void => {
261
+ if (!isKeyboardEvent(event)) return;
262
+ held.delete(identity(event));
263
+ pressed.value = held.size > 0;
264
+ };
265
+ const reset = (): void => {
266
+ held.clear();
267
+ pressed.value = false;
268
+ };
269
+
270
+ const stop = watch(
271
+ () => (options.target === undefined ? browserWindow() : toValue(options.target)),
272
+ (target, _previous, onCleanup) => {
273
+ if (!target) return;
274
+ const listenerOptions: AddEventListenerOptions = { passive: options.passive ?? true };
275
+ target.addEventListener("keydown", onDown, listenerOptions);
276
+ target.addEventListener("keyup", onUp, listenerOptions);
277
+ target.addEventListener("blur", reset, { passive: true });
278
+ onCleanup(() => {
279
+ target.removeEventListener("keydown", onDown);
280
+ target.removeEventListener("keyup", onUp);
281
+ target.removeEventListener("blur", reset);
282
+ reset();
283
+ });
284
+ },
285
+ { immediate: true },
286
+ );
287
+ tryOnScopeDispose(() => stop.stop());
288
+
289
+ return readonly(pressed);
290
+ }
291
+
292
+ function isKeyboardEvent(event: Event): event is KeyboardEvent {
293
+ return "key" in event && "code" in event;
294
+ }
295
+
296
+ function browserWindow(): EventTarget | undefined {
297
+ return typeof window !== "undefined" ? window : undefined;
298
+ }
@@ -0,0 +1,175 @@
1
+ import { computed, isReadonly, isRef, shallowRef, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref, WritableComputedRef } from "vue";
3
+
4
+ function clampNumber(value: number, min: number, max: number): number {
5
+ if (min > max) {
6
+ throw new RangeError(
7
+ `[VIZE_COMPOSE_MATH_INVALID_RANGE] min must not exceed max; received [${String(min)}, ${String(max)}]`,
8
+ );
9
+ }
10
+ return Math.min(max, Math.max(min, value));
11
+ }
12
+
13
+ function isWritableRef(value: MaybeRefOrGetter<number>): value is Ref<number> {
14
+ return isRef(value) && !isReadonly(value);
15
+ }
16
+
17
+ /**
18
+ * Number kept inside `[min, max]`.
19
+ *
20
+ * A writable source (a number or a writable ref) yields a writable ref whose
21
+ * reads and writes are clamped; writes go through to the source ref. A
22
+ * getter or computed source yields a readonly computed. Bounds are reactive.
23
+ * Pure derived state: SSR-safe and nothing to dispose.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const volume = useClamp(50, 0, 100);
28
+ * volume.value = 150; // 100
29
+ * const progress = useClamp(() => loaded.value / total.value, 0, 1);
30
+ * ```
31
+ *
32
+ * @param value Source number, writable ref, or getter.
33
+ * @param min Reactive inclusive lower bound.
34
+ * @param max Reactive inclusive upper bound.
35
+ * @throws `RangeError` tagged `VIZE_COMPOSE_MATH_INVALID_RANGE` on read or
36
+ * write when `min > max`.
37
+ * @returns Writable clamped ref, or a readonly computed for getters.
38
+ */
39
+ export function useClamp(
40
+ value: (() => number) | ComputedRef<number>,
41
+ min: MaybeRefOrGetter<number>,
42
+ max: MaybeRefOrGetter<number>,
43
+ ): ComputedRef<number>;
44
+ export function useClamp(
45
+ value: number | Ref<number>,
46
+ min: MaybeRefOrGetter<number>,
47
+ max: MaybeRefOrGetter<number>,
48
+ ): WritableComputedRef<number>;
49
+ export function useClamp(
50
+ value: MaybeRefOrGetter<number>,
51
+ min: MaybeRefOrGetter<number>,
52
+ max: MaybeRefOrGetter<number>,
53
+ ): ComputedRef<number> | WritableComputedRef<number> {
54
+ let source: Ref<number>;
55
+ if (isWritableRef(value)) source = value;
56
+ else if (typeof value === "number") source = shallowRef(value);
57
+ else return computed(() => clampNumber(toValue(value), toValue(min), toValue(max)));
58
+ return computed({
59
+ get: () => clampNumber(source.value, toValue(min), toValue(max)),
60
+ set: (next) => {
61
+ source.value = clampNumber(next, toValue(min), toValue(max));
62
+ },
63
+ });
64
+ }
65
+
66
+ /** Rounding strategy used by {@link useRound}. */
67
+ export type RoundingMethod = "round" | "floor" | "ceil" | "trunc";
68
+
69
+ /** Options for {@link useRound}. */
70
+ export interface UseRoundOptions {
71
+ /**
72
+ * Decimal places to keep; negative values round to tens, hundreds, …
73
+ * Reactive.
74
+ *
75
+ * @default 0
76
+ */
77
+ readonly precision?: MaybeRefOrGetter<number>;
78
+
79
+ /**
80
+ * Rounding strategy.
81
+ *
82
+ * @default "round"
83
+ */
84
+ readonly method?: RoundingMethod;
85
+ }
86
+
87
+ /** Multiply by `10 ** places` exactly, by editing the decimal exponent. */
88
+ function shiftExponent(value: number, places: number): number {
89
+ const [mantissa, exponent = "0"] = String(value).split("e");
90
+ return Number(`${mantissa}e${Number(exponent) + places}`);
91
+ }
92
+
93
+ /**
94
+ * Reactive rounding with decimal precision.
95
+ *
96
+ * Uses exponent shifting instead of multiplying by powers of ten, so values
97
+ * such as `1.005` round to `1.01` at two decimals. Pure derived state.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * const price = useRound(rawPrice, { precision: 2 });
102
+ * ```
103
+ *
104
+ * @param value Reactive number.
105
+ * @param options Precision and method.
106
+ * @default options {}
107
+ * @throws `RangeError` tagged `VIZE_COMPOSE_MATH_INVALID_PRECISION` on read
108
+ * when the precision is not an integer.
109
+ * @returns Computed rounded number.
110
+ */
111
+ export function useRound(
112
+ value: MaybeRefOrGetter<number>,
113
+ options: UseRoundOptions = {},
114
+ ): ComputedRef<number> {
115
+ return computed(() => {
116
+ const precision = toValue(options.precision ?? 0);
117
+ if (!Number.isInteger(precision)) {
118
+ throw new RangeError(
119
+ `[VIZE_COMPOSE_MATH_INVALID_PRECISION] precision must be an integer; received ${String(precision)}`,
120
+ );
121
+ }
122
+ const number = toValue(value);
123
+ if (!Number.isFinite(number)) return number;
124
+ const round = Math[options.method ?? "round"];
125
+ return shiftExponent(round(shiftExponent(number, precision)), -precision);
126
+ });
127
+ }
128
+
129
+ /** A `[start, end]` numeric interval. */
130
+ export type ProjectionDomain = readonly [start: number, end: number];
131
+
132
+ /** Options for {@link useProjection}. */
133
+ export interface UseProjectionOptions {
134
+ /**
135
+ * Clamp the result into the target domain.
136
+ *
137
+ * @default false
138
+ */
139
+ readonly clamp?: boolean;
140
+ }
141
+
142
+ /**
143
+ * Linearly map a value from one domain to another.
144
+ *
145
+ * Domains are reactive tuples and may be reversed (`[100, 0]`). A degenerate
146
+ * source domain maps everything to the target start. Pure derived state.
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * const percent = useProjection(scrollY, () => [0, maxScroll.value], [0, 100], { clamp: true });
151
+ * ```
152
+ *
153
+ * @param value Reactive number in the source domain.
154
+ * @param from Reactive source domain.
155
+ * @param to Reactive target domain.
156
+ * @param options Clamping.
157
+ * @default options {}
158
+ * @returns Computed projected number.
159
+ */
160
+ export function useProjection(
161
+ value: MaybeRefOrGetter<number>,
162
+ from: MaybeRefOrGetter<ProjectionDomain>,
163
+ to: MaybeRefOrGetter<ProjectionDomain>,
164
+ options: UseProjectionOptions = {},
165
+ ): ComputedRef<number> {
166
+ return computed(() => {
167
+ const [fromStart, fromEnd] = toValue(from);
168
+ const [toStart, toEnd] = toValue(to);
169
+ const span = fromEnd - fromStart;
170
+ const ratio = span === 0 ? 0 : (toValue(value) - fromStart) / span;
171
+ const projected = toStart + ratio * (toEnd - toStart);
172
+ if (!(options.clamp ?? false)) return projected;
173
+ return Math.min(Math.max(projected, Math.min(toStart, toEnd)), Math.max(toStart, toEnd));
174
+ });
175
+ }