@vizejs/composable 0.426.3 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,148 @@
1
+ import { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
2
+
3
+ //#region src/use-web-midi.d.ts
4
+ /** Minimal `MIDIPort` read by {@link useWebMIDI}. */
5
+ interface MIDIPortLike extends EventTarget {
6
+ /** Stable port identifier. */
7
+ readonly id: string;
8
+ /** Port name. */
9
+ readonly name?: string | null;
10
+ /** Manufacturer name. */
11
+ readonly manufacturer?: string | null;
12
+ /** Device state. */
13
+ readonly state: string;
14
+ /** Connection state. */
15
+ readonly connection: string;
16
+ }
17
+ /** Minimal `MIDIOutput` used by {@link useWebMIDI}. */
18
+ interface MIDIOutputLike extends MIDIPortLike {
19
+ /** Send one or more MIDI messages, optionally scheduled at `timestamp`. */
20
+ send(data: number[], timestamp?: number): void;
21
+ }
22
+ /** Minimal `MIDIAccess` used by {@link useWebMIDI}. */
23
+ interface MIDIAccessLike extends EventTarget {
24
+ /** Available inputs. */
25
+ readonly inputs: {
26
+ values(): Iterable<MIDIPortLike>;
27
+ };
28
+ /** Available outputs. */
29
+ readonly outputs: {
30
+ values(): Iterable<MIDIOutputLike>;
31
+ };
32
+ }
33
+ /** Access request flags of `navigator.requestMIDIAccess`. */
34
+ interface MIDIRequestFlags {
35
+ /** Request system-exclusive message access. */
36
+ readonly sysex?: boolean;
37
+ /** Include software synthesizers. */
38
+ readonly software?: boolean;
39
+ }
40
+ /** Navigator-like capability used by {@link useWebMIDI}. */
41
+ interface MIDIHost {
42
+ /** Request MIDI access. */
43
+ requestMIDIAccess(options?: MIDIRequestFlags): Promise<MIDIAccessLike>;
44
+ }
45
+ /** Plain description of one MIDI port. */
46
+ interface MIDIPortInfo {
47
+ /** Stable port identifier. */
48
+ readonly id: string;
49
+ /** Port name (empty when unknown). */
50
+ readonly name: string;
51
+ /** Manufacturer (empty when unknown). */
52
+ readonly manufacturer: string;
53
+ /** Device state, e.g. `"connected"` or `"disconnected"`. */
54
+ readonly state: string;
55
+ /** Connection state, e.g. `"open"`, `"closed"` or `"pending"`. */
56
+ readonly connection: string;
57
+ }
58
+ /** A message received on an input port. */
59
+ interface MIDIInputMessage {
60
+ /** Raw message bytes. */
61
+ readonly data: Uint8Array;
62
+ /** Event timestamp in milliseconds. */
63
+ readonly timeStamp: number;
64
+ /** Identifier of the receiving input. */
65
+ readonly inputId: string;
66
+ }
67
+ /** Lifecycle of the access request. */
68
+ type MIDIAccessStatus = "idle" | "pending" | "granted" | "denied";
69
+ /** Options for {@link useWebMIDI}. */
70
+ interface UseWebMIDIOptions {
71
+ /**
72
+ * Navigator-like MIDI capability.
73
+ *
74
+ * @default window.navigator when `requestMIDIAccess` exists
75
+ */
76
+ readonly host?: MaybeRefOrGetter<MIDIHost | null | undefined>;
77
+ /**
78
+ * Request system-exclusive access.
79
+ *
80
+ * @default false
81
+ */
82
+ readonly sysex?: boolean;
83
+ /**
84
+ * Include software synthesizers.
85
+ *
86
+ * @default false
87
+ */
88
+ readonly software?: boolean;
89
+ /**
90
+ * Receives every input message. When set, `midimessage` listeners are
91
+ * attached to all inputs (which implicitly opens them).
92
+ *
93
+ * @default undefined
94
+ */
95
+ readonly onMessage?: (message: MIDIInputMessage) => void;
96
+ }
97
+ /** Reactive state and actions returned by {@link useWebMIDI}. */
98
+ interface WebMIDIControls {
99
+ /** Whether Web MIDI is available. */
100
+ readonly supported: ComputedRef<boolean>;
101
+ /** Access request status. */
102
+ readonly status: Readonly<Ref<MIDIAccessStatus>>;
103
+ /** Input ports, refreshed on `statechange`. */
104
+ readonly inputs: Readonly<ShallowRef<readonly MIDIPortInfo[]>>;
105
+ /** Output ports, refreshed on `statechange`. */
106
+ readonly outputs: Readonly<ShallowRef<readonly MIDIPortInfo[]>>;
107
+ /** Most recent request or send failure. */
108
+ readonly error: Readonly<ShallowRef<unknown>>;
109
+ /**
110
+ * Request MIDI access (may prompt the user).
111
+ *
112
+ * @returns Whether access was granted.
113
+ */
114
+ readonly request: () => Promise<boolean>;
115
+ /**
116
+ * Send bytes to an output.
117
+ *
118
+ * @returns Whether the output exists and accepted the message.
119
+ */
120
+ readonly send: (outputId: string, data: Uint8Array | readonly number[], timestamp?: number) => boolean;
121
+ /** Remove every listener and forget the access object. Idempotent. */
122
+ readonly stop: () => void;
123
+ }
124
+ /**
125
+ * Access MIDI devices with the Web MIDI API.
126
+ *
127
+ * Nothing is requested until `request()` is called. Once granted, `inputs`
128
+ * and `outputs` follow `statechange` events, and `onMessage` receives
129
+ * messages from every input. Failures land in `error`. Listeners are removed
130
+ * when the owning reactive scope stops; outside a scope call `stop()`.
131
+ *
132
+ * Server rendering: `supported` is false, `status` stays `"idle"` and no
133
+ * access is requested.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * const midi = useWebMIDI({ onMessage: ({ data }) => console.log(data) });
138
+ * await midi.request();
139
+ * midi.send(midi.outputs.value[0]!.id, [0x90, 60, 127]);
140
+ * ```
141
+ *
142
+ * @param options Host, access flags, and message callback.
143
+ * @default options {}
144
+ * @returns MIDI state and actions.
145
+ */
146
+ declare function useWebMIDI(options?: UseWebMIDIOptions): WebMIDIControls;
147
+ //#endregion
148
+ export { MIDIAccessLike, MIDIAccessStatus, MIDIHost, MIDIInputMessage, MIDIOutputLike, MIDIPortInfo, MIDIPortLike, MIDIRequestFlags, UseWebMIDIOptions, WebMIDIControls, useWebMIDI };
@@ -0,0 +1,140 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { computed, hasInjectionContext, readonly, ref, shallowReadonly, shallowRef, toValue, watchPostEffect } from "vue";
3
+ //#region src/use-web-midi.ts
4
+ function browserMIDIHost() {
5
+ if (typeof window === "undefined") return void 0;
6
+ const { navigator } = window;
7
+ return typeof navigator.requestMIDIAccess === "function" ? navigator : void 0;
8
+ }
9
+ function describe(port) {
10
+ return {
11
+ id: port.id,
12
+ name: port.name ?? "",
13
+ manufacturer: port.manufacturer ?? "",
14
+ state: port.state,
15
+ connection: port.connection
16
+ };
17
+ }
18
+ function hasMessageData(event) {
19
+ return "data" in event;
20
+ }
21
+ /**
22
+ * Access MIDI devices with the Web MIDI API.
23
+ *
24
+ * Nothing is requested until `request()` is called. Once granted, `inputs`
25
+ * and `outputs` follow `statechange` events, and `onMessage` receives
26
+ * messages from every input. Failures land in `error`. Listeners are removed
27
+ * when the owning reactive scope stops; outside a scope call `stop()`.
28
+ *
29
+ * Server rendering: `supported` is false, `status` stays `"idle"` and no
30
+ * access is requested.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const midi = useWebMIDI({ onMessage: ({ data }) => console.log(data) });
35
+ * await midi.request();
36
+ * midi.send(midi.outputs.value[0]!.id, [0x90, 60, 127]);
37
+ * ```
38
+ *
39
+ * @param options Host, access flags, and message callback.
40
+ * @default options {}
41
+ * @returns MIDI state and actions.
42
+ */
43
+ function useWebMIDI(options = {}) {
44
+ const status = ref("idle");
45
+ const inputs = shallowRef([]);
46
+ const outputs = shallowRef([]);
47
+ const error = shallowRef(void 0);
48
+ const listening = /* @__PURE__ */ new Map();
49
+ let access;
50
+ let generation = 0;
51
+ const hydrated = shallowRef(!hasInjectionContext());
52
+ if (!hydrated.value) watchPostEffect(() => {
53
+ hydrated.value = true;
54
+ });
55
+ const resolveHost = () => !hydrated.value ? void 0 : options.host === void 0 ? browserMIDIHost() : toValue(options.host) ?? void 0;
56
+ const listen = (input) => {
57
+ const onMessage = options.onMessage;
58
+ if (!onMessage || listening.has(input)) return;
59
+ const listener = (event) => {
60
+ if (!hasMessageData(event) || !event.data) return;
61
+ onMessage({
62
+ data: event.data,
63
+ timeStamp: event.timeStamp,
64
+ inputId: input.id
65
+ });
66
+ };
67
+ listening.set(input, listener);
68
+ input.addEventListener("midimessage", listener);
69
+ };
70
+ const unlisten = () => {
71
+ for (const [input, listener] of listening) input.removeEventListener("midimessage", listener);
72
+ listening.clear();
73
+ };
74
+ const refresh = () => {
75
+ if (!access) return;
76
+ const inputPorts = [...access.inputs.values()];
77
+ for (const input of inputPorts) listen(input);
78
+ inputs.value = inputPorts.map(describe);
79
+ outputs.value = [...access.outputs.values()].map(describe);
80
+ };
81
+ const stop = () => {
82
+ generation += 1;
83
+ unlisten();
84
+ access?.removeEventListener("statechange", refresh);
85
+ access = void 0;
86
+ inputs.value = [];
87
+ outputs.value = [];
88
+ if (status.value === "pending") status.value = "idle";
89
+ };
90
+ const request = async () => {
91
+ const host = resolveHost();
92
+ if (!host) return false;
93
+ stop();
94
+ const current = generation;
95
+ status.value = "pending";
96
+ try {
97
+ const next = await host.requestMIDIAccess({
98
+ sysex: options.sysex ?? false,
99
+ software: options.software ?? false
100
+ });
101
+ if (current !== generation) return false;
102
+ access = next;
103
+ next.addEventListener("statechange", refresh);
104
+ refresh();
105
+ status.value = "granted";
106
+ error.value = void 0;
107
+ return true;
108
+ } catch (cause) {
109
+ if (current !== generation) return false;
110
+ status.value = "denied";
111
+ error.value = cause;
112
+ return false;
113
+ }
114
+ };
115
+ const send = (outputId, data, timestamp) => {
116
+ const output = access ? [...access.outputs.values()].find((port) => port.id === outputId) : void 0;
117
+ if (!output) return false;
118
+ try {
119
+ if (timestamp === void 0) output.send(Array.from(data));
120
+ else output.send(Array.from(data), timestamp);
121
+ return true;
122
+ } catch (cause) {
123
+ error.value = cause;
124
+ return false;
125
+ }
126
+ };
127
+ tryOnScopeDispose(stop);
128
+ return {
129
+ supported: computed(() => resolveHost() !== void 0),
130
+ status: readonly(status),
131
+ inputs: shallowReadonly(inputs),
132
+ outputs: shallowReadonly(outputs),
133
+ error: readonly(error),
134
+ request,
135
+ send,
136
+ stop
137
+ };
138
+ }
139
+ //#endregion
140
+ export { useWebMIDI };
@@ -0,0 +1,142 @@
1
+ import { PerformanceObserverHost } from "./use-performance-observer.mjs";
2
+ import { ComputedRef, MaybeRef, MaybeRefOrGetter, ShallowRef } from "vue";
3
+
4
+ //#region src/use-web-vitals.d.ts
5
+ /** Core Web Vitals and supporting metrics computed by {@link useWebVitals}. */
6
+ type WebVitalName = "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
7
+ /** Rating bucket of a metric value. */
8
+ type WebVitalRating = "good" | "needs-improvement" | "poor";
9
+ /**
10
+ * Standard `[good, poor]` thresholds: values up to the first bound are
11
+ * "good", values above the second are "poor". Times are milliseconds; CLS is
12
+ * unitless.
13
+ */
14
+ declare const WEB_VITALS_THRESHOLDS: {
15
+ readonly LCP: readonly [2500, 4000];
16
+ readonly CLS: readonly [0.1, 0.25];
17
+ readonly INP: readonly [200, 500];
18
+ readonly FCP: readonly [1800, 3000];
19
+ readonly TTFB: readonly [800, 1800];
20
+ };
21
+ /**
22
+ * Rate a metric value with {@link WEB_VITALS_THRESHOLDS}.
23
+ *
24
+ * @param name Metric name.
25
+ * @param value Metric value (milliseconds, or the unitless CLS score).
26
+ * @returns The rating bucket.
27
+ */
28
+ declare function rateMetric(name: WebVitalName, value: number): WebVitalRating;
29
+ /** Snapshot of one metric. */
30
+ interface WebVitalMetric {
31
+ /** Metric name. */
32
+ readonly name: WebVitalName;
33
+ /** Current value (milliseconds, or the unitless CLS score). */
34
+ readonly value: number;
35
+ /** Rating of `value`. */
36
+ readonly rating: WebVitalRating;
37
+ /** Change since the value last reported through `onMetric` (the full value before that). */
38
+ readonly delta: number;
39
+ /** Number of performance entries that make up `value`. */
40
+ readonly entries: number;
41
+ /** Identifier stable for this metric during the page load. */
42
+ readonly id?: string;
43
+ }
44
+ /** Metrics measured so far; a metric is absent until it has a value. */
45
+ type WebVitalsRecord = Readonly<Partial<Record<WebVitalName, WebVitalMetric>>>;
46
+ /** Document events used by {@link useWebVitals}. */
47
+ type WebVitalsDocumentEvent = "visibilitychange" | "keydown" | "click";
48
+ /** Minimal document consumed by {@link useWebVitals}. */
49
+ interface WebVitalsDocumentHost {
50
+ /** Current visibility (`"visible"` or `"hidden"`). */
51
+ readonly visibilityState: string;
52
+ /** Subscribe to a document event. */
53
+ addEventListener(type: WebVitalsDocumentEvent, listener: (event: {
54
+ readonly timeStamp: number;
55
+ }) => void, options?: {
56
+ readonly capture?: boolean;
57
+ }): void;
58
+ /** Unsubscribe from a document event. */
59
+ removeEventListener(type: WebVitalsDocumentEvent, listener: (event: {
60
+ readonly timeStamp: number;
61
+ }) => void, options?: {
62
+ readonly capture?: boolean;
63
+ }): void;
64
+ }
65
+ /** Options for {@link useWebVitals}. */
66
+ interface UseWebVitalsOptions {
67
+ /**
68
+ * `PerformanceObserver` constructor for alternate runtimes and tests.
69
+ *
70
+ * @default window.PerformanceObserver when it exists
71
+ */
72
+ readonly PerformanceObserver?: MaybeRef<PerformanceObserverHost | null | undefined>;
73
+ /**
74
+ * Document whose visibility finalizes metrics and whose first input stops LCP.
75
+ *
76
+ * @default window.document when available
77
+ */
78
+ readonly document?: MaybeRefOrGetter<WebVitalsDocumentHost | null | undefined>;
79
+ /**
80
+ * Report every change through `onMetric` instead of only final values.
81
+ *
82
+ * @default false
83
+ */
84
+ readonly reportAllChanges?: boolean;
85
+ /**
86
+ * Minimum Event Timing duration considered for INP, in milliseconds.
87
+ *
88
+ * @default 40
89
+ */
90
+ readonly durationThreshold?: number;
91
+ }
92
+ /** Reactive state and actions returned by {@link useWebVitals}. */
93
+ interface WebVitalsControls {
94
+ /** Whether at least one metric can be observed. */
95
+ readonly supported: ComputedRef<boolean>;
96
+ /** Metrics measured so far, replaced on each change. */
97
+ readonly metrics: Readonly<ShallowRef<WebVitalsRecord>>;
98
+ /**
99
+ * Subscribe to reported metrics. FCP and TTFB are reported once measured;
100
+ * LCP once finalized (first input or hidden page); CLS and INP whenever
101
+ * the page becomes hidden with a changed value. With `reportAllChanges`,
102
+ * every change is reported.
103
+ *
104
+ * @param listener Receives each reported metric.
105
+ * @returns Removes the listener.
106
+ */
107
+ readonly onMetric: (listener: (metric: WebVitalMetric) => void) => () => void;
108
+ /** Stop every observer and listener. Repeated calls are safe. */
109
+ readonly stop: () => void;
110
+ }
111
+ /**
112
+ * Measure LCP, CLS, INP, FCP and TTFB locally, without dependencies.
113
+ *
114
+ * - LCP: last candidate before the first input or hidden page.
115
+ * - CLS: largest session window (shifts < 1 s apart, window ≤ 5 s),
116
+ * ignoring shifts after recent input.
117
+ * - INP: per-interaction maximum duration; the highest after ignoring one
118
+ * per 50 interactions (a p98 approximation over the 10 longest). The
119
+ * interaction count only includes interactions above `durationThreshold`.
120
+ * - FCP: `first-contentful-paint` before the page was first hidden.
121
+ * - TTFB: navigation `responseStart - activationStart`, clamped at 0.
122
+ *
123
+ * Values are not adjusted for prerender activation except TTFB. Observers
124
+ * and listeners are released when the owning reactive scope stops; outside
125
+ * a scope the caller owns `stop()`.
126
+ *
127
+ * Server rendering: nothing is observed, `metrics` is `{}` and `supported`
128
+ * is false.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * const { metrics, onMetric } = useWebVitals();
133
+ * onMetric((metric) => navigator.sendBeacon("/vitals", JSON.stringify(metric)));
134
+ * ```
135
+ *
136
+ * @param options Hosts and reporting policy.
137
+ * @default options {}
138
+ * @returns Reactive metrics and a report hook.
139
+ */
140
+ declare function useWebVitals(options?: UseWebVitalsOptions): WebVitalsControls;
141
+ //#endregion
142
+ export { UseWebVitalsOptions, WEB_VITALS_THRESHOLDS, WebVitalMetric, WebVitalName, WebVitalRating, WebVitalsControls, WebVitalsDocumentEvent, WebVitalsDocumentHost, WebVitalsRecord, rateMetric, useWebVitals };
@@ -0,0 +1,248 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { usePerformanceObserver } from "./use-performance-observer.mjs";
3
+ import { computed, hasInjectionContext, readonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
4
+ //#region src/use-web-vitals.ts
5
+ /**
6
+ * Standard `[good, poor]` thresholds: values up to the first bound are
7
+ * "good", values above the second are "poor". Times are milliseconds; CLS is
8
+ * unitless.
9
+ */
10
+ const WEB_VITALS_THRESHOLDS = {
11
+ LCP: [2500, 4e3],
12
+ CLS: [.1, .25],
13
+ INP: [200, 500],
14
+ FCP: [1800, 3e3],
15
+ TTFB: [800, 1800]
16
+ };
17
+ /**
18
+ * Rate a metric value with {@link WEB_VITALS_THRESHOLDS}.
19
+ *
20
+ * @param name Metric name.
21
+ * @param value Metric value (milliseconds, or the unitless CLS score).
22
+ * @returns The rating bucket.
23
+ */
24
+ function rateMetric(name, value) {
25
+ if (Number.isNaN(value)) throw new RangeError(`[VIZE_COMPOSE_WEB_VITALS_INVALID_VALUE] ${name} value must be a number`);
26
+ const [good, poor] = WEB_VITALS_THRESHOLDS[name];
27
+ if (value > poor) return "poor";
28
+ return value > good ? "needs-improvement" : "good";
29
+ }
30
+ const MAX_INTERACTIONS = 10;
31
+ function browserDocument() {
32
+ return typeof window === "undefined" ? void 0 : window.document;
33
+ }
34
+ /**
35
+ * Measure LCP, CLS, INP, FCP and TTFB locally, without dependencies.
36
+ *
37
+ * - LCP: last candidate before the first input or hidden page.
38
+ * - CLS: largest session window (shifts < 1 s apart, window ≤ 5 s),
39
+ * ignoring shifts after recent input.
40
+ * - INP: per-interaction maximum duration; the highest after ignoring one
41
+ * per 50 interactions (a p98 approximation over the 10 longest). The
42
+ * interaction count only includes interactions above `durationThreshold`.
43
+ * - FCP: `first-contentful-paint` before the page was first hidden.
44
+ * - TTFB: navigation `responseStart - activationStart`, clamped at 0.
45
+ *
46
+ * Values are not adjusted for prerender activation except TTFB. Observers
47
+ * and listeners are released when the owning reactive scope stops; outside
48
+ * a scope the caller owns `stop()`.
49
+ *
50
+ * Server rendering: nothing is observed, `metrics` is `{}` and `supported`
51
+ * is false.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const { metrics, onMetric } = useWebVitals();
56
+ * onMetric((metric) => navigator.sendBeacon("/vitals", JSON.stringify(metric)));
57
+ * ```
58
+ *
59
+ * @param options Hosts and reporting policy.
60
+ * @default options {}
61
+ * @returns Reactive metrics and a report hook.
62
+ */
63
+ function useWebVitals(options = {}) {
64
+ const metrics = shallowRef({});
65
+ const reported = /* @__PURE__ */ new Map();
66
+ const listeners = /* @__PURE__ */ new Set();
67
+ const reportAllChanges = options.reportAllChanges ?? false;
68
+ const observerOptions = options.PerformanceObserver === void 0 ? { buffered: true } : {
69
+ buffered: true,
70
+ PerformanceObserver: options.PerformanceObserver
71
+ };
72
+ let pageId;
73
+ const hydrated = shallowRef(!hasInjectionContext());
74
+ if (!hydrated.value) watchPostEffect(() => {
75
+ hydrated.value = true;
76
+ });
77
+ const resolveDocument = () => !hydrated.value ? void 0 : options.document === void 0 ? browserDocument() : toValue(options.document) ?? void 0;
78
+ const report = (name) => {
79
+ const metric = metrics.value[name];
80
+ if (!metric || reported.get(name) === metric.value) return;
81
+ reported.set(name, metric.value);
82
+ for (const listener of listeners) listener(metric);
83
+ };
84
+ const set = (name, value, entries) => {
85
+ pageId ??= `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
86
+ const metric = {
87
+ name,
88
+ value,
89
+ rating: rateMetric(name, value),
90
+ delta: value - (reported.get(name) ?? 0),
91
+ entries,
92
+ id: `${name}-${pageId}`
93
+ };
94
+ metrics.value = {
95
+ ...metrics.value,
96
+ [name]: metric
97
+ };
98
+ if (reportAllChanges) report(name);
99
+ };
100
+ let firstHiddenTime = resolveDocument()?.visibilityState === "hidden" ? 0 : Infinity;
101
+ let lcpFinal = false;
102
+ const lcp = usePerformanceObserver("largest-contentful-paint", (entries) => {
103
+ if (lcpFinal) return;
104
+ const last = entries.filter((entry) => entry.startTime < firstHiddenTime).at(-1);
105
+ if (last) set("LCP", Math.max(last.startTime, 0), 1);
106
+ }, observerOptions);
107
+ let sessionValue = 0;
108
+ let session = [];
109
+ const handleShifts = (entries) => {
110
+ for (const entry of entries) {
111
+ if (entry.hadRecentInput) continue;
112
+ const first = session[0];
113
+ const last = session.at(-1);
114
+ if (first && last && entry.startTime - last.startTime < 1e3 && entry.startTime - first.startTime < 5e3) {
115
+ sessionValue += entry.value;
116
+ session.push(entry);
117
+ } else {
118
+ sessionValue = entry.value;
119
+ session = [entry];
120
+ }
121
+ if (sessionValue > (metrics.value.CLS?.value ?? 0)) set("CLS", sessionValue, session.length);
122
+ }
123
+ };
124
+ const cls = usePerformanceObserver("layout-shift", handleShifts, observerOptions);
125
+ const longest = [];
126
+ let interactionCount = 0;
127
+ let previousInteractionId = 0;
128
+ const handleEvents = (entries) => {
129
+ let changed = false;
130
+ for (const entry of entries) {
131
+ const id = entry.interactionId ?? 0;
132
+ if (id === 0) continue;
133
+ const existing = longest.find((interaction) => interaction.id === id);
134
+ if (existing) {
135
+ existing.entries += 1;
136
+ existing.duration = Math.max(existing.duration, entry.duration);
137
+ } else {
138
+ if (id !== previousInteractionId) interactionCount += 1;
139
+ longest.push({
140
+ id,
141
+ duration: entry.duration,
142
+ entries: 1
143
+ });
144
+ }
145
+ previousInteractionId = id;
146
+ changed = true;
147
+ }
148
+ if (!changed) return;
149
+ longest.sort((left, right) => right.duration - left.duration);
150
+ longest.splice(MAX_INTERACTIONS);
151
+ const candidate = longest[Math.min(longest.length - 1, Math.floor(interactionCount / 50))] ?? longest[0];
152
+ if (candidate) set("INP", candidate.duration, candidate.entries);
153
+ };
154
+ const inp = usePerformanceObserver(["event", "first-input"], handleEvents, {
155
+ ...observerOptions,
156
+ durationThreshold: options.durationThreshold ?? 40
157
+ });
158
+ const fcp = usePerformanceObserver("paint", (entries) => {
159
+ const entry = entries.find((paint) => paint.name === "first-contentful-paint" && paint.startTime < firstHiddenTime);
160
+ if (!entry) return;
161
+ fcp.stop();
162
+ set("FCP", Math.max(entry.startTime, 0), 1);
163
+ report("FCP");
164
+ }, observerOptions);
165
+ const ttfb = usePerformanceObserver("navigation", (entries) => {
166
+ const entry = entries[0];
167
+ if (!entry) return;
168
+ ttfb.stop();
169
+ set("TTFB", Math.max(entry.responseStart - (entry.activationStart ?? 0), 0), 1);
170
+ report("TTFB");
171
+ }, observerOptions);
172
+ const finalizeLcp = () => {
173
+ if (lcpFinal) return;
174
+ const last = lcp.takeRecords().filter((entry) => entry.startTime < firstHiddenTime).at(-1);
175
+ if (last) set("LCP", Math.max(last.startTime, 0), 1);
176
+ lcpFinal = true;
177
+ lcp.stop();
178
+ report("LCP");
179
+ };
180
+ const onHidden = (timeStamp) => {
181
+ firstHiddenTime = Math.min(firstHiddenTime, timeStamp);
182
+ finalizeLcp();
183
+ handleShifts(cls.takeRecords());
184
+ handleEvents(inp.takeRecords());
185
+ if (!metrics.value.CLS && cls.supported.value) set("CLS", 0, 0);
186
+ report("CLS");
187
+ report("INP");
188
+ };
189
+ const stopDocument = watch(resolveDocument, (document, _previous, onCleanup) => {
190
+ if (!document) return;
191
+ const onVisibility = (event) => {
192
+ if (document.visibilityState === "hidden") onHidden(event.timeStamp);
193
+ };
194
+ const onInput = () => {
195
+ finalizeLcp();
196
+ removeInput();
197
+ };
198
+ const removeInput = () => {
199
+ document.removeEventListener("keydown", onInput, { capture: true });
200
+ document.removeEventListener("click", onInput, { capture: true });
201
+ };
202
+ document.addEventListener("visibilitychange", onVisibility);
203
+ if (!lcpFinal) {
204
+ document.addEventListener("keydown", onInput, { capture: true });
205
+ document.addEventListener("click", onInput, { capture: true });
206
+ }
207
+ onCleanup(() => {
208
+ document.removeEventListener("visibilitychange", onVisibility);
209
+ removeInput();
210
+ });
211
+ }, {
212
+ immediate: true,
213
+ flush: "sync"
214
+ });
215
+ const stop = () => {
216
+ stopDocument();
217
+ for (const observer of [
218
+ lcp,
219
+ cls,
220
+ inp,
221
+ fcp,
222
+ ttfb
223
+ ]) observer.stop();
224
+ };
225
+ tryOnScopeDispose(() => {
226
+ stop();
227
+ listeners.clear();
228
+ });
229
+ return {
230
+ supported: computed(() => hydrated.value && [
231
+ lcp,
232
+ cls,
233
+ inp,
234
+ fcp,
235
+ ttfb
236
+ ].some((observer) => observer.supported.value)),
237
+ metrics: readonly(metrics),
238
+ onMetric: (listener) => {
239
+ listeners.add(listener);
240
+ return () => {
241
+ listeners.delete(listener);
242
+ };
243
+ },
244
+ stop
245
+ };
246
+ }
247
+ //#endregion
248
+ export { WEB_VITALS_THRESHOLDS, rateMetric, useWebVitals };