@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,545 @@
|
|
|
1
|
+
import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Minimal `TimeRanges`. */
|
|
5
|
+
export interface TimeRangesLike {
|
|
6
|
+
/** Number of ranges. */
|
|
7
|
+
readonly length: number;
|
|
8
|
+
|
|
9
|
+
/** Start of range `index` in seconds. */
|
|
10
|
+
start(index: number): number;
|
|
11
|
+
|
|
12
|
+
/** End of range `index` in seconds. */
|
|
13
|
+
end(index: number): number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Minimal `TextTrack`. */
|
|
17
|
+
export interface TextTrackLike {
|
|
18
|
+
/** Track identifier. */
|
|
19
|
+
readonly id: string;
|
|
20
|
+
|
|
21
|
+
/** `"subtitles"`, `"captions"`, `"descriptions"`, `"chapters"`, or `"metadata"`. */
|
|
22
|
+
readonly kind: string;
|
|
23
|
+
|
|
24
|
+
/** Human-readable label. */
|
|
25
|
+
readonly label: string;
|
|
26
|
+
|
|
27
|
+
/** BCP 47 language tag. */
|
|
28
|
+
readonly language: string;
|
|
29
|
+
|
|
30
|
+
/** `"disabled"`, `"hidden"`, or `"showing"`. */
|
|
31
|
+
mode: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Minimal `TextTrackList`. */
|
|
35
|
+
export interface TextTrackListLike extends EventTarget {
|
|
36
|
+
/** Number of tracks. */
|
|
37
|
+
readonly length: number;
|
|
38
|
+
|
|
39
|
+
/** Track at `index`. */
|
|
40
|
+
readonly [index: number]: TextTrackLike;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Minimal `HTMLMediaElement` (`<video>` or `<audio>`). */
|
|
44
|
+
export interface MediaElementLike extends EventTarget {
|
|
45
|
+
/** Playback position in seconds. */
|
|
46
|
+
currentTime: number;
|
|
47
|
+
|
|
48
|
+
/** Volume from 0 to 1. */
|
|
49
|
+
volume: number;
|
|
50
|
+
|
|
51
|
+
/** Whether audio is muted. */
|
|
52
|
+
muted: boolean;
|
|
53
|
+
|
|
54
|
+
/** Playback speed multiplier. */
|
|
55
|
+
playbackRate: number;
|
|
56
|
+
|
|
57
|
+
/** Media source URL. */
|
|
58
|
+
src: string;
|
|
59
|
+
|
|
60
|
+
/** Duration in seconds (`NaN` until metadata loaded). */
|
|
61
|
+
readonly duration: number;
|
|
62
|
+
|
|
63
|
+
/** Whether playback is paused. */
|
|
64
|
+
readonly paused: boolean;
|
|
65
|
+
|
|
66
|
+
/** Whether playback reached the end. */
|
|
67
|
+
readonly ended: boolean;
|
|
68
|
+
|
|
69
|
+
/** Whether the element is seeking. */
|
|
70
|
+
readonly seeking: boolean;
|
|
71
|
+
|
|
72
|
+
/** Buffered time ranges. */
|
|
73
|
+
readonly buffered: TimeRangesLike;
|
|
74
|
+
|
|
75
|
+
/** Text tracks (`<track>` children). */
|
|
76
|
+
readonly textTracks?: TextTrackListLike;
|
|
77
|
+
|
|
78
|
+
/** Start playback; rejects when autoplay is blocked. */
|
|
79
|
+
play(): Promise<void>;
|
|
80
|
+
|
|
81
|
+
/** Pause playback. */
|
|
82
|
+
pause(): void;
|
|
83
|
+
|
|
84
|
+
/** Whether the element can play `type` (`""`, `"maybe"`, `"probably"`). */
|
|
85
|
+
canPlayType?(type: string): string;
|
|
86
|
+
|
|
87
|
+
/** Enter picture-in-picture (video only). */
|
|
88
|
+
requestPictureInPicture?(): Promise<unknown>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Document capabilities used for picture-in-picture. */
|
|
92
|
+
export interface PictureInPictureDocumentLike {
|
|
93
|
+
/** Whether picture-in-picture is allowed. */
|
|
94
|
+
readonly pictureInPictureEnabled?: boolean;
|
|
95
|
+
|
|
96
|
+
/** Element currently in picture-in-picture. */
|
|
97
|
+
readonly pictureInPictureElement?: unknown;
|
|
98
|
+
|
|
99
|
+
/** Leave picture-in-picture. */
|
|
100
|
+
exitPictureInPicture?(): Promise<void>;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** One candidate media source. */
|
|
104
|
+
export interface MediaSourceCandidate {
|
|
105
|
+
/** Source URL. */
|
|
106
|
+
readonly src: string;
|
|
107
|
+
|
|
108
|
+
/** MIME type used to test playability with `canPlayType`. */
|
|
109
|
+
readonly type?: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Summary of one text track. */
|
|
113
|
+
export interface MediaTextTrack {
|
|
114
|
+
/** Index in the element's `textTracks`. */
|
|
115
|
+
readonly index: number;
|
|
116
|
+
|
|
117
|
+
/** Track identifier. */
|
|
118
|
+
readonly id: string;
|
|
119
|
+
|
|
120
|
+
/** Track kind. */
|
|
121
|
+
readonly kind: string;
|
|
122
|
+
|
|
123
|
+
/** Human-readable label. */
|
|
124
|
+
readonly label: string;
|
|
125
|
+
|
|
126
|
+
/** BCP 47 language tag. */
|
|
127
|
+
readonly language: string;
|
|
128
|
+
|
|
129
|
+
/** Current mode. */
|
|
130
|
+
readonly mode: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Options for {@link useMediaControls}. */
|
|
134
|
+
export interface UseMediaControlsOptions {
|
|
135
|
+
/**
|
|
136
|
+
* Media source: a URL, or candidates of which the first playable one (per
|
|
137
|
+
* `canPlayType`) is used. Omit to leave the element's `src` untouched.
|
|
138
|
+
*
|
|
139
|
+
* @default undefined
|
|
140
|
+
*/
|
|
141
|
+
readonly src?: MaybeRefOrGetter<string | readonly MediaSourceCandidate[] | undefined>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Document used for picture-in-picture.
|
|
145
|
+
*
|
|
146
|
+
* @default window.document when a browser window exists
|
|
147
|
+
*/
|
|
148
|
+
readonly document?: MaybeRefOrGetter<PictureInPictureDocumentLike | null | undefined>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Reactive state and actions returned by {@link useMediaControls}. */
|
|
152
|
+
export interface MediaControls {
|
|
153
|
+
/** Whether media is playing; assign to play or pause. */
|
|
154
|
+
readonly playing: Ref<boolean>;
|
|
155
|
+
|
|
156
|
+
/** Playback position in seconds; assign to seek. */
|
|
157
|
+
readonly currentTime: Ref<number>;
|
|
158
|
+
|
|
159
|
+
/** Volume from 0 to 1; assign to change it. */
|
|
160
|
+
readonly volume: Ref<number>;
|
|
161
|
+
|
|
162
|
+
/** Whether audio is muted; assign to toggle. */
|
|
163
|
+
readonly muted: Ref<boolean>;
|
|
164
|
+
|
|
165
|
+
/** Playback speed; assign to change it. */
|
|
166
|
+
readonly rate: Ref<number>;
|
|
167
|
+
|
|
168
|
+
/** Duration in seconds (0 until known). */
|
|
169
|
+
readonly duration: Readonly<Ref<number>>;
|
|
170
|
+
|
|
171
|
+
/** Buffered ranges as `[start, end]` pairs. */
|
|
172
|
+
readonly buffered: Readonly<ShallowRef<readonly (readonly [number, number])[]>>;
|
|
173
|
+
|
|
174
|
+
/** Whether the element is seeking. */
|
|
175
|
+
readonly seeking: Readonly<Ref<boolean>>;
|
|
176
|
+
|
|
177
|
+
/** Whether playback waits for data. */
|
|
178
|
+
readonly waiting: Readonly<Ref<boolean>>;
|
|
179
|
+
|
|
180
|
+
/** Whether playback reached the end. */
|
|
181
|
+
readonly ended: Readonly<Ref<boolean>>;
|
|
182
|
+
|
|
183
|
+
/** Whether data delivery stalled. */
|
|
184
|
+
readonly stalled: Readonly<Ref<boolean>>;
|
|
185
|
+
|
|
186
|
+
/** Most recent `play()` rejection (for example blocked autoplay). */
|
|
187
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
188
|
+
|
|
189
|
+
/** Text tracks of the element. */
|
|
190
|
+
readonly tracks: Readonly<ShallowRef<readonly MediaTextTrack[]>>;
|
|
191
|
+
|
|
192
|
+
/** Index of the showing text track, or `-1`. */
|
|
193
|
+
readonly selectedTrack: Readonly<Ref<number>>;
|
|
194
|
+
|
|
195
|
+
/** Whether picture-in-picture can be requested for the element. */
|
|
196
|
+
readonly supportsPictureInPicture: ComputedRef<boolean>;
|
|
197
|
+
|
|
198
|
+
/** Whether the element is in picture-in-picture. */
|
|
199
|
+
readonly isPictureInPicture: Readonly<Ref<boolean>>;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Start playback.
|
|
203
|
+
*
|
|
204
|
+
* @returns Whether playback started.
|
|
205
|
+
*/
|
|
206
|
+
readonly play: () => Promise<boolean>;
|
|
207
|
+
|
|
208
|
+
/** Pause playback. */
|
|
209
|
+
readonly pause: () => void;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Show text track `index` and hide the others; `-1` hides all.
|
|
213
|
+
*
|
|
214
|
+
* @param index Track index.
|
|
215
|
+
*/
|
|
216
|
+
readonly selectTrack: (index: number) => void;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Enter or leave picture-in-picture.
|
|
220
|
+
*
|
|
221
|
+
* @returns Whether the element is in picture-in-picture afterwards.
|
|
222
|
+
*/
|
|
223
|
+
readonly togglePictureInPicture: () => Promise<boolean>;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function browserDocument(): PictureInPictureDocumentLike | undefined {
|
|
227
|
+
return typeof window === "undefined" ? undefined : window.document;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function readRanges(ranges: TimeRangesLike): readonly (readonly [number, number])[] {
|
|
231
|
+
const result: (readonly [number, number])[] = [];
|
|
232
|
+
for (let index = 0; index < ranges.length; index += 1) {
|
|
233
|
+
result.push([ranges.start(index), ranges.end(index)]);
|
|
234
|
+
}
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function chooseSource(
|
|
239
|
+
element: MediaElementLike,
|
|
240
|
+
source: string | readonly MediaSourceCandidate[],
|
|
241
|
+
): string | undefined {
|
|
242
|
+
if (typeof source === "string") return source;
|
|
243
|
+
for (const candidate of source) {
|
|
244
|
+
if (candidate.type === undefined || !element.canPlayType) return candidate.src;
|
|
245
|
+
if (element.canPlayType(candidate.type) !== "") return candidate.src;
|
|
246
|
+
}
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Two-way reactive controls for a `<video>` or `<audio>` element.
|
|
252
|
+
*
|
|
253
|
+
* `playing`, `currentTime`, `volume`, `muted`, and `rate` mirror the
|
|
254
|
+
* element and are writable: assigning them drives the element, while
|
|
255
|
+
* element events update them without echoing the change back. The element
|
|
256
|
+
* is the source of truth whenever a new target attaches. Read-only state
|
|
257
|
+
* covers duration, buffering, seeking, waiting, stalls, text tracks, and
|
|
258
|
+
* picture-in-picture. A rejected `play()` (blocked autoplay) resets
|
|
259
|
+
* `playing` and is exposed through `error`. Listeners are removed when the
|
|
260
|
+
* target changes and when the owning reactive scope stops.
|
|
261
|
+
*
|
|
262
|
+
* Server rendering: the template ref is empty, so every value keeps its
|
|
263
|
+
* neutral default (paused, time 0, volume 1) and nothing is touched.
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```ts
|
|
267
|
+
* const video = useTemplateRef<HTMLVideoElement>("video");
|
|
268
|
+
* const { playing, currentTime, duration } = useMediaControls(video, {
|
|
269
|
+
* src: [{ src: "/clip.webm", type: "video/webm" }, { src: "/clip.mp4", type: "video/mp4" }],
|
|
270
|
+
* });
|
|
271
|
+
* ```
|
|
272
|
+
*
|
|
273
|
+
* @param target Reactive media element.
|
|
274
|
+
* @param options Source selection and picture-in-picture document.
|
|
275
|
+
* @default options {}
|
|
276
|
+
* @returns Reactive media state and actions.
|
|
277
|
+
*/
|
|
278
|
+
export function useMediaControls(
|
|
279
|
+
target: MaybeRefOrGetter<MediaElementLike | null | undefined>,
|
|
280
|
+
options: UseMediaControlsOptions = {},
|
|
281
|
+
): MediaControls {
|
|
282
|
+
const playing = ref(false);
|
|
283
|
+
const currentTime = ref(0);
|
|
284
|
+
const volume = ref(1);
|
|
285
|
+
const muted = ref(false);
|
|
286
|
+
const rate = ref(1);
|
|
287
|
+
const duration = ref(0);
|
|
288
|
+
const buffered = shallowRef<readonly (readonly [number, number])[]>([]);
|
|
289
|
+
const seeking = ref(false);
|
|
290
|
+
const waiting = ref(false);
|
|
291
|
+
const ended = ref(false);
|
|
292
|
+
const stalled = ref(false);
|
|
293
|
+
const error = shallowRef<unknown>(undefined);
|
|
294
|
+
const tracks = shallowRef<readonly MediaTextTrack[]>([]);
|
|
295
|
+
const selectedTrack = ref(-1);
|
|
296
|
+
const isPictureInPicture = ref(false);
|
|
297
|
+
// True while element events write into the refs, so the write-back
|
|
298
|
+
// watchers below do not echo the change to the element.
|
|
299
|
+
let syncing = false;
|
|
300
|
+
|
|
301
|
+
const resolveElement = (): MediaElementLike | undefined => toValue(target) ?? undefined;
|
|
302
|
+
const resolveDocument = (): PictureInPictureDocumentLike | undefined =>
|
|
303
|
+
options.document === undefined ? browserDocument() : (toValue(options.document) ?? undefined);
|
|
304
|
+
|
|
305
|
+
const fromElement = (update: () => void): void => {
|
|
306
|
+
syncing = true;
|
|
307
|
+
try {
|
|
308
|
+
update();
|
|
309
|
+
} finally {
|
|
310
|
+
syncing = false;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
const readTracks = (element: MediaElementLike): void => {
|
|
315
|
+
const list = element.textTracks;
|
|
316
|
+
const summary: MediaTextTrack[] = [];
|
|
317
|
+
let showing = -1;
|
|
318
|
+
for (let index = 0; list && index < list.length; index += 1) {
|
|
319
|
+
const track = list[index];
|
|
320
|
+
if (!track) continue;
|
|
321
|
+
summary.push({
|
|
322
|
+
index,
|
|
323
|
+
id: track.id,
|
|
324
|
+
kind: track.kind,
|
|
325
|
+
label: track.label,
|
|
326
|
+
language: track.language,
|
|
327
|
+
mode: track.mode,
|
|
328
|
+
});
|
|
329
|
+
if (track.mode === "showing" && showing === -1) showing = index;
|
|
330
|
+
}
|
|
331
|
+
tracks.value = summary;
|
|
332
|
+
selectedTrack.value = showing;
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
const readAll = (element: MediaElementLike): void => {
|
|
336
|
+
fromElement(() => {
|
|
337
|
+
playing.value = !element.paused;
|
|
338
|
+
currentTime.value = element.currentTime;
|
|
339
|
+
volume.value = element.volume;
|
|
340
|
+
muted.value = element.muted;
|
|
341
|
+
rate.value = element.playbackRate;
|
|
342
|
+
});
|
|
343
|
+
duration.value = Number.isFinite(element.duration) ? element.duration : 0;
|
|
344
|
+
buffered.value = readRanges(element.buffered);
|
|
345
|
+
seeking.value = element.seeking;
|
|
346
|
+
ended.value = element.ended;
|
|
347
|
+
readTracks(element);
|
|
348
|
+
const document = resolveDocument();
|
|
349
|
+
isPictureInPicture.value =
|
|
350
|
+
document?.pictureInPictureElement !== undefined &&
|
|
351
|
+
document.pictureInPictureElement === element;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
const play = async (): Promise<boolean> => {
|
|
355
|
+
const element = resolveElement();
|
|
356
|
+
if (!element) return false;
|
|
357
|
+
try {
|
|
358
|
+
await element.play();
|
|
359
|
+
error.value = undefined;
|
|
360
|
+
return true;
|
|
361
|
+
} catch (cause) {
|
|
362
|
+
error.value = cause;
|
|
363
|
+
fromElement(() => {
|
|
364
|
+
playing.value = !element.paused;
|
|
365
|
+
});
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
const pause = (): void => {
|
|
371
|
+
resolveElement()?.pause();
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
watch(
|
|
375
|
+
resolveElement,
|
|
376
|
+
(element, _previous, onCleanup) => {
|
|
377
|
+
if (!element) return;
|
|
378
|
+
readAll(element);
|
|
379
|
+
const handlers: Record<string, () => void> = {
|
|
380
|
+
timeupdate: () => fromElement(() => (currentTime.value = element.currentTime)),
|
|
381
|
+
durationchange: () => {
|
|
382
|
+
duration.value = Number.isFinite(element.duration) ? element.duration : 0;
|
|
383
|
+
},
|
|
384
|
+
loadedmetadata: () => readAll(element),
|
|
385
|
+
progress: () => {
|
|
386
|
+
buffered.value = readRanges(element.buffered);
|
|
387
|
+
stalled.value = false;
|
|
388
|
+
},
|
|
389
|
+
seeking: () => (seeking.value = true),
|
|
390
|
+
seeked: () => (seeking.value = false),
|
|
391
|
+
waiting: () => (waiting.value = true),
|
|
392
|
+
canplay: () => (waiting.value = false),
|
|
393
|
+
playing: () => {
|
|
394
|
+
waiting.value = false;
|
|
395
|
+
stalled.value = false;
|
|
396
|
+
ended.value = false;
|
|
397
|
+
},
|
|
398
|
+
play: () => fromElement(() => (playing.value = true)),
|
|
399
|
+
pause: () => fromElement(() => (playing.value = false)),
|
|
400
|
+
ended: () => {
|
|
401
|
+
ended.value = true;
|
|
402
|
+
fromElement(() => (playing.value = false));
|
|
403
|
+
},
|
|
404
|
+
stalled: () => (stalled.value = true),
|
|
405
|
+
volumechange: () =>
|
|
406
|
+
fromElement(() => {
|
|
407
|
+
volume.value = element.volume;
|
|
408
|
+
muted.value = element.muted;
|
|
409
|
+
}),
|
|
410
|
+
ratechange: () => fromElement(() => (rate.value = element.playbackRate)),
|
|
411
|
+
enterpictureinpicture: () => (isPictureInPicture.value = true),
|
|
412
|
+
leavepictureinpicture: () => (isPictureInPicture.value = false),
|
|
413
|
+
};
|
|
414
|
+
for (const [event, handler] of Object.entries(handlers)) {
|
|
415
|
+
element.addEventListener(event, handler);
|
|
416
|
+
}
|
|
417
|
+
const onTracksChange = (): void => readTracks(element);
|
|
418
|
+
element.textTracks?.addEventListener("change", onTracksChange);
|
|
419
|
+
element.textTracks?.addEventListener("addtrack", onTracksChange);
|
|
420
|
+
element.textTracks?.addEventListener("removetrack", onTracksChange);
|
|
421
|
+
onCleanup(() => {
|
|
422
|
+
for (const [event, handler] of Object.entries(handlers)) {
|
|
423
|
+
element.removeEventListener(event, handler);
|
|
424
|
+
}
|
|
425
|
+
element.textTracks?.removeEventListener("change", onTracksChange);
|
|
426
|
+
element.textTracks?.removeEventListener("addtrack", onTracksChange);
|
|
427
|
+
element.textTracks?.removeEventListener("removetrack", onTracksChange);
|
|
428
|
+
});
|
|
429
|
+
},
|
|
430
|
+
{ immediate: true, flush: "sync" },
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
watch(
|
|
434
|
+
[resolveElement, () => toValue(options.src)],
|
|
435
|
+
([element, source]) => {
|
|
436
|
+
if (!element || source === undefined) return;
|
|
437
|
+
const chosen = chooseSource(element, source);
|
|
438
|
+
if (chosen !== undefined && element.src !== chosen) element.src = chosen;
|
|
439
|
+
},
|
|
440
|
+
{ immediate: true, flush: "sync" },
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
watch(
|
|
444
|
+
playing,
|
|
445
|
+
(value) => {
|
|
446
|
+
if (syncing) return;
|
|
447
|
+
if (value) void play();
|
|
448
|
+
else pause();
|
|
449
|
+
},
|
|
450
|
+
{ flush: "sync" },
|
|
451
|
+
);
|
|
452
|
+
watch(
|
|
453
|
+
currentTime,
|
|
454
|
+
(value) => {
|
|
455
|
+
const element = resolveElement();
|
|
456
|
+
if (!syncing && element) element.currentTime = value;
|
|
457
|
+
},
|
|
458
|
+
{ flush: "sync" },
|
|
459
|
+
);
|
|
460
|
+
watch(
|
|
461
|
+
volume,
|
|
462
|
+
(value) => {
|
|
463
|
+
const element = resolveElement();
|
|
464
|
+
if (!syncing && element) element.volume = value;
|
|
465
|
+
},
|
|
466
|
+
{ flush: "sync" },
|
|
467
|
+
);
|
|
468
|
+
watch(
|
|
469
|
+
muted,
|
|
470
|
+
(value) => {
|
|
471
|
+
const element = resolveElement();
|
|
472
|
+
if (!syncing && element) element.muted = value;
|
|
473
|
+
},
|
|
474
|
+
{ flush: "sync" },
|
|
475
|
+
);
|
|
476
|
+
watch(
|
|
477
|
+
rate,
|
|
478
|
+
(value) => {
|
|
479
|
+
const element = resolveElement();
|
|
480
|
+
if (!syncing && element) element.playbackRate = value;
|
|
481
|
+
},
|
|
482
|
+
{ flush: "sync" },
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
const selectTrack = (index: number): void => {
|
|
486
|
+
const element = resolveElement();
|
|
487
|
+
const list = element?.textTracks;
|
|
488
|
+
if (!element || !list) return;
|
|
489
|
+
for (let position = 0; position < list.length; position += 1) {
|
|
490
|
+
const track = list[position];
|
|
491
|
+
if (track) track.mode = position === index ? "showing" : "disabled";
|
|
492
|
+
}
|
|
493
|
+
readTracks(element);
|
|
494
|
+
};
|
|
495
|
+
|
|
496
|
+
const supportsPictureInPicture = computed(() => {
|
|
497
|
+
const element = resolveElement();
|
|
498
|
+
const document = resolveDocument();
|
|
499
|
+
return (
|
|
500
|
+
typeof element?.requestPictureInPicture === "function" &&
|
|
501
|
+
document?.pictureInPictureEnabled !== false
|
|
502
|
+
);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
const togglePictureInPicture = async (): Promise<boolean> => {
|
|
506
|
+
const element = resolveElement();
|
|
507
|
+
const document = resolveDocument();
|
|
508
|
+
if (!element) return false;
|
|
509
|
+
try {
|
|
510
|
+
if (isPictureInPicture.value) {
|
|
511
|
+
await document?.exitPictureInPicture?.();
|
|
512
|
+
isPictureInPicture.value = false;
|
|
513
|
+
} else if (element.requestPictureInPicture) {
|
|
514
|
+
await element.requestPictureInPicture();
|
|
515
|
+
isPictureInPicture.value = true;
|
|
516
|
+
}
|
|
517
|
+
} catch (cause) {
|
|
518
|
+
error.value = cause;
|
|
519
|
+
}
|
|
520
|
+
return isPictureInPicture.value;
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
return {
|
|
524
|
+
playing,
|
|
525
|
+
currentTime,
|
|
526
|
+
volume,
|
|
527
|
+
muted,
|
|
528
|
+
rate,
|
|
529
|
+
duration: readonly(duration),
|
|
530
|
+
buffered,
|
|
531
|
+
seeking: readonly(seeking),
|
|
532
|
+
waiting: readonly(waiting),
|
|
533
|
+
ended: readonly(ended),
|
|
534
|
+
stalled: readonly(stalled),
|
|
535
|
+
error,
|
|
536
|
+
tracks,
|
|
537
|
+
selectedTrack: readonly(selectedTrack),
|
|
538
|
+
supportsPictureInPicture,
|
|
539
|
+
isPictureInPicture: readonly(isPictureInPicture),
|
|
540
|
+
play,
|
|
541
|
+
pause,
|
|
542
|
+
selectTrack,
|
|
543
|
+
togglePictureInPicture,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { shallowReactive } from "vue";
|
|
2
|
+
|
|
3
|
+
/** Minimal cache contract used by {@link useMemoize}; a `Map` satisfies it. */
|
|
4
|
+
export interface MemoizeCache<Key, Result> {
|
|
5
|
+
/** Read a cached result. */
|
|
6
|
+
get(key: Key): Result | undefined;
|
|
7
|
+
/** Store a result. */
|
|
8
|
+
set(key: Key, value: Result): unknown;
|
|
9
|
+
/** Whether a result is cached for `key`. */
|
|
10
|
+
has(key: Key): boolean;
|
|
11
|
+
/** Drop one result. */
|
|
12
|
+
delete(key: Key): unknown;
|
|
13
|
+
/** Drop every result. */
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Options for {@link useMemoize}. */
|
|
18
|
+
export interface UseMemoizeOptions<Arguments extends readonly unknown[], Key, Result> {
|
|
19
|
+
/**
|
|
20
|
+
* Derive the cache key from the arguments.
|
|
21
|
+
*
|
|
22
|
+
* @default JSON.stringify of the argument list
|
|
23
|
+
*/
|
|
24
|
+
readonly getKey?: (...args: Arguments) => Key;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Storage for results; supply an LRU or a persistent cache here.
|
|
28
|
+
*
|
|
29
|
+
* @default a reactive Map
|
|
30
|
+
*/
|
|
31
|
+
readonly cache?: MemoizeCache<Key, Result>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Memoized function returned by {@link useMemoize}. */
|
|
35
|
+
export interface Memoized<Arguments extends readonly unknown[], Result, Key> {
|
|
36
|
+
/** Return the cached result for these arguments, computing it on a miss. */
|
|
37
|
+
(...args: Arguments): Result;
|
|
38
|
+
|
|
39
|
+
/** Recompute and re-cache the result for these arguments. */
|
|
40
|
+
readonly load: (...args: Arguments) => Result;
|
|
41
|
+
|
|
42
|
+
/** Drop the cached result for these arguments. */
|
|
43
|
+
readonly delete: (...args: Arguments) => void;
|
|
44
|
+
|
|
45
|
+
/** Drop every cached result. */
|
|
46
|
+
readonly clear: () => void;
|
|
47
|
+
|
|
48
|
+
/** Cache key for these arguments. */
|
|
49
|
+
readonly generateKey: (...args: Arguments) => Key;
|
|
50
|
+
|
|
51
|
+
/** The underlying cache. */
|
|
52
|
+
readonly cache: MemoizeCache<Key, Result>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Cache a function's results per argument list.
|
|
57
|
+
*
|
|
58
|
+
* The default cache is a reactive `Map`, so computeds and templates that
|
|
59
|
+
* read a memoized value re-evaluate after `load`, `delete`, or `clear`.
|
|
60
|
+
* Promise-returning resolvers cache the promise itself, which deduplicates
|
|
61
|
+
* concurrent requests. Keys default to `JSON.stringify(args)` (a `string`);
|
|
62
|
+
* a custom `getKey` sets the key type, and a custom `cache` must use that
|
|
63
|
+
* key type. On the server keep memoized caches request-local (create them in
|
|
64
|
+
* `setup`), since a module-level cache is shared across requests.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const getUser = useMemoize((id: string) => fetchUser(id), { getKey: (id) => id });
|
|
69
|
+
* const user = computed(() => getUser(props.id));
|
|
70
|
+
* getUser.load(props.id); // refresh
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @param resolver Function whose results are cached.
|
|
74
|
+
* @param options Key derivation and cache storage.
|
|
75
|
+
* @default options {}
|
|
76
|
+
* @returns The memoized function with cache controls.
|
|
77
|
+
*/
|
|
78
|
+
export function useMemoize<Arguments extends readonly unknown[], Result, Key>(
|
|
79
|
+
resolver: (...args: Arguments) => Result,
|
|
80
|
+
options: UseMemoizeOptions<Arguments, Key, Result> & {
|
|
81
|
+
readonly getKey: (...args: Arguments) => Key;
|
|
82
|
+
},
|
|
83
|
+
): Memoized<Arguments, Result, Key>;
|
|
84
|
+
export function useMemoize<Arguments extends readonly unknown[], Result>(
|
|
85
|
+
resolver: (...args: Arguments) => Result,
|
|
86
|
+
options?: UseMemoizeOptions<Arguments, string, Result>,
|
|
87
|
+
): Memoized<Arguments, Result, string>;
|
|
88
|
+
export function useMemoize(
|
|
89
|
+
resolver: (...args: readonly unknown[]) => unknown,
|
|
90
|
+
options: UseMemoizeOptions<readonly unknown[], unknown, unknown> = {},
|
|
91
|
+
): Memoized<readonly unknown[], unknown, unknown> {
|
|
92
|
+
const cache = options.cache ?? shallowReactive(new Map<unknown, unknown>());
|
|
93
|
+
const generateKey = (...args: readonly unknown[]): unknown =>
|
|
94
|
+
options.getKey === undefined ? JSON.stringify(args) : options.getKey(...args);
|
|
95
|
+
|
|
96
|
+
const load = (...args: readonly unknown[]): unknown => {
|
|
97
|
+
const result = resolver(...args);
|
|
98
|
+
cache.set(generateKey(...args), result);
|
|
99
|
+
return result;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const memoized = (...args: readonly unknown[]): unknown => {
|
|
103
|
+
const key = generateKey(...args);
|
|
104
|
+
return cache.has(key) ? cache.get(key) : load(...args);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return Object.assign(memoized, {
|
|
108
|
+
load,
|
|
109
|
+
delete: (...args: readonly unknown[]) => {
|
|
110
|
+
cache.delete(generateKey(...args));
|
|
111
|
+
},
|
|
112
|
+
clear: () => {
|
|
113
|
+
cache.clear();
|
|
114
|
+
},
|
|
115
|
+
generateKey,
|
|
116
|
+
cache,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, shallowRef } from "vue";
|
|
2
|
+
import type { ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Whether the calling component has mounted.
|
|
6
|
+
*
|
|
7
|
+
* `false` during server rendering and during hydration, `true` from the
|
|
8
|
+
* component's `onMounted` on: gate client-only rendering behind it to keep
|
|
9
|
+
* hydration stable. Outside a component (no instance to mount) it stays
|
|
10
|
+
* `false`. Component detection uses `hasInjectionContext()` rather than
|
|
11
|
+
* `getCurrentInstance()`, which returns `null` inside Vapor components, so
|
|
12
|
+
* the flag also flips in Vapor.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const mounted = useMounted();
|
|
17
|
+
* // <ClientOnlyChart v-if="mounted" />
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @returns Readonly mounted flag.
|
|
21
|
+
*/
|
|
22
|
+
export function useMounted(): Readonly<ShallowRef<boolean>> {
|
|
23
|
+
const mounted = shallowRef(false);
|
|
24
|
+
if (hasInjectionContext()) {
|
|
25
|
+
onMounted(() => {
|
|
26
|
+
mounted.value = true;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return mounted;
|
|
30
|
+
}
|