rn-inputforge 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/README.md +236 -0
  2. package/lib/commonjs/a11y/audit.js +72 -0
  3. package/lib/commonjs/a11y/audit.js.map +1 -0
  4. package/lib/commonjs/a11y/index.js +13 -0
  5. package/lib/commonjs/a11y/index.js.map +1 -0
  6. package/lib/commonjs/autofill/index.js +25 -0
  7. package/lib/commonjs/autofill/index.js.map +1 -0
  8. package/lib/commonjs/autofill/profiles.js +199 -0
  9. package/lib/commonjs/autofill/profiles.js.map +1 -0
  10. package/lib/commonjs/components/FieldFlowA11yAudit/FieldFlowA11yAudit.js +99 -0
  11. package/lib/commonjs/components/FieldFlowA11yAudit/FieldFlowA11yAudit.js.map +1 -0
  12. package/lib/commonjs/components/FieldFlowA11yAudit/index.js +13 -0
  13. package/lib/commonjs/components/FieldFlowA11yAudit/index.js.map +1 -0
  14. package/lib/commonjs/components/FieldFlowAuthActions/FieldFlowAuthActions.js +130 -0
  15. package/lib/commonjs/components/FieldFlowAuthActions/FieldFlowAuthActions.js.map +1 -0
  16. package/lib/commonjs/components/FieldFlowAuthActions/index.js +13 -0
  17. package/lib/commonjs/components/FieldFlowAuthActions/index.js.map +1 -0
  18. package/lib/commonjs/components/FieldFlowCompleteness/FieldFlowCompleteness.js +100 -0
  19. package/lib/commonjs/components/FieldFlowCompleteness/FieldFlowCompleteness.js.map +1 -0
  20. package/lib/commonjs/components/FieldFlowCompleteness/index.js +13 -0
  21. package/lib/commonjs/components/FieldFlowCompleteness/index.js.map +1 -0
  22. package/lib/commonjs/components/FieldFlowFormHeader/FieldFlowFormHeader.js +102 -0
  23. package/lib/commonjs/components/FieldFlowFormHeader/FieldFlowFormHeader.js.map +1 -0
  24. package/lib/commonjs/components/FieldFlowFormHeader/index.js +13 -0
  25. package/lib/commonjs/components/FieldFlowFormHeader/index.js.map +1 -0
  26. package/lib/commonjs/components/FieldFlowInfoTip/FieldFlowInfoTip.js +121 -0
  27. package/lib/commonjs/components/FieldFlowInfoTip/FieldFlowInfoTip.js.map +1 -0
  28. package/lib/commonjs/components/FieldFlowInfoTip/index.js +13 -0
  29. package/lib/commonjs/components/FieldFlowInfoTip/index.js.map +1 -0
  30. package/lib/commonjs/components/FieldFlowInlineAlert/FieldFlowInlineAlert.js +142 -0
  31. package/lib/commonjs/components/FieldFlowInlineAlert/FieldFlowInlineAlert.js.map +1 -0
  32. package/lib/commonjs/components/FieldFlowInlineAlert/index.js +13 -0
  33. package/lib/commonjs/components/FieldFlowInlineAlert/index.js.map +1 -0
  34. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js +44 -18
  35. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  36. package/lib/commonjs/components/FieldFlowInput/styles.js +49 -13
  37. package/lib/commonjs/components/FieldFlowInput/styles.js.map +1 -1
  38. package/lib/commonjs/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.js +137 -0
  39. package/lib/commonjs/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.js.map +1 -0
  40. package/lib/commonjs/components/FieldFlowKeyboardToolbar/index.js +19 -0
  41. package/lib/commonjs/components/FieldFlowKeyboardToolbar/index.js.map +1 -0
  42. package/lib/commonjs/components/FieldFlowSkeleton/FieldFlowSkeleton.js +101 -0
  43. package/lib/commonjs/components/FieldFlowSkeleton/FieldFlowSkeleton.js.map +1 -0
  44. package/lib/commonjs/components/FieldFlowSkeleton/index.js +13 -0
  45. package/lib/commonjs/components/FieldFlowSkeleton/index.js.map +1 -0
  46. package/lib/commonjs/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.js +6 -4
  47. package/lib/commonjs/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.js.map +1 -1
  48. package/lib/commonjs/hooks/index.js +21 -0
  49. package/lib/commonjs/hooks/index.js.map +1 -1
  50. package/lib/commonjs/hooks/useFieldFlowCompleteness.js +46 -0
  51. package/lib/commonjs/hooks/useFieldFlowCompleteness.js.map +1 -0
  52. package/lib/commonjs/hooks/useFieldFlowSubmitQueue.js +145 -0
  53. package/lib/commonjs/hooks/useFieldFlowSubmitQueue.js.map +1 -0
  54. package/lib/commonjs/hooks/useKeyboardManager.js +15 -0
  55. package/lib/commonjs/hooks/useKeyboardManager.js.map +1 -1
  56. package/lib/commonjs/hooks/useSmartPaste.js +27 -0
  57. package/lib/commonjs/hooks/useSmartPaste.js.map +1 -0
  58. package/lib/commonjs/index.js +144 -0
  59. package/lib/commonjs/index.js.map +1 -1
  60. package/lib/commonjs/paste/index.js +19 -0
  61. package/lib/commonjs/paste/index.js.map +1 -0
  62. package/lib/commonjs/paste/smartPaste.js +113 -0
  63. package/lib/commonjs/paste/smartPaste.js.map +1 -0
  64. package/lib/commonjs/schema/FieldFlowSchemaForm.js +219 -0
  65. package/lib/commonjs/schema/FieldFlowSchemaForm.js.map +1 -0
  66. package/lib/commonjs/schema/index.js +13 -0
  67. package/lib/commonjs/schema/index.js.map +1 -0
  68. package/lib/commonjs/schema/types.js +6 -0
  69. package/lib/commonjs/schema/types.js.map +1 -0
  70. package/lib/commonjs/theme/ThemeProvider.js +65 -4
  71. package/lib/commonjs/theme/ThemeProvider.js.map +1 -1
  72. package/lib/commonjs/theme/appearance.js +93 -0
  73. package/lib/commonjs/theme/appearance.js.map +1 -0
  74. package/lib/commonjs/theme/defaultTheme.js +17 -2
  75. package/lib/commonjs/theme/defaultTheme.js.map +1 -1
  76. package/lib/commonjs/theme/index.js +19 -0
  77. package/lib/commonjs/theme/index.js.map +1 -1
  78. package/lib/commonjs/types/globals.d.js +2 -0
  79. package/lib/commonjs/types/globals.d.js.map +1 -0
  80. package/lib/module/a11y/audit.js +68 -0
  81. package/lib/module/a11y/audit.js.map +1 -0
  82. package/lib/module/a11y/index.js +4 -0
  83. package/lib/module/a11y/index.js.map +1 -0
  84. package/lib/module/autofill/index.js +4 -0
  85. package/lib/module/autofill/index.js.map +1 -0
  86. package/lib/module/autofill/profiles.js +193 -0
  87. package/lib/module/autofill/profiles.js.map +1 -0
  88. package/lib/module/components/FieldFlowA11yAudit/FieldFlowA11yAudit.js +94 -0
  89. package/lib/module/components/FieldFlowA11yAudit/FieldFlowA11yAudit.js.map +1 -0
  90. package/lib/module/components/FieldFlowA11yAudit/index.js +4 -0
  91. package/lib/module/components/FieldFlowA11yAudit/index.js.map +1 -0
  92. package/lib/module/components/FieldFlowAuthActions/FieldFlowAuthActions.js +125 -0
  93. package/lib/module/components/FieldFlowAuthActions/FieldFlowAuthActions.js.map +1 -0
  94. package/lib/module/components/FieldFlowAuthActions/index.js +4 -0
  95. package/lib/module/components/FieldFlowAuthActions/index.js.map +1 -0
  96. package/lib/module/components/FieldFlowCompleteness/FieldFlowCompleteness.js +95 -0
  97. package/lib/module/components/FieldFlowCompleteness/FieldFlowCompleteness.js.map +1 -0
  98. package/lib/module/components/FieldFlowCompleteness/index.js +4 -0
  99. package/lib/module/components/FieldFlowCompleteness/index.js.map +1 -0
  100. package/lib/module/components/FieldFlowFormHeader/FieldFlowFormHeader.js +97 -0
  101. package/lib/module/components/FieldFlowFormHeader/FieldFlowFormHeader.js.map +1 -0
  102. package/lib/module/components/FieldFlowFormHeader/index.js +4 -0
  103. package/lib/module/components/FieldFlowFormHeader/index.js.map +1 -0
  104. package/lib/module/components/FieldFlowInfoTip/FieldFlowInfoTip.js +116 -0
  105. package/lib/module/components/FieldFlowInfoTip/FieldFlowInfoTip.js.map +1 -0
  106. package/lib/module/components/FieldFlowInfoTip/index.js +4 -0
  107. package/lib/module/components/FieldFlowInfoTip/index.js.map +1 -0
  108. package/lib/module/components/FieldFlowInlineAlert/FieldFlowInlineAlert.js +137 -0
  109. package/lib/module/components/FieldFlowInlineAlert/FieldFlowInlineAlert.js.map +1 -0
  110. package/lib/module/components/FieldFlowInlineAlert/index.js +4 -0
  111. package/lib/module/components/FieldFlowInlineAlert/index.js.map +1 -0
  112. package/lib/module/components/FieldFlowInput/FieldFlowInput.js +44 -18
  113. package/lib/module/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  114. package/lib/module/components/FieldFlowInput/styles.js +49 -13
  115. package/lib/module/components/FieldFlowInput/styles.js.map +1 -1
  116. package/lib/module/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.js +131 -0
  117. package/lib/module/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.js.map +1 -0
  118. package/lib/module/components/FieldFlowKeyboardToolbar/index.js +4 -0
  119. package/lib/module/components/FieldFlowKeyboardToolbar/index.js.map +1 -0
  120. package/lib/module/components/FieldFlowSkeleton/FieldFlowSkeleton.js +96 -0
  121. package/lib/module/components/FieldFlowSkeleton/FieldFlowSkeleton.js.map +1 -0
  122. package/lib/module/components/FieldFlowSkeleton/index.js +4 -0
  123. package/lib/module/components/FieldFlowSkeleton/index.js.map +1 -0
  124. package/lib/module/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.js +5 -3
  125. package/lib/module/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.js.map +1 -1
  126. package/lib/module/hooks/index.js +3 -0
  127. package/lib/module/hooks/index.js.map +1 -1
  128. package/lib/module/hooks/useFieldFlowCompleteness.js +42 -0
  129. package/lib/module/hooks/useFieldFlowCompleteness.js.map +1 -0
  130. package/lib/module/hooks/useFieldFlowSubmitQueue.js +141 -0
  131. package/lib/module/hooks/useFieldFlowSubmitQueue.js.map +1 -0
  132. package/lib/module/hooks/useKeyboardManager.js +15 -0
  133. package/lib/module/hooks/useKeyboardManager.js.map +1 -1
  134. package/lib/module/hooks/useSmartPaste.js +23 -0
  135. package/lib/module/hooks/useSmartPaste.js.map +1 -0
  136. package/lib/module/index.js +17 -2
  137. package/lib/module/index.js.map +1 -1
  138. package/lib/module/paste/index.js +4 -0
  139. package/lib/module/paste/index.js.map +1 -0
  140. package/lib/module/paste/smartPaste.js +108 -0
  141. package/lib/module/paste/smartPaste.js.map +1 -0
  142. package/lib/module/schema/FieldFlowSchemaForm.js +214 -0
  143. package/lib/module/schema/FieldFlowSchemaForm.js.map +1 -0
  144. package/lib/module/schema/index.js +4 -0
  145. package/lib/module/schema/index.js.map +1 -0
  146. package/lib/module/schema/types.js +4 -0
  147. package/lib/module/schema/types.js.map +1 -0
  148. package/lib/module/theme/ThemeProvider.js +66 -5
  149. package/lib/module/theme/ThemeProvider.js.map +1 -1
  150. package/lib/module/theme/appearance.js +87 -0
  151. package/lib/module/theme/appearance.js.map +1 -0
  152. package/lib/module/theme/defaultTheme.js +17 -2
  153. package/lib/module/theme/defaultTheme.js.map +1 -1
  154. package/lib/module/theme/index.js +1 -0
  155. package/lib/module/theme/index.js.map +1 -1
  156. package/lib/module/types/globals.d.js +2 -0
  157. package/lib/module/types/globals.d.js.map +1 -0
  158. package/lib/typescript/a11y/audit.d.ts +32 -0
  159. package/lib/typescript/a11y/audit.d.ts.map +1 -0
  160. package/lib/typescript/a11y/index.d.ts +3 -0
  161. package/lib/typescript/a11y/index.d.ts.map +1 -0
  162. package/lib/typescript/autofill/index.d.ts +3 -0
  163. package/lib/typescript/autofill/index.d.ts.map +1 -0
  164. package/lib/typescript/autofill/profiles.d.ts +48 -0
  165. package/lib/typescript/autofill/profiles.d.ts.map +1 -0
  166. package/lib/typescript/components/FieldFlowA11yAudit/FieldFlowA11yAudit.d.ts +21 -0
  167. package/lib/typescript/components/FieldFlowA11yAudit/FieldFlowA11yAudit.d.ts.map +1 -0
  168. package/lib/typescript/components/FieldFlowA11yAudit/index.d.ts +3 -0
  169. package/lib/typescript/components/FieldFlowA11yAudit/index.d.ts.map +1 -0
  170. package/lib/typescript/components/FieldFlowAuthActions/FieldFlowAuthActions.d.ts +29 -0
  171. package/lib/typescript/components/FieldFlowAuthActions/FieldFlowAuthActions.d.ts.map +1 -0
  172. package/lib/typescript/components/FieldFlowAuthActions/index.d.ts +3 -0
  173. package/lib/typescript/components/FieldFlowAuthActions/index.d.ts.map +1 -0
  174. package/lib/typescript/components/FieldFlowCompleteness/FieldFlowCompleteness.d.ts +25 -0
  175. package/lib/typescript/components/FieldFlowCompleteness/FieldFlowCompleteness.d.ts.map +1 -0
  176. package/lib/typescript/components/FieldFlowCompleteness/index.d.ts +3 -0
  177. package/lib/typescript/components/FieldFlowCompleteness/index.d.ts.map +1 -0
  178. package/lib/typescript/components/FieldFlowFormHeader/FieldFlowFormHeader.d.ts +23 -0
  179. package/lib/typescript/components/FieldFlowFormHeader/FieldFlowFormHeader.d.ts.map +1 -0
  180. package/lib/typescript/components/FieldFlowFormHeader/index.d.ts +3 -0
  181. package/lib/typescript/components/FieldFlowFormHeader/index.d.ts.map +1 -0
  182. package/lib/typescript/components/FieldFlowInfoTip/FieldFlowInfoTip.d.ts +19 -0
  183. package/lib/typescript/components/FieldFlowInfoTip/FieldFlowInfoTip.d.ts.map +1 -0
  184. package/lib/typescript/components/FieldFlowInfoTip/index.d.ts +3 -0
  185. package/lib/typescript/components/FieldFlowInfoTip/index.d.ts.map +1 -0
  186. package/lib/typescript/components/FieldFlowInlineAlert/FieldFlowInlineAlert.d.ts +22 -0
  187. package/lib/typescript/components/FieldFlowInlineAlert/FieldFlowInlineAlert.d.ts.map +1 -0
  188. package/lib/typescript/components/FieldFlowInlineAlert/index.d.ts +3 -0
  189. package/lib/typescript/components/FieldFlowInlineAlert/index.d.ts.map +1 -0
  190. package/lib/typescript/components/FieldFlowInput/FieldFlowInput.d.ts.map +1 -1
  191. package/lib/typescript/components/FieldFlowInput/styles.d.ts +36 -1
  192. package/lib/typescript/components/FieldFlowInput/styles.d.ts.map +1 -1
  193. package/lib/typescript/components/FieldFlowInput/types.d.ts +18 -0
  194. package/lib/typescript/components/FieldFlowInput/types.d.ts.map +1 -1
  195. package/lib/typescript/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.d.ts +30 -0
  196. package/lib/typescript/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.d.ts.map +1 -0
  197. package/lib/typescript/components/FieldFlowKeyboardToolbar/index.d.ts +3 -0
  198. package/lib/typescript/components/FieldFlowKeyboardToolbar/index.d.ts.map +1 -0
  199. package/lib/typescript/components/FieldFlowSkeleton/FieldFlowSkeleton.d.ts +21 -0
  200. package/lib/typescript/components/FieldFlowSkeleton/FieldFlowSkeleton.d.ts.map +1 -0
  201. package/lib/typescript/components/FieldFlowSkeleton/index.d.ts +3 -0
  202. package/lib/typescript/components/FieldFlowSkeleton/index.d.ts.map +1 -0
  203. package/lib/typescript/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.d.ts +3 -2
  204. package/lib/typescript/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.d.ts.map +1 -1
  205. package/lib/typescript/hooks/index.d.ts +6 -0
  206. package/lib/typescript/hooks/index.d.ts.map +1 -1
  207. package/lib/typescript/hooks/useFieldFlowCompleteness.d.ts +28 -0
  208. package/lib/typescript/hooks/useFieldFlowCompleteness.d.ts.map +1 -0
  209. package/lib/typescript/hooks/useFieldFlowSubmitQueue.d.ts +45 -0
  210. package/lib/typescript/hooks/useFieldFlowSubmitQueue.d.ts.map +1 -0
  211. package/lib/typescript/hooks/useKeyboardManager.d.ts +6 -0
  212. package/lib/typescript/hooks/useKeyboardManager.d.ts.map +1 -1
  213. package/lib/typescript/hooks/useSmartPaste.d.ts +14 -0
  214. package/lib/typescript/hooks/useSmartPaste.d.ts.map +1 -0
  215. package/lib/typescript/index.d.ts +28 -4
  216. package/lib/typescript/index.d.ts.map +1 -1
  217. package/lib/typescript/paste/index.d.ts +3 -0
  218. package/lib/typescript/paste/index.d.ts.map +1 -0
  219. package/lib/typescript/paste/smartPaste.d.ts +32 -0
  220. package/lib/typescript/paste/smartPaste.d.ts.map +1 -0
  221. package/lib/typescript/schema/FieldFlowSchemaForm.d.ts +28 -0
  222. package/lib/typescript/schema/FieldFlowSchemaForm.d.ts.map +1 -0
  223. package/lib/typescript/schema/index.d.ts +4 -0
  224. package/lib/typescript/schema/index.d.ts.map +1 -0
  225. package/lib/typescript/schema/types.d.ts +43 -0
  226. package/lib/typescript/schema/types.d.ts.map +1 -0
  227. package/lib/typescript/theme/ThemeProvider.d.ts +18 -4
  228. package/lib/typescript/theme/ThemeProvider.d.ts.map +1 -1
  229. package/lib/typescript/theme/appearance.d.ts +19 -0
  230. package/lib/typescript/theme/appearance.d.ts.map +1 -0
  231. package/lib/typescript/theme/defaultTheme.d.ts.map +1 -1
  232. package/lib/typescript/theme/index.d.ts +1 -0
  233. package/lib/typescript/theme/index.d.ts.map +1 -1
  234. package/lib/typescript/types/index.d.ts +26 -0
  235. package/lib/typescript/types/index.d.ts.map +1 -1
  236. package/package.json +2 -2
  237. package/src/a11y/audit.ts +99 -0
  238. package/src/a11y/index.ts +7 -0
  239. package/src/autofill/index.ts +10 -0
  240. package/src/autofill/profiles.ts +224 -0
  241. package/src/components/FieldFlowA11yAudit/FieldFlowA11yAudit.tsx +112 -0
  242. package/src/components/FieldFlowA11yAudit/index.ts +2 -0
  243. package/src/components/FieldFlowAuthActions/FieldFlowAuthActions.tsx +146 -0
  244. package/src/components/FieldFlowAuthActions/index.ts +6 -0
  245. package/src/components/FieldFlowCompleteness/FieldFlowCompleteness.tsx +109 -0
  246. package/src/components/FieldFlowCompleteness/index.ts +2 -0
  247. package/src/components/FieldFlowFormHeader/FieldFlowFormHeader.tsx +106 -0
  248. package/src/components/FieldFlowFormHeader/index.ts +2 -0
  249. package/src/components/FieldFlowInfoTip/FieldFlowInfoTip.tsx +120 -0
  250. package/src/components/FieldFlowInfoTip/index.ts +2 -0
  251. package/src/components/FieldFlowInlineAlert/FieldFlowInlineAlert.tsx +134 -0
  252. package/src/components/FieldFlowInlineAlert/index.ts +2 -0
  253. package/src/components/FieldFlowInput/FieldFlowInput.tsx +71 -13
  254. package/src/components/FieldFlowInput/styles.ts +58 -16
  255. package/src/components/FieldFlowInput/types.ts +21 -0
  256. package/src/components/FieldFlowKeyboardToolbar/FieldFlowKeyboardToolbar.tsx +150 -0
  257. package/src/components/FieldFlowKeyboardToolbar/index.ts +5 -0
  258. package/src/components/FieldFlowSkeleton/FieldFlowSkeleton.tsx +105 -0
  259. package/src/components/FieldFlowSkeleton/index.ts +2 -0
  260. package/src/components/KeyboardAwareFormWrapper/KeyboardAwareFormWrapper.tsx +8 -4
  261. package/src/hooks/index.ts +17 -0
  262. package/src/hooks/useFieldFlowCompleteness.ts +69 -0
  263. package/src/hooks/useFieldFlowSubmitQueue.ts +206 -0
  264. package/src/hooks/useKeyboardManager.ts +26 -0
  265. package/src/hooks/useSmartPaste.ts +33 -0
  266. package/src/index.ts +90 -0
  267. package/src/paste/index.ts +7 -0
  268. package/src/paste/smartPaste.ts +132 -0
  269. package/src/schema/FieldFlowSchemaForm.tsx +274 -0
  270. package/src/schema/index.ts +8 -0
  271. package/src/schema/types.ts +63 -0
  272. package/src/theme/ThemeProvider.tsx +96 -7
  273. package/src/theme/appearance.ts +105 -0
  274. package/src/theme/defaultTheme.ts +11 -0
  275. package/src/theme/index.ts +1 -0
  276. package/src/types/globals.d.ts +2 -0
  277. package/src/types/index.ts +28 -0
