@vizejs/composable 0.426.3 → 0.428.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,274 @@
1
+ import { computed, hasInjectionContext, onMounted, shallowRef, watch } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, WritableComputedRef } from "vue";
3
+
4
+ import { resolveElement } from "./element-target.ts";
5
+ import type { MaybeElementTarget } from "./element-target.ts";
6
+ import { useMediaQuery } from "./media-query.ts";
7
+ import type { MediaQueryHost } from "./media-query.ts";
8
+ import { tryOnScopeDispose } from "./scope.ts";
9
+ import type { StorageLike } from "./use-storage.ts";
10
+
11
+ /** Built-in color modes. */
12
+ export type BasicColorMode = "light" | "dark";
13
+
14
+ /** Selectable mode: a built-in mode, a custom mode, or `"auto"` (follow the system). */
15
+ export type ColorModeValue<Custom extends string = never> = BasicColorMode | Custom | "auto";
16
+
17
+ /**
18
+ * Synchronous key-value persistence used by {@link useColorMode}.
19
+ *
20
+ * The read/write subset of `StorageLike` from `./use-storage`, so
21
+ * `localStorage`, `sessionStorage`, and the same adapters work for both. For
22
+ * hydration-stable SSR pass a cookie-backed adapter that reads the request
23
+ * cookie on the server and `document.cookie` on the client.
24
+ */
25
+ export type ColorModeStorage = Pick<StorageLike, "getItem" | "setItem">;
26
+
27
+ /** Options for {@link useColorMode}. */
28
+ export interface UseColorModeOptions<Custom extends string = never> {
29
+ /**
30
+ * Class name (or attribute value) written for each mode. Custom modes must
31
+ * be listed here.
32
+ *
33
+ * @default { light: "light", dark: "dark" }
34
+ */
35
+ readonly modes?: Readonly<Partial<Record<BasicColorMode, string>> & Record<Custom, string>>;
36
+
37
+ /**
38
+ * `"class"` toggles class names; any other value is used as an attribute
39
+ * name (e.g. `"data-theme"`).
40
+ *
41
+ * @default "class"
42
+ */
43
+ readonly attribute?: string;
44
+
45
+ /**
46
+ * Element that receives the class/attribute.
47
+ *
48
+ * @default document.documentElement when available
49
+ */
50
+ readonly target?: MaybeElementTarget;
51
+
52
+ /**
53
+ * Mode used when nothing is stored.
54
+ *
55
+ * @default "auto"
56
+ */
57
+ readonly initialValue?: ColorModeValue<Custom>;
58
+
59
+ /**
60
+ * Storage key. `null` disables persistence.
61
+ *
62
+ * @default "vize-color-mode"
63
+ */
64
+ readonly storageKey?: string | null;
65
+
66
+ /**
67
+ * Persistence adapter. `null` disables persistence.
68
+ *
69
+ * @default globalThis.window.localStorage when available
70
+ */
71
+ readonly storage?: ColorModeStorage | null;
72
+
73
+ /**
74
+ * System preference assumed while no media capability exists (server rendering).
75
+ *
76
+ * @default "light"
77
+ */
78
+ readonly ssrSystem?: BasicColorMode;
79
+
80
+ /**
81
+ * Suppress CSS transitions for one frame while switching modes.
82
+ *
83
+ * @default true
84
+ */
85
+ readonly disableTransition?: boolean;
86
+
87
+ /**
88
+ * Media capability used to read `prefers-color-scheme`.
89
+ *
90
+ * @default globalThis.window when available
91
+ */
92
+ readonly host?: MaybeRefOrGetter<MediaQueryHost | null | undefined>;
93
+ }
94
+
95
+ /** Reactive color mode returned by {@link useColorMode}. */
96
+ export interface ColorModeControls<Custom extends string> {
97
+ /** Selected mode, including `"auto"`. Assigning persists and applies it. */
98
+ readonly mode: WritableComputedRef<ColorModeValue<Custom>>;
99
+ /** System preference from `prefers-color-scheme`. */
100
+ readonly system: ComputedRef<BasicColorMode>;
101
+ /** Resolved mode (`"auto"` replaced by the system preference). */
102
+ readonly state: ComputedRef<BasicColorMode | Custom>;
103
+ /** Value read from storage at creation (or the initial value). */
104
+ readonly stored: ComputedRef<ColorModeValue<Custom>>;
105
+ }
106
+
107
+ /**
108
+ * Reactive color mode with persistence and DOM application.
109
+ *
110
+ * The stored mode is read synchronously during setup through the injected
111
+ * storage, so a cookie adapter yields identical server and client renders.
112
+ * On the client the resolved mode is written to the target's class list (or
113
+ * attribute) after each change, optionally with transitions suppressed.
114
+ * Nothing touches the DOM during server rendering.
115
+ *
116
+ * @param options Modes, target, persistence, SSR fallback, and capabilities.
117
+ * @default options {}
118
+ * @returns Writable mode plus system and resolved state.
119
+ */
120
+ export function useColorMode<const Custom extends string = never>(
121
+ options: UseColorModeOptions<Custom> = {},
122
+ ): ColorModeControls<Custom> {
123
+ const modes: Readonly<Record<string, string>> = {
124
+ light: "light",
125
+ dark: "dark",
126
+ ...options.modes,
127
+ };
128
+ const attribute = options.attribute ?? "class";
129
+ const storageKey = options.storageKey === undefined ? "vize-color-mode" : options.storageKey;
130
+ const storage = options.storage === undefined ? browserStorage() : options.storage;
131
+ const initial = options.initialValue ?? "auto";
132
+ const isMode = (value: string | null): value is ColorModeValue<Custom> =>
133
+ value === "auto" || (value !== null && Object.hasOwn(modes, value));
134
+
135
+ const read = (): ColorModeValue<Custom> => {
136
+ if (!storage || storageKey === null) return initial;
137
+ try {
138
+ const value = storage.getItem(storageKey);
139
+ return isMode(value) ? value : initial;
140
+ } catch {
141
+ return initial;
142
+ }
143
+ };
144
+ // Inside a component the stored mode is read once it has mounted, so a
145
+ // hydrating client first renders `initialValue` exactly like the server.
146
+ const deferRead = hasInjectionContext();
147
+ const storedValue = shallowRef<ColorModeValue<Custom>>(deferRead ? initial : read());
148
+ const selectedRaw = shallowRef<string>(storedValue.value);
149
+ if (deferRead) {
150
+ onMounted(() => {
151
+ const value = read();
152
+ storedValue.value = value;
153
+ // Keep a mode the user picked before mounting.
154
+ if (selectedRaw.value === initial) selectedRaw.value = value;
155
+ });
156
+ }
157
+ const selected = computed<ColorModeValue<Custom>>(() =>
158
+ isMode(selectedRaw.value) ? selectedRaw.value : initial,
159
+ );
160
+ const prefersDark = useMediaQuery(
161
+ "(prefers-color-scheme: dark)",
162
+ options.host === undefined
163
+ ? { ssrValue: options.ssrSystem === "dark" }
164
+ : { ssrValue: options.ssrSystem === "dark", host: options.host },
165
+ );
166
+ const system = computed<BasicColorMode>(() => (prefersDark.value ? "dark" : "light"));
167
+ const state = computed<BasicColorMode | Custom>(() =>
168
+ selected.value === "auto" ? system.value : selected.value,
169
+ );
170
+
171
+ const target = (): Element | null =>
172
+ options.target === undefined
173
+ ? typeof document !== "undefined"
174
+ ? document.documentElement
175
+ : null
176
+ : resolveElement(options.target);
177
+
178
+ const stop = watch(
179
+ [state, target],
180
+ ([resolved, element]) => {
181
+ if (!element) return;
182
+ const restore =
183
+ options.disableTransition === false ? undefined : suppressTransitions(element);
184
+ const value = modes[resolved] ?? resolved;
185
+ if (attribute === "class") {
186
+ for (const name of Object.values(modes)) {
187
+ for (const token of name.split(/\s+/)) if (token) element.classList.remove(token);
188
+ }
189
+ for (const token of value.split(/\s+/)) if (token) element.classList.add(token);
190
+ } else {
191
+ element.setAttribute(attribute, value);
192
+ }
193
+ restore?.();
194
+ },
195
+ { immediate: true, flush: "post" },
196
+ );
197
+ tryOnScopeDispose(() => stop.stop());
198
+
199
+ const mode = computed<ColorModeValue<Custom>>({
200
+ get: () => selected.value,
201
+ set: (next) => {
202
+ selectedRaw.value = next;
203
+ if (!storage || storageKey === null) return;
204
+ try {
205
+ storage.setItem(storageKey, next);
206
+ } catch {
207
+ // Persistence is best-effort (quota, privacy mode); the in-memory mode still applies.
208
+ }
209
+ },
210
+ });
211
+
212
+ return { mode, system, state, stored: computed(() => storedValue.value) };
213
+ }
214
+
215
+ /** Options for {@link useDark}. */
216
+ export interface UseDarkOptions extends Omit<UseColorModeOptions, "modes"> {
217
+ /**
218
+ * Class/attribute value applied in dark mode.
219
+ *
220
+ * @default "dark"
221
+ */
222
+ readonly valueDark?: string;
223
+
224
+ /**
225
+ * Class/attribute value applied in light mode.
226
+ *
227
+ * @default ""
228
+ */
229
+ readonly valueLight?: string;
230
+ }
231
+
232
+ /**
233
+ * Boolean dark-mode switch built on {@link useColorMode}.
234
+ *
235
+ * Setting the ref to the current system preference stores `"auto"`, so the
236
+ * page keeps following the system until the user picks the opposite mode.
237
+ *
238
+ * @param options Dark/light values plus {@link useColorMode} options.
239
+ * @default options {}
240
+ * @returns Writable dark flag.
241
+ */
242
+ export function useDark(options: UseDarkOptions = {}): WritableComputedRef<boolean> {
243
+ const { valueDark = "dark", valueLight = "", ...rest } = options;
244
+ const colorMode = useColorMode({ ...rest, modes: { dark: valueDark, light: valueLight } });
245
+ return computed({
246
+ get: () => colorMode.state.value === "dark",
247
+ set: (dark: boolean) => {
248
+ const preferred: BasicColorMode = dark ? "dark" : "light";
249
+ colorMode.mode.value = preferred === colorMode.system.value ? "auto" : preferred;
250
+ },
251
+ });
252
+ }
253
+
254
+ function suppressTransitions(element: Element): (() => void) | undefined {
255
+ const document = element.ownerDocument;
256
+ const head = document?.head;
257
+ if (!head || typeof document.createElement !== "function") return undefined;
258
+ const style = document.createElement("style");
259
+ style.textContent = "*,*::before,*::after{transition:none!important}";
260
+ head.appendChild(style);
261
+ return () => {
262
+ void document.defaultView?.getComputedStyle(style).opacity;
263
+ style.remove();
264
+ };
265
+ }
266
+
267
+ function browserStorage(): ColorModeStorage | null {
268
+ if (typeof window === "undefined") return null;
269
+ try {
270
+ return window.localStorage;
271
+ } catch {
272
+ return null;
273
+ }
274
+ }
@@ -0,0 +1,123 @@
1
+ import { computed, shallowRef, watchEffect } from "vue";
2
+ import type { Ref } from "vue";
3
+
4
+ /** Registers a callback run when the current evaluation becomes stale. */
5
+ export type ComputedAsyncCancel = (onCancel: () => void) => void;
6
+
7
+ /** Context handed to a {@link computedAsync} evaluator. */
8
+ export interface ComputedAsyncContext {
9
+ /** Aborted as soon as a newer evaluation starts or the scope stops. */
10
+ readonly signal: AbortSignal;
11
+
12
+ /** Register a callback for when this evaluation becomes stale. */
13
+ readonly onCancel: ComputedAsyncCancel;
14
+ }
15
+
16
+ /** Options for {@link computedAsync}. */
17
+ export interface ComputedAsyncOptions {
18
+ /**
19
+ * Defer the first evaluation until the value is read.
20
+ *
21
+ * @default false
22
+ */
23
+ readonly lazy?: boolean;
24
+
25
+ /**
26
+ * Ref that is `true` while an evaluation is in flight.
27
+ *
28
+ * @default an internal ref
29
+ */
30
+ readonly evaluating?: Ref<boolean>;
31
+
32
+ /**
33
+ * Receives evaluator failures; the previous value is kept.
34
+ *
35
+ * @default undefined (failures are dropped)
36
+ */
37
+ readonly onError?: (error: unknown) => void;
38
+ }
39
+
40
+ /**
41
+ * Computed value backed by an async evaluator.
42
+ *
43
+ * Reactive dependencies read synchronously in the evaluator (before its
44
+ * first `await`) are tracked; when one changes, the previous evaluation is
45
+ * cancelled (its `signal` aborts and `onCancel` callbacks run) and a new one
46
+ * starts. Only the newest evaluation may write the result, so out-of-order
47
+ * responses can never win. The value holds `initial` until the first
48
+ * evaluation settles, which also keeps server and client markup identical
49
+ * during hydration (the server never waits for the promise). Results are
50
+ * stored shallowly: replace the value instead of mutating it.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const user = computedAsync(
55
+ * async ({ signal }) => (await fetch(`/users/${id.value}`, { signal })).json(),
56
+ * null,
57
+ * );
58
+ * ```
59
+ *
60
+ * @param evaluator Async (or sync) producer of the value.
61
+ * @param initial Value before the first evaluation settles.
62
+ * @param options Laziness, evaluating flag, and error hook.
63
+ * @default options {}
64
+ * @returns Readonly ref holding the newest settled value.
65
+ */
66
+ export function computedAsync<Value>(
67
+ evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
68
+ initial: Value,
69
+ options?: ComputedAsyncOptions,
70
+ ): Readonly<Ref<Value>>;
71
+ export function computedAsync<Value>(
72
+ evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
73
+ initial?: undefined,
74
+ options?: ComputedAsyncOptions,
75
+ ): Readonly<Ref<Value | undefined>>;
76
+ export function computedAsync<Value>(
77
+ evaluator: (context: ComputedAsyncContext) => Value | Promise<Value>,
78
+ initial?: Value,
79
+ options: ComputedAsyncOptions = {},
80
+ ): Readonly<Ref<Value | undefined>> {
81
+ const started = shallowRef(!(options.lazy ?? false));
82
+ const current = shallowRef<Value | undefined>(initial);
83
+ const evaluating = options.evaluating ?? shallowRef(false);
84
+ let generation = 0;
85
+
86
+ watchEffect(async (onCleanup) => {
87
+ if (!started.value) return;
88
+ generation += 1;
89
+ const own = generation;
90
+ const controller = new AbortController();
91
+ const cancelCallbacks: (() => void)[] = [];
92
+ let settled = false;
93
+ onCleanup(() => {
94
+ if (settled) return;
95
+ controller.abort();
96
+ for (const callback of cancelCallbacks) callback();
97
+ });
98
+
99
+ evaluating.value = true;
100
+ try {
101
+ const result = await evaluator({
102
+ signal: controller.signal,
103
+ onCancel: (callback) => {
104
+ cancelCallbacks.push(callback);
105
+ },
106
+ });
107
+ if (own === generation) current.value = result;
108
+ } catch (error) {
109
+ if (own === generation) options.onError?.(error);
110
+ } finally {
111
+ settled = true;
112
+ if (own === generation) evaluating.value = false;
113
+ }
114
+ });
115
+
116
+ if (options.lazy ?? false) {
117
+ return computed(() => {
118
+ started.value = true;
119
+ return current.value;
120
+ });
121
+ }
122
+ return current;
123
+ }
@@ -0,0 +1,80 @@
1
+ import { customRef, watch } from "vue";
2
+ import type { Ref, WatchSource } from "vue";
3
+
4
+ /** Readonly cached value plus a manual invalidation trigger. */
5
+ export interface ComputedWithControl<Value> extends Readonly<Ref<Value>> {
6
+ /** Mark the cached value stale; the next read recomputes it. */
7
+ readonly trigger: () => void;
8
+ }
9
+
10
+ /** Explicit dependency accepted by {@link computedWithControl}: anything Vue's `watch` accepts. */
11
+ export type ComputedWithControlSource =
12
+ | WatchSource<unknown>
13
+ | object
14
+ | readonly (WatchSource<unknown> | object)[];
15
+
16
+ /** Options for {@link computedWithControl}. */
17
+ export interface ComputedWithControlOptions {
18
+ /**
19
+ * Invalidate on nested changes of the explicit sources.
20
+ *
21
+ * @default false
22
+ */
23
+ readonly deep?: boolean;
24
+ }
25
+
26
+ /**
27
+ * Computed value whose dependencies are declared explicitly.
28
+ *
29
+ * Only changes of `source` (or a manual {@link ComputedWithControl.trigger})
30
+ * invalidate the cache; reactive reads inside `getter` do not. Useful when
31
+ * the getter reads non-reactive data or should ignore some reactive reads.
32
+ * The getter receives the previous value and runs lazily on the next read.
33
+ * Pure derived state: SSR-safe; the invalidation watcher follows the owning
34
+ * reactive scope.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const snapshot = computedWithControl(version, () => expensiveRead(store));
39
+ * snapshot.trigger(); // force a refresh
40
+ * ```
41
+ *
42
+ * @param source Ref, getter, reactive object, or tuple of those.
43
+ * @param getter Produces the value from the previous one.
44
+ * @param options Depth of the source watch.
45
+ * @default options {}
46
+ * @returns The controlled computed ref.
47
+ */
48
+ export function computedWithControl<Value>(
49
+ source: ComputedWithControlSource,
50
+ getter: (previous: Value | undefined) => Value,
51
+ options: ComputedWithControlOptions = {},
52
+ ): ComputedWithControl<Value> {
53
+ let dirty = true;
54
+ let cached: { readonly value: Value } | undefined;
55
+ let notify = (): void => undefined;
56
+
57
+ const invalidate = (): void => {
58
+ dirty = true;
59
+ notify();
60
+ };
61
+
62
+ watch(source, invalidate, { flush: "sync", deep: options.deep ?? false });
63
+
64
+ const value = customRef<Value>((track, trigger) => {
65
+ notify = trigger;
66
+ return {
67
+ get: () => {
68
+ track();
69
+ if (dirty || cached === undefined) {
70
+ cached = { value: getter(cached?.value) };
71
+ dirty = false;
72
+ }
73
+ return cached.value;
74
+ },
75
+ set: () => undefined,
76
+ };
77
+ });
78
+
79
+ return Object.assign(value, { trigger: invalidate });
80
+ }
@@ -0,0 +1,139 @@
1
+ import { hasInjectionContext } from "vue";
2
+
3
+ import { tryOnScopeDispose } from "./scope.ts";
4
+
5
+ /** Listener registered on an {@link EventHook}. */
6
+ export type EventHookListener<Arguments extends readonly unknown[]> = (
7
+ ...args: Arguments
8
+ ) => unknown;
9
+
10
+ /** Registration handle returned by {@link EventHook.on}. */
11
+ export interface EventHookSubscription {
12
+ /** Remove the listener. Idempotent. */
13
+ readonly off: () => void;
14
+ }
15
+
16
+ /** Options for {@link createEventHook}. */
17
+ export interface CreateEventHookOptions {
18
+ /**
19
+ * What `on()` does when a hook created outside any component (a
20
+ * module-level hook shared by every request) is subscribed to from a
21
+ * component `setup` during server rendering. Vue never disposes server
22
+ * component scopes, so such listeners would accumulate across requests
23
+ * and keep every rendered component alive.
24
+ *
25
+ * - `"ignore"`: skip the registration (the returned `off` is a no-op) and
26
+ * warn once in development.
27
+ * - `"register"`: register anyway; the caller must call `off()`.
28
+ *
29
+ * Hooks created inside a component (request-local hooks) are unaffected.
30
+ *
31
+ * @default "ignore"
32
+ */
33
+ readonly serverListeners?: "ignore" | "register";
34
+ }
35
+
36
+ /** Typed event emitter created by {@link createEventHook}. */
37
+ export interface EventHook<Arguments extends readonly unknown[] = []> {
38
+ /**
39
+ * Add a listener. Inside an effect scope it is removed automatically when
40
+ * the scope stops. Adding the same function twice registers it once.
41
+ */
42
+ readonly on: (listener: EventHookListener<Arguments>) => EventHookSubscription;
43
+
44
+ /** Remove a listener. */
45
+ readonly off: (listener: EventHookListener<Arguments>) => void;
46
+
47
+ /**
48
+ * Call every listener with `args`, in registration order.
49
+ *
50
+ * @returns Settles with every listener's (awaited) result.
51
+ */
52
+ readonly trigger: (...args: Arguments) => Promise<unknown[]>;
53
+
54
+ /** Remove every listener. */
55
+ readonly clear: () => void;
56
+
57
+ /** Number of registered listeners. */
58
+ readonly size: () => number;
59
+ }
60
+
61
+ /**
62
+ * Create a small, strongly typed event emitter.
63
+ *
64
+ * The payload is a tuple type, so events can carry several named arguments
65
+ * (`createEventHook<[id: string, value: number]>()`) and `trigger` checks
66
+ * them. Listeners registered inside an effect scope unsubscribe themselves
67
+ * when it stops. Synchronous listener errors propagate from `trigger`;
68
+ * async rejections reject the returned promise.
69
+ *
70
+ * SSR: Vue does not dispose component scopes after a server render, so a
71
+ * listener that a server `setup` adds to a module-level hook would never be
72
+ * removed and would pile up once per request. By default such registrations
73
+ * are therefore skipped (with a one-time development warning); see
74
+ * {@link CreateEventHookOptions.serverListeners}. Hooks created inside a
75
+ * component, and every registration in the browser, behave normally.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const saved = createEventHook<[id: string]>();
80
+ * saved.on((id) => toast(`Saved ${id}`));
81
+ * await saved.trigger("doc-1");
82
+ * ```
83
+ *
84
+ * @param options Server-side registration policy.
85
+ * @default options {}
86
+ * @returns The event hook.
87
+ */
88
+ export function createEventHook<Arguments extends readonly unknown[] = []>(
89
+ options: CreateEventHookOptions = {},
90
+ ): EventHook<Arguments> {
91
+ const listeners = new Set<EventHookListener<Arguments>>();
92
+ // A hook created outside any component is shared by every server request.
93
+ // `hasInjectionContext()` also detects Vapor components, where the public
94
+ // current-instance getter returns `null`.
95
+ const shared = !hasInjectionContext();
96
+ let warned = false;
97
+
98
+ const off = (listener: EventHookListener<Arguments>): void => {
99
+ listeners.delete(listener);
100
+ };
101
+
102
+ const on = (listener: EventHookListener<Arguments>): EventHookSubscription => {
103
+ if (
104
+ shared &&
105
+ (options.serverListeners ?? "ignore") === "ignore" &&
106
+ typeof window === "undefined" &&
107
+ hasInjectionContext()
108
+ ) {
109
+ if (!warned && isDevelopment()) {
110
+ warned = true;
111
+ console.warn(
112
+ '[VIZE_COMPOSE_EVENT_HOOK_SERVER_LISTENER] a module-level event hook was subscribed to during server rendering; the listener was skipped because server component scopes are never disposed. Create the hook inside the component tree, or pass { serverListeners: "register" } and call off() yourself.',
113
+ );
114
+ }
115
+ return { off: () => undefined };
116
+ }
117
+ listeners.add(listener);
118
+ const subscription = { off: () => off(listener) };
119
+ tryOnScopeDispose(subscription.off);
120
+ return subscription;
121
+ };
122
+
123
+ const trigger = (...args: Arguments): Promise<unknown[]> =>
124
+ Promise.all([...listeners].map((listener) => listener(...args)));
125
+
126
+ return {
127
+ on,
128
+ off,
129
+ trigger,
130
+ clear: () => {
131
+ listeners.clear();
132
+ },
133
+ size: () => listeners.size,
134
+ };
135
+ }
136
+
137
+ function isDevelopment(): boolean {
138
+ return typeof process === "undefined" || process.env["NODE_ENV"] !== "production";
139
+ }
@@ -0,0 +1,34 @@
1
+ import { effectScope } from "vue";
2
+
3
+ /**
4
+ * Lift a state factory into application-wide state shared by every caller.
5
+ *
6
+ * The factory runs once, lazily on the first call, inside a detached effect
7
+ * scope so its watchers and computeds outlive any component; every later
8
+ * call returns the same state. Because the state is module-level, it is
9
+ * shared across all server requests: on the server, keep per-request state
10
+ * in `provide`/`createInjectionState` instead, or reset it per request.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const useSession = createGlobalState(() => ({ user: shallowRef<User | null>(null) }));
15
+ * useSession().user.value = currentUser;
16
+ * ```
17
+ *
18
+ * @param factory Creates the state; may use any composable.
19
+ * @throws `Error` tagged `VIZE_COMPOSE_GLOBAL_STATE_INACTIVE_SCOPE` if the
20
+ * private scope cannot run (never expected in practice).
21
+ * @returns Accessor returning the shared state.
22
+ */
23
+ export function createGlobalState<State>(factory: () => State): () => State {
24
+ let created: { readonly state: State } | undefined;
25
+ return () => {
26
+ if (created === undefined) {
27
+ created = effectScope(true).run(() => ({ state: factory() }));
28
+ if (created === undefined) {
29
+ throw new Error("[VIZE_COMPOSE_GLOBAL_STATE_INACTIVE_SCOPE] the state scope did not run");
30
+ }
31
+ }
32
+ return created.state;
33
+ };
34
+ }