rn-inputforge 0.3.1 → 0.5.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 (555) hide show
  1. package/README.md +909 -20
  2. package/lib/commonjs/adapters/index.js +25 -0
  3. package/lib/commonjs/adapters/index.js.map +1 -0
  4. package/lib/commonjs/adapters/reactHookForm.js +107 -0
  5. package/lib/commonjs/adapters/reactHookForm.js.map +1 -0
  6. package/lib/commonjs/components/FieldFlowAffordance/FieldFlowAffordance.js +104 -0
  7. package/lib/commonjs/components/FieldFlowAffordance/FieldFlowAffordance.js.map +1 -0
  8. package/lib/commonjs/components/FieldFlowAffordance/index.js +13 -0
  9. package/lib/commonjs/components/FieldFlowAffordance/index.js.map +1 -0
  10. package/lib/commonjs/components/FieldFlowCheckbox/FieldFlowCheckbox.js +131 -0
  11. package/lib/commonjs/components/FieldFlowCheckbox/FieldFlowCheckbox.js.map +1 -0
  12. package/lib/commonjs/components/FieldFlowCheckbox/index.js +13 -0
  13. package/lib/commonjs/components/FieldFlowCheckbox/index.js.map +1 -0
  14. package/lib/commonjs/components/FieldFlowCreditCard/FieldFlowCreditCard.js +146 -0
  15. package/lib/commonjs/components/FieldFlowCreditCard/FieldFlowCreditCard.js.map +1 -0
  16. package/lib/commonjs/components/FieldFlowCreditCard/index.js +13 -0
  17. package/lib/commonjs/components/FieldFlowCreditCard/index.js.map +1 -0
  18. package/lib/commonjs/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js +536 -0
  19. package/lib/commonjs/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js.map +1 -0
  20. package/lib/commonjs/components/FieldFlowDateTimePicker/index.js +13 -0
  21. package/lib/commonjs/components/FieldFlowDateTimePicker/index.js.map +1 -0
  22. package/lib/commonjs/components/FieldFlowDateTimePicker/types.js +6 -0
  23. package/lib/commonjs/components/FieldFlowDateTimePicker/types.js.map +1 -0
  24. package/lib/commonjs/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js +156 -0
  25. package/lib/commonjs/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js.map +1 -0
  26. package/lib/commonjs/components/FieldFlowDraftBanner/index.js +13 -0
  27. package/lib/commonjs/components/FieldFlowDraftBanner/index.js.map +1 -0
  28. package/lib/commonjs/components/FieldFlowDropdown/FieldFlowDropdown.js +24 -9
  29. package/lib/commonjs/components/FieldFlowDropdown/FieldFlowDropdown.js.map +1 -1
  30. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js +187 -56
  31. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  32. package/lib/commonjs/components/FieldFlowInput/styles.js +48 -11
  33. package/lib/commonjs/components/FieldFlowInput/styles.js.map +1 -1
  34. package/lib/commonjs/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js +66 -0
  35. package/lib/commonjs/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js.map +1 -0
  36. package/lib/commonjs/components/FieldFlowMaskedInput/index.js +13 -0
  37. package/lib/commonjs/components/FieldFlowMaskedInput/index.js.map +1 -0
  38. package/lib/commonjs/components/FieldFlowMaskedInput/types.js +6 -0
  39. package/lib/commonjs/components/FieldFlowMaskedInput/types.js.map +1 -0
  40. package/lib/commonjs/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js +136 -0
  41. package/lib/commonjs/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js.map +1 -0
  42. package/lib/commonjs/components/FieldFlowNumberStepper/index.js +13 -0
  43. package/lib/commonjs/components/FieldFlowNumberStepper/index.js.map +1 -0
  44. package/lib/commonjs/components/FieldFlowOTP/FieldFlowOTP.js +255 -0
  45. package/lib/commonjs/components/FieldFlowOTP/FieldFlowOTP.js.map +1 -0
  46. package/lib/commonjs/components/FieldFlowOTP/index.js +13 -0
  47. package/lib/commonjs/components/FieldFlowOTP/index.js.map +1 -0
  48. package/lib/commonjs/components/FieldFlowOTP/types.js +6 -0
  49. package/lib/commonjs/components/FieldFlowOTP/types.js.map +1 -0
  50. package/lib/commonjs/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js +122 -0
  51. package/lib/commonjs/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js.map +1 -0
  52. package/lib/commonjs/components/FieldFlowPasswordStrength/index.js +13 -0
  53. package/lib/commonjs/components/FieldFlowPasswordStrength/index.js.map +1 -0
  54. package/lib/commonjs/components/FieldFlowPhone/FieldFlowPhone.js +263 -0
  55. package/lib/commonjs/components/FieldFlowPhone/FieldFlowPhone.js.map +1 -0
  56. package/lib/commonjs/components/FieldFlowPhone/index.js +13 -0
  57. package/lib/commonjs/components/FieldFlowPhone/index.js.map +1 -0
  58. package/lib/commonjs/components/FieldFlowRadio/FieldFlowRadio.js +164 -0
  59. package/lib/commonjs/components/FieldFlowRadio/FieldFlowRadio.js.map +1 -0
  60. package/lib/commonjs/components/FieldFlowRadio/index.js +13 -0
  61. package/lib/commonjs/components/FieldFlowRadio/index.js.map +1 -0
  62. package/lib/commonjs/components/FieldFlowRating/FieldFlowRating.js +106 -0
  63. package/lib/commonjs/components/FieldFlowRating/FieldFlowRating.js.map +1 -0
  64. package/lib/commonjs/components/FieldFlowRating/index.js +13 -0
  65. package/lib/commonjs/components/FieldFlowRating/index.js.map +1 -0
  66. package/lib/commonjs/components/FieldFlowSection/FieldFlowSection.js +141 -0
  67. package/lib/commonjs/components/FieldFlowSection/FieldFlowSection.js.map +1 -0
  68. package/lib/commonjs/components/FieldFlowSection/index.js +13 -0
  69. package/lib/commonjs/components/FieldFlowSection/index.js.map +1 -0
  70. package/lib/commonjs/components/FieldFlowSegmented/FieldFlowSegmented.js +195 -0
  71. package/lib/commonjs/components/FieldFlowSegmented/FieldFlowSegmented.js.map +1 -0
  72. package/lib/commonjs/components/FieldFlowSegmented/index.js +13 -0
  73. package/lib/commonjs/components/FieldFlowSegmented/index.js.map +1 -0
  74. package/lib/commonjs/components/FieldFlowSignature/FieldFlowSignature.js +200 -0
  75. package/lib/commonjs/components/FieldFlowSignature/FieldFlowSignature.js.map +1 -0
  76. package/lib/commonjs/components/FieldFlowSignature/index.js +13 -0
  77. package/lib/commonjs/components/FieldFlowSignature/index.js.map +1 -0
  78. package/lib/commonjs/components/FieldFlowSlider/FieldFlowSlider.js +178 -0
  79. package/lib/commonjs/components/FieldFlowSlider/FieldFlowSlider.js.map +1 -0
  80. package/lib/commonjs/components/FieldFlowSlider/index.js +13 -0
  81. package/lib/commonjs/components/FieldFlowSlider/index.js.map +1 -0
  82. package/lib/commonjs/components/FieldFlowStepper/FieldFlowStepper.js +166 -0
  83. package/lib/commonjs/components/FieldFlowStepper/FieldFlowStepper.js.map +1 -0
  84. package/lib/commonjs/components/FieldFlowStepper/index.js +13 -0
  85. package/lib/commonjs/components/FieldFlowStepper/index.js.map +1 -0
  86. package/lib/commonjs/components/FieldFlowSwitch/FieldFlowSwitch.js +152 -0
  87. package/lib/commonjs/components/FieldFlowSwitch/FieldFlowSwitch.js.map +1 -0
  88. package/lib/commonjs/components/FieldFlowSwitch/index.js +13 -0
  89. package/lib/commonjs/components/FieldFlowSwitch/index.js.map +1 -0
  90. package/lib/commonjs/components/FieldFlowTags/FieldFlowTags.js +240 -0
  91. package/lib/commonjs/components/FieldFlowTags/FieldFlowTags.js.map +1 -0
  92. package/lib/commonjs/components/FieldFlowTags/index.js +13 -0
  93. package/lib/commonjs/components/FieldFlowTags/index.js.map +1 -0
  94. package/lib/commonjs/components/FieldFlowTypeahead/FieldFlowTypeahead.js +227 -0
  95. package/lib/commonjs/components/FieldFlowTypeahead/FieldFlowTypeahead.js.map +1 -0
  96. package/lib/commonjs/components/FieldFlowTypeahead/index.js +13 -0
  97. package/lib/commonjs/components/FieldFlowTypeahead/index.js.map +1 -0
  98. package/lib/commonjs/components/FieldFlowUpload/FieldFlowUpload.js +191 -0
  99. package/lib/commonjs/components/FieldFlowUpload/FieldFlowUpload.js.map +1 -0
  100. package/lib/commonjs/components/FieldFlowUpload/index.js +13 -0
  101. package/lib/commonjs/components/FieldFlowUpload/index.js.map +1 -0
  102. package/lib/commonjs/hooks/index.js +35 -0
  103. package/lib/commonjs/hooks/index.js.map +1 -1
  104. package/lib/commonjs/hooks/useFieldFlowArray.js +110 -0
  105. package/lib/commonjs/hooks/useFieldFlowArray.js.map +1 -0
  106. package/lib/commonjs/hooks/useFieldFlowDirtyGuard.js +53 -0
  107. package/lib/commonjs/hooks/useFieldFlowDirtyGuard.js.map +1 -0
  108. package/lib/commonjs/hooks/useFieldFlowDraft.js +168 -0
  109. package/lib/commonjs/hooks/useFieldFlowDraft.js.map +1 -0
  110. package/lib/commonjs/hooks/useFieldFlowForm.js +350 -41
  111. package/lib/commonjs/hooks/useFieldFlowForm.js.map +1 -1
  112. package/lib/commonjs/hooks/useFieldFlowSteps.js +77 -0
  113. package/lib/commonjs/hooks/useFieldFlowSteps.js.map +1 -0
  114. package/lib/commonjs/hooks/useFormIntelligence.js +130 -0
  115. package/lib/commonjs/hooks/useFormIntelligence.js.map +1 -0
  116. package/lib/commonjs/i18n/index.js +25 -0
  117. package/lib/commonjs/i18n/index.js.map +1 -0
  118. package/lib/commonjs/i18n/messages.js +88 -0
  119. package/lib/commonjs/i18n/messages.js.map +1 -0
  120. package/lib/commonjs/icons/Icon.js +719 -30
  121. package/lib/commonjs/icons/Icon.js.map +1 -1
  122. package/lib/commonjs/icons/index.js +7 -0
  123. package/lib/commonjs/icons/index.js.map +1 -1
  124. package/lib/commonjs/icons/renderIcon.js +24 -0
  125. package/lib/commonjs/icons/renderIcon.js.map +1 -0
  126. package/lib/commonjs/index.js +449 -0
  127. package/lib/commonjs/index.js.map +1 -1
  128. package/lib/commonjs/intelligence/formAccessibility.js +79 -0
  129. package/lib/commonjs/intelligence/formAccessibility.js.map +1 -0
  130. package/lib/commonjs/intelligence/index.js +31 -0
  131. package/lib/commonjs/intelligence/index.js.map +1 -0
  132. package/lib/commonjs/intelligence/types.js +2 -0
  133. package/lib/commonjs/intelligence/types.js.map +1 -0
  134. package/lib/commonjs/motion/index.js +20 -0
  135. package/lib/commonjs/motion/index.js.map +1 -0
  136. package/lib/commonjs/motion/useFieldMotion.js +111 -0
  137. package/lib/commonjs/motion/useFieldMotion.js.map +1 -0
  138. package/lib/commonjs/motion/useReducedMotion.js +32 -0
  139. package/lib/commonjs/motion/useReducedMotion.js.map +1 -0
  140. package/lib/commonjs/theme/index.js +13 -0
  141. package/lib/commonjs/theme/index.js.map +1 -1
  142. package/lib/commonjs/theme/presets.js +142 -0
  143. package/lib/commonjs/theme/presets.js.map +1 -0
  144. package/lib/commonjs/utils/affordance.js +151 -0
  145. package/lib/commonjs/utils/affordance.js.map +1 -0
  146. package/lib/commonjs/utils/masks.js +130 -0
  147. package/lib/commonjs/utils/masks.js.map +1 -0
  148. package/lib/commonjs/utils/passwordStrength.js +79 -0
  149. package/lib/commonjs/utils/passwordStrength.js.map +1 -0
  150. package/lib/commonjs/utils/phoneCountries.js +119 -0
  151. package/lib/commonjs/utils/phoneCountries.js.map +1 -0
  152. package/lib/commonjs/validation/index.js +25 -0
  153. package/lib/commonjs/validation/index.js.map +1 -1
  154. package/lib/commonjs/validation/validators.js +10 -7
  155. package/lib/commonjs/validation/validators.js.map +1 -1
  156. package/lib/commonjs/validation/zodAdapter.js +91 -0
  157. package/lib/commonjs/validation/zodAdapter.js.map +1 -0
  158. package/lib/module/adapters/index.js +4 -0
  159. package/lib/module/adapters/index.js.map +1 -0
  160. package/lib/module/adapters/reactHookForm.js +100 -0
  161. package/lib/module/adapters/reactHookForm.js.map +1 -0
  162. package/lib/module/components/FieldFlowAffordance/FieldFlowAffordance.js +99 -0
  163. package/lib/module/components/FieldFlowAffordance/FieldFlowAffordance.js.map +1 -0
  164. package/lib/module/components/FieldFlowAffordance/index.js +4 -0
  165. package/lib/module/components/FieldFlowAffordance/index.js.map +1 -0
  166. package/lib/module/components/FieldFlowCheckbox/FieldFlowCheckbox.js +126 -0
  167. package/lib/module/components/FieldFlowCheckbox/FieldFlowCheckbox.js.map +1 -0
  168. package/lib/module/components/FieldFlowCheckbox/index.js +4 -0
  169. package/lib/module/components/FieldFlowCheckbox/index.js.map +1 -0
  170. package/lib/module/components/FieldFlowCreditCard/FieldFlowCreditCard.js +141 -0
  171. package/lib/module/components/FieldFlowCreditCard/FieldFlowCreditCard.js.map +1 -0
  172. package/lib/module/components/FieldFlowCreditCard/index.js +4 -0
  173. package/lib/module/components/FieldFlowCreditCard/index.js.map +1 -0
  174. package/lib/module/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js +531 -0
  175. package/lib/module/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js.map +1 -0
  176. package/lib/module/components/FieldFlowDateTimePicker/index.js +4 -0
  177. package/lib/module/components/FieldFlowDateTimePicker/index.js.map +1 -0
  178. package/lib/module/components/FieldFlowDateTimePicker/types.js +4 -0
  179. package/lib/module/components/FieldFlowDateTimePicker/types.js.map +1 -0
  180. package/lib/module/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js +151 -0
  181. package/lib/module/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js.map +1 -0
  182. package/lib/module/components/FieldFlowDraftBanner/index.js +4 -0
  183. package/lib/module/components/FieldFlowDraftBanner/index.js.map +1 -0
  184. package/lib/module/components/FieldFlowDropdown/FieldFlowDropdown.js +24 -9
  185. package/lib/module/components/FieldFlowDropdown/FieldFlowDropdown.js.map +1 -1
  186. package/lib/module/components/FieldFlowInput/FieldFlowInput.js +190 -59
  187. package/lib/module/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  188. package/lib/module/components/FieldFlowInput/styles.js +48 -11
  189. package/lib/module/components/FieldFlowInput/styles.js.map +1 -1
  190. package/lib/module/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js +61 -0
  191. package/lib/module/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js.map +1 -0
  192. package/lib/module/components/FieldFlowMaskedInput/index.js +4 -0
  193. package/lib/module/components/FieldFlowMaskedInput/index.js.map +1 -0
  194. package/lib/module/components/FieldFlowMaskedInput/types.js +4 -0
  195. package/lib/module/components/FieldFlowMaskedInput/types.js.map +1 -0
  196. package/lib/module/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js +131 -0
  197. package/lib/module/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js.map +1 -0
  198. package/lib/module/components/FieldFlowNumberStepper/index.js +4 -0
  199. package/lib/module/components/FieldFlowNumberStepper/index.js.map +1 -0
  200. package/lib/module/components/FieldFlowOTP/FieldFlowOTP.js +250 -0
  201. package/lib/module/components/FieldFlowOTP/FieldFlowOTP.js.map +1 -0
  202. package/lib/module/components/FieldFlowOTP/index.js +4 -0
  203. package/lib/module/components/FieldFlowOTP/index.js.map +1 -0
  204. package/lib/module/components/FieldFlowOTP/types.js +4 -0
  205. package/lib/module/components/FieldFlowOTP/types.js.map +1 -0
  206. package/lib/module/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js +117 -0
  207. package/lib/module/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js.map +1 -0
  208. package/lib/module/components/FieldFlowPasswordStrength/index.js +4 -0
  209. package/lib/module/components/FieldFlowPasswordStrength/index.js.map +1 -0
  210. package/lib/module/components/FieldFlowPhone/FieldFlowPhone.js +258 -0
  211. package/lib/module/components/FieldFlowPhone/FieldFlowPhone.js.map +1 -0
  212. package/lib/module/components/FieldFlowPhone/index.js +4 -0
  213. package/lib/module/components/FieldFlowPhone/index.js.map +1 -0
  214. package/lib/module/components/FieldFlowRadio/FieldFlowRadio.js +159 -0
  215. package/lib/module/components/FieldFlowRadio/FieldFlowRadio.js.map +1 -0
  216. package/lib/module/components/FieldFlowRadio/index.js +4 -0
  217. package/lib/module/components/FieldFlowRadio/index.js.map +1 -0
  218. package/lib/module/components/FieldFlowRating/FieldFlowRating.js +101 -0
  219. package/lib/module/components/FieldFlowRating/FieldFlowRating.js.map +1 -0
  220. package/lib/module/components/FieldFlowRating/index.js +4 -0
  221. package/lib/module/components/FieldFlowRating/index.js.map +1 -0
  222. package/lib/module/components/FieldFlowSection/FieldFlowSection.js +136 -0
  223. package/lib/module/components/FieldFlowSection/FieldFlowSection.js.map +1 -0
  224. package/lib/module/components/FieldFlowSection/index.js +4 -0
  225. package/lib/module/components/FieldFlowSection/index.js.map +1 -0
  226. package/lib/module/components/FieldFlowSegmented/FieldFlowSegmented.js +190 -0
  227. package/lib/module/components/FieldFlowSegmented/FieldFlowSegmented.js.map +1 -0
  228. package/lib/module/components/FieldFlowSegmented/index.js +4 -0
  229. package/lib/module/components/FieldFlowSegmented/index.js.map +1 -0
  230. package/lib/module/components/FieldFlowSignature/FieldFlowSignature.js +195 -0
  231. package/lib/module/components/FieldFlowSignature/FieldFlowSignature.js.map +1 -0
  232. package/lib/module/components/FieldFlowSignature/index.js +4 -0
  233. package/lib/module/components/FieldFlowSignature/index.js.map +1 -0
  234. package/lib/module/components/FieldFlowSlider/FieldFlowSlider.js +173 -0
  235. package/lib/module/components/FieldFlowSlider/FieldFlowSlider.js.map +1 -0
  236. package/lib/module/components/FieldFlowSlider/index.js +4 -0
  237. package/lib/module/components/FieldFlowSlider/index.js.map +1 -0
  238. package/lib/module/components/FieldFlowStepper/FieldFlowStepper.js +161 -0
  239. package/lib/module/components/FieldFlowStepper/FieldFlowStepper.js.map +1 -0
  240. package/lib/module/components/FieldFlowStepper/index.js +4 -0
  241. package/lib/module/components/FieldFlowStepper/index.js.map +1 -0
  242. package/lib/module/components/FieldFlowSwitch/FieldFlowSwitch.js +147 -0
  243. package/lib/module/components/FieldFlowSwitch/FieldFlowSwitch.js.map +1 -0
  244. package/lib/module/components/FieldFlowSwitch/index.js +4 -0
  245. package/lib/module/components/FieldFlowSwitch/index.js.map +1 -0
  246. package/lib/module/components/FieldFlowTags/FieldFlowTags.js +235 -0
  247. package/lib/module/components/FieldFlowTags/FieldFlowTags.js.map +1 -0
  248. package/lib/module/components/FieldFlowTags/index.js +4 -0
  249. package/lib/module/components/FieldFlowTags/index.js.map +1 -0
  250. package/lib/module/components/FieldFlowTypeahead/FieldFlowTypeahead.js +222 -0
  251. package/lib/module/components/FieldFlowTypeahead/FieldFlowTypeahead.js.map +1 -0
  252. package/lib/module/components/FieldFlowTypeahead/index.js +4 -0
  253. package/lib/module/components/FieldFlowTypeahead/index.js.map +1 -0
  254. package/lib/module/components/FieldFlowUpload/FieldFlowUpload.js +186 -0
  255. package/lib/module/components/FieldFlowUpload/FieldFlowUpload.js.map +1 -0
  256. package/lib/module/components/FieldFlowUpload/index.js +4 -0
  257. package/lib/module/components/FieldFlowUpload/index.js.map +1 -0
  258. package/lib/module/hooks/index.js +5 -0
  259. package/lib/module/hooks/index.js.map +1 -1
  260. package/lib/module/hooks/useFieldFlowArray.js +106 -0
  261. package/lib/module/hooks/useFieldFlowArray.js.map +1 -0
  262. package/lib/module/hooks/useFieldFlowDirtyGuard.js +49 -0
  263. package/lib/module/hooks/useFieldFlowDirtyGuard.js.map +1 -0
  264. package/lib/module/hooks/useFieldFlowDraft.js +165 -0
  265. package/lib/module/hooks/useFieldFlowDraft.js.map +1 -0
  266. package/lib/module/hooks/useFieldFlowForm.js +351 -42
  267. package/lib/module/hooks/useFieldFlowForm.js.map +1 -1
  268. package/lib/module/hooks/useFieldFlowSteps.js +73 -0
  269. package/lib/module/hooks/useFieldFlowSteps.js.map +1 -0
  270. package/lib/module/hooks/useFormIntelligence.js +126 -0
  271. package/lib/module/hooks/useFormIntelligence.js.map +1 -0
  272. package/lib/module/i18n/index.js +4 -0
  273. package/lib/module/i18n/index.js.map +1 -0
  274. package/lib/module/i18n/messages.js +82 -0
  275. package/lib/module/i18n/messages.js.map +1 -0
  276. package/lib/module/icons/Icon.js +720 -31
  277. package/lib/module/icons/Icon.js.map +1 -1
  278. package/lib/module/icons/index.js +1 -0
  279. package/lib/module/icons/index.js.map +1 -1
  280. package/lib/module/icons/renderIcon.js +19 -0
  281. package/lib/module/icons/renderIcon.js.map +1 -0
  282. package/lib/module/index.js +42 -5
  283. package/lib/module/index.js.map +1 -1
  284. package/lib/module/intelligence/formAccessibility.js +72 -0
  285. package/lib/module/intelligence/formAccessibility.js.map +1 -0
  286. package/lib/module/intelligence/index.js +4 -0
  287. package/lib/module/intelligence/index.js.map +1 -0
  288. package/lib/module/intelligence/types.js +2 -0
  289. package/lib/module/intelligence/types.js.map +1 -0
  290. package/lib/module/motion/index.js +5 -0
  291. package/lib/module/motion/index.js.map +1 -0
  292. package/lib/module/motion/useFieldMotion.js +107 -0
  293. package/lib/module/motion/useFieldMotion.js.map +1 -0
  294. package/lib/module/motion/useReducedMotion.js +29 -0
  295. package/lib/module/motion/useReducedMotion.js.map +1 -0
  296. package/lib/module/theme/index.js +1 -0
  297. package/lib/module/theme/index.js.map +1 -1
  298. package/lib/module/theme/presets.js +138 -0
  299. package/lib/module/theme/presets.js.map +1 -0
  300. package/lib/module/utils/affordance.js +140 -0
  301. package/lib/module/utils/affordance.js.map +1 -0
  302. package/lib/module/utils/masks.js +118 -0
  303. package/lib/module/utils/masks.js.map +1 -0
  304. package/lib/module/utils/passwordStrength.js +74 -0
  305. package/lib/module/utils/passwordStrength.js.map +1 -0
  306. package/lib/module/utils/phoneCountries.js +113 -0
  307. package/lib/module/utils/phoneCountries.js.map +1 -0
  308. package/lib/module/validation/index.js +1 -0
  309. package/lib/module/validation/index.js.map +1 -1
  310. package/lib/module/validation/validators.js +10 -7
  311. package/lib/module/validation/validators.js.map +1 -1
  312. package/lib/module/validation/zodAdapter.js +84 -0
  313. package/lib/module/validation/zodAdapter.js.map +1 -0
  314. package/lib/typescript/adapters/index.d.ts +3 -0
  315. package/lib/typescript/adapters/index.d.ts.map +1 -0
  316. package/lib/typescript/adapters/reactHookForm.d.ts +56 -0
  317. package/lib/typescript/adapters/reactHookForm.d.ts.map +1 -0
  318. package/lib/typescript/components/FieldFlowAffordance/FieldFlowAffordance.d.ts +29 -0
  319. package/lib/typescript/components/FieldFlowAffordance/FieldFlowAffordance.d.ts.map +1 -0
  320. package/lib/typescript/components/FieldFlowAffordance/index.d.ts +3 -0
  321. package/lib/typescript/components/FieldFlowAffordance/index.d.ts.map +1 -0
  322. package/lib/typescript/components/FieldFlowCheckbox/FieldFlowCheckbox.d.ts +36 -0
  323. package/lib/typescript/components/FieldFlowCheckbox/FieldFlowCheckbox.d.ts.map +1 -0
  324. package/lib/typescript/components/FieldFlowCheckbox/index.d.ts +3 -0
  325. package/lib/typescript/components/FieldFlowCheckbox/index.d.ts.map +1 -0
  326. package/lib/typescript/components/FieldFlowCreditCard/FieldFlowCreditCard.d.ts +27 -0
  327. package/lib/typescript/components/FieldFlowCreditCard/FieldFlowCreditCard.d.ts.map +1 -0
  328. package/lib/typescript/components/FieldFlowCreditCard/index.d.ts +3 -0
  329. package/lib/typescript/components/FieldFlowCreditCard/index.d.ts.map +1 -0
  330. package/lib/typescript/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.d.ts +4 -0
  331. package/lib/typescript/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.d.ts.map +1 -0
  332. package/lib/typescript/components/FieldFlowDateTimePicker/index.d.ts +3 -0
  333. package/lib/typescript/components/FieldFlowDateTimePicker/index.d.ts.map +1 -0
  334. package/lib/typescript/components/FieldFlowDateTimePicker/types.d.ts +55 -0
  335. package/lib/typescript/components/FieldFlowDateTimePicker/types.d.ts.map +1 -0
  336. package/lib/typescript/components/FieldFlowDraftBanner/FieldFlowDraftBanner.d.ts +24 -0
  337. package/lib/typescript/components/FieldFlowDraftBanner/FieldFlowDraftBanner.d.ts.map +1 -0
  338. package/lib/typescript/components/FieldFlowDraftBanner/index.d.ts +3 -0
  339. package/lib/typescript/components/FieldFlowDraftBanner/index.d.ts.map +1 -0
  340. package/lib/typescript/components/FieldFlowDropdown/FieldFlowDropdown.d.ts.map +1 -1
  341. package/lib/typescript/components/FieldFlowDropdown/types.d.ts +7 -1
  342. package/lib/typescript/components/FieldFlowDropdown/types.d.ts.map +1 -1
  343. package/lib/typescript/components/FieldFlowInput/FieldFlowInput.d.ts.map +1 -1
  344. package/lib/typescript/components/FieldFlowInput/styles.d.ts +35 -2
  345. package/lib/typescript/components/FieldFlowInput/styles.d.ts.map +1 -1
  346. package/lib/typescript/components/FieldFlowInput/types.d.ts +55 -4
  347. package/lib/typescript/components/FieldFlowInput/types.d.ts.map +1 -1
  348. package/lib/typescript/components/FieldFlowMaskedInput/FieldFlowMaskedInput.d.ts +5 -0
  349. package/lib/typescript/components/FieldFlowMaskedInput/FieldFlowMaskedInput.d.ts.map +1 -0
  350. package/lib/typescript/components/FieldFlowMaskedInput/index.d.ts +3 -0
  351. package/lib/typescript/components/FieldFlowMaskedInput/index.d.ts.map +1 -0
  352. package/lib/typescript/components/FieldFlowMaskedInput/types.d.ts +20 -0
  353. package/lib/typescript/components/FieldFlowMaskedInput/types.d.ts.map +1 -0
  354. package/lib/typescript/components/FieldFlowNumberStepper/FieldFlowNumberStepper.d.ts +34 -0
  355. package/lib/typescript/components/FieldFlowNumberStepper/FieldFlowNumberStepper.d.ts.map +1 -0
  356. package/lib/typescript/components/FieldFlowNumberStepper/index.d.ts +3 -0
  357. package/lib/typescript/components/FieldFlowNumberStepper/index.d.ts.map +1 -0
  358. package/lib/typescript/components/FieldFlowOTP/FieldFlowOTP.d.ts +4 -0
  359. package/lib/typescript/components/FieldFlowOTP/FieldFlowOTP.d.ts.map +1 -0
  360. package/lib/typescript/components/FieldFlowOTP/index.d.ts +3 -0
  361. package/lib/typescript/components/FieldFlowOTP/index.d.ts.map +1 -0
  362. package/lib/typescript/components/FieldFlowOTP/types.d.ts +52 -0
  363. package/lib/typescript/components/FieldFlowOTP/types.d.ts.map +1 -0
  364. package/lib/typescript/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.d.ts +26 -0
  365. package/lib/typescript/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.d.ts.map +1 -0
  366. package/lib/typescript/components/FieldFlowPasswordStrength/index.d.ts +3 -0
  367. package/lib/typescript/components/FieldFlowPasswordStrength/index.d.ts.map +1 -0
  368. package/lib/typescript/components/FieldFlowPhone/FieldFlowPhone.d.ts +40 -0
  369. package/lib/typescript/components/FieldFlowPhone/FieldFlowPhone.d.ts.map +1 -0
  370. package/lib/typescript/components/FieldFlowPhone/index.d.ts +3 -0
  371. package/lib/typescript/components/FieldFlowPhone/index.d.ts.map +1 -0
  372. package/lib/typescript/components/FieldFlowRadio/FieldFlowRadio.d.ts +39 -0
  373. package/lib/typescript/components/FieldFlowRadio/FieldFlowRadio.d.ts.map +1 -0
  374. package/lib/typescript/components/FieldFlowRadio/index.d.ts +3 -0
  375. package/lib/typescript/components/FieldFlowRadio/index.d.ts.map +1 -0
  376. package/lib/typescript/components/FieldFlowRating/FieldFlowRating.d.ts +30 -0
  377. package/lib/typescript/components/FieldFlowRating/FieldFlowRating.d.ts.map +1 -0
  378. package/lib/typescript/components/FieldFlowRating/index.d.ts +3 -0
  379. package/lib/typescript/components/FieldFlowRating/index.d.ts.map +1 -0
  380. package/lib/typescript/components/FieldFlowSection/FieldFlowSection.d.ts +35 -0
  381. package/lib/typescript/components/FieldFlowSection/FieldFlowSection.d.ts.map +1 -0
  382. package/lib/typescript/components/FieldFlowSection/index.d.ts +3 -0
  383. package/lib/typescript/components/FieldFlowSection/index.d.ts.map +1 -0
  384. package/lib/typescript/components/FieldFlowSegmented/FieldFlowSegmented.d.ts +28 -0
  385. package/lib/typescript/components/FieldFlowSegmented/FieldFlowSegmented.d.ts.map +1 -0
  386. package/lib/typescript/components/FieldFlowSegmented/index.d.ts +3 -0
  387. package/lib/typescript/components/FieldFlowSegmented/index.d.ts.map +1 -0
  388. package/lib/typescript/components/FieldFlowSignature/FieldFlowSignature.d.ts +41 -0
  389. package/lib/typescript/components/FieldFlowSignature/FieldFlowSignature.d.ts.map +1 -0
  390. package/lib/typescript/components/FieldFlowSignature/index.d.ts +3 -0
  391. package/lib/typescript/components/FieldFlowSignature/index.d.ts.map +1 -0
  392. package/lib/typescript/components/FieldFlowSlider/FieldFlowSlider.d.ts +30 -0
  393. package/lib/typescript/components/FieldFlowSlider/FieldFlowSlider.d.ts.map +1 -0
  394. package/lib/typescript/components/FieldFlowSlider/index.d.ts +3 -0
  395. package/lib/typescript/components/FieldFlowSlider/index.d.ts.map +1 -0
  396. package/lib/typescript/components/FieldFlowStepper/FieldFlowStepper.d.ts +31 -0
  397. package/lib/typescript/components/FieldFlowStepper/FieldFlowStepper.d.ts.map +1 -0
  398. package/lib/typescript/components/FieldFlowStepper/index.d.ts +3 -0
  399. package/lib/typescript/components/FieldFlowStepper/index.d.ts.map +1 -0
  400. package/lib/typescript/components/FieldFlowSwitch/FieldFlowSwitch.d.ts +31 -0
  401. package/lib/typescript/components/FieldFlowSwitch/FieldFlowSwitch.d.ts.map +1 -0
  402. package/lib/typescript/components/FieldFlowSwitch/index.d.ts +3 -0
  403. package/lib/typescript/components/FieldFlowSwitch/index.d.ts.map +1 -0
  404. package/lib/typescript/components/FieldFlowTags/FieldFlowTags.d.ts +41 -0
  405. package/lib/typescript/components/FieldFlowTags/FieldFlowTags.d.ts.map +1 -0
  406. package/lib/typescript/components/FieldFlowTags/index.d.ts +3 -0
  407. package/lib/typescript/components/FieldFlowTags/index.d.ts.map +1 -0
  408. package/lib/typescript/components/FieldFlowTypeahead/FieldFlowTypeahead.d.ts +43 -0
  409. package/lib/typescript/components/FieldFlowTypeahead/FieldFlowTypeahead.d.ts.map +1 -0
  410. package/lib/typescript/components/FieldFlowTypeahead/index.d.ts +3 -0
  411. package/lib/typescript/components/FieldFlowTypeahead/index.d.ts.map +1 -0
  412. package/lib/typescript/components/FieldFlowUpload/FieldFlowUpload.d.ts +52 -0
  413. package/lib/typescript/components/FieldFlowUpload/FieldFlowUpload.d.ts.map +1 -0
  414. package/lib/typescript/components/FieldFlowUpload/index.d.ts +3 -0
  415. package/lib/typescript/components/FieldFlowUpload/index.d.ts.map +1 -0
  416. package/lib/typescript/hooks/index.d.ts +11 -1
  417. package/lib/typescript/hooks/index.d.ts.map +1 -1
  418. package/lib/typescript/hooks/useFieldFlowArray.d.ts +54 -0
  419. package/lib/typescript/hooks/useFieldFlowArray.d.ts.map +1 -0
  420. package/lib/typescript/hooks/useFieldFlowDirtyGuard.d.ts +26 -0
  421. package/lib/typescript/hooks/useFieldFlowDirtyGuard.d.ts.map +1 -0
  422. package/lib/typescript/hooks/useFieldFlowDraft.d.ts +64 -0
  423. package/lib/typescript/hooks/useFieldFlowDraft.d.ts.map +1 -0
  424. package/lib/typescript/hooks/useFieldFlowForm.d.ts +124 -7
  425. package/lib/typescript/hooks/useFieldFlowForm.d.ts.map +1 -1
  426. package/lib/typescript/hooks/useFieldFlowSteps.d.ts +42 -0
  427. package/lib/typescript/hooks/useFieldFlowSteps.d.ts.map +1 -0
  428. package/lib/typescript/hooks/useFormIntelligence.d.ts +23 -0
  429. package/lib/typescript/hooks/useFormIntelligence.d.ts.map +1 -0
  430. package/lib/typescript/i18n/index.d.ts +3 -0
  431. package/lib/typescript/i18n/index.d.ts.map +1 -0
  432. package/lib/typescript/i18n/messages.d.ts +16 -0
  433. package/lib/typescript/i18n/messages.d.ts.map +1 -0
  434. package/lib/typescript/icons/Icon.d.ts +2 -2
  435. package/lib/typescript/icons/Icon.d.ts.map +1 -1
  436. package/lib/typescript/icons/index.d.ts +2 -0
  437. package/lib/typescript/icons/index.d.ts.map +1 -1
  438. package/lib/typescript/icons/renderIcon.d.ts +6 -0
  439. package/lib/typescript/icons/renderIcon.d.ts.map +1 -0
  440. package/lib/typescript/index.d.ts +67 -9
  441. package/lib/typescript/index.d.ts.map +1 -1
  442. package/lib/typescript/intelligence/formAccessibility.d.ts +21 -0
  443. package/lib/typescript/intelligence/formAccessibility.d.ts.map +1 -0
  444. package/lib/typescript/intelligence/index.d.ts +4 -0
  445. package/lib/typescript/intelligence/index.d.ts.map +1 -0
  446. package/lib/typescript/intelligence/types.d.ts +36 -0
  447. package/lib/typescript/intelligence/types.d.ts.map +1 -0
  448. package/lib/typescript/motion/index.d.ts +4 -0
  449. package/lib/typescript/motion/index.d.ts.map +1 -0
  450. package/lib/typescript/motion/useFieldMotion.d.ts +31 -0
  451. package/lib/typescript/motion/useFieldMotion.d.ts.map +1 -0
  452. package/lib/typescript/motion/useReducedMotion.d.ts +5 -0
  453. package/lib/typescript/motion/useReducedMotion.d.ts.map +1 -0
  454. package/lib/typescript/theme/index.d.ts +2 -0
  455. package/lib/typescript/theme/index.d.ts.map +1 -1
  456. package/lib/typescript/theme/presets.d.ts +134 -0
  457. package/lib/typescript/theme/presets.d.ts.map +1 -0
  458. package/lib/typescript/types/index.d.ts +4 -0
  459. package/lib/typescript/types/index.d.ts.map +1 -1
  460. package/lib/typescript/utils/affordance.d.ts +36 -0
  461. package/lib/typescript/utils/affordance.d.ts.map +1 -0
  462. package/lib/typescript/utils/masks.d.ts +37 -0
  463. package/lib/typescript/utils/masks.d.ts.map +1 -0
  464. package/lib/typescript/utils/passwordStrength.d.ts +26 -0
  465. package/lib/typescript/utils/passwordStrength.d.ts.map +1 -0
  466. package/lib/typescript/utils/phoneCountries.d.ts +12 -0
  467. package/lib/typescript/utils/phoneCountries.d.ts.map +1 -0
  468. package/lib/typescript/validation/index.d.ts +2 -0
  469. package/lib/typescript/validation/index.d.ts.map +1 -1
  470. package/lib/typescript/validation/validators.d.ts +3 -1
  471. package/lib/typescript/validation/validators.d.ts.map +1 -1
  472. package/lib/typescript/validation/zodAdapter.d.ts +53 -0
  473. package/lib/typescript/validation/zodAdapter.d.ts.map +1 -0
  474. package/package.json +34 -3
  475. package/src/adapters/index.ts +9 -0
  476. package/src/adapters/reactHookForm.tsx +152 -0
  477. package/src/components/FieldFlowAffordance/FieldFlowAffordance.tsx +143 -0
  478. package/src/components/FieldFlowAffordance/index.ts +2 -0
  479. package/src/components/FieldFlowCheckbox/FieldFlowCheckbox.tsx +174 -0
  480. package/src/components/FieldFlowCheckbox/index.ts +2 -0
  481. package/src/components/FieldFlowCreditCard/FieldFlowCreditCard.tsx +152 -0
  482. package/src/components/FieldFlowCreditCard/index.ts +2 -0
  483. package/src/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.tsx +585 -0
  484. package/src/components/FieldFlowDateTimePicker/index.ts +2 -0
  485. package/src/components/FieldFlowDateTimePicker/types.ts +57 -0
  486. package/src/components/FieldFlowDraftBanner/FieldFlowDraftBanner.tsx +169 -0
  487. package/src/components/FieldFlowDraftBanner/index.ts +2 -0
  488. package/src/components/FieldFlowDropdown/FieldFlowDropdown.tsx +17 -7
  489. package/src/components/FieldFlowDropdown/types.ts +8 -1
  490. package/src/components/FieldFlowInput/FieldFlowInput.tsx +230 -66
  491. package/src/components/FieldFlowInput/styles.ts +57 -6
  492. package/src/components/FieldFlowInput/types.ts +56 -4
  493. package/src/components/FieldFlowMaskedInput/FieldFlowMaskedInput.tsx +76 -0
  494. package/src/components/FieldFlowMaskedInput/index.ts +2 -0
  495. package/src/components/FieldFlowMaskedInput/types.ts +22 -0
  496. package/src/components/FieldFlowNumberStepper/FieldFlowNumberStepper.tsx +156 -0
  497. package/src/components/FieldFlowNumberStepper/index.ts +2 -0
  498. package/src/components/FieldFlowOTP/FieldFlowOTP.tsx +305 -0
  499. package/src/components/FieldFlowOTP/index.ts +2 -0
  500. package/src/components/FieldFlowOTP/types.ts +57 -0
  501. package/src/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.tsx +148 -0
  502. package/src/components/FieldFlowPasswordStrength/index.ts +2 -0
  503. package/src/components/FieldFlowPhone/FieldFlowPhone.tsx +298 -0
  504. package/src/components/FieldFlowPhone/index.ts +2 -0
  505. package/src/components/FieldFlowRadio/FieldFlowRadio.tsx +215 -0
  506. package/src/components/FieldFlowRadio/index.ts +2 -0
  507. package/src/components/FieldFlowRating/FieldFlowRating.tsx +121 -0
  508. package/src/components/FieldFlowRating/index.ts +2 -0
  509. package/src/components/FieldFlowSection/FieldFlowSection.tsx +176 -0
  510. package/src/components/FieldFlowSection/index.ts +2 -0
  511. package/src/components/FieldFlowSegmented/FieldFlowSegmented.tsx +248 -0
  512. package/src/components/FieldFlowSegmented/index.ts +2 -0
  513. package/src/components/FieldFlowSignature/FieldFlowSignature.tsx +241 -0
  514. package/src/components/FieldFlowSignature/index.ts +7 -0
  515. package/src/components/FieldFlowSlider/FieldFlowSlider.tsx +190 -0
  516. package/src/components/FieldFlowSlider/index.ts +2 -0
  517. package/src/components/FieldFlowStepper/FieldFlowStepper.tsx +190 -0
  518. package/src/components/FieldFlowStepper/index.ts +2 -0
  519. package/src/components/FieldFlowSwitch/FieldFlowSwitch.tsx +172 -0
  520. package/src/components/FieldFlowSwitch/index.ts +2 -0
  521. package/src/components/FieldFlowTags/FieldFlowTags.tsx +319 -0
  522. package/src/components/FieldFlowTags/index.ts +2 -0
  523. package/src/components/FieldFlowTypeahead/FieldFlowTypeahead.tsx +261 -0
  524. package/src/components/FieldFlowTypeahead/index.ts +2 -0
  525. package/src/components/FieldFlowUpload/FieldFlowUpload.tsx +226 -0
  526. package/src/components/FieldFlowUpload/index.ts +6 -0
  527. package/src/hooks/index.ts +34 -0
  528. package/src/hooks/useFieldFlowArray.ts +153 -0
  529. package/src/hooks/useFieldFlowDirtyGuard.ts +70 -0
  530. package/src/hooks/useFieldFlowDraft.ts +221 -0
  531. package/src/hooks/useFieldFlowForm.ts +545 -40
  532. package/src/hooks/useFieldFlowSteps.ts +130 -0
  533. package/src/hooks/useFormIntelligence.ts +207 -0
  534. package/src/i18n/index.ts +6 -0
  535. package/src/i18n/messages.ts +101 -0
  536. package/src/icons/Icon.tsx +451 -5
  537. package/src/icons/index.ts +2 -0
  538. package/src/icons/renderIcon.tsx +17 -0
  539. package/src/index.ts +208 -7
  540. package/src/intelligence/formAccessibility.ts +87 -0
  541. package/src/intelligence/index.ts +12 -0
  542. package/src/intelligence/types.ts +34 -0
  543. package/src/motion/index.ts +3 -0
  544. package/src/motion/useFieldMotion.ts +120 -0
  545. package/src/motion/useReducedMotion.ts +31 -0
  546. package/src/theme/index.ts +2 -0
  547. package/src/theme/presets.ts +120 -0
  548. package/src/types/index.ts +5 -0
  549. package/src/utils/affordance.ts +138 -0
  550. package/src/utils/masks.ts +137 -0
  551. package/src/utils/passwordStrength.ts +109 -0
  552. package/src/utils/phoneCountries.ts +44 -0
  553. package/src/validation/index.ts +7 -0
  554. package/src/validation/validators.ts +17 -7
  555. package/src/validation/zodAdapter.ts +103 -0
