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
@@ -0,0 +1,169 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Pressable, StyleSheet, Text, View, type TextStyle, type ViewStyle } from 'react-native';
3
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
4
+ import { defaultTheme } from '../../theme/defaultTheme';
5
+ import { renderFieldFlowIcon } from '../../icons/renderIcon';
6
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
7
+
8
+ export interface FieldFlowDraftBannerProps {
9
+ visible: boolean;
10
+ /** Epoch ms when the draft was saved — used for relative time copy. */
11
+ savedAt?: number | null;
12
+ title?: string;
13
+ subtitle?: string;
14
+ resumeLabel?: string;
15
+ discardLabel?: string;
16
+ onResume: () => void;
17
+ onDiscard: () => void;
18
+ containerStyle?: ViewStyle;
19
+ titleStyle?: TextStyle;
20
+ subtitleStyle?: TextStyle;
21
+ theme?: DeepPartial<FieldFlowTheme>;
22
+ testID?: string;
23
+ }
24
+
25
+ function formatRelativeTime(savedAt: number): string {
26
+ const delta = Math.max(0, Date.now() - savedAt);
27
+ const minutes = Math.floor(delta / 60000);
28
+ if (minutes < 1) return 'just now';
29
+ if (minutes < 60) return `${minutes}m ago`;
30
+ const hours = Math.floor(minutes / 60);
31
+ if (hours < 24) return `${hours}h ago`;
32
+ const days = Math.floor(hours / 24);
33
+ return `${days}d ago`;
34
+ }
35
+
36
+ /**
37
+ * Themed “Resume where you left off?” banner for `useFieldFlowDraft`.
38
+ */
39
+ export function FieldFlowDraftBanner({
40
+ visible,
41
+ savedAt,
42
+ title = 'Resume your draft?',
43
+ subtitle,
44
+ resumeLabel = 'Resume',
45
+ discardLabel = 'Discard',
46
+ onResume,
47
+ onDiscard,
48
+ containerStyle,
49
+ titleStyle,
50
+ subtitleStyle,
51
+ theme: themeOverride,
52
+ testID,
53
+ }: FieldFlowDraftBannerProps) {
54
+ const contextTheme = useFieldFlowTheme();
55
+ const theme = useMemo(
56
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
57
+ [contextTheme, themeOverride],
58
+ );
59
+ const styles = useMemo(() => createStyles(theme), [theme]);
60
+
61
+ const resolvedSubtitle =
62
+ subtitle ??
63
+ (savedAt ? `Saved ${formatRelativeTime(savedAt)}. Pick up where you left off.` : 'Pick up where you left off.');
64
+
65
+ if (!visible) return null;
66
+
67
+ return (
68
+ <View
69
+ style={[styles.banner, containerStyle]}
70
+ testID={testID}
71
+ accessibilityRole="summary"
72
+ accessibilityLabel={`${title}. ${resolvedSubtitle}`}
73
+ >
74
+ <View style={styles.iconWrap}>
75
+ {renderFieldFlowIcon('file', theme.colors.borderFocused, 18)}
76
+ </View>
77
+ <View style={styles.copy}>
78
+ <Text style={[styles.title, titleStyle]}>{title}</Text>
79
+ <Text style={[styles.subtitle, subtitleStyle]}>{resolvedSubtitle}</Text>
80
+ </View>
81
+ <View style={styles.actions}>
82
+ <Pressable
83
+ onPress={onDiscard}
84
+ hitSlop={6}
85
+ accessibilityRole="button"
86
+ accessibilityLabel={discardLabel}
87
+ style={styles.ghostBtn}
88
+ >
89
+ <Text style={styles.ghostText}>{discardLabel}</Text>
90
+ </Pressable>
91
+ <Pressable
92
+ onPress={onResume}
93
+ hitSlop={6}
94
+ accessibilityRole="button"
95
+ accessibilityLabel={resumeLabel}
96
+ style={styles.primaryBtn}
97
+ >
98
+ <Text style={styles.primaryText}>{resumeLabel}</Text>
99
+ </Pressable>
100
+ </View>
101
+ </View>
102
+ );
103
+ }
104
+
105
+ function createStyles(theme: FieldFlowTheme) {
106
+ return StyleSheet.create({
107
+ banner: {
108
+ flexDirection: 'row',
109
+ flexWrap: 'wrap',
110
+ alignItems: 'center',
111
+ gap: theme.spacing.gap,
112
+ padding: theme.spacing.paddingHorizontal,
113
+ marginBottom: theme.spacing.gap * 2,
114
+ borderRadius: theme.spacing.borderRadius,
115
+ borderWidth: theme.spacing.borderWidth,
116
+ borderColor: theme.colors.borderFocused,
117
+ backgroundColor: theme.colors.background,
118
+ },
119
+ iconWrap: {
120
+ width: 32,
121
+ height: 32,
122
+ borderRadius: 8,
123
+ alignItems: 'center',
124
+ justifyContent: 'center',
125
+ backgroundColor: theme.colors.backgroundDisabled,
126
+ },
127
+ copy: {
128
+ flex: 1,
129
+ minWidth: 140,
130
+ },
131
+ title: {
132
+ fontSize: theme.typography.fontSize,
133
+ fontWeight: '600',
134
+ color: theme.colors.text,
135
+ fontFamily: theme.typography.fontFamily,
136
+ },
137
+ subtitle: {
138
+ marginTop: 2,
139
+ fontSize: theme.typography.helperFontSize,
140
+ color: theme.colors.label,
141
+ fontFamily: theme.typography.fontFamily,
142
+ },
143
+ actions: {
144
+ flexDirection: 'row',
145
+ alignItems: 'center',
146
+ gap: theme.spacing.gap,
147
+ },
148
+ ghostBtn: {
149
+ paddingHorizontal: 10,
150
+ paddingVertical: 8,
151
+ },
152
+ ghostText: {
153
+ fontSize: theme.typography.helperFontSize,
154
+ color: theme.colors.label,
155
+ fontWeight: '500',
156
+ },
157
+ primaryBtn: {
158
+ paddingHorizontal: 12,
159
+ paddingVertical: 8,
160
+ borderRadius: theme.spacing.borderRadius,
161
+ backgroundColor: theme.colors.borderFocused,
162
+ },
163
+ primaryText: {
164
+ fontSize: theme.typography.helperFontSize,
165
+ color: '#FFFFFF',
166
+ fontWeight: '600',
167
+ },
168
+ });
169
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowDraftBanner } from './FieldFlowDraftBanner';
2
+ export type { FieldFlowDraftBannerProps } from './FieldFlowDraftBanner';
@@ -13,6 +13,7 @@ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
13
13
  import { defaultTheme } from '../../theme/defaultTheme';
