@vizejs/composable 0.426.3 → 0.428.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { computed, hasInjectionContext, readonly, ref, toValue, watchEffect } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Capability required to evaluate media queries. */
|
|
5
|
+
export interface MediaQueryHost {
|
|
6
|
+
/** Create an observable result for a media query. */
|
|
7
|
+
readonly matchMedia: (query: string) => MediaQueryList;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Options for {@link useMediaQuery}. */
|
|
11
|
+
export interface UseMediaQueryOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Value exposed when no media-query capability is available.
|
|
14
|
+
*
|
|
15
|
+
* @default false
|
|
16
|
+
*/
|
|
17
|
+
readonly ssrValue?: boolean;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Reactive media-query capability for alternate runtimes and tests.
|
|
21
|
+
*
|
|
22
|
+
* @default globalThis.window when available
|
|
23
|
+
*/
|
|
24
|
+
readonly host?: MaybeRefOrGetter<MediaQueryHost | null | undefined>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Evaluate a reactive media query without requiring browser globals.
|
|
29
|
+
*
|
|
30
|
+
* During server rendering (or whenever no capability host resolves) the ref
|
|
31
|
+
* holds the configured server value and no subscription is created. Inside a
|
|
32
|
+
* component the first match is read after mounting, so hydration renders the
|
|
33
|
+
* server value first and never mismatches. The
|
|
34
|
+
* change subscription follows the reactive query and host: each
|
|
35
|
+
* re-evaluation removes the previous listener, and the final listener is
|
|
36
|
+
* removed when the owning reactive scope stops. Call inside an active scope
|
|
37
|
+
* so the subscription is released. A host whose matcher throws propagates
|
|
38
|
+
* the error to the active effect run; the browser default never throws.
|
|
39
|
+
*
|
|
40
|
+
* @param query Reactive media-query source.
|
|
41
|
+
* @param options Runtime capability and server-rendered fallback.
|
|
42
|
+
* @default options {}
|
|
43
|
+
* @returns Readonly ref that is `true` while the query matches.
|
|
44
|
+
*/
|
|
45
|
+
export function useMediaQuery(
|
|
46
|
+
query: MaybeRefOrGetter<string>,
|
|
47
|
+
options: UseMediaQueryOptions = {},
|
|
48
|
+
): Readonly<Ref<boolean>> {
|
|
49
|
+
const matches = ref(options.ssrValue ?? false);
|
|
50
|
+
|
|
51
|
+
// Inside a component the first read waits for the post-render flush, so a
|
|
52
|
+
// hydrating client renders the same `ssrValue` the server did and then
|
|
53
|
+
// switches to the live result. Outside components the read is synchronous.
|
|
54
|
+
const flush = hasInjectionContext() ? "post" : "pre";
|
|
55
|
+
watchEffect(
|
|
56
|
+
(onCleanup) => {
|
|
57
|
+
const host = options.host === undefined ? browserMediaQueryHost() : toValue(options.host);
|
|
58
|
+
if (!host) {
|
|
59
|
+
matches.value = options.ssrValue ?? false;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const media = host.matchMedia(toValue(query));
|
|
64
|
+
const update = (): void => {
|
|
65
|
+
matches.value = media.matches;
|
|
66
|
+
};
|
|
67
|
+
update();
|
|
68
|
+
media.addEventListener("change", update);
|
|
69
|
+
onCleanup(() => media.removeEventListener("change", update));
|
|
70
|
+
},
|
|
71
|
+
{ flush },
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
return readonly(matches);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** User motion preference exposed by {@link useReducedMotion}. */
|
|
78
|
+
export type MotionPreference = "reduce" | "no-preference";
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Return the reactive user motion preference.
|
|
82
|
+
*
|
|
83
|
+
* Shares {@link useMediaQuery} semantics: during server rendering the
|
|
84
|
+
* preference is `"no-preference"` unless `ssrValue` is `true`, and the
|
|
85
|
+
* underlying subscription is removed when the owning reactive scope stops.
|
|
86
|
+
*
|
|
87
|
+
* @param options Runtime capability and server-rendered fallback.
|
|
88
|
+
* @default options {}
|
|
89
|
+
* @returns Computed preference for `(prefers-reduced-motion: reduce)`.
|
|
90
|
+
*/
|
|
91
|
+
export function useReducedMotion(
|
|
92
|
+
options: UseMediaQueryOptions = {},
|
|
93
|
+
): ComputedRef<MotionPreference> {
|
|
94
|
+
const reduced = useMediaQuery("(prefers-reduced-motion: reduce)", options);
|
|
95
|
+
return computed(() => (reduced.value ? "reduce" : "no-preference"));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function browserMediaQueryHost(): MediaQueryHost | undefined {
|
|
99
|
+
return typeof window !== "undefined" && typeof window.matchMedia === "function"
|
|
100
|
+
? window
|
|
101
|
+
: undefined;
|
|
102
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { computed, readonly, ref, watch } from "vue";
|
|
2
|
+
import type { Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import { useMouse } from "./mouse.ts";
|
|
7
|
+
import type { MouseControls, UseMouseOptions } from "./mouse.ts";
|
|
8
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
9
|
+
|
|
10
|
+
/** Options for {@link useMouseInElement}. */
|
|
11
|
+
export interface UseMouseInElementOptions extends Omit<UseMouseOptions, "type"> {
|
|
12
|
+
/**
|
|
13
|
+
* Keep updating element-relative coordinates while the pointer is outside
|
|
14
|
+
* the element. When `false`, they freeze at the last inside position.
|
|
15
|
+
*
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
readonly handleOutside?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Reactive state returned by {@link useMouseInElement}. */
|
|
22
|
+
export interface MouseInElementControls extends MouseControls {
|
|
23
|
+
/** Pointer position relative to the element's left edge. */
|
|
24
|
+
readonly elementX: Readonly<Ref<number>>;
|
|
25
|
+
/** Pointer position relative to the element's top edge. */
|
|
26
|
+
readonly elementY: Readonly<Ref<number>>;
|
|
27
|
+
/** Element left edge in viewport coordinates at the latest update. */
|
|
28
|
+
readonly elementPositionX: Readonly<Ref<number>>;
|
|
29
|
+
/** Element top edge in viewport coordinates at the latest update. */
|
|
30
|
+
readonly elementPositionY: Readonly<Ref<number>>;
|
|
31
|
+
/** Element width at the latest update. */
|
|
32
|
+
readonly elementWidth: Readonly<Ref<number>>;
|
|
33
|
+
/** Element height at the latest update. */
|
|
34
|
+
readonly elementHeight: Readonly<Ref<number>>;
|
|
35
|
+
/** Whether the pointer is outside the element. `true` during server rendering. */
|
|
36
|
+
readonly isOutside: Readonly<Ref<boolean>>;
|
|
37
|
+
/** Stop updating element-relative state. Idempotent. */
|
|
38
|
+
readonly stop: () => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Track the pointer position relative to an element.
|
|
43
|
+
*
|
|
44
|
+
* Built on {@link useMouse} in client coordinates: every move re-reads the
|
|
45
|
+
* element rectangle, so transforms and scrolling are reflected. Server
|
|
46
|
+
* renders report zero geometry and `isOutside: true`.
|
|
47
|
+
*
|
|
48
|
+
* @param target Reactive element target.
|
|
49
|
+
* @param options Outside handling plus {@link useMouse} options.
|
|
50
|
+
* @default options {}
|
|
51
|
+
* @returns Pointer, element-relative, and geometry refs.
|
|
52
|
+
*/
|
|
53
|
+
export function useMouseInElement(
|
|
54
|
+
target: MaybeElementTarget,
|
|
55
|
+
options: UseMouseInElementOptions = {},
|
|
56
|
+
): MouseInElementControls {
|
|
57
|
+
const handleOutside = options.handleOutside ?? true;
|
|
58
|
+
const mouse = useMouse({ ...options, type: "client" });
|
|
59
|
+
const elementX = ref(0);
|
|
60
|
+
const elementY = ref(0);
|
|
61
|
+
const elementPositionX = ref(0);
|
|
62
|
+
const elementPositionY = ref(0);
|
|
63
|
+
const elementWidth = ref(0);
|
|
64
|
+
const elementHeight = ref(0);
|
|
65
|
+
const isOutside = ref(true);
|
|
66
|
+
const element = computed(() => resolveElement(target));
|
|
67
|
+
|
|
68
|
+
const stopWatch = watch(
|
|
69
|
+
[element, mouse.x, mouse.y, mouse.sourceType],
|
|
70
|
+
([currentElement, x, y, source]) => {
|
|
71
|
+
if (!currentElement || source === null) return;
|
|
72
|
+
const rect = currentElement.getBoundingClientRect();
|
|
73
|
+
elementPositionX.value = rect.left;
|
|
74
|
+
elementPositionY.value = rect.top;
|
|
75
|
+
elementWidth.value = rect.width;
|
|
76
|
+
elementHeight.value = rect.height;
|
|
77
|
+
const relativeX = x - rect.left;
|
|
78
|
+
const relativeY = y - rect.top;
|
|
79
|
+
isOutside.value =
|
|
80
|
+
rect.width === 0 ||
|
|
81
|
+
rect.height === 0 ||
|
|
82
|
+
relativeX < 0 ||
|
|
83
|
+
relativeY < 0 ||
|
|
84
|
+
relativeX > rect.width ||
|
|
85
|
+
relativeY > rect.height;
|
|
86
|
+
if (handleOutside || !isOutside.value) {
|
|
87
|
+
elementX.value = relativeX;
|
|
88
|
+
elementY.value = relativeY;
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
{ flush: "sync" },
|
|
92
|
+
);
|
|
93
|
+
const stop = (): void => stopWatch.stop();
|
|
94
|
+
tryOnScopeDispose(stop);
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
...mouse,
|
|
98
|
+
elementX: readonly(elementX),
|
|
99
|
+
elementY: readonly(elementY),
|
|
100
|
+
elementPositionX: readonly(elementPositionX),
|
|
101
|
+
elementPositionY: readonly(elementPositionY),
|
|
102
|
+
elementWidth: readonly(elementWidth),
|
|
103
|
+
elementHeight: readonly(elementHeight),
|
|
104
|
+
isOutside: readonly(isOutside),
|
|
105
|
+
stop,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { readonly, ref, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Coordinate space reported by {@link useMouse}. */
|
|
7
|
+
export type MouseCoordinateType = "page" | "client" | "screen" | "movement";
|
|
8
|
+
|
|
9
|
+
/** Input device that produced the latest coordinates. */
|
|
10
|
+
export type MouseSourceType = "mouse" | "touch";
|
|
11
|
+
|
|
12
|
+
/** Two-dimensional coordinate in CSS pixels. */
|
|
13
|
+
export interface Point {
|
|
14
|
+
/** Horizontal coordinate. */
|
|
15
|
+
readonly x: number;
|
|
16
|
+
/** Vertical coordinate. */
|
|
17
|
+
readonly y: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Custom coordinate extractor. Return `null` to ignore an event.
|
|
22
|
+
*
|
|
23
|
+
* Receives the mouse event, or the first touch point for touch input.
|
|
24
|
+
*/
|
|
25
|
+
export type MouseCoordinateExtractor = (input: MouseEvent | Touch) => Point | null;
|
|
26
|
+
|
|
27
|
+
/** Options for {@link useMouse}. */
|
|
28
|
+
export interface UseMouseOptions {
|
|
29
|
+
/**
|
|
30
|
+
* Coordinate space, or a custom extractor.
|
|
31
|
+
*
|
|
32
|
+
* @default "page"
|
|
33
|
+
*/
|
|
34
|
+
readonly type?: MouseCoordinateType | MouseCoordinateExtractor;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Event target to listen on.
|
|
38
|
+
*
|
|
39
|
+
* @default globalThis.window when available
|
|
40
|
+
*/
|
|
41
|
+
readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Track touch input in addition to mouse input.
|
|
45
|
+
*
|
|
46
|
+
* @default true
|
|
47
|
+
*/
|
|
48
|
+
readonly touch?: boolean;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Restore `initialValue` when a touch ends.
|
|
52
|
+
*
|
|
53
|
+
* @default false
|
|
54
|
+
*/
|
|
55
|
+
readonly resetOnTouchEnds?: boolean;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Coordinates exposed before any input and during server rendering.
|
|
59
|
+
*
|
|
60
|
+
* @default { x: 0, y: 0 }
|
|
61
|
+
*/
|
|
62
|
+
readonly initialValue?: Point;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Reactive pointer position returned by {@link useMouse}. */
|
|
66
|
+
export interface MouseControls {
|
|
67
|
+
/** Latest horizontal coordinate. */
|
|
68
|
+
readonly x: Readonly<Ref<number>>;
|
|
69
|
+
/** Latest vertical coordinate. */
|
|
70
|
+
readonly y: Readonly<Ref<number>>;
|
|
71
|
+
/** Device that produced the latest coordinates; `null` before any input. */
|
|
72
|
+
readonly sourceType: Readonly<Ref<MouseSourceType | null>>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Track the mouse (and optionally touch) position.
|
|
77
|
+
*
|
|
78
|
+
* Listens passively for `mousemove`, `dragover`, and touch events on the
|
|
79
|
+
* target; listeners follow the reactive target and are removed with the
|
|
80
|
+
* owning reactive scope. Server renders expose `initialValue` with a `null`
|
|
81
|
+
* source type.
|
|
82
|
+
*
|
|
83
|
+
* @param options Coordinate space, target, touch handling, and initial value.
|
|
84
|
+
* @default options {}
|
|
85
|
+
* @returns Reactive coordinates and input source.
|
|
86
|
+
*/
|
|
87
|
+
export function useMouse(options: UseMouseOptions = {}): MouseControls {
|
|
88
|
+
const { touch = true, resetOnTouchEnds = false } = options;
|
|
89
|
+
const initial = options.initialValue ?? { x: 0, y: 0 };
|
|
90
|
+
const extract = extractorFor(options.type ?? "page");
|
|
91
|
+
const x = ref(initial.x);
|
|
92
|
+
const y = ref(initial.y);
|
|
93
|
+
const sourceType = ref<MouseSourceType | null>(null);
|
|
94
|
+
|
|
95
|
+
const apply = (point: Point | null, source: MouseSourceType): void => {
|
|
96
|
+
if (!point) return;
|
|
97
|
+
x.value = point.x;
|
|
98
|
+
y.value = point.y;
|
|
99
|
+
sourceType.value = source;
|
|
100
|
+
};
|
|
101
|
+
const onMouse = (event: Event): void => {
|
|
102
|
+
if (isMouseEvent(event)) apply(extract(event), "mouse");
|
|
103
|
+
};
|
|
104
|
+
const onTouch = (event: Event): void => {
|
|
105
|
+
if (!isTouchEvent(event)) return;
|
|
106
|
+
const first = event.touches[0];
|
|
107
|
+
if (first) apply(extract(first), "touch");
|
|
108
|
+
};
|
|
109
|
+
const onTouchEnd = (): void => {
|
|
110
|
+
x.value = initial.x;
|
|
111
|
+
y.value = initial.y;
|
|
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
|
+
target.addEventListener("mousemove", onMouse, listenerOptions);
|
|
120
|
+
target.addEventListener("dragover", onMouse, listenerOptions);
|
|
121
|
+
if (touch) {
|
|
122
|
+
target.addEventListener("touchstart", onTouch, listenerOptions);
|
|
123
|
+
target.addEventListener("touchmove", onTouch, listenerOptions);
|
|
124
|
+
if (resetOnTouchEnds) target.addEventListener("touchend", onTouchEnd, listenerOptions);
|
|
125
|
+
}
|
|
126
|
+
onCleanup(() => {
|
|
127
|
+
target.removeEventListener("mousemove", onMouse);
|
|
128
|
+
target.removeEventListener("dragover", onMouse);
|
|
129
|
+
target.removeEventListener("touchstart", onTouch);
|
|
130
|
+
target.removeEventListener("touchmove", onTouch);
|
|
131
|
+
target.removeEventListener("touchend", onTouchEnd);
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
{ immediate: true },
|
|
135
|
+
);
|
|
136
|
+
tryOnScopeDispose(() => stop.stop());
|
|
137
|
+
|
|
138
|
+
return { x: readonly(x), y: readonly(y), sourceType: readonly(sourceType) };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function extractorFor(
|
|
142
|
+
type: MouseCoordinateType | MouseCoordinateExtractor,
|
|
143
|
+
): MouseCoordinateExtractor {
|
|
144
|
+
if (typeof type === "function") return type;
|
|
145
|
+
switch (type) {
|
|
146
|
+
case "page":
|
|
147
|
+
return (input) => ({ x: input.pageX, y: input.pageY });
|
|
148
|
+
case "client":
|
|
149
|
+
return (input) => ({ x: input.clientX, y: input.clientY });
|
|
150
|
+
case "screen":
|
|
151
|
+
return (input) => ({ x: input.screenX, y: input.screenY });
|
|
152
|
+
case "movement":
|
|
153
|
+
return (input) => ("movementX" in input ? { x: input.movementX, y: input.movementY } : null);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function isMouseEvent(event: Event): event is MouseEvent {
|
|
158
|
+
return "clientX" in event && "button" in event;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function isTouchEvent(event: Event): event is TouchEvent {
|
|
162
|
+
return "touches" in event;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function browserWindow(): EventTarget | undefined {
|
|
166
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
167
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, WatchHandle } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElements } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTargets } from "./element-target.ts";
|
|
6
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
7
|
+
|
|
8
|
+
/** Runtime capability that supplies the `MutationObserver` constructor. */
|
|
9
|
+
export interface MutationObserverHost {
|
|
10
|
+
/** `MutationObserver` constructor, absent in unsupported runtimes. */
|
|
11
|
+
readonly MutationObserver?: new (callback: MutationCallback) => MutationObserver;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Options for {@link useMutationObserver}. */
|
|
15
|
+
export interface UseMutationObserverOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Observe attribute changes.
|
|
18
|
+
*
|
|
19
|
+
* @default false (implicitly `true` when `attributeFilter` or `attributeOldValue` is set)
|
|
20
|
+
*/
|
|
21
|
+
readonly attributes?: boolean;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Observe child-list changes.
|
|
25
|
+
*
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
readonly childList?: boolean;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Extend observation to the whole subtree.
|
|
32
|
+
*
|
|
33
|
+
* @default false
|
|
34
|
+
*/
|
|
35
|
+
readonly subtree?: boolean;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Observe text-content changes.
|
|
39
|
+
*
|
|
40
|
+
* @default false (implicitly `true` when `characterDataOldValue` is set)
|
|
41
|
+
*/
|
|
42
|
+
readonly characterData?: boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Record the previous attribute value.
|
|
46
|
+
*
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
readonly attributeOldValue?: boolean;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Record the previous text value.
|
|
53
|
+
*
|
|
54
|
+
* @default false
|
|
55
|
+
*/
|
|
56
|
+
readonly characterDataOldValue?: boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Restrict attribute observation to these local names.
|
|
60
|
+
*
|
|
61
|
+
* @default undefined (all attributes)
|
|
62
|
+
*/
|
|
63
|
+
readonly attributeFilter?: readonly string[];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Reactive constructor capability for alternate runtimes and tests.
|
|
67
|
+
*
|
|
68
|
+
* @default globalThis when it provides `MutationObserver`
|
|
69
|
+
*/
|
|
70
|
+
readonly host?: MaybeRefOrGetter<MutationObserverHost | null | undefined>;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Target resolution timing. `"post"` observes template refs after mount.
|
|
74
|
+
*
|
|
75
|
+
* @default "post"
|
|
76
|
+
*/
|
|
77
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Controls returned by {@link useMutationObserver}. */
|
|
81
|
+
export interface MutationObserverControls {
|
|
82
|
+
/** Whether the host provides `MutationObserver`. `false` during server rendering. */
|
|
83
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Drain the records queued by the active observer without invoking the
|
|
87
|
+
* callback.
|
|
88
|
+
*
|
|
89
|
+
* @returns Pending records, or an empty list without an active observer.
|
|
90
|
+
*/
|
|
91
|
+
readonly takeRecords: () => MutationRecord[];
|
|
92
|
+
|
|
93
|
+
/** Disconnect permanently. Idempotent. */
|
|
94
|
+
readonly stop: () => void;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Observe DOM mutations of reactive elements.
|
|
99
|
+
*
|
|
100
|
+
* The observer is recreated when the resolved targets or host change and is
|
|
101
|
+
* disconnected when the owning reactive scope stops. At least one of
|
|
102
|
+
* `attributes`, `childList`, or `characterData` must be enabled (directly or
|
|
103
|
+
* implicitly), mirroring the platform contract. No work happens during
|
|
104
|
+
* server rendering.
|
|
105
|
+
*
|
|
106
|
+
* @param targets Reactive element target or list of targets.
|
|
107
|
+
* @param callback Native `MutationObserver` callback.
|
|
108
|
+
* @param options Observation filter, capability, and timing.
|
|
109
|
+
* @default options {}
|
|
110
|
+
* @returns Support flag, record draining, and stop control.
|
|
111
|
+
*/
|
|
112
|
+
export function useMutationObserver(
|
|
113
|
+
targets: MaybeElementTargets,
|
|
114
|
+
callback: MutationCallback,
|
|
115
|
+
options: UseMutationObserverOptions = {},
|
|
116
|
+
): MutationObserverControls {
|
|
117
|
+
const isSupported = ref(false);
|
|
118
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
119
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
120
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
121
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
122
|
+
if (!mounted.value) {
|
|
123
|
+
onMounted(() => {
|
|
124
|
+
mounted.value = true;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const init = observerInit(options);
|
|
128
|
+
let active: MutationObserver | undefined;
|
|
129
|
+
let stopWatch: WatchHandle | undefined = watch(
|
|
130
|
+
() =>
|
|
131
|
+
[
|
|
132
|
+
!mounted.value
|
|
133
|
+
? undefined
|
|
134
|
+
: options.host === undefined
|
|
135
|
+
? browserMutationObserverHost()
|
|
136
|
+
: toValue(options.host),
|
|
137
|
+
resolveElements(targets),
|
|
138
|
+
] as const,
|
|
139
|
+
([host, elements], _previous, onCleanup) => {
|
|
140
|
+
const Observer = host?.MutationObserver;
|
|
141
|
+
isSupported.value = Observer !== undefined;
|
|
142
|
+
if (!Observer || elements.length === 0) return;
|
|
143
|
+
const observer = new Observer(callback);
|
|
144
|
+
for (const element of elements) observer.observe(element, init);
|
|
145
|
+
active = observer;
|
|
146
|
+
onCleanup(() => {
|
|
147
|
+
observer.disconnect();
|
|
148
|
+
if (active === observer) active = undefined;
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
{ immediate: true, flush: options.flush ?? "post" },
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
const stop = (): void => {
|
|
155
|
+
stopWatch?.stop();
|
|
156
|
+
stopWatch = undefined;
|
|
157
|
+
};
|
|
158
|
+
tryOnScopeDispose(stop);
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
isSupported: readonly(isSupported),
|
|
162
|
+
takeRecords: () => active?.takeRecords() ?? [],
|
|
163
|
+
stop,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function observerInit(options: UseMutationObserverOptions): MutationObserverInit {
|
|
168
|
+
const init: MutationObserverInit = {};
|
|
169
|
+
if (options.attributes !== undefined) init.attributes = options.attributes;
|
|
170
|
+
if (options.childList !== undefined) init.childList = options.childList;
|
|
171
|
+
if (options.subtree !== undefined) init.subtree = options.subtree;
|
|
172
|
+
if (options.characterData !== undefined) init.characterData = options.characterData;
|
|
173
|
+
if (options.attributeOldValue !== undefined) init.attributeOldValue = options.attributeOldValue;
|
|
174
|
+
if (options.characterDataOldValue !== undefined) {
|
|
175
|
+
init.characterDataOldValue = options.characterDataOldValue;
|
|
176
|
+
}
|
|
177
|
+
if (options.attributeFilter !== undefined) init.attributeFilter = [...options.attributeFilter];
|
|
178
|
+
return init;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function browserMutationObserverHost(): MutationObserverHost | undefined {
|
|
182
|
+
return typeof MutationObserver === "function" ? globalThis : undefined;
|
|
183
|
+
}
|