@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,524 @@
1
+ import { computed, inject, shallowReactive, shallowRef } from "vue";
2
+ import type { App, ComputedRef, InjectionKey, ShallowRef } from "vue";
3
+
4
+ import { createMessageFormatter } from "./icu-message.ts";
5
+ import type {
6
+ FormatMessageOptions,
7
+ MessageArgument,
8
+ MessageArguments,
9
+ MessageFormatter,
10
+ ResolveMessageArguments,
11
+ } from "./icu-message.ts";
12
+ import { useLocale } from "./locale.ts";
13
+ import type { LocaleControls, TextDirection } from "./locale.ts";
14
+
15
+ /* -------------------------------------------------------------------------- */
16
+ /* Catalog types */
17
+ /* -------------------------------------------------------------------------- */
18
+
19
+ /** A nested message catalog: leaves are ICU message strings. */
20
+ export interface MessageTree {
21
+ readonly [key: string]: string | MessageTree;
22
+ }
23
+
24
+ /** Catalogs keyed by locale. */
25
+ export type MessageCatalogs = Readonly<Record<string, MessageTree>>;
26
+
27
+ /** Dotted message keys of one catalog, e.g. `"home.title"`. */
28
+ export type MessageKeysOf<Tree> = {
29
+ [Key in keyof Tree & string]: Tree[Key] extends string
30
+ ? Key
31
+ : `${Key}.${MessageKeysOf<Tree[Key]>}`;
32
+ }[keyof Tree & string];
33
+
34
+ /** Message literal stored at a dotted key. */
35
+ export type MessageAt<Tree, Path extends string> = Path extends `${infer Head}.${infer Rest}`
36
+ ? Head extends keyof Tree
37
+ ? MessageAt<Tree[Head], Rest>
38
+ : never
39
+ : Path extends keyof Tree
40
+ ? Tree[Path] extends string
41
+ ? Tree[Path]
42
+ : never
43
+ : never;
44
+
45
+ /** Every key present in any locale of a catalog set. */
46
+ export type MessageKey<Catalogs> = {
47
+ [Locale in keyof Catalogs]: MessageKeysOf<Catalogs[Locale]>;
48
+ }[keyof Catalogs];
49
+
50
+ /**
51
+ * Parameters `t(key)` needs: the arguments of every translation of `Key`,
52
+ * merged (a typed occurrence in any locale wins over a plain `{name}`).
53
+ */
54
+ export type MessageParamsFor<Catalogs, Key extends string> = ResolveMessageArguments<
55
+ Extract<
56
+ {
57
+ [Locale in keyof Catalogs]: MessageAt<Catalogs[Locale], Key> extends infer Message extends
58
+ string
59
+ ? MessageArguments<Message>
60
+ : never;
61
+ }[keyof Catalogs],
62
+ MessageArgument
63
+ >
64
+ >;
65
+
66
+ /** Keys whose merged parameters contain an impossible (`never`) value. */
67
+ type ConflictingKeys<Catalogs> = {
68
+ [Key in MessageKey<Catalogs> & string]: {
69
+ [Param in keyof MessageParamsFor<Catalogs, Key>]: [
70
+ MessageParamsFor<Catalogs, Key>[Param],
71
+ ] extends [never]
72
+ ? Param
73
+ : never;
74
+ }[keyof MessageParamsFor<Catalogs, Key>] extends never
75
+ ? never
76
+ : Key;
77
+ }[MessageKey<Catalogs> & string];
78
+
79
+ /**
80
+ * Compile-time validation mixed into the `defineMessages` argument. A
81
+ * locale that misses keys other locales define must carry a
82
+ * `__missingTranslations` property (which it cannot), so the compiler
83
+ * reports the missing keys; incompatible parameter types across locales are
84
+ * reported the same way through `__incompatibleParams`.
85
+ */
86
+ export type ValidateCatalogs<Catalogs> = {
87
+ readonly [Locale in keyof Catalogs]: (Exclude<
88
+ MessageKey<Catalogs>,
89
+ MessageKeysOf<Catalogs[Locale]>
90
+ > extends infer Missing
91
+ ? [Missing] extends [never]
92
+ ? unknown
93
+ : { readonly __missingTranslations: Missing }
94
+ : unknown) &
95
+ ([ConflictingKeys<Catalogs>] extends [never]
96
+ ? unknown
97
+ : { readonly __incompatibleParams: ConflictingKeys<Catalogs> });
98
+ };
99
+
100
+ /** Same key structure as a catalog, with any string as message. */
101
+ export type MessageShape<Tree> = {
102
+ readonly [Key in keyof Tree]: Tree[Key] extends string ? string : MessageShape<Tree[Key]>;
103
+ };
104
+
105
+ /** Catalog shape a lazily loaded locale must provide. */
106
+ export type LocaleMessages<Catalogs> = MessageShape<Catalogs[keyof Catalogs]>;
107
+
108
+ /**
109
+ * Per-key check for {@link defineLocale}: a translation may only use
110
+ * parameters the schema knows, with compatible types.
111
+ */
112
+ type ValidateTranslation<Catalogs, Tree, Prefix extends string = ""> = {
113
+ readonly [Key in keyof Tree & string]: Tree[Key] extends infer Message extends string
114
+ ? keyof ResolveMessageArguments<MessageArguments<Message>> extends keyof MessageParamsFor<
115
+ Catalogs,
116
+ `${Prefix}${Key}`
117
+ >
118
+ ? MessageParamsFor<Catalogs, `${Prefix}${Key}`> extends ResolveMessageArguments<
119
+ MessageArguments<Message>
120
+ >
121
+ ? Message
122
+ : `incompatible parameter types for "${Prefix}${Key}"`
123
+ : `unknown parameter in "${Prefix}${Key}"`
124
+ : ValidateTranslation<Catalogs, Tree[Key], `${Prefix}${Key}.`>;
125
+ };
126
+
127
+ /* -------------------------------------------------------------------------- */
128
+ /* defineMessages / defineLocale */
129
+ /* -------------------------------------------------------------------------- */
130
+
131
+ /**
132
+ * Declare typed message catalogs for several locales.
133
+ *
134
+ * The literal messages are preserved, so {@link MessageParamsFor} knows the
135
+ * ICU parameters of every key. The compiler rejects catalogs whose locales
136
+ * do not share the same keys (`__missingTranslations`) or whose
137
+ * translations need incompatible parameter types (`__incompatibleParams`).
138
+ * Returns the catalogs unchanged; the function exists for inference and
139
+ * validation only.
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * const messages = defineMessages({
144
+ * en: { cart: "{count, plural, one {# item} other {# items}}" },
145
+ * ja: { cart: "{count, plural, other {# 個}}" },
146
+ * });
147
+ * ```
148
+ *
149
+ * @param catalogs Messages keyed by locale, then by (nested) key.
150
+ * @throws `TypeError` tagged `VIZE_COMPOSE_I18N_INVALID_KEY` when a key
151
+ * contains a dot (dots separate nested keys).
152
+ * @returns The same catalogs.
153
+ */
154
+ export function defineMessages<const Catalogs extends MessageCatalogs>(
155
+ catalogs: Catalogs & ValidateCatalogs<Catalogs>,
156
+ ): Catalogs {
157
+ for (const tree of Object.values(catalogs)) assertKeys(tree, "");
158
+ return catalogs;
159
+ }
160
+
161
+ /**
162
+ * Declare one additional locale (typically a lazily loaded module) against
163
+ * the catalogs produced by {@link defineMessages}.
164
+ *
165
+ * The keys must match exactly, and every translation may only use
166
+ * parameters the schema declares, with compatible types.
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * // fr.ts
171
+ * export default defineLocale<typeof messages>()({ cart: "{count, plural, one {# article} other {# articles}}" });
172
+ * ```
173
+ *
174
+ * @returns A function that validates and returns the locale catalog.
175
+ */
176
+ export function defineLocale<Catalogs extends MessageCatalogs>(): <
177
+ const Tree extends LocaleMessages<Catalogs>,
178
+ >(
179
+ catalog: Tree & ValidateTranslation<Catalogs, Tree>,
180
+ ) => Tree {
181
+ return (catalog) => {
182
+ assertKeys(catalog, "");
183
+ return catalog;
184
+ };
185
+ }
186
+
187
+ function assertKeys(tree: MessageTree, prefix: string): void {
188
+ for (const [key, value] of Object.entries(tree)) {
189
+ if (key.includes(".")) {
190
+ throw new TypeError(
191
+ `[VIZE_COMPOSE_I18N_INVALID_KEY] message keys must not contain "."; received "${prefix}${key}"`,
192
+ );
193
+ }
194
+ if (typeof value !== "string") assertKeys(value, `${prefix}${key}.`);
195
+ }
196
+ }
197
+
198
+ /* -------------------------------------------------------------------------- */
199
+ /* Runtime */
200
+ /* -------------------------------------------------------------------------- */
201
+
202
+ /** Loader returning the catalog of a lazily loaded locale. */
203
+ export type LocaleLoader<Catalogs> = () => Promise<
204
+ LocaleMessages<Catalogs> | { readonly default: LocaleMessages<Catalogs> }
205
+ >;
206
+
207
+ /** Static configuration shared by every request, passed to {@link defineI18n}. */
208
+ export interface DefineI18nOptions<
209
+ Catalogs extends MessageCatalogs,
210
+ Lazy extends string,
211
+ > extends FormatMessageOptions {
212
+ /** Eagerly bundled catalogs (see {@link defineMessages}). */
213
+ readonly messages: Catalogs;
214
+
215
+ /**
216
+ * Locale used when a key is missing in the active locale.
217
+ *
218
+ * @default the first eager locale
219
+ */
220
+ readonly fallbackLocale?: keyof Catalogs & string;
221
+
222
+ /**
223
+ * Loaders for locales fetched on demand.
224
+ *
225
+ * @default {}
226
+ */
227
+ readonly loaders?: { readonly [Locale in Lazy]: LocaleLoader<Catalogs> };
228
+
229
+ /**
230
+ * Called when a key is missing in the active and fallback locales; the
231
+ * key itself is rendered.
232
+ *
233
+ * @default undefined
234
+ */
235
+ readonly onMissing?: (key: string, locale: string) => void;
236
+ }
237
+
238
+ /** Arguments of `t(key, …)`: the params object is optional only when empty. */
239
+ export type TranslateArguments<Params> = {} extends Params ? [params?: Params] : [params: Params];
240
+
241
+ /** Per-request i18n state and typed translation functions. */
242
+ export interface I18n<Catalogs extends MessageCatalogs, Lazy extends string> {
243
+ /** Active locale. Change it with {@link I18n.setLocale}. */
244
+ readonly locale: Readonly<ShallowRef<(keyof Catalogs & string) | Lazy>>;
245
+
246
+ /** Every locale this instance can switch to. */
247
+ readonly availableLocales: readonly ((keyof Catalogs & string) | Lazy)[];
248
+
249
+ /** Locales whose messages are available right now. */
250
+ readonly loadedLocales: ComputedRef<((keyof Catalogs & string) | Lazy)[]>;
251
+
252
+ /** Whether a lazy locale is being loaded. */
253
+ readonly isLoading: Readonly<ShallowRef<boolean>>;
254
+
255
+ /** Most recent loader failure, cleared on success. */
256
+ readonly error: Readonly<ShallowRef<unknown>>;
257
+
258
+ /** Text direction of the active locale. */
259
+ readonly direction: ComputedRef<TextDirection>;
260
+
261
+ /** `Intl` helpers bound to the active locale (from `useLocale`). */
262
+ readonly intl: LocaleControls;
263
+
264
+ /** Resolves once the initial locale's messages are loaded. */
265
+ readonly ready: Promise<void>;
266
+
267
+ /**
268
+ * Translate a key. Parameters are typed from the ICU messages of every
269
+ * locale. Reactive: reading inside a render re-renders on locale change.
270
+ *
271
+ * @returns The formatted message, or the key when it is missing.
272
+ */
273
+ readonly t: <Key extends MessageKey<Catalogs> & string>(
274
+ key: Key,
275
+ ...params: TranslateArguments<MessageParamsFor<Catalogs, Key>>
276
+ ) => string;
277
+
278
+ /** Whether `key` exists in the active locale. */
279
+ readonly te: (key: MessageKey<Catalogs> & string) => boolean;
280
+
281
+ /**
282
+ * Load (if needed) and activate a locale.
283
+ *
284
+ * @returns Resolves once the locale is active; rejects when loading fails.
285
+ */
286
+ readonly setLocale: (locale: (keyof Catalogs & string) | Lazy) => Promise<void>;
287
+
288
+ /**
289
+ * Load a lazy locale without activating it (for example on hover).
290
+ *
291
+ * @returns Resolves once its messages are available.
292
+ */
293
+ readonly loadLocale: (locale: (keyof Catalogs & string) | Lazy) => Promise<void>;
294
+
295
+ /** Vue plugin hook: provides this instance to the app. */
296
+ readonly install: (app: App) => void;
297
+ }
298
+
299
+ /** Options for {@link I18nDefinition.create}. */
300
+ export interface CreateI18nOptions<Locale extends string> {
301
+ /**
302
+ * Initial locale. Pass the locale resolved for the request (server) and
303
+ * the same value on the client so hydration renders identical text.
304
+ *
305
+ * @default the fallback locale
306
+ */
307
+ readonly locale?: Locale;
308
+ }
309
+
310
+ /** Static i18n definition returned by {@link defineI18n}. */
311
+ export interface I18nDefinition<Catalogs extends MessageCatalogs, Lazy extends string> {
312
+ /** Injection key under which instances are provided. */
313
+ readonly key: InjectionKey<I18n<Catalogs, Lazy>>;
314
+
315
+ /**
316
+ * Create a per-request (per-app) instance. Never share one instance
317
+ * between server requests.
318
+ *
319
+ * @returns The instance; await `ready` before rendering a lazy locale.
320
+ */
321
+ readonly create: (
322
+ options?: CreateI18nOptions<(keyof Catalogs & string) | Lazy>,
323
+ ) => I18n<Catalogs, Lazy>;
324
+
325
+ /**
326
+ * Inject the instance provided by an ancestor (or `app.use(instance)`).
327
+ *
328
+ * @returns The typed instance.
329
+ */
330
+ readonly use: () => I18n<Catalogs, Lazy>;
331
+ }
332
+
333
+ function readMessage(tree: MessageTree | undefined, key: string): string | undefined {
334
+ let node: string | MessageTree | undefined = tree;
335
+ for (const part of key.split(".")) {
336
+ if (node === undefined || typeof node === "string") return undefined;
337
+ node = node[part];
338
+ }
339
+ return typeof node === "string" ? node : undefined;
340
+ }
341
+
342
+ function unwrapModule<Tree>(loaded: Tree | { readonly default: Tree }): Tree {
343
+ return typeof loaded === "object" && loaded !== null && "default" in loaded
344
+ ? loaded.default
345
+ : loaded;
346
+ }
347
+
348
+ /**
349
+ * Define the typed i18n setup of an application.
350
+ *
351
+ * The definition holds only static configuration (catalogs, loaders,
352
+ * formats) and an injection key; it has no mutable module state. Call
353
+ * `create()` per request on the server and once on the client, install the
354
+ * instance with `app.use(instance)`, and read it in components with
355
+ * `definition.use()` (or {@link useI18n}). Locale changes are reactive
356
+ * through `setLocale`, which loads lazy locales first; `Intl` formatting
357
+ * follows the locale through the existing `useLocale` composable.
358
+ *
359
+ * Hydration: locale detection is never automatic. Resolve the locale per
360
+ * request, pass it to `create({ locale })` on both sides, and await
361
+ * `instance.ready` before rendering or mounting when it is lazy.
362
+ * `date`/`time` arguments use a fixed time zone (UTC unless configured).
363
+ *
364
+ * @example
365
+ * ```ts
366
+ * export const appI18n = defineI18n({
367
+ * messages,
368
+ * loaders: { fr: () => import("./locales/fr.ts") },
369
+ * });
370
+ * // per request / client entry
371
+ * const i18n = appI18n.create({ locale: "fr" });
372
+ * await i18n.ready;
373
+ * app.use(i18n);
374
+ * // component
375
+ * const { t } = appI18n.use();
376
+ * t("cart", { count: 2 });
377
+ * ```
378
+ *
379
+ * @param options Catalogs, fallback, loaders, formats, and missing-key hook.
380
+ * @returns The i18n definition.
381
+ */
382
+ export function defineI18n<
383
+ const Catalogs extends MessageCatalogs,
384
+ const Lazy extends string = never,
385
+ >(options: DefineI18nOptions<Catalogs, Lazy>): I18nDefinition<Catalogs, Lazy> {
386
+ type Locale = (keyof Catalogs & string) | Lazy;
387
+ const key: InjectionKey<I18n<Catalogs, Lazy>> = Symbol("vize-i18n");
388
+ const eager = Object.keys(options.messages);
389
+ const lazy: string[] = Object.keys(options.loaders ?? {});
390
+ const fallbackLocale = options.fallbackLocale ?? eager[0] ?? "en";
391
+ const isLocale = (value: string): value is Locale =>
392
+ eager.includes(value) || lazy.includes(value);
393
+ const availableLocales = [...eager, ...lazy].filter(isLocale);
394
+
395
+ const create = (createOptions: CreateI18nOptions<Locale> = {}): I18n<Catalogs, Lazy> => {
396
+ const initial = createOptions.locale ?? fallbackLocale;
397
+ if (!isLocale(initial)) {
398
+ throw new RangeError(
399
+ `[VIZE_COMPOSE_I18N_UNKNOWN_LOCALE] unknown locale "${String(initial)}"`,
400
+ );
401
+ }
402
+ const catalogs = shallowReactive(
403
+ new Map<string, MessageTree>(Object.entries(options.messages)),
404
+ );
405
+ const pending = new Map<string, Promise<void>>();
406
+ const formatters = new Map<string, MessageFormatter>();
407
+ const locale = shallowRef<Locale>(initial);
408
+ const isLoading = shallowRef(false);
409
+ const error = shallowRef<unknown>(undefined);
410
+ const intl = useLocale(locale, { detect: () => undefined, fallback: fallbackLocale });
411
+
412
+ const formatterFor = (localeTag: string): MessageFormatter => {
413
+ let formatter = formatters.get(localeTag);
414
+ if (formatter === undefined) {
415
+ formatter = createMessageFormatter(localeTag, options);
416
+ formatters.set(localeTag, formatter);
417
+ }
418
+ return formatter;
419
+ };
420
+
421
+ const loadLocale = (target: Locale): Promise<void> => {
422
+ if (catalogs.has(target)) return Promise.resolve();
423
+ const existing = pending.get(target);
424
+ if (existing !== undefined) return existing;
425
+ const loaders: Partial<Record<string, LocaleLoader<Catalogs>>> = options.loaders ?? {};
426
+ const loader = loaders[target];
427
+ if (loader === undefined) {
428
+ return Promise.reject(
429
+ new RangeError(`[VIZE_COMPOSE_I18N_UNKNOWN_LOCALE] unknown locale "${target}"`),
430
+ );
431
+ }
432
+ isLoading.value = true;
433
+ const task = loader()
434
+ .then((loaded) => {
435
+ assertKeys(unwrapModule(loaded), "");
436
+ catalogs.set(target, unwrapModule(loaded));
437
+ error.value = undefined;
438
+ })
439
+ .catch((cause: unknown) => {
440
+ error.value = cause;
441
+ throw cause;
442
+ })
443
+ .finally(() => {
444
+ pending.delete(target);
445
+ isLoading.value = pending.size > 0;
446
+ });
447
+ pending.set(target, task);
448
+ return task;
449
+ };
450
+
451
+ const setLocale = async (target: Locale): Promise<void> => {
452
+ await loadLocale(target);
453
+ locale.value = target;
454
+ };
455
+
456
+ const translate = (messageKey: string, params?: Readonly<Record<string, unknown>>): string => {
457
+ const active = locale.value;
458
+ for (const candidate of [active, fallbackLocale]) {
459
+ const message = readMessage(catalogs.get(candidate), messageKey);
460
+ if (message !== undefined) {
461
+ return formatterFor(candidate === active ? intl.locale.value : candidate).format(
462
+ message,
463
+ params,
464
+ );
465
+ }
466
+ }
467
+ options.onMissing?.(messageKey, active);
468
+ return messageKey;
469
+ };
470
+
471
+ const instance: I18n<Catalogs, Lazy> = {
472
+ locale,
473
+ availableLocales,
474
+ loadedLocales: computed(() => [...catalogs.keys()].filter(isLocale)),
475
+ isLoading,
476
+ error,
477
+ direction: intl.direction,
478
+ intl,
479
+ ready: loadLocale(initial),
480
+ t: (messageKey, ...params) => translate(messageKey, params[0]),
481
+ te: (messageKey) => readMessage(catalogs.get(locale.value), messageKey) !== undefined,
482
+ setLocale,
483
+ loadLocale,
484
+ install: (app) => {
485
+ app.provide(key, instance);
486
+ },
487
+ };
488
+ // The initial load's failure is also exposed through `error`.
489
+ instance.ready.catch(() => undefined);
490
+ return instance;
491
+ };
492
+
493
+ const use = (): I18n<Catalogs, Lazy> => {
494
+ const instance = inject(key, null);
495
+ if (instance === null) {
496
+ throw new Error(
497
+ "[VIZE_COMPOSE_I18N_NOT_PROVIDED] no i18n instance was provided; call app.use(definition.create())",
498
+ );
499
+ }
500
+ return instance;
501
+ };
502
+
503
+ return { key, create, use };
504
+ }
505
+
506
+ /**
507
+ * Inject the i18n instance of a definition. Equivalent to
508
+ * `definition.use()`; must run inside `setup` (or `app.runWithContext`).
509
+ *
510
+ * @example
511
+ * ```ts
512
+ * const { t, setLocale } = useI18n(appI18n);
513
+ * ```
514
+ *
515
+ * @param definition Result of {@link defineI18n}.
516
+ * @throws `Error` tagged `VIZE_COMPOSE_I18N_NOT_PROVIDED` when no instance
517
+ * was provided.
518
+ * @returns The typed instance.
519
+ */
520
+ export function useI18n<Catalogs extends MessageCatalogs, Lazy extends string>(
521
+ definition: I18nDefinition<Catalogs, Lazy>,
522
+ ): I18n<Catalogs, Lazy> {
523
+ return definition.use();
524
+ }