@envisiongroup/porygon 0.1.0-rc.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 (233) hide show
  1. package/LICENSE +11 -0
  2. package/README.md +69 -0
  3. package/dist/index.d.ts +24 -0
  4. package/dist/index.js +60 -0
  5. package/dist/react-components/buttons/EFWButton/EFWButton.d.ts +59 -0
  6. package/dist/react-components/buttons/EFWButton/EFWButton.hooks.d.ts +45 -0
  7. package/dist/react-components/buttons/EFWButton/EFWButton.hooks.js +75 -0
  8. package/dist/react-components/buttons/EFWButton/EFWButton.js +164 -0
  9. package/dist/react-components/buttons/EFWButton/EFWButton.types.d.ts +282 -0
  10. package/dist/react-components/buttons/EFWButton/index.d.ts +3 -0
  11. package/dist/react-components/buttons/EFWButton/index.js +6 -0
  12. package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.d.ts +36 -0
  13. package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.js +32 -0
  14. package/dist/react-components/buttons/EFWDrawerButton/EFWDrawerButton.types.d.ts +87 -0
  15. package/dist/react-components/buttons/EFWDrawerButton/index.d.ts +12 -0
  16. package/dist/react-components/buttons/EFWDrawerButton/index.js +4 -0
  17. package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.d.ts +65 -0
  18. package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.js +129 -0
  19. package/dist/react-components/buttons/EFWGroupButton/EFWGroupButton.types.d.ts +232 -0
  20. package/dist/react-components/buttons/EFWGroupButton/index.d.ts +2 -0
  21. package/dist/react-components/buttons/EFWGroupButton/index.js +4 -0
  22. package/dist/react-components/commons/utils.d.ts +55 -0
  23. package/dist/react-components/commons/utils.js +18 -0
  24. package/dist/react-components/fields/EFWAttachments/EFWAttachments.d.ts +18 -0
  25. package/dist/react-components/fields/EFWAttachments/EFWAttachments.js +124 -0
  26. package/dist/react-components/fields/EFWAttachments/EFWAttachments.types.d.ts +78 -0
  27. package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.d.ts +23 -0
  28. package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.js +107 -0
  29. package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/EFWAttachmentsCard.types.d.ts +73 -0
  30. package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/index.d.ts +1 -0
  31. package/dist/react-components/fields/EFWAttachments/EFWAttachmentsCard/index.js +0 -0
  32. package/dist/react-components/fields/EFWAttachments/index.d.ts +2 -0
  33. package/dist/react-components/fields/EFWAttachments/index.js +4 -0
  34. package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.d.ts +21 -0
  35. package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.js +55 -0
  36. package/dist/react-components/fields/EFWAttachmentsField/EFWAttachmentsField.types.d.ts +7 -0
  37. package/dist/react-components/fields/EFWAttachmentsField/index.d.ts +2 -0
  38. package/dist/react-components/fields/EFWAttachmentsField/index.js +4 -0
  39. package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.d.ts +34 -0
  40. package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.js +135 -0
  41. package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.types.d.ts +81 -0
  42. package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.utils.d.ts +22 -0
  43. package/dist/react-components/fields/EFWDatePicker/EFWDatePicker.utils.js +76 -0
  44. package/dist/react-components/fields/EFWDatePicker/index.d.ts +2 -0
  45. package/dist/react-components/fields/EFWDatePicker/index.js +4 -0
  46. package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.d.ts +3 -0
  47. package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.js +63 -0
  48. package/dist/react-components/fields/EFWDatePickerField/EFWDatePickerField.types.d.ts +7 -0
  49. package/dist/react-components/fields/EFWDatePickerField/index.d.ts +2 -0
  50. package/dist/react-components/fields/EFWDatePickerField/index.js +4 -0
  51. package/dist/react-components/fields/EFWField/EFWField.d.ts +53 -0
  52. package/dist/react-components/fields/EFWField/EFWField.js +90 -0
  53. package/dist/react-components/fields/EFWField/EFWField.types.d.ts +294 -0
  54. package/dist/react-components/fields/EFWField/EFWField.utils.d.ts +3 -0
  55. package/dist/react-components/fields/EFWField/EFWField.utils.js +17 -0
  56. package/dist/react-components/fields/EFWField/index.d.ts +2 -0
  57. package/dist/react-components/fields/EFWField/index.js +4 -0
  58. package/dist/react-components/fields/EFWInput/EFWInput.d.ts +26 -0
  59. package/dist/react-components/fields/EFWInput/EFWInput.js +100 -0
  60. package/dist/react-components/fields/EFWInput/EFWInput.types.d.ts +257 -0
  61. package/dist/react-components/fields/EFWInput/EFWInput.utils.d.ts +20 -0
  62. package/dist/react-components/fields/EFWInput/EFWInput.utils.js +84 -0
  63. package/dist/react-components/fields/EFWInput/index.d.ts +2 -0
  64. package/dist/react-components/fields/EFWInput/index.js +4 -0
  65. package/dist/react-components/fields/EFWInputField/EFWInputField.d.ts +3 -0
  66. package/dist/react-components/fields/EFWInputField/EFWInputField.js +71 -0
  67. package/dist/react-components/fields/EFWInputField/EFWInputField.types.d.ts +6 -0
  68. package/dist/react-components/fields/EFWInputField/EFWInputField.utils.d.ts +1 -0
  69. package/dist/react-components/fields/EFWInputField/EFWInputField.utils.js +0 -0
  70. package/dist/react-components/fields/EFWInputField/index.d.ts +2 -0
  71. package/dist/react-components/fields/EFWInputField/index.js +4 -0
  72. package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.d.ts +8 -0
  73. package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.js +183 -0
  74. package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.types.d.ts +226 -0
  75. package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.utils.d.ts +74 -0
  76. package/dist/react-components/fields/EFWNumberInput/EFWNumberInput.utils.js +76 -0
  77. package/dist/react-components/fields/EFWNumberInput/index.d.ts +2 -0
  78. package/dist/react-components/fields/EFWNumberInput/index.js +4 -0
  79. package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.d.ts +3 -0
  80. package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.js +65 -0
  81. package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.types.d.ts +6 -0
  82. package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.utils.d.ts +1 -0
  83. package/dist/react-components/fields/EFWNumberInputField/EFWNumberInputField.utils.js +0 -0
  84. package/dist/react-components/fields/EFWNumberInputField/index.d.ts +2 -0
  85. package/dist/react-components/fields/EFWNumberInputField/index.js +4 -0
  86. package/dist/react-components/fields/EFWSwitch/EFWSwitch.d.ts +3 -0
  87. package/dist/react-components/fields/EFWSwitch/EFWSwitch.js +54 -0
  88. package/dist/react-components/fields/EFWSwitch/EFWSwitch.types.d.ts +49 -0
  89. package/dist/react-components/fields/EFWSwitch/index.d.ts +2 -0
  90. package/dist/react-components/fields/EFWSwitch/index.js +4 -0
  91. package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.d.ts +3 -0
  92. package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.js +53 -0
  93. package/dist/react-components/fields/EFWSwitchField/EFWSwitchField.types.d.ts +7 -0
  94. package/dist/react-components/fields/EFWSwitchField/index.d.ts +2 -0
  95. package/dist/react-components/fields/EFWSwitchField/index.js +4 -0
  96. package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.d.ts +8 -0
  97. package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.js +230 -0
  98. package/dist/react-components/fields/EFWTagPicker/EFWTagPicker.types.d.ts +136 -0
  99. package/dist/react-components/fields/EFWTagPicker/index.d.ts +2 -0
  100. package/dist/react-components/fields/EFWTagPicker/index.js +4 -0
  101. package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.d.ts +3 -0
  102. package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.js +72 -0
  103. package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.types.d.ts +8 -0
  104. package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.utils.d.ts +1 -0
  105. package/dist/react-components/fields/EFWTagPickerField/EFWTagPickerField.utils.js +0 -0
  106. package/dist/react-components/fields/EFWTagPickerField/index.d.ts +2 -0
  107. package/dist/react-components/fields/EFWTagPickerField/index.js +4 -0
  108. package/dist/react-components/fields/EFWTextArea/EFWTextArea.d.ts +3 -0
  109. package/dist/react-components/fields/EFWTextArea/EFWTextArea.js +103 -0
  110. package/dist/react-components/fields/EFWTextArea/EFWTextArea.types.d.ts +79 -0
  111. package/dist/react-components/fields/EFWTextArea/EFWTextArea.utils.d.ts +1 -0
  112. package/dist/react-components/fields/EFWTextArea/EFWTextArea.utils.js +0 -0
  113. package/dist/react-components/fields/EFWTextArea/index.d.ts +2 -0
  114. package/dist/react-components/fields/EFWTextArea/index.js +4 -0
  115. package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.d.ts +3 -0
  116. package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.js +69 -0
  117. package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.types.d.ts +6 -0
  118. package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.utils.d.ts +1 -0
  119. package/dist/react-components/fields/EFWTextAreaField/EFWTextAreaField.utils.js +0 -0
  120. package/dist/react-components/fields/EFWTextAreaField/index.d.ts +2 -0
  121. package/dist/react-components/fields/EFWTextAreaField/index.js +4 -0
  122. package/dist/react-components/fields/types.d.ts +1 -0
  123. package/dist/react-components/fields/types.js +0 -0
  124. package/dist/react-components/forms/EFWForm/EFWForm.converter.d.ts +3 -0
  125. package/dist/react-components/forms/EFWForm/EFWForm.converter.js +30 -0
  126. package/dist/react-components/forms/EFWForm/EFWForm.d.ts +96 -0
  127. package/dist/react-components/forms/EFWForm/EFWForm.hooks.d.ts +55 -0
  128. package/dist/react-components/forms/EFWForm/EFWForm.hooks.js +41 -0
  129. package/dist/react-components/forms/EFWForm/EFWForm.js +363 -0
  130. package/dist/react-components/forms/EFWForm/EFWForm.types.d.ts +981 -0
  131. package/dist/react-components/forms/EFWForm/EFWForm.utils.d.ts +19 -0
  132. package/dist/react-components/forms/EFWForm/EFWForm.utils.js +252 -0
  133. package/dist/react-components/forms/EFWForm/index.d.ts +4 -0
  134. package/dist/react-components/forms/EFWForm/index.js +8 -0
  135. package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.d.ts +3 -0
  136. package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.js +86 -0
  137. package/dist/react-components/forms/EFWFormMessageBarGroup/EFWFormMessageBarGroup.types.d.ts +34 -0
  138. package/dist/react-components/forms/EFWFormMessageBarGroup/index.d.ts +2 -0
  139. package/dist/react-components/forms/EFWFormMessageBarGroup/index.js +4 -0
  140. package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.d.ts +3 -0
  141. package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.js +32 -0
  142. package/dist/react-components/forms/EFWMessageBarManager/EFWMessageBarManager.types.d.ts +7 -0
  143. package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.d.ts +3 -0
  144. package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.js +96 -0
  145. package/dist/react-components/hooks/useDrawer/component/EFWDrawer/EFWDrawer.types.d.ts +15 -0
  146. package/dist/react-components/hooks/useDrawer/component/EFWDrawer/index.d.ts +2 -0
  147. package/dist/react-components/hooks/useDrawer/component/EFWDrawer/index.js +4 -0
  148. package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/EFWDrawerLoader.d.ts +5 -0
  149. package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/EFWDrawerLoader.js +24 -0
  150. package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/index.d.ts +1 -0
  151. package/dist/react-components/hooks/useDrawer/component/EFWDrawerLoader/index.js +4 -0
  152. package/dist/react-components/hooks/useDrawer/index.d.ts +2 -0
  153. package/dist/react-components/hooks/useDrawer/index.js +4 -0
  154. package/dist/react-components/hooks/useDrawer/useDrawer.d.ts +10 -0
  155. package/dist/react-components/hooks/useDrawer/useDrawer.js +158 -0
  156. package/dist/react-components/hooks/useDrawer/useDrawer.types.d.ts +72 -0
  157. package/dist/react-components/layout/MainNavBar/MainNavBar.js +81 -0
  158. package/dist/react-components/layout/MainNavBar/index.js +4 -0
  159. package/dist/react-components/layout/MainNavItems/MainNavItems.js +35 -0
  160. package/dist/react-components/layout/MainNavItems/MainNavItems.styles.js +0 -0
  161. package/dist/react-components/layout/MainNavItems/index.js +4 -0
  162. package/dist/react-components/layout/NavBarContext/NavBarContext.js +24 -0
  163. package/dist/react-components/tables/EFWTable/EFWTable.d.ts +8 -0
  164. package/dist/react-components/tables/EFWTable/EFWTable.js +585 -0
  165. package/dist/react-components/tables/EFWTable/EFWTable.types.d.ts +367 -0
  166. package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.d.ts +3 -0
  167. package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.js +75 -0
  168. package/dist/react-components/tables/EFWTable/components/EFWTableBody/EFWTableBody.types.d.ts +18 -0
  169. package/dist/react-components/tables/EFWTable/components/EFWTableBody/index.d.ts +2 -0
  170. package/dist/react-components/tables/EFWTable/components/EFWTableBody/index.js +4 -0
  171. package/dist/react-components/tables/EFWTable/components/EFWTableCell/EFWTableCell.d.ts +16 -0
  172. package/dist/react-components/tables/EFWTable/components/EFWTableCell/EFWTableCell.js +38 -0
  173. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.d.ts +17 -0
  174. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.js +105 -0
  175. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.types.d.ts +94 -0
  176. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.utils.d.ts +14 -0
  177. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/EFWTableCommandBar.utils.js +26 -0
  178. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/index.d.ts +2 -0
  179. package/dist/react-components/tables/EFWTable/components/EFWTableCommandBar/index.js +4 -0
  180. package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.d.ts +3 -0
  181. package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.js +46 -0
  182. package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/EFWTableEmpty.types.d.ts +6 -0
  183. package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/index.d.ts +2 -0
  184. package/dist/react-components/tables/EFWTable/components/EFWTableEmpty/index.js +4 -0
  185. package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.d.ts +3 -0
  186. package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.js +87 -0
  187. package/dist/react-components/tables/EFWTable/components/EFWTableHeader/EFWTableHeader.types.d.ts +13 -0
  188. package/dist/react-components/tables/EFWTable/components/EFWTableHeader/index.d.ts +2 -0
  189. package/dist/react-components/tables/EFWTable/components/EFWTableHeader/index.js +4 -0
  190. package/dist/react-components/tables/EFWTable/components/EFWTableRow/EFWTableRow.d.ts +22 -0
  191. package/dist/react-components/tables/EFWTable/components/EFWTableRow/EFWTableRow.js +60 -0
  192. package/dist/react-components/tables/EFWTable/hooks/useDefaultAddButton/useDefaultAddButton.d.ts +3 -0
  193. package/dist/react-components/tables/EFWTable/hooks/useDefaultAddButton/useDefaultAddButton.js +95 -0
  194. package/dist/react-components/tables/EFWTable/hooks/useDefaultDeleteButton/useDefaultDeleteButton.d.ts +3 -0
  195. package/dist/react-components/tables/EFWTable/hooks/useDefaultDeleteButton/useDefaultDeleteButton.js +89 -0
  196. package/dist/react-components/tables/EFWTable/hooks/useDefaultUpdateButton/useDefaultUpdateButton.d.ts +3 -0
  197. package/dist/react-components/tables/EFWTable/hooks/useDefaultUpdateButton/useDefaultUpdateButton.js +98 -0
  198. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController copy.d.ts +4 -0
  199. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController copy.js +178 -0
  200. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.d.ts +4 -0
  201. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.js +178 -0
  202. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types copy.d.ts +16 -0
  203. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types copy.js +0 -0
  204. package/dist/react-components/tables/EFWTable/hooks/useTableController/useTableController.types.d.ts +16 -0
  205. package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.d.ts +3 -0
  206. package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.js +67 -0
  207. package/dist/react-components/tables/EFWTable/hooks/useTableSelection/useTableSelection.types.d.ts +37 -0
  208. package/dist/react-components/tables/EFWTable/index.d.ts +3 -0
  209. package/dist/react-components/tables/EFWTable/index.js +6 -0
  210. package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.d.ts +7 -0
  211. package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.js +38 -0
  212. package/dist/react-components/tables/EFWTable/utils/CellRenderer/CellRenderer.types.d.ts +14 -0
  213. package/dist/react-components/tables/EFWTable/utils/cache.d.ts +37 -0
  214. package/dist/react-components/tables/EFWTable/utils/cache.js +127 -0
  215. package/dist/react-components/tables/EFWTable/utils/comparison.d.ts +6 -0
  216. package/dist/react-components/tables/EFWTable/utils/comparison.js +56 -0
  217. package/dist/react-components/tables/EFWTable/utils/constants.d.ts +8 -0
  218. package/dist/react-components/tables/EFWTable/utils/constants.js +9 -0
  219. package/dist/react-components/tables/EFWTable/utils/context.d.ts +8 -0
  220. package/dist/react-components/tables/EFWTable/utils/context.js +8 -0
  221. package/dist/react-components/tables/EFWTable/utils/general.d.ts +4 -0
  222. package/dist/react-components/tables/EFWTable/utils/general.js +4 -0
  223. package/dist/react-components/tables/EFWTable/utils/hashing.d.ts +18 -0
  224. package/dist/react-components/tables/EFWTable/utils/hashing.js +43 -0
  225. package/dist/react-components/tables/EFWTable/utils/index.d.ts +11 -0
  226. package/dist/react-components/tables/EFWTable/utils/index.js +24 -0
  227. package/dist/react-components/tables/EFWTable/utils/renderers.d.ts +8 -0
  228. package/dist/react-components/tables/EFWTable/utils/renderers.js +25 -0
  229. package/dist/react-components/tables/EFWTable/utils/types.d.ts +31 -0
  230. package/dist/react-components/tables/EFWTable/utils/types.js +0 -0
  231. package/dist/utils/htmlConverter.d.ts +15 -0
  232. package/dist/utils/htmlConverter.js +12 -0
  233. package/package.json +114 -0
