@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,75 @@
|
|
|
1
|
+
import { inject, provide } from "vue";
|
|
2
|
+
import type { InjectionKey } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Options for {@link createInjectionState}. */
|
|
5
|
+
export interface CreateInjectionStateOptions<State> {
|
|
6
|
+
/**
|
|
7
|
+
* Key used for `provide`/`inject`.
|
|
8
|
+
*
|
|
9
|
+
* @default a fresh unique symbol
|
|
10
|
+
*/
|
|
11
|
+
readonly injectionKey?: InjectionKey<State>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Value injected when no ancestor provides the state; also narrows the
|
|
15
|
+
* injector's return type to `State`.
|
|
16
|
+
*
|
|
17
|
+
* @default undefined
|
|
18
|
+
*/
|
|
19
|
+
readonly defaultValue?: State;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Provider, injector, and key returned by {@link createInjectionState}. */
|
|
23
|
+
export type InjectionState<Arguments extends readonly unknown[], State, Injected> = readonly [
|
|
24
|
+
useProvidingState: (...args: Arguments) => State,
|
|
25
|
+
useInjectedState: () => Injected,
|
|
26
|
+
injectionKey: InjectionKey<State>,
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Create a typed provide/inject pair around a composable, for component
|
|
31
|
+
* subtrees that share request-local state.
|
|
32
|
+
*
|
|
33
|
+
* The provider runs the composable with its arguments, provides the result
|
|
34
|
+
* under a typed `InjectionKey`, and returns it. The injector returns the
|
|
35
|
+
* nearest provided state, or `defaultValue`, or `undefined` (reflected in
|
|
36
|
+
* its return type). State lives in the component tree, so unlike module
|
|
37
|
+
* globals it is naturally per request during SSR. Both must be called
|
|
38
|
+
* during `setup` (or inside `app.runWithContext`).
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const [useProvideCounter, useCounter] = createInjectionState((initial: number) => {
|
|
43
|
+
* const count = ref(initial);
|
|
44
|
+
* return { count, increment: () => count.value++ };
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param composable Creates the state in the providing component.
|
|
49
|
+
* @param options Custom key and default value.
|
|
50
|
+
* @default options {}
|
|
51
|
+
* @returns `[useProvidingState, useInjectedState, injectionKey]`.
|
|
52
|
+
*/
|
|
53
|
+
export function createInjectionState<Arguments extends readonly unknown[], State>(
|
|
54
|
+
composable: (...args: Arguments) => State,
|
|
55
|
+
options: CreateInjectionStateOptions<State> & { readonly defaultValue: State },
|
|
56
|
+
): InjectionState<Arguments, State, State>;
|
|
57
|
+
export function createInjectionState<Arguments extends readonly unknown[], State>(
|
|
58
|
+
composable: (...args: Arguments) => State,
|
|
59
|
+
options?: CreateInjectionStateOptions<State>,
|
|
60
|
+
): InjectionState<Arguments, State, State | undefined>;
|
|
61
|
+
export function createInjectionState<Arguments extends readonly unknown[], State>(
|
|
62
|
+
composable: (...args: Arguments) => State,
|
|
63
|
+
options: CreateInjectionStateOptions<State> = {},
|
|
64
|
+
): InjectionState<Arguments, State, State | undefined> {
|
|
65
|
+
const generatedKey: InjectionKey<State> = Symbol("InjectionState");
|
|
66
|
+
const key = options.injectionKey ?? generatedKey;
|
|
67
|
+
const useProvidingState = (...args: Arguments): State => {
|
|
68
|
+
const state = composable(...args);
|
|
69
|
+
provide(key, state);
|
|
70
|
+
return state;
|
|
71
|
+
};
|
|
72
|
+
const useInjectedState = (): State | undefined =>
|
|
73
|
+
options.defaultValue === undefined ? inject(key) : inject(key, options.defaultValue);
|
|
74
|
+
return [useProvidingState, useInjectedState, key];
|
|
75
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { effectScope } from "vue";
|
|
2
|
+
import type { EffectScope } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Options for {@link createSharedComposable}. */
|
|
7
|
+
export interface CreateSharedComposableOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Share one instance across callers on the server too. Disabled by
|
|
10
|
+
* default because module-level sharing leaks state between requests;
|
|
11
|
+
* without a browser `window` every call then gets its own instance.
|
|
12
|
+
*
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
readonly shareOnServer?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Share one instance of a composable between all simultaneously mounted
|
|
20
|
+
* callers, reference-counted by their effect scopes.
|
|
21
|
+
*
|
|
22
|
+
* The first caller creates the instance inside a detached scope using its
|
|
23
|
+
* arguments (later callers' arguments are ignored while it lives). When the
|
|
24
|
+
* last subscribing scope stops, the instance's scope is stopped and the next
|
|
25
|
+
* call starts fresh. Calls outside any effect scope subscribe permanently.
|
|
26
|
+
* On the server every call gets its own instance unless `shareOnServer` is
|
|
27
|
+
* set, so request state never leaks.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const useSharedMouse = createSharedComposable(useMouse);
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @param composable Composable to share.
|
|
35
|
+
* @param options Server sharing policy.
|
|
36
|
+
* @default options {}
|
|
37
|
+
* @throws `Error` tagged `VIZE_COMPOSE_SHARED_COMPOSABLE_INACTIVE_SCOPE` if
|
|
38
|
+
* the private scope cannot run (never expected in practice).
|
|
39
|
+
* @returns A composable with the same signature that shares its result.
|
|
40
|
+
*/
|
|
41
|
+
export function createSharedComposable<Arguments extends readonly unknown[], Result>(
|
|
42
|
+
composable: (...args: Arguments) => Result,
|
|
43
|
+
options: CreateSharedComposableOptions = {},
|
|
44
|
+
): (...args: Arguments) => Result {
|
|
45
|
+
let subscribers = 0;
|
|
46
|
+
let shared: { readonly result: Result; readonly scope: EffectScope } | undefined;
|
|
47
|
+
|
|
48
|
+
const release = (): void => {
|
|
49
|
+
subscribers -= 1;
|
|
50
|
+
if (subscribers > 0 || shared === undefined) return;
|
|
51
|
+
shared.scope.stop();
|
|
52
|
+
shared = undefined;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return (...args) => {
|
|
56
|
+
if (typeof window === "undefined" && !(options.shareOnServer ?? false)) {
|
|
57
|
+
return composable(...args);
|
|
58
|
+
}
|
|
59
|
+
subscribers += 1;
|
|
60
|
+
if (shared === undefined) {
|
|
61
|
+
const scope = effectScope(true);
|
|
62
|
+
const result = scope.run(() => ({ value: composable(...args) }));
|
|
63
|
+
if (result === undefined) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
"[VIZE_COMPOSE_SHARED_COMPOSABLE_INACTIVE_SCOPE] the shared scope did not run",
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
shared = { result: result.value, scope };
|
|
69
|
+
}
|
|
70
|
+
const { result } = shared;
|
|
71
|
+
tryOnScopeDispose(release);
|
|
72
|
+
return result;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { requestMotionPermission } from "./device-orientation.ts";
|
|
5
|
+
import type { MotionPermissionConstructor, MotionPermissionState } from "./device-orientation.ts";
|
|
6
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
7
|
+
|
|
8
|
+
/** Window-like capability observed by {@link useDeviceMotion}. */
|
|
9
|
+
export interface DeviceMotionHost extends EventTarget {
|
|
10
|
+
/** Constructor used to detect support and request permission. */
|
|
11
|
+
readonly DeviceMotionEvent?: MotionPermissionConstructor;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Acceleration along the device axes in m/s². */
|
|
15
|
+
export interface MotionVector {
|
|
16
|
+
/** X axis (left to right). */
|
|
17
|
+
readonly x: number | null;
|
|
18
|
+
/** Y axis (bottom to top). */
|
|
19
|
+
readonly y: number | null;
|
|
20
|
+
/** Z axis (back to front). */
|
|
21
|
+
readonly z: number | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Rotation rate around the device axes in degrees per second. */
|
|
25
|
+
export interface MotionRotationRate {
|
|
26
|
+
/** Around the Z axis. */
|
|
27
|
+
readonly alpha: number | null;
|
|
28
|
+
/** Around the X axis. */
|
|
29
|
+
readonly beta: number | null;
|
|
30
|
+
/** Around the Y axis. */
|
|
31
|
+
readonly gamma: number | null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Options for {@link useDeviceMotion}. */
|
|
35
|
+
export interface UseDeviceMotionOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
38
|
+
*
|
|
39
|
+
* @default globalThis.window when available
|
|
40
|
+
*/
|
|
41
|
+
readonly host?: MaybeRefOrGetter<DeviceMotionHost | null | undefined>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Reactive motion state returned by {@link useDeviceMotion}. */
|
|
45
|
+
export interface DeviceMotionControls {
|
|
46
|
+
/** Whether the host exposes `DeviceMotionEvent`. `false` during server rendering. */
|
|
47
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
48
|
+
/** Acceleration without gravity; `null` before the first reading. */
|
|
49
|
+
readonly acceleration: Readonly<ShallowRef<MotionVector | null>>;
|
|
50
|
+
/** Acceleration including gravity; `null` before the first reading. */
|
|
51
|
+
readonly accelerationIncludingGravity: Readonly<ShallowRef<MotionVector | null>>;
|
|
52
|
+
/** Rotation rate; `null` before the first reading. */
|
|
53
|
+
readonly rotationRate: Readonly<ShallowRef<MotionRotationRate | null>>;
|
|
54
|
+
/** Sampling interval in milliseconds. */
|
|
55
|
+
readonly interval: Readonly<Ref<number>>;
|
|
56
|
+
/** Latest permission outcome; `"granted"` where no prompt exists. */
|
|
57
|
+
readonly permission: Readonly<Ref<MotionPermissionState>>;
|
|
58
|
+
/**
|
|
59
|
+
* Request sensor permission where the platform requires it.
|
|
60
|
+
*
|
|
61
|
+
* @returns The resulting permission state.
|
|
62
|
+
*/
|
|
63
|
+
readonly requestPermission: () => Promise<MotionPermissionState>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Track device acceleration and rotation rate.
|
|
68
|
+
*
|
|
69
|
+
* Readings are copied into plain snapshots. Server renders expose `null`
|
|
70
|
+
* readings and `isSupported: false`; the listener is removed with the owning
|
|
71
|
+
* reactive scope. Shares the permission model of `useDeviceOrientation`.
|
|
72
|
+
*
|
|
73
|
+
* @param options Window capability.
|
|
74
|
+
* @default options {}
|
|
75
|
+
* @returns Reactive readings, support/permission state, and a permission action.
|
|
76
|
+
*/
|
|
77
|
+
export function useDeviceMotion(options: UseDeviceMotionOptions = {}): DeviceMotionControls {
|
|
78
|
+
const isSupported = ref(false);
|
|
79
|
+
const acceleration = shallowRef<MotionVector | null>(null);
|
|
80
|
+
const accelerationIncludingGravity = shallowRef<MotionVector | null>(null);
|
|
81
|
+
const rotationRate = shallowRef<MotionRotationRate | null>(null);
|
|
82
|
+
const interval = ref(0);
|
|
83
|
+
const permission = ref<MotionPermissionState>("prompt");
|
|
84
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
85
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
86
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
87
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
88
|
+
if (!mounted.value) {
|
|
89
|
+
onMounted(() => {
|
|
90
|
+
mounted.value = true;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const host = (): DeviceMotionHost | null | undefined =>
|
|
94
|
+
!mounted.value
|
|
95
|
+
? undefined
|
|
96
|
+
: options.host === undefined
|
|
97
|
+
? browserMotionHost()
|
|
98
|
+
: toValue(options.host);
|
|
99
|
+
|
|
100
|
+
const onMotion = (event: Event): void => {
|
|
101
|
+
if (!isMotionEvent(event)) return;
|
|
102
|
+
acceleration.value = vector(event.acceleration);
|
|
103
|
+
accelerationIncludingGravity.value = vector(event.accelerationIncludingGravity);
|
|
104
|
+
rotationRate.value = event.rotationRate
|
|
105
|
+
? {
|
|
106
|
+
alpha: event.rotationRate.alpha,
|
|
107
|
+
beta: event.rotationRate.beta,
|
|
108
|
+
gamma: event.rotationRate.gamma,
|
|
109
|
+
}
|
|
110
|
+
: null;
|
|
111
|
+
interval.value = event.interval;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const stop = watch(
|
|
115
|
+
host,
|
|
116
|
+
(current, _previous, onCleanup) => {
|
|
117
|
+
const constructor = current?.DeviceMotionEvent;
|
|
118
|
+
isSupported.value = constructor !== undefined;
|
|
119
|
+
if (!current || !constructor) return;
|
|
120
|
+
if (typeof constructor.requestPermission !== "function") permission.value = "granted";
|
|
121
|
+
current.addEventListener("devicemotion", onMotion, { passive: true });
|
|
122
|
+
onCleanup(() => current.removeEventListener("devicemotion", onMotion));
|
|
123
|
+
},
|
|
124
|
+
{ immediate: true },
|
|
125
|
+
);
|
|
126
|
+
tryOnScopeDispose(() => stop.stop());
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
isSupported: readonly(isSupported),
|
|
130
|
+
acceleration,
|
|
131
|
+
accelerationIncludingGravity,
|
|
132
|
+
rotationRate,
|
|
133
|
+
interval: readonly(interval),
|
|
134
|
+
permission: readonly(permission),
|
|
135
|
+
requestPermission: async () => {
|
|
136
|
+
permission.value = await requestMotionPermission(host()?.DeviceMotionEvent);
|
|
137
|
+
return permission.value;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function vector(value: DeviceMotionEventAcceleration | null): MotionVector | null {
|
|
143
|
+
return value ? { x: value.x, y: value.y, z: value.z } : null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function isMotionEvent(event: Event): event is DeviceMotionEvent {
|
|
147
|
+
return "accelerationIncludingGravity" in event && "interval" in event;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function browserMotionHost(): DeviceMotionHost | undefined {
|
|
151
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
152
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Permission outcome of the iOS-style motion/orientation permission prompt. */
|
|
7
|
+
export type MotionPermissionState = "granted" | "denied" | "prompt";
|
|
8
|
+
|
|
9
|
+
/** Event constructor that may expose the iOS `requestPermission` static. */
|
|
10
|
+
export interface MotionPermissionConstructor {
|
|
11
|
+
/** Constructor prototype; present on every platform event constructor. */
|
|
12
|
+
readonly prototype: object;
|
|
13
|
+
/** Ask the user for sensor access (Safari on iOS/iPadOS 13+). */
|
|
14
|
+
readonly requestPermission?: () => Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Window-like capability observed by {@link useDeviceOrientation}. */
|
|
18
|
+
export interface DeviceOrientationHost extends EventTarget {
|
|
19
|
+
/** Constructor used to detect support and request permission. */
|
|
20
|
+
readonly DeviceOrientationEvent?: MotionPermissionConstructor;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Options for {@link useDeviceOrientation}. */
|
|
24
|
+
export interface UseDeviceOrientationOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Listen to `deviceorientationabsolute` (earth-frame) instead of
|
|
27
|
+
* `deviceorientation`.
|
|
28
|
+
*
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
31
|
+
readonly absolute?: boolean;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
35
|
+
*
|
|
36
|
+
* @default globalThis.window when available
|
|
37
|
+
*/
|
|
38
|
+
readonly host?: MaybeRefOrGetter<DeviceOrientationHost | null | undefined>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Reactive orientation state returned by {@link useDeviceOrientation}. */
|
|
42
|
+
export interface DeviceOrientationControls {
|
|
43
|
+
/** Whether the host exposes `DeviceOrientationEvent`. `false` during server rendering. */
|
|
44
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
45
|
+
/** Whether the latest reading is relative to the earth frame. */
|
|
46
|
+
readonly isAbsolute: Readonly<Ref<boolean>>;
|
|
47
|
+
/** Rotation around the Z axis in degrees `[0, 360)`. */
|
|
48
|
+
readonly alpha: Readonly<Ref<number | null>>;
|
|
49
|
+
/** Rotation around the X axis in degrees `[-180, 180)`. */
|
|
50
|
+
readonly beta: Readonly<Ref<number | null>>;
|
|
51
|
+
/** Rotation around the Y axis in degrees `[-90, 90)`. */
|
|
52
|
+
readonly gamma: Readonly<Ref<number | null>>;
|
|
53
|
+
/** Latest permission outcome; `"granted"` where no prompt exists. */
|
|
54
|
+
readonly permission: Readonly<Ref<MotionPermissionState>>;
|
|
55
|
+
/**
|
|
56
|
+
* Request sensor permission where the platform requires it. Must be called
|
|
57
|
+
* from a user gesture on iOS.
|
|
58
|
+
*
|
|
59
|
+
* @returns The resulting permission state.
|
|
60
|
+
*/
|
|
61
|
+
readonly requestPermission: () => Promise<MotionPermissionState>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Track device orientation angles.
|
|
66
|
+
*
|
|
67
|
+
* Server renders expose `null` angles and `isSupported: false`. The listener
|
|
68
|
+
* follows the reactive host and is removed with the owning reactive scope.
|
|
69
|
+
* On platforms with a permission prompt, `permission` starts as `"prompt"`
|
|
70
|
+
* and readings arrive only after `requestPermission` resolves `"granted"`.
|
|
71
|
+
*
|
|
72
|
+
* @param options Frame selection and window capability.
|
|
73
|
+
* @default options {}
|
|
74
|
+
* @returns Reactive angles, support/permission state, and a permission action.
|
|
75
|
+
*/
|
|
76
|
+
export function useDeviceOrientation(
|
|
77
|
+
options: UseDeviceOrientationOptions = {},
|
|
78
|
+
): DeviceOrientationControls {
|
|
79
|
+
const isSupported = ref(false);
|
|
80
|
+
const isAbsolute = ref(false);
|
|
81
|
+
const alpha = ref<number | null>(null);
|
|
82
|
+
const beta = ref<number | null>(null);
|
|
83
|
+
const gamma = ref<number | null>(null);
|
|
84
|
+
const permission = ref<MotionPermissionState>("prompt");
|
|
85
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
86
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
87
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
88
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
89
|
+
if (!mounted.value) {
|
|
90
|
+
onMounted(() => {
|
|
91
|
+
mounted.value = true;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const host = (): DeviceOrientationHost | null | undefined =>
|
|
95
|
+
!mounted.value
|
|
96
|
+
? undefined
|
|
97
|
+
: options.host === undefined
|
|
98
|
+
? browserOrientationHost()
|
|
99
|
+
: toValue(options.host);
|
|
100
|
+
const eventName = options.absolute ? "deviceorientationabsolute" : "deviceorientation";
|
|
101
|
+
|
|
102
|
+
const onOrientation = (event: Event): void => {
|
|
103
|
+
if (!isOrientationEvent(event)) return;
|
|
104
|
+
isAbsolute.value = event.absolute;
|
|
105
|
+
alpha.value = event.alpha;
|
|
106
|
+
beta.value = event.beta;
|
|
107
|
+
gamma.value = event.gamma;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const stop = watch(
|
|
111
|
+
host,
|
|
112
|
+
(current, _previous, onCleanup) => {
|
|
113
|
+
const constructor = current?.DeviceOrientationEvent;
|
|
114
|
+
isSupported.value = constructor !== undefined;
|
|
115
|
+
if (!current || !constructor) return;
|
|
116
|
+
if (typeof constructor.requestPermission !== "function") permission.value = "granted";
|
|
117
|
+
current.addEventListener(eventName, onOrientation, { passive: true });
|
|
118
|
+
onCleanup(() => current.removeEventListener(eventName, onOrientation));
|
|
119
|
+
},
|
|
120
|
+
{ immediate: true },
|
|
121
|
+
);
|
|
122
|
+
tryOnScopeDispose(() => stop.stop());
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
isSupported: readonly(isSupported),
|
|
126
|
+
isAbsolute: readonly(isAbsolute),
|
|
127
|
+
alpha: readonly(alpha),
|
|
128
|
+
beta: readonly(beta),
|
|
129
|
+
gamma: readonly(gamma),
|
|
130
|
+
permission: readonly(permission),
|
|
131
|
+
requestPermission: async () => {
|
|
132
|
+
permission.value = await requestMotionPermission(host()?.DeviceOrientationEvent);
|
|
133
|
+
return permission.value;
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Request motion/orientation sensor permission from an event constructor.
|
|
140
|
+
*
|
|
141
|
+
* Normalizes the platform result to {@link MotionPermissionState}. Missing
|
|
142
|
+
* constructors resolve `"denied"`; constructors without a prompt resolve
|
|
143
|
+
* `"granted"`; unknown results resolve `"prompt"`. Rejections (for example
|
|
144
|
+
* when not called from a user gesture) resolve `"denied"` instead of throwing.
|
|
145
|
+
*
|
|
146
|
+
* @param constructor `DeviceOrientationEvent` or `DeviceMotionEvent`.
|
|
147
|
+
* @returns The normalized permission state.
|
|
148
|
+
*/
|
|
149
|
+
export async function requestMotionPermission(
|
|
150
|
+
constructor: MotionPermissionConstructor | undefined,
|
|
151
|
+
): Promise<MotionPermissionState> {
|
|
152
|
+
if (!constructor) return "denied";
|
|
153
|
+
if (typeof constructor.requestPermission !== "function") return "granted";
|
|
154
|
+
try {
|
|
155
|
+
const result = await constructor.requestPermission();
|
|
156
|
+
return result === "granted" || result === "denied" ? result : "prompt";
|
|
157
|
+
} catch {
|
|
158
|
+
return "denied";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function isOrientationEvent(event: Event): event is DeviceOrientationEvent {
|
|
163
|
+
return "alpha" in event && "beta" in event && "gamma" in event;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function browserOrientationHost(): DeviceOrientationHost | undefined {
|
|
167
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
168
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import type { MediaQueryHost } from "./media-query.ts";
|
|
5
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
6
|
+
|
|
7
|
+
/** Window-like capability observed by {@link useDevicePixelRatio}. */
|
|
8
|
+
export interface DevicePixelRatioHost extends MediaQueryHost {
|
|
9
|
+
/** Ratio of physical to CSS pixels. */
|
|
10
|
+
readonly devicePixelRatio: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Options for {@link useDevicePixelRatio}. */
|
|
14
|
+
export interface UseDevicePixelRatioOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Ratio exposed during server rendering.
|
|
17
|
+
*
|
|
18
|
+
* @default 1
|
|
19
|
+
*/
|
|
20
|
+
readonly ssrPixelRatio?: number;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
24
|
+
*
|
|
25
|
+
* @default globalThis.window when available
|
|
26
|
+
*/
|
|
27
|
+
readonly host?: MaybeRefOrGetter<DevicePixelRatioHost | null | undefined>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Reactive ratio returned by {@link useDevicePixelRatio}. */
|
|
31
|
+
export interface DevicePixelRatioControls {
|
|
32
|
+
/** Current device pixel ratio. */
|
|
33
|
+
readonly pixelRatio: Readonly<Ref<number>>;
|
|
34
|
+
/** Whether a window capability is attached. `false` during server rendering. */
|
|
35
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Track `window.devicePixelRatio` (zoom and moving between displays).
|
|
40
|
+
*
|
|
41
|
+
* Subscribes to a `(resolution: <ratio>dppx)` media query and re-subscribes
|
|
42
|
+
* with the new ratio after each change, which is the only change signal the
|
|
43
|
+
* platform offers. Server renders expose `ssrPixelRatio`.
|
|
44
|
+
*
|
|
45
|
+
* @param options Server fallback and window capability.
|
|
46
|
+
* @default options {}
|
|
47
|
+
* @returns Reactive ratio and support flag.
|
|
48
|
+
*/
|
|
49
|
+
export function useDevicePixelRatio(
|
|
50
|
+
options: UseDevicePixelRatioOptions = {},
|
|
51
|
+
): DevicePixelRatioControls {
|
|
52
|
+
const fallback = options.ssrPixelRatio ?? 1;
|
|
53
|
+
const pixelRatio = ref(fallback);
|
|
54
|
+
const isSupported = ref(false);
|
|
55
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
56
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
57
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
58
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
59
|
+
if (!mounted.value) {
|
|
60
|
+
onMounted(() => {
|
|
61
|
+
mounted.value = true;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const stop = watch(
|
|
66
|
+
() =>
|
|
67
|
+
!mounted.value
|
|
68
|
+
? undefined
|
|
69
|
+
: options.host === undefined
|
|
70
|
+
? browserPixelRatioHost()
|
|
71
|
+
: toValue(options.host),
|
|
72
|
+
(host, _previous, onCleanup) => {
|
|
73
|
+
isSupported.value = Boolean(host);
|
|
74
|
+
if (!host) {
|
|
75
|
+
pixelRatio.value = fallback;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
let release = (): void => undefined;
|
|
79
|
+
const subscribe = (): void => {
|
|
80
|
+
release();
|
|
81
|
+
pixelRatio.value = host.devicePixelRatio;
|
|
82
|
+
const media = host.matchMedia(`(resolution: ${host.devicePixelRatio}dppx)`);
|
|
83
|
+
media.addEventListener("change", subscribe, { once: true });
|
|
84
|
+
release = () => media.removeEventListener("change", subscribe);
|
|
85
|
+
};
|
|
86
|
+
subscribe();
|
|
87
|
+
onCleanup(() => release());
|
|
88
|
+
},
|
|
89
|
+
{ immediate: true },
|
|
90
|
+
);
|
|
91
|
+
tryOnScopeDispose(() => stop.stop());
|
|
92
|
+
|
|
93
|
+
return { pixelRatio: readonly(pixelRatio), isSupported: readonly(isSupported) };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function browserPixelRatioHost(): DevicePixelRatioHost | undefined {
|
|
97
|
+
return typeof window !== "undefined" && typeof window.matchMedia === "function"
|
|
98
|
+
? window
|
|
99
|
+
: undefined;
|
|
100
|
+
}
|