@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.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. 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 };