@@ -1,15 +1,109 @@
1
- import { useCallback, useMemo, useState } from 'react';
2
- import type { FieldFlowRules } from '../types';
1
+ import { useCallback, useMemo, useRef, useState } from 'react';
2
+ import type { TextInput } from 'react-native';
3
+ import type { FieldFlowRules, ValidationResult } from '../types';
3
4
  import { runRules } from '../validation/validators';
5
+ import {
6
+ getValidationMessages,
7
+ type FieldFlowLocale,
8
+ type FieldFlowValidationMessages,
9
+ } from '../i18n/messages';
10
+ import {
11
+ useFormIntelligence,
12
+ type UseFormIntelligenceResult,
13
+ } from './useFormIntelligence';
14
+ import type { FormIntelligenceOptions } from '../intelligence/types';
4
15
 
5
16
  export type FieldFlowFormRules<T extends Record<string, string>> = {
6
17
  [K in keyof T]?: FieldFlowRules;
7
18
  };
8
19
 
20
+ export type AsyncFieldValidator<T extends Record<string, string>> = (
21
+ value: string,
22
+ values: T,
23
+ ) => Promise<ValidationResult> | ValidationResult;
24
+
25
+ export type AsyncFieldValidators<T extends Record<string, string>> = {
26
+ [K in keyof T]?: AsyncFieldValidator<T>;
27
+ };
28
+
29
+ export interface CrossFieldRule<T extends Record<string, string>> {
30
+ /** Field that receives the error message when validation fails. */
31
+ target: keyof T;
32
+ /** When set, this rule re-runs when any of these fields change (in addition to `target`). */
33
+ deps?: (keyof T)[];
34
+ validate: (values: T) => ValidationResult;
35
+ }
36
+
37
+ export type FieldConditionFn<T extends Record<string, string>> = (values: T) => boolean;
38
+
39
+ export interface FieldConditionConfig<T extends Record<string, string>> {
40
+ /** Hide the field when false. Hidden fields are skipped during validation. */
41
+ showWhen?: FieldConditionFn<T>;
42
+ /** Dynamically require the field. */
43
+ requiredWhen?: FieldConditionFn<T>;
44
+ /** Dynamically disable the field (caller should pass `disabled` to the input). */
45
+ disabledWhen?: FieldConditionFn<T>;
46
+ }
47
+
48
+ export type FieldConditions<T extends Record<string, string>> = {
49
+ [K in keyof T]?: FieldConditionConfig<T>;
50
+ };
51
+
52
+ export interface FieldVisibilityState {
53
+ visible: boolean;
54
+ required: boolean;
55
+ disabled: boolean;
56
+ }
57
+
9
58
  export interface UseFieldFlowFormOptions<T extends Record<string, string>> {
10
59
  initialValues: T;
11
60
  rules?: FieldFlowFormRules<T>;
12
- /** Called only when every field passes validation. */
61
+ /**
62
+ * Cross-field rules (e.g. password confirm). Run after per-field sync rules.
63
+ *
64
+ * @example
65
+ * crossFieldRules: [{
66
+ * target: 'confirm',
67
+ * deps: ['password'],
68
+ * validate: v => v.password === v.confirm
69
+ * ? { valid: true }
70
+ * : { valid: false, message: 'Passwords must match' },
71
+ * }]
72
+ */
73
+ crossFieldRules?: CrossFieldRule<T>[];
74
+ /**
75
+ * Conditional visibility / required / disabled rules evaluated against live values.
76
+ */
77
+ conditions?: FieldConditions<T>;
78
+ /**
79
+ * Whole-form validator (e.g. from `zodFormValidate(schema)`).
80
+ * Merged after sync + cross-field rules; field keys map to error messages.
81
+ */
82
+ formValidate?: (
83
+ values: T,
84
+ ) => Partial<Record<keyof T, string | undefined>> | Promise<Partial<Record<keyof T, string | undefined>>>;
85
+ /**
86
+ * Per-field async validators (e.g. "email already taken").
87
+ * Debounced on change after the field has been touched; always awaited on submit.
88
+ */
89
+ asyncValidators?: AsyncFieldValidators<T>;
90
+ /** Debounce for async field validators on change. Default: 400ms. */
91
+ asyncDebounceMs?: number;
92
+ /**
93
+ * Enable form intelligence (friction analytics + a11y autofocus/announce on failed submit).
94
+ * Pass `true` for defaults, or an options object.
95
+ */
96
+ intelligence?: boolean | FormIntelligenceOptions;
97
+ /** Preferred field order for focus-first-error / announcements. */
98
+ fieldOrder?: (keyof T)[];
99
+ /**
100
+ * Locale for default validation messages (`en` | `es` | `fr` | `de` | `pt` | `ar`).
101
+ * Ignored for rule keys that already pass a custom string message.
102
+ */
103
+ locale?: FieldFlowLocale;
104
+ /** Full message catalog override (wins over `locale`). */
105
+ messages?: FieldFlowValidationMessages;
106
+ /** Called only when every field passes sync + cross-field + form + async validation. */
13
107
  onSubmit?: (values: T) => void | Promise<void>;
14
108
  }
