@vizejs/composable 0.426.2 → 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,482 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { validateStandardSchema } from "./standard-schema.mjs";
3
+ import { computed, ref, shallowRef, toRaw, triggerRef } from "vue";
4
+ //#region src/use-form.ts
5
+ function isContainer(value) {
6
+ if (Array.isArray(value)) return true;
7
+ if (typeof value !== "object" || value === null) return false;
8
+ const prototype = Object.getPrototypeOf(value);
9
+ return prototype === Object.prototype || prototype === null;
10
+ }
11
+ function splitPath(path) {
12
+ return path === "" ? [] : path.split(".");
13
+ }
14
+ function readChild(container, key) {
15
+ return Array.isArray(container) ? container[Number(key)] : container[key];
16
+ }
17
+ function writeChild(container, key, value) {
18
+ if (Array.isArray(container)) container[Number(key)] = value;
19
+ else container[key] = value;
20
+ }
21
+ /** Read a dotted path. */
22
+ function readPath(root, path) {
23
+ let current = root;
24
+ for (const key of splitPath(path)) {
25
+ if (!isContainer(current)) return void 0;
26
+ current = readChild(current, key);
27
+ }
28
+ return current;
29
+ }
30
+ /** Write a dotted path, creating intermediate containers. */
31
+ function writePath(root, path, value) {
32
+ const keys = splitPath(path);
33
+ const last = keys.at(-1);
34
+ if (last === void 0 || !isContainer(root)) return;
35
+ let current = root;
36
+ for (let index = 0; index < keys.length - 1; index += 1) {
37
+ const key = keys[index] ?? "";
38
+ let next = readChild(current, key);
39
+ if (!isContainer(next)) {
40
+ next = /^\d+$/.test(keys[index + 1] ?? "") ? [] : {};
41
+ writeChild(current, key, next);
42
+ }
43
+ if (!isContainer(next)) return;
44
+ current = next;
45
+ }
46
+ writeChild(current, last, value);
47
+ }
48
+ function cloneValue(value) {
49
+ return structuredClone(toRaw(value));
50
+ }
51
+ function deepEqual(left, right) {
52
+ if (Object.is(left, right)) return true;
53
+ if (left instanceof Date && right instanceof Date) return left.getTime() === right.getTime();
54
+ if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((item, index) => deepEqual(item, right[index]));
55
+ if (isContainer(left) && isContainer(right) && !Array.isArray(left) && !Array.isArray(right)) {
56
+ const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
57
+ for (const key of keys) if (!deepEqual(left[key], right[key])) return false;
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ function toMessages(result) {
63
+ if (result === void 0 || result === null || result === "") return [];
64
+ return typeof result === "string" ? [result] : result.filter((message) => message !== "");
65
+ }
66
+ function unknownMessages(result) {
67
+ if (typeof result === "string") return result === "" ? [] : [result];
68
+ if (!Array.isArray(result)) return [];
69
+ return result.filter((message) => typeof message === "string" && message !== "");
70
+ }
71
+ /** Rewrite `${arrayPath}.${index}…` keys through an index mapping (undefined drops). */
72
+ function remapKeys(entries, arrayPath, mapIndex) {
73
+ const prefix = `${arrayPath}.`;
74
+ const result = [];
75
+ for (const [key, entry] of entries) {
76
+ if (!key.startsWith(prefix)) {
77
+ result.push([key, entry]);
78
+ continue;
79
+ }
80
+ const rest = key.slice(prefix.length);
81
+ const dot = rest.indexOf(".");
82
+ const indexText = dot === -1 ? rest : rest.slice(0, dot);
83
+ const mapped = /^\d+$/.test(indexText) ? mapIndex(Number(indexText)) : NaN;
84
+ if (mapped === void 0) continue;
85
+ if (Number.isNaN(mapped)) {
86
+ result.push([key, entry]);
87
+ continue;
88
+ }
89
+ result.push([`${prefix}${String(mapped)}${dot === -1 ? "" : rest.slice(dot)}`, entry]);
90
+ }
91
+ return result;
92
+ }
93
+ /**
94
+ * Fully typed form state with validation, field arrays, and submission.
95
+ *
96
+ * The value type is inferred from `initialValues`; every path is a
97
+ * template-literal key, so `field("address.city")` returns controls whose
98
+ * `value` is typed as the city's type and misspelled paths do not compile.
99
+ * Validation combines a Standard Schema v1 validator (Zod, Valibot, ArkType,
100
+ * … via the `~standard` protocol), a whole-form validator, and per-field
101
+ * validators; all may be asynchronous. A newer validation aborts older ones
102
+ * through their `signal` and their results are discarded, so a slow check
103
+ * can never overwrite fresher errors.
104
+ *
105
+ * This composable owns the *values*. `@vizejs/ui/form` owns accessible
106
+ * error presentation (error summaries, focus management, native constraint
107
+ * validation); feed {@link FormControls.errors} into it to render them.
108
+ *
109
+ * Server rendering: pure state, no host access; validation never runs
110
+ * automatically during setup, so server and client render the same markup.
111
+ * Pending validations are aborted when the owning scope stops.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * const form = useForm({
116
+ * initialValues: { name: "", address: { city: "" }, tags: [] as string[] },
117
+ * validators: { name: (name) => (name ? undefined : "Required") },
118
+ * onSubmit: (values) => api.save(values),
119
+ * });
120
+ * const city = form.field("address.city"); // city.value: Ref<string>
121
+ * const tags = form.fieldArray("tags");
122
+ * tags.append("vue");
123
+ * ```
124
+ *
125
+ * @typeParam Values Form values, inferred from `initialValues`.
126
+ * @typeParam Output Submitted value, inferred from `schema` (defaults to `Values`).
127
+ * @param options Initial values, validators, triggers, and submit handler.
128
+ * @returns Form state and actions.
129
+ */
130
+ function useForm(options) {
131
+ const createInitial = () => typeof options.initialValues === "function" ? options.initialValues() : cloneValue(options.initialValues);
132
+ let initial = createInitial();
133
+ const values = ref(cloneValue(initial));
134
+ const errors = shallowRef({});
135
+ const touched = shallowRef(/* @__PURE__ */ new Set());
136
+ const pending = ref(/* @__PURE__ */ new Map());
137
+ const submitting = ref(false);
138
+ const submitCount = ref(0);
139
+ const arrayKeys = /* @__PURE__ */ new Map();
140
+ let nextKey = 0;
141
+ let formController;
142
+ const fieldControllers = /* @__PURE__ */ new Map();
143
+ const validators = Object.entries(options.validators ?? {});
144
+ const runValidator = (validator, path, snapshot, signal) => {
145
+ if (typeof validator !== "function") return Promise.resolve([]);
146
+ const outcome = Reflect.apply(validator, void 0, [readPath(snapshot, path), {
147
+ values: snapshot,
148
+ path,
149
+ signal
150
+ }]);
151
+ return Promise.resolve(outcome).then(unknownMessages);
152
+ };
153
+ const trigger = () => submitCount.value > 0 ? options.revalidateOn ?? "change" : options.validateOn ?? "submit";
154
+ const beginPending = (path) => {
155
+ pending.value.set(path, (pending.value.get(path) ?? 0) + 1);
156
+ };
157
+ const endPending = (path) => {
158
+ const count = (pending.value.get(path) ?? 1) - 1;
159
+ if (count <= 0) pending.value.delete(path);
160
+ else pending.value.set(path, count);
161
+ };
162
+ const setErrorsFor = (path, messages) => {
163
+ const next = { ...errors.value };
164
+ if (messages.length === 0) Reflect.deleteProperty(next, path);
165
+ else next[path] = messages;
166
+ errors.value = next;
167
+ };
168
+ const readFieldValidator = (path) => validators.find(([candidate]) => candidate === path)?.[1];
169
+ /** Collect every error source; resolves to errors keyed by path. */
170
+ const collectErrors = async (signal) => {
171
+ const snapshot = values.value;
172
+ const collected = {};
173
+ const add = (path, messages) => {
174
+ if (messages.length === 0) return;
175
+ (collected[path] ??= []).push(...messages);
176
+ };
177
+ let output = snapshot;
178
+ const tasks = [];
179
+ if (options.schema) {
180
+ const schema = options.schema;
181
+ tasks.push(validateStandardSchema(schema, cloneValue(snapshot)).then((result) => {
182
+ if (result.status === "valid") output = result.value;
183
+ else for (const issue of result.issues) add(issue.path, [issue.message]);
184
+ }));
185
+ }
186
+ if (options.validate) {
187
+ const validate = options.validate;
188
+ tasks.push(Promise.resolve(validate(snapshot, { signal })).then((result) => {
189
+ if (!result) return;
190
+ for (const [path, messages] of Object.entries(result)) if (messages !== void 0) add(path, toMessages(messages));
191
+ }));
192
+ }
193
+ for (const [path, validator] of validators) tasks.push(runValidator(validator, path, snapshot, signal).then((messages) => add(path, messages)));
194
+ await Promise.all(tasks);
195
+ return {
196
+ errors: collected,
197
+ output
198
+ };
199
+ };
200
+ const validate = async () => {
201
+ formController?.abort(new DOMException("A newer validation started.", "AbortError"));
202
+ for (const controller of fieldControllers.values()) controller.abort();
203
+ fieldControllers.clear();
204
+ const controller = new AbortController();
205
+ formController = controller;
206
+ beginPending("");
207
+ try {
208
+ const outcome = await collectErrors(controller.signal);
209
+ if (controller.signal.aborted) return { status: "superseded" };
210
+ errors.value = outcome.errors;
211
+ if (Object.keys(outcome.errors).length > 0) return {
212
+ status: "invalid",
213
+ errors: { ...outcome.errors }
214
+ };
215
+ return {
216
+ status: "valid",
217
+ value: outcome.output
218
+ };
219
+ } finally {
220
+ endPending("");
221
+ if (formController === controller) formController = void 0;
222
+ }
223
+ };
224
+ const schemaIssuesFor = async (path) => {
225
+ if (!options.schema) return [];
226
+ const result = await validateStandardSchema(options.schema, cloneValue(values.value));
227
+ if (result.status === "valid") return [];
228
+ return result.issues.filter((issue) => issue.path === path).map((issue) => issue.message);
229
+ };
230
+ const validateField = async (path) => {
231
+ fieldControllers.get(path)?.abort();
232
+ const controller = new AbortController();
233
+ fieldControllers.set(path, controller);
234
+ beginPending(path);
235
+ try {
236
+ const validator = readFieldValidator(path);
237
+ const snapshot = values.value;
238
+ const [own, fromSchema, fromForm] = await Promise.all([
239
+ runValidator(validator, path, snapshot, controller.signal),
240
+ schemaIssuesFor(path),
241
+ options.validate ? Promise.resolve(options.validate(snapshot, { signal: controller.signal })).then((result) => {
242
+ const messages = result ? Reflect.get(result, path) : void 0;
243
+ return Array.isArray(messages) ? messages.filter((message) => typeof message === "string") : [];
244
+ }) : Promise.resolve([])
245
+ ]);
246
+ if (controller.signal.aborted) return false;
247
+ const messages = [
248
+ ...fromSchema,
249
+ ...fromForm,
250
+ ...own
251
+ ];
252
+ setErrorsFor(path, messages);
253
+ return messages.length === 0;
254
+ } finally {
255
+ endPending(path);
256
+ if (fieldControllers.get(path) === controller) fieldControllers.delete(path);
257
+ }
258
+ };
259
+ const touch = (path) => {
260
+ if (touched.value.has(path)) return;
261
+ const next = new Set(touched.value);
262
+ next.add(path);
263
+ touched.value = next;
264
+ };
265
+ const setValueAt = (path, value, setOptions = {}) => {
266
+ writePath(values.value, path, value);
267
+ if (setOptions.touch) touch(path);
268
+ if (setOptions.validate ?? trigger() === "change") validateField(path);
269
+ };
270
+ const syncKeys = (path, length) => {
271
+ let keys = arrayKeys.get(path);
272
+ if (!keys) {
273
+ keys = [];
274
+ arrayKeys.set(path, keys);
275
+ }
276
+ while (keys.length < length) keys.push(nextKey++);
277
+ if (keys.length > length) keys.length = length;
278
+ return keys;
279
+ };
280
+ const readArray = (path) => {
281
+ const current = readPath(values.value, path);
282
+ if (Array.isArray(current)) return current;
283
+ const created = [];
284
+ writePath(values.value, path, created);
285
+ return created;
286
+ };
287
+ const remapState = (path, mapIndex) => {
288
+ errors.value = Object.fromEntries(remapKeys(Object.entries(errors.value), path, mapIndex));
289
+ touched.value = new Set(remapKeys([...touched.value].map((key) => [key, true]), path, mapIndex).map(([key]) => key));
290
+ };
291
+ const keysVersion = shallowRef(0);
292
+ const bumpKeys = () => {
293
+ keysVersion.value += 1;
294
+ triggerRef(keysVersion);
295
+ };
296
+ const field = (path) => {
297
+ const key = path;
298
+ const read = () => readPath(values.value, key);
299
+ return {
300
+ path,
301
+ value: computed({
302
+ get: read,
303
+ set: (next) => setValueAt(key, next)
304
+ }),
305
+ errors: computed(() => errors.value[key] ?? []),
306
+ error: computed(() => errors.value[key]?.[0]),
307
+ dirty: computed(() => !deepEqual(readPath(values.value, key), readPath(initial, key))),
308
+ touched: computed(() => touched.value.has(key)),
309
+ validating: computed(() => pending.value.has(key) || pending.value.has("")),
310
+ onBlur: () => {
311
+ touch(key);
312
+ if (trigger() === "blur") validateField(key);
313
+ },
314
+ validate: () => validateField(key),
315
+ reset: () => {
316
+ writePath(values.value, key, cloneValue(readPath(initial, key)));
317
+ setErrorsFor(key, []);
318
+ const next = new Set(touched.value);
319
+ next.delete(key);
320
+ touched.value = next;
321
+ }
322
+ };
323
+ };
324
+ const fieldArray = (path) => {
325
+ const key = path;
326
+ const afterChange = () => {
327
+ bumpKeys();
328
+ if (trigger() === "change") validateField(key);
329
+ };
330
+ const insertAt = (index, items) => {
331
+ const array = readArray(key);
332
+ const keys = syncKeys(key, array.length);
333
+ const at = Math.max(0, Math.min(index, array.length));
334
+ remapState(key, (old) => old >= at ? old + items.length : old);
335
+ array.splice(at, 0, ...items);
336
+ keys.splice(at, 0, ...items.map(() => nextKey++));
337
+ afterChange();
338
+ };
339
+ return {
340
+ entries: computed(() => {
341
+ keysVersion.value;
342
+ const array = readPath(values.value, key);
343
+ if (!Array.isArray(array)) return [];
344
+ const keys = syncKeys(key, array.length);
345
+ return array.map((value, index) => ({
346
+ key: keys[index] ?? index,
347
+ index,
348
+ path: `${path}.${index}`,
349
+ value
350
+ }));
351
+ }),
352
+ append: (...items) => insertAt(Number.MAX_SAFE_INTEGER, items),
353
+ prepend: (...items) => insertAt(0, items),
354
+ insert: (index, item) => insertAt(index, [item]),
355
+ remove: (index) => {
356
+ const array = readArray(key);
357
+ if (index < 0 || index >= array.length) return;
358
+ const keys = syncKeys(key, array.length);
359
+ remapState(key, (old) => old === index ? void 0 : old > index ? old - 1 : old);
360
+ array.splice(index, 1);
361
+ keys.splice(index, 1);
362
+ afterChange();
363
+ },
364
+ move: (from, to) => {
365
+ const array = readArray(key);
366
+ if (from < 0 || from >= array.length || to < 0 || to >= array.length || from === to) return;
367
+ const keys = syncKeys(key, array.length);
368
+ remapState(key, (old) => {
369
+ if (old === from) return to;
370
+ if (from < to && old > from && old <= to) return old - 1;
371
+ if (from > to && old >= to && old < from) return old + 1;
372
+ return old;
373
+ });
374
+ const [item] = array.splice(from, 1);
375
+ array.splice(to, 0, item);
376
+ const [movedKey] = keys.splice(from, 1);
377
+ keys.splice(to, 0, movedKey ?? nextKey++);
378
+ afterChange();
379
+ },
380
+ swap: (first, second) => {
381
+ const array = readArray(key);
382
+ if (first < 0 || second < 0 || first >= array.length || second >= array.length) return;
383
+ const keys = syncKeys(key, array.length);
384
+ remapState(key, (old) => old === first ? second : old === second ? first : old);
385
+ const firstItem = array[first];
386
+ array[first] = array[second];
387
+ array[second] = firstItem;
388
+ const firstKey = keys[first] ?? nextKey++;
389
+ keys[first] = keys[second] ?? nextKey++;
390
+ keys[second] = firstKey;
391
+ afterChange();
392
+ },
393
+ replace: (items) => {
394
+ remapState(key, () => void 0);
395
+ writePath(values.value, key, [...items]);
396
+ arrayKeys.delete(key);
397
+ afterChange();
398
+ }
399
+ };
400
+ };
401
+ const clearErrors = (path) => {
402
+ if (path === void 0) errors.value = {};
403
+ else setErrorsFor(path, []);
404
+ };
405
+ const submitWith = async (handler) => {
406
+ submitCount.value += 1;
407
+ submitting.value = true;
408
+ try {
409
+ const result = await validate();
410
+ const signal = formController?.signal ?? new AbortController().signal;
411
+ if (result.status === "valid") {
412
+ const onSubmit = handler ?? options.onSubmit;
413
+ if (onSubmit) await onSubmit(result.value, { signal });
414
+ } else if (result.status === "invalid") {
415
+ const next = new Set(touched.value);
416
+ for (const path of Object.keys(result.errors)) if (path !== "") next.add(path);
417
+ touched.value = next;
418
+ }
419
+ return result;
420
+ } finally {
421
+ submitting.value = false;
422
+ }
423
+ };
424
+ const reset = (next) => {
425
+ formController?.abort();
426
+ for (const controller of fieldControllers.values()) controller.abort();
427
+ fieldControllers.clear();
428
+ initial = next === void 0 ? createInitial() : cloneValue(next);
429
+ values.value = cloneValue(initial);
430
+ errors.value = {};
431
+ touched.value = /* @__PURE__ */ new Set();
432
+ pending.value.clear();
433
+ submitCount.value = 0;
434
+ arrayKeys.clear();
435
+ bumpKeys();
436
+ };
437
+ tryOnScopeDispose(() => {
438
+ formController?.abort();
439
+ for (const controller of fieldControllers.values()) controller.abort();
440
+ });
441
+ return {
442
+ values,
443
+ errors,
444
+ valid: computed(() => Object.keys(errors.value).length === 0),
445
+ dirty: computed(() => !deepEqual(values.value, initial)),
446
+ validating: computed(() => pending.value.size > 0),
447
+ submitting,
448
+ submitCount,
449
+ field,
450
+ fieldArray,
451
+ getValue: (path) => readPath(values.value, path),
452
+ setValue: (path, value, setOptions) => setValueAt(path, value, setOptions),
453
+ setValues: (next, setOptions = {}) => {
454
+ if (setOptions.merge) values.value = {
455
+ ...values.value,
456
+ ...cloneValue(next)
457
+ };
458
+ else values.value = {
459
+ ...cloneValue(initial),
460
+ ...cloneValue(next)
461
+ };
462
+ arrayKeys.clear();
463
+ bumpKeys();
464
+ },
465
+ isTouched: (path) => touched.value.has(path),
466
+ setErrors: (next) => {
467
+ const normalized = {};
468
+ for (const [path, messages] of Object.entries(next)) if (messages !== void 0 && messages.length > 0) normalized[path] = messages;
469
+ errors.value = normalized;
470
+ },
471
+ clearErrors,
472
+ validate,
473
+ submit: submitWith,
474
+ handleSubmit: (handler) => (event) => {
475
+ event?.preventDefault();
476
+ return submitWith(handler);
477
+ },
478
+ reset
479
+ };
480
+ }
481
+ //#endregion
482
+ export { useForm };
@@ -0,0 +1,104 @@
1
+ import { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
2
+
3
+ //#region src/use-fullscreen.d.ts
4
+ /** Browser navigation UI preference while fullscreen. */
5
+ type FullscreenNavigationUI = "auto" | "hide" | "show";
6
+ /** Element that can enter fullscreen (standard or WebKit-prefixed). */
7
+ interface FullscreenElementLike {
8
+ /** Standard request. */
9
+ requestFullscreen?(options?: {
10
+ navigationUI?: FullscreenNavigationUI;
11
+ }): Promise<void>;
12
+ /** Legacy WebKit request (Safari < 16.4). */
13
+ webkitRequestFullscreen?(): void;
14
+ }
15
+ /** Document-level fullscreen capability (standard or WebKit-prefixed). */
16
+ interface FullscreenHost extends EventTarget {
17
+ /** Element currently in fullscreen. */
18
+ readonly fullscreenElement?: unknown;
19
+ /** Legacy WebKit fullscreen element. */
20
+ readonly webkitFullscreenElement?: unknown;
21
+ /** Whether fullscreen is allowed (for example by permissions policy). */
22
+ readonly fullscreenEnabled?: boolean;
23
+ /** Legacy WebKit flag. */
24
+ readonly webkitFullscreenEnabled?: boolean;
25
+ /** Standard exit. */
26
+ exitFullscreen?(): Promise<void>;
27
+ /** Legacy WebKit exit. */
28
+ webkitExitFullscreen?(): void;
29
+ /** Default fullscreen target. */
30
+ readonly documentElement?: FullscreenElementLike | null;
31
+ }
32
+ /** Options for {@link useFullscreen}. */
33
+ interface UseFullscreenOptions {
34
+ /**
35
+ * Document capability for alternate runtimes and tests.
36
+ *
37
+ * @default window.document when a browser window exists
38
+ */
39
+ readonly host?: MaybeRefOrGetter<FullscreenHost | null | undefined>;
40
+ /**
41
+ * Exit fullscreen when the owning reactive scope stops while this
42
+ * composable's target is fullscreen.
43
+ *
44
+ * @default false
45
+ */
46
+ readonly autoExit?: boolean;
47
+ /**
48
+ * Navigation UI preference passed to `requestFullscreen`.
49
+ *
50
+ * @default "auto"
51
+ */
52
+ readonly navigationUI?: FullscreenNavigationUI;
53
+ }
54
+ /** Reactive state and actions returned by {@link useFullscreen}. */
55
+ interface FullscreenControls {
56
+ /** Whether fullscreen can be requested. */
57
+ readonly supported: ComputedRef<boolean>;
58
+ /** Whether this composable's target is the current fullscreen element. */
59
+ readonly isFullscreen: Readonly<Ref<boolean>>;
60
+ /**
61
+ * Enter fullscreen. Browsers require a user gesture.
62
+ *
63
+ * @returns Whether the target is fullscreen afterwards.
64
+ */
65
+ readonly enter: () => Promise<boolean>;
66
+ /**
67
+ * Exit fullscreen when this composable's target owns it.
68
+ *
69
+ * @returns Whether the target is fullscreen afterwards.
70
+ */
71
+ readonly exit: () => Promise<boolean>;
72
+ /**
73
+ * Toggle fullscreen.
74
+ *
75
+ * @returns Whether the target is fullscreen afterwards.
76
+ */
77
+ readonly toggle: () => Promise<boolean>;
78
+ }
79
+ /**
80
+ * Enter, exit, and observe fullscreen for an element.
81
+ *
82
+ * Supports the standard Fullscreen API and the WebKit-prefixed variant.
83
+ * `isFullscreen` is true only while *this* target is the fullscreen element
84
+ * and follows `fullscreenchange`, so pressing Escape is reflected. Listeners
85
+ * are removed when the owning scope stops; with `autoExit` the target also
86
+ * leaves fullscreen then.
87
+ *
88
+ * Server rendering: `supported` and `isFullscreen` are false and nothing is
89
+ * requested.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const player = useTemplateRef<HTMLElement>("player");
94
+ * const { toggle, isFullscreen } = useFullscreen(player);
95
+ * ```
96
+ *
97
+ * @param target Reactive element; defaults to the document element.
98
+ * @param options Capability, navigation UI, and exit policy.
99
+ * @default options {}
100
+ * @returns Fullscreen state and actions.
101
+ */
102
+ declare function useFullscreen(target?: MaybeRefOrGetter<FullscreenElementLike | null | undefined>, options?: UseFullscreenOptions): FullscreenControls;
103
+ //#endregion
104
+ export { FullscreenControls, FullscreenElementLike, FullscreenHost, FullscreenNavigationUI, UseFullscreenOptions, useFullscreen };
@@ -0,0 +1,95 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { computed, readonly, ref, toRaw, toValue, watch } from "vue";
3
+ //#region src/use-fullscreen.ts
4
+ const changeEvents = ["fullscreenchange", "webkitfullscreenchange"];
5
+ function browserFullscreenHost() {
6
+ return typeof window === "undefined" ? void 0 : window.document;
7
+ }
8
+ function currentElement(host) {
9
+ return host.fullscreenElement ?? host.webkitFullscreenElement ?? null;
10
+ }
11
+ /**
12
+ * Enter, exit, and observe fullscreen for an element.
13
+ *
14
+ * Supports the standard Fullscreen API and the WebKit-prefixed variant.
15
+ * `isFullscreen` is true only while *this* target is the fullscreen element
16
+ * and follows `fullscreenchange`, so pressing Escape is reflected. Listeners
17
+ * are removed when the owning scope stops; with `autoExit` the target also
18
+ * leaves fullscreen then.
19
+ *
20
+ * Server rendering: `supported` and `isFullscreen` are false and nothing is
21
+ * requested.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const player = useTemplateRef<HTMLElement>("player");
26
+ * const { toggle, isFullscreen } = useFullscreen(player);
27
+ * ```
28
+ *
29
+ * @param target Reactive element; defaults to the document element.
30
+ * @param options Capability, navigation UI, and exit policy.
31
+ * @default options {}
32
+ * @returns Fullscreen state and actions.
33
+ */
34
+ function useFullscreen(target, options = {}) {
35
+ const isFullscreen = ref(false);
36
+ const resolveHost = () => options.host === void 0 ? browserFullscreenHost() : toValue(options.host) ?? void 0;
37
+ const resolveTarget = () => target === void 0 ? resolveHost()?.documentElement ?? void 0 : toValue(target) ?? void 0;
38
+ const update = () => {
39
+ const host = resolveHost();
40
+ const element = resolveTarget();
41
+ isFullscreen.value = host !== void 0 && element !== void 0 && toRaw(currentElement(host)) === toRaw(element);
42
+ };
43
+ const supported = computed(() => {
44
+ const host = resolveHost();
45
+ const element = resolveTarget();
46
+ if (!host || !element) return false;
47
+ return (host.fullscreenEnabled ?? host.webkitFullscreenEnabled ?? true) && (typeof element.requestFullscreen === "function" || typeof element.webkitRequestFullscreen === "function");
48
+ });
49
+ const enter = async () => {
50
+ const element = resolveTarget();
51
+ if (!supported.value || !element) return false;
52
+ if (isFullscreen.value) return true;
53
+ try {
54
+ if (element.requestFullscreen) await element.requestFullscreen({ navigationUI: options.navigationUI ?? "auto" });
55
+ else element.webkitRequestFullscreen?.();
56
+ } catch {}
57
+ update();
58
+ return isFullscreen.value;
59
+ };
60
+ const exit = async () => {
61
+ const host = resolveHost();
62
+ update();
63
+ if (!host || !isFullscreen.value) return isFullscreen.value;
64
+ try {
65
+ if (host.exitFullscreen) await host.exitFullscreen();
66
+ else host.webkitExitFullscreen?.();
67
+ } catch {}
68
+ update();
69
+ return isFullscreen.value;
70
+ };
71
+ const toggle = () => isFullscreen.value ? exit() : enter();
72
+ watch([resolveHost, resolveTarget], ([host], _previous, onCleanup) => {
73
+ update();
74
+ if (!host) return;
75
+ for (const event of changeEvents) host.addEventListener(event, update);
76
+ onCleanup(() => {
77
+ for (const event of changeEvents) host.removeEventListener(event, update);
78
+ });
79
+ }, {
80
+ immediate: true,
81
+ flush: "sync"
82
+ });
83
+ tryOnScopeDispose(() => {
84
+ if (options.autoExit ?? false) exit();
85
+ });
86
+ return {
87
+ supported,
88
+ isFullscreen: readonly(isFullscreen),
89
+ enter,
90
+ exit,
91
+ toggle
92
+ };
93
+ }
94
+ //#endregion
95
+ export { useFullscreen };