@vizejs/composable 0.426.3 → 0.427.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { readonly, shallowRef, toValue, unref, watch } from "vue";
|
|
2
|
+
import type { MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { calculateRetryDelay } from "./retry-delay.ts";
|
|
5
|
+
import type { RetryDelayOptions } from "./retry-delay.ts";
|
|
6
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
7
|
+
import type { TimeoutScheduler } from "./timeout-scheduler.ts";
|
|
8
|
+
|
|
9
|
+
/** Connection status exposed by {@link useEventSource}. */
|
|
10
|
+
export type EventSourceStatus = "connecting" | "open" | "closed";
|
|
11
|
+
|
|
12
|
+
/** Minimal `EventSource` instance used by {@link useEventSource}. */
|
|
13
|
+
export interface EventSourceLike {
|
|
14
|
+
/** `0` connecting, `1` open, `2` closed (native values). */
|
|
15
|
+
readonly readyState: number;
|
|
16
|
+
/** Close the stream; the source never reconnects afterwards. */
|
|
17
|
+
close(): void;
|
|
18
|
+
/** Subscribe to `open`, `error`, or a named server event. */
|
|
19
|
+
addEventListener(type: string, listener: EventListener): void;
|
|
20
|
+
/** Remove a listener registered with `addEventListener`. */
|
|
21
|
+
removeEventListener(type: string, listener: EventListener): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Constructor creating {@link EventSourceLike} streams (e.g. `EventSource`). */
|
|
25
|
+
export type EventSourceConstructorLike = new (
|
|
26
|
+
url: string,
|
|
27
|
+
init?: { readonly withCredentials?: boolean },
|
|
28
|
+
) => EventSourceLike;
|
|
29
|
+
|
|
30
|
+
/** Server event map: event name to decoded data type. */
|
|
31
|
+
export type EventSourceEventMap = Record<string, unknown>;
|
|
32
|
+
|
|
33
|
+
/** Event names of a map whose data is not plain text and therefore needs a parser. */
|
|
34
|
+
type ParsedEventNames<Events extends EventSourceEventMap> = {
|
|
35
|
+
[Name in keyof Events & string]: [string] extends [Events[Name]] ? never : Name;
|
|
36
|
+
}[keyof Events & string];
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Per-event decoders. A decoder is required for every event whose data type
|
|
40
|
+
* cannot hold the raw text, and optional otherwise.
|
|
41
|
+
*/
|
|
42
|
+
export type EventSourceParsers<Events extends EventSourceEventMap> = {
|
|
43
|
+
readonly [Name in ParsedEventNames<Events>]: (raw: string) => Events[Name];
|
|
44
|
+
} & {
|
|
45
|
+
readonly [Name in Exclude<keyof Events & string, ParsedEventNames<Events>>]?: (
|
|
46
|
+
raw: string,
|
|
47
|
+
) => Events[Name];
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** One decoded server event, discriminated by `event`. */
|
|
51
|
+
export type EventSourceMessage<Events extends EventSourceEventMap> = {
|
|
52
|
+
readonly [Name in keyof Events & string]: {
|
|
53
|
+
/** Server event name. */
|
|
54
|
+
readonly event: Name;
|
|
55
|
+
/** Decoded data. */
|
|
56
|
+
readonly data: Events[Name];
|
|
57
|
+
/** `id:` field of the event, or `""`. */
|
|
58
|
+
readonly lastEventId: string;
|
|
59
|
+
};
|
|
60
|
+
}[keyof Events & string];
|
|
61
|
+
|
|
62
|
+
/** Discriminated failure reported by {@link useEventSource}. */
|
|
63
|
+
export type EventSourceFailure =
|
|
64
|
+
| {
|
|
65
|
+
/** The stream dispatched an `error` event. */
|
|
66
|
+
readonly kind: "error";
|
|
67
|
+
/** The dispatched event. */
|
|
68
|
+
readonly event: Event;
|
|
69
|
+
}
|
|
70
|
+
| {
|
|
71
|
+
/** The constructor threw. */
|
|
72
|
+
readonly kind: "connect";
|
|
73
|
+
/** Exact thrown value. */
|
|
74
|
+
readonly cause: unknown;
|
|
75
|
+
}
|
|
76
|
+
| {
|
|
77
|
+
/** A parser threw. */
|
|
78
|
+
readonly kind: "parse";
|
|
79
|
+
/** Event whose data could not be parsed. */
|
|
80
|
+
readonly event: string;
|
|
81
|
+
/** Exact thrown value. */
|
|
82
|
+
readonly cause: unknown;
|
|
83
|
+
}
|
|
84
|
+
| {
|
|
85
|
+
/** Automatic reconnection gave up. */
|
|
86
|
+
readonly kind: "reconnect-exhausted";
|
|
87
|
+
/** Reconnection attempts performed. */
|
|
88
|
+
readonly attempts: number;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** Options for reconnecting streams the browser gave up on. */
|
|
92
|
+
export interface EventSourceReconnectOptions extends RetryDelayOptions {
|
|
93
|
+
/**
|
|
94
|
+
* Maximum consecutive reconnection attempts.
|
|
95
|
+
*
|
|
96
|
+
* @default Infinity
|
|
97
|
+
*/
|
|
98
|
+
readonly retries?: number;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Called once reconnection gives up.
|
|
102
|
+
*
|
|
103
|
+
* @default undefined
|
|
104
|
+
*/
|
|
105
|
+
readonly onFailed?: () => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Options for {@link useEventSource}. */
|
|
109
|
+
export interface UseEventSourceOptions<Events extends EventSourceEventMap> {
|
|
110
|
+
/**
|
|
111
|
+
* Named server events to subscribe to.
|
|
112
|
+
*
|
|
113
|
+
* @default ["message"]
|
|
114
|
+
*/
|
|
115
|
+
readonly events?: readonly (keyof Events & string)[];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Per-event decoders (required for events whose data is not text).
|
|
119
|
+
*
|
|
120
|
+
* @default raw text for every event
|
|
121
|
+
*/
|
|
122
|
+
readonly parse?: EventSourceParsers<Events>;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Send cookies with cross-origin requests.
|
|
126
|
+
*
|
|
127
|
+
* @default false
|
|
128
|
+
*/
|
|
129
|
+
readonly withCredentials?: boolean;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* `EventSource` constructor (a plain value or ref, never a getter).
|
|
133
|
+
* Supplying one also enables automatic connection outside a browser.
|
|
134
|
+
*
|
|
135
|
+
* @default window.EventSource when a browser window exists
|
|
136
|
+
*/
|
|
137
|
+
readonly host?: MaybeRef<EventSourceConstructorLike | null | undefined>;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Connect as soon as a URL is available (browser or explicit host only).
|
|
141
|
+
*
|
|
142
|
+
* @default true
|
|
143
|
+
*/
|
|
144
|
+
readonly immediate?: boolean;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Reopen the stream with backoff after the browser closes it for good
|
|
148
|
+
* (native reconnection covers transient drops).
|
|
149
|
+
*
|
|
150
|
+
* @default false
|
|
151
|
+
*/
|
|
152
|
+
readonly autoReconnect?: boolean | EventSourceReconnectOptions;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Timer host for reconnection.
|
|
156
|
+
*
|
|
157
|
+
* @default globalThis timer functions
|
|
158
|
+
*/
|
|
159
|
+
readonly scheduler?: TimeoutScheduler;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Observe failures.
|
|
163
|
+
*
|
|
164
|
+
* @default undefined
|
|
165
|
+
*/
|
|
166
|
+
readonly onError?: (failure: EventSourceFailure) => void;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Reactive state and controls returned by {@link useEventSource}. */
|
|
170
|
+
export interface EventSourceControls<Events extends EventSourceEventMap> {
|
|
171
|
+
/** Connection status. */
|
|
172
|
+
readonly status: Readonly<Ref<EventSourceStatus>>;
|
|
173
|
+
/** Latest decoded event, discriminated by name. */
|
|
174
|
+
readonly message: Readonly<ShallowRef<EventSourceMessage<Events> | undefined>>;
|
|
175
|
+
/** Data of the latest event. */
|
|
176
|
+
readonly data: Readonly<ShallowRef<Events[keyof Events & string] | undefined>>;
|
|
177
|
+
/** Name of the latest event. */
|
|
178
|
+
readonly event: Readonly<Ref<(keyof Events & string) | undefined>>;
|
|
179
|
+
/** `id:` field of the latest event. */
|
|
180
|
+
readonly lastEventId: Readonly<Ref<string | undefined>>;
|
|
181
|
+
/** Latest failure, cleared when the stream opens. */
|
|
182
|
+
readonly error: Readonly<ShallowRef<EventSourceFailure | undefined>>;
|
|
183
|
+
/** Current underlying source, if any. */
|
|
184
|
+
readonly source: Readonly<ShallowRef<EventSourceLike | undefined>>;
|
|
185
|
+
/**
|
|
186
|
+
* Observe one subscribed event with typed data.
|
|
187
|
+
*
|
|
188
|
+
* @returns A function removing the handler.
|
|
189
|
+
*/
|
|
190
|
+
readonly on: <Name extends keyof Events & string>(
|
|
191
|
+
event: Name,
|
|
192
|
+
handler: (data: NoInfer<Events[Name]>, lastEventId: string) => void,
|
|
193
|
+
) => () => void;
|
|
194
|
+
/** Open (or reopen) the stream. */
|
|
195
|
+
readonly open: () => void;
|
|
196
|
+
/** Close the stream and disable reconnection. */
|
|
197
|
+
readonly close: () => void;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Required options when the event map contains non-text data: `parse` must
|
|
202
|
+
* then provide those decoders.
|
|
203
|
+
*/
|
|
204
|
+
export type EventSourceParseRequirement<Events extends EventSourceEventMap> = [
|
|
205
|
+
ParsedEventNames<Events>,
|
|
206
|
+
] extends [never]
|
|
207
|
+
? unknown
|
|
208
|
+
: { readonly parse: EventSourceParsers<Events> };
|
|
209
|
+
|
|
210
|
+
const CLOSED = 2;
|
|
211
|
+
|
|
212
|
+
function browserEventSource(): EventSourceConstructorLike | undefined {
|
|
213
|
+
return typeof window !== "undefined" && typeof window.EventSource === "function"
|
|
214
|
+
? window.EventSource
|
|
215
|
+
: undefined;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function defaultScheduler(): TimeoutScheduler {
|
|
219
|
+
return {
|
|
220
|
+
setTimeout: (callback, delayMs) => {
|
|
221
|
+
const handle = globalThis.setTimeout(callback, delayMs);
|
|
222
|
+
return () => globalThis.clearTimeout(handle);
|
|
223
|
+
},
|
|
224
|
+
clearTimeout: (cancel) => {
|
|
225
|
+
if (typeof cancel === "function") cancel();
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function eventData<Events extends EventSourceEventMap, Name extends keyof Events & string>(
|
|
231
|
+
value: unknown,
|
|
232
|
+
): Events[Name] {
|
|
233
|
+
// The only unchecked step: values reach this point either from the decoder
|
|
234
|
+
// `EventSourceParsers<Events>[Name]` (which returns `Events[Name]`) or as
|
|
235
|
+
// raw text for events whose type accepts `string` (enforced by
|
|
236
|
+
// `EventSourceParseRequirement`). Indexing the mapped parser type by a
|
|
237
|
+
// generic key loses that link, so it is restored here.
|
|
238
|
+
return value as Events[Name];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Reactive Server-Sent Events stream with typed, per-event decoding.
|
|
243
|
+
*
|
|
244
|
+
* Every subscribed event is decoded by its parser (raw text by default) and
|
|
245
|
+
* exposed as a discriminated `message`, plus `data`/`event`/`lastEventId`
|
|
246
|
+
* shortcuts and typed `on()` handlers. Transient drops use the browser's
|
|
247
|
+
* native reconnection; `autoReconnect` additionally reopens streams the
|
|
248
|
+
* browser closed for good. The stream and timers are released when the
|
|
249
|
+
* owning reactive scope stops (the caller owns `close()` outside a scope).
|
|
250
|
+
* Server rendering never connects and reports `"closed"`.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```ts
|
|
254
|
+
* const feed = useEventSource<{ price: number; notice: string }>("/stream", {
|
|
255
|
+
* events: ["price", "notice"],
|
|
256
|
+
* parse: { price: (raw) => Number(raw) },
|
|
257
|
+
* });
|
|
258
|
+
* feed.on("price", (price) => chart.push(price));
|
|
259
|
+
* ```
|
|
260
|
+
*
|
|
261
|
+
* @param url Reactive URL; changing it reconnects.
|
|
262
|
+
* @param options Events, decoders, host, and reconnection options.
|
|
263
|
+
* @default options {}
|
|
264
|
+
* @returns Reactive state and controls.
|
|
265
|
+
*/
|
|
266
|
+
export function useEventSource<Events extends EventSourceEventMap = { message: string }>(
|
|
267
|
+
url: MaybeRefOrGetter<string | URL | null | undefined>,
|
|
268
|
+
...[options]: unknown extends EventSourceParseRequirement<Events>
|
|
269
|
+
? [options?: UseEventSourceOptions<Events>]
|
|
270
|
+
: [options: UseEventSourceOptions<Events> & EventSourceParseRequirement<Events>]
|
|
271
|
+
): EventSourceControls<Events> {
|
|
272
|
+
type Name = keyof Events & string;
|
|
273
|
+
const settings: UseEventSourceOptions<Events> = options ?? {};
|
|
274
|
+
const status = shallowRef<EventSourceStatus>("closed");
|
|
275
|
+
const message = shallowRef<EventSourceMessage<Events>>();
|
|
276
|
+
const data = shallowRef<Events[Name]>();
|
|
277
|
+
const event = shallowRef<Name>();
|
|
278
|
+
const lastEventId = shallowRef<string | undefined>(undefined);
|
|
279
|
+
const error = shallowRef<EventSourceFailure | undefined>(undefined);
|
|
280
|
+
const source = shallowRef<EventSourceLike | undefined>(undefined);
|
|
281
|
+
const scheduler = settings.scheduler ?? defaultScheduler();
|
|
282
|
+
const reconnect = settings.autoReconnect === true ? {} : settings.autoReconnect || undefined;
|
|
283
|
+
const handlers = new Map<string, Set<(value: unknown, id: string) => void>>();
|
|
284
|
+
let attempts = 0;
|
|
285
|
+
let manuallyClosed = false;
|
|
286
|
+
let reconnectTimer: unknown;
|
|
287
|
+
let detach: (() => void) | undefined;
|
|
288
|
+
|
|
289
|
+
const resolveHost = (): EventSourceConstructorLike | undefined =>
|
|
290
|
+
settings.host === undefined ? browserEventSource() : (unref(settings.host) ?? undefined);
|
|
291
|
+
|
|
292
|
+
const fail = (failure: EventSourceFailure): void => {
|
|
293
|
+
error.value = failure;
|
|
294
|
+
settings.onError?.(failure);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
const dispose = (): void => {
|
|
298
|
+
detach?.();
|
|
299
|
+
detach = undefined;
|
|
300
|
+
source.value?.close();
|
|
301
|
+
source.value = undefined;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const scheduleReconnect = (): void => {
|
|
305
|
+
if (!reconnect || manuallyClosed) return;
|
|
306
|
+
if (attempts >= (reconnect.retries ?? Number.POSITIVE_INFINITY)) {
|
|
307
|
+
fail({ kind: "reconnect-exhausted", attempts });
|
|
308
|
+
reconnect.onFailed?.();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
attempts += 1;
|
|
312
|
+
reconnectTimer = scheduler.setTimeout(
|
|
313
|
+
() => {
|
|
314
|
+
reconnectTimer = undefined;
|
|
315
|
+
connect();
|
|
316
|
+
},
|
|
317
|
+
calculateRetryDelay(attempts, reconnect),
|
|
318
|
+
);
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
const deliver = <Current extends Name>(name: Current, raw: string, id: string): void => {
|
|
322
|
+
const parsers: Partial<Record<string, (text: string) => unknown>> | undefined = settings.parse;
|
|
323
|
+
const parser = parsers?.[name];
|
|
324
|
+
let decoded: Events[Current];
|
|
325
|
+
try {
|
|
326
|
+
decoded = eventData<Events, Current>(parser ? parser(raw) : raw);
|
|
327
|
+
} catch (cause) {
|
|
328
|
+
fail({ kind: "parse", event: name, cause });
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const next: {
|
|
332
|
+
readonly event: Current;
|
|
333
|
+
readonly data: Events[Current];
|
|
334
|
+
readonly lastEventId: string;
|
|
335
|
+
} = { event: name, data: decoded, lastEventId: id };
|
|
336
|
+
message.value = next;
|
|
337
|
+
data.value = decoded;
|
|
338
|
+
event.value = name;
|
|
339
|
+
lastEventId.value = id;
|
|
340
|
+
for (const handler of handlers.get(name) ?? []) handler(decoded, id);
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
const connect = (): void => {
|
|
344
|
+
if (reconnectTimer !== undefined) {
|
|
345
|
+
scheduler.clearTimeout(reconnectTimer);
|
|
346
|
+
reconnectTimer = undefined;
|
|
347
|
+
}
|
|
348
|
+
dispose();
|
|
349
|
+
const target = toValue(url);
|
|
350
|
+
const Host = resolveHost();
|
|
351
|
+
if (target === null || target === undefined || Host === undefined) {
|
|
352
|
+
status.value = "closed";
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
let instance: EventSourceLike;
|
|
356
|
+
try {
|
|
357
|
+
instance = new Host(String(target), { withCredentials: settings.withCredentials ?? false });
|
|
358
|
+
} catch (cause) {
|
|
359
|
+
status.value = "closed";
|
|
360
|
+
fail({ kind: "connect", cause });
|
|
361
|
+
scheduleReconnect();
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
source.value = instance;
|
|
365
|
+
status.value = "connecting";
|
|
366
|
+
|
|
367
|
+
const onOpen = (): void => {
|
|
368
|
+
status.value = "open";
|
|
369
|
+
error.value = undefined;
|
|
370
|
+
attempts = 0;
|
|
371
|
+
};
|
|
372
|
+
const onError = (nativeEvent: Event): void => {
|
|
373
|
+
fail({ kind: "error", event: nativeEvent });
|
|
374
|
+
if (instance.readyState === CLOSED) {
|
|
375
|
+
dispose();
|
|
376
|
+
status.value = "closed";
|
|
377
|
+
scheduleReconnect();
|
|
378
|
+
} else {
|
|
379
|
+
status.value = "connecting";
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
const listeners = new Map<string, EventListener>();
|
|
383
|
+
const names: readonly Name[] = settings.events ?? ["message"];
|
|
384
|
+
for (const name of names) {
|
|
385
|
+
const listener: EventListener = (nativeEvent) => {
|
|
386
|
+
const raw: unknown = "data" in nativeEvent ? nativeEvent.data : "";
|
|
387
|
+
const id: unknown = "lastEventId" in nativeEvent ? nativeEvent.lastEventId : "";
|
|
388
|
+
deliver(
|
|
389
|
+
name,
|
|
390
|
+
typeof raw === "string" ? raw : String(raw),
|
|
391
|
+
typeof id === "string" ? id : "",
|
|
392
|
+
);
|
|
393
|
+
};
|
|
394
|
+
listeners.set(name, listener);
|
|
395
|
+
instance.addEventListener(name, listener);
|
|
396
|
+
}
|
|
397
|
+
instance.addEventListener("open", onOpen);
|
|
398
|
+
instance.addEventListener("error", onError);
|
|
399
|
+
detach = () => {
|
|
400
|
+
instance.removeEventListener("open", onOpen);
|
|
401
|
+
instance.removeEventListener("error", onError);
|
|
402
|
+
for (const [name, listener] of listeners) instance.removeEventListener(name, listener);
|
|
403
|
+
};
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
const open = (): void => {
|
|
407
|
+
manuallyClosed = false;
|
|
408
|
+
attempts = 0;
|
|
409
|
+
connect();
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
const close = (): void => {
|
|
413
|
+
manuallyClosed = true;
|
|
414
|
+
if (reconnectTimer !== undefined) {
|
|
415
|
+
scheduler.clearTimeout(reconnectTimer);
|
|
416
|
+
reconnectTimer = undefined;
|
|
417
|
+
}
|
|
418
|
+
dispose();
|
|
419
|
+
status.value = "closed";
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
const on = <Current extends Name>(
|
|
423
|
+
name: Current,
|
|
424
|
+
handler: (value: Events[Current], id: string) => void,
|
|
425
|
+
): (() => void) => {
|
|
426
|
+
const wrapped = (value: unknown, id: string): void => {
|
|
427
|
+
// Handlers are keyed by event name and only receive that event's data.
|
|
428
|
+
handler(eventData<Events, Current>(value), id);
|
|
429
|
+
};
|
|
430
|
+
const set = handlers.get(name) ?? new Set();
|
|
431
|
+
set.add(wrapped);
|
|
432
|
+
handlers.set(name, set);
|
|
433
|
+
return () => {
|
|
434
|
+
set.delete(wrapped);
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
const automatic = settings.host !== undefined || typeof window !== "undefined";
|
|
439
|
+
if (automatic) {
|
|
440
|
+
let initial = true;
|
|
441
|
+
const stop = watch(
|
|
442
|
+
[() => toValue(url), resolveHost],
|
|
443
|
+
([target]) => {
|
|
444
|
+
const first = initial;
|
|
445
|
+
initial = false;
|
|
446
|
+
if (first && !(settings.immediate ?? true)) return;
|
|
447
|
+
if (!first && source.value === undefined && reconnectTimer === undefined) return;
|
|
448
|
+
if (target === null || target === undefined) close();
|
|
449
|
+
else open();
|
|
450
|
+
},
|
|
451
|
+
{ immediate: true },
|
|
452
|
+
);
|
|
453
|
+
tryOnScopeDispose(stop);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
tryOnScopeDispose(close);
|
|
457
|
+
|
|
458
|
+
return {
|
|
459
|
+
status: readonly(status),
|
|
460
|
+
message,
|
|
461
|
+
data,
|
|
462
|
+
event,
|
|
463
|
+
lastEventId,
|
|
464
|
+
error,
|
|
465
|
+
source,
|
|
466
|
+
on,
|
|
467
|
+
open,
|
|
468
|
+
close,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { computed, readonly, ref, unref } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRef, Ref } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Color picked by the EyeDropper API. */
|
|
5
|
+
export interface EyeDropperColor {
|
|
6
|
+
/** Picked color as a `#rrggbb` string. */
|
|
7
|
+
readonly sRGBHex: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Minimal `EyeDropper` instance. */
|
|
11
|
+
export interface EyeDropperLike {
|
|
12
|
+
/** Open the picker. Rejects with AbortError when dismissed or aborted. */
|
|
13
|
+
open(options?: { signal?: AbortSignal }): Promise<EyeDropperColor>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Minimal `EyeDropper` constructor. */
|
|
17
|
+
export type EyeDropperHost = new () => EyeDropperLike;
|
|
18
|
+
|
|
19
|
+
/** Options for {@link useEyeDropper}. */
|
|
20
|
+
export interface UseEyeDropperOptions {
|
|
21
|
+
/**
|
|
22
|
+
* EyeDropper constructor for alternate runtimes and tests. A ref (not a
|
|
23
|
+
* getter) because the host itself is a constructor function.
|
|
24
|
+
*
|
|
25
|
+
* @default window.EyeDropper when it exists
|
|
26
|
+
*/
|
|
27
|
+
readonly host?: MaybeRef<EyeDropperHost | null | undefined>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Initial `sRGBHex` value.
|
|
31
|
+
*
|
|
32
|
+
* @default ""
|
|
33
|
+
*/
|
|
34
|
+
readonly initialValue?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Discriminated outcome of {@link EyeDropperControls.open}. */
|
|
38
|
+
export type EyeDropperResult =
|
|
39
|
+
| {
|
|
40
|
+
/** A color was picked. */
|
|
41
|
+
readonly status: "picked";
|
|
42
|
+
/** Picked color. */
|
|
43
|
+
readonly sRGBHex: string;
|
|
44
|
+
}
|
|
45
|
+
| {
|
|
46
|
+
/** Dismissed/aborted, missing API, or another failure. */
|
|
47
|
+
readonly status: "cancelled" | "unsupported" | "failed";
|
|
48
|
+
/** Exact error thrown by the host, when one was thrown. */
|
|
49
|
+
readonly error: unknown;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** Reactive state and actions returned by {@link useEyeDropper}. */
|
|
53
|
+
export interface EyeDropperControls {
|
|
54
|
+
/** Whether the EyeDropper API is available. */
|
|
55
|
+
readonly supported: ComputedRef<boolean>;
|
|
56
|
+
|
|
57
|
+
/** Most recently picked color. */
|
|
58
|
+
readonly sRGBHex: Readonly<Ref<string>>;
|
|
59
|
+
|
|
60
|
+
/** Whether the picker is open. */
|
|
61
|
+
readonly picking: Readonly<Ref<boolean>>;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Open the picker. Browsers require a user gesture.
|
|
65
|
+
*
|
|
66
|
+
* @param signal Aborts the open picker.
|
|
67
|
+
* @returns The discriminated outcome; never rejects.
|
|
68
|
+
*/
|
|
69
|
+
readonly open: (signal?: AbortSignal) => Promise<EyeDropperResult>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isEyeDropperHost(candidate: unknown): candidate is EyeDropperHost {
|
|
73
|
+
return typeof candidate === "function";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function browserEyeDropper(): EyeDropperHost | undefined {
|
|
77
|
+
if (typeof window === "undefined") return undefined;
|
|
78
|
+
const candidate: unknown = Reflect.get(window, "EyeDropper");
|
|
79
|
+
return isEyeDropperHost(candidate) ? candidate : undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function isAbort(error: unknown): boolean {
|
|
83
|
+
return (
|
|
84
|
+
typeof error === "object" && error !== null && "name" in error && error.name === "AbortError"
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Pick a color from anywhere on screen with the EyeDropper API.
|
|
90
|
+
*
|
|
91
|
+
* `open` resolves to a discriminated {@link EyeDropperResult}; dismissing
|
|
92
|
+
* the picker (Escape) or aborting via `signal` yields `"cancelled"`.
|
|
93
|
+
* The composable holds no resources beyond an open picker, which the
|
|
94
|
+
* caller controls through `signal`.
|
|
95
|
+
*
|
|
96
|
+
* Server rendering: `supported` is false and `sRGBHex` is `initialValue`.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const { open, sRGBHex, supported } = useEyeDropper();
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @param options Capability and initial color.
|
|
104
|
+
* @default options {}
|
|
105
|
+
* @returns Picker state and the open action.
|
|
106
|
+
*/
|
|
107
|
+
export function useEyeDropper(options: UseEyeDropperOptions = {}): EyeDropperControls {
|
|
108
|
+
const sRGBHex = ref(options.initialValue ?? "");
|
|
109
|
+
const picking = ref(false);
|
|
110
|
+
const resolveHost = (): EyeDropperHost | undefined =>
|
|
111
|
+
options.host === undefined ? browserEyeDropper() : (unref(options.host) ?? undefined);
|
|
112
|
+
|
|
113
|
+
const open = async (signal?: AbortSignal): Promise<EyeDropperResult> => {
|
|
114
|
+
const Host = resolveHost();
|
|
115
|
+
if (!Host) return { status: "unsupported", error: undefined };
|
|
116
|
+
picking.value = true;
|
|
117
|
+
try {
|
|
118
|
+
const color = await new Host().open(signal === undefined ? {} : { signal });
|
|
119
|
+
sRGBHex.value = color.sRGBHex;
|
|
120
|
+
return { status: "picked", sRGBHex: color.sRGBHex };
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return { status: isAbort(error) ? "cancelled" : "failed", error };
|
|
123
|
+
} finally {
|
|
124
|
+
picking.value = false;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
supported: computed(() => resolveHost() !== undefined),
|
|
130
|
+
sRGBHex: readonly(sRGBHex),
|
|
131
|
+
picking: readonly(picking),
|
|
132
|
+
open,
|
|
133
|
+
};
|
|
134
|
+
}
|