@vizejs/composable 0.426.3 → 0.428.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { retryAsync } from "./retry-async.mjs";
|
|
3
|
+
import { computed, readonly, shallowRef, toValue, watch } from "vue";
|
|
4
|
+
//#region src/use-fetch.ts
|
|
5
|
+
var RetryableFailure = class {
|
|
6
|
+
failure;
|
|
7
|
+
constructor(failure) {
|
|
8
|
+
this.failure = failure;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const TIMEOUT_REASON = "VIZE_COMPOSE_FETCH_TIMEOUT";
|
|
12
|
+
function browserFetch() {
|
|
13
|
+
if (typeof window === "undefined" || typeof window.fetch !== "function") return void 0;
|
|
14
|
+
const fetchImplementation = window.fetch.bind(window);
|
|
15
|
+
return (input, init) => fetchImplementation(input, init);
|
|
16
|
+
}
|
|
17
|
+
function isRetryableStatus(status) {
|
|
18
|
+
return status === 408 || status === 429 || status >= 500;
|
|
19
|
+
}
|
|
20
|
+
function readBody(response, responseType) {
|
|
21
|
+
switch (responseType) {
|
|
22
|
+
case "text": return response.text();
|
|
23
|
+
case "blob": return response.blob();
|
|
24
|
+
case "arrayBuffer": return response.arrayBuffer();
|
|
25
|
+
case "formData": return response.formData();
|
|
26
|
+
default: return response.json();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function assertTimeout(timeoutMs) {
|
|
30
|
+
if (timeoutMs === void 0) return;
|
|
31
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 0) throw new RangeError(`[VIZE_COMPOSE_FETCH_INVALID_TIMEOUT] timeoutMs must be a finite non-negative number; received ${String(timeoutMs)}`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Reactive, abortable, retrying `fetch` with typed decoding and interceptors.
|
|
35
|
+
*
|
|
36
|
+
* Latest wins: starting an execution aborts the pending one, which then
|
|
37
|
+
* settles as `"superseded"` without touching state. The pending request is
|
|
38
|
+
* aborted when the owning reactive scope stops; outside a scope the caller
|
|
39
|
+
* owns `abort()`. Automatic execution (initial and on reactive URL/`init`
|
|
40
|
+
* changes) only happens in a browser or with an explicit `fetch`, so server
|
|
41
|
+
* rendering performs no I/O unless you `await execute()` in
|
|
42
|
+
* `onServerPrefetch`; state then holds `initialData` and status `"idle"`.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const id = ref(1);
|
|
47
|
+
* const { data, error } = useFetch(() => `/api/users/${id.value}`, {
|
|
48
|
+
* validate: isUser,
|
|
49
|
+
* retry: 2,
|
|
50
|
+
* timeoutMs: 5_000,
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @param url Reactive URL; `null`/`undefined` keeps the resource idle.
|
|
55
|
+
* @param options Decoding, retry, timeout, and interceptor options.
|
|
56
|
+
* @default options {}
|
|
57
|
+
* @throws {RangeError} `[VIZE_COMPOSE_FETCH_INVALID_TIMEOUT]` for an invalid timeout.
|
|
58
|
+
* @returns Reactive state and controls.
|
|
59
|
+
*/
|
|
60
|
+
function useFetch(url, options = {}) {
|
|
61
|
+
assertTimeout(options.timeoutMs);
|
|
62
|
+
const data = shallowRef(options.initialData);
|
|
63
|
+
const error = shallowRef(void 0);
|
|
64
|
+
const status = shallowRef("idle");
|
|
65
|
+
const response = shallowRef(void 0);
|
|
66
|
+
const statusCode = computed(() => response.value?.status);
|
|
67
|
+
const pending = computed(() => status.value === "pending");
|
|
68
|
+
const scheduler = options.scheduler ?? {
|
|
69
|
+
setTimeout: (callback, delayMs) => {
|
|
70
|
+
const handle = globalThis.setTimeout(callback, delayMs);
|
|
71
|
+
return () => globalThis.clearTimeout(handle);
|
|
72
|
+
},
|
|
73
|
+
clearTimeout: (cancel) => {
|
|
74
|
+
if (typeof cancel === "function") cancel();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
let active;
|
|
78
|
+
const resolveFetch = () => options.fetch ?? browserFetch();
|
|
79
|
+
const decode = async (result) => options.parse ? options.parse(result) : readBody(result, options.responseType ?? "json");
|
|
80
|
+
const accepts = (candidate) => options.validate ? options.validate(candidate) : true;
|
|
81
|
+
const fail = (failure, record) => {
|
|
82
|
+
if (active !== record) return { status: "superseded" };
|
|
83
|
+
active = void 0;
|
|
84
|
+
error.value = failure;
|
|
85
|
+
status.value = failure.kind === "aborted" ? "aborted" : "error";
|
|
86
|
+
options.onError?.(failure);
|
|
87
|
+
return {
|
|
88
|
+
status: "error",
|
|
89
|
+
error: failure
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const abortFailure = (signal, timeoutMs) => signal.reason === TIMEOUT_REASON && timeoutMs !== void 0 ? {
|
|
93
|
+
kind: "timeout",
|
|
94
|
+
timeoutMs
|
|
95
|
+
} : {
|
|
96
|
+
kind: "aborted",
|
|
97
|
+
reason: signal.reason
|
|
98
|
+
};
|
|
99
|
+
const execute = async () => {
|
|
100
|
+
if (active !== void 0) {
|
|
101
|
+
active.superseded = true;
|
|
102
|
+
active.controller.abort(new DOMException("A newer fetch started.", "AbortError"));
|
|
103
|
+
}
|
|
104
|
+
const record = {
|
|
105
|
+
controller: new AbortController(),
|
|
106
|
+
superseded: false
|
|
107
|
+
};
|
|
108
|
+
active = record;
|
|
109
|
+
const { signal } = record.controller;
|
|
110
|
+
error.value = void 0;
|
|
111
|
+
status.value = "pending";
|
|
112
|
+
const target = toValue(url);
|
|
113
|
+
const fetchImplementation = resolveFetch();
|
|
114
|
+
if (target === null || target === void 0 || fetchImplementation === void 0) return fail({
|
|
115
|
+
kind: "network",
|
|
116
|
+
cause: /* @__PURE__ */ new TypeError(target === null || target === void 0 ? "[VIZE_COMPOSE_FETCH_NO_URL] no request URL is available" : "[VIZE_COMPOSE_FETCH_UNSUPPORTED] no fetch implementation is available")
|
|
117
|
+
}, record);
|
|
118
|
+
const timeoutMs = options.timeoutMs;
|
|
119
|
+
const timer = timeoutMs === void 0 ? void 0 : scheduler.setTimeout(() => record.controller.abort(TIMEOUT_REASON), timeoutMs);
|
|
120
|
+
try {
|
|
121
|
+
let request = {
|
|
122
|
+
url: String(target),
|
|
123
|
+
init: { ...toValue(options.init) }
|
|
124
|
+
};
|
|
125
|
+
if (options.beforeRequest) {
|
|
126
|
+
const replaced = await options.beforeRequest({
|
|
127
|
+
...request,
|
|
128
|
+
signal
|
|
129
|
+
});
|
|
130
|
+
if (replaced === false) record.controller.abort(new DOMException("beforeRequest cancelled the request.", "AbortError"));
|
|
131
|
+
else if (replaced) request = replaced;
|
|
132
|
+
}
|
|
133
|
+
if (signal.aborted) return record.superseded ? { status: "superseded" } : fail(abortFailure(signal, timeoutMs), record);
|
|
134
|
+
const retry = options.retry ?? 0;
|
|
135
|
+
const retryOptions = typeof retry === "number" ? {
|
|
136
|
+
maximumRetries: retry,
|
|
137
|
+
initialDelayMs: 0
|
|
138
|
+
} : retry;
|
|
139
|
+
const userShouldRetry = retryOptions.shouldRetry;
|
|
140
|
+
const attemptOutcome = await retryAsync(async () => {
|
|
141
|
+
let result;
|
|
142
|
+
try {
|
|
143
|
+
result = await fetchImplementation(request.url, {
|
|
144
|
+
...request.init,
|
|
145
|
+
signal
|
|
146
|
+
});
|
|
147
|
+
} catch (cause) {
|
|
148
|
+
throw new RetryableFailure({
|
|
149
|
+
kind: "network",
|
|
150
|
+
cause
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (!result.ok && isRetryableStatus(result.status)) throw new RetryableFailure({
|
|
154
|
+
kind: "http",
|
|
155
|
+
status: result.status,
|
|
156
|
+
response: result
|
|
157
|
+
});
|
|
158
|
+
return result;
|
|
159
|
+
}, {
|
|
160
|
+
...retryOptions,
|
|
161
|
+
signal,
|
|
162
|
+
scheduler,
|
|
163
|
+
shouldRetry: (context) => userShouldRetry ? userShouldRetry(context) : context.error instanceof RetryableFailure
|
|
164
|
+
}).then((result) => ({
|
|
165
|
+
ok: true,
|
|
166
|
+
result
|
|
167
|
+
}), (cause) => ({
|
|
168
|
+
ok: false,
|
|
169
|
+
cause
|
|
170
|
+
}));
|
|
171
|
+
if (!attemptOutcome.ok) {
|
|
172
|
+
if (signal.aborted) return record.superseded ? { status: "superseded" } : fail(abortFailure(signal, timeoutMs), record);
|
|
173
|
+
const { cause } = attemptOutcome;
|
|
174
|
+
if (active === record && cause instanceof RetryableFailure) {
|
|
175
|
+
if (cause.failure.kind === "http") response.value = cause.failure.response;
|
|
176
|
+
return fail(cause.failure, record);
|
|
177
|
+
}
|
|
178
|
+
return fail({
|
|
179
|
+
kind: "network",
|
|
180
|
+
cause
|
|
181
|
+
}, record);
|
|
182
|
+
}
|
|
183
|
+
const result = attemptOutcome.result;
|
|
184
|
+
if (active === record) response.value = result;
|
|
185
|
+
if (!result.ok) return fail({
|
|
186
|
+
kind: "http",
|
|
187
|
+
status: result.status,
|
|
188
|
+
response: result
|
|
189
|
+
}, record);
|
|
190
|
+
let decoded;
|
|
191
|
+
try {
|
|
192
|
+
decoded = await decode(result);
|
|
193
|
+
} catch (cause) {
|
|
194
|
+
if (signal.aborted) return record.superseded ? { status: "superseded" } : fail(abortFailure(signal, timeoutMs), record);
|
|
195
|
+
return fail({
|
|
196
|
+
kind: "parse",
|
|
197
|
+
cause
|
|
198
|
+
}, record);
|
|
199
|
+
}
|
|
200
|
+
if (!accepts(decoded)) return fail({
|
|
201
|
+
kind: "invalid",
|
|
202
|
+
data: decoded
|
|
203
|
+
}, record);
|
|
204
|
+
let value = decoded;
|
|
205
|
+
if (options.afterResponse) {
|
|
206
|
+
const transformed = await options.afterResponse({
|
|
207
|
+
request,
|
|
208
|
+
response: result,
|
|
209
|
+
data: value
|
|
210
|
+
});
|
|
211
|
+
if (transformed !== void 0) value = transformed;
|
|
212
|
+
}
|
|
213
|
+
if (active !== record) return { status: "superseded" };
|
|
214
|
+
active = void 0;
|
|
215
|
+
data.value = value;
|
|
216
|
+
status.value = "success";
|
|
217
|
+
return {
|
|
218
|
+
status: "success",
|
|
219
|
+
data: value,
|
|
220
|
+
response: result
|
|
221
|
+
};
|
|
222
|
+
} catch (cause) {
|
|
223
|
+
return fail({
|
|
224
|
+
kind: "network",
|
|
225
|
+
cause
|
|
226
|
+
}, record);
|
|
227
|
+
} finally {
|
|
228
|
+
if (timer !== void 0) scheduler.clearTimeout(timer);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const abort = (reason = new DOMException("The request was aborted.", "AbortError")) => {
|
|
232
|
+
if (active === void 0) return false;
|
|
233
|
+
active.controller.abort(reason);
|
|
234
|
+
return true;
|
|
235
|
+
};
|
|
236
|
+
if (options.fetch !== void 0 || typeof window !== "undefined") {
|
|
237
|
+
let initial = true;
|
|
238
|
+
tryOnScopeDispose(watch([() => toValue(url), () => toValue(options.init)], ([target]) => {
|
|
239
|
+
const first = initial;
|
|
240
|
+
initial = false;
|
|
241
|
+
if (target === null || target === void 0) return;
|
|
242
|
+
if (first ? options.immediate ?? true : options.refetch ?? true) execute();
|
|
243
|
+
}, {
|
|
244
|
+
immediate: true,
|
|
245
|
+
deep: true
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
tryOnScopeDispose(() => {
|
|
249
|
+
abort(new DOMException("The reactive scope was disposed.", "AbortError"));
|
|
250
|
+
});
|
|
251
|
+
return {
|
|
252
|
+
data,
|
|
253
|
+
error,
|
|
254
|
+
status: readonly(status),
|
|
255
|
+
response,
|
|
256
|
+
statusCode,
|
|
257
|
+
pending,
|
|
258
|
+
execute,
|
|
259
|
+
abort
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
//#endregion
|
|
263
|
+
export { useFetch };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { d as StandardSchemaV1 } from "./standard-schema-DmNgFVK5.mjs";
|
|
2
|
+
import { ComputedRef, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
//#region src/use-field.d.ts
|
|
5
|
+
/** Result of a standalone field validator: messages, one message, or nothing. */
|
|
6
|
+
type FieldRuleResult = string | readonly string[] | null | undefined | void;
|
|
7
|
+
/** Context passed to standalone field validators. */
|
|
8
|
+
interface FieldRuleContext {
|
|
9
|
+
/** Aborted when a newer validation supersedes this one. */
|
|
10
|
+
readonly signal: AbortSignal;
|
|
11
|
+
}
|
|
12
|
+
/** Plain validator for a standalone field. */
|
|
13
|
+
type FieldRule<Value> = (value: Value, context: FieldRuleContext) => FieldRuleResult | Promise<FieldRuleResult>;
|
|
14
|
+
/** A plain validator or a Standard Schema v1 validator for the value. */
|
|
15
|
+
type FieldRuleSource<Value> = FieldRule<Value> | StandardSchemaV1<Value, unknown>;
|
|
16
|
+
/** When a standalone field validates automatically. */
|
|
17
|
+
type FieldValidationTrigger = "change" | "blur" | "manual";
|
|
18
|
+
/** Options for {@link useField}. */
|
|
19
|
+
interface UseFieldOptions<Value> {
|
|
20
|
+
/**
|
|
21
|
+
* Validators run in order; their messages are concatenated.
|
|
22
|
+
*
|
|
23
|
+
* @default []
|
|
24
|
+
*/
|
|
25
|
+
readonly rules?: FieldRuleSource<Value> | readonly FieldRuleSource<Value>[];
|
|
26
|
+
/**
|
|
27
|
+
* When validation runs automatically.
|
|
28
|
+
*
|
|
29
|
+
* @default "change"
|
|
30
|
+
*/
|
|
31
|
+
readonly validateOn?: FieldValidationTrigger;
|
|
32
|
+
/**
|
|
33
|
+
* Field name exposed for `name` attributes and error summaries.
|
|
34
|
+
*
|
|
35
|
+
* @default ""
|
|
36
|
+
*/
|
|
37
|
+
readonly name?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Reactive state and actions returned by {@link useField}. */
|
|
40
|
+
interface FieldControls<Value> {
|
|
41
|
+
/** Field name. */
|
|
42
|
+
readonly name: string;
|
|
43
|
+
/** Writable value (use with `v-model`). */
|
|
44
|
+
readonly value: Ref<Value>;
|
|
45
|
+
/** Current error messages. */
|
|
46
|
+
readonly errors: Readonly<ShallowRef<readonly string[]>>;
|
|
47
|
+
/** First error message. */
|
|
48
|
+
readonly error: ComputedRef<string | undefined>;
|
|
49
|
+
/** Whether no errors are recorded. */
|
|
50
|
+
readonly valid: ComputedRef<boolean>;
|
|
51
|
+
/** Whether the value differs from the initial value. */
|
|
52
|
+
readonly dirty: ComputedRef<boolean>;
|
|
53
|
+
/** Whether the field was blurred. */
|
|
54
|
+
readonly touched: Readonly<Ref<boolean>>;
|
|
55
|
+
/** Whether a validation is pending. */
|
|
56
|
+
readonly validating: Readonly<Ref<boolean>>;
|
|
57
|
+
/** Mark the field touched (wire to `blur`); validates when configured. */
|
|
58
|
+
readonly onBlur: () => void;
|
|
59
|
+
/**
|
|
60
|
+
* Run every rule, aborting an older validation still in flight.
|
|
61
|
+
*
|
|
62
|
+
* @returns Whether the value is valid (`false` also when superseded).
|
|
63
|
+
*/
|
|
64
|
+
readonly validate: () => Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* Replace errors (for example with server errors).
|
|
67
|
+
*
|
|
68
|
+
* @param errors New messages.
|
|
69
|
+
*/
|
|
70
|
+
readonly setErrors: (errors: readonly string[]) => void;
|
|
71
|
+
/**
|
|
72
|
+
* Restore the initial value (or install a new one) and clear state.
|
|
73
|
+
*
|
|
74
|
+
* @param value New initial value.
|
|
75
|
+
*/
|
|
76
|
+
readonly reset: (value?: Value) => void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A standalone validated field, independent of any form.
|
|
80
|
+
*
|
|
81
|
+
* Rules may be plain (a)synchronous validators or Standard Schema v1
|
|
82
|
+
* validators (anything with a `~standard` property). A newer validation
|
|
83
|
+
* aborts older ones through their `signal`, and stale results are ignored.
|
|
84
|
+
* With `validateOn: "change"` validation runs after each value change,
|
|
85
|
+
* never during setup, so server-rendered markup matches the first client
|
|
86
|
+
* render. For multi-field state use `useForm`.
|
|
87
|
+
*
|
|
88
|
+
* Server rendering: pure state; nothing validates during setup. Pending
|
|
89
|
+
* validations are aborted when the owning scope stops.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const email = useField("", {
|
|
94
|
+
* name: "email",
|
|
95
|
+
* rules: [(value) => (value.includes("@") ? undefined : "Invalid email")],
|
|
96
|
+
* });
|
|
97
|
+
* ```
|
|
98
|
+
*
|
|
99
|
+
* @typeParam Value Field value, inferred from `initialValue`.
|
|
100
|
+
* @param initialValue Initial value, or a factory returning it.
|
|
101
|
+
* @param options Rules, trigger, and name.
|
|
102
|
+
* @default options {}
|
|
103
|
+
* @returns Field state and actions.
|
|
104
|
+
*/
|
|
105
|
+
declare function useField<Value>(initialValue: Value | (() => Value), options?: UseFieldOptions<NoInfer<Value>>): FieldControls<Value>;
|
|
106
|
+
//#endregion
|
|
107
|
+
export { FieldControls, FieldRule, FieldRuleContext, FieldRuleResult, FieldRuleSource, FieldValidationTrigger, UseFieldOptions, useField };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { isStandardSchema, validateStandardSchema } from "./standard-schema.mjs";
|
|
3
|
+
import { computed, ref, shallowRef, toRaw, watch } from "vue";
|
|
4
|
+
//#region src/use-field.ts
|
|
5
|
+
function messagesOf(result) {
|
|
6
|
+
if (result === void 0 || result === null || result === "") return [];
|
|
7
|
+
return typeof result === "string" ? [result] : result.filter((message) => message !== "");
|
|
8
|
+
}
|
|
9
|
+
function sameValue(left, right) {
|
|
10
|
+
if (Object.is(left, right)) return true;
|
|
11
|
+
if (left instanceof Date && right instanceof Date) return left.getTime() === right.getTime();
|
|
12
|
+
if (typeof left !== "object" || typeof right !== "object" || left === null || right === null) return false;
|
|
13
|
+
if (Array.isArray(left) !== Array.isArray(right)) return false;
|
|
14
|
+
const leftKeys = Object.keys(left);
|
|
15
|
+
const rightKeys = Object.keys(right);
|
|
16
|
+
return leftKeys.length === rightKeys.length && leftKeys.every((key) => sameValue(Reflect.get(left, key), Reflect.get(right, key)));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A standalone validated field, independent of any form.
|
|
20
|
+
*
|
|
21
|
+
* Rules may be plain (a)synchronous validators or Standard Schema v1
|
|
22
|
+
* validators (anything with a `~standard` property). A newer validation
|
|
23
|
+
* aborts older ones through their `signal`, and stale results are ignored.
|
|
24
|
+
* With `validateOn: "change"` validation runs after each value change,
|
|
25
|
+
* never during setup, so server-rendered markup matches the first client
|
|
26
|
+
* render. For multi-field state use `useForm`.
|
|
27
|
+
*
|
|
28
|
+
* Server rendering: pure state; nothing validates during setup. Pending
|
|
29
|
+
* validations are aborted when the owning scope stops.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const email = useField("", {
|
|
34
|
+
* name: "email",
|
|
35
|
+
* rules: [(value) => (value.includes("@") ? undefined : "Invalid email")],
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @typeParam Value Field value, inferred from `initialValue`.
|
|
40
|
+
* @param initialValue Initial value, or a factory returning it.
|
|
41
|
+
* @param options Rules, trigger, and name.
|
|
42
|
+
* @default options {}
|
|
43
|
+
* @returns Field state and actions.
|
|
44
|
+
*/
|
|
45
|
+
function useField(initialValue, options = {}) {
|
|
46
|
+
const createInitial = () => initialValue instanceof Function ? initialValue() : structuredClone(toRaw(initialValue));
|
|
47
|
+
let initial = createInitial();
|
|
48
|
+
const value = ref(structuredClone(toRaw(initial)));
|
|
49
|
+
const errors = shallowRef([]);
|
|
50
|
+
const touched = ref(false);
|
|
51
|
+
const validating = ref(false);
|
|
52
|
+
const trigger = options.validateOn ?? "change";
|
|
53
|
+
const rules = options.rules === void 0 ? [] : Array.isArray(options.rules) ? options.rules : [options.rules];
|
|
54
|
+
let controller;
|
|
55
|
+
const runRule = async (rule, current, signal) => {
|
|
56
|
+
if (isStandardSchema(rule)) {
|
|
57
|
+
const result = await validateStandardSchema(rule, current);
|
|
58
|
+
return result.status === "valid" ? [] : result.issues.map((issue) => issue.message);
|
|
59
|
+
}
|
|
60
|
+
return messagesOf(await rule(current, { signal }));
|
|
61
|
+
};
|
|
62
|
+
const validate = async () => {
|
|
63
|
+
controller?.abort(new DOMException("A newer validation started.", "AbortError"));
|
|
64
|
+
const active = new AbortController();
|
|
65
|
+
controller = active;
|
|
66
|
+
validating.value = true;
|
|
67
|
+
try {
|
|
68
|
+
const current = value.value;
|
|
69
|
+
const results = await Promise.all(rules.map((rule) => runRule(rule, current, active.signal)));
|
|
70
|
+
if (active.signal.aborted) return false;
|
|
71
|
+
errors.value = results.flat();
|
|
72
|
+
return errors.value.length === 0;
|
|
73
|
+
} finally {
|
|
74
|
+
if (controller === active) {
|
|
75
|
+
controller = void 0;
|
|
76
|
+
validating.value = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
let resetValue;
|
|
81
|
+
if (trigger === "change") watch(value, (current) => {
|
|
82
|
+
if (toRaw(current) === resetValue && sameValue(current, initial)) return;
|
|
83
|
+
validate();
|
|
84
|
+
}, { deep: true });
|
|
85
|
+
tryOnScopeDispose(() => controller?.abort());
|
|
86
|
+
return {
|
|
87
|
+
name: options.name ?? "",
|
|
88
|
+
value,
|
|
89
|
+
errors,
|
|
90
|
+
error: computed(() => errors.value[0]),
|
|
91
|
+
valid: computed(() => errors.value.length === 0),
|
|
92
|
+
dirty: computed(() => !sameValue(value.value, initial)),
|
|
93
|
+
touched,
|
|
94
|
+
validating,
|
|
95
|
+
onBlur: () => {
|
|
96
|
+
touched.value = true;
|
|
97
|
+
if (trigger === "blur") validate();
|
|
98
|
+
},
|
|
99
|
+
validate,
|
|
100
|
+
setErrors: (next) => {
|
|
101
|
+
errors.value = [...next];
|
|
102
|
+
},
|
|
103
|
+
reset: (next) => {
|
|
104
|
+
controller?.abort();
|
|
105
|
+
controller = void 0;
|
|
106
|
+
initial = next === void 0 ? createInitial() : structuredClone(toRaw(next));
|
|
107
|
+
const fresh = structuredClone(toRaw(initial));
|
|
108
|
+
resetValue = fresh;
|
|
109
|
+
value.value = fresh;
|
|
110
|
+
errors.value = [];
|
|
111
|
+
touched.value = false;
|
|
112
|
+
validating.value = false;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
export { useField };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { MaybeRefOrGetter, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-file-dialog.d.ts
|
|
4
|
+
/** Camera facing hint for capture-capable file inputs. */
|
|
5
|
+
type FileDialogCapture = "user" | "environment";
|
|
6
|
+
/** Minimal `<input type="file">` consumed by {@link useFileDialog}. */
|
|
7
|
+
interface FileInputLike extends EventTarget {
|
|
8
|
+
/** Input type; set to `"file"`. */
|
|
9
|
+
type: string;
|
|
10
|
+
/** Accepted MIME types / extensions. */
|
|
11
|
+
accept: string;
|
|
12
|
+
/** Allow selecting multiple files. */
|
|
13
|
+
multiple: boolean;
|
|
14
|
+
/** Selected files. */
|
|
15
|
+
readonly files: ArrayLike<File> | null;
|
|
16
|
+
/** Serialized value; cleared to reset the selection. */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Open the native dialog. */
|
|
19
|
+
click(): void;
|
|
20
|
+
/** Set an attribute (`capture`, `webkitdirectory`). */
|
|
21
|
+
setAttribute(name: string, value: string): void;
|
|
22
|
+
/** Remove an attribute. */
|
|
23
|
+
removeAttribute(name: string): void;
|
|
24
|
+
}
|
|
25
|
+
/** Document capability used to create the hidden input. */
|
|
26
|
+
interface FileDialogHost {
|
|
27
|
+
/** Create an `<input>` element. */
|
|
28
|
+
createElement(tagName: "input"): FileInputLike;
|
|
29
|
+
}
|
|
30
|
+
/** Per-dialog settings accepted by {@link useFileDialog} and `open`. */
|
|
31
|
+
interface FileDialogSettings {
|
|
32
|
+
/** Accepted MIME types / extensions, for example `"image/*,.pdf"`. */
|
|
33
|
+
readonly accept?: string;
|
|
34
|
+
/** Allow selecting multiple files. */
|
|
35
|
+
readonly multiple?: boolean;
|
|
36
|
+
/** Capture from a camera on supporting devices. */
|
|
37
|
+
readonly capture?: FileDialogCapture;
|
|
38
|
+
/** Select a directory (`webkitdirectory`). */
|
|
39
|
+
readonly directory?: boolean;
|
|
40
|
+
/** Clear the current selection before the dialog opens. */
|
|
41
|
+
readonly reset?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** Options for {@link useFileDialog}. */
|
|
44
|
+
interface UseFileDialogOptions {
|
|
45
|
+
/**
|
|
46
|
+
* Accepted MIME types / extensions.
|
|
47
|
+
*
|
|
48
|
+
* @default "*"
|
|
49
|
+
*/
|
|
50
|
+
readonly accept?: MaybeRefOrGetter<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Allow selecting multiple files.
|
|
53
|
+
*
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
readonly multiple?: MaybeRefOrGetter<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Capture from a camera on supporting devices.
|
|
59
|
+
*
|
|
60
|
+
* @default undefined
|
|
61
|
+
*/
|
|
62
|
+
readonly capture?: MaybeRefOrGetter<FileDialogCapture | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Select a directory instead of files.
|
|
65
|
+
*
|
|
66
|
+
* @default false
|
|
67
|
+
*/
|
|
68
|
+
readonly directory?: MaybeRefOrGetter<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Clear the current selection whenever the dialog opens.
|
|
71
|
+
*
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
readonly reset?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Selection before the dialog was used.
|
|
77
|
+
*
|
|
78
|
+
* @default null
|
|
79
|
+
*/
|
|
80
|
+
readonly initialFiles?: readonly File[] | null;
|
|
81
|
+
/**
|
|
82
|
+
* Document capability for alternate runtimes and tests.
|
|
83
|
+
*
|
|
84
|
+
* @default window.document when a browser window exists
|
|
85
|
+
*/
|
|
86
|
+
readonly host?: MaybeRefOrGetter<FileDialogHost | null | undefined>;
|
|
87
|
+
}
|
|
88
|
+
/** Reactive state and actions returned by {@link useFileDialog}. */
|
|
89
|
+
interface FileDialogControls {
|
|
90
|
+
/** Current selection; `null` before any selection or after `reset`. */
|
|
91
|
+
readonly files: Readonly<ShallowRef<readonly File[] | null>>;
|
|
92
|
+
/**
|
|
93
|
+
* Open the native dialog. Browsers require a user gesture.
|
|
94
|
+
*
|
|
95
|
+
* @param overrides Settings overriding the options for this dialog.
|
|
96
|
+
* @returns Whether a dialog could be opened.
|
|
97
|
+
*/
|
|
98
|
+
readonly open: (overrides?: FileDialogSettings) => boolean;
|
|
99
|
+
/** Clear the selection. */
|
|
100
|
+
readonly reset: () => void;
|
|
101
|
+
/**
|
|
102
|
+
* Observe selections.
|
|
103
|
+
*
|
|
104
|
+
* @param handler Called with the new selection.
|
|
105
|
+
* @returns Unsubscribe function.
|
|
106
|
+
*/
|
|
107
|
+
readonly onChange: (handler: (files: readonly File[] | null) => void) => () => void;
|
|
108
|
+
/**
|
|
109
|
+
* Observe dialogs dismissed without a selection.
|
|
110
|
+
*
|
|
111
|
+
* @param handler Called on cancel.
|
|
112
|
+
* @returns Unsubscribe function.
|
|
113
|
+
*/
|
|
114
|
+
readonly onCancel: (handler: () => void) => () => void;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Open the native file picker without rendering an input.
|
|
118
|
+
*
|
|
119
|
+
* A detached `<input type="file">` is created lazily on the first `open`
|
|
120
|
+
* (never during setup or server rendering), configured from reactive
|
|
121
|
+
* options plus per-call overrides, and observed for `change` and `cancel`.
|
|
122
|
+
* The selection is exposed as a readonly `File[]`. Listeners are removed
|
|
123
|
+
* when the owning reactive scope stops.
|
|
124
|
+
*
|
|
125
|
+
* Server rendering: `files` is `initialFiles` and `open` returns false.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* const { files, open, onChange } = useFileDialog({ accept: "image/*" });
|
|
130
|
+
* onChange((selection) => upload(selection));
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @param options Dialog settings, initial selection, and capability.
|
|
134
|
+
* @default options {}
|
|
135
|
+
* @returns Selection state and dialog actions.
|
|
136
|
+
*/
|
|
137
|
+
declare function useFileDialog(options?: UseFileDialogOptions): FileDialogControls;
|
|
138
|
+
//#endregion
|
|
139
|
+
export { FileDialogCapture, FileDialogControls, FileDialogHost, FileDialogSettings, FileInputLike, UseFileDialogOptions, useFileDialog };
|