15
109
 
@@ -17,117 +111,528 @@ export interface UseFieldFlowFormResult<T extends Record<string, string>> {
17
111
  values: T;
18
112
  errors: Partial<Record<keyof T, string>>;
19
113
  touched: Partial<Record<keyof T, boolean>>;
114
+ /** Fields currently waiting on an async validator. */
115
+ validating: Partial<Record<keyof T, boolean>>;
20
116
  isSubmitting: boolean;
21
117
  isValid: boolean;
118
+ /** True while any async field validator is in flight. */
119
+ isValidating: boolean;
120
+ /** True when current values differ from `initialValues`. */
121
+ isDirty: boolean;
122
+ /** Per-field dirty flags. */
123
+ dirtyFields: Partial<Record<keyof T, boolean>>;
22
124
  setValue: (field: keyof T, value: string) => void;
125
+ setValues: (values: T | ((prev: T) => T)) => void;
126
+ /** Merge server / API errors (e.g. 422 field map). Touches those fields. */
127
+ setErrors: (errors: Partial<Record<keyof T, string | undefined>>) => void;
128
+ /** Set a single field error from the server. */
129
+ setFieldError: (field: keyof T, message: string | undefined) => void;
130
+ /** Clear one field or all errors. */
131
+ clearErrors: (field?: keyof T) => void;
23
132
  handleChange: (field: keyof T) => (value: string) => void;
24
133
  handleBlur: (field: keyof T) => () => void;
25
- validateField: (field: keyof T) => boolean;
26
- validateAll: () => boolean;
134
+ handleFocus: (field: keyof T) => () => void;
135
+ validateField: (field: keyof T) => Promise<boolean>;
136
+ /** Validate a subset of fields (wizard steps). */
137
+ validateFields: (fields: (keyof T)[]) => Promise<boolean>;
138
+ validateAll: () => Promise<boolean>;
27
139
  submit: () => Promise<void>;
28
140
  reset: () => void;
141
+ /** Evaluate conditional rules for a field against current values. */
142
+ getFieldState: (field: keyof T) => FieldVisibilityState;
143
+ isVisible: (field: keyof T) => boolean;
144
+ isRequired: (field: keyof T) => boolean;
145
+ isDisabled: (field: keyof T) => boolean;
146
+ /**
147
+ * Convenience props to spread onto a FieldFlow input for a given field.
148
+ * Respects visibility (returns `null` when hidden so you can short-circuit render).
149
+ */
150
+ getInputProps: (
151
+ field: keyof T,
152
+ ) => null | {
153
+ value: string;
154
+ onChangeText: (value: string) => void;
155
+ onBlur: () => void;
156
+ onFocus: () => void;
157
+ errorText: string | undefined;
158
+ required: boolean;
159
+ disabled: boolean;
160
+ };
161
+ /** Present when `intelligence` is enabled. */
162
+ intelligence: UseFormIntelligenceResult<Extract<keyof T, string>> | null;
163
+ /** Register a TextInput ref for a11y autofocus (intelligence). */
164
+ registerFieldRef: (
165
+ field: keyof T,
166
+ ref: { current: TextInput | null } | TextInput | null,
167
+ ) => void;
29
168
  }
