@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,482 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { validateStandardSchema } from "./standard-schema.mjs";
|
|
3
|
+
import { computed, ref, shallowRef, toRaw, triggerRef } from "vue";
|
|
4
|
+
//#region src/use-form.ts
|
|
5
|
+
function isContainer(value) {
|
|
6
|
+
if (Array.isArray(value)) return true;
|
|
7
|
+
if (typeof value !== "object" || value === null) return false;
|
|
8
|
+
const prototype = Object.getPrototypeOf(value);
|
|
9
|
+
return prototype === Object.prototype || prototype === null;
|
|
10
|
+
}
|
|
11
|
+
function splitPath(path) {
|
|
12
|
+
return path === "" ? [] : path.split(".");
|
|
13
|
+
}
|
|
14
|
+
function readChild(container, key) {
|
|
15
|
+
return Array.isArray(container) ? container[Number(key)] : container[key];
|
|
16
|
+
}
|
|
17
|
+
function writeChild(container, key, value) {
|
|
18
|
+
if (Array.isArray(container)) container[Number(key)] = value;
|
|
19
|
+
else container[key] = value;
|
|
20
|
+
}
|
|
21
|
+
/** Read a dotted path. */
|
|
22
|
+
function readPath(root, path) {
|
|
23
|
+
let current = root;
|
|
24
|
+
for (const key of splitPath(path)) {
|
|
25
|
+
if (!isContainer(current)) return void 0;
|
|
26
|
+
current = readChild(current, key);
|
|
27
|
+
}
|
|
28
|
+
return current;
|
|
29
|
+
}
|
|
30
|
+
/** Write a dotted path, creating intermediate containers. */
|
|
31
|
+
function writePath(root, path, value) {
|
|
32
|
+
const keys = splitPath(path);
|
|
33
|
+
const last = keys.at(-1);
|
|
34
|
+
if (last === void 0 || !isContainer(root)) return;
|
|
35
|
+
let current = root;
|
|
36
|
+
for (let index = 0; index < keys.length - 1; index += 1) {
|
|
37
|
+
const key = keys[index] ?? "";
|
|
38
|
+
let next = readChild(current, key);
|
|
39
|
+
if (!isContainer(next)) {
|
|
40
|
+
next = /^\d+$/.test(keys[index + 1] ?? "") ? [] : {};
|
|
41
|
+
writeChild(current, key, next);
|
|
42
|
+
}
|
|
43
|
+
if (!isContainer(next)) return;
|
|
44
|
+
current = next;
|
|
45
|
+
}
|
|
46
|
+
writeChild(current, last, value);
|
|
47
|
+
}
|
|
48
|
+
function cloneValue(value) {
|
|
49
|
+
return structuredClone(toRaw(value));
|
|
50
|
+
}
|
|
51
|
+
function deepEqual(left, right) {
|
|
52
|
+
if (Object.is(left, right)) return true;
|
|
53
|
+
if (left instanceof Date && right instanceof Date) return left.getTime() === right.getTime();
|
|
54
|
+
if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((item, index) => deepEqual(item, right[index]));
|
|
55
|
+
if (isContainer(left) && isContainer(right) && !Array.isArray(left) && !Array.isArray(right)) {
|
|
56
|
+
const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
57
|
+
for (const key of keys) if (!deepEqual(left[key], right[key])) return false;
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
function toMessages(result) {
|
|
63
|
+
if (result === void 0 || result === null || result === "") return [];
|
|
64
|
+
return typeof result === "string" ? [result] : result.filter((message) => message !== "");
|
|
65
|
+
}
|
|
66
|
+
function unknownMessages(result) {
|
|
67
|
+
if (typeof result === "string") return result === "" ? [] : [result];
|
|
68
|
+
if (!Array.isArray(result)) return [];
|
|
69
|
+
return result.filter((message) => typeof message === "string" && message !== "");
|
|
70
|
+
}
|
|
71
|
+
/** Rewrite `${arrayPath}.${index}…` keys through an index mapping (undefined drops). */
|
|
72
|
+
function remapKeys(entries, arrayPath, mapIndex) {
|
|
73
|
+
const prefix = `${arrayPath}.`;
|
|
74
|
+
const result = [];
|
|
75
|
+
for (const [key, entry] of entries) {
|
|
76
|
+
if (!key.startsWith(prefix)) {
|
|
77
|
+
result.push([key, entry]);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const rest = key.slice(prefix.length);
|
|
81
|
+
const dot = rest.indexOf(".");
|
|
82
|
+
const indexText = dot === -1 ? rest : rest.slice(0, dot);
|
|
83
|
+
const mapped = /^\d+$/.test(indexText) ? mapIndex(Number(indexText)) : NaN;
|
|
84
|
+
if (mapped === void 0) continue;
|
|
85
|
+
if (Number.isNaN(mapped)) {
|
|
86
|
+
result.push([key, entry]);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
result.push([`${prefix}${String(mapped)}${dot === -1 ? "" : rest.slice(dot)}`, entry]);
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Fully typed form state with validation, field arrays, and submission.
|
|
95
|
+
*
|
|
96
|
+
* The value type is inferred from `initialValues`; every path is a
|
|
97
|
+
* template-literal key, so `field("address.city")` returns controls whose
|
|
98
|
+
* `value` is typed as the city's type and misspelled paths do not compile.
|
|
99
|
+
* Validation combines a Standard Schema v1 validator (Zod, Valibot, ArkType,
|
|
100
|
+
* … via the `~standard` protocol), a whole-form validator, and per-field
|
|
101
|
+
* validators; all may be asynchronous. A newer validation aborts older ones
|
|
102
|
+
* through their `signal` and their results are discarded, so a slow check
|
|
103
|
+
* can never overwrite fresher errors.
|
|
104
|
+
*
|
|
105
|
+
* This composable owns the *values*. `@vizejs/ui/form` owns accessible
|
|
106
|
+
* error presentation (error summaries, focus management, native constraint
|
|
107
|
+
* validation); feed {@link FormControls.errors} into it to render them.
|
|
108
|
+
*
|
|
109
|
+
* Server rendering: pure state, no host access; validation never runs
|
|
110
|
+
* automatically during setup, so server and client render the same markup.
|
|
111
|
+
* Pending validations are aborted when the owning scope stops.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* const form = useForm({
|
|
116
|
+
* initialValues: { name: "", address: { city: "" }, tags: [] as string[] },
|
|
117
|
+
* validators: { name: (name) => (name ? undefined : "Required") },
|
|
118
|
+
* onSubmit: (values) => api.save(values),
|
|
119
|
+
* });
|
|
120
|
+
* const city = form.field("address.city"); // city.value: Ref<string>
|
|
121
|
+
* const tags = form.fieldArray("tags");
|
|
122
|
+
* tags.append("vue");
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* @typeParam Values Form values, inferred from `initialValues`.
|
|
126
|
+
* @typeParam Output Submitted value, inferred from `schema` (defaults to `Values`).
|
|
127
|
+
* @param options Initial values, validators, triggers, and submit handler.
|
|
128
|
+
* @returns Form state and actions.
|
|
129
|
+
*/
|
|
130
|
+
function useForm(options) {
|
|
131
|
+
const createInitial = () => typeof options.initialValues === "function" ? options.initialValues() : cloneValue(options.initialValues);
|
|
132
|
+
let initial = createInitial();
|
|
133
|
+
const values = ref(cloneValue(initial));
|
|
134
|
+
const errors = shallowRef({});
|
|
135
|
+
const touched = shallowRef(/* @__PURE__ */ new Set());
|
|
136
|
+
const pending = ref(/* @__PURE__ */ new Map());
|
|
137
|
+
const submitting = ref(false);
|
|
138
|
+
const submitCount = ref(0);
|
|
139
|
+
const arrayKeys = /* @__PURE__ */ new Map();
|
|
140
|
+
let nextKey = 0;
|
|
141
|
+
let formController;
|
|
142
|
+
const fieldControllers = /* @__PURE__ */ new Map();
|
|
143
|
+
const validators = Object.entries(options.validators ?? {});
|
|
144
|
+
const runValidator = (validator, path, snapshot, signal) => {
|
|
145
|
+
if (typeof validator !== "function") return Promise.resolve([]);
|
|
146
|
+
const outcome = Reflect.apply(validator, void 0, [readPath(snapshot, path), {
|
|
147
|
+
values: snapshot,
|
|
148
|
+
path,
|
|
149
|
+
signal
|
|
150
|
+
}]);
|
|
151
|
+
return Promise.resolve(outcome).then(unknownMessages);
|
|
152
|
+
};
|
|
153
|
+
const trigger = () => submitCount.value > 0 ? options.revalidateOn ?? "change" : options.validateOn ?? "submit";
|
|
154
|
+
const beginPending = (path) => {
|
|
155
|
+
pending.value.set(path, (pending.value.get(path) ?? 0) + 1);
|
|
156
|
+
};
|
|
157
|
+
const endPending = (path) => {
|
|
158
|
+
const count = (pending.value.get(path) ?? 1) - 1;
|
|
159
|
+
if (count <= 0) pending.value.delete(path);
|
|
160
|
+
else pending.value.set(path, count);
|
|
161
|
+
};
|
|
162
|
+
const setErrorsFor = (path, messages) => {
|
|
163
|
+
const next = { ...errors.value };
|
|
164
|
+
if (messages.length === 0) Reflect.deleteProperty(next, path);
|
|
165
|
+
else next[path] = messages;
|
|
166
|
+
errors.value = next;
|
|
167
|
+
};
|
|
168
|
+
const readFieldValidator = (path) => validators.find(([candidate]) => candidate === path)?.[1];
|
|
169
|
+
/** Collect every error source; resolves to errors keyed by path. */
|
|
170
|
+
const collectErrors = async (signal) => {
|
|
171
|
+
const snapshot = values.value;
|
|
172
|
+
const collected = {};
|
|
173
|
+
const add = (path, messages) => {
|
|
174
|
+
if (messages.length === 0) return;
|
|
175
|
+
(collected[path] ??= []).push(...messages);
|
|
176
|
+
};
|
|
177
|
+
let output = snapshot;
|
|
178
|
+
const tasks = [];
|
|
179
|
+
if (options.schema) {
|
|
180
|
+
const schema = options.schema;
|
|
181
|
+
tasks.push(validateStandardSchema(schema, cloneValue(snapshot)).then((result) => {
|
|
182
|
+
if (result.status === "valid") output = result.value;
|
|
183
|
+
else for (const issue of result.issues) add(issue.path, [issue.message]);
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
if (options.validate) {
|
|
187
|
+
const validate = options.validate;
|
|
188
|
+
tasks.push(Promise.resolve(validate(snapshot, { signal })).then((result) => {
|
|
189
|
+
if (!result) return;
|
|
190
|
+
for (const [path, messages] of Object.entries(result)) if (messages !== void 0) add(path, toMessages(messages));
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
for (const [path, validator] of validators) tasks.push(runValidator(validator, path, snapshot, signal).then((messages) => add(path, messages)));
|
|
194
|
+
await Promise.all(tasks);
|
|
195
|
+
return {
|
|
196
|
+
errors: collected,
|
|
197
|
+
output
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
const validate = async () => {
|
|
201
|
+
formController?.abort(new DOMException("A newer validation started.", "AbortError"));
|
|
202
|
+
for (const controller of fieldControllers.values()) controller.abort();
|
|
203
|
+
fieldControllers.clear();
|
|
204
|
+
const controller = new AbortController();
|
|
205
|
+
formController = controller;
|
|
206
|
+
beginPending("");
|
|
207
|
+
try {
|
|
208
|
+
const outcome = await collectErrors(controller.signal);
|
|
209
|
+
if (controller.signal.aborted) return { status: "superseded" };
|
|
210
|
+
errors.value = outcome.errors;
|
|
211
|
+
if (Object.keys(outcome.errors).length > 0) return {
|
|
212
|
+
status: "invalid",
|
|
213
|
+
errors: { ...outcome.errors }
|
|
214
|
+
};
|
|
215
|
+
return {
|
|
216
|
+
status: "valid",
|
|
217
|
+
value: outcome.output
|
|
218
|
+
};
|
|
219
|
+
} finally {
|
|
220
|
+
endPending("");
|
|
221
|
+
if (formController === controller) formController = void 0;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
const schemaIssuesFor = async (path) => {
|
|
225
|
+
if (!options.schema) return [];
|
|
226
|
+
const result = await validateStandardSchema(options.schema, cloneValue(values.value));
|
|
227
|
+
if (result.status === "valid") return [];
|
|
228
|
+
return result.issues.filter((issue) => issue.path === path).map((issue) => issue.message);
|
|
229
|
+
};
|
|
230
|
+
const validateField = async (path) => {
|
|
231
|
+
fieldControllers.get(path)?.abort();
|
|
232
|
+
const controller = new AbortController();
|
|
233
|
+
fieldControllers.set(path, controller);
|
|
234
|
+
beginPending(path);
|
|
235
|
+
try {
|
|
236
|
+
const validator = readFieldValidator(path);
|
|
237
|
+
const snapshot = values.value;
|
|
238
|
+
const [own, fromSchema, fromForm] = await Promise.all([
|
|
239
|
+
runValidator(validator, path, snapshot, controller.signal),
|
|
240
|
+
schemaIssuesFor(path),
|
|
241
|
+
options.validate ? Promise.resolve(options.validate(snapshot, { signal: controller.signal })).then((result) => {
|
|
242
|
+
const messages = result ? Reflect.get(result, path) : void 0;
|
|
243
|
+
return Array.isArray(messages) ? messages.filter((message) => typeof message === "string") : [];
|
|
244
|
+
}) : Promise.resolve([])
|
|
245
|
+
]);
|
|
246
|
+
if (controller.signal.aborted) return false;
|
|
247
|
+
const messages = [
|
|
248
|
+
...fromSchema,
|
|
249
|
+
...fromForm,
|
|
250
|
+
...own
|
|
251
|
+
];
|
|
252
|
+
setErrorsFor(path, messages);
|
|
253
|
+
return messages.length === 0;
|
|
254
|
+
} finally {
|
|
255
|
+
endPending(path);
|
|
256
|
+
if (fieldControllers.get(path) === controller) fieldControllers.delete(path);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
const touch = (path) => {
|
|
260
|
+
if (touched.value.has(path)) return;
|
|
261
|
+
const next = new Set(touched.value);
|
|
262
|
+
next.add(path);
|
|
263
|
+
touched.value = next;
|
|
264
|
+
};
|
|
265
|
+
const setValueAt = (path, value, setOptions = {}) => {
|
|
266
|
+
writePath(values.value, path, value);
|
|
267
|
+
if (setOptions.touch) touch(path);
|
|
268
|
+
if (setOptions.validate ?? trigger() === "change") validateField(path);
|
|
269
|
+
};
|
|
270
|
+
const syncKeys = (path, length) => {
|
|
271
|
+
let keys = arrayKeys.get(path);
|
|
272
|
+
if (!keys) {
|
|
273
|
+
keys = [];
|
|
274
|
+
arrayKeys.set(path, keys);
|
|
275
|
+
}
|
|
276
|
+
while (keys.length < length) keys.push(nextKey++);
|
|
277
|
+
if (keys.length > length) keys.length = length;
|
|
278
|
+
return keys;
|
|
279
|
+
};
|
|
280
|
+
const readArray = (path) => {
|
|
281
|
+
const current = readPath(values.value, path);
|
|
282
|
+
if (Array.isArray(current)) return current;
|
|
283
|
+
const created = [];
|
|
284
|
+
writePath(values.value, path, created);
|
|
285
|
+
return created;
|
|
286
|
+
};
|
|
287
|
+
const remapState = (path, mapIndex) => {
|
|
288
|
+
errors.value = Object.fromEntries(remapKeys(Object.entries(errors.value), path, mapIndex));
|
|
289
|
+
touched.value = new Set(remapKeys([...touched.value].map((key) => [key, true]), path, mapIndex).map(([key]) => key));
|
|
290
|
+
};
|
|
291
|
+
const keysVersion = shallowRef(0);
|
|
292
|
+
const bumpKeys = () => {
|
|
293
|
+
keysVersion.value += 1;
|
|
294
|
+
triggerRef(keysVersion);
|
|
295
|
+
};
|
|
296
|
+
const field = (path) => {
|
|
297
|
+
const key = path;
|
|
298
|
+
const read = () => readPath(values.value, key);
|
|
299
|
+
return {
|
|
300
|
+
path,
|
|
301
|
+
value: computed({
|
|
302
|
+
get: read,
|
|
303
|
+
set: (next) => setValueAt(key, next)
|
|
304
|
+
}),
|
|
305
|
+
errors: computed(() => errors.value[key] ?? []),
|
|
306
|
+
error: computed(() => errors.value[key]?.[0]),
|
|
307
|
+
dirty: computed(() => !deepEqual(readPath(values.value, key), readPath(initial, key))),
|
|
308
|
+
touched: computed(() => touched.value.has(key)),
|
|
309
|
+
validating: computed(() => pending.value.has(key) || pending.value.has("")),
|
|
310
|
+
onBlur: () => {
|
|
311
|
+
touch(key);
|
|
312
|
+
if (trigger() === "blur") validateField(key);
|
|
313
|
+
},
|
|
314
|
+
validate: () => validateField(key),
|
|
315
|
+
reset: () => {
|
|
316
|
+
writePath(values.value, key, cloneValue(readPath(initial, key)));
|
|
317
|
+
setErrorsFor(key, []);
|
|
318
|
+
const next = new Set(touched.value);
|
|
319
|
+
next.delete(key);
|
|
320
|
+
touched.value = next;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
};
|
|
324
|
+
const fieldArray = (path) => {
|
|
325
|
+
const key = path;
|
|
326
|
+
const afterChange = () => {
|
|
327
|
+
bumpKeys();
|
|
328
|
+
if (trigger() === "change") validateField(key);
|
|
329
|
+
};
|
|
330
|
+
const insertAt = (index, items) => {
|
|
331
|
+
const array = readArray(key);
|
|
332
|
+
const keys = syncKeys(key, array.length);
|
|
333
|
+
const at = Math.max(0, Math.min(index, array.length));
|
|
334
|
+
remapState(key, (old) => old >= at ? old + items.length : old);
|
|
335
|
+
array.splice(at, 0, ...items);
|
|
336
|
+
keys.splice(at, 0, ...items.map(() => nextKey++));
|
|
337
|
+
afterChange();
|
|
338
|
+
};
|
|
339
|
+
return {
|
|
340
|
+
entries: computed(() => {
|
|
341
|
+
keysVersion.value;
|
|
342
|
+
const array = readPath(values.value, key);
|
|
343
|
+
if (!Array.isArray(array)) return [];
|
|
344
|
+
const keys = syncKeys(key, array.length);
|
|
345
|
+
return array.map((value, index) => ({
|
|
346
|
+
key: keys[index] ?? index,
|
|
347
|
+
index,
|
|
348
|
+
path: `${path}.${index}`,
|
|
349
|
+
value
|
|
350
|
+
}));
|
|
351
|
+
}),
|
|
352
|
+
append: (...items) => insertAt(Number.MAX_SAFE_INTEGER, items),
|
|
353
|
+
prepend: (...items) => insertAt(0, items),
|
|
354
|
+
insert: (index, item) => insertAt(index, [item]),
|
|
355
|
+
remove: (index) => {
|
|
356
|
+
const array = readArray(key);
|
|
357
|
+
if (index < 0 || index >= array.length) return;
|
|
358
|
+
const keys = syncKeys(key, array.length);
|
|
359
|
+
remapState(key, (old) => old === index ? void 0 : old > index ? old - 1 : old);
|
|
360
|
+
array.splice(index, 1);
|
|
361
|
+
keys.splice(index, 1);
|
|
362
|
+
afterChange();
|
|
363
|
+
},
|
|
364
|
+
move: (from, to) => {
|
|
365
|
+
const array = readArray(key);
|
|
366
|
+
if (from < 0 || from >= array.length || to < 0 || to >= array.length || from === to) return;
|
|
367
|
+
const keys = syncKeys(key, array.length);
|
|
368
|
+
remapState(key, (old) => {
|
|
369
|
+
if (old === from) return to;
|
|
370
|
+
if (from < to && old > from && old <= to) return old - 1;
|
|
371
|
+
if (from > to && old >= to && old < from) return old + 1;
|
|
372
|
+
return old;
|
|
373
|
+
});
|
|
374
|
+
const [item] = array.splice(from, 1);
|
|
375
|
+
array.splice(to, 0, item);
|
|
376
|
+
const [movedKey] = keys.splice(from, 1);
|
|
377
|
+
keys.splice(to, 0, movedKey ?? nextKey++);
|
|
378
|
+
afterChange();
|
|
379
|
+
},
|
|
380
|
+
swap: (first, second) => {
|
|
381
|
+
const array = readArray(key);
|
|
382
|
+
if (first < 0 || second < 0 || first >= array.length || second >= array.length) return;
|
|
383
|
+
const keys = syncKeys(key, array.length);
|
|
384
|
+
remapState(key, (old) => old === first ? second : old === second ? first : old);
|
|
385
|
+
const firstItem = array[first];
|
|
386
|
+
array[first] = array[second];
|
|
387
|
+
array[second] = firstItem;
|
|
388
|
+
const firstKey = keys[first] ?? nextKey++;
|
|
389
|
+
keys[first] = keys[second] ?? nextKey++;
|
|
390
|
+
keys[second] = firstKey;
|
|
391
|
+
afterChange();
|
|
392
|
+
},
|
|
393
|
+
replace: (items) => {
|
|
394
|
+
remapState(key, () => void 0);
|
|
395
|
+
writePath(values.value, key, [...items]);
|
|
396
|
+
arrayKeys.delete(key);
|
|
397
|
+
afterChange();
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
};
|
|
401
|
+
const clearErrors = (path) => {
|
|
402
|
+
if (path === void 0) errors.value = {};
|
|
403
|
+
else setErrorsFor(path, []);
|
|
404
|
+
};
|
|
405
|
+
const submitWith = async (handler) => {
|
|
406
|
+
submitCount.value += 1;
|
|
407
|
+
submitting.value = true;
|
|
408
|
+
try {
|
|
409
|
+
const result = await validate();
|
|
410
|
+
const signal = formController?.signal ?? new AbortController().signal;
|
|
411
|
+
if (result.status === "valid") {
|
|
412
|
+
const onSubmit = handler ?? options.onSubmit;
|
|
413
|
+
if (onSubmit) await onSubmit(result.value, { signal });
|
|
414
|
+
} else if (result.status === "invalid") {
|
|
415
|
+
const next = new Set(touched.value);
|
|
416
|
+
for (const path of Object.keys(result.errors)) if (path !== "") next.add(path);
|
|
417
|
+
touched.value = next;
|
|
418
|
+
}
|
|
419
|
+
return result;
|
|
420
|
+
} finally {
|
|
421
|
+
submitting.value = false;
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
const reset = (next) => {
|
|
425
|
+
formController?.abort();
|
|
426
|
+
for (const controller of fieldControllers.values()) controller.abort();
|
|
427
|
+
fieldControllers.clear();
|
|
428
|
+
initial = next === void 0 ? createInitial() : cloneValue(next);
|
|
429
|
+
values.value = cloneValue(initial);
|
|
430
|
+
errors.value = {};
|
|
431
|
+
touched.value = /* @__PURE__ */ new Set();
|
|
432
|
+
pending.value.clear();
|
|
433
|
+
submitCount.value = 0;
|
|
434
|
+
arrayKeys.clear();
|
|
435
|
+
bumpKeys();
|
|
436
|
+
};
|
|
437
|
+
tryOnScopeDispose(() => {
|
|
438
|
+
formController?.abort();
|
|
439
|
+
for (const controller of fieldControllers.values()) controller.abort();
|
|
440
|
+
});
|
|
441
|
+
return {
|
|
442
|
+
values,
|
|
443
|
+
errors,
|
|
444
|
+
valid: computed(() => Object.keys(errors.value).length === 0),
|
|
445
|
+
dirty: computed(() => !deepEqual(values.value, initial)),
|
|
446
|
+
validating: computed(() => pending.value.size > 0),
|
|
447
|
+
submitting,
|
|
448
|
+
submitCount,
|
|
449
|
+
field,
|
|
450
|
+
fieldArray,
|
|
451
|
+
getValue: (path) => readPath(values.value, path),
|
|
452
|
+
setValue: (path, value, setOptions) => setValueAt(path, value, setOptions),
|
|
453
|
+
setValues: (next, setOptions = {}) => {
|
|
454
|
+
if (setOptions.merge) values.value = {
|
|
455
|
+
...values.value,
|
|
456
|
+
...cloneValue(next)
|
|
457
|
+
};
|
|
458
|
+
else values.value = {
|
|
459
|
+
...cloneValue(initial),
|
|
460
|
+
...cloneValue(next)
|
|
461
|
+
};
|
|
462
|
+
arrayKeys.clear();
|
|
463
|
+
bumpKeys();
|
|
464
|
+
},
|
|
465
|
+
isTouched: (path) => touched.value.has(path),
|
|
466
|
+
setErrors: (next) => {
|
|
467
|
+
const normalized = {};
|
|
468
|
+
for (const [path, messages] of Object.entries(next)) if (messages !== void 0 && messages.length > 0) normalized[path] = messages;
|
|
469
|
+
errors.value = normalized;
|
|
470
|
+
},
|
|
471
|
+
clearErrors,
|
|
472
|
+
validate,
|
|
473
|
+
submit: submitWith,
|
|
474
|
+
handleSubmit: (handler) => (event) => {
|
|
475
|
+
event?.preventDefault();
|
|
476
|
+
return submitWith(handler);
|
|
477
|
+
},
|
|
478
|
+
reset
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
//#endregion
|
|
482
|
+
export { useForm };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-fullscreen.d.ts
|
|
4
|
+
/** Browser navigation UI preference while fullscreen. */
|
|
5
|
+
type FullscreenNavigationUI = "auto" | "hide" | "show";
|
|
6
|
+
/** Element that can enter fullscreen (standard or WebKit-prefixed). */
|
|
7
|
+
interface FullscreenElementLike {
|
|
8
|
+
/** Standard request. */
|
|
9
|
+
requestFullscreen?(options?: {
|
|
10
|
+
navigationUI?: FullscreenNavigationUI;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
/** Legacy WebKit request (Safari < 16.4). */
|
|
13
|
+
webkitRequestFullscreen?(): void;
|
|
14
|
+
}
|
|
15
|
+
/** Document-level fullscreen capability (standard or WebKit-prefixed). */
|
|
16
|
+
interface FullscreenHost extends EventTarget {
|
|
17
|
+
/** Element currently in fullscreen. */
|
|
18
|
+
readonly fullscreenElement?: unknown;
|
|
19
|
+
/** Legacy WebKit fullscreen element. */
|
|
20
|
+
readonly webkitFullscreenElement?: unknown;
|
|
21
|
+
/** Whether fullscreen is allowed (for example by permissions policy). */
|
|
22
|
+
readonly fullscreenEnabled?: boolean;
|
|
23
|
+
/** Legacy WebKit flag. */
|
|
24
|
+
readonly webkitFullscreenEnabled?: boolean;
|
|
25
|
+
/** Standard exit. */
|
|
26
|
+
exitFullscreen?(): Promise<void>;
|
|
27
|
+
/** Legacy WebKit exit. */
|
|
28
|
+
webkitExitFullscreen?(): void;
|
|
29
|
+
/** Default fullscreen target. */
|
|
30
|
+
readonly documentElement?: FullscreenElementLike | null;
|
|
31
|
+
}
|
|
32
|
+
/** Options for {@link useFullscreen}. */
|
|
33
|
+
interface UseFullscreenOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Document capability for alternate runtimes and tests.
|
|
36
|
+
*
|
|
37
|
+
* @default window.document when a browser window exists
|
|
38
|
+
*/
|
|
39
|
+
readonly host?: MaybeRefOrGetter<FullscreenHost | null | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Exit fullscreen when the owning reactive scope stops while this
|
|
42
|
+
* composable's target is fullscreen.
|
|
43
|
+
*
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
readonly autoExit?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Navigation UI preference passed to `requestFullscreen`.
|
|
49
|
+
*
|
|
50
|
+
* @default "auto"
|
|
51
|
+
*/
|
|
52
|
+
readonly navigationUI?: FullscreenNavigationUI;
|
|
53
|
+
}
|
|
54
|
+
/** Reactive state and actions returned by {@link useFullscreen}. */
|
|
55
|
+
interface FullscreenControls {
|
|
56
|
+
/** Whether fullscreen can be requested. */
|
|
57
|
+
readonly supported: ComputedRef<boolean>;
|
|
58
|
+
/** Whether this composable's target is the current fullscreen element. */
|
|
59
|
+
readonly isFullscreen: Readonly<Ref<boolean>>;
|
|
60
|
+
/**
|
|
61
|
+
* Enter fullscreen. Browsers require a user gesture.
|
|
62
|
+
*
|
|
63
|
+
* @returns Whether the target is fullscreen afterwards.
|
|
64
|
+
*/
|
|
65
|
+
readonly enter: () => Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Exit fullscreen when this composable's target owns it.
|
|
68
|
+
*
|
|
69
|
+
* @returns Whether the target is fullscreen afterwards.
|
|
70
|
+
*/
|
|
71
|
+
readonly exit: () => Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* Toggle fullscreen.
|
|
74
|
+
*
|
|
75
|
+
* @returns Whether the target is fullscreen afterwards.
|
|
76
|
+
*/
|
|
77
|
+
readonly toggle: () => Promise<boolean>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Enter, exit, and observe fullscreen for an element.
|
|
81
|
+
*
|
|
82
|
+
* Supports the standard Fullscreen API and the WebKit-prefixed variant.
|
|
83
|
+
* `isFullscreen` is true only while *this* target is the fullscreen element
|
|
84
|
+
* and follows `fullscreenchange`, so pressing Escape is reflected. Listeners
|
|
85
|
+
* are removed when the owning scope stops; with `autoExit` the target also
|
|
86
|
+
* leaves fullscreen then.
|
|
87
|
+
*
|
|
88
|
+
* Server rendering: `supported` and `isFullscreen` are false and nothing is
|
|
89
|
+
* requested.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const player = useTemplateRef<HTMLElement>("player");
|
|
94
|
+
* const { toggle, isFullscreen } = useFullscreen(player);
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @param target Reactive element; defaults to the document element.
|
|
98
|
+
* @param options Capability, navigation UI, and exit policy.
|
|
99
|
+
* @default options {}
|
|
100
|
+
* @returns Fullscreen state and actions.
|
|
101
|
+
*/
|
|
102
|
+
declare function useFullscreen(target?: MaybeRefOrGetter<FullscreenElementLike | null | undefined>, options?: UseFullscreenOptions): FullscreenControls;
|
|
103
|
+
//#endregion
|
|
104
|
+
export { FullscreenControls, FullscreenElementLike, FullscreenHost, FullscreenNavigationUI, UseFullscreenOptions, useFullscreen };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, readonly, ref, toRaw, toValue, watch } from "vue";
|
|
3
|
+
//#region src/use-fullscreen.ts
|
|
4
|
+
const changeEvents = ["fullscreenchange", "webkitfullscreenchange"];
|
|
5
|
+
function browserFullscreenHost() {
|
|
6
|
+
return typeof window === "undefined" ? void 0 : window.document;
|
|
7
|
+
}
|
|
8
|
+
function currentElement(host) {
|
|
9
|
+
return host.fullscreenElement ?? host.webkitFullscreenElement ?? null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Enter, exit, and observe fullscreen for an element.
|
|
13
|
+
*
|
|
14
|
+
* Supports the standard Fullscreen API and the WebKit-prefixed variant.
|
|
15
|
+
* `isFullscreen` is true only while *this* target is the fullscreen element
|
|
16
|
+
* and follows `fullscreenchange`, so pressing Escape is reflected. Listeners
|
|
17
|
+
* are removed when the owning scope stops; with `autoExit` the target also
|
|
18
|
+
* leaves fullscreen then.
|
|
19
|
+
*
|
|
20
|
+
* Server rendering: `supported` and `isFullscreen` are false and nothing is
|
|
21
|
+
* requested.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const player = useTemplateRef<HTMLElement>("player");
|
|
26
|
+
* const { toggle, isFullscreen } = useFullscreen(player);
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @param target Reactive element; defaults to the document element.
|
|
30
|
+
* @param options Capability, navigation UI, and exit policy.
|
|
31
|
+
* @default options {}
|
|
32
|
+
* @returns Fullscreen state and actions.
|
|
33
|
+
*/
|
|
34
|
+
function useFullscreen(target, options = {}) {
|
|
35
|
+
const isFullscreen = ref(false);
|
|
36
|
+
const resolveHost = () => options.host === void 0 ? browserFullscreenHost() : toValue(options.host) ?? void 0;
|
|
37
|
+
const resolveTarget = () => target === void 0 ? resolveHost()?.documentElement ?? void 0 : toValue(target) ?? void 0;
|
|
38
|
+
const update = () => {
|
|
39
|
+
const host = resolveHost();
|
|
40
|
+
const element = resolveTarget();
|
|
41
|
+
isFullscreen.value = host !== void 0 && element !== void 0 && toRaw(currentElement(host)) === toRaw(element);
|
|
42
|
+
};
|
|
43
|
+
const supported = computed(() => {
|
|
44
|
+
const host = resolveHost();
|
|
45
|
+
const element = resolveTarget();
|
|
46
|
+
if (!host || !element) return false;
|
|
47
|
+
return (host.fullscreenEnabled ?? host.webkitFullscreenEnabled ?? true) && (typeof element.requestFullscreen === "function" || typeof element.webkitRequestFullscreen === "function");
|
|
48
|
+
});
|
|
49
|
+
const enter = async () => {
|
|
50
|
+
const element = resolveTarget();
|
|
51
|
+
if (!supported.value || !element) return false;
|
|
52
|
+
if (isFullscreen.value) return true;
|
|
53
|
+
try {
|
|
54
|
+
if (element.requestFullscreen) await element.requestFullscreen({ navigationUI: options.navigationUI ?? "auto" });
|
|
55
|
+
else element.webkitRequestFullscreen?.();
|
|
56
|
+
} catch {}
|
|
57
|
+
update();
|
|
58
|
+
return isFullscreen.value;
|
|
59
|
+
};
|
|
60
|
+
const exit = async () => {
|
|
61
|
+
const host = resolveHost();
|
|
62
|
+
update();
|
|
63
|
+
if (!host || !isFullscreen.value) return isFullscreen.value;
|
|
64
|
+
try {
|
|
65
|
+
if (host.exitFullscreen) await host.exitFullscreen();
|
|
66
|
+
else host.webkitExitFullscreen?.();
|
|
67
|
+
} catch {}
|
|
68
|
+
update();
|
|
69
|
+
return isFullscreen.value;
|
|
70
|
+
};
|
|
71
|
+
const toggle = () => isFullscreen.value ? exit() : enter();
|
|
72
|
+
watch([resolveHost, resolveTarget], ([host], _previous, onCleanup) => {
|
|
73
|
+
update();
|
|
74
|
+
if (!host) return;
|
|
75
|
+
for (const event of changeEvents) host.addEventListener(event, update);
|
|
76
|
+
onCleanup(() => {
|
|
77
|
+
for (const event of changeEvents) host.removeEventListener(event, update);
|
|
78
|
+
});
|
|
79
|
+
}, {
|
|
80
|
+
immediate: true,
|
|
81
|
+
flush: "sync"
|
|
82
|
+
});
|
|
83
|
+
tryOnScopeDispose(() => {
|
|
84
|
+
if (options.autoExit ?? false) exit();
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
supported,
|
|
88
|
+
isFullscreen: readonly(isFullscreen),
|
|
89
|
+
enter,
|
|
90
|
+
exit,
|
|
91
|
+
toggle
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { useFullscreen };
|