@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,83 @@
|
|
|
1
|
+
import { n as IntervalScheduler } from "./use-interval-BA55gTHT.mjs";
|
|
2
|
+
import { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
//#region src/use-user-activation.d.ts
|
|
5
|
+
/** Minimal `navigator.userActivation` (`UserActivation`). */
|
|
6
|
+
interface UserActivationLike {
|
|
7
|
+
/** Whether the page ever had sticky activation. */
|
|
8
|
+
readonly hasBeenActive: boolean;
|
|
9
|
+
/** Whether the page currently has transient activation. */
|
|
10
|
+
readonly isActive: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Options for {@link useUserActivation}. */
|
|
13
|
+
interface UseUserActivationOptions {
|
|
14
|
+
/**
|
|
15
|
+
* User activation state for alternate runtimes and tests.
|
|
16
|
+
*
|
|
17
|
+
* @default window.navigator.userActivation when it exists
|
|
18
|
+
*/
|
|
19
|
+
readonly userActivation?: MaybeRefOrGetter<UserActivationLike | null | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* Target whose activation-triggering events refresh the state.
|
|
22
|
+
*
|
|
23
|
+
* @default window
|
|
24
|
+
*/
|
|
25
|
+
readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* Events that refresh the state.
|
|
28
|
+
*
|
|
29
|
+
* @default ["keydown", "mousedown", "pointerdown", "pointerup", "touchend"]
|
|
30
|
+
*/
|
|
31
|
+
readonly events?: readonly string[];
|
|
32
|
+
/**
|
|
33
|
+
* Poll interval in milliseconds while `isActive` is true, so its expiry is
|
|
34
|
+
* observed. `0` disables polling.
|
|
35
|
+
*
|
|
36
|
+
* @default 1000
|
|
37
|
+
*/
|
|
38
|
+
readonly interval?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Timer host for polling.
|
|
41
|
+
*
|
|
42
|
+
* @default window timer functions
|
|
43
|
+
*/
|
|
44
|
+
readonly scheduler?: IntervalScheduler;
|
|
45
|
+
}
|
|
46
|
+
/** Reactive state returned by {@link useUserActivation}. */
|
|
47
|
+
interface UserActivationControls {
|
|
48
|
+
/** Whether the User Activation API is available. */
|
|
49
|
+
readonly supported: ComputedRef<boolean>;
|
|
50
|
+
/** Sticky activation: the user interacted with the page at least once. */
|
|
51
|
+
readonly hasBeenActive: Readonly<Ref<boolean>>;
|
|
52
|
+
/** Transient activation: a gated API (popup, fullscreen, clipboard) may be called now. */
|
|
53
|
+
readonly isActive: Readonly<Ref<boolean>>;
|
|
54
|
+
/** Re-read the activation state. */
|
|
55
|
+
readonly refresh: () => void;
|
|
56
|
+
/** Remove listeners and timers. Idempotent. */
|
|
57
|
+
readonly stop: () => void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Track sticky and transient user activation with the User Activation API.
|
|
61
|
+
*
|
|
62
|
+
* The state is refreshed on activation-triggering events of `target`
|
|
63
|
+
* (immediately and again after a microtask) and polled while `isActive` is
|
|
64
|
+
* true so its expiry is observed. Listeners and the timer are removed when
|
|
65
|
+
* the owning reactive scope stops; outside a scope call `stop()`.
|
|
66
|
+
*
|
|
67
|
+
* Server rendering: no listeners or timers, `supported`, `hasBeenActive`,
|
|
68
|
+
* and `isActive` are false.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* const { isActive } = useUserActivation();
|
|
73
|
+
* const canOpenPopup = computed(() => isActive.value);
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* @param options Capability host, event target, and polling policy.
|
|
77
|
+
* @default options {}
|
|
78
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_USER_ACTIVATION_INVALID_INTERVAL` when `interval` is negative or not finite.
|
|
79
|
+
* @returns Activation state.
|
|
80
|
+
*/
|
|
81
|
+
declare function useUserActivation(options?: UseUserActivationOptions): UserActivationControls;
|
|
82
|
+
//#endregion
|
|
83
|
+
export { UseUserActivationOptions, UserActivationControls, UserActivationLike, useUserActivation };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, hasInjectionContext, readonly, ref, shallowRef, toValue, watch, watchPostEffect } from "vue";
|
|
3
|
+
//#region src/use-user-activation.ts
|
|
4
|
+
const defaultEvents = [
|
|
5
|
+
"keydown",
|
|
6
|
+
"mousedown",
|
|
7
|
+
"pointerdown",
|
|
8
|
+
"pointerup",
|
|
9
|
+
"touchend"
|
|
10
|
+
];
|
|
11
|
+
function isUserActivation(candidate) {
|
|
12
|
+
return typeof candidate === "object" && candidate !== null && "isActive" in candidate;
|
|
13
|
+
}
|
|
14
|
+
function browserUserActivation() {
|
|
15
|
+
if (typeof window === "undefined") return void 0;
|
|
16
|
+
const candidate = Reflect.get(window.navigator, "userActivation");
|
|
17
|
+
return isUserActivation(candidate) ? candidate : void 0;
|
|
18
|
+
}
|
|
19
|
+
function browserScheduler() {
|
|
20
|
+
if (typeof window === "undefined") return void 0;
|
|
21
|
+
return {
|
|
22
|
+
setInterval: (callback, intervalMs) => window.setInterval(callback, intervalMs),
|
|
23
|
+
clearInterval: (handle) => {
|
|
24
|
+
if (typeof handle === "number") window.clearInterval(handle);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Track sticky and transient user activation with the User Activation API.
|
|
30
|
+
*
|
|
31
|
+
* The state is refreshed on activation-triggering events of `target`
|
|
32
|
+
* (immediately and again after a microtask) and polled while `isActive` is
|
|
33
|
+
* true so its expiry is observed. Listeners and the timer are removed when
|
|
34
|
+
* the owning reactive scope stops; outside a scope call `stop()`.
|
|
35
|
+
*
|
|
36
|
+
* Server rendering: no listeners or timers, `supported`, `hasBeenActive`,
|
|
37
|
+
* and `isActive` are false.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const { isActive } = useUserActivation();
|
|
42
|
+
* const canOpenPopup = computed(() => isActive.value);
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @param options Capability host, event target, and polling policy.
|
|
46
|
+
* @default options {}
|
|
47
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_USER_ACTIVATION_INVALID_INTERVAL` when `interval` is negative or not finite.
|
|
48
|
+
* @returns Activation state.
|
|
49
|
+
*/
|
|
50
|
+
function useUserActivation(options = {}) {
|
|
51
|
+
const interval = options.interval ?? 1e3;
|
|
52
|
+
if (!Number.isFinite(interval) || interval < 0) throw new RangeError(`[VIZE_COMPOSE_USER_ACTIVATION_INVALID_INTERVAL] interval must be a finite, non-negative number; received ${String(interval)}`);
|
|
53
|
+
const hasBeenActive = ref(false);
|
|
54
|
+
const isActive = ref(false);
|
|
55
|
+
let timer;
|
|
56
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
57
|
+
if (!hydrated.value) watchPostEffect(() => {
|
|
58
|
+
hydrated.value = true;
|
|
59
|
+
});
|
|
60
|
+
const resolveHost = () => !hydrated.value ? void 0 : options.userActivation === void 0 ? browserUserActivation() : toValue(options.userActivation) ?? void 0;
|
|
61
|
+
const stopPolling = () => {
|
|
62
|
+
timer?.scheduler.clearInterval(timer.handle);
|
|
63
|
+
timer = void 0;
|
|
64
|
+
};
|
|
65
|
+
const refresh = () => {
|
|
66
|
+
const host = resolveHost();
|
|
67
|
+
hasBeenActive.value = host?.hasBeenActive ?? false;
|
|
68
|
+
isActive.value = host?.isActive ?? false;
|
|
69
|
+
if (!isActive.value) {
|
|
70
|
+
stopPolling();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (timer || interval === 0) return;
|
|
74
|
+
const scheduler = options.scheduler ?? browserScheduler();
|
|
75
|
+
if (scheduler) timer = {
|
|
76
|
+
scheduler,
|
|
77
|
+
handle: scheduler.setInterval(refresh, interval)
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
const onEvent = () => {
|
|
81
|
+
refresh();
|
|
82
|
+
Promise.resolve().then(refresh);
|
|
83
|
+
};
|
|
84
|
+
const stopWatch = watch(() => [options.target === void 0 ? typeof window === "undefined" ? void 0 : window : toValue(options.target) ?? void 0, resolveHost()], ([target, host], _previous, onCleanup) => {
|
|
85
|
+
if (host) refresh();
|
|
86
|
+
if (!target || !host) return;
|
|
87
|
+
const events = options.events ?? defaultEvents;
|
|
88
|
+
for (const type of events) target.addEventListener(type, onEvent, {
|
|
89
|
+
capture: true,
|
|
90
|
+
passive: true
|
|
91
|
+
});
|
|
92
|
+
onCleanup(() => {
|
|
93
|
+
for (const type of events) target.removeEventListener(type, onEvent, { capture: true });
|
|
94
|
+
});
|
|
95
|
+
}, {
|
|
96
|
+
immediate: true,
|
|
97
|
+
flush: "sync"
|
|
98
|
+
});
|
|
99
|
+
const stop = () => {
|
|
100
|
+
stopWatch();
|
|
101
|
+
stopPolling();
|
|
102
|
+
};
|
|
103
|
+
tryOnScopeDispose(stop);
|
|
104
|
+
return {
|
|
105
|
+
supported: computed(() => resolveHost() !== void 0),
|
|
106
|
+
hasBeenActive: readonly(hasBeenActive),
|
|
107
|
+
isActive: readonly(isActive),
|
|
108
|
+
refresh,
|
|
109
|
+
stop
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
export { useUserActivation };
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-user-media.d.ts
|
|
4
|
+
/** Minimal `MediaStreamTrack`. */
|
|
5
|
+
interface MediaStreamTrackLike extends EventTarget {
|
|
6
|
+
/** `"audio"` or `"video"`. */
|
|
7
|
+
readonly kind: string;
|
|
8
|
+
/** `"live"` or `"ended"`. */
|
|
9
|
+
readonly readyState: string;
|
|
10
|
+
/** Stop the track and release its device. */
|
|
11
|
+
stop(): void;
|
|
12
|
+
}
|
|
13
|
+
/** Minimal `MediaStream`. */
|
|
14
|
+
interface MediaStreamLike {
|
|
15
|
+
/** Every track of the stream. */
|
|
16
|
+
getTracks(): readonly MediaStreamTrackLike[];
|
|
17
|
+
}
|
|
18
|
+
/** Anything that can asynchronously produce a media stream. */
|
|
19
|
+
interface MediaStreamSource<Constraints> {
|
|
20
|
+
/** Acquire a stream; rejects with a DOMException on failure. */
|
|
21
|
+
request(constraints: Constraints): Promise<MediaStreamLike>;
|
|
22
|
+
}
|
|
23
|
+
/** Lifecycle state of a managed media stream. */
|
|
24
|
+
type MediaStreamStatus = "idle" | "requesting" | "active" | "error";
|
|
25
|
+
/** Normalized reason why a stream could not be acquired. */
|
|
26
|
+
type MediaStreamErrorCode = "aborted" | "failed" | "invalid-constraints" | "not-found" | "not-readable" | "overconstrained" | "permission-denied" | "unsupported";
|
|
27
|
+
/** Stream acquisition failure. */
|
|
28
|
+
interface MediaStreamFailure {
|
|
29
|
+
/** Normalized reason. */
|
|
30
|
+
readonly code: MediaStreamErrorCode;
|
|
31
|
+
/** Exact error thrown by the source, when one was thrown. */
|
|
32
|
+
readonly cause: unknown;
|
|
33
|
+
}
|
|
34
|
+
/** Options for {@link useMediaStream}. */
|
|
35
|
+
interface UseMediaStreamOptions<Constraints> {
|
|
36
|
+
/** Reactive stream source; `null`/`undefined` means unsupported. */
|
|
37
|
+
readonly source: MaybeRefOrGetter<MediaStreamSource<Constraints> | null | undefined>;
|
|
38
|
+
/** Reactive constraints passed to the source. */
|
|
39
|
+
readonly constraints: MaybeRefOrGetter<Constraints>;
|
|
40
|
+
/**
|
|
41
|
+
* Start while `true`, stop while `false`.
|
|
42
|
+
*
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
readonly enabled?: MaybeRefOrGetter<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Restart an active stream when the constraints change.
|
|
48
|
+
*
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
readonly autoSwitch?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/** Reactive state and actions of a managed media stream. */
|
|
54
|
+
interface MediaStreamControls {
|
|
55
|
+
/** Whether a stream source is available. */
|
|
56
|
+
readonly supported: ComputedRef<boolean>;
|
|
57
|
+
/** The active stream, if any. */
|
|
58
|
+
readonly stream: Readonly<ShallowRef<MediaStreamLike | undefined>>;
|
|
59
|
+
/** Lifecycle state. */
|
|
60
|
+
readonly status: Readonly<Ref<MediaStreamStatus>>;
|
|
61
|
+
/** Most recent acquisition failure, cleared by the next request. */
|
|
62
|
+
readonly error: Readonly<ShallowRef<MediaStreamFailure | undefined>>;
|
|
63
|
+
/**
|
|
64
|
+
* Acquire a stream unless one is active. Overlapping calls resolve to the
|
|
65
|
+
* newest stream; superseded streams are stopped immediately.
|
|
66
|
+
*
|
|
67
|
+
* @returns The active stream, or `undefined` on failure or supersession.
|
|
68
|
+
*/
|
|
69
|
+
readonly start: () => Promise<MediaStreamLike | undefined>;
|
|
70
|
+
/** Stop every track and release the stream. Repeated calls are safe. */
|
|
71
|
+
readonly stop: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Stop and acquire a fresh stream with the current constraints.
|
|
74
|
+
*
|
|
75
|
+
* @returns The new stream, or `undefined` on failure or supersession.
|
|
76
|
+
*/
|
|
77
|
+
readonly restart: () => Promise<MediaStreamLike | undefined>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Manage the lifecycle of a media stream from any asynchronous source.
|
|
81
|
+
*
|
|
82
|
+
* This is the engine behind {@link useUserMedia} and `useDisplayMedia`, and
|
|
83
|
+
* can wrap any other stream producer (canvas capture, WebRTC). Acquisition
|
|
84
|
+
* failures are classified into {@link MediaStreamErrorCode}s; the stream
|
|
85
|
+
* returns to `"idle"` once all of its tracks ended (device unplugged, the
|
|
86
|
+
* user stopped screen sharing). Latest-wins: a stream that resolves after a
|
|
87
|
+
* newer request or a `stop` is stopped immediately. All tracks are stopped
|
|
88
|
+
* when the owning reactive scope stops.
|
|
89
|
+
*
|
|
90
|
+
* Server rendering: without a browser window a missing source keeps the
|
|
91
|
+
* status `"idle"` (no error), so server markup matches the first client
|
|
92
|
+
* render.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* const canvasStream = useMediaStream({
|
|
97
|
+
* source: { request: async (fps: number) => canvas.captureStream(fps) },
|
|
98
|
+
* constraints: 30,
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @typeParam Constraints Constraint type accepted by the source.
|
|
103
|
+
* @param options Source, constraints, and activation.
|
|
104
|
+
* @returns Stream state and actions.
|
|
105
|
+
*/
|
|
106
|
+
declare function useMediaStream<Constraints>(options: UseMediaStreamOptions<Constraints>): MediaStreamControls;
|
|
107
|
+
/** Minimal `MediaDeviceInfo`. */
|
|
108
|
+
interface MediaDeviceInfoLike {
|
|
109
|
+
/** Device identifier. */
|
|
110
|
+
readonly deviceId: string;
|
|
111
|
+
/** `"audioinput"`, `"audiooutput"`, or `"videoinput"`. */
|
|
112
|
+
readonly kind: string;
|
|
113
|
+
/** Human-readable label (empty until permission is granted). */
|
|
114
|
+
readonly label: string;
|
|
115
|
+
/** Identifier shared by devices of one physical unit. */
|
|
116
|
+
readonly groupId: string;
|
|
117
|
+
}
|
|
118
|
+
/** Minimal `MediaDevices` consumed by {@link useUserMedia}. */
|
|
119
|
+
interface UserMediaHost extends EventTarget {
|
|
120
|
+
/** Request camera/microphone access. */
|
|
121
|
+
getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStreamLike>;
|
|
122
|
+
/** List media devices. */
|
|
123
|
+
enumerateDevices?(): Promise<readonly MediaDeviceInfoLike[]>;
|
|
124
|
+
}
|
|
125
|
+
/** Options for {@link useUserMedia}. */
|
|
126
|
+
interface UseUserMediaOptions {
|
|
127
|
+
/**
|
|
128
|
+
* Reactive constraints for `getUserMedia`.
|
|
129
|
+
*
|
|
130
|
+
* @default { audio: true, video: true }
|
|
131
|
+
*/
|
|
132
|
+
readonly constraints?: MaybeRefOrGetter<MediaStreamConstraints>;
|
|
133
|
+
/**
|
|
134
|
+
* Start while `true`, stop while `false`.
|
|
135
|
+
*
|
|
136
|
+
* @default false
|
|
137
|
+
*/
|
|
138
|
+
readonly enabled?: MaybeRefOrGetter<boolean>;
|
|
139
|
+
/**
|
|
140
|
+
* Restart an active stream when the constraints change.
|
|
141
|
+
*
|
|
142
|
+
* @default true
|
|
143
|
+
*/
|
|
144
|
+
readonly autoSwitch?: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Keep `devices` current via `enumerateDevices` and `devicechange`.
|
|
147
|
+
*
|
|
148
|
+
* @default false
|
|
149
|
+
*/
|
|
150
|
+
readonly listDevices?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* `MediaDevices` capability for alternate runtimes and tests.
|
|
153
|
+
*
|
|
154
|
+
* @default window.navigator.mediaDevices
|
|
155
|
+
*/
|
|
156
|
+
readonly host?: MaybeRefOrGetter<UserMediaHost | null | undefined>;
|
|
157
|
+
}
|
|
158
|
+
/** Reactive state and actions returned by {@link useUserMedia}. */
|
|
159
|
+
interface UserMediaControls extends MediaStreamControls {
|
|
160
|
+
/** Media devices, populated when `listDevices` is enabled. */
|
|
161
|
+
readonly devices: Readonly<ShallowRef<readonly MediaDeviceInfoLike[]>>;
|
|
162
|
+
/**
|
|
163
|
+
* Re-enumerate media devices.
|
|
164
|
+
*
|
|
165
|
+
* @returns The device list, empty when unsupported or on failure.
|
|
166
|
+
*/
|
|
167
|
+
readonly refreshDevices: () => Promise<readonly MediaDeviceInfoLike[]>;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Access the camera and microphone with `getUserMedia`.
|
|
171
|
+
*
|
|
172
|
+
* Built on {@link useMediaStream}: reactive constraints (restarting an
|
|
173
|
+
* active stream when they change), `enabled` activation, classified
|
|
174
|
+
* failures such as `"permission-denied"`, and latest-wins requests. With
|
|
175
|
+
* `listDevices`, `devices` follows `devicechange`. Tracks and listeners are
|
|
176
|
+
* released when the owning reactive scope stops.
|
|
177
|
+
*
|
|
178
|
+
* Server rendering: no device is touched; `status` is `"idle"`, `stream` is
|
|
179
|
+
* undefined, and `supported` is false.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```ts
|
|
183
|
+
* const camera = useUserMedia({ constraints: { video: true, audio: false } });
|
|
184
|
+
* await camera.start();
|
|
185
|
+
* video.srcObject = camera.stream.value;
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* @param options Constraints, activation, device listing, and capability.
|
|
189
|
+
* @default options {}
|
|
190
|
+
* @returns Stream state, device list, and actions.
|
|
191
|
+
*/
|
|
192
|
+
declare function useUserMedia(options?: UseUserMediaOptions): UserMediaControls;
|
|
193
|
+
//#endregion
|
|
194
|
+
export { MediaDeviceInfoLike, MediaStreamControls, MediaStreamErrorCode, MediaStreamFailure, MediaStreamLike, MediaStreamSource, MediaStreamStatus, MediaStreamTrackLike, UseMediaStreamOptions, UseUserMediaOptions, UserMediaControls, UserMediaHost, useMediaStream, useUserMedia };
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
3
|
+
//#region src/use-user-media.ts
|
|
4
|
+
function errorName(error) {
|
|
5
|
+
return typeof error === "object" && error !== null && "name" in error ? String(error.name) : void 0;
|
|
6
|
+
}
|
|
7
|
+
function classify(error) {
|
|
8
|
+
switch (errorName(error)) {
|
|
9
|
+
case "NotAllowedError":
|
|
10
|
+
case "SecurityError": return "permission-denied";
|
|
11
|
+
case "NotFoundError": return "not-found";
|
|
12
|
+
case "NotReadableError": return "not-readable";
|
|
13
|
+
case "OverconstrainedError": return "overconstrained";
|
|
14
|
+
case "AbortError": return "aborted";
|
|
15
|
+
case "TypeError": return "invalid-constraints";
|
|
16
|
+
default: return "failed";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function stopTracks(stream) {
|
|
20
|
+
for (const track of stream.getTracks()) track.stop();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Manage the lifecycle of a media stream from any asynchronous source.
|
|
24
|
+
*
|
|
25
|
+
* This is the engine behind {@link useUserMedia} and `useDisplayMedia`, and
|
|
26
|
+
* can wrap any other stream producer (canvas capture, WebRTC). Acquisition
|
|
27
|
+
* failures are classified into {@link MediaStreamErrorCode}s; the stream
|
|
28
|
+
* returns to `"idle"` once all of its tracks ended (device unplugged, the
|
|
29
|
+
* user stopped screen sharing). Latest-wins: a stream that resolves after a
|
|
30
|
+
* newer request or a `stop` is stopped immediately. All tracks are stopped
|
|
31
|
+
* when the owning reactive scope stops.
|
|
32
|
+
*
|
|
33
|
+
* Server rendering: without a browser window a missing source keeps the
|
|
34
|
+
* status `"idle"` (no error), so server markup matches the first client
|
|
35
|
+
* render.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const canvasStream = useMediaStream({
|
|
40
|
+
* source: { request: async (fps: number) => canvas.captureStream(fps) },
|
|
41
|
+
* constraints: 30,
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @typeParam Constraints Constraint type accepted by the source.
|
|
46
|
+
* @param options Source, constraints, and activation.
|
|
47
|
+
* @returns Stream state and actions.
|
|
48
|
+
*/
|
|
49
|
+
function useMediaStream(options) {
|
|
50
|
+
const stream = shallowRef(void 0);
|
|
51
|
+
const status = ref("idle");
|
|
52
|
+
const error = shallowRef(void 0);
|
|
53
|
+
let generation = 0;
|
|
54
|
+
let detach;
|
|
55
|
+
const resolveSource = () => toValue(options.source) ?? void 0;
|
|
56
|
+
const stop = () => {
|
|
57
|
+
generation += 1;
|
|
58
|
+
detach?.();
|
|
59
|
+
detach = void 0;
|
|
60
|
+
const current = stream.value;
|
|
61
|
+
stream.value = void 0;
|
|
62
|
+
if (current) stopTracks(current);
|
|
63
|
+
status.value = "idle";
|
|
64
|
+
};
|
|
65
|
+
const attach = (next) => {
|
|
66
|
+
const tracks = next.getTracks();
|
|
67
|
+
const onEnded = () => {
|
|
68
|
+
if (stream.value === next && tracks.every((track) => track.readyState === "ended")) stop();
|
|
69
|
+
};
|
|
70
|
+
for (const track of tracks) track.addEventListener("ended", onEnded);
|
|
71
|
+
detach = () => {
|
|
72
|
+
for (const track of tracks) track.removeEventListener("ended", onEnded);
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
const start = async () => {
|
|
76
|
+
if (status.value === "active" && stream.value) return stream.value;
|
|
77
|
+
const current = ++generation;
|
|
78
|
+
const source = resolveSource();
|
|
79
|
+
if (!source) {
|
|
80
|
+
if (typeof window !== "undefined") {
|
|
81
|
+
error.value = {
|
|
82
|
+
code: "unsupported",
|
|
83
|
+
cause: void 0
|
|
84
|
+
};
|
|
85
|
+
status.value = "error";
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
error.value = void 0;
|
|
90
|
+
status.value = "requesting";
|
|
91
|
+
let next;
|
|
92
|
+
try {
|
|
93
|
+
next = await source.request(toValue(options.constraints));
|
|
94
|
+
} catch (cause) {
|
|
95
|
+
if (current === generation) {
|
|
96
|
+
error.value = {
|
|
97
|
+
code: classify(cause),
|
|
98
|
+
cause
|
|
99
|
+
};
|
|
100
|
+
status.value = "error";
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (current !== generation) {
|
|
105
|
+
stopTracks(next);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
detach?.();
|
|
109
|
+
const previous = stream.value;
|
|
110
|
+
if (previous && previous !== next) stopTracks(previous);
|
|
111
|
+
stream.value = next;
|
|
112
|
+
attach(next);
|
|
113
|
+
status.value = "active";
|
|
114
|
+
return next;
|
|
115
|
+
};
|
|
116
|
+
const restart = async () => {
|
|
117
|
+
stop();
|
|
118
|
+
return start();
|
|
119
|
+
};
|
|
120
|
+
watch(() => toValue(options.enabled) ?? false, (enabled) => {
|
|
121
|
+
if (enabled) start();
|
|
122
|
+
else if (status.value !== "idle") stop();
|
|
123
|
+
}, { immediate: true });
|
|
124
|
+
watch(() => toValue(options.constraints), () => {
|
|
125
|
+
if ((options.autoSwitch ?? true) && status.value === "active") restart();
|
|
126
|
+
}, { deep: true });
|
|
127
|
+
tryOnScopeDispose(stop);
|
|
128
|
+
return {
|
|
129
|
+
supported: computed(() => resolveSource() !== void 0),
|
|
130
|
+
stream,
|
|
131
|
+
status: readonly(status),
|
|
132
|
+
error,
|
|
133
|
+
start,
|
|
134
|
+
stop,
|
|
135
|
+
restart
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function browserUserMediaHost() {
|
|
139
|
+
if (typeof window === "undefined") return void 0;
|
|
140
|
+
return window.navigator.mediaDevices ?? void 0;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Access the camera and microphone with `getUserMedia`.
|
|
144
|
+
*
|
|
145
|
+
* Built on {@link useMediaStream}: reactive constraints (restarting an
|
|
146
|
+
* active stream when they change), `enabled` activation, classified
|
|
147
|
+
* failures such as `"permission-denied"`, and latest-wins requests. With
|
|
148
|
+
* `listDevices`, `devices` follows `devicechange`. Tracks and listeners are
|
|
149
|
+
* released when the owning reactive scope stops.
|
|
150
|
+
*
|
|
151
|
+
* Server rendering: no device is touched; `status` is `"idle"`, `stream` is
|
|
152
|
+
* undefined, and `supported` is false.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```ts
|
|
156
|
+
* const camera = useUserMedia({ constraints: { video: true, audio: false } });
|
|
157
|
+
* await camera.start();
|
|
158
|
+
* video.srcObject = camera.stream.value;
|
|
159
|
+
* ```
|
|
160
|
+
*
|
|
161
|
+
* @param options Constraints, activation, device listing, and capability.
|
|
162
|
+
* @default options {}
|
|
163
|
+
* @returns Stream state, device list, and actions.
|
|
164
|
+
*/
|
|
165
|
+
function useUserMedia(options = {}) {
|
|
166
|
+
const resolveHost = () => options.host === void 0 ? browserUserMediaHost() : toValue(options.host) ?? void 0;
|
|
167
|
+
const devices = shallowRef([]);
|
|
168
|
+
const controls = useMediaStream({
|
|
169
|
+
source: () => {
|
|
170
|
+
const host = resolveHost();
|
|
171
|
+
return host ? { request: (constraints) => host.getUserMedia(constraints) } : void 0;
|
|
172
|
+
},
|
|
173
|
+
constraints: () => toValue(options.constraints) ?? {
|
|
174
|
+
audio: true,
|
|
175
|
+
video: true
|
|
176
|
+
},
|
|
177
|
+
enabled: () => toValue(options.enabled) ?? false,
|
|
178
|
+
autoSwitch: options.autoSwitch ?? true
|
|
179
|
+
});
|
|
180
|
+
const refreshDevices = async () => {
|
|
181
|
+
const host = resolveHost();
|
|
182
|
+
if (!host?.enumerateDevices) return devices.value = [];
|
|
183
|
+
try {
|
|
184
|
+
devices.value = [...await host.enumerateDevices()];
|
|
185
|
+
} catch {
|
|
186
|
+
devices.value = [];
|
|
187
|
+
}
|
|
188
|
+
return devices.value;
|
|
189
|
+
};
|
|
190
|
+
if (options.listDevices ?? false) {
|
|
191
|
+
watch(resolveHost, (host, _previous, onCleanup) => {
|
|
192
|
+
if (!host) return;
|
|
193
|
+
const update = () => {
|
|
194
|
+
refreshDevices();
|
|
195
|
+
};
|
|
196
|
+
update();
|
|
197
|
+
host.addEventListener("devicechange", update);
|
|
198
|
+
onCleanup(() => host.removeEventListener("devicechange", update));
|
|
199
|
+
}, {
|
|
200
|
+
immediate: true,
|
|
201
|
+
flush: "sync"
|
|
202
|
+
});
|
|
203
|
+
watch(controls.status, (status) => {
|
|
204
|
+
if (status === "active") refreshDevices();
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
...controls,
|
|
209
|
+
devices,
|
|
210
|
+
refreshDevices
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//#endregion
|
|
214
|
+
export { useMediaStream, useUserMedia };
|