@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,469 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
hasInjectionContext,
|
|
4
|
+
readonly,
|
|
5
|
+
shallowRef,
|
|
6
|
+
toValue,
|
|
7
|
+
unref,
|
|
8
|
+
watch,
|
|
9
|
+
watchPostEffect,
|
|
10
|
+
} from "vue";
|
|
11
|
+
import type { ComputedRef, MaybeRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
12
|
+
|
|
13
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
14
|
+
|
|
15
|
+
/** Fields shared by every performance entry consumed by {@link usePerformanceObserver}. */
|
|
16
|
+
export interface PerformanceEntryLike {
|
|
17
|
+
/** Entry name (URL, mark name, paint name, event type, …). */
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** Entry type this entry was reported for. */
|
|
20
|
+
readonly entryType: string;
|
|
21
|
+
/** Start time relative to the time origin, in milliseconds. */
|
|
22
|
+
readonly startTime: number;
|
|
23
|
+
/** Duration in milliseconds (`0` for instantaneous entries). */
|
|
24
|
+
readonly duration: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** `largest-contentful-paint` entry. */
|
|
28
|
+
export interface LargestContentfulPaintEntryLike extends PerformanceEntryLike {
|
|
29
|
+
/** Entry type discriminant. */
|
|
30
|
+
readonly entryType: "largest-contentful-paint";
|
|
31
|
+
/** Render time, or `0` for cross-origin images without Timing-Allow-Origin. */
|
|
32
|
+
readonly renderTime: number;
|
|
33
|
+
/** Load time of the resource, or `0` for text. */
|
|
34
|
+
readonly loadTime: number;
|
|
35
|
+
/** Visible area of the element in square pixels. */
|
|
36
|
+
readonly size: number;
|
|
37
|
+
/** Element `id`, or an empty string. */
|
|
38
|
+
readonly id: string;
|
|
39
|
+
/** Image URL, or an empty string for text. */
|
|
40
|
+
readonly url: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** `layout-shift` entry (Layout Instability API). */
|
|
44
|
+
export interface LayoutShiftEntryLike extends PerformanceEntryLike {
|
|
45
|
+
/** Entry type discriminant. */
|
|
46
|
+
readonly entryType: "layout-shift";
|
|
47
|
+
/** Layout shift score. */
|
|
48
|
+
readonly value: number;
|
|
49
|
+
/** Whether a user input happened within the previous 500 ms. */
|
|
50
|
+
readonly hadRecentInput: boolean;
|
|
51
|
+
/** Time of the most recent input. */
|
|
52
|
+
readonly lastInputTime: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Fields of Event Timing entries (`event` and `first-input`). */
|
|
56
|
+
export interface EventTimingFieldsLike extends PerformanceEntryLike {
|
|
57
|
+
/** Time the event handlers started running. */
|
|
58
|
+
readonly processingStart: number;
|
|
59
|
+
/** Time the event handlers finished running. */
|
|
60
|
+
readonly processingEnd: number;
|
|
61
|
+
/** Whether the event was cancelable. */
|
|
62
|
+
readonly cancelable: boolean;
|
|
63
|
+
/** Interaction identifier; `0` when the event is not part of an interaction. */
|
|
64
|
+
readonly interactionId?: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** `event` entry (Event Timing API). */
|
|
68
|
+
export interface EventTimingEntryLike extends EventTimingFieldsLike {
|
|
69
|
+
/** Entry type discriminant. */
|
|
70
|
+
readonly entryType: "event";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** `first-input` entry (Event Timing API). */
|
|
74
|
+
export interface FirstInputEntryLike extends EventTimingFieldsLike {
|
|
75
|
+
/** Entry type discriminant. */
|
|
76
|
+
readonly entryType: "first-input";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** `paint` entry (`first-paint` or `first-contentful-paint`). */
|
|
80
|
+
export interface PaintEntryLike extends PerformanceEntryLike {
|
|
81
|
+
/** Entry type discriminant. */
|
|
82
|
+
readonly entryType: "paint";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Fields shared by resource and navigation timing entries. */
|
|
86
|
+
export interface ResourceTimingFieldsLike extends PerformanceEntryLike {
|
|
87
|
+
/** Initiator (`navigation`, `script`, `img`, `fetch`, …). */
|
|
88
|
+
readonly initiatorType: string;
|
|
89
|
+
/** Time the request started. */
|
|
90
|
+
readonly requestStart: number;
|
|
91
|
+
/** Time the first response byte arrived. */
|
|
92
|
+
readonly responseStart: number;
|
|
93
|
+
/** Time the last response byte arrived. */
|
|
94
|
+
readonly responseEnd: number;
|
|
95
|
+
/** Transferred size in bytes including headers. */
|
|
96
|
+
readonly transferSize: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** `resource` entry (Resource Timing API). */
|
|
100
|
+
export interface ResourceTimingEntryLike extends ResourceTimingFieldsLike {
|
|
101
|
+
/** Entry type discriminant. */
|
|
102
|
+
readonly entryType: "resource";
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** `navigation` entry (Navigation Timing API). */
|
|
106
|
+
export interface NavigationTimingEntryLike extends ResourceTimingFieldsLike {
|
|
107
|
+
/** Entry type discriminant. */
|
|
108
|
+
readonly entryType: "navigation";
|
|
109
|
+
/** Navigation type (`navigate`, `reload`, `back_forward`, `prerender`). */
|
|
110
|
+
readonly type: string;
|
|
111
|
+
/** Time a prerendered page was activated; `0` or absent otherwise. */
|
|
112
|
+
readonly activationStart?: number;
|
|
113
|
+
/** End of the `DOMContentLoaded` handlers. */
|
|
114
|
+
readonly domContentLoadedEventEnd: number;
|
|
115
|
+
/** End of the `load` handlers. */
|
|
116
|
+
readonly loadEventEnd: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** `longtask` entry (Long Tasks API). */
|
|
120
|
+
export interface LongTaskEntryLike extends PerformanceEntryLike {
|
|
121
|
+
/** Entry type discriminant. */
|
|
122
|
+
readonly entryType: "longtask";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** `mark` entry (User Timing API). */
|
|
126
|
+
export interface MarkEntryLike extends PerformanceEntryLike {
|
|
127
|
+
/** Entry type discriminant. */
|
|
128
|
+
readonly entryType: "mark";
|
|
129
|
+
/** Detail passed to `performance.mark`. */
|
|
130
|
+
readonly detail: unknown;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** `measure` entry (User Timing API). */
|
|
134
|
+
export interface MeasureEntryLike extends PerformanceEntryLike {
|
|
135
|
+
/** Entry type discriminant. */
|
|
136
|
+
readonly entryType: "measure";
|
|
137
|
+
/** Detail passed to `performance.measure`. */
|
|
138
|
+
readonly detail: unknown;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** `element` entry (Element Timing API). */
|
|
142
|
+
export interface ElementTimingEntryLike extends PerformanceEntryLike {
|
|
143
|
+
/** Entry type discriminant. */
|
|
144
|
+
readonly entryType: "element";
|
|
145
|
+
/** Value of the `elementtiming` attribute. */
|
|
146
|
+
readonly identifier: string;
|
|
147
|
+
/** Render time. */
|
|
148
|
+
readonly renderTime: number;
|
|
149
|
+
/** Load time of the resource, or `0` for text. */
|
|
150
|
+
readonly loadTime: number;
|
|
151
|
+
/** Element `id`, or an empty string. */
|
|
152
|
+
readonly id: string;
|
|
153
|
+
/** Image URL, or an empty string for text. */
|
|
154
|
+
readonly url: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** `long-animation-frame` entry (Long Animation Frames API). */
|
|
158
|
+
export interface LongAnimationFrameEntryLike extends PerformanceEntryLike {
|
|
159
|
+
/** Entry type discriminant. */
|
|
160
|
+
readonly entryType: "long-animation-frame";
|
|
161
|
+
/** Start of the rendering phase. */
|
|
162
|
+
readonly renderStart: number;
|
|
163
|
+
/** Start of style and layout. */
|
|
164
|
+
readonly styleAndLayoutStart: number;
|
|
165
|
+
/** Total blocking time of the frame in milliseconds. */
|
|
166
|
+
readonly blockingDuration: number;
|
|
167
|
+
/** Time of the first UI event handled in this frame, or `0`. */
|
|
168
|
+
readonly firstUIEventTimestamp: number;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Entry interface delivered for each supported entry type. */
|
|
172
|
+
export interface PerformanceEntryTypeMap {
|
|
173
|
+
/** Largest Contentful Paint candidates. */
|
|
174
|
+
readonly "largest-contentful-paint": LargestContentfulPaintEntryLike;
|
|
175
|
+
/** Layout shifts. */
|
|
176
|
+
readonly "layout-shift": LayoutShiftEntryLike;
|
|
177
|
+
/** Event Timing entries. */
|
|
178
|
+
readonly event: EventTimingEntryLike;
|
|
179
|
+
/** The first input of the page. */
|
|
180
|
+
readonly "first-input": FirstInputEntryLike;
|
|
181
|
+
/** First paint and first contentful paint. */
|
|
182
|
+
readonly paint: PaintEntryLike;
|
|
183
|
+
/** Document navigation timing. */
|
|
184
|
+
readonly navigation: NavigationTimingEntryLike;
|
|
185
|
+
/** Resource timing. */
|
|
186
|
+
readonly resource: ResourceTimingEntryLike;
|
|
187
|
+
/** Tasks longer than 50 ms. */
|
|
188
|
+
readonly longtask: LongTaskEntryLike;
|
|
189
|
+
/** User Timing marks. */
|
|
190
|
+
readonly mark: MarkEntryLike;
|
|
191
|
+
/** User Timing measures. */
|
|
192
|
+
readonly measure: MeasureEntryLike;
|
|
193
|
+
/** Element Timing entries. */
|
|
194
|
+
readonly element: ElementTimingEntryLike;
|
|
195
|
+
/** Long animation frames. */
|
|
196
|
+
readonly "long-animation-frame": LongAnimationFrameEntryLike;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Entry type understood by {@link usePerformanceObserver}. */
|
|
200
|
+
export type PerformanceEntryType = keyof PerformanceEntryTypeMap;
|
|
201
|
+
|
|
202
|
+
/** Options passed to {@link PerformanceObserverLike.observe}. */
|
|
203
|
+
export interface PerformanceObserveInit {
|
|
204
|
+
/** Single entry type to observe. */
|
|
205
|
+
readonly type: string;
|
|
206
|
+
/** Replay entries buffered before observation started. */
|
|
207
|
+
readonly buffered?: boolean;
|
|
208
|
+
/** Minimum duration of reported `event` entries. */
|
|
209
|
+
readonly durationThreshold?: number;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Minimal entry list handed to observer callbacks. */
|
|
213
|
+
export interface PerformanceObserverEntryListLike {
|
|
214
|
+
/** Every entry of this batch. */
|
|
215
|
+
getEntries(): readonly PerformanceEntryLike[];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** Minimal `PerformanceObserver` instance. */
|
|
219
|
+
export interface PerformanceObserverLike {
|
|
220
|
+
/** Start observing one entry type. */
|
|
221
|
+
observe(options: PerformanceObserveInit): void;
|
|
222
|
+
/** Stop observing everything. */
|
|
223
|
+
disconnect(): void;
|
|
224
|
+
/** Return and clear pending entries. */
|
|
225
|
+
takeRecords(): readonly PerformanceEntryLike[];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Minimal `PerformanceObserver` constructor. */
|
|
229
|
+
export interface PerformanceObserverHost {
|
|
230
|
+
/** Create an observer. */
|
|
231
|
+
new (
|
|
232
|
+
callback: (list: PerformanceObserverEntryListLike, observer: PerformanceObserverLike) => void,
|
|
233
|
+
): PerformanceObserverLike;
|
|
234
|
+
/** Entry types this runtime supports; every type is attempted when absent. */
|
|
235
|
+
readonly supportedEntryTypes?: readonly string[] | undefined;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** Options for {@link usePerformanceObserver}. */
|
|
239
|
+
export interface UsePerformanceObserverOptions {
|
|
240
|
+
/**
|
|
241
|
+
* `PerformanceObserver` constructor for alternate runtimes and tests. A ref
|
|
242
|
+
* (not a getter) because the host itself is a constructor function.
|
|
243
|
+
*
|
|
244
|
+
* @default window.PerformanceObserver when it exists
|
|
245
|
+
*/
|
|
246
|
+
readonly PerformanceObserver?: MaybeRef<PerformanceObserverHost | null | undefined>;
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Replay entries recorded before observation started.
|
|
250
|
+
*
|
|
251
|
+
* @default false
|
|
252
|
+
*/
|
|
253
|
+
readonly buffered?: boolean;
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Minimum duration in milliseconds of reported `event` entries (the
|
|
257
|
+
* platform rounds it and clamps it to at least 16).
|
|
258
|
+
*
|
|
259
|
+
* @default undefined (platform default of 104)
|
|
260
|
+
*/
|
|
261
|
+
readonly durationThreshold?: number;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Start observing immediately.
|
|
265
|
+
*
|
|
266
|
+
* @default true
|
|
267
|
+
*/
|
|
268
|
+
readonly immediate?: boolean;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Callback invoked with correctly typed entries. */
|
|
272
|
+
export type PerformanceObserverCallback<Type extends PerformanceEntryType> = (
|
|
273
|
+
entries: readonly PerformanceEntryTypeMap[Type][],
|
|
274
|
+
observer: PerformanceObserverLike,
|
|
275
|
+
) => void;
|
|
276
|
+
|
|
277
|
+
/** Reactive state and actions returned by {@link usePerformanceObserver}. */
|
|
278
|
+
export interface PerformanceObserverControls<Type extends PerformanceEntryType> {
|
|
279
|
+
/** Whether an observer exists and supports at least one requested type. */
|
|
280
|
+
readonly supported: ComputedRef<boolean>;
|
|
281
|
+
|
|
282
|
+
/** Requested entry types the runtime supports. */
|
|
283
|
+
readonly observedTypes: ComputedRef<readonly Type[]>;
|
|
284
|
+
|
|
285
|
+
/** Whether an observer is currently connected. */
|
|
286
|
+
readonly isActive: Readonly<ShallowRef<boolean>>;
|
|
287
|
+
|
|
288
|
+
/** Most recent failure thrown by `observe`, cleared on the next start. */
|
|
289
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
290
|
+
|
|
291
|
+
/** Start (or restart) observing. */
|
|
292
|
+
readonly start: () => void;
|
|
293
|
+
|
|
294
|
+
/** Disconnect the observer. Repeated calls are safe. */
|
|
295
|
+
readonly stop: () => void;
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Return and clear entries that are queued but not yet delivered.
|
|
299
|
+
*
|
|
300
|
+
* @returns Pending entries of the requested types.
|
|
301
|
+
*/
|
|
302
|
+
readonly takeRecords: () => readonly PerformanceEntryTypeMap[Type][];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function isPerformanceObserverHost(candidate: unknown): candidate is PerformanceObserverHost {
|
|
306
|
+
return typeof candidate === "function";
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function browserPerformanceObserver(): PerformanceObserverHost | undefined {
|
|
310
|
+
if (typeof window === "undefined") return undefined;
|
|
311
|
+
const candidate: unknown = Reflect.get(window, "PerformanceObserver");
|
|
312
|
+
return isPerformanceObserverHost(candidate) ? candidate : undefined;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function isEntryOf<Type extends PerformanceEntryType>(
|
|
316
|
+
entry: PerformanceEntryLike,
|
|
317
|
+
types: readonly Type[],
|
|
318
|
+
): entry is PerformanceEntryTypeMap[Type] {
|
|
319
|
+
return types.some((type) => type === entry.entryType);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Observe performance entries with callbacks typed by entry type.
|
|
324
|
+
*
|
|
325
|
+
* Each supported type is observed with its own `observe({ type })` call so
|
|
326
|
+
* `buffered` and `durationThreshold` apply. Types missing from
|
|
327
|
+
* `PerformanceObserver.supportedEntryTypes` are skipped; `supported` is false
|
|
328
|
+
* when none remain. The observer follows reactive `entryTypes` and is
|
|
329
|
+
* disconnected when the owning reactive scope stops; outside a scope the
|
|
330
|
+
* caller owns `stop()`.
|
|
331
|
+
*
|
|
332
|
+
* Server rendering: no observer is created and `supported` is false. Inside
|
|
333
|
+
* a component the observer connects after mounting, so hydration renders the
|
|
334
|
+
* server state first.
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```ts
|
|
338
|
+
* usePerformanceObserver("largest-contentful-paint", (entries) => {
|
|
339
|
+
* console.log(entries.at(-1)?.renderTime);
|
|
340
|
+
* }, { buffered: true });
|
|
341
|
+
* ```
|
|
342
|
+
*
|
|
343
|
+
* @param entryTypes One entry type or a list of them.
|
|
344
|
+
* @param callback Receives batches of typed entries.
|
|
345
|
+
* @param options Constructor host and observation options.
|
|
346
|
+
* @default options {}
|
|
347
|
+
* @returns Observer state and actions.
|
|
348
|
+
*/
|
|
349
|
+
export function usePerformanceObserver<const Type extends PerformanceEntryType>(
|
|
350
|
+
entryTypes: MaybeRefOrGetter<Type | readonly Type[]>,
|
|
351
|
+
callback: PerformanceObserverCallback<Type>,
|
|
352
|
+
options: UsePerformanceObserverOptions = {},
|
|
353
|
+
): PerformanceObserverControls<Type> {
|
|
354
|
+
const { durationThreshold } = options;
|
|
355
|
+
if (
|
|
356
|
+
durationThreshold !== undefined &&
|
|
357
|
+
(!Number.isFinite(durationThreshold) || durationThreshold < 0)
|
|
358
|
+
) {
|
|
359
|
+
throw new RangeError(
|
|
360
|
+
`[VIZE_COMPOSE_PERF_OBSERVER_INVALID_DURATION_THRESHOLD] durationThreshold must be a finite, non-negative number, received ${String(durationThreshold)}`,
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const isActive = shallowRef(false);
|
|
365
|
+
const error = shallowRef<unknown>(undefined);
|
|
366
|
+
let observer: PerformanceObserverLike | undefined;
|
|
367
|
+
|
|
368
|
+
// Inside a component the host resolves only after mounting, so a hydrating
|
|
369
|
+
// client renders the server's inactive state first. Outside components it
|
|
370
|
+
// resolves synchronously.
|
|
371
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
372
|
+
if (!hydrated.value) {
|
|
373
|
+
watchPostEffect(() => {
|
|
374
|
+
hydrated.value = true;
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const resolveHost = (): PerformanceObserverHost | undefined => {
|
|
379
|
+
if (!hydrated.value) return undefined;
|
|
380
|
+
return options.PerformanceObserver === undefined
|
|
381
|
+
? browserPerformanceObserver()
|
|
382
|
+
: (unref(options.PerformanceObserver) ?? undefined);
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
const requestedTypes = (): readonly Type[] => {
|
|
386
|
+
const value = toValue(entryTypes);
|
|
387
|
+
return typeof value === "string" ? [value] : [...new Set(value)];
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
const observedTypes = computed((): readonly Type[] => {
|
|
391
|
+
const host = resolveHost();
|
|
392
|
+
if (!host) return [];
|
|
393
|
+
const supportedTypes = host.supportedEntryTypes;
|
|
394
|
+
const requested = requestedTypes();
|
|
395
|
+
return supportedTypes ? requested.filter((type) => supportedTypes.includes(type)) : requested;
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
const disconnect = (): void => {
|
|
399
|
+
observer?.disconnect();
|
|
400
|
+
observer = undefined;
|
|
401
|
+
isActive.value = false;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const connect = (): void => {
|
|
405
|
+
disconnect();
|
|
406
|
+
const host = resolveHost();
|
|
407
|
+
const types = observedTypes.value;
|
|
408
|
+
if (!host || types.length === 0) return;
|
|
409
|
+
error.value = undefined;
|
|
410
|
+
const next = new host((list, current) => {
|
|
411
|
+
const entries = list.getEntries().filter((entry) => isEntryOf(entry, types));
|
|
412
|
+
if (entries.length > 0) callback(entries, current);
|
|
413
|
+
});
|
|
414
|
+
let observing = 0;
|
|
415
|
+
for (const type of types) {
|
|
416
|
+
try {
|
|
417
|
+
next.observe({
|
|
418
|
+
type,
|
|
419
|
+
...(options.buffered === undefined ? {} : { buffered: options.buffered }),
|
|
420
|
+
...(type === "event" && durationThreshold !== undefined ? { durationThreshold } : {}),
|
|
421
|
+
});
|
|
422
|
+
observing += 1;
|
|
423
|
+
} catch (cause) {
|
|
424
|
+
error.value = cause;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
if (observing === 0) {
|
|
428
|
+
next.disconnect();
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
observer = next;
|
|
432
|
+
isActive.value = true;
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
let enabled = options.immediate ?? true;
|
|
436
|
+
const stopWatch = watch(
|
|
437
|
+
() => [resolveHost(), observedTypes.value.join(" ")],
|
|
438
|
+
() => {
|
|
439
|
+
if (enabled) connect();
|
|
440
|
+
},
|
|
441
|
+
{ immediate: true, flush: "sync" },
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
const stop = (): void => {
|
|
445
|
+
enabled = false;
|
|
446
|
+
disconnect();
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
tryOnScopeDispose(() => {
|
|
450
|
+
stopWatch();
|
|
451
|
+
stop();
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
return {
|
|
455
|
+
supported: computed(() => observedTypes.value.length > 0),
|
|
456
|
+
observedTypes,
|
|
457
|
+
isActive: readonly(isActive),
|
|
458
|
+
error: readonly(error),
|
|
459
|
+
start: () => {
|
|
460
|
+
enabled = true;
|
|
461
|
+
connect();
|
|
462
|
+
},
|
|
463
|
+
stop,
|
|
464
|
+
takeRecords: () => {
|
|
465
|
+
const types = observedTypes.value;
|
|
466
|
+
return observer ? observer.takeRecords().filter((entry) => isEntryOf(entry, types)) : [];
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { hasInjectionContext, readonly, ref, toValue, watchEffect } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Permission names understood by at least one major browser.
|
|
8
|
+
*
|
|
9
|
+
* The `(string & {})` member keeps autocompletion for the well-known names
|
|
10
|
+
* while still accepting names that browsers add later.
|
|
11
|
+
*/
|
|
12
|
+
export type WellKnownPermissionName =
|
|
13
|
+
| "accelerometer"
|
|
14
|
+
| "background-fetch"
|
|
15
|
+
| "background-sync"
|
|
16
|
+
| "bluetooth"
|
|
17
|
+
| "camera"
|
|
18
|
+
| "clipboard-read"
|
|
19
|
+
| "clipboard-write"
|
|
20
|
+
| "display-capture"
|
|
21
|
+
| "geolocation"
|
|
22
|
+
| "gyroscope"
|
|
23
|
+
| "idle-detection"
|
|
24
|
+
| "local-fonts"
|
|
25
|
+
| "magnetometer"
|
|
26
|
+
| "microphone"
|
|
27
|
+
| "midi"
|
|
28
|
+
| "nfc"
|
|
29
|
+
| "notifications"
|
|
30
|
+
| "payment-handler"
|
|
31
|
+
| "periodic-background-sync"
|
|
32
|
+
| "persistent-storage"
|
|
33
|
+
| "push"
|
|
34
|
+
| "screen-wake-lock"
|
|
35
|
+
| "speaker-selection"
|
|
36
|
+
| "storage-access"
|
|
37
|
+
| "window-management"
|
|
38
|
+
| (string & {});
|
|
39
|
+
|
|
40
|
+
/** Descriptor passed to `navigator.permissions.query`. */
|
|
41
|
+
export interface PermissionDescriptorLike {
|
|
42
|
+
/** Permission name. */
|
|
43
|
+
readonly name: WellKnownPermissionName;
|
|
44
|
+
|
|
45
|
+
/** Push: only user-visible notifications (required `true` by most browsers). */
|
|
46
|
+
readonly userVisibleOnly?: boolean;
|
|
47
|
+
|
|
48
|
+
/** MIDI: request system-exclusive message access. */
|
|
49
|
+
readonly sysex?: boolean;
|
|
50
|
+
|
|
51
|
+
/** Camera: request pan-tilt-zoom control. */
|
|
52
|
+
readonly panTiltZoom?: boolean;
|
|
53
|
+
|
|
54
|
+
/** Clipboard (Chromium): allow access without a user gesture. */
|
|
55
|
+
readonly allowWithoutGesture?: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Browser permission state, plus the capability states added by this package. */
|
|
59
|
+
export type PermissionQueryState = "granted" | "denied" | "prompt" | "unsupported" | "unknown";
|
|
60
|
+
|
|
61
|
+
/** Minimal `PermissionStatus` shape consumed by {@link usePermission}. */
|
|
62
|
+
export interface PermissionStatusLike extends EventTarget {
|
|
63
|
+
/** Current state reported by the browser. */
|
|
64
|
+
readonly state: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Minimal `Permissions` shape consumed by {@link usePermission}. */
|
|
68
|
+
export interface PermissionsHost {
|
|
69
|
+
/**
|
|
70
|
+
* Query one permission. Rejects (TypeError) for names the browser does not
|
|
71
|
+
* know. Declared with method syntax so the DOM `Permissions` object, whose
|
|
72
|
+
* descriptor names are a narrower union, satisfies this interface.
|
|
73
|
+
*/
|
|
74
|
+
query(descriptor: PermissionDescriptorLike): Promise<PermissionStatusLike>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Options for {@link usePermission}. */
|
|
78
|
+
export interface UsePermissionOptions {
|
|
79
|
+
/**
|
|
80
|
+
* Permissions capability for alternate runtimes and tests.
|
|
81
|
+
*
|
|
82
|
+
* @default window.navigator.permissions when a browser window exists
|
|
83
|
+
*/
|
|
84
|
+
readonly host?: MaybeRefOrGetter<PermissionsHost | null | undefined>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* State exposed before the first query settles and during server rendering.
|
|
88
|
+
*
|
|
89
|
+
* @default "unknown"
|
|
90
|
+
*/
|
|
91
|
+
readonly initialState?: PermissionQueryState;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Reactive state returned by {@link usePermission}. */
|
|
95
|
+
export interface PermissionControls {
|
|
96
|
+
/**
|
|
97
|
+
* Current permission state. `"unsupported"` means the Permissions API (or
|
|
98
|
+
* this permission name) is unavailable; `"unknown"` means no answer yet.
|
|
99
|
+
*/
|
|
100
|
+
readonly state: Readonly<Ref<PermissionQueryState>>;
|
|
101
|
+
|
|
102
|
+
/** Whether a Permissions capability is attached. */
|
|
103
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Query the permission again and resubscribe to its changes.
|
|
107
|
+
*
|
|
108
|
+
* @returns The settled state.
|
|
109
|
+
*/
|
|
110
|
+
readonly query: () => Promise<PermissionQueryState>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function normalizeState(state: string): PermissionQueryState {
|
|
114
|
+
return state === "granted" || state === "denied" || state === "prompt" ? state : "unknown";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function browserPermissions(): PermissionsHost | undefined {
|
|
118
|
+
if (typeof window === "undefined") return undefined;
|
|
119
|
+
return window.navigator.permissions ?? undefined;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function toDescriptor(
|
|
123
|
+
name: WellKnownPermissionName | PermissionDescriptorLike,
|
|
124
|
+
): PermissionDescriptorLike {
|
|
125
|
+
return typeof name === "string" ? { name } : name;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Observe a browser permission reactively.
|
|
130
|
+
*
|
|
131
|
+
* The permission is queried when the composable is created and whenever
|
|
132
|
+
* the reactive name/descriptor or host changes; the `change` event of the
|
|
133
|
+
* returned `PermissionStatus` keeps `state` current (for example after the
|
|
134
|
+
* user revokes camera access in the site settings). The subscription is
|
|
135
|
+
* removed when the name changes and when the owning reactive scope stops.
|
|
136
|
+
*
|
|
137
|
+
* Server rendering: no browser window exists, so nothing is queried and
|
|
138
|
+
* `state` stays at `initialState` (`"unknown"`) with `supported` false.
|
|
139
|
+
* Unknown names (the browser rejects the query) report `"unsupported"`.
|
|
140
|
+
* Inside a component the first query runs after mounting, so hydration
|
|
141
|
+
* renders `initialState` exactly like the server did.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* const { state } = usePermission("camera");
|
|
146
|
+
* const canUseCamera = computed(() => state.value === "granted");
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @param name Reactive permission name or full descriptor.
|
|
150
|
+
* @param options Capability host and initial state.
|
|
151
|
+
* @default options {}
|
|
152
|
+
* @returns The reactive permission state and a re-query control.
|
|
153
|
+
*/
|
|
154
|
+
export function usePermission(
|
|
155
|
+
name: MaybeRefOrGetter<WellKnownPermissionName | PermissionDescriptorLike>,
|
|
156
|
+
options: UsePermissionOptions = {},
|
|
157
|
+
): PermissionControls {
|
|
158
|
+
const initialState = options.initialState ?? "unknown";
|
|
159
|
+
const state = ref<PermissionQueryState>(initialState);
|
|
160
|
+
const supported = ref(false);
|
|
161
|
+
let generation = 0;
|
|
162
|
+
let unsubscribe: (() => void) | undefined;
|
|
163
|
+
let active = true;
|
|
164
|
+
|
|
165
|
+
const resolveHost = (): PermissionsHost | undefined =>
|
|
166
|
+
options.host === undefined ? browserPermissions() : (toValue(options.host) ?? undefined);
|
|
167
|
+
|
|
168
|
+
const release = (): void => {
|
|
169
|
+
unsubscribe?.();
|
|
170
|
+
unsubscribe = undefined;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const query = async (): Promise<PermissionQueryState> => {
|
|
174
|
+
const current = ++generation;
|
|
175
|
+
release();
|
|
176
|
+
const host = resolveHost();
|
|
177
|
+
supported.value = host !== undefined;
|
|
178
|
+
if (!host) {
|
|
179
|
+
// Without a browser window (server rendering) the answer is unknown,
|
|
180
|
+
// not "unsupported": keep the initial state so hydration matches.
|
|
181
|
+
state.value = typeof window === "undefined" ? initialState : "unsupported";
|
|
182
|
+
return state.value;
|
|
183
|
+
}
|
|
184
|
+
let status: PermissionStatusLike;
|
|
185
|
+
try {
|
|
186
|
+
status = await host.query(toDescriptor(toValue(name)));
|
|
187
|
+
} catch {
|
|
188
|
+
if (current === generation) state.value = "unsupported";
|
|
189
|
+
return "unsupported";
|
|
190
|
+
}
|
|
191
|
+
if (current !== generation || !active) return normalizeState(status.state);
|
|
192
|
+
const update = (): void => {
|
|
193
|
+
state.value = normalizeState(status.state);
|
|
194
|
+
};
|
|
195
|
+
update();
|
|
196
|
+
status.addEventListener("change", update);
|
|
197
|
+
unsubscribe = () => status.removeEventListener("change", update);
|
|
198
|
+
return state.value;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
if (typeof window !== "undefined" || options.host !== undefined) {
|
|
202
|
+
// `query` reads the name and host synchronously, so the effect re-runs
|
|
203
|
+
// when either changes. Inside a component the first query waits for the
|
|
204
|
+
// post-render flush: hydration renders `initialState` like the server.
|
|
205
|
+
watchEffect(
|
|
206
|
+
() => {
|
|
207
|
+
void query();
|
|
208
|
+
},
|
|
209
|
+
{ flush: hasInjectionContext() ? "post" : "sync" },
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
tryOnScopeDispose(() => {
|
|
214
|
+
active = false;
|
|
215
|
+
generation += 1;
|
|
216
|
+
release();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
return { state: readonly(state), supported: readonly(supported), query };
|
|
220
|
+
}
|