30
169
 
31
170
  /**
32
171
  * Drop-in form state manager for a set of FieldFlow inputs. Handles values,
33
- * per-field + whole-form validation (via the same `FieldFlowRules` used by
34
- * the input components), touched-state, and submission.
172
+ * per-field + cross-field + conditional + async validation, touched-state,
173
+ * optional form intelligence, and submission.
35
174
  */
36
175
  export function useFieldFlowForm<T extends Record<string, string>>({
37
176
  initialValues,
38
177
  rules,
178
+ crossFieldRules,
179
+ conditions,
180
+ formValidate,
181
+ asyncValidators,
182
+ asyncDebounceMs = 400,
183
+ intelligence: intelligenceOpt,
184
+ fieldOrder,
185
+ locale = 'en',
186
+ messages: messagesOverride,
39
187
  onSubmit,
40
188
  }: UseFieldFlowFormOptions<T>): UseFieldFlowFormResult<T> {
41
- const [values, setValues] = useState<T>(initialValues);
42
- const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});
189
+ const [values, setValuesState] = useState<T>(initialValues);
190
+ const [errors, setErrorsState] = useState<Partial<Record<keyof T, string>>>({});
43
191
  const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});
192
+ const [validating, setValidating] = useState<Partial<Record<keyof T, boolean>>>({});
44
193
  const [isSubmitting, setIsSubmitting] = useState(false);
