@axenstudio/axen-form 0.1.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 (210) hide show
  1. package/README.md +665 -0
  2. package/dist/adapters/yupAdapter.cjs +61 -0
  3. package/dist/adapters/yupAdapter.d.ts +21 -0
  4. package/dist/adapters/yupAdapter.d.ts.map +1 -0
  5. package/dist/adapters/yupAdapter.js +61 -0
  6. package/dist/adapters/zodAdapter.cjs +59 -0
  7. package/dist/adapters/zodAdapter.d.ts +22 -0
  8. package/dist/adapters/zodAdapter.d.ts.map +1 -0
  9. package/dist/adapters/zodAdapter.js +59 -0
  10. package/dist/core/dateUtils.cjs +69 -0
  11. package/dist/core/dateUtils.d.ts +28 -0
  12. package/dist/core/dateUtils.d.ts.map +1 -0
  13. package/dist/core/dateUtils.js +69 -0
  14. package/dist/core/formStore.cjs +184 -0
  15. package/dist/core/formStore.d.ts +39 -0
  16. package/dist/core/formStore.d.ts.map +1 -0
  17. package/dist/core/formStore.js +184 -0
  18. package/dist/core/numberUtils.cjs +59 -0
  19. package/dist/core/numberUtils.d.ts +26 -0
  20. package/dist/core/numberUtils.d.ts.map +1 -0
  21. package/dist/core/numberUtils.js +59 -0
  22. package/dist/core/pathUtils.cjs +44 -0
  23. package/dist/core/pathUtils.d.ts +15 -0
  24. package/dist/core/pathUtils.d.ts.map +1 -0
  25. package/dist/core/pathUtils.js +44 -0
  26. package/dist/core/payloadUtils.cjs +26 -0
  27. package/dist/core/payloadUtils.d.ts +22 -0
  28. package/dist/core/payloadUtils.d.ts.map +1 -0
  29. package/dist/core/payloadUtils.js +26 -0
  30. package/dist/core/validation.cjs +41 -0
  31. package/dist/core/validation.d.ts +7 -0
  32. package/dist/core/validation.d.ts.map +1 -0
  33. package/dist/core/validation.js +41 -0
  34. package/dist/fields/AutocompleteField/AutocompleteField.cjs +242 -0
  35. package/dist/fields/AutocompleteField/AutocompleteField.d.ts +6 -0
  36. package/dist/fields/AutocompleteField/AutocompleteField.d.ts.map +1 -0
  37. package/dist/fields/AutocompleteField/AutocompleteField.js +242 -0
  38. package/dist/fields/AutocompleteField/AutocompleteField.module.css +168 -0
  39. package/dist/fields/AutocompleteField/AutocompleteField.module.css.cjs +44 -0
  40. package/dist/fields/AutocompleteField/AutocompleteField.module.css.js +44 -0
  41. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.cjs +286 -0
  42. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.d.ts +6 -0
  43. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.d.ts.map +1 -0
  44. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.js +286 -0
  45. package/dist/fields/AutocompletePredictField/AutocompletePredictField.cjs +289 -0
  46. package/dist/fields/AutocompletePredictField/AutocompletePredictField.d.ts +10 -0
  47. package/dist/fields/AutocompletePredictField/AutocompletePredictField.d.ts.map +1 -0
  48. package/dist/fields/AutocompletePredictField/AutocompletePredictField.js +289 -0
  49. package/dist/fields/CheckboxField/CheckboxField.cjs +60 -0
  50. package/dist/fields/CheckboxField/CheckboxField.d.ts +3 -0
  51. package/dist/fields/CheckboxField/CheckboxField.d.ts.map +1 -0
  52. package/dist/fields/CheckboxField/CheckboxField.js +60 -0
  53. package/dist/fields/CheckboxField/CheckboxField.module.css +29 -0
  54. package/dist/fields/CheckboxField/CheckboxField.module.css.cjs +11 -0
  55. package/dist/fields/CheckboxField/CheckboxField.module.css.js +11 -0
  56. package/dist/fields/ColorField/ColorField.cjs +69 -0
  57. package/dist/fields/ColorField/ColorField.d.ts +3 -0
  58. package/dist/fields/ColorField/ColorField.d.ts.map +1 -0
  59. package/dist/fields/ColorField/ColorField.js +69 -0
  60. package/dist/fields/ColorField/ColorField.module.css +33 -0
  61. package/dist/fields/ColorField/ColorField.module.css.cjs +14 -0
  62. package/dist/fields/ColorField/ColorField.module.css.js +14 -0
  63. package/dist/fields/CurrencyField/CurrencyField.cjs +120 -0
  64. package/dist/fields/CurrencyField/CurrencyField.d.ts +10 -0
  65. package/dist/fields/CurrencyField/CurrencyField.d.ts.map +1 -0
  66. package/dist/fields/CurrencyField/CurrencyField.js +120 -0
  67. package/dist/fields/DateField/DateField.cjs +70 -0
  68. package/dist/fields/DateField/DateField.d.ts +7 -0
  69. package/dist/fields/DateField/DateField.d.ts.map +1 -0
  70. package/dist/fields/DateField/DateField.js +70 -0
  71. package/dist/fields/DateTimeField/DateTimeField.cjs +71 -0
  72. package/dist/fields/DateTimeField/DateTimeField.d.ts +8 -0
  73. package/dist/fields/DateTimeField/DateTimeField.d.ts.map +1 -0
  74. package/dist/fields/DateTimeField/DateTimeField.js +71 -0
  75. package/dist/fields/EmailField/EmailField.cjs +57 -0
  76. package/dist/fields/EmailField/EmailField.d.ts +3 -0
  77. package/dist/fields/EmailField/EmailField.d.ts.map +1 -0
  78. package/dist/fields/EmailField/EmailField.js +57 -0
  79. package/dist/fields/NumberField/NumberField.cjs +110 -0
  80. package/dist/fields/NumberField/NumberField.d.ts +10 -0
  81. package/dist/fields/NumberField/NumberField.d.ts.map +1 -0
  82. package/dist/fields/NumberField/NumberField.js +110 -0
  83. package/dist/fields/PasswordField/PasswordField.cjs +77 -0
  84. package/dist/fields/PasswordField/PasswordField.d.ts +3 -0
  85. package/dist/fields/PasswordField/PasswordField.d.ts.map +1 -0
  86. package/dist/fields/PasswordField/PasswordField.js +77 -0
  87. package/dist/fields/PasswordField/PasswordField.module.css +41 -0
  88. package/dist/fields/PasswordField/PasswordField.module.css.cjs +14 -0
  89. package/dist/fields/PasswordField/PasswordField.module.css.js +14 -0
  90. package/dist/fields/PhoneField/PhoneField.cjs +58 -0
  91. package/dist/fields/PhoneField/PhoneField.d.ts +3 -0
  92. package/dist/fields/PhoneField/PhoneField.d.ts.map +1 -0
  93. package/dist/fields/PhoneField/PhoneField.js +58 -0
  94. package/dist/fields/RadioField/RadioField.cjs +66 -0
  95. package/dist/fields/RadioField/RadioField.d.ts +3 -0
  96. package/dist/fields/RadioField/RadioField.d.ts.map +1 -0
  97. package/dist/fields/RadioField/RadioField.js +66 -0
  98. package/dist/fields/RadioField/RadioField.module.css +34 -0
  99. package/dist/fields/RadioField/RadioField.module.css.cjs +14 -0
  100. package/dist/fields/RadioField/RadioField.module.css.js +14 -0
  101. package/dist/fields/SelectField/SelectField.cjs +58 -0
  102. package/dist/fields/SelectField/SelectField.d.ts +3 -0
  103. package/dist/fields/SelectField/SelectField.d.ts.map +1 -0
  104. package/dist/fields/SelectField/SelectField.js +58 -0
  105. package/dist/fields/SliderField/SliderField.cjs +79 -0
  106. package/dist/fields/SliderField/SliderField.d.ts +7 -0
  107. package/dist/fields/SliderField/SliderField.d.ts.map +1 -0
  108. package/dist/fields/SliderField/SliderField.js +79 -0
  109. package/dist/fields/SliderField/SliderField.module.css +76 -0
  110. package/dist/fields/SliderField/SliderField.module.css.cjs +14 -0
  111. package/dist/fields/SliderField/SliderField.module.css.js +14 -0
  112. package/dist/fields/SwitchField/SwitchField.cjs +65 -0
  113. package/dist/fields/SwitchField/SwitchField.d.ts +3 -0
  114. package/dist/fields/SwitchField/SwitchField.d.ts.map +1 -0
  115. package/dist/fields/SwitchField/SwitchField.js +65 -0
  116. package/dist/fields/SwitchField/SwitchField.module.css +79 -0
  117. package/dist/fields/SwitchField/SwitchField.module.css.cjs +17 -0
  118. package/dist/fields/SwitchField/SwitchField.module.css.js +17 -0
  119. package/dist/fields/TextField/TextField.cjs +56 -0
  120. package/dist/fields/TextField/TextField.d.ts +3 -0
  121. package/dist/fields/TextField/TextField.d.ts.map +1 -0
  122. package/dist/fields/TextField/TextField.js +56 -0
  123. package/dist/fields/TextareaField/TextareaField.cjs +57 -0
  124. package/dist/fields/TextareaField/TextareaField.d.ts +5 -0
  125. package/dist/fields/TextareaField/TextareaField.d.ts.map +1 -0
  126. package/dist/fields/TextareaField/TextareaField.js +57 -0
  127. package/dist/fields/TimeField/TimeField.cjs +67 -0
  128. package/dist/fields/TimeField/TimeField.d.ts +6 -0
  129. package/dist/fields/TimeField/TimeField.d.ts.map +1 -0
  130. package/dist/fields/TimeField/TimeField.js +67 -0
  131. package/dist/fields/defaultComponentMap.cjs +43 -0
  132. package/dist/fields/defaultComponentMap.d.ts +7 -0
  133. package/dist/fields/defaultComponentMap.d.ts.map +1 -0
  134. package/dist/fields/defaultComponentMap.js +43 -0
  135. package/dist/fields/fieldBase.module.css +201 -0
  136. package/dist/fields/fieldBase.module.css.cjs +50 -0
  137. package/dist/fields/fieldBase.module.css.js +50 -0
  138. package/dist/fields/fieldUtils.cjs +26 -0
  139. package/dist/fields/fieldUtils.d.ts +24 -0
  140. package/dist/fields/fieldUtils.d.ts.map +1 -0
  141. package/dist/fields/fieldUtils.js +26 -0
  142. package/dist/index.cjs +99 -0
  143. package/dist/index.d.ts +42 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +99 -0
  146. package/dist/layout/Box/Box.cjs +70 -0
  147. package/dist/layout/Box/Box.d.ts +6 -0
  148. package/dist/layout/Box/Box.d.ts.map +1 -0
  149. package/dist/layout/Box/Box.js +70 -0
  150. package/dist/layout/Box/Box.module.css +3 -0
  151. package/dist/layout/Box/Box.module.css.cjs +8 -0
  152. package/dist/layout/Box/Box.module.css.js +8 -0
  153. package/dist/layout/Divider/Divider.cjs +20 -0
  154. package/dist/layout/Divider/Divider.d.ts +6 -0
  155. package/dist/layout/Divider/Divider.d.ts.map +1 -0
  156. package/dist/layout/Divider/Divider.js +20 -0
  157. package/dist/layout/Divider/Divider.module.css +25 -0
  158. package/dist/layout/Divider/Divider.module.css.cjs +14 -0
  159. package/dist/layout/Divider/Divider.module.css.js +14 -0
  160. package/dist/layout/Grid/Grid.cjs +106 -0
  161. package/dist/layout/Grid/Grid.d.ts +7 -0
  162. package/dist/layout/Grid/Grid.d.ts.map +1 -0
  163. package/dist/layout/Grid/Grid.js +106 -0
  164. package/dist/layout/Grid/Grid.module.css +43 -0
  165. package/dist/layout/Grid/Grid.module.css.cjs +23 -0
  166. package/dist/layout/Grid/Grid.module.css.js +23 -0
  167. package/dist/layout/Spacer/Spacer.cjs +30 -0
  168. package/dist/layout/Spacer/Spacer.d.ts +21 -0
  169. package/dist/layout/Spacer/Spacer.d.ts.map +1 -0
  170. package/dist/layout/Spacer/Spacer.js +30 -0
  171. package/dist/layout/Stack/Stack.cjs +52 -0
  172. package/dist/layout/Stack/Stack.d.ts +7 -0
  173. package/dist/layout/Stack/Stack.d.ts.map +1 -0
  174. package/dist/layout/Stack/Stack.js +52 -0
  175. package/dist/layout/Stack/Stack.module.css +3 -0
  176. package/dist/layout/Stack/Stack.module.css.cjs +8 -0
  177. package/dist/layout/Stack/Stack.module.css.js +8 -0
  178. package/dist/layout/index.d.ts +6 -0
  179. package/dist/layout/index.d.ts.map +1 -0
  180. package/dist/react/AxenArrayField.cjs +80 -0
  181. package/dist/react/AxenArrayField.d.ts +15 -0
  182. package/dist/react/AxenArrayField.d.ts.map +1 -0
  183. package/dist/react/AxenArrayField.js +80 -0
  184. package/dist/react/AxenField.cjs +62 -0
  185. package/dist/react/AxenField.d.ts +13 -0
  186. package/dist/react/AxenField.d.ts.map +1 -0
  187. package/dist/react/AxenField.js +62 -0
  188. package/dist/react/AxenForm.cjs +134 -0
  189. package/dist/react/AxenForm.d.ts +7 -0
  190. package/dist/react/AxenForm.d.ts.map +1 -0
  191. package/dist/react/AxenForm.js +134 -0
  192. package/dist/react/FormContext.cjs +13 -0
  193. package/dist/react/FormContext.d.ts +11 -0
  194. package/dist/react/FormContext.d.ts.map +1 -0
  195. package/dist/react/FormContext.js +13 -0
  196. package/dist/react/useAxenForm.cjs +88 -0
  197. package/dist/react/useAxenForm.d.ts +8 -0
  198. package/dist/react/useAxenForm.d.ts.map +1 -0
  199. package/dist/react/useAxenForm.js +88 -0
  200. package/dist/react/useField.cjs +41 -0
  201. package/dist/react/useField.d.ts +13 -0
  202. package/dist/react/useField.d.ts.map +1 -0
  203. package/dist/react/useField.js +41 -0
  204. package/dist/react/useFieldArray.cjs +74 -0
  205. package/dist/react/useFieldArray.d.ts +5 -0
  206. package/dist/react/useFieldArray.d.ts.map +1 -0
  207. package/dist/react/useFieldArray.js +74 -0
  208. package/dist/types.d.ts +226 -0
  209. package/dist/types.d.ts.map +1 -0
  210. package/package.json +87 -0
