@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,497 @@
|
|
|
1
|
+
import {
|
|
2
|
+
hasInjectionContext,
|
|
3
|
+
onMounted,
|
|
4
|
+
readonly,
|
|
5
|
+
ref,
|
|
6
|
+
shallowReactive,
|
|
7
|
+
toValue,
|
|
8
|
+
watch,
|
|
9
|
+
} from "vue";
|
|
10
|
+
import type { MaybeRefOrGetter, Ref } from "vue";
|
|
11
|
+
|
|
12
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Typed codec for one search parameter.
|
|
16
|
+
*
|
|
17
|
+
* `parse` receives every value of the key (`URLSearchParams.getAll`), which
|
|
18
|
+
* is empty when the key is absent; throwing selects `default`. `serialize`
|
|
19
|
+
* returns the values to write; an empty array removes the key.
|
|
20
|
+
*/
|
|
21
|
+
export interface SearchParamCodec<Value> {
|
|
22
|
+
/** Value used when the key is absent or unparsable. */
|
|
23
|
+
readonly default: Value;
|
|
24
|
+
|
|
25
|
+
/** Decode all values of the key. */
|
|
26
|
+
parse(values: readonly string[]): Value;
|
|
27
|
+
|
|
28
|
+
/** Encode a value to zero or more raw values. */
|
|
29
|
+
serialize(value: Value): readonly string[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Schema mapping parameter names to codecs. */
|
|
33
|
+
export type SearchParamSchema = Readonly<Record<string, SearchParamCodec<unknown>>>;
|
|
34
|
+
|
|
35
|
+
/** Values described by a {@link SearchParamSchema}, inferred per key. */
|
|
36
|
+
export type InferSearchParams<Schema extends SearchParamSchema> = {
|
|
37
|
+
-readonly [Key in keyof Schema]: Schema[Key] extends SearchParamCodec<infer Value>
|
|
38
|
+
? Value
|
|
39
|
+
: never;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** Single-value codec definition accepted by {@link searchParam}.custom. */
|
|
43
|
+
export interface CustomSearchParam<Value> {
|
|
44
|
+
/** Decode the first raw value. Throwing selects `default`. */
|
|
45
|
+
readonly parse: (raw: string) => Value;
|
|
46
|
+
|
|
47
|
+
/** Encode a value to one raw value. */
|
|
48
|
+
readonly serialize: (value: Value) => string;
|
|
49
|
+
|
|
50
|
+
/** Value used when the key is absent or unparsable. */
|
|
51
|
+
readonly default: Value;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function single<Value>(definition: CustomSearchParam<Value>): SearchParamCodec<Value> {
|
|
55
|
+
return {
|
|
56
|
+
default: definition.default,
|
|
57
|
+
parse(values) {
|
|
58
|
+
const [first] = values;
|
|
59
|
+
return first === undefined ? definition.default : definition.parse(first);
|
|
60
|
+
},
|
|
61
|
+
serialize(value) {
|
|
62
|
+
return [definition.serialize(value)];
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function sameJsonKind<Value>(defaults: Value, candidate: unknown): candidate is Value {
|
|
68
|
+
if (defaults === null) return true;
|
|
69
|
+
if (Array.isArray(defaults)) return Array.isArray(candidate);
|
|
70
|
+
if (typeof defaults === "object") {
|
|
71
|
+
return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
|
|
72
|
+
}
|
|
73
|
+
return typeof candidate === typeof defaults;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Repeated-key codec of raw strings.
|
|
78
|
+
*
|
|
79
|
+
* @returns A string array codec.
|
|
80
|
+
*/
|
|
81
|
+
function arrayCodec(): SearchParamCodec<string[]>;
|
|
82
|
+
function arrayCodec<Item>(item: SearchParamCodec<Item>): SearchParamCodec<Item[]>;
|
|
83
|
+
function arrayCodec<Item>(
|
|
84
|
+
item?: SearchParamCodec<Item>,
|
|
85
|
+
): SearchParamCodec<Item[]> | SearchParamCodec<string[]> {
|
|
86
|
+
if (item === undefined) {
|
|
87
|
+
const strings: SearchParamCodec<string[]> = {
|
|
88
|
+
default: [],
|
|
89
|
+
parse: (values) => [...values],
|
|
90
|
+
serialize: (value) => value,
|
|
91
|
+
};
|
|
92
|
+
return strings;
|
|
93
|
+
}
|
|
94
|
+
const items: SearchParamCodec<Item[]> = {
|
|
95
|
+
default: [],
|
|
96
|
+
parse: (values) => values.map((value) => item.parse([value])),
|
|
97
|
+
serialize: (value) => value.flatMap((entry) => item.serialize(entry)),
|
|
98
|
+
};
|
|
99
|
+
return items;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Built-in typed codecs for {@link useUrlSearchParams} schemas. */
|
|
103
|
+
export const searchParam = {
|
|
104
|
+
/**
|
|
105
|
+
* Raw string value.
|
|
106
|
+
*
|
|
107
|
+
* @param fallback Value for an absent key.
|
|
108
|
+
* @default fallback ""
|
|
109
|
+
* @returns A string codec.
|
|
110
|
+
*/
|
|
111
|
+
string(fallback = ""): SearchParamCodec<string> {
|
|
112
|
+
return single({ parse: (raw) => raw, serialize: (value) => value, default: fallback });
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Finite number; non-numeric input selects the default.
|
|
117
|
+
*
|
|
118
|
+
* @param fallback Value for an absent or invalid key.
|
|
119
|
+
* @default fallback 0
|
|
120
|
+
* @returns A number codec.
|
|
121
|
+
*/
|
|
122
|
+
number(fallback = 0): SearchParamCodec<number> {
|
|
123
|
+
return single({
|
|
124
|
+
parse: (raw) => {
|
|
125
|
+
const value = raw.trim() === "" ? Number.NaN : Number(raw);
|
|
126
|
+
return Number.isFinite(value) ? value : fallback;
|
|
127
|
+
},
|
|
128
|
+
serialize: String,
|
|
129
|
+
default: fallback,
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Boolean: `true`/`1`/empty read as `true`, `false`/`0` as `false`.
|
|
135
|
+
*
|
|
136
|
+
* @param fallback Value for an absent or unrecognized key.
|
|
137
|
+
* @default fallback false
|
|
138
|
+
* @returns A boolean codec.
|
|
139
|
+
*/
|
|
140
|
+
boolean(fallback = false): SearchParamCodec<boolean> {
|
|
141
|
+
return single({
|
|
142
|
+
parse: (raw) => {
|
|
143
|
+
if (raw === "" || raw === "true" || raw === "1") return true;
|
|
144
|
+
if (raw === "false" || raw === "0") return false;
|
|
145
|
+
return fallback;
|
|
146
|
+
},
|
|
147
|
+
serialize: String,
|
|
148
|
+
default: fallback,
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* One of a closed set of string literals.
|
|
154
|
+
*
|
|
155
|
+
* @param values Allowed values.
|
|
156
|
+
* @param fallback Value for an absent or unknown key.
|
|
157
|
+
* @returns A literal-union codec.
|
|
158
|
+
*/
|
|
159
|
+
enum<const Values extends readonly [string, ...string[]]>(
|
|
160
|
+
values: Values,
|
|
161
|
+
fallback: NoInfer<Values[number]>,
|
|
162
|
+
): SearchParamCodec<Values[number]> {
|
|
163
|
+
const allowed = new Set<string>(values);
|
|
164
|
+
const isAllowed = (raw: string): raw is Values[number] => allowed.has(raw);
|
|
165
|
+
return single({
|
|
166
|
+
parse: (raw) => (isAllowed(raw) ? raw : fallback),
|
|
167
|
+
serialize: (value) => value,
|
|
168
|
+
default: fallback,
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Repeated key (`?tag=a&tag=b`) decoded item by item.
|
|
174
|
+
*
|
|
175
|
+
* @param item Single-value codec applied to every value.
|
|
176
|
+
* @default item searchParam.string()
|
|
177
|
+
* @returns An array codec whose default is `[]`.
|
|
178
|
+
*/
|
|
179
|
+
array: arrayCodec,
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* JSON value checked by `validate`, or by kind against the default.
|
|
183
|
+
*
|
|
184
|
+
* @param fallback Value for an absent or invalid key.
|
|
185
|
+
* @param validate Type guard applied to the decoded JSON.
|
|
186
|
+
* @default validate the decoded value has the default's kind
|
|
187
|
+
* @returns A JSON codec.
|
|
188
|
+
*/
|
|
189
|
+
json<Value>(
|
|
190
|
+
fallback: Value,
|
|
191
|
+
validate?: (candidate: unknown) => candidate is Value,
|
|
192
|
+
): SearchParamCodec<Value> {
|
|
193
|
+
const accept =
|
|
194
|
+
validate ?? ((candidate): candidate is Value => sameJsonKind(fallback, candidate));
|
|
195
|
+
return single({
|
|
196
|
+
parse: (raw) => {
|
|
197
|
+
const candidate: unknown = JSON.parse(raw);
|
|
198
|
+
return accept(candidate) ? candidate : fallback;
|
|
199
|
+
},
|
|
200
|
+
serialize: (value) => JSON.stringify(value),
|
|
201
|
+
default: fallback,
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Single-value codec from explicit parse/serialize functions.
|
|
207
|
+
*
|
|
208
|
+
* @param definition Parse, serialize, and default.
|
|
209
|
+
* @returns The codec.
|
|
210
|
+
*/
|
|
211
|
+
custom<Value>(definition: CustomSearchParam<Value>): SearchParamCodec<Value> {
|
|
212
|
+
return single(definition);
|
|
213
|
+
},
|
|
214
|
+
} as const;
|
|
215
|
+
|
|
216
|
+
function safeParse<Value>(codec: SearchParamCodec<Value>, values: readonly string[]): Value {
|
|
217
|
+
try {
|
|
218
|
+
return codec.parse(values);
|
|
219
|
+
} catch {
|
|
220
|
+
return codec.default;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function toSearch(source: string | URL | URLSearchParams): URLSearchParams {
|
|
225
|
+
if (source instanceof URLSearchParams) return new URLSearchParams(source);
|
|
226
|
+
if (source instanceof URL) return new URLSearchParams(source.search);
|
|
227
|
+
const withoutHash = source.split("#", 1)[0] ?? "";
|
|
228
|
+
const query = withoutHash.indexOf("?");
|
|
229
|
+
return new URLSearchParams(query === -1 ? "" : withoutHash.slice(query + 1));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Decode search parameters with a schema. Pure and SSR-safe.
|
|
234
|
+
*
|
|
235
|
+
* @typeParam Schema Parameter codecs.
|
|
236
|
+
* @param schema Parameter codecs.
|
|
237
|
+
* @param search URL, URL string, query string, or parsed parameters.
|
|
238
|
+
* @returns One typed value per schema key.
|
|
239
|
+
*/
|
|
240
|
+
export function parseSearchParams<Schema extends SearchParamSchema>(
|
|
241
|
+
schema: Schema,
|
|
242
|
+
search: string | URL | URLSearchParams,
|
|
243
|
+
): InferSearchParams<Schema> {
|
|
244
|
+
const params = toSearch(search);
|
|
245
|
+
const entries = Object.keys(schema).map((key) => {
|
|
246
|
+
const codec = schema[key];
|
|
247
|
+
return [key, codec === undefined ? undefined : safeParse(codec, params.getAll(key))] as const;
|
|
248
|
+
});
|
|
249
|
+
// `Object.fromEntries` loses the per-key correlation that the mapped
|
|
250
|
+
// `InferSearchParams` type restores; every key was produced by its codec.
|
|
251
|
+
return Object.fromEntries(entries) as InferSearchParams<Schema>;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Options for {@link serializeSearchParams}. */
|
|
255
|
+
export interface SerializeSearchParamsOptions {
|
|
256
|
+
/**
|
|
257
|
+
* Existing parameters to keep for keys outside the schema.
|
|
258
|
+
*
|
|
259
|
+
* @default no base parameters
|
|
260
|
+
*/
|
|
261
|
+
readonly base?: string | URL | URLSearchParams;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Omit keys whose value serializes like the codec default.
|
|
265
|
+
*
|
|
266
|
+
* @default true
|
|
267
|
+
*/
|
|
268
|
+
readonly removeDefaults?: boolean;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function sameValues(left: readonly string[], right: readonly string[]): boolean {
|
|
272
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Encode typed values with a schema. Pure and SSR-safe.
|
|
277
|
+
*
|
|
278
|
+
* @typeParam Schema Parameter codecs.
|
|
279
|
+
* @param schema Parameter codecs.
|
|
280
|
+
* @param values Values to encode; keys absent from `values` keep the base.
|
|
281
|
+
* @param options Base parameters and default removal.
|
|
282
|
+
* @default options {}
|
|
283
|
+
* @returns The encoded parameters.
|
|
284
|
+
*/
|
|
285
|
+
export function serializeSearchParams<Schema extends SearchParamSchema>(
|
|
286
|
+
schema: Schema,
|
|
287
|
+
values: Partial<InferSearchParams<Schema>>,
|
|
288
|
+
options: SerializeSearchParamsOptions = {},
|
|
289
|
+
): URLSearchParams {
|
|
290
|
+
const params = options.base === undefined ? new URLSearchParams() : toSearch(options.base);
|
|
291
|
+
const removeDefaults = options.removeDefaults ?? true;
|
|
292
|
+
for (const key of Object.keys(schema)) {
|
|
293
|
+
const codec = schema[key];
|
|
294
|
+
if (codec === undefined || !(key in values)) continue;
|
|
295
|
+
const encoded = codec.serialize(values[key]);
|
|
296
|
+
const [first, ...rest] = encoded;
|
|
297
|
+
if (
|
|
298
|
+
first === undefined ||
|
|
299
|
+
(removeDefaults && sameValues(encoded, codec.serialize(codec.default)))
|
|
300
|
+
) {
|
|
301
|
+
params.delete(key);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
// `set` keeps the key's existing position, so URLs stay stable.
|
|
305
|
+
params.set(key, first);
|
|
306
|
+
for (const value of rest) params.append(key, value);
|
|
307
|
+
}
|
|
308
|
+
return params;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** Minimal `window` surface used by {@link useUrlSearchParams}. */
|
|
312
|
+
export interface UrlSearchParamsHost extends Pick<
|
|
313
|
+
EventTarget,
|
|
314
|
+
"addEventListener" | "removeEventListener"
|
|
315
|
+
> {
|
|
316
|
+
/** Current location; only the URL parts are read. */
|
|
317
|
+
readonly location: {
|
|
318
|
+
/** Query including the leading `?`, or `""`. */
|
|
319
|
+
readonly search: string;
|
|
320
|
+
/** Fragment including the leading `#`, or `""`. */
|
|
321
|
+
readonly hash: string;
|
|
322
|
+
/** Path component. */
|
|
323
|
+
readonly pathname: string;
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
/** Session history used to write the query. */
|
|
327
|
+
readonly history: {
|
|
328
|
+
/** Current history entry state, preserved when replacing. */
|
|
329
|
+
readonly state: unknown;
|
|
330
|
+
/** Replace the current entry's URL. */
|
|
331
|
+
readonly replaceState: (data: unknown, unused: string, url: string) => void;
|
|
332
|
+
/** Push a new entry with the given URL. */
|
|
333
|
+
readonly pushState: (data: unknown, unused: string, url: string) => void;
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Options for {@link useUrlSearchParams}. */
|
|
338
|
+
export interface UseUrlSearchParamsOptions {
|
|
339
|
+
/**
|
|
340
|
+
* Browser host. `null`/`undefined` keeps server values.
|
|
341
|
+
*
|
|
342
|
+
* @default window when a browser window exists
|
|
343
|
+
*/
|
|
344
|
+
readonly host?: MaybeRefOrGetter<UrlSearchParamsHost | null | undefined>;
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* History write mode for changes made through `params`.
|
|
348
|
+
*
|
|
349
|
+
* @default "replace"
|
|
350
|
+
*/
|
|
351
|
+
readonly mode?: "replace" | "push";
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Omit parameters equal to their codec default from the URL.
|
|
355
|
+
*
|
|
356
|
+
* @default true
|
|
357
|
+
*/
|
|
358
|
+
readonly removeDefaults?: boolean;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Request URL used while no host is attached, so server markup matches
|
|
362
|
+
* the client's first render.
|
|
363
|
+
*
|
|
364
|
+
* @default undefined (codec defaults are used)
|
|
365
|
+
*/
|
|
366
|
+
readonly ssrUrl?: MaybeRefOrGetter<string | URL | URLSearchParams | undefined>;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Reactive state and controls returned by {@link useUrlSearchParams}. */
|
|
370
|
+
export interface UrlSearchParamsControls<Schema extends SearchParamSchema> {
|
|
371
|
+
/**
|
|
372
|
+
* Writable typed parameters. Assign whole values (including new arrays);
|
|
373
|
+
* the object is shallowly reactive.
|
|
374
|
+
*/
|
|
375
|
+
readonly params: InferSearchParams<Schema>;
|
|
376
|
+
|
|
377
|
+
/** Whether a browser host is attached. */
|
|
378
|
+
readonly supported: Readonly<Ref<boolean>>;
|
|
379
|
+
|
|
380
|
+
/** Re-read the current location. */
|
|
381
|
+
readonly refresh: () => void;
|
|
382
|
+
|
|
383
|
+
/** Stop following the URL. Idempotent; also runs on scope disposal. */
|
|
384
|
+
readonly stop: () => void;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function browserHost(): UrlSearchParamsHost | undefined {
|
|
388
|
+
return typeof window !== "undefined" ? window : undefined;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Two-way bind typed URL search parameters described by a codec schema.
|
|
393
|
+
*
|
|
394
|
+
* Every property type is inferred from its codec. Assigning a property
|
|
395
|
+
* rewrites the query through `history.replaceState` (or `pushState` with
|
|
396
|
+
* `mode: "push"`), keeping parameters outside the schema and the fragment,
|
|
397
|
+
* and dropping values equal to their default. Back/forward navigation
|
|
398
|
+
* (`popstate`) re-reads the URL.
|
|
399
|
+
*
|
|
400
|
+
* Server rendering: no global is read. Pass `ssrUrl` (the request URL) so
|
|
401
|
+
* the server renders the same values the client reads during hydration.
|
|
402
|
+
* Inside a component the browser URL is first read after mounting, so the
|
|
403
|
+
* hydrating client renders the `ssrUrl` state before switching to it.
|
|
404
|
+
* Listeners are removed with the owning reactive scope or `stop()`.
|
|
405
|
+
*
|
|
406
|
+
* @example
|
|
407
|
+
* ```ts
|
|
408
|
+
* const { params } = useUrlSearchParams({
|
|
409
|
+
* page: searchParam.number(1),
|
|
410
|
+
* sort: searchParam.enum(["new", "top"], "new"),
|
|
411
|
+
* tags: searchParam.array(),
|
|
412
|
+
* });
|
|
413
|
+
* params.page += 1; // ?page=2
|
|
414
|
+
* ```
|
|
415
|
+
*
|
|
416
|
+
* @typeParam Schema Parameter codecs.
|
|
417
|
+
* @param schema Parameter codecs.
|
|
418
|
+
* @param options Host, history mode, default removal, and server URL.
|
|
419
|
+
* @default options {}
|
|
420
|
+
* @returns Typed reactive parameters and controls.
|
|
421
|
+
*/
|
|
422
|
+
export function useUrlSearchParams<const Schema extends SearchParamSchema>(
|
|
423
|
+
schema: Schema,
|
|
424
|
+
options: UseUrlSearchParamsOptions = {},
|
|
425
|
+
): UrlSearchParamsControls<Schema> {
|
|
426
|
+
const resolveHost = (): UrlSearchParamsHost | undefined =>
|
|
427
|
+
options.host === undefined ? browserHost() : (toValue(options.host) ?? undefined);
|
|
428
|
+
const removeDefaults = options.removeDefaults ?? true;
|
|
429
|
+
const ssrUrl = toValue(options.ssrUrl);
|
|
430
|
+
const params = shallowReactive(parseSearchParams(schema, ssrUrl ?? ""));
|
|
431
|
+
const supported = ref(false);
|
|
432
|
+
let syncedSearch: string | undefined;
|
|
433
|
+
let applying = false;
|
|
434
|
+
|
|
435
|
+
const encode = (host: UrlSearchParamsHost): string =>
|
|
436
|
+
serializeSearchParams(schema, params, {
|
|
437
|
+
base: host.location.search,
|
|
438
|
+
removeDefaults,
|
|
439
|
+
}).toString();
|
|
440
|
+
|
|
441
|
+
const refresh = (): void => {
|
|
442
|
+
const host = resolveHost();
|
|
443
|
+
supported.value = host !== undefined;
|
|
444
|
+
const source = host === undefined ? (toValue(options.ssrUrl) ?? "") : host.location.search;
|
|
445
|
+
applying = true;
|
|
446
|
+
try {
|
|
447
|
+
Object.assign(params, parseSearchParams(schema, source));
|
|
448
|
+
} finally {
|
|
449
|
+
applying = false;
|
|
450
|
+
}
|
|
451
|
+
if (host !== undefined) syncedSearch = encode(host);
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
let stopHost = (): void => undefined;
|
|
455
|
+
const startHost = (): void => {
|
|
456
|
+
stopHost = watch(
|
|
457
|
+
resolveHost,
|
|
458
|
+
(host, _previous, onCleanup) => {
|
|
459
|
+
refresh();
|
|
460
|
+
if (host === undefined) return;
|
|
461
|
+
host.addEventListener("popstate", refresh);
|
|
462
|
+
onCleanup(() => host.removeEventListener("popstate", refresh));
|
|
463
|
+
},
|
|
464
|
+
{ immediate: true, flush: "sync" },
|
|
465
|
+
);
|
|
466
|
+
};
|
|
467
|
+
// Inside a component the URL is read after mounting, so a hydrating client
|
|
468
|
+
// renders the `ssrUrl` values (and `supported: false`) exactly like the server.
|
|
469
|
+
if (hasInjectionContext()) onMounted(startHost);
|
|
470
|
+
else startHost();
|
|
471
|
+
|
|
472
|
+
const stopWrite = watch(
|
|
473
|
+
() => {
|
|
474
|
+
const host = resolveHost();
|
|
475
|
+
return host === undefined ? undefined : encode(host);
|
|
476
|
+
},
|
|
477
|
+
(search) => {
|
|
478
|
+
const host = resolveHost();
|
|
479
|
+
if (applying || search === undefined || host === undefined) return;
|
|
480
|
+
if (search === syncedSearch) return;
|
|
481
|
+
syncedSearch = search;
|
|
482
|
+
const { pathname, hash } = host.location;
|
|
483
|
+
const url = `${pathname}${search === "" ? "" : `?${search}`}${hash}`;
|
|
484
|
+
if ((options.mode ?? "replace") === "push") host.history.pushState(null, "", url);
|
|
485
|
+
else host.history.replaceState(host.history.state, "", url);
|
|
486
|
+
},
|
|
487
|
+
{ flush: "sync" },
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
const stop = (): void => {
|
|
491
|
+
stopHost();
|
|
492
|
+
stopWrite();
|
|
493
|
+
};
|
|
494
|
+
tryOnScopeDispose(stop);
|
|
495
|
+
|
|
496
|
+
return { params, supported: readonly(supported), refresh, stop };
|
|
497
|
+
}
|