45
194
 
195
+ const valuesRef = useRef(values);
196
+ valuesRef.current = values;
197
+ const debounceTimers = useRef<Partial<Record<keyof T, ReturnType<typeof setTimeout>>>>({});
198
+ const asyncGen = useRef(0);
199
+ const messages = messagesOverride ?? getValidationMessages(locale);
200
+
201
+ const intelligenceEnabled = Boolean(intelligenceOpt);
202
+ const intelligenceOptions: FormIntelligenceOptions =
203
+ typeof intelligenceOpt === 'object' && intelligenceOpt ? intelligenceOpt : {};
204
+ const intelligence = useFormIntelligence<Extract<keyof T, string>>(
205
+ intelligenceEnabled ? intelligenceOptions : { focusFirstError: false, announceErrors: false },
206
+ );
207
+
208
+ const evalFieldState = useCallback(
209
+ (field: keyof T, allValues: T): FieldVisibilityState => {
210
+ const cfg = conditions?.[field];
211
+ const visible = cfg?.showWhen ? cfg.showWhen(allValues) : true;
212
+ const required = cfg?.requiredWhen ? cfg.requiredWhen(allValues) : Boolean(rules?.[field]?.required);
213
+ const disabled = cfg?.disabledWhen ? cfg.disabledWhen(allValues) : false;
214
+ return { visible, required, disabled };
215
+ },
216
+ [conditions, rules],
217
+ );
218
+
219
+ const getFieldState = useCallback(
220
+ (field: keyof T) => evalFieldState(field, valuesRef.current),
221
+ [evalFieldState],
222
+ );
223
+
224
+ const isVisible = useCallback((field: keyof T) => getFieldState(field).visible, [getFieldState]);
225
+ const isRequired = useCallback((field: keyof T) => getFieldState(field).required, [getFieldState]);
226
+ const isDisabled = useCallback((field: keyof T) => getFieldState(field).disabled, [getFieldState]);
227
+
228
+ const effectiveRulesFor = useCallback(
229
+ (field: keyof T, allValues: T): FieldFlowRules | undefined => {
230
+ const base = { ...(rules?.[field] ?? {}) };
231
+ const state = evalFieldState(field, allValues);
232
+ if (state.required && !base.required) {
233
+ base.required = true;
234
+ }
235
+ if (!state.required && base.required && conditions?.[field]?.requiredWhen) {
236
+ // Dynamically optional — strip required when condition is false
237
+ delete base.required;
238
+ }
239
+ return Object.keys(base).length ? base : undefined;
240
+ },
241
+ [rules, evalFieldState, conditions],
242
+ );
243
+
244
+ const syncErrorFor = useCallback(
245
+ (field: keyof T, fieldValue: string, allValues: T): string | undefined => {
246
+ const state = evalFieldState(field, allValues);
247
+ if (!state.visible) return undefined;
248
+
249
+ const result = runRules(fieldValue, effectiveRulesFor(field, allValues), messages);
250
+ if (!result.valid) return result.message;
251
+
252
+ if (crossFieldRules) {
253
+ for (const rule of crossFieldRules) {
254
+ if (rule.target !== field) continue;
255
+ const targetVisible = evalFieldState(rule.target, allValues).visible;
256
+ if (!targetVisible) continue;
257
+ const cross = rule.validate(allValues);
258
+ if (!cross.valid) return cross.message ?? messages.invalid;
259
+ }
260
+ }
261
+ return undefined;
262
+ },
263
+ [crossFieldRules, effectiveRulesFor, evalFieldState, messages],
264
+ );
265
+
266
+ const runAsyncForField = useCallback(
267
+ async (field: keyof T, fieldValue: string, allValues: T): Promise<string | undefined> => {
268
+ if (!evalFieldState(field, allValues).visible) return undefined;
269
+ const validator = asyncValidators?.[field];
270
+ if (!validator) return undefined;
271
+ setValidating(prev => ({ ...prev, [field]: true }));
272
+ try {
273
+ const result = await validator(fieldValue, allValues);
274
+ return result.valid ? undefined : result.message;
275
+ } finally {
276
+ setValidating(prev => ({ ...prev, [field]: false }));
277
+ }
278
+ },
279
+ [asyncValidators, evalFieldState],
280
+ );
281
+
282
+ const scheduleAsync = useCallback(
283
+ (field: keyof T, fieldValue: string, allValues: T) => {
284
+ if (!asyncValidators?.[field]) return;
285
+ const existing = debounceTimers.current[field];
286
+ if (existing) clearTimeout(existing);
287
+
288
+ debounceTimers.current[field] = setTimeout(async () => {
289
+ const gen = ++asyncGen.current;
290
+ const message = await runAsyncForField(field, fieldValue, allValues);
291
+ if (gen !== asyncGen.current) return;
292
+ setErrorsState(prev => {
293
+ const syncMsg = syncErrorFor(field, fieldValue, allValues);
294
+ if (syncMsg) return { ...prev, [field]: syncMsg };
295
+ return { ...prev, [field]: message };
296
+ });
297
+ }, asyncDebounceMs);
298
+ },
299
+ [asyncDebounceMs, asyncValidators, runAsyncForField, syncErrorFor],
300
+ );
301
+
46
302
  const validateField = useCallback(
47
- (field: keyof T): boolean => {
48
- const fieldRules = rules?.[field];
49
- const result = runRules(values[field] ?? '', fieldRules);
50
- setErrors(prev => ({ ...prev, [field]: result.valid ? undefined : result.message }));
51
- return result.valid;
303
+ async (field: keyof T): Promise<boolean> => {
304
+ const allValues = valuesRef.current;
305
+ if (!evalFieldState(field, allValues).visible) {
306
+ setErrorsState(prev => ({ ...prev, [field]: undefined }));
307
+ return true;
308
+ }
309
+ const fieldValue = allValues[field] ?? '';
310
+ const syncError = syncErrorFor(field, fieldValue, allValues);
311
+ if (syncError) {
312
+ setErrorsState(prev => ({ ...prev, [field]: syncError }));
313
+ return false;
314
+ }
315
+ const asyncError = await runAsyncForField(field, fieldValue, allValues);
316
+ setErrorsState(prev => ({ ...prev, [field]: asyncError }));
317
+ return !asyncError;
52
318
  },
53
- [rules, values],
319
+ [evalFieldState, runAsyncForField, syncErrorFor],
54
320
  );
55
321
 
56
- const validateAll = useCallback((): boolean => {
57
- if (!rules) return true;
58
- let allValid = true;
322
+ const validateFields = useCallback(
323
+ async (fields: (keyof T)[]): Promise<boolean> => {
324
+ const results = await Promise.all(fields.map(f => validateField(f)));
325
+ setTouched(prev => {
326
+ const next = { ...prev };
327
+ for (const f of fields) next[f] = true;
328
+ return next;
329
+ });
330
+ return results.every(Boolean);
331
+ },
332
+ [validateField],
333
+ );
334
+
335
+ const validateAll = useCallback(async (): Promise<boolean> => {
336
+ const allValues = valuesRef.current;
59
337
  const nextErrors: Partial<Record<keyof T, string>> = {};
60
- for (const key of Object.keys(rules) as (keyof T)[]) {
61
- const result = runRules(values[key] ?? '', rules[key]);
62
- if (!result.valid) {
63
- allValid = false;
64
- nextErrors[key] = result.message;
338
+ const keys = new Set<keyof T>([
339
+ ...(Object.keys(allValues) as (keyof T)[]),
340
+ ...(rules ? (Object.keys(rules) as (keyof T)[]) : []),
341
+ ...(crossFieldRules?.map(r => r.target) ?? []),
342
+ ...(asyncValidators ? (Object.keys(asyncValidators) as (keyof T)[]) : []),
343
+ ...(conditions ? (Object.keys(conditions) as (keyof T)[]) : []),
344
+ ]);
345
+
346
+ for (const key of keys) {
347
+ if (!evalFieldState(key, allValues).visible) continue;
348
+ const syncError = syncErrorFor(key, allValues[key] ?? '', allValues);
349
+ if (syncError) nextErrors[key] = syncError;
350
+ }
351
+
352
+ if (crossFieldRules) {
353
+ for (const rule of crossFieldRules) {
354
+ if (!evalFieldState(rule.target, allValues).visible) continue;
355
+ if (nextErrors[rule.target]) continue;
356
+ const result = rule.validate(allValues);
357
+ if (!result.valid) nextErrors[rule.target] = result.message ?? messages.invalid;
65
358
  }
66
359
  }
67
- setErrors(nextErrors);
360
+
361
+ if (formValidate) {
362
+ const formErrors = await formValidate(allValues);
363
+ for (const key of Object.keys(formErrors) as (keyof T)[]) {
364
+ if (!evalFieldState(key, allValues).visible) continue;
365
+ const formMsg = formErrors[key];
366
+ if (formMsg && !nextErrors[key]) nextErrors[key] = formMsg;
367
+ }
368
+ }
369
+
370
+ if (asyncValidators) {
371
+ await Promise.all(
372
+ (Object.keys(asyncValidators) as (keyof T)[]).map(async key => {
373
+ if (!evalFieldState(key, allValues).visible) return;
374
+ if (nextErrors[key]) return;
375
+ const asyncError = await runAsyncForField(key, allValues[key] ?? '', allValues);
376
+ if (asyncError) nextErrors[key] = asyncError;
377
+ }),
378
+ );
379
+ }
380
+
381
+ setErrorsState(nextErrors);
382
+ setTouched(prev => {
383
+ const next = { ...prev };
384
+ for (const key of keys) {
385
+ if (evalFieldState(key, allValues).visible) next[key] = true;
386
+ }
387
+ return next;
388
+ });
389
+
390
+ const valid = Object.values(nextErrors).every(e => !e);
391
+ if (intelligenceEnabled) {
392
+ intelligence.onValidationResult(
393
+ valid,
394
+ nextErrors as Partial<Record<Extract<keyof T, string>, string | undefined>>,
395
+ fieldOrder as Extract<keyof T, string>[] | undefined,
396
+ );
397
+ }
398
+ return valid;
399
+ }, [
400
+ rules,
401
+ crossFieldRules,
402
+ formValidate,
403
+ asyncValidators,
404
+ conditions,
405
+ evalFieldState,
406
+ syncErrorFor,
407
+ runAsyncForField,
408
+ intelligenceEnabled,
409
+ intelligence,
410
+ fieldOrder,
411
+ messages,
412
+ ]);
413
+
414
+ const setErrors = useCallback((next: Partial<Record<keyof T, string | undefined>>) => {
415
+ setErrorsState(prev => {
416
+ const merged = { ...prev };
417
+ for (const key of Object.keys(next) as (keyof T)[]) {
418
+ const msg = next[key];
419
+ if (msg == null || msg === '') delete merged[key];
420
+ else merged[key] = msg;
421
+ }
422
+ return merged;
423
+ });
68
424
  setTouched(prev => {
425
+ const merged = { ...prev };
426
+ for (const key of Object.keys(next) as (keyof T)[]) {
427
+ if (next[key]) merged[key] = true;
428
+ }
429
+ return merged;
430
+ });
431
+ }, []);
432
+
433
+ const setFieldError = useCallback((field: keyof T, message: string | undefined) => {
434
+ setErrors({ [field]: message } as Partial<Record<keyof T, string | undefined>>);
435
+ }, [setErrors]);
436
+
437
+ const clearErrors = useCallback((field?: keyof T) => {
438
+ if (field == null) {
439
+ setErrorsState({});
440
+ return;
441
+ }
442
+ setErrorsState(prev => {
443
+ if (!prev[field]) return prev;
69
444
  const next = { ...prev };
70
- for (const key of Object.keys(rules)) next[key as keyof T] = true;
445
+ delete next[field];
71
446
  return next;
72
447
  });
73
- return allValid;
74
- }, [rules, values]);
448
+ }, []);
75
449
 
76
450
  const setValue = useCallback((field: keyof T, value: string) => {
77
- setValues(prev => ({ ...prev, [field]: value }));
451
+ setValuesState(prev => {
452
+ const next = { ...prev, [field]: value };
453
+ valuesRef.current = next;
454
+ return next;
455
+ });
456
+ }, []);
457
+
458
+ const setValues = useCallback((next: T | ((prev: T) => T)) => {
459
+ setValuesState(prev => {
460
+ const resolved = typeof next === 'function' ? (next as (p: T) => T)(prev) : next;
461
+ valuesRef.current = resolved;
462
+ return resolved;
463
+ });
78
464
  }, []);
79
465
 
80
466
  const handleChange = useCallback(
81
467
  (field: keyof T) => (value: string) => {
82
468
  setValue(field, value);
469
+ if (intelligenceEnabled) {
470
+ intelligence.trackChange(field as Extract<keyof T, string>);
471
+ }
472
+ const allValues = { ...valuesRef.current, [field]: value };
473
+
83
474
  if (touched[field]) {
84
- // live-validate once the user has already blurred this field once
85
- const result = runRules(value, rules?.[field]);
86
- setErrors(prev => ({ ...prev, [field]: result.valid ? undefined : result.message }));
475
+ const syncError = syncErrorFor(field, value, allValues);
476
+ setErrorsState(prev => ({ ...prev, [field]: syncError }));
477
+ if (!syncError) scheduleAsync(field, value, allValues);
478
+ }
479
+
480
+ // Clear errors for fields that just became hidden
481
+ if (conditions) {
482
+ for (const key of Object.keys(conditions) as (keyof T)[]) {
483
+ if (!evalFieldState(key, allValues).visible) {
484
+ setErrorsState(prev => (prev[key] ? { ...prev, [key]: undefined } : prev));
485
+ }
486
+ }
487
+ }
488
+
489
+ if (crossFieldRules) {
490
+ for (const rule of crossFieldRules) {
491
+ if (rule.target === field) continue;
492
+ if (rule.deps && !rule.deps.includes(field)) continue;
493
+ if (!touched[rule.target] && !touched[field]) continue;
494
+ if (!evalFieldState(rule.target, allValues).visible) continue;
495
+ const result = rule.validate(allValues);
496
+ setErrorsState(prev => ({
497
+ ...prev,
498
+ [rule.target]: result.valid
499
+ ? syncErrorFor(rule.target, allValues[rule.target] ?? '', allValues)
500
+ : result.message ?? messages.invalid,
501
+ }));
502
+ }
87
503
  }
88
504
  },
89
- [rules, setValue, touched],
505
+ [
506
+ setValue,
507
+ touched,
508
+ syncErrorFor,
509
+ scheduleAsync,
510
+ crossFieldRules,
511
+ conditions,
512
+ evalFieldState,
513
+ intelligenceEnabled,
514
+ intelligence,
515
+ messages,
516
+ ],
90
517
  );
91
518
 
92
519
  const handleBlur = useCallback(
93
520
  (field: keyof T) => () => {
521
+ if (intelligenceEnabled) {
522
+ intelligence.trackBlur(field as Extract<keyof T, string>);
523
+ }
94
524
  setTouched(prev => ({ ...prev, [field]: true }));
95
- validateField(field);
525
+ void validateField(field);
96
526
  },
97
- [validateField],
527
+ [validateField, intelligenceEnabled, intelligence],
528
+ );
529
+
530
+ const handleFocus = useCallback(
531
+ (field: keyof T) => () => {
532
+ if (intelligenceEnabled) {
533
+ intelligence.trackFocus(field as Extract<keyof T, string>);
534
+ }
535
+ },
536
+ [intelligenceEnabled, intelligence],
98
537
  );
99
538
 
100
539
  const submit = useCallback(async () => {
101
- const valid = validateAll();
540
+ const valid = await validateAll();
102
541
  if (!valid) return;
103
542
  setIsSubmitting(true);
104
543
  try {
105
- await onSubmit?.(values);
544
+ await onSubmit?.(valuesRef.current);
545
+ if (intelligenceEnabled) intelligence.trackSubmitSuccess();
106
546
  } finally {
107
547
  setIsSubmitting(false);
108
548
  }
109
- }, [onSubmit, validateAll, values]);
549
+ }, [onSubmit, validateAll, intelligenceEnabled, intelligence]);
110
550
 
111
551
  const reset = useCallback(() => {
112
- setValues(initialValues);
113
- setErrors({});
552
+ asyncGen.current += 1;
553
+ for (const key of Object.keys(debounceTimers.current) as (keyof T)[]) {
554
+ const t = debounceTimers.current[key];
555
+ if (t) clearTimeout(t);
556
+ }
557
+ setValuesState(initialValues);
558
+ valuesRef.current = initialValues;
559
+ setErrorsState({});
114
560
  setTouched({});
115
- }, [initialValues]);
561
+ setValidating({});
562
+ if (intelligenceEnabled) intelligence.reset();
563
+ }, [initialValues, intelligenceEnabled, intelligence]);
564
+
565
+ const getInputProps = useCallback(
566
+ (field: keyof T) => {
567
+ const state = getFieldState(field);
568
+ if (!state.visible) return null;
569
+ return {
570
+ value: values[field] ?? '',
571
+ onChangeText: handleChange(field),
572
+ onBlur: handleBlur(field),
573
+ onFocus: handleFocus(field),
574
+ errorText: touched[field] ? errors[field] : undefined,
575
+ required: state.required,
576
+ disabled: state.disabled,
577
+ };
578
+ },
579
+ [getFieldState, values, handleChange, handleBlur, handleFocus, touched, errors],
580
+ );
581
+
582
+ const registerFieldRef = useCallback(
583
+ (field: keyof T, ref: { current: TextInput | null } | TextInput | null) => {
584
+ if (intelligenceEnabled) {
585
+ intelligence.registerFieldRef(field as Extract<keyof T, string>, ref);
586
+ }
587
+ },
588
+ [intelligenceEnabled, intelligence],
589
+ );
116
590
 
