rn-inputforge 0.4.0 → 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 (396) hide show
  1. package/README.md +723 -39
  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/FieldFlowCreditCard/FieldFlowCreditCard.js +146 -0
  11. package/lib/commonjs/components/FieldFlowCreditCard/FieldFlowCreditCard.js.map +1 -0
  12. package/lib/commonjs/components/FieldFlowCreditCard/index.js +13 -0
  13. package/lib/commonjs/components/FieldFlowCreditCard/index.js.map +1 -0
  14. package/lib/commonjs/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js +156 -0
  15. package/lib/commonjs/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js.map +1 -0
  16. package/lib/commonjs/components/FieldFlowDraftBanner/index.js +13 -0
  17. package/lib/commonjs/components/FieldFlowDraftBanner/index.js.map +1 -0
  18. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js +143 -43
  19. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  20. package/lib/commonjs/components/FieldFlowInput/styles.js +16 -0
  21. package/lib/commonjs/components/FieldFlowInput/styles.js.map +1 -1
  22. package/lib/commonjs/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js +136 -0
  23. package/lib/commonjs/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js.map +1 -0
  24. package/lib/commonjs/components/FieldFlowNumberStepper/index.js +13 -0
  25. package/lib/commonjs/components/FieldFlowNumberStepper/index.js.map +1 -0
  26. package/lib/commonjs/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js +122 -0
  27. package/lib/commonjs/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js.map +1 -0
  28. package/lib/commonjs/components/FieldFlowPasswordStrength/index.js +13 -0
  29. package/lib/commonjs/components/FieldFlowPasswordStrength/index.js.map +1 -0
  30. package/lib/commonjs/components/FieldFlowPhone/FieldFlowPhone.js +263 -0
  31. package/lib/commonjs/components/FieldFlowPhone/FieldFlowPhone.js.map +1 -0
  32. package/lib/commonjs/components/FieldFlowPhone/index.js +13 -0
  33. package/lib/commonjs/components/FieldFlowPhone/index.js.map +1 -0
  34. package/lib/commonjs/components/FieldFlowRating/FieldFlowRating.js +106 -0
  35. package/lib/commonjs/components/FieldFlowRating/FieldFlowRating.js.map +1 -0
  36. package/lib/commonjs/components/FieldFlowRating/index.js +13 -0
  37. package/lib/commonjs/components/FieldFlowRating/index.js.map +1 -0
  38. package/lib/commonjs/components/FieldFlowSection/FieldFlowSection.js +141 -0
  39. package/lib/commonjs/components/FieldFlowSection/FieldFlowSection.js.map +1 -0
  40. package/lib/commonjs/components/FieldFlowSection/index.js +13 -0
  41. package/lib/commonjs/components/FieldFlowSection/index.js.map +1 -0
  42. package/lib/commonjs/components/FieldFlowSegmented/FieldFlowSegmented.js +195 -0
  43. package/lib/commonjs/components/FieldFlowSegmented/FieldFlowSegmented.js.map +1 -0
  44. package/lib/commonjs/components/FieldFlowSegmented/index.js +13 -0
  45. package/lib/commonjs/components/FieldFlowSegmented/index.js.map +1 -0
  46. package/lib/commonjs/components/FieldFlowSignature/FieldFlowSignature.js +200 -0
  47. package/lib/commonjs/components/FieldFlowSignature/FieldFlowSignature.js.map +1 -0
  48. package/lib/commonjs/components/FieldFlowSignature/index.js +13 -0
  49. package/lib/commonjs/components/FieldFlowSignature/index.js.map +1 -0
  50. package/lib/commonjs/components/FieldFlowSlider/FieldFlowSlider.js +178 -0
  51. package/lib/commonjs/components/FieldFlowSlider/FieldFlowSlider.js.map +1 -0
  52. package/lib/commonjs/components/FieldFlowSlider/index.js +13 -0
  53. package/lib/commonjs/components/FieldFlowSlider/index.js.map +1 -0
  54. package/lib/commonjs/components/FieldFlowStepper/FieldFlowStepper.js +166 -0
  55. package/lib/commonjs/components/FieldFlowStepper/FieldFlowStepper.js.map +1 -0
  56. package/lib/commonjs/components/FieldFlowStepper/index.js +13 -0
  57. package/lib/commonjs/components/FieldFlowStepper/index.js.map +1 -0
  58. package/lib/commonjs/components/FieldFlowTags/FieldFlowTags.js +240 -0
  59. package/lib/commonjs/components/FieldFlowTags/FieldFlowTags.js.map +1 -0
  60. package/lib/commonjs/components/FieldFlowTags/index.js +13 -0
  61. package/lib/commonjs/components/FieldFlowTags/index.js.map +1 -0
  62. package/lib/commonjs/components/FieldFlowTypeahead/FieldFlowTypeahead.js +227 -0
  63. package/lib/commonjs/components/FieldFlowTypeahead/FieldFlowTypeahead.js.map +1 -0
  64. package/lib/commonjs/components/FieldFlowTypeahead/index.js +13 -0
  65. package/lib/commonjs/components/FieldFlowTypeahead/index.js.map +1 -0
  66. package/lib/commonjs/components/FieldFlowUpload/FieldFlowUpload.js +191 -0
  67. package/lib/commonjs/components/FieldFlowUpload/FieldFlowUpload.js.map +1 -0
  68. package/lib/commonjs/components/FieldFlowUpload/index.js +13 -0
  69. package/lib/commonjs/components/FieldFlowUpload/index.js.map +1 -0
  70. package/lib/commonjs/hooks/index.js +35 -0
  71. package/lib/commonjs/hooks/index.js.map +1 -1
  72. package/lib/commonjs/hooks/useFieldFlowArray.js +110 -0
  73. package/lib/commonjs/hooks/useFieldFlowArray.js.map +1 -0
  74. package/lib/commonjs/hooks/useFieldFlowDirtyGuard.js +53 -0
  75. package/lib/commonjs/hooks/useFieldFlowDirtyGuard.js.map +1 -0
  76. package/lib/commonjs/hooks/useFieldFlowDraft.js +168 -0
  77. package/lib/commonjs/hooks/useFieldFlowDraft.js.map +1 -0
  78. package/lib/commonjs/hooks/useFieldFlowForm.js +224 -30
  79. package/lib/commonjs/hooks/useFieldFlowForm.js.map +1 -1
  80. package/lib/commonjs/hooks/useFieldFlowSteps.js +77 -0
  81. package/lib/commonjs/hooks/useFieldFlowSteps.js.map +1 -0
  82. package/lib/commonjs/hooks/useFormIntelligence.js +130 -0
  83. package/lib/commonjs/hooks/useFormIntelligence.js.map +1 -0
  84. package/lib/commonjs/i18n/index.js +25 -0
  85. package/lib/commonjs/i18n/index.js.map +1 -0
  86. package/lib/commonjs/i18n/messages.js +88 -0
  87. package/lib/commonjs/i18n/messages.js.map +1 -0
  88. package/lib/commonjs/index.js +322 -0
  89. package/lib/commonjs/index.js.map +1 -1
  90. package/lib/commonjs/intelligence/formAccessibility.js +79 -0
  91. package/lib/commonjs/intelligence/formAccessibility.js.map +1 -0
  92. package/lib/commonjs/intelligence/index.js +31 -0
  93. package/lib/commonjs/intelligence/index.js.map +1 -0
  94. package/lib/commonjs/intelligence/types.js +2 -0
  95. package/lib/commonjs/intelligence/types.js.map +1 -0
  96. package/lib/commonjs/motion/index.js +20 -0
  97. package/lib/commonjs/motion/index.js.map +1 -0
  98. package/lib/commonjs/motion/useFieldMotion.js +111 -0
  99. package/lib/commonjs/motion/useFieldMotion.js.map +1 -0
  100. package/lib/commonjs/motion/useReducedMotion.js +32 -0
  101. package/lib/commonjs/motion/useReducedMotion.js.map +1 -0
  102. package/lib/commonjs/theme/index.js +13 -0
  103. package/lib/commonjs/theme/index.js.map +1 -1
  104. package/lib/commonjs/theme/presets.js +142 -0
  105. package/lib/commonjs/theme/presets.js.map +1 -0
  106. package/lib/commonjs/utils/affordance.js +151 -0
  107. package/lib/commonjs/utils/affordance.js.map +1 -0
  108. package/lib/commonjs/utils/passwordStrength.js +79 -0
  109. package/lib/commonjs/utils/passwordStrength.js.map +1 -0
  110. package/lib/commonjs/utils/phoneCountries.js +119 -0
  111. package/lib/commonjs/utils/phoneCountries.js.map +1 -0
  112. package/lib/commonjs/validation/validators.js +10 -7
  113. package/lib/commonjs/validation/validators.js.map +1 -1
  114. package/lib/module/adapters/index.js +4 -0
  115. package/lib/module/adapters/index.js.map +1 -0
  116. package/lib/module/adapters/reactHookForm.js +100 -0
  117. package/lib/module/adapters/reactHookForm.js.map +1 -0
  118. package/lib/module/components/FieldFlowAffordance/FieldFlowAffordance.js +99 -0
  119. package/lib/module/components/FieldFlowAffordance/FieldFlowAffordance.js.map +1 -0
  120. package/lib/module/components/FieldFlowAffordance/index.js +4 -0
  121. package/lib/module/components/FieldFlowAffordance/index.js.map +1 -0
  122. package/lib/module/components/FieldFlowCreditCard/FieldFlowCreditCard.js +141 -0
  123. package/lib/module/components/FieldFlowCreditCard/FieldFlowCreditCard.js.map +1 -0
  124. package/lib/module/components/FieldFlowCreditCard/index.js +4 -0
  125. package/lib/module/components/FieldFlowCreditCard/index.js.map +1 -0
  126. package/lib/module/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js +151 -0
  127. package/lib/module/components/FieldFlowDraftBanner/FieldFlowDraftBanner.js.map +1 -0
  128. package/lib/module/components/FieldFlowDraftBanner/index.js +4 -0
  129. package/lib/module/components/FieldFlowDraftBanner/index.js.map +1 -0
  130. package/lib/module/components/FieldFlowInput/FieldFlowInput.js +144 -44
  131. package/lib/module/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  132. package/lib/module/components/FieldFlowInput/styles.js +16 -0
  133. package/lib/module/components/FieldFlowInput/styles.js.map +1 -1
  134. package/lib/module/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js +131 -0
  135. package/lib/module/components/FieldFlowNumberStepper/FieldFlowNumberStepper.js.map +1 -0
  136. package/lib/module/components/FieldFlowNumberStepper/index.js +4 -0
  137. package/lib/module/components/FieldFlowNumberStepper/index.js.map +1 -0
  138. package/lib/module/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js +117 -0
  139. package/lib/module/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.js.map +1 -0
  140. package/lib/module/components/FieldFlowPasswordStrength/index.js +4 -0
  141. package/lib/module/components/FieldFlowPasswordStrength/index.js.map +1 -0
  142. package/lib/module/components/FieldFlowPhone/FieldFlowPhone.js +258 -0
  143. package/lib/module/components/FieldFlowPhone/FieldFlowPhone.js.map +1 -0
  144. package/lib/module/components/FieldFlowPhone/index.js +4 -0
  145. package/lib/module/components/FieldFlowPhone/index.js.map +1 -0
  146. package/lib/module/components/FieldFlowRating/FieldFlowRating.js +101 -0
  147. package/lib/module/components/FieldFlowRating/FieldFlowRating.js.map +1 -0
  148. package/lib/module/components/FieldFlowRating/index.js +4 -0
  149. package/lib/module/components/FieldFlowRating/index.js.map +1 -0
  150. package/lib/module/components/FieldFlowSection/FieldFlowSection.js +136 -0
  151. package/lib/module/components/FieldFlowSection/FieldFlowSection.js.map +1 -0
  152. package/lib/module/components/FieldFlowSection/index.js +4 -0
  153. package/lib/module/components/FieldFlowSection/index.js.map +1 -0
  154. package/lib/module/components/FieldFlowSegmented/FieldFlowSegmented.js +190 -0
  155. package/lib/module/components/FieldFlowSegmented/FieldFlowSegmented.js.map +1 -0
  156. package/lib/module/components/FieldFlowSegmented/index.js +4 -0
  157. package/lib/module/components/FieldFlowSegmented/index.js.map +1 -0
  158. package/lib/module/components/FieldFlowSignature/FieldFlowSignature.js +195 -0
  159. package/lib/module/components/FieldFlowSignature/FieldFlowSignature.js.map +1 -0
  160. package/lib/module/components/FieldFlowSignature/index.js +4 -0
  161. package/lib/module/components/FieldFlowSignature/index.js.map +1 -0
  162. package/lib/module/components/FieldFlowSlider/FieldFlowSlider.js +173 -0
  163. package/lib/module/components/FieldFlowSlider/FieldFlowSlider.js.map +1 -0
  164. package/lib/module/components/FieldFlowSlider/index.js +4 -0
  165. package/lib/module/components/FieldFlowSlider/index.js.map +1 -0
  166. package/lib/module/components/FieldFlowStepper/FieldFlowStepper.js +161 -0
  167. package/lib/module/components/FieldFlowStepper/FieldFlowStepper.js.map +1 -0
  168. package/lib/module/components/FieldFlowStepper/index.js +4 -0
  169. package/lib/module/components/FieldFlowStepper/index.js.map +1 -0
  170. package/lib/module/components/FieldFlowTags/FieldFlowTags.js +235 -0
  171. package/lib/module/components/FieldFlowTags/FieldFlowTags.js.map +1 -0
  172. package/lib/module/components/FieldFlowTags/index.js +4 -0
  173. package/lib/module/components/FieldFlowTags/index.js.map +1 -0
  174. package/lib/module/components/FieldFlowTypeahead/FieldFlowTypeahead.js +222 -0
  175. package/lib/module/components/FieldFlowTypeahead/FieldFlowTypeahead.js.map +1 -0
  176. package/lib/module/components/FieldFlowTypeahead/index.js +4 -0
  177. package/lib/module/components/FieldFlowTypeahead/index.js.map +1 -0
  178. package/lib/module/components/FieldFlowUpload/FieldFlowUpload.js +186 -0
  179. package/lib/module/components/FieldFlowUpload/FieldFlowUpload.js.map +1 -0
  180. package/lib/module/components/FieldFlowUpload/index.js +4 -0
  181. package/lib/module/components/FieldFlowUpload/index.js.map +1 -0
  182. package/lib/module/hooks/index.js +5 -0
  183. package/lib/module/hooks/index.js.map +1 -1
  184. package/lib/module/hooks/useFieldFlowArray.js +106 -0
  185. package/lib/module/hooks/useFieldFlowArray.js.map +1 -0
  186. package/lib/module/hooks/useFieldFlowDirtyGuard.js +49 -0
  187. package/lib/module/hooks/useFieldFlowDirtyGuard.js.map +1 -0
  188. package/lib/module/hooks/useFieldFlowDraft.js +165 -0
  189. package/lib/module/hooks/useFieldFlowDraft.js.map +1 -0
  190. package/lib/module/hooks/useFieldFlowForm.js +224 -30
  191. package/lib/module/hooks/useFieldFlowForm.js.map +1 -1
  192. package/lib/module/hooks/useFieldFlowSteps.js +73 -0
  193. package/lib/module/hooks/useFieldFlowSteps.js.map +1 -0
  194. package/lib/module/hooks/useFormIntelligence.js +126 -0
  195. package/lib/module/hooks/useFormIntelligence.js.map +1 -0
  196. package/lib/module/i18n/index.js +4 -0
  197. package/lib/module/i18n/index.js.map +1 -0
  198. package/lib/module/i18n/messages.js +82 -0
  199. package/lib/module/i18n/messages.js.map +1 -0
  200. package/lib/module/index.js +31 -2
  201. package/lib/module/index.js.map +1 -1
  202. package/lib/module/intelligence/formAccessibility.js +72 -0
  203. package/lib/module/intelligence/formAccessibility.js.map +1 -0
  204. package/lib/module/intelligence/index.js +4 -0
  205. package/lib/module/intelligence/index.js.map +1 -0
  206. package/lib/module/intelligence/types.js +2 -0
  207. package/lib/module/intelligence/types.js.map +1 -0
  208. package/lib/module/motion/index.js +5 -0
  209. package/lib/module/motion/index.js.map +1 -0
  210. package/lib/module/motion/useFieldMotion.js +107 -0
  211. package/lib/module/motion/useFieldMotion.js.map +1 -0
  212. package/lib/module/motion/useReducedMotion.js +29 -0
  213. package/lib/module/motion/useReducedMotion.js.map +1 -0
  214. package/lib/module/theme/index.js +1 -0
  215. package/lib/module/theme/index.js.map +1 -1
  216. package/lib/module/theme/presets.js +138 -0
  217. package/lib/module/theme/presets.js.map +1 -0
  218. package/lib/module/utils/affordance.js +140 -0
  219. package/lib/module/utils/affordance.js.map +1 -0
  220. package/lib/module/utils/passwordStrength.js +74 -0
  221. package/lib/module/utils/passwordStrength.js.map +1 -0
  222. package/lib/module/utils/phoneCountries.js +113 -0
  223. package/lib/module/utils/phoneCountries.js.map +1 -0
  224. package/lib/module/validation/validators.js +10 -7
  225. package/lib/module/validation/validators.js.map +1 -1
  226. package/lib/typescript/adapters/index.d.ts +3 -0
  227. package/lib/typescript/adapters/index.d.ts.map +1 -0
  228. package/lib/typescript/adapters/reactHookForm.d.ts +56 -0
  229. package/lib/typescript/adapters/reactHookForm.d.ts.map +1 -0
  230. package/lib/typescript/components/FieldFlowAffordance/FieldFlowAffordance.d.ts +29 -0
  231. package/lib/typescript/components/FieldFlowAffordance/FieldFlowAffordance.d.ts.map +1 -0
  232. package/lib/typescript/components/FieldFlowAffordance/index.d.ts +3 -0
  233. package/lib/typescript/components/FieldFlowAffordance/index.d.ts.map +1 -0
  234. package/lib/typescript/components/FieldFlowCreditCard/FieldFlowCreditCard.d.ts +27 -0
  235. package/lib/typescript/components/FieldFlowCreditCard/FieldFlowCreditCard.d.ts.map +1 -0
  236. package/lib/typescript/components/FieldFlowCreditCard/index.d.ts +3 -0
  237. package/lib/typescript/components/FieldFlowCreditCard/index.d.ts.map +1 -0
  238. package/lib/typescript/components/FieldFlowDraftBanner/FieldFlowDraftBanner.d.ts +24 -0
  239. package/lib/typescript/components/FieldFlowDraftBanner/FieldFlowDraftBanner.d.ts.map +1 -0
  240. package/lib/typescript/components/FieldFlowDraftBanner/index.d.ts +3 -0
  241. package/lib/typescript/components/FieldFlowDraftBanner/index.d.ts.map +1 -0
  242. package/lib/typescript/components/FieldFlowInput/FieldFlowInput.d.ts.map +1 -1
  243. package/lib/typescript/components/FieldFlowInput/styles.d.ts +16 -0
  244. package/lib/typescript/components/FieldFlowInput/styles.d.ts.map +1 -1
  245. package/lib/typescript/components/FieldFlowInput/types.d.ts +32 -0
  246. package/lib/typescript/components/FieldFlowInput/types.d.ts.map +1 -1
  247. package/lib/typescript/components/FieldFlowNumberStepper/FieldFlowNumberStepper.d.ts +34 -0
  248. package/lib/typescript/components/FieldFlowNumberStepper/FieldFlowNumberStepper.d.ts.map +1 -0
  249. package/lib/typescript/components/FieldFlowNumberStepper/index.d.ts +3 -0
  250. package/lib/typescript/components/FieldFlowNumberStepper/index.d.ts.map +1 -0
  251. package/lib/typescript/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.d.ts +26 -0
  252. package/lib/typescript/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.d.ts.map +1 -0
  253. package/lib/typescript/components/FieldFlowPasswordStrength/index.d.ts +3 -0
  254. package/lib/typescript/components/FieldFlowPasswordStrength/index.d.ts.map +1 -0
  255. package/lib/typescript/components/FieldFlowPhone/FieldFlowPhone.d.ts +40 -0
  256. package/lib/typescript/components/FieldFlowPhone/FieldFlowPhone.d.ts.map +1 -0
  257. package/lib/typescript/components/FieldFlowPhone/index.d.ts +3 -0
  258. package/lib/typescript/components/FieldFlowPhone/index.d.ts.map +1 -0
  259. package/lib/typescript/components/FieldFlowRating/FieldFlowRating.d.ts +30 -0
  260. package/lib/typescript/components/FieldFlowRating/FieldFlowRating.d.ts.map +1 -0
  261. package/lib/typescript/components/FieldFlowRating/index.d.ts +3 -0
  262. package/lib/typescript/components/FieldFlowRating/index.d.ts.map +1 -0
  263. package/lib/typescript/components/FieldFlowSection/FieldFlowSection.d.ts +35 -0
  264. package/lib/typescript/components/FieldFlowSection/FieldFlowSection.d.ts.map +1 -0
  265. package/lib/typescript/components/FieldFlowSection/index.d.ts +3 -0
  266. package/lib/typescript/components/FieldFlowSection/index.d.ts.map +1 -0
  267. package/lib/typescript/components/FieldFlowSegmented/FieldFlowSegmented.d.ts +28 -0
  268. package/lib/typescript/components/FieldFlowSegmented/FieldFlowSegmented.d.ts.map +1 -0
  269. package/lib/typescript/components/FieldFlowSegmented/index.d.ts +3 -0
  270. package/lib/typescript/components/FieldFlowSegmented/index.d.ts.map +1 -0
  271. package/lib/typescript/components/FieldFlowSignature/FieldFlowSignature.d.ts +41 -0
  272. package/lib/typescript/components/FieldFlowSignature/FieldFlowSignature.d.ts.map +1 -0
  273. package/lib/typescript/components/FieldFlowSignature/index.d.ts +3 -0
  274. package/lib/typescript/components/FieldFlowSignature/index.d.ts.map +1 -0
  275. package/lib/typescript/components/FieldFlowSlider/FieldFlowSlider.d.ts +30 -0
  276. package/lib/typescript/components/FieldFlowSlider/FieldFlowSlider.d.ts.map +1 -0
  277. package/lib/typescript/components/FieldFlowSlider/index.d.ts +3 -0
  278. package/lib/typescript/components/FieldFlowSlider/index.d.ts.map +1 -0
  279. package/lib/typescript/components/FieldFlowStepper/FieldFlowStepper.d.ts +31 -0
  280. package/lib/typescript/components/FieldFlowStepper/FieldFlowStepper.d.ts.map +1 -0
  281. package/lib/typescript/components/FieldFlowStepper/index.d.ts +3 -0
  282. package/lib/typescript/components/FieldFlowStepper/index.d.ts.map +1 -0
  283. package/lib/typescript/components/FieldFlowTags/FieldFlowTags.d.ts +41 -0
  284. package/lib/typescript/components/FieldFlowTags/FieldFlowTags.d.ts.map +1 -0
  285. package/lib/typescript/components/FieldFlowTags/index.d.ts +3 -0
  286. package/lib/typescript/components/FieldFlowTags/index.d.ts.map +1 -0
  287. package/lib/typescript/components/FieldFlowTypeahead/FieldFlowTypeahead.d.ts +43 -0
  288. package/lib/typescript/components/FieldFlowTypeahead/FieldFlowTypeahead.d.ts.map +1 -0
  289. package/lib/typescript/components/FieldFlowTypeahead/index.d.ts +3 -0
  290. package/lib/typescript/components/FieldFlowTypeahead/index.d.ts.map +1 -0
  291. package/lib/typescript/components/FieldFlowUpload/FieldFlowUpload.d.ts +52 -0
  292. package/lib/typescript/components/FieldFlowUpload/FieldFlowUpload.d.ts.map +1 -0
  293. package/lib/typescript/components/FieldFlowUpload/index.d.ts +3 -0
  294. package/lib/typescript/components/FieldFlowUpload/index.d.ts.map +1 -0
  295. package/lib/typescript/hooks/index.d.ts +11 -1
  296. package/lib/typescript/hooks/index.d.ts.map +1 -1
  297. package/lib/typescript/hooks/useFieldFlowArray.d.ts +54 -0
  298. package/lib/typescript/hooks/useFieldFlowArray.d.ts.map +1 -0
  299. package/lib/typescript/hooks/useFieldFlowDirtyGuard.d.ts +26 -0
  300. package/lib/typescript/hooks/useFieldFlowDirtyGuard.d.ts.map +1 -0
  301. package/lib/typescript/hooks/useFieldFlowDraft.d.ts +64 -0
  302. package/lib/typescript/hooks/useFieldFlowDraft.d.ts.map +1 -0
  303. package/lib/typescript/hooks/useFieldFlowForm.d.ts +80 -2
  304. package/lib/typescript/hooks/useFieldFlowForm.d.ts.map +1 -1
  305. package/lib/typescript/hooks/useFieldFlowSteps.d.ts +42 -0
  306. package/lib/typescript/hooks/useFieldFlowSteps.d.ts.map +1 -0
  307. package/lib/typescript/hooks/useFormIntelligence.d.ts +23 -0
  308. package/lib/typescript/hooks/useFormIntelligence.d.ts.map +1 -0
  309. package/lib/typescript/i18n/index.d.ts +3 -0
  310. package/lib/typescript/i18n/index.d.ts.map +1 -0
  311. package/lib/typescript/i18n/messages.d.ts +16 -0
  312. package/lib/typescript/i18n/messages.d.ts.map +1 -0
  313. package/lib/typescript/index.d.ts +48 -4
  314. package/lib/typescript/index.d.ts.map +1 -1
  315. package/lib/typescript/intelligence/formAccessibility.d.ts +21 -0
  316. package/lib/typescript/intelligence/formAccessibility.d.ts.map +1 -0
  317. package/lib/typescript/intelligence/index.d.ts +4 -0
  318. package/lib/typescript/intelligence/index.d.ts.map +1 -0
  319. package/lib/typescript/intelligence/types.d.ts +36 -0
  320. package/lib/typescript/intelligence/types.d.ts.map +1 -0
  321. package/lib/typescript/motion/index.d.ts +4 -0
  322. package/lib/typescript/motion/index.d.ts.map +1 -0
  323. package/lib/typescript/motion/useFieldMotion.d.ts +31 -0
  324. package/lib/typescript/motion/useFieldMotion.d.ts.map +1 -0
  325. package/lib/typescript/motion/useReducedMotion.d.ts +5 -0
  326. package/lib/typescript/motion/useReducedMotion.d.ts.map +1 -0
  327. package/lib/typescript/theme/index.d.ts +2 -0
  328. package/lib/typescript/theme/index.d.ts.map +1 -1
  329. package/lib/typescript/theme/presets.d.ts +134 -0
  330. package/lib/typescript/theme/presets.d.ts.map +1 -0
  331. package/lib/typescript/utils/affordance.d.ts +36 -0
  332. package/lib/typescript/utils/affordance.d.ts.map +1 -0
  333. package/lib/typescript/utils/passwordStrength.d.ts +26 -0
  334. package/lib/typescript/utils/passwordStrength.d.ts.map +1 -0
  335. package/lib/typescript/utils/phoneCountries.d.ts +12 -0
  336. package/lib/typescript/utils/phoneCountries.d.ts.map +1 -0
  337. package/lib/typescript/validation/validators.d.ts +3 -1
  338. package/lib/typescript/validation/validators.d.ts.map +1 -1
  339. package/package.json +19 -2
  340. package/src/adapters/index.ts +9 -0
  341. package/src/adapters/reactHookForm.tsx +152 -0
  342. package/src/components/FieldFlowAffordance/FieldFlowAffordance.tsx +143 -0
  343. package/src/components/FieldFlowAffordance/index.ts +2 -0
  344. package/src/components/FieldFlowCreditCard/FieldFlowCreditCard.tsx +152 -0
  345. package/src/components/FieldFlowCreditCard/index.ts +2 -0
  346. package/src/components/FieldFlowDraftBanner/FieldFlowDraftBanner.tsx +169 -0
  347. package/src/components/FieldFlowDraftBanner/index.ts +2 -0
  348. package/src/components/FieldFlowInput/FieldFlowInput.tsx +174 -53
  349. package/src/components/FieldFlowInput/styles.ts +16 -0
  350. package/src/components/FieldFlowInput/types.ts +33 -0
  351. package/src/components/FieldFlowNumberStepper/FieldFlowNumberStepper.tsx +156 -0
  352. package/src/components/FieldFlowNumberStepper/index.ts +2 -0
  353. package/src/components/FieldFlowPasswordStrength/FieldFlowPasswordStrength.tsx +148 -0
  354. package/src/components/FieldFlowPasswordStrength/index.ts +2 -0
  355. package/src/components/FieldFlowPhone/FieldFlowPhone.tsx +298 -0
  356. package/src/components/FieldFlowPhone/index.ts +2 -0
  357. package/src/components/FieldFlowRating/FieldFlowRating.tsx +121 -0
  358. package/src/components/FieldFlowRating/index.ts +2 -0
  359. package/src/components/FieldFlowSection/FieldFlowSection.tsx +176 -0
  360. package/src/components/FieldFlowSection/index.ts +2 -0
  361. package/src/components/FieldFlowSegmented/FieldFlowSegmented.tsx +248 -0
  362. package/src/components/FieldFlowSegmented/index.ts +2 -0
  363. package/src/components/FieldFlowSignature/FieldFlowSignature.tsx +241 -0
  364. package/src/components/FieldFlowSignature/index.ts +7 -0
  365. package/src/components/FieldFlowSlider/FieldFlowSlider.tsx +190 -0
  366. package/src/components/FieldFlowSlider/index.ts +2 -0
  367. package/src/components/FieldFlowStepper/FieldFlowStepper.tsx +190 -0
  368. package/src/components/FieldFlowStepper/index.ts +2 -0
  369. package/src/components/FieldFlowTags/FieldFlowTags.tsx +319 -0
  370. package/src/components/FieldFlowTags/index.ts +2 -0
  371. package/src/components/FieldFlowTypeahead/FieldFlowTypeahead.tsx +261 -0
  372. package/src/components/FieldFlowTypeahead/index.ts +2 -0
  373. package/src/components/FieldFlowUpload/FieldFlowUpload.tsx +226 -0
  374. package/src/components/FieldFlowUpload/index.ts +6 -0
  375. package/src/hooks/index.ts +31 -0
  376. package/src/hooks/useFieldFlowArray.ts +153 -0
  377. package/src/hooks/useFieldFlowDirtyGuard.ts +70 -0
  378. package/src/hooks/useFieldFlowDraft.ts +221 -0
  379. package/src/hooks/useFieldFlowForm.ts +357 -28
  380. package/src/hooks/useFieldFlowSteps.ts +130 -0
  381. package/src/hooks/useFormIntelligence.ts +207 -0
  382. package/src/i18n/index.ts +6 -0
  383. package/src/i18n/messages.ts +101 -0
  384. package/src/index.ts +161 -3
  385. package/src/intelligence/formAccessibility.ts +87 -0
  386. package/src/intelligence/index.ts +12 -0
  387. package/src/intelligence/types.ts +34 -0
  388. package/src/motion/index.ts +3 -0
  389. package/src/motion/useFieldMotion.ts +120 -0
  390. package/src/motion/useReducedMotion.ts +31 -0
  391. package/src/theme/index.ts +2 -0
  392. package/src/theme/presets.ts +120 -0
  393. package/src/utils/affordance.ts +138 -0
  394. package/src/utils/passwordStrength.ts +109 -0
  395. package/src/utils/phoneCountries.ts +44 -0
  396. package/src/validation/validators.ts +17 -7
