@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,134 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
3
|
+
|
|
4
|
+
import { useLocale } from "./locale.ts";
|
|
5
|
+
|
|
6
|
+
/** CLDR plural categories. */
|
|
7
|
+
export type PluralCategory = Intl.LDMLPluralRule;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* One plural message: a template where `{count}` and `#` are replaced by the
|
|
11
|
+
* locale-formatted count, or a function receiving the raw and formatted count.
|
|
12
|
+
*/
|
|
13
|
+
export type PluralMessage = string | ((count: number, formatted: string) => string);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Messages per plural category. `other` is required because every locale
|
|
17
|
+
* falls back to it; exact-value overrides such as `"=0"` take precedence
|
|
18
|
+
* over categories.
|
|
19
|
+
*/
|
|
20
|
+
export type PluralMessages = {
|
|
21
|
+
readonly [Category in Exclude<PluralCategory, "other">]?: PluralMessage;
|
|
22
|
+
} & {
|
|
23
|
+
/** Required fallback message. */
|
|
24
|
+
readonly other: PluralMessage;
|
|
25
|
+
} & {
|
|
26
|
+
readonly [exact: `=${number}`]: PluralMessage | undefined;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Options for {@link usePluralRules}. */
|
|
30
|
+
export interface UsePluralRulesOptions extends Intl.PluralRulesOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Locale used for plural selection and count formatting. Pass it
|
|
33
|
+
* explicitly for hydration-stable server rendering.
|
|
34
|
+
*
|
|
35
|
+
* @default the browser language, otherwise "en"
|
|
36
|
+
*/
|
|
37
|
+
readonly locale?: string | Intl.Locale;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Reactive plural selection returned by {@link usePluralRules}. */
|
|
41
|
+
export interface PluralRulesControls {
|
|
42
|
+
/** Canonical locale in use. */
|
|
43
|
+
readonly locale: ComputedRef<string>;
|
|
44
|
+
|
|
45
|
+
/** Plural rules for the current locale and options. */
|
|
46
|
+
readonly rules: ComputedRef<Intl.PluralRules>;
|
|
47
|
+
|
|
48
|
+
/** Category of the current count. */
|
|
49
|
+
readonly category: ComputedRef<PluralCategory>;
|
|
50
|
+
|
|
51
|
+
/** Message for the current count with `{count}` / `#` interpolated. */
|
|
52
|
+
readonly message: ComputedRef<string>;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Plural category of any count.
|
|
56
|
+
*
|
|
57
|
+
* @param count Count to classify.
|
|
58
|
+
* @returns The CLDR category.
|
|
59
|
+
*/
|
|
60
|
+
readonly select: (count: number) => PluralCategory;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Message for any count.
|
|
64
|
+
*
|
|
65
|
+
* @param count Count to render.
|
|
66
|
+
* @returns The interpolated message.
|
|
67
|
+
*/
|
|
68
|
+
readonly format: (count: number) => string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function browserLanguage(): string | undefined {
|
|
72
|
+
return typeof window === "undefined" ? undefined : window.navigator.language;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function renderMessage(message: PluralMessage, count: number, formatted: string): string {
|
|
76
|
+
return typeof message === "function"
|
|
77
|
+
? message(count, formatted)
|
|
78
|
+
: message.replaceAll("{count}", formatted).replaceAll("#", formatted);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Choose and render a message by CLDR plural category (`Intl.PluralRules`).
|
|
83
|
+
*
|
|
84
|
+
* Messages are typed per category with a mandatory `other`, plus optional
|
|
85
|
+
* exact overrides (`"=0": "No items"`). Cardinal (`1 item`) and ordinal
|
|
86
|
+
* (`1st`, `2nd`) rules are supported via `type`. The count is formatted
|
|
87
|
+
* with the same locale for interpolation. Everything is derived state:
|
|
88
|
+
* no listeners or timers, deterministic during server rendering when the
|
|
89
|
+
* locale is explicit. Invalid options surface as the platform `RangeError`.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const { message } = usePluralRules(count, { "=0": "No files", one: "# file", other: "# files" }, { locale: "en" });
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @param count Reactive count.
|
|
97
|
+
* @param messages Reactive messages per category.
|
|
98
|
+
* @param options Reactive locale and `Intl.PluralRules` options.
|
|
99
|
+
* @default options {}
|
|
100
|
+
* @returns Reactive category, message, and selection helpers.
|
|
101
|
+
*/
|
|
102
|
+
export function usePluralRules(
|
|
103
|
+
count: MaybeRefOrGetter<number>,
|
|
104
|
+
messages: MaybeRefOrGetter<PluralMessages>,
|
|
105
|
+
options: MaybeRefOrGetter<UsePluralRulesOptions> = {},
|
|
106
|
+
): PluralRulesControls {
|
|
107
|
+
const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
|
|
108
|
+
const rules = computed(() => {
|
|
109
|
+
const { locale: _locale, ...ruleOptions } = toValue(options);
|
|
110
|
+
return new Intl.PluralRules(localeControls.locale.value, ruleOptions);
|
|
111
|
+
});
|
|
112
|
+
const numberFormat = computed(() => {
|
|
113
|
+
const { minimumFractionDigits, maximumFractionDigits } = toValue(options);
|
|
114
|
+
return localeControls.number({
|
|
115
|
+
...(minimumFractionDigits === undefined ? {} : { minimumFractionDigits }),
|
|
116
|
+
...(maximumFractionDigits === undefined ? {} : { maximumFractionDigits }),
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
const select = (value: number): PluralCategory => rules.value.select(value);
|
|
120
|
+
const format = (value: number): string => {
|
|
121
|
+
const table = toValue(messages);
|
|
122
|
+
const exact: `=${number}` = `=${value}`;
|
|
123
|
+
const message = table[exact] ?? table[select(value)] ?? table.other;
|
|
124
|
+
return renderMessage(message, value, numberFormat.value.format(value));
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
locale: localeControls.locale,
|
|
128
|
+
rules,
|
|
129
|
+
category: computed(() => select(toValue(count))),
|
|
130
|
+
message: computed(() => format(toValue(count))),
|
|
131
|
+
select,
|
|
132
|
+
format,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Track the value a reactive source held before its latest change.
|
|
6
|
+
*
|
|
7
|
+
* The semantics are precise and arity-based:
|
|
8
|
+
*
|
|
9
|
+
* - Without an `initial` argument the ref holds `undefined` until the source
|
|
10
|
+
* changes for the first time.
|
|
11
|
+
* - With an `initial` argument (including an explicit `undefined` when
|
|
12
|
+
* `Value` allows it) the ref holds that value until the first change, and
|
|
13
|
+
* the return type never widens with `undefined`.
|
|
14
|
+
* - Every synchronous write is observed (`flush: "sync"`), so a sequence of
|
|
15
|
+
* writes in one tick shifts the previous value step by step instead of
|
|
16
|
+
* collapsing into one batch.
|
|
17
|
+
* - Writes whose value is `Object.is`-equal to the current value do not
|
|
18
|
+
* count as changes, matching Vue's own change detection.
|
|
19
|
+
* - Tracking is shallow: reassignments are observed, in-place mutations of
|
|
20
|
+
* object values are not.
|
|
21
|
+
*
|
|
22
|
+
* Safe during server rendering: no browser globals are read and no timers
|
|
23
|
+
* start. The underlying watcher is bound to the current reactive scope and
|
|
24
|
+
* stops with it; call inside an active scope, or the watcher lives as long
|
|
25
|
+
* as the source. A plain non-reactive source never changes, so the ref stays
|
|
26
|
+
* at its initial value.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const route = shallowRef("/home");
|
|
31
|
+
* const previousRoute = usePrevious(route, "/");
|
|
32
|
+
* route.value = "/settings";
|
|
33
|
+
* previousRoute.value; // "/home"
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @param source Reactive source to observe.
|
|
37
|
+
* @param initial Value reported before the first change.
|
|
38
|
+
* @returns Readonly shallow ref holding the previous source value.
|
|
39
|
+
*/
|
|
40
|
+
export function usePrevious<Value>(
|
|
41
|
+
source: MaybeRefOrGetter<Value>,
|
|
42
|
+
): Readonly<ShallowRef<Value | undefined>>;
|
|
43
|
+
export function usePrevious<Value>(
|
|
44
|
+
source: MaybeRefOrGetter<Value>,
|
|
45
|
+
initial: Value,
|
|
46
|
+
): Readonly<ShallowRef<Value>>;
|
|
47
|
+
export function usePrevious<Value>(
|
|
48
|
+
source: MaybeRefOrGetter<Value>,
|
|
49
|
+
...initial: readonly [] | readonly [Value]
|
|
50
|
+
): Readonly<ShallowRef<Value | undefined>> {
|
|
51
|
+
const previous = shallowRef<Value | undefined>(initial.length === 1 ? initial[0] : undefined);
|
|
52
|
+
|
|
53
|
+
watch(
|
|
54
|
+
() => toValue(source),
|
|
55
|
+
(_next, replaced) => {
|
|
56
|
+
previous.value = replaced;
|
|
57
|
+
},
|
|
58
|
+
{ flush: "sync" },
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
return previous;
|
|
62
|
+
}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
hasInjectionContext,
|
|
4
|
+
readonly,
|
|
5
|
+
shallowReadonly,
|
|
6
|
+
shallowRef,
|
|
7
|
+
toValue,
|
|
8
|
+
watch,
|
|
9
|
+
watchPostEffect,
|
|
10
|
+
} from "vue";
|
|
11
|
+
import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
12
|
+
|
|
13
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
14
|
+
|
|
15
|
+
/** Push permission states. */
|
|
16
|
+
export type PushPermissionState = "granted" | "denied" | "prompt";
|
|
17
|
+
|
|
18
|
+
/** JSON form of a push subscription (`PushSubscription.toJSON()`). */
|
|
19
|
+
export interface PushSubscriptionJsonLike {
|
|
20
|
+
/** Push service endpoint. */
|
|
21
|
+
readonly endpoint?: string | undefined;
|
|
22
|
+
|
|
23
|
+
/** Expiration time in epoch milliseconds, if any. */
|
|
24
|
+
readonly expirationTime?: number | null | undefined;
|
|
25
|
+
|
|
26
|
+
/** Base64url-encoded keys (`p256dh`, `auth`). */
|
|
27
|
+
readonly keys?: Readonly<Record<string, string>> | undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Minimal `PushSubscription` consumed by {@link usePushSubscription}. */
|
|
31
|
+
export interface PushSubscriptionLike {
|
|
32
|
+
/** Push service endpoint. */
|
|
33
|
+
readonly endpoint: string;
|
|
34
|
+
|
|
35
|
+
/** Expiration time in epoch milliseconds, if any. */
|
|
36
|
+
readonly expirationTime: number | null;
|
|
37
|
+
|
|
38
|
+
/** Serialize for a server. */
|
|
39
|
+
toJSON(): PushSubscriptionJsonLike;
|
|
40
|
+
|
|
41
|
+
/** Cancel the subscription. */
|
|
42
|
+
unsubscribe(): Promise<boolean>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Options forwarded to `PushManager.subscribe`. */
|
|
46
|
+
export interface PushManagerSubscribeOptions {
|
|
47
|
+
/** VAPID public key bytes. */
|
|
48
|
+
readonly applicationServerKey: BufferSource;
|
|
49
|
+
|
|
50
|
+
/** Only user-visible notifications. */
|
|
51
|
+
readonly userVisibleOnly: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Minimal `PushManager` consumed by {@link usePushSubscription}. */
|
|
55
|
+
export interface PushManagerLike {
|
|
56
|
+
/** Create (or return the existing) subscription. */
|
|
57
|
+
subscribe(options: PushManagerSubscribeOptions): Promise<PushSubscriptionLike>;
|
|
58
|
+
|
|
59
|
+
/** Current subscription, if any. */
|
|
60
|
+
getSubscription(): Promise<PushSubscriptionLike | null>;
|
|
61
|
+
|
|
62
|
+
/** Permission state for push. */
|
|
63
|
+
permissionState(options?: { readonly userVisibleOnly?: boolean }): Promise<PushPermissionState>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Registration-like owner of a push manager. */
|
|
67
|
+
export interface PushRegistrationLike {
|
|
68
|
+
/** The registration's push manager. */
|
|
69
|
+
readonly pushManager: PushManagerLike;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Options for {@link usePushSubscription}. */
|
|
73
|
+
export interface UsePushSubscriptionOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Service worker registration owning the push manager. `null` while it is
|
|
76
|
+
* not known yet.
|
|
77
|
+
*
|
|
78
|
+
* @default window.navigator.serviceWorker.ready when push is available
|
|
79
|
+
*/
|
|
80
|
+
readonly registration?: MaybeRefOrGetter<PushRegistrationLike | null | undefined>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Load the existing subscription as soon as a registration is known.
|
|
84
|
+
*
|
|
85
|
+
* @default true
|
|
86
|
+
*/
|
|
87
|
+
readonly immediate?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Arguments of {@link PushSubscriptionControls.subscribe}. */
|
|
91
|
+
export interface PushSubscribeOptions {
|
|
92
|
+
/** VAPID public key as a base64url string or raw bytes. */
|
|
93
|
+
readonly applicationServerKey: string | BufferSource;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Only user-visible notifications (required by most browsers).
|
|
97
|
+
*
|
|
98
|
+
* @default true
|
|
99
|
+
*/
|
|
100
|
+
readonly userVisibleOnly?: boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Serializable snapshot of the current subscription. */
|
|
104
|
+
export interface PushSubscriptionSnapshot {
|
|
105
|
+
/** Push service endpoint. */
|
|
106
|
+
readonly endpoint: string;
|
|
107
|
+
|
|
108
|
+
/** Expiration time in epoch milliseconds, or `null`. */
|
|
109
|
+
readonly expirationTime: number | null;
|
|
110
|
+
|
|
111
|
+
/** Base64url-encoded keys (`p256dh`, `auth`). */
|
|
112
|
+
readonly keys: Readonly<Record<string, string>>;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Reactive state and actions returned by {@link usePushSubscription}. */
|
|
116
|
+
export interface PushSubscriptionControls {
|
|
117
|
+
/** Whether the Push API is available. */
|
|
118
|
+
readonly supported: ComputedRef<boolean>;
|
|
119
|
+
|
|
120
|
+
/** Current subscription, or `null`. */
|
|
121
|
+
readonly subscription: Readonly<ShallowRef<PushSubscriptionLike | null>>;
|
|
122
|
+
|
|
123
|
+
/** JSON snapshot of the current subscription, or `null`. */
|
|
124
|
+
readonly json: ComputedRef<PushSubscriptionSnapshot | null>;
|
|
125
|
+
|
|
126
|
+
/** Most recent failure, cleared by the next successful action. */
|
|
127
|
+
readonly error: Readonly<ShallowRef<unknown>>;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Subscribe to push messages. Rejects with a tagged `TypeError` when the
|
|
131
|
+
* key string is not valid base64url.
|
|
132
|
+
*
|
|
133
|
+
* @param options VAPID key and visibility flag.
|
|
134
|
+
* @returns The subscription, or `null` when unsupported or on failure.
|
|
135
|
+
*/
|
|
136
|
+
readonly subscribe: (options: PushSubscribeOptions) => Promise<PushSubscriptionLike | null>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cancel the current subscription.
|
|
140
|
+
*
|
|
141
|
+
* @returns Whether a subscription was cancelled.
|
|
142
|
+
*/
|
|
143
|
+
readonly unsubscribe: () => Promise<boolean>;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Re-read the existing subscription.
|
|
147
|
+
*
|
|
148
|
+
* @returns The subscription, or `null`.
|
|
149
|
+
*/
|
|
150
|
+
readonly refresh: () => Promise<PushSubscriptionLike | null>;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Query the push permission state.
|
|
154
|
+
*
|
|
155
|
+
* @param userVisibleOnly Query for user-visible pushes.
|
|
156
|
+
* @default userVisibleOnly true
|
|
157
|
+
* @returns The permission state, or `"unsupported"`.
|
|
158
|
+
*/
|
|
159
|
+
readonly permissionState: (
|
|
160
|
+
userVisibleOnly?: boolean,
|
|
161
|
+
) => Promise<PushPermissionState | "unsupported">;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const base64UrlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
165
|
+
|
|
166
|
+
function decodeApplicationServerKey(text: string): Uint8Array<ArrayBuffer> {
|
|
167
|
+
const clean = text.trim().replace(/=+$/u, "").replaceAll("+", "-").replaceAll("/", "_");
|
|
168
|
+
const invalid = (): TypeError =>
|
|
169
|
+
new TypeError(
|
|
170
|
+
"[VIZE_COMPOSE_PUSH_INVALID_KEY] applicationServerKey must be a base64url string.",
|
|
171
|
+
);
|
|
172
|
+
if (clean.length % 4 === 1) throw invalid();
|
|
173
|
+
const bytes = new Uint8Array(Math.floor((clean.length * 3) / 4));
|
|
174
|
+
let buffer = 0;
|
|
175
|
+
let bits = 0;
|
|
176
|
+
let offset = 0;
|
|
177
|
+
for (const character of clean) {
|
|
178
|
+
const value = base64UrlAlphabet.indexOf(character);
|
|
179
|
+
if (value === -1) throw invalid();
|
|
180
|
+
buffer = ((buffer << 6) | value) & 0xffffff;
|
|
181
|
+
bits += 6;
|
|
182
|
+
if (bits >= 8) {
|
|
183
|
+
bits -= 8;
|
|
184
|
+
bytes[offset] = (buffer >> bits) & 0xff;
|
|
185
|
+
offset += 1;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return bytes;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
interface ReadyContainer {
|
|
192
|
+
readonly ready: Promise<PushRegistrationLike>;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function browserContainer(): ReadyContainer | undefined {
|
|
196
|
+
if (typeof window === "undefined" || !("PushManager" in window)) return undefined;
|
|
197
|
+
const { navigator } = window;
|
|
198
|
+
return "serviceWorker" in navigator && navigator.serviceWorker
|
|
199
|
+
? navigator.serviceWorker
|
|
200
|
+
: undefined;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Manage a Web Push subscription.
|
|
205
|
+
*
|
|
206
|
+
* Uses the push manager of `options.registration`, or of
|
|
207
|
+
* `navigator.serviceWorker.ready` by default. The existing subscription is
|
|
208
|
+
* loaded when the registration becomes known; `subscribe` accepts the VAPID
|
|
209
|
+
* key as a base64url string. `json` is the snapshot to send to a push server.
|
|
210
|
+
* Nothing needs cleanup; pending results are ignored after the owning
|
|
211
|
+
* reactive scope stops.
|
|
212
|
+
*
|
|
213
|
+
* Server rendering: nothing is read, `supported` is false and the
|
|
214
|
+
* subscription is `null`.
|
|
215
|
+
* Inside a component the host is resolved after mounting, so hydration
|
|
216
|
+
* renders this server state first.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```ts
|
|
220
|
+
* const push = usePushSubscription();
|
|
221
|
+
* const enable = async () => {
|
|
222
|
+
* await push.subscribe({ applicationServerKey: VAPID_PUBLIC_KEY });
|
|
223
|
+
* await fetch("/api/push", { method: "POST", body: JSON.stringify(push.json.value) });
|
|
224
|
+
* };
|
|
225
|
+
* ```
|
|
226
|
+
*
|
|
227
|
+
* @param options Registration override and initial read policy.
|
|
228
|
+
* @default options {}
|
|
229
|
+
* @returns Subscription state and actions.
|
|
230
|
+
*/
|
|
231
|
+
export function usePushSubscription(
|
|
232
|
+
options: UsePushSubscriptionOptions = {},
|
|
233
|
+
): PushSubscriptionControls {
|
|
234
|
+
const subscription = shallowRef<PushSubscriptionLike | null>(null);
|
|
235
|
+
const error = shallowRef<unknown>(undefined);
|
|
236
|
+
let active = true;
|
|
237
|
+
|
|
238
|
+
// Inside a component the host is resolved only after mounting, so a
|
|
239
|
+
// hydrating client renders the server's unsupported state first. Outside
|
|
240
|
+
// components it resolves synchronously.
|
|
241
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
242
|
+
if (!hydrated.value) {
|
|
243
|
+
watchPostEffect(() => {
|
|
244
|
+
hydrated.value = true;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const source = (): PushRegistrationLike | ReadyContainer | undefined => {
|
|
249
|
+
if (!hydrated.value) return undefined;
|
|
250
|
+
return options.registration === undefined
|
|
251
|
+
? browserContainer()
|
|
252
|
+
: (toValue(options.registration) ?? undefined);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const resolveManager = async (): Promise<PushManagerLike | undefined> => {
|
|
256
|
+
const current = source();
|
|
257
|
+
if (!current) return undefined;
|
|
258
|
+
return "pushManager" in current ? current.pushManager : (await current.ready).pushManager;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const attempt = async <Value>(
|
|
262
|
+
fallback: Value,
|
|
263
|
+
action: (manager: PushManagerLike) => Promise<Value>,
|
|
264
|
+
): Promise<Value> => {
|
|
265
|
+
try {
|
|
266
|
+
const manager = await resolveManager();
|
|
267
|
+
if (!manager) return fallback;
|
|
268
|
+
const value = await action(manager);
|
|
269
|
+
if (active) error.value = undefined;
|
|
270
|
+
return value;
|
|
271
|
+
} catch (cause) {
|
|
272
|
+
if (active) error.value = cause;
|
|
273
|
+
return fallback;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const refresh = (): Promise<PushSubscriptionLike | null> =>
|
|
278
|
+
attempt(null, async (manager) => {
|
|
279
|
+
const current = await manager.getSubscription();
|
|
280
|
+
if (active) subscription.value = current;
|
|
281
|
+
return current;
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
const subscribe = async ({
|
|
285
|
+
applicationServerKey,
|
|
286
|
+
userVisibleOnly = true,
|
|
287
|
+
}: PushSubscribeOptions): Promise<PushSubscriptionLike | null> => {
|
|
288
|
+
const key =
|
|
289
|
+
typeof applicationServerKey === "string"
|
|
290
|
+
? decodeApplicationServerKey(applicationServerKey)
|
|
291
|
+
: applicationServerKey;
|
|
292
|
+
return attempt(null, async (manager) => {
|
|
293
|
+
const next = await manager.subscribe({ applicationServerKey: key, userVisibleOnly });
|
|
294
|
+
if (active) subscription.value = next;
|
|
295
|
+
return next;
|
|
296
|
+
});
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const unsubscribe = async (): Promise<boolean> => {
|
|
300
|
+
const current = subscription.value;
|
|
301
|
+
if (!current) return false;
|
|
302
|
+
try {
|
|
303
|
+
const removed = await current.unsubscribe();
|
|
304
|
+
if (active && removed && subscription.value === current) subscription.value = null;
|
|
305
|
+
if (active) error.value = undefined;
|
|
306
|
+
return removed;
|
|
307
|
+
} catch (cause) {
|
|
308
|
+
if (active) error.value = cause;
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const permissionState = (userVisibleOnly = true): Promise<PushPermissionState | "unsupported"> =>
|
|
314
|
+
attempt<PushPermissionState | "unsupported">("unsupported", (manager) =>
|
|
315
|
+
manager.permissionState({ userVisibleOnly }),
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
if (options.immediate ?? true) {
|
|
319
|
+
watch(
|
|
320
|
+
source,
|
|
321
|
+
(current) => {
|
|
322
|
+
if (current) void refresh();
|
|
323
|
+
else subscription.value = null;
|
|
324
|
+
},
|
|
325
|
+
{ immediate: true },
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
tryOnScopeDispose(() => {
|
|
330
|
+
active = false;
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
supported: computed(() => source() !== undefined),
|
|
335
|
+
subscription: shallowReadonly(subscription),
|
|
336
|
+
json: computed(() => {
|
|
337
|
+
const current = subscription.value;
|
|
338
|
+
if (!current) return null;
|
|
339
|
+
const serialized = current.toJSON();
|
|
340
|
+
return {
|
|
341
|
+
endpoint: serialized.endpoint ?? current.endpoint,
|
|
342
|
+
expirationTime: serialized.expirationTime ?? current.expirationTime,
|
|
343
|
+
keys: serialized.keys ?? {},
|
|
344
|
+
};
|
|
345
|
+
}),
|
|
346
|
+
error: readonly(error),
|
|
347
|
+
subscribe,
|
|
348
|
+
unsubscribe,
|
|
349
|
+
refresh,
|
|
350
|
+
permissionState,
|
|
351
|
+
};
|
|
352
|
+
}
|