@vizejs/composable 0.426.3 → 0.428.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,174 @@
|
|
|
1
|
+
import { computed, readonly, ref, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
import type { TimeoutScheduler } from "./timeout-scheduler.ts";
|
|
6
|
+
|
|
7
|
+
/** A single duration or an alternating vibrate/pause pattern in milliseconds. */
|
|
8
|
+
export type VibrationPattern = number | readonly number[];
|
|
9
|
+
|
|
10
|
+
/** Minimal Vibration API (`navigator`). */
|
|
11
|
+
export interface VibrationHost {
|
|
12
|
+
/** Start (or with `0`/`[]`, cancel) a vibration. Returns whether it was accepted. */
|
|
13
|
+
vibrate(pattern: VibrationPattern): boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Options for {@link useVibrate}. */
|
|
17
|
+
export interface UseVibrateOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Default pattern used by `vibrate()`.
|
|
20
|
+
*
|
|
21
|
+
* @default []
|
|
22
|
+
*/
|
|
23
|
+
readonly pattern?: MaybeRefOrGetter<VibrationPattern>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Repeat the pattern every `interval` milliseconds until `stop`; `0`
|
|
27
|
+
* vibrates once.
|
|
28
|
+
*
|
|
29
|
+
* @default 0
|
|
30
|
+
*/
|
|
31
|
+
readonly interval?: number;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Vibration capability for alternate runtimes and tests.
|
|
35
|
+
*
|
|
36
|
+
* @default window.navigator when it implements `vibrate`
|
|
37
|
+
*/
|
|
38
|
+
readonly host?: MaybeRefOrGetter<VibrationHost | null | undefined>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Timer host used for repetition.
|
|
42
|
+
*
|
|
43
|
+
* @default globalThis timer functions
|
|
44
|
+
*/
|
|
45
|
+
readonly scheduler?: TimeoutScheduler;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Reactive state and actions returned by {@link useVibrate}. */
|
|
49
|
+
export interface VibrateControls {
|
|
50
|
+
/** Whether the Vibration API is available. */
|
|
51
|
+
readonly supported: ComputedRef<boolean>;
|
|
52
|
+
|
|
53
|
+
/** Whether a (possibly repeating) vibration started by this composable is active. */
|
|
54
|
+
readonly vibrating: Readonly<Ref<boolean>>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Vibrate with `pattern` or the default pattern.
|
|
58
|
+
*
|
|
59
|
+
* @param pattern Pattern overriding the default.
|
|
60
|
+
* @returns Whether the platform accepted the pattern.
|
|
61
|
+
* @throws {RangeError} `[VIZE_COMPOSE_VIBRATE_INVALID_PATTERN]` for negative,
|
|
62
|
+
* fractional, or non-finite durations.
|
|
63
|
+
*/
|
|
64
|
+
readonly vibrate: (pattern?: VibrationPattern) => boolean;
|
|
65
|
+
|
|
66
|
+
/** Cancel the vibration and any repetition. */
|
|
67
|
+
readonly stop: () => void;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const defaultScheduler: TimeoutScheduler = {
|
|
71
|
+
setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
|
|
72
|
+
clearTimeout: (handle) => {
|
|
73
|
+
globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
function browserVibrationHost(): VibrationHost | undefined {
|
|
78
|
+
if (typeof window === "undefined") return undefined;
|
|
79
|
+
const { navigator } = window;
|
|
80
|
+
return typeof navigator.vibrate === "function" ? navigator : undefined;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function validatePattern(pattern: VibrationPattern): readonly number[] {
|
|
84
|
+
const durations = typeof pattern === "number" ? [pattern] : pattern;
|
|
85
|
+
for (const duration of durations) {
|
|
86
|
+
if (!Number.isSafeInteger(duration) || duration < 0) {
|
|
87
|
+
throw new RangeError(
|
|
88
|
+
`[VIZE_COMPOSE_VIBRATE_INVALID_PATTERN] vibration durations must be non-negative integers; received ${String(duration)}`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return durations;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Drive the Vibration API with validated, optionally repeating patterns.
|
|
97
|
+
*
|
|
98
|
+
* Patterns alternate vibration and pause durations. With `interval > 0`
|
|
99
|
+
* the pattern repeats until `stop` is called or the owning reactive scope
|
|
100
|
+
* stops, which also cancels an ongoing vibration.
|
|
101
|
+
*
|
|
102
|
+
* Server rendering: nothing vibrates and no timer starts; `supported` is false.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* const { vibrate, stop } = useVibrate({ pattern: [200, 100, 200] });
|
|
107
|
+
* vibrate();
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* @param options Default pattern, repetition, and capability.
|
|
111
|
+
* @default options {}
|
|
112
|
+
* @returns Vibration state and actions.
|
|
113
|
+
* @throws {RangeError} `[VIZE_COMPOSE_VIBRATE_INVALID_INTERVAL]` for a negative
|
|
114
|
+
* or non-finite interval.
|
|
115
|
+
*/
|
|
116
|
+
export function useVibrate(options: UseVibrateOptions = {}): VibrateControls {
|
|
117
|
+
const interval = options.interval ?? 0;
|
|
118
|
+
if (!Number.isFinite(interval) || interval < 0) {
|
|
119
|
+
throw new RangeError(
|
|
120
|
+
`[VIZE_COMPOSE_VIBRATE_INVALID_INTERVAL] interval must be a non-negative finite number; received ${String(interval)}`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
const scheduler = options.scheduler ?? defaultScheduler;
|
|
124
|
+
const vibrating = ref(false);
|
|
125
|
+
let handle: unknown;
|
|
126
|
+
let scheduled = false;
|
|
127
|
+
|
|
128
|
+
const resolveHost = (): VibrationHost | undefined =>
|
|
129
|
+
options.host === undefined ? browserVibrationHost() : (toValue(options.host) ?? undefined);
|
|
130
|
+
|
|
131
|
+
const clearRepeat = (): void => {
|
|
132
|
+
if (scheduled) scheduler.clearTimeout(handle);
|
|
133
|
+
scheduled = false;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const stop = (): void => {
|
|
137
|
+
clearRepeat();
|
|
138
|
+
if (vibrating.value) resolveHost()?.vibrate(0);
|
|
139
|
+
vibrating.value = false;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const vibrate = (pattern?: VibrationPattern): boolean => {
|
|
143
|
+
const durations = validatePattern(pattern ?? toValue(options.pattern) ?? []);
|
|
144
|
+
const host = resolveHost();
|
|
145
|
+
clearRepeat();
|
|
146
|
+
if (!host) return false;
|
|
147
|
+
const accepted = host.vibrate(durations);
|
|
148
|
+
const total = durations.reduce((sum, duration) => sum + duration, 0);
|
|
149
|
+
vibrating.value = accepted && total > 0;
|
|
150
|
+
if (vibrating.value && interval > 0) {
|
|
151
|
+
const repeat = (): void => {
|
|
152
|
+
scheduled = false;
|
|
153
|
+
if (!vibrating.value) return;
|
|
154
|
+
vibrating.value = host.vibrate(durations);
|
|
155
|
+
if (vibrating.value) {
|
|
156
|
+
scheduled = true;
|
|
157
|
+
handle = scheduler.setTimeout(repeat, interval);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
scheduled = true;
|
|
161
|
+
handle = scheduler.setTimeout(repeat, interval);
|
|
162
|
+
}
|
|
163
|
+
return accepted;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
tryOnScopeDispose(stop);
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
supported: computed(() => resolveHost() !== undefined),
|
|
170
|
+
vibrating: readonly(vibrating),
|
|
171
|
+
vibrate,
|
|
172
|
+
stop,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { computed, hasInjectionContext, readonly, shallowRef, toValue, watchPostEffect } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { useReducedMotion } from "./media-query.ts";
|
|
5
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
6
|
+
|
|
7
|
+
/** Minimal `ViewTransition`. */
|
|
8
|
+
export interface ViewTransitionLike {
|
|
9
|
+
/** Settles when the transition animation finished (or was skipped). */
|
|
10
|
+
readonly finished: Promise<void>;
|
|
11
|
+
/** Resolves when the animation is about to start; rejects when skipped. */
|
|
12
|
+
readonly ready: Promise<void>;
|
|
13
|
+
/** Settles when the update callback settled. */
|
|
14
|
+
readonly updateCallbackDone: Promise<void>;
|
|
15
|
+
/** Skip the animation; the update still runs. */
|
|
16
|
+
skipTransition(): void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Argument accepted by `document.startViewTransition`. */
|
|
20
|
+
export type StartViewTransitionArgument =
|
|
21
|
+
| (() => unknown)
|
|
22
|
+
| {
|
|
23
|
+
/** DOM update callback. */
|
|
24
|
+
readonly update?: () => unknown;
|
|
25
|
+
/** Active transition types (`:active-view-transition-type()`). */
|
|
26
|
+
readonly types?: string[];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Minimal document consumed by {@link useViewTransition}. */
|
|
30
|
+
export interface ViewTransitionDocumentHost {
|
|
31
|
+
/** Start a same-document view transition. */
|
|
32
|
+
startViewTransition(update?: StartViewTransitionArgument): ViewTransitionLike;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Options for {@link useViewTransition}. */
|
|
36
|
+
export interface UseViewTransitionOptions {
|
|
37
|
+
/**
|
|
38
|
+
* Document for alternate runtimes and tests.
|
|
39
|
+
*
|
|
40
|
+
* @default window.document when it implements startViewTransition
|
|
41
|
+
*/
|
|
42
|
+
readonly document?: MaybeRefOrGetter<ViewTransitionDocumentHost | null | undefined>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Run updates without a transition while reduced motion is preferred.
|
|
46
|
+
*
|
|
47
|
+
* @default true
|
|
48
|
+
*/
|
|
49
|
+
readonly respectReducedMotion?: boolean;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Whether reduced motion is preferred.
|
|
53
|
+
*
|
|
54
|
+
* @default useReducedMotion() === "reduce"
|
|
55
|
+
*/
|
|
56
|
+
readonly reducedMotion?: MaybeRefOrGetter<boolean>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Per-call options of {@link ViewTransitionControls.start}. */
|
|
60
|
+
export interface ViewTransitionStartOptions {
|
|
61
|
+
/**
|
|
62
|
+
* Transition types. Runtimes without typed transitions fall back to an
|
|
63
|
+
* untyped transition.
|
|
64
|
+
*
|
|
65
|
+
* @default []
|
|
66
|
+
*/
|
|
67
|
+
readonly types?: readonly string[];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Reactive state and actions returned by {@link useViewTransition}. */
|
|
71
|
+
export interface ViewTransitionControls {
|
|
72
|
+
/** Whether `document.startViewTransition` is available. */
|
|
73
|
+
readonly supported: ComputedRef<boolean>;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The running transition (the host object itself, not a readonly proxy, so
|
|
77
|
+
* native methods keep working), cleared once it finished.
|
|
78
|
+
*/
|
|
79
|
+
readonly transition: ComputedRef<ViewTransitionLike | null>;
|
|
80
|
+
|
|
81
|
+
/** Whether a transition started by this composable is running. */
|
|
82
|
+
readonly isTransitioning: Readonly<ShallowRef<boolean>>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Run `update` inside a view transition, or directly when unsupported or
|
|
86
|
+
* reduced motion is preferred.
|
|
87
|
+
*
|
|
88
|
+
* @param update DOM update; may return a value or a promise.
|
|
89
|
+
* @param options Transition types.
|
|
90
|
+
* @default options {}
|
|
91
|
+
* @returns Resolves with the update result once the DOM was updated (the
|
|
92
|
+
* animation may still run; await `transition.value?.finished` for it);
|
|
93
|
+
* rejects with the update error.
|
|
94
|
+
*/
|
|
95
|
+
readonly start: <Result>(
|
|
96
|
+
update: () => Result | PromiseLike<Result>,
|
|
97
|
+
options?: ViewTransitionStartOptions,
|
|
98
|
+
) => Promise<Result>;
|
|
99
|
+
|
|
100
|
+
/** Skip the running transition's animation. */
|
|
101
|
+
readonly skip: () => void;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function browserDocument(): ViewTransitionDocumentHost | undefined {
|
|
105
|
+
return typeof window !== "undefined" && typeof window.document.startViewTransition === "function"
|
|
106
|
+
? window.document
|
|
107
|
+
: undefined;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function ignore(): void {
|
|
111
|
+
// Settlement is observed elsewhere.
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Animate DOM updates with the View Transition API.
|
|
116
|
+
*
|
|
117
|
+
* Starting a new transition skips the running one (browser behavior). The
|
|
118
|
+
* running transition is skipped when the owning reactive scope stops.
|
|
119
|
+
*
|
|
120
|
+
* Server rendering: `start` runs the update directly; `supported` and
|
|
121
|
+
* `isTransitioning` are false.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* const { start } = useViewTransition();
|
|
126
|
+
* await start(async () => {
|
|
127
|
+
* page.value = next;
|
|
128
|
+
* await nextTick();
|
|
129
|
+
* }, { types: ["forward"] });
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* @param options Document host and reduced-motion policy.
|
|
133
|
+
* @default options {}
|
|
134
|
+
* @returns Transition state and actions.
|
|
135
|
+
*/
|
|
136
|
+
export function useViewTransition(options: UseViewTransitionOptions = {}): ViewTransitionControls {
|
|
137
|
+
const transition = shallowRef<ViewTransitionLike | null>(null);
|
|
138
|
+
const isTransitioning = shallowRef(false);
|
|
139
|
+
const respect = options.respectReducedMotion ?? true;
|
|
140
|
+
const preference =
|
|
141
|
+
respect && options.reducedMotion === undefined ? useReducedMotion() : undefined;
|
|
142
|
+
|
|
143
|
+
// Inside a component the host resolves only after mount (a post-flush
|
|
144
|
+
// job), so a hydrating client first renders the same unsupported state as
|
|
145
|
+
// the server. Outside components it resolves immediately.
|
|
146
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
147
|
+
if (!hydrated.value) {
|
|
148
|
+
watchPostEffect(() => {
|
|
149
|
+
hydrated.value = true;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const resolveDocument = (): ViewTransitionDocumentHost | undefined =>
|
|
153
|
+
!hydrated.value
|
|
154
|
+
? undefined
|
|
155
|
+
: options.document === undefined
|
|
156
|
+
? browserDocument()
|
|
157
|
+
: (toValue(options.document) ?? undefined);
|
|
158
|
+
|
|
159
|
+
const prefersReducedMotion = (): boolean => {
|
|
160
|
+
if (!respect) return false;
|
|
161
|
+
return preference ? preference.value === "reduce" : toValue(options.reducedMotion) === true;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const begin = (
|
|
165
|
+
host: ViewTransitionDocumentHost,
|
|
166
|
+
run: () => Promise<void>,
|
|
167
|
+
types: readonly string[],
|
|
168
|
+
): ViewTransitionLike => {
|
|
169
|
+
if (types.length === 0) return host.startViewTransition(run);
|
|
170
|
+
try {
|
|
171
|
+
return host.startViewTransition({ update: run, types: [...types] });
|
|
172
|
+
} catch {
|
|
173
|
+
// Runtimes without typed transitions reject the options object.
|
|
174
|
+
return host.startViewTransition(run);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const start = async <Result>(
|
|
179
|
+
update: () => Result | PromiseLike<Result>,
|
|
180
|
+
startOptions: ViewTransitionStartOptions = {},
|
|
181
|
+
): Promise<Result> => {
|
|
182
|
+
const host = resolveDocument();
|
|
183
|
+
if (!host || prefersReducedMotion()) return update();
|
|
184
|
+
|
|
185
|
+
let run: () => Promise<void> = async () => undefined;
|
|
186
|
+
const outcome = new Promise<Result>((resolve, reject) => {
|
|
187
|
+
run = async () => {
|
|
188
|
+
try {
|
|
189
|
+
resolve(await update());
|
|
190
|
+
} catch (cause) {
|
|
191
|
+
reject(cause);
|
|
192
|
+
throw cause;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
let current: ViewTransitionLike;
|
|
198
|
+
try {
|
|
199
|
+
current = begin(host, run, startOptions.types ?? []);
|
|
200
|
+
} catch {
|
|
201
|
+
return update();
|
|
202
|
+
}
|
|
203
|
+
transition.value = current;
|
|
204
|
+
isTransitioning.value = true;
|
|
205
|
+
const clear = (): void => {
|
|
206
|
+
if (transition.value !== current) return;
|
|
207
|
+
transition.value = null;
|
|
208
|
+
isTransitioning.value = false;
|
|
209
|
+
};
|
|
210
|
+
current.ready.catch(ignore);
|
|
211
|
+
current.updateCallbackDone.catch(ignore);
|
|
212
|
+
current.finished.then(clear, clear);
|
|
213
|
+
return outcome;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const skip = (): void => {
|
|
217
|
+
transition.value?.skipTransition();
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
tryOnScopeDispose(skip);
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
supported: computed(() => resolveDocument() !== undefined),
|
|
224
|
+
transition: computed(() => transition.value),
|
|
225
|
+
isTransitioning: readonly(isTransitioning),
|
|
226
|
+
start,
|
|
227
|
+
skip,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
hasInjectionContext,
|
|
4
|
+
readonly,
|
|
5
|
+
ref,
|
|
6
|
+
shallowRef,
|
|
7
|
+
toValue,
|
|
8
|
+
watch,
|
|
9
|
+
watchPostEffect,
|
|
10
|
+
} from "vue";
|
|
11
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
12
|
+
|
|
13
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
14
|
+
|
|
15
|
+
/** Structural `VisualViewport` observed by {@link useVisualViewport}. */
|
|
16
|
+
export interface VisualViewportHost extends EventTarget {
|
|
17
|
+
/** Visible width in CSS pixels. */
|
|
18
|
+
readonly width: number;
|
|
19
|
+
/** Visible height in CSS pixels (shrinks when an on-screen keyboard overlays the page). */
|
|
20
|
+
readonly height: number;
|
|
21
|
+
/** Offset of the visual viewport from the layout viewport's top edge. */
|
|
22
|
+
readonly offsetTop: number;
|
|
23
|
+
/** Offset of the visual viewport from the layout viewport's left edge. */
|
|
24
|
+
readonly offsetLeft: number;
|
|
25
|
+
/** Pinch-zoom scale factor. */
|
|
26
|
+
readonly scale: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Structural VirtualKeyboard API (`navigator.virtualKeyboard`). */
|
|
30
|
+
export interface VirtualKeyboardHost extends EventTarget {
|
|
31
|
+
/** Whether the keyboard overlays content instead of resizing the viewport. */
|
|
32
|
+
overlaysContent: boolean;
|
|
33
|
+
/** Keyboard rectangle in CSS pixels. */
|
|
34
|
+
readonly boundingRect: { readonly height: number };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Window-like capability read by {@link useVisualViewport}. */
|
|
38
|
+
export interface VisualViewportWindowHost {
|
|
39
|
+
/** Layout viewport height. */
|
|
40
|
+
readonly innerHeight: number;
|
|
41
|
+
/** Visual viewport, when the engine supports it. */
|
|
42
|
+
readonly visualViewport?: VisualViewportHost | null;
|
|
43
|
+
/** Navigator that may expose the VirtualKeyboard API as `virtualKeyboard`. */
|
|
44
|
+
readonly navigator?: object;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Options for {@link useVisualViewport}. */
|
|
48
|
+
export interface UseVisualViewportOptions {
|
|
49
|
+
/**
|
|
50
|
+
* Minimum occluded height (CSS px) reported as an open keyboard, filtering
|
|
51
|
+
* browser toolbars that collapse while scrolling.
|
|
52
|
+
*
|
|
53
|
+
* @default 120
|
|
54
|
+
*/
|
|
55
|
+
readonly keyboardThreshold?: number;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Opt in to `navigator.virtualKeyboard.overlaysContent = true` (Chromium) so
|
|
59
|
+
* the keyboard height comes from the VirtualKeyboard API and the layout
|
|
60
|
+
* viewport no longer resizes. The previous value is restored on cleanup.
|
|
61
|
+
*
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
readonly overlaysContent?: boolean;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
68
|
+
*
|
|
69
|
+
* @default globalThis.window when available
|
|
70
|
+
*/
|
|
71
|
+
readonly host?: MaybeRefOrGetter<VisualViewportWindowHost | null | undefined>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Reactive viewport geometry returned by {@link useVisualViewport}. */
|
|
75
|
+
export interface VisualViewportControls {
|
|
76
|
+
/** Visual viewport width (0 on the server). */
|
|
77
|
+
readonly width: Readonly<Ref<number>>;
|
|
78
|
+
/** Visual viewport height (0 on the server). */
|
|
79
|
+
readonly height: Readonly<Ref<number>>;
|
|
80
|
+
/** Visual viewport top offset within the layout viewport. */
|
|
81
|
+
readonly offsetTop: Readonly<Ref<number>>;
|
|
82
|
+
/** Visual viewport left offset within the layout viewport. */
|
|
83
|
+
readonly offsetLeft: Readonly<Ref<number>>;
|
|
84
|
+
/** Pinch-zoom scale (1 on the server). */
|
|
85
|
+
readonly scale: Readonly<Ref<number>>;
|
|
86
|
+
/** Height of the bottom area hidden by an on-screen keyboard, in CSS px. */
|
|
87
|
+
readonly keyboardHeight: Readonly<Ref<number>>;
|
|
88
|
+
/** Whether `keyboardHeight` exceeds `keyboardThreshold`. */
|
|
89
|
+
readonly keyboardOpen: ComputedRef<boolean>;
|
|
90
|
+
/** Whether a VisualViewport (or VirtualKeyboard) capability is attached. */
|
|
91
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Track the visual viewport and on-screen keyboard.
|
|
96
|
+
*
|
|
97
|
+
* On mobile browsers the visual viewport shrinks (or scrolls) when a virtual
|
|
98
|
+
* keyboard opens while the layout viewport stays put; `keyboardHeight` is the
|
|
99
|
+
* occluded bottom area (`innerHeight - height - offsetTop`), or the
|
|
100
|
+
* VirtualKeyboard API rectangle when `overlaysContent` is enabled. Pin
|
|
101
|
+
* toolbars above the keyboard with `bottom: calc(var(--kb, 0px))` bound to it.
|
|
102
|
+
*
|
|
103
|
+
* Server rendering reports zeros (scale 1) and attaches nothing; inside a
|
|
104
|
+
* component the host attaches after mount, so hydration renders the same
|
|
105
|
+
* zeros first. Listeners
|
|
106
|
+
* (`resize`, `scroll`, `geometrychange`) are passive and removed with the
|
|
107
|
+
* owning reactive scope.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const { keyboardHeight, keyboardOpen } = useVisualViewport();
|
|
112
|
+
* const toolbarStyle = computed(() => ({ bottom: `${keyboardHeight.value}px` }));
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @param options Keyboard threshold, VirtualKeyboard opt-in, and capability.
|
|
116
|
+
* @default options {}
|
|
117
|
+
* @returns Reactive viewport geometry and keyboard state.
|
|
118
|
+
*/
|
|
119
|
+
export function useVisualViewport(options: UseVisualViewportOptions = {}): VisualViewportControls {
|
|
120
|
+
const threshold =
|
|
121
|
+
typeof options.keyboardThreshold === "number" && Number.isFinite(options.keyboardThreshold)
|
|
122
|
+
? Math.max(options.keyboardThreshold, 0)
|
|
123
|
+
: 120;
|
|
124
|
+
const width = ref(0);
|
|
125
|
+
const height = ref(0);
|
|
126
|
+
const offsetTop = ref(0);
|
|
127
|
+
const offsetLeft = ref(0);
|
|
128
|
+
const scale = ref(1);
|
|
129
|
+
const keyboardHeight = ref(0);
|
|
130
|
+
const isSupported = ref(false);
|
|
131
|
+
|
|
132
|
+
// Inside a component the host is attached after mount (a post-flush
|
|
133
|
+
// job), so a hydrating client first renders the same zeroed geometry as
|
|
134
|
+
// the server. Outside components it attaches immediately.
|
|
135
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
136
|
+
if (!hydrated.value) {
|
|
137
|
+
watchPostEffect(() => {
|
|
138
|
+
hydrated.value = true;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const stopWatch = watch(
|
|
142
|
+
() =>
|
|
143
|
+
!hydrated.value
|
|
144
|
+
? undefined
|
|
145
|
+
: options.host === undefined
|
|
146
|
+
? browserViewportHost()
|
|
147
|
+
: toValue(options.host),
|
|
148
|
+
(host, _previous, onCleanup) => {
|
|
149
|
+
const viewport = host?.visualViewport ?? undefined;
|
|
150
|
+
const keyboard =
|
|
151
|
+
options.overlaysContent === true ? virtualKeyboardOf(host?.navigator) : undefined;
|
|
152
|
+
isSupported.value = viewport !== undefined || keyboard !== undefined;
|
|
153
|
+
if (host === null || host === undefined || !isSupported.value) {
|
|
154
|
+
width.value = 0;
|
|
155
|
+
height.value = 0;
|
|
156
|
+
offsetTop.value = 0;
|
|
157
|
+
offsetLeft.value = 0;
|
|
158
|
+
scale.value = 1;
|
|
159
|
+
keyboardHeight.value = 0;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const previousOverlay = keyboard?.overlaysContent;
|
|
163
|
+
if (keyboard !== undefined) keyboard.overlaysContent = true;
|
|
164
|
+
const update = (): void => {
|
|
165
|
+
if (viewport !== undefined) {
|
|
166
|
+
width.value = viewport.width;
|
|
167
|
+
height.value = viewport.height;
|
|
168
|
+
offsetTop.value = viewport.offsetTop;
|
|
169
|
+
offsetLeft.value = viewport.offsetLeft;
|
|
170
|
+
scale.value = viewport.scale;
|
|
171
|
+
}
|
|
172
|
+
const occluded =
|
|
173
|
+
keyboard !== undefined
|
|
174
|
+
? keyboard.boundingRect.height
|
|
175
|
+
: viewport === undefined
|
|
176
|
+
? 0
|
|
177
|
+
: host.innerHeight - viewport.height - viewport.offsetTop;
|
|
178
|
+
keyboardHeight.value = Math.max(Math.round(occluded), 0);
|
|
179
|
+
};
|
|
180
|
+
update();
|
|
181
|
+
const passive: AddEventListenerOptions = { passive: true };
|
|
182
|
+
viewport?.addEventListener("resize", update, passive);
|
|
183
|
+
viewport?.addEventListener("scroll", update, passive);
|
|
184
|
+
keyboard?.addEventListener("geometrychange", update, passive);
|
|
185
|
+
onCleanup(() => {
|
|
186
|
+
viewport?.removeEventListener("resize", update);
|
|
187
|
+
viewport?.removeEventListener("scroll", update);
|
|
188
|
+
keyboard?.removeEventListener("geometrychange", update);
|
|
189
|
+
if (keyboard !== undefined && previousOverlay !== undefined) {
|
|
190
|
+
keyboard.overlaysContent = previousOverlay;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
{ immediate: true },
|
|
195
|
+
);
|
|
196
|
+
tryOnScopeDispose(() => stopWatch.stop());
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
width: readonly(width),
|
|
200
|
+
height: readonly(height),
|
|
201
|
+
offsetTop: readonly(offsetTop),
|
|
202
|
+
offsetLeft: readonly(offsetLeft),
|
|
203
|
+
scale: readonly(scale),
|
|
204
|
+
keyboardHeight: readonly(keyboardHeight),
|
|
205
|
+
keyboardOpen: computed(() => keyboardHeight.value > threshold),
|
|
206
|
+
isSupported: readonly(isSupported),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function browserViewportHost(): VisualViewportWindowHost | undefined {
|
|
211
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function isVirtualKeyboard(value: unknown): value is VirtualKeyboardHost {
|
|
215
|
+
return (
|
|
216
|
+
typeof value === "object" &&
|
|
217
|
+
value !== null &&
|
|
218
|
+
"overlaysContent" in value &&
|
|
219
|
+
"boundingRect" in value &&
|
|
220
|
+
typeof Reflect.get(value, "addEventListener") === "function"
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function virtualKeyboardOf(navigator: object | undefined): VirtualKeyboardHost | undefined {
|
|
225
|
+
if (navigator === undefined || !("virtualKeyboard" in navigator)) return undefined;
|
|
226
|
+
const keyboard: unknown = navigator.virtualKeyboard;
|
|
227
|
+
return isVirtualKeyboard(keyboard) ? keyboard : undefined;
|
|
228
|
+
}
|