@vizejs/composable 0.426.3 → 0.427.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { readonly, ref, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import { useEventListener } from "./event-listener.ts";
|
|
7
|
+
import { useResizeObserver } from "./resize-observer.ts";
|
|
8
|
+
import type { ResizeObserverHost } from "./resize-observer.ts";
|
|
9
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Window-like capability observed by {@link useElementBounding}: scroll and
|
|
13
|
+
* resize events plus the optional `ResizeObserver` constructor.
|
|
14
|
+
*/
|
|
15
|
+
export interface ElementBoundingHost extends EventTarget, ResizeObserverHost {}
|
|
16
|
+
|
|
17
|
+
/** Viewport-relative element geometry in CSS pixels. */
|
|
18
|
+
export interface ElementBoundingRect {
|
|
19
|
+
/** Horizontal position of the border box origin. */
|
|
20
|
+
readonly x: number;
|
|
21
|
+
/** Vertical position of the border box origin. */
|
|
22
|
+
readonly y: number;
|
|
23
|
+
/** Distance from the viewport top edge to the border box top edge. */
|
|
24
|
+
readonly top: number;
|
|
25
|
+
/** Distance from the viewport left edge to the border box right edge. */
|
|
26
|
+
readonly right: number;
|
|
27
|
+
/** Distance from the viewport top edge to the border box bottom edge. */
|
|
28
|
+
readonly bottom: number;
|
|
29
|
+
/** Distance from the viewport left edge to the border box left edge. */
|
|
30
|
+
readonly left: number;
|
|
31
|
+
/** Border box width. */
|
|
32
|
+
readonly width: number;
|
|
33
|
+
/** Border box height. */
|
|
34
|
+
readonly height: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Options for {@link useElementBounding}. */
|
|
38
|
+
export interface UseElementBoundingOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Reset every value to zero when the target unmounts.
|
|
41
|
+
*
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
readonly reset?: boolean;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Re-measure when the window resizes.
|
|
48
|
+
*
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
readonly windowResize?: boolean;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Re-measure when any ancestor (or the window) scrolls. Uses a capturing,
|
|
55
|
+
* passive listener so nested scroll containers are covered.
|
|
56
|
+
*
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
readonly windowScroll?: boolean;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Reactive window capability for alternate runtimes and tests.
|
|
63
|
+
*
|
|
64
|
+
* @default globalThis.window when available
|
|
65
|
+
*/
|
|
66
|
+
readonly host?: MaybeRefOrGetter<ElementBoundingHost | null | undefined>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Target resolution timing. `"post"` measures template refs after mount.
|
|
70
|
+
*
|
|
71
|
+
* @default "post"
|
|
72
|
+
*/
|
|
73
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Reactive geometry returned by {@link useElementBounding}. */
|
|
77
|
+
export type ElementBoundingControls = {
|
|
78
|
+
/** Reactive geometry field; zero during server rendering. */
|
|
79
|
+
readonly [Key in keyof ElementBoundingRect]: Readonly<Ref<number>>;
|
|
80
|
+
} & {
|
|
81
|
+
/** Measure the target immediately. Does nothing while it is unresolved. */
|
|
82
|
+
readonly update: () => void;
|
|
83
|
+
|
|
84
|
+
/** Stop observing resize, scroll, and target changes. Idempotent. */
|
|
85
|
+
readonly stop: () => void;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const boundingKeys = [
|
|
89
|
+
"x",
|
|
90
|
+
"y",
|
|
91
|
+
"top",
|
|
92
|
+
"right",
|
|
93
|
+
"bottom",
|
|
94
|
+
"left",
|
|
95
|
+
"width",
|
|
96
|
+
"height",
|
|
97
|
+
] as const satisfies readonly (keyof ElementBoundingRect)[];
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Track an element's `getBoundingClientRect()` reactively.
|
|
101
|
+
*
|
|
102
|
+
* Measures when the target resolves, when it resizes (via `ResizeObserver`),
|
|
103
|
+
* and — unless disabled — when the window resizes or anything scrolls. Every
|
|
104
|
+
* value is `0` during server rendering and before the first measurement, so
|
|
105
|
+
* the initial render is hydration-stable. Listeners and the observer are
|
|
106
|
+
* released with the owning reactive scope.
|
|
107
|
+
*
|
|
108
|
+
* @param target Reactive element target.
|
|
109
|
+
* @param options Reset, listener, capability, and timing options.
|
|
110
|
+
* @default options {}
|
|
111
|
+
* @returns One readonly ref per geometry field plus `update`/`stop`.
|
|
112
|
+
*/
|
|
113
|
+
export function useElementBounding(
|
|
114
|
+
target: MaybeElementTarget,
|
|
115
|
+
options: UseElementBoundingOptions = {},
|
|
116
|
+
): ElementBoundingControls {
|
|
117
|
+
const { reset = true, windowResize = true, windowScroll = true } = options;
|
|
118
|
+
const flush = options.flush ?? "post";
|
|
119
|
+
const state = {
|
|
120
|
+
x: ref(0),
|
|
121
|
+
y: ref(0),
|
|
122
|
+
top: ref(0),
|
|
123
|
+
right: ref(0),
|
|
124
|
+
bottom: ref(0),
|
|
125
|
+
left: ref(0),
|
|
126
|
+
width: ref(0),
|
|
127
|
+
height: ref(0),
|
|
128
|
+
};
|
|
129
|
+
const host = (): ElementBoundingHost | null | undefined =>
|
|
130
|
+
options.host === undefined ? browserBoundingHost() : toValue(options.host);
|
|
131
|
+
|
|
132
|
+
const update = (): void => {
|
|
133
|
+
const element = resolveElement(target);
|
|
134
|
+
if (!element) {
|
|
135
|
+
if (reset) for (const key of boundingKeys) state[key].value = 0;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const rect = element.getBoundingClientRect();
|
|
139
|
+
for (const key of boundingKeys) state[key].value = rect[key];
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const observer = useResizeObserver(target, update, { host, flush });
|
|
143
|
+
const stopTarget = watch(() => resolveElement(target), update, { immediate: true, flush });
|
|
144
|
+
const resize = windowResize
|
|
145
|
+
? useEventListener(host, "resize", update, { passive: true, flush })
|
|
146
|
+
: undefined;
|
|
147
|
+
const scroll = windowScroll
|
|
148
|
+
? useEventListener(host, "scroll", update, { capture: true, passive: true, flush })
|
|
149
|
+
: undefined;
|
|
150
|
+
|
|
151
|
+
const stop = (): void => {
|
|
152
|
+
observer.stop();
|
|
153
|
+
stopTarget.stop();
|
|
154
|
+
resize?.stop();
|
|
155
|
+
scroll?.stop();
|
|
156
|
+
};
|
|
157
|
+
tryOnScopeDispose(stop);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
x: readonly(state.x),
|
|
161
|
+
y: readonly(state.y),
|
|
162
|
+
top: readonly(state.top),
|
|
163
|
+
right: readonly(state.right),
|
|
164
|
+
bottom: readonly(state.bottom),
|
|
165
|
+
left: readonly(state.left),
|
|
166
|
+
width: readonly(state.width),
|
|
167
|
+
height: readonly(state.height),
|
|
168
|
+
update,
|
|
169
|
+
stop,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function browserBoundingHost(): ElementBoundingHost | undefined {
|
|
174
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
175
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Document-like capability used by {@link useElementByPoint}. */
|
|
7
|
+
export interface ElementByPointHost {
|
|
8
|
+
/** Topmost element at a point. */
|
|
9
|
+
elementFromPoint(x: number, y: number): Element | null;
|
|
10
|
+
/**
|
|
11
|
+
* Every element at a point, topmost first. Optional: when missing, only
|
|
12
|
+
* the topmost element is reported.
|
|
13
|
+
*/
|
|
14
|
+
elementsFromPoint?(x: number, y: number): Element[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Frame scheduler used for continuous polling. */
|
|
18
|
+
export interface ElementByPointFrameHost {
|
|
19
|
+
/** Schedule a callback before the next repaint. */
|
|
20
|
+
readonly requestAnimationFrame: (callback: FrameRequestCallback) => number;
|
|
21
|
+
/** Cancel a scheduled frame. */
|
|
22
|
+
readonly cancelAnimationFrame: (handle: number) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Options for {@link useElementByPoint}. */
|
|
26
|
+
export interface UseElementByPointOptions {
|
|
27
|
+
/** Horizontal client coordinate. */
|
|
28
|
+
readonly x: MaybeRefOrGetter<number>;
|
|
29
|
+
|
|
30
|
+
/** Vertical client coordinate. */
|
|
31
|
+
readonly y: MaybeRefOrGetter<number>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Also re-query every animation frame (the element under a fixed point can
|
|
35
|
+
* change when the page scrolls or animates).
|
|
36
|
+
*
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
readonly poll?: boolean;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Reactive document capability for alternate runtimes and tests.
|
|
43
|
+
*
|
|
44
|
+
* @default globalThis.document when available
|
|
45
|
+
*/
|
|
46
|
+
readonly host?: MaybeRefOrGetter<ElementByPointHost | null | undefined>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Frame scheduler used when `poll` is enabled.
|
|
50
|
+
*
|
|
51
|
+
* @default globalThis.window when available
|
|
52
|
+
*/
|
|
53
|
+
readonly frameHost?: MaybeRefOrGetter<ElementByPointFrameHost | null | undefined>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Reactive state returned by {@link useElementByPoint}. */
|
|
57
|
+
export interface ElementByPointControls {
|
|
58
|
+
/** Whether a document capability is attached. `false` during server rendering. */
|
|
59
|
+
readonly isSupported: Readonly<Ref<boolean>>;
|
|
60
|
+
/** Topmost element at the point. */
|
|
61
|
+
readonly element: Readonly<ShallowRef<Element | null>>;
|
|
62
|
+
/** Every element at the point, topmost first. */
|
|
63
|
+
readonly elements: Readonly<ShallowRef<readonly Element[]>>;
|
|
64
|
+
/** Re-query immediately. */
|
|
65
|
+
readonly update: () => void;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Track the element(s) under a client coordinate.
|
|
70
|
+
*
|
|
71
|
+
* Re-queries whenever `x`/`y` change and, with `poll`, on every animation
|
|
72
|
+
* frame until the owning scope stops. Server renders expose `null` and an
|
|
73
|
+
* empty list.
|
|
74
|
+
*
|
|
75
|
+
* @param options Coordinates, polling, and capabilities.
|
|
76
|
+
* @returns Reactive topmost element, element stack, and a manual update.
|
|
77
|
+
*/
|
|
78
|
+
export function useElementByPoint(options: UseElementByPointOptions): ElementByPointControls {
|
|
79
|
+
const isSupported = ref(false);
|
|
80
|
+
const element = shallowRef<Element | null>(null);
|
|
81
|
+
const elements = shallowRef<readonly Element[]>([]);
|
|
82
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
83
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
84
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
85
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
86
|
+
if (!mounted.value) {
|
|
87
|
+
onMounted(() => {
|
|
88
|
+
mounted.value = true;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const host = (): ElementByPointHost | null | undefined =>
|
|
92
|
+
!mounted.value
|
|
93
|
+
? undefined
|
|
94
|
+
: options.host === undefined
|
|
95
|
+
? browserPointHost()
|
|
96
|
+
: toValue(options.host);
|
|
97
|
+
|
|
98
|
+
const update = (): void => {
|
|
99
|
+
const current = host();
|
|
100
|
+
isSupported.value = Boolean(current);
|
|
101
|
+
if (!current) {
|
|
102
|
+
element.value = null;
|
|
103
|
+
elements.value = [];
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const x = toValue(options.x);
|
|
107
|
+
const y = toValue(options.y);
|
|
108
|
+
element.value = current.elementFromPoint(x, y);
|
|
109
|
+
elements.value = current.elementsFromPoint
|
|
110
|
+
? current.elementsFromPoint(x, y)
|
|
111
|
+
: element.value
|
|
112
|
+
? [element.value]
|
|
113
|
+
: [];
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const stopWatch = watch(() => [host(), toValue(options.x), toValue(options.y)] as const, update, {
|
|
117
|
+
immediate: true,
|
|
118
|
+
});
|
|
119
|
+
const stopPolling = options.poll
|
|
120
|
+
? watch(
|
|
121
|
+
() => (options.frameHost === undefined ? browserFrameHost() : toValue(options.frameHost)),
|
|
122
|
+
(frames, _previous, onCleanup) => {
|
|
123
|
+
if (!frames) return;
|
|
124
|
+
let handle = 0;
|
|
125
|
+
const tick = (): void => {
|
|
126
|
+
update();
|
|
127
|
+
handle = frames.requestAnimationFrame(tick);
|
|
128
|
+
};
|
|
129
|
+
handle = frames.requestAnimationFrame(tick);
|
|
130
|
+
onCleanup(() => frames.cancelAnimationFrame(handle));
|
|
131
|
+
},
|
|
132
|
+
{ immediate: true },
|
|
133
|
+
)
|
|
134
|
+
: undefined;
|
|
135
|
+
tryOnScopeDispose(() => {
|
|
136
|
+
stopWatch.stop();
|
|
137
|
+
stopPolling?.stop();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
return { isSupported: readonly(isSupported), element, elements, update };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function browserPointHost(): ElementByPointHost | undefined {
|
|
144
|
+
return typeof document !== "undefined" ? document : undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function browserFrameHost(): ElementByPointFrameHost | undefined {
|
|
148
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
149
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { 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 { tryOnScopeDispose } from "./scope.ts";
|
|
7
|
+
import type { TimeoutScheduler } from "./timeout-scheduler.ts";
|
|
8
|
+
|
|
9
|
+
/** Options for {@link useElementHover}. */
|
|
10
|
+
export interface UseElementHoverOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Milliseconds to wait before reporting hover.
|
|
13
|
+
*
|
|
14
|
+
* @default 0
|
|
15
|
+
*/
|
|
16
|
+
readonly delayEnter?: number;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Milliseconds to wait before reporting the end of hover.
|
|
20
|
+
*
|
|
21
|
+
* @default 0
|
|
22
|
+
*/
|
|
23
|
+
readonly delayLeave?: number;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Owns the delay timer.
|
|
27
|
+
*
|
|
28
|
+
* @default globalThis timer functions
|
|
29
|
+
*/
|
|
30
|
+
readonly scheduler?: TimeoutScheduler;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const defaultScheduler: TimeoutScheduler = {
|
|
34
|
+
setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
|
|
35
|
+
clearTimeout: (handle) => {
|
|
36
|
+
globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Track whether the pointer hovers an element.
|
|
42
|
+
*
|
|
43
|
+
* Uses `pointerenter`/`pointerleave` (which ignore descendants) with optional
|
|
44
|
+
* enter/leave delays; a pending delay is cancelled by the opposite event.
|
|
45
|
+
* Server renders report `false`; listeners and timers are released with the
|
|
46
|
+
* owning reactive scope.
|
|
47
|
+
*
|
|
48
|
+
* @param target Reactive element target.
|
|
49
|
+
* @param options Enter/leave delays and timer scheduler.
|
|
50
|
+
* @default options {}
|
|
51
|
+
* @returns Readonly hover flag.
|
|
52
|
+
*/
|
|
53
|
+
export function useElementHover(
|
|
54
|
+
target: MaybeElementTarget,
|
|
55
|
+
options: UseElementHoverOptions = {},
|
|
56
|
+
): Readonly<Ref<boolean>> {
|
|
57
|
+
const { delayEnter = 0, delayLeave = 0, scheduler = defaultScheduler } = options;
|
|
58
|
+
const hovered = ref(false);
|
|
59
|
+
let handle: unknown;
|
|
60
|
+
let pending = false;
|
|
61
|
+
|
|
62
|
+
const cancel = (): void => {
|
|
63
|
+
if (!pending) return;
|
|
64
|
+
scheduler.clearTimeout(handle);
|
|
65
|
+
pending = false;
|
|
66
|
+
};
|
|
67
|
+
const set = (next: boolean): void => {
|
|
68
|
+
cancel();
|
|
69
|
+
const delay = next ? delayEnter : delayLeave;
|
|
70
|
+
if (delay <= 0) {
|
|
71
|
+
hovered.value = next;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
pending = true;
|
|
75
|
+
handle = scheduler.setTimeout(() => {
|
|
76
|
+
pending = false;
|
|
77
|
+
hovered.value = next;
|
|
78
|
+
}, delay);
|
|
79
|
+
};
|
|
80
|
+
const onEnter = (): void => set(true);
|
|
81
|
+
const onLeave = (): void => set(false);
|
|
82
|
+
|
|
83
|
+
const stop = watch(
|
|
84
|
+
() => resolveElement(target),
|
|
85
|
+
(element, _previous, onCleanup) => {
|
|
86
|
+
if (!element) return;
|
|
87
|
+
element.addEventListener("pointerenter", onEnter, { passive: true });
|
|
88
|
+
element.addEventListener("pointerleave", onLeave, { passive: true });
|
|
89
|
+
onCleanup(() => {
|
|
90
|
+
element.removeEventListener("pointerenter", onEnter);
|
|
91
|
+
element.removeEventListener("pointerleave", onLeave);
|
|
92
|
+
cancel();
|
|
93
|
+
hovered.value = false;
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
{ immediate: true, flush: "post" },
|
|
97
|
+
);
|
|
98
|
+
tryOnScopeDispose(() => {
|
|
99
|
+
stop.stop();
|
|
100
|
+
cancel();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return readonly(hovered);
|
|
104
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { hasInjectionContext, onMounted, shallowRef } from "vue";
|
|
2
|
+
import type { ComponentPublicInstance, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
|
|
6
|
+
/** Function ref accepted by `:ref` on elements and components. */
|
|
7
|
+
export type ElementRefSetter = (value: Element | ComponentPublicInstance | null) => void;
|
|
8
|
+
|
|
9
|
+
/** State returned by {@link useElementRef}. */
|
|
10
|
+
export interface ElementRefControls<TargetElement extends Element> {
|
|
11
|
+
/** Resolved element (component roots are unwrapped); `null` while unmounted. */
|
|
12
|
+
readonly element: Readonly<ShallowRef<TargetElement | null>>;
|
|
13
|
+
/** Bind with `:ref="setRef"` on an element or component. */
|
|
14
|
+
readonly setRef: ElementRefSetter;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Capture a template element through a function ref.
|
|
19
|
+
*
|
|
20
|
+
* An instance-free alternative to "current element" helpers: it never reads
|
|
21
|
+
* `getCurrentInstance()`, so it works in Vapor components, render functions,
|
|
22
|
+
* and plain effect scopes. Inside a component the element is published after
|
|
23
|
+
* mounting (Vapor sets function refs during render), keeping hydration stable. Component refs are unwrapped to their root
|
|
24
|
+
* element, and an optional guard narrows the element type (elements failing
|
|
25
|
+
* it resolve to `null`). The ref is `null` during server rendering.
|
|
26
|
+
*
|
|
27
|
+
* @returns Reactive element plus the function ref to bind.
|
|
28
|
+
*/
|
|
29
|
+
export function useElementRef(): ElementRefControls<Element>;
|
|
30
|
+
/**
|
|
31
|
+
* Capture a template element narrowed by a type guard.
|
|
32
|
+
*
|
|
33
|
+
* @param guard Type guard; elements failing it resolve to `null`.
|
|
34
|
+
* @returns Reactive narrowed element plus the function ref to bind.
|
|
35
|
+
*/
|
|
36
|
+
export function useElementRef<TargetElement extends Element>(
|
|
37
|
+
guard: (element: Element) => element is TargetElement,
|
|
38
|
+
): ElementRefControls<TargetElement>;
|
|
39
|
+
export function useElementRef(guard?: (element: Element) => boolean): ElementRefControls<Element> {
|
|
40
|
+
const element = shallowRef<Element | null>(null);
|
|
41
|
+
// Vapor assigns function refs while rendering, VDOM after patching; inside
|
|
42
|
+
// a component the element is published once it has mounted so both
|
|
43
|
+
// renderers hydrate the same (server) state first.
|
|
44
|
+
let mounted = !hasInjectionContext();
|
|
45
|
+
let pending: Element | null = null;
|
|
46
|
+
if (!mounted) {
|
|
47
|
+
onMounted(() => {
|
|
48
|
+
mounted = true;
|
|
49
|
+
element.value = pending;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const setRef: ElementRefSetter = (value) => {
|
|
53
|
+
const resolved = resolveElement(value);
|
|
54
|
+
pending = resolved && (!guard || guard(resolved)) ? resolved : null;
|
|
55
|
+
if (mounted) element.value = pending;
|
|
56
|
+
};
|
|
57
|
+
return { element, setRef };
|
|
58
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { toValue } from "vue";
|
|
2
|
+
import type { ComponentPublicInstance, MaybeRefOrGetter } from "vue";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A concrete value that can identify a DOM element.
|
|
6
|
+
*
|
|
7
|
+
* Template refs on native elements resolve to the element itself, while refs
|
|
8
|
+
* on components resolve to the component's public instance whose root node
|
|
9
|
+
* is exposed as `$el`. `null` and `undefined` represent a target that is not
|
|
10
|
+
* mounted yet (including every server render).
|
|
11
|
+
*/
|
|
12
|
+
export type ElementTargetValue<TargetElement extends Element = Element> =
|
|
13
|
+
| TargetElement
|
|
14
|
+
| ComponentPublicInstance
|
|
15
|
+
| null
|
|
16
|
+
| undefined;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Reactive element target accepted by every element-based composable.
|
|
20
|
+
*
|
|
21
|
+
* Accepts a plain value, a ref (such as `useTemplateRef()`), or a getter.
|
|
22
|
+
*/
|
|
23
|
+
export type MaybeElementTarget<TargetElement extends Element = Element> = MaybeRefOrGetter<
|
|
24
|
+
ElementTargetValue<TargetElement>
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Reactive list of element targets for observers that watch several nodes.
|
|
29
|
+
*
|
|
30
|
+
* Each item follows {@link MaybeElementTarget} semantics; unresolved items
|
|
31
|
+
* are skipped.
|
|
32
|
+
*/
|
|
33
|
+
export type MaybeElementTargets<TargetElement extends Element = Element> =
|
|
34
|
+
| MaybeElementTarget<TargetElement>
|
|
35
|
+
| MaybeRefOrGetter<readonly ElementTargetValue<TargetElement>[]>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether a value is a DOM element node.
|
|
39
|
+
*
|
|
40
|
+
* Uses the `nodeType` contract instead of `instanceof Element`, so the check
|
|
41
|
+
* reads no browser globals and works across realms (iframes, happy-dom,
|
|
42
|
+
* jsdom).
|
|
43
|
+
*
|
|
44
|
+
* @param value Candidate value.
|
|
45
|
+
* @returns Whether `value` is an element node.
|
|
46
|
+
*/
|
|
47
|
+
export function isElementNode(value: unknown): value is Element {
|
|
48
|
+
return (
|
|
49
|
+
typeof value === "object" &&
|
|
50
|
+
value !== null &&
|
|
51
|
+
"nodeType" in value &&
|
|
52
|
+
value.nodeType === 1 &&
|
|
53
|
+
"getBoundingClientRect" in value
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Resolve a reactive element target to its concrete element.
|
|
59
|
+
*
|
|
60
|
+
* Reads the reactive source once (tracking it when called inside an effect).
|
|
61
|
+
* Component instances resolve to their root element; fragment or text roots
|
|
62
|
+
* resolve to `null`. Never throws and reads no browser globals, so it is safe
|
|
63
|
+
* during server rendering, where it always returns `null`.
|
|
64
|
+
*
|
|
65
|
+
* @param target Reactive element target.
|
|
66
|
+
* @returns The resolved element, or `null` while unresolved.
|
|
67
|
+
*/
|
|
68
|
+
export function resolveElement(target: MaybeElementTarget): Element | null {
|
|
69
|
+
return elementFromValue(toValue(target));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function elementFromValue(value: unknown): Element | null {
|
|
73
|
+
if (isElementNode(value)) return value;
|
|
74
|
+
if (typeof value === "object" && value !== null && "$el" in value) {
|
|
75
|
+
const root: unknown = value.$el;
|
|
76
|
+
return isElementNode(root) ? root : null;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Resolve a reactive list (or single) element target to its concrete elements.
|
|
83
|
+
*
|
|
84
|
+
* Unresolved entries are dropped and duplicates are removed while keeping the
|
|
85
|
+
* first-seen order, so observers never register the same node twice.
|
|
86
|
+
*
|
|
87
|
+
* @param targets Reactive element target or target list.
|
|
88
|
+
* @returns The resolved, de-duplicated elements.
|
|
89
|
+
*/
|
|
90
|
+
export function resolveElements(targets: MaybeElementTargets): Element[] {
|
|
91
|
+
const value: unknown = toValue(targets);
|
|
92
|
+
const items: readonly unknown[] = Array.isArray(value) ? value : [value];
|
|
93
|
+
const elements: Element[] = [];
|
|
94
|
+
for (const item of items) {
|
|
95
|
+
const element = elementFromValue(item);
|
|
96
|
+
if (element && !elements.includes(element)) elements.push(element);
|
|
97
|
+
}
|
|
98
|
+
return elements;
|
|
99
|
+
}
|