@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,154 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { readonly, ref, shallowRef, toValue, unref, watch } from "vue";
|
|
3
|
+
//#region src/use-drop-zone.ts
|
|
4
|
+
function matchesPattern(pattern, file) {
|
|
5
|
+
const normalized = pattern.trim().toLowerCase();
|
|
6
|
+
if (normalized === "" || normalized === "*" || normalized === "*/*") return true;
|
|
7
|
+
if (normalized.startsWith(".")) return file.name === "" || file.name.toLowerCase().endsWith(normalized);
|
|
8
|
+
const type = file.type.toLowerCase();
|
|
9
|
+
if (normalized.endsWith("/*")) return type.startsWith(normalized.slice(0, -1));
|
|
10
|
+
return type === normalized;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Test a file against `accept`-attribute style patterns.
|
|
14
|
+
*
|
|
15
|
+
* Supports exact MIME types, wildcard subtypes (`"image/*"`), extensions
|
|
16
|
+
* (`".png"`, case-insensitive), and `"*"`. An empty pattern list accepts
|
|
17
|
+
* everything. An empty `name` (the file is still being dragged) makes
|
|
18
|
+
* extension patterns match provisionally.
|
|
19
|
+
*
|
|
20
|
+
* @param accept Patterns to test.
|
|
21
|
+
* @param file File name and MIME type.
|
|
22
|
+
* @returns Whether any pattern matches.
|
|
23
|
+
*/
|
|
24
|
+
function matchesAccept(accept, file) {
|
|
25
|
+
return accept.length === 0 || accept.some((pattern) => matchesPattern(pattern, file));
|
|
26
|
+
}
|
|
27
|
+
function dataTransferOf(event) {
|
|
28
|
+
if (!("dataTransfer" in event)) return void 0;
|
|
29
|
+
const transfer = event.dataTransfer;
|
|
30
|
+
if (typeof transfer !== "object" || transfer === null || !("files" in transfer)) return void 0;
|
|
31
|
+
return isDataTransfer(transfer) ? transfer : void 0;
|
|
32
|
+
}
|
|
33
|
+
function isDataTransfer(candidate) {
|
|
34
|
+
return "files" in candidate && "dropEffect" in candidate;
|
|
35
|
+
}
|
|
36
|
+
function draggedTypes(transfer) {
|
|
37
|
+
const types = [];
|
|
38
|
+
const items = transfer.items;
|
|
39
|
+
if (!items) return types;
|
|
40
|
+
for (let index = 0; index < items.length; index += 1) {
|
|
41
|
+
const item = items[index];
|
|
42
|
+
if (item?.kind === "file") types.push(item.type);
|
|
43
|
+
}
|
|
44
|
+
return types;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Headless drop-zone logic for any element.
|
|
48
|
+
*
|
|
49
|
+
* Tracks whether a drag is over the target (a nesting counter keeps
|
|
50
|
+
* `dragleave` from child elements from flickering the state), decides
|
|
51
|
+
* acceptance from the dragged MIME types while dragging, and filters the
|
|
52
|
+
* dropped files by `accept` (including extension patterns) and `multiple`.
|
|
53
|
+
* Rejected drags show the `"none"` drop effect. Rendering is entirely up to
|
|
54
|
+
* the caller. Listeners follow the reactive target and are removed when the
|
|
55
|
+
* owning reactive scope stops.
|
|
56
|
+
*
|
|
57
|
+
* Server rendering: no listener is attached; all state is empty/false.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const zone = useTemplateRef<HTMLElement>("zone");
|
|
62
|
+
* const { isOverDropZone, files } = useDropZone(zone, { accept: ["image/*"] });
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @param target Reactive drop target.
|
|
66
|
+
* @param options Acceptance rules and lifecycle callbacks.
|
|
67
|
+
* @default options {}
|
|
68
|
+
* @returns Drag and drop state.
|
|
69
|
+
*/
|
|
70
|
+
function useDropZone(target, options = {}) {
|
|
71
|
+
const isOverDropZone = ref(false);
|
|
72
|
+
const accepted = ref(false);
|
|
73
|
+
const files = shallowRef(null);
|
|
74
|
+
let depth = 0;
|
|
75
|
+
const acceptsTypes = (types) => {
|
|
76
|
+
const accept = unref(options.accept);
|
|
77
|
+
if (types.length === 0) return false;
|
|
78
|
+
if (!(toValue(options.multiple) ?? true) && types.length > 1) return false;
|
|
79
|
+
if (accept === void 0) return true;
|
|
80
|
+
if (typeof accept === "function") return accept(types);
|
|
81
|
+
return types.every((type) => matchesAccept(accept, {
|
|
82
|
+
name: "",
|
|
83
|
+
type
|
|
84
|
+
}));
|
|
85
|
+
};
|
|
86
|
+
const acceptedFiles = (transfer) => {
|
|
87
|
+
const dropped = Array.from(transfer.files);
|
|
88
|
+
const accept = unref(options.accept);
|
|
89
|
+
const matching = accept === void 0 ? dropped : typeof accept === "function" ? accept(dropped.map((file) => file.type)) ? dropped : [] : dropped.filter((file) => matchesAccept(accept, file));
|
|
90
|
+
if (matching.length !== dropped.length) return [];
|
|
91
|
+
return !(toValue(options.multiple) ?? true) && matching.length > 1 ? [] : matching;
|
|
92
|
+
};
|
|
93
|
+
const settleDefault = (event, transfer) => {
|
|
94
|
+
if (accepted.value || (options.preventDefaultForUnhandled ?? false)) event.preventDefault();
|
|
95
|
+
if (transfer) transfer.dropEffect = accepted.value ? "copy" : "none";
|
|
96
|
+
};
|
|
97
|
+
const onEnter = (event) => {
|
|
98
|
+
const transfer = dataTransferOf(event);
|
|
99
|
+
depth += 1;
|
|
100
|
+
if (depth === 1) {
|
|
101
|
+
accepted.value = transfer !== void 0 && acceptsTypes(draggedTypes(transfer));
|
|
102
|
+
isOverDropZone.value = true;
|
|
103
|
+
options.onEnter?.(event);
|
|
104
|
+
}
|
|
105
|
+
settleDefault(event, transfer);
|
|
106
|
+
};
|
|
107
|
+
const onOver = (event) => {
|
|
108
|
+
settleDefault(event, dataTransferOf(event));
|
|
109
|
+
options.onOver?.(event);
|
|
110
|
+
};
|
|
111
|
+
const onLeave = (event) => {
|
|
112
|
+
depth = Math.max(0, depth - 1);
|
|
113
|
+
if (depth > 0) return;
|
|
114
|
+
isOverDropZone.value = false;
|
|
115
|
+
accepted.value = false;
|
|
116
|
+
options.onLeave?.(event);
|
|
117
|
+
};
|
|
118
|
+
const onDrop = (event) => {
|
|
119
|
+
const transfer = dataTransferOf(event);
|
|
120
|
+
const dropped = transfer ? acceptedFiles(transfer) : [];
|
|
121
|
+
if (dropped.length > 0 || (options.preventDefaultForUnhandled ?? false)) event.preventDefault();
|
|
122
|
+
depth = 0;
|
|
123
|
+
isOverDropZone.value = false;
|
|
124
|
+
accepted.value = false;
|
|
125
|
+
files.value = dropped.length > 0 ? dropped : null;
|
|
126
|
+
options.onDrop?.(files.value, event);
|
|
127
|
+
};
|
|
128
|
+
tryOnScopeDispose(watch(() => toValue(target) ?? void 0, (element, _previous, onCleanup) => {
|
|
129
|
+
depth = 0;
|
|
130
|
+
isOverDropZone.value = false;
|
|
131
|
+
accepted.value = false;
|
|
132
|
+
if (!element) return;
|
|
133
|
+
element.addEventListener("dragenter", onEnter);
|
|
134
|
+
element.addEventListener("dragover", onOver);
|
|
135
|
+
element.addEventListener("dragleave", onLeave);
|
|
136
|
+
element.addEventListener("drop", onDrop);
|
|
137
|
+
onCleanup(() => {
|
|
138
|
+
element.removeEventListener("dragenter", onEnter);
|
|
139
|
+
element.removeEventListener("dragover", onOver);
|
|
140
|
+
element.removeEventListener("dragleave", onLeave);
|
|
141
|
+
element.removeEventListener("drop", onDrop);
|
|
142
|
+
});
|
|
143
|
+
}, {
|
|
144
|
+
immediate: true,
|
|
145
|
+
flush: "sync"
|
|
146
|
+
}));
|
|
147
|
+
return {
|
|
148
|
+
isOverDropZone: readonly(isOverDropZone),
|
|
149
|
+
accepted: readonly(accepted),
|
|
150
|
+
files
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { matchesAccept, useDropZone };
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { t as TimeoutScheduler } from "./timeout-scheduler-CI8RVLZs.mjs";
|
|
2
|
+
import { t as RetryDelayOptions } from "./retry-delay-DYsdq4SE.mjs";
|
|
3
|
+
import { MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
4
|
+
|
|
5
|
+
//#region src/use-event-source.d.ts
|
|
6
|
+
/** Connection status exposed by {@link useEventSource}. */
|
|
7
|
+
type EventSourceStatus = "connecting" | "open" | "closed";
|
|
8
|
+
/** Minimal `EventSource` instance used by {@link useEventSource}. */
|
|
9
|
+
interface EventSourceLike {
|
|
10
|
+
/** `0` connecting, `1` open, `2` closed (native values). */
|
|
11
|
+
readonly readyState: number;
|
|
12
|
+
/** Close the stream; the source never reconnects afterwards. */
|
|
13
|
+
close(): void;
|
|
14
|
+
/** Subscribe to `open`, `error`, or a named server event. */
|
|
15
|
+
addEventListener(type: string, listener: EventListener): void;
|
|
16
|
+
/** Remove a listener registered with `addEventListener`. */
|
|
17
|
+
removeEventListener(type: string, listener: EventListener): void;
|
|
18
|
+
}
|
|
19
|
+
/** Constructor creating {@link EventSourceLike} streams (e.g. `EventSource`). */
|
|
20
|
+
type EventSourceConstructorLike = new (url: string, init?: {
|
|
21
|
+
readonly withCredentials?: boolean;
|
|
22
|
+
}) => EventSourceLike;
|
|
23
|
+
/** Server event map: event name to decoded data type. */
|
|
24
|
+
type EventSourceEventMap = Record<string, unknown>;
|
|
25
|
+
/** Event names of a map whose data is not plain text and therefore needs a parser. */
|
|
26
|
+
type ParsedEventNames<Events extends EventSourceEventMap> = { [Name in keyof Events & string]: [string] extends [Events[Name]] ? never : Name }[keyof Events & string];
|
|
27
|
+
/**
|
|
28
|
+
* Per-event decoders. A decoder is required for every event whose data type
|
|
29
|
+
* cannot hold the raw text, and optional otherwise.
|
|
30
|
+
*/
|
|
31
|
+
type EventSourceParsers<Events extends EventSourceEventMap> = { readonly [Name in ParsedEventNames<Events>]: (raw: string) => Events[Name] } & { readonly [Name in Exclude<keyof Events & string, ParsedEventNames<Events>>]?: (raw: string) => Events[Name] };
|
|
32
|
+
/** One decoded server event, discriminated by `event`. */
|
|
33
|
+
type EventSourceMessage<Events extends EventSourceEventMap> = { readonly [Name in keyof Events & string]: {
|
|
34
|
+
/** Server event name. */readonly event: Name; /** Decoded data. */
|
|
35
|
+
readonly data: Events[Name]; /** `id:` field of the event, or `""`. */
|
|
36
|
+
readonly lastEventId: string;
|
|
37
|
+
} }[keyof Events & string];
|
|
38
|
+
/** Discriminated failure reported by {@link useEventSource}. */
|
|
39
|
+
type EventSourceFailure = {
|
|
40
|
+
/** The stream dispatched an `error` event. */readonly kind: "error"; /** The dispatched event. */
|
|
41
|
+
readonly event: Event;
|
|
42
|
+
} | {
|
|
43
|
+
/** The constructor threw. */readonly kind: "connect"; /** Exact thrown value. */
|
|
44
|
+
readonly cause: unknown;
|
|
45
|
+
} | {
|
|
46
|
+
/** A parser threw. */readonly kind: "parse"; /** Event whose data could not be parsed. */
|
|
47
|
+
readonly event: string; /** Exact thrown value. */
|
|
48
|
+
readonly cause: unknown;
|
|
49
|
+
} | {
|
|
50
|
+
/** Automatic reconnection gave up. */readonly kind: "reconnect-exhausted"; /** Reconnection attempts performed. */
|
|
51
|
+
readonly attempts: number;
|
|
52
|
+
};
|
|
53
|
+
/** Options for reconnecting streams the browser gave up on. */
|
|
54
|
+
interface EventSourceReconnectOptions extends RetryDelayOptions {
|
|
55
|
+
/**
|
|
56
|
+
* Maximum consecutive reconnection attempts.
|
|
57
|
+
*
|
|
58
|
+
* @default Infinity
|
|
59
|
+
*/
|
|
60
|
+
readonly retries?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Called once reconnection gives up.
|
|
63
|
+
*
|
|
64
|
+
* @default undefined
|
|
65
|
+
*/
|
|
66
|
+
readonly onFailed?: () => void;
|
|
67
|
+
}
|
|
68
|
+
/** Options for {@link useEventSource}. */
|
|
69
|
+
interface UseEventSourceOptions<Events extends EventSourceEventMap> {
|
|
70
|
+
/**
|
|
71
|
+
* Named server events to subscribe to.
|
|
72
|
+
*
|
|
73
|
+
* @default ["message"]
|
|
74
|
+
*/
|
|
75
|
+
readonly events?: readonly (keyof Events & string)[];
|
|
76
|
+
/**
|
|
77
|
+
* Per-event decoders (required for events whose data is not text).
|
|
78
|
+
*
|
|
79
|
+
* @default raw text for every event
|
|
80
|
+
*/
|
|
81
|
+
readonly parse?: EventSourceParsers<Events>;
|
|
82
|
+
/**
|
|
83
|
+
* Send cookies with cross-origin requests.
|
|
84
|
+
*
|
|
85
|
+
* @default false
|
|
86
|
+
*/
|
|
87
|
+
readonly withCredentials?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* `EventSource` constructor (a plain value or ref, never a getter).
|
|
90
|
+
* Supplying one also enables automatic connection outside a browser.
|
|
91
|
+
*
|
|
92
|
+
* @default window.EventSource when a browser window exists
|
|
93
|
+
*/
|
|
94
|
+
readonly host?: MaybeRef<EventSourceConstructorLike | null | undefined>;
|
|
95
|
+
/**
|
|
96
|
+
* Connect as soon as a URL is available (browser or explicit host only).
|
|
97
|
+
*
|
|
98
|
+
* @default true
|
|
99
|
+
*/
|
|
100
|
+
readonly immediate?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Reopen the stream with backoff after the browser closes it for good
|
|
103
|
+
* (native reconnection covers transient drops).
|
|
104
|
+
*
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
107
|
+
readonly autoReconnect?: boolean | EventSourceReconnectOptions;
|
|
108
|
+
/**
|
|
109
|
+
* Timer host for reconnection.
|
|
110
|
+
*
|
|
111
|
+
* @default globalThis timer functions
|
|
112
|
+
*/
|
|
113
|
+
readonly scheduler?: TimeoutScheduler;
|
|
114
|
+
/**
|
|
115
|
+
* Observe failures.
|
|
116
|
+
*
|
|
117
|
+
* @default undefined
|
|
118
|
+
*/
|
|
119
|
+
readonly onError?: (failure: EventSourceFailure) => void;
|
|
120
|
+
}
|
|
121
|
+
/** Reactive state and controls returned by {@link useEventSource}. */
|
|
122
|
+
interface EventSourceControls<Events extends EventSourceEventMap> {
|
|
123
|
+
/** Connection status. */
|
|
124
|
+
readonly status: Readonly<Ref<EventSourceStatus>>;
|
|
125
|
+
/** Latest decoded event, discriminated by name. */
|
|
126
|
+
readonly message: Readonly<ShallowRef<EventSourceMessage<Events> | undefined>>;
|
|
127
|
+
/** Data of the latest event. */
|
|
128
|
+
readonly data: Readonly<ShallowRef<Events[keyof Events & string] | undefined>>;
|
|
129
|
+
/** Name of the latest event. */
|
|
130
|
+
readonly event: Readonly<Ref<(keyof Events & string) | undefined>>;
|
|
131
|
+
/** `id:` field of the latest event. */
|
|
132
|
+
readonly lastEventId: Readonly<Ref<string | undefined>>;
|
|
133
|
+
/** Latest failure, cleared when the stream opens. */
|
|
134
|
+
readonly error: Readonly<ShallowRef<EventSourceFailure | undefined>>;
|
|
135
|
+
/** Current underlying source, if any. */
|
|
136
|
+
readonly source: Readonly<ShallowRef<EventSourceLike | undefined>>;
|
|
137
|
+
/**
|
|
138
|
+
* Observe one subscribed event with typed data.
|
|
139
|
+
*
|
|
140
|
+
* @returns A function removing the handler.
|
|
141
|
+
*/
|
|
142
|
+
readonly on: <Name extends keyof Events & string>(event: Name, handler: (data: NoInfer<Events[Name]>, lastEventId: string) => void) => () => void;
|
|
143
|
+
/** Open (or reopen) the stream. */
|
|
144
|
+
readonly open: () => void;
|
|
145
|
+
/** Close the stream and disable reconnection. */
|
|
146
|
+
readonly close: () => void;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Required options when the event map contains non-text data: `parse` must
|
|
150
|
+
* then provide those decoders.
|
|
151
|
+
*/
|
|
152
|
+
type EventSourceParseRequirement<Events extends EventSourceEventMap> = [ParsedEventNames<Events>] extends [never] ? unknown : {
|
|
153
|
+
readonly parse: EventSourceParsers<Events>;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Reactive Server-Sent Events stream with typed, per-event decoding.
|
|
157
|
+
*
|
|
158
|
+
* Every subscribed event is decoded by its parser (raw text by default) and
|
|
159
|
+
* exposed as a discriminated `message`, plus `data`/`event`/`lastEventId`
|
|
160
|
+
* shortcuts and typed `on()` handlers. Transient drops use the browser's
|
|
161
|
+
* native reconnection; `autoReconnect` additionally reopens streams the
|
|
162
|
+
* browser closed for good. The stream and timers are released when the
|
|
163
|
+
* owning reactive scope stops (the caller owns `close()` outside a scope).
|
|
164
|
+
* Server rendering never connects and reports `"closed"`.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```ts
|
|
168
|
+
* const feed = useEventSource<{ price: number; notice: string }>("/stream", {
|
|
169
|
+
* events: ["price", "notice"],
|
|
170
|
+
* parse: { price: (raw) => Number(raw) },
|
|
171
|
+
* });
|
|
172
|
+
* feed.on("price", (price) => chart.push(price));
|
|
173
|
+
* ```
|
|
174
|
+
*
|
|
175
|
+
* @param url Reactive URL; changing it reconnects.
|
|
176
|
+
* @param options Events, decoders, host, and reconnection options.
|
|
177
|
+
* @default options {}
|
|
178
|
+
* @returns Reactive state and controls.
|
|
179
|
+
*/
|
|
180
|
+
declare function useEventSource<Events extends EventSourceEventMap = {
|
|
181
|
+
message: string;
|
|
182
|
+
}>(url: MaybeRefOrGetter<string | URL | null | undefined>, ...[options]: unknown extends EventSourceParseRequirement<Events> ? [options?: UseEventSourceOptions<Events>] : [options: UseEventSourceOptions<Events> & EventSourceParseRequirement<Events>]): EventSourceControls<Events>;
|
|
183
|
+
//#endregion
|
|
184
|
+
export { EventSourceConstructorLike, EventSourceControls, EventSourceEventMap, EventSourceFailure, EventSourceLike, EventSourceMessage, EventSourceParseRequirement, EventSourceParsers, EventSourceReconnectOptions, EventSourceStatus, UseEventSourceOptions, useEventSource };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { calculateRetryDelay } from "./retry-delay.mjs";
|
|
3
|
+
import { readonly, shallowRef, toValue, unref, watch } from "vue";
|
|
4
|
+
//#region src/use-event-source.ts
|
|
5
|
+
const CLOSED = 2;
|
|
6
|
+
function browserEventSource() {
|
|
7
|
+
return typeof window !== "undefined" && typeof window.EventSource === "function" ? window.EventSource : void 0;
|
|
8
|
+
}
|
|
9
|
+
function defaultScheduler() {
|
|
10
|
+
return {
|
|
11
|
+
setTimeout: (callback, delayMs) => {
|
|
12
|
+
const handle = globalThis.setTimeout(callback, delayMs);
|
|
13
|
+
return () => globalThis.clearTimeout(handle);
|
|
14
|
+
},
|
|
15
|
+
clearTimeout: (cancel) => {
|
|
16
|
+
if (typeof cancel === "function") cancel();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function eventData(value) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reactive Server-Sent Events stream with typed, per-event decoding.
|
|
25
|
+
*
|
|
26
|
+
* Every subscribed event is decoded by its parser (raw text by default) and
|
|
27
|
+
* exposed as a discriminated `message`, plus `data`/`event`/`lastEventId`
|
|
28
|
+
* shortcuts and typed `on()` handlers. Transient drops use the browser's
|
|
29
|
+
* native reconnection; `autoReconnect` additionally reopens streams the
|
|
30
|
+
* browser closed for good. The stream and timers are released when the
|
|
31
|
+
* owning reactive scope stops (the caller owns `close()` outside a scope).
|
|
32
|
+
* Server rendering never connects and reports `"closed"`.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const feed = useEventSource<{ price: number; notice: string }>("/stream", {
|
|
37
|
+
* events: ["price", "notice"],
|
|
38
|
+
* parse: { price: (raw) => Number(raw) },
|
|
39
|
+
* });
|
|
40
|
+
* feed.on("price", (price) => chart.push(price));
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @param url Reactive URL; changing it reconnects.
|
|
44
|
+
* @param options Events, decoders, host, and reconnection options.
|
|
45
|
+
* @default options {}
|
|
46
|
+
* @returns Reactive state and controls.
|
|
47
|
+
*/
|
|
48
|
+
function useEventSource(url, ...[options]) {
|
|
49
|
+
const settings = options ?? {};
|
|
50
|
+
const status = shallowRef("closed");
|
|
51
|
+
const message = shallowRef();
|
|
52
|
+
const data = shallowRef();
|
|
53
|
+
const event = shallowRef();
|
|
54
|
+
const lastEventId = shallowRef(void 0);
|
|
55
|
+
const error = shallowRef(void 0);
|
|
56
|
+
const source = shallowRef(void 0);
|
|
57
|
+
const scheduler = settings.scheduler ?? defaultScheduler();
|
|
58
|
+
const reconnect = settings.autoReconnect === true ? {} : settings.autoReconnect || void 0;
|
|
59
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
60
|
+
let attempts = 0;
|
|
61
|
+
let manuallyClosed = false;
|
|
62
|
+
let reconnectTimer;
|
|
63
|
+
let detach;
|
|
64
|
+
const resolveHost = () => settings.host === void 0 ? browserEventSource() : unref(settings.host) ?? void 0;
|
|
65
|
+
const fail = (failure) => {
|
|
66
|
+
error.value = failure;
|
|
67
|
+
settings.onError?.(failure);
|
|
68
|
+
};
|
|
69
|
+
const dispose = () => {
|
|
70
|
+
detach?.();
|
|
71
|
+
detach = void 0;
|
|
72
|
+
source.value?.close();
|
|
73
|
+
source.value = void 0;
|
|
74
|
+
};
|
|
75
|
+
const scheduleReconnect = () => {
|
|
76
|
+
if (!reconnect || manuallyClosed) return;
|
|
77
|
+
if (attempts >= (reconnect.retries ?? Number.POSITIVE_INFINITY)) {
|
|
78
|
+
fail({
|
|
79
|
+
kind: "reconnect-exhausted",
|
|
80
|
+
attempts
|
|
81
|
+
});
|
|
82
|
+
reconnect.onFailed?.();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
attempts += 1;
|
|
86
|
+
reconnectTimer = scheduler.setTimeout(() => {
|
|
87
|
+
reconnectTimer = void 0;
|
|
88
|
+
connect();
|
|
89
|
+
}, calculateRetryDelay(attempts, reconnect));
|
|
90
|
+
};
|
|
91
|
+
const deliver = (name, raw, id) => {
|
|
92
|
+
const parser = settings.parse?.[name];
|
|
93
|
+
let decoded;
|
|
94
|
+
try {
|
|
95
|
+
decoded = eventData(parser ? parser(raw) : raw);
|
|
96
|
+
} catch (cause) {
|
|
97
|
+
fail({
|
|
98
|
+
kind: "parse",
|
|
99
|
+
event: name,
|
|
100
|
+
cause
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
message.value = {
|
|
105
|
+
event: name,
|
|
106
|
+
data: decoded,
|
|
107
|
+
lastEventId: id
|
|
108
|
+
};
|
|
109
|
+
data.value = decoded;
|
|
110
|
+
event.value = name;
|
|
111
|
+
lastEventId.value = id;
|
|
112
|
+
for (const handler of handlers.get(name) ?? []) handler(decoded, id);
|
|
113
|
+
};
|
|
114
|
+
const connect = () => {
|
|
115
|
+
if (reconnectTimer !== void 0) {
|
|
116
|
+
scheduler.clearTimeout(reconnectTimer);
|
|
117
|
+
reconnectTimer = void 0;
|
|
118
|
+
}
|
|
119
|
+
dispose();
|
|
120
|
+
const target = toValue(url);
|
|
121
|
+
const Host = resolveHost();
|
|
122
|
+
if (target === null || target === void 0 || Host === void 0) {
|
|
123
|
+
status.value = "closed";
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
let instance;
|
|
127
|
+
try {
|
|
128
|
+
instance = new Host(String(target), { withCredentials: settings.withCredentials ?? false });
|
|
129
|
+
} catch (cause) {
|
|
130
|
+
status.value = "closed";
|
|
131
|
+
fail({
|
|
132
|
+
kind: "connect",
|
|
133
|
+
cause
|
|
134
|
+
});
|
|
135
|
+
scheduleReconnect();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
source.value = instance;
|
|
139
|
+
status.value = "connecting";
|
|
140
|
+
const onOpen = () => {
|
|
141
|
+
status.value = "open";
|
|
142
|
+
error.value = void 0;
|
|
143
|
+
attempts = 0;
|
|
144
|
+
};
|
|
145
|
+
const onError = (nativeEvent) => {
|
|
146
|
+
fail({
|
|
147
|
+
kind: "error",
|
|
148
|
+
event: nativeEvent
|
|
149
|
+
});
|
|
150
|
+
if (instance.readyState === CLOSED) {
|
|
151
|
+
dispose();
|
|
152
|
+
status.value = "closed";
|
|
153
|
+
scheduleReconnect();
|
|
154
|
+
} else status.value = "connecting";
|
|
155
|
+
};
|
|
156
|
+
const listeners = /* @__PURE__ */ new Map();
|
|
157
|
+
const names = settings.events ?? ["message"];
|
|
158
|
+
for (const name of names) {
|
|
159
|
+
const listener = (nativeEvent) => {
|
|
160
|
+
const raw = "data" in nativeEvent ? nativeEvent.data : "";
|
|
161
|
+
const id = "lastEventId" in nativeEvent ? nativeEvent.lastEventId : "";
|
|
162
|
+
deliver(name, typeof raw === "string" ? raw : String(raw), typeof id === "string" ? id : "");
|
|
163
|
+
};
|
|
164
|
+
listeners.set(name, listener);
|
|
165
|
+
instance.addEventListener(name, listener);
|
|
166
|
+
}
|
|
167
|
+
instance.addEventListener("open", onOpen);
|
|
168
|
+
instance.addEventListener("error", onError);
|
|
169
|
+
detach = () => {
|
|
170
|
+
instance.removeEventListener("open", onOpen);
|
|
171
|
+
instance.removeEventListener("error", onError);
|
|
172
|
+
for (const [name, listener] of listeners) instance.removeEventListener(name, listener);
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
const open = () => {
|
|
176
|
+
manuallyClosed = false;
|
|
177
|
+
attempts = 0;
|
|
178
|
+
connect();
|
|
179
|
+
};
|
|
180
|
+
const close = () => {
|
|
181
|
+
manuallyClosed = true;
|
|
182
|
+
if (reconnectTimer !== void 0) {
|
|
183
|
+
scheduler.clearTimeout(reconnectTimer);
|
|
184
|
+
reconnectTimer = void 0;
|
|
185
|
+
}
|
|
186
|
+
dispose();
|
|
187
|
+
status.value = "closed";
|
|
188
|
+
};
|
|
189
|
+
const on = (name, handler) => {
|
|
190
|
+
const wrapped = (value, id) => {
|
|
191
|
+
handler(eventData(value), id);
|
|
192
|
+
};
|
|
193
|
+
const set = handlers.get(name) ?? /* @__PURE__ */ new Set();
|
|
194
|
+
set.add(wrapped);
|
|
195
|
+
handlers.set(name, set);
|
|
196
|
+
return () => {
|
|
197
|
+
set.delete(wrapped);
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
if (settings.host !== void 0 || typeof window !== "undefined") {
|
|
201
|
+
let initial = true;
|
|
202
|
+
tryOnScopeDispose(watch([() => toValue(url), resolveHost], ([target]) => {
|
|
203
|
+
const first = initial;
|
|
204
|
+
initial = false;
|
|
205
|
+
if (first && !(settings.immediate ?? true)) return;
|
|
206
|
+
if (!first && source.value === void 0 && reconnectTimer === void 0) return;
|
|
207
|
+
if (target === null || target === void 0) close();
|
|
208
|
+
else open();
|
|
209
|
+
}, { immediate: true }));
|
|
210
|
+
}
|
|
211
|
+
tryOnScopeDispose(close);
|
|
212
|
+
return {
|
|
213
|
+
status: readonly(status),
|
|
214
|
+
message,
|
|
215
|
+
data,
|
|
216
|
+
event,
|
|
217
|
+
lastEventId,
|
|
218
|
+
error,
|
|
219
|
+
source,
|
|
220
|
+
on,
|
|
221
|
+
open,
|
|
222
|
+
close
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//#endregion
|
|
226
|
+
export { useEventSource };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRef, Ref } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-eye-dropper.d.ts
|
|
4
|
+
/** Color picked by the EyeDropper API. */
|
|
5
|
+
interface EyeDropperColor {
|
|
6
|
+
/** Picked color as a `#rrggbb` string. */
|
|
7
|
+
readonly sRGBHex: string;
|
|
8
|
+
}
|
|
9
|
+
/** Minimal `EyeDropper` instance. */
|
|
10
|
+
interface EyeDropperLike {
|
|
11
|
+
/** Open the picker. Rejects with AbortError when dismissed or aborted. */
|
|
12
|
+
open(options?: {
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}): Promise<EyeDropperColor>;
|
|
15
|
+
}
|
|
16
|
+
/** Minimal `EyeDropper` constructor. */
|
|
17
|
+
type EyeDropperHost = new () => EyeDropperLike;
|
|
18
|
+
/** Options for {@link useEyeDropper}. */
|
|
19
|
+
interface UseEyeDropperOptions {
|
|
20
|
+
/**
|
|
21
|
+
* EyeDropper constructor for alternate runtimes and tests. A ref (not a
|
|
22
|
+
* getter) because the host itself is a constructor function.
|
|
23
|
+
*
|
|
24
|
+
* @default window.EyeDropper when it exists
|
|
25
|
+
*/
|
|
26
|
+
readonly host?: MaybeRef<EyeDropperHost | null | undefined>;
|
|
27
|
+
/**
|
|
28
|
+
* Initial `sRGBHex` value.
|
|
29
|
+
*
|
|
30
|
+
* @default ""
|
|
31
|
+
*/
|
|
32
|
+
readonly initialValue?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Discriminated outcome of {@link EyeDropperControls.open}. */
|
|
35
|
+
type EyeDropperResult = {
|
|
36
|
+
/** A color was picked. */readonly status: "picked"; /** Picked color. */
|
|
37
|
+
readonly sRGBHex: string;
|
|
38
|
+
} | {
|
|
39
|
+
/** Dismissed/aborted, missing API, or another failure. */readonly status: "cancelled" | "unsupported" | "failed"; /** Exact error thrown by the host, when one was thrown. */
|
|
40
|
+
readonly error: unknown;
|
|
41
|
+
};
|
|
42
|
+
/** Reactive state and actions returned by {@link useEyeDropper}. */
|
|
43
|
+
interface EyeDropperControls {
|
|
44
|
+
/** Whether the EyeDropper API is available. */
|
|
45
|
+
readonly supported: ComputedRef<boolean>;
|
|
46
|
+
/** Most recently picked color. */
|
|
47
|
+
readonly sRGBHex: Readonly<Ref<string>>;
|
|
48
|
+
/** Whether the picker is open. */
|
|
49
|
+
readonly picking: Readonly<Ref<boolean>>;
|
|
50
|
+
/**
|
|
51
|
+
* Open the picker. Browsers require a user gesture.
|
|
52
|
+
*
|
|
53
|
+
* @param signal Aborts the open picker.
|
|
54
|
+
* @returns The discriminated outcome; never rejects.
|
|
55
|
+
*/
|
|
56
|
+
readonly open: (signal?: AbortSignal) => Promise<EyeDropperResult>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Pick a color from anywhere on screen with the EyeDropper API.
|
|
60
|
+
*
|
|
61
|
+
* `open` resolves to a discriminated {@link EyeDropperResult}; dismissing
|
|
62
|
+
* the picker (Escape) or aborting via `signal` yields `"cancelled"`.
|
|
63
|
+
* The composable holds no resources beyond an open picker, which the
|
|
64
|
+
* caller controls through `signal`.
|
|
65
|
+
*
|
|
66
|
+
* Server rendering: `supported` is false and `sRGBHex` is `initialValue`.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* const { open, sRGBHex, supported } = useEyeDropper();
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @param options Capability and initial color.
|
|
74
|
+
* @default options {}
|
|
75
|
+
* @returns Picker state and the open action.
|
|
76
|
+
*/
|
|
77
|
+
declare function useEyeDropper(options?: UseEyeDropperOptions): EyeDropperControls;
|
|
78
|
+
//#endregion
|
|
79
|
+
export { EyeDropperColor, EyeDropperControls, EyeDropperHost, EyeDropperLike, EyeDropperResult, UseEyeDropperOptions, useEyeDropper };
|