117
591
  const isValid = useMemo(() => Object.values(errors).every(e => !e), [errors]);
592
+ const isValidating = useMemo(() => Object.values(validating).some(Boolean), [validating]);
593
+
594
+ const dirtyFields = useMemo(() => {
595
+ const next: Partial<Record<keyof T, boolean>> = {};
596
+ for (const key of Object.keys(initialValues) as (keyof T)[]) {
597
+ if ((values[key] ?? '') !== (initialValues[key] ?? '')) next[key] = true;
598
+ }
599
+ for (const key of Object.keys(values) as (keyof T)[]) {
600
+ if ((values[key] ?? '') !== (initialValues[key] ?? '')) next[key] = true;
601
+ }
602
+ return next;
603
+ }, [values, initialValues]);
604
+
605
+ const isDirty = useMemo(() => Object.values(dirtyFields).some(Boolean), [dirtyFields]);
118
606
 
119
607
  return {
120
608
  values,
121
609
  errors,
122
610
  touched,
611
+ validating,
123
612
  isSubmitting,
124
613
  isValid,
614
+ isValidating,
615
+ isDirty,
616
+ dirtyFields,
125
617
  setValue,
618
+ setValues,
619
+ setErrors,
620
+ setFieldError,
621
+ clearErrors,
126
622
  handleChange,
127
623
  handleBlur,
624
+ handleFocus,
128
625
  validateField,
626
+ validateFields,
129
627
  validateAll,
130
628
  submit,
131
629
  reset,
630
+ getFieldState,
631
+ isVisible,
632
+ isRequired,
633
+ isDisabled,
634
+ getInputProps,
635
+ intelligence: intelligenceEnabled ? intelligence : null,
636
+ registerFieldRef,
132
637
  };
133
638
  }