@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,321 @@
|
|
|
1
|
+
import { computed, readonly, ref, shallowReactive, shallowReadonly, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import type { Point } from "./mouse.ts";
|
|
7
|
+
import type { PointerKind } from "./pointer.ts";
|
|
8
|
+
import { toPointerKind } from "./pointer.ts";
|
|
9
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
10
|
+
|
|
11
|
+
/** Dominant direction of a swipe gesture. `"none"` below the threshold. */
|
|
12
|
+
export type SwipeDirection = "up" | "down" | "left" | "right" | "none";
|
|
13
|
+
|
|
14
|
+
/** Callbacks shared by {@link useSwipe} and {@link usePointerSwipe}. */
|
|
15
|
+
export interface SwipeCallbacks<GestureEvent extends Event> {
|
|
16
|
+
/**
|
|
17
|
+
* Called when a gesture starts.
|
|
18
|
+
*
|
|
19
|
+
* @default undefined
|
|
20
|
+
*/
|
|
21
|
+
readonly onSwipeStart?: (event: GestureEvent) => void;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Called on every move after the threshold has been exceeded.
|
|
25
|
+
*
|
|
26
|
+
* @default undefined
|
|
27
|
+
*/
|
|
28
|
+
readonly onSwipe?: (event: GestureEvent) => void;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Called when a gesture that exceeded the threshold ends.
|
|
32
|
+
*
|
|
33
|
+
* @default undefined
|
|
34
|
+
*/
|
|
35
|
+
readonly onSwipeEnd?: (event: GestureEvent, direction: SwipeDirection) => void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Options for {@link useSwipe}. */
|
|
39
|
+
export interface UseSwipeOptions extends SwipeCallbacks<TouchEvent> {
|
|
40
|
+
/**
|
|
41
|
+
* Minimum travel in CSS pixels before a gesture counts as a swipe.
|
|
42
|
+
*
|
|
43
|
+
* @default 50
|
|
44
|
+
*/
|
|
45
|
+
readonly threshold?: number;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Register passive touch listeners. Set to `false` to call
|
|
49
|
+
* `preventDefault()` on moves while swiping (for example to block
|
|
50
|
+
* pull-to-refresh).
|
|
51
|
+
*
|
|
52
|
+
* @default true
|
|
53
|
+
*/
|
|
54
|
+
readonly passive?: boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Reactive gesture state shared by the swipe composables. */
|
|
58
|
+
export interface SwipeControls {
|
|
59
|
+
/** Whether a gesture past the threshold is in progress. */
|
|
60
|
+
readonly isSwiping: Readonly<Ref<boolean>>;
|
|
61
|
+
/** Dominant direction of the current (or last) gesture. */
|
|
62
|
+
readonly direction: ComputedRef<SwipeDirection>;
|
|
63
|
+
/** Gesture start coordinates. */
|
|
64
|
+
readonly coordsStart: Readonly<Point>;
|
|
65
|
+
/** Latest gesture coordinates. */
|
|
66
|
+
readonly coordsEnd: Readonly<Point>;
|
|
67
|
+
/** `start.x - end.x`: positive when moving left. */
|
|
68
|
+
readonly lengthX: ComputedRef<number>;
|
|
69
|
+
/** `start.y - end.y`: positive when moving up. */
|
|
70
|
+
readonly lengthY: ComputedRef<number>;
|
|
71
|
+
/** Remove listeners. Idempotent. */
|
|
72
|
+
readonly stop: () => void;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Classify a displacement into a {@link SwipeDirection}.
|
|
77
|
+
*
|
|
78
|
+
* Pure helper shared by the swipe composables and usable for custom gesture
|
|
79
|
+
* recognizers.
|
|
80
|
+
*
|
|
81
|
+
* @param lengthX `start.x - end.x`.
|
|
82
|
+
* @param lengthY `start.y - end.y`.
|
|
83
|
+
* @param threshold Minimum travel before a direction is reported.
|
|
84
|
+
* @returns The dominant axis direction, or `"none"`.
|
|
85
|
+
*/
|
|
86
|
+
export function swipeDirection(
|
|
87
|
+
lengthX: number,
|
|
88
|
+
lengthY: number,
|
|
89
|
+
threshold: number,
|
|
90
|
+
): SwipeDirection {
|
|
91
|
+
if (Math.max(Math.abs(lengthX), Math.abs(lengthY)) < threshold) return "none";
|
|
92
|
+
if (Math.abs(lengthX) > Math.abs(lengthY)) return lengthX > 0 ? "left" : "right";
|
|
93
|
+
return lengthY > 0 ? "up" : "down";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface GestureCore {
|
|
97
|
+
readonly controls: Omit<SwipeControls, "stop">;
|
|
98
|
+
readonly begin: (point: Point) => void;
|
|
99
|
+
readonly move: (point: Point) => boolean;
|
|
100
|
+
readonly reset: () => void;
|
|
101
|
+
readonly swiping: Ref<boolean>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function createGesture(threshold: number): GestureCore {
|
|
105
|
+
const coordsStart = shallowReactive({ x: 0, y: 0 });
|
|
106
|
+
const coordsEnd = shallowReactive({ x: 0, y: 0 });
|
|
107
|
+
const swiping = ref(false);
|
|
108
|
+
const lengthX = computed(() => coordsStart.x - coordsEnd.x);
|
|
109
|
+
const lengthY = computed(() => coordsStart.y - coordsEnd.y);
|
|
110
|
+
const direction = computed(() => swipeDirection(lengthX.value, lengthY.value, threshold));
|
|
111
|
+
return {
|
|
112
|
+
controls: {
|
|
113
|
+
isSwiping: readonly(swiping),
|
|
114
|
+
direction,
|
|
115
|
+
coordsStart: shallowReadonly(coordsStart),
|
|
116
|
+
coordsEnd: shallowReadonly(coordsEnd),
|
|
117
|
+
lengthX,
|
|
118
|
+
lengthY,
|
|
119
|
+
},
|
|
120
|
+
begin: (point) => {
|
|
121
|
+
coordsStart.x = point.x;
|
|
122
|
+
coordsStart.y = point.y;
|
|
123
|
+
coordsEnd.x = point.x;
|
|
124
|
+
coordsEnd.y = point.y;
|
|
125
|
+
},
|
|
126
|
+
move: (point) => {
|
|
127
|
+
coordsEnd.x = point.x;
|
|
128
|
+
coordsEnd.y = point.y;
|
|
129
|
+
if (!swiping.value && direction.value !== "none") swiping.value = true;
|
|
130
|
+
return swiping.value;
|
|
131
|
+
},
|
|
132
|
+
reset: () => {
|
|
133
|
+
swiping.value = false;
|
|
134
|
+
},
|
|
135
|
+
swiping,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Detect touch swipes on an element.
|
|
141
|
+
*
|
|
142
|
+
* Tracks the first touch point from `touchstart` through `touchend`/
|
|
143
|
+
* `touchcancel`. Direction is derived from the dominant axis once the travel
|
|
144
|
+
* exceeds `threshold`. Server renders expose zeroed coordinates and
|
|
145
|
+
* `direction: "none"`; listeners are removed with the owning scope.
|
|
146
|
+
*
|
|
147
|
+
* @param target Reactive element target.
|
|
148
|
+
* @param options Threshold, passivity, and callbacks.
|
|
149
|
+
* @default options {}
|
|
150
|
+
* @returns Reactive gesture state and stop control.
|
|
151
|
+
*/
|
|
152
|
+
export function useSwipe(target: MaybeElementTarget, options: UseSwipeOptions = {}): SwipeControls {
|
|
153
|
+
const gesture = createGesture(options.threshold ?? 50);
|
|
154
|
+
const passive = options.passive ?? true;
|
|
155
|
+
|
|
156
|
+
const firstTouch = (event: TouchEvent): Point | null => {
|
|
157
|
+
const touch = event.touches[0] ?? event.changedTouches[0];
|
|
158
|
+
return touch ? { x: touch.clientX, y: touch.clientY } : null;
|
|
159
|
+
};
|
|
160
|
+
const onStart = (event: Event): void => {
|
|
161
|
+
if (!isTouchEvent(event)) return;
|
|
162
|
+
const point = firstTouch(event);
|
|
163
|
+
if (!point || event.touches.length > 1) return;
|
|
164
|
+
gesture.begin(point);
|
|
165
|
+
options.onSwipeStart?.(event);
|
|
166
|
+
};
|
|
167
|
+
const onMove = (event: Event): void => {
|
|
168
|
+
if (!isTouchEvent(event)) return;
|
|
169
|
+
const point = firstTouch(event);
|
|
170
|
+
if (!point) return;
|
|
171
|
+
if (!gesture.move(point)) return;
|
|
172
|
+
if (!passive && event.cancelable) event.preventDefault();
|
|
173
|
+
options.onSwipe?.(event);
|
|
174
|
+
};
|
|
175
|
+
const onEnd = (event: Event): void => {
|
|
176
|
+
if (!isTouchEvent(event)) return;
|
|
177
|
+
if (gesture.swiping.value) options.onSwipeEnd?.(event, gesture.controls.direction.value);
|
|
178
|
+
gesture.reset();
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const stopWatch = watch(
|
|
182
|
+
() => resolveElement(target),
|
|
183
|
+
(element, _previous, onCleanup) => {
|
|
184
|
+
if (!element) return;
|
|
185
|
+
const listenerOptions: AddEventListenerOptions = { passive };
|
|
186
|
+
element.addEventListener("touchstart", onStart, { passive: true });
|
|
187
|
+
element.addEventListener("touchmove", onMove, listenerOptions);
|
|
188
|
+
element.addEventListener("touchend", onEnd, { passive: true });
|
|
189
|
+
element.addEventListener("touchcancel", onEnd, { passive: true });
|
|
190
|
+
onCleanup(() => {
|
|
191
|
+
element.removeEventListener("touchstart", onStart);
|
|
192
|
+
element.removeEventListener("touchmove", onMove);
|
|
193
|
+
element.removeEventListener("touchend", onEnd);
|
|
194
|
+
element.removeEventListener("touchcancel", onEnd);
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
{ immediate: true, flush: "post" },
|
|
198
|
+
);
|
|
199
|
+
const stop = (): void => stopWatch.stop();
|
|
200
|
+
tryOnScopeDispose(stop);
|
|
201
|
+
return { ...gesture.controls, stop };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Options for {@link usePointerSwipe}. */
|
|
205
|
+
export interface UsePointerSwipeOptions extends SwipeCallbacks<PointerEvent> {
|
|
206
|
+
/**
|
|
207
|
+
* Minimum travel in CSS pixels before a gesture counts as a swipe.
|
|
208
|
+
*
|
|
209
|
+
* @default 50
|
|
210
|
+
*/
|
|
211
|
+
readonly threshold?: number;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Device kinds that may start a gesture.
|
|
215
|
+
*
|
|
216
|
+
* @default ["mouse", "touch", "pen"]
|
|
217
|
+
*/
|
|
218
|
+
readonly pointerTypes?: readonly PointerKind[];
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Suppress text selection on the element while a gesture is active.
|
|
222
|
+
*
|
|
223
|
+
* @default false
|
|
224
|
+
*/
|
|
225
|
+
readonly disableTextSelect?: boolean;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Detect swipes from any pointer device (mouse, touch, pen).
|
|
230
|
+
*
|
|
231
|
+
* Captures the pointer on `pointerdown` so moves outside the element still
|
|
232
|
+
* count, and ignores secondary pointers during a gesture. Shares the state
|
|
233
|
+
* shape and SSR defaults of {@link useSwipe}.
|
|
234
|
+
*
|
|
235
|
+
* @param target Reactive element target.
|
|
236
|
+
* @param options Threshold, device filter, selection handling, and callbacks.
|
|
237
|
+
* @default options {}
|
|
238
|
+
* @returns Reactive gesture state and stop control.
|
|
239
|
+
*/
|
|
240
|
+
export function usePointerSwipe(
|
|
241
|
+
target: MaybeElementTarget,
|
|
242
|
+
options: UsePointerSwipeOptions = {},
|
|
243
|
+
): SwipeControls {
|
|
244
|
+
const gesture = createGesture(options.threshold ?? 50);
|
|
245
|
+
const pointerTypes = options.pointerTypes ?? ["mouse", "touch", "pen"];
|
|
246
|
+
let activePointer: number | null = null;
|
|
247
|
+
|
|
248
|
+
const accepts = (event: Event): event is PointerEvent => {
|
|
249
|
+
if (!isPointerEvent(event)) return false;
|
|
250
|
+
const kind = toPointerKind(event.pointerType);
|
|
251
|
+
return kind !== null && pointerTypes.includes(kind);
|
|
252
|
+
};
|
|
253
|
+
const setSelection = (element: Element, disabled: boolean): void => {
|
|
254
|
+
if (!options.disableTextSelect || !hasStyle(element)) return;
|
|
255
|
+
element.style.setProperty("user-select", disabled ? "none" : "");
|
|
256
|
+
element.style.setProperty("-webkit-user-select", disabled ? "none" : "");
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const stopWatch = watch(
|
|
260
|
+
() => resolveElement(target),
|
|
261
|
+
(element, _previous, onCleanup) => {
|
|
262
|
+
if (!element) return;
|
|
263
|
+
const onDown = (event: Event): void => {
|
|
264
|
+
if (!accepts(event) || activePointer !== null) return;
|
|
265
|
+
if (event.pointerType === "mouse" && event.button !== 0) return;
|
|
266
|
+
activePointer = event.pointerId;
|
|
267
|
+
if (hasPointerCapture(element)) element.setPointerCapture(event.pointerId);
|
|
268
|
+
gesture.begin({ x: event.clientX, y: event.clientY });
|
|
269
|
+
setSelection(element, true);
|
|
270
|
+
options.onSwipeStart?.(event);
|
|
271
|
+
};
|
|
272
|
+
const onMove = (event: Event): void => {
|
|
273
|
+
if (!accepts(event) || event.pointerId !== activePointer) return;
|
|
274
|
+
if (gesture.move({ x: event.clientX, y: event.clientY })) options.onSwipe?.(event);
|
|
275
|
+
};
|
|
276
|
+
const onUp = (event: Event): void => {
|
|
277
|
+
if (!accepts(event) || event.pointerId !== activePointer) return;
|
|
278
|
+
activePointer = null;
|
|
279
|
+
if (hasPointerCapture(element)) element.releasePointerCapture(event.pointerId);
|
|
280
|
+
if (gesture.swiping.value) options.onSwipeEnd?.(event, gesture.controls.direction.value);
|
|
281
|
+
gesture.reset();
|
|
282
|
+
setSelection(element, false);
|
|
283
|
+
};
|
|
284
|
+
element.addEventListener("pointerdown", onDown, { passive: true });
|
|
285
|
+
element.addEventListener("pointermove", onMove, { passive: true });
|
|
286
|
+
element.addEventListener("pointerup", onUp, { passive: true });
|
|
287
|
+
element.addEventListener("pointercancel", onUp, { passive: true });
|
|
288
|
+
onCleanup(() => {
|
|
289
|
+
element.removeEventListener("pointerdown", onDown);
|
|
290
|
+
element.removeEventListener("pointermove", onMove);
|
|
291
|
+
element.removeEventListener("pointerup", onUp);
|
|
292
|
+
element.removeEventListener("pointercancel", onUp);
|
|
293
|
+
activePointer = null;
|
|
294
|
+
gesture.reset();
|
|
295
|
+
setSelection(element, false);
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
{ immediate: true, flush: "post" },
|
|
299
|
+
);
|
|
300
|
+
const stop = (): void => stopWatch.stop();
|
|
301
|
+
tryOnScopeDispose(stop);
|
|
302
|
+
return { ...gesture.controls, stop };
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function isTouchEvent(event: Event): event is TouchEvent {
|
|
306
|
+
return "touches" in event && "changedTouches" in event;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function isPointerEvent(event: Event): event is PointerEvent {
|
|
310
|
+
return "pointerId" in event && "pointerType" in event;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function hasPointerCapture(
|
|
314
|
+
element: Element,
|
|
315
|
+
): element is Element & Pick<HTMLElement, "setPointerCapture" | "releasePointerCapture"> {
|
|
316
|
+
return typeof element.setPointerCapture === "function";
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function hasStyle(element: Element): element is Element & ElementCSSInlineStyle {
|
|
320
|
+
return "style" in element && typeof element.style === "object" && element.style !== null;
|
|
321
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { watch } from "vue";
|
|
2
|
+
import type { Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Which way {@link syncRef} copies values. */
|
|
5
|
+
export type SyncRefDirection = "ltr" | "rtl" | "both";
|
|
6
|
+
|
|
7
|
+
/** Converters required by {@link syncRef} for the chosen direction. */
|
|
8
|
+
export type SyncRefTransform<
|
|
9
|
+
Left,
|
|
10
|
+
Right,
|
|
11
|
+
Direction extends SyncRefDirection,
|
|
12
|
+
> = Direction extends "ltr"
|
|
13
|
+
? { readonly ltr: (left: Left) => Right }
|
|
14
|
+
: Direction extends "rtl"
|
|
15
|
+
? { readonly rtl: (right: Right) => Left }
|
|
16
|
+
: { readonly ltr: (left: Left) => Right; readonly rtl: (right: Right) => Left };
|
|
17
|
+
|
|
18
|
+
/** Whether two types are mutually assignable (identical for syncing purposes). */
|
|
19
|
+
type SameType<Left, Right> = [Left] extends [Right]
|
|
20
|
+
? [Right] extends [Left]
|
|
21
|
+
? true
|
|
22
|
+
: false
|
|
23
|
+
: false;
|
|
24
|
+
|
|
25
|
+
/** Options for {@link syncRef}; `transform` is required when the ref types differ. */
|
|
26
|
+
export type SyncRefOptions<
|
|
27
|
+
Left,
|
|
28
|
+
Right,
|
|
29
|
+
Direction extends SyncRefDirection = "both",
|
|
30
|
+
> = SyncRefBaseOptions<Direction> &
|
|
31
|
+
(SameType<Left, Right> extends true
|
|
32
|
+
? {
|
|
33
|
+
/**
|
|
34
|
+
* Converters between the two refs.
|
|
35
|
+
*
|
|
36
|
+
* @default identity
|
|
37
|
+
*/
|
|
38
|
+
readonly transform?: Partial<SyncRefTransform<Left, Right, Direction>>;
|
|
39
|
+
}
|
|
40
|
+
: {
|
|
41
|
+
/** Converters between the two refs (required: the types differ). */
|
|
42
|
+
readonly transform: SyncRefTransform<Left, Right, Direction>;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
/** Direction and timing options shared by every {@link syncRef} call. */
|
|
46
|
+
export interface SyncRefBaseOptions<Direction extends SyncRefDirection = "both"> {
|
|
47
|
+
/**
|
|
48
|
+
* `"ltr"` copies left to right, `"rtl"` right to left, `"both"` both ways.
|
|
49
|
+
*
|
|
50
|
+
* @default "both"
|
|
51
|
+
*/
|
|
52
|
+
readonly direction?: Direction;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Watch flush timing.
|
|
56
|
+
*
|
|
57
|
+
* @default "sync"
|
|
58
|
+
*/
|
|
59
|
+
readonly flush?: "pre" | "post" | "sync";
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Watch nested changes.
|
|
63
|
+
*
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
readonly deep?: boolean;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Copy once right away (left wins for `"both"`/`"ltr"`, right for `"rtl"`).
|
|
70
|
+
*
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
readonly immediate?: boolean;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Keep two refs in sync, optionally converting between their types.
|
|
78
|
+
*
|
|
79
|
+
* The option type is computed from both ref types: converters may be
|
|
80
|
+
* omitted only when the types are identical, and exactly the converters the
|
|
81
|
+
* direction needs are required otherwise. A re-entrancy guard prevents
|
|
82
|
+
* ping-pong when converters are not exact inverses. Watchers follow the
|
|
83
|
+
* owning reactive scope; SSR-safe.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const celsius = ref(20);
|
|
88
|
+
* const label = ref("");
|
|
89
|
+
* syncRef(celsius, label, {
|
|
90
|
+
* transform: { ltr: (c) => `${c}°C`, rtl: (text) => Number.parseFloat(text) },
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @param left First ref.
|
|
95
|
+
* @param right Second ref.
|
|
96
|
+
* @param options Direction, timing, and converters.
|
|
97
|
+
* @returns Stops every sync watcher.
|
|
98
|
+
*/
|
|
99
|
+
export function syncRef<Left, Right = Left, const Direction extends SyncRefDirection = "both">(
|
|
100
|
+
left: Ref<Left>,
|
|
101
|
+
right: Ref<Right>,
|
|
102
|
+
...options: SameType<Left, Right> extends true
|
|
103
|
+
? [options?: SyncRefOptions<Left, Right, Direction>]
|
|
104
|
+
: [options: SyncRefOptions<Left, Right, Direction>]
|
|
105
|
+
): () => void;
|
|
106
|
+
export function syncRef(
|
|
107
|
+
left: Ref<unknown>,
|
|
108
|
+
right: Ref<unknown>,
|
|
109
|
+
options: SyncRefBaseOptions<SyncRefDirection> & {
|
|
110
|
+
readonly transform?: {
|
|
111
|
+
readonly ltr?: (left: unknown) => unknown;
|
|
112
|
+
readonly rtl?: (right: unknown) => unknown;
|
|
113
|
+
};
|
|
114
|
+
} = {},
|
|
115
|
+
): () => void {
|
|
116
|
+
const direction = options.direction ?? "both";
|
|
117
|
+
const toRight = options.transform?.ltr ?? ((value: unknown) => value);
|
|
118
|
+
const toLeft = options.transform?.rtl ?? ((value: unknown) => value);
|
|
119
|
+
const watchOptions = {
|
|
120
|
+
flush: options.flush ?? "sync",
|
|
121
|
+
deep: options.deep ?? false,
|
|
122
|
+
} as const;
|
|
123
|
+
const stops: (() => void)[] = [];
|
|
124
|
+
let syncing = false;
|
|
125
|
+
|
|
126
|
+
const guarded = (copy: () => void): void => {
|
|
127
|
+
if (syncing) return;
|
|
128
|
+
syncing = true;
|
|
129
|
+
try {
|
|
130
|
+
copy();
|
|
131
|
+
} finally {
|
|
132
|
+
syncing = false;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
if (direction !== "rtl") {
|
|
137
|
+
stops.push(
|
|
138
|
+
watch(
|
|
139
|
+
left,
|
|
140
|
+
(value) => {
|
|
141
|
+
guarded(() => {
|
|
142
|
+
right.value = toRight(value);
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
{ ...watchOptions, immediate: options.immediate ?? true },
|
|
146
|
+
),
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
if (direction !== "ltr") {
|
|
150
|
+
stops.push(
|
|
151
|
+
watch(
|
|
152
|
+
right,
|
|
153
|
+
(value) => {
|
|
154
|
+
guarded(() => {
|
|
155
|
+
left.value = toLeft(value);
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
{ ...watchOptions, immediate: direction === "rtl" && (options.immediate ?? true) },
|
|
159
|
+
),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return () => {
|
|
164
|
+
for (const stop of stops) stop();
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { computed, readonly, shallowRef, toValue, watchEffect } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
import { Intl as TemporalIntl, Temporal } from "temporal-polyfill-lite";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Timer host used by {@link useTemporalNow}.
|
|
7
|
+
*
|
|
8
|
+
* Implement this interface to integrate a deterministic clock, a native
|
|
9
|
+
* runtime timer, or an application-owned scheduler.
|
|
10
|
+
*/
|
|
11
|
+
export interface TemporalScheduler {
|
|
12
|
+
/** Starts a repeating callback and returns its opaque cancellation handle. */
|
|
13
|
+
readonly setInterval: (callback: () => void, intervalMs: number) => unknown;
|
|
14
|
+
|
|
15
|
+
/** Cancels a handle previously returned by {@link TemporalScheduler.setInterval}. */
|
|
16
|
+
readonly clearInterval: (handle: unknown) => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Options for {@link useTemporalNow}. */
|
|
20
|
+
export interface UseTemporalNowOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Clock update interval in milliseconds.
|
|
23
|
+
*
|
|
24
|
+
* Reactive changes replace the active timer. Values must be finite and
|
|
25
|
+
* greater than zero.
|
|
26
|
+
*
|
|
27
|
+
* @default 1000
|
|
28
|
+
*/
|
|
29
|
+
readonly intervalMs?: MaybeRefOrGetter<number>;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Pauses periodic updates while preserving the current instant.
|
|
33
|
+
* Manual calls to {@link TemporalClock.refresh} continue to work.
|
|
34
|
+
*
|
|
35
|
+
* @default false
|
|
36
|
+
*/
|
|
37
|
+
readonly paused?: MaybeRefOrGetter<boolean>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Starts the timer when no browser `window` is available.
|
|
41
|
+
*
|
|
42
|
+
* Keep this disabled during server rendering. Enable it for native,
|
|
43
|
+
* desktop, worker, and test runtimes whose scheduler is lifecycle-bound.
|
|
44
|
+
*
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
readonly runOnServer?: MaybeRefOrGetter<boolean>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Produces the current instant.
|
|
51
|
+
*
|
|
52
|
+
* @default Temporal.Now.instant
|
|
53
|
+
*/
|
|
54
|
+
readonly now?: () => Temporal.Instant;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Owns the repeating timer.
|
|
58
|
+
*
|
|
59
|
+
* @default globalThis timer functions
|
|
60
|
+
*/
|
|
61
|
+
readonly scheduler?: TemporalScheduler;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Reactive controls returned by {@link useTemporalNow}. */
|
|
65
|
+
export interface TemporalClock {
|
|
66
|
+
/** The latest instant. This ref is readonly to consumers. */
|
|
67
|
+
readonly instant: Readonly<Ref<Temporal.Instant>>;
|
|
68
|
+
|
|
69
|
+
/** Reads the clock source immediately, stores the value, and returns it. */
|
|
70
|
+
readonly refresh: () => Temporal.Instant;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Options for {@link useTemporalZonedDateTime}. */
|
|
74
|
+
export interface UseTemporalZonedDateTimeOptions extends UseTemporalNowOptions {
|
|
75
|
+
/**
|
|
76
|
+
* Time-zone identifier or zoned date-time accepted by Temporal.
|
|
77
|
+
*
|
|
78
|
+
* @default Temporal.Now.timeZoneId()
|
|
79
|
+
*/
|
|
80
|
+
readonly timeZone?: MaybeRefOrGetter<Temporal.TimeZoneLike>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const defaultScheduler: TemporalScheduler = {
|
|
84
|
+
setInterval: (callback, intervalMs) => globalThis.setInterval(callback, intervalMs),
|
|
85
|
+
clearInterval: (handle) => {
|
|
86
|
+
globalThis.clearInterval(handle as ReturnType<typeof setInterval>);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
function resolveIntervalMs(value: number): number {
|
|
91
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
92
|
+
throw new RangeError(
|
|
93
|
+
`[VIZE_COMPOSE_TEMPORAL_INVALID_INTERVAL] intervalMs must be finite and greater than zero; received ${String(value)}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return Math.max(1, Math.trunc(value));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function shouldSchedule(options: UseTemporalNowOptions): boolean {
|
|
101
|
+
if (toValue(options.paused ?? false)) return false;
|
|
102
|
+
return typeof window !== "undefined" || toValue(options.runOnServer ?? false);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Creates a pauseable Temporal clock whose timer follows the current Vue
|
|
107
|
+
* effect scope.
|
|
108
|
+
*
|
|
109
|
+
* The timer is replaced when reactive options change and is always cancelled
|
|
110
|
+
* when the owning scope stops. Call inside an active effect scope; without
|
|
111
|
+
* one, there is no automatic timer cleanup. During
|
|
112
|
+
* server rendering, no timer starts unless
|
|
113
|
+
* {@link UseTemporalNowOptions.runOnServer} is explicitly enabled.
|
|
114
|
+
*
|
|
115
|
+
* @param options Clock scheduling, pause, and runtime overrides.
|
|
116
|
+
* @default options {}
|
|
117
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_TEMPORAL_INVALID_INTERVAL` when
|
|
118
|
+
* the resolved interval is not finite or not greater than zero, both
|
|
119
|
+
* synchronously at creation and on invalid reactive updates.
|
|
120
|
+
* @returns Reactive clock controls.
|
|
121
|
+
*/
|
|
122
|
+
export function useTemporalNow(options: UseTemporalNowOptions = {}): TemporalClock {
|
|
123
|
+
const readNow = options.now ?? Temporal.Now.instant;
|
|
124
|
+
const instant = shallowRef(readNow());
|
|
125
|
+
|
|
126
|
+
// Fail synchronously for invalid initial input. Reactive updates are still
|
|
127
|
+
// validated inside the watcher before a replacement timer is created.
|
|
128
|
+
if (shouldSchedule(options)) resolveIntervalMs(toValue(options.intervalMs ?? 1_000));
|
|
129
|
+
|
|
130
|
+
const refresh = (): Temporal.Instant => {
|
|
131
|
+
const nextInstant = readNow();
|
|
132
|
+
instant.value = nextInstant;
|
|
133
|
+
return nextInstant;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
watchEffect((onCleanup) => {
|
|
137
|
+
if (!shouldSchedule(options)) return;
|
|
138
|
+
|
|
139
|
+
const intervalMs = resolveIntervalMs(toValue(options.intervalMs ?? 1_000));
|
|
140
|
+
const scheduler = options.scheduler ?? defaultScheduler;
|
|
141
|
+
const handle = scheduler.setInterval(refresh, intervalMs);
|
|
142
|
+
|
|
143
|
+
onCleanup(() => scheduler.clearInterval(handle));
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
instant: readonly(instant),
|
|
148
|
+
refresh,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Creates a reactive zoned date-time derived from a scoped Temporal clock.
|
|
154
|
+
*
|
|
155
|
+
* Changes to {@link UseTemporalZonedDateTimeOptions.timeZone} are reflected
|
|
156
|
+
* without replacing the underlying timer. Scheduling, server rendering, and
|
|
157
|
+
* scope-cleanup rules are shared with {@link useTemporalNow}.
|
|
158
|
+
*
|
|
159
|
+
* @param options Clock scheduling plus the reactive time zone.
|
|
160
|
+
* @default options {}
|
|
161
|
+
* @throws `RangeError` for invalid intervals (see {@link useTemporalNow}),
|
|
162
|
+
* and on read when the reactive time zone cannot be resolved by Temporal.
|
|
163
|
+
* @returns Computed zoned date-time in the reactive time zone.
|
|
164
|
+
*/
|
|
165
|
+
export function useTemporalZonedDateTime(
|
|
166
|
+
options: UseTemporalZonedDateTimeOptions = {},
|
|
167
|
+
): ComputedRef<Temporal.ZonedDateTime> {
|
|
168
|
+
const clock = useTemporalNow(options);
|
|
169
|
+
|
|
170
|
+
return computed(() => {
|
|
171
|
+
const timeZone =
|
|
172
|
+
options.timeZone === undefined ? Temporal.Now.timeZoneId() : toValue(options.timeZone);
|
|
173
|
+
|
|
174
|
+
return clock.instant.value.toZonedDateTimeISO(timeZone);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Temporal API namespaces re-exported from the underlying polyfill so hosts
|
|
180
|
+
* can construct instants and time zones without a direct dependency.
|
|
181
|
+
*/
|
|
182
|
+
export { Temporal, TemporalIntl };
|