@@ -0,0 +1,80 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useFormContext } from "./FormContext.js";
3
+ import { useFieldArray } from "./useFieldArray.js";
4
+ import { useField } from "./useField.js";
5
+ function AxenArrayField({ name, config, children }) {
6
+ const { fields: items, push, remove, swap, insert, replace, move, length } = useFieldArray(name);
7
+ const { components, disabled } = useFormContext();
8
+ const helpers = { push, remove, swap, insert, replace, move, length };
9
+ const renderField = (index) => {
10
+ return /* @__PURE__ */ jsx("div", { "data-axen-array-item": index, children: config.fields.map((fieldConfig) => {
11
+ const fieldName = `${name}.${index}.${fieldConfig.name}`;
12
+ const Component = fieldConfig.component ?? components[fieldConfig.type];
13
+ if (!Component) return null;
14
+ return /* @__PURE__ */ jsx(
15
+ ArrayItemField,
16
+ {
17
+ name: fieldName,
18
+ config: fieldConfig,
19
+ Component,
20
+ disabled: disabled || config.disabled
21
+ },
22
+ fieldName
23
+ );
24
+ }) }, index);
25
+ };
26
+ return /* @__PURE__ */ jsx(Fragment, { children: children({ fields: items, helpers, renderField }) });
27
+ }
28
+ function ArrayItemField({
29
+ name,
30
+ config,
31
+ Component,
32
+ disabled
33
+ }) {
34
+ const { store } = useFormContext();
35
+ const { value, error, touched, onChange, onBlur } = useField(name);
36
+ const showError = touched && !!error;
37
+ return /* @__PURE__ */ jsx(
38
+ Component,
39
+ {
40
+ name,
41
+ value,
42
+ onChange,
43
+ onBlur,
44
+ error: showError,
45
+ helperText: showError ? error : config.helperText,
46
+ label: config.label,
47
+ placeholder: config.placeholder,
48
+ disabled: disabled || config.disabled,
49
+ readOnly: config.readOnly,
50
+ required: config.required,
51
+ options: config.options,
52
+ form: {
53
+ values: store.getState().values,
54
+ errors: store.getState().errors,
55
+ touched: store.getState().touched,
56
+ dirty: store.getState().dirty,
57
+ isSubmitting: store.getState().isSubmitting,
58
+ isValid: Object.keys(store.getState().errors).length === 0,
59
+ submitCount: store.getState().submitCount,
60
+ setFieldValue: store.setFieldValue,
61
+ setFieldTouched: store.setFieldTouched,
62
+ setFieldError: store.setFieldError,
63
+ setValues: store.setValues,
64
+ setErrors: store.setErrors,
65
+ handleChange: onChange,
66
+ handleBlur: onBlur,
67
+ handleSubmit: () => {
68
+ void store.submitForm();
69
+ },
70
+ resetForm: store.resetForm,
71
+ submitForm: () => store.submitForm(),
72
+ validateForm: store.validateForm,
73
+ validateField: store.validateField
74
+ }
75
+ }
76
+ );
77
+ }
78
+ export {
79
+ AxenArrayField
80
+ };
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const FormContext = require("./FormContext.cjs");
5
+ const useField = require("./useField.cjs");
6
+ function AxenField({ name, config, component, children }) {
7
+ const { store, components, disabled } = FormContext.useFormContext();
8
+ const { value, error, touched, onChange, onBlur, setValue, setTouched, setError } = useField.useField(name);
9
+ const showError = touched && !!error;
10
+ const helperText = showError ? error : config == null ? void 0 : config.helperText;
11
+ const fieldType = (config == null ? void 0 : config.type) ?? "text";
12
+ const Component = component ?? (config == null ? void 0 : config.component) ?? components[fieldType];
13
+ const fieldProps = {
14
+ name,
15
+ value,
16
+ onChange,
17
+ onBlur,
18
+ error: showError,
19
+ helperText,
20
+ label: config == null ? void 0 : config.label,
21
+ placeholder: config == null ? void 0 : config.placeholder,
22
+ disabled: disabled || (config == null ? void 0 : config.disabled),
23
+ readOnly: config == null ? void 0 : config.readOnly,
24
+ required: config == null ? void 0 : config.required,
25
+ options: config == null ? void 0 : config.options,
26
+ form: {
27
+ values: store.getState().values,
28
+ errors: store.getState().errors,
29
+ touched: store.getState().touched,
30
+ dirty: store.getState().dirty,
31
+ isSubmitting: store.getState().isSubmitting,
32
+ isValid: Object.keys(store.getState().errors).length === 0,
33
+ submitCount: store.getState().submitCount,
34
+ setFieldValue: store.setFieldValue,
35
+ setFieldTouched: store.setFieldTouched,
36
+ setFieldError: store.setFieldError,
37
+ setValues: store.setValues,
38
+ setErrors: store.setErrors,
39
+ handleChange: onChange,
40
+ handleBlur: onBlur,
41
+ handleSubmit: () => {
42
+ void store.submitForm();
43
+ },
44
+ resetForm: store.resetForm,
45
+ submitForm: () => store.submitForm(),
46
+ validateForm: store.validateForm,
47
+ validateField: store.validateField
48
+ },
49
+ setValue,
50
+ setTouched,
51
+ setError,
52
+ ...config == null ? void 0 : config.fieldProps
53
+ };
54
+ if (children) {
55
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: children(fieldProps) });
56
+ }
57
+ if (!Component) {
58
+ return null;
59
+ }
60
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, { ...fieldProps });
61
+ }
62
+ exports.AxenField = AxenField;
@@ -0,0 +1,13 @@
1
+ import { FieldComponentProps, FieldConfig } from '../types';
2
+ export interface AxenFieldProps {
3
+ name: string;
4
+ config?: Partial<FieldConfig>;
5
+ component?: React.ComponentType<FieldComponentProps>;
6
+ children?: (fieldProps: FieldComponentProps) => React.ReactNode;
7
+ }
8
+ /**
9
+ * Standalone field component — can be used outside AxenForm grid
10
+ * when you need fine-grained placement.
11
+ */
12
+ export declare function AxenField({ name, config, component, children }: Readonly<AxenFieldProps>): import("react/jsx-runtime").JSX.Element | null;
13
+ //# sourceMappingURL=AxenField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxenField.d.ts","sourceRoot":"","sources":["../../src/react/AxenField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,cAAc,CAAC,kDAkExF"}
@@ -0,0 +1,62 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useFormContext } from "./FormContext.js";
3
+ import { useField } from "./useField.js";
4
+ function AxenField({ name, config, component, children }) {
5
+ const { store, components, disabled } = useFormContext();
6
+ const { value, error, touched, onChange, onBlur, setValue, setTouched, setError } = useField(name);
7
+ const showError = touched && !!error;
8
+ const helperText = showError ? error : config == null ? void 0 : config.helperText;
9
+ const fieldType = (config == null ? void 0 : config.type) ?? "text";
10
+ const Component = component ?? (config == null ? void 0 : config.component) ?? components[fieldType];
11
+ const fieldProps = {
12
+ name,
13
+ value,
14
+ onChange,
15
+ onBlur,
16
+ error: showError,
17
+ helperText,
18
+ label: config == null ? void 0 : config.label,
19
+ placeholder: config == null ? void 0 : config.placeholder,
20
+ disabled: disabled || (config == null ? void 0 : config.disabled),
21
+ readOnly: config == null ? void 0 : config.readOnly,
22
+ required: config == null ? void 0 : config.required,
23
+ options: config == null ? void 0 : config.options,
24
+ form: {
25
+ values: store.getState().values,
26
+ errors: store.getState().errors,
27
+ touched: store.getState().touched,
28
+ dirty: store.getState().dirty,
29
+ isSubmitting: store.getState().isSubmitting,
30
+ isValid: Object.keys(store.getState().errors).length === 0,
31
+ submitCount: store.getState().submitCount,
32
+ setFieldValue: store.setFieldValue,
33
+ setFieldTouched: store.setFieldTouched,
34
+ setFieldError: store.setFieldError,
35
+ setValues: store.setValues,
36
+ setErrors: store.setErrors,
37
+ handleChange: onChange,
38
+ handleBlur: onBlur,
39
+ handleSubmit: () => {
40
+ void store.submitForm();
41
+ },
42
+ resetForm: store.resetForm,
43
+ submitForm: () => store.submitForm(),
44
+ validateForm: store.validateForm,
45
+ validateField: store.validateField
46
+ },
47
+ setValue,
48
+ setTouched,
49
+ setError,
50
+ ...config == null ? void 0 : config.fieldProps
51
+ };
52
+ if (children) {
53
+ return /* @__PURE__ */ jsx(Fragment, { children: children(fieldProps) });
54
+ }
55
+ if (!Component) {
56
+ return null;
57
+ }
58
+ return /* @__PURE__ */ jsx(Component, { ...fieldProps });
59
+ }
60
+ export {
61
+ AxenField
62
+ };
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const payloadUtils = require("../core/payloadUtils.cjs");
6
+ const FormContext = require("./FormContext.cjs");
7
+ const useAxenForm = require("./useAxenForm.cjs");
8
+ const useField = require("./useField.cjs");
9
+ function AxenFormInner(props, ref) {
10
+ const {
11
+ config,
12
+ onSubmit,
13
+ components = {},
14
+ validationAdapter,
15
+ payloadFields,
16
+ payloadDiscriminator,
17
+ columns = 12,
18
+ gap = "1rem",
19
+ className,
20
+ disabled,
21
+ validateOnChange,
22
+ validateOnBlur,
23
+ children
24
+ } = props;
25
+ const wrappedOnSubmit = react.useMemo(() => {
26
+ if (!payloadFields) return onSubmit;
27
+ return async (values, meta) => {
28
+ const filtered = payloadUtils.mapPayload(values, payloadFields, payloadDiscriminator);
29
+ return onSubmit(filtered, meta);
30
+ };
31
+ }, [onSubmit, payloadFields, payloadDiscriminator]);
32
+ const { store, formApi } = useAxenForm.useAxenForm({
33
+ config,
34
+ onSubmit: wrappedOnSubmit,
35
+ validationAdapter,
36
+ validateOnChange,
37
+ validateOnBlur
38
+ });
39
+ react.useImperativeHandle(ref, () => ({
40
+ submit: () => formApi.handleSubmit(),
41
+ resetForm: (nextValues) => store.resetForm(nextValues),
42
+ getValues: () => store.getState().values,
43
+ getErrors: () => store.getState().errors,
44
+ isValid: () => Object.keys(store.getState().errors).length === 0,
45
+ isDirty: () => store.getState().dirty
46
+ }));
47
+ const ctxValue = react.useMemo(
48
+ () => ({
49
+ store,
50
+ fields: config.fields,
51
+ components,
52
+ disabled
53
+ }),
54
+ [store, config.fields, components, disabled]
55
+ );
56
+ const gridStyle = react.useMemo(
57
+ () => ({
58
+ display: "grid",
59
+ gridTemplateColumns: `repeat(${columns}, 1fr)`,
60
+ gap: typeof gap === "number" ? `${gap}px` : gap
61
+ }),
62
+ [columns, gap]
63
+ );
64
+ return /* @__PURE__ */ jsxRuntime.jsx(FormContext.FormContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: formApi.handleSubmit, className, noValidate: true, children: [
65
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: gridStyle, children: config.fields.map((fieldConfig) => /* @__PURE__ */ jsxRuntime.jsx(
66
+ AxenFieldRenderer,
67
+ {
68
+ config: fieldConfig,
69
+ disabled,
70
+ formApi
71
+ },
72
+ fieldConfig.name
73
+ )) }),
74
+ children
75
+ ] }) });
76
+ }
77
+ const AxenForm = react.forwardRef(AxenFormInner);
78
+ function AxenFieldRenderer({
79
+ config,
80
+ disabled,
81
+ formApi
82
+ }) {
83
+ const { store, components } = FormContext.useFormContext();
84
+ const { value, error, touched, onChange, onBlur } = useField.useField(config.name);
85
+ const hidden = typeof config.hidden === "function" ? config.hidden(store.getState().values) : config.hidden;
86
+ if (hidden) return null;
87
+ const Component = config.component ?? components[config.type];
88
+ if (!Component) {
89
+ return null;
90
+ }
91
+ const showError = touched && !!error;
92
+ const helperText = showError ? error : config.helperText;
93
+ const colSpanStyle = resolveColSpan(config.colSpan);
94
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: colSpanStyle, children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ Component,
96
+ {
97
+ name: config.name,
98
+ value,
99
+ onChange,
100
+ onBlur,
101
+ error: showError,
102
+ helperText,
103
+ label: config.label,
104
+ placeholder: config.placeholder,
105
+ disabled: disabled || config.disabled,
106
+ readOnly: config.readOnly,
107
+ required: config.required,
108
+ options: config.options,
109
+ form: formApi,
110
+ ...config.fieldProps ?? {},
111
+ min: config.min,
112
+ max: config.max,
113
+ step: config.step,
114
+ prefix: config.prefix,
115
+ suffix: config.suffix,
116
+ locale: config.locale,
117
+ currency: config.currency,
118
+ rows: config.rows,
119
+ format: config.format,
120
+ fetchOptions: config.fetchOptions,
121
+ optionLabel: config.optionLabel,
122
+ multiple: config.multiple
123
+ }
124
+ ) });
125
+ }
126
+ function resolveColSpan(colSpan) {
127
+ if (!colSpan) return { gridColumn: "span 12" };
128
+ if (typeof colSpan === "number") {
129
+ return { gridColumn: `span ${colSpan}` };
130
+ }
131
+ const xs = colSpan.xs ?? 12;
132
+ return { gridColumn: `span ${xs}` };
133
+ }
134
+ exports.AxenForm = AxenForm;
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+ import { AxenFormProps, AxenFormRef } from '../types';
3
+ export declare const AxenForm: <TValues extends Record<string, unknown>>(props: AxenFormProps<TValues> & {
4
+ children?: ReactNode;
5
+ ref?: React.Ref<AxenFormRef>;
6
+ }) => ReactNode;
7
+ //# sourceMappingURL=AxenForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxenForm.d.ts","sourceRoot":"","sources":["../../src/react/AxenForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAsC,MAAM,UAAU,CAAC;AAyF/F,eAAO,MAAM,QAAQ,EAAgC,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3F,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;CAAE,KACnF,SAAS,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useMemo, useImperativeHandle } from "react";
3
+ import { mapPayload } from "../core/payloadUtils.js";
4
+ import { FormContext, useFormContext } from "./FormContext.js";
5
+ import { useAxenForm } from "./useAxenForm.js";
6
+ import { useField } from "./useField.js";
7
+ function AxenFormInner(props, ref) {
8
+ const {
9
+ config,
10
+ onSubmit,
11
+ components = {},
12
+ validationAdapter,
13
+ payloadFields,
14
+ payloadDiscriminator,
15
+ columns = 12,
16
+ gap = "1rem",
17
+ className,
18
+ disabled,
19
+ validateOnChange,
20
+ validateOnBlur,
21
+ children
22
+ } = props;
23
+ const wrappedOnSubmit = useMemo(() => {
24
+ if (!payloadFields) return onSubmit;
25
+ return async (values, meta) => {
26
+ const filtered = mapPayload(values, payloadFields, payloadDiscriminator);
27
+ return onSubmit(filtered, meta);
28
+ };
29
+ }, [onSubmit, payloadFields, payloadDiscriminator]);
30
+ const { store, formApi } = useAxenForm({
31
+ config,
32
+ onSubmit: wrappedOnSubmit,
33
+ validationAdapter,
34
+ validateOnChange,
35
+ validateOnBlur
36
+ });
37
+ useImperativeHandle(ref, () => ({
38
+ submit: () => formApi.handleSubmit(),
39
+ resetForm: (nextValues) => store.resetForm(nextValues),
40
+ getValues: () => store.getState().values,
41
+ getErrors: () => store.getState().errors,
42
+ isValid: () => Object.keys(store.getState().errors).length === 0,
43
+ isDirty: () => store.getState().dirty
44
+ }));
45
+ const ctxValue = useMemo(
46
+ () => ({
47
+ store,
48
+ fields: config.fields,
49
+ components,
50
+ disabled
51
+ }),
52
+ [store, config.fields, components, disabled]
53
+ );
54
+ const gridStyle = useMemo(
55
+ () => ({
56
+ display: "grid",
57
+ gridTemplateColumns: `repeat(${columns}, 1fr)`,
58
+ gap: typeof gap === "number" ? `${gap}px` : gap
59
+ }),
60
+ [columns, gap]
61
+ );
62
+ return /* @__PURE__ */ jsx(FormContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs("form", { onSubmit: formApi.handleSubmit, className, noValidate: true, children: [
63
+ /* @__PURE__ */ jsx("div", { style: gridStyle, children: config.fields.map((fieldConfig) => /* @__PURE__ */ jsx(
64
+ AxenFieldRenderer,
65
+ {
66
+ config: fieldConfig,
67
+ disabled,
68
+ formApi
69
+ },
70
+ fieldConfig.name
71
+ )) }),
72
+ children
73
+ ] }) });
74
+ }
75
+ const AxenForm = forwardRef(AxenFormInner);
76
+ function AxenFieldRenderer({
77
+ config,
78
+ disabled,
79
+ formApi
80
+ }) {
81
+ const { store, components } = useFormContext();
82
+ const { value, error, touched, onChange, onBlur } = useField(config.name);
83
+ const hidden = typeof config.hidden === "function" ? config.hidden(store.getState().values) : config.hidden;
84
+ if (hidden) return null;
85
+ const Component = config.component ?? components[config.type];
86
+ if (!Component) {
87
+ return null;
88
+ }
89
+ const showError = touched && !!error;
90
+ const helperText = showError ? error : config.helperText;
91
+ const colSpanStyle = resolveColSpan(config.colSpan);
92
+ return /* @__PURE__ */ jsx("div", { style: colSpanStyle, children: /* @__PURE__ */ jsx(
93
+ Component,
94
+ {
95
+ name: config.name,
96
+ value,
97
+ onChange,
98
+ onBlur,
99
+ error: showError,
100
+ helperText,
101
+ label: config.label,
102
+ placeholder: config.placeholder,
103
+ disabled: disabled || config.disabled,
104
+ readOnly: config.readOnly,
105
+ required: config.required,
106
+ options: config.options,
107
+ form: formApi,
108
+ ...config.fieldProps ?? {},
109
+ min: config.min,
110
+ max: config.max,
111
+ step: config.step,
112
+ prefix: config.prefix,
113
+ suffix: config.suffix,
114
+ locale: config.locale,
115
+ currency: config.currency,
116
+ rows: config.rows,
117
+ format: config.format,
118
+ fetchOptions: config.fetchOptions,
119
+ optionLabel: config.optionLabel,
120
+ multiple: config.multiple
121
+ }
122
+ ) });
123
+ }
124
+ function resolveColSpan(colSpan) {
125
+ if (!colSpan) return { gridColumn: "span 12" };
126
+ if (typeof colSpan === "number") {
127
+ return { gridColumn: `span ${colSpan}` };
128
+ }
129
+ const xs = colSpan.xs ?? 12;
130
+ return { gridColumn: `span ${xs}` };
131
+ }
132
+ export {
133
+ AxenForm
134
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const FormContext = react.createContext(null);
5
+ function useFormContext() {
6
+ const ctx = react.useContext(FormContext);
7
+ if (!ctx) {
8
+ throw new Error("useFormContext must be used within an <AxenForm> or FormContext.Provider");
9
+ }
10
+ return ctx;
11
+ }
12
+ exports.FormContext = FormContext;
13
+ exports.useFormContext = useFormContext;
@@ -0,0 +1,11 @@
1
+ import { FormStore } from '../core/formStore';
2
+ import { FieldConfig, FieldTypeComponentMap } from '../types';
3
+ export interface FormContextValue {
4
+ store: FormStore;
5
+ fields: FieldConfig[];
6
+ components: FieldTypeComponentMap;
7
+ disabled?: boolean;
8
+ }
9
+ export declare const FormContext: import('react').Context<FormContextValue | null>;
10
+ export declare function useFormContext(): FormContextValue;
11
+ //# sourceMappingURL=FormContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormContext.d.ts","sourceRoot":"","sources":["../../src/react/FormContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,qBAAqB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,kDAA+C,CAAC;AAExE,wBAAgB,cAAc,IAAI,gBAAgB,CAMjD"}
@@ -0,0 +1,13 @@
1
+ import { createContext, useContext } from "react";
2
+ const FormContext = createContext(null);
3
+ function useFormContext() {
4
+ const ctx = useContext(FormContext);
5
+ if (!ctx) {
6
+ throw new Error("useFormContext must be used within an <AxenForm> or FormContext.Provider");
7
+ }
8
+ return ctx;
9
+ }
10
+ export {
11
+ FormContext,
12
+ useFormContext
13
+ };
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const formStore = require("../core/formStore.cjs");
5
+ const validation = require("../core/validation.cjs");
6
+ function useAxenForm(props) {
7
+ const {
8
+ config,
9
+ onSubmit,
10
+ validationAdapter,
11
+ validateOnChange = true,
12
+ validateOnBlur = true
13
+ } = props;
14
+ const adapter = validationAdapter ?? validation.simpleValidator;
15
+ const storeRef = react.useRef(null);
16
+ storeRef.current ?? (storeRef.current = formStore.createFormStore({
17
+ initialValues: config.initialValues,
18
+ validationAdapter: adapter,
19
+ fields: config.fields,
20
+ validateOnChange,
21
+ validateOnBlur,
22
+ onSubmit: async (values) => {
23
+ await onSubmit(values, {
24
+ isUpdate: config.isUpdate ?? false,
25
+ resetForm: () => {
26
+ var _a;
27
+ return (_a = storeRef.current) == null ? void 0 : _a.resetForm();
28
+ }
29
+ });
30
+ }
31
+ }));
32
+ const store = storeRef.current;
33
+ const formApi = react.useMemo(() => {
34
+ const handleChange = (e) => {
35
+ const { name, type, value } = e.target;
36
+ const newValue = type === "checkbox" ? e.target.checked : value;
37
+ store.setFieldValue(name, newValue);
38
+ };
39
+ const handleBlur = (e) => {
40
+ const name = e.target.name;
41
+ if (name) store.setFieldTouched(name, true);
42
+ };
43
+ const handleSubmit = (e) => {
44
+ if (e) {
45
+ e.preventDefault();
46
+ e.stopPropagation();
47
+ }
48
+ store.submitForm();
49
+ };
50
+ return {
51
+ get values() {
52
+ return store.getState().values;
53
+ },
54
+ get errors() {
55
+ return store.getState().errors;
56
+ },
57
+ get touched() {
58
+ return store.getState().touched;
59
+ },
60
+ get dirty() {
61
+ return store.getState().dirty;
62
+ },
63
+ get isSubmitting() {
64
+ return store.getState().isSubmitting;
65
+ },
66
+ get isValid() {
67
+ return Object.keys(store.getState().errors).length === 0;
68
+ },
69
+ get submitCount() {
70
+ return store.getState().submitCount;
71
+ },
72
+ setFieldValue: store.setFieldValue,
73
+ setFieldTouched: store.setFieldTouched,
74
+ setFieldError: store.setFieldError,
75
+ setValues: store.setValues,
76
+ setErrors: store.setErrors,
77
+ handleChange,
78
+ handleBlur,
79
+ handleSubmit,
80
+ resetForm: store.resetForm,
81
+ submitForm: () => store.submitForm(),
82
+ validateForm: store.validateForm,
83
+ validateField: store.validateField
84
+ };
85
+ }, [store]);
86
+ return { store, formApi };
87
+ }
88
+ exports.useAxenForm = useAxenForm;
@@ -0,0 +1,8 @@
1
+ import { FormStore } from '../core/formStore';
2
+ import { AxenFormProps, FormApi } from '../types';
3
+ export interface UseAxenFormReturn<TValues extends Record<string, unknown>> {
4
+ store: FormStore<TValues>;
5
+ formApi: FormApi<TValues>;
6
+ }
7
+ export declare function useAxenForm<TValues extends Record<string, unknown>>(props: Pick<AxenFormProps<TValues>, 'config' | 'onSubmit' | 'validationAdapter' | 'validateOnChange' | 'validateOnBlur' | 'payloadFields' | 'payloadDiscriminator'>): UseAxenFormReturn<TValues>;
8
+ //# sourceMappingURL=useAxenForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAxenForm.d.ts","sourceRoot":"","sources":["../../src/react/useAxenForm.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAqB,MAAM,UAAU,CAAC;AAEvF,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,KAAK,EAAE,IAAI,CACT,aAAa,CAAC,OAAO,CAAC,EACpB,QAAQ,GACR,UAAU,GACV,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,sBAAsB,CACzB,GACA,iBAAiB,CAAC,OAAO,CAAC,CA2F5B"}