@vizejs/composable 0.426.2 → 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,232 @@
|
|
|
1
|
+
import {
|
|
2
|
+
hasInjectionContext,
|
|
3
|
+
readonly,
|
|
4
|
+
ref,
|
|
5
|
+
shallowRef,
|
|
6
|
+
toValue,
|
|
7
|
+
watch,
|
|
8
|
+
watchPostEffect,
|
|
9
|
+
} from "vue";
|
|
10
|
+
import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
11
|
+
|
|
12
|
+
import { resolveElement } from "./element-target.ts";
|
|
13
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
14
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
15
|
+
|
|
16
|
+
/** Document-like capability used by {@link usePointerLock}. */
|
|
17
|
+
export interface PointerLockHost extends EventTarget {
|
|
18
|
+
/** Element that currently holds the pointer lock. */
|
|
19
|
+
readonly pointerLockElement: Element | null;
|
|
20
|
+
/** Release the pointer lock. */
|
|
21
|
+
exitPointerLock(): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Stable error codes rejected by {@link PointerLockControls.lock} and `unlock`. */
|
|
25
|
+
export type PointerLockErrorCode =
|
|
26
|
+
| "VIZE_COMPOSE_POINTER_LOCK_UNSUPPORTED"
|
|
27
|
+
| "VIZE_COMPOSE_POINTER_LOCK_NO_TARGET"
|
|
28
|
+
| "VIZE_COMPOSE_POINTER_LOCK_FAILED";
|
|
29
|
+
|
|
30
|
+
/** Error thrown when pointer lock cannot be acquired or released. */
|
|
31
|
+
export class PointerLockError extends Error {
|
|
32
|
+
/** Machine-readable failure code. */
|
|
33
|
+
readonly code: PointerLockErrorCode;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param code Machine-readable failure code.
|
|
37
|
+
* @param message Human-readable explanation.
|
|
38
|
+
*/
|
|
39
|
+
constructor(code: PointerLockErrorCode, message: string) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = "PointerLockError";
|
|
42
|
+
this.code = code;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Options for {@link usePointerLock}. */
|
|
47
|
+
export interface UsePointerLockOptions {
|
|
48
|
+
/**
|
|
49
|
+
* Request raw (unaccelerated) movement deltas where supported.
|
|
50
|
+
*
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
readonly unadjustedMovement?: boolean;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Reactive document capability for alternate runtimes and tests.
|
|
57
|
+
*
|
|
58
|
+
* @default globalThis.document when available
|
|
59
|
+
*/
|
|
60
|
+
readonly host?: MaybeRefOrGetter<PointerLockHost | null | undefined>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Reactive state and actions returned by {@link usePointerLock}. */
|
|
64
|
+
export interface PointerLockControls {
|
|
65
|
+
/** Whether the host supports pointer lock. `false` during server rendering. */
|
|
66
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
67
|
+
/** Element currently holding the lock (any element, not only the target). */
|
|
68
|
+
readonly element: Readonly<ShallowRef<Element | null>>;
|
|
69
|
+
/** Whether the composable's own target holds the lock. */
|
|
70
|
+
readonly isLocked: Readonly<Ref<boolean>>;
|
|
71
|
+
/**
|
|
72
|
+
* Lock the pointer to `target` (or the composable target).
|
|
73
|
+
*
|
|
74
|
+
* @returns The locked element once `pointerlockchange` confirms the lock.
|
|
75
|
+
*/
|
|
76
|
+
readonly lock: (target?: MaybeElementTarget) => Promise<Element>;
|
|
77
|
+
/**
|
|
78
|
+
* Release the lock.
|
|
79
|
+
*
|
|
80
|
+
* @returns Whether a lock was held and released.
|
|
81
|
+
*/
|
|
82
|
+
readonly unlock: () => Promise<boolean>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Reactive wrapper around the Pointer Lock API.
|
|
87
|
+
*
|
|
88
|
+
* Tracks `pointerlockchange` on the document and exposes promise-based lock
|
|
89
|
+
* and unlock actions that settle on the platform confirmation events.
|
|
90
|
+
* Rejections are {@link PointerLockError}s with stable codes. Nothing runs
|
|
91
|
+
* during server rendering; listeners are removed with the owning scope.
|
|
92
|
+
*
|
|
93
|
+
* Inside a component the host is read after mounting, so hydration renders
|
|
94
|
+
* the server fallback first and never mismatches.
|
|
95
|
+
*
|
|
96
|
+
* @param target Default reactive element to lock.
|
|
97
|
+
* @param options Movement mode and document capability.
|
|
98
|
+
* @default target undefined
|
|
99
|
+
* @default options {}
|
|
100
|
+
* @returns Support flag, lock state, and actions.
|
|
101
|
+
*/
|
|
102
|
+
export function usePointerLock(
|
|
103
|
+
target?: MaybeElementTarget,
|
|
104
|
+
options: UsePointerLockOptions = {},
|
|
105
|
+
): PointerLockControls {
|
|
106
|
+
const isSupported = ref(false);
|
|
107
|
+
const element = shallowRef<Element | null>(null);
|
|
108
|
+
// Inside a component the host is attached by a post-flush job (after the
|
|
109
|
+
// component mounted), so a hydrating client first renders the same server
|
|
110
|
+
// fallback. Outside components it is attached synchronously.
|
|
111
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
112
|
+
if (!hydrated.value) {
|
|
113
|
+
watchPostEffect(() => {
|
|
114
|
+
hydrated.value = true;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const host = (): PointerLockHost | null | undefined =>
|
|
118
|
+
!hydrated.value
|
|
119
|
+
? undefined
|
|
120
|
+
: options.host === undefined
|
|
121
|
+
? browserPointerLockHost()
|
|
122
|
+
: toValue(options.host);
|
|
123
|
+
|
|
124
|
+
const stop = watch(
|
|
125
|
+
host,
|
|
126
|
+
(current, _previous, onCleanup) => {
|
|
127
|
+
isSupported.value = Boolean(current && "pointerLockElement" in current);
|
|
128
|
+
element.value = current?.pointerLockElement ?? null;
|
|
129
|
+
if (!current) return;
|
|
130
|
+
const onChange = (): void => {
|
|
131
|
+
element.value = current.pointerLockElement;
|
|
132
|
+
};
|
|
133
|
+
current.addEventListener("pointerlockchange", onChange);
|
|
134
|
+
onCleanup(() => current.removeEventListener("pointerlockchange", onChange));
|
|
135
|
+
},
|
|
136
|
+
{ immediate: true },
|
|
137
|
+
);
|
|
138
|
+
tryOnScopeDispose(() => stop.stop());
|
|
139
|
+
|
|
140
|
+
const isLocked = ref(false);
|
|
141
|
+
watch(
|
|
142
|
+
[element, () => (target === undefined ? null : resolveElement(target))],
|
|
143
|
+
([locked, own]) => {
|
|
144
|
+
isLocked.value = locked !== null && locked === own;
|
|
145
|
+
},
|
|
146
|
+
{ immediate: true, flush: "sync" },
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const lock = async (override?: MaybeElementTarget): Promise<Element> => {
|
|
150
|
+
const current = host();
|
|
151
|
+
if (!current || !isSupported.value) {
|
|
152
|
+
throw new PointerLockError(
|
|
153
|
+
"VIZE_COMPOSE_POINTER_LOCK_UNSUPPORTED",
|
|
154
|
+
"Pointer lock is not supported.",
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
const candidate = resolveElement(override ?? target);
|
|
158
|
+
if (!candidate || !isPointerLockable(candidate)) {
|
|
159
|
+
throw new PointerLockError(
|
|
160
|
+
"VIZE_COMPOSE_POINTER_LOCK_NO_TARGET",
|
|
161
|
+
"No lockable element resolved.",
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
const confirmed = waitFor(current, () => current.pointerLockElement === candidate);
|
|
165
|
+
try {
|
|
166
|
+
await candidate.requestPointerLock(
|
|
167
|
+
options.unadjustedMovement ? { unadjustedMovement: true } : undefined,
|
|
168
|
+
);
|
|
169
|
+
} catch (cause) {
|
|
170
|
+
confirmed.cancel();
|
|
171
|
+
throw new PointerLockError("VIZE_COMPOSE_POINTER_LOCK_FAILED", describe(cause));
|
|
172
|
+
}
|
|
173
|
+
await confirmed.promise;
|
|
174
|
+
return candidate;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const unlock = async (): Promise<boolean> => {
|
|
178
|
+
const current = host();
|
|
179
|
+
if (!current?.pointerLockElement) return false;
|
|
180
|
+
const confirmed = waitFor(current, () => current.pointerLockElement === null);
|
|
181
|
+
current.exitPointerLock();
|
|
182
|
+
await confirmed.promise;
|
|
183
|
+
return true;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
isSupported: readonly(isSupported),
|
|
188
|
+
element,
|
|
189
|
+
isLocked: readonly(isLocked),
|
|
190
|
+
lock,
|
|
191
|
+
unlock,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function waitFor(
|
|
196
|
+
host: PointerLockHost,
|
|
197
|
+
done: () => boolean,
|
|
198
|
+
): { readonly promise: Promise<void>; readonly cancel: () => void } {
|
|
199
|
+
let cleanup = (): void => undefined;
|
|
200
|
+
const promise = new Promise<void>((resolve, reject) => {
|
|
201
|
+
const onChange = (): void => {
|
|
202
|
+
if (!done()) return;
|
|
203
|
+
cleanup();
|
|
204
|
+
resolve();
|
|
205
|
+
};
|
|
206
|
+
const onError = (): void => {
|
|
207
|
+
cleanup();
|
|
208
|
+
reject(
|
|
209
|
+
new PointerLockError("VIZE_COMPOSE_POINTER_LOCK_FAILED", "The pointer lock was refused."),
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
host.addEventListener("pointerlockchange", onChange);
|
|
213
|
+
host.addEventListener("pointerlockerror", onError);
|
|
214
|
+
cleanup = () => {
|
|
215
|
+
host.removeEventListener("pointerlockchange", onChange);
|
|
216
|
+
host.removeEventListener("pointerlockerror", onError);
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
return { promise, cancel: () => cleanup() };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function isPointerLockable(element: Element): boolean {
|
|
223
|
+
return typeof element.requestPointerLock === "function";
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function describe(cause: unknown): string {
|
|
227
|
+
return cause instanceof Error ? cause.message : "The pointer lock request failed.";
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function browserPointerLockHost(): PointerLockHost | undefined {
|
|
231
|
+
return typeof document !== "undefined" ? document : undefined;
|
|
232
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { readonly, ref, shallowReactive, shallowReadonly, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Pointer device kind reported by Pointer Events. */
|
|
7
|
+
export type PointerKind = "mouse" | "touch" | "pen";
|
|
8
|
+
|
|
9
|
+
/** Snapshot of the latest pointer event. */
|
|
10
|
+
export interface PointerState {
|
|
11
|
+
/** Horizontal client coordinate. */
|
|
12
|
+
readonly x: number;
|
|
13
|
+
/** Vertical client coordinate. */
|
|
14
|
+
readonly y: number;
|
|
15
|
+
/** Normalized pressure in `[0, 1]`. */
|
|
16
|
+
readonly pressure: number;
|
|
17
|
+
/** Identifier of the pointer that produced the latest event. */
|
|
18
|
+
readonly pointerId: number;
|
|
19
|
+
/** Pen tilt around the Y axis in degrees. */
|
|
20
|
+
readonly tiltX: number;
|
|
21
|
+
/** Pen tilt around the X axis in degrees. */
|
|
22
|
+
readonly tiltY: number;
|
|
23
|
+
/** Contact geometry width in CSS pixels. */
|
|
24
|
+
readonly width: number;
|
|
25
|
+
/** Contact geometry height in CSS pixels. */
|
|
26
|
+
readonly height: number;
|
|
27
|
+
/** Pen rotation in degrees. */
|
|
28
|
+
readonly twist: number;
|
|
29
|
+
/** Device kind; `null` before the first event. */
|
|
30
|
+
readonly pointerType: PointerKind | null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Options for {@link usePointer}. */
|
|
34
|
+
export interface UsePointerOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Device kinds to track.
|
|
37
|
+
*
|
|
38
|
+
* @default ["mouse", "touch", "pen"]
|
|
39
|
+
*/
|
|
40
|
+
readonly pointerTypes?: readonly PointerKind[];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Event target to listen on.
|
|
44
|
+
*
|
|
45
|
+
* @default globalThis.window when available
|
|
46
|
+
*/
|
|
47
|
+
readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* State exposed before any input and during server rendering.
|
|
51
|
+
*
|
|
52
|
+
* @default all numbers `0`, `pointerType: null`
|
|
53
|
+
*/
|
|
54
|
+
readonly initialValue?: Partial<PointerState>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Reactive pointer state returned by {@link usePointer}. */
|
|
58
|
+
export interface PointerControls {
|
|
59
|
+
/** Latest pointer snapshot. */
|
|
60
|
+
readonly state: Readonly<PointerState>;
|
|
61
|
+
/** Whether the pointer is inside the target (between enter/move and leave). */
|
|
62
|
+
readonly isInside: Readonly<Ref<boolean>>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Track the latest pointer (mouse, touch, or pen) state.
|
|
67
|
+
*
|
|
68
|
+
* Listens passively for `pointerdown`, `pointermove`, `pointerup`, and
|
|
69
|
+
* `pointerleave` on the reactive target and filters by device kind.
|
|
70
|
+
* Listeners are removed with the owning reactive scope; server renders expose
|
|
71
|
+
* the initial snapshot.
|
|
72
|
+
*
|
|
73
|
+
* @param options Device filter, target, and initial snapshot.
|
|
74
|
+
* @default options {}
|
|
75
|
+
* @returns Reactive snapshot and inside flag.
|
|
76
|
+
*/
|
|
77
|
+
export function usePointer(options: UsePointerOptions = {}): PointerControls {
|
|
78
|
+
const pointerTypes = options.pointerTypes ?? ["mouse", "touch", "pen"];
|
|
79
|
+
const state = shallowReactive<{ -readonly [Key in keyof PointerState]: PointerState[Key] }>({
|
|
80
|
+
x: 0,
|
|
81
|
+
y: 0,
|
|
82
|
+
pressure: 0,
|
|
83
|
+
pointerId: 0,
|
|
84
|
+
tiltX: 0,
|
|
85
|
+
tiltY: 0,
|
|
86
|
+
width: 0,
|
|
87
|
+
height: 0,
|
|
88
|
+
twist: 0,
|
|
89
|
+
pointerType: null,
|
|
90
|
+
...options.initialValue,
|
|
91
|
+
});
|
|
92
|
+
const isInside = ref(false);
|
|
93
|
+
|
|
94
|
+
const onPointer = (event: Event): void => {
|
|
95
|
+
if (!isPointerEvent(event)) return;
|
|
96
|
+
const kind = toPointerKind(event.pointerType);
|
|
97
|
+
if (!kind || !pointerTypes.includes(kind)) return;
|
|
98
|
+
isInside.value = true;
|
|
99
|
+
state.x = event.clientX;
|
|
100
|
+
state.y = event.clientY;
|
|
101
|
+
state.pressure = event.pressure;
|
|
102
|
+
state.pointerId = event.pointerId;
|
|
103
|
+
state.tiltX = event.tiltX;
|
|
104
|
+
state.tiltY = event.tiltY;
|
|
105
|
+
state.width = event.width;
|
|
106
|
+
state.height = event.height;
|
|
107
|
+
state.twist = event.twist;
|
|
108
|
+
state.pointerType = kind;
|
|
109
|
+
};
|
|
110
|
+
const onLeave = (): void => {
|
|
111
|
+
isInside.value = false;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const stop = watch(
|
|
115
|
+
() => (options.target === undefined ? browserWindow() : toValue(options.target)),
|
|
116
|
+
(target, _previous, onCleanup) => {
|
|
117
|
+
if (!target) return;
|
|
118
|
+
const listenerOptions: AddEventListenerOptions = { passive: true };
|
|
119
|
+
for (const type of ["pointerdown", "pointermove", "pointerup"] as const) {
|
|
120
|
+
target.addEventListener(type, onPointer, listenerOptions);
|
|
121
|
+
}
|
|
122
|
+
target.addEventListener("pointerleave", onLeave, listenerOptions);
|
|
123
|
+
onCleanup(() => {
|
|
124
|
+
for (const type of ["pointerdown", "pointermove", "pointerup"] as const) {
|
|
125
|
+
target.removeEventListener(type, onPointer);
|
|
126
|
+
}
|
|
127
|
+
target.removeEventListener("pointerleave", onLeave);
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
{ immediate: true },
|
|
131
|
+
);
|
|
132
|
+
tryOnScopeDispose(() => stop.stop());
|
|
133
|
+
|
|
134
|
+
return { state: shallowReadonly(state), isInside: readonly(isInside) };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Narrow a platform `pointerType` string to the closed {@link PointerKind} union.
|
|
139
|
+
*
|
|
140
|
+
* @param value Raw `PointerEvent.pointerType`.
|
|
141
|
+
* @returns The matching kind, or `null` for unknown/future device kinds.
|
|
142
|
+
*/
|
|
143
|
+
export function toPointerKind(value: string): PointerKind | null {
|
|
144
|
+
return value === "mouse" || value === "touch" || value === "pen" ? value : null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function isPointerEvent(event: Event): event is PointerEvent {
|
|
148
|
+
return "pointerId" in event && "pointerType" in event;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function browserWindow(): EventTarget | undefined {
|
|
152
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
153
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
2
|
+
import type { ComputedRef, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { useMediaQuery } from "./media-query.ts";
|
|
5
|
+
import type { UseMediaQueryOptions } from "./media-query.ts";
|
|
6
|
+
|
|
7
|
+
/** Color scheme preference exposed by {@link usePreferredColorScheme}. */
|
|
8
|
+
export type ColorSchemePreference = "dark" | "light" | "no-preference";
|
|
9
|
+
|
|
10
|
+
/** Contrast preference exposed by {@link usePreferredContrast}. */
|
|
11
|
+
export type ContrastPreference = "more" | "less" | "custom" | "no-preference";
|
|
12
|
+
|
|
13
|
+
/** Options for the multi-valued preference composables. */
|
|
14
|
+
export interface UsePreferenceOptions<Preference extends string> extends Omit<
|
|
15
|
+
UseMediaQueryOptions,
|
|
16
|
+
"ssrValue"
|
|
17
|
+
> {
|
|
18
|
+
/**
|
|
19
|
+
* Preference exposed during server rendering and whenever no media-query
|
|
20
|
+
* capability exists.
|
|
21
|
+
*
|
|
22
|
+
* @default "no-preference"
|
|
23
|
+
*/
|
|
24
|
+
readonly ssrPreference?: Preference;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Whether the user prefers a dark color scheme.
|
|
29
|
+
*
|
|
30
|
+
* Shares {@link useMediaQuery} semantics: `ssrValue` (default `false`) during
|
|
31
|
+
* server rendering and subscription cleanup with the owning scope.
|
|
32
|
+
*
|
|
33
|
+
* @param options Runtime capability and server fallback.
|
|
34
|
+
* @default options {}
|
|
35
|
+
* @returns Readonly ref for `(prefers-color-scheme: dark)`.
|
|
36
|
+
*/
|
|
37
|
+
export function usePreferredDark(options: UseMediaQueryOptions = {}): Readonly<Ref<boolean>> {
|
|
38
|
+
return useMediaQuery("(prefers-color-scheme: dark)", options);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Reactive color scheme preference.
|
|
43
|
+
*
|
|
44
|
+
* @param options Runtime capability and server fallback.
|
|
45
|
+
* @default options {}
|
|
46
|
+
* @returns Computed closed preference.
|
|
47
|
+
*/
|
|
48
|
+
export function usePreferredColorScheme(
|
|
49
|
+
options: UsePreferenceOptions<ColorSchemePreference> = {},
|
|
50
|
+
): ComputedRef<ColorSchemePreference> {
|
|
51
|
+
const fallback = options.ssrPreference ?? "no-preference";
|
|
52
|
+
const query = (value: "dark" | "light"): Readonly<Ref<boolean>> =>
|
|
53
|
+
useMediaQuery(`(prefers-color-scheme: ${value})`, withSsr(options, fallback === value));
|
|
54
|
+
const dark = query("dark");
|
|
55
|
+
const light = query("light");
|
|
56
|
+
return computed(() => (dark.value ? "dark" : light.value ? "light" : "no-preference"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Reactive contrast preference.
|
|
61
|
+
*
|
|
62
|
+
* @param options Runtime capability and server fallback.
|
|
63
|
+
* @default options {}
|
|
64
|
+
* @returns Computed closed preference.
|
|
65
|
+
*/
|
|
66
|
+
export function usePreferredContrast(
|
|
67
|
+
options: UsePreferenceOptions<ContrastPreference> = {},
|
|
68
|
+
): ComputedRef<ContrastPreference> {
|
|
69
|
+
const fallback = options.ssrPreference ?? "no-preference";
|
|
70
|
+
const query = (value: "more" | "less" | "custom"): Readonly<Ref<boolean>> =>
|
|
71
|
+
useMediaQuery(`(prefers-contrast: ${value})`, withSsr(options, fallback === value));
|
|
72
|
+
const more = query("more");
|
|
73
|
+
const less = query("less");
|
|
74
|
+
const custom = query("custom");
|
|
75
|
+
return computed(() =>
|
|
76
|
+
more.value ? "more" : less.value ? "less" : custom.value ? "custom" : "no-preference",
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Whether the user prefers reduced transparency.
|
|
82
|
+
*
|
|
83
|
+
* @param options Runtime capability and server fallback.
|
|
84
|
+
* @default options {}
|
|
85
|
+
* @returns Readonly ref for `(prefers-reduced-transparency: reduce)`.
|
|
86
|
+
*/
|
|
87
|
+
export function usePreferredReducedTransparency(
|
|
88
|
+
options: UseMediaQueryOptions = {},
|
|
89
|
+
): Readonly<Ref<boolean>> {
|
|
90
|
+
return useMediaQuery("(prefers-reduced-transparency: reduce)", options);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function withSsr<Preference extends string>(
|
|
94
|
+
options: UsePreferenceOptions<Preference>,
|
|
95
|
+
ssrValue: boolean,
|
|
96
|
+
): UseMediaQueryOptions {
|
|
97
|
+
return options.host === undefined ? { ssrValue } : { ssrValue, host: options.host };
|
|
98
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { hasInjectionContext, readonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Window-like capability observed by {@link usePreferredLanguages}. */
|
|
7
|
+
export interface PreferredLanguagesHost extends EventTarget {
|
|
8
|
+
/** Navigator exposing the user's languages. */
|
|
9
|
+
readonly navigator: { readonly languages: readonly string[]; readonly language?: string };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Options for {@link usePreferredLanguages}. */
|
|
13
|
+
export interface UsePreferredLanguagesOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Languages exposed during server rendering. Pass the request's
|
|
16
|
+
* `Accept-Language` list to keep hydration stable.
|
|
17
|
+
*
|
|
18
|
+
* @default ["en"]
|
|
19
|
+
*/
|
|
20
|
+
readonly ssrLanguages?: readonly string[];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
24
|
+
*
|
|
25
|
+
* @default globalThis.window when available
|
|
26
|
+
*/
|
|
27
|
+
readonly host?: MaybeRefOrGetter<PreferredLanguagesHost | null | undefined>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Track the user's preferred languages (`navigator.languages`).
|
|
32
|
+
*
|
|
33
|
+
* Updates on `languagechange`. The default host is gated on `window`, so
|
|
34
|
+
* Node's own `navigator` never leaks the server locale into the render;
|
|
35
|
+
* server renders expose `ssrLanguages`. Inside a component the languages are
|
|
36
|
+
* read after mounting, so hydration renders `ssrLanguages` first. The
|
|
37
|
+
* listener is removed with the owning reactive scope.
|
|
38
|
+
*
|
|
39
|
+
* @param options Server fallback and window capability.
|
|
40
|
+
* @default options {}
|
|
41
|
+
* @returns Readonly ref of BCP 47 language tags, most preferred first.
|
|
42
|
+
*/
|
|
43
|
+
export function usePreferredLanguages(
|
|
44
|
+
options: UsePreferredLanguagesOptions = {},
|
|
45
|
+
): Readonly<Ref<readonly string[]>> {
|
|
46
|
+
const fallback = options.ssrLanguages ?? ["en"];
|
|
47
|
+
const languages = shallowRef<readonly string[]>(fallback);
|
|
48
|
+
// Inside a component the host is attached by a post-flush job (after the
|
|
49
|
+
// component mounted), so a hydrating client first renders the same server
|
|
50
|
+
// fallback. Outside components it is attached synchronously.
|
|
51
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
52
|
+
if (!hydrated.value) {
|
|
53
|
+
watchPostEffect(() => {
|
|
54
|
+
hydrated.value = true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const stop = watch(
|
|
59
|
+
() =>
|
|
60
|
+
hydrated.value
|
|
61
|
+
? options.host === undefined
|
|
62
|
+
? browserLanguagesHost()
|
|
63
|
+
: toValue(options.host)
|
|
64
|
+
: undefined,
|
|
65
|
+
(host, _previous, onCleanup) => {
|
|
66
|
+
if (!host) {
|
|
67
|
+
languages.value = fallback;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const update = (): void => {
|
|
71
|
+
const { languages: list, language } = host.navigator;
|
|
72
|
+
languages.value =
|
|
73
|
+
list.length > 0 ? [...list] : language !== undefined ? [language] : fallback;
|
|
74
|
+
};
|
|
75
|
+
update();
|
|
76
|
+
host.addEventListener("languagechange", update, { passive: true });
|
|
77
|
+
onCleanup(() => host.removeEventListener("languagechange", update));
|
|
78
|
+
},
|
|
79
|
+
{ immediate: true },
|
|
80
|
+
);
|
|
81
|
+
tryOnScopeDispose(() => stop.stop());
|
|
82
|
+
|
|
83
|
+
return readonly(languages);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function browserLanguagesHost(): PreferredLanguagesHost | undefined {
|
|
87
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
88
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Parameter list of a reactified function: every argument may be a ref or getter. */
|
|
5
|
+
export type ReactifiedArguments<Arguments extends readonly unknown[]> = {
|
|
6
|
+
readonly [Index in keyof Arguments]: MaybeRefOrGetter<Arguments[Index]>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/** Function returned by {@link reactify}. */
|
|
10
|
+
export type Reactified<Arguments extends readonly unknown[], Result> = (
|
|
11
|
+
...args: ReactifiedArguments<Arguments>
|
|
12
|
+
) => ComputedRef<Result>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Turn a plain function into one that accepts refs/getters and returns a
|
|
16
|
+
* computed result.
|
|
17
|
+
*
|
|
18
|
+
* Arity and parameter names are preserved; each parameter additionally
|
|
19
|
+
* accepts `Ref<T>` or `() => T`. The computed re-runs the original function
|
|
20
|
+
* whenever a reactive argument changes. Pure derived state: SSR-safe and
|
|
21
|
+
* nothing to dispose.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const add = reactify((left: number, right: number) => left + right);
|
|
26
|
+
* const sum = add(count, 1); // ComputedRef<number>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @param fn Plain function to lift.
|
|
30
|
+
* @returns The reactified function.
|
|
31
|
+
*/
|
|
32
|
+
export function reactify<Arguments extends readonly unknown[], Result>(
|
|
33
|
+
fn: (...args: Arguments) => Result,
|
|
34
|
+
): Reactified<Arguments, Result>;
|
|
35
|
+
export function reactify(
|
|
36
|
+
fn: (...args: readonly unknown[]) => unknown,
|
|
37
|
+
): (...args: readonly MaybeRefOrGetter<unknown>[]) => ComputedRef<unknown> {
|
|
38
|
+
return (...args) => computed(() => fn(...args.map((argument) => toValue(argument))));
|
|
39
|
+
}
|