14
14
  import { useFieldState } from '../../hooks/useFieldState';
15
15
  import { FieldFlowIcon } from '../../icons/Icon';
16
+ import { renderFieldFlowIcon } from '../../icons/renderIcon';
16
17
  import { createDropdownStyles } from './styles';
17
18
  import type { FieldFlowDropdownProps } from './types';
18
19
  import type { FieldFlowOption } from '../../types';
@@ -35,6 +36,9 @@ export function FieldFlowDropdown(props: FieldFlowDropdownProps) {
35
36
  emptyText = 'No options found',
36
37
  maxModalHeight,
37
38
  clearable,
39
+ leftIcon,
40
+ rightIcon,
41
+ iconSize = 16,
38
42
  containerStyle,
39
43
  triggerStyle,
40
44
  labelStyle,
@@ -165,6 +169,11 @@ export function FieldFlowDropdown(props: FieldFlowDropdownProps) {
165
169
  disabled={item.disabled}
166
170
  style={styles.optionRow}
167
171
  >
172
+ {item.icon ? (
173
+ <View style={{ marginRight: 10, marginTop: 2 }}>
174
+ {renderFieldFlowIcon(item.icon, theme.colors.icon, 18)}
175
+ </View>
176
+ ) : null}
168
177
  <View style={{ flex: 1 }}>
169
178
  <Text
170
179
  style={[
@@ -253,20 +262,21 @@ export function FieldFlowDropdown(props: FieldFlowDropdownProps) {
253
262
  disabled={disabled}
254
263
  style={[styles.trigger, triggerStyle]}
255
264
  >
265
+ {leftIcon ? (
266
+ <View style={{ marginRight: 8 }}>
267
+ {renderFieldFlowIcon(leftIcon, theme.colors.icon, iconSize)}
268
+ </View>
269
+ ) : null}
256
270
  {triggerLabel ? (
257
- <Text style={styles.triggerText} numberOfLines={1}>
271
+ <Text style={[styles.triggerText, { flex: 1 }]} numberOfLines={1}>
258
272
  {triggerLabel}
259
273
  </Text>
260
274
  ) : (
261
- <Text style={styles.placeholderText} numberOfLines={1}>
275
+ <Text style={[styles.placeholderText, { flex: 1 }]} numberOfLines={1}>
262
276
  {placeholder}
263
277
  </Text>
264
278
  )}
265
- <FieldFlowIcon
266
- name="chevronDown"
267
- size={16}
268
- color={theme.colors.icon}
269
- />
279
+ {renderFieldFlowIcon(rightIcon ?? 'chevronDown', theme.colors.icon, iconSize)}
270
280
  </Pressable>
271
281
  </View>
272
282
 
@@ -1,5 +1,6 @@
1
1
  import type { ViewStyle, TextStyle } from 'react-native';
2
- import type { DeepPartial, FieldFlowOption, FieldFlowTheme } from '../../types';
2
+ import type { DeepPartial, FieldFlowOption, FieldFlowTheme, FieldFlowVariant } from '../../types';
3
+ import type { FieldFlowIconSource } from '../../icons';
3
4
 
4
5
  export type FieldFlowDropdownPresentation = 'bottomSheet' | 'popup' | 'inline';
5
6
 
@@ -26,6 +27,12 @@ interface BaseDropdownProps {
26
27
  maxModalHeight?: number;
27
28
  clearable?: boolean;
28
29
 
30
+ /** Built-in icon name or custom React node on the trigger. */
31
+ leftIcon?: FieldFlowIconSource;
32
+ rightIcon?: FieldFlowIconSource;
33
+ iconSize?: number;
34
+ variant?: FieldFlowVariant;
35
+
29
36
  containerStyle?: ViewStyle;
30
37
  triggerStyle?: ViewStyle;
31
38
  labelStyle?: TextStyle;
@@ -1,29 +1,33 @@
1
- import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
- import { Pressable, Text, TextInput, View } from 'react-native';
1
+ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
+ import { Animated, Pressable, Text, TextInput, View } from 'react-native';
3
3
  import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
4
4
  import { defaultTheme } from '../../theme/defaultTheme';
5
5
  import { useFieldState } from '../../hooks/useFieldState';
6
6
  import { resolveFieldConfig, implicitRulesForType } from '../../utils/keyboardTypes';
7
7
  import { sanitizeNumeric, sanitizePhone, truncate } from '../../utils/formatters';
8
8
  import { runRules } from '../../validation/validators';
9
- import { FieldFlowIcon } from '../../icons/Icon';
10
- import { createStyles, iconColorFor } from './styles';
9
+ import { renderFieldFlowIcon } from '../../icons/renderIcon';
10
+ import { useFieldMotion } from '../../motion/useFieldMotion';
11
+ import { FieldFlowAffordance } from '../FieldFlowAffordance';
12
+ import { FieldFlowPasswordStrength } from '../FieldFlowPasswordStrength';
13
+ import {
14
+ affordanceKindFromFieldType,
15
+ type FieldFlowAffordanceKind,
16
+ } from '../../utils/affordance';
17
+ import { createStyles, iconColorFor, labelColorFor } from './styles';
11
18
  import type { FieldFlowInputProps } from './types';
12
19
 
13
- function renderIconNode(
14
- icon: FieldFlowInputProps['leftIcon'],
15
- color: string,
16
- ): React.ReactNode {
17
- if (!icon) return null;
18
- if (typeof icon === 'string') {
19
- return <FieldFlowIcon name={icon as any} color={color} size={18} />;
20
- }
21
- return icon;
22
- }
20
+ const DEFAULT_ICONS: Partial<Record<NonNullable<FieldFlowInputProps['type']>, FieldFlowInputProps['leftIcon']>> = {
21
+ search: 'search',
22
+ email: 'mail',
23
+ phone: 'phone',
24
+ password: 'lock',
25
+ };
23
26
 
24
27
  export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(function FieldFlowInput(
25
28
  {
26
29
  type = 'text',
30
+ variant = 'outlined',
27
31
  label,
28
32
  helperText,
29
33
  errorText,
@@ -46,16 +50,26 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
46
50
  rightIcon,
47
51
  onLeftIconPress,
48
52
  onRightIconPress,
53
+ iconSize = 18,
49
54
  clearable,
55
+ suggestions,
56
+ suggestionsAlwaysVisible = false,
57
+ showStrength,
58
+ prefix,
59
+ suffix,
60
+ motion = true,
50
61
  maxLength,
51
62
  showCharacterCount,
52
63
  onSubmitEditing,
53
64
  containerStyle,
65
+ inputContainerStyle,
54
66
  inputStyle,
55
67
  labelStyle,
56
68
  helperStyle,
69
+ errorStyle,
57
70
  theme: themeOverride,
58
71
  testID,
72
+ placeholder,
59
73
  ...rest
60
74
  },
61
75
  forwardedRef,
@@ -94,11 +108,32 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
94
108
  });
95
109
 
96
110
  const styles = useMemo(
97
- () => createStyles(theme, state, fieldConfig.multiline && type !== 'chat'),
98
- [theme, state, fieldConfig.multiline, type],
111
+ () => createStyles(theme, state, fieldConfig.multiline && type !== 'chat', variant),
112
+ [theme, state, fieldConfig.multiline, type, variant],
99
113
  );
100
114
  const iconColor = iconColorFor(theme, state);
101
115
 
116
+ const fieldMotion = useFieldMotion({
117
+ enabled: motion,
118
+ isFocused,
119
+ hasError: Boolean(hasError || resolvedError),
120
+ isSuccess: Boolean(isSuccess || successText),
121
+ duration: theme.animation.duration,
122
+ });
123
+
124
+ const isFloating = variant === 'floating';
125
+ const floatUp = isFocused || currentValue.length > 0;
126
+ const floatAnim = useRef(new Animated.Value(floatUp ? 1 : 0)).current;
127
+
128
+ useEffect(() => {
129
+ if (!isFloating) return;
130
+ Animated.timing(floatAnim, {
131
+ toValue: floatUp ? 1 : 0,
132
+ duration: theme.animation.duration,
133
+ useNativeDriver: false,
134
+ }).start();
135
+ }, [floatAnim, floatUp, isFloating, theme.animation.duration]);
136
+
102
137
  const runValidation = useCallback(
103
138
  (nextValue: string) => {
104
139
  const result = runRules(nextValue, effectiveRules);
@@ -124,17 +159,34 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
124
159
  [type, maxLength, isControlled, onChangeText, validateOnChange, runValidation],
125
160
  );
126
161
 
162
+ const blurHideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
163
+
127
164
  const handleFocus = useCallback(() => {
165
+ if (blurHideTimer.current) {
166
+ clearTimeout(blurHideTimer.current);
167
+ blurHideTimer.current = null;
168
+ }
128
169
  setIsFocused(true);
129
170
  onFocus?.();
130
171
  }, [onFocus]);
131
172
 
132
173
  const handleBlur = useCallback(() => {
133
- setIsFocused(false);
174
+ // Delay hiding suggestion chips so a chip press can register first
175
+ blurHideTimer.current = setTimeout(() => {
176
+ setIsFocused(false);
177
+ blurHideTimer.current = null;
178
+ }, 180);
134
179
  runValidation(currentValue);
135
180
  onBlur?.();
136
181
  }, [runValidation, currentValue, onBlur]);
137
182
 
183
+ useEffect(
184
+ () => () => {
185
+ if (blurHideTimer.current) clearTimeout(blurHideTimer.current);
186
+ },
187
+ [],
188
+ );
189
+
138
190
  const handleClear = useCallback(() => {
139
191
  if (!isControlled) setInternalValue('');
140
192
  onChangeText?.('');
@@ -144,11 +196,12 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
144
196
  const isClearable = clearable ?? type === 'search';
145
197
  const showClearButton = isClearable && currentValue.length > 0 && !disabled && !readOnly && !loading;
146
198
 
147
- const resolvedLeftIcon = leftIcon ?? (type === 'search' ? 'search' : undefined);
148
- let resolvedRightIcon = rightIcon;
199
+ const resolvedLeftIcon = leftIcon === null ? undefined : leftIcon !== undefined ? leftIcon : DEFAULT_ICONS[type];
200
+ let resolvedRightIcon: FieldFlowInputProps['rightIcon'] | undefined =
201
+ rightIcon === null ? undefined : rightIcon;
149
202
  let rightIconPress = onRightIconPress;
150
203
 
151
- if (!resolvedRightIcon) {
204
+ if (rightIcon === undefined) {
152
205
  if (loading) {
153
206
  resolvedRightIcon = 'spinner';
154
207
  } else if (type === 'password') {
@@ -164,68 +217,179 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
164
217
  }
165
218
  }
166
219
 
220
+ const floatingLabelStyle = {
221
+ top: floatAnim.interpolate({
222
+ inputRange: [0, 1],
223
+ outputRange: [
224
+ theme.spacing.paddingVertical + (theme.typography.fontSize - theme.typography.labelFontSize) / 2 + 2,
225
+ -theme.typography.labelFontSize / 2 - 2,
226
+ ],
227
+ }),
228
+ fontSize: floatAnim.interpolate({
229
+ inputRange: [0, 1],
230
+ outputRange: [theme.typography.fontSize, theme.typography.labelFontSize],
231
+ }),
232
+ color: labelColorFor(theme, state),
233
+ left: theme.spacing.paddingHorizontal + (resolvedLeftIcon ? iconSize + theme.spacing.gap : 0),
234
+ };
235
+
236
+ const showExternalLabel = Boolean(label) && !isFloating;
237
+
238
+ const affordanceConfig = useMemo(() => {
239
+ if (!suggestions) return null;
240
+ if (suggestions === true) {
241
+ const kind = affordanceKindFromFieldType(type);
242
+ return kind ? { kind, chips: undefined as undefined } : null;
243
+ }
244
+ if (typeof suggestions === 'string') {
245
+ return { kind: suggestions as FieldFlowAffordanceKind, chips: undefined as undefined };
246
+ }
247
+ return { kind: 'custom' as FieldFlowAffordanceKind, chips: suggestions };
248
+ }, [suggestions, type]);
249
+
250
+ const showAffordance =
251
+ Boolean(affordanceConfig) &&
252
+ !disabled &&
253
+ !readOnly &&
254
+ (suggestionsAlwaysVisible || isFocused);
255
+
256
+ const renderAffix = (affix: string | React.ReactNode | undefined, side: 'left' | 'right') => {
257
+ if (affix == null || affix === false) return null;
258
+ if (typeof affix === 'string') {
259
+ return (
260
+ <Text
261
+ style={[
262
+ styles.affixText,
263
+ side === 'left' ? styles.iconSlotLeft : styles.iconSlotRight,
264
+ ]}
265
+ numberOfLines={1}
266
+ >
267
+ {affix}
268
+ </Text>
269
+ );
270
+ }
271
+ return <View style={side === 'left' ? styles.iconSlotLeft : styles.iconSlotRight}>{affix}</View>;
272
+ };
273
+
167
274
  return (
168
275
  <View style={[styles.wrapper, containerStyle]} testID={testID}>
169
- {label ? (
276
+ {showExternalLabel ? (
170
277
  <Text style={[styles.label, labelStyle]}>
171
278
  {label}
172
279
  {required ? ' *' : ''}
173
280
  </Text>
174
281
  ) : null}
175
282
 
176
- <View style={styles.inputContainer}>
177
- {resolvedLeftIcon ? (
178
- <Pressable
179
- onPress={onLeftIconPress}
180
- disabled={!onLeftIconPress}
181
- style={[styles.iconSlot, styles.iconSlotLeft]}
182
- hitSlop={8}
183
- >
184
- {renderIconNode(resolvedLeftIcon, iconColor)}
185
- </Pressable>
186
- ) : null}
187
-
188
- <TextInput
189
- ref={innerRef}
283
+ <Animated.View style={fieldMotion.containerStyle}>
284
+ <View style={[styles.inputContainer, inputContainerStyle]}>
285
+ {motion ? (
286
+ <Animated.View
287
+ pointerEvents="none"
288
+ style={[
289
+ styles.focusGlow,
290
+ {
291
+ opacity: fieldMotion.glowOpacity.interpolate({
292
+ inputRange: [0, 1],
293
+ outputRange: [0, 0.22],
294
+ }),
295
+ borderColor: theme.colors.borderFocused,
296
+ borderRadius: theme.spacing.borderRadius + 2,
297
+ },
298
+ ]}
299
+ />
300
+ ) : null}
301
+
302
+ {isFloating && label ? (
303
+ <Animated.Text style={[styles.floatingLabel, floatingLabelStyle, labelStyle]} pointerEvents="none">
304
+ {label}
305
+ {required ? ' *' : ''}
306
+ </Animated.Text>
307
+ ) : null}
308
+
309
+ {resolvedLeftIcon ? (
310
+ <Pressable
311
+ onPress={onLeftIconPress}
312
+ disabled={!onLeftIconPress}
313
+ style={[styles.iconSlot, styles.iconSlotLeft]}
314
+ hitSlop={8}
315
+ accessibilityRole={onLeftIconPress ? 'button' : undefined}
316
+ >
317
+ {renderFieldFlowIcon(resolvedLeftIcon, iconColor, iconSize)}
318
+ </Pressable>
319
+ ) : null}
320
+
321
+ {renderAffix(prefix, 'left')}
322
+
323
+ <TextInput
324
+ ref={innerRef}
325
+ value={currentValue}
326
+ onChangeText={handleChangeText}
327
+ onFocus={handleFocus}
328
+ onBlur={handleBlur}
329
+ onSubmitEditing={onSubmitEditing}
330
+ editable={!disabled && !readOnly && !loading}
331
+ placeholder={isFloating ? (floatUp ? placeholder : undefined) : placeholder}
332
+ placeholderTextColor={theme.colors.placeholder}
333
+ keyboardType={fieldConfig.keyboardType}
334
+ secureTextEntry={fieldConfig.secureTextEntry && !showPassword}
335
+ autoCapitalize={fieldConfig.autoCapitalize}
336
+ autoCorrect={fieldConfig.autoCorrect}
337
+ multiline={fieldConfig.multiline && type !== 'chat'}
338
+ maxLength={maxLength}
339
+ returnKeyType={fieldConfig.multiline ? 'default' : 'done'}
340
+ style={[styles.input, inputStyle]}
341
+ {...rest}
342
+ />
343
+
344
+ {renderAffix(suffix, 'right')}
345
+
346
+ {resolvedRightIcon ? (
347
+ <Animated.View style={{ transform: [{ scale: fieldMotion.successScale }] }}>
348
+ <Pressable
349
+ onPress={rightIconPress}
350
+ disabled={!rightIconPress}
351
+ style={[styles.iconSlot, styles.iconSlotRight]}
352
+ hitSlop={8}
353
+ accessibilityRole={rightIconPress ? 'button' : undefined}
354
+ >
355
+ {renderFieldFlowIcon(resolvedRightIcon, iconColor, iconSize)}
356
+ </Pressable>
357
+ </Animated.View>
358
+ ) : null}
359
+ </View>
360
+ </Animated.View>
361
+
362
+ {showAffordance && affordanceConfig ? (
363
+ <FieldFlowAffordance
364
+ kind={affordanceConfig.kind}
365
+ chips={affordanceConfig.chips}
190
366
  value={currentValue}
191
- onChangeText={handleChangeText}
192
- onFocus={handleFocus}
193
- onBlur={handleBlur}
194
- onSubmitEditing={onSubmitEditing}
195
- editable={!disabled && !readOnly && !loading}
196
- placeholderTextColor={theme.colors.placeholder}
197
- keyboardType={fieldConfig.keyboardType}
198
- secureTextEntry={fieldConfig.secureTextEntry && !showPassword}
199
- autoCapitalize={fieldConfig.autoCapitalize}
200
- autoCorrect={fieldConfig.autoCorrect}
201
- multiline={fieldConfig.multiline && type !== 'chat'}
202
- maxLength={maxLength}
203
- returnKeyType={fieldConfig.multiline ? 'default' : 'done'}
204
- style={[styles.input, inputStyle]}
205
- {...rest}
367
+ onSelect={next => {
368
+ handleChangeText(next);
369
+ innerRef.current?.focus();
370
+ }}
371
+ theme={themeOverride}
206
372
  />
373
+ ) : null}
207
374
 
208
- {resolvedRightIcon ? (
209
- <Pressable
210
- onPress={rightIconPress}
211
- disabled={!rightIconPress}
212
- style={[styles.iconSlot, styles.iconSlotRight]}
213
- hitSlop={8}
214
- >
215
- {renderIconNode(resolvedRightIcon, iconColor)}
216
- </Pressable>
217
- ) : null}
218
- </View>
375
+ {type === 'password' && showStrength ? (
376
+ <FieldFlowPasswordStrength
377
+ password={currentValue}
378
+ showRules={typeof showStrength === 'object' ? showStrength.showRules : true}
379
+ rules={typeof showStrength === 'object' ? showStrength.rules : undefined}
380
+ theme={themeOverride}
381
+ />
382
+ ) : null}
219
383
 
220
384
  {(helperText || resolvedError || successText || (showCharacterCount && maxLength)) && (
221
- <View style={styles.footerRow}>
385
+ <Animated.View style={[styles.footerRow, { opacity: fieldMotion.messageOpacity }]}>
222
386
  <View style={{ flex: 1 }}>
223
387
  {resolvedError ? (
224
- <Text style={styles.errorText}>{resolvedError}</Text>
388
+ <Text style={[styles.errorText, errorStyle, helperStyle]}>{resolvedError}</Text>
225
389
  ) : successText ? (
226
- <Text style={styles.successText}>{successText}</Text>
390
+ <Text style={[styles.successText, helperStyle]}>{successText}</Text>
227
391
  ) : helperText ? (
228
- <Text style={styles.helperText}>{helperText}</Text>
392
+ <Text style={[styles.helperText, helperStyle]}>{helperText}</Text>
229
393
  ) : null}
230
394
  </View>
231
395
  {showCharacterCount && maxLength ? (
@@ -233,7 +397,7 @@ export const FieldFlowInput = forwardRef<TextInput, FieldFlowInputProps>(functio
233
397
  {currentValue.length}/{maxLength}
234
398
  </Text>
235
399
  ) : null}
236
- </View>
400
+ </Animated.View>
237
401
  )}
238
402
  </View>
239
403
  );