@vizejs/composable 0.426.3 → 0.427.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abort-signal.d.mts +1 -1
- package/dist/active-element.d.mts +37 -0
- package/dist/active-element.mjs +56 -0
- package/dist/animate.d.mts +114 -0
- package/dist/animate.mjs +157 -0
- package/dist/battery.d.mts +61 -0
- package/dist/battery.mjs +90 -0
- package/dist/breakpoints.d.mts +82 -0
- package/dist/breakpoints.mjs +91 -0
- package/dist/catalog-BeTXFKxF.d.mts +4188 -0
- package/dist/catalog-r4Z5nptX.mjs +5144 -0
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/color-mode.d.mts +131 -0
- package/dist/color-mode.mjs +133 -0
- package/dist/computed-async.d.mts +63 -0
- package/dist/computed-async.mjs +43 -0
- package/dist/computed-with-control.d.mts +44 -0
- package/dist/computed-with-control.mjs +54 -0
- package/dist/create-event-hook.d.mts +77 -0
- package/dist/create-event-hook.mjs +66 -0
- package/dist/create-global-state.d.mts +24 -0
- package/dist/create-global-state.mjs +34 -0
- package/dist/create-injection-state.d.mts +51 -0
- package/dist/create-injection-state.mjs +19 -0
- package/dist/create-shared-composable.d.mts +38 -0
- package/dist/create-shared-composable.mjs +54 -0
- package/dist/device-motion.d.mts +71 -0
- package/dist/device-motion.mjs +75 -0
- package/dist/device-orientation.d.mts +82 -0
- package/dist/device-orientation.mjs +86 -0
- package/dist/device-pixel-ratio.d.mts +45 -0
- package/dist/device-pixel-ratio.mjs +50 -0
- package/dist/document-visibility.mjs +6 -2
- package/dist/draggable.d.mts +121 -0
- package/dist/draggable.mjs +153 -0
- package/dist/element-bounding.d.mts +87 -0
- package/dist/element-bounding.mjs +95 -0
- package/dist/element-by-point.d.mts +70 -0
- package/dist/element-by-point.mjs +69 -0
- package/dist/element-hover.d.mts +42 -0
- package/dist/element-hover.mjs +70 -0
- package/dist/element-ref.d.mts +34 -0
- package/dist/element-ref.mjs +23 -0
- package/dist/element-target-Crpxl4D9.d.mts +60 -0
- package/dist/element-target.d.mts +2 -0
- package/dist/element-target.mjs +58 -0
- package/dist/event-listener.mjs +7 -3
- package/dist/focus.d.mts +69 -0
- package/dist/focus.mjs +124 -0
- package/dist/fps.d.mts +59 -0
- package/dist/fps.mjs +64 -0
- package/dist/geolocation.d.mts +98 -0
- package/dist/geolocation.mjs +86 -0
- package/dist/i18n.d.mts +237 -0
- package/dist/i18n.mjs +215 -0
- package/dist/icu-message.d.mts +235 -0
- package/dist/icu-message.mjs +343 -0
- package/dist/idle.d.mts +79 -0
- package/dist/idle.mjs +90 -0
- package/dist/index.d.mts +172 -6
- package/dist/index.mjs +173 -7
- package/dist/infinite-scroll.d.mts +56 -0
- package/dist/infinite-scroll.mjs +72 -0
- package/dist/intersection-observer.d.mts +122 -0
- package/dist/intersection-observer.mjs +117 -0
- package/dist/magic-keys.d.mts +121 -0
- package/dist/magic-keys.mjs +163 -0
- package/dist/math.d.mts +96 -0
- package/dist/math.mjs +84 -0
- package/dist/media-query.d.mts +3 -1
- package/dist/media-query.mjs +5 -3
- package/dist/mouse-in-element.d.mts +49 -0
- package/dist/mouse-in-element.mjs +66 -0
- package/dist/mouse.d.mts +77 -0
- package/dist/mouse.mjs +100 -0
- package/dist/mutation-observer.d.mts +98 -0
- package/dist/mutation-observer.mjs +69 -0
- package/dist/network.d.mts +96 -0
- package/dist/network.mjs +117 -0
- package/dist/on-click-outside.d.mts +69 -0
- package/dist/on-click-outside.mjs +115 -0
- package/dist/on-key-stroke.d.mts +71 -0
- package/dist/on-key-stroke.mjs +79 -0
- package/dist/on-long-press.d.mts +82 -0
- package/dist/on-long-press.mjs +105 -0
- package/dist/on-start-typing.d.mts +44 -0
- package/dist/on-start-typing.mjs +61 -0
- package/dist/page-leave.d.mts +26 -0
- package/dist/page-leave.mjs +40 -0
- package/dist/parent-element.d.mts +16 -0
- package/dist/parent-element.mjs +27 -0
- package/dist/pinch.d.mts +73 -0
- package/dist/pinch.mjs +138 -0
- package/dist/pointer-lock.d.mts +79 -0
- package/dist/pointer-lock.mjs +126 -0
- package/dist/pointer.d.mts +78 -0
- package/dist/pointer.mjs +95 -0
- package/dist/preferences.d.mts +55 -0
- package/dist/preferences.mjs +63 -0
- package/dist/preferred-languages.d.mts +43 -0
- package/dist/preferred-languages.mjs +44 -0
- package/dist/reactify.d.mts +28 -0
- package/dist/reactify.mjs +7 -0
- package/dist/ref-auto-reset.d.mts +47 -0
- package/dist/ref-auto-reset.mjs +70 -0
- package/dist/ref-debounced.d.mts +29 -0
- package/dist/ref-debounced.mjs +29 -0
- package/dist/ref-default.d.mts +27 -0
- package/dist/ref-default.mjs +33 -0
- package/dist/resize-observer.d.mts +96 -0
- package/dist/resize-observer.mjs +111 -0
- package/dist/resolver.d.mts +124 -0
- package/dist/resolver.mjs +138 -0
- package/dist/retry-async.d.mts +2 -2
- package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
- package/dist/retry-delay.d.mts +1 -72
- package/dist/screen-orientation.d.mts +77 -0
- package/dist/screen-orientation.mjs +74 -0
- package/dist/scroll-lock.d.mts +37 -0
- package/dist/scroll-lock.mjs +50 -0
- package/dist/scroll.d.mts +158 -0
- package/dist/scroll.mjs +172 -0
- package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
- package/dist/standard-schema.d.mts +2 -0
- package/dist/standard-schema.mjs +60 -0
- package/dist/swipe.d.mts +125 -0
- package/dist/swipe.mjs +225 -0
- package/dist/sync-ref.d.mts +80 -0
- package/dist/sync-ref.mjs +43 -0
- package/dist/text-selection.d.mts +46 -0
- package/dist/text-selection.mjs +62 -0
- package/dist/textarea-autosize.d.mts +58 -0
- package/dist/textarea-autosize.mjs +54 -0
- package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
- package/dist/timeout-scheduler.d.mts +1 -17
- package/dist/to-reactive.d.mts +26 -0
- package/dist/to-reactive.mjs +46 -0
- package/dist/transition.d.mts +125 -0
- package/dist/transition.mjs +266 -0
- package/dist/until.d.mts +177 -0
- package/dist/until.mjs +111 -0
- package/dist/use-array.d.mts +112 -0
- package/dist/use-array.mjs +90 -0
- package/dist/use-async-queue.d.mts +109 -0
- package/dist/use-async-queue.mjs +96 -0
- package/dist/use-async-state.d.mts +86 -0
- package/dist/use-async-state.mjs +41 -0
- package/dist/use-barcode-detector.d.mts +159 -0
- package/dist/use-barcode-detector.mjs +143 -0
- package/dist/use-bluetooth.d.mts +164 -0
- package/dist/use-bluetooth.mjs +183 -0
- package/dist/use-broadcast-channel.d.mts +115 -0
- package/dist/use-broadcast-channel.mjs +121 -0
- package/dist/use-builtin-ai.d.mts +342 -0
- package/dist/use-builtin-ai.mjs +261 -0
- package/dist/use-clipboard.d.mts +169 -0
- package/dist/use-clipboard.mjs +226 -0
- package/dist/use-compression-stream.d.mts +173 -0
- package/dist/use-compression-stream.mjs +166 -0
- package/dist/use-confirm-dialog.d.mts +70 -0
- package/dist/use-confirm-dialog.mjs +57 -0
- package/dist/use-contact-picker.d.mts +117 -0
- package/dist/use-contact-picker.mjs +103 -0
- package/dist/use-cookie.d.mts +196 -0
- package/dist/use-cookie.mjs +259 -0
- package/dist/use-countdown.d.mts +85 -0
- package/dist/use-countdown.mjs +74 -0
- package/dist/use-css-var.d.mts +96 -0
- package/dist/use-css-var.mjs +104 -0
- package/dist/use-cycle-list.d.mts +76 -0
- package/dist/use-cycle-list.mjs +39 -0
- package/dist/use-date-format.d.mts +103 -0
- package/dist/use-date-format.mjs +147 -0
- package/dist/use-date-time-format.d.mts +75 -0
- package/dist/use-date-time-format.mjs +53 -0
- package/dist/use-debounced.d.mts +1 -1
- package/dist/use-display-media.d.mts +62 -0
- package/dist/use-display-media.mjs +46 -0
- package/dist/use-display-names.d.mts +75 -0
- package/dist/use-display-names.mjs +52 -0
- package/dist/use-document-title.d.mts +88 -0
- package/dist/use-document-title.mjs +100 -0
- package/dist/use-drop-zone.d.mts +128 -0
- package/dist/use-drop-zone.mjs +154 -0
- package/dist/use-event-source.d.mts +184 -0
- package/dist/use-event-source.mjs +226 -0
- package/dist/use-eye-dropper.d.mts +79 -0
- package/dist/use-eye-dropper.mjs +68 -0
- package/dist/use-favicon.d.mts +78 -0
- package/dist/use-favicon.mjs +68 -0
- package/dist/use-fetch.d.mts +230 -0
- package/dist/use-fetch.mjs +263 -0
- package/dist/use-field.d.mts +107 -0
- package/dist/use-field.mjs +117 -0
- package/dist/use-file-dialog.d.mts +139 -0
- package/dist/use-file-dialog.mjs +101 -0
- package/dist/use-file-system-access.d.mts +184 -0
- package/dist/use-file-system-access.mjs +151 -0
- package/dist/use-form-field-props.d.mts +235 -0
- package/dist/use-form-field-props.mjs +164 -0
- package/dist/use-form.d.mts +324 -0
- package/dist/use-form.mjs +482 -0
- package/dist/use-fullscreen.d.mts +104 -0
- package/dist/use-fullscreen.mjs +95 -0
- package/dist/use-gamepad.d.mts +242 -0
- package/dist/use-gamepad.mjs +218 -0
- package/dist/use-hid.d.mts +160 -0
- package/dist/use-hid.mjs +156 -0
- package/dist/use-id-generator.d.mts +44 -0
- package/dist/use-id-generator.mjs +38 -0
- package/dist/use-image.d.mts +125 -0
- package/dist/use-image.mjs +109 -0
- package/dist/use-indexed-db.d.mts +207 -0
- package/dist/use-indexed-db.mjs +251 -0
- package/dist/use-interval-BA55gTHT.d.mts +140 -0
- package/dist/use-interval.d.mts +2 -0
- package/dist/use-interval.mjs +100 -0
- package/dist/use-list-format.d.mts +60 -0
- package/dist/use-list-format.mjs +40 -0
- package/dist/use-machine.d.mts +90 -0
- package/dist/use-machine.mjs +78 -0
- package/dist/use-map.d.mts +90 -0
- package/dist/use-map.mjs +70 -0
- package/dist/use-media-controls.d.mts +198 -0
- package/dist/use-media-controls.mjs +264 -0
- package/dist/use-memoize.d.mts +73 -0
- package/dist/use-memoize.mjs +28 -0
- package/dist/use-mounted.d.mts +24 -0
- package/dist/use-mounted.mjs +29 -0
- package/dist/use-navigation-api.d.mts +360 -0
- package/dist/use-navigation-api.mjs +231 -0
- package/dist/use-notification.d.mts +139 -0
- package/dist/use-notification.mjs +131 -0
- package/dist/use-now.d.mts +137 -0
- package/dist/use-now.mjs +44 -0
- package/dist/use-number-format.d.mts +73 -0
- package/dist/use-number-format.mjs +58 -0
- package/dist/use-object-url.d.mts +47 -0
- package/dist/use-object-url.mjs +54 -0
- package/dist/use-offset-pagination.d.mts +91 -0
- package/dist/use-offset-pagination.mjs +80 -0
- package/dist/use-payment-request.d.mts +239 -0
- package/dist/use-payment-request.mjs +206 -0
- package/dist/use-performance-observer.d.mts +285 -0
- package/dist/use-performance-observer.mjs +132 -0
- package/dist/use-permission.d.mts +99 -0
- package/dist/use-permission.mjs +92 -0
- package/dist/use-plural-rules.d.mts +79 -0
- package/dist/use-plural-rules.mjs +59 -0
- package/dist/use-push-subscription.d.mts +154 -0
- package/dist/use-push-subscription.mjs +146 -0
- package/dist/use-queue.d.mts +89 -0
- package/dist/use-queue.mjs +116 -0
- package/dist/use-raf-fn.d.mts +87 -0
- package/dist/use-raf-fn.mjs +99 -0
- package/dist/use-relative-time-format.d.mts +111 -0
- package/dist/use-relative-time-format.mjs +119 -0
- package/dist/use-request-idle-callback.d.mts +122 -0
- package/dist/use-request-idle-callback.mjs +147 -0
- package/dist/use-route-query.d.mts +149 -0
- package/dist/use-route-query.mjs +86 -0
- package/dist/use-scheduler-post-task.d.mts +156 -0
- package/dist/use-scheduler-post-task.mjs +182 -0
- package/dist/use-screen-details.d.mts +205 -0
- package/dist/use-screen-details.mjs +188 -0
- package/dist/use-script-tag.d.mts +162 -0
- package/dist/use-script-tag.mjs +171 -0
- package/dist/use-segmenter.d.mts +78 -0
- package/dist/use-segmenter.mjs +66 -0
- package/dist/use-selection.d.mts +125 -0
- package/dist/use-selection.mjs +77 -0
- package/dist/use-serial.d.mts +165 -0
- package/dist/use-serial.mjs +205 -0
- package/dist/use-service-worker.d.mts +177 -0
- package/dist/use-service-worker.mjs +178 -0
- package/dist/use-set.d.mts +96 -0
- package/dist/use-set.mjs +74 -0
- package/dist/use-share.d.mts +92 -0
- package/dist/use-share.mjs +99 -0
- package/dist/use-sorted-locale.d.mts +62 -0
- package/dist/use-sorted-locale.mjs +52 -0
- package/dist/use-sorted.d.mts +29 -0
- package/dist/use-sorted.mjs +14 -0
- package/dist/use-speech-recognition.d.mts +150 -0
- package/dist/use-speech-recognition.mjs +168 -0
- package/dist/use-speech-synthesis.d.mts +148 -0
- package/dist/use-speech-synthesis.mjs +152 -0
- package/dist/use-stack.d.mts +83 -0
- package/dist/use-stack.mjs +93 -0
- package/dist/use-stepper.d.mts +79 -0
- package/dist/use-stepper.mjs +52 -0
- package/dist/use-storage-estimate.d.mts +151 -0
- package/dist/use-storage-estimate.mjs +170 -0
- package/dist/use-storage.d.mts +214 -0
- package/dist/use-storage.mjs +415 -0
- package/dist/use-style-tag.d.mts +102 -0
- package/dist/use-style-tag.mjs +91 -0
- package/dist/use-supported.d.mts +23 -0
- package/dist/use-supported.mjs +26 -0
- package/dist/use-throttled.d.mts +1 -1
- package/dist/use-time-ago.d.mts +163 -0
- package/dist/use-time-ago.mjs +95 -0
- package/dist/use-timeout.d.mts +122 -0
- package/dist/use-timeout.mjs +65 -0
- package/dist/use-url-hash.d.mts +88 -0
- package/dist/use-url-hash.mjs +145 -0
- package/dist/use-url-search-params.d.mts +223 -0
- package/dist/use-url-search-params.mjs +295 -0
- package/dist/use-usb.d.mts +212 -0
- package/dist/use-usb.mjs +137 -0
- package/dist/use-user-activation.d.mts +83 -0
- package/dist/use-user-activation.mjs +113 -0
- package/dist/use-user-media.d.mts +194 -0
- package/dist/use-user-media.mjs +214 -0
- package/dist/use-v-model.d.mts +113 -0
- package/dist/use-v-model.mjs +40 -0
- package/dist/use-vibrate.d.mts +81 -0
- package/dist/use-vibrate.mjs +90 -0
- package/dist/use-view-transition.d.mts +106 -0
- package/dist/use-view-transition.mjs +101 -0
- package/dist/use-visual-viewport.d.mts +105 -0
- package/dist/use-visual-viewport.mjs +104 -0
- package/dist/use-wake-lock.d.mts +96 -0
- package/dist/use-wake-lock.mjs +106 -0
- package/dist/use-web-authn.d.mts +404 -0
- package/dist/use-web-authn.mjs +323 -0
- package/dist/use-web-locks.d.mts +180 -0
- package/dist/use-web-locks.mjs +136 -0
- package/dist/use-web-midi.d.mts +148 -0
- package/dist/use-web-midi.mjs +140 -0
- package/dist/use-web-vitals.d.mts +142 -0
- package/dist/use-web-vitals.mjs +248 -0
- package/dist/use-websocket.d.mts +218 -0
- package/dist/use-websocket.mjs +257 -0
- package/dist/use-worker-fn.d.mts +119 -0
- package/dist/use-worker-fn.mjs +162 -0
- package/dist/virtual-list.d.mts +105 -0
- package/dist/virtual-list.mjs +128 -0
- package/dist/watch-debounced.d.mts +84 -0
- package/dist/watch-debounced.mjs +84 -0
- package/dist/watch-ignorable.d.mts +47 -0
- package/dist/watch-ignorable.mjs +61 -0
- package/dist/watch-once.d.mts +29 -0
- package/dist/watch-once.mjs +10 -0
- package/dist/watch-pausable.d.mts +51 -0
- package/dist/watch-pausable.mjs +23 -0
- package/dist/watch-source.d.mts +29 -0
- package/dist/watch-source.mjs +1 -0
- package/dist/watch-throttled.d.mts +70 -0
- package/dist/watch-throttled.mjs +94 -0
- package/dist/whenever.d.mts +39 -0
- package/dist/whenever.mjs +41 -0
- package/dist/window-size.d.mts +87 -0
- package/dist/window-size.mjs +65 -0
- package/package.json +846 -5
- package/registry/files/abort-signal.ts +292 -0
- package/registry/files/active-element.ts +93 -0
- package/registry/files/animate.ts +322 -0
- package/registry/files/async-resource.ts +190 -0
- package/registry/files/battery.ts +166 -0
- package/registry/files/breakpoints.ts +166 -0
- package/registry/files/capability.ts +171 -0
- package/registry/files/color-mode.ts +274 -0
- package/registry/files/computed-async.ts +123 -0
- package/registry/files/computed-with-control.ts +80 -0
- package/registry/files/create-event-hook.ts +139 -0
- package/registry/files/create-global-state.ts +34 -0
- package/registry/files/create-injection-state.ts +75 -0
- package/registry/files/create-shared-composable.ts +74 -0
- package/registry/files/device-motion.ts +152 -0
- package/registry/files/device-orientation.ts +168 -0
- package/registry/files/device-pixel-ratio.ts +100 -0
- package/registry/files/disposal-scope.ts +201 -0
- package/registry/files/document-visibility.ts +152 -0
- package/registry/files/draggable.ts +273 -0
- package/registry/files/element-bounding.ts +175 -0
- package/registry/files/element-by-point.ts +149 -0
- package/registry/files/element-hover.ts +104 -0
- package/registry/files/element-ref.ts +58 -0
- package/registry/files/element-target.ts +99 -0
- package/registry/files/event-listener.ts +188 -0
- package/registry/files/focus.ts +181 -0
- package/registry/files/fps.ts +133 -0
- package/registry/files/geolocation.ts +214 -0
- package/registry/files/i18n.ts +524 -0
- package/registry/files/icu-message.ts +701 -0
- package/registry/files/idle.ts +176 -0
- package/registry/files/infinite-scroll.ts +135 -0
- package/registry/files/intersection-observer.ts +261 -0
- package/registry/files/locale.ts +148 -0
- package/registry/files/magic-keys.ts +298 -0
- package/registry/files/math.ts +175 -0
- package/registry/files/media-query.ts +102 -0
- package/registry/files/mouse-in-element.ts +107 -0
- package/registry/files/mouse.ts +167 -0
- package/registry/files/mutation-observer.ts +183 -0
- package/registry/files/network.ts +229 -0
- package/registry/files/on-click-outside.ts +178 -0
- package/registry/files/on-key-stroke.ts +135 -0
- package/registry/files/on-long-press.ts +188 -0
- package/registry/files/on-start-typing.ts +88 -0
- package/registry/files/page-leave.ts +57 -0
- package/registry/files/parent-element.ts +29 -0
- package/registry/files/pinch.ts +187 -0
- package/registry/files/pointer-lock.ts +232 -0
- package/registry/files/pointer.ts +153 -0
- package/registry/files/preferences.ts +98 -0
- package/registry/files/preferred-languages.ts +88 -0
- package/registry/files/reactify.ts +39 -0
- package/registry/files/ref-auto-reset.ts +102 -0
- package/registry/files/ref-debounced.ts +34 -0
- package/registry/files/ref-default.ts +35 -0
- package/registry/files/resize-observer.ts +220 -0
- package/registry/files/retry-async.ts +261 -0
- package/registry/files/retry-delay.ts +132 -0
- package/registry/files/scope.ts +21 -0
- package/registry/files/screen-orientation.ts +165 -0
- package/registry/files/scroll-lock.ts +80 -0
- package/registry/files/scroll.ts +338 -0
- package/registry/files/standard-schema.ts +163 -0
- package/registry/files/swipe.ts +321 -0
- package/registry/files/sync-ref.ts +166 -0
- package/registry/files/temporal.ts +182 -0
- package/registry/files/text-selection.ts +110 -0
- package/registry/files/textarea-autosize.ts +114 -0
- package/registry/files/timeout-scheduler.ts +16 -0
- package/registry/files/to-reactive.ts +44 -0
- package/registry/files/transition.ts +271 -0
- package/registry/files/until.ts +352 -0
- package/registry/files/use-array.ts +201 -0
- package/registry/files/use-async-queue.ts +278 -0
- package/registry/files/use-async-state.ts +139 -0
- package/registry/files/use-barcode-detector.ts +321 -0
- package/registry/files/use-bluetooth.ts +409 -0
- package/registry/files/use-broadcast-channel.ts +250 -0
- package/registry/files/use-builtin-ai.ts +674 -0
- package/registry/files/use-clipboard.ts +425 -0
- package/registry/files/use-compression-stream.ts +364 -0
- package/registry/files/use-confirm-dialog.ts +137 -0
- package/registry/files/use-contact-picker.ts +246 -0
- package/registry/files/use-cookie.ts +500 -0
- package/registry/files/use-countdown.ts +161 -0
- package/registry/files/use-counter.ts +147 -0
- package/registry/files/use-css-var.ts +191 -0
- package/registry/files/use-cycle-list.ts +136 -0
- package/registry/files/use-date-format.ts +281 -0
- package/registry/files/use-date-time-format.ts +113 -0
- package/registry/files/use-debounced.ts +163 -0
- package/registry/files/use-display-media.ts +89 -0
- package/registry/files/use-display-names.ts +122 -0
- package/registry/files/use-document-title.ts +196 -0
- package/registry/files/use-drop-zone.ts +287 -0
- package/registry/files/use-event-source.ts +470 -0
- package/registry/files/use-eye-dropper.ts +134 -0
- package/registry/files/use-favicon.ts +140 -0
- package/registry/files/use-fetch.ts +578 -0
- package/registry/files/use-field.ts +247 -0
- package/registry/files/use-file-dialog.ts +257 -0
- package/registry/files/use-file-system-access.ts +383 -0
- package/registry/files/use-form-field-props.ts +381 -0
- package/registry/files/use-form.ts +980 -0
- package/registry/files/use-fullscreen.ts +214 -0
- package/registry/files/use-gamepad.ts +463 -0
- package/registry/files/use-hid.ts +359 -0
- package/registry/files/use-history.ts +231 -0
- package/registry/files/use-id-generator.ts +61 -0
- package/registry/files/use-image.ts +253 -0
- package/registry/files/use-indexed-db.ts +508 -0
- package/registry/files/use-interval.ts +253 -0
- package/registry/files/use-list-format.ts +85 -0
- package/registry/files/use-machine.ts +171 -0
- package/registry/files/use-map.ts +145 -0
- package/registry/files/use-media-controls.ts +545 -0
- package/registry/files/use-memoize.ts +118 -0
- package/registry/files/use-mounted.ts +30 -0
- package/registry/files/use-navigation-api.ts +641 -0
- package/registry/files/use-notification.ts +285 -0
- package/registry/files/use-now.ts +194 -0
- package/registry/files/use-number-format.ts +120 -0
- package/registry/files/use-object-url.ts +87 -0
- package/registry/files/use-offset-pagination.ts +168 -0
- package/registry/files/use-payment-request.ts +465 -0
- package/registry/files/use-performance-observer.ts +469 -0
- package/registry/files/use-permission.ts +220 -0
- package/registry/files/use-plural-rules.ts +134 -0
- package/registry/files/use-previous.ts +62 -0
- package/registry/files/use-push-subscription.ts +352 -0
- package/registry/files/use-queue.ts +197 -0
- package/registry/files/use-raf-fn.ts +176 -0
- package/registry/files/use-relative-time-format.ts +201 -0
- package/registry/files/use-request-idle-callback.ts +278 -0
- package/registry/files/use-route-query.ts +300 -0
- package/registry/files/use-scheduler-post-task.ts +397 -0
- package/registry/files/use-screen-details.ts +393 -0
- package/registry/files/use-script-tag.ts +341 -0
- package/registry/files/use-segmenter.ts +147 -0
- package/registry/files/use-selection.ts +233 -0
- package/registry/files/use-serial.ts +404 -0
- package/registry/files/use-service-worker.ts +413 -0
- package/registry/files/use-set.ts +154 -0
- package/registry/files/use-share.ts +168 -0
- package/registry/files/use-sorted-locale.ts +130 -0
- package/registry/files/use-sorted.ts +49 -0
- package/registry/files/use-speech-recognition.ts +357 -0
- package/registry/files/use-speech-synthesis.ts +333 -0
- package/registry/files/use-stack.ts +164 -0
- package/registry/files/use-stepper.ts +166 -0
- package/registry/files/use-storage-estimate.ts +352 -0
- package/registry/files/use-storage.ts +635 -0
- package/registry/files/use-style-tag.ts +200 -0
- package/registry/files/use-supported.ts +26 -0
- package/registry/files/use-throttled.ts +215 -0
- package/registry/files/use-time-ago.ts +276 -0
- package/registry/files/use-timeout.ts +218 -0
- package/registry/files/use-toggle.ts +54 -0
- package/registry/files/use-url-hash.ts +280 -0
- package/registry/files/use-url-search-params.ts +497 -0
- package/registry/files/use-usb.ts +395 -0
- package/registry/files/use-user-activation.ts +215 -0
- package/registry/files/use-user-media.ts +422 -0
- package/registry/files/use-v-model.ts +210 -0
- package/registry/files/use-vibrate.ts +174 -0
- package/registry/files/use-view-transition.ts +229 -0
- package/registry/files/use-visual-viewport.ts +228 -0
- package/registry/files/use-wake-lock.ts +206 -0
- package/registry/files/use-web-authn.ts +793 -0
- package/registry/files/use-web-locks.ts +363 -0
- package/registry/files/use-web-midi.ts +306 -0
- package/registry/files/use-web-vitals.ts +409 -0
- package/registry/files/use-websocket.ts +553 -0
- package/registry/files/use-worker-fn.ts +306 -0
- package/registry/files/virtual-list.ts +230 -0
- package/registry/files/watch-debounced.ts +206 -0
- package/registry/files/watch-ignorable.ts +128 -0
- package/registry/files/watch-once.ts +46 -0
- package/registry/files/watch-pausable.ts +93 -0
- package/registry/files/watch-source.ts +51 -0
- package/registry/files/watch-throttled.ts +201 -0
- package/registry/files/whenever.ts +70 -0
- package/registry/files/window-size.ts +151 -0
- package/registry/registry.json +5792 -0
- package/dist/catalog-D2AL3xYl.d.mts +0 -523
- package/dist/catalog-D5SYCsgW.mjs +0 -549
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-script-tag.d.ts
|
|
4
|
+
/** `<script>` subset used by {@link useScriptTag}. */
|
|
5
|
+
interface ScriptTagElement extends EventTarget {
|
|
6
|
+
/** Read an attribute. */
|
|
7
|
+
getAttribute(name: string): string | null;
|
|
8
|
+
/** Write an attribute. */
|
|
9
|
+
setAttribute(name: string, value: string): void;
|
|
10
|
+
}
|
|
11
|
+
/** Document capability used by {@link useScriptTag}. */
|
|
12
|
+
interface ScriptTagHost {
|
|
13
|
+
/** Find an existing `<script>` whose `src` attribute equals `src`. */
|
|
14
|
+
findScript(src: string): ScriptTagElement | undefined;
|
|
15
|
+
/** Create a detached `<script>`. */
|
|
16
|
+
createScript(): ScriptTagElement;
|
|
17
|
+
/** Attach a script to `<head>`, starting its download. */
|
|
18
|
+
append(element: ScriptTagElement): void;
|
|
19
|
+
/** Detach a script. */
|
|
20
|
+
remove(element: ScriptTagElement): void;
|
|
21
|
+
}
|
|
22
|
+
/** Loading state of the script. */
|
|
23
|
+
type ScriptTagStatus = "idle" | "loading" | "loaded" | "error";
|
|
24
|
+
/** Discriminated outcome of {@link ScriptTagControls.load}. */
|
|
25
|
+
type ScriptTagResult = {
|
|
26
|
+
/** The script executed. */readonly status: "loaded"; /** Script element. */
|
|
27
|
+
readonly element: ScriptTagElement;
|
|
28
|
+
} | {
|
|
29
|
+
/** The script failed to load. */readonly status: "error"; /** Script element. */
|
|
30
|
+
readonly element: ScriptTagElement;
|
|
31
|
+
} | {
|
|
32
|
+
/** No document is available (server rendering) or the load was superseded. */readonly status: "unsupported" | "cancelled";
|
|
33
|
+
};
|
|
34
|
+
/** Options for {@link useScriptTag}. */
|
|
35
|
+
interface UseScriptTagOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Called once the script has loaded.
|
|
38
|
+
*
|
|
39
|
+
* @default undefined
|
|
40
|
+
*/
|
|
41
|
+
readonly onLoaded?: (element: ScriptTagElement) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Load when created and whenever `src` changes.
|
|
44
|
+
*
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
readonly immediate?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Set the `async` attribute.
|
|
50
|
+
*
|
|
51
|
+
* @default true
|
|
52
|
+
*/
|
|
53
|
+
readonly async?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Set the `defer` attribute.
|
|
56
|
+
*
|
|
57
|
+
* @default false
|
|
58
|
+
*/
|
|
59
|
+
readonly defer?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Script `type` (for example `"module"`).
|
|
62
|
+
*
|
|
63
|
+
* @default "text/javascript"
|
|
64
|
+
*/
|
|
65
|
+
readonly type?: string;
|
|
66
|
+
/**
|
|
67
|
+
* CORS mode (`crossorigin` attribute).
|
|
68
|
+
*
|
|
69
|
+
* @default undefined
|
|
70
|
+
*/
|
|
71
|
+
readonly crossOrigin?: "anonymous" | "use-credentials";
|
|
72
|
+
/**
|
|
73
|
+
* Referrer policy.
|
|
74
|
+
*
|
|
75
|
+
* @default undefined
|
|
76
|
+
*/
|
|
77
|
+
readonly referrerPolicy?: ReferrerPolicy;
|
|
78
|
+
/**
|
|
79
|
+
* Set the `nomodule` attribute.
|
|
80
|
+
*
|
|
81
|
+
* @default false
|
|
82
|
+
*/
|
|
83
|
+
readonly noModule?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* CSP nonce.
|
|
86
|
+
*
|
|
87
|
+
* @default undefined
|
|
88
|
+
*/
|
|
89
|
+
readonly nonce?: string;
|
|
90
|
+
/**
|
|
91
|
+
* Subresource integrity hash.
|
|
92
|
+
*
|
|
93
|
+
* @default undefined
|
|
94
|
+
*/
|
|
95
|
+
readonly integrity?: string;
|
|
96
|
+
/**
|
|
97
|
+
* Additional attributes.
|
|
98
|
+
*
|
|
99
|
+
* @default {}
|
|
100
|
+
*/
|
|
101
|
+
readonly attributes?: Readonly<Record<string, string>>;
|
|
102
|
+
/**
|
|
103
|
+
* Remove a script created by this composable when the owning scope stops.
|
|
104
|
+
*
|
|
105
|
+
* @default true
|
|
106
|
+
*/
|
|
107
|
+
readonly removeOnDispose?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Document capability for alternate runtimes and tests.
|
|
110
|
+
*
|
|
111
|
+
* @default window.document's `<head>`
|
|
112
|
+
*/
|
|
113
|
+
readonly host?: MaybeRefOrGetter<ScriptTagHost | null | undefined>;
|
|
114
|
+
}
|
|
115
|
+
/** Reactive state and actions returned by {@link useScriptTag}. */
|
|
116
|
+
interface ScriptTagControls {
|
|
117
|
+
/** Loading state. */
|
|
118
|
+
readonly status: Readonly<Ref<ScriptTagStatus>>;
|
|
119
|
+
/** Script element in use, if any. */
|
|
120
|
+
readonly element: Readonly<ShallowRef<ScriptTagElement | undefined>>;
|
|
121
|
+
/**
|
|
122
|
+
* Load the script (or reuse an existing tag with the same `src`).
|
|
123
|
+
* Concurrent calls share one load; `unload` and scope disposal resolve a
|
|
124
|
+
* pending load as `"cancelled"`.
|
|
125
|
+
*
|
|
126
|
+
* @returns The discriminated outcome; never rejects.
|
|
127
|
+
*/
|
|
128
|
+
readonly load: () => Promise<ScriptTagResult>;
|
|
129
|
+
/** Remove a script created by this composable and reset the state. */
|
|
130
|
+
readonly unload: () => void;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Inject a `<script>` tag and track its loading state.
|
|
134
|
+
*
|
|
135
|
+
* An existing tag with the same `src` is reused instead of duplicated: if
|
|
136
|
+
* it was created by another `useScriptTag` call its state is shared through
|
|
137
|
+
* a `data-vize-script-status` attribute; a tag without that attribute (for
|
|
138
|
+
* example emitted in server-rendered HTML) is assumed to have executed.
|
|
139
|
+
* Changing the reactive `src` unloads the previous script and, with
|
|
140
|
+
* `immediate`, loads the new one.
|
|
141
|
+
*
|
|
142
|
+
* Server rendering: no document exists, so nothing is injected, `status`
|
|
143
|
+
* stays `"idle"`, and `load` resolves `"unsupported"`. Emit server-side
|
|
144
|
+
* script tags through the application's head manager. Scripts created by
|
|
145
|
+
* this composable are removed when the owning scope stops (configurable);
|
|
146
|
+
* already-executed code cannot be unloaded.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const { status } = useScriptTag("https://example.com/widget.js", {
|
|
151
|
+
* onLoaded: () => window.Widget.init(),
|
|
152
|
+
* });
|
|
153
|
+
* ```
|
|
154
|
+
*
|
|
155
|
+
* @param src Reactive script URL.
|
|
156
|
+
* @param options Attributes, lifecycle, and capability.
|
|
157
|
+
* @default options {}
|
|
158
|
+
* @returns Loading state and actions.
|
|
159
|
+
*/
|
|
160
|
+
declare function useScriptTag(src: MaybeRefOrGetter<string>, options?: UseScriptTagOptions): ScriptTagControls;
|
|
161
|
+
//#endregion
|
|
162
|
+
export { ScriptTagControls, ScriptTagElement, ScriptTagHost, ScriptTagResult, ScriptTagStatus, UseScriptTagOptions, useScriptTag };
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { tryOnScopeDispose } from "./scope.mjs";
|
|
2
|
+
import { readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
3
|
+
//#region src/use-script-tag.ts
|
|
4
|
+
const STATUS_ATTRIBUTE = "data-vize-script-status";
|
|
5
|
+
function browserScriptHost() {
|
|
6
|
+
if (typeof window === "undefined") return void 0;
|
|
7
|
+
const { document, HTMLScriptElement, CSS } = window;
|
|
8
|
+
return {
|
|
9
|
+
findScript: (src) => {
|
|
10
|
+
const found = document.querySelector(`script[src="${CSS.escape(src)}"]`);
|
|
11
|
+
return found instanceof HTMLScriptElement ? found : void 0;
|
|
12
|
+
},
|
|
13
|
+
createScript: () => document.createElement("script"),
|
|
14
|
+
append: (element) => {
|
|
15
|
+
if (element instanceof HTMLScriptElement) document.head.append(element);
|
|
16
|
+
},
|
|
17
|
+
remove: (element) => {
|
|
18
|
+
if (element instanceof HTMLScriptElement) element.remove();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Inject a `<script>` tag and track its loading state.
|
|
24
|
+
*
|
|
25
|
+
* An existing tag with the same `src` is reused instead of duplicated: if
|
|
26
|
+
* it was created by another `useScriptTag` call its state is shared through
|
|
27
|
+
* a `data-vize-script-status` attribute; a tag without that attribute (for
|
|
28
|
+
* example emitted in server-rendered HTML) is assumed to have executed.
|
|
29
|
+
* Changing the reactive `src` unloads the previous script and, with
|
|
30
|
+
* `immediate`, loads the new one.
|
|
31
|
+
*
|
|
32
|
+
* Server rendering: no document exists, so nothing is injected, `status`
|
|
33
|
+
* stays `"idle"`, and `load` resolves `"unsupported"`. Emit server-side
|
|
34
|
+
* script tags through the application's head manager. Scripts created by
|
|
35
|
+
* this composable are removed when the owning scope stops (configurable);
|
|
36
|
+
* already-executed code cannot be unloaded.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const { status } = useScriptTag("https://example.com/widget.js", {
|
|
41
|
+
* onLoaded: () => window.Widget.init(),
|
|
42
|
+
* });
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @param src Reactive script URL.
|
|
46
|
+
* @param options Attributes, lifecycle, and capability.
|
|
47
|
+
* @default options {}
|
|
48
|
+
* @returns Loading state and actions.
|
|
49
|
+
*/
|
|
50
|
+
function useScriptTag(src, options = {}) {
|
|
51
|
+
const status = ref("idle");
|
|
52
|
+
const element = shallowRef(void 0);
|
|
53
|
+
let created = false;
|
|
54
|
+
let pending;
|
|
55
|
+
let generation = 0;
|
|
56
|
+
let cancelWait;
|
|
57
|
+
const resolveHost = () => options.host === void 0 ? browserScriptHost() : toValue(options.host) ?? void 0;
|
|
58
|
+
const configure = (script, url) => {
|
|
59
|
+
script.setAttribute("type", options.type ?? "text/javascript");
|
|
60
|
+
if (options.async ?? true) script.setAttribute("async", "");
|
|
61
|
+
if (options.defer ?? false) script.setAttribute("defer", "");
|
|
62
|
+
if (options.noModule ?? false) script.setAttribute("nomodule", "");
|
|
63
|
+
if (options.crossOrigin !== void 0) script.setAttribute("crossorigin", options.crossOrigin);
|
|
64
|
+
if (options.referrerPolicy !== void 0) script.setAttribute("referrerpolicy", options.referrerPolicy);
|
|
65
|
+
if (options.nonce !== void 0) script.setAttribute("nonce", options.nonce);
|
|
66
|
+
if (options.integrity !== void 0) script.setAttribute("integrity", options.integrity);
|
|
67
|
+
for (const [name, value] of Object.entries(options.attributes ?? {})) script.setAttribute(name, value);
|
|
68
|
+
script.setAttribute(STATUS_ATTRIBUTE, "loading");
|
|
69
|
+
script.setAttribute("src", url);
|
|
70
|
+
};
|
|
71
|
+
const waitFor = (script, current) => new Promise((resolve) => {
|
|
72
|
+
const finish = (outcome) => {
|
|
73
|
+
cancelWait = void 0;
|
|
74
|
+
script.removeEventListener("load", onLoad);
|
|
75
|
+
script.removeEventListener("error", onError);
|
|
76
|
+
script.setAttribute(STATUS_ATTRIBUTE, outcome);
|
|
77
|
+
if (current !== generation) {
|
|
78
|
+
resolve({ status: "cancelled" });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
status.value = outcome;
|
|
82
|
+
if (outcome === "loaded") options.onLoaded?.(script);
|
|
83
|
+
resolve({
|
|
84
|
+
status: outcome,
|
|
85
|
+
element: script
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const onLoad = () => finish("loaded");
|
|
89
|
+
const onError = () => finish("error");
|
|
90
|
+
script.addEventListener("load", onLoad);
|
|
91
|
+
script.addEventListener("error", onError);
|
|
92
|
+
cancelWait = () => {
|
|
93
|
+
script.removeEventListener("load", onLoad);
|
|
94
|
+
script.removeEventListener("error", onError);
|
|
95
|
+
resolve({ status: "cancelled" });
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
const load = () => {
|
|
99
|
+
if (pending) return pending;
|
|
100
|
+
const host = resolveHost();
|
|
101
|
+
if (!host) return Promise.resolve({ status: "unsupported" });
|
|
102
|
+
const current = generation;
|
|
103
|
+
const url = toValue(src);
|
|
104
|
+
const existing = host.findScript(url);
|
|
105
|
+
if (existing) {
|
|
106
|
+
element.value = existing;
|
|
107
|
+
const state = existing.getAttribute(STATUS_ATTRIBUTE);
|
|
108
|
+
if (state === null || state === "loaded") {
|
|
109
|
+
status.value = "loaded";
|
|
110
|
+
options.onLoaded?.(existing);
|
|
111
|
+
return Promise.resolve({
|
|
112
|
+
status: "loaded",
|
|
113
|
+
element: existing
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (state === "error") {
|
|
117
|
+
status.value = "error";
|
|
118
|
+
return Promise.resolve({
|
|
119
|
+
status: "error",
|
|
120
|
+
element: existing
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const script = existing ?? host.createScript();
|
|
125
|
+
status.value = "loading";
|
|
126
|
+
element.value = script;
|
|
127
|
+
const settled = waitFor(script, current).finally(() => {
|
|
128
|
+
if (pending === settled) pending = void 0;
|
|
129
|
+
});
|
|
130
|
+
pending = settled;
|
|
131
|
+
if (!existing) {
|
|
132
|
+
created = true;
|
|
133
|
+
configure(script, url);
|
|
134
|
+
host.append(script);
|
|
135
|
+
}
|
|
136
|
+
return settled;
|
|
137
|
+
};
|
|
138
|
+
const unload = () => {
|
|
139
|
+
generation += 1;
|
|
140
|
+
pending = void 0;
|
|
141
|
+
cancelWait?.();
|
|
142
|
+
cancelWait = void 0;
|
|
143
|
+
const script = element.value;
|
|
144
|
+
if (script && created) resolveHost()?.remove(script);
|
|
145
|
+
created = false;
|
|
146
|
+
element.value = void 0;
|
|
147
|
+
status.value = "idle";
|
|
148
|
+
};
|
|
149
|
+
if (options.immediate ?? true) watch(() => toValue(src), (_next, previous) => {
|
|
150
|
+
if (previous !== void 0) unload();
|
|
151
|
+
load();
|
|
152
|
+
}, {
|
|
153
|
+
immediate: true,
|
|
154
|
+
flush: "sync"
|
|
155
|
+
});
|
|
156
|
+
tryOnScopeDispose(() => {
|
|
157
|
+
if (options.removeOnDispose ?? true) unload();
|
|
158
|
+
else {
|
|
159
|
+
generation += 1;
|
|
160
|
+
cancelWait?.();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
return {
|
|
164
|
+
status: readonly(status),
|
|
165
|
+
element,
|
|
166
|
+
load,
|
|
167
|
+
unload
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//#endregion
|
|
171
|
+
export { useScriptTag };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-segmenter.d.ts
|
|
4
|
+
/** Segmentation units supported by `Intl.Segmenter`. */
|
|
5
|
+
type SegmenterGranularity = "grapheme" | "word" | "sentence";
|
|
6
|
+
/** One segment of the text. */
|
|
7
|
+
interface TextSegment {
|
|
8
|
+
/** Segment text. */
|
|
9
|
+
readonly segment: string;
|
|
10
|
+
/** UTF-16 code-unit offset of the segment in the source text. */
|
|
11
|
+
readonly index: number;
|
|
12
|
+
/** Word granularity: whether the segment is a word (not spaces or punctuation). */
|
|
13
|
+
readonly isWordLike: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Options for {@link useSegmenter}. */
|
|
16
|
+
interface UseSegmenterOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Segmentation unit exposed through `segments` and `count`.
|
|
19
|
+
*
|
|
20
|
+
* @default "grapheme"
|
|
21
|
+
*/
|
|
22
|
+
readonly granularity?: SegmenterGranularity;
|
|
23
|
+
/**
|
|
24
|
+
* Locale whose segmentation rules are used (word boundaries in Japanese or
|
|
25
|
+
* Thai depend on it). Pass it explicitly for hydration-stable output.
|
|
26
|
+
*
|
|
27
|
+
* @default the browser language, otherwise "en"
|
|
28
|
+
*/
|
|
29
|
+
readonly locale?: string | Intl.Locale;
|
|
30
|
+
}
|
|
31
|
+
/** Reactive segmentation returned by {@link useSegmenter}. */
|
|
32
|
+
interface SegmenterControls {
|
|
33
|
+
/** Canonical locale in use. */
|
|
34
|
+
readonly locale: ComputedRef<string>;
|
|
35
|
+
/** Segments at the configured granularity. */
|
|
36
|
+
readonly segments: ComputedRef<readonly TextSegment[]>;
|
|
37
|
+
/** Number of segments at the configured granularity. */
|
|
38
|
+
readonly count: ComputedRef<number>;
|
|
39
|
+
/** User-perceived characters (grapheme clusters), independent of granularity. */
|
|
40
|
+
readonly graphemeCount: ComputedRef<number>;
|
|
41
|
+
/** Word-like segments, independent of granularity. */
|
|
42
|
+
readonly wordCount: ComputedRef<number>;
|
|
43
|
+
/**
|
|
44
|
+
* Truncate the text to at most `maxGraphemes` user-perceived characters,
|
|
45
|
+
* never splitting an emoji or combining sequence.
|
|
46
|
+
*
|
|
47
|
+
* @param maxGraphemes Maximum grapheme clusters kept, including the ellipsis.
|
|
48
|
+
* @param ellipsis Appended when the text was shortened.
|
|
49
|
+
* @default ellipsis "…"
|
|
50
|
+
* @returns The possibly truncated text.
|
|
51
|
+
* @throws {RangeError} `[VIZE_COMPOSE_SEGMENTER_INVALID_LENGTH]` for a
|
|
52
|
+
* negative or non-integer length.
|
|
53
|
+
*/
|
|
54
|
+
readonly truncate: (maxGraphemes: number, ellipsis?: string) => string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Split text into graphemes, words, or sentences with `Intl.Segmenter`.
|
|
58
|
+
*
|
|
59
|
+
* Counts reflect what users perceive: `"👨👩👧"` is one grapheme, and
|
|
60
|
+
* word counts skip spaces and punctuation while handling languages without
|
|
61
|
+
* spaces (Japanese, Thai) through the locale. `truncate` shortens text
|
|
62
|
+
* without splitting clusters. Derived state only; deterministic during
|
|
63
|
+
* server rendering when the locale is explicit.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const { graphemeCount, truncate } = useSegmenter(bio, { locale: "en" });
|
|
68
|
+
* const remaining = computed(() => 160 - graphemeCount.value);
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* @param text Reactive text.
|
|
72
|
+
* @param options Reactive granularity and locale.
|
|
73
|
+
* @default options {}
|
|
74
|
+
* @returns Reactive segments, counts, and truncation.
|
|
75
|
+
*/
|
|
76
|
+
declare function useSegmenter(text: MaybeRefOrGetter<string>, options?: MaybeRefOrGetter<UseSegmenterOptions>): SegmenterControls;
|
|
77
|
+
//#endregion
|
|
78
|
+
export { SegmenterControls, SegmenterGranularity, TextSegment, UseSegmenterOptions, useSegmenter };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { useLocale } from "./locale.mjs";
|
|
2
|
+
import { computed, toValue } from "vue";
|
|
3
|
+
//#region src/use-segmenter.ts
|
|
4
|
+
function browserLanguage() {
|
|
5
|
+
return typeof window === "undefined" ? void 0 : window.navigator.language;
|
|
6
|
+
}
|
|
7
|
+
function toSegments(segmenter, text) {
|
|
8
|
+
return Array.from(segmenter.segment(text), (data) => ({
|
|
9
|
+
segment: data.segment,
|
|
10
|
+
index: data.index,
|
|
11
|
+
isWordLike: data.isWordLike ?? false
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Split text into graphemes, words, or sentences with `Intl.Segmenter`.
|
|
16
|
+
*
|
|
17
|
+
* Counts reflect what users perceive: `"👨👩👧"` is one grapheme, and
|
|
18
|
+
* word counts skip spaces and punctuation while handling languages without
|
|
19
|
+
* spaces (Japanese, Thai) through the locale. `truncate` shortens text
|
|
20
|
+
* without splitting clusters. Derived state only; deterministic during
|
|
21
|
+
* server rendering when the locale is explicit.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const { graphemeCount, truncate } = useSegmenter(bio, { locale: "en" });
|
|
26
|
+
* const remaining = computed(() => 160 - graphemeCount.value);
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @param text Reactive text.
|
|
30
|
+
* @param options Reactive granularity and locale.
|
|
31
|
+
* @default options {}
|
|
32
|
+
* @returns Reactive segments, counts, and truncation.
|
|
33
|
+
*/
|
|
34
|
+
function useSegmenter(text, options = {}) {
|
|
35
|
+
const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
|
|
36
|
+
const segmenterFor = (granularity) => computed(() => new Intl.Segmenter(localeControls.locale.value, { granularity }));
|
|
37
|
+
const graphemes = segmenterFor("grapheme");
|
|
38
|
+
const words = segmenterFor("word");
|
|
39
|
+
const sentences = segmenterFor("sentence");
|
|
40
|
+
const graphemeSegments = computed(() => toSegments(graphemes.value, toValue(text)));
|
|
41
|
+
const wordSegments = computed(() => toSegments(words.value, toValue(text)));
|
|
42
|
+
const segments = computed(() => {
|
|
43
|
+
const granularity = toValue(options).granularity ?? "grapheme";
|
|
44
|
+
if (granularity === "grapheme") return graphemeSegments.value;
|
|
45
|
+
if (granularity === "word") return wordSegments.value;
|
|
46
|
+
return toSegments(sentences.value, toValue(text));
|
|
47
|
+
});
|
|
48
|
+
const truncate = (maxGraphemes, ellipsis = "…") => {
|
|
49
|
+
if (!Number.isSafeInteger(maxGraphemes) || maxGraphemes < 0) throw new RangeError(`[VIZE_COMPOSE_SEGMENTER_INVALID_LENGTH] maxGraphemes must be a non-negative integer; received ${String(maxGraphemes)}`);
|
|
50
|
+
const all = graphemeSegments.value;
|
|
51
|
+
if (all.length <= maxGraphemes) return toValue(text);
|
|
52
|
+
const ellipsisLength = toSegments(graphemes.value, ellipsis).length;
|
|
53
|
+
const keep = Math.max(0, maxGraphemes - ellipsisLength);
|
|
54
|
+
return all.slice(0, keep).map((segment) => segment.segment).join("") + (maxGraphemes >= ellipsisLength ? ellipsis : "");
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
locale: localeControls.locale,
|
|
58
|
+
segments,
|
|
59
|
+
count: computed(() => segments.value.length),
|
|
60
|
+
graphemeCount: computed(() => graphemeSegments.value.length),
|
|
61
|
+
wordCount: computed(() => wordSegments.value.filter((segment) => segment.isWordLike).length),
|
|
62
|
+
truncate
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { useSegmenter };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/use-selection.d.ts
|
|
4
|
+
/** Options for {@link useSelection}. */
|
|
5
|
+
interface UseSelectionOptions<Item, Key, Multiple extends boolean> {
|
|
6
|
+
/** Selectable items, in display order. Reactive. */
|
|
7
|
+
readonly items: MaybeRefOrGetter<readonly Item[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Allow several selected items.
|
|
10
|
+
*
|
|
11
|
+
* @default false
|
|
12
|
+
*/
|
|
13
|
+
readonly multiple?: Multiple;
|
|
14
|
+
/**
|
|
15
|
+
* Stable identity of an item, for example its id. Keys survive item
|
|
16
|
+
* objects being replaced (refetches, immutable updates).
|
|
17
|
+
*
|
|
18
|
+
* @default the item itself
|
|
19
|
+
*/
|
|
20
|
+
readonly getKey?: (item: Item) => Key;
|
|
21
|
+
/**
|
|
22
|
+
* Keys selected initially.
|
|
23
|
+
*
|
|
24
|
+
* @default []
|
|
25
|
+
*/
|
|
26
|
+
readonly initial?: readonly Key[];
|
|
27
|
+
/**
|
|
28
|
+
* Maximum number of selected items in multiple mode; selecting beyond it
|
|
29
|
+
* is refused.
|
|
30
|
+
*
|
|
31
|
+
* @default Number.POSITIVE_INFINITY
|
|
32
|
+
*/
|
|
33
|
+
readonly max?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Refuse to deselect the last selected item.
|
|
36
|
+
*
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
readonly required?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Veto selecting an item (for example disabled rows).
|
|
42
|
+
*
|
|
43
|
+
* @default undefined (every item is selectable)
|
|
44
|
+
*/
|
|
45
|
+
readonly isSelectable?: (item: Item) => boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Selection state and commands returned by {@link useSelection}. */
|
|
48
|
+
interface Selection<Item, Key, Multiple extends boolean> {
|
|
49
|
+
/** Selected keys in selection order. */
|
|
50
|
+
readonly selectedKeys: Readonly<ShallowRef<readonly Key[]>>;
|
|
51
|
+
/**
|
|
52
|
+
* Selected items in `items` order: an array in multiple mode, the single
|
|
53
|
+
* item (or `undefined`) otherwise. Keys whose item is currently absent are
|
|
54
|
+
* kept but not listed.
|
|
55
|
+
*/
|
|
56
|
+
readonly selected: ComputedRef<Multiple extends true ? Item[] : Item | undefined>;
|
|
57
|
+
/** Number of selected keys. */
|
|
58
|
+
readonly count: ComputedRef<number>;
|
|
59
|
+
/** Whether every selectable item is selected (multiple mode). */
|
|
60
|
+
readonly isAllSelected: ComputedRef<boolean>;
|
|
61
|
+
/** Whether some but not all selectable items are selected (tri-state checkboxes). */
|
|
62
|
+
readonly isIndeterminate: ComputedRef<boolean>;
|
|
63
|
+
/** Item that anchors range selection (the last explicitly selected one). */
|
|
64
|
+
readonly anchor: Readonly<ShallowRef<Key | undefined>>;
|
|
65
|
+
/** Whether `item` is selected. */
|
|
66
|
+
readonly isSelected: (item: Item) => boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Select `item` (replacing the selection in single mode).
|
|
69
|
+
*
|
|
70
|
+
* @returns Whether the selection changed.
|
|
71
|
+
*/
|
|
72
|
+
readonly select: (item: Item) => boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Deselect `item`.
|
|
75
|
+
*
|
|
76
|
+
* @returns Whether the selection changed.
|
|
77
|
+
*/
|
|
78
|
+
readonly deselect: (item: Item) => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Toggle `item`.
|
|
81
|
+
*
|
|
82
|
+
* @returns Whether the selection changed.
|
|
83
|
+
*/
|
|
84
|
+
readonly toggle: (item: Item) => boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Select exactly `item`.
|
|
87
|
+
*
|
|
88
|
+
* @returns Whether the selection changed.
|
|
89
|
+
*/
|
|
90
|
+
readonly selectOnly: (item: Item) => boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Select every item between the anchor and `item` inclusive
|
|
93
|
+
* (shift-click); in single mode this selects `item`.
|
|
94
|
+
*
|
|
95
|
+
* @returns Whether the selection changed.
|
|
96
|
+
*/
|
|
97
|
+
readonly extendTo: (item: Item) => boolean;
|
|
98
|
+
/** Select every selectable item, up to `max` (multiple mode). */
|
|
99
|
+
readonly selectAll: () => void;
|
|
100
|
+
/** Clear the selection (ignores `required`). */
|
|
101
|
+
readonly clear: () => void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Generic single- or multi-select state for lists, tables, and grids.
|
|
105
|
+
*
|
|
106
|
+
* Keys (from `getKey`, the item itself by default) identify items, so the
|
|
107
|
+
* selection survives items being replaced. `multiple: true` switches the
|
|
108
|
+
* `selected` type to an array; `max`, `required`, and `isSelectable`
|
|
109
|
+
* constrain changes, and `extendTo` implements shift-click ranges from the
|
|
110
|
+
* anchor in display order. Synchronous state: SSR-safe and nothing to
|
|
111
|
+
* dispose.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* const rows = useSelection({ items: users, multiple: true, getKey: (user) => user.id });
|
|
116
|
+
* rows.toggle(user);
|
|
117
|
+
* rows.extendTo(other); // shift-click
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
* @param options Items, mode, identity, and constraints.
|
|
121
|
+
* @returns Selection state and commands.
|
|
122
|
+
*/
|
|
123
|
+
declare function useSelection<Item, Key = Item, const Multiple extends boolean = false>(options: UseSelectionOptions<Item, Key, Multiple>): Selection<Item, Key, Multiple>;
|
|
124
|
+
//#endregion
|
|
125
|
+
export { Selection, UseSelectionOptions, useSelection };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { computed, shallowRef, toValue } from "vue";
|
|
2
|
+
//#region src/use-selection.ts
|
|
3
|
+
function useSelection(options) {
|
|
4
|
+
const multiple = options.multiple ?? false;
|
|
5
|
+
const max = multiple ? options.max ?? Number.POSITIVE_INFINITY : 1;
|
|
6
|
+
const keyOf = options.getKey ?? ((item) => item);
|
|
7
|
+
const selectable = options.isSelectable ?? (() => true);
|
|
8
|
+
const selectedKeys = shallowRef((options.initial ?? []).slice(0, max));
|
|
9
|
+
const anchor = shallowRef(selectedKeys.value.at(-1));
|
|
10
|
+
const items = computed(() => toValue(options.items));
|
|
11
|
+
const has = (key) => selectedKeys.value.includes(key);
|
|
12
|
+
const commit = (next) => {
|
|
13
|
+
const current = selectedKeys.value;
|
|
14
|
+
if (next.length === current.length && next.every((key, index) => key === current[index])) return false;
|
|
15
|
+
selectedKeys.value = next;
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
const select = (item) => {
|
|
19
|
+
if (!selectable(item)) return false;
|
|
20
|
+
const key = keyOf(item);
|
|
21
|
+
anchor.value = key;
|
|
22
|
+
if (!multiple) return commit([key]);
|
|
23
|
+
if (has(key) || selectedKeys.value.length >= max) return false;
|
|
24
|
+
return commit([...selectedKeys.value, key]);
|
|
25
|
+
};
|
|
26
|
+
const deselect = (item) => {
|
|
27
|
+
const key = keyOf(item);
|
|
28
|
+
if (!has(key)) return false;
|
|
29
|
+
if ((options.required ?? false) && selectedKeys.value.length === 1) return false;
|
|
30
|
+
return commit(selectedKeys.value.filter((candidate) => candidate !== key));
|
|
31
|
+
};
|
|
32
|
+
const selectableKeys = computed(() => items.value.filter(selectable).map(keyOf));
|
|
33
|
+
const selectedItems = computed(() => items.value.filter((item) => has(keyOf(item))));
|
|
34
|
+
return {
|
|
35
|
+
selectedKeys,
|
|
36
|
+
selected: computed(() => multiple ? selectedItems.value : selectedItems.value[0]),
|
|
37
|
+
count: computed(() => selectedKeys.value.length),
|
|
38
|
+
isAllSelected: computed(() => selectableKeys.value.length > 0 && selectableKeys.value.every((key) => has(key))),
|
|
39
|
+
isIndeterminate: computed(() => {
|
|
40
|
+
const chosen = selectableKeys.value.filter((key) => has(key)).length;
|
|
41
|
+
return chosen > 0 && chosen < selectableKeys.value.length;
|
|
42
|
+
}),
|
|
43
|
+
anchor,
|
|
44
|
+
isSelected: (item) => has(keyOf(item)),
|
|
45
|
+
select,
|
|
46
|
+
deselect,
|
|
47
|
+
toggle: (item) => has(keyOf(item)) ? deselect(item) : select(item),
|
|
48
|
+
selectOnly: (item) => {
|
|
49
|
+
if (!selectable(item)) return false;
|
|
50
|
+
anchor.value = keyOf(item);
|
|
51
|
+
return commit([keyOf(item)]);
|
|
52
|
+
},
|
|
53
|
+
extendTo: (item) => {
|
|
54
|
+
if (!multiple) return select(item);
|
|
55
|
+
const keys = items.value.map(keyOf);
|
|
56
|
+
const from = keys.indexOf(anchor.value);
|
|
57
|
+
const to = keys.indexOf(keyOf(item));
|
|
58
|
+
if (to === -1) return false;
|
|
59
|
+
if (from === -1) return select(item);
|
|
60
|
+
const [start, end] = from <= to ? [from, to] : [to, from];
|
|
61
|
+
const range = items.value.slice(start, end + 1).filter(selectable).map(keyOf).filter((key) => !has(key));
|
|
62
|
+
const room = Math.max(0, max - selectedKeys.value.length);
|
|
63
|
+
return commit([...selectedKeys.value, ...range.slice(0, room)]);
|
|
64
|
+
},
|
|
65
|
+
selectAll: () => {
|
|
66
|
+
if (!multiple) return;
|
|
67
|
+
const missing = selectableKeys.value.filter((key) => !has(key));
|
|
68
|
+
const room = Math.max(0, max - selectedKeys.value.length);
|
|
69
|
+
commit([...selectedKeys.value, ...missing.slice(0, room)]);
|
|
70
|
+
},
|
|
71
|
+
clear: () => {
|
|
72
|
+
commit([]);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { useSelection };
|