@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,321 @@
1
+ import { computed, readonly, ref, shallowReactive, shallowReadonly, watch } from "vue";
2
+ import type { ComputedRef, Ref } from "vue";
3
+
4
+ import { resolveElement } from "./element-target.ts";
5
+ import type { MaybeElementTarget } from "./element-target.ts";
6
+ import type { Point } from "./mouse.ts";
7
+ import type { PointerKind } from "./pointer.ts";
8
+ import { toPointerKind } from "./pointer.ts";
9
+ import { tryOnScopeDispose } from "./scope.ts";
10
+
11
+ /** Dominant direction of a swipe gesture. `"none"` below the threshold. */
12
+ export type SwipeDirection = "up" | "down" | "left" | "right" | "none";
13
+
14
+ /** Callbacks shared by {@link useSwipe} and {@link usePointerSwipe}. */
15
+ export interface SwipeCallbacks<GestureEvent extends Event> {
16
+ /**
17
+ * Called when a gesture starts.
18
+ *
19
+ * @default undefined
20
+ */
21
+ readonly onSwipeStart?: (event: GestureEvent) => void;
22
+
23
+ /**
24
+ * Called on every move after the threshold has been exceeded.
25
+ *
26
+ * @default undefined
27
+ */
28
+ readonly onSwipe?: (event: GestureEvent) => void;
29
+
30
+ /**
31
+ * Called when a gesture that exceeded the threshold ends.
32
+ *
33
+ * @default undefined
34
+ */
35
+ readonly onSwipeEnd?: (event: GestureEvent, direction: SwipeDirection) => void;
36
+ }
37
+
38
+ /** Options for {@link useSwipe}. */
39
+ export interface UseSwipeOptions extends SwipeCallbacks<TouchEvent> {
40
+ /**
41
+ * Minimum travel in CSS pixels before a gesture counts as a swipe.
42
+ *
43
+ * @default 50
44
+ */
45
+ readonly threshold?: number;
46
+
47
+ /**
48
+ * Register passive touch listeners. Set to `false` to call
49
+ * `preventDefault()` on moves while swiping (for example to block
50
+ * pull-to-refresh).
51
+ *
52
+ * @default true
53
+ */
54
+ readonly passive?: boolean;
55
+ }
56
+
57
+ /** Reactive gesture state shared by the swipe composables. */
58
+ export interface SwipeControls {
59
+ /** Whether a gesture past the threshold is in progress. */
60
+ readonly isSwiping: Readonly<Ref<boolean>>;
61
+ /** Dominant direction of the current (or last) gesture. */
62
+ readonly direction: ComputedRef<SwipeDirection>;
63
+ /** Gesture start coordinates. */
64
+ readonly coordsStart: Readonly<Point>;
65
+ /** Latest gesture coordinates. */
66
+ readonly coordsEnd: Readonly<Point>;
67
+ /** `start.x - end.x`: positive when moving left. */
68
+ readonly lengthX: ComputedRef<number>;
69
+ /** `start.y - end.y`: positive when moving up. */
70
+ readonly lengthY: ComputedRef<number>;
71
+ /** Remove listeners. Idempotent. */
72
+ readonly stop: () => void;
73
+ }
74
+
75
+ /**
76
+ * Classify a displacement into a {@link SwipeDirection}.
77
+ *
78
+ * Pure helper shared by the swipe composables and usable for custom gesture
79
+ * recognizers.
80
+ *
81
+ * @param lengthX `start.x - end.x`.
82
+ * @param lengthY `start.y - end.y`.
83
+ * @param threshold Minimum travel before a direction is reported.
84
+ * @returns The dominant axis direction, or `"none"`.
85
+ */
86
+ export function swipeDirection(
87
+ lengthX: number,
88
+ lengthY: number,
89
+ threshold: number,
90
+ ): SwipeDirection {
91
+ if (Math.max(Math.abs(lengthX), Math.abs(lengthY)) < threshold) return "none";
92
+ if (Math.abs(lengthX) > Math.abs(lengthY)) return lengthX > 0 ? "left" : "right";
93
+ return lengthY > 0 ? "up" : "down";
94
+ }
95
+
96
+ interface GestureCore {
97
+ readonly controls: Omit<SwipeControls, "stop">;
98
+ readonly begin: (point: Point) => void;
99
+ readonly move: (point: Point) => boolean;
100
+ readonly reset: () => void;
101
+ readonly swiping: Ref<boolean>;
102
+ }
103
+
104
+ function createGesture(threshold: number): GestureCore {
105
+ const coordsStart = shallowReactive({ x: 0, y: 0 });
106
+ const coordsEnd = shallowReactive({ x: 0, y: 0 });
107
+ const swiping = ref(false);
108
+ const lengthX = computed(() => coordsStart.x - coordsEnd.x);
109
+ const lengthY = computed(() => coordsStart.y - coordsEnd.y);
110
+ const direction = computed(() => swipeDirection(lengthX.value, lengthY.value, threshold));
111
+ return {
112
+ controls: {
113
+ isSwiping: readonly(swiping),
114
+ direction,
115
+ coordsStart: shallowReadonly(coordsStart),
116
+ coordsEnd: shallowReadonly(coordsEnd),
117
+ lengthX,
118
+ lengthY,
119
+ },
120
+ begin: (point) => {
121
+ coordsStart.x = point.x;
122
+ coordsStart.y = point.y;
123
+ coordsEnd.x = point.x;
124
+ coordsEnd.y = point.y;
125
+ },
126
+ move: (point) => {
127
+ coordsEnd.x = point.x;
128
+ coordsEnd.y = point.y;
129
+ if (!swiping.value && direction.value !== "none") swiping.value = true;
130
+ return swiping.value;
131
+ },
132
+ reset: () => {
133
+ swiping.value = false;
134
+ },
135
+ swiping,
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Detect touch swipes on an element.
141
+ *
142
+ * Tracks the first touch point from `touchstart` through `touchend`/
143
+ * `touchcancel`. Direction is derived from the dominant axis once the travel
144
+ * exceeds `threshold`. Server renders expose zeroed coordinates and
145
+ * `direction: "none"`; listeners are removed with the owning scope.
146
+ *
147
+ * @param target Reactive element target.
148
+ * @param options Threshold, passivity, and callbacks.
149
+ * @default options {}
150
+ * @returns Reactive gesture state and stop control.
151
+ */
152
+ export function useSwipe(target: MaybeElementTarget, options: UseSwipeOptions = {}): SwipeControls {
153
+ const gesture = createGesture(options.threshold ?? 50);
154
+ const passive = options.passive ?? true;
155
+
156
+ const firstTouch = (event: TouchEvent): Point | null => {
157
+ const touch = event.touches[0] ?? event.changedTouches[0];
158
+ return touch ? { x: touch.clientX, y: touch.clientY } : null;
159
+ };
160
+ const onStart = (event: Event): void => {
161
+ if (!isTouchEvent(event)) return;
162
+ const point = firstTouch(event);
163
+ if (!point || event.touches.length > 1) return;
164
+ gesture.begin(point);
165
+ options.onSwipeStart?.(event);
166
+ };
167
+ const onMove = (event: Event): void => {
168
+ if (!isTouchEvent(event)) return;
169
+ const point = firstTouch(event);
170
+ if (!point) return;
171
+ if (!gesture.move(point)) return;
172
+ if (!passive && event.cancelable) event.preventDefault();
173
+ options.onSwipe?.(event);
174
+ };
175
+ const onEnd = (event: Event): void => {
176
+ if (!isTouchEvent(event)) return;
177
+ if (gesture.swiping.value) options.onSwipeEnd?.(event, gesture.controls.direction.value);
178
+ gesture.reset();
179
+ };
180
+
181
+ const stopWatch = watch(
182
+ () => resolveElement(target),
183
+ (element, _previous, onCleanup) => {
184
+ if (!element) return;
185
+ const listenerOptions: AddEventListenerOptions = { passive };
186
+ element.addEventListener("touchstart", onStart, { passive: true });
187
+ element.addEventListener("touchmove", onMove, listenerOptions);
188
+ element.addEventListener("touchend", onEnd, { passive: true });
189
+ element.addEventListener("touchcancel", onEnd, { passive: true });
190
+ onCleanup(() => {
191
+ element.removeEventListener("touchstart", onStart);
192
+ element.removeEventListener("touchmove", onMove);
193
+ element.removeEventListener("touchend", onEnd);
194
+ element.removeEventListener("touchcancel", onEnd);
195
+ });
196
+ },
197
+ { immediate: true, flush: "post" },
198
+ );
199
+ const stop = (): void => stopWatch.stop();
200
+ tryOnScopeDispose(stop);
201
+ return { ...gesture.controls, stop };
202
+ }
203
+
204
+ /** Options for {@link usePointerSwipe}. */
205
+ export interface UsePointerSwipeOptions extends SwipeCallbacks<PointerEvent> {
206
+ /**
207
+ * Minimum travel in CSS pixels before a gesture counts as a swipe.
208
+ *
209
+ * @default 50
210
+ */
211
+ readonly threshold?: number;
212
+
213
+ /**
214
+ * Device kinds that may start a gesture.
215
+ *
216
+ * @default ["mouse", "touch", "pen"]
217
+ */
218
+ readonly pointerTypes?: readonly PointerKind[];
219
+
220
+ /**
221
+ * Suppress text selection on the element while a gesture is active.
222
+ *
223
+ * @default false
224
+ */
225
+ readonly disableTextSelect?: boolean;
226
+ }
227
+
228
+ /**
229
+ * Detect swipes from any pointer device (mouse, touch, pen).
230
+ *
231
+ * Captures the pointer on `pointerdown` so moves outside the element still
232
+ * count, and ignores secondary pointers during a gesture. Shares the state
233
+ * shape and SSR defaults of {@link useSwipe}.
234
+ *
235
+ * @param target Reactive element target.
236
+ * @param options Threshold, device filter, selection handling, and callbacks.
237
+ * @default options {}
238
+ * @returns Reactive gesture state and stop control.
239
+ */
240
+ export function usePointerSwipe(
241
+ target: MaybeElementTarget,
242
+ options: UsePointerSwipeOptions = {},
243
+ ): SwipeControls {
244
+ const gesture = createGesture(options.threshold ?? 50);
245
+ const pointerTypes = options.pointerTypes ?? ["mouse", "touch", "pen"];
246
+ let activePointer: number | null = null;
247
+
248
+ const accepts = (event: Event): event is PointerEvent => {
249
+ if (!isPointerEvent(event)) return false;
250
+ const kind = toPointerKind(event.pointerType);
251
+ return kind !== null && pointerTypes.includes(kind);
252
+ };
253
+ const setSelection = (element: Element, disabled: boolean): void => {
254
+ if (!options.disableTextSelect || !hasStyle(element)) return;
255
+ element.style.setProperty("user-select", disabled ? "none" : "");
256
+ element.style.setProperty("-webkit-user-select", disabled ? "none" : "");
257
+ };
258
+
259
+ const stopWatch = watch(
260
+ () => resolveElement(target),
261
+ (element, _previous, onCleanup) => {
262
+ if (!element) return;
263
+ const onDown = (event: Event): void => {
264
+ if (!accepts(event) || activePointer !== null) return;
265
+ if (event.pointerType === "mouse" && event.button !== 0) return;
266
+ activePointer = event.pointerId;
267
+ if (hasPointerCapture(element)) element.setPointerCapture(event.pointerId);
268
+ gesture.begin({ x: event.clientX, y: event.clientY });
269
+ setSelection(element, true);
270
+ options.onSwipeStart?.(event);
271
+ };
272
+ const onMove = (event: Event): void => {
273
+ if (!accepts(event) || event.pointerId !== activePointer) return;
274
+ if (gesture.move({ x: event.clientX, y: event.clientY })) options.onSwipe?.(event);
275
+ };
276
+ const onUp = (event: Event): void => {
277
+ if (!accepts(event) || event.pointerId !== activePointer) return;
278
+ activePointer = null;
279
+ if (hasPointerCapture(element)) element.releasePointerCapture(event.pointerId);
280
+ if (gesture.swiping.value) options.onSwipeEnd?.(event, gesture.controls.direction.value);
281
+ gesture.reset();
282
+ setSelection(element, false);
283
+ };
284
+ element.addEventListener("pointerdown", onDown, { passive: true });
285
+ element.addEventListener("pointermove", onMove, { passive: true });
286
+ element.addEventListener("pointerup", onUp, { passive: true });
287
+ element.addEventListener("pointercancel", onUp, { passive: true });
288
+ onCleanup(() => {
289
+ element.removeEventListener("pointerdown", onDown);
290
+ element.removeEventListener("pointermove", onMove);
291
+ element.removeEventListener("pointerup", onUp);
292
+ element.removeEventListener("pointercancel", onUp);
293
+ activePointer = null;
294
+ gesture.reset();
295
+ setSelection(element, false);
296
+ });
297
+ },
298
+ { immediate: true, flush: "post" },
299
+ );
300
+ const stop = (): void => stopWatch.stop();
301
+ tryOnScopeDispose(stop);
302
+ return { ...gesture.controls, stop };
303
+ }
304
+
305
+ function isTouchEvent(event: Event): event is TouchEvent {
306
+ return "touches" in event && "changedTouches" in event;
307
+ }
308
+
309
+ function isPointerEvent(event: Event): event is PointerEvent {
310
+ return "pointerId" in event && "pointerType" in event;
311
+ }
312
+
313
+ function hasPointerCapture(
314
+ element: Element,
315
+ ): element is Element & Pick<HTMLElement, "setPointerCapture" | "releasePointerCapture"> {
316
+ return typeof element.setPointerCapture === "function";
317
+ }
318
+
319
+ function hasStyle(element: Element): element is Element & ElementCSSInlineStyle {
320
+ return "style" in element && typeof element.style === "object" && element.style !== null;
321
+ }
@@ -0,0 +1,166 @@
1
+ import { watch } from "vue";
2
+ import type { Ref } from "vue";
3
+
4
+ /** Which way {@link syncRef} copies values. */
5
+ export type SyncRefDirection = "ltr" | "rtl" | "both";
6
+
7
+ /** Converters required by {@link syncRef} for the chosen direction. */
8
+ export type SyncRefTransform<
9
+ Left,
10
+ Right,
11
+ Direction extends SyncRefDirection,
12
+ > = Direction extends "ltr"
13
+ ? { readonly ltr: (left: Left) => Right }
14
+ : Direction extends "rtl"
15
+ ? { readonly rtl: (right: Right) => Left }
16
+ : { readonly ltr: (left: Left) => Right; readonly rtl: (right: Right) => Left };
17
+
18
+ /** Whether two types are mutually assignable (identical for syncing purposes). */
19
+ type SameType<Left, Right> = [Left] extends [Right]
20
+ ? [Right] extends [Left]
21
+ ? true
22
+ : false
23
+ : false;
24
+
25
+ /** Options for {@link syncRef}; `transform` is required when the ref types differ. */
26
+ export type SyncRefOptions<
27
+ Left,
28
+ Right,
29
+ Direction extends SyncRefDirection = "both",
30
+ > = SyncRefBaseOptions<Direction> &
31
+ (SameType<Left, Right> extends true
32
+ ? {
33
+ /**
34
+ * Converters between the two refs.
35
+ *
36
+ * @default identity
37
+ */
38
+ readonly transform?: Partial<SyncRefTransform<Left, Right, Direction>>;
39
+ }
40
+ : {
41
+ /** Converters between the two refs (required: the types differ). */
42
+ readonly transform: SyncRefTransform<Left, Right, Direction>;
43
+ });
44
+
45
+ /** Direction and timing options shared by every {@link syncRef} call. */
46
+ export interface SyncRefBaseOptions<Direction extends SyncRefDirection = "both"> {
47
+ /**
48
+ * `"ltr"` copies left to right, `"rtl"` right to left, `"both"` both ways.
49
+ *
50
+ * @default "both"
51
+ */
52
+ readonly direction?: Direction;
53
+
54
+ /**
55
+ * Watch flush timing.
56
+ *
57
+ * @default "sync"
58
+ */
59
+ readonly flush?: "pre" | "post" | "sync";
60
+
61
+ /**
62
+ * Watch nested changes.
63
+ *
64
+ * @default false
65
+ */
66
+ readonly deep?: boolean;
67
+
68
+ /**
69
+ * Copy once right away (left wins for `"both"`/`"ltr"`, right for `"rtl"`).
70
+ *
71
+ * @default true
72
+ */
73
+ readonly immediate?: boolean;
74
+ }
75
+
76
+ /**
77
+ * Keep two refs in sync, optionally converting between their types.
78
+ *
79
+ * The option type is computed from both ref types: converters may be
80
+ * omitted only when the types are identical, and exactly the converters the
81
+ * direction needs are required otherwise. A re-entrancy guard prevents
82
+ * ping-pong when converters are not exact inverses. Watchers follow the
83
+ * owning reactive scope; SSR-safe.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const celsius = ref(20);
88
+ * const label = ref("");
89
+ * syncRef(celsius, label, {
90
+ * transform: { ltr: (c) => `${c}°C`, rtl: (text) => Number.parseFloat(text) },
91
+ * });
92
+ * ```
93
+ *
94
+ * @param left First ref.
95
+ * @param right Second ref.
96
+ * @param options Direction, timing, and converters.
97
+ * @returns Stops every sync watcher.
98
+ */
99
+ export function syncRef<Left, Right = Left, const Direction extends SyncRefDirection = "both">(
100
+ left: Ref<Left>,
101
+ right: Ref<Right>,
102
+ ...options: SameType<Left, Right> extends true
103
+ ? [options?: SyncRefOptions<Left, Right, Direction>]
104
+ : [options: SyncRefOptions<Left, Right, Direction>]
105
+ ): () => void;
106
+ export function syncRef(
107
+ left: Ref<unknown>,
108
+ right: Ref<unknown>,
109
+ options: SyncRefBaseOptions<SyncRefDirection> & {
110
+ readonly transform?: {
111
+ readonly ltr?: (left: unknown) => unknown;
112
+ readonly rtl?: (right: unknown) => unknown;
113
+ };
114
+ } = {},
115
+ ): () => void {
116
+ const direction = options.direction ?? "both";
117
+ const toRight = options.transform?.ltr ?? ((value: unknown) => value);
118
+ const toLeft = options.transform?.rtl ?? ((value: unknown) => value);
119
+ const watchOptions = {
120
+ flush: options.flush ?? "sync",
121
+ deep: options.deep ?? false,
122
+ } as const;
123
+ const stops: (() => void)[] = [];
124
+ let syncing = false;
125
+
126
+ const guarded = (copy: () => void): void => {
127
+ if (syncing) return;
128
+ syncing = true;
129
+ try {
130
+ copy();
131
+ } finally {
132
+ syncing = false;
133
+ }
134
+ };
135
+
136
+ if (direction !== "rtl") {
137
+ stops.push(
138
+ watch(
139
+ left,
140
+ (value) => {
141
+ guarded(() => {
142
+ right.value = toRight(value);
143
+ });
144
+ },
145
+ { ...watchOptions, immediate: options.immediate ?? true },
146
+ ),
147
+ );
148
+ }
149
+ if (direction !== "ltr") {
150
+ stops.push(
151
+ watch(
152
+ right,
153
+ (value) => {
154
+ guarded(() => {
155
+ left.value = toLeft(value);
156
+ });
157
+ },
158
+ { ...watchOptions, immediate: direction === "rtl" && (options.immediate ?? true) },
159
+ ),
160
+ );
161
+ }
162
+
163
+ return () => {
164
+ for (const stop of stops) stop();
165
+ };
166
+ }
@@ -0,0 +1,182 @@
1
+ import { computed, readonly, shallowRef, toValue, watchEffect } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
3
+ import { Intl as TemporalIntl, Temporal } from "temporal-polyfill-lite";
4
+
5
+ /**
6
+ * Timer host used by {@link useTemporalNow}.
7
+ *
8
+ * Implement this interface to integrate a deterministic clock, a native
9
+ * runtime timer, or an application-owned scheduler.
10
+ */
11
+ export interface TemporalScheduler {
12
+ /** Starts a repeating callback and returns its opaque cancellation handle. */
13
+ readonly setInterval: (callback: () => void, intervalMs: number) => unknown;
14
+
15
+ /** Cancels a handle previously returned by {@link TemporalScheduler.setInterval}. */
16
+ readonly clearInterval: (handle: unknown) => void;
17
+ }
18
+
19
+ /** Options for {@link useTemporalNow}. */
20
+ export interface UseTemporalNowOptions {
21
+ /**
22
+ * Clock update interval in milliseconds.
23
+ *
24
+ * Reactive changes replace the active timer. Values must be finite and
25
+ * greater than zero.
26
+ *
27
+ * @default 1000
28
+ */
29
+ readonly intervalMs?: MaybeRefOrGetter<number>;
30
+
31
+ /**
32
+ * Pauses periodic updates while preserving the current instant.
33
+ * Manual calls to {@link TemporalClock.refresh} continue to work.
34
+ *
35
+ * @default false
36
+ */
37
+ readonly paused?: MaybeRefOrGetter<boolean>;
38
+
39
+ /**
40
+ * Starts the timer when no browser `window` is available.
41
+ *
42
+ * Keep this disabled during server rendering. Enable it for native,
43
+ * desktop, worker, and test runtimes whose scheduler is lifecycle-bound.
44
+ *
45
+ * @default false
46
+ */
47
+ readonly runOnServer?: MaybeRefOrGetter<boolean>;
48
+
49
+ /**
50
+ * Produces the current instant.
51
+ *
52
+ * @default Temporal.Now.instant
53
+ */
54
+ readonly now?: () => Temporal.Instant;
55
+
56
+ /**
57
+ * Owns the repeating timer.
58
+ *
59
+ * @default globalThis timer functions
60
+ */
61
+ readonly scheduler?: TemporalScheduler;
62
+ }
63
+
64
+ /** Reactive controls returned by {@link useTemporalNow}. */
65
+ export interface TemporalClock {
66
+ /** The latest instant. This ref is readonly to consumers. */
67
+ readonly instant: Readonly<Ref<Temporal.Instant>>;
68
+
69
+ /** Reads the clock source immediately, stores the value, and returns it. */
70
+ readonly refresh: () => Temporal.Instant;
71
+ }
72
+
73
+ /** Options for {@link useTemporalZonedDateTime}. */
74
+ export interface UseTemporalZonedDateTimeOptions extends UseTemporalNowOptions {
75
+ /**
76
+ * Time-zone identifier or zoned date-time accepted by Temporal.
77
+ *
78
+ * @default Temporal.Now.timeZoneId()
79
+ */
80
+ readonly timeZone?: MaybeRefOrGetter<Temporal.TimeZoneLike>;
81
+ }
82
+
83
+ const defaultScheduler: TemporalScheduler = {
84
+ setInterval: (callback, intervalMs) => globalThis.setInterval(callback, intervalMs),
85
+ clearInterval: (handle) => {
86
+ globalThis.clearInterval(handle as ReturnType<typeof setInterval>);
87
+ },
88
+ };
89
+
90
+ function resolveIntervalMs(value: number): number {
91
+ if (!Number.isFinite(value) || value <= 0) {
92
+ throw new RangeError(
93
+ `[VIZE_COMPOSE_TEMPORAL_INVALID_INTERVAL] intervalMs must be finite and greater than zero; received ${String(value)}`,
94
+ );
95
+ }
96
+
97
+ return Math.max(1, Math.trunc(value));
98
+ }
99
+
100
+ function shouldSchedule(options: UseTemporalNowOptions): boolean {
101
+ if (toValue(options.paused ?? false)) return false;
102
+ return typeof window !== "undefined" || toValue(options.runOnServer ?? false);
103
+ }
104
+
105
+ /**
106
+ * Creates a pauseable Temporal clock whose timer follows the current Vue
107
+ * effect scope.
108
+ *
109
+ * The timer is replaced when reactive options change and is always cancelled
110
+ * when the owning scope stops. Call inside an active effect scope; without
111
+ * one, there is no automatic timer cleanup. During
112
+ * server rendering, no timer starts unless
113
+ * {@link UseTemporalNowOptions.runOnServer} is explicitly enabled.
114
+ *
115
+ * @param options Clock scheduling, pause, and runtime overrides.
116
+ * @default options {}
117
+ * @throws `RangeError` tagged `VIZE_COMPOSE_TEMPORAL_INVALID_INTERVAL` when
118
+ * the resolved interval is not finite or not greater than zero, both
119
+ * synchronously at creation and on invalid reactive updates.
120
+ * @returns Reactive clock controls.
121
+ */
122
+ export function useTemporalNow(options: UseTemporalNowOptions = {}): TemporalClock {
123
+ const readNow = options.now ?? Temporal.Now.instant;
124
+ const instant = shallowRef(readNow());
125
+
126
+ // Fail synchronously for invalid initial input. Reactive updates are still
127
+ // validated inside the watcher before a replacement timer is created.
128
+ if (shouldSchedule(options)) resolveIntervalMs(toValue(options.intervalMs ?? 1_000));
129
+
130
+ const refresh = (): Temporal.Instant => {
131
+ const nextInstant = readNow();
132
+ instant.value = nextInstant;
133
+ return nextInstant;
134
+ };
135
+
136
+ watchEffect((onCleanup) => {
137
+ if (!shouldSchedule(options)) return;
138
+
139
+ const intervalMs = resolveIntervalMs(toValue(options.intervalMs ?? 1_000));
140
+ const scheduler = options.scheduler ?? defaultScheduler;
141
+ const handle = scheduler.setInterval(refresh, intervalMs);
142
+
143
+ onCleanup(() => scheduler.clearInterval(handle));
144
+ });
145
+
146
+ return {
147
+ instant: readonly(instant),
148
+ refresh,
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Creates a reactive zoned date-time derived from a scoped Temporal clock.
154
+ *
155
+ * Changes to {@link UseTemporalZonedDateTimeOptions.timeZone} are reflected
156
+ * without replacing the underlying timer. Scheduling, server rendering, and
157
+ * scope-cleanup rules are shared with {@link useTemporalNow}.
158
+ *
159
+ * @param options Clock scheduling plus the reactive time zone.
160
+ * @default options {}
161
+ * @throws `RangeError` for invalid intervals (see {@link useTemporalNow}),
162
+ * and on read when the reactive time zone cannot be resolved by Temporal.
163
+ * @returns Computed zoned date-time in the reactive time zone.
164
+ */
165
+ export function useTemporalZonedDateTime(
166
+ options: UseTemporalZonedDateTimeOptions = {},
167
+ ): ComputedRef<Temporal.ZonedDateTime> {
168
+ const clock = useTemporalNow(options);
169
+
170
+ return computed(() => {
171
+ const timeZone =
172
+ options.timeZone === undefined ? Temporal.Now.timeZoneId() : toValue(options.timeZone);
173
+
174
+ return clock.instant.value.toZonedDateTimeISO(timeZone);
175
+ });
176
+ }
177
+
178
+ /**
179
+ * Temporal API namespaces re-exported from the underlying polyfill so hosts
180
+ * can construct instants and time zones without a direct dependency.
181
+ */
182
+ export { Temporal, TemporalIntl };