@@ -0,0 +1,298 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import {
3
+ FlatList,
4
+ Modal,
5
+ Pressable,
6
+ StyleSheet,
7
+ Text,
8
+ TextInput,
9
+ View,
10
+ type TextStyle,
11
+ type ViewStyle,
12
+ } from 'react-native';
13
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
14
+ import { defaultTheme } from '../../theme/defaultTheme';
15
+ import { renderFieldFlowIcon } from '../../icons/renderIcon';
16
+ import {
17
+ DEFAULT_COUNTRY_DIALS,
18
+ composeE164,
19
+ findCountryByCode,
20
+ type FieldFlowCountryDial,
21
+ } from '../../utils/phoneCountries';
22
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
23
+
24
+ export interface FieldFlowPhoneValue {
25
+ countryCode: string;
26
+ dialCode: string;
27
+ nationalNumber: string;
28
+ /** E.164-ish composed value, e.g. +15551234567 */
29
+ e164: string;
30
+ }
31
+
32
+ export interface FieldFlowPhoneProps {
33
+ value?: Partial<FieldFlowPhoneValue> | null;
34
+ onChange: (value: FieldFlowPhoneValue) => void;
35
+ label?: string;
36
+ helperText?: string;
37
+ errorText?: string;
38
+ placeholder?: string;
39
+ disabled?: boolean;
40
+ required?: boolean;
41
+ defaultCountryCode?: string;
42
+ countries?: FieldFlowCountryDial[];
43
+ /** Custom country row in the picker sheet. Call `select()` to choose. */
44
+ renderCountryOption?: (ctx: {
45
+ country: FieldFlowCountryDial;
46
+ selected: boolean;
47
+ select: () => void;
48
+ }) => React.ReactNode;
49
+ /** Custom dial-code trigger button. */
50
+ renderDialButton?: (ctx: {
51
+ country: FieldFlowCountryDial;
52
+ open: () => void;
53
+ }) => React.ReactNode;
54
+ containerStyle?: ViewStyle;
55
+ labelStyle?: TextStyle;
56
+ theme?: DeepPartial<FieldFlowTheme>;
57
+ testID?: string;
58
+ }
59
+
60
+ export function FieldFlowPhone({
61
+ value,
62
+ onChange,
63
+ label,
64
+ helperText,
65
+ errorText,
66
+ placeholder = 'Phone number',
67
+ disabled,
68
+ required,
69
+ defaultCountryCode = 'US',
70
+ countries = DEFAULT_COUNTRY_DIALS,
71
+ renderCountryOption,
72
+ renderDialButton,
73
+ containerStyle,
74
+ labelStyle,
75
+ theme: themeOverride,
76
+ testID,
77
+ }: FieldFlowPhoneProps) {
78
+ const contextTheme = useFieldFlowTheme();
79
+ const theme = useMemo(
80
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
81
+ [contextTheme, themeOverride],
82
+ );
83
+ const styles = useMemo(() => createStyles(theme, Boolean(errorText), Boolean(disabled)), [theme, errorText, disabled]);
84
+
85
+ const countryCode = value?.countryCode ?? defaultCountryCode;
86
+ const country = findCountryByCode(countryCode, countries) ?? countries[0];
87
+ const national = value?.nationalNumber ?? '';
88
+ const [open, setOpen] = useState(false);
89
+ const [query, setQuery] = useState('');
90
+
91
+ const emit = (nextCountry: FieldFlowCountryDial, nextNational: string) => {
92
+ onChange({
93
+ countryCode: nextCountry.code,
94
+ dialCode: nextCountry.dial,
95
+ nationalNumber: nextNational,
96
+ e164: composeE164(nextCountry.dial, nextNational),
97
+ });
98
+ };
99
+
100
+ const filtered = useMemo(() => {
101
+ const q = query.trim().toLowerCase();
102
+ if (!q) return countries;
103
+ return countries.filter(
104
+ c =>
105
+ c.name.toLowerCase().includes(q) ||
106
+ c.dial.includes(q) ||
107
+ c.code.toLowerCase().includes(q),
108
+ );
109
+ }, [countries, query]);
110
+
111
+ return (
112
+ <View style={[styles.wrap, containerStyle]} testID={testID}>
113
+ {label ? (
114
+ <Text style={[styles.label, labelStyle]}>
115
+ {label}
116
+ {required ? ' *' : ''}
117
+ </Text>
118
+ ) : null}
119
+
120
+ <View style={styles.row}>
121
+ {country && renderDialButton ? (
122
+ renderDialButton({
123
+ country,
124
+ open: () => {
125
+ setQuery('');
126
+ setOpen(true);
127
+ },
128
+ })
129
+ ) : (
130
+ <Pressable
131
+ style={styles.dialBtn}
132
+ disabled={disabled}
133
+ onPress={() => {
134
+ setQuery('');
135
+ setOpen(true);
136
+ }}
137
+ accessibilityRole="button"
138
+ accessibilityLabel="Country code"
139
+ >
140
+ <Text style={styles.flag}>{country?.flag ?? ''}</Text>
141
+ <Text style={styles.dial}>{country?.dial ?? '+1'}</Text>
142
+ {renderFieldFlowIcon('chevronDown', theme.colors.icon, 14)}
143
+ </Pressable>
144
+ )}
145
+
146
+ <TextInput
147
+ style={styles.input}
148
+ value={national}
149
+ onChangeText={text => country && emit(country, text.replace(/[^\d\s()-]/g, ''))}
150
+ placeholder={placeholder}
151
+ placeholderTextColor={theme.colors.placeholder}
152
+ keyboardType="phone-pad"
153
+ editable={!disabled}
154
+ />
155
+ </View>
156
+
157
+ {errorText ? (
158
+ <Text style={styles.error}>{errorText}</Text>
159
+ ) : helperText ? (
160
+ <Text style={styles.helper}>{helperText}</Text>
161
+ ) : null}
162
+
163
+ <Modal visible={open} animationType="slide" transparent onRequestClose={() => setOpen(false)}>
164
+ <Pressable style={styles.backdrop} onPress={() => setOpen(false)} />
165
+ <View style={styles.sheet}>
166
+ <Text style={styles.sheetTitle}>Country</Text>
167
+ <TextInput
168
+ style={styles.search}
169
+ value={query}
170
+ onChangeText={setQuery}
171
+ placeholder="Search country or code"
172
+ placeholderTextColor={theme.colors.placeholder}
173
+ autoFocus
174
+ />
175
+ <FlatList
176
+ data={filtered}
177
+ keyExtractor={item => item.code}
178
+ keyboardShouldPersistTaps="handled"
179
+ renderItem={({ item }) => {
180
+ const select = () => {
181
+ emit(item, national);
182
+ setOpen(false);
183
+ };
184
+ if (renderCountryOption) {
185
+ return (
186
+ <>
187
+ {renderCountryOption({
188
+ country: item,
189
+ selected: item.code === country?.code,
190
+ select,
191
+ })}
192
+ </>
193
+ );
194
+ }
195
+ return (
196
+ <Pressable style={styles.option} onPress={select}>
197
+ <Text style={styles.flag}>{item.flag ?? ''}</Text>
198
+ <Text style={styles.optionName}>{item.name}</Text>
199
+ <Text style={styles.optionDial}>{item.dial}</Text>
200
+ </Pressable>
201
+ );
202
+ }}
203
+ />
204
+ </View>
205
+ </Modal>
206
+ </View>
207
+ );
208
+ }
209
+
210
+ function createStyles(theme: FieldFlowTheme, hasError: boolean, disabled: boolean) {
211
+ return StyleSheet.create({
212
+ wrap: { marginBottom: theme.spacing.gap * 2, opacity: disabled ? 0.6 : 1 },
213
+ label: {
214
+ fontSize: theme.typography.labelFontSize,
215
+ marginBottom: theme.spacing.gap / 1.5,
216
+ color: hasError ? theme.colors.error : theme.colors.label,
217
+ fontWeight: '500',
218
+ fontFamily: theme.typography.fontFamily,
219
+ },
220
+ row: {
221
+ flexDirection: 'row',
222
+ alignItems: 'center',
223
+ borderWidth: hasError ? theme.spacing.borderWidthFocused : theme.spacing.borderWidth,
224
+ borderColor: hasError ? theme.colors.borderError : theme.colors.border,
225
+ borderRadius: theme.spacing.borderRadius,
226
+ backgroundColor: theme.colors.background,
227
+ overflow: 'hidden',
228
+ },
229
+ dialBtn: {
230
+ flexDirection: 'row',
231
+ alignItems: 'center',
232
+ gap: 4,
233
+ paddingHorizontal: 12,
234
+ paddingVertical: theme.spacing.paddingVertical,
235
+ borderRightWidth: StyleSheet.hairlineWidth,
236
+ borderRightColor: theme.colors.border,
237
+ },
238
+ flag: { fontSize: 16 },
239
+ dial: {
240
+ fontSize: theme.typography.fontSize,
241
+ color: theme.colors.text,
242
+ fontWeight: '600',
243
+ marginRight: 2,
244
+ },
245
+ input: {
246
+ flex: 1,
247
+ fontSize: theme.typography.fontSize,
248
+ color: theme.colors.text,
249
+ paddingHorizontal: theme.spacing.paddingHorizontal,
250
+ paddingVertical: theme.spacing.paddingVertical,
251
+ fontFamily: theme.typography.fontFamily,
252
+ },
253
+ helper: {
254
+ marginTop: theme.spacing.gap / 1.5,
255
+ fontSize: theme.typography.helperFontSize,
256
+ color: theme.colors.label,
257
+ },
258
+ error: {
259
+ marginTop: theme.spacing.gap / 1.5,
260
+ fontSize: theme.typography.helperFontSize,
261
+ color: theme.colors.error,
262
+ },
263
+ backdrop: { flex: 1, backgroundColor: 'rgba(0,0,0,0.35)' },
264
+ sheet: {
265
+ maxHeight: '70%',
266
+ backgroundColor: theme.colors.background,
267
+ borderTopLeftRadius: 16,
268
+ borderTopRightRadius: 16,
269
+ padding: 16,
270
+ },
271
+ sheetTitle: {
272
+ fontSize: theme.typography.fontSize + 2,
273
+ fontWeight: '600',
274
+ color: theme.colors.text,
275
+ marginBottom: 10,
276
+ },
277
+ search: {
278
+ borderWidth: theme.spacing.borderWidth,
279
+ borderColor: theme.colors.border,
280
+ borderRadius: theme.spacing.borderRadius,
281
+ paddingHorizontal: 12,
282
+ paddingVertical: 10,
283
+ marginBottom: 8,
284
+ color: theme.colors.text,
285
+ fontSize: theme.typography.fontSize,
286
+ },
287
+ option: {
288
+ flexDirection: 'row',
289
+ alignItems: 'center',
290
+ paddingVertical: 12,
291
+ gap: 10,
292
+ borderBottomWidth: StyleSheet.hairlineWidth,
293
+ borderBottomColor: theme.colors.border,
294
+ },
295
+ optionName: { flex: 1, color: theme.colors.text, fontSize: theme.typography.fontSize },
296
+ optionDial: { color: theme.colors.label, fontWeight: '600' },
297
+ });
298
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowPhone } from './FieldFlowPhone';
2
+ export type { FieldFlowPhoneProps, FieldFlowPhoneValue } from './FieldFlowPhone';
@@ -0,0 +1,121 @@
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 FieldFlowRatingProps {
9
+ value?: number;
10
+ onChange: (value: number) => void;
11
+ /** Max stars. Default: 5. */
12
+ max?: number;
13
+ label?: string;
14
+ helperText?: string;
15
+ errorText?: string;
16
+ disabled?: boolean;
17
+ required?: boolean;
18
+ /** Allow clearing by tapping the selected star again. Default: true. */
19
+ clearable?: boolean;
20
+ size?: number;
21
+ /** Custom star glyph (emoji, SVG, image…). */
22
+ renderStar?: (ctx: {
23
+ index: number;
24
+ filled: boolean;
25
+ size: number;
26
+ color: string;
27
+ }) => React.ReactNode;
28
+ containerStyle?: ViewStyle;
29
+ labelStyle?: TextStyle;
30
+ theme?: DeepPartial<FieldFlowTheme>;
31
+ testID?: string;
32
+ }
33
+
34
+ export function FieldFlowRating({
35
+ value = 0,
36
+ onChange,
37
+ max = 5,
38
+ label,
39
+ helperText,
40
+ errorText,
41
+ disabled,
42
+ required,
43
+ clearable = true,
44
+ size = 28,
45
+ renderStar,
46
+ containerStyle,
47
+ labelStyle,
48
+ theme: themeOverride,
49
+ testID,
50
+ }: FieldFlowRatingProps) {
51
+ const contextTheme = useFieldFlowTheme();
52
+ const theme = useMemo(
53
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
54
+ [contextTheme, themeOverride],
55
+ );
56
+ const styles = useMemo(() => createStyles(theme, Boolean(errorText), Boolean(disabled)), [theme, errorText, disabled]);
57
+
58
+ return (
59
+ <View style={[styles.wrap, containerStyle]} testID={testID}>
60
+ {label ? (
61
+ <Text style={[styles.label, labelStyle]}>
62
+ {label}
63
+ {required ? ' *' : ''}
64
+ </Text>
65
+ ) : null}
66
+
67
+ <View style={styles.row} accessibilityRole="adjustable" accessibilityValue={{ min: 0, max, now: value }}>
68
+ {Array.from({ length: max }, (_, i) => {
69
+ const star = i + 1;
70
+ const filled = star <= value;
71
+ return (
72
+ <Pressable
73
+ key={star}
74
+ disabled={disabled}
75
+ hitSlop={6}
76
+ onPress={() => {
77
+ if (clearable && star === value) onChange(0);
78
+ else onChange(star);
79
+ }}
80
+ accessibilityLabel={`${star} star${star === 1 ? '' : 's'}`}
81
+ >
82
+ {renderStar
83
+ ? renderStar({
84
+ index: star,
85
+ filled,
86
+ size,
87
+ color: filled ? theme.colors.borderFocused : theme.colors.border,
88
+ })
89
+ : renderFieldFlowIcon(
90
+ 'star',
91
+ filled ? theme.colors.borderFocused : theme.colors.border,
92
+ size,
93
+ )}
94
+ </Pressable>
95
+ );
96
+ })}
97
+ </View>
98
+
99
+ {errorText ? (
100
+ <Text style={styles.error}>{errorText}</Text>
101
+ ) : helperText ? (
102
+ <Text style={styles.helper}>{helperText}</Text>
103
+ ) : null}
104
+ </View>
105
+ );
106
+ }
107
+
108
+ function createStyles(theme: FieldFlowTheme, hasError: boolean, disabled: boolean) {
109
+ return StyleSheet.create({
110
+ wrap: { marginBottom: theme.spacing.gap * 2, opacity: disabled ? 0.6 : 1 },
111
+ label: {
112
+ fontSize: theme.typography.labelFontSize,
113
+ marginBottom: theme.spacing.gap,
114
+ color: hasError ? theme.colors.error : theme.colors.label,
115
+ fontWeight: '500',
116
+ },
117
+ row: { flexDirection: 'row', alignItems: 'center', gap: 8 },
118
+ helper: { marginTop: 6, fontSize: theme.typography.helperFontSize, color: theme.colors.label },
119
+ error: { marginTop: 6, fontSize: theme.typography.helperFontSize, color: theme.colors.error },
120
+ });
121
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowRating } from './FieldFlowRating';
2
+ export type { FieldFlowRatingProps } from './FieldFlowRating';
@@ -0,0 +1,176 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import {
3
+ LayoutAnimation,
4
+ Platform,
5
+ Pressable,
6
+ StyleSheet,
7
+ Text,
8
+ UIManager,
9
+ View,
10
+ type TextStyle,
11
+ type ViewStyle,
12
+ } from 'react-native';
13
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
14
+ import { defaultTheme } from '../../theme/defaultTheme';
15
+ import { renderFieldFlowIcon, type FieldFlowIconSource } from '../../icons';
16
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
17
+
18
+ if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
19
+ UIManager.setLayoutAnimationEnabledExperimental(true);
20
+ }
21
+
22
+ export interface FieldFlowSectionProps {
23
+ title?: string;
24
+ description?: string;
25
+ /** Leading icon next to the title. */
26
+ icon?: FieldFlowIconSource;
27
+ children: React.ReactNode;
28
+ /** Soft card surface (default) vs flush / borderless. */
29
+ elevated?: boolean;
30
+ /** Allow collapsing the body. Default: false. */
31
+ collapsible?: boolean;
32
+ /** Initial open state when collapsible. Default: true. */
33
+ defaultOpen?: boolean;
34
+ /** Controlled open state. */
35
+ open?: boolean;
36
+ onOpenChange?: (open: boolean) => void;
37
+ /** Optional trailing header action (e.g. “Edit”). */
38
+ headerRight?: React.ReactNode;
39
+ containerStyle?: ViewStyle;
40
+ headerStyle?: ViewStyle;
41
+ bodyStyle?: ViewStyle;
42
+ titleStyle?: TextStyle;
43
+ descriptionStyle?: TextStyle;
44
+ theme?: DeepPartial<FieldFlowTheme>;
45
+ testID?: string;
46
+ }
47
+
48
+ /**
49
+ * Themed form surface — groups related fields into a designed card with
50
+ * optional icon, description, and collapse.
51
+ */
52
+ export function FieldFlowSection({
53
+ title,
54
+ description,
55
+ icon,
56
+ children,
57
+ elevated = true,
58
+ collapsible = false,
59
+ defaultOpen = true,
60
+ open: openProp,
61
+ onOpenChange,
62
+ headerRight,
63
+ containerStyle,
64
+ headerStyle,
65
+ bodyStyle,
66
+ titleStyle,
67
+ descriptionStyle,
68
+ theme: themeOverride,
69
+ testID,
70
+ }: FieldFlowSectionProps) {
71
+ const contextTheme = useFieldFlowTheme();
72
+ const theme = useMemo(
73
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
74
+ [contextTheme, themeOverride],
75
+ );
76
+ const styles = useMemo(() => createStyles(theme, elevated), [theme, elevated]);
77
+
78
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
79
+ const isControlled = openProp !== undefined;
80
+ const open = isControlled ? openProp : internalOpen;
81
+
82
+ const toggle = () => {
83
+ const next = !open;
84
+ LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
85
+ if (!isControlled) setInternalOpen(next);
86
+ onOpenChange?.(next);
87
+ };
88
+
89
+ const showHeader = Boolean(title || description || icon || headerRight || collapsible);
90
+
91
+ return (
92
+ <View style={[styles.card, containerStyle]} testID={testID}>
93
+ {showHeader ? (
94
+ <Pressable
95
+ onPress={collapsible ? toggle : undefined}
96
+ disabled={!collapsible}
97
+ style={[styles.header, headerStyle]}
98
+ accessibilityRole={collapsible ? 'button' : undefined}
99
+ accessibilityState={collapsible ? { expanded: open } : undefined}
100
+ >
101
+ {icon ? (
102
+ <View style={styles.iconWrap}>{renderFieldFlowIcon(icon, theme.colors.borderFocused, 18)}</View>
103
+ ) : null}
104
+ <View style={styles.headerCopy}>
105
+ {title ? <Text style={[styles.title, titleStyle]}>{title}</Text> : null}
106
+ {description ? <Text style={[styles.description, descriptionStyle]}>{description}</Text> : null}
107
+ </View>
108
+ {headerRight}
109
+ {collapsible
110
+ ? renderFieldFlowIcon(open ? 'chevronUp' : 'chevronDown', theme.colors.icon, 18)
111
+ : null}
112
+ </Pressable>
113
+ ) : null}
114
+
115
+ {(!collapsible || open) && <View style={[styles.body, bodyStyle]}>{children}</View>}
116
+ </View>
117
+ );
118
+ }
119
+
120
+ function createStyles(theme: FieldFlowTheme, elevated: boolean) {
121
+ return StyleSheet.create({
122
+ card: {
123
+ marginBottom: theme.spacing.gap * 2.5,
124
+ borderRadius: theme.spacing.borderRadius + 4,
125
+ backgroundColor: theme.colors.background,
126
+ borderWidth: elevated ? theme.spacing.borderWidth : 0,
127
+ borderColor: theme.colors.border,
128
+ overflow: 'hidden',
129
+ ...(elevated
130
+ ? {
131
+ shadowColor: '#000',
132
+ shadowOpacity: 0.06,
133
+ shadowRadius: 12,
134
+ shadowOffset: { width: 0, height: 4 },
135
+ elevation: 2,
136
+ }
137
+ : null),
138
+ },
139
+ header: {
140
+ flexDirection: 'row',
141
+ alignItems: 'center',
142
+ gap: theme.spacing.gap,
143
+ paddingHorizontal: theme.spacing.paddingHorizontal + 2,
144
+ paddingTop: theme.spacing.paddingVertical + 2,
145
+ paddingBottom: theme.spacing.paddingVertical / 1.5,
146
+ },
147
+ iconWrap: {
148
+ width: 36,
149
+ height: 36,
150
+ borderRadius: 10,
151
+ alignItems: 'center',
152
+ justifyContent: 'center',
153
+ backgroundColor: theme.colors.backgroundDisabled,
154
+ },
155
+ headerCopy: {
156
+ flex: 1,
157
+ },
158
+ title: {
159
+ fontSize: theme.typography.fontSize + 1,
160
+ fontWeight: '600',
161
+ color: theme.colors.text,
162
+ fontFamily: theme.typography.fontFamily,
163
+ },
164
+ description: {
165
+ marginTop: 2,
166
+ fontSize: theme.typography.helperFontSize,
167
+ color: theme.colors.label,
168
+ fontFamily: theme.typography.fontFamily,
169
+ },
170
+ body: {
171
+ paddingHorizontal: theme.spacing.paddingHorizontal + 2,
172
+ paddingBottom: theme.spacing.paddingVertical + 4,
173
+ paddingTop: theme.spacing.gap,
174
+ },
175
+ });
176
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowSection } from './FieldFlowSection';
2
+ export type { FieldFlowSectionProps } from './FieldFlowSection';