@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,422 @@
|
|
|
1
|
+
import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Minimal `MediaStreamTrack`. */
|
|
7
|
+
export interface MediaStreamTrackLike extends EventTarget {
|
|
8
|
+
/** `"audio"` or `"video"`. */
|
|
9
|
+
readonly kind: string;
|
|
10
|
+
|
|
11
|
+
/** `"live"` or `"ended"`. */
|
|
12
|
+
readonly readyState: string;
|
|
13
|
+
|
|
14
|
+
/** Stop the track and release its device. */
|
|
15
|
+
stop(): void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Minimal `MediaStream`. */
|
|
19
|
+
export interface MediaStreamLike {
|
|
20
|
+
/** Every track of the stream. */
|
|
21
|
+
getTracks(): readonly MediaStreamTrackLike[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Anything that can asynchronously produce a media stream. */
|
|
25
|
+
export interface MediaStreamSource<Constraints> {
|
|
26
|
+
/** Acquire a stream; rejects with a DOMException on failure. */
|
|
27
|
+
request(constraints: Constraints): Promise<MediaStreamLike>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Lifecycle state of a managed media stream. */
|
|
31
|
+
export type MediaStreamStatus = "idle" | "requesting" | "active" | "error";
|
|
32
|
+
|
|
33
|
+
/** Normalized reason why a stream could not be acquired. */
|
|
34
|
+
export type MediaStreamErrorCode =
|
|
35
|
+
| "aborted"
|
|
36
|
+
| "failed"
|
|
37
|
+
| "invalid-constraints"
|
|
38
|
+
| "not-found"
|
|
39
|
+
| "not-readable"
|
|
40
|
+
| "overconstrained"
|
|
41
|
+
| "permission-denied"
|
|
42
|
+
| "unsupported";
|
|
43
|
+
|
|
44
|
+
/** Stream acquisition failure. */
|
|
45
|
+
export interface MediaStreamFailure {
|
|
46
|
+
/** Normalized reason. */
|
|
47
|
+
readonly code: MediaStreamErrorCode;
|
|
48
|
+
|
|
49
|
+
/** Exact error thrown by the source, when one was thrown. */
|
|
50
|
+
readonly cause: unknown;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Options for {@link useMediaStream}. */
|
|
54
|
+
export interface UseMediaStreamOptions<Constraints> {
|
|
55
|
+
/** Reactive stream source; `null`/`undefined` means unsupported. */
|
|
56
|
+
readonly source: MaybeRefOrGetter<MediaStreamSource<Constraints> | null | undefined>;
|
|
57
|
+
|
|
58
|
+
/** Reactive constraints passed to the source. */
|
|
59
|
+
readonly constraints: MaybeRefOrGetter<Constraints>;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Start while `true`, stop while `false`.
|
|
63
|
+
*
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
readonly enabled?: MaybeRefOrGetter<boolean>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Restart an active stream when the constraints change.
|
|
70
|
+
*
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
readonly autoSwitch?: boolean;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Reactive state and actions of a managed media stream. */
|
|
77
|
+
export interface MediaStreamControls {
|
|
78
|
+
/** Whether a stream source is available. */
|
|
79
|
+
readonly supported: ComputedRef<boolean>;
|
|
80
|
+
|
|
81
|
+
/** The active stream, if any. */
|
|
82
|
+
readonly stream: Readonly<ShallowRef<MediaStreamLike | undefined>>;
|
|
83
|
+
|
|
84
|
+
/** Lifecycle state. */
|
|
85
|
+
readonly status: Readonly<Ref<MediaStreamStatus>>;
|
|
86
|
+
|
|
87
|
+
/** Most recent acquisition failure, cleared by the next request. */
|
|
88
|
+
readonly error: Readonly<ShallowRef<MediaStreamFailure | undefined>>;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Acquire a stream unless one is active. Overlapping calls resolve to the
|
|
92
|
+
* newest stream; superseded streams are stopped immediately.
|
|
93
|
+
*
|
|
94
|
+
* @returns The active stream, or `undefined` on failure or supersession.
|
|
95
|
+
*/
|
|
96
|
+
readonly start: () => Promise<MediaStreamLike | undefined>;
|
|
97
|
+
|
|
98
|
+
/** Stop every track and release the stream. Repeated calls are safe. */
|
|
99
|
+
readonly stop: () => void;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Stop and acquire a fresh stream with the current constraints.
|
|
103
|
+
*
|
|
104
|
+
* @returns The new stream, or `undefined` on failure or supersession.
|
|
105
|
+
*/
|
|
106
|
+
readonly restart: () => Promise<MediaStreamLike | undefined>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function errorName(error: unknown): string | undefined {
|
|
110
|
+
return typeof error === "object" && error !== null && "name" in error
|
|
111
|
+
? String(error.name)
|
|
112
|
+
: undefined;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function classify(error: unknown): MediaStreamErrorCode {
|
|
116
|
+
switch (errorName(error)) {
|
|
117
|
+
case "NotAllowedError":
|
|
118
|
+
case "SecurityError":
|
|
119
|
+
return "permission-denied";
|
|
120
|
+
case "NotFoundError":
|
|
121
|
+
return "not-found";
|
|
122
|
+
case "NotReadableError":
|
|
123
|
+
return "not-readable";
|
|
124
|
+
case "OverconstrainedError":
|
|
125
|
+
return "overconstrained";
|
|
126
|
+
case "AbortError":
|
|
127
|
+
return "aborted";
|
|
128
|
+
case "TypeError":
|
|
129
|
+
return "invalid-constraints";
|
|
130
|
+
default:
|
|
131
|
+
return "failed";
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function stopTracks(stream: MediaStreamLike): void {
|
|
136
|
+
for (const track of stream.getTracks()) track.stop();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Manage the lifecycle of a media stream from any asynchronous source.
|
|
141
|
+
*
|
|
142
|
+
* This is the engine behind {@link useUserMedia} and `useDisplayMedia`, and
|
|
143
|
+
* can wrap any other stream producer (canvas capture, WebRTC). Acquisition
|
|
144
|
+
* failures are classified into {@link MediaStreamErrorCode}s; the stream
|
|
145
|
+
* returns to `"idle"` once all of its tracks ended (device unplugged, the
|
|
146
|
+
* user stopped screen sharing). Latest-wins: a stream that resolves after a
|
|
147
|
+
* newer request or a `stop` is stopped immediately. All tracks are stopped
|
|
148
|
+
* when the owning reactive scope stops.
|
|
149
|
+
*
|
|
150
|
+
* Server rendering: without a browser window a missing source keeps the
|
|
151
|
+
* status `"idle"` (no error), so server markup matches the first client
|
|
152
|
+
* render.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```ts
|
|
156
|
+
* const canvasStream = useMediaStream({
|
|
157
|
+
* source: { request: async (fps: number) => canvas.captureStream(fps) },
|
|
158
|
+
* constraints: 30,
|
|
159
|
+
* });
|
|
160
|
+
* ```
|
|
161
|
+
*
|
|
162
|
+
* @typeParam Constraints Constraint type accepted by the source.
|
|
163
|
+
* @param options Source, constraints, and activation.
|
|
164
|
+
* @returns Stream state and actions.
|
|
165
|
+
*/
|
|
166
|
+
export function useMediaStream<Constraints>(
|
|
167
|
+
options: UseMediaStreamOptions<Constraints>,
|
|
168
|
+
): MediaStreamControls {
|
|
169
|
+
const stream = shallowRef<MediaStreamLike | undefined>(undefined);
|
|
170
|
+
const status = ref<MediaStreamStatus>("idle");
|
|
171
|
+
const error = shallowRef<MediaStreamFailure | undefined>(undefined);
|
|
172
|
+
let generation = 0;
|
|
173
|
+
let detach: (() => void) | undefined;
|
|
174
|
+
|
|
175
|
+
const resolveSource = (): MediaStreamSource<Constraints> | undefined =>
|
|
176
|
+
toValue(options.source) ?? undefined;
|
|
177
|
+
|
|
178
|
+
const stop = (): void => {
|
|
179
|
+
generation += 1;
|
|
180
|
+
detach?.();
|
|
181
|
+
detach = undefined;
|
|
182
|
+
const current = stream.value;
|
|
183
|
+
stream.value = undefined;
|
|
184
|
+
if (current) stopTracks(current);
|
|
185
|
+
status.value = "idle";
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const attach = (next: MediaStreamLike): void => {
|
|
189
|
+
const tracks = next.getTracks();
|
|
190
|
+
const onEnded = (): void => {
|
|
191
|
+
if (stream.value === next && tracks.every((track) => track.readyState === "ended")) stop();
|
|
192
|
+
};
|
|
193
|
+
for (const track of tracks) track.addEventListener("ended", onEnded);
|
|
194
|
+
detach = () => {
|
|
195
|
+
for (const track of tracks) track.removeEventListener("ended", onEnded);
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const start = async (): Promise<MediaStreamLike | undefined> => {
|
|
200
|
+
if (status.value === "active" && stream.value) return stream.value;
|
|
201
|
+
const current = ++generation;
|
|
202
|
+
const source = resolveSource();
|
|
203
|
+
if (!source) {
|
|
204
|
+
if (typeof window !== "undefined") {
|
|
205
|
+
error.value = { code: "unsupported", cause: undefined };
|
|
206
|
+
status.value = "error";
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
error.value = undefined;
|
|
211
|
+
status.value = "requesting";
|
|
212
|
+
let next: MediaStreamLike;
|
|
213
|
+
try {
|
|
214
|
+
next = await source.request(toValue(options.constraints));
|
|
215
|
+
} catch (cause) {
|
|
216
|
+
if (current === generation) {
|
|
217
|
+
error.value = { code: classify(cause), cause };
|
|
218
|
+
status.value = "error";
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
if (current !== generation) {
|
|
223
|
+
stopTracks(next);
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
detach?.();
|
|
227
|
+
const previous = stream.value;
|
|
228
|
+
if (previous && previous !== next) stopTracks(previous);
|
|
229
|
+
stream.value = next;
|
|
230
|
+
attach(next);
|
|
231
|
+
status.value = "active";
|
|
232
|
+
return next;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
const restart = async (): Promise<MediaStreamLike | undefined> => {
|
|
236
|
+
stop();
|
|
237
|
+
return start();
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
watch(
|
|
241
|
+
() => toValue(options.enabled) ?? false,
|
|
242
|
+
(enabled) => {
|
|
243
|
+
if (enabled) void start();
|
|
244
|
+
else if (status.value !== "idle") stop();
|
|
245
|
+
},
|
|
246
|
+
{ immediate: true },
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
watch(
|
|
250
|
+
() => toValue(options.constraints),
|
|
251
|
+
() => {
|
|
252
|
+
if ((options.autoSwitch ?? true) && status.value === "active") void restart();
|
|
253
|
+
},
|
|
254
|
+
{ deep: true },
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
tryOnScopeDispose(stop);
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
supported: computed(() => resolveSource() !== undefined),
|
|
261
|
+
stream,
|
|
262
|
+
status: readonly(status),
|
|
263
|
+
error,
|
|
264
|
+
start,
|
|
265
|
+
stop,
|
|
266
|
+
restart,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Minimal `MediaDeviceInfo`. */
|
|
271
|
+
export interface MediaDeviceInfoLike {
|
|
272
|
+
/** Device identifier. */
|
|
273
|
+
readonly deviceId: string;
|
|
274
|
+
|
|
275
|
+
/** `"audioinput"`, `"audiooutput"`, or `"videoinput"`. */
|
|
276
|
+
readonly kind: string;
|
|
277
|
+
|
|
278
|
+
/** Human-readable label (empty until permission is granted). */
|
|
279
|
+
readonly label: string;
|
|
280
|
+
|
|
281
|
+
/** Identifier shared by devices of one physical unit. */
|
|
282
|
+
readonly groupId: string;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Minimal `MediaDevices` consumed by {@link useUserMedia}. */
|
|
286
|
+
export interface UserMediaHost extends EventTarget {
|
|
287
|
+
/** Request camera/microphone access. */
|
|
288
|
+
getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStreamLike>;
|
|
289
|
+
|
|
290
|
+
/** List media devices. */
|
|
291
|
+
enumerateDevices?(): Promise<readonly MediaDeviceInfoLike[]>;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Options for {@link useUserMedia}. */
|
|
295
|
+
export interface UseUserMediaOptions {
|
|
296
|
+
/**
|
|
297
|
+
* Reactive constraints for `getUserMedia`.
|
|
298
|
+
*
|
|
299
|
+
* @default { audio: true, video: true }
|
|
300
|
+
*/
|
|
301
|
+
readonly constraints?: MaybeRefOrGetter<MediaStreamConstraints>;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Start while `true`, stop while `false`.
|
|
305
|
+
*
|
|
306
|
+
* @default false
|
|
307
|
+
*/
|
|
308
|
+
readonly enabled?: MaybeRefOrGetter<boolean>;
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Restart an active stream when the constraints change.
|
|
312
|
+
*
|
|
313
|
+
* @default true
|
|
314
|
+
*/
|
|
315
|
+
readonly autoSwitch?: boolean;
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Keep `devices` current via `enumerateDevices` and `devicechange`.
|
|
319
|
+
*
|
|
320
|
+
* @default false
|
|
321
|
+
*/
|
|
322
|
+
readonly listDevices?: boolean;
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* `MediaDevices` capability for alternate runtimes and tests.
|
|
326
|
+
*
|
|
327
|
+
* @default window.navigator.mediaDevices
|
|
328
|
+
*/
|
|
329
|
+
readonly host?: MaybeRefOrGetter<UserMediaHost | null | undefined>;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** Reactive state and actions returned by {@link useUserMedia}. */
|
|
333
|
+
export interface UserMediaControls extends MediaStreamControls {
|
|
334
|
+
/** Media devices, populated when `listDevices` is enabled. */
|
|
335
|
+
readonly devices: Readonly<ShallowRef<readonly MediaDeviceInfoLike[]>>;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Re-enumerate media devices.
|
|
339
|
+
*
|
|
340
|
+
* @returns The device list, empty when unsupported or on failure.
|
|
341
|
+
*/
|
|
342
|
+
readonly refreshDevices: () => Promise<readonly MediaDeviceInfoLike[]>;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function browserUserMediaHost(): UserMediaHost | undefined {
|
|
346
|
+
if (typeof window === "undefined") return undefined;
|
|
347
|
+
// `mediaDevices` is undefined in insecure contexts despite its DOM typing.
|
|
348
|
+
const devices: MediaDevices | undefined = window.navigator.mediaDevices;
|
|
349
|
+
return devices ?? undefined;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Access the camera and microphone with `getUserMedia`.
|
|
354
|
+
*
|
|
355
|
+
* Built on {@link useMediaStream}: reactive constraints (restarting an
|
|
356
|
+
* active stream when they change), `enabled` activation, classified
|
|
357
|
+
* failures such as `"permission-denied"`, and latest-wins requests. With
|
|
358
|
+
* `listDevices`, `devices` follows `devicechange`. Tracks and listeners are
|
|
359
|
+
* released when the owning reactive scope stops.
|
|
360
|
+
*
|
|
361
|
+
* Server rendering: no device is touched; `status` is `"idle"`, `stream` is
|
|
362
|
+
* undefined, and `supported` is false.
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```ts
|
|
366
|
+
* const camera = useUserMedia({ constraints: { video: true, audio: false } });
|
|
367
|
+
* await camera.start();
|
|
368
|
+
* video.srcObject = camera.stream.value;
|
|
369
|
+
* ```
|
|
370
|
+
*
|
|
371
|
+
* @param options Constraints, activation, device listing, and capability.
|
|
372
|
+
* @default options {}
|
|
373
|
+
* @returns Stream state, device list, and actions.
|
|
374
|
+
*/
|
|
375
|
+
export function useUserMedia(options: UseUserMediaOptions = {}): UserMediaControls {
|
|
376
|
+
const resolveHost = (): UserMediaHost | undefined =>
|
|
377
|
+
options.host === undefined ? browserUserMediaHost() : (toValue(options.host) ?? undefined);
|
|
378
|
+
const devices = shallowRef<readonly MediaDeviceInfoLike[]>([]);
|
|
379
|
+
|
|
380
|
+
const controls = useMediaStream<MediaStreamConstraints>({
|
|
381
|
+
source: () => {
|
|
382
|
+
const host = resolveHost();
|
|
383
|
+
return host ? { request: (constraints) => host.getUserMedia(constraints) } : undefined;
|
|
384
|
+
},
|
|
385
|
+
constraints: () => toValue(options.constraints) ?? { audio: true, video: true },
|
|
386
|
+
enabled: () => toValue(options.enabled) ?? false,
|
|
387
|
+
autoSwitch: options.autoSwitch ?? true,
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
const refreshDevices = async (): Promise<readonly MediaDeviceInfoLike[]> => {
|
|
391
|
+
const host = resolveHost();
|
|
392
|
+
if (!host?.enumerateDevices) return (devices.value = []);
|
|
393
|
+
try {
|
|
394
|
+
devices.value = [...(await host.enumerateDevices())];
|
|
395
|
+
} catch {
|
|
396
|
+
devices.value = [];
|
|
397
|
+
}
|
|
398
|
+
return devices.value;
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
if (options.listDevices ?? false) {
|
|
402
|
+
watch(
|
|
403
|
+
resolveHost,
|
|
404
|
+
(host, _previous, onCleanup) => {
|
|
405
|
+
if (!host) return;
|
|
406
|
+
const update = (): void => {
|
|
407
|
+
void refreshDevices();
|
|
408
|
+
};
|
|
409
|
+
update();
|
|
410
|
+
host.addEventListener("devicechange", update);
|
|
411
|
+
onCleanup(() => host.removeEventListener("devicechange", update));
|
|
412
|
+
},
|
|
413
|
+
{ immediate: true, flush: "sync" },
|
|
414
|
+
);
|
|
415
|
+
// Labels become available once a stream was granted.
|
|
416
|
+
watch(controls.status, (status) => {
|
|
417
|
+
if (status === "active") void refreshDevices();
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return { ...controls, devices, refreshDevices };
|
|
422
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { computed, ref, shallowRef, toRaw, watch } from "vue";
|
|
2
|
+
import type { Ref, WritableComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Emit function able to send `event` with a value of type `Value`. */
|
|
5
|
+
export type VModelEmit<Event extends string, Value> = (event: Event, value: Value) => void;
|
|
6
|
+
|
|
7
|
+
/** Options for {@link useVModel}. */
|
|
8
|
+
export interface UseVModelOptions<
|
|
9
|
+
Value,
|
|
10
|
+
Event extends string = string,
|
|
11
|
+
Default extends Exclude<Value, undefined> | undefined = Exclude<Value, undefined>,
|
|
12
|
+
> {
|
|
13
|
+
/**
|
|
14
|
+
* Keep a local copy that works even when the parent does not bind
|
|
15
|
+
* `v-model`: writes update the copy and emit, prop changes overwrite it.
|
|
16
|
+
*
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
readonly passive?: boolean;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Event name to emit.
|
|
23
|
+
*
|
|
24
|
+
* @default `update:${key}`
|
|
25
|
+
*/
|
|
26
|
+
readonly eventName?: Event;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* In passive mode, store the local copy deeply reactive and also emit on
|
|
30
|
+
* nested mutations of it.
|
|
31
|
+
*
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
readonly deep?: boolean;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Value read while the prop is `undefined`.
|
|
38
|
+
*
|
|
39
|
+
* @default undefined
|
|
40
|
+
*/
|
|
41
|
+
readonly defaultValue?: Default;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* In passive mode, copy prop values before storing them locally so local
|
|
45
|
+
* mutations never touch the parent's object: `true` uses
|
|
46
|
+
* `structuredClone` on the raw (unproxied) value, a function is used as
|
|
47
|
+
* the cloner.
|
|
48
|
+
*
|
|
49
|
+
* @default false
|
|
50
|
+
*/
|
|
51
|
+
readonly clone?: boolean | ((value: Value) => Value);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Veto emitting a value.
|
|
55
|
+
*
|
|
56
|
+
* @default undefined (always emit)
|
|
57
|
+
*/
|
|
58
|
+
readonly shouldEmit?: (value: Value) => boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Model value type: `undefined` is removed when a default is configured. */
|
|
62
|
+
export type VModelValue<Value, Default> = [Default] extends [undefined]
|
|
63
|
+
? Value
|
|
64
|
+
: Exclude<Value, undefined>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Two-way binding helper for a component prop.
|
|
68
|
+
*
|
|
69
|
+
* Reads the prop and emits `update:<key>` (or `eventName`) on write, typed
|
|
70
|
+
* end to end: the key must be a prop, the emitted value has the prop's type,
|
|
71
|
+
* and `emit` must accept that exact event (a `defineEmits` result with the
|
|
72
|
+
* matching overload qualifies). With `passive: true` a local ref mirrors the
|
|
73
|
+
* prop so the component also works uncontrolled. Relies only on the props
|
|
74
|
+
* and emit you pass (no component internals), so it is SSR- and
|
|
75
|
+
* Vapor-friendly; the passive watchers follow the owning scope.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const props = defineProps<{ modelValue: string }>();
|
|
80
|
+
* const emit = defineEmits<{ "update:modelValue": [value: string] }>();
|
|
81
|
+
* const model = useVModel(props, "modelValue", emit);
|
|
82
|
+
* model.value = "next"; // emits update:modelValue
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @param props Component props object.
|
|
86
|
+
* @param key Prop to bind.
|
|
87
|
+
* @param emit Component emit function.
|
|
88
|
+
* @param options Passive mode, event name, default, clone, and emit guard.
|
|
89
|
+
* @default options {}
|
|
90
|
+
* @returns A writable ref over the prop.
|
|
91
|
+
*/
|
|
92
|
+
export function useVModel<
|
|
93
|
+
Props extends object,
|
|
94
|
+
Key extends keyof Props & string,
|
|
95
|
+
Event extends string = `update:${Key}`,
|
|
96
|
+
Default extends Exclude<Props[Key], undefined> | undefined = undefined,
|
|
97
|
+
>(
|
|
98
|
+
props: Props,
|
|
99
|
+
key: Key,
|
|
100
|
+
emit: VModelEmit<NoInfer<Event>, NoInfer<Props[Key]>>,
|
|
101
|
+
options?: UseVModelOptions<Props[Key], Event, Default>,
|
|
102
|
+
): Ref<VModelValue<Props[Key], Default>>;
|
|
103
|
+
export function useVModel(
|
|
104
|
+
props: Readonly<Record<string, unknown>>,
|
|
105
|
+
key: string,
|
|
106
|
+
emit: VModelEmit<string, unknown>,
|
|
107
|
+
options: UseVModelOptions<unknown, string, unknown> = {},
|
|
108
|
+
): Ref<unknown> | WritableComputedRef<unknown> {
|
|
109
|
+
const event = options.eventName ?? `update:${key}`;
|
|
110
|
+
const read = (): unknown => props[key] ?? options.defaultValue;
|
|
111
|
+
const send = (value: unknown): void => {
|
|
112
|
+
if (options.shouldEmit?.(value) ?? true) emit(event, value);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (!(options.passive ?? false)) {
|
|
116
|
+
return computed({ get: read, set: send });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const clone =
|
|
120
|
+
options.clone === true
|
|
121
|
+
? (value: unknown): unknown => structuredClone(toRaw(value))
|
|
122
|
+
: typeof options.clone === "function"
|
|
123
|
+
? options.clone
|
|
124
|
+
: (value: unknown): unknown => value;
|
|
125
|
+
const deep = options.deep ?? false;
|
|
126
|
+
const local: Ref<unknown> = deep ? ref(clone(read())) : shallowRef(clone(read()));
|
|
127
|
+
let fromProp = false;
|
|
128
|
+
|
|
129
|
+
watch(read, (value) => {
|
|
130
|
+
fromProp = true;
|
|
131
|
+
local.value = clone(value);
|
|
132
|
+
fromProp = false;
|
|
133
|
+
});
|
|
134
|
+
watch(
|
|
135
|
+
local,
|
|
136
|
+
(value) => {
|
|
137
|
+
if (!fromProp && (deep || value !== props[key])) send(value);
|
|
138
|
+
},
|
|
139
|
+
{ deep, flush: "sync" },
|
|
140
|
+
);
|
|
141
|
+
return local;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Options for {@link useVModels}. */
|
|
145
|
+
export interface UseVModelsOptions<Key extends string> extends Omit<
|
|
146
|
+
UseVModelOptions<unknown>,
|
|
147
|
+
"eventName" | "defaultValue" | "shouldEmit" | "clone"
|
|
148
|
+
> {
|
|
149
|
+
/**
|
|
150
|
+
* Props to bind. Defaults to every prop, which then requires an
|
|
151
|
+
* `update:<prop>` emit for each of them.
|
|
152
|
+
*
|
|
153
|
+
* @default all prop keys
|
|
154
|
+
*/
|
|
155
|
+
readonly keys?: readonly Key[];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Turn a union into the intersection of its members. */
|
|
159
|
+
type UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (
|
|
160
|
+
value: infer Intersection,
|
|
161
|
+
) => void
|
|
162
|
+
? Intersection
|
|
163
|
+
: never;
|
|
164
|
+
|
|
165
|
+
/** Emit overloads required by {@link useVModels} for the bound keys. */
|
|
166
|
+
export type VModelsEmit<Props, Key extends keyof Props & string> = UnionToIntersection<
|
|
167
|
+
{ [Name in Key]: VModelEmit<`update:${Name}`, Props[Name]> }[Key]
|
|
168
|
+
>;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* {@link useVModel} for several props at once.
|
|
172
|
+
*
|
|
173
|
+
* Returns one writable ref per bound prop, each emitting its own
|
|
174
|
+
* `update:<prop>` event. `emit` must declare an update event for every bound
|
|
175
|
+
* key; restrict the set with `keys`.
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* const { open, value } = useVModels(props, emit, { keys: ["open", "value"] });
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* @param props Component props object.
|
|
183
|
+
* @param emit Component emit function.
|
|
184
|
+
* @param options Passive mode, depth, and the keys to bind.
|
|
185
|
+
* @default options {}
|
|
186
|
+
* @returns One writable ref per bound prop.
|
|
187
|
+
*/
|
|
188
|
+
export function useVModels<
|
|
189
|
+
Props extends object,
|
|
190
|
+
const Key extends keyof Props & string = keyof Props & string,
|
|
191
|
+
>(
|
|
192
|
+
props: Props,
|
|
193
|
+
emit: NoInfer<VModelsEmit<Props, Key>>,
|
|
194
|
+
options?: UseVModelsOptions<Key>,
|
|
195
|
+
): { readonly [Name in Key]: Ref<Props[Name]> };
|
|
196
|
+
export function useVModels(
|
|
197
|
+
props: Readonly<Record<string, unknown>>,
|
|
198
|
+
emit: VModelEmit<`update:${string}`, unknown>,
|
|
199
|
+
options: UseVModelsOptions<string> = {},
|
|
200
|
+
): { readonly [key: string]: Ref<unknown> } {
|
|
201
|
+
const keys = options.keys ?? Object.keys(props);
|
|
202
|
+
const models: Record<string, Ref<unknown> | WritableComputedRef<unknown>> = {};
|
|
203
|
+
for (const key of keys) {
|
|
204
|
+
models[key] = useVModel(props, key, emit, {
|
|
205
|
+
...(options.passive === undefined ? {} : { passive: options.passive }),
|
|
206
|
+
...(options.deep === undefined ? {} : { deep: options.deep }),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return models;
|
|
210
|
+
}
|