@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,274 @@
|
|
|
1
|
+
import { computed, hasInjectionContext, onMounted, shallowRef, watch } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, WritableComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { resolveElement } from "./element-target.ts";
|
|
5
|
+
import type { MaybeElementTarget } from "./element-target.ts";
|
|
6
|
+
import { useMediaQuery } from "./media-query.ts";
|
|
7
|
+
import type { MediaQueryHost } from "./media-query.ts";
|
|
8
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
9
|
+
import type { StorageLike } from "./use-storage.ts";
|
|
10
|
+
|
|
11
|
+
/** Built-in color modes. */
|
|
12
|
+
export type BasicColorMode = "light" | "dark";
|
|
13
|
+
|
|
14
|
+
/** Selectable mode: a built-in mode, a custom mode, or `"auto"` (follow the system). */
|
|
15
|
+
export type ColorModeValue<Custom extends string = never> = BasicColorMode | Custom | "auto";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Synchronous key-value persistence used by {@link useColorMode}.
|
|
19
|
+
*
|
|
20
|
+
* The read/write subset of `StorageLike` from `./use-storage`, so
|
|
21
|
+
* `localStorage`, `sessionStorage`, and the same adapters work for both. For
|
|
22
|
+
* hydration-stable SSR pass a cookie-backed adapter that reads the request
|
|
23
|
+
* cookie on the server and `document.cookie` on the client.
|
|
24
|
+
*/
|
|
25
|
+
export type ColorModeStorage = Pick<StorageLike, "getItem" | "setItem">;
|
|
26
|
+
|
|
27
|
+
/** Options for {@link useColorMode}. */
|
|
28
|
+
export interface UseColorModeOptions<Custom extends string = never> {
|
|
29
|
+
/**
|
|
30
|
+
* Class name (or attribute value) written for each mode. Custom modes must
|
|
31
|
+
* be listed here.
|
|
32
|
+
*
|
|
33
|
+
* @default { light: "light", dark: "dark" }
|
|
34
|
+
*/
|
|
35
|
+
readonly modes?: Readonly<Partial<Record<BasicColorMode, string>> & Record<Custom, string>>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `"class"` toggles class names; any other value is used as an attribute
|
|
39
|
+
* name (e.g. `"data-theme"`).
|
|
40
|
+
*
|
|
41
|
+
* @default "class"
|
|
42
|
+
*/
|
|
43
|
+
readonly attribute?: string;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Element that receives the class/attribute.
|
|
47
|
+
*
|
|
48
|
+
* @default document.documentElement when available
|
|
49
|
+
*/
|
|
50
|
+
readonly target?: MaybeElementTarget;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Mode used when nothing is stored.
|
|
54
|
+
*
|
|
55
|
+
* @default "auto"
|
|
56
|
+
*/
|
|
57
|
+
readonly initialValue?: ColorModeValue<Custom>;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Storage key. `null` disables persistence.
|
|
61
|
+
*
|
|
62
|
+
* @default "vize-color-mode"
|
|
63
|
+
*/
|
|
64
|
+
readonly storageKey?: string | null;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Persistence adapter. `null` disables persistence.
|
|
68
|
+
*
|
|
69
|
+
* @default globalThis.window.localStorage when available
|
|
70
|
+
*/
|
|
71
|
+
readonly storage?: ColorModeStorage | null;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* System preference assumed while no media capability exists (server rendering).
|
|
75
|
+
*
|
|
76
|
+
* @default "light"
|
|
77
|
+
*/
|
|
78
|
+
readonly ssrSystem?: BasicColorMode;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Suppress CSS transitions for one frame while switching modes.
|
|
82
|
+
*
|
|
83
|
+
* @default true
|
|
84
|
+
*/
|
|
85
|
+
readonly disableTransition?: boolean;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Media capability used to read `prefers-color-scheme`.
|
|
89
|
+
*
|
|
90
|
+
* @default globalThis.window when available
|
|
91
|
+
*/
|
|
92
|
+
readonly host?: MaybeRefOrGetter<MediaQueryHost | null | undefined>;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Reactive color mode returned by {@link useColorMode}. */
|
|
96
|
+
export interface ColorModeControls<Custom extends string> {
|
|
97
|
+
/** Selected mode, including `"auto"`. Assigning persists and applies it. */
|
|
98
|
+
readonly mode: WritableComputedRef<ColorModeValue<Custom>>;
|
|
99
|
+
/** System preference from `prefers-color-scheme`. */
|
|
100
|
+
readonly system: ComputedRef<BasicColorMode>;
|
|
101
|
+
/** Resolved mode (`"auto"` replaced by the system preference). */
|
|
102
|
+
readonly state: ComputedRef<BasicColorMode | Custom>;
|
|
103
|
+
/** Value read from storage at creation (or the initial value). */
|
|
104
|
+
readonly stored: ComputedRef<ColorModeValue<Custom>>;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Reactive color mode with persistence and DOM application.
|
|
109
|
+
*
|
|
110
|
+
* The stored mode is read synchronously during setup through the injected
|
|
111
|
+
* storage, so a cookie adapter yields identical server and client renders.
|
|
112
|
+
* On the client the resolved mode is written to the target's class list (or
|
|
113
|
+
* attribute) after each change, optionally with transitions suppressed.
|
|
114
|
+
* Nothing touches the DOM during server rendering.
|
|
115
|
+
*
|
|
116
|
+
* @param options Modes, target, persistence, SSR fallback, and capabilities.
|
|
117
|
+
* @default options {}
|
|
118
|
+
* @returns Writable mode plus system and resolved state.
|
|
119
|
+
*/
|
|
120
|
+
export function useColorMode<const Custom extends string = never>(
|
|
121
|
+
options: UseColorModeOptions<Custom> = {},
|
|
122
|
+
): ColorModeControls<Custom> {
|
|
123
|
+
const modes: Readonly<Record<string, string>> = {
|
|
124
|
+
light: "light",
|
|
125
|
+
dark: "dark",
|
|
126
|
+
...options.modes,
|
|
127
|
+
};
|
|
128
|
+
const attribute = options.attribute ?? "class";
|
|
129
|
+
const storageKey = options.storageKey === undefined ? "vize-color-mode" : options.storageKey;
|
|
130
|
+
const storage = options.storage === undefined ? browserStorage() : options.storage;
|
|
131
|
+
const initial = options.initialValue ?? "auto";
|
|
132
|
+
const isMode = (value: string | null): value is ColorModeValue<Custom> =>
|
|
133
|
+
value === "auto" || (value !== null && Object.hasOwn(modes, value));
|
|
134
|
+
|
|
135
|
+
const read = (): ColorModeValue<Custom> => {
|
|
136
|
+
if (!storage || storageKey === null) return initial;
|
|
137
|
+
try {
|
|
138
|
+
const value = storage.getItem(storageKey);
|
|
139
|
+
return isMode(value) ? value : initial;
|
|
140
|
+
} catch {
|
|
141
|
+
return initial;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
// Inside a component the stored mode is read once it has mounted, so a
|
|
145
|
+
// hydrating client first renders `initialValue` exactly like the server.
|
|
146
|
+
const deferRead = hasInjectionContext();
|
|
147
|
+
const storedValue = shallowRef<ColorModeValue<Custom>>(deferRead ? initial : read());
|
|
148
|
+
const selectedRaw = shallowRef<string>(storedValue.value);
|
|
149
|
+
if (deferRead) {
|
|
150
|
+
onMounted(() => {
|
|
151
|
+
const value = read();
|
|
152
|
+
storedValue.value = value;
|
|
153
|
+
// Keep a mode the user picked before mounting.
|
|
154
|
+
if (selectedRaw.value === initial) selectedRaw.value = value;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const selected = computed<ColorModeValue<Custom>>(() =>
|
|
158
|
+
isMode(selectedRaw.value) ? selectedRaw.value : initial,
|
|
159
|
+
);
|
|
160
|
+
const prefersDark = useMediaQuery(
|
|
161
|
+
"(prefers-color-scheme: dark)",
|
|
162
|
+
options.host === undefined
|
|
163
|
+
? { ssrValue: options.ssrSystem === "dark" }
|
|
164
|
+
: { ssrValue: options.ssrSystem === "dark", host: options.host },
|
|
165
|
+
);
|
|
166
|
+
const system = computed<BasicColorMode>(() => (prefersDark.value ? "dark" : "light"));
|
|
167
|
+
const state = computed<BasicColorMode | Custom>(() =>
|
|
168
|
+
selected.value === "auto" ? system.value : selected.value,
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const target = (): Element | null =>
|
|
172
|
+
options.target === undefined
|
|
173
|
+
? typeof document !== "undefined"
|
|
174
|
+
? document.documentElement
|
|
175
|
+
: null
|
|
176
|
+
: resolveElement(options.target);
|
|
177
|
+
|
|
178
|
+
const stop = watch(
|
|
179
|
+
[state, target],
|
|
180
|
+
([resolved, element]) => {
|
|
181
|
+
if (!element) return;
|
|
182
|
+
const restore =
|
|
183
|
+
options.disableTransition === false ? undefined : suppressTransitions(element);
|
|
184
|
+
const value = modes[resolved] ?? resolved;
|
|
185
|
+
if (attribute === "class") {
|
|
186
|
+
for (const name of Object.values(modes)) {
|
|
187
|
+
for (const token of name.split(/\s+/)) if (token) element.classList.remove(token);
|
|
188
|
+
}
|
|
189
|
+
for (const token of value.split(/\s+/)) if (token) element.classList.add(token);
|
|
190
|
+
} else {
|
|
191
|
+
element.setAttribute(attribute, value);
|
|
192
|
+
}
|
|
193
|
+
restore?.();
|
|
194
|
+
},
|
|
195
|
+
{ immediate: true, flush: "post" },
|
|
196
|
+
);
|
|
197
|
+
tryOnScopeDispose(() => stop.stop());
|
|
198
|
+
|
|
199
|
+
const mode = computed<ColorModeValue<Custom>>({
|
|
200
|
+
get: () => selected.value,
|
|
201
|
+
set: (next) => {
|
|
202
|
+
selectedRaw.value = next;
|
|
203
|
+
if (!storage || storageKey === null) return;
|
|
204
|
+
try {
|
|
205
|
+
storage.setItem(storageKey, next);
|
|
206
|
+
} catch {
|
|
207
|
+
// Persistence is best-effort (quota, privacy mode); the in-memory mode still applies.
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
return { mode, system, state, stored: computed(() => storedValue.value) };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Options for {@link useDark}. */
|
|
216
|
+
export interface UseDarkOptions extends Omit<UseColorModeOptions, "modes"> {
|
|
217
|
+
/**
|
|
218
|
+
* Class/attribute value applied in dark mode.
|
|
219
|
+
*
|
|
220
|
+
* @default "dark"
|
|
221
|
+
*/
|
|
222
|
+
readonly valueDark?: string;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Class/attribute value applied in light mode.
|
|
226
|
+
*
|
|
227
|
+
* @default ""
|
|
228
|
+
*/
|
|
229
|
+
readonly valueLight?: string;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Boolean dark-mode switch built on {@link useColorMode}.
|
|
234
|
+
*
|
|
235
|
+
* Setting the ref to the current system preference stores `"auto"`, so the
|
|
236
|
+
* page keeps following the system until the user picks the opposite mode.
|
|
237
|
+
*
|
|
238
|
+
* @param options Dark/light values plus {@link useColorMode} options.
|
|
239
|
+
* @default options {}
|
|
240
|
+
* @returns Writable dark flag.
|
|
241
|
+
*/
|
|
242
|
+
export function useDark(options: UseDarkOptions = {}): WritableComputedRef<boolean> {
|
|
243
|
+
const { valueDark = "dark", valueLight = "", ...rest } = options;
|
|
244
|
+
const colorMode = useColorMode({ ...rest, modes: { dark: valueDark, light: valueLight } });
|
|
245
|
+
return computed({
|
|
246
|
+
get: () => colorMode.state.value === "dark",
|
|
247
|
+
set: (dark: boolean) => {
|
|
248
|
+
const preferred: BasicColorMode = dark ? "dark" : "light";
|
|
249
|
+
colorMode.mode.value = preferred === colorMode.system.value ? "auto" : preferred;
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function suppressTransitions(element: Element): (() => void) | undefined {
|
|
255
|
+
const document = element.ownerDocument;
|
|
256
|
+
const head = document?.head;
|
|
257
|
+
if (!head || typeof document.createElement !== "function") return undefined;
|
|
258
|
+
const style = document.createElement("style");
|
|
259
|
+
style.textContent = "*,*::before,*::after{transition:none!important}";
|
|
260
|
+
head.appendChild(style);
|
|
261
|
+
return () => {
|
|
262
|
+
void document.defaultView?.getComputedStyle(style).opacity;
|
|
263
|
+
style.remove();
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function browserStorage(): ColorModeStorage | null {
|
|
268
|
+
if (typeof window === "undefined") return null;
|
|
269
|
+
try {
|
|
270
|
+
return window.localStorage;
|
|
271
|
+
} catch {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { computed, shallowRef, watchEffect } from "vue";
|
|
2
|
+
import type { Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Registers a callback run when the current evaluation becomes stale. */
|
|
5
|
+
export type ComputedAsyncCancel = (onCancel: () => void) => void;
|
|
6
|
+
|
|
7
|
+
/** Context handed to a {@link computedAsync} evaluator. */
|
|
8
|
+
export interface ComputedAsyncContext {
|
|
9
|
+
/** Aborted as soon as a newer evaluation starts or the scope stops. */
|
|
10
|
+
readonly signal: AbortSignal;
|
|
11
|
+
|
|
12
|
+
/** Register a callback for when this evaluation becomes stale. */
|
|
13
|
+
readonly onCancel: ComputedAsyncCancel;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Options for {@link computedAsync}. */
|
|
17
|
+
export interface ComputedAsyncOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Defer the first evaluation until the value is read.
|
|
20
|
+
*
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
readonly lazy?: boolean;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Ref that is `true` while an evaluation is in flight.
|
|
27
|
+
*
|
|
28
|
+
* @default an internal ref
|
|
29
|
+
*/
|
|
30
|
+
readonly evaluating?: Ref<boolean>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Receives evaluator failures; the previous value is kept.
|
|
34
|
+
*
|
|
35
|
+
* @default undefined (failures are dropped)
|
|
36
|
+
*/
|
|
37
|
+
readonly onError?: (error: unknown) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Computed value backed by an async evaluator.
|
|
42
|
+
*
|
|
43
|
+
* Reactive dependencies read synchronously in the evaluator (before its
|
|
44
|
+
* first `await`) are tracked; when one changes, the previous evaluation is
|
|
45
|
+
* cancelled (its `signal` aborts and `onCancel` callbacks run) and a new one
|
|
46
|
+
* starts. Only the newest evaluation may write the result, so out-of-order
|
|
47
|
+
* responses can never win. The value holds `initial` until the first
|
|
48
|
+
* evaluation settles, which also keeps server and client markup identical
|
|
49
|
+
* during hydration (the server never waits for the promise). Results are
|
|
50
|
+
* stored shallowly: replace the value instead of mutating it.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* const user = computedAsync(
|
|
55
|
+
* async ({ signal }) => (await fetch(`/users/${id.value}`, { signal })).json(),
|
|
56
|
+
* null,
|
|
57
|
+
* );
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @param evaluator Async (or sync) producer of the value.
|
|
61
|
+
* @param initial Value before the first evaluation settles.
|
|
62
|
+
* @param options Laziness, evaluating flag, and error hook.
|
|
63
|
+
* @default options {}
|
|
64
|
+
* @returns Readonly ref holding the newest settled value.
|
|
65
|
+
*/
|
|
66
|
+
export function computedAsync<Value>(
|
|
67
|
+
evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
|
|
68
|
+
initial: Value,
|
|
69
|
+
options?: ComputedAsyncOptions,
|
|
70
|
+
): Readonly<Ref<Value>>;
|
|
71
|
+
export function computedAsync<Value>(
|
|
72
|
+
evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
|
|
73
|
+
initial?: undefined,
|
|
74
|
+
options?: ComputedAsyncOptions,
|
|
75
|
+
): Readonly<Ref<Value | undefined>>;
|
|
76
|
+
export function computedAsync<Value>(
|
|
77
|
+
evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
|
|
78
|
+
initial?: Value,
|
|
79
|
+
options: ComputedAsyncOptions = {},
|
|
80
|
+
): Readonly<Ref<Value | undefined>> {
|
|
81
|
+
const started = shallowRef(!(options.lazy ?? false));
|
|
82
|
+
const current = shallowRef<Value | undefined>(initial);
|
|
83
|
+
const evaluating = options.evaluating ?? shallowRef(false);
|
|
84
|
+
let generation = 0;
|
|
85
|
+
|
|
86
|
+
watchEffect(async (onCleanup) => {
|
|
87
|
+
if (!started.value) return;
|
|
88
|
+
generation += 1;
|
|
89
|
+
const own = generation;
|
|
90
|
+
const controller = new AbortController();
|
|
91
|
+
const cancelCallbacks: (() => void)[] = [];
|
|
92
|
+
let settled = false;
|
|
93
|
+
onCleanup(() => {
|
|
94
|
+
if (settled) return;
|
|
95
|
+
controller.abort();
|
|
96
|
+
for (const callback of cancelCallbacks) callback();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
evaluating.value = true;
|
|
100
|
+
try {
|
|
101
|
+
const result = await evaluator({
|
|
102
|
+
signal: controller.signal,
|
|
103
|
+
onCancel: (callback) => {
|
|
104
|
+
cancelCallbacks.push(callback);
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
if (own === generation) current.value = result;
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (own === generation) options.onError?.(error);
|
|
110
|
+
} finally {
|
|
111
|
+
settled = true;
|
|
112
|
+
if (own === generation) evaluating.value = false;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
if (options.lazy ?? false) {
|
|
117
|
+
return computed(() => {
|
|
118
|
+
started.value = true;
|
|
119
|
+
return current.value;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return current;
|
|
123
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { customRef, watch } from "vue";
|
|
2
|
+
import type { Ref, WatchSource } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Readonly cached value plus a manual invalidation trigger. */
|
|
5
|
+
export interface ComputedWithControl<Value> extends Readonly<Ref<Value>> {
|
|
6
|
+
/** Mark the cached value stale; the next read recomputes it. */
|
|
7
|
+
readonly trigger: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Explicit dependency accepted by {@link computedWithControl}: anything Vue's `watch` accepts. */
|
|
11
|
+
export type ComputedWithControlSource =
|
|
12
|
+
| WatchSource<unknown>
|
|
13
|
+
| object
|
|
14
|
+
| readonly (WatchSource<unknown> | object)[];
|
|
15
|
+
|
|
16
|
+
/** Options for {@link computedWithControl}. */
|
|
17
|
+
export interface ComputedWithControlOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Invalidate on nested changes of the explicit sources.
|
|
20
|
+
*
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
readonly deep?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Computed value whose dependencies are declared explicitly.
|
|
28
|
+
*
|
|
29
|
+
* Only changes of `source` (or a manual {@link ComputedWithControl.trigger})
|
|
30
|
+
* invalidate the cache; reactive reads inside `getter` do not. Useful when
|
|
31
|
+
* the getter reads non-reactive data or should ignore some reactive reads.
|
|
32
|
+
* The getter receives the previous value and runs lazily on the next read.
|
|
33
|
+
* Pure derived state: SSR-safe; the invalidation watcher follows the owning
|
|
34
|
+
* reactive scope.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const snapshot = computedWithControl(version, () => expensiveRead(store));
|
|
39
|
+
* snapshot.trigger(); // force a refresh
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @param source Ref, getter, reactive object, or tuple of those.
|
|
43
|
+
* @param getter Produces the value from the previous one.
|
|
44
|
+
* @param options Depth of the source watch.
|
|
45
|
+
* @default options {}
|
|
46
|
+
* @returns The controlled computed ref.
|
|
47
|
+
*/
|
|
48
|
+
export function computedWithControl<Value>(
|
|
49
|
+
source: ComputedWithControlSource,
|
|
50
|
+
getter: (previous: Value | undefined) => Value,
|
|
51
|
+
options: ComputedWithControlOptions = {},
|
|
52
|
+
): ComputedWithControl<Value> {
|
|
53
|
+
let dirty = true;
|
|
54
|
+
let cached: { readonly value: Value } | undefined;
|
|
55
|
+
let notify = (): void => undefined;
|
|
56
|
+
|
|
57
|
+
const invalidate = (): void => {
|
|
58
|
+
dirty = true;
|
|
59
|
+
notify();
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
watch(source, invalidate, { flush: "sync", deep: options.deep ?? false });
|
|
63
|
+
|
|
64
|
+
const value = customRef<Value>((track, trigger) => {
|
|
65
|
+
notify = trigger;
|
|
66
|
+
return {
|
|
67
|
+
get: () => {
|
|
68
|
+
track();
|
|
69
|
+
if (dirty || cached === undefined) {
|
|
70
|
+
cached = { value: getter(cached?.value) };
|
|
71
|
+
dirty = false;
|
|
72
|
+
}
|
|
73
|
+
return cached.value;
|
|
74
|
+
},
|
|
75
|
+
set: () => undefined,
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return Object.assign(value, { trigger: invalidate });
|
|
80
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { hasInjectionContext } from "vue";
|
|
2
|
+
|
|
3
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
4
|
+
|
|
5
|
+
/** Listener registered on an {@link EventHook}. */
|
|
6
|
+
export type EventHookListener<Arguments extends readonly unknown[]> = (
|
|
7
|
+
...args: Arguments
|
|
8
|
+
) => unknown;
|
|
9
|
+
|
|
10
|
+
/** Registration handle returned by {@link EventHook.on}. */
|
|
11
|
+
export interface EventHookSubscription {
|
|
12
|
+
/** Remove the listener. Idempotent. */
|
|
13
|
+
readonly off: () => void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Options for {@link createEventHook}. */
|
|
17
|
+
export interface CreateEventHookOptions {
|
|
18
|
+
/**
|
|
19
|
+
* What `on()` does when a hook created outside any component (a
|
|
20
|
+
* module-level hook shared by every request) is subscribed to from a
|
|
21
|
+
* component `setup` during server rendering. Vue never disposes server
|
|
22
|
+
* component scopes, so such listeners would accumulate across requests
|
|
23
|
+
* and keep every rendered component alive.
|
|
24
|
+
*
|
|
25
|
+
* - `"ignore"`: skip the registration (the returned `off` is a no-op) and
|
|
26
|
+
* warn once in development.
|
|
27
|
+
* - `"register"`: register anyway; the caller must call `off()`.
|
|
28
|
+
*
|
|
29
|
+
* Hooks created inside a component (request-local hooks) are unaffected.
|
|
30
|
+
*
|
|
31
|
+
* @default "ignore"
|
|
32
|
+
*/
|
|
33
|
+
readonly serverListeners?: "ignore" | "register";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Typed event emitter created by {@link createEventHook}. */
|
|
37
|
+
export interface EventHook<Arguments extends readonly unknown[] = []> {
|
|
38
|
+
/**
|
|
39
|
+
* Add a listener. Inside an effect scope it is removed automatically when
|
|
40
|
+
* the scope stops. Adding the same function twice registers it once.
|
|
41
|
+
*/
|
|
42
|
+
readonly on: (listener: EventHookListener<Arguments>) => EventHookSubscription;
|
|
43
|
+
|
|
44
|
+
/** Remove a listener. */
|
|
45
|
+
readonly off: (listener: EventHookListener<Arguments>) => void;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Call every listener with `args`, in registration order.
|
|
49
|
+
*
|
|
50
|
+
* @returns Settles with every listener's (awaited) result.
|
|
51
|
+
*/
|
|
52
|
+
readonly trigger: (...args: Arguments) => Promise<unknown[]>;
|
|
53
|
+
|
|
54
|
+
/** Remove every listener. */
|
|
55
|
+
readonly clear: () => void;
|
|
56
|
+
|
|
57
|
+
/** Number of registered listeners. */
|
|
58
|
+
readonly size: () => number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Create a small, strongly typed event emitter.
|
|
63
|
+
*
|
|
64
|
+
* The payload is a tuple type, so events can carry several named arguments
|
|
65
|
+
* (`createEventHook<[id: string, value: number]>()`) and `trigger` checks
|
|
66
|
+
* them. Listeners registered inside an effect scope unsubscribe themselves
|
|
67
|
+
* when it stops. Synchronous listener errors propagate from `trigger`;
|
|
68
|
+
* async rejections reject the returned promise.
|
|
69
|
+
*
|
|
70
|
+
* SSR: Vue does not dispose component scopes after a server render, so a
|
|
71
|
+
* listener that a server `setup` adds to a module-level hook would never be
|
|
72
|
+
* removed and would pile up once per request. By default such registrations
|
|
73
|
+
* are therefore skipped (with a one-time development warning); see
|
|
74
|
+
* {@link CreateEventHookOptions.serverListeners}. Hooks created inside a
|
|
75
|
+
* component, and every registration in the browser, behave normally.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const saved = createEventHook<[id: string]>();
|
|
80
|
+
* saved.on((id) => toast(`Saved ${id}`));
|
|
81
|
+
* await saved.trigger("doc-1");
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @param options Server-side registration policy.
|
|
85
|
+
* @default options {}
|
|
86
|
+
* @returns The event hook.
|
|
87
|
+
*/
|
|
88
|
+
export function createEventHook<Arguments extends readonly unknown[] = []>(
|
|
89
|
+
options: CreateEventHookOptions = {},
|
|
90
|
+
): EventHook<Arguments> {
|
|
91
|
+
const listeners = new Set<EventHookListener<Arguments>>();
|
|
92
|
+
// A hook created outside any component is shared by every server request.
|
|
93
|
+
// `hasInjectionContext()` also detects Vapor components, where the public
|
|
94
|
+
// current-instance getter returns `null`.
|
|
95
|
+
const shared = !hasInjectionContext();
|
|
96
|
+
let warned = false;
|
|
97
|
+
|
|
98
|
+
const off = (listener: EventHookListener<Arguments>): void => {
|
|
99
|
+
listeners.delete(listener);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const on = (listener: EventHookListener<Arguments>): EventHookSubscription => {
|
|
103
|
+
if (
|
|
104
|
+
shared &&
|
|
105
|
+
(options.serverListeners ?? "ignore") === "ignore" &&
|
|
106
|
+
typeof window === "undefined" &&
|
|
107
|
+
hasInjectionContext()
|
|
108
|
+
) {
|
|
109
|
+
if (!warned && isDevelopment()) {
|
|
110
|
+
warned = true;
|
|
111
|
+
console.warn(
|
|
112
|
+
'[VIZE_COMPOSE_EVENT_HOOK_SERVER_LISTENER] a module-level event hook was subscribed to during server rendering; the listener was skipped because server component scopes are never disposed. Create the hook inside the component tree, or pass { serverListeners: "register" } and call off() yourself.',
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return { off: () => undefined };
|
|
116
|
+
}
|
|
117
|
+
listeners.add(listener);
|
|
118
|
+
const subscription = { off: () => off(listener) };
|
|
119
|
+
tryOnScopeDispose(subscription.off);
|
|
120
|
+
return subscription;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const trigger = (...args: Arguments): Promise<unknown[]> =>
|
|
124
|
+
Promise.all([...listeners].map((listener) => listener(...args)));
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
on,
|
|
128
|
+
off,
|
|
129
|
+
trigger,
|
|
130
|
+
clear: () => {
|
|
131
|
+
listeners.clear();
|
|
132
|
+
},
|
|
133
|
+
size: () => listeners.size,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function isDevelopment(): boolean {
|
|
138
|
+
return typeof process === "undefined" || process.env["NODE_ENV"] !== "production";
|
|
139
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { effectScope } from "vue";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lift a state factory into application-wide state shared by every caller.
|
|
5
|
+
*
|
|
6
|
+
* The factory runs once, lazily on the first call, inside a detached effect
|
|
7
|
+
* scope so its watchers and computeds outlive any component; every later
|
|
8
|
+
* call returns the same state. Because the state is module-level, it is
|
|
9
|
+
* shared across all server requests: on the server, keep per-request state
|
|
10
|
+
* in `provide`/`createInjectionState` instead, or reset it per request.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const useSession = createGlobalState(() => ({ user: shallowRef<User | null>(null) }));
|
|
15
|
+
* useSession().user.value = currentUser;
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @param factory Creates the state; may use any composable.
|
|
19
|
+
* @throws `Error` tagged `VIZE_COMPOSE_GLOBAL_STATE_INACTIVE_SCOPE` if the
|
|
20
|
+
* private scope cannot run (never expected in practice).
|
|
21
|
+
* @returns Accessor returning the shared state.
|
|
22
|
+
*/
|
|
23
|
+
export function createGlobalState<State>(factory: () => State): () => State {
|
|
24
|
+
let created: { readonly state: State } | undefined;
|
|
25
|
+
return () => {
|
|
26
|
+
if (created === undefined) {
|
|
27
|
+
created = effectScope(true).run(() => ({ state: factory() }));
|
|
28
|
+
if (created === undefined) {
|
|
29
|
+
throw new Error("[VIZE_COMPOSE_GLOBAL_STATE_INACTIVE_SCOPE] the state scope did not run");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return created.state;
|
|
33
|
+
};
|
|
34
|
+
}
|