@bquery/bquery 1.6.0 → 1.8.1

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 (402) hide show
  1. package/README.md +192 -18
  2. package/dist/a11y/announce.d.ts +43 -0
  3. package/dist/a11y/announce.d.ts.map +1 -0
  4. package/dist/a11y/audit.d.ts +42 -0
  5. package/dist/a11y/audit.d.ts.map +1 -0
  6. package/dist/a11y/index.d.ts +53 -0
  7. package/dist/a11y/index.d.ts.map +1 -0
  8. package/dist/a11y/media-preferences.d.ts +77 -0
  9. package/dist/a11y/media-preferences.d.ts.map +1 -0
  10. package/dist/a11y/roving-tab-index.d.ts +38 -0
  11. package/dist/a11y/roving-tab-index.d.ts.map +1 -0
  12. package/dist/a11y/skip-link.d.ts +37 -0
  13. package/dist/a11y/skip-link.d.ts.map +1 -0
  14. package/dist/a11y/trap-focus.d.ts +49 -0
  15. package/dist/a11y/trap-focus.d.ts.map +1 -0
  16. package/dist/a11y/types.d.ts +152 -0
  17. package/dist/a11y/types.d.ts.map +1 -0
  18. package/dist/a11y-DVBCy09c.js +421 -0
  19. package/dist/a11y-DVBCy09c.js.map +1 -0
  20. package/dist/a11y.es.mjs +14 -0
  21. package/dist/component/component.d.ts.map +1 -1
  22. package/dist/component/html.d.ts.map +1 -1
  23. package/dist/component/index.d.ts +2 -1
  24. package/dist/component/index.d.ts.map +1 -1
  25. package/dist/component/library.d.ts.map +1 -1
  26. package/dist/component/scope.d.ts +138 -0
  27. package/dist/component/scope.d.ts.map +1 -0
  28. package/dist/component/types.d.ts +53 -1
  29. package/dist/component/types.d.ts.map +1 -1
  30. package/dist/component-L3-JfOFz.js +684 -0
  31. package/dist/component-L3-JfOFz.js.map +1 -0
  32. package/dist/component.es.mjs +9 -6
  33. package/dist/{config-DRmZZno3.js → config-DhT9auRm.js} +4 -4
  34. package/dist/{config-DRmZZno3.js.map → config-DhT9auRm.js.map} +1 -1
  35. package/dist/constraints-D5RHQLmP.js +100 -0
  36. package/dist/constraints-D5RHQLmP.js.map +1 -0
  37. package/dist/core/collection.d.ts +134 -0
  38. package/dist/core/collection.d.ts.map +1 -1
  39. package/dist/core/element.d.ts +120 -0
  40. package/dist/core/element.d.ts.map +1 -1
  41. package/dist/core/env.d.ts +18 -0
  42. package/dist/core/env.d.ts.map +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/shared.d.ts +14 -0
  46. package/dist/core/shared.d.ts.map +1 -1
  47. package/dist/core/utils/index.d.ts +52 -41
  48. package/dist/core/utils/index.d.ts.map +1 -1
  49. package/dist/core-DdtZHzsS.js +168 -0
  50. package/dist/core-DdtZHzsS.js.map +1 -0
  51. package/dist/{core-CCEabVHl.js → core-EMYSLzaT.js} +293 -194
  52. package/dist/core-EMYSLzaT.js.map +1 -0
  53. package/dist/core.es.mjs +48 -46
  54. package/dist/custom-directives-Dr4C5lVV.js +9 -0
  55. package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
  56. package/dist/devtools/devtools.d.ts +212 -0
  57. package/dist/devtools/devtools.d.ts.map +1 -0
  58. package/dist/devtools/index.d.ts +20 -0
  59. package/dist/devtools/index.d.ts.map +1 -0
  60. package/dist/devtools/types.d.ts +69 -0
  61. package/dist/devtools/types.d.ts.map +1 -0
  62. package/dist/devtools-BhB2iDPT.js +122 -0
  63. package/dist/devtools-BhB2iDPT.js.map +1 -0
  64. package/dist/devtools.es.mjs +19 -0
  65. package/dist/dnd/draggable.d.ts +51 -0
  66. package/dist/dnd/draggable.d.ts.map +1 -0
  67. package/dist/dnd/droppable.d.ts +38 -0
  68. package/dist/dnd/droppable.d.ts.map +1 -0
  69. package/dist/dnd/index.d.ts +47 -0
  70. package/dist/dnd/index.d.ts.map +1 -0
  71. package/dist/dnd/sortable.d.ts +43 -0
  72. package/dist/dnd/sortable.d.ts.map +1 -0
  73. package/dist/dnd/types.d.ts +250 -0
  74. package/dist/dnd/types.d.ts.map +1 -0
  75. package/dist/dnd-NwZBYh4l.js +244 -0
  76. package/dist/dnd-NwZBYh4l.js.map +1 -0
  77. package/dist/dnd.es.mjs +6 -0
  78. package/dist/env-CTdvLaH2.js +19 -0
  79. package/dist/env-CTdvLaH2.js.map +1 -0
  80. package/dist/forms/create-form.d.ts +49 -0
  81. package/dist/forms/create-form.d.ts.map +1 -0
  82. package/dist/forms/index.d.ts +40 -0
  83. package/dist/forms/index.d.ts.map +1 -0
  84. package/dist/forms/types.d.ts +185 -0
  85. package/dist/forms/types.d.ts.map +1 -0
  86. package/dist/forms/use-field.d.ts +34 -0
  87. package/dist/forms/use-field.d.ts.map +1 -0
  88. package/dist/forms/validators.d.ts +204 -0
  89. package/dist/forms/validators.d.ts.map +1 -0
  90. package/dist/forms-UcRHsYxC.js +227 -0
  91. package/dist/forms-UcRHsYxC.js.map +1 -0
  92. package/dist/forms.es.mjs +16 -0
  93. package/dist/full.d.ts +30 -11
  94. package/dist/full.d.ts.map +1 -1
  95. package/dist/full.es.mjs +209 -93
  96. package/dist/full.iife.js +47 -31
  97. package/dist/full.iife.js.map +1 -1
  98. package/dist/full.umd.js +47 -31
  99. package/dist/full.umd.js.map +1 -1
  100. package/dist/function-Cybd57JV.js +33 -0
  101. package/dist/function-Cybd57JV.js.map +1 -0
  102. package/dist/i18n/formatting.d.ts +40 -0
  103. package/dist/i18n/formatting.d.ts.map +1 -0
  104. package/dist/i18n/i18n.d.ts +48 -0
  105. package/dist/i18n/i18n.d.ts.map +1 -0
  106. package/dist/i18n/index.d.ts +57 -0
  107. package/dist/i18n/index.d.ts.map +1 -0
  108. package/dist/i18n/translate.d.ts +83 -0
  109. package/dist/i18n/translate.d.ts.map +1 -0
  110. package/dist/i18n/types.d.ts +156 -0
  111. package/dist/i18n/types.d.ts.map +1 -0
  112. package/dist/i18n-kuF6Ekj6.js +89 -0
  113. package/dist/i18n-kuF6Ekj6.js.map +1 -0
  114. package/dist/i18n.es.mjs +6 -0
  115. package/dist/index.d.ts +11 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.es.mjs +257 -143
  118. package/dist/media/battery.d.ts +35 -0
  119. package/dist/media/battery.d.ts.map +1 -0
  120. package/dist/media/breakpoints.d.ts +51 -0
  121. package/dist/media/breakpoints.d.ts.map +1 -0
  122. package/dist/media/clipboard.d.ts +30 -0
  123. package/dist/media/clipboard.d.ts.map +1 -0
  124. package/dist/media/device-sensors.d.ts +54 -0
  125. package/dist/media/device-sensors.d.ts.map +1 -0
  126. package/dist/media/geolocation.d.ts +38 -0
  127. package/dist/media/geolocation.d.ts.map +1 -0
  128. package/dist/media/index.d.ts +42 -0
  129. package/dist/media/index.d.ts.map +1 -0
  130. package/dist/media/media-query.d.ts +36 -0
  131. package/dist/media/media-query.d.ts.map +1 -0
  132. package/dist/media/network.d.ts +35 -0
  133. package/dist/media/network.d.ts.map +1 -0
  134. package/dist/media/types.d.ts +173 -0
  135. package/dist/media/types.d.ts.map +1 -0
  136. package/dist/media/viewport.d.ts +32 -0
  137. package/dist/media/viewport.d.ts.map +1 -0
  138. package/dist/media-i-fB5WxI.js +340 -0
  139. package/dist/media-i-fB5WxI.js.map +1 -0
  140. package/dist/media.es.mjs +12 -0
  141. package/dist/motion/index.d.ts +7 -3
  142. package/dist/motion/index.d.ts.map +1 -1
  143. package/dist/motion/morph.d.ts +27 -0
  144. package/dist/motion/morph.d.ts.map +1 -0
  145. package/dist/motion/parallax.d.ts +30 -0
  146. package/dist/motion/parallax.d.ts.map +1 -0
  147. package/dist/motion/reduced-motion.d.ts +36 -3
  148. package/dist/motion/reduced-motion.d.ts.map +1 -1
  149. package/dist/motion/types.d.ts +58 -0
  150. package/dist/motion/types.d.ts.map +1 -1
  151. package/dist/motion/typewriter.d.ts +31 -0
  152. package/dist/motion/typewriter.d.ts.map +1 -0
  153. package/dist/motion-BJsAuULb.js +530 -0
  154. package/dist/motion-BJsAuULb.js.map +1 -0
  155. package/dist/motion.es.mjs +27 -23
  156. package/dist/{view-C70lA3vf.js → mount-B4Y8bk8Z.js} +166 -160
  157. package/dist/mount-B4Y8bk8Z.js.map +1 -0
  158. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  159. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  160. package/dist/{platform-Dr9b6fsq.js → platform-Dw2gE3zI.js} +21 -22
  161. package/dist/{platform-Dr9b6fsq.js.map → platform-Dw2gE3zI.js.map} +1 -1
  162. package/dist/platform.es.mjs +2 -2
  163. package/dist/plugin/index.d.ts +22 -0
  164. package/dist/plugin/index.d.ts.map +1 -0
  165. package/dist/plugin/registry.d.ts +108 -0
  166. package/dist/plugin/registry.d.ts.map +1 -0
  167. package/dist/plugin/types.d.ts +110 -0
  168. package/dist/plugin/types.d.ts.map +1 -0
  169. package/dist/plugin-C2WuC8SF.js +66 -0
  170. package/dist/plugin-C2WuC8SF.js.map +1 -0
  171. package/dist/plugin.es.mjs +9 -0
  172. package/dist/reactive/async-data.d.ts +28 -3
  173. package/dist/reactive/async-data.d.ts.map +1 -1
  174. package/dist/reactive/computed.d.ts +10 -0
  175. package/dist/reactive/computed.d.ts.map +1 -1
  176. package/dist/reactive/effect.d.ts +3 -0
  177. package/dist/reactive/effect.d.ts.map +1 -1
  178. package/dist/reactive/http.d.ts +194 -0
  179. package/dist/reactive/http.d.ts.map +1 -0
  180. package/dist/reactive/index.d.ts +2 -2
  181. package/dist/reactive/index.d.ts.map +1 -1
  182. package/dist/reactive/pagination.d.ts +126 -0
  183. package/dist/reactive/pagination.d.ts.map +1 -0
  184. package/dist/reactive/polling.d.ts +55 -0
  185. package/dist/reactive/polling.d.ts.map +1 -0
  186. package/dist/reactive/readonly.d.ts +20 -1
  187. package/dist/reactive/readonly.d.ts.map +1 -1
  188. package/dist/reactive/rest.d.ts +293 -0
  189. package/dist/reactive/rest.d.ts.map +1 -0
  190. package/dist/reactive/scope.d.ts +140 -0
  191. package/dist/reactive/scope.d.ts.map +1 -0
  192. package/dist/reactive/signal.d.ts +16 -2
  193. package/dist/reactive/signal.d.ts.map +1 -1
  194. package/dist/reactive/to-value.d.ts +57 -0
  195. package/dist/reactive/to-value.d.ts.map +1 -0
  196. package/dist/reactive/websocket.d.ts +285 -0
  197. package/dist/reactive/websocket.d.ts.map +1 -0
  198. package/dist/reactive-DwkhUJfP.js +1148 -0
  199. package/dist/reactive-DwkhUJfP.js.map +1 -0
  200. package/dist/reactive.es.mjs +38 -20
  201. package/dist/registry-B08iilIh.js +26 -0
  202. package/dist/registry-B08iilIh.js.map +1 -0
  203. package/dist/router/bq-link.d.ts +112 -0
  204. package/dist/router/bq-link.d.ts.map +1 -0
  205. package/dist/router/constraints.d.ts +9 -0
  206. package/dist/router/constraints.d.ts.map +1 -0
  207. package/dist/router/index.d.ts +15 -7
  208. package/dist/router/index.d.ts.map +1 -1
  209. package/dist/router/match.d.ts +0 -1
  210. package/dist/router/match.d.ts.map +1 -1
  211. package/dist/router/path-pattern.d.ts +14 -0
  212. package/dist/router/path-pattern.d.ts.map +1 -0
  213. package/dist/router/query.d.ts.map +1 -1
  214. package/dist/router/router.d.ts +3 -1
  215. package/dist/router/router.d.ts.map +1 -1
  216. package/dist/router/state.d.ts +25 -2
  217. package/dist/router/state.d.ts.map +1 -1
  218. package/dist/router/types.d.ts +48 -4
  219. package/dist/router/types.d.ts.map +1 -1
  220. package/dist/router/use-route.d.ts +50 -0
  221. package/dist/router/use-route.d.ts.map +1 -0
  222. package/dist/router/utils.d.ts +3 -0
  223. package/dist/router/utils.d.ts.map +1 -1
  224. package/dist/router-CQikC9Ed.js +492 -0
  225. package/dist/router-CQikC9Ed.js.map +1 -0
  226. package/dist/router.es.mjs +14 -10
  227. package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
  228. package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
  229. package/dist/security/index.d.ts +2 -2
  230. package/dist/security/index.d.ts.map +1 -1
  231. package/dist/security.es.mjs +1 -1
  232. package/dist/ssr/hydrate.d.ts +65 -0
  233. package/dist/ssr/hydrate.d.ts.map +1 -0
  234. package/dist/ssr/index.d.ts +59 -0
  235. package/dist/ssr/index.d.ts.map +1 -0
  236. package/dist/ssr/render.d.ts +62 -0
  237. package/dist/ssr/render.d.ts.map +1 -0
  238. package/dist/ssr/serialize.d.ts +118 -0
  239. package/dist/ssr/serialize.d.ts.map +1 -0
  240. package/dist/ssr/types.d.ts +70 -0
  241. package/dist/ssr/types.d.ts.map +1 -0
  242. package/dist/ssr-_dAcGdzu.js +248 -0
  243. package/dist/ssr-_dAcGdzu.js.map +1 -0
  244. package/dist/ssr.es.mjs +9 -0
  245. package/dist/store/create-store.d.ts.map +1 -1
  246. package/dist/store/index.d.ts +1 -1
  247. package/dist/store/index.d.ts.map +1 -1
  248. package/dist/store/persisted.d.ts +38 -4
  249. package/dist/store/persisted.d.ts.map +1 -1
  250. package/dist/store/types.d.ts +138 -1
  251. package/dist/store/types.d.ts.map +1 -1
  252. package/dist/store/utils.d.ts +2 -2
  253. package/dist/store/utils.d.ts.map +1 -1
  254. package/dist/store-Cb3gPRve.js +338 -0
  255. package/dist/store-Cb3gPRve.js.map +1 -0
  256. package/dist/store.es.mjs +11 -10
  257. package/dist/storybook/index.d.ts.map +1 -1
  258. package/dist/storybook.es.mjs +1 -1
  259. package/dist/storybook.es.mjs.map +1 -1
  260. package/dist/testing/index.d.ts +23 -0
  261. package/dist/testing/index.d.ts.map +1 -0
  262. package/dist/testing/testing.d.ts +156 -0
  263. package/dist/testing/testing.d.ts.map +1 -0
  264. package/dist/testing/types.d.ts +134 -0
  265. package/dist/testing/types.d.ts.map +1 -0
  266. package/dist/testing-C5Sjfsna.js +224 -0
  267. package/dist/testing-C5Sjfsna.js.map +1 -0
  268. package/dist/testing.es.mjs +9 -0
  269. package/dist/type-guards-BMX2c0LP.js +44 -0
  270. package/dist/type-guards-BMX2c0LP.js.map +1 -0
  271. package/dist/untrack-D0fnO5k2.js +36 -0
  272. package/dist/untrack-D0fnO5k2.js.map +1 -0
  273. package/dist/view/custom-directives.d.ts +20 -0
  274. package/dist/view/custom-directives.d.ts.map +1 -0
  275. package/dist/view/evaluate.d.ts.map +1 -1
  276. package/dist/view/process.d.ts.map +1 -1
  277. package/dist/view.es.mjs +9 -9
  278. package/package.json +47 -11
  279. package/src/a11y/announce.ts +131 -0
  280. package/src/a11y/audit.ts +314 -0
  281. package/src/a11y/index.ts +68 -0
  282. package/src/a11y/media-preferences.ts +255 -0
  283. package/src/a11y/roving-tab-index.ts +164 -0
  284. package/src/a11y/skip-link.ts +255 -0
  285. package/src/a11y/trap-focus.ts +184 -0
  286. package/src/a11y/types.ts +183 -0
  287. package/src/component/component.ts +599 -524
  288. package/src/component/html.ts +153 -153
  289. package/src/component/index.ts +52 -50
  290. package/src/component/library.ts +540 -518
  291. package/src/component/scope.ts +212 -0
  292. package/src/component/types.ts +310 -256
  293. package/src/core/collection.ts +249 -1
  294. package/src/core/element.ts +252 -11
  295. package/src/core/env.ts +60 -0
  296. package/src/core/index.ts +1 -0
  297. package/src/core/shared.ts +64 -0
  298. package/src/core/utils/index.ts +66 -1
  299. package/src/devtools/devtools.ts +410 -0
  300. package/src/devtools/index.ts +48 -0
  301. package/src/devtools/types.ts +104 -0
  302. package/src/dnd/draggable.ts +296 -0
  303. package/src/dnd/droppable.ts +228 -0
  304. package/src/dnd/index.ts +62 -0
  305. package/src/dnd/sortable.ts +307 -0
  306. package/src/dnd/types.ts +293 -0
  307. package/src/forms/create-form.ts +320 -0
  308. package/src/forms/index.ts +70 -0
  309. package/src/forms/types.ts +203 -0
  310. package/src/forms/use-field.ts +231 -0
  311. package/src/forms/validators.ts +294 -0
  312. package/src/full.ts +554 -229
  313. package/src/i18n/formatting.ts +67 -0
  314. package/src/i18n/i18n.ts +200 -0
  315. package/src/i18n/index.ts +67 -0
  316. package/src/i18n/translate.ts +182 -0
  317. package/src/i18n/types.ts +171 -0
  318. package/src/index.ts +72 -0
  319. package/src/media/battery.ts +116 -0
  320. package/src/media/breakpoints.ts +129 -0
  321. package/src/media/clipboard.ts +80 -0
  322. package/src/media/device-sensors.ts +158 -0
  323. package/src/media/geolocation.ts +119 -0
  324. package/src/media/index.ts +76 -0
  325. package/src/media/media-query.ts +92 -0
  326. package/src/media/network.ts +115 -0
  327. package/src/media/types.ts +177 -0
  328. package/src/media/viewport.ts +84 -0
  329. package/src/motion/index.ts +11 -2
  330. package/src/motion/morph.ts +151 -0
  331. package/src/motion/parallax.ts +120 -0
  332. package/src/motion/reduced-motion.ts +52 -3
  333. package/src/motion/types.ts +63 -0
  334. package/src/motion/typewriter.ts +164 -0
  335. package/src/plugin/index.ts +37 -0
  336. package/src/plugin/registry.ts +284 -0
  337. package/src/plugin/types.ts +137 -0
  338. package/src/reactive/async-data.ts +250 -29
  339. package/src/reactive/computed.ts +53 -1
  340. package/src/reactive/effect.ts +29 -6
  341. package/src/reactive/http.ts +790 -0
  342. package/src/reactive/index.ts +60 -0
  343. package/src/reactive/pagination.ts +317 -0
  344. package/src/reactive/polling.ts +179 -0
  345. package/src/reactive/readonly.ts +52 -8
  346. package/src/reactive/rest.ts +859 -0
  347. package/src/reactive/scope.ts +276 -0
  348. package/src/reactive/signal.ts +61 -1
  349. package/src/reactive/to-value.ts +71 -0
  350. package/src/reactive/websocket.ts +849 -0
  351. package/src/router/bq-link.ts +279 -0
  352. package/src/router/constraints.ts +204 -0
  353. package/src/router/index.ts +15 -7
  354. package/src/router/match.ts +255 -49
  355. package/src/router/path-pattern.ts +52 -0
  356. package/src/router/query.ts +3 -0
  357. package/src/router/router.ts +258 -48
  358. package/src/router/state.ts +51 -3
  359. package/src/router/types.ts +50 -4
  360. package/src/router/use-route.ts +68 -0
  361. package/src/router/utils.ts +44 -3
  362. package/src/security/index.ts +12 -17
  363. package/src/security/sanitize.ts +70 -70
  364. package/src/security/trusted-html.ts +71 -71
  365. package/src/ssr/hydrate.ts +84 -0
  366. package/src/ssr/index.ts +70 -0
  367. package/src/ssr/render.ts +508 -0
  368. package/src/ssr/serialize.ts +296 -0
  369. package/src/ssr/types.ts +81 -0
  370. package/src/store/create-store.ts +146 -8
  371. package/src/store/define-store.ts +49 -49
  372. package/src/store/index.ts +5 -0
  373. package/src/store/mapping.ts +74 -74
  374. package/src/store/persisted.ts +245 -62
  375. package/src/store/types.ts +247 -92
  376. package/src/store/utils.ts +4 -10
  377. package/src/store/watch.ts +53 -53
  378. package/src/storybook/index.ts +480 -479
  379. package/src/testing/index.ts +42 -0
  380. package/src/testing/testing.ts +593 -0
  381. package/src/testing/types.ts +170 -0
  382. package/src/view/custom-directives.ts +28 -0
  383. package/src/view/evaluate.ts +2 -0
  384. package/src/view/process.ts +19 -3
  385. package/dist/component-BEQgt5hl.js +0 -600
  386. package/dist/component-BEQgt5hl.js.map +0 -1
  387. package/dist/core-BGQJVw0-.js +0 -35
  388. package/dist/core-BGQJVw0-.js.map +0 -1
  389. package/dist/core-CCEabVHl.js.map +0 -1
  390. package/dist/effect-AFRW_Plg.js +0 -84
  391. package/dist/effect-AFRW_Plg.js.map +0 -1
  392. package/dist/motion-D9TcHxOF.js +0 -415
  393. package/dist/motion-D9TcHxOF.js.map +0 -1
  394. package/dist/reactive-DSkct0dO.js +0 -254
  395. package/dist/reactive-DSkct0dO.js.map +0 -1
  396. package/dist/router-CbDhl8rS.js +0 -188
  397. package/dist/router-CbDhl8rS.js.map +0 -1
  398. package/dist/store-BwDvI45q.js +0 -263
  399. package/dist/store-BwDvI45q.js.map +0 -1
  400. package/dist/untrack-B0rVscTc.js +0 -7
  401. package/dist/untrack-B0rVscTc.js.map +0 -1
  402. package/dist/view-C70lA3vf.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Form handling module for bQuery.js.
