@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,201 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
2
|
+
|
|
3
|
+
/** Stable error code reported when one or more owned cleanups fail. */
|
|
4
|
+
export const DISPOSAL_ERROR_CODE = "VIZE_COMPOSE_DISPOSAL_FAILED" as const;
|
|
5
|
+
|
|
6
|
+
/** Aggregate failure produced after every owned cleanup has been attempted. */
|
|
7
|
+
export class DisposalError extends AggregateError {
|
|
8
|
+
/** Stable machine-readable error code. */
|
|
9
|
+
readonly code = DISPOSAL_ERROR_CODE;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Create an aggregate disposal failure.
|
|
13
|
+
*
|
|
14
|
+
* Nested {@link DisposalError} instances are flattened by the scope before
|
|
15
|
+
* construction, so `errors` contains the original cleanup failures in
|
|
16
|
+
* execution order.
|
|
17
|
+
*
|
|
18
|
+
* @param errors Cleanup failures in deterministic execution order.
|
|
19
|
+
*/
|
|
20
|
+
constructor(errors: readonly unknown[]) {
|
|
21
|
+
super(errors, `[${DISPOSAL_ERROR_CODE}] ${String(errors.length)} cleanup operation(s) failed.`);
|
|
22
|
+
this.name = "DisposalError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Handle for removing one cleanup from its owner before disposal. */
|
|
27
|
+
export interface CleanupRegistration {
|
|
28
|
+
/** Whether this registration is still retained by its owner. */
|
|
29
|
+
readonly active: boolean;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Release the cleanup without running it.
|
|
33
|
+
*
|
|
34
|
+
* @returns Whether an active registration was removed.
|
|
35
|
+
*/
|
|
36
|
+
readonly unregister: () => boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Options for {@link createDisposalScope}. */
|
|
40
|
+
export interface CreateDisposalScopeOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Dispose the owner with the active Vue reactive scope when one exists.
|
|
43
|
+
* Outside a reactive scope, ownership remains entirely with the caller.
|
|
44
|
+
*
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
readonly scope?: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Explicit owner for a deterministic group of cleanup operations. */
|
|
51
|
+
export interface DisposalScope {
|
|
52
|
+
/** Whether disposal has started or completed. */
|
|
53
|
+
readonly disposed: boolean;
|
|
54
|
+
|
|
55
|
+
/** Number of active cleanup registrations currently retained. */
|
|
56
|
+
readonly size: number;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Register one cleanup.
|
|
60
|
+
*
|
|
61
|
+
* Active registrations run in last-in, first-out order. After disposal,
|
|
62
|
+
* registration runs the cleanup immediately and returns an inactive handle;
|
|
63
|
+
* a late failure is wrapped in {@link DisposalError}.
|
|
64
|
+
*
|
|
65
|
+
* @param cleanup Synchronous, idempotent resource cleanup.
|
|
66
|
+
* @returns A handle that can release the cleanup without running it.
|
|
67
|
+
* @throws {DisposalError} A late cleanup failed after the owner was disposed.
|
|
68
|
+
*/
|
|
69
|
+
readonly add: <Cleanup extends () => unknown>(
|
|
70
|
+
cleanup: [ReturnType<Cleanup>] extends [never]
|
|
71
|
+
? Cleanup
|
|
72
|
+
: ReturnType<Cleanup> extends PromiseLike<unknown>
|
|
73
|
+
? never
|
|
74
|
+
: Cleanup,
|
|
75
|
+
) => CleanupRegistration;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Create a child whose lifetime cannot outlive this owner.
|
|
79
|
+
*
|
|
80
|
+
* Disposing the child early unregisters it from the parent. Disposing the
|
|
81
|
+
* parent disposes the child in normal LIFO order.
|
|
82
|
+
*
|
|
83
|
+
* @returns A new child disposal scope.
|
|
84
|
+
*/
|
|
85
|
+
readonly child: () => DisposalScope;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Run every active cleanup in last-in, first-out order exactly once.
|
|
89
|
+
*
|
|
90
|
+
* Reentrant and late registrations run immediately. All cleanups are
|
|
91
|
+
* attempted even when some fail. Repeated calls after successful or failed
|
|
92
|
+
* disposal do nothing.
|
|
93
|
+
*
|
|
94
|
+
* @throws {DisposalError} One or more cleanup operations failed.
|
|
95
|
+
*/
|
|
96
|
+
readonly dispose: () => void;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
interface CleanupRecord {
|
|
100
|
+
active: boolean;
|
|
101
|
+
readonly cleanup: () => unknown;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Create an explicit, deterministic cleanup owner.
|
|
106
|
+
*
|
|
107
|
+
* The owner is runtime-neutral and performs no browser-global access. By
|
|
108
|
+
* default it joins an active Vue reactive scope; when no scope exists, or
|
|
109
|
+
* `scope` is disabled, the caller must invoke `dispose()`. Cleanups are
|
|
110
|
+
* synchronous by contract so disposal completes before the owner releases
|
|
111
|
+
* its records.
|
|
112
|
+
*
|
|
113
|
+
* @param options Reactive-scope ownership behavior.
|
|
114
|
+
* @default options {}
|
|
115
|
+
* @returns A disposal owner with child-lifetime support.
|
|
116
|
+
*/
|
|
117
|
+
export function createDisposalScope(options: CreateDisposalScopeOptions = {}): DisposalScope {
|
|
118
|
+
const owner = createOwner();
|
|
119
|
+
if (options.scope ?? true) tryOnScopeDispose(owner.dispose);
|
|
120
|
+
return owner;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function createOwner(onDispose?: () => void): DisposalScope {
|
|
124
|
+
const records: CleanupRecord[] = [];
|
|
125
|
+
let disposed = false;
|
|
126
|
+
let size = 0;
|
|
127
|
+
|
|
128
|
+
const add = (cleanup: () => unknown): CleanupRegistration => {
|
|
129
|
+
if (disposed) {
|
|
130
|
+
try {
|
|
131
|
+
cleanup();
|
|
132
|
+
} catch (error) {
|
|
133
|
+
throw new DisposalError(flattenDisposalError(error));
|
|
134
|
+
}
|
|
135
|
+
return inactiveRegistration();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const record: CleanupRecord = { active: true, cleanup };
|
|
139
|
+
records.push(record);
|
|
140
|
+
size += 1;
|
|
141
|
+
return {
|
|
142
|
+
get active() {
|
|
143
|
+
return record.active;
|
|
144
|
+
},
|
|
145
|
+
unregister() {
|
|
146
|
+
if (!record.active) return false;
|
|
147
|
+
record.active = false;
|
|
148
|
+
size -= 1;
|
|
149
|
+
return true;
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const dispose = () => {
|
|
155
|
+
if (disposed) return;
|
|
156
|
+
disposed = true;
|
|
157
|
+
onDispose?.();
|
|
158
|
+
|
|
159
|
+
const errors: unknown[] = [];
|
|
160
|
+
for (let index = records.length - 1; index >= 0; index -= 1) {
|
|
161
|
+
const record = records[index];
|
|
162
|
+
if (!record?.active) continue;
|
|
163
|
+
record.active = false;
|
|
164
|
+
size -= 1;
|
|
165
|
+
try {
|
|
166
|
+
record.cleanup();
|
|
167
|
+
} catch (error) {
|
|
168
|
+
errors.push(...flattenDisposalError(error));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
records.length = 0;
|
|
172
|
+
if (errors.length > 0) throw new DisposalError(errors);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const child = () => {
|
|
176
|
+
let parentRegistration: CleanupRegistration | undefined;
|
|
177
|
+
const childOwner = createOwner(() => parentRegistration?.unregister());
|
|
178
|
+
parentRegistration = add(childOwner.dispose);
|
|
179
|
+
return childOwner;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
get disposed() {
|
|
184
|
+
return disposed;
|
|
185
|
+
},
|
|
186
|
+
get size() {
|
|
187
|
+
return size;
|
|
188
|
+
},
|
|
189
|
+
add,
|
|
190
|
+
child,
|
|
191
|
+
dispose,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function inactiveRegistration(): CleanupRegistration {
|
|
196
|
+
return { active: false, unregister: () => false };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function flattenDisposalError(error: unknown): readonly unknown[] {
|
|
200
|
+
return error instanceof DisposalError ? error.errors : [error];
|
|
201
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
hasInjectionContext,
|
|
4
|
+
onMounted,
|
|
5
|
+
readonly,
|
|
6
|
+
ref,
|
|
7
|
+
shallowRef,
|
|
8
|
+
toValue,
|
|
9
|
+
watchEffect,
|
|
10
|
+
} from "vue";
|
|
11
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
12
|
+
|
|
13
|
+
/** Page visibility state exposed by {@link useDocumentVisibility}. */
|
|
14
|
+
export type PageVisibilityState = "hidden" | "visible";
|
|
15
|
+
|
|
16
|
+
/** Capability required to observe document visibility. */
|
|
17
|
+
export interface DocumentVisibilityHost {
|
|
18
|
+
/** Current browser visibility state. Unknown states are treated as hidden. */
|
|
19
|
+
readonly visibilityState?: string;
|
|
20
|
+
|
|
21
|
+
/** Legacy visibility flag used when `visibilityState` is absent. */
|
|
22
|
+
readonly hidden?: boolean;
|
|
23
|
+
|
|
24
|
+
/** Subscribe to `visibilitychange`. */
|
|
25
|
+
readonly addEventListener: (
|
|
26
|
+
event: "visibilitychange",
|
|
27
|
+
listener: EventListener,
|
|
28
|
+
options?: boolean | AddEventListenerOptions,
|
|
29
|
+
) => void;
|
|
30
|
+
|
|
31
|
+
/** Remove a previous `visibilitychange` listener. */
|
|
32
|
+
readonly removeEventListener: (
|
|
33
|
+
event: "visibilitychange",
|
|
34
|
+
listener: EventListener,
|
|
35
|
+
options?: boolean | EventListenerOptions,
|
|
36
|
+
) => void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Options for {@link useDocumentVisibility}. */
|
|
40
|
+
export interface UseDocumentVisibilityOptions {
|
|
41
|
+
/**
|
|
42
|
+
* State exposed while no document capability is available.
|
|
43
|
+
*
|
|
44
|
+
* @default "visible"
|
|
45
|
+
*/
|
|
46
|
+
readonly ssrState?: PageVisibilityState;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reactive document capability for alternate runtimes and tests.
|
|
50
|
+
*
|
|
51
|
+
* @default globalThis.document when available
|
|
52
|
+
*/
|
|
53
|
+
readonly host?: MaybeRefOrGetter<DocumentVisibilityHost | null | undefined>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Reactive subscription update timing.
|
|
57
|
+
*
|
|
58
|
+
* @default "pre"
|
|
59
|
+
*/
|
|
60
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Reactive state returned by {@link useDocumentVisibility}. */
|
|
64
|
+
export interface DocumentVisibilityControls {
|
|
65
|
+
/** Current visibility state, using the configured SSR fallback while unsupported. */
|
|
66
|
+
readonly state: Readonly<Ref<PageVisibilityState>>;
|
|
67
|
+
|
|
68
|
+
/** Whether a concrete document capability is currently attached. */
|
|
69
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
70
|
+
|
|
71
|
+
/** Whether `state` is `"visible"`. */
|
|
72
|
+
readonly visible: ComputedRef<boolean>;
|
|
73
|
+
|
|
74
|
+
/** Whether `state` is `"hidden"`. */
|
|
75
|
+
readonly hidden: ComputedRef<boolean>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Observe document visibility without touching browser globals during module evaluation.
|
|
80
|
+
*
|
|
81
|
+
* The composable is safe during server rendering: when no host resolves, it exposes
|
|
82
|
+
* `ssrState` and marks `supported` false. During hydration or tests, passing a
|
|
83
|
+
* host attaches exactly one `visibilitychange` listener and removes it when the
|
|
84
|
+
* reactive host changes or the owning scope stops. Unsupported or future
|
|
85
|
+
* visibility states normalize to `"hidden"` so consumers fail closed instead of
|
|
86
|
+
* accidentally treating a prerendered or unloaded page as visible.
|
|
87
|
+
*
|
|
88
|
+
* @param options Runtime capability, server fallback, and watcher timing.
|
|
89
|
+
* @default options {}
|
|
90
|
+
* @returns Reactive visibility state plus derived booleans.
|
|
91
|
+
*/
|
|
92
|
+
export function useDocumentVisibility(
|
|
93
|
+
options: UseDocumentVisibilityOptions = {},
|
|
94
|
+
): DocumentVisibilityControls {
|
|
95
|
+
const fallback = options.ssrState ?? "visible";
|
|
96
|
+
const state = ref<PageVisibilityState>(fallback);
|
|
97
|
+
const supported = ref(false);
|
|
98
|
+
// Inside a component the host is read once it has mounted, so a hydrating
|
|
99
|
+
// client first renders the same fallback as the server. `hasInjectionContext`
|
|
100
|
+
// also detects Vapor components (unlike `getCurrentInstance`).
|
|
101
|
+
const mounted = shallowRef(!hasInjectionContext());
|
|
102
|
+
if (!mounted.value) {
|
|
103
|
+
onMounted(() => {
|
|
104
|
+
mounted.value = true;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
watchEffect(
|
|
109
|
+
(onCleanup) => {
|
|
110
|
+
const host = !mounted.value
|
|
111
|
+
? undefined
|
|
112
|
+
: options.host === undefined
|
|
113
|
+
? browserDocumentVisibilityHost()
|
|
114
|
+
: toValue(options.host);
|
|
115
|
+
if (!host) {
|
|
116
|
+
supported.value = false;
|
|
117
|
+
state.value = fallback;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const update = (): void => {
|
|
122
|
+
state.value = readVisibilityState(host);
|
|
123
|
+
};
|
|
124
|
+
supported.value = true;
|
|
125
|
+
update();
|
|
126
|
+
host.addEventListener("visibilitychange", update);
|
|
127
|
+
onCleanup(() => {
|
|
128
|
+
host.removeEventListener("visibilitychange", update);
|
|
129
|
+
supported.value = false;
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
{ flush: options.flush ?? "pre" },
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
state: readonly(state),
|
|
137
|
+
supported: readonly(supported),
|
|
138
|
+
visible: computed(() => state.value === "visible"),
|
|
139
|
+
hidden: computed(() => state.value === "hidden"),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function readVisibilityState(host: DocumentVisibilityHost): PageVisibilityState {
|
|
144
|
+
if (host.visibilityState === "visible") return "visible";
|
|
145
|
+
if (host.visibilityState === "hidden") return "hidden";
|
|
146
|
+
if (host.visibilityState !== undefined) return "hidden";
|
|
147
|
+
return host.hidden === false ? "visible" : "hidden";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function browserDocumentVisibilityHost(): DocumentVisibilityHost | undefined {
|
|
151
|
+
return typeof document !== "undefined" ? document : undefined;
|
|
152
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { computed, readonly, ref, toValue, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { isElementNode, resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import type { Point } from "./mouse.ts";
|
|
7
|
+
import { toPointerKind } from "./pointer.ts";
|
|
8
|
+
import type { PointerKind } from "./pointer.ts";
|
|
9
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
10
|
+
|
|
11
|
+
/** Axis constraint for {@link useDraggable}. */
|
|
12
|
+
export type DragAxis = "x" | "y" | "both";
|
|
13
|
+
|
|
14
|
+
/** Rectangle (in the same coordinate space as the position) that bounds dragging. */
|
|
15
|
+
export interface DragBounds {
|
|
16
|
+
/** Minimum x. */
|
|
17
|
+
readonly left: number;
|
|
18
|
+
/** Minimum y. */
|
|
19
|
+
readonly top: number;
|
|
20
|
+
/** Maximum x of the dragged element's right edge. */
|
|
21
|
+
readonly right: number;
|
|
22
|
+
/** Maximum y of the dragged element's bottom edge. */
|
|
23
|
+
readonly bottom: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Options for {@link useDraggable}. */
|
|
27
|
+
export interface UseDraggableOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Element that starts the drag. Defaults to the dragged element itself.
|
|
30
|
+
*
|
|
31
|
+
* @default undefined (the target)
|
|
32
|
+
*/
|
|
33
|
+
readonly handle?: MaybeElementTarget;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Restrict movement to one axis.
|
|
37
|
+
*
|
|
38
|
+
* @default "both"
|
|
39
|
+
*/
|
|
40
|
+
readonly axis?: MaybeRefOrGetter<DragAxis>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Keep the element inside these bounds, or inside a container element's
|
|
44
|
+
* client rectangle.
|
|
45
|
+
*
|
|
46
|
+
* @default undefined (unbounded)
|
|
47
|
+
*/
|
|
48
|
+
readonly bounds?: MaybeRefOrGetter<DragBounds | null | undefined> | MaybeElementTarget;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Position before the first drag and during server rendering.
|
|
52
|
+
*
|
|
53
|
+
* @default { x: 0, y: 0 }
|
|
54
|
+
*/
|
|
55
|
+
readonly initialValue?: Point;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Device kinds that may start a drag.
|
|
59
|
+
*
|
|
60
|
+
* @default ["mouse", "touch", "pen"]
|
|
61
|
+
*/
|
|
62
|
+
readonly pointerTypes?: readonly PointerKind[];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Only start when the pointer goes down on the handle itself, not a descendant.
|
|
66
|
+
*
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
69
|
+
readonly exact?: boolean;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Call `preventDefault()` on pointer events while dragging.
|
|
73
|
+
*
|
|
74
|
+
* @default false
|
|
75
|
+
*/
|
|
76
|
+
readonly preventDefault?: boolean;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Temporarily disable dragging.
|
|
80
|
+
*
|
|
81
|
+
* @default false
|
|
82
|
+
*/
|
|
83
|
+
readonly disabled?: MaybeRefOrGetter<boolean>;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Called before a drag starts. Return `false` to cancel it.
|
|
87
|
+
*
|
|
88
|
+
* @default undefined
|
|
89
|
+
*/
|
|
90
|
+
readonly onStart?: (position: Point, event: PointerEvent) => boolean | void;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Called after every position update.
|
|
94
|
+
*
|
|
95
|
+
* @default undefined
|
|
96
|
+
*/
|
|
97
|
+
readonly onMove?: (position: Point, event: PointerEvent) => void;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Called when the drag ends.
|
|
101
|
+
*
|
|
102
|
+
* @default undefined
|
|
103
|
+
*/
|
|
104
|
+
readonly onEnd?: (position: Point, event: PointerEvent) => void;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Reactive drag state returned by {@link useDraggable}. */
|
|
108
|
+
export interface DraggableControls {
|
|
109
|
+
/** Horizontal position (the element's left edge in client coordinates). */
|
|
110
|
+
readonly x: Ref<number>;
|
|
111
|
+
/** Vertical position (the element's top edge in client coordinates). */
|
|
112
|
+
readonly y: Ref<number>;
|
|
113
|
+
/** Current position snapshot. */
|
|
114
|
+
readonly position: ComputedRef<Point>;
|
|
115
|
+
/** Whether a drag is in progress. */
|
|
116
|
+
readonly isDragging: Readonly<Ref<boolean>>;
|
|
117
|
+
/** `left`/`top` declaration for `position: fixed` or `absolute` placement. */
|
|
118
|
+
readonly style: ComputedRef<string>;
|
|
119
|
+
/** Remove listeners. Idempotent. */
|
|
120
|
+
readonly stop: () => void;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Make an element draggable with Pointer Events.
|
|
125
|
+
*
|
|
126
|
+
* `pointerdown` on the handle records the offset between the pointer and the
|
|
127
|
+
* element; moves are tracked on the owner document (so fast drags that leave
|
|
128
|
+
* the element keep working) and constrained by `axis` and `bounds`. `x`/`y`
|
|
129
|
+
* are writable for programmatic placement. Server renders expose
|
|
130
|
+
* `initialValue`; listeners are removed with the owning reactive scope.
|
|
131
|
+
*
|
|
132
|
+
* @param target Reactive element being dragged.
|
|
133
|
+
* @param options Handle, axis, bounds, device filter, and lifecycle callbacks.
|
|
134
|
+
* @default options {}
|
|
135
|
+
* @returns Writable position, drag flag, inline style, and stop control.
|
|
136
|
+
*/
|
|
137
|
+
export function useDraggable(
|
|
138
|
+
target: MaybeElementTarget,
|
|
139
|
+
options: UseDraggableOptions = {},
|
|
140
|
+
): DraggableControls {
|
|
141
|
+
const initial = options.initialValue ?? { x: 0, y: 0 };
|
|
142
|
+
const x = ref(initial.x);
|
|
143
|
+
const y = ref(initial.y);
|
|
144
|
+
const isDragging = ref(false);
|
|
145
|
+
const pointerTypes = options.pointerTypes ?? ["mouse", "touch", "pen"];
|
|
146
|
+
const position = computed<Point>(() => ({ x: x.value, y: y.value }));
|
|
147
|
+
let offset: Point | null = null;
|
|
148
|
+
let activePointer: number | null = null;
|
|
149
|
+
|
|
150
|
+
const constrain = (element: Element, next: Point): Point => {
|
|
151
|
+
const bounds = readBounds(options.bounds);
|
|
152
|
+
if (!bounds) return next;
|
|
153
|
+
const rect = element.getBoundingClientRect();
|
|
154
|
+
return {
|
|
155
|
+
x: clamp(next.x, bounds.left, Math.max(bounds.left, bounds.right - rect.width)),
|
|
156
|
+
y: clamp(next.y, bounds.top, Math.max(bounds.top, bounds.bottom - rect.height)),
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
const accepts = (event: Event): event is PointerEvent => {
|
|
160
|
+
if (!isPointerEvent(event)) return false;
|
|
161
|
+
const kind = toPointerKind(event.pointerType);
|
|
162
|
+
return kind !== null && pointerTypes.includes(kind);
|
|
163
|
+
};
|
|
164
|
+
const handleEvent = (event: PointerEvent): void => {
|
|
165
|
+
if (options.preventDefault && event.cancelable) event.preventDefault();
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const stopWatch = watch(
|
|
169
|
+
() =>
|
|
170
|
+
[
|
|
171
|
+
resolveElement(target),
|
|
172
|
+
options.handle === undefined ? undefined : resolveElement(options.handle),
|
|
173
|
+
] as const,
|
|
174
|
+
([element, handleOverride], _previous, onCleanup) => {
|
|
175
|
+
const handle = handleOverride === undefined ? element : handleOverride;
|
|
176
|
+
if (!element || !handle) return;
|
|
177
|
+
const document = element.ownerDocument;
|
|
178
|
+
|
|
179
|
+
const onMove = (event: Event): void => {
|
|
180
|
+
if (!accepts(event) || event.pointerId !== activePointer || !offset) return;
|
|
181
|
+
const axis = toValue(options.axis) ?? "both";
|
|
182
|
+
const next = constrain(element, {
|
|
183
|
+
x: axis === "y" ? x.value : event.clientX - offset.x,
|
|
184
|
+
y: axis === "x" ? y.value : event.clientY - offset.y,
|
|
185
|
+
});
|
|
186
|
+
x.value = next.x;
|
|
187
|
+
y.value = next.y;
|
|
188
|
+
handleEvent(event);
|
|
189
|
+
options.onMove?.(next, event);
|
|
190
|
+
};
|
|
191
|
+
const onUp = (event: Event): void => {
|
|
192
|
+
if (!accepts(event) || event.pointerId !== activePointer) return;
|
|
193
|
+
activePointer = null;
|
|
194
|
+
offset = null;
|
|
195
|
+
isDragging.value = false;
|
|
196
|
+
document.removeEventListener("pointermove", onMove);
|
|
197
|
+
document.removeEventListener("pointerup", onUp);
|
|
198
|
+
document.removeEventListener("pointercancel", onUp);
|
|
199
|
+
handleEvent(event);
|
|
200
|
+
options.onEnd?.(position.value, event);
|
|
201
|
+
};
|
|
202
|
+
const onDown = (event: Event): void => {
|
|
203
|
+
if (!accepts(event) || toValue(options.disabled) || activePointer !== null) return;
|
|
204
|
+
if (event.pointerType === "mouse" && event.button !== 0) return;
|
|
205
|
+
if (options.exact && event.target !== handle) return;
|
|
206
|
+
const rect = element.getBoundingClientRect();
|
|
207
|
+
const start = { x: rect.left, y: rect.top };
|
|
208
|
+
if (options.onStart?.(start, event) === false) return;
|
|
209
|
+
activePointer = event.pointerId;
|
|
210
|
+
offset = { x: event.clientX - rect.left, y: event.clientY - rect.top };
|
|
211
|
+
isDragging.value = true;
|
|
212
|
+
document.addEventListener("pointermove", onMove);
|
|
213
|
+
document.addEventListener("pointerup", onUp);
|
|
214
|
+
document.addEventListener("pointercancel", onUp);
|
|
215
|
+
handleEvent(event);
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
handle.addEventListener("pointerdown", onDown);
|
|
219
|
+
onCleanup(() => {
|
|
220
|
+
handle.removeEventListener("pointerdown", onDown);
|
|
221
|
+
document.removeEventListener("pointermove", onMove);
|
|
222
|
+
document.removeEventListener("pointerup", onUp);
|
|
223
|
+
document.removeEventListener("pointercancel", onUp);
|
|
224
|
+
activePointer = null;
|
|
225
|
+
offset = null;
|
|
226
|
+
isDragging.value = false;
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
{ immediate: true, flush: "post" },
|
|
230
|
+
);
|
|
231
|
+
const stop = (): void => stopWatch.stop();
|
|
232
|
+
tryOnScopeDispose(stop);
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
x,
|
|
236
|
+
y,
|
|
237
|
+
position,
|
|
238
|
+
isDragging: readonly(isDragging),
|
|
239
|
+
style: computed(() => `left:${x.value}px;top:${y.value}px;`),
|
|
240
|
+
stop,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function readBounds(source: UseDraggableOptions["bounds"]): DragBounds | null {
|
|
245
|
+
if (source === undefined) return null;
|
|
246
|
+
const value: unknown = toValue(source);
|
|
247
|
+
if (isDragBounds(value)) return value;
|
|
248
|
+
const root: unknown =
|
|
249
|
+
typeof value === "object" && value !== null && "$el" in value ? value.$el : value;
|
|
250
|
+
if (!isElementNode(root)) return null;
|
|
251
|
+
const element = root;
|
|
252
|
+
const rect = element.getBoundingClientRect();
|
|
253
|
+
return { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom };
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function isDragBounds(value: unknown): value is DragBounds {
|
|
257
|
+
return (
|
|
258
|
+
typeof value === "object" &&
|
|
259
|
+
value !== null &&
|
|
260
|
+
!("nodeType" in value) &&
|
|
261
|
+
!("$el" in value) &&
|
|
262
|
+
"left" in value &&
|
|
263
|
+
"right" in value
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function clamp(value: number, minimum: number, maximum: number): number {
|
|
268
|
+
return Math.min(Math.max(value, minimum), maximum);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function isPointerEvent(event: Event): event is PointerEvent {
|
|
272
|
+
return "pointerId" in event && "pointerType" in event;
|
|
273
|
+
}
|