@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,175 @@
1
+ import { readonly, ref, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { resolveElement } from "./element-target.ts";
5
+ import type { MaybeElementTarget } from "./element-target.ts";
6
+ import { useEventListener } from "./event-listener.ts";
7
+ import { useResizeObserver } from "./resize-observer.ts";
8
+ import type { ResizeObserverHost } from "./resize-observer.ts";
9
+ import { tryOnScopeDispose } from "./scope.ts";
10
+
11
+ /**
12
+ * Window-like capability observed by {@link useElementBounding}: scroll and
13
+ * resize events plus the optional `ResizeObserver` constructor.
14
+ */
15
+ export interface ElementBoundingHost extends EventTarget, ResizeObserverHost {}
16
+
17
+ /** Viewport-relative element geometry in CSS pixels. */
18
+ export interface ElementBoundingRect {
19
+ /** Horizontal position of the border box origin. */
20
+ readonly x: number;
21
+ /** Vertical position of the border box origin. */
22
+ readonly y: number;
23
+ /** Distance from the viewport top edge to the border box top edge. */
24
+ readonly top: number;
25
+ /** Distance from the viewport left edge to the border box right edge. */
26
+ readonly right: number;
27
+ /** Distance from the viewport top edge to the border box bottom edge. */
28
+ readonly bottom: number;
29
+ /** Distance from the viewport left edge to the border box left edge. */
30
+ readonly left: number;
31
+ /** Border box width. */
32
+ readonly width: number;
33
+ /** Border box height. */
34
+ readonly height: number;
35
+ }
36
+
37
+ /** Options for {@link useElementBounding}. */
38
+ export interface UseElementBoundingOptions {
39
+ /**
40
+ * Reset every value to zero when the target unmounts.
41
+ *
42
+ * @default true
43
+ */
44
+ readonly reset?: boolean;
45
+
46
+ /**
47
+ * Re-measure when the window resizes.
48
+ *
49
+ * @default true
50
+ */
51
+ readonly windowResize?: boolean;
52
+
53
+ /**
54
+ * Re-measure when any ancestor (or the window) scrolls. Uses a capturing,
55
+ * passive listener so nested scroll containers are covered.
56
+ *
57
+ * @default true
58
+ */
59
+ readonly windowScroll?: boolean;
60
+
61
+ /**
62
+ * Reactive window capability for alternate runtimes and tests.
63
+ *
64
+ * @default globalThis.window when available
65
+ */
66
+ readonly host?: MaybeRefOrGetter<ElementBoundingHost | null | undefined>;
67
+
68
+ /**
69
+ * Target resolution timing. `"post"` measures template refs after mount.
70
+ *
71
+ * @default "post"
72
+ */
73
+ readonly flush?: "pre" | "post" | "sync";
74
+ }
75
+
76
+ /** Reactive geometry returned by {@link useElementBounding}. */
77
+ export type ElementBoundingControls = {
78
+ /** Reactive geometry field; zero during server rendering. */
79
+ readonly [Key in keyof ElementBoundingRect]: Readonly<Ref<number>>;
80
+ } & {
81
+ /** Measure the target immediately. Does nothing while it is unresolved. */
82
+ readonly update: () => void;
83
+
84
+ /** Stop observing resize, scroll, and target changes. Idempotent. */
85
+ readonly stop: () => void;
86
+ };
87
+
88
+ const boundingKeys = [
89
+ "x",
90
+ "y",
91
+ "top",
92
+ "right",
93
+ "bottom",
94
+ "left",
95
+ "width",
96
+ "height",
97
+ ] as const satisfies readonly (keyof ElementBoundingRect)[];
98
+
99
+ /**
100
+ * Track an element's `getBoundingClientRect()` reactively.
101
+ *
102
+ * Measures when the target resolves, when it resizes (via `ResizeObserver`),
103
+ * and — unless disabled — when the window resizes or anything scrolls. Every
104
+ * value is `0` during server rendering and before the first measurement, so
105
+ * the initial render is hydration-stable. Listeners and the observer are
106
+ * released with the owning reactive scope.
107
+ *
108
+ * @param target Reactive element target.
109
+ * @param options Reset, listener, capability, and timing options.
110
+ * @default options {}
111
+ * @returns One readonly ref per geometry field plus `update`/`stop`.
112
+ */
113
+ export function useElementBounding(
114
+ target: MaybeElementTarget,
115
+ options: UseElementBoundingOptions = {},
116
+ ): ElementBoundingControls {
117
+ const { reset = true, windowResize = true, windowScroll = true } = options;
118
+ const flush = options.flush ?? "post";
119
+ const state = {
120
+ x: ref(0),
121
+ y: ref(0),
122
+ top: ref(0),
123
+ right: ref(0),
124
+ bottom: ref(0),
125
+ left: ref(0),
126
+ width: ref(0),
127
+ height: ref(0),
128
+ };
129
+ const host = (): ElementBoundingHost | null | undefined =>
130
+ options.host === undefined ? browserBoundingHost() : toValue(options.host);
131
+
132
+ const update = (): void => {
133
+ const element = resolveElement(target);
134
+ if (!element) {
135
+ if (reset) for (const key of boundingKeys) state[key].value = 0;
136
+ return;
137
+ }
138
+ const rect = element.getBoundingClientRect();
139
+ for (const key of boundingKeys) state[key].value = rect[key];
140
+ };
141
+
142
+ const observer = useResizeObserver(target, update, { host, flush });
143
+ const stopTarget = watch(() => resolveElement(target), update, { immediate: true, flush });
144
+ const resize = windowResize
145
+ ? useEventListener(host, "resize", update, { passive: true, flush })
146
+ : undefined;
147
+ const scroll = windowScroll
148
+ ? useEventListener(host, "scroll", update, { capture: true, passive: true, flush })
149
+ : undefined;
150
+
151
+ const stop = (): void => {
152
+ observer.stop();
153
+ stopTarget.stop();
154
+ resize?.stop();
155
+ scroll?.stop();
156
+ };
157
+ tryOnScopeDispose(stop);
158
+
159
+ return {
160
+ x: readonly(state.x),
161
+ y: readonly(state.y),
162
+ top: readonly(state.top),
163
+ right: readonly(state.right),
164
+ bottom: readonly(state.bottom),
165
+ left: readonly(state.left),
166
+ width: readonly(state.width),
167
+ height: readonly(state.height),
168
+ update,
169
+ stop,
170
+ };
171
+ }
172
+
173
+ function browserBoundingHost(): ElementBoundingHost | undefined {
174
+ return typeof window !== "undefined" ? window : undefined;
175
+ }
@@ -0,0 +1,149 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Document-like capability used by {@link useElementByPoint}. */
7
+ export interface ElementByPointHost {
8
+ /** Topmost element at a point. */
9
+ elementFromPoint(x: number, y: number): Element | null;
10
+ /**
11
+ * Every element at a point, topmost first. Optional: when missing, only
12
+ * the topmost element is reported.
13
+ */
14
+ elementsFromPoint?(x: number, y: number): Element[];
15
+ }
16
+
17
+ /** Frame scheduler used for continuous polling. */
18
+ export interface ElementByPointFrameHost {
19
+ /** Schedule a callback before the next repaint. */
20
+ readonly requestAnimationFrame: (callback: FrameRequestCallback) => number;
21
+ /** Cancel a scheduled frame. */
22
+ readonly cancelAnimationFrame: (handle: number) => void;
23
+ }
24
+
25
+ /** Options for {@link useElementByPoint}. */
26
+ export interface UseElementByPointOptions {
27
+ /** Horizontal client coordinate. */
28
+ readonly x: MaybeRefOrGetter<number>;
29
+
30
+ /** Vertical client coordinate. */
31
+ readonly y: MaybeRefOrGetter<number>;
32
+
33
+ /**
34
+ * Also re-query every animation frame (the element under a fixed point can
35
+ * change when the page scrolls or animates).
36
+ *
37
+ * @default false
38
+ */
39
+ readonly poll?: boolean;
40
+
41
+ /**
42
+ * Reactive document capability for alternate runtimes and tests.
43
+ *
44
+ * @default globalThis.document when available
45
+ */
46
+ readonly host?: MaybeRefOrGetter<ElementByPointHost | null | undefined>;
47
+
48
+ /**
49
+ * Frame scheduler used when `poll` is enabled.
50
+ *
51
+ * @default globalThis.window when available
52
+ */
53
+ readonly frameHost?: MaybeRefOrGetter<ElementByPointFrameHost | null | undefined>;
54
+ }
55
+
56
+ /** Reactive state returned by {@link useElementByPoint}. */
57
+ export interface ElementByPointControls {
58
+ /** Whether a document capability is attached. `false` during server rendering. */
59
+ readonly isSupported: Readonly<Ref<boolean>>;
60
+ /** Topmost element at the point. */
61
+ readonly element: Readonly<ShallowRef<Element | null>>;
62
+ /** Every element at the point, topmost first. */
63
+ readonly elements: Readonly<ShallowRef<readonly Element[]>>;
64
+ /** Re-query immediately. */
65
+ readonly update: () => void;
66
+ }
67
+
68
+ /**
69
+ * Track the element(s) under a client coordinate.
70
+ *
71
+ * Re-queries whenever `x`/`y` change and, with `poll`, on every animation
72
+ * frame until the owning scope stops. Server renders expose `null` and an
73
+ * empty list.
74
+ *
75
+ * @param options Coordinates, polling, and capabilities.
76
+ * @returns Reactive topmost element, element stack, and a manual update.
77
+ */
78
+ export function useElementByPoint(options: UseElementByPointOptions): ElementByPointControls {
79
+ const isSupported = ref(false);
80
+ const element = shallowRef<Element | null>(null);
81
+ const elements = shallowRef<readonly Element[]>([]);
82
+ // Inside a component the host is read once it has mounted, so a hydrating
83
+ // client first renders the same fallback as the server. `hasInjectionContext`
84
+ // also detects Vapor components (unlike `getCurrentInstance`).
85
+ const mounted = shallowRef(!hasInjectionContext());
86
+ if (!mounted.value) {
87
+ onMounted(() => {
88
+ mounted.value = true;
89
+ });
90
+ }
91
+ const host = (): ElementByPointHost | null | undefined =>
92
+ !mounted.value
93
+ ? undefined
94
+ : options.host === undefined
95
+ ? browserPointHost()
96
+ : toValue(options.host);
97
+
98
+ const update = (): void => {
99
+ const current = host();
100
+ isSupported.value = Boolean(current);
101
+ if (!current) {
102
+ element.value = null;
103
+ elements.value = [];
104
+ return;
105
+ }
106
+ const x = toValue(options.x);
107
+ const y = toValue(options.y);
108
+ element.value = current.elementFromPoint(x, y);
109
+ elements.value = current.elementsFromPoint
110
+ ? current.elementsFromPoint(x, y)
111
+ : element.value
112
+ ? [element.value]
113
+ : [];
114
+ };
115
+
116
+ const stopWatch = watch(() => [host(), toValue(options.x), toValue(options.y)] as const, update, {
117
+ immediate: true,
118
+ });
119
+ const stopPolling = options.poll
120
+ ? watch(
121
+ () => (options.frameHost === undefined ? browserFrameHost() : toValue(options.frameHost)),
122
+ (frames, _previous, onCleanup) => {
123
+ if (!frames) return;
124
+ let handle = 0;
125
+ const tick = (): void => {
126
+ update();
127
+ handle = frames.requestAnimationFrame(tick);
128
+ };
129
+ handle = frames.requestAnimationFrame(tick);
130
+ onCleanup(() => frames.cancelAnimationFrame(handle));
131
+ },
132
+ { immediate: true },
133
+ )
134
+ : undefined;
135
+ tryOnScopeDispose(() => {
136
+ stopWatch.stop();
137
+ stopPolling?.stop();
138
+ });
139
+
140
+ return { isSupported: readonly(isSupported), element, elements, update };
141
+ }
142
+
143
+ function browserPointHost(): ElementByPointHost | undefined {
144
+ return typeof document !== "undefined" ? document : undefined;
145
+ }
146
+
147
+ function browserFrameHost(): ElementByPointFrameHost | undefined {
148
+ return typeof window !== "undefined" ? window : undefined;
149
+ }
@@ -0,0 +1,104 @@
1
+ import { readonly, ref, 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 { tryOnScopeDispose } from "./scope.ts";
7
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
8
+
9
+ /** Options for {@link useElementHover}. */
10
+ export interface UseElementHoverOptions {
11
+ /**
12
+ * Milliseconds to wait before reporting hover.
13
+ *
14
+ * @default 0
15
+ */
16
+ readonly delayEnter?: number;
17
+
18
+ /**
19
+ * Milliseconds to wait before reporting the end of hover.
20
+ *
21
+ * @default 0
22
+ */
23
+ readonly delayLeave?: number;
24
+
25
+ /**
26
+ * Owns the delay timer.
27
+ *
28
+ * @default globalThis timer functions
29
+ */
30
+ readonly scheduler?: TimeoutScheduler;
31
+ }
32
+
33
+ const defaultScheduler: TimeoutScheduler = {
34
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
35
+ clearTimeout: (handle) => {
36
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
37
+ },
38
+ };
39
+
40
+ /**
41
+ * Track whether the pointer hovers an element.
42
+ *
43
+ * Uses `pointerenter`/`pointerleave` (which ignore descendants) with optional
44
+ * enter/leave delays; a pending delay is cancelled by the opposite event.
45
+ * Server renders report `false`; listeners and timers are released with the
46
+ * owning reactive scope.
47
+ *
48
+ * @param target Reactive element target.
49
+ * @param options Enter/leave delays and timer scheduler.
50
+ * @default options {}
51
+ * @returns Readonly hover flag.
52
+ */
53
+ export function useElementHover(
54
+ target: MaybeElementTarget,
55
+ options: UseElementHoverOptions = {},
56
+ ): Readonly<Ref<boolean>> {
57
+ const { delayEnter = 0, delayLeave = 0, scheduler = defaultScheduler } = options;
58
+ const hovered = ref(false);
59
+ let handle: unknown;
60
+ let pending = false;
61
+
62
+ const cancel = (): void => {
63
+ if (!pending) return;
64
+ scheduler.clearTimeout(handle);
65
+ pending = false;
66
+ };
67
+ const set = (next: boolean): void => {
68
+ cancel();
69
+ const delay = next ? delayEnter : delayLeave;
70
+ if (delay <= 0) {
71
+ hovered.value = next;
72
+ return;
73
+ }
74
+ pending = true;
75
+ handle = scheduler.setTimeout(() => {
76
+ pending = false;
77
+ hovered.value = next;
78
+ }, delay);
79
+ };
80
+ const onEnter = (): void => set(true);
81
+ const onLeave = (): void => set(false);
82
+
83
+ const stop = watch(
84
+ () => resolveElement(target),
85
+ (element, _previous, onCleanup) => {
86
+ if (!element) return;
87
+ element.addEventListener("pointerenter", onEnter, { passive: true });
88
+ element.addEventListener("pointerleave", onLeave, { passive: true });
89
+ onCleanup(() => {
90
+ element.removeEventListener("pointerenter", onEnter);
91
+ element.removeEventListener("pointerleave", onLeave);
92
+ cancel();
93
+ hovered.value = false;
94
+ });
95
+ },
96
+ { immediate: true, flush: "post" },
97
+ );
98
+ tryOnScopeDispose(() => {
99
+ stop.stop();
100
+ cancel();
101
+ });
102
+
103
+ return readonly(hovered);
104
+ }
@@ -0,0 +1,58 @@
1
+ import { hasInjectionContext, onMounted, shallowRef } from "vue";
2
+ import type { ComponentPublicInstance, ShallowRef } from "vue";
3
+
4
+ import { resolveElement } from "./element-target.ts";
5
+
6
+ /** Function ref accepted by `:ref` on elements and components. */
7
+ export type ElementRefSetter = (value: Element | ComponentPublicInstance | null) => void;
8
+
9
+ /** State returned by {@link useElementRef}. */
10
+ export interface ElementRefControls<TargetElement extends Element> {
11
+ /** Resolved element (component roots are unwrapped); `null` while unmounted. */
12
+ readonly element: Readonly<ShallowRef<TargetElement | null>>;
13
+ /** Bind with `:ref="setRef"` on an element or component. */
14
+ readonly setRef: ElementRefSetter;
15
+ }
16
+
17
+ /**
18
+ * Capture a template element through a function ref.
19
+ *
20
+ * An instance-free alternative to "current element" helpers: it never reads
21
+ * `getCurrentInstance()`, so it works in Vapor components, render functions,
22
+ * and plain effect scopes. Inside a component the element is published after
23
+ * mounting (Vapor sets function refs during render), keeping hydration stable. Component refs are unwrapped to their root
24
+ * element, and an optional guard narrows the element type (elements failing
25
+ * it resolve to `null`). The ref is `null` during server rendering.
26
+ *
27
+ * @returns Reactive element plus the function ref to bind.
28
+ */
29
+ export function useElementRef(): ElementRefControls<Element>;
30
+ /**
31
+ * Capture a template element narrowed by a type guard.
32
+ *
33
+ * @param guard Type guard; elements failing it resolve to `null`.
34
+ * @returns Reactive narrowed element plus the function ref to bind.
35
+ */
36
+ export function useElementRef<TargetElement extends Element>(
37
+ guard: (element: Element) => element is TargetElement,
38
+ ): ElementRefControls<TargetElement>;
39
+ export function useElementRef(guard?: (element: Element) => boolean): ElementRefControls<Element> {
40
+ const element = shallowRef<Element | null>(null);
41
+ // Vapor assigns function refs while rendering, VDOM after patching; inside
42
+ // a component the element is published once it has mounted so both
43
+ // renderers hydrate the same (server) state first.
44
+ let mounted = !hasInjectionContext();
45
+ let pending: Element | null = null;
46
+ if (!mounted) {
47
+ onMounted(() => {
48
+ mounted = true;
49
+ element.value = pending;
50
+ });
51
+ }
52
+ const setRef: ElementRefSetter = (value) => {
53
+ const resolved = resolveElement(value);
54
+ pending = resolved && (!guard || guard(resolved)) ? resolved : null;
55
+ if (mounted) element.value = pending;
56
+ };
57
+ return { element, setRef };
58
+ }
@@ -0,0 +1,99 @@
1
+ import { toValue } from "vue";
2
+ import type { ComponentPublicInstance, MaybeRefOrGetter } from "vue";
3
+
4
+ /**
5
+ * A concrete value that can identify a DOM element.
6
+ *
7
+ * Template refs on native elements resolve to the element itself, while refs
8
+ * on components resolve to the component's public instance whose root node
9
+ * is exposed as `$el`. `null` and `undefined` represent a target that is not
10
+ * mounted yet (including every server render).
11
+ */
12
+ export type ElementTargetValue<TargetElement extends Element = Element> =
13
+ | TargetElement
14
+ | ComponentPublicInstance
15
+ | null
16
+ | undefined;
17
+
18
+ /**
19
+ * Reactive element target accepted by every element-based composable.
20
+ *
21
+ * Accepts a plain value, a ref (such as `useTemplateRef()`), or a getter.
22
+ */
23
+ export type MaybeElementTarget<TargetElement extends Element = Element> = MaybeRefOrGetter<
24
+ ElementTargetValue<TargetElement>
25
+ >;
26
+
27
+ /**
28
+ * Reactive list of element targets for observers that watch several nodes.
29
+ *
30
+ * Each item follows {@link MaybeElementTarget} semantics; unresolved items
31
+ * are skipped.
32
+ */
33
+ export type MaybeElementTargets<TargetElement extends Element = Element> =
34
+ | MaybeElementTarget<TargetElement>
35
+ | MaybeRefOrGetter<readonly ElementTargetValue<TargetElement>[]>;
36
+
37
+ /**
38
+ * Whether a value is a DOM element node.
39
+ *
40
+ * Uses the `nodeType` contract instead of `instanceof Element`, so the check
41
+ * reads no browser globals and works across realms (iframes, happy-dom,
42
+ * jsdom).
43
+ *
44
+ * @param value Candidate value.
45
+ * @returns Whether `value` is an element node.
46
+ */
47
+ export function isElementNode(value: unknown): value is Element {
48
+ return (
49
+ typeof value === "object" &&
50
+ value !== null &&
51
+ "nodeType" in value &&
52
+ value.nodeType === 1 &&
53
+ "getBoundingClientRect" in value
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Resolve a reactive element target to its concrete element.
59
+ *
60
+ * Reads the reactive source once (tracking it when called inside an effect).
61
+ * Component instances resolve to their root element; fragment or text roots
62
+ * resolve to `null`. Never throws and reads no browser globals, so it is safe
63
+ * during server rendering, where it always returns `null`.
64
+ *
65
+ * @param target Reactive element target.
66
+ * @returns The resolved element, or `null` while unresolved.
67
+ */
68
+ export function resolveElement(target: MaybeElementTarget): Element | null {
69
+ return elementFromValue(toValue(target));
70
+ }
71
+
72
+ function elementFromValue(value: unknown): Element | null {
73
+ if (isElementNode(value)) return value;
74
+ if (typeof value === "object" && value !== null && "$el" in value) {
75
+ const root: unknown = value.$el;
76
+ return isElementNode(root) ? root : null;
77
+ }
78
+ return null;
79
+ }
80
+
81
+ /**
82
+ * Resolve a reactive list (or single) element target to its concrete elements.
83
+ *
84
+ * Unresolved entries are dropped and duplicates are removed while keeping the
85
+ * first-seen order, so observers never register the same node twice.
86
+ *
87
+ * @param targets Reactive element target or target list.
88
+ * @returns The resolved, de-duplicated elements.
89
+ */
90
+ export function resolveElements(targets: MaybeElementTargets): Element[] {
91
+ const value: unknown = toValue(targets);
92
+ const items: readonly unknown[] = Array.isArray(value) ? value : [value];
93
+ const elements: Element[] = [];
94
+ for (const item of items) {
95
+ const element = elementFromValue(item);
96
+ if (element && !elements.includes(element)) elements.push(element);
97
+ }
98
+ return elements;
99
+ }