@vizejs/composable 0.426.2 → 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,231 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, hasInjectionContext, readonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
|
|
3
|
+
//#region src/use-navigation-api.ts
|
|
4
|
+
function isNavigationHost(candidate) {
|
|
5
|
+
return typeof candidate === "object" && candidate !== null && typeof Reflect.get(candidate, "navigate") === "function" && typeof Reflect.get(candidate, "addEventListener") === "function";
|
|
6
|
+
}
|
|
7
|
+
function browserNavigation() {
|
|
8
|
+
if (typeof window === "undefined") return void 0;
|
|
9
|
+
const candidate = Reflect.get(window, "navigation");
|
|
10
|
+
return isNavigationHost(candidate) ? candidate : void 0;
|
|
11
|
+
}
|
|
12
|
+
function isNavigateEvent(event) {
|
|
13
|
+
return "destination" in event && "canIntercept" in event && "intercept" in event;
|
|
14
|
+
}
|
|
15
|
+
function isEntryChangeEvent(event) {
|
|
16
|
+
return "from" in event && "navigationType" in event;
|
|
17
|
+
}
|
|
18
|
+
function snapshot(entry) {
|
|
19
|
+
return {
|
|
20
|
+
url: entry.url,
|
|
21
|
+
key: entry.key,
|
|
22
|
+
id: entry.id,
|
|
23
|
+
index: entry.index,
|
|
24
|
+
sameDocument: entry.sameDocument
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function ignore() {}
|
|
28
|
+
/**
|
|
29
|
+
* Reactive access to the Navigation API (`window.navigation`).
|
|
30
|
+
*
|
|
31
|
+
* Entry snapshots refresh on `currententrychange`, `navigatesuccess` and
|
|
32
|
+
* `navigateerror`. Actions resolve to a {@link NavigationOutcome} and never
|
|
33
|
+
* reject; failures also land in `error`. Listeners (including interceptors)
|
|
34
|
+
* are removed when the owning reactive scope stops; outside a scope the
|
|
35
|
+
* caller removes them with the returned functions.
|
|
36
|
+
*
|
|
37
|
+
* Server rendering: nothing is read or subscribed; `supported` is false,
|
|
38
|
+
* `currentEntry` null, `entries` empty, and actions resolve to
|
|
39
|
+
* `{ status: "unsupported" }`.
|
|
40
|
+
* Inside a component the host is resolved after mounting, so hydration
|
|
41
|
+
* renders this server state first.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const nav = useNavigationApi<{ tab: string }>();
|
|
46
|
+
* nav.intercept((url) => url.pathname.startsWith("/app/"), {
|
|
47
|
+
* handler: async () => renderRoute(location.pathname),
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @param options Navigation host and state parser.
|
|
52
|
+
* @default options {}
|
|
53
|
+
* @returns Navigation state, hooks and actions.
|
|
54
|
+
*/
|
|
55
|
+
function useNavigationApi(options = {}) {
|
|
56
|
+
const currentEntry = shallowRef(null);
|
|
57
|
+
const entries = shallowRef([]);
|
|
58
|
+
const canGoBack = shallowRef(false);
|
|
59
|
+
const canGoForward = shallowRef(false);
|
|
60
|
+
const transition = shallowRef(null);
|
|
61
|
+
const state = shallowRef(void 0);
|
|
62
|
+
const error = shallowRef(void 0);
|
|
63
|
+
const navigateListeners = /* @__PURE__ */ new Set();
|
|
64
|
+
const successListeners = /* @__PURE__ */ new Set();
|
|
65
|
+
const errorListeners = /* @__PURE__ */ new Set();
|
|
66
|
+
const changeListeners = /* @__PURE__ */ new Set();
|
|
67
|
+
const hydrated = shallowRef(!hasInjectionContext());
|
|
68
|
+
if (!hydrated.value) watchPostEffect(() => {
|
|
69
|
+
hydrated.value = true;
|
|
70
|
+
});
|
|
71
|
+
const resolveHost = () => {
|
|
72
|
+
if (!hydrated.value) return void 0;
|
|
73
|
+
if (options.navigation === void 0) return browserNavigation();
|
|
74
|
+
return toValue(options.navigation) ?? void 0;
|
|
75
|
+
};
|
|
76
|
+
const parse = (raw) => {
|
|
77
|
+
if (options.parseState) return options.parseState(raw);
|
|
78
|
+
return raw;
|
|
79
|
+
};
|
|
80
|
+
const getState = () => {
|
|
81
|
+
const entry = resolveHost()?.currentEntry;
|
|
82
|
+
return entry ? parse(entry.getState()) : void 0;
|
|
83
|
+
};
|
|
84
|
+
const refresh = (host) => {
|
|
85
|
+
const entry = host?.currentEntry ?? null;
|
|
86
|
+
currentEntry.value = entry ? snapshot(entry) : null;
|
|
87
|
+
entries.value = host ? host.entries().map(snapshot) : [];
|
|
88
|
+
canGoBack.value = host?.canGoBack ?? false;
|
|
89
|
+
canGoForward.value = host?.canGoForward ?? false;
|
|
90
|
+
const active = host?.transition ?? null;
|
|
91
|
+
transition.value = active ? {
|
|
92
|
+
navigationType: active.navigationType,
|
|
93
|
+
from: snapshot(active.from)
|
|
94
|
+
} : null;
|
|
95
|
+
state.value = entry ? parse(entry.getState()) : void 0;
|
|
96
|
+
};
|
|
97
|
+
const add = (set, listener) => {
|
|
98
|
+
set.add(listener);
|
|
99
|
+
return () => {
|
|
100
|
+
set.delete(listener);
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
const stopWatch = watch(resolveHost, (host, _previous, onCleanup) => {
|
|
104
|
+
refresh(host);
|
|
105
|
+
if (!host) return;
|
|
106
|
+
const onNavigate = (event) => {
|
|
107
|
+
if (!isNavigateEvent(event)) return;
|
|
108
|
+
for (const listener of Array.from(navigateListeners)) listener(event);
|
|
109
|
+
};
|
|
110
|
+
const onSuccess = () => {
|
|
111
|
+
refresh(host);
|
|
112
|
+
for (const listener of Array.from(successListeners)) listener();
|
|
113
|
+
};
|
|
114
|
+
const onError = (event) => {
|
|
115
|
+
refresh(host);
|
|
116
|
+
const cause = Reflect.get(event, "error");
|
|
117
|
+
error.value = cause;
|
|
118
|
+
for (const listener of Array.from(errorListeners)) listener(cause);
|
|
119
|
+
};
|
|
120
|
+
const onChange = (event) => {
|
|
121
|
+
refresh(host);
|
|
122
|
+
if (!isEntryChangeEvent(event)) return;
|
|
123
|
+
const change = {
|
|
124
|
+
navigationType: event.navigationType,
|
|
125
|
+
from: snapshot(event.from)
|
|
126
|
+
};
|
|
127
|
+
for (const listener of Array.from(changeListeners)) listener(change);
|
|
128
|
+
};
|
|
129
|
+
host.addEventListener("navigate", onNavigate);
|
|
130
|
+
host.addEventListener("navigatesuccess", onSuccess);
|
|
131
|
+
host.addEventListener("navigateerror", onError);
|
|
132
|
+
host.addEventListener("currententrychange", onChange);
|
|
133
|
+
onCleanup(() => {
|
|
134
|
+
host.removeEventListener("navigate", onNavigate);
|
|
135
|
+
host.removeEventListener("navigatesuccess", onSuccess);
|
|
136
|
+
host.removeEventListener("navigateerror", onError);
|
|
137
|
+
host.removeEventListener("currententrychange", onChange);
|
|
138
|
+
});
|
|
139
|
+
}, {
|
|
140
|
+
immediate: true,
|
|
141
|
+
flush: "sync"
|
|
142
|
+
});
|
|
143
|
+
const perform = async (action) => {
|
|
144
|
+
const host = resolveHost();
|
|
145
|
+
if (!host) return { status: "unsupported" };
|
|
146
|
+
try {
|
|
147
|
+
const result = action(host);
|
|
148
|
+
result.committed?.catch(ignore);
|
|
149
|
+
const entry = await result.finished ?? host.currentEntry;
|
|
150
|
+
error.value = void 0;
|
|
151
|
+
refresh(host);
|
|
152
|
+
return entry ? {
|
|
153
|
+
status: "success",
|
|
154
|
+
entry: snapshot(entry)
|
|
155
|
+
} : {
|
|
156
|
+
status: "error",
|
|
157
|
+
error: void 0
|
|
158
|
+
};
|
|
159
|
+
} catch (cause) {
|
|
160
|
+
error.value = cause;
|
|
161
|
+
return {
|
|
162
|
+
status: "error",
|
|
163
|
+
error: cause
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const intercept = (predicate, interceptOptions = {}) => add(navigateListeners, (event) => {
|
|
168
|
+
if (!event.canIntercept || event.hashChange || event.downloadRequest !== null) return;
|
|
169
|
+
const url = new URL(event.destination.url);
|
|
170
|
+
const current = resolveHost()?.currentEntry?.url;
|
|
171
|
+
if (current && new URL(current).origin !== url.origin) return;
|
|
172
|
+
if (!predicate(url, event)) return;
|
|
173
|
+
const { handler, focusReset, scroll } = interceptOptions;
|
|
174
|
+
event.intercept({
|
|
175
|
+
...handler ? { handler: async () => handler(event) } : {},
|
|
176
|
+
...focusReset ? { focusReset } : {},
|
|
177
|
+
...scroll ? { scroll } : {}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
const infoOption = (info) => info === void 0 ? {} : { info };
|
|
181
|
+
tryOnScopeDispose(() => {
|
|
182
|
+
stopWatch();
|
|
183
|
+
navigateListeners.clear();
|
|
184
|
+
successListeners.clear();
|
|
185
|
+
errorListeners.clear();
|
|
186
|
+
changeListeners.clear();
|
|
187
|
+
});
|
|
188
|
+
return {
|
|
189
|
+
supported: computed(() => resolveHost() !== void 0),
|
|
190
|
+
currentEntry: readonly(currentEntry),
|
|
191
|
+
entries: readonly(entries),
|
|
192
|
+
canGoBack: readonly(canGoBack),
|
|
193
|
+
canGoForward: readonly(canGoForward),
|
|
194
|
+
transition: readonly(transition),
|
|
195
|
+
state: computed(() => state.value),
|
|
196
|
+
error: readonly(error),
|
|
197
|
+
getState,
|
|
198
|
+
onNavigate: (listener) => add(navigateListeners, listener),
|
|
199
|
+
onNavigateSuccess: (listener) => add(successListeners, listener),
|
|
200
|
+
onNavigateError: (listener) => add(errorListeners, listener),
|
|
201
|
+
onCurrentEntryChange: (listener) => add(changeListeners, listener),
|
|
202
|
+
intercept,
|
|
203
|
+
navigate: (url, navigateOptions = {}) => perform((host) => host.navigate(url, {
|
|
204
|
+
..."state" in navigateOptions ? { state: navigateOptions.state } : {},
|
|
205
|
+
...navigateOptions.history ? { history: navigateOptions.history } : {},
|
|
206
|
+
...infoOption(navigateOptions.info)
|
|
207
|
+
})),
|
|
208
|
+
back: (info) => perform((host) => host.back(infoOption(info))),
|
|
209
|
+
forward: (info) => perform((host) => host.forward(infoOption(info))),
|
|
210
|
+
traverseTo: (key, info) => perform((host) => host.traverseTo(key, infoOption(info))),
|
|
211
|
+
reload: (reloadOptions = {}) => perform((host) => host.reload({
|
|
212
|
+
..."state" in reloadOptions ? { state: reloadOptions.state } : {},
|
|
213
|
+
...infoOption(reloadOptions.info)
|
|
214
|
+
})),
|
|
215
|
+
updateCurrentEntry: ({ state: next }) => {
|
|
216
|
+
const host = resolveHost();
|
|
217
|
+
if (!host) return false;
|
|
218
|
+
try {
|
|
219
|
+
host.updateCurrentEntry({ state: next });
|
|
220
|
+
error.value = void 0;
|
|
221
|
+
refresh(host);
|
|
222
|
+
return true;
|
|
223
|
+
} catch (cause) {
|
|
224
|
+
error.value = cause;
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//#endregion
|
|
231
|
+
export { useNavigationApi };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRef, MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-notification.d.ts
|
|
4
|
+
/** Notification permission, plus `"unsupported"` when the API is missing. */
|
|
5
|
+
type NotificationPermissionState = "default" | "granted" | "denied" | "unsupported";
|
|
6
|
+
/** Options accepted by the `Notification` constructor. */
|
|
7
|
+
interface NotificationOptionsLike<Data> {
|
|
8
|
+
/** Body text. */
|
|
9
|
+
readonly body?: string;
|
|
10
|
+
/** Icon URL. */
|
|
11
|
+
readonly icon?: string;
|
|
12
|
+
/** Monochrome badge URL for constrained surfaces. */
|
|
13
|
+
readonly badge?: string;
|
|
14
|
+
/** Grouping tag; a new notification with the same tag replaces the old one. */
|
|
15
|
+
readonly tag?: string;
|
|
16
|
+
/** BCP 47 language tag. */
|
|
17
|
+
readonly lang?: string;
|
|
18
|
+
/** Text direction. */
|
|
19
|
+
readonly dir?: "auto" | "ltr" | "rtl";
|
|
20
|
+
/** Keep the notification visible until the user interacts with it. */
|
|
21
|
+
readonly requireInteraction?: boolean;
|
|
22
|
+
/** Suppress sounds and vibration. */
|
|
23
|
+
readonly silent?: boolean | null;
|
|
24
|
+
/** Application data attached to the notification. */
|
|
25
|
+
readonly data?: Data;
|
|
26
|
+
}
|
|
27
|
+
/** Minimal `Notification` instance consumed by {@link useWebNotification}. */
|
|
28
|
+
interface NotificationLike extends EventTarget {
|
|
29
|
+
/** Dismiss the notification. */
|
|
30
|
+
close(): void;
|
|
31
|
+
}
|
|
32
|
+
/** Minimal `Notification` constructor (with its static members). */
|
|
33
|
+
interface NotificationHost {
|
|
34
|
+
/** Current permission. */
|
|
35
|
+
readonly permission: string;
|
|
36
|
+
/** Ask the user for permission. */
|
|
37
|
+
requestPermission(): Promise<string>;
|
|
38
|
+
/** Show a notification. */
|
|
39
|
+
new (title: string, options?: NotificationOptionsLike<unknown>): NotificationLike;
|
|
40
|
+
}
|
|
41
|
+
/** Default notification content for {@link useWebNotification}. */
|
|
42
|
+
interface WebNotificationDefaults<Data> extends NotificationOptionsLike<Data> {
|
|
43
|
+
/** Default title. */
|
|
44
|
+
readonly title?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Options for {@link useWebNotification}. */
|
|
47
|
+
interface UseWebNotificationOptions<Data> {
|
|
48
|
+
/**
|
|
49
|
+
* Notification constructor for alternate runtimes and tests. A ref (not a
|
|
50
|
+
* getter) because the host itself is a constructor function.
|
|
51
|
+
*
|
|
52
|
+
* @default window.Notification when it exists
|
|
53
|
+
*/
|
|
54
|
+
readonly host?: MaybeRef<NotificationHost | null | undefined>;
|
|
55
|
+
/**
|
|
56
|
+
* Reactive default title and options merged into every `show` call.
|
|
57
|
+
*
|
|
58
|
+
* @default {}
|
|
59
|
+
*/
|
|
60
|
+
readonly defaults?: MaybeRefOrGetter<WebNotificationDefaults<Data>>;
|
|
61
|
+
/**
|
|
62
|
+
* Request permission from `show` when it has not been decided yet.
|
|
63
|
+
*
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
readonly requestPermissionOnShow?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** Discriminated outcome of {@link WebNotificationControls.show}. */
|
|
69
|
+
type WebNotificationResult = {
|
|
70
|
+
/** The notification is showing. */readonly status: "shown"; /** The shown notification. */
|
|
71
|
+
readonly notification: NotificationLike;
|
|
72
|
+
} | {
|
|
73
|
+
/** Permission is not granted, the API is missing, or construction failed. */readonly status: "denied" | "unsupported" | "failed"; /** Exact error thrown by the host, when one was thrown. */
|
|
74
|
+
readonly error: unknown;
|
|
75
|
+
};
|
|
76
|
+
/** Notification lifecycle events exposed by {@link useWebNotification}. */
|
|
77
|
+
type WebNotificationEvent = "click" | "show" | "error" | "close";
|
|
78
|
+
/** Reactive state and actions returned by {@link useWebNotification}. */
|
|
79
|
+
interface WebNotificationControls<Data> {
|
|
80
|
+
/** Whether the Notifications API is available. */
|
|
81
|
+
readonly supported: ComputedRef<boolean>;
|
|
82
|
+
/** Current permission state. */
|
|
83
|
+
readonly permission: Readonly<Ref<NotificationPermissionState>>;
|
|
84
|
+
/** Most recently shown notification, cleared when it closes. */
|
|
85
|
+
readonly notification: Readonly<ShallowRef<NotificationLike | undefined>>;
|
|
86
|
+
/** Data attached to the current notification. */
|
|
87
|
+
readonly data: Readonly<ShallowRef<Data | undefined>>;
|
|
88
|
+
/**
|
|
89
|
+
* Ask the user for permission.
|
|
90
|
+
*
|
|
91
|
+
* @returns The resulting permission state.
|
|
92
|
+
*/
|
|
93
|
+
readonly requestPermission: () => Promise<NotificationPermissionState>;
|
|
94
|
+
/**
|
|
95
|
+
* Show a notification, replacing the current one.
|
|
96
|
+
*
|
|
97
|
+
* @param title Title overriding the default.
|
|
98
|
+
* @param options Options merged over the defaults.
|
|
99
|
+
* @returns The discriminated outcome; never rejects.
|
|
100
|
+
*/
|
|
101
|
+
readonly show: (title?: string, options?: NotificationOptionsLike<Data>) => Promise<WebNotificationResult>;
|
|
102
|
+
/** Close the current notification. */
|
|
103
|
+
readonly close: () => void;
|
|
104
|
+
/**
|
|
105
|
+
* Subscribe to an event of every notification shown by this composable.
|
|
106
|
+
*
|
|
107
|
+
* @param event Lifecycle event.
|
|
108
|
+
* @param handler Called with the native event and its notification.
|
|
109
|
+
* @returns Unsubscribe function.
|
|
110
|
+
*/
|
|
111
|
+
readonly on: (event: WebNotificationEvent, handler: (event: Event, notification: NotificationLike) => void) => () => void;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Show typed Web Notifications with permission handling.
|
|
115
|
+
*
|
|
116
|
+
* `show` merges reactive defaults with per-call options, asks for
|
|
117
|
+
* permission first when it is still undecided (configurable), and resolves
|
|
118
|
+
* to a discriminated {@link WebNotificationResult}. Handlers registered with
|
|
119
|
+
* `on` apply to every notification this composable shows. The current
|
|
120
|
+
* notification is closed when the owning reactive scope stops.
|
|
121
|
+
*
|
|
122
|
+
* Server rendering: the API is never touched; `permission` is
|
|
123
|
+
* `"unsupported"` and `supported` is false.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* const notify = useWebNotification<{ id: string }>({ defaults: { icon: "/icon.png" } });
|
|
128
|
+
* notify.on("click", () => window.focus());
|
|
129
|
+
* await notify.show("Build finished", { data: { id: "42" } });
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* @typeParam Data Application data attached to notifications.
|
|
133
|
+
* @param options Capability, defaults, and permission policy.
|
|
134
|
+
* @default options {}
|
|
135
|
+
* @returns Notification state and actions.
|
|
136
|
+
*/
|
|
137
|
+
declare function useWebNotification<Data = unknown>(options?: UseWebNotificationOptions<Data>): WebNotificationControls<Data>;
|
|
138
|
+
//#endregion
|
|
139
|
+
export { NotificationHost, NotificationLike, NotificationOptionsLike, NotificationPermissionState, UseWebNotificationOptions, WebNotificationControls, WebNotificationDefaults, WebNotificationEvent, WebNotificationResult, useWebNotification };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { computed, readonly, ref, shallowRef, toValue, unref } from "vue";
|
|
3
|
+
//#region src/use-notification.ts
|
|
4
|
+
function browserNotificationHost() {
|
|
5
|
+
if (typeof window === "undefined") return void 0;
|
|
6
|
+
return "Notification" in window ? window.Notification : void 0;
|
|
7
|
+
}
|
|
8
|
+
function normalizePermission(permission) {
|
|
9
|
+
return permission === "granted" || permission === "denied" ? permission : "default";
|
|
10
|
+
}
|
|
11
|
+
const notificationEvents = [
|
|
12
|
+
"click",
|
|
13
|
+
"show",
|
|
14
|
+
"error",
|
|
15
|
+
"close"
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* Show typed Web Notifications with permission handling.
|
|
19
|
+
*
|
|
20
|
+
* `show` merges reactive defaults with per-call options, asks for
|
|
21
|
+
* permission first when it is still undecided (configurable), and resolves
|
|
22
|
+
* to a discriminated {@link WebNotificationResult}. Handlers registered with
|
|
23
|
+
* `on` apply to every notification this composable shows. The current
|
|
24
|
+
* notification is closed when the owning reactive scope stops.
|
|
25
|
+
*
|
|
26
|
+
* Server rendering: the API is never touched; `permission` is
|
|
27
|
+
* `"unsupported"` and `supported` is false.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const notify = useWebNotification<{ id: string }>({ defaults: { icon: "/icon.png" } });
|
|
32
|
+
* notify.on("click", () => window.focus());
|
|
33
|
+
* await notify.show("Build finished", { data: { id: "42" } });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @typeParam Data Application data attached to notifications.
|
|
37
|
+
* @param options Capability, defaults, and permission policy.
|
|
38
|
+
* @default options {}
|
|
39
|
+
* @returns Notification state and actions.
|
|
40
|
+
*/
|
|
41
|
+
function useWebNotification(options = {}) {
|
|
42
|
+
const resolveHost = () => options.host === void 0 ? browserNotificationHost() : unref(options.host) ?? void 0;
|
|
43
|
+
const readPermission = () => {
|
|
44
|
+
const host = resolveHost();
|
|
45
|
+
return host ? normalizePermission(host.permission) : "unsupported";
|
|
46
|
+
};
|
|
47
|
+
const permission = ref(readPermission());
|
|
48
|
+
const notification = shallowRef(void 0);
|
|
49
|
+
const data = shallowRef(void 0);
|
|
50
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
51
|
+
const requestPermission = async () => {
|
|
52
|
+
const host = resolveHost();
|
|
53
|
+
if (!host) return permission.value = "unsupported";
|
|
54
|
+
try {
|
|
55
|
+
permission.value = normalizePermission(await host.requestPermission());
|
|
56
|
+
} catch {
|
|
57
|
+
permission.value = readPermission();
|
|
58
|
+
}
|
|
59
|
+
return permission.value;
|
|
60
|
+
};
|
|
61
|
+
const close = () => {
|
|
62
|
+
notification.value?.close();
|
|
63
|
+
notification.value = void 0;
|
|
64
|
+
data.value = void 0;
|
|
65
|
+
};
|
|
66
|
+
const show = async (title, overrides) => {
|
|
67
|
+
const host = resolveHost();
|
|
68
|
+
if (!host) return {
|
|
69
|
+
status: "unsupported",
|
|
70
|
+
error: void 0
|
|
71
|
+
};
|
|
72
|
+
permission.value = readPermission();
|
|
73
|
+
if (permission.value === "default" && (options.requestPermissionOnShow ?? true)) await requestPermission();
|
|
74
|
+
if (permission.value !== "granted") return {
|
|
75
|
+
status: "denied",
|
|
76
|
+
error: void 0
|
|
77
|
+
};
|
|
78
|
+
const { title: defaultTitle = "", ...defaults } = toValue(options.defaults) ?? {};
|
|
79
|
+
const merged = {
|
|
80
|
+
...defaults,
|
|
81
|
+
...overrides
|
|
82
|
+
};
|
|
83
|
+
let created;
|
|
84
|
+
try {
|
|
85
|
+
created = new host(title ?? defaultTitle, merged);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
return {
|
|
88
|
+
status: "failed",
|
|
89
|
+
error
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
close();
|
|
93
|
+
notification.value = created;
|
|
94
|
+
data.value = merged.data;
|
|
95
|
+
for (const event of notificationEvents) created.addEventListener(event, (nativeEvent) => {
|
|
96
|
+
for (const handler of handlers.get(event) ?? []) handler(nativeEvent, created);
|
|
97
|
+
if (event === "close" && notification.value === created) {
|
|
98
|
+
notification.value = void 0;
|
|
99
|
+
data.value = void 0;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
status: "shown",
|
|
104
|
+
notification: created
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
const on = (event, handler) => {
|
|
108
|
+
let set = handlers.get(event);
|
|
109
|
+
if (!set) handlers.set(event, set = /* @__PURE__ */ new Set());
|
|
110
|
+
set.add(handler);
|
|
111
|
+
return () => {
|
|
112
|
+
set.delete(handler);
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
tryOnScopeDispose(() => {
|
|
116
|
+
close();
|
|
117
|
+
handlers.clear();
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
supported: computed(() => resolveHost() !== void 0),
|
|
121
|
+
permission: readonly(permission),
|
|
122
|
+
notification,
|
|
123
|
+
data,
|
|
124
|
+
requestPermission,
|
|
125
|
+
show,
|
|
126
|
+
close,
|
|
127
|
+
on
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
export { useWebNotification };
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { n as IntervalScheduler, r as PausableControls } from "./use-interval-BA55gTHT.mjs";
|
|
2
|
+
import { FrameScheduler } from "./use-raf-fn.mjs";
|
|
3
|
+
import { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
4
|
+
|
|
5
|
+
//#region src/use-now.d.ts
|
|
6
|
+
/** Options for {@link useTimestamp}. */
|
|
7
|
+
interface UseTimestampOptions<Controls extends boolean = false> {
|
|
8
|
+
/**
|
|
9
|
+
* Update cadence: a period in milliseconds (reactive), or
|
|
10
|
+
* `"requestAnimationFrame"` to update on every animation frame.
|
|
11
|
+
*
|
|
12
|
+
* @default 1000
|
|
13
|
+
*/
|
|
14
|
+
readonly interval?: MaybeRefOrGetter<number> | "requestAnimationFrame";
|
|
15
|
+
/**
|
|
16
|
+
* Milliseconds added to every reading, for example a server clock skew.
|
|
17
|
+
*
|
|
18
|
+
* @default 0
|
|
19
|
+
*/
|
|
20
|
+
readonly offset?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Clock source returning Unix epoch milliseconds.
|
|
23
|
+
*
|
|
24
|
+
* @default Date.now
|
|
25
|
+
*/
|
|
26
|
+
readonly now?: () => number;
|
|
27
|
+
/**
|
|
28
|
+
* Hydration-stable starting value. When set, the first reading is this
|
|
29
|
+
* value on both server and client instead of the live clock, and the live
|
|
30
|
+
* clock takes over on the first tick. Pass the server's render time here
|
|
31
|
+
* (for example through a payload) to avoid hydration mismatches.
|
|
32
|
+
*
|
|
33
|
+
* @default undefined (read the clock immediately)
|
|
34
|
+
*/
|
|
35
|
+
readonly initial?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Start updating as soon as the composable is created.
|
|
38
|
+
*
|
|
39
|
+
* @default true
|
|
40
|
+
*/
|
|
41
|
+
readonly immediate?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Starts host timers or frames when no browser `window` is available.
|
|
44
|
+
*
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
readonly runOnServer?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Repeating timer host for millisecond cadences.
|
|
50
|
+
*
|
|
51
|
+
* @default globalThis timer functions
|
|
52
|
+
*/
|
|
53
|
+
readonly scheduler?: IntervalScheduler;
|
|
54
|
+
/**
|
|
55
|
+
* Frame host for the `"requestAnimationFrame"` cadence.
|
|
56
|
+
*
|
|
57
|
+
* @default globalThis animation-frame functions when available
|
|
58
|
+
*/
|
|
59
|
+
readonly frameScheduler?: FrameScheduler;
|
|
60
|
+
/**
|
|
61
|
+
* Invoked after every update with the new timestamp.
|
|
62
|
+
*
|
|
63
|
+
* @default undefined
|
|
64
|
+
*/
|
|
65
|
+
readonly callback?: (timestamp: number) => void;
|
|
66
|
+
/**
|
|
67
|
+
* Return the full control object instead of the bare ref.
|
|
68
|
+
*
|
|
69
|
+
* @default false
|
|
70
|
+
*/
|
|
71
|
+
readonly controls?: Controls;
|
|
72
|
+
}
|
|
73
|
+
/** Options for {@link useNow}; identical to {@link UseTimestampOptions}. */
|
|
74
|
+
type UseNowOptions<Controls extends boolean = false> = UseTimestampOptions<Controls>;
|
|
75
|
+
/** Timestamp and controls returned by `useTimestamp({ controls: true })`. */
|
|
76
|
+
interface TimestampControls extends PausableControls {
|
|
77
|
+
/** Latest reading in Unix epoch milliseconds. */
|
|
78
|
+
readonly timestamp: Readonly<ShallowRef<number>>;
|
|
79
|
+
/**
|
|
80
|
+
* Read the clock immediately, store the value, and return it.
|
|
81
|
+
*
|
|
82
|
+
* @returns The new timestamp.
|
|
83
|
+
*/
|
|
84
|
+
readonly refresh: () => number;
|
|
85
|
+
}
|
|
86
|
+
/** Date and controls returned by `useNow({ controls: true })`. */
|
|
87
|
+
interface NowControls extends PausableControls {
|
|
88
|
+
/** Latest reading as a `Date`; a fresh instance per update. */
|
|
89
|
+
readonly now: ComputedRef<Date>;
|
|
90
|
+
/**
|
|
91
|
+
* Read the clock immediately, store the value, and return it.
|
|
92
|
+
*
|
|
93
|
+
* @returns The new date.
|
|
94
|
+
*/
|
|
95
|
+
readonly refresh: () => Date;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Reactive Unix timestamp in milliseconds.
|
|
99
|
+
*
|
|
100
|
+
* Updates on a millisecond interval or every animation frame. For SSR,
|
|
101
|
+
* supply {@link UseTimestampOptions.initial} (or an injected `now`) so the
|
|
102
|
+
* server and the hydrating client render the same value; no timer runs on
|
|
103
|
+
* the server. Timers stop with the owning reactive scope.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* const timestamp = useTimestamp({ interval: 250 });
|
|
108
|
+
* const { timestamp: t, pause } = useTimestamp({ controls: true });
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* @param options Cadence, clock, SSR, and scheduler policy.
|
|
112
|
+
* @default options {}
|
|
113
|
+
* @throws `RangeError` for invalid millisecond cadences (see `useIntervalFn`).
|
|
114
|
+
* @returns The timestamp ref, or the full controls when `controls` is `true`.
|
|
115
|
+
*/
|
|
116
|
+
declare function useTimestamp(options?: UseTimestampOptions<false>): Readonly<ShallowRef<number>>;
|
|
117
|
+
declare function useTimestamp(options: UseTimestampOptions<true>): TimestampControls;
|
|
118
|
+
/**
|
|
119
|
+
* Reactive current `Date`.
|
|
120
|
+
*
|
|
121
|
+
* Same cadence, SSR, and cleanup rules as {@link useTimestamp}; the value is
|
|
122
|
+
* a fresh `Date` derived from the latest timestamp.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* const now = useNow({ initial: serverRenderedAt });
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* @param options Cadence, clock, SSR, and scheduler policy.
|
|
130
|
+
* @default options {}
|
|
131
|
+
* @throws `RangeError` for invalid millisecond cadences (see `useIntervalFn`).
|
|
132
|
+
* @returns The date ref, or the full controls when `controls` is `true`.
|
|
133
|
+
*/
|
|
134
|
+
declare function useNow(options?: UseNowOptions<false>): ComputedRef<Date>;
|
|
135
|
+
declare function useNow(options: UseNowOptions<true>): NowControls;
|
|
136
|
+
//#endregion
|
|
137
|
+
export { NowControls, TimestampControls, UseNowOptions, UseTimestampOptions, useNow, useTimestamp };
|
package/dist/use-now.mjs
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useRafFn } from "./use-raf-fn.mjs";
|
|
2
|
+
import { useIntervalFn } from "./use-interval.mjs";
|
|
3
|
+
import { computed, shallowRef } from "vue";
|
|
4
|
+
//#region src/use-now.ts
|
|
5
|
+
function createTimestamp(options) {
|
|
6
|
+
const offset = options.offset ?? 0;
|
|
7
|
+
const read = options.now ?? Date.now;
|
|
8
|
+
const timestamp = shallowRef(options.initial ?? read() + offset);
|
|
9
|
+
const refresh = () => {
|
|
10
|
+
timestamp.value = read() + offset;
|
|
11
|
+
options.callback?.(timestamp.value);
|
|
12
|
+
return timestamp.value;
|
|
13
|
+
};
|
|
14
|
+
const interval = options.interval ?? 1e3;
|
|
15
|
+
return {
|
|
16
|
+
...interval === "requestAnimationFrame" ? useRafFn(refresh, {
|
|
17
|
+
immediate: options.immediate ?? true,
|
|
18
|
+
runOnServer: options.runOnServer ?? false,
|
|
19
|
+
...options.frameScheduler === void 0 ? {} : { scheduler: options.frameScheduler }
|
|
20
|
+
}) : useIntervalFn(refresh, interval, {
|
|
21
|
+
immediate: options.immediate ?? true,
|
|
22
|
+
runOnServer: options.runOnServer ?? false,
|
|
23
|
+
...options.scheduler === void 0 ? {} : { scheduler: options.scheduler }
|
|
24
|
+
}),
|
|
25
|
+
timestamp,
|
|
26
|
+
refresh
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function useTimestamp(options = {}) {
|
|
30
|
+
const controls = createTimestamp(options);
|
|
31
|
+
return options.controls === true ? controls : controls.timestamp;
|
|
32
|
+
}
|
|
33
|
+
function useNow(options = {}) {
|
|
34
|
+
const { timestamp, refresh, ...pausable } = createTimestamp(options);
|
|
35
|
+
const now = computed(() => new Date(timestamp.value));
|
|
36
|
+
if (options.controls !== true) return now;
|
|
37
|
+
return {
|
|
38
|
+
...pausable,
|
|
39
|
+
now,
|
|
40
|
+
refresh: () => new Date(refresh())
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { useNow, useTimestamp };
|