rn-inputforge 0.3.0 → 0.4.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 (196) hide show
  1. package/README.md +224 -19
  2. package/lib/commonjs/components/FieldFlowCheckbox/FieldFlowCheckbox.js +131 -0
  3. package/lib/commonjs/components/FieldFlowCheckbox/FieldFlowCheckbox.js.map +1 -0
  4. package/lib/commonjs/components/FieldFlowCheckbox/index.js +13 -0
  5. package/lib/commonjs/components/FieldFlowCheckbox/index.js.map +1 -0
  6. package/lib/commonjs/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js +536 -0
  7. package/lib/commonjs/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js.map +1 -0
  8. package/lib/commonjs/components/FieldFlowDateTimePicker/index.js +13 -0
  9. package/lib/commonjs/components/FieldFlowDateTimePicker/index.js.map +1 -0
  10. package/lib/commonjs/components/FieldFlowDateTimePicker/types.js +6 -0
  11. package/lib/commonjs/components/FieldFlowDateTimePicker/types.js.map +1 -0
  12. package/lib/commonjs/components/FieldFlowDropdown/FieldFlowDropdown.js +24 -9
  13. package/lib/commonjs/components/FieldFlowDropdown/FieldFlowDropdown.js.map +1 -1
  14. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js +55 -24
  15. package/lib/commonjs/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  16. package/lib/commonjs/components/FieldFlowInput/styles.js +32 -11
  17. package/lib/commonjs/components/FieldFlowInput/styles.js.map +1 -1
  18. package/lib/commonjs/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js +66 -0
  19. package/lib/commonjs/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js.map +1 -0
  20. package/lib/commonjs/components/FieldFlowMaskedInput/index.js +13 -0
  21. package/lib/commonjs/components/FieldFlowMaskedInput/index.js.map +1 -0
  22. package/lib/commonjs/components/FieldFlowMaskedInput/types.js +6 -0
  23. package/lib/commonjs/components/FieldFlowMaskedInput/types.js.map +1 -0
  24. package/lib/commonjs/components/FieldFlowOTP/FieldFlowOTP.js +255 -0
  25. package/lib/commonjs/components/FieldFlowOTP/FieldFlowOTP.js.map +1 -0
  26. package/lib/commonjs/components/FieldFlowOTP/index.js +13 -0
  27. package/lib/commonjs/components/FieldFlowOTP/index.js.map +1 -0
  28. package/lib/commonjs/components/FieldFlowOTP/types.js +6 -0
  29. package/lib/commonjs/components/FieldFlowOTP/types.js.map +1 -0
  30. package/lib/commonjs/components/FieldFlowRadio/FieldFlowRadio.js +164 -0
  31. package/lib/commonjs/components/FieldFlowRadio/FieldFlowRadio.js.map +1 -0
  32. package/lib/commonjs/components/FieldFlowRadio/index.js +13 -0
  33. package/lib/commonjs/components/FieldFlowRadio/index.js.map +1 -0
  34. package/lib/commonjs/components/FieldFlowSwitch/FieldFlowSwitch.js +152 -0
  35. package/lib/commonjs/components/FieldFlowSwitch/FieldFlowSwitch.js.map +1 -0
  36. package/lib/commonjs/components/FieldFlowSwitch/index.js +13 -0
  37. package/lib/commonjs/components/FieldFlowSwitch/index.js.map +1 -0
  38. package/lib/commonjs/hooks/index.js.map +1 -1
  39. package/lib/commonjs/hooks/useFieldFlowForm.js +146 -31
  40. package/lib/commonjs/hooks/useFieldFlowForm.js.map +1 -1
  41. package/lib/commonjs/icons/Icon.js +719 -30
  42. package/lib/commonjs/icons/Icon.js.map +1 -1
  43. package/lib/commonjs/icons/index.js +7 -0
  44. package/lib/commonjs/icons/index.js.map +1 -1
  45. package/lib/commonjs/icons/renderIcon.js +24 -0
  46. package/lib/commonjs/icons/renderIcon.js.map +1 -0
  47. package/lib/commonjs/index.js +127 -0
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/utils/masks.js +130 -0
  50. package/lib/commonjs/utils/masks.js.map +1 -0
  51. package/lib/commonjs/validation/index.js +25 -0
  52. package/lib/commonjs/validation/index.js.map +1 -1
  53. package/lib/commonjs/validation/zodAdapter.js +91 -0
  54. package/lib/commonjs/validation/zodAdapter.js.map +1 -0
  55. package/lib/module/components/FieldFlowCheckbox/FieldFlowCheckbox.js +126 -0
  56. package/lib/module/components/FieldFlowCheckbox/FieldFlowCheckbox.js.map +1 -0
  57. package/lib/module/components/FieldFlowCheckbox/index.js +4 -0
  58. package/lib/module/components/FieldFlowCheckbox/index.js.map +1 -0
  59. package/lib/module/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js +531 -0
  60. package/lib/module/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.js.map +1 -0
  61. package/lib/module/components/FieldFlowDateTimePicker/index.js +4 -0
  62. package/lib/module/components/FieldFlowDateTimePicker/index.js.map +1 -0
  63. package/lib/module/components/FieldFlowDateTimePicker/types.js +4 -0
  64. package/lib/module/components/FieldFlowDateTimePicker/types.js.map +1 -0
  65. package/lib/module/components/FieldFlowDropdown/FieldFlowDropdown.js +24 -9
  66. package/lib/module/components/FieldFlowDropdown/FieldFlowDropdown.js.map +1 -1
  67. package/lib/module/components/FieldFlowInput/FieldFlowInput.js +59 -28
  68. package/lib/module/components/FieldFlowInput/FieldFlowInput.js.map +1 -1
  69. package/lib/module/components/FieldFlowInput/styles.js +32 -11
  70. package/lib/module/components/FieldFlowInput/styles.js.map +1 -1
  71. package/lib/module/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js +61 -0
  72. package/lib/module/components/FieldFlowMaskedInput/FieldFlowMaskedInput.js.map +1 -0
  73. package/lib/module/components/FieldFlowMaskedInput/index.js +4 -0
  74. package/lib/module/components/FieldFlowMaskedInput/index.js.map +1 -0
  75. package/lib/module/components/FieldFlowMaskedInput/types.js +4 -0
  76. package/lib/module/components/FieldFlowMaskedInput/types.js.map +1 -0
  77. package/lib/module/components/FieldFlowOTP/FieldFlowOTP.js +250 -0
  78. package/lib/module/components/FieldFlowOTP/FieldFlowOTP.js.map +1 -0
  79. package/lib/module/components/FieldFlowOTP/index.js +4 -0
  80. package/lib/module/components/FieldFlowOTP/index.js.map +1 -0
  81. package/lib/module/components/FieldFlowOTP/types.js +4 -0
  82. package/lib/module/components/FieldFlowOTP/types.js.map +1 -0
  83. package/lib/module/components/FieldFlowRadio/FieldFlowRadio.js +159 -0
  84. package/lib/module/components/FieldFlowRadio/FieldFlowRadio.js.map +1 -0
  85. package/lib/module/components/FieldFlowRadio/index.js +4 -0
  86. package/lib/module/components/FieldFlowRadio/index.js.map +1 -0
  87. package/lib/module/components/FieldFlowSwitch/FieldFlowSwitch.js +147 -0
  88. package/lib/module/components/FieldFlowSwitch/FieldFlowSwitch.js.map +1 -0
  89. package/lib/module/components/FieldFlowSwitch/index.js +4 -0
  90. package/lib/module/components/FieldFlowSwitch/index.js.map +1 -0
  91. package/lib/module/hooks/index.js.map +1 -1
  92. package/lib/module/hooks/useFieldFlowForm.js +147 -32
  93. package/lib/module/hooks/useFieldFlowForm.js.map +1 -1
  94. package/lib/module/icons/Icon.js +720 -31
  95. package/lib/module/icons/Icon.js.map +1 -1
  96. package/lib/module/icons/index.js +1 -0
  97. package/lib/module/icons/index.js.map +1 -1
  98. package/lib/module/icons/renderIcon.js +19 -0
  99. package/lib/module/icons/renderIcon.js.map +1 -0
  100. package/lib/module/index.js +11 -3
  101. package/lib/module/index.js.map +1 -1
  102. package/lib/module/utils/masks.js +118 -0
  103. package/lib/module/utils/masks.js.map +1 -0
  104. package/lib/module/validation/index.js +1 -0
  105. package/lib/module/validation/index.js.map +1 -1
  106. package/lib/module/validation/zodAdapter.js +84 -0
  107. package/lib/module/validation/zodAdapter.js.map +1 -0
  108. package/lib/typescript/components/FieldFlowCheckbox/FieldFlowCheckbox.d.ts +36 -0
  109. package/lib/typescript/components/FieldFlowCheckbox/FieldFlowCheckbox.d.ts.map +1 -0
  110. package/lib/typescript/components/FieldFlowCheckbox/index.d.ts +3 -0
  111. package/lib/typescript/components/FieldFlowCheckbox/index.d.ts.map +1 -0
  112. package/lib/typescript/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.d.ts +4 -0
  113. package/lib/typescript/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.d.ts.map +1 -0
  114. package/lib/typescript/components/FieldFlowDateTimePicker/index.d.ts +3 -0
  115. package/lib/typescript/components/FieldFlowDateTimePicker/index.d.ts.map +1 -0
  116. package/lib/typescript/components/FieldFlowDateTimePicker/types.d.ts +55 -0
  117. package/lib/typescript/components/FieldFlowDateTimePicker/types.d.ts.map +1 -0
  118. package/lib/typescript/components/FieldFlowDropdown/FieldFlowDropdown.d.ts.map +1 -1
  119. package/lib/typescript/components/FieldFlowDropdown/types.d.ts +7 -1
  120. package/lib/typescript/components/FieldFlowDropdown/types.d.ts.map +1 -1
  121. package/lib/typescript/components/FieldFlowInput/FieldFlowInput.d.ts.map +1 -1
  122. package/lib/typescript/components/FieldFlowInput/styles.d.ts +19 -2
  123. package/lib/typescript/components/FieldFlowInput/styles.d.ts.map +1 -1
  124. package/lib/typescript/components/FieldFlowInput/types.d.ts +24 -5
  125. package/lib/typescript/components/FieldFlowInput/types.d.ts.map +1 -1
  126. package/lib/typescript/components/FieldFlowMaskedInput/FieldFlowMaskedInput.d.ts +5 -0
  127. package/lib/typescript/components/FieldFlowMaskedInput/FieldFlowMaskedInput.d.ts.map +1 -0
  128. package/lib/typescript/components/FieldFlowMaskedInput/index.d.ts +3 -0
  129. package/lib/typescript/components/FieldFlowMaskedInput/index.d.ts.map +1 -0
  130. package/lib/typescript/components/FieldFlowMaskedInput/types.d.ts +20 -0
  131. package/lib/typescript/components/FieldFlowMaskedInput/types.d.ts.map +1 -0
  132. package/lib/typescript/components/FieldFlowOTP/FieldFlowOTP.d.ts +4 -0
  133. package/lib/typescript/components/FieldFlowOTP/FieldFlowOTP.d.ts.map +1 -0
  134. package/lib/typescript/components/FieldFlowOTP/index.d.ts +3 -0
  135. package/lib/typescript/components/FieldFlowOTP/index.d.ts.map +1 -0
  136. package/lib/typescript/components/FieldFlowOTP/types.d.ts +52 -0
  137. package/lib/typescript/components/FieldFlowOTP/types.d.ts.map +1 -0
  138. package/lib/typescript/components/FieldFlowRadio/FieldFlowRadio.d.ts +39 -0
  139. package/lib/typescript/components/FieldFlowRadio/FieldFlowRadio.d.ts.map +1 -0
  140. package/lib/typescript/components/FieldFlowRadio/index.d.ts +3 -0
  141. package/lib/typescript/components/FieldFlowRadio/index.d.ts.map +1 -0
  142. package/lib/typescript/components/FieldFlowSwitch/FieldFlowSwitch.d.ts +31 -0
  143. package/lib/typescript/components/FieldFlowSwitch/FieldFlowSwitch.d.ts.map +1 -0
  144. package/lib/typescript/components/FieldFlowSwitch/index.d.ts +3 -0
  145. package/lib/typescript/components/FieldFlowSwitch/index.d.ts.map +1 -0
  146. package/lib/typescript/hooks/index.d.ts +1 -1
  147. package/lib/typescript/hooks/index.d.ts.map +1 -1
  148. package/lib/typescript/hooks/useFieldFlowForm.d.ts +46 -7
  149. package/lib/typescript/hooks/useFieldFlowForm.d.ts.map +1 -1
  150. package/lib/typescript/icons/Icon.d.ts +2 -2
  151. package/lib/typescript/icons/Icon.d.ts.map +1 -1
  152. package/lib/typescript/icons/index.d.ts +2 -0
  153. package/lib/typescript/icons/index.d.ts.map +1 -1
  154. package/lib/typescript/icons/renderIcon.d.ts +6 -0
  155. package/lib/typescript/icons/renderIcon.d.ts.map +1 -0
  156. package/lib/typescript/index.d.ts +20 -6
  157. package/lib/typescript/index.d.ts.map +1 -1
  158. package/lib/typescript/types/index.d.ts +4 -0
  159. package/lib/typescript/types/index.d.ts.map +1 -1
  160. package/lib/typescript/utils/masks.d.ts +37 -0
  161. package/lib/typescript/utils/masks.d.ts.map +1 -0
  162. package/lib/typescript/validation/index.d.ts +2 -0
  163. package/lib/typescript/validation/index.d.ts.map +1 -1
  164. package/lib/typescript/validation/zodAdapter.d.ts +53 -0
  165. package/lib/typescript/validation/zodAdapter.d.ts.map +1 -0
  166. package/package.json +27 -5
  167. package/src/components/FieldFlowCheckbox/FieldFlowCheckbox.tsx +174 -0
  168. package/src/components/FieldFlowCheckbox/index.ts +2 -0
  169. package/src/components/FieldFlowDateTimePicker/FieldFlowDateTimePicker.tsx +585 -0
  170. package/src/components/FieldFlowDateTimePicker/index.ts +2 -0
  171. package/src/components/FieldFlowDateTimePicker/types.ts +57 -0
  172. package/src/components/FieldFlowDropdown/FieldFlowDropdown.tsx +17 -7
  173. package/src/components/FieldFlowDropdown/types.ts +8 -1
  174. package/src/components/FieldFlowInput/FieldFlowInput.tsx +69 -26
  175. package/src/components/FieldFlowInput/styles.ts +41 -6
  176. package/src/components/FieldFlowInput/types.ts +24 -5
  177. package/src/components/FieldFlowMaskedInput/FieldFlowMaskedInput.tsx +76 -0
  178. package/src/components/FieldFlowMaskedInput/index.ts +2 -0
  179. package/src/components/FieldFlowMaskedInput/types.ts +22 -0
  180. package/src/components/FieldFlowOTP/FieldFlowOTP.tsx +305 -0
  181. package/src/components/FieldFlowOTP/index.ts +2 -0
  182. package/src/components/FieldFlowOTP/types.ts +57 -0
  183. package/src/components/FieldFlowRadio/FieldFlowRadio.tsx +215 -0
  184. package/src/components/FieldFlowRadio/index.ts +2 -0
  185. package/src/components/FieldFlowSwitch/FieldFlowSwitch.tsx +172 -0
  186. package/src/components/FieldFlowSwitch/index.ts +2 -0
  187. package/src/hooks/index.ts +3 -0
  188. package/src/hooks/useFieldFlowForm.ts +209 -33
  189. package/src/icons/Icon.tsx +451 -5
  190. package/src/icons/index.ts +2 -0
  191. package/src/icons/renderIcon.tsx +17 -0
  192. package/src/index.ts +47 -4
  193. package/src/types/index.ts +5 -0
  194. package/src/utils/masks.ts +137 -0
  195. package/src/validation/index.ts +7 -0
  196. package/src/validation/zodAdapter.ts +103 -0
