@vizejs/composable 0.426.3 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,176 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
6
+
7
+ /** Window-like capability observed by {@link useIdle}. */
8
+ export interface IdleHost extends EventTarget {
9
+ /** Document whose visibility changes count as activity when it becomes visible. */
10
+ readonly document?: EventTarget & { readonly hidden?: boolean };
11
+ }
12
+
13
+ /** Default activity events. */
14
+ export const DEFAULT_IDLE_EVENTS = [
15
+ "mousemove",
16
+ "mousedown",
17
+ "resize",
18
+ "keydown",
19
+ "touchstart",
20
+ "wheel",
21
+ ] as const;
22
+
23
+ /** Options for {@link useIdle}. */
24
+ export interface UseIdleOptions {
25
+ /**
26
+ * Window events that count as activity.
27
+ *
28
+ * @default DEFAULT_IDLE_EVENTS
29
+ */
30
+ readonly events?: readonly string[];
31
+
32
+ /**
33
+ * Treat the document becoming visible again as activity.
34
+ *
35
+ * @default true
36
+ */
37
+ readonly listenForVisibilityChange?: boolean;
38
+
39
+ /**
40
+ * Idle state exposed during server rendering and before the timer starts.
41
+ *
42
+ * @default false
43
+ */
44
+ readonly initialState?: boolean;
45
+
46
+ /**
47
+ * Clock used for `lastActive`.
48
+ *
49
+ * @default Date.now
50
+ */
51
+ readonly now?: () => number;
52
+
53
+ /**
54
+ * Owns the idle timer.
55
+ *
56
+ * @default globalThis timer functions
57
+ */
58
+ readonly scheduler?: TimeoutScheduler;
59
+
60
+ /**
61
+ * Reactive window capability for alternate runtimes and tests.
62
+ *
63
+ * @default globalThis.window when available
64
+ */
65
+ readonly host?: MaybeRefOrGetter<IdleHost | null | undefined>;
66
+ }
67
+
68
+ /** Reactive idle state returned by {@link useIdle}. */
69
+ export interface IdleControls {
70
+ /** Whether no activity happened within the timeout. */
71
+ readonly idle: Readonly<Ref<boolean>>;
72
+ /** Epoch milliseconds of the latest activity; `null` until tracking starts on the client. */
73
+ readonly lastActive: Readonly<Ref<number | null>>;
74
+ /** Record activity now and restart the timer. No-op until tracking starts on the client. */
75
+ readonly reset: () => void;
76
+ }
77
+
78
+ const defaultScheduler: TimeoutScheduler = {
79
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
80
+ clearTimeout: (handle) => {
81
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
82
+ },
83
+ };
84
+
85
+ /**
86
+ * Detect user inactivity.
87
+ *
88
+ * Any configured activity event resets a single timer; when it fires, `idle`
89
+ * becomes `true` until the next activity. No timer runs during server
90
+ * rendering (`idle` is `initialState`, `lastActive` is `null`), so the
91
+ * output is hydration-stable. Listeners and the timer are released with the
92
+ * owning reactive scope.
93
+ *
94
+ * @param timeout Inactivity window in milliseconds.
95
+ * @param options Activity events, clock, scheduler, and window capability.
96
+ * @default timeout 60000
97
+ * @default options {}
98
+ * @returns Reactive idle flag, last activity time, and a reset action.
99
+ */
100
+ export function useIdle(timeout = 60_000, options: UseIdleOptions = {}): IdleControls {
101
+ const {
102
+ events = DEFAULT_IDLE_EVENTS,
103
+ listenForVisibilityChange = true,
104
+ initialState = false,
105
+ now = Date.now,
106
+ scheduler = defaultScheduler,
107
+ } = options;
108
+ const idle = ref(initialState);
109
+ const lastActive = ref<number | null>(null);
110
+ let handle: unknown;
111
+ let hasTimer = false;
112
+ let tracking = false;
113
+ // Inside a component the host is read once it has mounted, so a hydrating
114
+ // client first renders the same fallback as the server. `hasInjectionContext`
115
+ // also detects Vapor components (unlike `getCurrentInstance`).
116
+ const mounted = shallowRef(!hasInjectionContext());
117
+ if (!mounted.value) {
118
+ onMounted(() => {
119
+ mounted.value = true;
120
+ });
121
+ }
122
+
123
+ const clear = (): void => {
124
+ if (!hasTimer) return;
125
+ scheduler.clearTimeout(handle);
126
+ hasTimer = false;
127
+ };
128
+ const reset = (): void => {
129
+ if (!tracking) return;
130
+ idle.value = false;
131
+ lastActive.value = now();
132
+ clear();
133
+ handle = scheduler.setTimeout(() => {
134
+ hasTimer = false;
135
+ idle.value = true;
136
+ }, timeout);
137
+ hasTimer = true;
138
+ };
139
+
140
+ const stop = watch(
141
+ () =>
142
+ !mounted.value
143
+ ? undefined
144
+ : options.host === undefined
145
+ ? browserIdleHost()
146
+ : toValue(options.host),
147
+ (host, _previous, onCleanup) => {
148
+ if (!host) return;
149
+ tracking = true;
150
+ const listenerOptions: AddEventListenerOptions = { passive: true };
151
+ for (const event of events) host.addEventListener(event, reset, listenerOptions);
152
+ const document = host.document;
153
+ const onVisibility = (): void => {
154
+ if (!document?.hidden) reset();
155
+ };
156
+ if (listenForVisibilityChange) {
157
+ document?.addEventListener("visibilitychange", onVisibility, listenerOptions);
158
+ }
159
+ reset();
160
+ onCleanup(() => {
161
+ tracking = false;
162
+ clear();
163
+ for (const event of events) host.removeEventListener(event, reset);
164
+ document?.removeEventListener("visibilitychange", onVisibility);
165
+ });
166
+ },
167
+ { immediate: true },
168
+ );
169
+ tryOnScopeDispose(() => stop.stop());
170
+
171
+ return { idle: readonly(idle), lastActive: readonly(lastActive), reset };
172
+ }
173
+
174
+ function browserIdleHost(): IdleHost | undefined {
175
+ return typeof window !== "undefined" ? window : undefined;
176
+ }
@@ -0,0 +1,135 @@
1
+ import { nextTick, readonly, ref, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref } from "vue";
3
+
4
+ import { useScroll } from "./scroll.ts";
5
+ import type { ScrollTargetValue, UseScrollOptions } from "./scroll.ts";
6
+ import { tryOnScopeDispose } from "./scope.ts";
7
+
8
+ /** Edge that triggers loading in {@link useInfiniteScroll}. */
9
+ export type InfiniteScrollDirection = "top" | "bottom" | "left" | "right";
10
+
11
+ /** Options for {@link useInfiniteScroll}. */
12
+ export interface UseInfiniteScrollOptions extends Omit<UseScrollOptions, "offset"> {
13
+ /**
14
+ * Distance in CSS pixels from the edge that triggers loading.
15
+ *
16
+ * @default 0
17
+ */
18
+ readonly distance?: number;
19
+
20
+ /**
21
+ * Edge that triggers loading.
22
+ *
23
+ * @default "bottom"
24
+ */
25
+ readonly direction?: InfiniteScrollDirection;
26
+
27
+ /**
28
+ * Return `false` to stop loading (for example once every page is loaded).
29
+ *
30
+ * @default () => true
31
+ */
32
+ readonly canLoadMore?: MaybeRefOrGetter<boolean>;
33
+ }
34
+
35
+ /** Reactive state returned by {@link useInfiniteScroll}. */
36
+ export interface InfiniteScrollControls {
37
+ /** Whether `onLoadMore` is running. */
38
+ readonly isLoading: Readonly<Ref<boolean>>;
39
+ /**
40
+ * Re-check the edge and load when it is still within `distance` (call after
41
+ * the list was replaced).
42
+ */
43
+ readonly reset: () => void;
44
+ }
45
+
46
+ /**
47
+ * Load more content when a scroll container reaches an edge.
48
+ *
49
+ * Built on `useScroll`: when the configured edge is within `distance`,
50
+ * `onLoadMore` runs; concurrent calls are prevented, and after each load the
51
+ * edge is re-measured so short pages keep loading until the container
52
+ * overflows or `canLoadMore` returns `false`. Loader errors propagate to the
53
+ * returned promise of the internal run but never leave `isLoading` stuck.
54
+ * No loading happens during server rendering.
55
+ *
56
+ * @param target Reactive scroll container (element, component, or window).
57
+ * @param onLoadMore Loader invoked at the edge.
58
+ * @param options Edge, distance, gating, and {@link useScroll} options.
59
+ * @default options {}
60
+ * @returns Loading flag and a manual re-check.
61
+ */
62
+ export function useInfiniteScroll(
63
+ target: MaybeRefOrGetter<ScrollTargetValue>,
64
+ onLoadMore: () => unknown,
65
+ options: UseInfiniteScrollOptions = {},
66
+ ): InfiniteScrollControls {
67
+ const { distance = 0, direction = "bottom", canLoadMore = true, ...scrollOptions } = options;
68
+ const isLoading = ref(false);
69
+ const scroll = useScroll(target, { ...scrollOptions, offset: { [direction]: distance } });
70
+ let disposed = false;
71
+
72
+ const check = async (): Promise<void> => {
73
+ if (disposed || isLoading.value || !toValue(canLoadMore)) return;
74
+ if (!scroll.arrivedState[direction] || !hasContainer(target)) return;
75
+ isLoading.value = true;
76
+ const before = contentSize(target);
77
+ try {
78
+ await onLoadMore();
79
+ } finally {
80
+ isLoading.value = false;
81
+ }
82
+ await nextTick();
83
+ if (disposed) return;
84
+ scroll.measure();
85
+ // Only keep filling while loads actually grow the content: a loader that
86
+ // adds nothing (or content that cannot be measured) would otherwise spin
87
+ // forever at the edge. The next edge change or `reset()` re-checks.
88
+ const after = contentSize(target);
89
+ if (after === undefined || after !== before) void check();
90
+ };
91
+
92
+ const stop = watch(
93
+ () => [scroll.arrivedState[direction], toValue(canLoadMore)] as const,
94
+ () => void check(),
95
+ { immediate: true },
96
+ );
97
+ tryOnScopeDispose(() => {
98
+ disposed = true;
99
+ stop.stop();
100
+ });
101
+
102
+ return {
103
+ isLoading: readonly(isLoading),
104
+ reset: () => {
105
+ scroll.measure();
106
+ void check();
107
+ },
108
+ };
109
+ }
110
+
111
+ function hasContainer(target: MaybeRefOrGetter<ScrollTargetValue>): boolean {
112
+ const value = toValue(target);
113
+ return value !== null && value !== undefined;
114
+ }
115
+
116
+ function contentSize(target: MaybeRefOrGetter<ScrollTargetValue>): string | undefined {
117
+ const value: unknown = toValue(target);
118
+ if (typeof value !== "object" || value === null) return undefined;
119
+ const element: unknown =
120
+ "scrollHeight" in value
121
+ ? value
122
+ : "documentElement" in value
123
+ ? value.documentElement
124
+ : "document" in value && typeof value.document === "object" && value.document !== null
125
+ ? Reflect.get(value.document, "documentElement")
126
+ : "$el" in value
127
+ ? value.$el
128
+ : undefined;
129
+ if (typeof element !== "object" || element === null) return undefined;
130
+ const height: unknown = Reflect.get(element, "scrollHeight");
131
+ const width: unknown = Reflect.get(element, "scrollWidth");
132
+ return typeof height === "number" && typeof width === "number"
133
+ ? `${String(height)}x${String(width)}`
134
+ : undefined;
135
+ }
@@ -0,0 +1,261 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { ComponentPublicInstance, MaybeRefOrGetter, Ref, WatchHandle } from "vue";
3
+
4
+ import { resolveElement, resolveElements } from "./element-target.ts";
5
+ import type { MaybeElementTarget, MaybeElementTargets } from "./element-target.ts";
6
+ import { tryOnScopeDispose } from "./scope.ts";
7
+
8
+ /** Runtime capability that supplies the `IntersectionObserver` constructor. */
9
+ export interface IntersectionObserverHost {
10
+ /** `IntersectionObserver` constructor, absent in unsupported runtimes. */
11
+ readonly IntersectionObserver?: new (
12
+ callback: IntersectionObserverCallback,
13
+ options?: IntersectionObserverInit,
14
+ ) => IntersectionObserver;
15
+ }
16
+
17
+ /**
18
+ * Intersection root: an element target, a document, or `null`/`undefined`
19
+ * for the top-level viewport.
20
+ */
21
+ export type IntersectionRoot = MaybeRefOrGetter<
22
+ Element | Document | ComponentPublicInstance | null | undefined
23
+ >;
24
+
25
+ /** Options for {@link useIntersectionObserver}. */
26
+ export interface UseIntersectionObserverOptions {
27
+ /**
28
+ * Ancestor (or document) whose box is used as the viewport.
29
+ *
30
+ * @default undefined (the top-level viewport)
31
+ */
32
+ readonly root?: IntersectionRoot;
33
+
34
+ /**
35
+ * Margin grown or shrunk around the root box, in CSS margin syntax.
36
+ *
37
+ * @default "0px"
38
+ */
39
+ readonly rootMargin?: MaybeRefOrGetter<string>;
40
+
41
+ /**
42
+ * Visible-ratio thresholds that trigger the callback.
43
+ *
44
+ * @default 0
45
+ */
46
+ readonly threshold?: MaybeRefOrGetter<number | readonly number[]>;
47
+
48
+ /**
49
+ * Start observing during composable creation. When `false`, call `resume`.
50
+ *
51
+ * @default true
52
+ */
53
+ readonly immediate?: boolean;
54
+
55
+ /**
56
+ * Reactive constructor capability for alternate runtimes and tests.
57
+ *
58
+ * @default globalThis when it provides `IntersectionObserver`
59
+ */
60
+ readonly host?: MaybeRefOrGetter<IntersectionObserverHost | null | undefined>;
61
+
62
+ /**
63
+ * Target resolution timing. `"post"` observes template refs after mount.
64
+ *
65
+ * @default "post"
66
+ */
67
+ readonly flush?: "pre" | "post" | "sync";
68
+ }
69
+
70
+ /** Controls returned by {@link useIntersectionObserver}. */
71
+ export interface IntersectionObserverControls {
72
+ /** Whether the host provides `IntersectionObserver`. `false` during server rendering. */
73
+ readonly isSupported: Readonly<Ref<boolean>>;
74
+
75
+ /** Whether observation is currently requested (not paused or stopped). */
76
+ readonly isActive: Readonly<Ref<boolean>>;
77
+
78
+ /** Disconnect the observer while keeping the ability to `resume`. */
79
+ readonly pause: () => void;
80
+
81
+ /** Reconnect after `pause` (or start when created with `immediate: false`). */
82
+ readonly resume: () => void;
83
+
84
+ /** Disconnect permanently. Later `resume` calls are ignored. Idempotent. */
85
+ readonly stop: () => void;
86
+ }
87
+
88
+ /**
89
+ * Observe the intersection of reactive elements with a root.
90
+ *
91
+ * One observer is created per combination of resolved targets, root,
92
+ * margin, and threshold; changing any of them disconnects the previous
93
+ * observer first. During server rendering `isSupported` is `false` and the
94
+ * callback never runs. The observer is disconnected when the owning scope
95
+ * stops.
96
+ *
97
+ * @param targets Reactive element target or list of targets.
98
+ * @param callback Native `IntersectionObserver` callback.
99
+ * @param options Root, margin, thresholds, capability, and timing.
100
+ * @default options {}
101
+ * @returns Support/activity flags and pause/resume/stop controls.
102
+ */
103
+ export function useIntersectionObserver(
104
+ targets: MaybeElementTargets,
105
+ callback: IntersectionObserverCallback,
106
+ options: UseIntersectionObserverOptions = {},
107
+ ): IntersectionObserverControls {
108
+ const isSupported = ref(false);
109
+ const isActive = ref(options.immediate ?? true);
110
+ let stopped = false;
111
+ let stopWatch: WatchHandle | undefined;
112
+
113
+ // Inside a component the host is read once it has mounted, so a hydrating
114
+ // client first renders the same fallback as the server. `hasInjectionContext`
115
+ // also detects Vapor components (unlike `getCurrentInstance`).
116
+ const mounted = shallowRef(!hasInjectionContext());
117
+ if (!mounted.value) {
118
+ onMounted(() => {
119
+ mounted.value = true;
120
+ });
121
+ }
122
+ const host = (): IntersectionObserverHost | null | undefined =>
123
+ !mounted.value
124
+ ? undefined
125
+ : options.host === undefined
126
+ ? browserIntersectionObserverHost()
127
+ : toValue(options.host);
128
+ isSupported.value = host()?.IntersectionObserver !== undefined;
129
+
130
+ const connect = (): void => {
131
+ stopWatch = watch(
132
+ () =>
133
+ [
134
+ host(),
135
+ resolveElements(targets),
136
+ resolveRoot(options.root),
137
+ toValue(options.rootMargin) ?? "0px",
138
+ toValue(options.threshold) ?? 0,
139
+ ] as const,
140
+ ([currentHost, elements, root, rootMargin, threshold], _previous, onCleanup) => {
141
+ const Observer = currentHost?.IntersectionObserver;
142
+ isSupported.value = Observer !== undefined;
143
+ if (!Observer || elements.length === 0) return;
144
+ const observer = new Observer(callback, {
145
+ root,
146
+ rootMargin,
147
+ threshold: typeof threshold === "number" ? threshold : [...threshold],
148
+ });
149
+ for (const element of elements) observer.observe(element);
150
+ onCleanup(() => observer.disconnect());
151
+ },
152
+ { immediate: true, flush: options.flush ?? "post" },
153
+ );
154
+ };
155
+
156
+ const pause = (): void => {
157
+ stopWatch?.stop();
158
+ stopWatch = undefined;
159
+ isActive.value = false;
160
+ };
161
+ const resume = (): void => {
162
+ if (stopped || stopWatch) return;
163
+ isActive.value = true;
164
+ connect();
165
+ };
166
+ const stop = (): void => {
167
+ stopped = true;
168
+ pause();
169
+ };
170
+
171
+ if (isActive.value) connect();
172
+ tryOnScopeDispose(stop);
173
+
174
+ return {
175
+ isSupported: readonly(isSupported),
176
+ isActive: readonly(isActive),
177
+ pause,
178
+ resume,
179
+ stop,
180
+ };
181
+ }
182
+
183
+ /** Options for {@link useElementVisibility}. */
184
+ export interface UseElementVisibilityOptions extends Omit<
185
+ UseIntersectionObserverOptions,
186
+ "immediate"
187
+ > {
188
+ /**
189
+ * Visibility exposed before the first observation and during server
190
+ * rendering. Keep it identical on server and client.
191
+ *
192
+ * @default false
193
+ */
194
+ readonly initialValue?: boolean;
195
+
196
+ /**
197
+ * Stop observing after the element becomes visible for the first time.
198
+ *
199
+ * @default false
200
+ */
201
+ readonly once?: boolean;
202
+ }
203
+
204
+ /** Reactive state returned by {@link useElementVisibility}. */
205
+ export interface ElementVisibilityControls {
206
+ /** Whether the element currently intersects the root. */
207
+ readonly isVisible: Readonly<Ref<boolean>>;
208
+
209
+ /** Whether the host provides `IntersectionObserver`. */
210
+ readonly isSupported: Readonly<Ref<boolean>>;
211
+
212
+ /** Stop observing. Idempotent. */
213
+ readonly stop: () => void;
214
+ }
215
+
216
+ /**
217
+ * Track whether an element is visible inside the viewport (or a root).
218
+ *
219
+ * Uses the latest intersection entry, so rapid enter/leave sequences settle
220
+ * on the final state. With `once`, the observer disconnects after the first
221
+ * visible entry and `isVisible` stays `true`.
222
+ *
223
+ * @param target Reactive element target.
224
+ * @param options Initial value, one-shot mode, and observer options.
225
+ * @default options {}
226
+ * @returns Reactive visibility plus controls.
227
+ */
228
+ export function useElementVisibility(
229
+ target: MaybeElementTarget,
230
+ options: UseElementVisibilityOptions = {},
231
+ ): ElementVisibilityControls {
232
+ const isVisible = ref(options.initialValue ?? false);
233
+ const controls = useIntersectionObserver(
234
+ target,
235
+ (entries) => {
236
+ let latest: IntersectionObserverEntry | undefined;
237
+ for (const entry of entries) {
238
+ if (!latest || entry.time >= latest.time) latest = entry;
239
+ }
240
+ if (!latest) return;
241
+ isVisible.value = latest.isIntersecting;
242
+ if (options.once && latest.isIntersecting) controls.stop();
243
+ },
244
+ options,
245
+ );
246
+ return { isVisible: readonly(isVisible), isSupported: controls.isSupported, stop: controls.stop };
247
+ }
248
+
249
+ function resolveRoot(root: IntersectionRoot | undefined): Element | Document | null {
250
+ if (root === undefined) return null;
251
+ const value = toValue(root);
252
+ return isDocumentNode(value) ? value : resolveElement(value);
253
+ }
254
+
255
+ function isDocumentNode(value: unknown): value is Document {
256
+ return typeof value === "object" && value !== null && "nodeType" in value && value.nodeType === 9;
257
+ }
258
+
259
+ function browserIntersectionObserverHost(): IntersectionObserverHost | undefined {
260
+ return typeof IntersectionObserver === "function" ? globalThis : undefined;
261
+ }