@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,341 @@
|
|
|
1
|
+
import { readonly, ref, shallowRef, toValue, watch } from "vue";
|
|
2
|
+
import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
|
|
3
|
+
|
|
4
|
+
import { tryOnScopeDispose } from "./scope.ts";
|
|
5
|
+
|
|
6
|
+
/** `<script>` subset used by {@link useScriptTag}. */
|
|
7
|
+
export interface ScriptTagElement extends EventTarget {
|
|
8
|
+
/** Read an attribute. */
|
|
9
|
+
getAttribute(name: string): string | null;
|
|
10
|
+
|
|
11
|
+
/** Write an attribute. */
|
|
12
|
+
setAttribute(name: string, value: string): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Document capability used by {@link useScriptTag}. */
|
|
16
|
+
export interface ScriptTagHost {
|
|
17
|
+
/** Find an existing `<script>` whose `src` attribute equals `src`. */
|
|
18
|
+
findScript(src: string): ScriptTagElement | undefined;
|
|
19
|
+
|
|
20
|
+
/** Create a detached `<script>`. */
|
|
21
|
+
createScript(): ScriptTagElement;
|
|
22
|
+
|
|
23
|
+
/** Attach a script to `<head>`, starting its download. */
|
|
24
|
+
append(element: ScriptTagElement): void;
|
|
25
|
+
|
|
26
|
+
/** Detach a script. */
|
|
27
|
+
remove(element: ScriptTagElement): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Loading state of the script. */
|
|
31
|
+
export type ScriptTagStatus = "idle" | "loading" | "loaded" | "error";
|
|
32
|
+
|
|
33
|
+
/** Discriminated outcome of {@link ScriptTagControls.load}. */
|
|
34
|
+
export type ScriptTagResult =
|
|
35
|
+
| {
|
|
36
|
+
/** The script executed. */
|
|
37
|
+
readonly status: "loaded";
|
|
38
|
+
/** Script element. */
|
|
39
|
+
readonly element: ScriptTagElement;
|
|
40
|
+
}
|
|
41
|
+
| {
|
|
42
|
+
/** The script failed to load. */
|
|
43
|
+
readonly status: "error";
|
|
44
|
+
/** Script element. */
|
|
45
|
+
readonly element: ScriptTagElement;
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
/** No document is available (server rendering) or the load was superseded. */
|
|
49
|
+
readonly status: "unsupported" | "cancelled";
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** Options for {@link useScriptTag}. */
|
|
53
|
+
export interface UseScriptTagOptions {
|
|
54
|
+
/**
|
|
55
|
+
* Called once the script has loaded.
|
|
56
|
+
*
|
|
57
|
+
* @default undefined
|
|
58
|
+
*/
|
|
59
|
+
readonly onLoaded?: (element: ScriptTagElement) => void;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Load when created and whenever `src` changes.
|
|
63
|
+
*
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
readonly immediate?: boolean;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Set the `async` attribute.
|
|
70
|
+
*
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
readonly async?: boolean;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Set the `defer` attribute.
|
|
77
|
+
*
|
|
78
|
+
* @default false
|
|
79
|
+
*/
|
|
80
|
+
readonly defer?: boolean;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Script `type` (for example `"module"`).
|
|
84
|
+
*
|
|
85
|
+
* @default "text/javascript"
|
|
86
|
+
*/
|
|
87
|
+
readonly type?: string;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* CORS mode (`crossorigin` attribute).
|
|
91
|
+
*
|
|
92
|
+
* @default undefined
|
|
93
|
+
*/
|
|
94
|
+
readonly crossOrigin?: "anonymous" | "use-credentials";
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Referrer policy.
|
|
98
|
+
*
|
|
99
|
+
* @default undefined
|
|
100
|
+
*/
|
|
101
|
+
readonly referrerPolicy?: ReferrerPolicy;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Set the `nomodule` attribute.
|
|
105
|
+
*
|
|
106
|
+
* @default false
|
|
107
|
+
*/
|
|
108
|
+
readonly noModule?: boolean;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* CSP nonce.
|
|
112
|
+
*
|
|
113
|
+
* @default undefined
|
|
114
|
+
*/
|
|
115
|
+
readonly nonce?: string;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Subresource integrity hash.
|
|
119
|
+
*
|
|
120
|
+
* @default undefined
|
|
121
|
+
*/
|
|
122
|
+
readonly integrity?: string;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Additional attributes.
|
|
126
|
+
*
|
|
127
|
+
* @default {}
|
|
128
|
+
*/
|
|
129
|
+
readonly attributes?: Readonly<Record<string, string>>;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Remove a script created by this composable when the owning scope stops.
|
|
133
|
+
*
|
|
134
|
+
* @default true
|
|
135
|
+
*/
|
|
136
|
+
readonly removeOnDispose?: boolean;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Document capability for alternate runtimes and tests.
|
|
140
|
+
*
|
|
141
|
+
* @default window.document's `<head>`
|
|
142
|
+
*/
|
|
143
|
+
readonly host?: MaybeRefOrGetter<ScriptTagHost | null | undefined>;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Reactive state and actions returned by {@link useScriptTag}. */
|
|
147
|
+
export interface ScriptTagControls {
|
|
148
|
+
/** Loading state. */
|
|
149
|
+
readonly status: Readonly<Ref<ScriptTagStatus>>;
|
|
150
|
+
|
|
151
|
+
/** Script element in use, if any. */
|
|
152
|
+
readonly element: Readonly<ShallowRef<ScriptTagElement | undefined>>;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Load the script (or reuse an existing tag with the same `src`).
|
|
156
|
+
* Concurrent calls share one load; `unload` and scope disposal resolve a
|
|
157
|
+
* pending load as `"cancelled"`.
|
|
158
|
+
*
|
|
159
|
+
* @returns The discriminated outcome; never rejects.
|
|
160
|
+
*/
|
|
161
|
+
readonly load: () => Promise<ScriptTagResult>;
|
|
162
|
+
|
|
163
|
+
/** Remove a script created by this composable and reset the state. */
|
|
164
|
+
readonly unload: () => void;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const STATUS_ATTRIBUTE = "data-vize-script-status";
|
|
168
|
+
|
|
169
|
+
function browserScriptHost(): ScriptTagHost | undefined {
|
|
170
|
+
if (typeof window === "undefined") return undefined;
|
|
171
|
+
const { document, HTMLScriptElement, CSS } = window;
|
|
172
|
+
return {
|
|
173
|
+
findScript: (src) => {
|
|
174
|
+
const found = document.querySelector(`script[src="${CSS.escape(src)}"]`);
|
|
175
|
+
return found instanceof HTMLScriptElement ? found : undefined;
|
|
176
|
+
},
|
|
177
|
+
createScript: () => document.createElement("script"),
|
|
178
|
+
append: (element) => {
|
|
179
|
+
if (element instanceof HTMLScriptElement) document.head.append(element);
|
|
180
|
+
},
|
|
181
|
+
remove: (element) => {
|
|
182
|
+
if (element instanceof HTMLScriptElement) element.remove();
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Inject a `<script>` tag and track its loading state.
|
|
189
|
+
*
|
|
190
|
+
* An existing tag with the same `src` is reused instead of duplicated: if
|
|
191
|
+
* it was created by another `useScriptTag` call its state is shared through
|
|
192
|
+
* a `data-vize-script-status` attribute; a tag without that attribute (for
|
|
193
|
+
* example emitted in server-rendered HTML) is assumed to have executed.
|
|
194
|
+
* Changing the reactive `src` unloads the previous script and, with
|
|
195
|
+
* `immediate`, loads the new one.
|
|
196
|
+
*
|
|
197
|
+
* Server rendering: no document exists, so nothing is injected, `status`
|
|
198
|
+
* stays `"idle"`, and `load` resolves `"unsupported"`. Emit server-side
|
|
199
|
+
* script tags through the application's head manager. Scripts created by
|
|
200
|
+
* this composable are removed when the owning scope stops (configurable);
|
|
201
|
+
* already-executed code cannot be unloaded.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```ts
|
|
205
|
+
* const { status } = useScriptTag("https://example.com/widget.js", {
|
|
206
|
+
* onLoaded: () => window.Widget.init(),
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
209
|
+
*
|
|
210
|
+
* @param src Reactive script URL.
|
|
211
|
+
* @param options Attributes, lifecycle, and capability.
|
|
212
|
+
* @default options {}
|
|
213
|
+
* @returns Loading state and actions.
|
|
214
|
+
*/
|
|
215
|
+
export function useScriptTag(
|
|
216
|
+
src: MaybeRefOrGetter<string>,
|
|
217
|
+
options: UseScriptTagOptions = {},
|
|
218
|
+
): ScriptTagControls {
|
|
219
|
+
const status = ref<ScriptTagStatus>("idle");
|
|
220
|
+
const element = shallowRef<ScriptTagElement | undefined>(undefined);
|
|
221
|
+
let created = false;
|
|
222
|
+
let pending: Promise<ScriptTagResult> | undefined;
|
|
223
|
+
let generation = 0;
|
|
224
|
+
let cancelWait: (() => void) | undefined;
|
|
225
|
+
|
|
226
|
+
const resolveHost = (): ScriptTagHost | undefined =>
|
|
227
|
+
options.host === undefined ? browserScriptHost() : (toValue(options.host) ?? undefined);
|
|
228
|
+
|
|
229
|
+
const configure = (script: ScriptTagElement, url: string): void => {
|
|
230
|
+
script.setAttribute("type", options.type ?? "text/javascript");
|
|
231
|
+
if (options.async ?? true) script.setAttribute("async", "");
|
|
232
|
+
if (options.defer ?? false) script.setAttribute("defer", "");
|
|
233
|
+
if (options.noModule ?? false) script.setAttribute("nomodule", "");
|
|
234
|
+
if (options.crossOrigin !== undefined) script.setAttribute("crossorigin", options.crossOrigin);
|
|
235
|
+
if (options.referrerPolicy !== undefined) {
|
|
236
|
+
script.setAttribute("referrerpolicy", options.referrerPolicy);
|
|
237
|
+
}
|
|
238
|
+
if (options.nonce !== undefined) script.setAttribute("nonce", options.nonce);
|
|
239
|
+
if (options.integrity !== undefined) script.setAttribute("integrity", options.integrity);
|
|
240
|
+
for (const [name, value] of Object.entries(options.attributes ?? {})) {
|
|
241
|
+
script.setAttribute(name, value);
|
|
242
|
+
}
|
|
243
|
+
script.setAttribute(STATUS_ATTRIBUTE, "loading");
|
|
244
|
+
script.setAttribute("src", url);
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const waitFor = (script: ScriptTagElement, current: number): Promise<ScriptTagResult> =>
|
|
248
|
+
new Promise((resolve) => {
|
|
249
|
+
const finish = (outcome: "loaded" | "error"): void => {
|
|
250
|
+
cancelWait = undefined;
|
|
251
|
+
script.removeEventListener("load", onLoad);
|
|
252
|
+
script.removeEventListener("error", onError);
|
|
253
|
+
script.setAttribute(STATUS_ATTRIBUTE, outcome);
|
|
254
|
+
if (current !== generation) {
|
|
255
|
+
resolve({ status: "cancelled" });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
status.value = outcome;
|
|
259
|
+
if (outcome === "loaded") options.onLoaded?.(script);
|
|
260
|
+
resolve({ status: outcome, element: script });
|
|
261
|
+
};
|
|
262
|
+
const onLoad = (): void => finish("loaded");
|
|
263
|
+
const onError = (): void => finish("error");
|
|
264
|
+
script.addEventListener("load", onLoad);
|
|
265
|
+
script.addEventListener("error", onError);
|
|
266
|
+
cancelWait = () => {
|
|
267
|
+
script.removeEventListener("load", onLoad);
|
|
268
|
+
script.removeEventListener("error", onError);
|
|
269
|
+
resolve({ status: "cancelled" });
|
|
270
|
+
};
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
const load = (): Promise<ScriptTagResult> => {
|
|
274
|
+
if (pending) return pending;
|
|
275
|
+
const host = resolveHost();
|
|
276
|
+
if (!host) return Promise.resolve({ status: "unsupported" });
|
|
277
|
+
const current = generation;
|
|
278
|
+
const url = toValue(src);
|
|
279
|
+
const existing = host.findScript(url);
|
|
280
|
+
if (existing) {
|
|
281
|
+
element.value = existing;
|
|
282
|
+
const state = existing.getAttribute(STATUS_ATTRIBUTE);
|
|
283
|
+
if (state === null || state === "loaded") {
|
|
284
|
+
status.value = "loaded";
|
|
285
|
+
options.onLoaded?.(existing);
|
|
286
|
+
return Promise.resolve({ status: "loaded", element: existing });
|
|
287
|
+
}
|
|
288
|
+
if (state === "error") {
|
|
289
|
+
status.value = "error";
|
|
290
|
+
return Promise.resolve({ status: "error", element: existing });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const script = existing ?? host.createScript();
|
|
294
|
+
status.value = "loading";
|
|
295
|
+
element.value = script;
|
|
296
|
+
const settled = waitFor(script, current).finally(() => {
|
|
297
|
+
if (pending === settled) pending = undefined;
|
|
298
|
+
});
|
|
299
|
+
pending = settled;
|
|
300
|
+
if (!existing) {
|
|
301
|
+
created = true;
|
|
302
|
+
configure(script, url);
|
|
303
|
+
host.append(script);
|
|
304
|
+
}
|
|
305
|
+
return settled;
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
const unload = (): void => {
|
|
309
|
+
generation += 1;
|
|
310
|
+
pending = undefined;
|
|
311
|
+
cancelWait?.();
|
|
312
|
+
cancelWait = undefined;
|
|
313
|
+
const script = element.value;
|
|
314
|
+
if (script && created) resolveHost()?.remove(script);
|
|
315
|
+
created = false;
|
|
316
|
+
element.value = undefined;
|
|
317
|
+
status.value = "idle";
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
if (options.immediate ?? true) {
|
|
321
|
+
watch(
|
|
322
|
+
() => toValue(src),
|
|
323
|
+
(_next, previous) => {
|
|
324
|
+
if (previous !== undefined) unload();
|
|
325
|
+
void load();
|
|
326
|
+
},
|
|
327
|
+
{ immediate: true, flush: "sync" },
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
tryOnScopeDispose(() => {
|
|
332
|
+
if (options.removeOnDispose ?? true) {
|
|
333
|
+
unload();
|
|
334
|
+
} else {
|
|
335
|
+
generation += 1;
|
|
336
|
+
cancelWait?.();
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
return { status: readonly(status), element, load, unload };
|
|
341
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter } from "vue";
|
|
3
|
+
|
|
4
|
+
import { useLocale } from "./locale.ts";
|
|
5
|
+
|
|
6
|
+
/** Segmentation units supported by `Intl.Segmenter`. */
|
|
7
|
+
export type SegmenterGranularity = "grapheme" | "word" | "sentence";
|
|
8
|
+
|
|
9
|
+
/** One segment of the text. */
|
|
10
|
+
export interface TextSegment {
|
|
11
|
+
/** Segment text. */
|
|
12
|
+
readonly segment: string;
|
|
13
|
+
|
|
14
|
+
/** UTF-16 code-unit offset of the segment in the source text. */
|
|
15
|
+
readonly index: number;
|
|
16
|
+
|
|
17
|
+
/** Word granularity: whether the segment is a word (not spaces or punctuation). */
|
|
18
|
+
readonly isWordLike: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Options for {@link useSegmenter}. */
|
|
22
|
+
export interface UseSegmenterOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Segmentation unit exposed through `segments` and `count`.
|
|
25
|
+
*
|
|
26
|
+
* @default "grapheme"
|
|
27
|
+
*/
|
|
28
|
+
readonly granularity?: SegmenterGranularity;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Locale whose segmentation rules are used (word boundaries in Japanese or
|
|
32
|
+
* Thai depend on it). Pass it explicitly for hydration-stable output.
|
|
33
|
+
*
|
|
34
|
+
* @default the browser language, otherwise "en"
|
|
35
|
+
*/
|
|
36
|
+
readonly locale?: string | Intl.Locale;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Reactive segmentation returned by {@link useSegmenter}. */
|
|
40
|
+
export interface SegmenterControls {
|
|
41
|
+
/** Canonical locale in use. */
|
|
42
|
+
readonly locale: ComputedRef<string>;
|
|
43
|
+
|
|
44
|
+
/** Segments at the configured granularity. */
|
|
45
|
+
readonly segments: ComputedRef<readonly TextSegment[]>;
|
|
46
|
+
|
|
47
|
+
/** Number of segments at the configured granularity. */
|
|
48
|
+
readonly count: ComputedRef<number>;
|
|
49
|
+
|
|
50
|
+
/** User-perceived characters (grapheme clusters), independent of granularity. */
|
|
51
|
+
readonly graphemeCount: ComputedRef<number>;
|
|
52
|
+
|
|
53
|
+
/** Word-like segments, independent of granularity. */
|
|
54
|
+
readonly wordCount: ComputedRef<number>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Truncate the text to at most `maxGraphemes` user-perceived characters,
|
|
58
|
+
* never splitting an emoji or combining sequence.
|
|
59
|
+
*
|
|
60
|
+
* @param maxGraphemes Maximum grapheme clusters kept, including the ellipsis.
|
|
61
|
+
* @param ellipsis Appended when the text was shortened.
|
|
62
|
+
* @default ellipsis "…"
|
|
63
|
+
* @returns The possibly truncated text.
|
|
64
|
+
* @throws {RangeError} `[VIZE_COMPOSE_SEGMENTER_INVALID_LENGTH]` for a
|
|
65
|
+
* negative or non-integer length.
|
|
66
|
+
*/
|
|
67
|
+
readonly truncate: (maxGraphemes: number, ellipsis?: string) => string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function browserLanguage(): string | undefined {
|
|
71
|
+
return typeof window === "undefined" ? undefined : window.navigator.language;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function toSegments(segmenter: Intl.Segmenter, text: string): readonly TextSegment[] {
|
|
75
|
+
return Array.from(segmenter.segment(text), (data) => ({
|
|
76
|
+
segment: data.segment,
|
|
77
|
+
index: data.index,
|
|
78
|
+
isWordLike: data.isWordLike ?? false,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Split text into graphemes, words, or sentences with `Intl.Segmenter`.
|
|
84
|
+
*
|
|
85
|
+
* Counts reflect what users perceive: `"👨👩👧"` is one grapheme, and
|
|
86
|
+
* word counts skip spaces and punctuation while handling languages without
|
|
87
|
+
* spaces (Japanese, Thai) through the locale. `truncate` shortens text
|
|
88
|
+
* without splitting clusters. Derived state only; deterministic during
|
|
89
|
+
* server rendering when the locale is explicit.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const { graphemeCount, truncate } = useSegmenter(bio, { locale: "en" });
|
|
94
|
+
* const remaining = computed(() => 160 - graphemeCount.value);
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @param text Reactive text.
|
|
98
|
+
* @param options Reactive granularity and locale.
|
|
99
|
+
* @default options {}
|
|
100
|
+
* @returns Reactive segments, counts, and truncation.
|
|
101
|
+
*/
|
|
102
|
+
export function useSegmenter(
|
|
103
|
+
text: MaybeRefOrGetter<string>,
|
|
104
|
+
options: MaybeRefOrGetter<UseSegmenterOptions> = {},
|
|
105
|
+
): SegmenterControls {
|
|
106
|
+
const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
|
|
107
|
+
const segmenterFor = (granularity: SegmenterGranularity) =>
|
|
108
|
+
computed(() => new Intl.Segmenter(localeControls.locale.value, { granularity }));
|
|
109
|
+
const graphemes = segmenterFor("grapheme");
|
|
110
|
+
const words = segmenterFor("word");
|
|
111
|
+
const sentences = segmenterFor("sentence");
|
|
112
|
+
const graphemeSegments = computed(() => toSegments(graphemes.value, toValue(text)));
|
|
113
|
+
const wordSegments = computed(() => toSegments(words.value, toValue(text)));
|
|
114
|
+
const segments = computed(() => {
|
|
115
|
+
const granularity = toValue(options).granularity ?? "grapheme";
|
|
116
|
+
if (granularity === "grapheme") return graphemeSegments.value;
|
|
117
|
+
if (granularity === "word") return wordSegments.value;
|
|
118
|
+
return toSegments(sentences.value, toValue(text));
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const truncate = (maxGraphemes: number, ellipsis = "…"): string => {
|
|
122
|
+
if (!Number.isSafeInteger(maxGraphemes) || maxGraphemes < 0) {
|
|
123
|
+
throw new RangeError(
|
|
124
|
+
`[VIZE_COMPOSE_SEGMENTER_INVALID_LENGTH] maxGraphemes must be a non-negative integer; received ${String(maxGraphemes)}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
const all = graphemeSegments.value;
|
|
128
|
+
if (all.length <= maxGraphemes) return toValue(text);
|
|
129
|
+
const ellipsisLength = toSegments(graphemes.value, ellipsis).length;
|
|
130
|
+
const keep = Math.max(0, maxGraphemes - ellipsisLength);
|
|
131
|
+
return (
|
|
132
|
+
all
|
|
133
|
+
.slice(0, keep)
|
|
134
|
+
.map((segment) => segment.segment)
|
|
135
|
+
.join("") + (maxGraphemes >= ellipsisLength ? ellipsis : "")
|
|
136
|
+
);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
locale: localeControls.locale,
|
|
141
|
+
segments,
|
|
142
|
+
count: computed(() => segments.value.length),
|
|
143
|
+
graphemeCount: computed(() => graphemeSegments.value.length),
|
|
144
|
+
wordCount: computed(() => wordSegments.value.filter((segment) => segment.isWordLike).length),
|
|
145
|
+
truncate,
|
|
146
|
+
};
|
|
147
|
+
}
|