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,146 @@
1
+ import React, { useMemo } from 'react';
2
+ import {
3
+ ActivityIndicator,
4
+ Pressable,
5
+ StyleSheet,
6
+ Text,
7
+ View,
8
+ type TextStyle,
9
+ type ViewStyle,
10
+ } from 'react-native';
11
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
12
+ import { defaultTheme } from '../../theme/defaultTheme';
13
+ import { renderFieldFlowIcon, type FieldFlowIconSource } from '../../icons';
14
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
15
+
16
+ export type FieldFlowAuthProvider = 'passkey' | 'apple' | 'google' | 'biometric' | string;
17
+
18
+ export interface FieldFlowAuthAction {
19
+ id: FieldFlowAuthProvider;
20
+ label: string;
21
+ icon?: FieldFlowIconSource;
22
+ onPress: () => void | Promise<void>;
23
+ disabled?: boolean;
24
+ }
25
+
26
+ export interface FieldFlowAuthActionsProps {
27
+ actions: FieldFlowAuthAction[];
28
+ title?: string;
29
+ /** Divider text between auth strip and password form. Default: "or continue with email". */
30
+ dividerLabel?: string;
31
+ loadingId?: string | null;
32
+ containerStyle?: ViewStyle;
33
+ titleStyle?: TextStyle;
34
+ theme?: DeepPartial<FieldFlowTheme>;
35
+ testID?: string;
36
+ }
37
+
38
+ /**
39
+ * Auth action strip for passkey / SSO / biometric — place above password fields.
40
+ * All providers are injected; FieldFlow only themes the chrome.
41
+ */
42
+ export function FieldFlowAuthActions({
43
+ actions,
44
+ title = 'Sign in faster',
45
+ dividerLabel = 'or continue with email',
46
+ loadingId,
47
+ containerStyle,
48
+ titleStyle,
49
+ theme: themeOverride,
50
+ testID,
51
+ }: FieldFlowAuthActionsProps) {
52
+ const contextTheme = useFieldFlowTheme();
53
+ const theme = useMemo(
54
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
55
+ [contextTheme, themeOverride],
56
+ );
57
+ const styles = useMemo(() => createStyles(theme), [theme]);
58
+
59
+ if (!actions.length) return null;
60
+
61
+ return (
62
+ <View style={[styles.wrap, containerStyle]} testID={testID}>
63
+ {title ? <Text style={[styles.title, titleStyle]}>{title}</Text> : null}
64
+ <View style={styles.row}>
65
+ {actions.map(action => {
66
+ const loading = loadingId === action.id;
67
+ return (
68
+ <Pressable
69
+ key={action.id}
70
+ style={[styles.btn, (action.disabled || loading) && styles.btnDisabled]}
71
+ disabled={action.disabled || loading}
72
+ onPress={() => void action.onPress()}
73
+ accessibilityRole="button"
74
+ accessibilityLabel={action.label}
75
+ >
76
+ {loading ? (
77
+ <ActivityIndicator size="small" color={theme.colors.borderFocused} />
78
+ ) : (
79
+ <>
80
+ {action.icon
81
+ ? renderFieldFlowIcon(action.icon, theme.colors.text, 18)
82
+ : null}
83
+ <Text style={styles.btnLabel} numberOfLines={1}>
84
+ {action.label}
85
+ </Text>
86
+ </>
87
+ )}
88
+ </Pressable>
89
+ );
90
+ })}
91
+ </View>
92
+ {dividerLabel ? (
93
+ <View style={styles.dividerRow}>
94
+ <View style={styles.line} />
95
+ <Text style={styles.divider}>{dividerLabel}</Text>
96
+ <View style={styles.line} />
97
+ </View>
98
+ ) : null}
99
+ </View>
100
+ );
101
+ }
102
+
103
+ function createStyles(theme: FieldFlowTheme) {
104
+ return StyleSheet.create({
105
+ wrap: { marginBottom: theme.spacing.gap * 2 },
106
+ title: {
107
+ fontSize: theme.typography.labelFontSize,
108
+ color: theme.colors.label,
109
+ fontWeight: '500',
110
+ marginBottom: theme.spacing.gap,
111
+ textAlign: 'center',
112
+ },
113
+ row: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, justifyContent: 'center' },
114
+ btn: {
115
+ flexGrow: 1,
116
+ minWidth: '30%',
117
+ flexDirection: 'row',
118
+ alignItems: 'center',
119
+ justifyContent: 'center',
120
+ gap: 8,
121
+ paddingVertical: 12,
122
+ paddingHorizontal: 12,
123
+ borderRadius: theme.spacing.borderRadius,
124
+ borderWidth: theme.spacing.borderWidth,
125
+ borderColor: theme.colors.border,
126
+ backgroundColor: theme.colors.background,
127
+ },
128
+ btnDisabled: { opacity: 0.5 },
129
+ btnLabel: {
130
+ fontSize: theme.typography.helperFontSize + 1,
131
+ fontWeight: '600',
132
+ color: theme.colors.text,
133
+ },
134
+ dividerRow: {
135
+ flexDirection: 'row',
136
+ alignItems: 'center',
137
+ marginTop: theme.spacing.gap * 1.5,
138
+ gap: 10,
139
+ },
140
+ line: { flex: 1, height: StyleSheet.hairlineWidth, backgroundColor: theme.colors.border },
141
+ divider: {
142
+ fontSize: theme.typography.helperFontSize,
143
+ color: theme.colors.placeholder,
144
+ },
145
+ });
146
+ }
@@ -0,0 +1,6 @@
1
+ export { FieldFlowAuthActions } from './FieldFlowAuthActions';
2
+ export type {
3
+ FieldFlowAuthActionsProps,
4
+ FieldFlowAuthAction,
5
+ FieldFlowAuthProvider,
6
+ } from './FieldFlowAuthActions';
@@ -0,0 +1,109 @@
1
+ import React, { useMemo } from 'react';
2
+ import { 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 type { DeepPartial, FieldFlowTheme } from '../../types';
6
+ export interface FieldFlowCompletenessViewModel {
7
+ remaining: number;
8
+ percent: number;
9
+ progress: number;
10
+ isComplete: boolean;
11
+ estimatedSecondsLeft: number;
12
+ }
13
+
14
+ export interface FieldFlowCompletenessProps {
15
+ /** Pass result from `useFieldFlowCompleteness` (any form value shape). */
16
+ completeness: FieldFlowCompletenessViewModel;
17
+ title?: string;
18
+ /** Show “~Ns left” estimate. Default: true. */
19
+ showEstimate?: boolean;
20
+ /** Custom remaining copy. */
21
+ formatRemaining?: (remaining: number) => string;
22
+ containerStyle?: ViewStyle;
23
+ titleStyle?: TextStyle;
24
+ theme?: DeepPartial<FieldFlowTheme>;
25
+ testID?: string;
26
+ }
27
+
28
+ export function FieldFlowCompleteness({
29
+ completeness,
30
+ title = 'Form progress',
31
+ showEstimate = true,
32
+ formatRemaining,
33
+ containerStyle,
34
+ titleStyle,
35
+ theme: themeOverride,
36
+ testID,
37
+ }: FieldFlowCompletenessProps) {
38
+ const contextTheme = useFieldFlowTheme();
39
+ const theme = useMemo(
40
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
41
+ [contextTheme, themeOverride],
42
+ );
43
+ const styles = useMemo(() => createStyles(theme), [theme]);
44
+
45
+ const remainingCopy =
46
+ formatRemaining?.(completeness.remaining) ??
47
+ (completeness.isComplete
48
+ ? 'All set'
49
+ : `${completeness.remaining} field${completeness.remaining === 1 ? '' : 's'} left`);
50
+
51
+ return (
52
+ <View style={[styles.wrap, containerStyle]} testID={testID} accessibilityRole="progressbar">
53
+ <View style={styles.header}>
54
+ <Text style={[styles.title, titleStyle]}>{title}</Text>
55
+ <Text style={styles.percent}>{completeness.percent}%</Text>
56
+ </View>
57
+ <View style={styles.track}>
58
+ <View style={[styles.fill, { flex: Math.max(0.001, completeness.progress) }]} />
59
+ <View style={{ flex: Math.max(0.001, 1 - completeness.progress) }} />
60
+ </View>
61
+ <Text style={styles.meta}>
62
+ {remainingCopy}
63
+ {showEstimate && !completeness.isComplete
64
+ ? ` · ~${completeness.estimatedSecondsLeft}s`
65
+ : ''}
66
+ </Text>
67
+ </View>
68
+ );
69
+ }
70
+
71
+ function createStyles(theme: FieldFlowTheme) {
72
+ return StyleSheet.create({
73
+ wrap: {
74
+ marginBottom: theme.spacing.gap * 2,
75
+ padding: theme.spacing.paddingHorizontal,
76
+ borderRadius: theme.spacing.borderRadius + 2,
77
+ backgroundColor: theme.colors.backgroundDisabled,
78
+ borderWidth: StyleSheet.hairlineWidth,
79
+ borderColor: theme.colors.border,
80
+ },
81
+ header: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 8 },
82
+ title: {
83
+ fontSize: theme.typography.helperFontSize + 1,
84
+ fontWeight: '600',
85
+ color: theme.colors.text,
86
+ },
87
+ percent: {
88
+ fontSize: theme.typography.helperFontSize + 1,
89
+ fontWeight: '700',
90
+ color: theme.colors.borderFocused,
91
+ },
92
+ track: {
93
+ flexDirection: 'row',
94
+ height: 6,
95
+ borderRadius: 3,
96
+ overflow: 'hidden',
97
+ backgroundColor: theme.colors.border,
98
+ },
99
+ fill: {
100
+ backgroundColor: theme.colors.borderFocused,
101
+ borderRadius: 3,
102
+ },
103
+ meta: {
104
+ marginTop: 8,
105
+ fontSize: theme.typography.helperFontSize,
106
+ color: theme.colors.label,
107
+ },
108
+ });
109
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowCompleteness } from './FieldFlowCompleteness';
2
+ export type { FieldFlowCompletenessProps } from './FieldFlowCompleteness';
@@ -0,0 +1,106 @@
1
+ import React, { useMemo } from 'react';
2
+ import { 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 { surfaceShadow } from '../../theme/appearance';
6
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
7
+
8
+ export interface FieldFlowFormHeaderProps {
9
+ title: string;
10
+ subtitle?: string;
11
+ /** Optional illustration / logo node. */
12
+ illustration?: React.ReactNode;
13
+ /** 0–1 progress under the header. */
14
+ progress?: number;
15
+ /** Soft elevated card chrome. Default: true. */
16
+ elevated?: boolean;
17
+ containerStyle?: ViewStyle;
18
+ titleStyle?: TextStyle;
19
+ subtitleStyle?: TextStyle;
20
+ theme?: DeepPartial<FieldFlowTheme>;
21
+ testID?: string;
22
+ }
23
+
24
+ /**
25
+ * Calm visual intro for a form screen — title, subtitle, illustration, optional progress.
26
+ */
27
+ export function FieldFlowFormHeader({
28
+ title,
29
+ subtitle,
30
+ illustration,
31
+ progress,
32
+ elevated = true,
33
+ containerStyle,
34
+ titleStyle,
35
+ subtitleStyle,
36
+ theme: themeOverride,
37
+ testID,
38
+ }: FieldFlowFormHeaderProps) {
39
+ const contextTheme = useFieldFlowTheme();
40
+ const theme = useMemo(
41
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
42
+ [contextTheme, themeOverride],
43
+ );
44
+ const styles = useMemo(() => createStyles(theme, elevated), [theme, elevated]);
45
+ const clamped = progress == null ? null : Math.min(1, Math.max(0, progress));
46
+
47
+ return (
48
+ <View style={[styles.wrap, containerStyle]} testID={testID}>
49
+ {illustration ? <View style={styles.illustration}>{illustration}</View> : null}
50
+ <Text style={[styles.title, titleStyle]}>{title}</Text>
51
+ {subtitle ? <Text style={[styles.subtitle, subtitleStyle]}>{subtitle}</Text> : null}
52
+ {clamped != null ? (
53
+ <View style={styles.track}>
54
+ <View style={[styles.fill, { flex: Math.max(0.001, clamped) }]} />
55
+ <View style={{ flex: Math.max(0.001, 1 - clamped) }} />
56
+ </View>
57
+ ) : null}
58
+ </View>
59
+ );
60
+ }
61
+
62
+ function createStyles(theme: FieldFlowTheme, elevated: boolean) {
63
+ return StyleSheet.create({
64
+ wrap: {
65
+ marginBottom: theme.spacing.gap * 2.5,
66
+ padding: theme.spacing.paddingHorizontal + 4,
67
+ borderRadius: theme.spacing.borderRadius + 4,
68
+ backgroundColor: elevated
69
+ ? theme.colors.surfaceElevated ?? theme.colors.background
70
+ : 'transparent',
71
+ borderWidth: elevated ? StyleSheet.hairlineWidth : 0,
72
+ borderColor: theme.colors.border,
73
+ ...(elevated ? surfaceShadow('soft') ?? {} : null),
74
+ },
75
+ illustration: {
76
+ marginBottom: theme.spacing.gap * 1.5,
77
+ alignItems: 'flex-start',
78
+ },
79
+ title: {
80
+ fontSize: theme.typography.fontSize + 8,
81
+ fontWeight: '700',
82
+ color: theme.colors.text,
83
+ letterSpacing: -0.3,
84
+ fontFamily: theme.typography.fontFamily,
85
+ },
86
+ subtitle: {
87
+ marginTop: 6,
88
+ fontSize: theme.typography.helperFontSize + 1,
89
+ color: theme.colors.label,
90
+ lineHeight: theme.typography.helperFontSize + 8,
91
+ fontFamily: theme.typography.fontFamily,
92
+ },
93
+ track: {
94
+ flexDirection: 'row',
95
+ height: 4,
96
+ borderRadius: 2,
97
+ overflow: 'hidden',
98
+ backgroundColor: theme.colors.backgroundDisabled,
99
+ marginTop: theme.spacing.gap * 1.5,
100
+ },
101
+ fill: {
102
+ backgroundColor: theme.colors.borderFocused,
103
+ borderRadius: 2,
104
+ },
105
+ });
106
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowFormHeader } from './FieldFlowFormHeader';
2
+ export type { FieldFlowFormHeaderProps } from './FieldFlowFormHeader';
@@ -0,0 +1,120 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import {
3
+ Modal,
4
+ Pressable,
5
+ StyleSheet,
6
+ Text,
7
+ View,
8
+ type TextStyle,
9
+ type ViewStyle,
10
+ } from 'react-native';
11
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
12
+ import { defaultTheme } from '../../theme/defaultTheme';
13
+ import { renderFieldFlowIcon } from '../../icons/renderIcon';
14
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
15
+
16
+ export interface FieldFlowInfoTipProps {
17
+ /** Tip body shown in the popover. */
18
+ tip: string;
19
+ title?: string;
20
+ /** Accessible name for the ? button. */
21
+ accessibilityLabel?: string;
22
+ containerStyle?: ViewStyle;
23
+ tipStyle?: TextStyle;
24
+ theme?: DeepPartial<FieldFlowTheme>;
25
+ testID?: string;
26
+ }
27
+
28
+ /**
29
+ * Soft “?” tip beside a label — keeps forms calm without permanent helper clutter.
30
+ */
31
+ export function FieldFlowInfoTip({
32
+ tip,
33
+ title = 'About this field',
34
+ accessibilityLabel = 'More information',
35
+ containerStyle,
36
+ tipStyle,
37
+ theme: themeOverride,
38
+ testID,
39
+ }: FieldFlowInfoTipProps) {
40
+ const contextTheme = useFieldFlowTheme();
41
+ const theme = useMemo(
42
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
43
+ [contextTheme, themeOverride],
44
+ );
45
+ const styles = useMemo(() => createStyles(theme), [theme]);
46
+ const [open, setOpen] = useState(false);
47
+
48
+ return (
49
+ <View style={containerStyle} testID={testID}>
50
+ <Pressable
51
+ onPress={() => setOpen(true)}
52
+ hitSlop={8}
53
+ accessibilityRole="button"
54
+ accessibilityLabel={accessibilityLabel}
55
+ style={styles.trigger}
56
+ >
57
+ {renderFieldFlowIcon('info', theme.colors.info, 14)}
58
+ </Pressable>
59
+
60
+ <Modal visible={open} transparent animationType="fade" onRequestClose={() => setOpen(false)}>
61
+ <Pressable style={styles.backdrop} onPress={() => setOpen(false)} />
62
+ <View style={styles.sheet} accessibilityRole="summary">
63
+ <Text style={styles.title}>{title}</Text>
64
+ <Text style={[styles.body, tipStyle]}>{tip}</Text>
65
+ <Pressable onPress={() => setOpen(false)} style={styles.done} accessibilityRole="button">
66
+ <Text style={styles.doneText}>Got it</Text>
67
+ </Pressable>
68
+ </View>
69
+ </Modal>
70
+ </View>
71
+ );
72
+ }
73
+
74
+ function createStyles(theme: FieldFlowTheme) {
75
+ return StyleSheet.create({
76
+ trigger: {
77
+ width: 22,
78
+ height: 22,
79
+ borderRadius: 11,
80
+ alignItems: 'center',
81
+ justifyContent: 'center',
82
+ backgroundColor: `${theme.colors.info}18`,
83
+ },
84
+ backdrop: {
85
+ ...StyleSheet.absoluteFill,
86
+ backgroundColor: 'rgba(0,0,0,0.35)',
87
+ },
88
+ sheet: {
89
+ position: 'absolute',
90
+ left: 24,
91
+ right: 24,
92
+ top: '32%',
93
+ padding: 18,
94
+ borderRadius: theme.spacing.borderRadius + 4,
95
+ backgroundColor: theme.colors.surfaceElevated ?? theme.colors.background,
96
+ borderWidth: StyleSheet.hairlineWidth,
97
+ borderColor: theme.colors.border,
98
+ },
99
+ title: {
100
+ fontSize: theme.typography.fontSize,
101
+ fontWeight: '700',
102
+ color: theme.colors.text,
103
+ marginBottom: 8,
104
+ },
105
+ body: {
106
+ fontSize: theme.typography.helperFontSize + 1,
107
+ color: theme.colors.label,
108
+ lineHeight: theme.typography.helperFontSize + 8,
109
+ marginBottom: 16,
110
+ },
111
+ done: {
112
+ alignSelf: 'flex-end',
113
+ paddingHorizontal: 14,
114
+ paddingVertical: 8,
115
+ borderRadius: theme.spacing.borderRadius,
116
+ backgroundColor: theme.colors.borderFocused,
117
+ },
118
+ doneText: { color: '#fff', fontWeight: '700', fontSize: theme.typography.helperFontSize + 1 },
119
+ });
120
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowInfoTip } from './FieldFlowInfoTip';
2
+ export type { FieldFlowInfoTipProps } from './FieldFlowInfoTip';
@@ -0,0 +1,134 @@
1
+ import React, { useEffect, useMemo, useRef } from 'react';
2
+ import { Animated, Easing, 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 { useReducedMotion } from '../../motion/useReducedMotion';
7
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
8
+
9
+ export type FieldFlowAlertTone = 'info' | 'success' | 'warning' | 'error' | 'neutral';
10
+
11
+ export interface FieldFlowInlineAlertProps {
12
+ tone?: FieldFlowAlertTone;
13
+ title?: string;
14
+ message: string;
15
+ /** Soft enter animation. Default: true. */
16
+ animated?: boolean;
17
+ containerStyle?: ViewStyle;
18
+ titleStyle?: TextStyle;
19
+ messageStyle?: TextStyle;
20
+ theme?: DeepPartial<FieldFlowTheme>;
21
+ testID?: string;
22
+ }
23
+
24
+ /**
25
+ * Calm inline banner — tips, soft warnings, success notes.
26
+ * Easy on the eyes; themeable tones.
27
+ */
28
+ export function FieldFlowInlineAlert({
29
+ tone = 'info',
30
+ title,
31
+ message,
32
+ animated = true,
33
+ containerStyle,
34
+ titleStyle,
35
+ messageStyle,
36
+ theme: themeOverride,
37
+ testID,
38
+ }: FieldFlowInlineAlertProps) {
39
+ const contextTheme = useFieldFlowTheme();
40
+ const theme = useMemo(
41
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
42
+ [contextTheme, themeOverride],
43
+ );
44
+ const reducedMotion = useReducedMotion();
45
+ const opacity = useRef(new Animated.Value(animated && !reducedMotion ? 0 : 1)).current;
46
+ const translate = useRef(new Animated.Value(animated && !reducedMotion ? 6 : 0)).current;
47
+
48
+ useEffect(() => {
49
+ if (!animated || reducedMotion) return;
50
+ Animated.parallel([
51
+ Animated.timing(opacity, {
52
+ toValue: 1,
53
+ duration: theme.animation.duration + 80,
54
+ easing: Easing.out(Easing.cubic),
55
+ useNativeDriver: true,
56
+ }),
57
+ Animated.timing(translate, {
58
+ toValue: 0,
59
+ duration: theme.animation.duration + 80,
60
+ easing: Easing.out(Easing.cubic),
61
+ useNativeDriver: true,
62
+ }),
63
+ ]).start();
64
+ }, [animated, reducedMotion, opacity, translate, theme.animation.duration]);
65
+
66
+ const palette = toneColors(theme, tone);
67
+ const styles = useMemo(() => createStyles(theme, palette), [theme, palette]);
68
+ const icon =
69
+ tone === 'success' ? 'check' : tone === 'error' || tone === 'warning' ? 'alert' : 'info';
70
+
71
+ return (
72
+ <Animated.View
73
+ style={[styles.wrap, containerStyle, { opacity, transform: [{ translateY: translate }] }]}
74
+ testID={testID}
75
+ accessibilityRole="text"
76
+ >
77
+ <View style={styles.icon}>{renderFieldFlowIcon(icon, palette.fg, 16)}</View>
78
+ <View style={styles.copy}>
79
+ {title ? <Text style={[styles.title, titleStyle]}>{title}</Text> : null}
80
+ <Text style={[styles.message, messageStyle]}>{message}</Text>
81
+ </View>
82
+ </Animated.View>
83
+ );
84
+ }
85
+
86
+ function toneColors(theme: FieldFlowTheme, tone: FieldFlowAlertTone) {
87
+ switch (tone) {
88
+ case 'success':
89
+ return { fg: theme.colors.success, bg: softBg(theme.colors.success) };
90
+ case 'warning':
91
+ return { fg: theme.colors.warning, bg: softBg(theme.colors.warning) };
92
+ case 'error':
93
+ return { fg: theme.colors.error, bg: softBg(theme.colors.error) };
94
+ case 'neutral':
95
+ return { fg: theme.colors.label, bg: theme.colors.surfaceMuted };
96
+ case 'info':
97
+ default:
98
+ return { fg: theme.colors.info, bg: softBg(theme.colors.info) };
99
+ }
100
+ }
101
+
102
+ function softBg(hex: string): string {
103
+ // Simple alpha wash without color lib — works for #RRGGBB
104
+ if (hex.startsWith('#') && hex.length === 7) return `${hex}18`;
105
+ return hex;
106
+ }
107
+
108
+ function createStyles(theme: FieldFlowTheme, palette: { fg: string; bg: string }) {
109
+ return StyleSheet.create({
110
+ wrap: {
111
+ flexDirection: 'row',
112
+ gap: 10,
113
+ padding: theme.spacing.paddingHorizontal,
114
+ borderRadius: theme.spacing.borderRadius,
115
+ backgroundColor: palette.bg,
116
+ borderWidth: StyleSheet.hairlineWidth,
117
+ borderColor: `${palette.fg}33`,
118
+ marginBottom: theme.spacing.gap * 2,
119
+ },
120
+ icon: { paddingTop: 2 },
121
+ copy: { flex: 1 },
122
+ title: {
123
+ fontSize: theme.typography.helperFontSize + 1,
124
+ fontWeight: '600',
125
+ color: palette.fg,
126
+ marginBottom: 2,
127
+ },
128
+ message: {
129
+ fontSize: theme.typography.helperFontSize,
130
+ color: theme.colors.text,
131
+ lineHeight: theme.typography.helperFontSize + 6,
132
+ },
133
+ });
134
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowInlineAlert } from './FieldFlowInlineAlert';
2
+ export type { FieldFlowInlineAlertProps, FieldFlowAlertTone } from './FieldFlowInlineAlert';