@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,413 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
hasInjectionContext,
|
|
4
|
+
readonly,
|
|
5
|
+
ref,
|
|
6
|
+
shallowReadonly,
|
|
7
|
+
shallowRef,
|
|
8
|
+
toValue,
|
|
9
|
+
watch,
|
|
10
|
+
watchPostEffect,
|
|
11
|
+
} from "vue";
|
|
12
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
13
|
+
|
|
14
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
15
|
+
|
|
16
|
+
/** Lifecycle states of a service worker. */
|
|
17
|
+
export type ServiceWorkerStateName =
|
|
18
|
+
| "parsed"
|
|
19
|
+
| "installing"
|
|
20
|
+
| "installed"
|
|
21
|
+
| "activating"
|
|
22
|
+
| "activated"
|
|
23
|
+
| "redundant";
|
|
24
|
+
|
|
25
|
+
/** Minimal `ServiceWorker` consumed by {@link useServiceWorker}. */
|
|
26
|
+
export interface ServiceWorkerLike extends EventTarget {
|
|
27
|
+
/** Current lifecycle state; changes fire `statechange`. */
|
|
28
|
+
readonly state: ServiceWorkerStateName;
|
|
29
|
+
|
|
30
|
+
/** Post a message to the worker. */
|
|
31
|
+
postMessage(message: unknown): void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Minimal `ServiceWorkerRegistration` consumed by {@link useServiceWorker}. */
|
|
35
|
+
export interface ServiceWorkerRegistrationLike extends EventTarget {
|
|
36
|
+
/** Worker being installed, if any; a new one fires `updatefound`. */
|
|
37
|
+
readonly installing: ServiceWorkerLike | null;
|
|
38
|
+
|
|
39
|
+
/** Installed worker waiting to take over, if any. */
|
|
40
|
+
readonly waiting: ServiceWorkerLike | null;
|
|
41
|
+
|
|
42
|
+
/** Active worker, if any. */
|
|
43
|
+
readonly active: ServiceWorkerLike | null;
|
|
44
|
+
|
|
45
|
+
/** Registration scope URL. */
|
|
46
|
+
readonly scope: string;
|
|
47
|
+
|
|
48
|
+
/** Check the server for an updated script. */
|
|
49
|
+
update(): Promise<unknown>;
|
|
50
|
+
|
|
51
|
+
/** Unregister; resolves whether the registration was removed. */
|
|
52
|
+
unregister(): Promise<boolean>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Options forwarded to `ServiceWorkerContainer.register`. */
|
|
56
|
+
export interface ServiceWorkerRegisterOptions {
|
|
57
|
+
/**
|
|
58
|
+
* Registration scope.
|
|
59
|
+
*
|
|
60
|
+
* @default the script's directory
|
|
61
|
+
*/
|
|
62
|
+
readonly scope?: string;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Script type.
|
|
66
|
+
*
|
|
67
|
+
* @default "classic"
|
|
68
|
+
*/
|
|
69
|
+
readonly type?: "classic" | "module";
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* HTTP cache policy for update checks.
|
|
73
|
+
*
|
|
74
|
+
* @default "imports"
|
|
75
|
+
*/
|
|
76
|
+
readonly updateViaCache?: "imports" | "all" | "none";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Minimal `ServiceWorkerContainer` (`navigator.serviceWorker`). */
|
|
80
|
+
export interface ServiceWorkerContainerLike extends EventTarget {
|
|
81
|
+
/** Worker controlling this page; changes fire `controllerchange`. */
|
|
82
|
+
readonly controller: ServiceWorkerLike | null;
|
|
83
|
+
|
|
84
|
+
/** Register a service worker script. */
|
|
85
|
+
register(
|
|
86
|
+
scriptUrl: string | URL,
|
|
87
|
+
options?: ServiceWorkerRegisterOptions,
|
|
88
|
+
): Promise<ServiceWorkerRegistrationLike>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** States of the registration's workers (`null` when absent). */
|
|
92
|
+
export interface ServiceWorkerStates {
|
|
93
|
+
/** State of the installing worker. */
|
|
94
|
+
readonly installing: ServiceWorkerStateName | null;
|
|
95
|
+
|
|
96
|
+
/** State of the waiting worker. */
|
|
97
|
+
readonly waiting: ServiceWorkerStateName | null;
|
|
98
|
+
|
|
99
|
+
/** State of the active worker. */
|
|
100
|
+
readonly active: ServiceWorkerStateName | null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Options for {@link useServiceWorker}. */
|
|
104
|
+
export interface UseServiceWorkerOptions {
|
|
105
|
+
/**
|
|
106
|
+
* Service worker container for alternate runtimes and tests.
|
|
107
|
+
*
|
|
108
|
+
* @default window.navigator.serviceWorker when it exists
|
|
109
|
+
*/
|
|
110
|
+
readonly container?: MaybeRefOrGetter<ServiceWorkerContainerLike | null | undefined>;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Registration scope.
|
|
114
|
+
*
|
|
115
|
+
* @default undefined (the script's directory)
|
|
116
|
+
*/
|
|
117
|
+
readonly scope?: string;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Script type.
|
|
121
|
+
*
|
|
122
|
+
* @default "classic"
|
|
123
|
+
*/
|
|
124
|
+
readonly type?: "classic" | "module";
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* HTTP cache policy for update checks.
|
|
128
|
+
*
|
|
129
|
+
* @default "imports"
|
|
130
|
+
*/
|
|
131
|
+
readonly updateViaCache?: "imports" | "all" | "none";
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Register as soon as the composable is created (browser only).
|
|
135
|
+
*
|
|
136
|
+
* @default true
|
|
137
|
+
*/
|
|
138
|
+
readonly immediate?: boolean;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Message posted to the waiting worker by `skipWaiting()`.
|
|
142
|
+
*
|
|
143
|
+
* @default { type: "SKIP_WAITING" }
|
|
144
|
+
*/
|
|
145
|
+
readonly skipWaitingMessage?: unknown;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Called on `controllerchange` (for example to reload the page after a
|
|
149
|
+
* new worker took control).
|
|
150
|
+
*
|
|
151
|
+
* @default undefined
|
|
152
|
+
*/
|
|
153
|
+
readonly onControllerChange?: (controller: ServiceWorkerLike | null) => void;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Reactive state and actions returned by {@link useServiceWorker}. */
|
|
157
|
+
export interface ServiceWorkerControls {
|
|
158
|
+
/** Whether the Service Worker API is available. */
|
|
159
|
+
readonly supported: ComputedRef<boolean>;
|
|
160
|
+
|
|
161
|
+
/** Current registration, or `null` before registering. */
|
|
162
|
+
readonly registration: Readonly<ShallowRef<ServiceWorkerRegistrationLike | null>>;
|
|
163
|
+
|
|
164
|
+
/** States of the installing, waiting and active workers. */
|
|
165
|
+
readonly state: Readonly<Ref<ServiceWorkerStates>>;
|
|
166
|
+
|
|
167
|
+
/** Whether a waiting worker is ready to replace the controlling one. */
|
|
168
|
+
readonly updateAvailable: ComputedRef<boolean>;
|
|
169
|
+
|
|
170
|
+
/** Most recent failure, cleared by the next successful action. */
|
|
171
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Register (or re-register) the script.
|
|
175
|
+
*
|
|
176
|
+
* @returns The registration, or `null` when unsupported or on failure.
|
|
177
|
+
*/
|
|
178
|
+
readonly register: () => Promise<ServiceWorkerRegistrationLike | null>;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Check the server for an updated script.
|
|
182
|
+
*
|
|
183
|
+
* @returns Whether the check ran without failing.
|
|
184
|
+
*/
|
|
185
|
+
readonly update: () => Promise<boolean>;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Post the skip-waiting message to the waiting worker.
|
|
189
|
+
*
|
|
190
|
+
* @returns Whether a waiting worker received the message.
|
|
191
|
+
*/
|
|
192
|
+
readonly skipWaiting: () => boolean;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Unregister the service worker.
|
|
196
|
+
*
|
|
197
|
+
* @returns Whether the registration was removed.
|
|
198
|
+
*/
|
|
199
|
+
readonly unregister: () => Promise<boolean>;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const emptyStates: ServiceWorkerStates = { installing: null, waiting: null, active: null };
|
|
203
|
+
|
|
204
|
+
function browserContainer(): ServiceWorkerContainerLike | undefined {
|
|
205
|
+
if (typeof window === "undefined") return undefined;
|
|
206
|
+
const { navigator } = window;
|
|
207
|
+
return "serviceWorker" in navigator && navigator.serviceWorker
|
|
208
|
+
? navigator.serviceWorker
|
|
209
|
+
: undefined;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Register a service worker and follow its update lifecycle.
|
|
214
|
+
*
|
|
215
|
+
* Tracks `updatefound` and each worker's `statechange` so `state` mirrors
|
|
216
|
+
* the installing, waiting and active workers. `updateAvailable` turns true
|
|
217
|
+
* once an installed worker waits while another one controls the page;
|
|
218
|
+
* `skipWaiting()` then posts the configured message to it, and
|
|
219
|
+
* `onControllerChange` runs once it takes control. Listeners are removed
|
|
220
|
+
* when the owning reactive scope stops; outside a scope they live as long as
|
|
221
|
+
* the registration.
|
|
222
|
+
*
|
|
223
|
+
* Server rendering: nothing is registered, `supported` is false and every
|
|
224
|
+
* state is `null`.
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```ts
|
|
228
|
+
* const sw = useServiceWorker("/sw.js", {
|
|
229
|
+
* onControllerChange: () => window.location.reload(),
|
|
230
|
+
* });
|
|
231
|
+
* const applyUpdate = () => sw.skipWaiting();
|
|
232
|
+
* ```
|
|
233
|
+
*
|
|
234
|
+
* @param scriptUrl Service worker script URL.
|
|
235
|
+
* @param options Container override, registration options and update hooks.
|
|
236
|
+
* @default options {}
|
|
237
|
+
* @returns Registration state and actions.
|
|
238
|
+
*/
|
|
239
|
+
export function useServiceWorker(
|
|
240
|
+
scriptUrl: MaybeRefOrGetter<string | URL>,
|
|
241
|
+
options: UseServiceWorkerOptions = {},
|
|
242
|
+
): ServiceWorkerControls {
|
|
243
|
+
const registration = shallowRef<ServiceWorkerRegistrationLike | null>(null);
|
|
244
|
+
const state = ref<ServiceWorkerStates>(emptyStates);
|
|
245
|
+
const controller = shallowRef<ServiceWorkerLike | null>(null);
|
|
246
|
+
const error = shallowRef<unknown>(undefined);
|
|
247
|
+
const watched = new Set<ServiceWorkerLike>();
|
|
248
|
+
let active = true;
|
|
249
|
+
|
|
250
|
+
// Inside a component the host resolves only after mount (a post-flush
|
|
251
|
+
// job), so a hydrating client first renders the same unsupported state as
|
|
252
|
+
// the server. Outside components it resolves immediately.
|
|
253
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
254
|
+
if (!hydrated.value) {
|
|
255
|
+
watchPostEffect(() => {
|
|
256
|
+
hydrated.value = true;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
const resolveContainer = (): ServiceWorkerContainerLike | undefined =>
|
|
260
|
+
!hydrated.value
|
|
261
|
+
? undefined
|
|
262
|
+
: options.container === undefined
|
|
263
|
+
? browserContainer()
|
|
264
|
+
: (toValue(options.container) ?? undefined);
|
|
265
|
+
|
|
266
|
+
const sync = (): void => {
|
|
267
|
+
const current = registration.value;
|
|
268
|
+
if (!current) {
|
|
269
|
+
state.value = emptyStates;
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
for (const worker of [current.installing, current.waiting, current.active]) {
|
|
273
|
+
if (worker && !watched.has(worker)) {
|
|
274
|
+
watched.add(worker);
|
|
275
|
+
worker.addEventListener("statechange", sync);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
state.value = {
|
|
279
|
+
installing: current.installing?.state ?? null,
|
|
280
|
+
waiting: current.waiting?.state ?? null,
|
|
281
|
+
active: current.active?.state ?? null,
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
const unwatchWorkers = (): void => {
|
|
286
|
+
for (const worker of watched) worker.removeEventListener("statechange", sync);
|
|
287
|
+
watched.clear();
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
watch(
|
|
291
|
+
registration,
|
|
292
|
+
(current, _previous, onCleanup) => {
|
|
293
|
+
sync();
|
|
294
|
+
if (!current) return;
|
|
295
|
+
current.addEventListener("updatefound", sync);
|
|
296
|
+
onCleanup(() => {
|
|
297
|
+
current.removeEventListener("updatefound", sync);
|
|
298
|
+
unwatchWorkers();
|
|
299
|
+
});
|
|
300
|
+
},
|
|
301
|
+
{ flush: "sync" },
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
watch(
|
|
305
|
+
resolveContainer,
|
|
306
|
+
(container, _previous, onCleanup) => {
|
|
307
|
+
controller.value = container?.controller ?? null;
|
|
308
|
+
if (!container) return;
|
|
309
|
+
const onChange = (): void => {
|
|
310
|
+
controller.value = container.controller;
|
|
311
|
+
sync();
|
|
312
|
+
options.onControllerChange?.(container.controller);
|
|
313
|
+
};
|
|
314
|
+
container.addEventListener("controllerchange", onChange);
|
|
315
|
+
onCleanup(() => container.removeEventListener("controllerchange", onChange));
|
|
316
|
+
},
|
|
317
|
+
{ immediate: true, flush: "sync" },
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const register = async (): Promise<ServiceWorkerRegistrationLike | null> => {
|
|
321
|
+
const container = resolveContainer();
|
|
322
|
+
if (!container) return null;
|
|
323
|
+
const registerOptions: {
|
|
324
|
+
scope?: string;
|
|
325
|
+
type?: "classic" | "module";
|
|
326
|
+
updateViaCache?: "imports" | "all" | "none";
|
|
327
|
+
} = {};
|
|
328
|
+
if (options.scope !== undefined) registerOptions.scope = options.scope;
|
|
329
|
+
if (options.type !== undefined) registerOptions.type = options.type;
|
|
330
|
+
if (options.updateViaCache !== undefined) {
|
|
331
|
+
registerOptions.updateViaCache = options.updateViaCache;
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const next = await container.register(toValue(scriptUrl), registerOptions);
|
|
335
|
+
if (!active) return next;
|
|
336
|
+
registration.value = next;
|
|
337
|
+
error.value = undefined;
|
|
338
|
+
return next;
|
|
339
|
+
} catch (cause) {
|
|
340
|
+
if (active) error.value = cause;
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const update = async (): Promise<boolean> => {
|
|
346
|
+
const current = registration.value;
|
|
347
|
+
if (!current) return false;
|
|
348
|
+
try {
|
|
349
|
+
await current.update();
|
|
350
|
+
error.value = undefined;
|
|
351
|
+
sync();
|
|
352
|
+
return true;
|
|
353
|
+
} catch (cause) {
|
|
354
|
+
error.value = cause;
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
const skipWaiting = (): boolean => {
|
|
360
|
+
const waiting = registration.value?.waiting;
|
|
361
|
+
if (!waiting) return false;
|
|
362
|
+
waiting.postMessage(
|
|
363
|
+
"skipWaitingMessage" in options ? options.skipWaitingMessage : { type: "SKIP_WAITING" },
|
|
364
|
+
);
|
|
365
|
+
return true;
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
const unregister = async (): Promise<boolean> => {
|
|
369
|
+
const current = registration.value;
|
|
370
|
+
if (!current) return false;
|
|
371
|
+
try {
|
|
372
|
+
const removed = await current.unregister();
|
|
373
|
+
if (removed) registration.value = null;
|
|
374
|
+
error.value = undefined;
|
|
375
|
+
return removed;
|
|
376
|
+
} catch (cause) {
|
|
377
|
+
error.value = cause;
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
if (options.immediate ?? true) {
|
|
383
|
+
// Register once, as soon as a container resolves (after mount inside a
|
|
384
|
+
// component).
|
|
385
|
+
let registered = false;
|
|
386
|
+
watch(
|
|
387
|
+
() => resolveContainer() !== undefined,
|
|
388
|
+
(ready) => {
|
|
389
|
+
if (!ready || registered) return;
|
|
390
|
+
registered = true;
|
|
391
|
+
void register();
|
|
392
|
+
},
|
|
393
|
+
{ immediate: true, flush: "sync" },
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
tryOnScopeDispose(() => {
|
|
398
|
+
active = false;
|
|
399
|
+
registration.value = null;
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
supported: computed(() => resolveContainer() !== undefined),
|
|
404
|
+
registration: shallowReadonly(registration),
|
|
405
|
+
state: readonly(state),
|
|
406
|
+
updateAvailable: computed(() => state.value.waiting !== null && controller.value !== null),
|
|
407
|
+
error: readonly(error),
|
|
408
|
+
register,
|
|
409
|
+
update,
|
|
410
|
+
skipWaiting,
|
|
411
|
+
unregister,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { computed, shallowReactive, shallowReadonly } from "vue";
|
|
2
|
+
import type { ComputedRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/** Reactive set wrapper returned by {@link useSet}. */
|
|
5
|
+
export interface SetControls<Item> {
|
|
6
|
+
/**
|
|
7
|
+
* Read-only reactive view of the set. `has`, iteration, and `size` on this
|
|
8
|
+
* view are tracked. Members are stored shallowly.
|
|
9
|
+
*/
|
|
10
|
+
readonly set: ReadonlySet<Item>;
|
|
11
|
+
|
|
12
|
+
/** Number of members. */
|
|
13
|
+
readonly size: ComputedRef<number>;
|
|
14
|
+
|
|
15
|
+
/** Snapshot of the members in insertion order. */
|
|
16
|
+
readonly values: ComputedRef<readonly Item[]>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Whether `item` is a member. Reactive when read inside an effect.
|
|
20
|
+
*
|
|
21
|
+
* @param item Candidate member.
|
|
22
|
+
* @returns Whether it is present.
|
|
23
|
+
*/
|
|
24
|
+
readonly has: (item: Item) => boolean;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Add `item`.
|
|
28
|
+
*
|
|
29
|
+
* @param item Member to add.
|
|
30
|
+
* @returns Whether it was newly added.
|
|
31
|
+
*/
|
|
32
|
+
readonly add: (item: Item) => boolean;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Remove `item`.
|
|
36
|
+
*
|
|
37
|
+
* @param item Member to remove.
|
|
38
|
+
* @returns Whether it was removed.
|
|
39
|
+
*/
|
|
40
|
+
readonly delete: (item: Item) => boolean;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Add `item` when absent and remove it when present, or force membership.
|
|
44
|
+
* Passing an explicit `undefined` behaves like passing no argument.
|
|
45
|
+
*
|
|
46
|
+
* @param item Member to toggle.
|
|
47
|
+
* @param force Membership to force instead of inverting.
|
|
48
|
+
* @returns Whether `item` is a member afterwards.
|
|
49
|
+
*/
|
|
50
|
+
readonly toggle: (item: Item, force?: boolean) => boolean;
|
|
51
|
+
|
|
52
|
+
/** Remove every member. */
|
|
53
|
+
readonly clear: () => void;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Members of this set or `other`.
|
|
57
|
+
*
|
|
58
|
+
* @param other Items to combine with.
|
|
59
|
+
* @returns A new, non-reactive set.
|
|
60
|
+
*/
|
|
61
|
+
readonly union: (other: Iterable<Item>) => Set<Item>;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Members of this set that are also in `other`.
|
|
65
|
+
*
|
|
66
|
+
* @param other Items to intersect with.
|
|
67
|
+
* @returns A new, non-reactive set.
|
|
68
|
+
*/
|
|
69
|
+
readonly intersection: (other: Iterable<Item>) => Set<Item>;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Members of this set that are not in `other`.
|
|
73
|
+
*
|
|
74
|
+
* @param other Items to subtract.
|
|
75
|
+
* @returns A new, non-reactive set.
|
|
76
|
+
*/
|
|
77
|
+
readonly difference: (other: Iterable<Item>) => Set<Item>;
|
|
78
|
+
|
|
79
|
+
/** Restore the creation-time members. */
|
|
80
|
+
readonly reset: () => void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Create a reactive `Set` with typed helpers.
|
|
85
|
+
*
|
|
86
|
+
* The member type is inferred from the initial items (`useSet(["a"])` is a
|
|
87
|
+
* `Set<string>`); pass a type argument for an initially empty set.
|
|
88
|
+
* Membership checks are tracked per item. The set-algebra helpers return
|
|
89
|
+
* new plain sets and do not require ES2025 `Set` methods.
|
|
90
|
+
*
|
|
91
|
+
* Purely synchronous state: safe during server rendering (no host globals,
|
|
92
|
+
* no timers) and nothing to dispose.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* const selected = useSet<number>();
|
|
97
|
+
* selected.toggle(3); // true
|
|
98
|
+
* selected.has(3); // true
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* @typeParam Item Member type, inferred from `initial`.
|
|
102
|
+
* @param initial Members added at creation and restored by `reset`.
|
|
103
|
+
* @default initial []
|
|
104
|
+
* @returns The reactive set and its helpers.
|
|
105
|
+
*/
|
|
106
|
+
export function useSet<Item = unknown>(initial: Iterable<Item> = []): SetControls<Item> {
|
|
107
|
+
const baseline: readonly Item[] = [...initial];
|
|
108
|
+
const set = shallowReactive(new Set<Item>(baseline));
|
|
109
|
+
|
|
110
|
+
const add = (item: Item): boolean => {
|
|
111
|
+
if (set.has(item)) return false;
|
|
112
|
+
set.add(item);
|
|
113
|
+
return true;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
set: shallowReadonly(set),
|
|
118
|
+
size: computed(() => set.size),
|
|
119
|
+
values: computed(() => [...set.values()]),
|
|
120
|
+
has: (item) => set.has(item),
|
|
121
|
+
add,
|
|
122
|
+
delete: (item) => set.delete(item),
|
|
123
|
+
toggle: (item, force) => {
|
|
124
|
+
const next = force ?? !set.has(item);
|
|
125
|
+
if (next) add(item);
|
|
126
|
+
else set.delete(item);
|
|
127
|
+
return next;
|
|
128
|
+
},
|
|
129
|
+
clear: () => {
|
|
130
|
+
set.clear();
|
|
131
|
+
},
|
|
132
|
+
union: (other) => {
|
|
133
|
+
const result = new Set<Item>(set);
|
|
134
|
+
for (const item of other) result.add(item);
|
|
135
|
+
return result;
|
|
136
|
+
},
|
|
137
|
+
intersection: (other) => {
|
|
138
|
+
const lookup = new Set<Item>(other);
|
|
139
|
+
const result = new Set<Item>();
|
|
140
|
+
for (const item of set) if (lookup.has(item)) result.add(item);
|
|
141
|
+
return result;
|
|
142
|
+
},
|
|
143
|
+
difference: (other) => {
|
|
144
|
+
const lookup = new Set<Item>(other);
|
|
145
|
+
const result = new Set<Item>();
|
|
146
|
+
for (const item of set) if (!lookup.has(item)) result.add(item);
|
|
147
|
+
return result;
|
|
148
|
+
},
|
|
149
|
+
reset: () => {
|
|
150
|
+
set.clear();
|
|
151
|
+
for (const item of baseline) set.add(item);
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|