@vizejs/composable 0.426.3 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,338 @@
1
+ import {
2
+ computed,
3
+ hasInjectionContext,
4
+ readonly,
5
+ ref,
6
+ shallowReactive,
7
+ shallowReadonly,
8
+ shallowRef,
9
+ toValue,
10
+ watch,
11
+ watchPostEffect,
12
+ } from "vue";
13
+ import type { ComponentPublicInstance, MaybeRefOrGetter, Ref, WritableComputedRef } from "vue";
14
+
15
+ import { isElementNode, resolveElement } from "./element-target.ts";
16
+ import { tryOnScopeDispose } from "./scope.ts";
17
+ import type { TimeoutScheduler } from "./timeout-scheduler.ts";
18
+
19
+ /** Scroll extents shared by elements and the document root element. */
20
+ export interface ScrollMetrics {
21
+ /** Total scrollable width. */
22
+ readonly scrollWidth: number;
23
+ /** Total scrollable height. */
24
+ readonly scrollHeight: number;
25
+ /** Visible width without scrollbars. */
26
+ readonly clientWidth: number;
27
+ /** Visible height without scrollbars. */
28
+ readonly clientHeight: number;
29
+ }
30
+
31
+ /** Window-like scroll container accepted by {@link useScroll}. */
32
+ export interface ScrollWindowHost extends EventTarget {
33
+ /** Horizontal document scroll offset. */
34
+ readonly scrollX: number;
35
+ /** Vertical document scroll offset. */
36
+ readonly scrollY: number;
37
+ /** Scroll the document. */
38
+ scrollTo(options: ScrollToOptions): void;
39
+ /** Document whose root element reports the scroll extents. */
40
+ readonly document: { readonly documentElement: ScrollMetrics };
41
+ }
42
+
43
+ /** Value accepted as a scroll container. */
44
+ export type ScrollTargetValue =
45
+ | Element
46
+ | ComponentPublicInstance
47
+ | ScrollWindowHost
48
+ | null
49
+ | undefined;
50
+
51
+ /** Per-edge boolean state. */
52
+ export interface ScrollEdges {
53
+ /** Left edge (or inline start in LTR). */
54
+ readonly left: boolean;
55
+ /** Right edge. */
56
+ readonly right: boolean;
57
+ /** Top edge. */
58
+ readonly top: boolean;
59
+ /** Bottom edge. */
60
+ readonly bottom: boolean;
61
+ }
62
+
63
+ /** Per-edge distance thresholds in CSS pixels. */
64
+ export interface ScrollOffset {
65
+ /** Distance from the left edge that still counts as arrived. */
66
+ readonly left?: number;
67
+ /** Distance from the right edge that still counts as arrived. */
68
+ readonly right?: number;
69
+ /** Distance from the top edge that still counts as arrived. */
70
+ readonly top?: number;
71
+ /** Distance from the bottom edge that still counts as arrived. */
72
+ readonly bottom?: number;
73
+ }
74
+
75
+ /** Options for {@link useScroll}. */
76
+ export interface UseScrollOptions {
77
+ /**
78
+ * Edge tolerances used to compute `arrivedState`.
79
+ *
80
+ * @default { left: 0, right: 0, top: 0, bottom: 0 }
81
+ */
82
+ readonly offset?: ScrollOffset;
83
+
84
+ /**
85
+ * Milliseconds without scroll events before `isScrolling` becomes `false`
86
+ * (used when the engine does not fire `scrollend`).
87
+ *
88
+ * @default 200
89
+ */
90
+ readonly idle?: number;
91
+
92
+ /**
93
+ * Scroll behavior used by `scrollTo` and the writable `x`/`y` refs.
94
+ *
95
+ * @default "auto"
96
+ */
97
+ readonly behavior?: MaybeRefOrGetter<ScrollBehavior>;
98
+
99
+ /**
100
+ * Called for every scroll event after the state has been updated.
101
+ *
102
+ * @default undefined
103
+ */
104
+ readonly onScroll?: (event: Event) => void;
105
+
106
+ /**
107
+ * Called once scrolling settles.
108
+ *
109
+ * @default undefined
110
+ */
111
+ readonly onStop?: (event: Event) => void;
112
+
113
+ /**
114
+ * Owns the idle timer.
115
+ *
116
+ * @default globalThis timer functions
117
+ */
118
+ readonly scheduler?: TimeoutScheduler;
119
+
120
+ /**
121
+ * Target resolution timing. `"post"` observes template refs after mount.
122
+ *
123
+ * @default "post"
124
+ */
125
+ readonly flush?: "pre" | "post" | "sync";
126
+ }
127
+
128
+ /** Reactive scroll state returned by {@link useScroll}. */
129
+ export interface ScrollControls {
130
+ /** Horizontal offset. Assigning scrolls the target with the configured behavior. */
131
+ readonly x: WritableComputedRef<number>;
132
+ /** Vertical offset. Assigning scrolls the target with the configured behavior. */
133
+ readonly y: WritableComputedRef<number>;
134
+ /** Whether scroll events arrived within the idle window. */
135
+ readonly isScrolling: Readonly<Ref<boolean>>;
136
+ /** Whether each edge has been reached (within `offset`). */
137
+ readonly arrivedState: Readonly<ScrollEdges>;
138
+ /** Direction of the most recent scroll movement; reset when scrolling stops. */
139
+ readonly directions: Readonly<ScrollEdges>;
140
+ /** Re-read offsets and edges without waiting for a scroll event. */
141
+ readonly measure: () => void;
142
+ /** Scroll the target. Missing axes keep their current offset. */
143
+ readonly scrollTo: (options: { readonly left?: number; readonly top?: number }) => void;
144
+ }
145
+
146
+ const defaultScheduler: TimeoutScheduler = {
147
+ setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),
148
+ clearTimeout: (handle) => {
149
+ globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);
150
+ },
151
+ };
152
+
153
+ /**
154
+ * Track the scroll offset, edges, and direction of an element or window.
155
+ *
156
+ * During server rendering (or while the target is unresolved) offsets are `0`,
157
+ * the top/left edges report arrived, and the bottom/right edges do not —
158
+ * matching an unscrolled page, so hydration is stable. The scroll listener is
159
+ * passive and removed together with the idle timer when the owning reactive
160
+ * scope stops.
161
+ *
162
+ * Inside a component the host is read after mounting, so hydration renders
163
+ * the server fallback first and never mismatches.
164
+ *
165
+ * @param target Reactive element, component, or window-like target.
166
+ * @param options Edge offsets, idle timing, behavior, and callbacks.
167
+ * @default options {}
168
+ * @returns Writable offsets, activity, edges, directions, and controls.
169
+ */
170
+ export function useScroll(
171
+ target: MaybeRefOrGetter<ScrollTargetValue>,
172
+ options: UseScrollOptions = {},
173
+ ): ScrollControls {
174
+ const offset = options.offset ?? {};
175
+ const idle = options.idle ?? 200;
176
+ const scheduler = options.scheduler ?? defaultScheduler;
177
+ const internalX = ref(0);
178
+ const internalY = ref(0);
179
+ const isScrolling = ref(false);
180
+ // Inside a component the host is attached by a post-flush job (after the
181
+ // component mounted), so a hydrating client first renders the same server
182
+ // fallback. Outside components it is attached synchronously.
183
+ const hydrated = shallowRef(!hasInjectionContext());
184
+ if (!hydrated.value) {
185
+ watchPostEffect(() => {
186
+ hydrated.value = true;
187
+ });
188
+ }
189
+ const arrivedState = shallowReactive({ left: true, right: false, top: true, bottom: false });
190
+ const directions = shallowReactive({ left: false, right: false, top: false, bottom: false });
191
+ let idleHandle: unknown;
192
+ let hasIdleTimer = false;
193
+
194
+ const resolveContainer = (): Element | ScrollWindowHost | null => {
195
+ if (!hydrated.value) return null;
196
+ const value = toValue(target);
197
+ if (isScrollWindow(value)) return value;
198
+ return resolveElement(value);
199
+ };
200
+
201
+ const measure = (): void => {
202
+ const container = resolveContainer();
203
+ if (!container) return;
204
+ const metrics = isScrollWindow(container) ? container.document.documentElement : container;
205
+ const x = isScrollWindow(container) ? container.scrollX : container.scrollLeft;
206
+ const y = isScrollWindow(container) ? container.scrollY : container.scrollTop;
207
+
208
+ directions.left = x < internalX.value;
209
+ directions.right = x > internalX.value;
210
+ directions.top = y < internalY.value;
211
+ directions.bottom = y > internalY.value;
212
+ internalX.value = x;
213
+ internalY.value = y;
214
+
215
+ const left = Math.abs(x) <= (offset.left ?? 0);
216
+ const top = Math.abs(y) <= (offset.top ?? 0);
217
+ arrivedState.left = left;
218
+ arrivedState.top = top;
219
+ arrivedState.right =
220
+ Math.abs(x) + metrics.clientWidth >= metrics.scrollWidth - (offset.right ?? 0) - 1;
221
+ arrivedState.bottom =
222
+ Math.abs(y) + metrics.clientHeight >= metrics.scrollHeight - (offset.bottom ?? 0) - 1;
223
+ };
224
+
225
+ const settle = (event: Event): void => {
226
+ if (!isScrolling.value) return;
227
+ isScrolling.value = false;
228
+ directions.left = false;
229
+ directions.right = false;
230
+ directions.top = false;
231
+ directions.bottom = false;
232
+ options.onStop?.(event);
233
+ };
234
+ const clearIdle = (): void => {
235
+ if (!hasIdleTimer) return;
236
+ scheduler.clearTimeout(idleHandle);
237
+ hasIdleTimer = false;
238
+ };
239
+
240
+ const onScroll = (event: Event): void => {
241
+ measure();
242
+ isScrolling.value = true;
243
+ clearIdle();
244
+ idleHandle = scheduler.setTimeout(() => {
245
+ hasIdleTimer = false;
246
+ settle(event);
247
+ }, idle);
248
+ hasIdleTimer = true;
249
+ options.onScroll?.(event);
250
+ };
251
+ const onScrollEnd = (event: Event): void => {
252
+ clearIdle();
253
+ settle(event);
254
+ };
255
+
256
+ const stopWatch = watch(
257
+ resolveContainer,
258
+ (container, _previous, onCleanup) => {
259
+ if (!container) return;
260
+ measure();
261
+ const listenerOptions: AddEventListenerOptions = { passive: true };
262
+ container.addEventListener("scroll", onScroll, listenerOptions);
263
+ container.addEventListener("scrollend", onScrollEnd, listenerOptions);
264
+ onCleanup(() => {
265
+ container.removeEventListener("scroll", onScroll);
266
+ container.removeEventListener("scrollend", onScrollEnd);
267
+ clearIdle();
268
+ });
269
+ },
270
+ { immediate: true, flush: options.flush ?? "post" },
271
+ );
272
+ tryOnScopeDispose(() => {
273
+ stopWatch.stop();
274
+ clearIdle();
275
+ });
276
+
277
+ const scrollTo = (next: { readonly left?: number; readonly top?: number }): void => {
278
+ const container = resolveContainer();
279
+ if (!container) return;
280
+ container.scrollTo({
281
+ left: next.left ?? internalX.value,
282
+ top: next.top ?? internalY.value,
283
+ behavior: toValue(options.behavior) ?? "auto",
284
+ });
285
+ };
286
+
287
+ return {
288
+ x: computed({ get: () => internalX.value, set: (left) => scrollTo({ left }) }),
289
+ y: computed({ get: () => internalY.value, set: (top) => scrollTo({ top }) }),
290
+ isScrolling: readonly(isScrolling),
291
+ arrivedState: shallowReadonly(arrivedState),
292
+ directions: shallowReadonly(directions),
293
+ measure,
294
+ scrollTo,
295
+ };
296
+ }
297
+
298
+ /** Options for {@link useWindowScroll}. */
299
+ export interface UseWindowScrollOptions extends UseScrollOptions {
300
+ /**
301
+ * Reactive window capability for alternate runtimes and tests.
302
+ *
303
+ * @default globalThis.window when available
304
+ */
305
+ readonly host?: MaybeRefOrGetter<ScrollWindowHost | null | undefined>;
306
+ }
307
+
308
+ /**
309
+ * Track the document scroll position.
310
+ *
311
+ * Equivalent to {@link useScroll} with the window as target, so it shares its
312
+ * SSR-stable defaults and scope-bound cleanup.
313
+ *
314
+ * @param options Window capability plus every {@link useScroll} option.
315
+ * @default options {}
316
+ * @returns The same controls as {@link useScroll}.
317
+ */
318
+ export function useWindowScroll(options: UseWindowScrollOptions = {}): ScrollControls {
319
+ const { host, ...scrollOptions } = options;
320
+ return useScroll(
321
+ () => (host === undefined ? browserScrollWindow() : toValue(host)),
322
+ scrollOptions,
323
+ );
324
+ }
325
+
326
+ function isScrollWindow(value: unknown): value is ScrollWindowHost {
327
+ return (
328
+ typeof value === "object" &&
329
+ value !== null &&
330
+ !isElementNode(value) &&
331
+ "scrollX" in value &&
332
+ "document" in value
333
+ );
334
+ }
335
+
336
+ function browserScrollWindow(): ScrollWindowHost | undefined {
337
+ return typeof window !== "undefined" ? window : undefined;
338
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Minimal, dependency-free Standard Schema v1 interop.
3
+ *
4
+ * Any validation library implementing the `~standard` protocol (Zod,
5
+ * Valibot, ArkType, Effect Schema, …) satisfies {@link StandardSchemaV1}
6
+ * structurally; nothing from those libraries is imported.
7
+ */
8
+
9
+ /** One segment of a Standard Schema issue path. */
10
+ export type StandardSchemaPathSegment = PropertyKey | { readonly key: PropertyKey };
11
+
12
+ /** One validation issue reported by a Standard Schema. */
13
+ export interface StandardSchemaIssue {
14
+ /** Human-readable message. */
15
+ readonly message: string;
16
+
17
+ /** Location of the issue inside the validated value; absent for root issues. */
18
+ readonly path?: readonly StandardSchemaPathSegment[] | undefined;
19
+ }
20
+
21
+ /** Successful Standard Schema result. */
22
+ export interface StandardSchemaSuccess<Output> {
23
+ /** Parsed (possibly transformed) output. */
24
+ readonly value: Output;
25
+
26
+ /** Always absent on success. */
27
+ readonly issues?: undefined;
28
+ }
29
+
30
+ /** Failed Standard Schema result. */
31
+ export interface StandardSchemaFailure {
32
+ /** Non-empty list of issues. */
33
+ readonly issues: readonly StandardSchemaIssue[];
34
+ }
35
+
36
+ /** Result of `~standard.validate`. */
37
+ export type StandardSchemaResult<Output> = StandardSchemaSuccess<Output> | StandardSchemaFailure;
38
+
39
+ /** The `~standard` property of a Standard Schema v1 validator. */
40
+ export interface StandardSchemaProps<Input, Output> {
41
+ /** Protocol version. */
42
+ readonly version: 1;
43
+
44
+ /** Library that produced the schema. */
45
+ readonly vendor: string;
46
+
47
+ /** Validate an unknown value, synchronously or asynchronously. */
48
+ readonly validate: (
49
+ value: unknown,
50
+ ) => StandardSchemaResult<Output> | Promise<StandardSchemaResult<Output>>;
51
+
52
+ /** Type-only carrier of the input and output types. */
53
+ readonly types?: { readonly input: Input; readonly output: Output } | undefined;
54
+ }
55
+
56
+ /** Any Standard Schema v1 validator. */
57
+ export interface StandardSchemaV1<Input = unknown, Output = Input> {
58
+ /** Standard Schema protocol entry point. */
59
+ readonly "~standard": StandardSchemaProps<Input, Output>;
60
+ }
61
+
62
+ /** Input type accepted by a Standard Schema. */
63
+ export type InferStandardSchemaInput<Schema extends StandardSchemaV1> = NonNullable<
64
+ Schema["~standard"]["types"]
65
+ >["input"];
66
+
67
+ /** Output type produced by a Standard Schema. */
68
+ export type InferStandardSchemaOutput<Schema extends StandardSchemaV1> = NonNullable<
69
+ Schema["~standard"]["types"]
70
+ >["output"];
71
+
72
+ /** Issue normalized to a dotted path (`""` for the root). */
73
+ export interface NormalizedSchemaIssue {
74
+ /** Dotted path such as `address.city` or `items.0.name`; `""` for the root. */
75
+ readonly path: string;
76
+
77
+ /** Human-readable message. */
78
+ readonly message: string;
79
+ }
80
+
81
+ /** Normalized outcome of {@link validateStandardSchema}. */
82
+ export type NormalizedSchemaResult<Output> =
83
+ | {
84
+ /** Validation passed. */
85
+ readonly status: "valid";
86
+ /** Parsed output. */
87
+ readonly value: Output;
88
+ }
89
+ | {
90
+ /** Validation failed. */
91
+ readonly status: "invalid";
92
+ /** Issues with dotted paths, in schema order. */
93
+ readonly issues: readonly NormalizedSchemaIssue[];
94
+ };
95
+
96
+ /**
97
+ * Whether a value implements the Standard Schema v1 protocol.
98
+ *
99
+ * @param candidate Value to test.
100
+ * @returns Whether `candidate["~standard"].validate` is callable with version 1.
101
+ */
102
+ export function isStandardSchema(candidate: unknown): candidate is StandardSchemaV1 {
103
+ if ((typeof candidate !== "object" && typeof candidate !== "function") || candidate === null) {
104
+ return false;
105
+ }
106
+ const props: unknown = Reflect.get(candidate, "~standard");
107
+ return (
108
+ typeof props === "object" &&
109
+ props !== null &&
110
+ Reflect.get(props, "version") === 1 &&
111
+ typeof Reflect.get(props, "validate") === "function"
112
+ );
113
+ }
114
+
115
+ /**
116
+ * Convert a Standard Schema issue path to a dotted path.
117
+ *
118
+ * `{ key }` segments are unwrapped; symbols use their description.
119
+ *
120
+ * @param path Issue path.
121
+ * @returns Dotted path, `""` for the root.
122
+ */
123
+ export function formatSchemaPath(path: readonly StandardSchemaPathSegment[] | undefined): string {
124
+ if (!path) return "";
125
+ return path
126
+ .map((segment) => {
127
+ const key = typeof segment === "object" ? segment.key : segment;
128
+ return typeof key === "symbol" ? (key.description ?? "") : String(key);
129
+ })
130
+ .join(".");
131
+ }
132
+
133
+ /**
134
+ * Validate a value with a Standard Schema and normalize the result.
135
+ *
136
+ * Synchronous and asynchronous schemas are handled identically. Throwing
137
+ * schemas propagate their error. Pure: safe on the server.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * const result = await validateStandardSchema(zodSchema, formValues);
142
+ * if (result.status === "invalid") console.log(result.issues);
143
+ * ```
144
+ *
145
+ * @typeParam Output Schema output type.
146
+ * @param schema Standard Schema v1 validator.
147
+ * @param value Value to validate.
148
+ * @returns The normalized result.
149
+ */
150
+ export async function validateStandardSchema<Output>(
151
+ schema: StandardSchemaV1<unknown, Output>,
152
+ value: unknown,
153
+ ): Promise<NormalizedSchemaResult<Output>> {
154
+ const result = await schema["~standard"].validate(value);
155
+ if (result.issues === undefined) return { status: "valid", value: result.value };
156
+ return {
157
+ status: "invalid",
158
+ issues: result.issues.map((issue) => ({
159
+ path: formatSchemaPath(issue.path),
160
+ message: issue.message,
161
+ })),
162
+ };
163
+ }