@@ -0,0 +1,37 @@
1
+ export type FieldFlowMaskType = 'phone' | 'card' | 'currency' | 'date' | 'custom';
2
+ export interface MaskResult {
3
+ /** Display value shown in the input. */
4
+ formatted: string;
5
+ /** Digits / raw value without mask characters (currency keeps decimal point). */
6
+ raw: string;
7
+ }
8
+ export interface ApplyMaskOptions {
9
+ /** Currency symbol prefix, e.g. "$" or "Rs ". Default: "$". */
10
+ currencySymbol?: string;
11
+ /** Max decimal places for currency. Default: 2. */
12
+ currencyDecimals?: number;
13
+ /** Custom mask pattern using `#` for digits. E.g. `(###) ###-####`. */
14
+ pattern?: string;
15
+ }
16
+ /** Strip everything except digits. */
17
+ export declare function digitsOnly(value: string): string;
18
+ /**
19
+ * Apply a digit pattern where `#` is a digit slot and any other char is literal.
20
+ * Extra digits beyond the pattern are ignored.
21
+ */
22
+ export declare function applyPattern(rawDigits: string, pattern: string): MaskResult;
23
+ export declare function applyPhoneMask(value: string): MaskResult;
24
+ export declare function applyCardMask(value: string): MaskResult;
25
+ export declare function applyDateMask(value: string): MaskResult;
26
+ export declare function applyCurrencyMask(value: string, symbol?: string, decimals?: number): MaskResult;
27
+ /**
28
+ * Format a value with a built-in or custom mask.
29
+ * Pass the previous formatted value's raw length context via the incoming `value`
30
+ * (the function always re-derives from the full string the user typed).
31
+ */
32
+ export declare function applyMask(value: string, type: FieldFlowMaskType, options?: ApplyMaskOptions): MaskResult;
33
+ /** Convenience: return only the formatted display string. */
34
+ export declare function formatMasked(value: string, type: FieldFlowMaskType, options?: ApplyMaskOptions): string;
35
+ /** Convenience: return only the raw (unmasked) value. */
36
+ export declare function unmask(value: string, type: FieldFlowMaskType, options?: ApplyMaskOptions): string;
37
+ //# sourceMappingURL=masks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masks.d.ts","sourceRoot":"","sources":["../../../src/utils/masks.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAElF,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,sCAAsC;AACtC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAY3E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAUxD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAIvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAGvD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,SAAM,EACZ,QAAQ,SAAI,GACX,UAAU,CAqBZ;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,gBAAqB,GAC7B,UAAU,CAkBZ;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAER;AAED,yDAAyD;AACzD,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAER"}
@@ -1,4 +1,6 @@
1
1
  export { isValidEmail, isValidNumber, isValidPhone, requiredValidator, emailValidator, numberValidator, phoneValidator, minLengthValidator, maxLengthValidator, patternValidator, runRules, } from './validators';