@@ -0,0 +1,981 @@
1
+ import { EFWInputFieldProps, EFWInputFieldValue } from '../../fields/EFWInputField';
2
+ import { EFWTagPickerFieldProps, EFWTagPickerFieldValue } from '../../fields/EFWTagPickerField';
3
+ import { EFWDatePickerFieldProps, EFWDatePickerFieldValue } from '../../fields/EFWDatePickerField';
4
+ import { EFWTextAreaFieldProps, EFWTextAreaFieldValue } from '../../fields/EFWTextAreaField';
5
+ import { EFWSwitchFieldProps, EFWSwitchFieldValue } from '../../fields/EFWSwitchField';
6
+ import { EFWAttachmentsFieldProps, EFWAttachmentsFieldValue } from '../../fields/EFWAttachmentsField';
7
+ import { EFWNumberInputFieldProps, EFWNumberInputFieldValue } from '../../fields/EFWNumberInputField';
8
+ import { EFWFormMessageBar } from '../EFWFormMessageBarGroup/EFWFormMessageBarGroup.types';
9
+ import { MutableRefObject } from 'react';
10
+
11
+ /**
12
+ * Arreglo constante que define todos los tipos de campos de formulario soportados.
13
+ * Estos tipos se utilizan para identificar qué tipo de componente renderizar
14
+ * y qué validaciones aplicar a cada campo.
15
+ *
16
+ * @example
17
+ * // Usar para validar tipos
18
+ * if (FORM_FIELD_TYPES.includes(fieldType)) {
19
+ * // El tipo es válido
20
+ * }
21
+ */
22
+ export declare const FORM_FIELD_TYPES: readonly ["Text", "Number", "Choice", "Note", "Boolean", "MultiChoice", "Date", "Attachments"];
23
+ /**
24
+ * Tipo union literal derivado de FORM_FIELD_TYPES.
25
+ * Representa todos los tipos de campos posibles en el sistema.
26
+ *
27
+ * @example
28
+ * const fieldType: EFWFormFieldType = 'Text'; // ✓ Válido
29
+ * const invalidType: EFWFormFieldType = 'Email'; // ✗ Error de TypeScript
30
+ */
31
+ export type EFWFormFieldType = typeof FORM_FIELD_TYPES[number];
32
+ /**
33
+ * Mapeo que asocia cada tipo de campo con su tipo de valor correspondiente.
34
+ * Este mapeo es fundamental para el tipado estricto de los valores del formulario.
35
+ *
36
+ * @example
37
+ * // Obtener el tipo de valor para un campo específico
38
+ * type TextFieldValue = EFWFormFieldValueMap['Text']; // EFWInputFieldValue
39
+ * type NumberFieldValue = EFWFormFieldValueMap['Number']; // EFWNumberInputFieldValue
40
+ */
41
+ export type EFWFormFieldValueMap = {
42
+ 'Text': EFWInputFieldValue;
43
+ 'Number': EFWNumberInputFieldValue;
44
+ 'Choice': EFWTagPickerFieldValue[];
45
+ 'Note': EFWTextAreaFieldValue;
46
+ 'Boolean': EFWSwitchFieldValue;
47
+ 'MultiChoice': EFWTagPickerFieldValue[];
48
+ 'Date': EFWDatePickerFieldValue[];
49
+ 'Attachments': EFWAttachmentsFieldValue[];
50
+ };
51
+ /**
52
+ * Tipo genérico que obtiene el tipo de valor para un campo específico.
53
+ * Utiliza el mapeo EFWFormFieldValueMap para determinar el tipo correcto.
54
+ *
55
+ * @template T - Tipo de campo (por defecto todos los tipos)
56
+ * @example
57
+ * type TextValue = EFWFormFieldValue<'Text'>; // EFWInputFieldValue
58
+ * type AnyValue = EFWFormFieldValue; // Union de todos los valores posibles
59
+ */
60
+ export type EFWFormFieldValue<T extends EFWFormFieldType = EFWFormFieldType> = EFWFormFieldValueMap[T];
61
+ /**
62
+ * Interfaz base que define las propiedades comunes a todos los campos de formulario.
63
+ * Proporciona la estructura fundamental que deben implementar todos los tipos de campos.
64
+ *
65
+ * @template T - Tipo específico de campo
66
+ *
67
+ * @example
68
+ * // Implementación para un campo de texto
69
+ * const textField: EFWFormFieldBaseProps<'Text'> = {
70
+ * id: 'field-1',
71
+ * typeAsString: 'Text',
72
+ * internalName: 'userName',
73
+ * value: 'John Doe'
74
+ * };
75
+ */
76
+ export interface EFWFormFieldBaseProps<T extends EFWFormFieldType = EFWFormFieldType> {
77
+ readonly id: string;
78
+ readonly typeAsString: T;
79
+ readonly internalName: string;
80
+ value?: EFWFormFieldValueMap[T];
81
+ }
82
+ /**
83
+ * Propiedades para campos de entrada de texto.
84
+ * Combina las propiedades base con las específicas del componente de texto.
85
+ */
86
+ export interface EFWFormInputFieldProps extends EFWFormFieldBaseProps<'Text'>, EFWInputFieldProps {
87
+ }
88
+ /**
89
+ * Propiedades para campos de entrada numérica.
90
+ * Combina las propiedades base con las específicas del componente numérico.
91
+ */
92
+ export interface EFWFormNumberInputFieldProps extends EFWFormFieldBaseProps<'Number'>, EFWNumberInputFieldProps {
93
+ }
94
+ /**
95
+ * Propiedades para campos de selección única.
96
+ * Utiliza el componente TagPicker pero limitado a una sola selección.
97
+ */
98
+ export interface EFWFormTagPickerFieldProps extends EFWFormFieldBaseProps<'Choice'>, EFWTagPickerFieldProps {
99
+ }
100
+ /**
101
+ * Propiedades para campos de selección múltiple.
102
+ * Extiende TagPicker con la propiedad multiple obligatoria en true.
103
+ *
104
+ * @property {true} multiple - Marca obligatoria que indica selección múltiple
105
+ */
106
+ export interface EFWFormMultiChoiceFieldProps extends EFWFormFieldBaseProps<'MultiChoice'>, EFWTagPickerFieldProps {
107
+ multiple: true;
108
+ }
109
+ /**
110
+ * Propiedades para campos de selección de fecha.
111
+ * Puede manejar una o múltiples fechas dependiendo de la configuración.
112
+ */
113
+ export interface EFWFormDatePickerFieldProps extends EFWFormFieldBaseProps<'Date'>, EFWDatePickerFieldProps {
114
+ }
115
+ /**
116
+ * Propiedades para campos de área de texto.
117
+ * Permite entrada de texto multilínea con mayor capacidad que los campos de texto simples.
118
+ */
119
+ export interface EFWFormTextAreaFieldProps extends EFWFormFieldBaseProps<'Note'>, EFWTextAreaFieldProps {
120
+ }
121
+ /**
122
+ * Propiedades para campos de tipo switch/boolean.
123
+ * Representa valores de encendido/apagado, sí/no, habilitado/deshabilitado.
124
+ */
125
+ export interface EFWFormSwitchFieldProps extends EFWFormFieldBaseProps<'Boolean'>, EFWSwitchFieldProps {
126
+ }
127
+ /**
128
+ * Propiedades para campos de archivos adjuntos.
129
+ * Permite la carga y gestión de uno o múltiples archivos.
130
+ */
131
+ export interface EFWFormAttachmentFieldProps extends EFWFormFieldBaseProps<'Attachments'>, EFWAttachmentsFieldProps {
132
+ }
133
+ /**
134
+ * Mapeo que asocia cada tipo de campo con su interfaz de propiedades correspondiente.
135
+ * Este mapeo permite la resolución automática del tipo correcto de propiedades
136
+ * basándose en el tipo de campo especificado.
137
+ */
138
+ export type EFWFormFieldPropsMap = {
139
+ 'Text': EFWFormInputFieldProps;
140
+ 'Number': EFWFormNumberInputFieldProps;
141
+ 'Choice': EFWFormTagPickerFieldProps;
142
+ 'Note': EFWFormTextAreaFieldProps;
143
+ 'Boolean': EFWFormSwitchFieldProps;
144
+ 'MultiChoice': EFWFormMultiChoiceFieldProps;
145
+ 'Date': EFWFormDatePickerFieldProps;
146
+ 'Attachments': EFWFormAttachmentFieldProps;
147
+ };
148
+ /**
149
+ * Tipo genérico que resuelve las propiedades correctas para un tipo de campo específico.
150
+ *
151
+ * @template T - Tipo de campo (por defecto todos los tipos)
152
+ * @example
153
+ * type TextFieldProps = EFWFormFieldProps<'Text'>; // EFWFormInputFieldProps
154
+ * type AnyFieldProps = EFWFormFieldProps; // Union de todas las propiedades posibles
155
+ */
156
+ export type EFWFormFieldProps<T extends EFWFormFieldType = EFWFormFieldType> = EFWFormFieldPropsMap[T];
157
+ /**
158
+ * Configuración para grid responsivo usando CSS auto-fit.
159
+ * Permite crear layouts que se adaptan automáticamente al espacio disponible.
160
+ *
161
+ * @example
162
+ * const gridConfig: ResponsiveGridConfig = {
163
+ * autoFit: {
164
+ * minColumnWidth: "300px",
165
+ * maxColumns: 4
166
+ * }
167
+ * };
168
+ */
169
+ export interface ResponsiveGridConfig {
170
+ autoFit: {
171
+ minColumnWidth: string;
172
+ maxColumns?: number;
173
+ };
174
+ }
175
+ /**
176
+ * Tipo que permite especificar columnas de grid de forma fija o responsiva.
177
+ *
178
+ * @example
179
+ * // Grid fijo de 3 columnas
180
+ * const fixedGrid: GridTemplateColumnsType = 3;
181
+ *
182
+ * // Grid responsivo
183
+ * const responsiveGrid: GridTemplateColumnsType = {
184
+ * autoFit: { minColumnWidth: "250px", maxColumns: 5 }
185
+ * };
186
+ */
187
+ export type GridTemplateColumnsType = number | ResponsiveGridConfig;
188
+ /**
189
+ * Tipo utilitario que detecta si un tipo es una unión (union type).
190
+ * Se utiliza internamente para determinar si se debe aplicar tipado estricto o genérico.
191
+ *
192
+ * @template T - Tipo a evaluar
193
+ * @template U - Tipo de comparación (por defecto igual a T)
194
+ * @typedef {boolean} IsUnion
195
+ * @private
196
+ */
197
+ type IsUnion<T, U = T> = (T extends any ? (U extends T ? 0 : 1) : never) extends 0 ? false : true;
198
+ /**
199
+ * Extrae los nombres de campos como tipos literales de un array de propiedades de campos.
200
+ *
201
+ * @template T - Array readonly de propiedades de campos
202
+ * @example
203
+ * type MyFields = readonly [
204
+ * { internalName: 'name', typeAsString: 'Text', id: '1' },
205
+ * { internalName: 'age', typeAsString: 'Number', id: '2' }
206
+ * ];
207
+ * type FieldNames = ExtractFieldNames<MyFields>; // 'name' | 'age'
208
+ */
209
+ export type ExtractFieldNames<T extends readonly EFWFormFieldProps[]> = T[number]['internalName'];
210
+ /**
211
+ * Extrae el tipo de campo basándose en el nombre interno (internalName).
212
+ *
213
+ * @template T - Array readonly de propiedades de campos
214
+ * @template K - Nombre interno del campo
215
+ * @typedef {string} ExtractFieldType
216
+ * @example
217
+ * type NameFieldType = ExtractFieldType<MyFields, 'name'>; // 'Text'
218
+ * type AgeFieldType = ExtractFieldType<MyFields, 'age'>; // 'Number'
219
+ */
220
+ export type ExtractFieldType<T extends readonly EFWFormFieldProps[], K extends string> = Extract<T[number], {
221
+ internalName: K;
222
+ }>['typeAsString'];
223
+ /**
224
+ * Obtiene el tipo de valor correcto para un campo específico.
225
+ *
226
+ * @template T - Array readonly de propiedades de campos
227
+ * @template K - Nombre interno del campo
228
+ * @example
229
+ * type NameValue = GetFieldValue<MyFields, 'name'>; // EFWInputFieldValue (string)
230
+ * type AgeValue = GetFieldValue<MyFields, 'age'>; // EFWNumberInputFieldValue (number)
231
+ */
232
+ export type GetFieldValue<T extends readonly EFWFormFieldProps[], K extends string> = ExtractFieldType<T, K> extends keyof EFWFormFieldValueMap ? EFWFormFieldValueMap[ExtractFieldType<T, K>] : EFWFormFieldValue;
233
+ /**
234
+ * Obtiene el tipo de propiedades correcto para un campo específico.
235
+ *
236
+ * @template T - Array readonly de propiedades de campos
237
+ * @template K - Nombre interno del campo
238
+ * @example
239
+ * type NameProps = GetFieldProps<MyFields, 'name'>; // EFWFormInputFieldProps
240
+ * type AgeProps = GetFieldProps<MyFields, 'age'>; // EFWFormNumberInputFieldProps
241
+ */
242
+ export type GetFieldProps<T extends readonly EFWFormFieldProps[], K extends string> = ExtractFieldType<T, K> extends keyof EFWFormFieldPropsMap ? EFWFormFieldPropsMap[ExtractFieldType<T, K>] : EFWFormFieldProps;
243
+ /**
244
+ * Crea un mapeo tipado de todos los valores del formulario.
245
+ * Las claves son los nombres internos de los campos y los valores son del tipo correcto para cada campo.
246
+ *
247
+ * @template T - Array readonly de propiedades de campos
248
+ * @example
249
+ * type MyFormValues = EFWFormValues<MyFields>;
250
+ * // Resultado: { name: string; age: number; }
251
+ *
252
+ * const formValues: MyFormValues = {
253
+ * name: "John Doe",
254
+ * age: 30
255
+ * };
256
+ */
257
+ export type EFWFormValues<T extends readonly EFWFormFieldProps[]> = {
258
+ [K in ExtractFieldNames<T>]: GetFieldValue<T, K>;
259
+ };
260
+ /**
261
+ * Determina si un array de campos es genérico (sin tipado estricto) o específico.
262
+ * Se usa para aplicar diferentes estrategias de tipado.
263
+ *
264
+ * @template T - Array readonly de propiedades de campos
265
+ * @private
266
+ */
267
+ type IsGenericFields<T extends readonly EFWFormFieldProps[]> = string extends ExtractFieldNames<T> ? true : false;
268
+ /**
269
+ * Define el tipo de actualización para campos del formulario.
270
+ * Incluye propiedades específicas para cada tipo de campo con nombres más semánticos.
271
+ *
272
+ * @template T - Array readonly de propiedades de campos
273
+ * @example
274
+ * // Para un campo de selección
275
+ * const choiceUpdate: EFWFormFieldUpdate<MyFields> = {
276
+ * selectedOptions: [{ id: '1', label: 'Option 1' }]
277
+ * };
278
+ *
279
+ * // Para un campo de fecha
280
+ * const dateUpdate: EFWFormFieldUpdate<MyFields> = {
281
+ * selectedDates: [new Date()]
282
+ * };
283
+ */
284
+ export type EFWFormFieldUpdate<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = {
285
+ [K in ExtractFieldNames<T>]: Partial<GetFieldProps<T, K>> & {
286
+ value?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Text' | 'Number' | 'Boolean' | 'Note'] ? GetFieldValue<T, K> : never;
287
+ selectedOptions?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Choice' | 'MultiChoice'] ? GetFieldValue<T, K> : never;
288
+ selectedDates?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Date'] ? GetFieldValue<T, K> : never;
289
+ files?: GetFieldValue<T, K> extends EFWFormFieldValueMap['Attachments'] ? GetFieldValue<T, K> : never;
290
+ };
291
+ }[ExtractFieldNames<T>];
292
+ /**
293
+ * Función genérica para actualizar campos cuando no hay tipado fuerte.
294
+ * Se usa cuando el array de campos es genérico y no se conocen los tipos específicos.
295
+ *
296
+ * @template F - Tipo de campo específico (debe especificarse explícitamente)
297
+ * @example
298
+ * // Debe especificar el tipo explícitamente
299
+ * updateField<'Text'>(['field1', 'field2'], { value: 'nuevo valor' });
300
+ */
301
+ export type GenericUpdateFieldFunctionArray = <F extends EFWFormFieldType = never>(internalNames: readonly string[], updates: Partial<EFWFormFieldPropsMap[F]>) => void;
302
+ /**
303
+ * Función estricta para actualizar campos cuando hay tipado fuerte.
304
+ * Todos los campos en el array deben ser del mismo tipo para garantizar type safety.
305
+ *
306
+ * @template T - Array readonly de propiedades de campos
307
+ * @template Arr - Array de nombres de campos (inferido)
308
+ * @template K - Nombres de campos específicos (inferido)
309
+ * @template FT - Tipo de campo (inferido)
310
+ *
311
+ * @example
312
+ * // ✓ Todos los campos son tipo 'Text'
313
+ * updateField(['name', 'description'], { value: 'nuevo texto' });
314
+ *
315
+ * // ✗ Error: 'name' es Text pero 'age' es Number (tipos diferentes)
316
+ * updateField(['name', 'age'], { value: 'algo' });
317
+ */
318
+ export type StrictUpdateFieldFunctionArray<T extends readonly EFWFormFieldProps[]> = <Arr extends readonly ExtractFieldNames<T>[], K extends Arr[number], FT = ExtractFieldType<T, K>>(internalNames: Arr & (IsUnion<FT> extends true ? never : unknown), updates: Partial<GetFieldProps<T, K>>) => void;
319
+ /**
320
+ * Función de actualización tipada que se adapta según si los campos son genéricos o específicos.
321
+ *
322
+ * @template T - Array readonly de propiedades de campos
323
+ */
324
+ export type EFWUpdateFieldFunction<T extends readonly EFWFormFieldProps[]> = IsGenericFields<T> extends true ? GenericUpdateFieldFunctionArray : StrictUpdateFieldFunctionArray<T>;
325
+ /**
326
+ * Función de lógica genérica que se ejecuta cuando cambia el valor de un campo.
327
+ * Se usa cuando los campos no tienen tipado específico.
328
+ *
329
+ * @template T - Array readonly de propiedades de campo
330
+ * @example
331
+ * const genericLogic: GenericFieldLogicFunction<MyFields> = (value, allValues, updateField) => {
332
+ * // Lógica genérica que funciona con cualquier tipo de valor
333
+ * console.log('Campo cambió:', value);
334
+ * };
335
+ */
336
+ export type GenericFieldLogicFunction<T extends readonly EFWFormFieldProps[]> = (value: EFWFormFieldValue, allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void;
337
+ /**
338
+ * Función de lógica específica tipada para un campo concreto.
339
+ * El valor está tipado específicamente según el tipo de campo.
340
+ *
341
+ * @template T - Array readonly de propiedades de campos
342
+ * @template K - Nombre interno del campo específico
343
+ * @typedef {Function} StrictFieldLogicFunction
344
+ * @example
345
+ * const nameLogic: StrictFieldLogicFunction<MyFields, 'name'> = (value, allValues, updateField) => {
346
+ * // value es específicamente string (tipo del campo 'name')
347
+ * if (value.length > 50) {
348
+ * updateField(['description'], { value: 'Nombre muy largo' });
349
+ * }
350
+ * };
351
+ */
352
+ export type StrictFieldLogicFunction<T extends readonly EFWFormFieldProps[], K extends ExtractFieldNames<T>> = (value: GetFieldValue<T, K>, allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void;
353
+ /**
354
+ * Configuración de lógica de campos que se adapta según el tipado.
355
+ * Para campos genéricos usa claves string, para campos específicos usa los nombres literales.
356
+ *
357
+ * @template T - Array readonly de propiedades de campos
358
+ *
359
+ * @example
360
+ * // Para campos tipados específicamente
361
+ * const typedLogic: EFWFieldLogic<MyFields> = {
362
+ * name: (value, allValues, updateField) => {
363
+ * // value es string, tipado automáticamente
364
+ * },
365
+ * age: (value, allValues, updateField) => {
366
+ * // value es number, tipado automáticamente
367
+ * }
368
+ * };
369
+ *
370
+ * // Para campos genéricos
371
+ * const genericLogic: EFWFieldLogic<EFWFormFieldProps[]> = {
372
+ * 'anyField': (value, allValues, updateField) => {
373
+ * // value es union de todos los tipos posibles
374
+ * }
375
+ * };
376
+ */
377
+ export type EFWFieldLogic<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = IsGenericFields<T> extends true ? Partial<Record<string, GenericFieldLogicFunction<T>>> : {
378
+ [K in ExtractFieldNames<T>]?: StrictFieldLogicFunction<T, K>;
379
+ };
380
+ /**
381
+ * Opciones para la función setValues que controla el comportamiento al actualizar valores.
382
+ *
383
+ * @interface EFWFormSetValuesOptions
384
+ * @example
385
+ * const options: EFWFormSetValuesOptions = {
386
+ * triggerOnChange: false, // No disparar onChange
387
+ * triggerFieldLogic: true, // Pero sí ejecutar fieldLogic
388
+ * overwriteAll: false // Solo actualizar campos especificados
389
+ * };
390
+ * formRef.current?.setValues({ name: 'Nuevo nombre' }, options);
391
+ */
392
+ export interface EFWFormSetValuesOptions {
393
+ triggerOnChange?: boolean;
394
+ triggerFieldLogic?: boolean;
395
+ overwriteAll?: boolean;
396
+ }
397
+ /**
398
+ * Interfaz que define todos los métodos expuestos por el componente EFWForm.
399
+ * Estos métodos permiten control programático completo del formulario desde componentes padre.
400
+ *
401
+ * @template T - Array readonly de propiedades de campos
402
+ * @interface EFWFormMethods
403
+ */
404
+ export interface EFWFormMethods<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> {
405
+ /**
406
+ * Obtiene una copia de todos los valores actuales del formulario.
407
+ *
408
+ * @returns {EFWFormValues<T>} Objeto con todos los valores tipados
409
+ * @example
410
+ * const currentValues = formRef.current?.getValues();
411
+ * console.log('Nombre actual:', currentValues?.name);
412
+ */
413
+ getValues: () => EFWFormValues<T>;
414
+ /**
415
+ * Establece nuevos valores para campos específicos del formulario.
416
+ * Permite actualización parcial o completa con control fino del comportamiento.
417
+ *
418
+ * @param {Partial<EFWFormValues<T>>} newValues - Nuevos valores a establecer
419
+ * @param {EFWFormSetValuesOptions} [options] - Opciones de comportamiento
420
+ * @example
421
+ * // Actualización simple
422
+ * formRef.current?.setValues({ name: 'Juan', age: 25 });
423
+ *
424
+ * // Con opciones específicas
425
+ * formRef.current?.setValues(
426
+ * { name: 'María' },
427
+ * { triggerOnChange: false, triggerFieldLogic: true }
428
+ * );
429
+ */
430
+ setValues: (newValues: Partial<EFWFormValues<T>>, options?: EFWFormSetValuesOptions) => void;
431
+ /**
432
+ * Restablece todos los valores del formulario a su estado inicial.
433
+ * Útil para formularios de "limpiar" o "resetear".
434
+ *
435
+ * @example
436
+ * // Botón de limpiar formulario
437
+ * const handleReset = () => {
438
+ * formRef.current?.resetValues();
439
+ * };
440
+ */
441
+ resetValues: () => void;
442
+ /**
443
+ * Controla el estado de deshabilitación de campos específicos o todos los campos.
444
+ *
445
+ * @param {boolean} disabled - true para deshabilitar, false para habilitar
446
+ * @param {ExtractFieldNames<T>[]} [fieldKeys] - Campos específicos (opcional)
447
+ * @returns {ExtractFieldNames<T>[]} Lista de campos que fueron modificados
448
+ * @example
449
+ * // Deshabilitar todo el formulario
450
+ * formRef.current?.setDisabled(true);
451
+ *
452
+ * // Deshabilitar solo campos específicos
453
+ * const modifiedFields = formRef.current?.setDisabled(true, ['name', 'email']);
454
+ */
455
+ setDisabled: (disabled: boolean, fieldKeys?: ExtractFieldNames<T>[]) => ExtractFieldNames<T>[];
456
+ /**
457
+ * Controla el estado de edición de campos específicos o todos los campos.
458
+ * Un campo no editable es de solo lectura pero visualmente diferente a uno deshabilitado.
459
+ *
460
+ * @param {boolean} editable - true para permitir edición, false para solo lectura
461
+ * @param {ExtractFieldNames<T>[]} [fieldKeys] - Campos específicos (opcional)
462
+ * @returns {ExtractFieldNames<T>[]} Lista de campos que fueron modificados
463
+ * @example
464
+ * // Hacer todo el formulario de solo lectura
465
+ * formRef.current?.setEditable(false);
466
+ *
467
+ * // Hacer editables solo ciertos campos
468
+ * formRef.current?.setEditable(true, ['description', 'notes']);
469
+ */
470
+ setEditable: (editable: boolean, fieldKeys?: ExtractFieldNames<T>[]) => ExtractFieldNames<T>[];
471
+ /**
472
+ * Verifica si el formulario completo está en estado deshabilitado.
473
+ *
474
+ * @returns {boolean} true si está deshabilitado, false si no
475
+ * @example
476
+ * if (formRef.current?.isDisabled()) {
477
+ * console.log('El formulario está deshabilitado');
478
+ * }
479
+ */
480
+ isDisabled: () => boolean;
481
+ /**
482
+ * Verifica si el formulario completo está en modo editable.
483
+ *
484
+ * @returns {boolean} true si es editable, false si es solo lectura
485
+ * @example
486
+ * const canEdit = formRef.current?.isEditable();
487
+ * if (!canEdit) {
488
+ * showReadOnlyMessage();
489
+ * }
490
+ */
491
+ isEditable: () => boolean;
492
+ /**
493
+ * Ejecuta validación completa del formulario según las reglas definidas.
494
+ * Puede mostrar notificaciones de error opcionalmente.
495
+ *
496
+ * @param {boolean} [showErrorNotification=false] - Si mostrar notificaciones de error
497
+ * @returns {boolean} true si es válido, false si hay errores
498
+ * @example
499
+ * // Validar antes de enviar
500
+ * const handleSubmit = () => {
501
+ * if (formRef.current?.validateForm(true)) {
502
+ * // Proceder con envío
503
+ * submitForm(formRef.current.getValues());
504
+ * }
505
+ * };
506
+ */
507
+ validateForm: (showErrorNotification?: boolean) => boolean;
508
+ /**
509
+ * Agrega un mensaje a la barra de mensajes del formulario.
510
+ * Útil para mostrar feedback, errores o información contextual.
511
+ *
512
+ * @param {EFWFormMessageBar} message - Objeto del mensaje a mostrar
513
+ * @param {'internal' | 'external'} [source='external'] - Origen del mensaje
514
+ * @example
515
+ * // Mostrar mensaje de éxito
516
+ * formRef.current?.addMessageBar({
517
+ * id: 'success-1',
518
+ * type: 'success',
519
+ * message: 'Datos guardados correctamente'
520
+ * });
521
+ *
522
+ * // Mostrar error de validación personalizada
523
+ * formRef.current?.addMessageBar({
524
+ * id: 'validation-error',
525
+ * type: 'error',
526
+ * message: 'La edad debe ser mayor a 18 años'
527
+ * }, 'internal');
528
+ */
529
+ addMessageBar: (message: EFWFormMessageBar, source?: 'internal' | 'external') => void;
530
+ /**
531
+ * Elimina un mensaje específico de la barra de mensajes.
532
+ *
533
+ * @param {string | number} messageId - ID del mensaje a eliminar
534
+ * @example
535
+ * // Eliminar mensaje después de 5 segundos
536
+ * formRef.current?.addMessageBar({ id: 'temp-msg', type: 'info', message: 'Guardando...' });
537
+ * setTimeout(() => {
538
+ * formRef.current?.removeMessageBar('temp-msg');
539
+ * }, 5000);
540
+ */
541
+ removeMessageBar: (messageId: string | number) => void;
542
+ /**
543
+ * Elimina todos los mensajes de la barra de mensajes del formulario.
544
+ * Útil para limpiar todas las notificaciones de una vez.
545
+ *
546
+ * @example
547
+ * // Limpiar todos los mensajes antes de una nueva operación
548
+ * const handleNewOperation = () => {
549
+ * formRef.current?.removeAllMessagesBar();
550
+ * // ... resto de la lógica
551
+ * };
552
+ */
553
+ removeAllMessagesBar: () => void;
554
+ }
555
+ /**
556
+ * Tipo que representa la referencia al componente EFWForm.
557
+ * Puede ser null si el componente no está montado o la referencia no está inicializada.
558
+ *
559
+ * @template T - Array readonly de propiedades de campos
560
+ * @typedef {EFWFormMethods<T> | null} EFWFormRef
561
+ * @example
562
+ * const formRef = useRef<EFWFormRef<MyFields>>(null);
563
+ *
564
+ * // Verificar si está disponible antes de usar
565
+ * if (formRef.current) {
566
+ * const values = formRef.current.getValues();
567
+ * }
568
+ */
569
+ export type EFWFormRef<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> = EFWFormMethods<T> | null;
570
+ /**
571
+ * Interfaz que extiende EFWFormMethods con funcionalidades específicas del hook useFormController.
572
+ * Proporciona una forma reactiva de interactuar con el formulario desde componentes React.
573
+ *
574
+ * @template T - Array readonly de propiedades de campos
575
+ * @interface useFormController
576
+ * @extends {EFWFormMethods<T>}
577
+ */
578
+ export interface UseFormController<T extends readonly EFWFormFieldProps[] = EFWFormFieldProps[]> extends EFWFormMethods<T> {
579
+ /**
580
+ * Referencia mutable que debe asignarse a la prop formRef del componente EFWForm.
581
+ * Esta referencia conecta el hook con la instancia del formulario.
582
+ *
583
+ * @type {React.MutableRefObject<EFWFormRef<T>>}
584
+ * @example
585
+ * const form = useFormController<MyFields>();
586
+ *
587
+ * return (
588
+ * <EFWForm
589
+ * formRef={form.formRef}
590
+ * fields={myFields}
591
+ * onValuesChange={form.onValuesChange}
592
+ * />
593
+ * );
594
+ */
595
+ formRef: React.MutableRefObject<EFWFormRef<T>>;
596
+ /**
597
+ * Estado reactivo que contiene los valores actuales del formulario.
598
+ * Se actualiza automáticamente cuando cambian los valores mediante onValuesChange.
599
+ *
600
+ * @type {EFWFormValues<T>}
601
+ * @example
602
+ * const form = useFormController<MyFields>();
603
+ *
604
+ * // Los valores están siempre actualizados
605
+ * useEffect(() => {
606
+ * console.log('Nombre cambió a:', form.values.name);
607
+ * }, [form.values.name]);
608
+ */
609
+ values: EFWFormValues<T>;
610
+ /**
611
+ * Callback que debe pasarse a la prop onValuesChange del componente EFWForm.
612
+ * Mantiene sincronizado el estado reactivo con los valores del formulario.
613
+ *
614
+ * @param {EFWFormValues<T>} newValues - Nuevos valores del formulario
615
+ * @example
616
+ * const form = useFormController<MyFields>();
617
+ *
618
+ * return (
619
+ * <EFWForm
620
+ * fields={myFields}
621
+ * onValuesChange={form.onValuesChange} // ← Conecta el estado reactivo
622
+ * />
623
+ * );
624
+ */
625
+ onValuesChange: (newValues: EFWFormValues<T>) => void;
626
+ }
627
+ /**
628
+ * Interfaz que define una sección del formulario para organizar campos en grupos lógicos.
629
+ * Las secciones permiten crear formularios más organizados y fáciles de navegar.
630
+ *
631
+ * @template T - Tipo específico de campo que contiene esta sección
632
+ * @interface EFWFormSection
633
+ */
634
+ export interface EFWFormSection<T extends EFWFormFieldProps = EFWFormFieldProps> {
635
+ /**
636
+ * Título opcional de la sección, puede ser texto o JSX.
637
+ * Se muestra como encabezado de la sección.
638
+ *
639
+ * @type {string | React.ReactNode}
640
+ * @example
641
+ * // Título simple
642
+ * title: "Información Personal"
643
+ *
644
+ * // Título con JSX
645
+ * title: <h3 className="section-title">Información Personal</h3>
646
+ */
647
+ title?: string | React.ReactNode;
648
+ /**
649
+ * Descripción opcional de la sección, puede ser texto o JSX.
650
+ * Proporciona contexto adicional sobre los campos de la sección.
651
+ *
652
+ * @type {string | React.ReactNode}
653
+ * @example
654
+ * description: "Complete los siguientes datos personales obligatorios"
655
+ */
656
+ description?: string | React.ReactNode;
657
+ /**
658
+ * Array de campos que pertenecen a esta sección.
659
+ * Cada campo debe implementar las propiedades de EFWFormFieldProps.
660
+ *
661
+ * @type {T[]}
662
+ * @example
663
+ * fields: [
664
+ * { id: '1', typeAsString: 'Text', internalName: 'firstName', ... },
665
+ * { id: '2', typeAsString: 'Text', internalName: 'lastName', ... }
666
+ * ]
667
+ */
668
+ fields: T[];
669
+ /**
670
+ * Configuración de columnas del grid para esta sección específica.
671
+ * Puede ser un número fijo de columnas o configuración responsiva.
672
+ *
673
+ * @type {GridTemplateColumnsType}
674
+ * @default 1
675
+ * @example
676
+ * // Grid fijo de 2 columnas
677
+ * gridTemplateColumns: 2
678
+ *
679
+ * // Grid responsivo
680
+ * gridTemplateColumns: {
681
+ * autoFit: { minColumnWidth: "300px", maxColumns: 3 }
682
+ * }
683
+ */
684
+ gridTemplateColumns?: GridTemplateColumnsType;
685
+ }
686
+ /**
687
+ * Interfaz base que define las propiedades comunes del componente EFWForm.
688
+ * Estas propiedades son compartidas tanto para formularios con fields como con sections.
689
+ *
690
+ * @template T - Array de propiedades de campos
691
+ * @interface EFWFormBaseProps
692
+ */
693
+ export interface EFWFormBaseProps<T extends EFWFormFieldProps[] = EFWFormFieldProps[]> {
694
+ /**
695
+ * Estilos CSS inline opcionales para el contenedor principal del formulario.
696
+ *
697
+ * @type {React.CSSProperties}
698
+ * @example
699
+ * style={{ backgroundColor: '#f5f5f5', padding: '20px' }}
700
+ */
701
+ style?: React.CSSProperties;
702
+ /**
703
+ * Clase CSS opcional para personalización adicional del formulario.
704
+ *
705
+ * @type {string}
706
+ * @example
707
+ * className="custom-form-container"
708
+ */
709
+ className?: string;
710
+ /**
711
+ * Título principal del formulario, mostrado en la parte superior.
712
+ *
713
+ * @type {string | React.ReactNode}
714
+ * @example
715
+ * // Título simple
716
+ * title="Registro de Usuario"
717
+ *
718
+ * // Título con JSX
719
+ * title={<h1 className="form-title">Registro de Usuario</h1>}
720
+ */
721
+ title?: string | React.ReactNode;
722
+ /**
723
+ * Descripción del formulario, mostrada debajo del título.
724
+ * Proporciona contexto sobre el propósito del formulario.
725
+ *
726
+ * @type {string | React.ReactNode}
727
+ * @example
728
+ * description="Complete todos los campos para crear su cuenta"
729
+ */
730
+ description?: string | React.ReactNode;
731
+ /**
732
+ * Indica si el formulario es obligatorio para el flujo de la aplicación.
733
+ * Puede afectar validaciones y comportamiento de envío.
734
+ *
735
+ * @type {boolean}
736
+ * @default false
737
+ */
738
+ required?: boolean;
739
+ /**
740
+ * Controla si los campos del formulario son editables.
741
+ * false convierte el formulario en modo de solo lectura.
742
+ *
743
+ * @type {boolean}
744
+ * @default true
745
+ * @example
746
+ * // Formulario de solo lectura para mostrar datos
747
+ * editable={false}
748
+ */
749
+ editable?: boolean;
750
+ /**
751
+ * Controla si el formulario completo está deshabilitado.
752
+ * Los campos deshabilitados no son interactivos y tienen apariencia atenuada.
753
+ *
754
+ * @type {boolean}
755
+ * @default false
756
+ * @example
757
+ * // Deshabilitar durante carga
758
+ * disabled={isLoading}
759
+ */
760
+ disabled?: boolean;
761
+ /**
762
+ * Controla la visibilidad del formulario completo.
763
+ * true oculta completamente el formulario del DOM.
764
+ *
765
+ * @type {boolean}
766
+ * @default false
767
+ * @example
768
+ * // Mostrar condicionalmente
769
+ * hidden={!showAdvancedOptions}
770
+ */
771
+ hidden?: boolean;
772
+ /**
773
+ * Espaciado en píxeles entre columnas y filas del grid del formulario.
774
+ *
775
+ * @type {number}
776
+ * @default 16
777
+ * @example
778
+ * gridTemplateGap={24} // Más espaciado
779
+ */
780
+ gridTemplateGap?: number;
781
+ /**
782
+ * Configuración de lógica personalizada para los campos del formulario.
783
+ * Permite definir comportamientos automáticos basados en cambios de valores.
784
+ *
785
+ * @type {EFWFieldLogic<T>}
786
+ * @example
787
+ * fieldLogic={{
788
+ * age: (value, allValues, updateField) => {
789
+ * if (value >= 18) {
790
+ * updateField(['canVote'], { value: true });
791
+ * }
792
+ * }
793
+ * }}
794
+ */
795
+ fieldLogic?: EFWFieldLogic<T>;
796
+ /**
797
+ * Callback ejecutado cuando cualquier valor del formulario cambia.
798
+ * Recibe los valores completos actualizados.
799
+ *
800
+ * @type {(values: EFWFormValues<T>) => void}
801
+ * @deprecated Usar onValuesChange en su lugar
802
+ * @example
803
+ * onChange={(values) => {
804
+ * console.log('Formulario cambió:', values);
805
+ * }}
806
+ */
807
+ onChange?: (values: EFWFormValues<T>) => void;
808
+ /**
809
+ * Callback ejecutado cuando cualquier valor del formulario cambia.
810
+ * Versión preferida y más clara que onChange.
811
+ *
812
+ * @type {(values: EFWFormValues<T>) => void}
813
+ * @example
814
+ * onValuesChange={(values) => {
815
+ * setFormState(values);
816
+ * validateInRealTime(values);
817
+ * }}
818
+ */
819
+ onValuesChange?: (values: EFWFormValues<T>) => void;
820
+ /**
821
+ * Array opcional de mensajes para mostrar en la barra de mensajes del formulario.
822
+ * Útil para feedback, errores o información contextual.
823
+ *
824
+ * @type {EFWFormMessageBar[]}
825
+ * @example
826
+ * messages={[
827
+ * { id: 'info', type: 'info', message: 'Los campos con * son obligatorios' },
828
+ * { id: 'warning', type: 'warning', message: 'Revise los datos antes de enviar' }
829
+ * ]}
830
+ */
831
+ messages?: EFWFormMessageBar[];
832
+ /**
833
+ * Referencia mutable para acceder a los métodos del formulario desde el componente padre.
834
+ *
835
+ * @type {MutableRefObject<EFWFormRef<T>>}
836
+ * @example
837
+ * const formRef = useRef<EFWFormRef<MyFields>>(null);
838
+ *
839
+ * const handleSubmit = () => {
840
+ * if (formRef.current?.validateForm()) {
841
+ * const values = formRef.current.getValues();
842
+ * submitForm(values);
843
+ * }
844
+ * };
845
+ */
846
+ formRef?: MutableRefObject<EFWFormRef<T>>;
847
+ /**
848
+ * Contenido React opcional renderizado antes del título y descripción.
849
+ * Útil para logos, breadcrumbs o elementos de navegación.
850
+ *
851
+ * @type {React.ReactNode}
852
+ * @example
853
+ * header={
854
+ * <div className="form-header">
855
+ * <Logo />
856
+ * <Breadcrumbs />
857
+ * </div>
858
+ * }
859
+ */
860
+ header?: React.ReactNode;
861
+ /**
862
+ * Contenido React opcional renderizado después de los campos pero antes de children.
863
+ * Ideal para botones de acción o información adicional.
864
+ *
865
+ * @type {React.ReactNode}
866
+ * @example
867
+ * footer={
868
+ * <div className="form-actions">
869
+ * <Button type="submit">Guardar</Button>
870
+ * <Button variant="secondary" onClick={handleCancel}>Cancelar</Button>
871
+ * </div>
872
+ * }
873
+ */
874
+ footer?: React.ReactNode;
875
+ /**
876
+ * Valores iniciales para precargar el formulario.
877
+ * Útil para formularios de edición o valores por defecto.
878
+ *
879
+ * @type {Partial<EFWFormValues<T>>}
880
+ * @example
881
+ * initialValues={{
882
+ * name: 'John Doe',
883
+ * email: 'john@example.com',
884
+ * age: 30
885
+ * }}
886
+ */
887
+ initialValues?: Partial<EFWFormValues<T>>;
888
+ /**
889
+ * Callback opcional ejecutado una vez al inicializar el formulario.
890
+ * Útil para configuraciones dinámicas como cargar opciones desde API.
891
+ * Soporta operaciones asíncronas.
892
+ *
893
+ * @type {(allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void | Promise<void>}
894
+ * @example
895
+ * onInit={async (allValues, updateField) => {
896
+ * const options = await fetchOptionsFromAPI();
897
+ * updateField(['category'], { options });
898
+ * }}
899
+ */
900
+ onInit?: (allValues: EFWFormValues<T>, updateField: EFWUpdateFieldFunction<T>) => void | Promise<void>;
901
+ /**
902
+ * Contenido React adicional renderizado al final del formulario.
903
+ * Permite extensibilidad completa del formulario.
904
+ *
905
+ * @type {React.ReactNode}
906
+ * @example
907
+ * children={
908
+ * <div className="additional-content">
909
+ * <Terms />
910
+ * <PrivacyNotice />
911
+ * </div>
912
+ * }
913
+ */
914
+ children?: React.ReactNode;
915
+ }
916
+ /**
917
+ * Interfaz principal del componente EFWForm que combina propiedades base con
918
+ * configuración específica para fields o sections (mutuamente excluyentes).
919
+ *
920
+ * @template T - Array de propiedades de campos
921
+ * @interface EFWFormProps
922
+ * @extends {EFWFormBaseProps<T>}
923
+ */
924
+ export interface EFWFormProps<T extends EFWFormFieldProps[] = EFWFormFieldProps[]> extends EFWFormBaseProps<T> {
925
+ /**
926
+ * Array de campos que componen el formulario.
927
+ * No se puede usar junto con la propiedad sections.
928
+ *
929
+ * @type {T}
930
+ * @example
931
+ * fields={[
932
+ * { id: '1', typeAsString: 'Text', internalName: 'name', label: 'Nombre' },
933
+ * { id: '2', typeAsString: 'Number', internalName: 'age', label: 'Edad' }
934
+ * ]}
935
+ */
936
+ fields?: T;
937
+ /**
938
+ * Configuración de columnas del grid cuando se usa la propiedad fields.
939
+ * Solo disponible cuando NO se usan sections.
940
+ *
941
+ * @type {GridTemplateColumnsType}
942
+ * @default 1
943
+ * @example
944
+ * // Grid fijo de 3 columnas
945
+ * gridTemplateColumns={3}
946
+ *
947
+ * // Grid responsivo
948
+ * gridTemplateColumns={{
949
+ * autoFit: { minColumnWidth: "250px", maxColumns: 4 }
950
+ * }}
951
+ */
952
+ gridTemplateColumns?: GridTemplateColumnsType;
953
+ /**
954
+ * Array de secciones para organizar campos en grupos lógicos.
955
+ * No se puede usar junto con la propiedad fields.
956
+ * Cada sección puede tener su propia configuración de grid.
957
+ *
958
+ * @type {EFWFormSection<T[number]>[]}
959
+ * @example
960
+ * sections={[
961
+ * {
962
+ * title: "Información Personal",
963
+ * description: "Datos básicos del usuario",
964
+ * gridTemplateColumns: 2,
965
+ * fields: [
966
+ * { id: '1', typeAsString: 'Text', internalName: 'firstName' },
967
+ * { id: '2', typeAsString: 'Text', internalName: 'lastName' }
968
+ * ]
969
+ * },
970
+ * {
971
+ * title: "Contacto",
972
+ * gridTemplateColumns: 1,
973
+ * fields: [
974
+ * { id: '3', typeAsString: 'Text', internalName: 'email' }
975
+ * ]
976
+ * }
977
+ * ]}
978
+ */
979
+ sections?: EFWFormSection<T[number]>[];
980
+ }
981
+ export {};