@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,78 @@
|
|
|
1
|
+
import { computed, shallowRef } from "vue";
|
|
2
|
+
//#region src/use-machine.ts
|
|
3
|
+
/** Shallow ref typed through an unconstrained parameter, so literal unions stay intact. */
|
|
4
|
+
function ownedRef(value) {
|
|
5
|
+
return shallowRef(value);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Finite state machine with typed states, events, and targets.
|
|
9
|
+
*
|
|
10
|
+
* State names are inferred from the keys of `states`, event names from the
|
|
11
|
+
* keys of every `on` map, and every `target` (and `initial`) must name a
|
|
12
|
+
* declared state, so typos fail to compile. Transitions may carry guards
|
|
13
|
+
* (first passing guard wins) and actions that return the next context;
|
|
14
|
+
* `exit` runs on the old state before `entry` runs on the new one, and a
|
|
15
|
+
* self-transition runs both. Synchronous and free of globals: identical on
|
|
16
|
+
* server and client, nothing to dispose.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const fetcher = useMachine({
|
|
21
|
+
* initial: "idle",
|
|
22
|
+
* context: { retries: 0 },
|
|
23
|
+
* states: {
|
|
24
|
+
* idle: { on: { FETCH: "loading" } },
|
|
25
|
+
* loading: { on: { RESOLVE: "success", REJECT: "failure" } },
|
|
26
|
+
* failure: {
|
|
27
|
+
* on: {
|
|
28
|
+
* RETRY: { target: "loading", guard: (c) => c.retries < 3, action: (c) => ({ retries: c.retries + 1 }) },
|
|
29
|
+
* },
|
|
30
|
+
* },
|
|
31
|
+
* success: {},
|
|
32
|
+
* },
|
|
33
|
+
* });
|
|
34
|
+
* fetcher.send("FETCH");
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @param config States, events, context, and hooks.
|
|
38
|
+
* @returns The reactive machine.
|
|
39
|
+
*/
|
|
40
|
+
function useMachine(config) {
|
|
41
|
+
const state = ownedRef(config.initial);
|
|
42
|
+
const context = ownedRef(config.context);
|
|
43
|
+
const isTarget = (option) => typeof option === "string";
|
|
44
|
+
const resolve = (event) => {
|
|
45
|
+
const option = config.states[state.value].on?.[event];
|
|
46
|
+
if (option === void 0) return void 0;
|
|
47
|
+
if (isTarget(option)) return { target: option };
|
|
48
|
+
return (Array.isArray(option) ? option : [option]).find((candidate) => candidate.guard?.(context.value) ?? true);
|
|
49
|
+
};
|
|
50
|
+
const send = (event) => {
|
|
51
|
+
const transition = resolve(event);
|
|
52
|
+
if (transition === void 0) return false;
|
|
53
|
+
config.states[state.value].exit?.(context.value);
|
|
54
|
+
if (transition.action !== void 0) context.value = transition.action(context.value);
|
|
55
|
+
state.value = transition.target;
|
|
56
|
+
config.states[transition.target].entry?.(context.value);
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
const can = (event) => resolve(event) !== void 0;
|
|
60
|
+
return {
|
|
61
|
+
state,
|
|
62
|
+
context,
|
|
63
|
+
nextEvents: computed(() => {
|
|
64
|
+
const on = config.states[state.value].on ?? {};
|
|
65
|
+
const isEvent = (name) => name in on;
|
|
66
|
+
return Object.keys(on).filter(isEvent).filter(can);
|
|
67
|
+
}),
|
|
68
|
+
send,
|
|
69
|
+
can,
|
|
70
|
+
matches: (...states) => states.some((candidate) => candidate === state.value),
|
|
71
|
+
reset: () => {
|
|
72
|
+
state.value = config.initial;
|
|
73
|
+
context.value = config.context;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { useMachine };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ComputedRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-map.d.ts
|
|
4
|
+
/** Reactive map wrapper returned by {@link useMap}. */
|
|
5
|
+
interface MapControls<Key, Value> {
|
|
6
|
+
/**
|
|
7
|
+
* Read-only reactive view of the map. `get`, `has`, iteration, and `size`
|
|
8
|
+
* on this view are tracked per key. Values are stored shallowly.
|
|
9
|
+
*/
|
|
10
|
+
readonly map: ReadonlyMap<Key, Value>;
|
|
11
|
+
/** Number of entries. */
|
|
12
|
+
readonly size: ComputedRef<number>;
|
|
13
|
+
/** Snapshot of the entries in insertion order. */
|
|
14
|
+
readonly entries: ComputedRef<readonly (readonly [Key, Value])[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Read the value for `key`. Reactive when read inside an effect.
|
|
17
|
+
*
|
|
18
|
+
* @param key Key to read.
|
|
19
|
+
* @returns The value, or `undefined` when absent.
|
|
20
|
+
*/
|
|
21
|
+
readonly get: (key: Key) => Value | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Whether `key` is present. Reactive when read inside an effect.
|
|
24
|
+
*
|
|
25
|
+
* @param key Key to test.
|
|
26
|
+
* @returns Whether the key exists.
|
|
27
|
+
*/
|
|
28
|
+
readonly has: (key: Key) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Store `value` under `key`.
|
|
31
|
+
*
|
|
32
|
+
* @param key Key to write.
|
|
33
|
+
* @param value Value to store.
|
|
34
|
+
*/
|
|
35
|
+
readonly set: (key: Key, value: Value) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove `key`.
|
|
38
|
+
*
|
|
39
|
+
* @param key Key to remove.
|
|
40
|
+
* @returns Whether an entry was removed.
|
|
41
|
+
*/
|
|
42
|
+
readonly delete: (key: Key) => boolean;
|
|
43
|
+
/** Remove every entry. */
|
|
44
|
+
readonly clear: () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Replace the value under `key` with the result of `updater`.
|
|
47
|
+
*
|
|
48
|
+
* @param key Key to update.
|
|
49
|
+
* @param updater Receives the current value (`undefined` when absent).
|
|
50
|
+
* @returns The stored value.
|
|
51
|
+
*/
|
|
52
|
+
readonly update: (key: Key, updater: (previous: Value | undefined) => Value) => Value;
|
|
53
|
+
/**
|
|
54
|
+
* Return the value under `key`, inserting `create(key)` first when absent.
|
|
55
|
+
*
|
|
56
|
+
* @param key Key to read or insert.
|
|
57
|
+
* @param create Factory for a missing value.
|
|
58
|
+
* @returns The existing or inserted value.
|
|
59
|
+
*/
|
|
60
|
+
readonly getOrInsert: (key: Key, create: (key: Key) => Value) => Value;
|
|
61
|
+
/** Restore the creation-time entries. */
|
|
62
|
+
readonly reset: () => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a reactive `Map` with typed helpers.
|
|
66
|
+
*
|
|
67
|
+
* Key and value types are inferred from the initial entries
|
|
68
|
+
* (`useMap([["a", 1]])` is a `Map<string, number>`); pass type arguments
|
|
69
|
+
* for an initially empty map. Reads through `get`, `has`, and `map` are
|
|
70
|
+
* tracked per key, so an effect reading one key does not re-run when an
|
|
71
|
+
* unrelated key changes. Values are stored as-is (not deeply reactive).
|
|
72
|
+
*
|
|
73
|
+
* Purely synchronous state: safe during server rendering (no host globals,
|
|
74
|
+
* no timers) and nothing to dispose.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const counts = useMap<string, number>();
|
|
79
|
+
* counts.update("clicks", (previous = 0) => previous + 1);
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @typeParam Key Key type, inferred from `initial`.
|
|
83
|
+
* @typeParam Value Value type, inferred from `initial`.
|
|
84
|
+
* @param initial Entries inserted at creation and restored by `reset`.
|
|
85
|
+
* @default initial []
|
|
86
|
+
* @returns The reactive map and its helpers.
|
|
87
|
+
*/
|
|
88
|
+
declare function useMap<Key = unknown, Value = unknown>(initial?: Iterable<readonly [Key, Value]>): MapControls<Key, Value>;
|
|
89
|
+
//#endregion
|
|
90
|
+
export { MapControls, useMap };
|
package/dist/use-map.mjs
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { computed, shallowReactive, shallowReadonly } from "vue";
|
|
2
|
+
//#region src/use-map.ts
|
|
3
|
+
/**
|
|
4
|
+
* Narrow a `get` result using the matching `has` answer: when the key is
|
|
5
|
+
* present the result is a stored `Value`, even if that value is `undefined`.
|
|
6
|
+
*/
|
|
7
|
+
function isStored(value, present) {
|
|
8
|
+
return present;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a reactive `Map` with typed helpers.
|
|
12
|
+
*
|
|
13
|
+
* Key and value types are inferred from the initial entries
|
|
14
|
+
* (`useMap([["a", 1]])` is a `Map<string, number>`); pass type arguments
|
|
15
|
+
* for an initially empty map. Reads through `get`, `has`, and `map` are
|
|
16
|
+
* tracked per key, so an effect reading one key does not re-run when an
|
|
17
|
+
* unrelated key changes. Values are stored as-is (not deeply reactive).
|
|
18
|
+
*
|
|
19
|
+
* Purely synchronous state: safe during server rendering (no host globals,
|
|
20
|
+
* no timers) and nothing to dispose.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const counts = useMap<string, number>();
|
|
25
|
+
* counts.update("clicks", (previous = 0) => previous + 1);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @typeParam Key Key type, inferred from `initial`.
|
|
29
|
+
* @typeParam Value Value type, inferred from `initial`.
|
|
30
|
+
* @param initial Entries inserted at creation and restored by `reset`.
|
|
31
|
+
* @default initial []
|
|
32
|
+
* @returns The reactive map and its helpers.
|
|
33
|
+
*/
|
|
34
|
+
function useMap(initial = []) {
|
|
35
|
+
const baseline = [...initial];
|
|
36
|
+
const map = shallowReactive(new Map(baseline));
|
|
37
|
+
const reset = () => {
|
|
38
|
+
map.clear();
|
|
39
|
+
for (const [key, value] of baseline) map.set(key, value);
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
map: shallowReadonly(map),
|
|
43
|
+
size: computed(() => map.size),
|
|
44
|
+
entries: computed(() => [...map.entries()]),
|
|
45
|
+
get: (key) => map.get(key),
|
|
46
|
+
has: (key) => map.has(key),
|
|
47
|
+
set: (key, value) => {
|
|
48
|
+
map.set(key, value);
|
|
49
|
+
},
|
|
50
|
+
delete: (key) => map.delete(key),
|
|
51
|
+
clear: () => {
|
|
52
|
+
map.clear();
|
|
53
|
+
},
|
|
54
|
+
update: (key, updater) => {
|
|
55
|
+
const next = updater(map.get(key));
|
|
56
|
+
map.set(key, next);
|
|
57
|
+
return next;
|
|
58
|
+
},
|
|
59
|
+
getOrInsert: (key, create) => {
|
|
60
|
+
const existing = map.get(key);
|
|
61
|
+
if (isStored(existing, map.has(key))) return existing;
|
|
62
|
+
const created = create(key);
|
|
63
|
+
map.set(key, created);
|
|
64
|
+
return created;
|
|
65
|
+
},
|
|
66
|
+
reset
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { useMap };
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-media-controls.d.ts
|
|
4
|
+
/** Minimal `TimeRanges`. */
|
|
5
|
+
interface TimeRangesLike {
|
|
6
|
+
/** Number of ranges. */
|
|
7
|
+
readonly length: number;
|
|
8
|
+
/** Start of range `index` in seconds. */
|
|
9
|
+
start(index: number): number;
|
|
10
|
+
/** End of range `index` in seconds. */
|
|
11
|
+
end(index: number): number;
|
|
12
|
+
}
|
|
13
|
+
/** Minimal `TextTrack`. */
|
|
14
|
+
interface TextTrackLike {
|
|
15
|
+
/** Track identifier. */
|
|
16
|
+
readonly id: string;
|
|
17
|
+
/** `"subtitles"`, `"captions"`, `"descriptions"`, `"chapters"`, or `"metadata"`. */
|
|
18
|
+
readonly kind: string;
|
|
19
|
+
/** Human-readable label. */
|
|
20
|
+
readonly label: string;
|
|
21
|
+
/** BCP 47 language tag. */
|
|
22
|
+
readonly language: string;
|
|
23
|
+
/** `"disabled"`, `"hidden"`, or `"showing"`. */
|
|
24
|
+
mode: string;
|
|
25
|
+
}
|
|
26
|
+
/** Minimal `TextTrackList`. */
|
|
27
|
+
interface TextTrackListLike extends EventTarget {
|
|
28
|
+
/** Number of tracks. */
|
|
29
|
+
readonly length: number;
|
|
30
|
+
/** Track at `index`. */
|
|
31
|
+
readonly [index: number]: TextTrackLike;
|
|
32
|
+
}
|
|
33
|
+
/** Minimal `HTMLMediaElement` (`<video>` or `<audio>`). */
|
|
34
|
+
interface MediaElementLike extends EventTarget {
|
|
35
|
+
/** Playback position in seconds. */
|
|
36
|
+
currentTime: number;
|
|
37
|
+
/** Volume from 0 to 1. */
|
|
38
|
+
volume: number;
|
|
39
|
+
/** Whether audio is muted. */
|
|
40
|
+
muted: boolean;
|
|
41
|
+
/** Playback speed multiplier. */
|
|
42
|
+
playbackRate: number;
|
|
43
|
+
/** Media source URL. */
|
|
44
|
+
src: string;
|
|
45
|
+
/** Duration in seconds (`NaN` until metadata loaded). */
|
|
46
|
+
readonly duration: number;
|
|
47
|
+
/** Whether playback is paused. */
|
|
48
|
+
readonly paused: boolean;
|
|
49
|
+
/** Whether playback reached the end. */
|
|
50
|
+
readonly ended: boolean;
|
|
51
|
+
/** Whether the element is seeking. */
|
|
52
|
+
readonly seeking: boolean;
|
|
53
|
+
/** Buffered time ranges. */
|
|
54
|
+
readonly buffered: TimeRangesLike;
|
|
55
|
+
/** Text tracks (`<track>` children). */
|
|
56
|
+
readonly textTracks?: TextTrackListLike;
|
|
57
|
+
/** Start playback; rejects when autoplay is blocked. */
|
|
58
|
+
play(): Promise<void>;
|
|
59
|
+
/** Pause playback. */
|
|
60
|
+
pause(): void;
|
|
61
|
+
/** Whether the element can play `type` (`""`, `"maybe"`, `"probably"`). */
|
|
62
|
+
canPlayType?(type: string): string;
|
|
63
|
+
/** Enter picture-in-picture (video only). */
|
|
64
|
+
requestPictureInPicture?(): Promise<unknown>;
|
|
65
|
+
}
|
|
66
|
+
/** Document capabilities used for picture-in-picture. */
|
|
67
|
+
interface PictureInPictureDocumentLike {
|
|
68
|
+
/** Whether picture-in-picture is allowed. */
|
|
69
|
+
readonly pictureInPictureEnabled?: boolean;
|
|
70
|
+
/** Element currently in picture-in-picture. */
|
|
71
|
+
readonly pictureInPictureElement?: unknown;
|
|
72
|
+
/** Leave picture-in-picture. */
|
|
73
|
+
exitPictureInPicture?(): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/** One candidate media source. */
|
|
76
|
+
interface MediaSourceCandidate {
|
|
77
|
+
/** Source URL. */
|
|
78
|
+
readonly src: string;
|
|
79
|
+
/** MIME type used to test playability with `canPlayType`. */
|
|
80
|
+
readonly type?: string;
|
|
81
|
+
}
|
|
82
|
+
/** Summary of one text track. */
|
|
83
|
+
interface MediaTextTrack {
|
|
84
|
+
/** Index in the element's `textTracks`. */
|
|
85
|
+
readonly index: number;
|
|
86
|
+
/** Track identifier. */
|
|
87
|
+
readonly id: string;
|
|
88
|
+
/** Track kind. */
|
|
89
|
+
readonly kind: string;
|
|
90
|
+
/** Human-readable label. */
|
|
91
|
+
readonly label: string;
|
|
92
|
+
/** BCP 47 language tag. */
|
|
93
|
+
readonly language: string;
|
|
94
|
+
/** Current mode. */
|
|
95
|
+
readonly mode: string;
|
|
96
|
+
}
|
|
97
|
+
/** Options for {@link useMediaControls}. */
|
|
98
|
+
interface UseMediaControlsOptions {
|
|
99
|
+
/**
|
|
100
|
+
* Media source: a URL, or candidates of which the first playable one (per
|
|
101
|
+
* `canPlayType`) is used. Omit to leave the element's `src` untouched.
|
|
102
|
+
*
|
|
103
|
+
* @default undefined
|
|
104
|
+
*/
|
|
105
|
+
readonly src?: MaybeRefOrGetter<string | readonly MediaSourceCandidate[] | undefined>;
|
|
106
|
+
/**
|
|
107
|
+
* Document used for picture-in-picture.
|
|
108
|
+
*
|
|
109
|
+
* @default window.document when a browser window exists
|
|
110
|
+
*/
|
|
111
|
+
readonly document?: MaybeRefOrGetter<PictureInPictureDocumentLike | null | undefined>;
|
|
112
|
+
}
|
|
113
|
+
/** Reactive state and actions returned by {@link useMediaControls}. */
|
|
114
|
+
interface MediaControls {
|
|
115
|
+
/** Whether media is playing; assign to play or pause. */
|
|
116
|
+
readonly playing: Ref<boolean>;
|
|
117
|
+
/** Playback position in seconds; assign to seek. */
|
|
118
|
+
readonly currentTime: Ref<number>;
|
|
119
|
+
/** Volume from 0 to 1; assign to change it. */
|
|
120
|
+
readonly volume: Ref<number>;
|
|
121
|
+
/** Whether audio is muted; assign to toggle. */
|
|
122
|
+
readonly muted: Ref<boolean>;
|
|
123
|
+
/** Playback speed; assign to change it. */
|
|
124
|
+
readonly rate: Ref<number>;
|
|
125
|
+
/** Duration in seconds (0 until known). */
|
|
126
|
+
readonly duration: Readonly<Ref<number>>;
|
|
127
|
+
/** Buffered ranges as `[start, end]` pairs. */
|
|
128
|
+
readonly buffered: Readonly<ShallowRef<readonly (readonly [number, number])[]>>;
|
|
129
|
+
/** Whether the element is seeking. */
|
|
130
|
+
readonly seeking: Readonly<Ref<boolean>>;
|
|
131
|
+
/** Whether playback waits for data. */
|
|
132
|
+
readonly waiting: Readonly<Ref<boolean>>;
|
|
133
|
+
/** Whether playback reached the end. */
|
|
134
|
+
readonly ended: Readonly<Ref<boolean>>;
|
|
135
|
+
/** Whether data delivery stalled. */
|
|
136
|
+
readonly stalled: Readonly<Ref<boolean>>;
|
|
137
|
+
/** Most recent `play()` rejection (for example blocked autoplay). */
|
|
138
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
139
|
+
/** Text tracks of the element. */
|
|
140
|
+
readonly tracks: Readonly<ShallowRef<readonly MediaTextTrack[]>>;
|
|
141
|
+
/** Index of the showing text track, or `-1`. */
|
|
142
|
+
readonly selectedTrack: Readonly<Ref<number>>;
|
|
143
|
+
/** Whether picture-in-picture can be requested for the element. */
|
|
144
|
+
readonly supportsPictureInPicture: ComputedRef<boolean>;
|
|
145
|
+
/** Whether the element is in picture-in-picture. */
|
|
146
|
+
readonly isPictureInPicture: Readonly<Ref<boolean>>;
|
|
147
|
+
/**
|
|
148
|
+
* Start playback.
|
|
149
|
+
*
|
|
150
|
+
* @returns Whether playback started.
|
|
151
|
+
*/
|
|
152
|
+
readonly play: () => Promise<boolean>;
|
|
153
|
+
/** Pause playback. */
|
|
154
|
+
readonly pause: () => void;
|
|
155
|
+
/**
|
|
156
|
+
* Show text track `index` and hide the others; `-1` hides all.
|
|
157
|
+
*
|
|
158
|
+
* @param index Track index.
|
|
159
|
+
*/
|
|
160
|
+
readonly selectTrack: (index: number) => void;
|
|
161
|
+
/**
|
|
162
|
+
* Enter or leave picture-in-picture.
|
|
163
|
+
*
|
|
164
|
+
* @returns Whether the element is in picture-in-picture afterwards.
|
|
165
|
+
*/
|
|
166
|
+
readonly togglePictureInPicture: () => Promise<boolean>;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Two-way reactive controls for a `<video>` or `<audio>` element.
|
|
170
|
+
*
|
|
171
|
+
* `playing`, `currentTime`, `volume`, `muted`, and `rate` mirror the
|
|
172
|
+
* element and are writable: assigning them drives the element, while
|
|
173
|
+
* element events update them without echoing the change back. The element
|
|
174
|
+
* is the source of truth whenever a new target attaches. Read-only state
|
|
175
|
+
* covers duration, buffering, seeking, waiting, stalls, text tracks, and
|
|
176
|
+
* picture-in-picture. A rejected `play()` (blocked autoplay) resets
|
|
177
|
+
* `playing` and is exposed through `error`. Listeners are removed when the
|
|
178
|
+
* target changes and when the owning reactive scope stops.
|
|
179
|
+
*
|
|
180
|
+
* Server rendering: the template ref is empty, so every value keeps its
|
|
181
|
+
* neutral default (paused, time 0, volume 1) and nothing is touched.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```ts
|
|
185
|
+
* const video = useTemplateRef<HTMLVideoElement>("video");
|
|
186
|
+
* const { playing, currentTime, duration } = useMediaControls(video, {
|
|
187
|
+
* src: [{ src: "/clip.webm", type: "video/webm" }, { src: "/clip.mp4", type: "video/mp4" }],
|
|
188
|
+
* });
|
|
189
|
+
* ```
|
|
190
|
+
*
|
|
191
|
+
* @param target Reactive media element.
|
|
192
|
+
* @param options Source selection and picture-in-picture document.
|
|
193
|
+
* @default options {}
|
|
194
|
+
* @returns Reactive media state and actions.
|
|
195
|
+
*/
|
|
196
|
+
declare function useMediaControls(target: MaybeRefOrGetter<MediaElementLike | null | undefined>, options?: UseMediaControlsOptions): MediaControls;
|
|
197
|
+
//#endregion
|
|
198
|
+
export { MediaControls, MediaElementLike, MediaSourceCandidate, MediaTextTrack, PictureInPictureDocumentLike, TextTrackLike, TextTrackListLike, TimeRangesLike, UseMediaControlsOptions, useMediaControls };
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
//#region src/use-media-controls.ts
|
|
3
|
+
function browserDocument() {
|
|
4
|
+
return typeof window === "undefined" ? void 0 : window.document;
|
|
5
|
+
}
|
|
6
|
+
function readRanges(ranges) {
|
|
7
|
+
const result = [];
|
|
8
|
+
for (let index = 0; index < ranges.length; index += 1) result.push([ranges.start(index), ranges.end(index)]);
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
function chooseSource(element, source) {
|
|
12
|
+
if (typeof source === "string") return source;
|
|
13
|
+
for (const candidate of source) {
|
|
14
|
+
if (candidate.type === void 0 || !element.canPlayType) return candidate.src;
|
|
15
|
+
if (element.canPlayType(candidate.type) !== "") return candidate.src;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Two-way reactive controls for a `<video>` or `<audio>` element.
|
|
20
|
+
*
|
|
21
|
+
* `playing`, `currentTime`, `volume`, `muted`, and `rate` mirror the
|
|
22
|
+
* element and are writable: assigning them drives the element, while
|
|
23
|
+
* element events update them without echoing the change back. The element
|
|
24
|
+
* is the source of truth whenever a new target attaches. Read-only state
|
|
25
|
+
* covers duration, buffering, seeking, waiting, stalls, text tracks, and
|
|
26
|
+
* picture-in-picture. A rejected `play()` (blocked autoplay) resets
|
|
27
|
+
* `playing` and is exposed through `error`. Listeners are removed when the
|
|
28
|
+
* target changes and when the owning reactive scope stops.
|
|
29
|
+
*
|
|
30
|
+
* Server rendering: the template ref is empty, so every value keeps its
|
|
31
|
+
* neutral default (paused, time 0, volume 1) and nothing is touched.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const video = useTemplateRef<HTMLVideoElement>("video");
|
|
36
|
+
* const { playing, currentTime, duration } = useMediaControls(video, {
|
|
37
|
+
* src: [{ src: "/clip.webm", type: "video/webm" }, { src: "/clip.mp4", type: "video/mp4" }],
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @param target Reactive media element.
|
|
42
|
+
* @param options Source selection and picture-in-picture document.
|
|
43
|
+
* @default options {}
|
|
44
|
+
* @returns Reactive media state and actions.
|
|
45
|
+
*/
|
|
46
|
+
function useMediaControls(target, options = {}) {
|
|
47
|
+
const playing = ref(false);
|
|
48
|
+
const currentTime = ref(0);
|
|
49
|
+
const volume = ref(1);
|
|
50
|
+
const muted = ref(false);
|
|
51
|
+
const rate = ref(1);
|
|
52
|
+
const duration = ref(0);
|
|
53
|
+
const buffered = shallowRef([]);
|
|
54
|
+
const seeking = ref(false);
|
|
55
|
+
const waiting = ref(false);
|
|
56
|
+
const ended = ref(false);
|
|
57
|
+
const stalled = ref(false);
|
|
58
|
+
const error = shallowRef(void 0);
|
|
59
|
+
const tracks = shallowRef([]);
|
|
60
|
+
const selectedTrack = ref(-1);
|
|
61
|
+
const isPictureInPicture = ref(false);
|
|
62
|
+
let syncing = false;
|
|
63
|
+
const resolveElement = () => toValue(target) ?? void 0;
|
|
64
|
+
const resolveDocument = () => options.document === void 0 ? browserDocument() : toValue(options.document) ?? void 0;
|
|
65
|
+
const fromElement = (update) => {
|
|
66
|
+
syncing = true;
|
|
67
|
+
try {
|
|
68
|
+
update();
|
|
69
|
+
} finally {
|
|
70
|
+
syncing = false;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const readTracks = (element) => {
|
|
74
|
+
const list = element.textTracks;
|
|
75
|
+
const summary = [];
|
|
76
|
+
let showing = -1;
|
|
77
|
+
for (let index = 0; list && index < list.length; index += 1) {
|
|
78
|
+
const track = list[index];
|
|
79
|
+
if (!track) continue;
|
|
80
|
+
summary.push({
|
|
81
|
+
index,
|
|
82
|
+
id: track.id,
|
|
83
|
+
kind: track.kind,
|
|
84
|
+
label: track.label,
|
|
85
|
+
language: track.language,
|
|
86
|
+
mode: track.mode
|
|
87
|
+
});
|
|
88
|
+
if (track.mode === "showing" && showing === -1) showing = index;
|
|
89
|
+
}
|
|
90
|
+
tracks.value = summary;
|
|
91
|
+
selectedTrack.value = showing;
|
|
92
|
+
};
|
|
93
|
+
const readAll = (element) => {
|
|
94
|
+
fromElement(() => {
|
|
95
|
+
playing.value = !element.paused;
|
|
96
|
+
currentTime.value = element.currentTime;
|
|
97
|
+
volume.value = element.volume;
|
|
98
|
+
muted.value = element.muted;
|
|
99
|
+
rate.value = element.playbackRate;
|
|
100
|
+
});
|
|
101
|
+
duration.value = Number.isFinite(element.duration) ? element.duration : 0;
|
|
102
|
+
buffered.value = readRanges(element.buffered);
|
|
103
|
+
seeking.value = element.seeking;
|
|
104
|
+
ended.value = element.ended;
|
|
105
|
+
readTracks(element);
|
|
106
|
+
const document = resolveDocument();
|
|
107
|
+
isPictureInPicture.value = document?.pictureInPictureElement !== void 0 && document.pictureInPictureElement === element;
|
|
108
|
+
};
|
|
109
|
+
const play = async () => {
|
|
110
|
+
const element = resolveElement();
|
|
111
|
+
if (!element) return false;
|
|
112
|
+
try {
|
|
113
|
+
await element.play();
|
|
114
|
+
error.value = void 0;
|
|
115
|
+
return true;
|
|
116
|
+
} catch (cause) {
|
|
117
|
+
error.value = cause;
|
|
118
|
+
fromElement(() => {
|
|
119
|
+
playing.value = !element.paused;
|
|
120
|
+
});
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const pause = () => {
|
|
125
|
+
resolveElement()?.pause();
|
|
126
|
+
};
|
|
127
|
+
watch(resolveElement, (element, _previous, onCleanup) => {
|
|
128
|
+
if (!element) return;
|
|
129
|
+
readAll(element);
|
|
130
|
+
const handlers = {
|
|
131
|
+
timeupdate: () => fromElement(() => currentTime.value = element.currentTime),
|
|
132
|
+
durationchange: () => {
|
|
133
|
+
duration.value = Number.isFinite(element.duration) ? element.duration : 0;
|
|
134
|
+
},
|
|
135
|
+
loadedmetadata: () => readAll(element),
|
|
136
|
+
progress: () => {
|
|
137
|
+
buffered.value = readRanges(element.buffered);
|
|
138
|
+
stalled.value = false;
|
|
139
|
+
},
|
|
140
|
+
seeking: () => seeking.value = true,
|
|
141
|
+
seeked: () => seeking.value = false,
|
|
142
|
+
waiting: () => waiting.value = true,
|
|
143
|
+
canplay: () => waiting.value = false,
|
|
144
|
+
playing: () => {
|
|
145
|
+
waiting.value = false;
|
|
146
|
+
stalled.value = false;
|
|
147
|
+
ended.value = false;
|
|
148
|
+
},
|
|
149
|
+
play: () => fromElement(() => playing.value = true),
|
|
150
|
+
pause: () => fromElement(() => playing.value = false),
|
|
151
|
+
ended: () => {
|
|
152
|
+
ended.value = true;
|
|
153
|
+
fromElement(() => playing.value = false);
|
|
154
|
+
},
|
|
155
|
+
stalled: () => stalled.value = true,
|
|
156
|
+
volumechange: () => fromElement(() => {
|
|
157
|
+
volume.value = element.volume;
|
|
158
|
+
muted.value = element.muted;
|
|
159
|
+
}),
|
|
160
|
+
ratechange: () => fromElement(() => rate.value = element.playbackRate),
|
|
161
|
+
enterpictureinpicture: () => isPictureInPicture.value = true,
|
|
162
|
+
leavepictureinpicture: () => isPictureInPicture.value = false
|
|
163
|
+
};
|
|
164
|
+
for (const [event, handler] of Object.entries(handlers)) element.addEventListener(event, handler);
|
|
165
|
+
const onTracksChange = () => readTracks(element);
|
|
166
|
+
element.textTracks?.addEventListener("change", onTracksChange);
|
|
167
|
+
element.textTracks?.addEventListener("addtrack", onTracksChange);
|
|
168
|
+
element.textTracks?.addEventListener("removetrack", onTracksChange);
|
|
169
|
+
onCleanup(() => {
|
|
170
|
+
for (const [event, handler] of Object.entries(handlers)) element.removeEventListener(event, handler);
|
|
171
|
+
element.textTracks?.removeEventListener("change", onTracksChange);
|
|
172
|
+
element.textTracks?.removeEventListener("addtrack", onTracksChange);
|
|
173
|
+
element.textTracks?.removeEventListener("removetrack", onTracksChange);
|
|
174
|
+
});
|
|
175
|
+
}, {
|
|
176
|
+
immediate: true,
|
|
177
|
+
flush: "sync"
|
|
178
|
+
});
|
|
179
|
+
watch([resolveElement, () => toValue(options.src)], ([element, source]) => {
|
|
180
|
+
if (!element || source === void 0) return;
|
|
181
|
+
const chosen = chooseSource(element, source);
|
|
182
|
+
if (chosen !== void 0 && element.src !== chosen) element.src = chosen;
|
|
183
|
+
}, {
|
|
184
|
+
immediate: true,
|
|
185
|
+
flush: "sync"
|
|
186
|
+
});
|
|
187
|
+
watch(playing, (value) => {
|
|
188
|
+
if (syncing) return;
|
|
189
|
+
if (value) play();
|
|
190
|
+
else pause();
|
|
191
|
+
}, { flush: "sync" });
|
|
192
|
+
watch(currentTime, (value) => {
|
|
193
|
+
const element = resolveElement();
|
|
194
|
+
if (!syncing && element) element.currentTime = value;
|
|
195
|
+
}, { flush: "sync" });
|
|
196
|
+
watch(volume, (value) => {
|
|
197
|
+
const element = resolveElement();
|
|
198
|
+
if (!syncing && element) element.volume = value;
|
|
199
|
+
}, { flush: "sync" });
|
|
200
|
+
watch(muted, (value) => {
|
|
201
|
+
const element = resolveElement();
|
|
202
|
+
if (!syncing && element) element.muted = value;
|
|
203
|
+
}, { flush: "sync" });
|
|
204
|
+
watch(rate, (value) => {
|
|
205
|
+
const element = resolveElement();
|
|
206
|
+
if (!syncing && element) element.playbackRate = value;
|
|
207
|
+
}, { flush: "sync" });
|
|
208
|
+
const selectTrack = (index) => {
|
|
209
|
+
const element = resolveElement();
|
|
210
|
+
const list = element?.textTracks;
|
|
211
|
+
if (!element || !list) return;
|
|
212
|
+
for (let position = 0; position < list.length; position += 1) {
|
|
213
|
+
const track = list[position];
|
|
214
|
+
if (track) track.mode = position === index ? "showing" : "disabled";
|
|
215
|
+
}
|
|
216
|
+
readTracks(element);
|
|
217
|
+
};
|
|
218
|
+
const supportsPictureInPicture = computed(() => {
|
|
219
|
+
const element = resolveElement();
|
|
220
|
+
const document = resolveDocument();
|
|
221
|
+
return typeof element?.requestPictureInPicture === "function" && document?.pictureInPictureEnabled !== false;
|
|
222
|
+
});
|
|
223
|
+
const togglePictureInPicture = async () => {
|
|
224
|
+
const element = resolveElement();
|
|
225
|
+
const document = resolveDocument();
|
|
226
|
+
if (!element) return false;
|
|
227
|
+
try {
|
|
228
|
+
if (isPictureInPicture.value) {
|
|
229
|
+
await document?.exitPictureInPicture?.();
|
|
230
|
+
isPictureInPicture.value = false;
|
|
231
|
+
} else if (element.requestPictureInPicture) {
|
|
232
|
+
await element.requestPictureInPicture();
|
|
233
|
+
isPictureInPicture.value = true;
|
|
234
|
+
}
|
|
235
|
+
} catch (cause) {
|
|
236
|
+
error.value = cause;
|
|
237
|
+
}
|
|
238
|
+
return isPictureInPicture.value;
|
|
239
|
+
};
|
|
240
|
+
return {
|
|
241
|
+
playing,
|
|
242
|
+
currentTime,
|
|
243
|
+
volume,
|
|
244
|
+
muted,
|
|
245
|
+
rate,
|
|
246
|
+
duration: readonly(duration),
|
|
247
|
+
buffered,
|
|
248
|
+
seeking: readonly(seeking),
|
|
249
|
+
waiting: readonly(waiting),
|
|
250
|
+
ended: readonly(ended),
|
|
251
|
+
stalled: readonly(stalled),
|
|
252
|
+
error,
|
|
253
|
+
tracks,
|
|
254
|
+
selectedTrack: readonly(selectedTrack),
|
|
255
|
+
supportsPictureInPicture,
|
|
256
|
+
isPictureInPicture: readonly(isPictureInPicture),
|
|
257
|
+
play,
|
|
258
|
+
pause,
|
|
259
|
+
selectTrack,
|
|
260
|
+
togglePictureInPicture
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//#endregion
|
|
264
|
+
export { useMediaControls };
|