2
2
  export { useValidation } from './useValidation';
3
3
  export type { UseValidationResult } from './useValidation';
4
+ export { zodToFormErrors, zodFormValidate, createZodSubmitGuard, fieldRulesFromZodString, } from './zodAdapter';
5
+ export type { ZodSchemaLike, ZodIssueLike, ZodErrorLike } from './zodAdapter';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { FieldFlowRules } from '../types';
2
+ /**
3
+ * Minimal structural types so consumers can pass a Zod schema without
4
+ * rn-inputforge taking a hard dependency on `zod`.
5
+ */
6
+ export interface ZodIssueLike {
7
+ path: (string | number)[];
8
+ message: string;
9
+ }
10
+ export interface ZodErrorLike {
11
+ issues: ZodIssueLike[];
12
+ }
13
+ export interface ZodSchemaLike<T = unknown> {
14
+ safeParse: (data: unknown) => {
15
+ success: true;
16
+ data: T;
17
+ } | {
18
+ success: false;
19
+ error: ZodErrorLike;
20
+ };
21
+ }
22
+ /**
23
+ * Convert a Zod schema parse failure into FieldFlow form errors
24
+ * (first message per top-level field).
25
+ */
26
+ export declare function zodToFormErrors<T extends Record<string, string>>(schema: ZodSchemaLike<T>, values: T): Partial<Record<keyof T, string>>;
27
+ /**
28
+ * Drop into `useFieldFlowForm({ formValidate: zodFormValidate(schema) })`.
29
+ */
30
+ export declare function zodFormValidate<T extends Record<string, string>>(schema: ZodSchemaLike<T>): (values: T) => Partial<Record<keyof T, string>>;
31
+ /**
32
+ * Wrap an `onSubmit` so it only runs when Zod passes.
33
+ * Useful if you keep FieldFlow rules for UX and Zod as the final gate.
34
+ */
35
+ export declare function createZodSubmitGuard<T extends Record<string, string>>(schema: ZodSchemaLike<T>, onValid: (values: T) => void | Promise<void>, onInvalid?: (errors: Partial<Record<keyof T, string>>) => void): (values: T) => Promise<void>;
36
+ /**
37
+ * Best-effort map of a Zod string schema onto declarative `FieldFlowRules`.
38
+ * Supports required / email / min / max / regex. For refinements and objects,
39
+ * use `zodFormValidate` instead.
40
+ */
41
+ export declare function fieldRulesFromZodString(zodStringSchema: {
42
+ _def?: {
43
+ typeName?: string;
44
+ checks?: Array<{
45
+ kind: string;
46
+ value?: unknown;
47
+ regex?: RegExp;
48
+ message?: string;
49
+ }>;
50
+ };
51
+ isOptional?: () => boolean;
52
+ }): FieldFlowRules;
53
+ //# sourceMappingURL=zodAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zodAdapter.d.ts","sourceRoot":"","sources":["../../../src/validation/zodAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC;CACpG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAYlC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,IAChF,QAAQ,CAAC,sCAClB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC5C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,IAEhD,QAAQ,CAAC,mBAQxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE;IACvD,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrF,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CAC5B,GAAG,cAAc,CAyBjB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rn-inputforge",
3
- "version": "0.3.0",
4
- "description": "A production-ready, highly customizable input field system for React Native (bare CLI) — text/email/number/phone/password/search fields, description fields, chat input, and a single/multi-select dropdown (bottom sheet, popup, or inline), with built-in validation, theming, icons, and keyboard-aware form navigation.",
3
+ "version": "0.4.0",
4
+ "description": "A production-ready, highly customizable input field system for React Native (bare CLI & Expo) — text/email/number/phone/password/search, OTP, masked inputs, date/time picker, checkbox/radio/switch, description, chat input, and single/multi-select dropdown, with variants, built-in icons, validation (async, cross-field, Zod), theming, and keyboard-aware form navigation.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
7
7
  "types": "lib/typescript/index.d.ts",
