@vizejs/composable 0.426.2 → 0.427.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { computed, hasInjectionContext, shallowRef, toValue, watch, watchPostEffect } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Document-like capability observed by {@link useTextSelection}. */
|
|
7
|
+
export interface TextSelectionHost extends EventTarget {
|
|
8
|
+
/** Current selection. */
|
|
9
|
+
getSelection(): Selection | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Options for {@link useTextSelection}. */
|
|
13
|
+
export interface UseTextSelectionOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Reactive document capability for alternate runtimes and tests.
|
|
16
|
+
*
|
|
17
|
+
* @default globalThis.document when available
|
|
18
|
+
*/
|
|
19
|
+
readonly host?: MaybeRefOrGetter<TextSelectionHost | null | undefined>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Reactive selection state returned by {@link useTextSelection}. */
|
|
23
|
+
export interface TextSelectionControls {
|
|
24
|
+
/** Current `Selection` object; `null` during server rendering. */
|
|
25
|
+
readonly selection: Readonly<ShallowRef<Selection | null>>;
|
|
26
|
+
/** Selected text. Empty during server rendering. */
|
|
27
|
+
readonly text: ComputedRef<string>;
|
|
28
|
+
/** Selected ranges. */
|
|
29
|
+
readonly ranges: ComputedRef<readonly Range[]>;
|
|
30
|
+
/** Client rectangles of each selected range. */
|
|
31
|
+
readonly rects: ComputedRef<readonly DOMRect[]>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Track the document text selection.
|
|
36
|
+
*
|
|
37
|
+
* Re-reads the selection on every `selectionchange`. Because the platform
|
|
38
|
+
* mutates the same `Selection` object in place, a revision counter is used to
|
|
39
|
+
* invalidate the derived `text`, `ranges`, and `rects`. Server renders expose
|
|
40
|
+
* an empty selection; the listener is removed with the owning scope.
|
|
41
|
+
*
|
|
42
|
+
* Inside a component the host is read after mounting, so hydration renders
|
|
43
|
+
* the server fallback first and never mismatches.
|
|
44
|
+
*
|
|
45
|
+
* @param options Document capability.
|
|
46
|
+
* @default options {}
|
|
47
|
+
* @returns Reactive selection, text, ranges, and rectangles.
|
|
48
|
+
*/
|
|
49
|
+
export function useTextSelection(options: UseTextSelectionOptions = {}): TextSelectionControls {
|
|
50
|
+
const selection = shallowRef<Selection | null>(null);
|
|
51
|
+
const revision = shallowRef(0);
|
|
52
|
+
// Inside a component the host is attached by a post-flush job (after the
|
|
53
|
+
// component mounted), so a hydrating client first renders the same server
|
|
54
|
+
// fallback. Outside components it is attached synchronously.
|
|
55
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
56
|
+
if (!hydrated.value) {
|
|
57
|
+
watchPostEffect(() => {
|
|
58
|
+
hydrated.value = true;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const stop = watch(
|
|
63
|
+
() =>
|
|
64
|
+
hydrated.value
|
|
65
|
+
? options.host === undefined
|
|
66
|
+
? browserSelectionHost()
|
|
67
|
+
: toValue(options.host)
|
|
68
|
+
: undefined,
|
|
69
|
+
(host, _previous, onCleanup) => {
|
|
70
|
+
if (!host) {
|
|
71
|
+
selection.value = null;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const update = (): void => {
|
|
75
|
+
selection.value = host.getSelection();
|
|
76
|
+
revision.value += 1;
|
|
77
|
+
};
|
|
78
|
+
update();
|
|
79
|
+
host.addEventListener("selectionchange", update, { passive: true });
|
|
80
|
+
onCleanup(() => host.removeEventListener("selectionchange", update));
|
|
81
|
+
},
|
|
82
|
+
{ immediate: true },
|
|
83
|
+
);
|
|
84
|
+
tryOnScopeDispose(() => stop.stop());
|
|
85
|
+
|
|
86
|
+
const ranges = computed<readonly Range[]>(() => {
|
|
87
|
+
void revision.value;
|
|
88
|
+
const current = selection.value;
|
|
89
|
+
if (!current) return [];
|
|
90
|
+
const list: Range[] = [];
|
|
91
|
+
for (let index = 0; index < current.rangeCount; index += 1) {
|
|
92
|
+
list.push(current.getRangeAt(index));
|
|
93
|
+
}
|
|
94
|
+
return list;
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
selection,
|
|
99
|
+
text: computed(() => {
|
|
100
|
+
void revision.value;
|
|
101
|
+
return selection.value?.toString() ?? "";
|
|
102
|
+
}),
|
|
103
|
+
ranges,
|
|
104
|
+
rects: computed(() => ranges.value.map((range) => range.getBoundingClientRect())),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function browserSelectionHost(): TextSelectionHost | undefined {
|
|
109
|
+
return typeof document !== "undefined" ? document : undefined;
|
|
110
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { 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 { useResizeObserver } from "./resize-observer.ts";
|
|
7
|
+
import type { ResizeObserverHost } from "./resize-observer.ts";
|
|
8
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
9
|
+
import type { MaybeRefOrGetter } from "vue";
|
|
10
|
+
|
|
11
|
+
/** Style property that receives the measured height. */
|
|
12
|
+
export type TextareaAutosizeStyleProperty = "height" | "min-height";
|
|
13
|
+
|
|
14
|
+
/** Options for {@link useTextareaAutosize}. */
|
|
15
|
+
export interface UseTextareaAutosizeOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Text bound to the textarea. Changes trigger a resize. A fresh ref is
|
|
18
|
+
* created when omitted.
|
|
19
|
+
*
|
|
20
|
+
* @default ref("")
|
|
21
|
+
*/
|
|
22
|
+
readonly input?: Ref<string>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Style property written with the measured height.
|
|
26
|
+
*
|
|
27
|
+
* @default "height"
|
|
28
|
+
*/
|
|
29
|
+
readonly styleProp?: TextareaAutosizeStyleProperty;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Called after each resize with the new height.
|
|
33
|
+
*
|
|
34
|
+
* @default undefined
|
|
35
|
+
*/
|
|
36
|
+
readonly onResize?: (height: number) => void;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Resize-observer capability used to re-measure when the width changes.
|
|
40
|
+
*
|
|
41
|
+
* @default globalThis when it provides `ResizeObserver`
|
|
42
|
+
*/
|
|
43
|
+
readonly host?: MaybeRefOrGetter<ResizeObserverHost | null | undefined>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Textarea-like element measured by {@link useTextareaAutosize}. */
|
|
47
|
+
interface AutosizeElement extends Element {
|
|
48
|
+
readonly scrollHeight: number;
|
|
49
|
+
readonly style: Pick<CSSStyleDeclaration, "setProperty" | "removeProperty">;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** State returned by {@link useTextareaAutosize}. */
|
|
53
|
+
export interface TextareaAutosizeControls {
|
|
54
|
+
/** Text bound to the textarea (use with `v-model`). */
|
|
55
|
+
readonly input: Ref<string>;
|
|
56
|
+
/** Re-measure immediately. */
|
|
57
|
+
readonly triggerResize: () => void;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Grow a textarea to fit its content.
|
|
62
|
+
*
|
|
63
|
+
* On each input change (and when the element width changes), the style
|
|
64
|
+
* property is reset to `auto`, `scrollHeight` is read, and the height is
|
|
65
|
+
* written back in pixels. Nothing is measured during server rendering, so the
|
|
66
|
+
* markup keeps its declared `rows`.
|
|
67
|
+
*
|
|
68
|
+
* @param target Reactive textarea target.
|
|
69
|
+
* @param options Bound input, style property, callback, and observer capability.
|
|
70
|
+
* @default options {}
|
|
71
|
+
* @returns Bound input and a manual resize trigger.
|
|
72
|
+
*/
|
|
73
|
+
export function useTextareaAutosize(
|
|
74
|
+
target: MaybeElementTarget,
|
|
75
|
+
options: UseTextareaAutosizeOptions = {},
|
|
76
|
+
): TextareaAutosizeControls {
|
|
77
|
+
const input = options.input ?? ref("");
|
|
78
|
+
const styleProp = options.styleProp ?? "height";
|
|
79
|
+
let lastWidth = -1;
|
|
80
|
+
|
|
81
|
+
const triggerResize = (): void => {
|
|
82
|
+
const element = resolveElement(target);
|
|
83
|
+
if (!element || !isAutosizeElement(element)) return;
|
|
84
|
+
element.style.setProperty(styleProp, "auto");
|
|
85
|
+
const height = element.scrollHeight;
|
|
86
|
+
element.style.setProperty(styleProp, `${height}px`);
|
|
87
|
+
options.onResize?.(height);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const stop = watch([input, () => resolveElement(target)], triggerResize, {
|
|
91
|
+
immediate: true,
|
|
92
|
+
flush: "post",
|
|
93
|
+
});
|
|
94
|
+
const observer = useResizeObserver(
|
|
95
|
+
target,
|
|
96
|
+
(entries) => {
|
|
97
|
+
const width = entries.at(-1)?.contentRect.width ?? -1;
|
|
98
|
+
if (width === lastWidth) return;
|
|
99
|
+
lastWidth = width;
|
|
100
|
+
triggerResize();
|
|
101
|
+
},
|
|
102
|
+
options.host === undefined ? {} : { host: options.host },
|
|
103
|
+
);
|
|
104
|
+
tryOnScopeDispose(() => {
|
|
105
|
+
stop.stop();
|
|
106
|
+
observer.stop();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return { input, triggerResize };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function isAutosizeElement(element: Element): element is AutosizeElement {
|
|
113
|
+
return "style" in element && typeof element.scrollHeight === "number";
|
|
114
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-shot timer host used by the debounced and throttled state
|
|
3
|
+
* utilities.
|
|
4
|
+
*
|
|
5
|
+
* Implement this interface to integrate a deterministic test clock, a native
|
|
6
|
+
* runtime timer, or an application-owned scheduler. Handles are opaque: the
|
|
7
|
+
* utilities only hand them back to {@link TimeoutScheduler.clearTimeout}.
|
|
8
|
+
* This module declares types only and contributes no runtime code.
|
|
9
|
+
*/
|
|
10
|
+
export interface TimeoutScheduler {
|
|
11
|
+
/** Starts a single-shot callback and returns its opaque cancellation handle. */
|
|
12
|
+
readonly setTimeout: (callback: () => void, delayMs: number) => unknown;
|
|
13
|
+
|
|
14
|
+
/** Cancels a handle previously returned by {@link TimeoutScheduler.setTimeout}. */
|
|
15
|
+
readonly clearTimeout: (handle: unknown) => void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { isRef, reactive, unref } from "vue";
|
|
2
|
+
import type { MaybeRef, Reactive } from "vue";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Reactive object view over a ref that holds an object.
|
|
6
|
+
*
|
|
7
|
+
* Property reads and writes go to the ref's current object, so replacing the
|
|
8
|
+
* ref's value swaps the whole object behind a stable reactive proxy (handy
|
|
9
|
+
* for `v-bind="state"` or destructuring-free templates). Nested refs are
|
|
10
|
+
* unwrapped on read and written through on assignment. A non-ref object is
|
|
11
|
+
* simply passed to `reactive`. SSR-safe and nothing to dispose.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const state = ref({ name: "a" });
|
|
16
|
+
* const view = toReactive(state);
|
|
17
|
+
* state.value = { name: "b" };
|
|
18
|
+
* view.name; // "b"
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param objectRef Ref (or plain object) holding the object.
|
|
22
|
+
* @returns A reactive proxy following the ref.
|
|
23
|
+
*/
|
|
24
|
+
export function toReactive<Value extends object>(objectRef: MaybeRef<Value>): Reactive<Value> {
|
|
25
|
+
if (!isRef(objectRef)) return reactive(objectRef);
|
|
26
|
+
|
|
27
|
+
const proxy = new Proxy<Value>(objectRef.value, {
|
|
28
|
+
get: (_target, property, receiver) => unref(Reflect.get(objectRef.value, property, receiver)),
|
|
29
|
+
set: (_target, property, value) => {
|
|
30
|
+
const current: unknown = Reflect.get(objectRef.value, property);
|
|
31
|
+
if (isRef(current) && !isRef(value)) current.value = value;
|
|
32
|
+
else Reflect.set(objectRef.value, property, value);
|
|
33
|
+
return true;
|
|
34
|
+
},
|
|
35
|
+
deleteProperty: (_target, property) => Reflect.deleteProperty(objectRef.value, property),
|
|
36
|
+
has: (_target, property) => Reflect.has(objectRef.value, property),
|
|
37
|
+
ownKeys: () => Reflect.ownKeys(objectRef.value),
|
|
38
|
+
getOwnPropertyDescriptor: (_target, property) => {
|
|
39
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(objectRef.value, property);
|
|
40
|
+
return descriptor === undefined ? undefined : { ...descriptor, configurable: true };
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return reactive(proxy);
|
|
44
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Cubic Bézier control points `[x1, y1, x2, y2]`. */
|
|
7
|
+
export type CubicBezierPoints = readonly [number, number, number, number];
|
|
8
|
+
|
|
9
|
+
/** Easing: a preset name, cubic Bézier control points, or a function on `[0, 1]`. */
|
|
10
|
+
export type TransitionEasing =
|
|
11
|
+
| TransitionPresetName
|
|
12
|
+
| CubicBezierPoints
|
|
13
|
+
| ((progress: number) => number);
|
|
14
|
+
|
|
15
|
+
/** Named cubic Bézier easing presets (the classic easings.net set). */
|
|
16
|
+
export const TransitionPresets = {
|
|
17
|
+
linear: [0, 0, 1, 1],
|
|
18
|
+
easeInSine: [0.12, 0, 0.39, 0],
|
|
19
|
+
easeOutSine: [0.61, 1, 0.88, 1],
|
|
20
|
+
easeInOutSine: [0.37, 0, 0.63, 1],
|
|
21
|
+
easeInQuad: [0.11, 0, 0.5, 0],
|
|
22
|
+
easeOutQuad: [0.5, 1, 0.89, 1],
|
|
23
|
+
easeInOutQuad: [0.45, 0, 0.55, 1],
|
|
24
|
+
easeInCubic: [0.32, 0, 0.67, 0],
|
|
25
|
+
easeOutCubic: [0.33, 1, 0.68, 1],
|
|
26
|
+
easeInOutCubic: [0.65, 0, 0.35, 1],
|
|
27
|
+
easeInQuart: [0.5, 0, 0.75, 0],
|
|
28
|
+
easeOutQuart: [0.25, 1, 0.5, 1],
|
|
29
|
+
easeInOutQuart: [0.76, 0, 0.24, 1],
|
|
30
|
+
easeInQuint: [0.64, 0, 0.78, 0],
|
|
31
|
+
easeOutQuint: [0.22, 1, 0.36, 1],
|
|
32
|
+
easeInOutQuint: [0.83, 0, 0.17, 1],
|
|
33
|
+
easeInExpo: [0.7, 0, 0.84, 0],
|
|
34
|
+
easeOutExpo: [0.16, 1, 0.3, 1],
|
|
35
|
+
easeInOutExpo: [0.87, 0, 0.13, 1],
|
|
36
|
+
easeInCirc: [0.55, 0, 1, 0.45],
|
|
37
|
+
easeOutCirc: [0, 0.55, 0.45, 1],
|
|
38
|
+
easeInOutCirc: [0.85, 0, 0.15, 1],
|
|
39
|
+
easeInBack: [0.36, 0, 0.66, -0.56],
|
|
40
|
+
easeOutBack: [0.34, 1.56, 0.64, 1],
|
|
41
|
+
easeInOutBack: [0.68, -0.6, 0.32, 1.6],
|
|
42
|
+
} as const satisfies Readonly<Record<string, CubicBezierPoints>>;
|
|
43
|
+
|
|
44
|
+
/** Names of {@link TransitionPresets}. */
|
|
45
|
+
export type TransitionPresetName = keyof typeof TransitionPresets;
|
|
46
|
+
|
|
47
|
+
/** Numeric value tweened by {@link useTransition}: a number or a fixed-length tuple. */
|
|
48
|
+
export type TransitionValue = number | readonly number[];
|
|
49
|
+
|
|
50
|
+
/** Mutable tuple output matching a tuple source. */
|
|
51
|
+
export type TransitionTupleOutput<Source extends readonly number[]> = {
|
|
52
|
+
-readonly [Index in keyof Source]: number;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** Frame scheduler used by {@link useTransition}. */
|
|
56
|
+
export interface TransitionFrameHost {
|
|
57
|
+
/** Schedule a callback before the next repaint. */
|
|
58
|
+
readonly requestAnimationFrame: (callback: FrameRequestCallback) => number;
|
|
59
|
+
/** Cancel a scheduled frame. */
|
|
60
|
+
readonly cancelAnimationFrame: (handle: number) => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Options for {@link useTransition}. */
|
|
64
|
+
export interface UseTransitionOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Duration in milliseconds.
|
|
67
|
+
*
|
|
68
|
+
* @default 1000
|
|
69
|
+
*/
|
|
70
|
+
readonly duration?: MaybeRefOrGetter<number>;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Delay before each transition starts, in milliseconds.
|
|
74
|
+
*
|
|
75
|
+
* @default 0
|
|
76
|
+
*/
|
|
77
|
+
readonly delay?: MaybeRefOrGetter<number>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Easing function, preset name, or cubic Bézier points.
|
|
81
|
+
*
|
|
82
|
+
* @default "linear"
|
|
83
|
+
*/
|
|
84
|
+
readonly easing?: MaybeRefOrGetter<TransitionEasing>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Jump to the source value without animating.
|
|
88
|
+
*
|
|
89
|
+
* @default false
|
|
90
|
+
*/
|
|
91
|
+
readonly disabled?: MaybeRefOrGetter<boolean>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Called when a transition starts.
|
|
95
|
+
*
|
|
96
|
+
* @default undefined
|
|
97
|
+
*/
|
|
98
|
+
readonly onStarted?: () => void;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Called when a transition reaches its target.
|
|
102
|
+
*
|
|
103
|
+
* @default undefined
|
|
104
|
+
*/
|
|
105
|
+
readonly onFinished?: () => void;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Frame scheduler. Without one (server rendering) the output mirrors the
|
|
109
|
+
* source immediately.
|
|
110
|
+
*
|
|
111
|
+
* @default globalThis.window when available
|
|
112
|
+
*/
|
|
113
|
+
readonly host?: MaybeRefOrGetter<TransitionFrameHost | null | undefined>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Tween a number toward its reactive source.
|
|
118
|
+
*
|
|
119
|
+
* Each source change starts a new transition from the current output, so
|
|
120
|
+
* interrupted transitions stay continuous. Easing presets and Bézier points
|
|
121
|
+
* are solved with Newton–Raphson plus bisection. Without a frame scheduler
|
|
122
|
+
* (server rendering, tests) the output equals the source, which keeps SSR
|
|
123
|
+
* deterministic. Pending frames are cancelled with the owning scope.
|
|
124
|
+
*
|
|
125
|
+
* @param source Reactive number.
|
|
126
|
+
* @param options Duration, delay, easing, callbacks, and frame capability.
|
|
127
|
+
* @returns Readonly tweened number.
|
|
128
|
+
*/
|
|
129
|
+
export function useTransition(
|
|
130
|
+
source: MaybeRefOrGetter<number>,
|
|
131
|
+
options?: UseTransitionOptions,
|
|
132
|
+
): Readonly<Ref<number>>;
|
|
133
|
+
/**
|
|
134
|
+
* Tween each element of a fixed-length numeric tuple.
|
|
135
|
+
*
|
|
136
|
+
* @param source Reactive tuple; its length must stay constant.
|
|
137
|
+
* @param options Duration, delay, easing, callbacks, and frame capability.
|
|
138
|
+
* @returns Readonly tweened tuple with the same length.
|
|
139
|
+
*/
|
|
140
|
+
export function useTransition<const Source extends readonly number[]>(
|
|
141
|
+
source: MaybeRefOrGetter<Source>,
|
|
142
|
+
options?: UseTransitionOptions,
|
|
143
|
+
): Readonly<Ref<TransitionTupleOutput<Source>>>;
|
|
144
|
+
export function useTransition(
|
|
145
|
+
source: MaybeRefOrGetter<TransitionValue>,
|
|
146
|
+
options: UseTransitionOptions = {},
|
|
147
|
+
): Readonly<Ref<number | number[]>> {
|
|
148
|
+
const initial = toValue(source);
|
|
149
|
+
const output = shallowRef<number | number[]>(copy(initial));
|
|
150
|
+
let cancel = (): void => undefined;
|
|
151
|
+
|
|
152
|
+
const stop = watch(
|
|
153
|
+
() => copy(toValue(source)),
|
|
154
|
+
(target) => {
|
|
155
|
+
cancel();
|
|
156
|
+
const host = options.host === undefined ? browserFrameHost() : toValue(options.host);
|
|
157
|
+
const duration = Math.max(0, toValue(options.duration) ?? 1000);
|
|
158
|
+
if (!host || toValue(options.disabled) || duration === 0) {
|
|
159
|
+
output.value = target;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const from = output.value;
|
|
163
|
+
const ease = toEasingFunction(toValue(options.easing) ?? "linear");
|
|
164
|
+
const delay = Math.max(0, toValue(options.delay) ?? 0);
|
|
165
|
+
let startedAt: number | undefined;
|
|
166
|
+
let started = false;
|
|
167
|
+
let handle = 0;
|
|
168
|
+
const frame = (time: number): void => {
|
|
169
|
+
startedAt ??= time + delay;
|
|
170
|
+
const elapsed = time - startedAt;
|
|
171
|
+
if (elapsed < 0) {
|
|
172
|
+
handle = host.requestAnimationFrame(frame);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (!started) {
|
|
176
|
+
started = true;
|
|
177
|
+
options.onStarted?.();
|
|
178
|
+
}
|
|
179
|
+
const progress = Math.min(1, elapsed / duration);
|
|
180
|
+
output.value = interpolate(from, target, ease(progress));
|
|
181
|
+
if (progress < 1) {
|
|
182
|
+
handle = host.requestAnimationFrame(frame);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
cancel = () => undefined;
|
|
186
|
+
options.onFinished?.();
|
|
187
|
+
};
|
|
188
|
+
handle = host.requestAnimationFrame(frame);
|
|
189
|
+
cancel = () => {
|
|
190
|
+
host.cancelAnimationFrame(handle);
|
|
191
|
+
cancel = () => undefined;
|
|
192
|
+
};
|
|
193
|
+
},
|
|
194
|
+
);
|
|
195
|
+
tryOnScopeDispose(() => {
|
|
196
|
+
stop.stop();
|
|
197
|
+
cancel();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
return output;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Build an easing function from cubic Bézier control points.
|
|
205
|
+
*
|
|
206
|
+
* @param points `[x1, y1, x2, y2]` with `x1`/`x2` in `[0, 1]`.
|
|
207
|
+
* @returns Easing function mapping progress to eased progress.
|
|
208
|
+
*/
|
|
209
|
+
export function cubicBezier(points: CubicBezierPoints): (progress: number) => number {
|
|
210
|
+
const [x1, y1, x2, y2] = points;
|
|
211
|
+
const a = (p1: number, p2: number): number => 1 - 3 * p2 + 3 * p1;
|
|
212
|
+
const b = (p1: number, p2: number): number => 3 * p2 - 6 * p1;
|
|
213
|
+
const c = (p1: number): number => 3 * p1;
|
|
214
|
+
const at = (t: number, p1: number, p2: number): number =>
|
|
215
|
+
((a(p1, p2) * t + b(p1, p2)) * t + c(p1)) * t;
|
|
216
|
+
const slope = (t: number, p1: number, p2: number): number =>
|
|
217
|
+
3 * a(p1, p2) * t * t + 2 * b(p1, p2) * t + c(p1);
|
|
218
|
+
const solve = (x: number): number => {
|
|
219
|
+
let t = x;
|
|
220
|
+
for (let iteration = 0; iteration < 8; iteration += 1) {
|
|
221
|
+
const error = at(t, x1, x2) - x;
|
|
222
|
+
if (Math.abs(error) < 1e-7) return t;
|
|
223
|
+
const derivative = slope(t, x1, x2);
|
|
224
|
+
if (Math.abs(derivative) < 1e-6) break;
|
|
225
|
+
t -= error / derivative;
|
|
226
|
+
}
|
|
227
|
+
let low = 0;
|
|
228
|
+
let high = 1;
|
|
229
|
+
t = x;
|
|
230
|
+
while (high - low > 1e-7) {
|
|
231
|
+
if (at(t, x1, x2) < x) low = t;
|
|
232
|
+
else high = t;
|
|
233
|
+
t = (low + high) / 2;
|
|
234
|
+
}
|
|
235
|
+
return t;
|
|
236
|
+
};
|
|
237
|
+
return (progress) => {
|
|
238
|
+
if (progress <= 0) return 0;
|
|
239
|
+
if (progress >= 1) return 1;
|
|
240
|
+
if (x1 === y1 && x2 === y2) return progress;
|
|
241
|
+
return at(solve(progress), y1, y2);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function toEasingFunction(easing: TransitionEasing): (progress: number) => number {
|
|
246
|
+
if (typeof easing === "function") return easing;
|
|
247
|
+
return cubicBezier(typeof easing === "string" ? TransitionPresets[easing] : easing);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function copy(value: TransitionValue): number | number[] {
|
|
251
|
+
return typeof value === "number" ? value : [...value];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function interpolate(
|
|
255
|
+
from: number | number[],
|
|
256
|
+
to: number | number[],
|
|
257
|
+
progress: number,
|
|
258
|
+
): number | number[] {
|
|
259
|
+
if (typeof to === "number") {
|
|
260
|
+
const start = typeof from === "number" ? from : to;
|
|
261
|
+
return start + (to - start) * progress;
|
|
262
|
+
}
|
|
263
|
+
return to.map((target, index) => {
|
|
264
|
+
const start = typeof from === "number" ? target : (from[index] ?? target);
|
|
265
|
+
return start + (target - start) * progress;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function browserFrameHost(): TransitionFrameHost | undefined {
|
|
270
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
271
|
+
}
|