@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,188 @@
1
+ import { watch } from "vue";
2
+
3
+ import { resolveElement } from "./element-target.ts";
4
+ import type { MaybeElementTarget } from "./element-target.ts";
5
+ import { tryOnScopeDispose } from "./scope.ts";
6
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
7
+
8
+ /** Event modifiers applied to the pointer events handled by {@link onLongPress}. */
9
+ export interface LongPressModifiers {
10
+ /** Call `stopPropagation()`. */
11
+ readonly stop?: boolean;
12
+ /** Fire at most once. */
13
+ readonly once?: boolean;
14
+ /** Call `preventDefault()`. */
15
+ readonly prevent?: boolean;
16
+ /** Listen in the capture phase. */
17
+ readonly capture?: boolean;
18
+ /** Only start when the element itself (not a descendant) is pressed. */
19
+ readonly self?: boolean;
20
+ }
21
+
22
+ /** Summary passed to {@link OnLongPressOptions.onRelease}. */
23
+ export interface LongPressRelease {
24
+ /** Milliseconds between press and release. */
25
+ readonly duration: number;
26
+ /** Pointer travel in CSS pixels. */
27
+ readonly distance: number;
28
+ /** Whether the long-press handler fired. */
29
+ readonly isLongPress: boolean;
30
+ }
31
+
32
+ /** Options for {@link onLongPress}. */
33
+ export interface OnLongPressOptions {
34
+ /**
35
+ * Hold time in milliseconds.
36
+ *
37
+ * @default 500
38
+ */
39
+ readonly delay?: number;
40
+
41
+ /**
42
+ * Maximum pointer travel before the press is cancelled.
43
+ *
44
+ * @default 10
45
+ */
46
+ readonly distanceThreshold?: number;
47
+
48
+ /**
49
+ * Event modifiers.
50
+ *
51
+ * @default {}
52
+ */
53
+ readonly modifiers?: LongPressModifiers;
54
+
55
+ /**
56
+ * Called on every release with timing details.
57
+ *
58
+ * @default undefined
59
+ */
60
+ readonly onRelease?: (release: LongPressRelease, event: PointerEvent) => void;
61
+
62
+ /**
63
+ * Clock for durations.
64
+ *
65
+ * @default Date.now
66
+ */
67
+ readonly now?: () => number;
68
+
69
+ /**
70
+ * Owns the hold timer.
71
+ *
72
+ * @default globalThis timer functions
73
+ */
74
+ readonly scheduler?: TimeoutScheduler;
75
+ }
76
+
77
+ const defaultScheduler: TimeoutScheduler = {
78
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
79
+ clearTimeout: (handle) => {
80
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
81
+ },
82
+ };
83
+
84
+ /**
85
+ * Call a handler when an element is pressed and held.
86
+ *
87
+ * Uses Pointer Events, so mouse, touch, and pen behave alike. Moving more than
88
+ * `distanceThreshold` or releasing early cancels the press. Nothing is
89
+ * registered during server rendering; listeners and the timer are released
90
+ * with the owning scope or the returned stop function.
91
+ *
92
+ * @param target Reactive element target.
93
+ * @param handler Called with the initiating `pointerdown` event.
94
+ * @param options Delay, threshold, modifiers, and callbacks.
95
+ * @default options {}
96
+ * @returns Stop function.
97
+ */
98
+ export function onLongPress(
99
+ target: MaybeElementTarget,
100
+ handler: (event: PointerEvent) => void,
101
+ options: OnLongPressOptions = {},
102
+ ): () => void {
103
+ const {
104
+ delay = 500,
105
+ distanceThreshold = 10,
106
+ modifiers = {},
107
+ now = Date.now,
108
+ scheduler = defaultScheduler,
109
+ } = options;
110
+ let handle: unknown;
111
+ let pending = false;
112
+ let fired = false;
113
+ let used = false;
114
+ let start: { readonly x: number; readonly y: number; readonly time: number } | null = null;
115
+
116
+ const clear = (): void => {
117
+ if (pending) scheduler.clearTimeout(handle);
118
+ pending = false;
119
+ };
120
+ const apply = (event: PointerEvent): void => {
121
+ if (modifiers.prevent && event.cancelable) event.preventDefault();
122
+ if (modifiers.stop) event.stopPropagation();
123
+ };
124
+
125
+ const stopWatch = watch(
126
+ () => resolveElement(target),
127
+ (element, _previous, onCleanup) => {
128
+ if (!element) return;
129
+ const onDown = (event: Event): void => {
130
+ if (!isPointerEvent(event) || (modifiers.once && used)) return;
131
+ if (modifiers.self && event.target !== element) return;
132
+ apply(event);
133
+ clear();
134
+ fired = false;
135
+ start = { x: event.clientX, y: event.clientY, time: now() };
136
+ pending = true;
137
+ handle = scheduler.setTimeout(() => {
138
+ pending = false;
139
+ fired = true;
140
+ used = true;
141
+ handler(event);
142
+ }, delay);
143
+ };
144
+ const onMove = (event: Event): void => {
145
+ if (!isPointerEvent(event) || !start || !pending) return;
146
+ if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > distanceThreshold) {
147
+ clear();
148
+ }
149
+ };
150
+ const onUp = (event: Event): void => {
151
+ if (!isPointerEvent(event) || !start) return;
152
+ apply(event);
153
+ const release: LongPressRelease = {
154
+ duration: now() - start.time,
155
+ distance: Math.hypot(event.clientX - start.x, event.clientY - start.y),
156
+ isLongPress: fired,
157
+ };
158
+ clear();
159
+ start = null;
160
+ options.onRelease?.(release, event);
161
+ };
162
+ const listenerOptions: AddEventListenerOptions = { capture: modifiers.capture ?? false };
163
+ element.addEventListener("pointerdown", onDown, listenerOptions);
164
+ element.addEventListener("pointermove", onMove, listenerOptions);
165
+ element.addEventListener("pointerup", onUp, listenerOptions);
166
+ element.addEventListener("pointerleave", onUp, listenerOptions);
167
+ element.addEventListener("pointercancel", onUp, listenerOptions);
168
+ onCleanup(() => {
169
+ const removeOptions: EventListenerOptions = { capture: modifiers.capture ?? false };
170
+ element.removeEventListener("pointerdown", onDown, removeOptions);
171
+ element.removeEventListener("pointermove", onMove, removeOptions);
172
+ element.removeEventListener("pointerup", onUp, removeOptions);
173
+ element.removeEventListener("pointerleave", onUp, removeOptions);
174
+ element.removeEventListener("pointercancel", onUp, removeOptions);
175
+ clear();
176
+ start = null;
177
+ });
178
+ },
179
+ { immediate: true, flush: "post" },
180
+ );
181
+ const stop = (): void => stopWatch.stop();
182
+ tryOnScopeDispose(stop);
183
+ return stop;
184
+ }
185
+
186
+ function isPointerEvent(event: Event): event is PointerEvent {
187
+ return "pointerId" in event && "clientX" in event;
188
+ }
@@ -0,0 +1,88 @@
1
+ import { toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Document-like capability observed by {@link onStartTyping}. */
7
+ export interface StartTypingHost extends EventTarget {
8
+ /** Currently focused element. */
9
+ readonly activeElement: Element | null;
10
+ }
11
+
12
+ /** Options for {@link onStartTyping}. */
13
+ export interface OnStartTypingOptions {
14
+ /**
15
+ * Reactive document capability for alternate runtimes and tests.
16
+ *
17
+ * @default globalThis.document when available
18
+ */
19
+ readonly host?: MaybeRefOrGetter<StartTypingHost | null | undefined>;
20
+ }
21
+
22
+ /**
23
+ * Whether a keyboard event would type a printable character.
24
+ *
25
+ * Single-character keys (letters, digits, punctuation; not space) without
26
+ * `ctrl`/`meta`/`alt` qualify.
27
+ *
28
+ * @param event Keyboard event.
29
+ * @returns Whether the event starts typing.
30
+ */
31
+ export function isTypingKeystroke(event: KeyboardEvent): boolean {
32
+ if (event.ctrlKey || event.metaKey || event.altKey) return false;
33
+ return event.key.length === 1 && event.key !== " ";
34
+ }
35
+
36
+ /**
37
+ * Call a handler when the user starts typing while no editable element has
38
+ * focus — typically to focus a search field.
39
+ *
40
+ * Editable means `input`, `textarea`, `select`, or any element with
41
+ * `isContentEditable`, and elements with `role="textbox"`/`"searchbox"`/`"combobox"`.
42
+ * Nothing is registered during server rendering; the listener is removed with
43
+ * the owning scope or the returned stop function.
44
+ *
45
+ * @param handler Called with the initiating `keydown` event.
46
+ * @param options Document capability.
47
+ * @default options {}
48
+ * @returns Stop function.
49
+ */
50
+ export function onStartTyping(
51
+ handler: (event: KeyboardEvent) => void,
52
+ options: OnStartTypingOptions = {},
53
+ ): () => void {
54
+ const stop = watch(
55
+ () => (options.host === undefined ? browserTypingHost() : toValue(options.host)),
56
+ (host, _previous, onCleanup) => {
57
+ if (!host) return;
58
+ const onKeyDown = (event: Event): void => {
59
+ if (!isKeyboardEvent(event) || event.defaultPrevented) return;
60
+ if (isEditable(host.activeElement) || !isTypingKeystroke(event)) return;
61
+ handler(event);
62
+ };
63
+ host.addEventListener("keydown", onKeyDown, { passive: true });
64
+ onCleanup(() => host.removeEventListener("keydown", onKeyDown));
65
+ },
66
+ { immediate: true },
67
+ );
68
+ const dispose = (): void => stop.stop();
69
+ tryOnScopeDispose(dispose);
70
+ return dispose;
71
+ }
72
+
73
+ function isEditable(element: Element | null): boolean {
74
+ if (!element) return false;
75
+ const tag = element.tagName;
76
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return true;
77
+ if ("isContentEditable" in element && element.isContentEditable === true) return true;
78
+ const role = element.getAttribute?.("role");
79
+ return role === "textbox" || role === "searchbox" || role === "combobox";
80
+ }
81
+
82
+ function isKeyboardEvent(event: Event): event is KeyboardEvent {
83
+ return "key" in event && "code" in event;
84
+ }
85
+
86
+ function browserTypingHost(): StartTypingHost | undefined {
87
+ return typeof document !== "undefined" ? document : undefined;
88
+ }
@@ -0,0 +1,57 @@
1
+ import { readonly, ref, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Options for {@link usePageLeave}. */
7
+ export interface UsePageLeaveOptions {
8
+ /**
9
+ * Window-like target that receives `mouseout`/`mouseover`.
10
+ *
11
+ * @default globalThis.window when available
12
+ */
13
+ readonly host?: MaybeRefOrGetter<EventTarget | null | undefined>;
14
+ }
15
+
16
+ /**
17
+ * Detect when the mouse leaves the page (for exit-intent UI).
18
+ *
19
+ * A `mouseout` without a `relatedTarget` means the pointer left the
20
+ * document; any `mouseover` means it came back. Server renders report
21
+ * `false`; listeners are removed with the owning reactive scope.
22
+ *
23
+ * @param options Window capability.
24
+ * @default options {}
25
+ * @returns Readonly ref that is `true` while the pointer is outside the page.
26
+ */
27
+ export function usePageLeave(options: UsePageLeaveOptions = {}): Readonly<Ref<boolean>> {
28
+ const left = ref(false);
29
+ const onOut = (event: Event): void => {
30
+ const related = "relatedTarget" in event ? event.relatedTarget : null;
31
+ left.value = related === null || related === undefined;
32
+ };
33
+ const onOver = (): void => {
34
+ left.value = false;
35
+ };
36
+
37
+ const stop = watch(
38
+ () => (options.host === undefined ? browserPageHost() : toValue(options.host)),
39
+ (host, _previous, onCleanup) => {
40
+ if (!host) return;
41
+ host.addEventListener("mouseout", onOut, { passive: true });
42
+ host.addEventListener("mouseover", onOver, { passive: true });
43
+ onCleanup(() => {
44
+ host.removeEventListener("mouseout", onOut);
45
+ host.removeEventListener("mouseover", onOver);
46
+ });
47
+ },
48
+ { immediate: true },
49
+ );
50
+ tryOnScopeDispose(() => stop.stop());
51
+
52
+ return readonly(left);
53
+ }
54
+
55
+ function browserPageHost(): EventTarget | undefined {
56
+ return typeof window !== "undefined" ? window : undefined;
57
+ }
@@ -0,0 +1,29 @@
1
+ import { shallowRef, watch } from "vue";
2
+ import type { ShallowRef } from "vue";
3
+
4
+ import { isElementNode, resolveElement } from "./element-target.ts";
5
+ import type { MaybeElementTarget } from "./element-target.ts";
6
+ import { tryOnScopeDispose } from "./scope.ts";
7
+
8
+ /**
9
+ * Track the parent element of a reactive element target.
10
+ *
11
+ * Re-reads `parentElement` whenever the target resolves or changes (after
12
+ * the DOM update). Server renders expose `null`.
13
+ *
14
+ * @param target Reactive element target.
15
+ * @returns Readonly shallow ref of the parent element.
16
+ */
17
+ export function useParentElement(target: MaybeElementTarget): Readonly<ShallowRef<Element | null>> {
18
+ const parent = shallowRef<Element | null>(null);
19
+ const stop = watch(
20
+ () => resolveElement(target),
21
+ (element) => {
22
+ const candidate: unknown = element?.parentElement ?? null;
23
+ parent.value = isElementNode(candidate) ? candidate : null;
24
+ },
25
+ { immediate: true, flush: "post" },
26
+ );
27
+ tryOnScopeDispose(() => stop.stop());
28
+ return parent;
29
+ }
@@ -0,0 +1,187 @@
1
+ import { readonly, ref, shallowReactive, shallowReadonly, watch } from "vue";
2
+ import type { Ref } from "vue";
3
+
4
+ import { resolveElement } from "./element-target.ts";
5
+ import type { MaybeElementTarget } from "./element-target.ts";
6
+ import type { Point } from "./mouse.ts";
7
+ import { tryOnScopeDispose } from "./scope.ts";
8
+
9
+ /** Snapshot passed to pinch callbacks. */
10
+ export interface PinchSnapshot {
11
+ /** Scale relative to the start of the gesture (`1` = unchanged). */
12
+ readonly scale: number;
13
+ /** Rotation relative to the start of the gesture, in degrees. */
14
+ readonly rotation: number;
15
+ /** Midpoint between the two pointers in client coordinates. */
16
+ readonly origin: Point;
17
+ /** Current distance between the two pointers. */
18
+ readonly distance: number;
19
+ }
20
+
21
+ /** Options for {@link usePinch}. */
22
+ export interface UsePinchOptions {
23
+ /**
24
+ * Called when a second pointer starts a pinch.
25
+ *
26
+ * @default undefined
27
+ */
28
+ readonly onPinchStart?: (snapshot: PinchSnapshot) => void;
29
+
30
+ /**
31
+ * Called on every move while pinching.
32
+ *
33
+ * @default undefined
34
+ */
35
+ readonly onPinch?: (snapshot: PinchSnapshot) => void;
36
+
37
+ /**
38
+ * Called when one of the two pointers lifts.
39
+ *
40
+ * @default undefined
41
+ */
42
+ readonly onPinchEnd?: (snapshot: PinchSnapshot) => void;
43
+ }
44
+
45
+ /** Reactive gesture state returned by {@link usePinch}. */
46
+ export interface PinchControls {
47
+ /** Whether two pointers are currently pinching. */
48
+ readonly isPinching: Readonly<Ref<boolean>>;
49
+ /** Scale relative to the gesture start; stays at the final value after the gesture. */
50
+ readonly scale: Readonly<Ref<number>>;
51
+ /** Rotation relative to the gesture start in degrees. */
52
+ readonly rotation: Readonly<Ref<number>>;
53
+ /** Distance between the pointers when the gesture started. */
54
+ readonly initialDistance: Readonly<Ref<number>>;
55
+ /** Current distance between the pointers. */
56
+ readonly distance: Readonly<Ref<number>>;
57
+ /** Midpoint between the pointers. */
58
+ readonly origin: Readonly<Point>;
59
+ /** Restore scale `1` and rotation `0`. */
60
+ readonly reset: () => void;
61
+ /** Remove listeners. Idempotent. */
62
+ readonly stop: () => void;
63
+ }
64
+
65
+ /**
66
+ * Recognize two-pointer pinch/rotate gestures on an element.
67
+ *
68
+ * Tracks active pointers with Pointer Events (touch, pen, or mouse chords).
69
+ * The first two pointers define the gesture; additional pointers are
70
+ * ignored. Pair it with `touch-action: none` on the element so the browser
71
+ * does not claim the gesture for zooming. Server renders expose scale `1`,
72
+ * rotation `0`, and `isPinching: false`.
73
+ *
74
+ * @param target Reactive element target.
75
+ * @param options Gesture lifecycle callbacks.
76
+ * @default options {}
77
+ * @returns Reactive gesture state plus reset/stop controls.
78
+ */
79
+ export function usePinch(target: MaybeElementTarget, options: UsePinchOptions = {}): PinchControls {
80
+ const isPinching = ref(false);
81
+ const scale = ref(1);
82
+ const rotation = ref(0);
83
+ const initialDistance = ref(0);
84
+ const distance = ref(0);
85
+ const origin = shallowReactive({ x: 0, y: 0 });
86
+ const pointers = new Map<number, Point>();
87
+ let initialAngle = 0;
88
+
89
+ const pair = (): readonly [Point, Point] | null => {
90
+ const [first, second] = pointers.values();
91
+ return first && second ? [first, second] : null;
92
+ };
93
+ const snapshot = (): PinchSnapshot => ({
94
+ scale: scale.value,
95
+ rotation: rotation.value,
96
+ origin: { x: origin.x, y: origin.y },
97
+ distance: distance.value,
98
+ });
99
+ const measure = (first: Point, second: Point): { distance: number; angle: number } => {
100
+ origin.x = (first.x + second.x) / 2;
101
+ origin.y = (first.y + second.y) / 2;
102
+ return {
103
+ distance: Math.hypot(second.x - first.x, second.y - first.y),
104
+ angle: (Math.atan2(second.y - first.y, second.x - first.x) * 180) / Math.PI,
105
+ };
106
+ };
107
+
108
+ const onDown = (event: Event): void => {
109
+ if (!isPointerEvent(event) || pointers.size >= 2) return;
110
+ pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });
111
+ const points = pair();
112
+ if (!points) return;
113
+ const measured = measure(...points);
114
+ initialDistance.value = measured.distance;
115
+ distance.value = measured.distance;
116
+ initialAngle = measured.angle;
117
+ scale.value = 1;
118
+ rotation.value = 0;
119
+ isPinching.value = true;
120
+ options.onPinchStart?.(snapshot());
121
+ };
122
+ const onMove = (event: Event): void => {
123
+ if (!isPointerEvent(event) || !pointers.has(event.pointerId)) return;
124
+ pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });
125
+ const points = pair();
126
+ if (!points || !isPinching.value) return;
127
+ const measured = measure(...points);
128
+ distance.value = measured.distance;
129
+ scale.value = initialDistance.value === 0 ? 1 : measured.distance / initialDistance.value;
130
+ rotation.value = normalizeDegrees(measured.angle - initialAngle);
131
+ options.onPinch?.(snapshot());
132
+ };
133
+ const onUp = (event: Event): void => {
134
+ if (!isPointerEvent(event) || !pointers.delete(event.pointerId)) return;
135
+ if (!isPinching.value) return;
136
+ isPinching.value = false;
137
+ options.onPinchEnd?.(snapshot());
138
+ };
139
+
140
+ const stopWatch = watch(
141
+ () => resolveElement(target),
142
+ (element, _previous, onCleanup) => {
143
+ if (!element) return;
144
+ const listenerOptions: AddEventListenerOptions = { passive: true };
145
+ element.addEventListener("pointerdown", onDown, listenerOptions);
146
+ element.addEventListener("pointermove", onMove, listenerOptions);
147
+ for (const type of ["pointerup", "pointercancel", "pointerleave"] as const) {
148
+ element.addEventListener(type, onUp, listenerOptions);
149
+ }
150
+ onCleanup(() => {
151
+ element.removeEventListener("pointerdown", onDown);
152
+ element.removeEventListener("pointermove", onMove);
153
+ for (const type of ["pointerup", "pointercancel", "pointerleave"] as const) {
154
+ element.removeEventListener(type, onUp);
155
+ }
156
+ pointers.clear();
157
+ isPinching.value = false;
158
+ });
159
+ },
160
+ { immediate: true, flush: "post" },
161
+ );
162
+ const stop = (): void => stopWatch.stop();
163
+ tryOnScopeDispose(stop);
164
+
165
+ return {
166
+ isPinching: readonly(isPinching),
167
+ scale: readonly(scale),
168
+ rotation: readonly(rotation),
169
+ initialDistance: readonly(initialDistance),
170
+ distance: readonly(distance),
171
+ origin: shallowReadonly(origin),
172
+ reset: () => {
173
+ scale.value = 1;
174
+ rotation.value = 0;
175
+ },
176
+ stop,
177
+ };
178
+ }
179
+
180
+ function normalizeDegrees(value: number): number {
181
+ const wrapped = ((((value + 180) % 360) + 360) % 360) - 180;
182
+ return wrapped === -180 ? 180 : wrapped;
183
+ }
184
+
185
+ function isPointerEvent(event: Event): event is PointerEvent {
186
+ return "pointerId" in event && "clientX" in event;
187
+ }