@@ -0,0 +1,274 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import { View, type ViewStyle } from 'react-native';
3
+ import { FieldFlowInput } from '../components/FieldFlowInput';
4
+ import { FieldFlowCheckbox } from '../components/FieldFlowCheckbox';
5
+ import { FieldFlowSwitch } from '../components/FieldFlowSwitch';
6
+ import { FieldFlowRadio } from '../components/FieldFlowRadio';
7
+ import { FieldFlowSegmented } from '../components/FieldFlowSegmented';
8
+ import { FieldFlowDropdown } from '../components/FieldFlowDropdown';
9
+ import { FieldFlowTags } from '../components/FieldFlowTags';
10
+ import { FieldFlowRating } from '../components/FieldFlowRating';
11
+ import { FieldFlowSlider } from '../components/FieldFlowSlider';
12
+ import { FieldFlowNumberStepper } from '../components/FieldFlowNumberStepper';
13
+ import { FieldFlowSection } from '../components/FieldFlowSection';
14
+ import { useFieldFlowForm } from '../hooks/useFieldFlowForm';
15
+ import type { FieldFlowFormSchema, FieldFlowSchemaField } from './types';
16
+ import type { FieldFlowLocale } from '../i18n/messages';
17
+
18
+ export type FieldFlowSchemaShowWhenFn = (values: Record<string, string>) => boolean;
19
+
20
+ export interface FieldFlowSchemaFormProps {
21
+ schema: FieldFlowFormSchema;
22
+ /** Named showWhen resolvers referenced by field.showWhen string key. */
23
+ showWhenFns?: Record<string, FieldFlowSchemaShowWhenFn>;
24
+ locale?: FieldFlowLocale;
25
+ onSubmit?: (values: Record<string, string>) => void | Promise<void>;
26
+ /** Extra non-string state (tags, rating, etc.) change callback. */
27
+ onMetaChange?: (meta: Record<string, unknown>) => void;
28
+ /** Render a custom submit footer; receives form submit + values. */
29
+ renderFooter?: (ctx: {
30
+ submit: () => Promise<void>;
31
+ values: Record<string, string>;
32
+ meta: Record<string, unknown>;
33
+ isSubmitting: boolean;
34
+ }) => React.ReactNode;
35
+ containerStyle?: ViewStyle;
36
+ testID?: string;
37
+ }
38
+
39
+ function buildInitial(schema: FieldFlowFormSchema): Record<string, string> {
40
+ const base: Record<string, string> = { ...(schema.initialValues ?? {}) };
41
+ for (const field of schema.fields) {
42
+ if (base[field.name] === undefined) {
43
+ if (field.type === 'checkbox' || field.type === 'switch') base[field.name] = 'false';
44
+ else if (field.type === 'rating' || field.type === 'slider' || field.type === 'stepper') {
45
+ base[field.name] = String(field.min ?? 0);
46
+ } else base[field.name] = '';
47
+ }
48
+ }
49
+ return base;
50
+ }
51
+
52
+ function buildRules(schema: FieldFlowFormSchema) {
53
+ const rules: Record<string, FieldFlowSchemaField['rules']> = {};
54
+ for (const field of schema.fields) {
55
+ const r = { ...(field.rules ?? {}) };
56
+ if (field.required && !r.required) r.required = true;
57
+ if (field.type === 'email' && r.email === undefined) r.email = true;
58
+ if (Object.keys(r).length) rules[field.name] = r;
59
+ }
60
+ return rules;
61
+ }
62
+
63
+ /**
64
+ * Declarative form renderer — JSON / object schema → FieldFlow controls.
65
+ */
66
+ export function FieldFlowSchemaForm({
67
+ schema,
68
+ showWhenFns,
69
+ locale,
70
+ onSubmit,
71
+ onMetaChange,
72
+ renderFooter,
73
+ containerStyle,
74
+ testID,
75
+ }: FieldFlowSchemaFormProps) {
76
+ const initialValues = useMemo(() => buildInitial(schema), [schema]);
77
+ const rules = useMemo(() => buildRules(schema), [schema]);
78
+
79
+ const form = useFieldFlowForm({
80
+ initialValues,
81
+ rules,
82
+ locale,
83
+ onSubmit,
84
+ });
85
+
86
+ const [meta, setMeta] = useState<Record<string, unknown>>({});
87
+
88
+ const patchMeta = (key: string, value: unknown) => {
89
+ setMeta(prev => {
90
+ const next = { ...prev, [key]: value };
91
+ onMetaChange?.(next);
92
+ return next;
93
+ });
94
+ };
95
+
96
+ const isVisible = (field: FieldFlowSchemaField) => {
97
+ if (!field.showWhen) return true;
98
+ const fn = showWhenFns?.[field.showWhen];
99
+ if (!fn) return true;
100
+ return fn(form.values);
101
+ };
102
+
103
+ const sections = schema.sections ?? [];
104
+ const bySection = useMemo(() => {
105
+ const map = new Map<string | null, FieldFlowSchemaField[]>();
106
+ for (const field of schema.fields) {
107
+ const key = field.section ?? null;
108
+ const list = map.get(key) ?? [];
109
+ list.push(field);
110
+ map.set(key, list);
111
+ }
112
+ return map;
113
+ }, [schema.fields]);
114
+
115
+ const renderField = (field: FieldFlowSchemaField) => {
116
+ if (!isVisible(field)) return null;
117
+ const props = form.getInputProps(field.name);
118
+ if (!props && field.type !== 'checkbox' && field.type !== 'switch' && field.type !== 'rating' && field.type !== 'slider' && field.type !== 'stepper' && field.type !== 'tags' && field.type !== 'dropdown' && field.type !== 'radio' && field.type !== 'segmented') {
119
+ return null;
120
+ }
121
+
122
+ switch (field.type) {
123
+ case 'checkbox':
124
+ return (
125
+ <FieldFlowCheckbox
126
+ key={field.name}
127
+ label={field.label}
128
+ value={form.values[field.name] === 'true'}
129
+ onChange={v => form.handleChange(field.name)(v ? 'true' : 'false')}
130
+ required={field.required}
131
+ helperText={field.helperText}
132
+ />
133
+ );
134
+ case 'switch':
135
+ return (
136
+ <FieldFlowSwitch
137
+ key={field.name}
138
+ label={field.label}
139
+ value={form.values[field.name] === 'true'}
140
+ onChange={v => form.handleChange(field.name)(v ? 'true' : 'false')}
141
+ helperText={field.helperText}
142
+ />
143
+ );
144
+ case 'radio':
145
+ return (
146
+ <FieldFlowRadio
147
+ key={field.name}
148
+ label={field.label}
149
+ value={form.values[field.name] || null}
150
+ onChange={v => form.handleChange(field.name)(v)}
151
+ options={field.options ?? []}
152
+ required={field.required}
153
+ />
154
+ );
155
+ case 'segmented':
156
+ return (
157
+ <FieldFlowSegmented
158
+ key={field.name}
159
+ label={field.label}
160
+ value={form.values[field.name] || null}
161
+ onChange={v => form.handleChange(field.name)(v)}
162
+ options={field.options ?? []}
163
+ required={field.required}
164
+ />
165
+ );
166
+ case 'dropdown':
167
+ return (
168
+ <FieldFlowDropdown
169
+ key={field.name}
170
+ label={field.label}
171
+ placeholder={field.placeholder}
172
+ options={field.options ?? []}
173
+ value={form.values[field.name] || null}
174
+ onChange={v => form.handleChange(field.name)(v ?? '')}
175
+ required={field.required}
176
+ helperText={field.helperText}
177
+ />
178
+ );
179
+ case 'tags':
180
+ return (
181
+ <FieldFlowTags
182
+ key={field.name}
183
+ label={field.label}
184
+ value={(meta[field.name] as string[]) ?? []}
185
+ onChange={tags => patchMeta(field.name, tags)}
186
+ placeholder={field.placeholder}
187
+ helperText={field.helperText}
188
+ />
189
+ );
190
+ case 'rating':
191
+ return (
192
+ <FieldFlowRating
193
+ key={field.name}
194
+ label={field.label}
195
+ value={Number(form.values[field.name] || 0)}
196
+ onChange={v => form.handleChange(field.name)(String(v))}
197
+ max={field.max ?? 5}
198
+ required={field.required}
199
+ />
200
+ );
201
+ case 'slider':
202
+ return (
203
+ <FieldFlowSlider
204
+ key={field.name}
205
+ label={field.label}
206
+ value={Number(form.values[field.name] || field.min || 0)}
207
+ onChange={v => form.handleChange(field.name)(String(v))}
208
+ min={field.min ?? 0}
209
+ max={field.max ?? 100}
210
+ step={field.step ?? 1}
211
+ />
212
+ );
213
+ case 'stepper':
214
+ return (
215
+ <FieldFlowNumberStepper
216
+ key={field.name}
217
+ label={field.label}
218
+ value={Number(form.values[field.name] || field.min || 0)}
219
+ onChange={v => form.handleChange(field.name)(String(v))}
220
+ min={field.min ?? 0}
221
+ max={field.max ?? 99}
222
+ step={field.step ?? 1}
223
+ />
224
+ );
225
+ default:
226
+ return (
227
+ <FieldFlowInput
228
+ key={field.name}
229
+ type={field.type as 'text'}
230
+ label={field.label}
231
+ placeholder={field.placeholder}
232
+ helperText={field.helperText}
233
+ variant={field.variant}
234
+ leftIcon={field.leftIcon}
235
+ autofill={field.autofill}
236
+ suggestions={field.suggestions}
237
+ showStrength={field.showStrength}
238
+ prefix={field.prefix}
239
+ suffix={field.suffix}
240
+ {...props!}
241
+ />
242
+ );
243
+ }
244
+ };
245
+
246
+ const unsectioned = bySection.get(null) ?? [];
247
+
248
+ return (
249
+ <View style={containerStyle} testID={testID}>
250
+ {unsectioned.map(renderField)}
251
+ {sections.map(section => {
252
+ const fields = bySection.get(section.id) ?? [];
253
+ if (!fields.length) return null;
254
+ return (
255
+ <FieldFlowSection
256
+ key={section.id}
257
+ title={section.title}
258
+ description={section.description}
259
+ icon={section.icon}
260
+ collapsible={section.collapsible}
261
+ >
262
+ {fields.map(renderField)}
263
+ </FieldFlowSection>
264
+ );
265
+ })}
266
+ {renderFooter?.({
267
+ submit: form.submit,
268
+ values: form.values,
269
+ meta,
270
+ isSubmitting: form.isSubmitting,
271
+ })}
272
+ </View>
273
+ );
274
+ }
@@ -0,0 +1,8 @@
1
+ export { FieldFlowSchemaForm } from './FieldFlowSchemaForm';
2
+ export type { FieldFlowSchemaFormProps, FieldFlowSchemaShowWhenFn } from './FieldFlowSchemaForm';
3
+ export type {
4
+ FieldFlowFormSchema,
5
+ FieldFlowSchemaField,
6
+ FieldFlowSchemaFieldType,
7
+ FieldFlowSchemaSection,
8
+ } from './types';
@@ -0,0 +1,63 @@
1
+ import type { FieldFlowRules, FieldFlowOption, FieldFlowVariant } from '../types';
2
+ import type { FieldFlowAutofillRole } from '../autofill/profiles';
3
+ import type { FieldFlowIconSource } from '../icons';
4
+
5
+ export type FieldFlowSchemaFieldType =
6
+ | 'text'
7
+ | 'email'
8
+ | 'phone'
9
+ | 'password'
10
+ | 'number'
11
+ | 'decimal'
12
+ | 'search'
13
+ | 'multiline'
14
+ | 'switch'
15
+ | 'checkbox'
16
+ | 'radio'
17
+ | 'segmented'
18
+ | 'dropdown'
19
+ | 'tags'
20
+ | 'rating'
21
+ | 'slider'
22
+ | 'stepper';
23
+
24
+ export interface FieldFlowSchemaField {
25
+ name: string;
26
+ type: FieldFlowSchemaFieldType;
27
+ label?: string;
28
+ placeholder?: string;
29
+ helperText?: string;
30
+ required?: boolean;
31
+ rules?: FieldFlowRules;
32
+ variant?: FieldFlowVariant;
33
+ autofill?: FieldFlowAutofillRole;
34
+ leftIcon?: FieldFlowIconSource;
35
+ options?: FieldFlowOption[];
36
+ /** For slider / stepper / rating. */
37
+ min?: number;
38
+ max?: number;
39
+ step?: number;
40
+ /** Show when predicate returns true (values bag). */
41
+ showWhen?: string;
42
+ /** JSON-serializable expression keys — resolved by `showWhenFns` map on the renderer. */
43
+ section?: string;
44
+ suggestions?: boolean | 'email' | 'phone' | 'currency';
45
+ showStrength?: boolean;
46
+ prefix?: string;
47
+ suffix?: string;
48
+ }
49
+
50
+ export interface FieldFlowSchemaSection {
51
+ id: string;
52
+ title?: string;
53
+ description?: string;
54
+ icon?: FieldFlowIconSource;
55
+ collapsible?: boolean;
56
+ }
57
+
58
+ export interface FieldFlowFormSchema {
59
+ fields: FieldFlowSchemaField[];
60
+ sections?: FieldFlowSchemaSection[];
61
+ /** Initial string values for text-like fields. */
62
+ initialValues?: Record<string, string>;
63
+ }
@@ -1,6 +1,18 @@
1
- import React, { createContext, useContext, useMemo } from 'react';
2
- import type { DeepPartial, FieldFlowTheme } from '../types';
1
+ import React, { createContext, useContext, useEffect, useMemo, useRef } from 'react';
2
+ import { Animated, Easing } from 'react-native';
3
+ import type {
4
+ DeepPartial,
5
+ FieldFlowAppearance,
6
+ FieldFlowControlSize,
7
+ FieldFlowDensity,
8
+ FieldFlowFocusRing,
9
+ FieldFlowShape,
10
+ FieldFlowSurface,
11
+ FieldFlowTheme,
12
+ } from '../types';
3
13
  import { defaultTheme } from './defaultTheme';
