@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,333 @@
|
|
|
1
|
+
import { computed, readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** Minimal `SpeechSynthesisVoice`. */
|
|
7
|
+
export interface SpeechSynthesisVoiceLike {
|
|
8
|
+
/** Human-readable voice name. */
|
|
9
|
+
readonly name: string;
|
|
10
|
+
|
|
11
|
+
/** BCP 47 language tag. */
|
|
12
|
+
readonly lang: string;
|
|
13
|
+
|
|
14
|
+
/** Stable voice identifier. */
|
|
15
|
+
readonly voiceURI: string;
|
|
16
|
+
|
|
17
|
+
/** Whether synthesis runs locally. */
|
|
18
|
+
readonly localService: boolean;
|
|
19
|
+
|
|
20
|
+
/** Whether this is the platform default voice. */
|
|
21
|
+
readonly default: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Minimal `SpeechSynthesisUtterance`. */
|
|
25
|
+
export interface SpeechSynthesisUtteranceLike extends EventTarget {
|
|
26
|
+
/** Text to speak. */
|
|
27
|
+
text: string;
|
|
28
|
+
|
|
29
|
+
/** BCP 47 language tag. */
|
|
30
|
+
lang: string;
|
|
31
|
+
|
|
32
|
+
/** Pitch from 0 to 2. */
|
|
33
|
+
pitch: number;
|
|
34
|
+
|
|
35
|
+
/** Rate from 0.1 to 10. */
|
|
36
|
+
rate: number;
|
|
37
|
+
|
|
38
|
+
/** Volume from 0 to 1. */
|
|
39
|
+
volume: number;
|
|
40
|
+
|
|
41
|
+
/** Voice, or `null` for the platform default. */
|
|
42
|
+
voice: SpeechSynthesisVoiceLike | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Minimal `speechSynthesis` controller. */
|
|
46
|
+
export interface SpeechSynthesisLike extends EventTarget {
|
|
47
|
+
/** Queue an utterance. */
|
|
48
|
+
speak(utterance: SpeechSynthesisUtteranceLike): void;
|
|
49
|
+
|
|
50
|
+
/** Clear the queue and stop speaking. */
|
|
51
|
+
cancel(): void;
|
|
52
|
+
|
|
53
|
+
/** Pause speaking. */
|
|
54
|
+
pause(): void;
|
|
55
|
+
|
|
56
|
+
/** Resume speaking. */
|
|
57
|
+
resume(): void;
|
|
58
|
+
|
|
59
|
+
/** Voices available right now (may be empty until `voiceschanged`). */
|
|
60
|
+
getVoices(): readonly SpeechSynthesisVoiceLike[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Capabilities used by {@link useSpeechSynthesis}. */
|
|
64
|
+
export interface SpeechSynthesisHost {
|
|
65
|
+
/** Synthesis controller (`window.speechSynthesis`). */
|
|
66
|
+
readonly synthesis: SpeechSynthesisLike;
|
|
67
|
+
|
|
68
|
+
/** Utterance constructor (`window.SpeechSynthesisUtterance`). */
|
|
69
|
+
readonly Utterance: new (text?: string) => SpeechSynthesisUtteranceLike;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Playback state of {@link useSpeechSynthesis}. */
|
|
73
|
+
export type SpeechSynthesisStatus = "idle" | "speaking" | "paused" | "ended" | "error";
|
|
74
|
+
|
|
75
|
+
/** Error codes defined by the Web Speech API, plus `"unknown"` for future codes. */
|
|
76
|
+
export type SpeechSynthesisErrorCode =
|
|
77
|
+
| "audio-busy"
|
|
78
|
+
| "audio-hardware"
|
|
79
|
+
| "invalid-argument"
|
|
80
|
+
| "language-unavailable"
|
|
81
|
+
| "network"
|
|
82
|
+
| "not-allowed"
|
|
83
|
+
| "synthesis-failed"
|
|
84
|
+
| "synthesis-unavailable"
|
|
85
|
+
| "text-too-long"
|
|
86
|
+
| "voice-unavailable"
|
|
87
|
+
| "unknown";
|
|
88
|
+
|
|
89
|
+
/** Options for {@link useSpeechSynthesis}. */
|
|
90
|
+
export interface UseSpeechSynthesisOptions {
|
|
91
|
+
/**
|
|
92
|
+
* BCP 47 language tag.
|
|
93
|
+
*
|
|
94
|
+
* @default "en-US"
|
|
95
|
+
*/
|
|
96
|
+
readonly lang?: MaybeRefOrGetter<string>;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Pitch from 0 to 2.
|
|
100
|
+
*
|
|
101
|
+
* @default 1
|
|
102
|
+
*/
|
|
103
|
+
readonly pitch?: MaybeRefOrGetter<number>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Rate from 0.1 to 10.
|
|
107
|
+
*
|
|
108
|
+
* @default 1
|
|
109
|
+
*/
|
|
110
|
+
readonly rate?: MaybeRefOrGetter<number>;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Volume from 0 to 1.
|
|
114
|
+
*
|
|
115
|
+
* @default 1
|
|
116
|
+
*/
|
|
117
|
+
readonly volume?: MaybeRefOrGetter<number>;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Voice to use; `undefined` uses the platform default for `lang`.
|
|
121
|
+
*
|
|
122
|
+
* @default undefined
|
|
123
|
+
*/
|
|
124
|
+
readonly voice?: MaybeRefOrGetter<SpeechSynthesisVoiceLike | undefined>;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Synthesis capabilities for alternate runtimes and tests.
|
|
128
|
+
*
|
|
129
|
+
* @default window.speechSynthesis and window.SpeechSynthesisUtterance
|
|
130
|
+
*/
|
|
131
|
+
readonly host?: MaybeRefOrGetter<SpeechSynthesisHost | null | undefined>;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Reactive state and actions returned by {@link useSpeechSynthesis}. */
|
|
135
|
+
export interface SpeechSynthesisControls {
|
|
136
|
+
/** Whether speech synthesis is available. */
|
|
137
|
+
readonly supported: ComputedRef<boolean>;
|
|
138
|
+
|
|
139
|
+
/** Playback state of the utterance spoken by this composable. */
|
|
140
|
+
readonly status: Readonly<Ref<SpeechSynthesisStatus>>;
|
|
141
|
+
|
|
142
|
+
/** Voices offered by the platform, updated on `voiceschanged`. */
|
|
143
|
+
readonly voices: Readonly<ShallowRef<readonly SpeechSynthesisVoiceLike[]>>;
|
|
144
|
+
|
|
145
|
+
/** Most recent synthesis error, cleared by the next `speak`. */
|
|
146
|
+
readonly error: Readonly<ShallowRef<SpeechSynthesisErrorCode | undefined>>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Speak the current text, cancelling anything this composable is speaking.
|
|
150
|
+
*
|
|
151
|
+
* @returns Whether an utterance was queued.
|
|
152
|
+
* @throws {RangeError} `[VIZE_COMPOSE_SPEECH_SYNTHESIS_INVALID_OPTION]` when
|
|
153
|
+
* pitch, rate, or volume is out of range.
|
|
154
|
+
*/
|
|
155
|
+
readonly speak: () => boolean;
|
|
156
|
+
|
|
157
|
+
/** Pause speaking. */
|
|
158
|
+
readonly pause: () => void;
|
|
159
|
+
|
|
160
|
+
/** Resume paused speech. */
|
|
161
|
+
readonly resume: () => void;
|
|
162
|
+
|
|
163
|
+
/** Stop speaking and clear the queue. */
|
|
164
|
+
readonly cancel: () => void;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const synthesisErrorCodes: ReadonlySet<string> = new Set<SpeechSynthesisErrorCode>([
|
|
168
|
+
"audio-busy",
|
|
169
|
+
"audio-hardware",
|
|
170
|
+
"invalid-argument",
|
|
171
|
+
"language-unavailable",
|
|
172
|
+
"network",
|
|
173
|
+
"not-allowed",
|
|
174
|
+
"synthesis-failed",
|
|
175
|
+
"synthesis-unavailable",
|
|
176
|
+
"text-too-long",
|
|
177
|
+
"voice-unavailable",
|
|
178
|
+
]);
|
|
179
|
+
|
|
180
|
+
function isSynthesisErrorCode(code: string): code is SpeechSynthesisErrorCode {
|
|
181
|
+
return synthesisErrorCodes.has(code);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function browserSynthesisHost(): SpeechSynthesisHost | undefined {
|
|
185
|
+
if (typeof window === "undefined") return undefined;
|
|
186
|
+
if (!("speechSynthesis" in window) || !("SpeechSynthesisUtterance" in window)) return undefined;
|
|
187
|
+
return { synthesis: window.speechSynthesis, Utterance: window.SpeechSynthesisUtterance };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function checkedRange(name: string, value: number, minimum: number, maximum: number): number {
|
|
191
|
+
if (!Number.isFinite(value) || value < minimum || value > maximum) {
|
|
192
|
+
throw new RangeError(
|
|
193
|
+
`[VIZE_COMPOSE_SPEECH_SYNTHESIS_INVALID_OPTION] ${name} must be between ${String(minimum)} and ${String(maximum)}; received ${String(value)}`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Speak text with the Web Speech API.
|
|
201
|
+
*
|
|
202
|
+
* Each `speak` creates a fresh utterance from the current reactive text,
|
|
203
|
+
* language, voice, pitch, rate, and volume (validated ranges), and cancels
|
|
204
|
+
* speech previously started by this composable. `status` follows the
|
|
205
|
+
* utterance lifecycle; interruptions caused by `cancel` return to `"idle"`
|
|
206
|
+
* instead of reporting an error. The available voices are kept current via
|
|
207
|
+
* `voiceschanged`. Speech started by this composable is cancelled and the
|
|
208
|
+
* listener removed when the owning reactive scope stops.
|
|
209
|
+
*
|
|
210
|
+
* Server rendering: nothing is spoken; `supported` is false, `status` is
|
|
211
|
+
* `"idle"`, and `voices` is empty.
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```ts
|
|
215
|
+
* const text = ref("Hello, Vize");
|
|
216
|
+
* const { speak, status } = useSpeechSynthesis(text, { rate: 1.2 });
|
|
217
|
+
* speak();
|
|
218
|
+
* ```
|
|
219
|
+
*
|
|
220
|
+
* @param text Reactive text to speak.
|
|
221
|
+
* @param options Voice parameters and synthesis capabilities.
|
|
222
|
+
* @default options {}
|
|
223
|
+
* @returns Synthesis state and actions.
|
|
224
|
+
*/
|
|
225
|
+
export function useSpeechSynthesis(
|
|
226
|
+
text: MaybeRefOrGetter<string>,
|
|
227
|
+
options: UseSpeechSynthesisOptions = {},
|
|
228
|
+
): SpeechSynthesisControls {
|
|
229
|
+
const status = ref<SpeechSynthesisStatus>("idle");
|
|
230
|
+
const voices = shallowRef<readonly SpeechSynthesisVoiceLike[]>([]);
|
|
231
|
+
const error = shallowRef<SpeechSynthesisErrorCode | undefined>(undefined);
|
|
232
|
+
let current: SpeechSynthesisUtteranceLike | undefined;
|
|
233
|
+
|
|
234
|
+
const resolveHost = (): SpeechSynthesisHost | undefined =>
|
|
235
|
+
options.host === undefined ? browserSynthesisHost() : (toValue(options.host) ?? undefined);
|
|
236
|
+
|
|
237
|
+
const readParameters = (): { pitch: number; rate: number; volume: number } => ({
|
|
238
|
+
pitch: checkedRange("pitch", toValue(options.pitch) ?? 1, 0, 2),
|
|
239
|
+
rate: checkedRange("rate", toValue(options.rate) ?? 1, 0.1, 10),
|
|
240
|
+
volume: checkedRange("volume", toValue(options.volume) ?? 1, 0, 1),
|
|
241
|
+
});
|
|
242
|
+
// Fail fast on statically invalid options.
|
|
243
|
+
readParameters();
|
|
244
|
+
|
|
245
|
+
watch(
|
|
246
|
+
() => resolveHost()?.synthesis,
|
|
247
|
+
(synthesis, _previous, onCleanup) => {
|
|
248
|
+
voices.value = [];
|
|
249
|
+
if (!synthesis) return;
|
|
250
|
+
const update = (): void => {
|
|
251
|
+
voices.value = [...synthesis.getVoices()];
|
|
252
|
+
};
|
|
253
|
+
update();
|
|
254
|
+
synthesis.addEventListener("voiceschanged", update);
|
|
255
|
+
onCleanup(() => synthesis.removeEventListener("voiceschanged", update));
|
|
256
|
+
},
|
|
257
|
+
{ immediate: true, flush: "sync" },
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
const cancel = (): void => {
|
|
261
|
+
const host = resolveHost();
|
|
262
|
+
const active = current;
|
|
263
|
+
current = undefined;
|
|
264
|
+
if (host && active) host.synthesis.cancel();
|
|
265
|
+
status.value = "idle";
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const speak = (): boolean => {
|
|
269
|
+
const host = resolveHost();
|
|
270
|
+
const parameters = readParameters();
|
|
271
|
+
if (!host) return false;
|
|
272
|
+
if (current) cancel();
|
|
273
|
+
const utterance = new host.Utterance(toValue(text));
|
|
274
|
+
utterance.lang = toValue(options.lang) ?? "en-US";
|
|
275
|
+
utterance.pitch = parameters.pitch;
|
|
276
|
+
utterance.rate = parameters.rate;
|
|
277
|
+
utterance.volume = parameters.volume;
|
|
278
|
+
utterance.voice = toValue(options.voice) ?? null;
|
|
279
|
+
const own = (): boolean => current === utterance;
|
|
280
|
+
utterance.addEventListener("start", () => {
|
|
281
|
+
if (own()) status.value = "speaking";
|
|
282
|
+
});
|
|
283
|
+
utterance.addEventListener("pause", () => {
|
|
284
|
+
if (own()) status.value = "paused";
|
|
285
|
+
});
|
|
286
|
+
utterance.addEventListener("resume", () => {
|
|
287
|
+
if (own()) status.value = "speaking";
|
|
288
|
+
});
|
|
289
|
+
utterance.addEventListener("end", () => {
|
|
290
|
+
if (!own()) return;
|
|
291
|
+
current = undefined;
|
|
292
|
+
status.value = "ended";
|
|
293
|
+
});
|
|
294
|
+
utterance.addEventListener("error", (event) => {
|
|
295
|
+
if (!own()) return;
|
|
296
|
+
current = undefined;
|
|
297
|
+
const code: unknown = "error" in event ? event.error : undefined;
|
|
298
|
+
if (code === "canceled" || code === "interrupted") {
|
|
299
|
+
status.value = "idle";
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
error.value = typeof code === "string" && isSynthesisErrorCode(code) ? code : "unknown";
|
|
303
|
+
status.value = "error";
|
|
304
|
+
});
|
|
305
|
+
error.value = undefined;
|
|
306
|
+
current = utterance;
|
|
307
|
+
host.synthesis.speak(utterance);
|
|
308
|
+
return true;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const pause = (): void => {
|
|
312
|
+
if (current) resolveHost()?.synthesis.pause();
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
const resume = (): void => {
|
|
316
|
+
if (current) resolveHost()?.synthesis.resume();
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
tryOnScopeDispose(() => {
|
|
320
|
+
if (current) cancel();
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
return {
|
|
324
|
+
supported: computed(() => resolveHost() !== undefined),
|
|
325
|
+
status: readonly(status),
|
|
326
|
+
voices,
|
|
327
|
+
error,
|
|
328
|
+
speak,
|
|
329
|
+
pause,
|
|
330
|
+
resume,
|
|
331
|
+
cancel,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { computed, shallowRef } from "vue";
|
|
2
|
+
import type { ComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/** What happens when an item is pushed while a bounded stack is full. */
|
|
5
|
+
export type StackOverflowPolicy = "drop-oldest" | "reject";
|
|
6
|
+
|
|
7
|
+
/** Options for {@link useStack}. */
|
|
8
|
+
export interface UseStackOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Maximum number of stacked items. A positive integer, or
|
|
11
|
+
* `Number.POSITIVE_INFINITY` for an unbounded stack.
|
|
12
|
+
*
|
|
13
|
+
* @default Number.POSITIVE_INFINITY
|
|
14
|
+
*/
|
|
15
|
+
readonly capacity?: number;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Policy applied when an item is pushed at capacity: `"drop-oldest"`
|
|
19
|
+
* discards the bottom item to make room, `"reject"` refuses the new item.
|
|
20
|
+
*
|
|
21
|
+
* @default "drop-oldest"
|
|
22
|
+
*/
|
|
23
|
+
readonly overflow?: StackOverflowPolicy;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Reactive last-in, first-out stack returned by {@link useStack}. */
|
|
27
|
+
export interface StackControls<Item> {
|
|
28
|
+
/** Snapshot of the stacked items, bottom first (the top is the last element). */
|
|
29
|
+
readonly items: ComputedRef<readonly Item[]>;
|
|
30
|
+
|
|
31
|
+
/** Number of stacked items. */
|
|
32
|
+
readonly size: ComputedRef<number>;
|
|
33
|
+
|
|
34
|
+
/** Whether the stack holds no items. */
|
|
35
|
+
readonly isEmpty: ComputedRef<boolean>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Read the top without removing it. Reactive when read inside an effect.
|
|
39
|
+
*
|
|
40
|
+
* @returns The top item, or `undefined` when empty.
|
|
41
|
+
*/
|
|
42
|
+
readonly peek: () => Item | undefined;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Push items in argument order (the last argument ends on top), applying
|
|
46
|
+
* the overflow policy.
|
|
47
|
+
*
|
|
48
|
+
* @param items Items to push.
|
|
49
|
+
* @returns How many of the given items were accepted.
|
|
50
|
+
*/
|
|
51
|
+
readonly push: (...items: Item[]) => number;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Remove and return the top.
|
|
55
|
+
*
|
|
56
|
+
* @returns The removed item, or `undefined` when empty.
|
|
57
|
+
*/
|
|
58
|
+
readonly pop: () => Item | undefined;
|
|
59
|
+
|
|
60
|
+
/** Remove every item. */
|
|
61
|
+
readonly clear: () => void;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function validateCapacity(capacity: number): number {
|
|
65
|
+
if (capacity === Number.POSITIVE_INFINITY) return capacity;
|
|
66
|
+
if (!Number.isSafeInteger(capacity) || capacity < 1) {
|
|
67
|
+
throw new RangeError(
|
|
68
|
+
`[VIZE_COMPOSE_STACK_INVALID_CAPACITY] capacity must be a positive integer or Infinity; received ${String(capacity)}`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
return capacity;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create a typed reactive LIFO stack.
|
|
76
|
+
*
|
|
77
|
+
* `push` and `pop` are O(1). A bounded stack either drops its bottom item
|
|
78
|
+
* or rejects new pushes when full. Reactivity is driven by a version
|
|
79
|
+
* counter, so `items`, `size`, `isEmpty`, and `peek` re-evaluate after
|
|
80
|
+
* every mutation.
|
|
81
|
+
*
|
|
82
|
+
* Purely synchronous state: safe during server rendering (no host globals,
|
|
83
|
+
* no timers) and nothing to dispose.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const breadcrumbs = useStack<string>(["home"]);
|
|
88
|
+
* breadcrumbs.push("settings");
|
|
89
|
+
* breadcrumbs.pop(); // "settings"
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @typeParam Item Stacked item type, inferred from `initial` when given.
|
|
93
|
+
* @param initial Items pushed at creation, bottom first (overflow applies).
|
|
94
|
+
* @param options Capacity and overflow policy.
|
|
95
|
+
* @default initial []
|
|
96
|
+
* @default options {}
|
|
97
|
+
* @throws {RangeError} `[VIZE_COMPOSE_STACK_INVALID_CAPACITY]` when `capacity`
|
|
98
|
+
* is not a positive integer or `Infinity`.
|
|
99
|
+
* @returns The reactive stack and its controls.
|
|
100
|
+
*/
|
|
101
|
+
export function useStack<Item>(
|
|
102
|
+
initial: Iterable<Item> = [],
|
|
103
|
+
options: UseStackOptions = {},
|
|
104
|
+
): StackControls<Item> {
|
|
105
|
+
const capacity = validateCapacity(options.capacity ?? Number.POSITIVE_INFINITY);
|
|
106
|
+
const overflow = options.overflow ?? "drop-oldest";
|
|
107
|
+
let buffer: Item[] = [];
|
|
108
|
+
const version = shallowRef(0);
|
|
109
|
+
const touch = (): void => {
|
|
110
|
+
version.value += 1;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const append = (items: readonly Item[]): number => {
|
|
114
|
+
let accepted = 0;
|
|
115
|
+
let dropped = 0;
|
|
116
|
+
for (const item of items) {
|
|
117
|
+
if (buffer.length - dropped >= capacity) {
|
|
118
|
+
if (overflow === "reject") continue;
|
|
119
|
+
dropped += 1;
|
|
120
|
+
}
|
|
121
|
+
buffer.push(item);
|
|
122
|
+
accepted += 1;
|
|
123
|
+
}
|
|
124
|
+
if (dropped > 0) buffer = buffer.slice(dropped);
|
|
125
|
+
return accepted;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
append([...initial]);
|
|
129
|
+
|
|
130
|
+
const items = computed<readonly Item[]>(() => {
|
|
131
|
+
void version.value;
|
|
132
|
+
return buffer.slice();
|
|
133
|
+
});
|
|
134
|
+
const size = computed(() => {
|
|
135
|
+
void version.value;
|
|
136
|
+
return buffer.length;
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
items,
|
|
141
|
+
size,
|
|
142
|
+
isEmpty: computed(() => size.value === 0),
|
|
143
|
+
peek: () => {
|
|
144
|
+
void version.value;
|
|
145
|
+
return buffer.at(-1);
|
|
146
|
+
},
|
|
147
|
+
push: (...added) => {
|
|
148
|
+
const accepted = append(added);
|
|
149
|
+
if (accepted > 0) touch();
|
|
150
|
+
return accepted;
|
|
151
|
+
},
|
|
152
|
+
pop: () => {
|
|
153
|
+
if (buffer.length === 0) return undefined;
|
|
154
|
+
const item = buffer.pop();
|
|
155
|
+
touch();
|
|
156
|
+
return item;
|
|
157
|
+
},
|
|
158
|
+
clear: () => {
|
|
159
|
+
if (buffer.length === 0) return;
|
|
160
|
+
buffer = [];
|
|
161
|
+
touch();
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { computed, shallowRef } from "vue";
|
|
2
|
+
import type { ComputedRef, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Step values keyed by step name. */
|
|
5
|
+
export type StepValues<Name extends string> = { readonly [Step in Name]: unknown };
|
|
6
|
+
|
|
7
|
+
/** Stepper state and navigation returned by {@link useStepper}. */
|
|
8
|
+
export interface Stepper<Name extends string, Values extends StepValues<Name>> {
|
|
9
|
+
/** Step names in order. */
|
|
10
|
+
readonly stepNames: readonly Name[];
|
|
11
|
+
|
|
12
|
+
/** Zero-based index of the current step. */
|
|
13
|
+
readonly index: Readonly<ShallowRef<number>>;
|
|
14
|
+
|
|
15
|
+
/** Name of the current step. */
|
|
16
|
+
readonly current: ComputedRef<Name>;
|
|
17
|
+
|
|
18
|
+
/** Value of the current step (the name itself for array steps). */
|
|
19
|
+
readonly currentValue: ComputedRef<Values[Name]>;
|
|
20
|
+
|
|
21
|
+
/** Name of the next step, or `undefined` on the last. */
|
|
22
|
+
readonly next: ComputedRef<Name | undefined>;
|
|
23
|
+
|
|
24
|
+
/** Name of the previous step, or `undefined` on the first. */
|
|
25
|
+
readonly previous: ComputedRef<Name | undefined>;
|
|
26
|
+
|
|
27
|
+
/** Whether the current step is the first. */
|
|
28
|
+
readonly isFirst: ComputedRef<boolean>;
|
|
29
|
+
|
|
30
|
+
/** Whether the current step is the last. */
|
|
31
|
+
readonly isLast: ComputedRef<boolean>;
|
|
32
|
+
|
|
33
|
+
/** Step name at `index`, or `undefined`. */
|
|
34
|
+
readonly at: (index: number) => Name | undefined;
|
|
35
|
+
|
|
36
|
+
/** Value of a step. */
|
|
37
|
+
readonly get: <Step extends Name>(step: Step) => Values[Step];
|
|
38
|
+
|
|
39
|
+
/** Jump to a step. */
|
|
40
|
+
readonly goTo: (step: Name) => void;
|
|
41
|
+
|
|
42
|
+
/** Advance one step (no-op on the last). */
|
|
43
|
+
readonly goToNext: () => void;
|
|
44
|
+
|
|
45
|
+
/** Go back one step (no-op on the first). */
|
|
46
|
+
readonly goToPrevious: () => void;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Go back to an earlier step; later or current steps are ignored.
|
|
50
|
+
*
|
|
51
|
+
* @returns Whether the cursor moved.
|
|
52
|
+
*/
|
|
53
|
+
readonly goBackTo: (step: Name) => boolean;
|
|
54
|
+
|
|
55
|
+
/** Whether `step` is the current step. */
|
|
56
|
+
readonly isCurrent: (step: Name) => boolean;
|
|
57
|
+
|
|
58
|
+
/** Whether `step` is the step right after the current one. */
|
|
59
|
+
readonly isNext: (step: Name) => boolean;
|
|
60
|
+
|
|
61
|
+
/** Whether `step` is the step right before the current one. */
|
|
62
|
+
readonly isPrevious: (step: Name) => boolean;
|
|
63
|
+
|
|
64
|
+
/** Whether `step` comes before the current step. */
|
|
65
|
+
readonly isBefore: (step: Name) => boolean;
|
|
66
|
+
|
|
67
|
+
/** Whether `step` comes after the current step. */
|
|
68
|
+
readonly isAfter: (step: Name) => boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Linear multi-step flow (wizards, onboarding, checkout) with typed step
|
|
73
|
+
* names.
|
|
74
|
+
*
|
|
75
|
+
* Pass a tuple of names (`["account", "billing", "review"] as const`, or a
|
|
76
|
+
* plain array literal thanks to `const` inference) or an object whose keys
|
|
77
|
+
* are the names and whose values carry per-step data; every navigation
|
|
78
|
+
* method only accepts declared names. Synchronous state: SSR-safe and
|
|
79
|
+
* nothing to dispose.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* const wizard = useStepper(["account", "billing", "review"]);
|
|
84
|
+
* wizard.goTo("billing");
|
|
85
|
+
* wizard.goTo("shipping"); // type error
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* @param steps Step names, or step values keyed by name.
|
|
89
|
+
* @param initial Step to start on.
|
|
90
|
+
* @default initial the first step
|
|
91
|
+
* @throws `RangeError` tagged `VIZE_COMPOSE_STEPPER_EMPTY` when there are no
|
|
92
|
+
* steps, and `RangeError` tagged `VIZE_COMPOSE_STEPPER_UNKNOWN_STEP` for an
|
|
93
|
+
* unknown step name at runtime.
|
|
94
|
+
* @returns Stepper state and navigation.
|
|
95
|
+
*/
|
|
96
|
+
export function useStepper<const Steps extends readonly string[]>(
|
|
97
|
+
steps: Steps,
|
|
98
|
+
initial?: NoInfer<Steps[number]>,
|
|
99
|
+
): Stepper<Steps[number], { readonly [Step in Steps[number]]: Step }>;
|
|
100
|
+
export function useStepper<Steps extends Readonly<Record<string, unknown>>>(
|
|
101
|
+
steps: Steps,
|
|
102
|
+
initial?: NoInfer<keyof Steps & string>,
|
|
103
|
+
): Stepper<keyof Steps & string, Steps>;
|
|
104
|
+
export function useStepper(
|
|
105
|
+
steps: readonly string[] | Readonly<Record<string, unknown>>,
|
|
106
|
+
initial?: string,
|
|
107
|
+
): Stepper<string, Readonly<Record<string, unknown>>> {
|
|
108
|
+
const names: readonly string[] = isNameList(steps) ? [...steps] : Object.keys(steps);
|
|
109
|
+
const values: Readonly<Record<string, unknown>> = isNameList(steps)
|
|
110
|
+
? Object.fromEntries(steps.map((name) => [name, name]))
|
|
111
|
+
: steps;
|
|
112
|
+
if (names.length === 0) {
|
|
113
|
+
throw new RangeError("[VIZE_COMPOSE_STEPPER_EMPTY] useStepper needs at least one step");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const indexOf = (step: string): number => {
|
|
117
|
+
const found = names.indexOf(step);
|
|
118
|
+
if (found === -1) {
|
|
119
|
+
throw new RangeError(`[VIZE_COMPOSE_STEPPER_UNKNOWN_STEP] unknown step "${step}"`);
|
|
120
|
+
}
|
|
121
|
+
return found;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const index = shallowRef(initial === undefined ? 0 : indexOf(initial));
|
|
125
|
+
const at = (position: number): string | undefined => names[position];
|
|
126
|
+
const current = computed(() => names[index.value] ?? "");
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
stepNames: names,
|
|
130
|
+
index,
|
|
131
|
+
current,
|
|
132
|
+
currentValue: computed(() => values[current.value]),
|
|
133
|
+
next: computed(() => at(index.value + 1)),
|
|
134
|
+
previous: computed(() => at(index.value - 1)),
|
|
135
|
+
isFirst: computed(() => index.value === 0),
|
|
136
|
+
isLast: computed(() => index.value === names.length - 1),
|
|
137
|
+
at,
|
|
138
|
+
get: (step) => values[step],
|
|
139
|
+
goTo: (step) => {
|
|
140
|
+
index.value = indexOf(step);
|
|
141
|
+
},
|
|
142
|
+
goToNext: () => {
|
|
143
|
+
if (index.value < names.length - 1) index.value += 1;
|
|
144
|
+
},
|
|
145
|
+
goToPrevious: () => {
|
|
146
|
+
if (index.value > 0) index.value -= 1;
|
|
147
|
+
},
|
|
148
|
+
goBackTo: (step) => {
|
|
149
|
+
const target = indexOf(step);
|
|
150
|
+
if (target >= index.value) return false;
|
|
151
|
+
index.value = target;
|
|
152
|
+
return true;
|
|
153
|
+
},
|
|
154
|
+
isCurrent: (step) => indexOf(step) === index.value,
|
|
155
|
+
isNext: (step) => indexOf(step) === index.value + 1,
|
|
156
|
+
isPrevious: (step) => indexOf(step) === index.value - 1,
|
|
157
|
+
isBefore: (step) => indexOf(step) < index.value,
|
|
158
|
+
isAfter: (step) => indexOf(step) > index.value,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function isNameList(
|
|
163
|
+
steps: readonly string[] | Readonly<Record<string, unknown>>,
|
|
164
|
+
): steps is readonly string[] {
|
|
165
|
+
return Array.isArray(steps);
|
|
166
|
+
}
|