3
+ *
4
+ * Provides a reactive, TypeScript-first form API with field-level
5
+ * and cross-field validation, dirty/touched tracking, and submission
6
+ * handling — all backed by bQuery's signal-based reactivity system.
7
+ *
8
+ * @module bquery/forms
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { createForm, required, email, min } from '@bquery/bquery/forms';
13
+ *
14
+ * const form = createForm({
15
+ * fields: {
16
+ * name: { initialValue: '', validators: [required()] },
17
+ * email: { initialValue: '', validators: [required(), email()] },
18
+ * age: { initialValue: 0, validators: [min(18, 'Must be 18+')] },
19
+ * },
20
+ * onSubmit: async (values) => {
21
+ * await fetch('/api/register', {
22
+ * method: 'POST',
23
+ * body: JSON.stringify(values),
24
+ * });
25
+ * },
26
+ * });
27
+ *
28
+ * // Reactive access
29
+ * console.log(form.isValid.value); // boolean
30
+ * console.log(form.fields.name.error.value); // '' or error message
31
+ *
32
+ * // Submit
33
+ * await form.handleSubmit();
34
+ * ```
35
+ */
36
+ export { createForm } from './create-form';
37
+ export { useFormField } from './use-field';
38
+ export { custom, customAsync, email, matchField, max, maxLength, min, minLength, pattern, required, url, } from './validators';
39
+ export type { AsyncValidator, CrossFieldValidator, FieldConfig, Form, FormConfig, FormErrors, FormField, FormFieldValidationMode, FormFields, SubmitHandler, SyncValidator, UseFormFieldOptions, UseFormFieldReturn, ValidationResult, Validator, } from './types';
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,MAAM,EACN,WAAW,EACX,KAAK,EACL,UAAU,EACV,GAAG,EACH,SAAS,EACT,GAAG,EACH,SAAS,EACT,OAAO,EACP,QAAQ,EACR,GAAG,GACJ,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,GACV,MAAM,SAAS,CAAC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Form module types and interfaces.
3
+ *
4
+ * @module bquery/forms
5
+ */
6
+ import type { Computed, Signal } from '../reactive/index';
7
+ /**
8
+ * Result of a single validation rule.
9
+ * A string indicates an error message; `true` or `undefined` means valid.
10
+ */
11
+ export type ValidationResult = string | true | undefined;
12
+ /**
13
+ * Synchronous validator function.
14
+ *
15
+ * @param value - The current field value
16
+ * @returns A validation result — `true` / `undefined` for valid, or an error string
17
+ */
18
+ export type SyncValidator<T = unknown> = (value: T) => ValidationResult;
19
+ /**
20
+ * Asynchronous validator function.
21
+ *
22
+ * @param value - The current field value
23
+ * @returns A promise resolving to a validation result
24
+ */
25
+ export type AsyncValidator<T = unknown> = (value: T) => Promise<ValidationResult>;
26
+ /**
27
+ * Either a sync or async validator.
28
+ */
29
+ export type Validator<T = unknown> = SyncValidator<T> | AsyncValidator<T>;
30
+ /**
31
+ * Configuration for a single form field.
32
+ *
33
+ * @template T - The type of the field value
34
+ */
35
+ export type FieldConfig<T = unknown> = {
36
+ /** Initial value for this field */
37
+ initialValue: T;
38
+ /** Validation rules applied in order; stops at first failure */
39
+ validators?: Validator<T>[];
40
+ };
41
+ /**
42
+ * Reactive state for a single form field.
43
+ *
44
+ * @template T - The type of the field value
45
+ */
46
+ export type FormField<T = unknown> = {
47
+ /** Reactive signal holding the current value */
48
+ value: Signal<T>;
49
+ /** Reactive signal for the first validation error (empty string when valid) */
50
+ error: Signal<string>;
51
+ /** Whether the field value differs from its initial value */
52
+ isDirty: Computed<boolean>;
53
+ /** Whether the field has been interacted with (blur / explicit touch) */
54
+ isTouched: Signal<boolean>;
55
+ /** Whether the field has never been modified */
56
+ isPristine: Computed<boolean>;
57
+ /** Mark the field as touched */
58
+ touch: () => void;
59
+ /** Reset the field to its initial value and clear errors */
60
+ reset: () => void;
61
+ };
62
+ /**
63
+ * Controls when {@link useFormField} runs validation automatically.
64
+ */
65
+ export type FormFieldValidationMode = 'manual' | 'change' | 'blur' | 'both';
66
+ /**
67
+ * Configuration for {@link useFormField}.
68
+ *
69
+ * @template T - The type of the field value
70
+ */
71
+ export type UseFormFieldOptions<T = unknown> = {
72
+ /** Validation rules applied in order; stops at first failure */
73
+ validators?: Validator<T>[];
74
+ /** When validation should run automatically. Defaults to `'manual'`. */
75
+ validateOn?: FormFieldValidationMode;
76
+ /** Delay automatic validation by the given milliseconds. Defaults to `0`. */
77
+ debounceMs?: number;
78
+ /** Initial error message for the field. Defaults to an empty string. */
79
+ initialError?: string;
80
+ };
81
+ /**
82
+ * Return value of {@link useFormField}.
83
+ *
84
+ * Extends the standard field state with validation helpers for standalone field usage.
85
+ *
86
+ * @template T - The type of the field value
87
+ */
88
+ export type UseFormFieldReturn<T = unknown> = FormField<T> & {
89
+ /** Whether the current field has no validation error */
90
+ isValid: Computed<boolean>;
91
+ /** Reactive signal: `true` while async validation is still running */
92
+ isValidating: Signal<boolean>;
93
+ /** Validate the current field value immediately */
94
+ validate: () => Promise<boolean>;
95
+ /** Cancel pending timers and automatic validation subscriptions */
96
+ destroy: () => void;
97
+ };
98
+ /**
99
+ * Map of field names to their reactive field state.
100
+ */
101
+ export type FormFields<T extends Record<string, unknown>> = {
102
+ [K in keyof T]: FormField<T[K]>;
103
+ };
104
+ /**
105
+ * Map of field names to their error strings (reactive signals).
106
+ */
107
+ export type FormErrors<T extends Record<string, unknown>> = {
108
+ [K in keyof T]: Signal<string>;
109
+ };
110
+ /**
111
+ * Cross-field validation function.
112
+ * Receives all current field values and returns a map of field name → error message,
113
+ * or an empty object / undefined if all fields are valid.
114
+ */
115
+ export type CrossFieldValidator<T extends Record<string, unknown>> = (values: T) => Partial<Record<keyof T, string>> | undefined | Promise<Partial<Record<keyof T, string>> | undefined>;
116
+ /**
117
+ * Submit handler function.
118
+ *
119
+ * @template T - Shape of the form values
120
+ */
121
+ export type SubmitHandler<T extends Record<string, unknown>> = (values: T) => void | Promise<void>;
122
+ /**
123
+ * Configuration for `createForm()`.
124
+ *
125
+ * @template T - Shape of the form values
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * const config: FormConfig<{ name: string; age: number }> = {
130
+ * fields: {
131
+ * name: { initialValue: '', validators: [required('Name is required')] },
132
+ * age: { initialValue: 0, validators: [min(1, 'Must be positive')] },
133
+ * },
134
+ * onSubmit: (values) => console.log(values),
135
+ * };
136
+ * ```
137
+ */
138
+ export type FormConfig<T extends Record<string, unknown>> = {
139
+ /** Per-field configuration with initial values and validators */
140
+ fields: {
141
+ [K in keyof T]: FieldConfig<T[K]>;
142
+ };
143
+ /** Optional cross-field validators run after per-field validation */
144
+ crossValidators?: CrossFieldValidator<T>[];
145
+ /** Callback invoked on successful form submission */
146
+ onSubmit?: SubmitHandler<T>;
147
+ };
148
+ /**
149
+ * Return value of `createForm()`.
150
+ *
151
+ * @template T - Shape of the form values
152
+ */
153
+ export type Form<T extends Record<string, unknown>> = {
154
+ /** Reactive field objects keyed by field name */
155
+ fields: FormFields<T>;
156
+ /** Shorthand error signals keyed by field name */
157
+ errors: FormErrors<T>;
158
+ /** Computed signal: `true` when all fields pass validation */
159
+ isValid: Computed<boolean>;
160
+ /** Computed signal: `true` when any field value differs from initial */
161
+ isDirty: Computed<boolean>;
162
+ /** Reactive signal: `true` while the submit handler is executing */
163
+ isSubmitting: Signal<boolean>;
164
+ /** Validate all fields and, if valid, call the `onSubmit` handler */
165
+ handleSubmit: () => Promise<void>;
166
+ /** Validate a single field by name */
167
+ validateField: (name: keyof T & string) => Promise<void>;
168
+ /** Validate all fields without submitting */
169
+ validate: () => Promise<boolean>;
170
+ /** Reset the entire form to initial values */
171
+ reset: () => void;
172
+ /** Get a snapshot of all current field values */
173
+ getValues: () => T;
174
+ /**
175
+ * Bulk-set field values from a partial object.
176
+ * Only fields present in the object are updated; missing keys are left unchanged.
177
+ */
178
+ setValues: (values: Partial<T>) => void;
179
+ /**
180
+ * Bulk-set field error messages from a partial object.
181
+ * Useful for applying server-side validation errors.
182
+ */
183
+ setErrors: (errors: Partial<Record<keyof T & string, string>>) => void;
184
+ };
185
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Standalone reactive field composable.
3
+ *
4
+ * @module bquery/forms
5
+ */
6
+ import type { MaybeSignal } from '../reactive/index';
7
+ import type { UseFormFieldOptions, UseFormFieldReturn } from './types';
8
+ /**
9
+ * Creates a standalone reactive form field with optional automatic validation.
10
+ *
11
+ * This helper is useful when you want field-level state without creating a full form,
12
+ * or when you want to bind an existing signal to the forms validation model.
13
+ *
14
+ * @template T - The type of the field value
15
+ * @param initialValue - Plain initial value, an existing writable signal to reuse, or a
16
+ * computed / readonly reactive source to snapshot
17
+ * @param options - Validation mode, validators, debounce, and initial error configuration
18
+ * @returns A reactive field handle with validation helpers
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { useFormField, required } from '@bquery/bquery/forms';
23
+ *
24
+ * const email = useFormField('', {
25
+ * validators: [required()],
26
+ * validateOn: 'blur',
27
+ * });
28
+ *
29
+ * email.value.value = 'ada@example.com';
30
+ * email.touch();
31
+ * ```
32
+ */
33
+ export declare const useFormField: <T>(initialValue: MaybeSignal<T>, options?: UseFormFieldOptions<T>) => UseFormFieldReturn<T>;
34
+ //# sourceMappingURL=use-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-field.d.ts","sourceRoot":"","sources":["../../src/forms/use-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAA+B,MAAM,SAAS,CAAC;AAmBpG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,cAAc,WAAW,CAAC,CAAC,CAAC,EAC5B,UAAS,mBAAmB,CAAC,CAAC,CAAM,KACnC,kBAAkB,CAAC,CAAC,CA0JtB,CAAC"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Built-in validation functions for form fields.
3
+ *
4
+ * Each factory returns a {@link SyncValidator} that can be passed
5
+ * to a field's `validators` array in {@link FormConfig}.
6
+ *
7
+ * @module bquery/forms
8
+ */
9
+ import type { AsyncValidator, SyncValidator } from './types';
10
+ /**
11
+ * Requires a non-empty value.
12
+ *
13
+ * Fails for `undefined`, `null`, empty strings (after trim), and empty arrays.
14
+ *
15
+ * @param message - Custom error message (default: `'This field is required'`)
16
+ * @returns A sync validator function
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { required } from '@bquery/bquery/forms';
21
+ * const validate = required('Name is required');
22
+ * validate(''); // 'Name is required'
23
+ * validate('Ada'); // true
24
+ * ```
25
+ */
26
+ export declare const required: (message?: string) => SyncValidator;
27
+ /**
28
+ * Requires a string to have at least `len` characters.
29
+ *
30
+ * Non-string values are coerced via `String()` before checking length.
31
+ *
32
+ * @param len - Minimum length
33
+ * @param message - Custom error message
34
+ * @returns A sync validator function
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { minLength } from '@bquery/bquery/forms';
39
+ * const validate = minLength(3);
40
+ * validate('ab'); // 'Must be at least 3 characters'
41
+ * validate('abc'); // true
42
+ * ```
43
+ */
44
+ export declare const minLength: (len: number, message?: string) => SyncValidator<unknown>;
45
+ /**
46
+ * Requires a string to have at most `len` characters.
47
+ *
48
+ * Non-string values are coerced via `String()` before checking length.
49
+ *
50
+ * @param len - Maximum length
51
+ * @param message - Custom error message
52
+ * @returns A sync validator function
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * import { maxLength } from '@bquery/bquery/forms';
57
+ * const validate = maxLength(10);
58
+ * validate('hello world!!'); // 'Must be at most 10 characters'
59
+ * validate('hello'); // true
60
+ * ```
61
+ */
62
+ export declare const maxLength: (len: number, message?: string) => SyncValidator<unknown>;
63
+ /**
64
+ * Requires a string to match a regular expression pattern.
65
+ *
66
+ * Non-string values are coerced via `String()` before testing.
67
+ *
68
+ * @param regex - Pattern to test against
69
+ * @param message - Custom error message (default: `'Invalid format'`)
70
+ * @returns A sync validator function
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * import { pattern } from '@bquery/bquery/forms';
75
+ * const validate = pattern(/^\d+$/, 'Numbers only');
76
+ * validate('abc'); // 'Numbers only'
77
+ * validate('123'); // true
78
+ * ```
79
+ */
80
+ export declare const pattern: (regex: RegExp, message?: string) => SyncValidator<unknown>;
81
+ /**
82
+ * RFC 5322–simplified email validation.
83
+ *
84
+ * @param message - Custom error message (default: `'Invalid email address'`)
85
+ * @returns A sync validator function
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * import { email } from '@bquery/bquery/forms';
90
+ * const validate = email();
91
+ * validate('nope'); // 'Invalid email address'
92
+ * validate('ada@lovelace'); // 'Invalid email address'
93
+ * validate('ada@love.co'); // true
94
+ * ```
95
+ */
96
+ export declare const email: (message?: string) => SyncValidator<unknown>;
97
+ /**
98
+ * Requires a string to be a valid URL.
99
+ *
100
+ * Uses the native `URL` constructor for validation.
101
+ *
102
+ * @param message - Custom error message (default: `'Invalid URL'`)
103
+ * @returns A sync validator function
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * import { url } from '@bquery/bquery/forms';
108
+ * const validate = url();
109
+ * validate('not-a-url'); // 'Invalid URL'
110
+ * validate('https://example.com'); // true
111
+ * ```
112
+ */
113
+ export declare const url: (message?: string) => SyncValidator<unknown>;
114
+ /**
115
+ * Requires a numeric value to be at least `limit`.
116
+ *
117
+ * @param limit - Minimum allowed value (inclusive)
118
+ * @param message - Custom error message
119
+ * @returns A sync validator function
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * import { min } from '@bquery/bquery/forms';
124
+ * const validate = min(1, 'Must be positive');
125
+ * validate(0); // 'Must be positive'
126
+ * validate(1); // true
127
+ * ```
128
+ */
129
+ export declare const min: (limit: number, message?: string) => SyncValidator<unknown>;
130
+ /**
131
+ * Requires a numeric value to be at most `limit`.
132
+ *
133
+ * @param limit - Maximum allowed value (inclusive)
134
+ * @param message - Custom error message
135
+ * @returns A sync validator function
136
+ *
137
+ * @example
138
+ * ```ts
139
+ * import { max } from '@bquery/bquery/forms';
140
+ * const validate = max(100, 'Too high');
141
+ * validate(101); // 'Too high'
142
+ * validate(100); // true
143
+ * ```
144
+ */
145
+ export declare const max: (limit: number, message?: string) => SyncValidator<unknown>;
146
+ /**
147
+ * Creates a custom synchronous validator from any predicate function.
148
+ *
149
+ * @param fn - Predicate that returns `true` when the value is valid
150
+ * @param message - Error message when the predicate returns `false`
151
+ * @returns A sync validator function
152
+ *
153
+ * @example
154
+ * ```ts
155
+ * import { custom } from '@bquery/bquery/forms';
156
+ * const isEven = custom((v: number) => v % 2 === 0, 'Must be even');
157
+ * isEven(3); // 'Must be even'
158
+ * isEven(4); // true
159
+ * ```
160
+ */
161
+ export declare const custom: <T = unknown>(fn: (value: T) => boolean, message: string) => SyncValidator<T>;
162
+ /**
163
+ * Creates a custom asynchronous validator.
164
+ *
165
+ * @param fn - Async predicate that resolves to `true` when valid
166
+ * @param message - Error message when the predicate resolves to `false`
167
+ * @returns An async validator function
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * import { customAsync } from '@bquery/bquery/forms';
172
+ * const isUnique = customAsync(
173
+ * async (name: string) => !(await checkExists(name)),
174
+ * 'Already taken',
175
+ * );
176
+ * ```
177
+ */
178
+ export declare const customAsync: <T = unknown>(fn: (value: T) => Promise<boolean>, message: string) => AsyncValidator<T>;
179
+ /**
180
+ * Requires a field's value to match the current value of a reference signal.
181
+ *
182
+ * Typically used for "confirm password" or "confirm email" patterns where
183
+ * one field must have the same value as another.
184
+ *
185
+ * @param ref - A reactive signal whose current value is the comparison target
186
+ * @param message - Custom error message (default: `'Fields do not match'`)
187
+ * @returns A sync validator function
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * import { signal } from '@bquery/bquery/reactive';
192
+ * import { matchField } from '@bquery/bquery/forms';
193
+ *
194
+ * const password = signal('secret');
195
+ * const confirmPassword = signal('');
196
+ * const validateConfirmPassword = matchField(password, 'Passwords must match');
197
+ *
198
+ * validateConfirmPassword(confirmPassword.value);
199
+ * ```
200
+ */
201
+ export declare const matchField: <T>(ref: {
202
+ readonly value: T;
203
+ }, message?: string) => SyncValidator<T>;
204
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/forms/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,GAAI,gBAAkC,KAAG,aAO7D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAM9E,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAM9E,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,EAAE,gBAA0B,KAAG,aAAa,CAAC,OAAO,CAWxF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK,GAAI,gBAAiC,KAAG,aAAa,CAAC,OAAO,CAS9E,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,GAAI,gBAAuB,KAAG,aAAa,CAAC,OAAO,CAWlE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAQ1E,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAQ1E,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,GAAG,OAAO,EAChC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EACzB,SAAS,MAAM,KACd,aAAa,CAAC,CAAC,CAEjB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,GAAG,OAAO,EACrC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EAClC,SAAS,MAAM,KACd,cAAc,CAAC,CAAC,CAElB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,KAAK;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,EAC1B,gBAA+B,KAC9B,aAAa,CAAC,CAAC,CAEjB,CAAC"}