@@ -33,20 +33,42 @@
33
33
  "form",
34
34
  "form-builder",
35
35
  "chat-input",
36
+ "otp",
37
+ "pin",
38
+ "masked-input",
39
+ "checkbox",
40
+ "radio",
41
+ "switch",
36
42
  "dropdown",
37
43
  "select",
38
44
  "multi-select",
39
45
  "bottom-sheet",
40
46
  "keyboard-aware",
41
47
  "validation",
48
+ "zod",
42
49
  "typescript",
50
+ "expo",
43
51
  "bare-react-native-cli"
44
52
  ],
45
- "author": "Your Name <you@example.com>",
53
+ "author": "Saad Waheed Khan",
46
54
  "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/saadwaheed10/rn-inputforge.git"
58
+ },
59
+ "homepage": "https://github.com/saadwaheed10/rn-inputforge#readme",
60
+ "bugs": {
61
+ "url": "https://github.com/saadwaheed10/rn-inputforge/issues"
62
+ },
47
63
  "peerDependencies": {
48
64
  "react": ">=18.0.0",
49
- "react-native": ">=0.73.0"
65
+ "react-native": ">=0.73.0",
66
+ "zod": ">=3.0.0"
67
+ },
68
+ "peerDependenciesMeta": {
69
+ "zod": {
70
+ "optional": true
71
+ }
50
72
  },
