@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.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, WatchHandle } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Options for {@link useEventListener}. */
|
|
7
|
+
export interface UseEventListenerOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Invoke the listener during the capture phase.
|
|
10
|
+
*
|
|
11
|
+
* @default false
|
|
12
|
+
*/
|
|
13
|
+
readonly capture?: boolean;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Stop listening after the first event.
|
|
17
|
+
*
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
readonly once?: boolean;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Declare that the listener does not cancel the event's default action.
|
|
24
|
+
*
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
readonly passive?: boolean;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Stop listening when this signal is aborted. An already-aborted signal
|
|
31
|
+
* prevents listening from ever starting.
|
|
32
|
+
*
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
readonly signal?: AbortSignal;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Start listening during composable creation.
|
|
39
|
+
*
|
|
40
|
+
* @default true
|
|
41
|
+
*/
|
|
42
|
+
readonly immediate?: boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Reactive target update timing.
|
|
46
|
+
*
|
|
47
|
+
* @default "pre"
|
|
48
|
+
*/
|
|
49
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Reactive controls returned by {@link useEventListener}. */
|
|
53
|
+
export interface EventListenerControls {
|
|
54
|
+
/** Whether a concrete target currently owns the listener. */
|
|
55
|
+
readonly isListening: Readonly<Ref<boolean>>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Begin listening.
|
|
59
|
+
*
|
|
60
|
+
* @returns Whether a new reactive watcher was started. `false` while the
|
|
61
|
+
* watcher is already active (including a null-target watcher with no
|
|
62
|
+
* listener attached), after the abort signal has fired, and after the
|
|
63
|
+
* owning reactive scope has been disposed.
|
|
64
|
+
*/
|
|
65
|
+
readonly start: () => boolean;
|
|
66
|
+
|
|
67
|
+
/** Stop listening. Repeated calls are safe. */
|
|
68
|
+
readonly stop: () => void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Attach an event listener to a reactive target and clean it up with the
|
|
73
|
+
* current reactive scope. Missing targets are valid during server rendering:
|
|
74
|
+
* a `null`/`undefined` target keeps the listener detached until a concrete
|
|
75
|
+
* target appears, so no browser globals are required.
|
|
76
|
+
*
|
|
77
|
+
* The listener is re-attached whenever the reactive target changes and is
|
|
78
|
+
* removed when the owning reactive scope stops, when
|
|
79
|
+
* {@link EventListenerControls.stop} is called, or when the abort signal
|
|
80
|
+
* fires. Outside an active scope, teardown ownership stays with the caller,
|
|
81
|
+
* who must call `stop` explicitly. Errors thrown by a custom target's
|
|
82
|
+
* add/remove methods propagate to the active watcher run.
|
|
83
|
+
*
|
|
84
|
+
* @param target Reactive event target.
|
|
85
|
+
* @param event Event name.
|
|
86
|
+
* @param listener Typed event listener.
|
|
87
|
+
* @param options Listener lifecycle and scheduling options.
|
|
88
|
+
* @default options {}
|
|
89
|
+
* @returns Controls to observe and change the listening state.
|
|
90
|
+
*/
|
|
91
|
+
export function useEventListener<Key extends keyof WindowEventMap>(
|
|
92
|
+
target: MaybeRefOrGetter<Window | null | undefined>,
|
|
93
|
+
event: Key,
|
|
94
|
+
listener: (event: WindowEventMap[Key]) => void,
|
|
95
|
+
options?: UseEventListenerOptions,
|
|
96
|
+
): EventListenerControls;
|
|
97
|
+
export function useEventListener<Key extends keyof DocumentEventMap>(
|
|
98
|
+
target: MaybeRefOrGetter<Document | null | undefined>,
|
|
99
|
+
event: Key,
|
|
100
|
+
listener: (event: DocumentEventMap[Key]) => void,
|
|
101
|
+
options?: UseEventListenerOptions,
|
|
102
|
+
): EventListenerControls;
|
|
103
|
+
export function useEventListener<Key extends keyof HTMLElementEventMap>(
|
|
104
|
+
target: MaybeRefOrGetter<HTMLElement | null | undefined>,
|
|
105
|
+
event: Key,
|
|
106
|
+
listener: (event: HTMLElementEventMap[Key]) => void,
|
|
107
|
+
options?: UseEventListenerOptions,
|
|
108
|
+
): EventListenerControls;
|
|
109
|
+
export function useEventListener(
|
|
110
|
+
target: MaybeRefOrGetter<EventTarget | null | undefined>,
|
|
111
|
+
event: string,
|
|
112
|
+
listener: EventListener,
|
|
113
|
+
options?: UseEventListenerOptions,
|
|
114
|
+
): EventListenerControls;
|
|
115
|
+
export function useEventListener(
|
|
116
|
+
target: MaybeRefOrGetter<EventTarget | null | undefined>,
|
|
117
|
+
event: string,
|
|
118
|
+
listener: EventListener,
|
|
119
|
+
options: UseEventListenerOptions = {},
|
|
120
|
+
): EventListenerControls {
|
|
121
|
+
const {
|
|
122
|
+
capture = false,
|
|
123
|
+
once = false,
|
|
124
|
+
passive = false,
|
|
125
|
+
signal,
|
|
126
|
+
immediate = true,
|
|
127
|
+
flush = "pre",
|
|
128
|
+
} = options;
|
|
129
|
+
const isListening = ref(false);
|
|
130
|
+
const eventOptions: AddEventListenerOptions = {
|
|
131
|
+
capture,
|
|
132
|
+
passive,
|
|
133
|
+
...(signal ? { signal } : {}),
|
|
134
|
+
};
|
|
135
|
+
let disposed = false;
|
|
136
|
+
// Inside a component the target is attached once it has mounted, so a hydrating
|
|
137
|
+
// client renders `isListening: false` exactly like the server. `hasInjectionContext`
|
|
138
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
139
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
140
|
+
if (!mounted.value) {
|
|
141
|
+
onMounted(() => {
|
|
142
|
+
mounted.value = true;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
let stopWatch: WatchHandle | undefined;
|
|
146
|
+
|
|
147
|
+
const stop = (): void => {
|
|
148
|
+
stopWatch?.stop();
|
|
149
|
+
stopWatch = undefined;
|
|
150
|
+
isListening.value = false;
|
|
151
|
+
};
|
|
152
|
+
const start = (): boolean => {
|
|
153
|
+
if (disposed || stopWatch || signal?.aborted) return false;
|
|
154
|
+
|
|
155
|
+
stopWatch = watch(
|
|
156
|
+
() => (mounted.value ? toValue(target) : null),
|
|
157
|
+
(next, _previous, onCleanup) => {
|
|
158
|
+
isListening.value = false;
|
|
159
|
+
if (!next || signal?.aborted) return;
|
|
160
|
+
|
|
161
|
+
const invoke: EventListener = (nativeEvent) => {
|
|
162
|
+
if (once) stop();
|
|
163
|
+
listener(nativeEvent);
|
|
164
|
+
};
|
|
165
|
+
const onAbort = (): void => stop();
|
|
166
|
+
next.addEventListener(event, invoke, eventOptions);
|
|
167
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
168
|
+
isListening.value = true;
|
|
169
|
+
|
|
170
|
+
onCleanup(() => {
|
|
171
|
+
next.removeEventListener(event, invoke, { capture });
|
|
172
|
+
signal?.removeEventListener("abort", onAbort);
|
|
173
|
+
isListening.value = false;
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
{ flush, immediate: true },
|
|
177
|
+
);
|
|
178
|
+
return true;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
tryOnScopeDispose(() => {
|
|
182
|
+
disposed = true;
|
|
183
|
+
stop();
|
|
184
|
+
});
|
|
185
|
+
if (immediate) start();
|
|
186
|
+
|
|
187
|
+
return { isListening: readonly(isListening), start, stop };
|
|
188
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { computed, readonly, ref, watch } from "vue";
|
|
2
|
+
import type { Ref, WritableComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
7
|
+
|
|
8
|
+
/** Element that can receive programmatic focus (`HTMLElement`, `SVGElement`, `MathMLElement`). */
|
|
9
|
+
export type FocusableElement = Element & HTMLOrSVGElement;
|
|
10
|
+
|
|
11
|
+
/** Options for {@link useFocus}. */
|
|
12
|
+
export interface UseFocusOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Focus the element as soon as it resolves.
|
|
15
|
+
*
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
readonly initialValue?: boolean;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Only report focus when the user agent would show a focus ring
|
|
22
|
+
* (`:focus-visible`).
|
|
23
|
+
*
|
|
24
|
+
* @default false
|
|
25
|
+
*/
|
|
26
|
+
readonly focusVisible?: boolean;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Avoid scrolling the element into view when focusing programmatically.
|
|
30
|
+
*
|
|
31
|
+
* @default false
|
|
32
|
+
*/
|
|
33
|
+
readonly preventScroll?: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Reactive focus state returned by {@link useFocus}. */
|
|
37
|
+
export interface FocusControls {
|
|
38
|
+
/** Whether the element is focused. Assign `true`/`false` to focus/blur it. */
|
|
39
|
+
readonly focused: WritableComputedRef<boolean>;
|
|
40
|
+
/** Stop tracking. Idempotent. */
|
|
41
|
+
readonly stop: () => void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Track and control focus of a single element.
|
|
46
|
+
*
|
|
47
|
+
* Listens for `focus`/`blur` on the resolved element and re-syncs when the
|
|
48
|
+
* target changes. Assigning `focused` calls `focus()`/`blur()`. Server renders
|
|
49
|
+
* always report `false`; `initialValue` is applied only after the element
|
|
50
|
+
* resolves on the client, so hydration output is unaffected.
|
|
51
|
+
*
|
|
52
|
+
* @param target Reactive element target.
|
|
53
|
+
* @param options Initial focus, focus-visible filtering, and scroll behavior.
|
|
54
|
+
* @default options {}
|
|
55
|
+
* @returns Writable focus ref and stop control.
|
|
56
|
+
*/
|
|
57
|
+
export function useFocus(target: MaybeElementTarget, options: UseFocusOptions = {}): FocusControls {
|
|
58
|
+
const inner = ref(false);
|
|
59
|
+
const element = computed(() => {
|
|
60
|
+
const resolved = resolveElement(target);
|
|
61
|
+
return resolved && isFocusable(resolved) ? resolved : null;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const read = (el: FocusableElement): boolean => {
|
|
65
|
+
const active = el.ownerDocument.activeElement === el;
|
|
66
|
+
if (!active || !options.focusVisible) return active;
|
|
67
|
+
return safeMatches(el, ":focus-visible");
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const stopWatch = watch(
|
|
71
|
+
element,
|
|
72
|
+
(el, _previous, onCleanup) => {
|
|
73
|
+
if (!el) {
|
|
74
|
+
inner.value = false;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const onFocus = (): void => {
|
|
78
|
+
inner.value = read(el);
|
|
79
|
+
};
|
|
80
|
+
const onBlur = (): void => {
|
|
81
|
+
inner.value = false;
|
|
82
|
+
};
|
|
83
|
+
el.addEventListener("focus", onFocus);
|
|
84
|
+
el.addEventListener("blur", onBlur);
|
|
85
|
+
inner.value = read(el);
|
|
86
|
+
if (options.initialValue && !inner.value) {
|
|
87
|
+
el.focus({ preventScroll: options.preventScroll ?? false });
|
|
88
|
+
}
|
|
89
|
+
onCleanup(() => {
|
|
90
|
+
el.removeEventListener("focus", onFocus);
|
|
91
|
+
el.removeEventListener("blur", onBlur);
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
{ immediate: true, flush: "post" },
|
|
95
|
+
);
|
|
96
|
+
const stop = (): void => stopWatch.stop();
|
|
97
|
+
tryOnScopeDispose(stop);
|
|
98
|
+
|
|
99
|
+
const focused = computed({
|
|
100
|
+
get: () => inner.value,
|
|
101
|
+
set: (next: boolean) => {
|
|
102
|
+
const el = element.value;
|
|
103
|
+
if (!el) return;
|
|
104
|
+
if (next) el.focus({ preventScroll: options.preventScroll ?? false });
|
|
105
|
+
else el.blur();
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return { focused, stop };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Reactive state returned by {@link useFocusWithin}. */
|
|
113
|
+
export interface FocusWithinControls {
|
|
114
|
+
/** Whether the element or any descendant has focus. */
|
|
115
|
+
readonly focused: Readonly<Ref<boolean>>;
|
|
116
|
+
/** Stop tracking. Idempotent. */
|
|
117
|
+
readonly stop: () => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Track whether focus is inside an element (the `:focus-within` state).
|
|
122
|
+
*
|
|
123
|
+
* Uses bubbling `focusin`/`focusout` and checks the `relatedTarget` so moving
|
|
124
|
+
* focus between descendants never flickers to `false`. Server renders report
|
|
125
|
+
* `false`.
|
|
126
|
+
*
|
|
127
|
+
* @param target Reactive element target.
|
|
128
|
+
* @returns Readonly focus-within ref and stop control.
|
|
129
|
+
*/
|
|
130
|
+
export function useFocusWithin(target: MaybeElementTarget): FocusWithinControls {
|
|
131
|
+
const focused = ref(false);
|
|
132
|
+
const stopWatch = watch(
|
|
133
|
+
() => resolveElement(target),
|
|
134
|
+
(el, _previous, onCleanup) => {
|
|
135
|
+
if (!el) {
|
|
136
|
+
focused.value = false;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const onFocusIn = (): void => {
|
|
140
|
+
focused.value = true;
|
|
141
|
+
};
|
|
142
|
+
const onFocusOut = (event: Event): void => {
|
|
143
|
+
const next = "relatedTarget" in event ? event.relatedTarget : null;
|
|
144
|
+
focused.value = isNode(next) && el.contains(next);
|
|
145
|
+
};
|
|
146
|
+
el.addEventListener("focusin", onFocusIn);
|
|
147
|
+
el.addEventListener("focusout", onFocusOut);
|
|
148
|
+
const active = el.ownerDocument.activeElement;
|
|
149
|
+
focused.value = active !== null && el.contains(active);
|
|
150
|
+
onCleanup(() => {
|
|
151
|
+
el.removeEventListener("focusin", onFocusIn);
|
|
152
|
+
el.removeEventListener("focusout", onFocusOut);
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
{ immediate: true, flush: "post" },
|
|
156
|
+
);
|
|
157
|
+
const stop = (): void => stopWatch.stop();
|
|
158
|
+
tryOnScopeDispose(stop);
|
|
159
|
+
return { focused: readonly(focused), stop };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function isFocusable(element: Element): element is FocusableElement {
|
|
163
|
+
return (
|
|
164
|
+
"focus" in element &&
|
|
165
|
+
typeof element.focus === "function" &&
|
|
166
|
+
"blur" in element &&
|
|
167
|
+
typeof element.blur === "function"
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function isNode(value: unknown): value is Node {
|
|
172
|
+
return typeof value === "object" && value !== null && "nodeType" in value;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function safeMatches(element: Element, selector: string): boolean {
|
|
176
|
+
try {
|
|
177
|
+
return element.matches(selector);
|
|
178
|
+
} catch {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
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
|
+
|
|
6
|
+
/** Frame scheduling capability used by {@link useFps}. */
|
|
7
|
+
export interface AnimationFrameHost {
|
|
8
|
+
/** Schedule a callback before the next repaint. */
|
|
9
|
+
readonly requestAnimationFrame: (callback: FrameRequestCallback) => number;
|
|
10
|
+
/** Cancel a scheduled frame. */
|
|
11
|
+
readonly cancelAnimationFrame: (handle: number) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Options for {@link useFps}. */
|
|
15
|
+
export interface UseFpsOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Number of frames averaged per update.
|
|
18
|
+
*
|
|
19
|
+
* @default 10
|
|
20
|
+
*/
|
|
21
|
+
readonly every?: number;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Start measuring during composable creation.
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
readonly immediate?: boolean;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Reactive frame-scheduling capability for alternate runtimes and tests.
|
|
32
|
+
*
|
|
33
|
+
* @default globalThis.window when available
|
|
34
|
+
*/
|
|
35
|
+
readonly host?: MaybeRefOrGetter<AnimationFrameHost | null | undefined>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Reactive frame-rate state returned by {@link useFps}. */
|
|
39
|
+
export interface FpsControls {
|
|
40
|
+
/** Frames per second averaged over the last `every` frames; `0` until measured. */
|
|
41
|
+
readonly fps: Readonly<Ref<number>>;
|
|
42
|
+
/** Whether a frame-scheduling capability is attached. `false` during server rendering. */
|
|
43
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
44
|
+
/** Whether the frame loop is running. */
|
|
45
|
+
readonly isActive: Readonly<Ref<boolean>>;
|
|
46
|
+
/** Stop the frame loop. */
|
|
47
|
+
readonly pause: () => void;
|
|
48
|
+
/** Restart the frame loop. */
|
|
49
|
+
readonly resume: () => void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Measure the rendering frame rate with `requestAnimationFrame`.
|
|
54
|
+
*
|
|
55
|
+
* Uses the frame timestamps passed to the callback (no extra clock) and
|
|
56
|
+
* publishes a rounded average every `every` frames. No frames are requested
|
|
57
|
+
* during server rendering (`fps` stays `0`), and the pending frame is
|
|
58
|
+
* cancelled when paused or when the owning reactive scope stops.
|
|
59
|
+
*
|
|
60
|
+
* @param options Averaging window, start mode, and frame capability.
|
|
61
|
+
* @default options {}
|
|
62
|
+
* @returns Reactive frame rate plus pause/resume controls.
|
|
63
|
+
*/
|
|
64
|
+
export function useFps(options: UseFpsOptions = {}): FpsControls {
|
|
65
|
+
const every = Math.max(1, Math.floor(options.every ?? 10));
|
|
66
|
+
const fps = ref(0);
|
|
67
|
+
const isSupported = ref(false);
|
|
68
|
+
const isActive = ref(options.immediate ?? true);
|
|
69
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
70
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
71
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
72
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
73
|
+
if (!mounted.value) {
|
|
74
|
+
onMounted(() => {
|
|
75
|
+
mounted.value = true;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const stop = watch(
|
|
80
|
+
[
|
|
81
|
+
() =>
|
|
82
|
+
!mounted.value
|
|
83
|
+
? undefined
|
|
84
|
+
: options.host === undefined
|
|
85
|
+
? browserFrameHost()
|
|
86
|
+
: toValue(options.host),
|
|
87
|
+
isActive,
|
|
88
|
+
],
|
|
89
|
+
([host, active], _previous, onCleanup) => {
|
|
90
|
+
isSupported.value = Boolean(host);
|
|
91
|
+
if (!host || !active) return;
|
|
92
|
+
let handle = 0;
|
|
93
|
+
let first: number | undefined;
|
|
94
|
+
let frames = 0;
|
|
95
|
+
const tick = (time: number): void => {
|
|
96
|
+
if (first === undefined) {
|
|
97
|
+
first = time;
|
|
98
|
+
} else {
|
|
99
|
+
frames += 1;
|
|
100
|
+
if (frames >= every) {
|
|
101
|
+
const elapsed = time - first;
|
|
102
|
+
if (elapsed > 0) fps.value = Math.round((1000 * frames) / elapsed);
|
|
103
|
+
first = time;
|
|
104
|
+
frames = 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
handle = host.requestAnimationFrame(tick);
|
|
108
|
+
};
|
|
109
|
+
handle = host.requestAnimationFrame(tick);
|
|
110
|
+
onCleanup(() => host.cancelAnimationFrame(handle));
|
|
111
|
+
},
|
|
112
|
+
{ immediate: true },
|
|
113
|
+
);
|
|
114
|
+
tryOnScopeDispose(() => stop.stop());
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
fps: readonly(fps),
|
|
118
|
+
isSupported: readonly(isSupported),
|
|
119
|
+
isActive: readonly(isActive),
|
|
120
|
+
pause: () => {
|
|
121
|
+
isActive.value = false;
|
|
122
|
+
},
|
|
123
|
+
resume: () => {
|
|
124
|
+
isActive.value = true;
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function browserFrameHost(): AnimationFrameHost | undefined {
|
|
130
|
+
return typeof window !== "undefined" && typeof window.requestAnimationFrame === "function"
|
|
131
|
+
? window
|
|
132
|
+
: undefined;
|
|
133
|
+
}
|