@vizejs/composable 0.426.3 → 0.427.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Text flow reported by the internationalization runtime. */
|
|
5
|
+
export type TextDirection = "ltr" | "rtl";
|
|
6
|
+
|
|
7
|
+
/** Locale selection options for {@link useLocale}. */
|
|
8
|
+
export interface UseLocaleOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Locale detector used when the reactive source has no value.
|
|
11
|
+
*
|
|
12
|
+
* @default navigator.language when available; otherwise undefined
|
|
13
|
+
*/
|
|
14
|
+
readonly detect?: () => Intl.Locale | string | null | undefined;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Locale used when neither the source nor detector provides one.
|
|
18
|
+
*
|
|
19
|
+
* @default "en"
|
|
20
|
+
*/
|
|
21
|
+
readonly fallback?: Intl.Locale | string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Reactive locale metadata and cached formatter factories.
|
|
26
|
+
*
|
|
27
|
+
* Formatter factories propagate `TypeError` and `RangeError` from the
|
|
28
|
+
* platform `Intl` constructors when the supplied options are invalid.
|
|
29
|
+
*/
|
|
30
|
+
export interface LocaleControls {
|
|
31
|
+
/** Canonical Unicode locale identifier. */
|
|
32
|
+
readonly locale: ComputedRef<string>;
|
|
33
|
+
|
|
34
|
+
/** Parsed locale details supplied by the internationalization runtime. */
|
|
35
|
+
readonly details: ComputedRef<Intl.Locale>;
|
|
36
|
+
|
|
37
|
+
/** Native writing direction for the active locale. */
|
|
38
|
+
readonly direction: ComputedRef<TextDirection>;
|
|
39
|
+
|
|
40
|
+
/** Return a cached number formatter for the active locale and options. */
|
|
41
|
+
readonly number: (options?: Intl.NumberFormatOptions) => Intl.NumberFormat;
|
|
42
|
+
|
|
43
|
+
/** Return a cached date and time formatter for the active locale and options. */
|
|
44
|
+
readonly dateTime: (options?: Intl.DateTimeFormatOptions) => Intl.DateTimeFormat;
|
|
45
|
+
|
|
46
|
+
/** Return a cached list formatter for the active locale and options. */
|
|
47
|
+
readonly list: (options?: Intl.ListFormatOptions) => Intl.ListFormat;
|
|
48
|
+
|
|
49
|
+
/** Return a cached relative-time formatter for the active locale and options. */
|
|
50
|
+
readonly relativeTime: (options?: Intl.RelativeTimeFormatOptions) => Intl.RelativeTimeFormat;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const FORMATTER_CACHE_LIMIT = 32;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Create reactive locale metadata and platform-native formatter factories.
|
|
57
|
+
*
|
|
58
|
+
* Equivalent formatter options reuse instances. The bounded cache follows the
|
|
59
|
+
* active locale automatically and prevents repeated constructor overhead in
|
|
60
|
+
* reactive render paths.
|
|
61
|
+
*
|
|
62
|
+
* Detection is lazy and guarded: the default detector reads
|
|
63
|
+
* `navigator.language` behind a `typeof` check at call time, so importing and
|
|
64
|
+
* calling this during server rendering is safe, and runtimes without a
|
|
65
|
+
* `navigator` resolve to the fallback locale. The composable owns no timers
|
|
66
|
+
* or listeners, so no scope cleanup is required.
|
|
67
|
+
*
|
|
68
|
+
* @param source Reactive locale source. Empty values defer to the detector.
|
|
69
|
+
* @param options Detection and fallback behavior.
|
|
70
|
+
* @default options {}
|
|
71
|
+
* @throws `RangeError` on first read of the reactive values when the winning
|
|
72
|
+
* candidate is not a structurally valid locale identifier.
|
|
73
|
+
* @returns Reactive locale metadata and cached formatter factories.
|
|
74
|
+
*/
|
|
75
|
+
export function useLocale(
|
|
76
|
+
source?: MaybeRefOrGetter<Intl.Locale | string | null | undefined>,
|
|
77
|
+
options: UseLocaleOptions = {},
|
|
78
|
+
): LocaleControls {
|
|
79
|
+
const locale = computed(() => {
|
|
80
|
+
const candidate =
|
|
81
|
+
(source === undefined ? undefined : toValue(source)) ??
|
|
82
|
+
(options.detect ?? detectBrowserLocale)() ??
|
|
83
|
+
options.fallback ??
|
|
84
|
+
"en";
|
|
85
|
+
return candidate instanceof Intl.Locale
|
|
86
|
+
? candidate.toString()
|
|
87
|
+
: new Intl.Locale(candidate).toString();
|
|
88
|
+
});
|
|
89
|
+
const details = computed(() => new Intl.Locale(locale.value));
|
|
90
|
+
const direction = computed<TextDirection>(() => details.value.getTextInfo().direction ?? "ltr");
|
|
91
|
+
|
|
92
|
+
const number = createFormatterCache<Intl.NumberFormatOptions, Intl.NumberFormat>(
|
|
93
|
+
(activeLocale, formatOptions) => new Intl.NumberFormat(activeLocale, formatOptions),
|
|
94
|
+
);
|
|
95
|
+
const dateTime = createFormatterCache<Intl.DateTimeFormatOptions, Intl.DateTimeFormat>(
|
|
96
|
+
(activeLocale, formatOptions) => new Intl.DateTimeFormat(activeLocale, formatOptions),
|
|
97
|
+
);
|
|
98
|
+
const list = createFormatterCache<Intl.ListFormatOptions, Intl.ListFormat>(
|
|
99
|
+
(activeLocale, formatOptions) => new Intl.ListFormat(activeLocale, formatOptions),
|
|
100
|
+
);
|
|
101
|
+
const relativeTime = createFormatterCache<
|
|
102
|
+
Intl.RelativeTimeFormatOptions,
|
|
103
|
+
Intl.RelativeTimeFormat
|
|
104
|
+
>((activeLocale, formatOptions) => new Intl.RelativeTimeFormat(activeLocale, formatOptions));
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
locale,
|
|
108
|
+
details,
|
|
109
|
+
direction,
|
|
110
|
+
number: (formatOptions) => number(locale.value, formatOptions),
|
|
111
|
+
dateTime: (formatOptions) => dateTime(locale.value, formatOptions),
|
|
112
|
+
list: (formatOptions) => list(locale.value, formatOptions),
|
|
113
|
+
relativeTime: (formatOptions) => relativeTime(locale.value, formatOptions),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function detectBrowserLocale(): string | undefined {
|
|
118
|
+
return typeof navigator === "undefined" ? undefined : navigator.language;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function createFormatterCache<Options extends object, Formatter>(
|
|
122
|
+
create: (locale: string, options?: Options) => Formatter,
|
|
123
|
+
): (locale: string, options?: Options) => Formatter {
|
|
124
|
+
const cache = new Map<string, Formatter>();
|
|
125
|
+
return (locale, options) => {
|
|
126
|
+
const key = `${locale}\u0000${serializeOptions(options)}`;
|
|
127
|
+
const cached = cache.get(key);
|
|
128
|
+
if (cached !== undefined) {
|
|
129
|
+
cache.delete(key);
|
|
130
|
+
cache.set(key, cached);
|
|
131
|
+
return cached;
|
|
132
|
+
}
|
|
133
|
+
const formatter = create(locale, options);
|
|
134
|
+
if (cache.size >= FORMATTER_CACHE_LIMIT) {
|
|
135
|
+
const oldest = cache.keys().next().value;
|
|
136
|
+
if (oldest !== undefined) cache.delete(oldest);
|
|
137
|
+
}
|
|
138
|
+
cache.set(key, formatter);
|
|
139
|
+
return formatter;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function serializeOptions(options: object | undefined): string {
|
|
144
|
+
if (options === undefined) return "";
|
|
145
|
+
return JSON.stringify(
|
|
146
|
+
Object.entries(options).sort(([left], [right]) => left.localeCompare(right)),
|
|
147
|
+
);
|
|
148
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { computed, reactive, readonly, ref, toValue, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Modifier key names recognized in combos (after alias resolution). */
|
|
7
|
+
export type ModifierKeyName = "control" | "shift" | "alt" | "meta";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Validate a key combo string at the type level.
|
|
11
|
+
*
|
|
12
|
+
* Combos join lowercase-insensitive key names with `+` or `_`
|
|
13
|
+
* (`"ctrl+s"`, `"shift_arrowup"`). Empty segments such as `"ctrl+"` or
|
|
14
|
+
* `"+s"` resolve to `never`, turning typos into compile errors. Non-literal
|
|
15
|
+
* `string` values are accepted unchanged.
|
|
16
|
+
*/
|
|
17
|
+
export type KeyCombo<Combo extends string> = string extends Combo
|
|
18
|
+
? string
|
|
19
|
+
: Combo extends ""
|
|
20
|
+
? never
|
|
21
|
+
: Combo extends `${infer Head}${"+" | "_"}${infer Tail}`
|
|
22
|
+
? Head extends ""
|
|
23
|
+
? never
|
|
24
|
+
: Tail extends ""
|
|
25
|
+
? never
|
|
26
|
+
: KeyCombo<Tail> extends never
|
|
27
|
+
? never
|
|
28
|
+
: Combo
|
|
29
|
+
: Combo;
|
|
30
|
+
|
|
31
|
+
/** Default aliases resolved before matching combos. */
|
|
32
|
+
export const DEFAULT_KEY_ALIASES = {
|
|
33
|
+
ctrl: "control",
|
|
34
|
+
command: "meta",
|
|
35
|
+
cmd: "meta",
|
|
36
|
+
option: "alt",
|
|
37
|
+
esc: "escape",
|
|
38
|
+
up: "arrowup",
|
|
39
|
+
down: "arrowdown",
|
|
40
|
+
left: "arrowleft",
|
|
41
|
+
right: "arrowright",
|
|
42
|
+
" ": "space",
|
|
43
|
+
spacebar: "space",
|
|
44
|
+
} as const satisfies Readonly<Record<string, string>>;
|
|
45
|
+
|
|
46
|
+
/** Options shared by the keyboard composables. */
|
|
47
|
+
export interface UseKeyboardTargetOptions {
|
|
48
|
+
/**
|
|
49
|
+
* Event target that receives `keydown`/`keyup`.
|
|
50
|
+
*
|
|
51
|
+
* @default globalThis.window when available
|
|
52
|
+
*/
|
|
53
|
+
readonly target?: MaybeRefOrGetter<EventTarget | null | undefined>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Register passive listeners.
|
|
57
|
+
*
|
|
58
|
+
* @default true
|
|
59
|
+
*/
|
|
60
|
+
readonly passive?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Options for {@link useMagicKeys}. */
|
|
64
|
+
export interface UseMagicKeysOptions extends UseKeyboardTargetOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Extra aliases merged over {@link DEFAULT_KEY_ALIASES}. Keys and values are
|
|
67
|
+
* matched case-insensitively.
|
|
68
|
+
*
|
|
69
|
+
* @default {}
|
|
70
|
+
*/
|
|
71
|
+
readonly aliasMap?: Readonly<Record<string, string>>;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Called for every `keydown`/`keyup` after the pressed set has been
|
|
75
|
+
* updated. Useful for `preventDefault()` with `passive: false`.
|
|
76
|
+
*
|
|
77
|
+
* @default undefined
|
|
78
|
+
*/
|
|
79
|
+
readonly onEventFired?: (event: KeyboardEvent) => void;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Reactive keyboard state returned by {@link useMagicKeys}. */
|
|
83
|
+
export interface MagicKeys {
|
|
84
|
+
/** Normalized names (`event.key` and `event.code`, lowercase) currently pressed. */
|
|
85
|
+
readonly current: ReadonlySet<string>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Proxy of combo refs created lazily on property access, e.g.
|
|
89
|
+
* `const { shift, ctrl_s } = keys.combos`.
|
|
90
|
+
*/
|
|
91
|
+
readonly combos: Readonly<Record<string, ComputedRef<boolean>>>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Create (or reuse) a ref that is `true` while every key of the combo is
|
|
95
|
+
* pressed.
|
|
96
|
+
*
|
|
97
|
+
* @param combo Key combo such as `"ctrl+shift+p"`.
|
|
98
|
+
* @returns Readonly computed ref.
|
|
99
|
+
*/
|
|
100
|
+
readonly isPressed: <const Combo extends string>(
|
|
101
|
+
combo: Combo & KeyCombo<Combo>,
|
|
102
|
+
) => ComputedRef<boolean>;
|
|
103
|
+
|
|
104
|
+
/** Forget every pressed key (for example after a modal steals focus). */
|
|
105
|
+
readonly reset: () => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const modifierNames: ReadonlySet<string> = new Set<ModifierKeyName>([
|
|
109
|
+
"control",
|
|
110
|
+
"shift",
|
|
111
|
+
"alt",
|
|
112
|
+
"meta",
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Normalize a key name the way combos are matched.
|
|
117
|
+
*
|
|
118
|
+
* @param name Raw `KeyboardEvent.key`/`code` or combo segment.
|
|
119
|
+
* @param aliases Alias table (keys lowercased).
|
|
120
|
+
* @default aliases DEFAULT_KEY_ALIASES
|
|
121
|
+
* @returns Lowercase, alias-resolved name.
|
|
122
|
+
*/
|
|
123
|
+
export function normalizeKeyName(
|
|
124
|
+
name: string,
|
|
125
|
+
aliases: Readonly<Record<string, string>> = DEFAULT_KEY_ALIASES,
|
|
126
|
+
): string {
|
|
127
|
+
const lower = name.toLowerCase();
|
|
128
|
+
return (aliases[lower] ?? lower).toLowerCase();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Track pressed keys and expose reactive key combos.
|
|
133
|
+
*
|
|
134
|
+
* Both `event.key` and `event.code` are recorded (lowercased), so `"a"` and
|
|
135
|
+
* `"keya"` both match. Because some platforms (notably macOS with `meta`)
|
|
136
|
+
* swallow `keyup` for other keys while a modifier is held, releasing a
|
|
137
|
+
* modifier clears every non-modifier key; losing window focus clears
|
|
138
|
+
* everything. Nothing is pressed during server rendering, and listeners are
|
|
139
|
+
* removed with the owning reactive scope.
|
|
140
|
+
*
|
|
141
|
+
* @param options Target, passivity, aliases, and event hook.
|
|
142
|
+
* @default options {}
|
|
143
|
+
* @returns Pressed set, lazily created combo refs, and controls.
|
|
144
|
+
*/
|
|
145
|
+
export function useMagicKeys(options: UseMagicKeysOptions = {}): MagicKeys {
|
|
146
|
+
const aliases: Record<string, string> = { ...DEFAULT_KEY_ALIASES };
|
|
147
|
+
for (const [alias, key] of Object.entries(options.aliasMap ?? {})) {
|
|
148
|
+
aliases[alias.toLowerCase()] = key.toLowerCase();
|
|
149
|
+
}
|
|
150
|
+
const current = reactive(new Set<string>());
|
|
151
|
+
const cache = new Map<string, ComputedRef<boolean>>();
|
|
152
|
+
|
|
153
|
+
const namesOf = (event: KeyboardEvent): string[] => {
|
|
154
|
+
const names = new Set<string>();
|
|
155
|
+
if (event.key) names.add(normalizeKeyName(event.key, aliases));
|
|
156
|
+
if (event.code) names.add(normalizeKeyName(event.code, aliases));
|
|
157
|
+
return [...names];
|
|
158
|
+
};
|
|
159
|
+
const reset = (): void => current.clear();
|
|
160
|
+
const onKey = (event: Event): void => {
|
|
161
|
+
if (!isKeyboardEvent(event)) return;
|
|
162
|
+
const names = namesOf(event);
|
|
163
|
+
if (event.type === "keydown") {
|
|
164
|
+
for (const name of names) current.add(name);
|
|
165
|
+
} else {
|
|
166
|
+
for (const name of names) current.delete(name);
|
|
167
|
+
if (names.some((name) => modifierNames.has(name))) {
|
|
168
|
+
for (const name of current) if (!modifierNames.has(name)) current.delete(name);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
options.onEventFired?.(event);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const stop = watch(
|
|
175
|
+
() => (options.target === undefined ? browserWindow() : toValue(options.target)),
|
|
176
|
+
(target, _previous, onCleanup) => {
|
|
177
|
+
if (!target) return;
|
|
178
|
+
const listenerOptions: AddEventListenerOptions = { passive: options.passive ?? true };
|
|
179
|
+
target.addEventListener("keydown", onKey, listenerOptions);
|
|
180
|
+
target.addEventListener("keyup", onKey, listenerOptions);
|
|
181
|
+
target.addEventListener("blur", reset, { passive: true });
|
|
182
|
+
onCleanup(() => {
|
|
183
|
+
target.removeEventListener("keydown", onKey);
|
|
184
|
+
target.removeEventListener("keyup", onKey);
|
|
185
|
+
target.removeEventListener("blur", reset);
|
|
186
|
+
reset();
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
{ immediate: true },
|
|
190
|
+
);
|
|
191
|
+
tryOnScopeDispose(() => stop.stop());
|
|
192
|
+
|
|
193
|
+
const comboRef = (combo: string): ComputedRef<boolean> => {
|
|
194
|
+
const key = combo.toLowerCase();
|
|
195
|
+
const cached = cache.get(key);
|
|
196
|
+
if (cached) return cached;
|
|
197
|
+
const parts = key
|
|
198
|
+
.split(/[+_]/)
|
|
199
|
+
.filter((part) => part !== "")
|
|
200
|
+
.map((part) => normalizeKeyName(part, aliases));
|
|
201
|
+
const pressed = computed(() => parts.length > 0 && parts.every((part) => current.has(part)));
|
|
202
|
+
cache.set(key, pressed);
|
|
203
|
+
return pressed;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
const combos = new Proxy<Record<string, ComputedRef<boolean>>>(
|
|
207
|
+
{},
|
|
208
|
+
{
|
|
209
|
+
get: (_target, property) => (typeof property === "string" ? comboRef(property) : undefined),
|
|
210
|
+
has: (_target, property) => typeof property === "string",
|
|
211
|
+
},
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
current: readonly(current),
|
|
216
|
+
combos,
|
|
217
|
+
isPressed: (combo) => comboRef(combo),
|
|
218
|
+
reset,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Key filter accepted by {@link useKeyPressed}. */
|
|
223
|
+
export type KeyFilter = string | readonly string[] | ((event: KeyboardEvent) => boolean);
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Track whether any key matching a filter is held down.
|
|
227
|
+
*
|
|
228
|
+
* String filters are normalized like combos (`"esc"` matches `Escape`) and
|
|
229
|
+
* compared against both `event.key` and `event.code`. The state resets on
|
|
230
|
+
* window blur and during server rendering is always `false`.
|
|
231
|
+
*
|
|
232
|
+
* @param filter Key name(s) or predicate.
|
|
233
|
+
* @param options Target and passivity.
|
|
234
|
+
* @default options {}
|
|
235
|
+
* @returns Readonly ref that is `true` while a matching key is held.
|
|
236
|
+
*/
|
|
237
|
+
export function useKeyPressed(
|
|
238
|
+
filter: KeyFilter,
|
|
239
|
+
options: UseKeyboardTargetOptions = {},
|
|
240
|
+
): Readonly<Ref<boolean>> {
|
|
241
|
+
const held = new Set<string>();
|
|
242
|
+
const pressed = ref(false);
|
|
243
|
+
const names =
|
|
244
|
+
typeof filter === "function"
|
|
245
|
+
? undefined
|
|
246
|
+
: new Set(
|
|
247
|
+
(typeof filter === "string" ? [filter] : filter).map((name) => normalizeKeyName(name)),
|
|
248
|
+
);
|
|
249
|
+
const matches = (event: KeyboardEvent): boolean =>
|
|
250
|
+
names === undefined
|
|
251
|
+
? typeof filter === "function" && filter(event)
|
|
252
|
+
: names.has(normalizeKeyName(event.key)) || names.has(normalizeKeyName(event.code));
|
|
253
|
+
const identity = (event: KeyboardEvent): string => event.code || event.key;
|
|
254
|
+
|
|
255
|
+
const onDown = (event: Event): void => {
|
|
256
|
+
if (!isKeyboardEvent(event) || !matches(event)) return;
|
|
257
|
+
held.add(identity(event));
|
|
258
|
+
pressed.value = true;
|
|
259
|
+
};
|
|
260
|
+
const onUp = (event: Event): void => {
|
|
261
|
+
if (!isKeyboardEvent(event)) return;
|
|
262
|
+
held.delete(identity(event));
|
|
263
|
+
pressed.value = held.size > 0;
|
|
264
|
+
};
|
|
265
|
+
const reset = (): void => {
|
|
266
|
+
held.clear();
|
|
267
|
+
pressed.value = false;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const stop = watch(
|
|
271
|
+
() => (options.target === undefined ? browserWindow() : toValue(options.target)),
|
|
272
|
+
(target, _previous, onCleanup) => {
|
|
273
|
+
if (!target) return;
|
|
274
|
+
const listenerOptions: AddEventListenerOptions = { passive: options.passive ?? true };
|
|
275
|
+
target.addEventListener("keydown", onDown, listenerOptions);
|
|
276
|
+
target.addEventListener("keyup", onUp, listenerOptions);
|
|
277
|
+
target.addEventListener("blur", reset, { passive: true });
|
|
278
|
+
onCleanup(() => {
|
|
279
|
+
target.removeEventListener("keydown", onDown);
|
|
280
|
+
target.removeEventListener("keyup", onUp);
|
|
281
|
+
target.removeEventListener("blur", reset);
|
|
282
|
+
reset();
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
{ immediate: true },
|
|
286
|
+
);
|
|
287
|
+
tryOnScopeDispose(() => stop.stop());
|
|
288
|
+
|
|
289
|
+
return readonly(pressed);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function isKeyboardEvent(event: Event): event is KeyboardEvent {
|
|
293
|
+
return "key" in event && "code" in event;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function browserWindow(): EventTarget | undefined {
|
|
297
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
298
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { computed, isReadonly, isRef, shallowRef, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, WritableComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
function clampNumber(value: number, min: number, max: number): number {
|
|
5
|
+
if (min > max) {
|
|
6
|
+
throw new RangeError(
|
|
7
|
+
`[VIZE_COMPOSE_MATH_INVALID_RANGE] min must not exceed max; received [${String(min)}, ${String(max)}]`,
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
return Math.min(max, Math.max(min, value));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function isWritableRef(value: MaybeRefOrGetter<number>): value is Ref<number> {
|
|
14
|
+
return isRef(value) && !isReadonly(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Number kept inside `[min, max]`.
|
|
19
|
+
*
|
|
20
|
+
* A writable source (a number or a writable ref) yields a writable ref whose
|
|
21
|
+
* reads and writes are clamped; writes go through to the source ref. A
|
|
22
|
+
* getter or computed source yields a readonly computed. Bounds are reactive.
|
|
23
|
+
* Pure derived state: SSR-safe and nothing to dispose.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const volume = useClamp(50, 0, 100);
|
|
28
|
+
* volume.value = 150; // 100
|
|
29
|
+
* const progress = useClamp(() => loaded.value / total.value, 0, 1);
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @param value Source number, writable ref, or getter.
|
|
33
|
+
* @param min Reactive inclusive lower bound.
|
|
34
|
+
* @param max Reactive inclusive upper bound.
|
|
35
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_MATH_INVALID_RANGE` on read or
|
|
36
|
+
* write when `min > max`.
|
|
37
|
+
* @returns Writable clamped ref, or a readonly computed for getters.
|
|
38
|
+
*/
|
|
39
|
+
export function useClamp(
|
|
40
|
+
value: (() => number) | ComputedRef<number>,
|
|
41
|
+
min: MaybeRefOrGetter<number>,
|
|
42
|
+
max: MaybeRefOrGetter<number>,
|
|
43
|
+
): ComputedRef<number>;
|
|
44
|
+
export function useClamp(
|
|
45
|
+
value: number | Ref<number>,
|
|
46
|
+
min: MaybeRefOrGetter<number>,
|
|
47
|
+
max: MaybeRefOrGetter<number>,
|
|
48
|
+
): WritableComputedRef<number>;
|
|
49
|
+
export function useClamp(
|
|
50
|
+
value: MaybeRefOrGetter<number>,
|
|
51
|
+
min: MaybeRefOrGetter<number>,
|
|
52
|
+
max: MaybeRefOrGetter<number>,
|
|
53
|
+
): ComputedRef<number> | WritableComputedRef<number> {
|
|
54
|
+
let source: Ref<number>;
|
|
55
|
+
if (isWritableRef(value)) source = value;
|
|
56
|
+
else if (typeof value === "number") source = shallowRef(value);
|
|
57
|
+
else return computed(() => clampNumber(toValue(value), toValue(min), toValue(max)));
|
|
58
|
+
return computed({
|
|
59
|
+
get: () => clampNumber(source.value, toValue(min), toValue(max)),
|
|
60
|
+
set: (next) => {
|
|
61
|
+
source.value = clampNumber(next, toValue(min), toValue(max));
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Rounding strategy used by {@link useRound}. */
|
|
67
|
+
export type RoundingMethod = "round" | "floor" | "ceil" | "trunc";
|
|
68
|
+
|
|
69
|
+
/** Options for {@link useRound}. */
|
|
70
|
+
export interface UseRoundOptions {
|
|
71
|
+
/**
|
|
72
|
+
* Decimal places to keep; negative values round to tens, hundreds, …
|
|
73
|
+
* Reactive.
|
|
74
|
+
*
|
|
75
|
+
* @default 0
|
|
76
|
+
*/
|
|
77
|
+
readonly precision?: MaybeRefOrGetter<number>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Rounding strategy.
|
|
81
|
+
*
|
|
82
|
+
* @default "round"
|
|
83
|
+
*/
|
|
84
|
+
readonly method?: RoundingMethod;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Multiply by `10 ** places` exactly, by editing the decimal exponent. */
|
|
88
|
+
function shiftExponent(value: number, places: number): number {
|
|
89
|
+
const [mantissa, exponent = "0"] = String(value).split("e");
|
|
90
|
+
return Number(`${mantissa}e${Number(exponent) + places}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Reactive rounding with decimal precision.
|
|
95
|
+
*
|
|
96
|
+
* Uses exponent shifting instead of multiplying by powers of ten, so values
|
|
97
|
+
* such as `1.005` round to `1.01` at two decimals. Pure derived state.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* const price = useRound(rawPrice, { precision: 2 });
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* @param value Reactive number.
|
|
105
|
+
* @param options Precision and method.
|
|
106
|
+
* @default options {}
|
|
107
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_MATH_INVALID_PRECISION` on read
|
|
108
|
+
* when the precision is not an integer.
|
|
109
|
+
* @returns Computed rounded number.
|
|
110
|
+
*/
|
|
111
|
+
export function useRound(
|
|
112
|
+
value: MaybeRefOrGetter<number>,
|
|
113
|
+
options: UseRoundOptions = {},
|
|
114
|
+
): ComputedRef<number> {
|
|
115
|
+
return computed(() => {
|
|
116
|
+
const precision = toValue(options.precision ?? 0);
|
|
117
|
+
if (!Number.isInteger(precision)) {
|
|
118
|
+
throw new RangeError(
|
|
119
|
+
`[VIZE_COMPOSE_MATH_INVALID_PRECISION] precision must be an integer; received ${String(precision)}`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
const number = toValue(value);
|
|
123
|
+
if (!Number.isFinite(number)) return number;
|
|
124
|
+
const round = Math[options.method ?? "round"];
|
|
125
|
+
return shiftExponent(round(shiftExponent(number, precision)), -precision);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** A `[start, end]` numeric interval. */
|
|
130
|
+
export type ProjectionDomain = readonly [start: number, end: number];
|
|
131
|
+
|
|
132
|
+
/** Options for {@link useProjection}. */
|
|
133
|
+
export interface UseProjectionOptions {
|
|
134
|
+
/**
|
|
135
|
+
* Clamp the result into the target domain.
|
|
136
|
+
*
|
|
137
|
+
* @default false
|
|
138
|
+
*/
|
|
139
|
+
readonly clamp?: boolean;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Linearly map a value from one domain to another.
|
|
144
|
+
*
|
|
145
|
+
* Domains are reactive tuples and may be reversed (`[100, 0]`). A degenerate
|
|
146
|
+
* source domain maps everything to the target start. Pure derived state.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const percent = useProjection(scrollY, () => [0, maxScroll.value], [0, 100], { clamp: true });
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* @param value Reactive number in the source domain.
|
|
154
|
+
* @param from Reactive source domain.
|
|
155
|
+
* @param to Reactive target domain.
|
|
156
|
+
* @param options Clamping.
|
|
157
|
+
* @default options {}
|
|
158
|
+
* @returns Computed projected number.
|
|
159
|
+
*/
|
|
160
|
+
export function useProjection(
|
|
161
|
+
value: MaybeRefOrGetter<number>,
|
|
162
|
+
from: MaybeRefOrGetter<ProjectionDomain>,
|
|
163
|
+
to: MaybeRefOrGetter<ProjectionDomain>,
|
|
164
|
+
options: UseProjectionOptions = {},
|
|
165
|
+
): ComputedRef<number> {
|
|
166
|
+
return computed(() => {
|
|
167
|
+
const [fromStart, fromEnd] = toValue(from);
|
|
168
|
+
const [toStart, toEnd] = toValue(to);
|
|
169
|
+
const span = fromEnd - fromStart;
|
|
170
|
+
const ratio = span === 0 ? 0 : (toValue(value) - fromStart) / span;
|
|
171
|
+
const projected = toStart + ratio * (toEnd - toStart);
|
|
172
|
+
if (!(options.clamp ?? false)) return projected;
|
|
173
|
+
return Math.min(Math.max(projected, Math.min(toStart, toEnd)), Math.max(toStart, toEnd));
|
|
174
|
+
});
|
|
175
|
+
}
|