51
73
  "devDependencies": {
52
74
  "@react-native/eslint-config": "^0.81.0",
@@ -55,7 +77,7 @@
55
77
  "prettier": "^3.4.2",
56
78
  "react": "19.2.8",
57
79
  "react-native": "0.86.2",
58
- "react-native-builder-bob": "^0.41.0",
80
+ "react-native-builder-bob": "^0.43.0",
59
81
  "rimraf": "^6.0.1",
60
82
  "typescript": "^5.7.3"
61
83
  },
@@ -0,0 +1,174 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Pressable, StyleSheet, Text, View, ViewStyle, TextStyle } from 'react-native';
3
+ import { useFieldFlowTheme, mergeDeep } from '../../theme/ThemeProvider';
4
+ import { defaultTheme } from '../../theme/defaultTheme';
5
+ import { renderFieldFlowIcon, type FieldFlowIconSource } from '../../icons';
6
+ import type { DeepPartial, FieldFlowTheme } from '../../types';
7
+
8
+ export interface FieldFlowCheckboxProps {
9
+ value: boolean;
10
+ onChange: (value: boolean) => void;
11
+ label?: string;
12
+ helperText?: string;
13
+ errorText?: string;
14
+ disabled?: boolean;
15
+ required?: boolean;
16
+ /** Position of the label relative to the box. Default: 'right'. */
17
+ labelPosition?: 'left' | 'right';
18
+ /** Icon shown when checked. Default: 'check'. Pass a custom node to fully replace. */
19
+ checkedIcon?: FieldFlowIconSource;
20
+ /** Optional icon shown when unchecked. */
21
+ uncheckedIcon?: FieldFlowIconSource;
22
+ /** Icon beside the label (leading). */
23
+ leftIcon?: FieldFlowIconSource;
24
+ iconSize?: number;
25
+ /** Checked box / icon tint. Defaults to theme borderFocused. */
26
+ checkedColor?: string;
27
+ /** Unchecked border color. */
28
+ uncheckedColor?: string;
29
+ boxSize?: number;
30
+ boxStyle?: ViewStyle;
31
+ containerStyle?: ViewStyle;
32
+ labelStyle?: TextStyle;
33
+ helperStyle?: TextStyle;
34
+ errorStyle?: TextStyle;
35
+ theme?: DeepPartial<FieldFlowTheme>;
36
+ testID?: string;
37
+ }
38
+
39
+ export function FieldFlowCheckbox({
40
+ value,
41
+ onChange,
42
+ label,
43
+ helperText,
44
+ errorText,
45
+ disabled,
46
+ required,
47
+ labelPosition = 'right',
48
+ checkedIcon = 'check',
49
+ uncheckedIcon,
50
+ leftIcon,
51
+ iconSize = 14,
52
+ checkedColor,
53
+ uncheckedColor,
54
+ boxSize = 22,
55
+ boxStyle,
56
+ containerStyle,
57
+ labelStyle,
58
+ helperStyle,
59
+ errorStyle,
60
+ theme: themeOverride,
61
+ testID,
62
+ }: FieldFlowCheckboxProps) {
63
+ const contextTheme = useFieldFlowTheme();
64
+ const theme = useMemo(
65
+ () => (themeOverride ? mergeDeep(contextTheme ?? defaultTheme, themeOverride) : contextTheme ?? defaultTheme),
66
+ [contextTheme, themeOverride],
67
+ );
68
+ const styles = useMemo(
69
+ () => createStyles(theme, Boolean(errorText), Boolean(disabled), boxSize),
70
+ [theme, errorText, disabled, boxSize],
71
+ );
72
+ const checked = Boolean(value);
73
+ const activeColor = checkedColor ?? theme.colors.borderFocused;
74
+ const idleColor = uncheckedColor ?? (errorText ? theme.colors.borderError : theme.colors.border);
75
+
76
+ const box = (
77
+ <View
78
+ style={[
79
+ styles.box,
80
+ checked && { backgroundColor: activeColor, borderColor: activeColor },
81
+ !checked && { borderColor: idleColor },
82
+ disabled ? styles.boxDisabled : null,
83
+ boxStyle,
84
+ ]}
85
+ >
86
+ {checked
87
+ ? renderFieldFlowIcon(checkedIcon, '#FFFFFF', iconSize)
88
+ : uncheckedIcon
89
+ ? renderFieldFlowIcon(uncheckedIcon, idleColor, iconSize)
90
+ : null}
91
+ </View>
92
+ );
93
+
94
+ const labelNode = label ? (
95
+ <Text style={[styles.label, labelStyle]}>
96
+ {label}
97
+ {required ? ' *' : ''}
98
+ </Text>
99
+ ) : null;
100
+
101
+ return (
102
+ <View style={[styles.wrapper, containerStyle]} testID={testID}>
103
+ <Pressable
104
+ onPress={() => !disabled && onChange(!checked)}
105
+ disabled={disabled}
106
+ style={styles.row}
107
+ accessibilityRole="checkbox"
108
+ accessibilityState={{ checked, disabled: Boolean(disabled) }}
109
+ accessibilityLabel={label}
110
+ hitSlop={6}
111
+ >
112
+ {leftIcon ? (
113
+ <View style={styles.leftIcon}>{renderFieldFlowIcon(leftIcon, theme.colors.icon, 18)}</View>
114
+ ) : null}
115
+ {labelPosition === 'left' ? labelNode : null}
116
+ {box}
117
+ {labelPosition === 'right' ? labelNode : null}
118
+ </Pressable>
119
+ {errorText ? (
120
+ <Text style={[styles.errorText, errorStyle, helperStyle]}>{errorText}</Text>
121
+ ) : helperText ? (
122
+ <Text style={[styles.helperText, helperStyle]}>{helperText}</Text>
123
+ ) : null}
124
+ </View>
125
+ );
126
+ }
127
+
128
+ function createStyles(theme: FieldFlowTheme, _hasError: boolean, disabled: boolean, boxSize: number) {
129
+ return StyleSheet.create({
130
+ wrapper: {
131
+ marginBottom: theme.spacing.gap * 2,
132
+ opacity: disabled ? 0.6 : 1,
133
+ },
134
+ row: {
135
+ flexDirection: 'row',
136
+ alignItems: 'center',
137
+ gap: theme.spacing.gap,
138
+ },
139
+ leftIcon: {
140
+ marginRight: 2,
141
+ },
142
+ box: {
143
+ width: boxSize,
144
+ height: boxSize,
145
+ borderRadius: 6,
146
+ borderWidth: theme.spacing.borderWidthFocused,
147
+ backgroundColor: theme.colors.background,
148
+ alignItems: 'center',
149
+ justifyContent: 'center',
150
+ },
151
+ boxDisabled: {
152
+ backgroundColor: theme.colors.backgroundDisabled,
153
+ },
154
+ label: {
155
+ flex: 1,
156
+ fontSize: theme.typography.fontSize,
157
+ color: theme.colors.text,
158
+ fontWeight: '400',
159
+ fontFamily: theme.typography.fontFamily,
160
+ },
161
+ helperText: {
162
+ marginTop: theme.spacing.gap / 1.5,
163
+ marginLeft: boxSize + theme.spacing.gap,
164
+ fontSize: theme.typography.helperFontSize,
165
+ color: theme.colors.label,
166
+ },
167
+ errorText: {
168
+ marginTop: theme.spacing.gap / 1.5,
169
+ marginLeft: boxSize + theme.spacing.gap,
170
+ fontSize: theme.typography.helperFontSize,
171
+ color: theme.colors.error,
172
+ },
173
+ });
174
+ }
@@ -0,0 +1,2 @@
1
+ export { FieldFlowCheckbox } from './FieldFlowCheckbox';
2
+ export type { FieldFlowCheckboxProps } from './FieldFlowCheckbox';