14
+ import { applyAppearance, defaultAppearance } from './appearance';
15
+ import { useReducedMotion } from '../motion/useReducedMotion';
4
16
 
5
17
  const FieldFlowThemeContext = createContext<FieldFlowTheme>(defaultTheme);
6
18
 
@@ -27,18 +39,95 @@ function mergeDeep<T extends Record<string, any>>(base: T, override?: DeepPartia
27
39
 
28
40
  export interface FieldFlowThemeProviderProps {
29
41
  theme?: DeepPartial<FieldFlowTheme>;
42
+ /** Form-wide density. Default: comfortable. */
43
+ density?: FieldFlowDensity;
44
+ /** Control size scale. Default: md. */
45
+ size?: FieldFlowControlSize;
46
+ /** Surface depth language. Default: flat. */
47
+ surface?: FieldFlowSurface;
48
+ /** Corner shape. Default: rounded. */
49
+ shape?: FieldFlowShape;
50
+ /** Focus ring style. Default: softGlow. */
51
+ focusRing?: FieldFlowFocusRing;
52
+ /**
53
+ * Soft crossfade when the resolved theme changes (e.g. switching presets).
54
+ * Default: true. Skipped when Reduce Motion is on.
55
+ */
56
+ animateTheme?: boolean;
30
57
  children: React.ReactNode;
31
58
  }
32
59
 
33
60
  /**
34
61
  * Wrap your app (or a screen/form) in this provider to apply a custom theme.
35
- * Any field not covered by your overrides falls back to FieldFlow's defaults,
36
- * so you only need to specify what you want to change.
62
+ * Density / size / shape / surface / focusRing are one-liner visual knobs.
37
63
  */
38
- export function FieldFlowThemeProvider({ theme, children }: FieldFlowThemeProviderProps) {
39
- const merged = useMemo(() => mergeDeep(defaultTheme, theme), [theme]);
64
+ export function FieldFlowThemeProvider({
65
+ theme,
66
+ density,
67
+ size,
68
+ surface,
69
+ shape,
70
+ focusRing,
71
+ animateTheme = true,
72
+ children,
73
+ }: FieldFlowThemeProviderProps) {
74
+ const reducedMotion = useReducedMotion();
75
+ const appearanceOverride = useMemo(() => {
76
+ const partial: Partial<FieldFlowAppearance> = {};
77
+ if (density) partial.density = density;
78
+ if (size) partial.size = size;
79
+ if (surface) partial.surface = surface;
80
+ if (shape) partial.shape = shape;
81
+ if (focusRing) partial.focusRing = focusRing;
82
+ return partial;
83
+ }, [density, size, surface, shape, focusRing]);
84
+
85
+ const merged = useMemo(() => {
86
+ const base = mergeDeep(defaultTheme, theme);
87
+ const withAppearanceDefaults: FieldFlowTheme = {
88
+ ...base,
89
+ appearance: { ...defaultAppearance, ...(base.appearance ?? {}), ...appearanceOverride },
90
+ colors: {
91
+ ...defaultTheme.colors,
92
+ ...base.colors,
93
+ },
94
+ };
95
+ return applyAppearance(withAppearanceDefaults, appearanceOverride);
96
+ }, [theme, appearanceOverride]);
97
+
98
+ const opacity = useRef(new Animated.Value(1)).current;
99
+ const themeKey = useMemo(
100
+ () =>
101
+ JSON.stringify({
102
+ colors: merged.colors,
103
+ appearance: merged.appearance,
104
+ spacing: merged.spacing,
105
+ }),
106
+ [merged],
107
+ );
108
+ const prevKey = useRef(themeKey);
109
+
110
+ useEffect(() => {
111
+ if (!animateTheme || reducedMotion) {
112
+ opacity.setValue(1);
113
+ prevKey.current = themeKey;
114
+ return;
115
+ }
116
+ if (prevKey.current === themeKey) return;
117
+ prevKey.current = themeKey;
118
+ opacity.setValue(0.35);
119
+ Animated.timing(opacity, {
120
+ toValue: 1,
121
+ duration: Math.max(180, merged.animation.duration + 40),
122
+ easing: Easing.out(Easing.cubic),
123
+ useNativeDriver: true,
124
+ }).start();
125
+ }, [themeKey, animateTheme, reducedMotion, opacity, merged.animation.duration]);
126
+
40
127
  return (
41
- <FieldFlowThemeContext.Provider value={merged}>{children}</FieldFlowThemeContext.Provider>
128
+ <FieldFlowThemeContext.Provider value={merged}>
129
+ <Animated.View style={{ opacity }}>{children}</Animated.View>
130
+ </FieldFlowThemeContext.Provider>
42
131
  );
43
132
  }
44
133
 
@@ -0,0 +1,105 @@
1
+ import type {
2
+ FieldFlowAppearance,
3
+ FieldFlowControlSize,
4
+ FieldFlowDensity,
5
+ FieldFlowFocusRing,
6
+ FieldFlowShape,
7
+ FieldFlowSurface,
8
+ FieldFlowTheme,
9
+ } from '../types';
10
+
11
+ export const defaultAppearance: FieldFlowAppearance = {
12
+ density: 'comfortable',
13
+ size: 'md',
14
+ surface: 'flat',
15
+ shape: 'rounded',
16
+ focusRing: 'softGlow',
17
+ };
18
+
19
+ const DENSITY_SCALE: Record<FieldFlowDensity, number> = {
20
+ compact: 0.85,
21
+ comfortable: 1,
22
+ spacious: 1.18,
23
+ };
24
+
25
+ const SIZE_SCALE: Record<FieldFlowControlSize, number> = {
26
+ sm: 0.88,
27
+ md: 1,
28
+ lg: 1.14,
29
+ };
30
+
31
+ const SHAPE_RADIUS: Record<FieldFlowShape, (base: number) => number> = {
32
+ square: () => 4,
33
+ rounded: base => base,
34
+ pill: () => 999,
35
+ };
36
+
37
+ function scale(n: number, factor: number): number {
38
+ return Math.round(n * factor * 10) / 10;
39
+ }
40
+
41
+ /**
42
+ * Apply density / size / shape onto spacing + typography.
43
+ * Surface and focusRing stay as appearance flags for components to read.
44
+ */
45
+ export function applyAppearance(
46
+ theme: FieldFlowTheme,
47
+ appearance: Partial<FieldFlowAppearance> = {},
48
+ ): FieldFlowTheme {
49
+ const next: FieldFlowAppearance = {
50
+ ...defaultAppearance,
51
+ ...(theme.appearance ?? defaultAppearance),
52
+ ...appearance,
53
+ };
54
+ const factor = DENSITY_SCALE[next.density] * SIZE_SCALE[next.size];
55
+ const radius = SHAPE_RADIUS[next.shape](theme.spacing.borderRadius);
56
+
57
+ return {
58
+ ...theme,
59
+ appearance: next,
60
+ spacing: {
61
+ ...theme.spacing,
62
+ paddingHorizontal: scale(theme.spacing.paddingHorizontal, factor),
63
+ paddingVertical: scale(theme.spacing.paddingVertical, factor),
64
+ gap: scale(theme.spacing.gap, factor),
65
+ borderRadius: radius,
66
+ },
67
+ typography: {
68
+ ...theme.typography,
69
+ fontSize: scale(theme.typography.fontSize, factor),
70
+ labelFontSize: scale(theme.typography.labelFontSize, factor),
71
+ helperFontSize: scale(theme.typography.helperFontSize, Math.min(factor, 1.1)),
72
+ },
73
+ };
74
+ }
75
+
76
+ export function surfaceShadow(surface: FieldFlowSurface): {
77
+ shadowColor?: string;
78
+ shadowOpacity?: number;
79
+ shadowRadius?: number;
80
+ shadowOffset?: { width: number; height: number };
81
+ elevation?: number;
82
+ } | null {
83
+ switch (surface) {
84
+ case 'elevated':
85
+ return {
86
+ shadowColor: '#000',
87
+ shadowOpacity: 0.08,
88
+ shadowRadius: 10,
89
+ shadowOffset: { width: 0, height: 4 },
90
+ elevation: 3,
91
+ };
92
+ case 'soft':
93
+ return {
94
+ shadowColor: '#000',
95
+ shadowOpacity: 0.04,
96
+ shadowRadius: 6,
97
+ shadowOffset: { width: 0, height: 2 },
98
+ elevation: 1,
99
+ };
100
+ default:
101
+ return null;
102
+ }
103
+ }
104
+
105
+ export type { FieldFlowDensity, FieldFlowControlSize, FieldFlowSurface, FieldFlowShape, FieldFlowFocusRing };
@@ -1,4 +1,5 @@
1
1
  import type { FieldFlowTheme } from '../types';
2
+ import { defaultAppearance } from './appearance';
2
3
 
3
4
  export const defaultTheme: FieldFlowTheme = {
4
5
  colors: {
@@ -16,6 +17,10 @@ export const defaultTheme: FieldFlowTheme = {
16
17
  success: '#22C55E',
17
18
  icon: '#6B7280',
18
19
  iconFocused: '#3B82F6',
20
+ warning: '#D97706',
21
+ info: '#0284C7',
22
+ surfaceMuted: '#F8FAFC',
23
+ surfaceElevated: '#FFFFFF',
19
24
  },
20
25
  spacing: {
21
26
  paddingHorizontal: 14,
@@ -35,6 +40,7 @@ export const defaultTheme: FieldFlowTheme = {
35
40
  duration: 160,
36
41
  useNativeDriver: false,
37
42
  },
43
+ appearance: { ...defaultAppearance },
38
44
  };
39
45
 
40
46
  export const darkTheme: FieldFlowTheme = {
@@ -54,5 +60,10 @@ export const darkTheme: FieldFlowTheme = {
54
60
  success: '#4ADE80',
55
61
  icon: '#9CA3AF',
56
62
  iconFocused: '#60A5FA',
63
+ warning: '#FBBF24',
64
+ info: '#38BDF8',
65
+ surfaceMuted: '#15171B',
66
+ surfaceElevated: '#262B33',
57
67
  },
68
+ appearance: { ...defaultAppearance },
58
69
  };
@@ -3,3 +3,4 @@ export { FieldFlowThemeProvider, useFieldFlowTheme, mergeDeep } from './ThemePro
3
3
  export type { FieldFlowThemeProviderProps } from './ThemeProvider';
4
4
  export { themePresets, getThemePreset } from './presets';
5
5
  export type { FieldFlowThemePresetName } from './presets';
6
+ export { applyAppearance, defaultAppearance, surfaceShadow } from './appearance';
@@ -0,0 +1,2 @@
1
+ /** React Native / Metro global. */
2
+ declare const __DEV__: boolean;
@@ -67,6 +67,14 @@ export interface FieldFlowColors {
67
67
  success: string;
68
68
  icon: string;
69
69
  iconFocused: string;
70
+ /** Soft warning (amber). */
71
+ warning: string;
72
+ /** Informational blue/teal. */
73
+ info: string;
74
+ /** Muted surface for soft / inset wells. */
75
+ surfaceMuted: string;
76
+ /** Elevated card surface. */
77
+ surfaceElevated: string;
70
78
  }
71
79
 
72
80
  export interface FieldFlowSpacing {
@@ -91,11 +99,31 @@ export interface FieldFlowAnimationConfig {
91
99
  useNativeDriver: boolean;
92
100
  }
93
101
 
102
+ /** Form-wide visual rhythm. */
103
+ export type FieldFlowDensity = 'compact' | 'comfortable' | 'spacious';
104
+ /** Control scale. */
105
+ export type FieldFlowControlSize = 'sm' | 'md' | 'lg';
106
+ /** Chrome depth. */
107
+ export type FieldFlowSurface = 'flat' | 'elevated' | 'soft' | 'inset';
108
+ /** Corner language. */
109
+ export type FieldFlowShape = 'square' | 'rounded' | 'pill';
110
+ /** Focus treatment. */
111
+ export type FieldFlowFocusRing = 'solid' | 'softGlow' | 'underlinePulse';
112
+
113
+ export interface FieldFlowAppearance {
114
+ density: FieldFlowDensity;
115
+ size: FieldFlowControlSize;
116
+ surface: FieldFlowSurface;
117
+ shape: FieldFlowShape;
118
+ focusRing: FieldFlowFocusRing;
119
+ }
120
+
94
121
  export interface FieldFlowTheme {
95
122
  colors: FieldFlowColors;
96
123
  spacing: FieldFlowSpacing;
97
124
  typography: FieldFlowTypography;
98
125
  animation: FieldFlowAnimationConfig;
126
+ appearance: FieldFlowAppearance;
99
127
  }
100
128
 
101
129
  export type DeepPartial<T> = {