@algodomain/smart-forms 0.1.2 → 0.1.4

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 (35) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +243 -0
  3. package/dist/{SmartFormProvider-DyJoDBjQ.d.cts → SmartFormProvider-BdyRQakk.d.cts} +1 -0
  4. package/dist/{SmartFormProvider-DyJoDBjQ.d.ts → SmartFormProvider-BdyRQakk.d.ts} +1 -0
  5. package/dist/{SmartTags-HmvmCJPT.d.cts → SmartTags-DEpmTDF5.d.cts} +42 -18
  6. package/dist/{SmartTags-HmvmCJPT.d.ts → SmartTags-DEpmTDF5.d.ts} +42 -18
  7. package/dist/{chunk-KDPN4CHW.js → chunk-BNQNL7GF.js} +658 -145
  8. package/dist/chunk-BNQNL7GF.js.map +1 -0
  9. package/dist/{chunk-5LRBJEZW.js → chunk-RHECLW3K.js} +80 -7
  10. package/dist/chunk-RHECLW3K.js.map +1 -0
  11. package/dist/{chunk-CJ55WKPC.cjs → chunk-VGP3HY5Y.cjs} +758 -235
  12. package/dist/chunk-VGP3HY5Y.cjs.map +1 -0
  13. package/dist/{chunk-4H5U5IHH.cjs → chunk-WIBCOQPP.cjs} +80 -7
  14. package/dist/chunk-WIBCOQPP.cjs.map +1 -0
  15. package/dist/fields.cjs +212 -481
  16. package/dist/fields.cjs.map +1 -1
  17. package/dist/fields.d.cts +14 -22
  18. package/dist/fields.d.ts +14 -22
  19. package/dist/fields.js +66 -338
  20. package/dist/fields.js.map +1 -1
  21. package/dist/index.cjs +42 -30
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +7 -3
  24. package/dist/index.d.ts +7 -3
  25. package/dist/index.js +17 -9
  26. package/dist/index.js.map +1 -1
  27. package/dist/opinionated.cjs +18 -18
  28. package/dist/opinionated.d.cts +1 -1
  29. package/dist/opinionated.d.ts +1 -1
  30. package/dist/opinionated.js +2 -2
  31. package/package.json +4 -2
  32. package/dist/chunk-4H5U5IHH.cjs.map +0 -1
  33. package/dist/chunk-5LRBJEZW.js.map +0 -1
  34. package/dist/chunk-CJ55WKPC.cjs.map +0 -1
  35. package/dist/chunk-KDPN4CHW.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkCJ55WKPC_cjs = require('./chunk-CJ55WKPC.cjs');
4
- var chunk4H5U5IHH_cjs = require('./chunk-4H5U5IHH.cjs');
3
+ var chunkVGP3HY5Y_cjs = require('./chunk-VGP3HY5Y.cjs');
4
+ var chunkWIBCOQPP_cjs = require('./chunk-WIBCOQPP.cjs');
5
5
  var React3 = require('react');
6
6
  var reactToastify = require('react-toastify');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -91,7 +91,8 @@ var BaseSmartForm = ({
91
91
  showTabNumbers = true,
92
92
  authentication,
93
93
  includeQueryParams = false,
94
- queryParamsToInclude
94
+ queryParamsToInclude,
95
+ submitDisabled
95
96
  }) => {
96
97
  const config = {
97
98
  api,
@@ -116,9 +117,10 @@ var BaseSmartForm = ({
116
117
  showTabNumbers,
117
118
  authentication,
118
119
  includeQueryParams,
119
- queryParamsToInclude
120
+ queryParamsToInclude,
121
+ submitDisabled
120
122
  };
121
- return /* @__PURE__ */ jsxRuntime.jsx(chunk4H5U5IHH_cjs.SmartFormProvider, { config, initialData, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
123
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkWIBCOQPP_cjs.SmartFormProvider, { config, initialData, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
122
124
  /* @__PURE__ */ jsxRuntime.jsx(ToastContainerWrapper, {}),
123
125
  /* @__PURE__ */ jsxRuntime.jsx(FormHeader, { title, subTitle, logo }),
124
126
  children,
@@ -126,15 +128,15 @@ var BaseSmartForm = ({
126
128
  ] }) });
127
129
  };
128
130
  var LoadingSpinner = ({ className = "h-4 w-4" }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: `animate-spin rounded-full border-b-2 border-current ${className}` });
129
- var SubmitButton = ({ onClick, disabled, children, className }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, disabled, className, children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
131
+ var SubmitButton = ({ onClick, disabled, isLoading, children, className }) => /* @__PURE__ */ jsxRuntime.jsx(chunkVGP3HY5Y_cjs.Button, { onClick, disabled, className, children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
130
132
  /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, {}),
131
133
  "Submitting..."
132
134
  ] }) : children });
133
- var DraftSaveButton = ({ onClick, disabled }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, disabled, variant: "secondary", children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
135
+ var DraftSaveButton = ({ onClick, disabled }) => /* @__PURE__ */ jsxRuntime.jsx(chunkVGP3HY5Y_cjs.Button, { onClick, disabled, variant: "secondary", children: disabled ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
134
136
  /* @__PURE__ */ jsxRuntime.jsx(LoadingSpinner, {}),
135
137
  "Saving..."
136
138
  ] }) : "Save Draft" });
137
- var ResetButton = ({ onClick }) => /* @__PURE__ */ jsxRuntime.jsx(chunkCJ55WKPC_cjs.Button, { onClick, variant: "secondary", children: "Reset Form" });
139
+ var ResetButton = ({ onClick }) => /* @__PURE__ */ jsxRuntime.jsx(chunkVGP3HY5Y_cjs.Button, { onClick, variant: "secondary", children: "Reset Form" });
138
140
  var NavigationButtons = ({
139
141
  onPrevious,
140
142
  onNext,
@@ -147,6 +149,8 @@ var NavigationButtons = ({
147
149
  isFirstTab = false,
148
150
  isLastTab = false
149
151
  }) => {
152
+ const { formData, config: formConfig } = chunkWIBCOQPP_cjs.useSmartForm();
153
+ const isSubmitDisabled = typeof formConfig.submitDisabled === "function" ? formConfig.submitDisabled(formData) : formConfig.submitDisabled || false;
150
154
  const hasResetButton = !!onReset;
151
155
  const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;
152
156
  const hasSubmitOrNextButton = isLastTab || !!onNext;
@@ -155,7 +159,7 @@ var NavigationButtons = ({
155
159
  const isSingleButton = rightSectionButtons === 1 && !hasPreviousButton;
156
160
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between items-center mt-8 pt-6 border-t border-gray-200", children: [
157
161
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4", children: onPrevious && /* @__PURE__ */ jsxRuntime.jsxs(
158
- chunkCJ55WKPC_cjs.Button,
162
+ chunkVGP3HY5Y_cjs.Button,
159
163
  {
160
164
  onClick: onPrevious,
161
165
  disabled: isFirstTab,
@@ -173,7 +177,8 @@ var NavigationButtons = ({
173
177
  SubmitButton,
174
178
  {
175
179
  onClick: onSubmit,
176
- disabled: isLoading,
180
+ disabled: isLoading || isSubmitDisabled,
181
+ isLoading,
177
182
  className: isSingleButton ? "w-full" : "",
178
183
  children: [
179
184
  config.submitButtonIcon,
@@ -181,7 +186,7 @@ var NavigationButtons = ({
181
186
  ]
182
187
  }
183
188
  ) : onNext && /* @__PURE__ */ jsxRuntime.jsxs(
184
- chunkCJ55WKPC_cjs.Button,
189
+ chunkVGP3HY5Y_cjs.Button,
185
190
  {
186
191
  onClick: onNext,
187
192
  className: isSingleButton ? "w-full" : "",
@@ -202,6 +207,8 @@ var SimpleFormButtons = ({
202
207
  isDraftSaving,
203
208
  config
204
209
  }) => {
210
+ const { formData, config: formConfig } = chunkWIBCOQPP_cjs.useSmartForm();
211
+ const isSubmitDisabled = typeof formConfig.submitDisabled === "function" ? formConfig.submitDisabled(formData) : formConfig.submitDisabled || false;
205
212
  const hasResetButton = !!onReset;
206
213
  const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;
207
214
  const hasSubmitButton = true;
@@ -214,7 +221,8 @@ var SimpleFormButtons = ({
214
221
  SubmitButton,
215
222
  {
216
223
  onClick: onSubmit,
217
- disabled: isLoading,
224
+ disabled: isLoading || isSubmitDisabled,
225
+ isLoading,
218
226
  className: isSingleButton ? "w-full" : "",
219
227
  children: [
220
228
  config.submitButtonIcon,
@@ -225,7 +233,7 @@ var SimpleFormButtons = ({
225
233
  ] }) });
226
234
  };
227
235
  var SubmitButton2 = () => {
228
- const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = chunk4H5U5IHH_cjs.useSmartForm();
236
+ const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = chunkWIBCOQPP_cjs.useSmartForm();
229
237
  const shouldShowReset = config.showReset || config.enableLocalStorage;
230
238
  return /* @__PURE__ */ jsxRuntime.jsx(
231
239
  SimpleFormButtons,
@@ -265,7 +273,7 @@ function Tabs({
265
273
  TabsPrimitive__namespace.Root,
266
274
  {
267
275
  "data-slot": "tabs",
268
- className: chunk4H5U5IHH_cjs.cn("flex flex-col gap-2", className),
276
+ className: chunkWIBCOQPP_cjs.cn("flex flex-col gap-2", className),
269
277
  ...props
270
278
  }
271
279
  );
@@ -278,7 +286,7 @@ function TabsList({
278
286
  TabsPrimitive__namespace.List,
279
287
  {
280
288
  "data-slot": "tabs-list",
281
- className: chunk4H5U5IHH_cjs.cn(
289
+ className: chunkWIBCOQPP_cjs.cn(
282
290
  "bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
283
291
  className
284
292
  ),
@@ -294,7 +302,7 @@ function TabsTrigger({
294
302
  TabsPrimitive__namespace.Trigger,
295
303
  {
296
304
  "data-slot": "tabs-trigger",
297
- className: chunk4H5U5IHH_cjs.cn(
305
+ className: chunkWIBCOQPP_cjs.cn(
298
306
  "data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
299
307
  className
300
308
  ),
@@ -310,7 +318,7 @@ function TabsContent({
310
318
  TabsPrimitive__namespace.Content,
311
319
  {
312
320
  "data-slot": "tabs-content",
313
- className: chunk4H5U5IHH_cjs.cn("flex-1 outline-none", className),
321
+ className: chunkWIBCOQPP_cjs.cn("flex-1 outline-none", className),
314
322
  ...props
315
323
  }
316
324
  );
@@ -485,7 +493,7 @@ var MultiTabFormContent = ({
485
493
  footerChildren,
486
494
  children
487
495
  }) => {
488
- const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = chunk4H5U5IHH_cjs.useSmartForm();
496
+ const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = chunkWIBCOQPP_cjs.useSmartForm();
489
497
  const [maxContentHeight, setMaxContentHeight] = React3.useState(0);
490
498
  const contentRefs = React3.useRef([]);
491
499
  const debounce = (func, wait) => {
@@ -755,7 +763,7 @@ var MultiTabFormContent = ({
755
763
 
756
764
  // src/hooks/useFormWrapper.ts
757
765
  var useFormWrapper = () => {
758
- return chunk4H5U5IHH_cjs.useSmartForm();
766
+ return chunkWIBCOQPP_cjs.useSmartForm();
759
767
  };
760
768
  var useExternalFormRegistration = () => {
761
769
  const context = React3.useContext(ExternalFormContext);
@@ -777,7 +785,7 @@ var ExternalFieldProvider = ({
777
785
  children,
778
786
  registerField
779
787
  }) => {
780
- return /* @__PURE__ */ jsxRuntime.jsx(chunk4H5U5IHH_cjs.FieldDetectionContext.Provider, { value: { registerField }, children });
788
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkWIBCOQPP_cjs.FieldDetectionContext.Provider, { value: { registerField }, children });
781
789
  };
782
790
 
783
791
  // src/useAutoDetectFields.tsx
@@ -845,43 +853,47 @@ var FormFieldGroup = ({
845
853
 
846
854
  Object.defineProperty(exports, "SmartCheckbox", {
847
855
  enumerable: true,
848
- get: function () { return chunkCJ55WKPC_cjs.SmartCheckbox; }
856
+ get: function () { return chunkVGP3HY5Y_cjs.SmartCheckbox; }
857
+ });
858
+ Object.defineProperty(exports, "SmartCombobox", {
859
+ enumerable: true,
860
+ get: function () { return chunkVGP3HY5Y_cjs.SmartCombobox; }
849
861
  });
850
862
  Object.defineProperty(exports, "SmartDatePicker", {
851
863
  enumerable: true,
852
- get: function () { return chunkCJ55WKPC_cjs.SmartDatePicker; }
864
+ get: function () { return chunkVGP3HY5Y_cjs.SmartDatePicker; }
853
865
  });
854
866
  Object.defineProperty(exports, "SmartRadioGroup", {
855
867
  enumerable: true,
856
- get: function () { return chunkCJ55WKPC_cjs.SmartRadioGroup; }
868
+ get: function () { return chunkVGP3HY5Y_cjs.SmartRadioGroup; }
857
869
  });
858
870
  Object.defineProperty(exports, "SmartSelect", {
859
871
  enumerable: true,
860
- get: function () { return chunkCJ55WKPC_cjs.SmartSelect; }
872
+ get: function () { return chunkVGP3HY5Y_cjs.SmartSelect; }
861
873
  });
862
874
  Object.defineProperty(exports, "SmartTags", {
863
875
  enumerable: true,
864
- get: function () { return chunkCJ55WKPC_cjs.SmartTags; }
876
+ get: function () { return chunkVGP3HY5Y_cjs.SmartTags; }
865
877
  });
866
878
  Object.defineProperty(exports, "SmartFormProvider", {
867
879
  enumerable: true,
868
- get: function () { return chunk4H5U5IHH_cjs.SmartFormProvider; }
880
+ get: function () { return chunkWIBCOQPP_cjs.SmartFormProvider; }
869
881
  });
870
882
  Object.defineProperty(exports, "SmartInput", {
871
883
  enumerable: true,
872
- get: function () { return chunk4H5U5IHH_cjs.SmartInput; }
884
+ get: function () { return chunkWIBCOQPP_cjs.SmartInput; }
873
885
  });
874
886
  Object.defineProperty(exports, "useFieldDetection", {
875
887
  enumerable: true,
876
- get: function () { return chunk4H5U5IHH_cjs.useFieldDetection; }
888
+ get: function () { return chunkWIBCOQPP_cjs.useFieldDetection; }
877
889
  });
878
890
  Object.defineProperty(exports, "useFormField", {
879
891
  enumerable: true,
880
- get: function () { return chunk4H5U5IHH_cjs.useFormField; }
892
+ get: function () { return chunkWIBCOQPP_cjs.useFormField; }
881
893
  });
882
894
  Object.defineProperty(exports, "useSmartForm", {
883
895
  enumerable: true,
884
- get: function () { return chunk4H5U5IHH_cjs.useSmartForm; }
896
+ get: function () { return chunkWIBCOQPP_cjs.useSmartForm; }
885
897
  });
886
898
  exports.BaseSmartForm = BaseSmartForm;
887
899
  exports.DraftSaveButton = DraftSaveButton;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/BaseSmartForm.tsx","../src/FormButtons.tsx","../src/SmartForm.tsx","../src/components/ui/tabs.tsx","../src/TabIndexContext.tsx","../src/constants/externalFormContext.ts","../src/MultiTabSmartForm.tsx","../src/hooks/useFormWrapper.ts","../src/hooks/useExternalFormRegistration.ts","../src/useExternalFormFields.tsx","../src/ExternalFieldProvider.tsx","../src/useAutoDetectFields.tsx","../src/useExternalTab.tsx","../src/FormFieldGroup.tsx"],"names":["jsx","ToastContainer","Bounce","jsxs","SmartFormProvider","Button","Fragment","ChevronLeft","ChevronRight","SubmitButton","useSmartForm","React","isValidElement","TabsPrimitive","cn","useContext","createContext","useState","useMemo","footerChildren","regularChildren","useCallback","children","useRef","z","Check","X","useEffect","FieldDetectionContext"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { type ReactNode } from 'react';\nimport { ToastContainer, Bounce } from 'react-toastify';\nimport { SmartFormProvider } from './SmartFormProvider';\n\n// =============================================================================\n// BASE SMART FORM TYPES\n// =============================================================================\n\nimport type { AuthenticationConfig } from './SmartFormProvider';\n\nexport interface BaseSmartFormProps {\n children: ReactNode;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n enableLocalStorage?: boolean;\n storageKey?: string;\n logFormData?: boolean;\n onSuccess?: (data: unknown) => void;\n onError?: (error: unknown) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string;\n logo?: ReactNode;\n footer?: ReactNode;\n initialData?: Record<string, unknown>;\n showReset?: boolean;\n // Additional props for multi-tab forms\n showProgressBar?: boolean;\n showTabNumbers?: boolean;\n // Authentication\n authentication?: AuthenticationConfig; // Authentication configuration\n // Query parameters\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n}\n\n// =============================================================================\n// COMMON UI COMPONENTS\n// =============================================================================\n\nexport const ToastContainerWrapper: React.FC = () => (\n <ToastContainer\n position=\"top-center\"\n autoClose={2000}\n newestOnTop={false}\n closeOnClick\n rtl={false}\n pauseOnFocusLoss\n draggable\n pauseOnHover\n theme=\"light\"\n transition={Bounce}\n />\n);\n\nexport const FormHeader: React.FC<{ title?: string; subTitle?: string; logo?: ReactNode }> = ({ title, subTitle, logo }) => {\n if (!title && !subTitle && !logo) return null;\n\n return (\n <div className=\"mb-4 border-b border-gray-200 pb-4\">\n <div className=\"flex items-center justify-center space-x-4\">\n {logo && (\n <div className=\"flex-shrink-0\">\n {logo}\n </div>\n )}\n {(title || subTitle) && (\n <div className={logo ? \"text-left\" : \"text-center\"}>\n {title && (\n <h1 className=\"text-xl font-bold text-gray-800\">\n {title}\n </h1>\n )}\n {subTitle && (\n <p className=\"text-muted-foreground text-sm\">{subTitle}</p>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const Section: React.FC<{ text?: string }> = ({ text }) => {\n return (\n <div className=\"relative my-6\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-300\" />\n </div>\n <div className=\"relative flex justify-center text-sm\">\n <span className=\"bg-white px-2 text-gray-500\">{text}</span>\n </div>\n </div>\n );\n};\n\nexport const Footer: React.FC<{ children: ReactNode; className?: string }> = ({ children, className = \"\" }) => {\n return (\n <div className={`mt-4 pt-4 border-t border-gray-200 ${className}`}>\n {children}\n </div>\n );\n};\n\n// =============================================================================\n// BASE SMART FORM COMPONENT\n// =============================================================================\n\nexport const BaseSmartForm: React.FC<BaseSmartFormProps> = ({\n children,\n api,\n method = 'POST',\n submitButtonText = 'Submit',\n submitButtonIcon,\n allowSaveDraft = false,\n saveDraftApi,\n enableLocalStorage = false,\n storageKey,\n logFormData = false,\n onSuccess,\n onError,\n transformData,\n className = 'max-w-2xl mx-auto p-6 bg-white',\n title,\n subTitle,\n logo,\n footer,\n initialData = {},\n showReset = false,\n showProgressBar = true,\n showTabNumbers = true,\n authentication,\n includeQueryParams = false,\n queryParamsToInclude\n}) => {\n const config = {\n api,\n method,\n submitButtonText,\n submitButtonIcon,\n allowSaveDraft,\n saveDraftApi,\n enableLocalStorage,\n storageKey,\n logFormData,\n onSuccess,\n onError,\n transformData,\n className,\n title,\n subTitle,\n logo,\n footer,\n showReset,\n showProgressBar,\n showTabNumbers,\n authentication,\n includeQueryParams,\n queryParamsToInclude\n };\n\n return (\n <SmartFormProvider config={config} initialData={initialData}>\n <div className={className}>\n <ToastContainerWrapper />\n <FormHeader title={title} subTitle={subTitle} logo={logo} />\n {children}\n {footer && (\n <div className=\"mt-4 pt-4 border-t border-gray-200\">\n {footer}\n </div>\n )}\n </div>\n </SmartFormProvider>\n );\n};\n\n","import React, { type ReactNode } from 'react';\nimport { Button } from './components/ui/button';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\n// =============================================================================\n// FORM BUTTON TYPES\n// =============================================================================\n\ninterface FormConfig {\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n showReset?: boolean;\n enableLocalStorage?: boolean;\n}\n\nexport interface FormButtonProps {\n isLoading: boolean;\n isDraftSaving: boolean;\n config: FormConfig;\n onSubmit: () => void;\n onSaveDraft?: () => void;\n onReset?: () => void;\n}\n\nexport interface NavigationButtonProps extends FormButtonProps {\n onPrevious?: () => void;\n onNext?: () => void;\n isFirstTab?: boolean;\n isLastTab?: boolean;\n}\n\n// =============================================================================\n// LOADING SPINNER COMPONENT\n// =============================================================================\n\nexport const LoadingSpinner: React.FC<{ className?: string }> = ({ className = \"h-4 w-4\" }) => (\n <div className={`animate-spin rounded-full border-b-2 border-current ${className}`}></div>\n);\n\n// =============================================================================\n// SUBMIT BUTTON COMPONENT\n// =============================================================================\n\nexport const SubmitButton: React.FC<{ \n onClick: () => void; \n disabled: boolean; \n children: ReactNode;\n className?: string;\n}> = ({ onClick, disabled, children, className }) => (\n <Button onClick={onClick} disabled={disabled} className={className}>\n {disabled ? (\n <>\n <LoadingSpinner />\n Submitting...\n </>\n ) : (\n children\n )}\n </Button>\n);\n\n// =============================================================================\n// DRAFT SAVE BUTTON COMPONENT\n// =============================================================================\n\nexport const DraftSaveButton: React.FC<{ \n onClick: () => void; \n disabled: boolean; \n}> = ({ onClick, disabled }) => (\n <Button onClick={onClick} disabled={disabled} variant=\"secondary\">\n {disabled ? (\n <>\n <LoadingSpinner />\n Saving...\n </>\n ) : (\n 'Save Draft'\n )}\n </Button>\n);\n\n// =============================================================================\n// RESET BUTTON COMPONENT\n// =============================================================================\n\nexport const ResetButton: React.FC<{ onClick: () => void }> = ({ onClick }) => (\n <Button onClick={onClick} variant=\"secondary\">\n Reset Form\n </Button>\n);\n\n// =============================================================================\n// NAVIGATION BUTTONS COMPONENT\n// =============================================================================\n\nexport const NavigationButtons: React.FC<NavigationButtonProps> = ({\n onPrevious,\n onNext,\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config,\n isFirstTab = false,\n isLastTab = false\n}) => {\n // Count buttons in the right section\n const hasResetButton = !!onReset;\n const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;\n const hasSubmitOrNextButton = isLastTab || !!onNext;\n const rightSectionButtons = [hasResetButton, hasDraftButton, hasSubmitOrNextButton].filter(Boolean).length;\n \n // Check if there's only one button in the right section and no previous button\n const hasPreviousButton = !!onPrevious;\n const isSingleButton = rightSectionButtons === 1 && !hasPreviousButton;\n\n return (\n <div className=\"flex justify-between items-center mt-8 pt-6 border-t border-gray-200\">\n <div className=\"flex gap-4\">\n {onPrevious && (\n <Button\n onClick={onPrevious}\n disabled={isFirstTab}\n variant=\"secondary\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Previous\n </Button>\n )}\n </div>\n\n <div className={isSingleButton ? \"w-full\" : \"flex gap-4\"}>\n {onReset && <ResetButton onClick={onReset} />}\n \n {config.allowSaveDraft && onSaveDraft && (\n <DraftSaveButton onClick={onSaveDraft} disabled={isDraftSaving} />\n )}\n\n {isLastTab ? (\n <SubmitButton \n onClick={onSubmit} \n disabled={isLoading}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n {config.submitButtonIcon}\n {config.submitButtonText || 'Submit'}\n </SubmitButton>\n ) : (\n onNext && (\n <Button \n onClick={onNext}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n )\n )}\n </div>\n </div>\n );\n};\n\n// =============================================================================\n// SIMPLE FORM BUTTONS COMPONENT (for single-page forms)\n// =============================================================================\n\nexport const SimpleFormButtons: React.FC<FormButtonProps> = ({\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config\n}) => {\n // Count how many buttons will be rendered\n const hasResetButton = !!onReset;\n const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;\n const hasSubmitButton = true; // Submit button is always present\n const totalButtons = [hasResetButton, hasDraftButton, hasSubmitButton].filter(Boolean).length;\n \n // If only one button (submit button), make it full width\n const isSingleButton = totalButtons === 1;\n\n return (\n <div className=\"flex justify-end mt-8 pt-6 border-t border-gray-200\">\n <div className={isSingleButton ? \"w-full\" : \"flex gap-4\"}>\n {onReset && <ResetButton onClick={onReset} />}\n \n {config.allowSaveDraft && onSaveDraft && (\n <DraftSaveButton onClick={onSaveDraft} disabled={isDraftSaving} />\n )}\n\n <SubmitButton \n onClick={onSubmit} \n disabled={isLoading}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n {config.submitButtonIcon}\n {config.submitButtonText || 'Submit'}\n </SubmitButton>\n </div>\n </div>\n );\n};\n","import React, { isValidElement, type ReactElement } from 'react';\nimport { useSmartForm } from './SmartFormProvider';\nimport { BaseSmartForm, type BaseSmartFormProps, Footer } from './BaseSmartForm';\nimport { SimpleFormButtons } from './FormButtons';\n\n// =============================================================================\n// SMART FORM TYPES\n// =============================================================================\n\nexport type SmartFormProps = BaseSmartFormProps;\n\n// =============================================================================\n// SUBMIT BUTTON COMPONENT\n// =============================================================================\n\nconst SubmitButton: React.FC = () => {\n const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = useSmartForm();\n\n const shouldShowReset = config.showReset || config.enableLocalStorage;\n\n return (\n <SimpleFormButtons\n onSubmit={submitForm}\n onSaveDraft={config.allowSaveDraft ? saveDraft : undefined}\n onReset={shouldShowReset ? resetForm : undefined}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n />\n );\n};\n\n// =============================================================================\n// SMART FORM COMPONENT\n// =============================================================================\n\nexport const SmartForm: React.FC<SmartFormProps> = (props) => {\n // Separate Footer components from other children\n const { children, ...otherProps } = props;\n const childArray = React.Children.toArray(children);\n \n const footerChildren: ReactElement[] = [];\n const regularChildren: ReactElement[] = [];\n \n childArray.forEach((child) => {\n if (isValidElement(child) && child.type === Footer) {\n footerChildren.push(child);\n } else {\n regularChildren.push(child as ReactElement);\n }\n });\n\n return (\n <BaseSmartForm {...otherProps}>\n <div className=\"space-y-6\">\n {regularChildren}\n </div>\n <SubmitButton />\n {footerChildren.length > 0 && (\n <div className=\"space-y-4\">\n {footerChildren}\n </div>\n )}\n </BaseSmartForm>\n );\n};\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import React, { useContext } from 'react';\n\ninterface TabIndexContextType {\n tabIndex: number;\n}\n\nconst TabIndexContext = React.createContext<TabIndexContextType | null>(null);\n\nexport const useTabIndex = () => {\n const context = useContext(TabIndexContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n\nexport const TabIndexProvider: React.FC<{ children: React.ReactNode; tabIndex: number }> = ({ \n children, \n tabIndex \n}) => {\n return (\n <TabIndexContext.Provider value={{ tabIndex }}>\n {children}\n </TabIndexContext.Provider>\n );\n};\n","import { createContext } from 'react';\n\n// =============================================================================\n// EXTERNAL FORM REGISTRATION TYPES\n// =============================================================================\n\nexport interface ExternalFormContextType {\n registerTabFields: (tabIndex: number, fields: string[]) => void;\n currentTabIndex: number;\n}\n\nexport const ExternalFormContext = createContext<ExternalFormContextType | null>(null);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode, isValidElement, type ReactElement } from 'react';\nimport { useSmartForm } from './SmartFormProvider';\nimport { BaseSmartForm, type BaseSmartFormProps, Footer } from './BaseSmartForm';\nimport { NavigationButtons } from './FormButtons';\nimport { z } from 'zod';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from './components/ui/tabs';\nimport { Check, X } from 'lucide-react';\nimport { TabIndexProvider } from './TabIndexContext';\n\nimport { ExternalFormContext } from './constants/externalFormContext';\n\n\n\n// =============================================================================\n// MULTI TAB SMART FORM TYPES\n// =============================================================================\n\nexport interface TabProps {\n title: string;\n children: ReactNode;\n}\n\nexport interface MultiTabSmartFormProps extends BaseSmartFormProps {\n showProgressBar?: boolean;\n showTabNumbers?: boolean;\n}\n\n// =============================================================================\n// TAB COMPONENT\n// =============================================================================\n\nexport const Tab: React.FC<TabProps> = ({ children }) => {\n return <>{children}</>;\n};\n\n\n// =============================================================================\n// NAVIGATION BUTTONS WRAPPER COMPONENT\n// =============================================================================\n\ninterface NavigationButtonsWrapperProps {\n activeTab: number;\n totalTabs: number;\n onPrevious: () => void;\n onNext: () => void;\n onSubmit: () => void;\n onSaveDraft?: () => void;\n onReset?: () => void;\n isLoading: boolean;\n isDraftSaving: boolean;\n config: Record<string, unknown>;\n}\n\nconst NavigationButtonsWrapper: React.FC<NavigationButtonsWrapperProps> = ({\n activeTab,\n totalTabs,\n onPrevious,\n onNext,\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config\n}) => {\n const isLastTab = activeTab === totalTabs - 1;\n const isFirstTab = activeTab === 0;\n\n return (\n <NavigationButtons\n onPrevious={onPrevious}\n onNext={onNext}\n onSubmit={onSubmit}\n onSaveDraft={onSaveDraft}\n onReset={onReset}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n isFirstTab={isFirstTab}\n isLastTab={isLastTab}\n />\n );\n};\n\n// =============================================================================\n// MULTI TAB SMART FORM COMPONENT\n// =============================================================================\n\nexport const MultiTabSmartForm: React.FC<MultiTabSmartFormProps> = ({\n children,\n showProgressBar = true,\n showTabNumbers = true,\n ...baseProps\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [tabFields, setTabFields] = useState<string[][]>([]);\n const [completedTabs, setCompletedTabs] = useState<Set<number>>(new Set());\n const [validationErrorTabs, setValidationErrorTabs] = useState<Set<number>>(new Set());\n const [externalTabFields, setExternalTabFields] = useState<{ [tabIndex: number]: string[] }>({});\n\n // Separate Footer components from other children\n const { footerChildren, regularChildren } = useMemo(() => {\n const childArray = React.Children.toArray(children);\n const footerChildren: ReactElement[] = [];\n const regularChildren: ReactElement[] = [];\n \n childArray.forEach((child) => {\n if (isValidElement(child) && child.type === Footer) {\n footerChildren.push(child);\n } else {\n regularChildren.push(child as ReactElement);\n }\n });\n \n return { footerChildren, regularChildren };\n }, [children]);\n\n // Extract tab information from regular children and track fields\n const tabs: string[] = [];\n React.Children.forEach(regularChildren, (child) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const props = child.props as TabProps;\n if (props.title) {\n tabs.push(props.title);\n }\n }\n });\n\n // Helper function to recursively find smart form controls and collect their field names\n const findSmartInputs = useCallback((children: React.ReactNode): string[] => {\n const fields: string[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n // Check if it's any smart control with a `field` prop\n const fieldProps = child.props as Record<string, unknown>;\n if (fieldProps && typeof fieldProps === 'object' && 'field' in fieldProps && fieldProps.field) {\n fields.push(fieldProps.field as string);\n }\n // Recurse into children for nested components (e.g., groups)\n else if (child.props && typeof child.props === 'object' && 'children' in child.props) {\n const nestedFields = findSmartInputs((child.props as Record<string, unknown>).children as React.ReactNode);\n fields.push(...nestedFields);\n }\n }\n });\n\n return fields;\n }, []);\n\n // Function to register fields from external forms\n const registerTabFields = useCallback((tabIndex: number, fields: string[]) => {\n setExternalTabFields(prev => ({\n ...prev,\n [tabIndex]: fields\n }));\n }, []);\n\n // Initialize tab fields array\n React.useEffect(() => {\n const fields: string[][] = [];\n React.Children.forEach(regularChildren, (child) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabFieldsInTab = findSmartInputs((child.props as TabProps).children);\n fields.push(tabFieldsInTab);\n }\n });\n setTabFields(fields);\n }, [regularChildren, findSmartInputs]);\n\n // Combine internal and external fields for each tab\n const getCombinedTabFields = useCallback((tabIndex: number) => {\n const internalFields = tabFields[tabIndex] || [];\n const externalFields = externalTabFields[tabIndex] || [];\n return [...internalFields, ...externalFields];\n }, [tabFields, externalTabFields]);\n\n\n const config = {\n ...baseProps,\n showProgressBar,\n showTabNumbers\n };\n\n const handleTabChange = useCallback((index: number) => {\n setActiveTab(index);\n }, []);\n\n const handlePrevious = useCallback(() => {\n if (activeTab > 0) {\n setActiveTab(activeTab - 1);\n }\n }, [activeTab]);\n\n const handleNext = useCallback(() => {\n // This will be called from the NavigationButtons component with validation\n if (activeTab < tabs.length - 1) {\n setActiveTab(activeTab + 1);\n }\n }, [activeTab, tabs.length]);\n\n // Memoize the context value to prevent unnecessary re-renders\n const externalFormContextValue = useMemo(() => ({\n registerTabFields,\n currentTabIndex: activeTab\n }), [registerTabFields, activeTab]);\n\n return (\n <BaseSmartForm {...baseProps}>\n <ExternalFormContext.Provider value={externalFormContextValue}>\n <MultiTabFormContent\n activeTab={activeTab}\n tabs={tabs}\n getCombinedTabFields={getCombinedTabFields}\n config={config}\n onTabChange={handleTabChange}\n onPrevious={handlePrevious}\n onNext={handleNext}\n completedTabs={completedTabs}\n setCompletedTabs={setCompletedTabs}\n validationErrorTabs={validationErrorTabs}\n setValidationErrorTabs={setValidationErrorTabs}\n footerChildren={footerChildren}\n >\n {regularChildren}\n </MultiTabFormContent>\n </ExternalFormContext.Provider>\n </BaseSmartForm>\n );\n};\n\n// =============================================================================\n// MULTI TAB FORM CONTENT COMPONENT\n// =============================================================================\n\ninterface MultiTabFormContentProps {\n activeTab: number;\n tabs: string[];\n getCombinedTabFields: (tabIndex: number) => string[];\n config: Record<string, unknown>;\n onTabChange: (index: number) => void;\n onPrevious: () => void;\n onNext: () => void;\n completedTabs: Set<number>;\n setCompletedTabs: React.Dispatch<React.SetStateAction<Set<number>>>;\n validationErrorTabs: Set<number>;\n setValidationErrorTabs: React.Dispatch<React.SetStateAction<Set<number>>>;\n footerChildren: ReactElement[];\n children: ReactNode;\n}\n\nconst MultiTabFormContent: React.FC<MultiTabFormContentProps> = ({\n activeTab,\n tabs,\n getCombinedTabFields,\n config,\n onTabChange,\n onPrevious,\n onNext,\n completedTabs,\n setCompletedTabs,\n validationErrorTabs,\n setValidationErrorTabs,\n footerChildren,\n children\n}) => {\n const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = useSmartForm();\n \n // Calculate maximum content height needed across all tabs\n const [maxContentHeight, setMaxContentHeight] = useState<number>(0);\n const contentRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Debounce function for validation\n const debounce = (func: (...args: unknown[]) => void, wait: number) => {\n let timeout: ReturnType<typeof setTimeout>;\n return function executedFunction(...args: unknown[]) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n };\n\n // Effect to calculate and update maximum content height\n React.useEffect(() => {\n const calculateMaxHeight = () => {\n let maxHeight = 0;\n contentRefs.current.forEach((ref: HTMLDivElement | null) => {\n if (ref) {\n const height = ref.scrollHeight;\n maxHeight = Math.max(maxHeight, height);\n }\n });\n if (maxHeight > 0) {\n setMaxContentHeight(maxHeight);\n }\n };\n\n // Calculate height after a short delay to ensure content is rendered\n const timeoutId = setTimeout(calculateMaxHeight, 100);\n \n // Also calculate on window resize\n window.addEventListener('resize', calculateMaxHeight);\n \n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', calculateMaxHeight);\n };\n }, [children, activeTab]);\n\n // Real-time tab completion detection (only for green checkmarks)\n React.useEffect(() => {\n const checkTabCompletion = debounce(() => {\n // Check all tabs for completion status (green checkmarks only)\n tabs.forEach((_, tabIndex) => {\n const tabFieldsInTab = getCombinedTabFields(tabIndex);\n \n if (tabFieldsInTab.length === 0) {\n // No fields in this tab, remove from completed set\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n return;\n }\n\n // Check if all fields in this tab are valid\n let allFieldsValid = true;\n let hasAnyValue = false;\n\n for (const field of tabFieldsInTab) {\n const validation = validationRegistry[field];\n const fieldValue = formData[field];\n \n // Check if field has any value\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n hasAnyValue = true;\n }\n\n if (validation) {\n try {\n (validation as z.ZodSchema).parse(fieldValue);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allFieldsValid = false;\n break;\n }\n }\n }\n }\n\n // Update completion status (only green checkmarks)\n if (hasAnyValue && allFieldsValid) {\n // All fields valid - mark as completed and clear any validation errors\n setCompletedTabs(prev => new Set([...prev, tabIndex]));\n setValidationErrorTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n } else {\n // Not complete - remove from completed set\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n }\n });\n }, 300);\n\n checkTabCompletion();\n }, [formData, validationRegistry, getCombinedTabFields, tabs, setCompletedTabs, setValidationErrorTabs]);\n\n // Handle tab change with error checking\n const handleTabChangeWithErrorCheck = useCallback((index: number) => {\n onTabChange(index);\n\n // The real-time validation effect will handle tab status updates\n }, [onTabChange]);\n\n // Handle Next with validation\n const handleNextWithValidation = useCallback(() => {\n const currentTabFields = getCombinedTabFields(activeTab);\n if (currentTabFields.length > 0) {\n // Use form data and validation registry from context to validate synchronously\n\n const allErrors: Record<string, string> = {};\n let isValid = true;\n\n // Validate fields synchronously to get immediate error information\n for (const field of currentTabFields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n (validation as z.ZodSchema).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n if (isValid) {\n // Mark current tab as completed\n setCompletedTabs(prev => new Set([...prev, activeTab]));\n // Clear validation errors for this tab\n setValidationErrorTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(activeTab);\n return newSet;\n });\n onNext();\n } else {\n // Remove completed status if validation fails\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(activeTab);\n return newSet;\n });\n\n // Mark this tab as having validation errors\n setValidationErrorTabs(prev => new Set([...prev, activeTab]));\n\n // Update errors state\n validateFields(currentTabFields);\n\n // Find the first field with error from our synchronous validation\n const firstErrorField = currentTabFields.find(field => allErrors[field]);\n if (firstErrorField) {\n // Small delay to ensure DOM is updated with error states\n setTimeout(() => {\n const element = document.querySelector(`[data-field=\"${firstErrorField}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n (element as HTMLElement).focus();\n }\n }, 50);\n }\n }\n } else {\n // No fields to validate, proceed\n onNext();\n }\n }, [activeTab, getCombinedTabFields, validateFields, onNext, setCompletedTabs, setValidationErrorTabs, validationRegistry, formData]);\n\n // Handle form submission with validation and tab navigation\n const handleSubmitWithValidation = useCallback(async () => {\n // Perform validation synchronously to get immediate results\n const allErrors: Record<string, string> = {};\n let isValid = true;\n let firstErrorTabIndex = -1;\n\n // Validate all fields and collect errors\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as z.ZodSchema).parse === 'function') {\n try {\n (validation as z.ZodSchema).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Update errors state\n setErrors(allErrors);\n\n if (isValid) {\n // Form is valid, proceed with submission\n await submitForm();\n } else {\n // Clear all validation error tabs first\n setValidationErrorTabs(new Set());\n\n // Find the first tab with errors and mark tabs with errors\n for (let tabIndex = 0; tabIndex < tabs.length; tabIndex++) {\n const tabFieldsInTab = getCombinedTabFields(tabIndex);\n const hasErrorsInTab = tabFieldsInTab.some(field => allErrors[field]);\n\n if (hasErrorsInTab) {\n // Mark this tab as having validation errors\n setValidationErrorTabs(prev => new Set([...prev, tabIndex]));\n \n if (firstErrorTabIndex === -1) {\n firstErrorTabIndex = tabIndex;\n }\n }\n }\n\n if (firstErrorTabIndex !== -1) {\n // Navigate to the first tab with errors\n onTabChange(firstErrorTabIndex);\n\n // Scroll to first error field in that tab\n setTimeout(() => {\n const tabFieldsInTab = getCombinedTabFields(firstErrorTabIndex);\n const firstErrorField = tabFieldsInTab.find(field => allErrors[field]);\n\n if (firstErrorField) {\n const element = document.querySelector(`[data-field=\"${firstErrorField}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n (element as HTMLElement).focus();\n }\n }\n }, 100);\n }\n }\n }, [submitForm, getCombinedTabFields, onTabChange, tabs.length, validationRegistry, formData, setErrors, setValidationErrorTabs]);\n\n // Convert activeTab index to tab value for shadcn Tabs\n const activeTabValue = tabs[activeTab] || tabs[0] || '';\n\n return (\n <>\n\n <Tabs value={activeTabValue} onValueChange={(value) => {\n const newIndex = tabs.indexOf(value);\n if (newIndex !== -1) {\n handleTabChangeWithErrorCheck(newIndex);\n }\n }} className=\"w-full\">\n <TabsList className={`grid w-full mb-8`} style={{ gridTemplateColumns: `repeat(${tabs.length}, 1fr)` }}>\n {tabs.map((tab, index) => (\n <TabsTrigger key={tab} value={tab} className=\"flex items-center gap-2\">\n {(config.showTabNumbers as boolean) && <span>{index + 1}.</span>}\n {tab}\n {completedTabs.has(index) && (\n <Check className=\"h-4 w-4 text-green-600\" />\n )}\n {validationErrorTabs.has(index) && (\n <X className=\"h-4 w-4 text-red-600\" />\n )}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabProps = child.props as TabProps;\n return (\n <TabsContent key={index} value={tabProps.title}>\n <TabIndexProvider tabIndex={index}>\n <div \n ref={(el) => { contentRefs.current[index] = el; }}\n className=\"space-y-6\"\n style={{ minHeight: maxContentHeight > 0 ? `${maxContentHeight}px` : undefined }}\n >\n {tabProps.children}\n </div>\n </TabIndexProvider>\n </TabsContent>\n );\n }\n return null;\n })}\n\n {/* Hidden render of all tab content for immediate field registration and height calculation */}\n <div style={{ position: 'absolute', left: '-9999px', top: '-9999px', visibility: 'hidden' }}>\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabProps = child.props as TabProps;\n return (\n <TabIndexProvider key={`hidden-${index}`} tabIndex={index}>\n <div \n ref={(el) => { contentRefs.current[index] = el; }}\n className=\"space-y-6\"\n >\n {tabProps.children}\n </div>\n </TabIndexProvider>\n );\n }\n return null;\n })}\n </div>\n </Tabs>\n\n <NavigationButtonsWrapper\n activeTab={activeTab}\n totalTabs={tabs.length}\n onPrevious={onPrevious}\n onNext={handleNextWithValidation}\n onSubmit={handleSubmitWithValidation}\n onSaveDraft={config.allowSaveDraft ? saveDraft : undefined}\n onReset={(config.showReset || config.enableLocalStorage) ? resetForm : undefined}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n />\n\n {/* Footer components */}\n {footerChildren.length > 0 && (\n <div className=\"space-y-4\">\n {footerChildren}\n </div>\n )}\n\n {/* Progress Indicator */}\n {(config.showProgressBar as boolean) && (\n <div className=\"mt-6\">\n <div className=\"flex justify-between text-sm text-muted-foreground mb-2\">\n <span>Progress</span>\n <span>{Math.round(((activeTab + 1) / tabs.length) * 100)}%</span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${((activeTab + 1) / tabs.length) * 100}%` }}\n ></div>\n </div>\n </div>\n )}\n </>\n );\n};\n","import { useSmartForm } from '../SmartFormProvider';\n\n// =============================================================================\n// FORM WRAPPER HOOK\n// =============================================================================\n\nexport const useFormWrapper = () => {\n return useSmartForm();\n};\n","import { useContext } from 'react';\nimport { ExternalFormContext, type ExternalFormContextType } from '../constants/externalFormContext';\n\n// =============================================================================\n// EXTERNAL FORM REGISTRATION HOOK\n// =============================================================================\n\nexport const useExternalFormRegistration = (): ExternalFormContextType => {\n const context = useContext(ExternalFormContext);\n if (!context) {\n throw new Error('useExternalFormRegistration must be used within a MultiTabSmartForm');\n }\n return context;\n};\n","import { useEffect, useMemo } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\n\n/**\n * Hook for external forms to register their fields with MultiTabSmartForm\n * This allows external forms to participate in validation and tab switching\n */\nexport const useExternalFormFields = (fields: string[], tabIndex: number) => {\n const { registerTabFields } = useExternalFormRegistration();\n\n // Create a stable reference to the fields array\n const stableFields = useMemo(() => fields, [fields.join(',')]);\n\n useEffect(() => {\n if (stableFields.length > 0) {\n registerTabFields(tabIndex, stableFields);\n }\n }, [stableFields, tabIndex, registerTabFields]);\n};\n","import React from 'react';\nimport { FieldDetectionContext } from './FieldDetectionHook';\n\nexport const ExternalFieldProvider: React.FC<{ \n children: React.ReactNode; \n registerField: (fieldName: string) => void \n}> = ({ \n children, \n registerField \n}) => {\n return (\n <FieldDetectionContext.Provider value={{ registerField }}>\n {children}\n </FieldDetectionContext.Provider>\n );\n};\n","import { useCallback, useRef } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\nimport { ExternalFieldProvider } from './ExternalFieldProvider';\n\n/**\n * Hook that automatically detects SmartInput fields in external forms\n * This eliminates the need to manually specify field names\n */\nexport const useAutoDetectFields = (tabIndex: number) => {\n const { registerTabFields } = useExternalFormRegistration();\n const hasRegistered = useRef(false);\n const detectedFields = useRef<Set<string>>(new Set());\n\n // Function to register a field when it's detected\n const registerField = useCallback((fieldName: string) => {\n detectedFields.current.add(fieldName);\n \n // Register all detected fields with the MultiTabSmartForm\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }, [tabIndex, registerTabFields]);\n\n return { registerField, ExternalFieldProvider };\n};\n","import { useCallback, useRef, useEffect } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\nimport { ExternalFieldProvider } from './ExternalFieldProvider';\nimport { useTabIndex } from './TabIndexContext';\n\n/**\n * Hook that automatically detects both tab index and fields in external forms\n * This eliminates the need to manually specify both tab index and field names\n */\nexport const useExternalTab = () => {\n const { registerTabFields } = useExternalFormRegistration();\n const tabIndexContext = useTabIndex();\n const detectedFields = useRef<Set<string>>(new Set());\n const registrationTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasRegistered = useRef(false);\n\n // Use the tab index from context, or fallback to 0 if not available\n const tabIndex = tabIndexContext?.tabIndex ?? 0;\n\n // Function to register a field when it's detected\n const registerField = useCallback((fieldName: string) => {\n detectedFields.current.add(fieldName);\n \n // Clear any existing timeout\n if (registrationTimeout.current) {\n clearTimeout(registrationTimeout.current);\n }\n \n // Debounce the registration to allow all fields to be detected\n registrationTimeout.current = setTimeout(() => {\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n if (fieldsArray.length > 0) {\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }\n }, 200); // Longer delay to ensure all fields are detected\n }, [tabIndex, registerTabFields]);\n\n // Force registration after component mount to catch all fields\n useEffect(() => {\n const forceRegistrationTimeout = setTimeout(() => {\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n if (fieldsArray.length > 0) {\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }\n }, 1000); // Force registration after 1 second\n\n return () => {\n clearTimeout(forceRegistrationTimeout);\n if (registrationTimeout.current) {\n clearTimeout(registrationTimeout.current);\n }\n };\n }, [tabIndex, registerTabFields]);\n\n return { registerField, ExternalFieldProvider };\n};\n","import React, { type ReactNode } from 'react';\n\n// =============================================================================\n// FORM FIELD GROUP TYPES\n// =============================================================================\n\nexport interface FormFieldGroupProps {\n children: ReactNode;\n className?: string;\n}\n\n// =============================================================================\n// FORM FIELD GROUP COMPONENT\n// =============================================================================\n\nexport const FormFieldGroup: React.FC<FormFieldGroupProps> = ({\n children,\n className = ''\n}) => {\n return (\n <div className={`flex flex-wrap gap-2 md:gap-4 mb-4 ${className}`}>\n {children}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/BaseSmartForm.tsx","../src/FormButtons.tsx","../src/SmartForm.tsx","../src/components/ui/tabs.tsx","../src/TabIndexContext.tsx","../src/constants/externalFormContext.ts","../src/MultiTabSmartForm.tsx","../src/hooks/useFormWrapper.ts","../src/hooks/useExternalFormRegistration.ts","../src/useExternalFormFields.tsx","../src/ExternalFieldProvider.tsx","../src/useAutoDetectFields.tsx","../src/useExternalTab.tsx","../src/FormFieldGroup.tsx"],"names":["jsx","ToastContainer","Bounce","jsxs","SmartFormProvider","Button","Fragment","useSmartForm","ChevronLeft","ChevronRight","SubmitButton","React","isValidElement","TabsPrimitive","cn","useContext","createContext","useState","useMemo","footerChildren","regularChildren","useCallback","children","useRef","z","Check","X","useEffect","FieldDetectionContext"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { type ReactNode } from 'react';\nimport { ToastContainer, Bounce } from 'react-toastify';\nimport { SmartFormProvider } from './SmartFormProvider';\n\n// =============================================================================\n// BASE SMART FORM TYPES\n// =============================================================================\n\nimport type { AuthenticationConfig } from './SmartFormProvider';\n\nexport interface BaseSmartFormProps {\n children: ReactNode;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n enableLocalStorage?: boolean;\n storageKey?: string;\n logFormData?: boolean;\n onSuccess?: (data: unknown) => void;\n onError?: (error: unknown) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string;\n logo?: ReactNode;\n footer?: ReactNode;\n initialData?: Record<string, unknown>;\n showReset?: boolean;\n // Additional props for multi-tab forms\n showProgressBar?: boolean;\n showTabNumbers?: boolean;\n // Authentication\n authentication?: AuthenticationConfig; // Authentication configuration\n // Query parameters\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n // Submit button disable\n submitDisabled?: boolean | ((formData: any) => boolean);\n}\n\n// =============================================================================\n// COMMON UI COMPONENTS\n// =============================================================================\n\nexport const ToastContainerWrapper: React.FC = () => (\n <ToastContainer\n position=\"top-center\"\n autoClose={2000}\n newestOnTop={false}\n closeOnClick\n rtl={false}\n pauseOnFocusLoss\n draggable\n pauseOnHover\n theme=\"light\"\n transition={Bounce}\n />\n);\n\nexport const FormHeader: React.FC<{ title?: string; subTitle?: string; logo?: ReactNode }> = ({ title, subTitle, logo }) => {\n if (!title && !subTitle && !logo) return null;\n\n return (\n <div className=\"mb-4 border-b border-gray-200 pb-4\">\n <div className=\"flex items-center justify-center space-x-4\">\n {logo && (\n <div className=\"flex-shrink-0\">\n {logo}\n </div>\n )}\n {(title || subTitle) && (\n <div className={logo ? \"text-left\" : \"text-center\"}>\n {title && (\n <h1 className=\"text-xl font-bold text-gray-800\">\n {title}\n </h1>\n )}\n {subTitle && (\n <p className=\"text-muted-foreground text-sm\">{subTitle}</p>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const Section: React.FC<{ text?: string }> = ({ text }) => {\n return (\n <div className=\"relative my-6\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-300\" />\n </div>\n <div className=\"relative flex justify-center text-sm\">\n <span className=\"bg-white px-2 text-gray-500\">{text}</span>\n </div>\n </div>\n );\n};\n\nexport const Footer: React.FC<{ children: ReactNode; className?: string }> = ({ children, className = \"\" }) => {\n return (\n <div className={`mt-4 pt-4 border-t border-gray-200 ${className}`}>\n {children}\n </div>\n );\n};\n\n// =============================================================================\n// BASE SMART FORM COMPONENT\n// =============================================================================\n\nexport const BaseSmartForm: React.FC<BaseSmartFormProps> = ({\n children,\n api,\n method = 'POST',\n submitButtonText = 'Submit',\n submitButtonIcon,\n allowSaveDraft = false,\n saveDraftApi,\n enableLocalStorage = false,\n storageKey,\n logFormData = false,\n onSuccess,\n onError,\n transformData,\n className = 'max-w-2xl mx-auto p-6 bg-white',\n title,\n subTitle,\n logo,\n footer,\n initialData = {},\n showReset = false,\n showProgressBar = true,\n showTabNumbers = true,\n authentication,\n includeQueryParams = false,\n queryParamsToInclude,\n submitDisabled\n}) => {\n const config = {\n api,\n method,\n submitButtonText,\n submitButtonIcon,\n allowSaveDraft,\n saveDraftApi,\n enableLocalStorage,\n storageKey,\n logFormData,\n onSuccess,\n onError,\n transformData,\n className,\n title,\n subTitle,\n logo,\n footer,\n showReset,\n showProgressBar,\n showTabNumbers,\n authentication,\n includeQueryParams,\n queryParamsToInclude,\n submitDisabled\n };\n\n return (\n <SmartFormProvider config={config} initialData={initialData}>\n <div className={className}>\n <ToastContainerWrapper />\n <FormHeader title={title} subTitle={subTitle} logo={logo} />\n {children}\n {footer && (\n <div className=\"mt-4 pt-4 border-t border-gray-200\">\n {footer}\n </div>\n )}\n </div>\n </SmartFormProvider>\n );\n};\n\n","import React, { type ReactNode } from 'react';\nimport { Button } from './components/ui/button';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useSmartForm } from './SmartFormProvider';\n\n// =============================================================================\n// FORM BUTTON TYPES\n// =============================================================================\n\ninterface FormConfig {\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n showReset?: boolean;\n enableLocalStorage?: boolean;\n submitDisabled?: boolean | ((formData: any) => boolean);\n}\n\nexport interface FormButtonProps {\n isLoading: boolean;\n isDraftSaving: boolean;\n config: FormConfig;\n onSubmit: () => void;\n onSaveDraft?: () => void;\n onReset?: () => void;\n}\n\nexport interface NavigationButtonProps extends FormButtonProps {\n onPrevious?: () => void;\n onNext?: () => void;\n isFirstTab?: boolean;\n isLastTab?: boolean;\n}\n\n// =============================================================================\n// LOADING SPINNER COMPONENT\n// =============================================================================\n\nexport const LoadingSpinner: React.FC<{ className?: string }> = ({ className = \"h-4 w-4\" }) => (\n <div className={`animate-spin rounded-full border-b-2 border-current ${className}`}></div>\n);\n\n// =============================================================================\n// SUBMIT BUTTON COMPONENT\n// =============================================================================\n\nexport const SubmitButton: React.FC<{ \n onClick: () => void; \n disabled: boolean;\n isLoading: boolean;\n children: ReactNode;\n className?: string;\n}> = ({ onClick, disabled, isLoading, children, className }) => (\n <Button onClick={onClick} disabled={disabled} className={className}>\n {isLoading ? (\n <>\n <LoadingSpinner />\n Submitting...\n </>\n ) : (\n children\n )}\n </Button>\n);\n\n// =============================================================================\n// DRAFT SAVE BUTTON COMPONENT\n// =============================================================================\n\nexport const DraftSaveButton: React.FC<{ \n onClick: () => void; \n disabled: boolean; \n}> = ({ onClick, disabled }) => (\n <Button onClick={onClick} disabled={disabled} variant=\"secondary\">\n {disabled ? (\n <>\n <LoadingSpinner />\n Saving...\n </>\n ) : (\n 'Save Draft'\n )}\n </Button>\n);\n\n// =============================================================================\n// RESET BUTTON COMPONENT\n// =============================================================================\n\nexport const ResetButton: React.FC<{ onClick: () => void }> = ({ onClick }) => (\n <Button onClick={onClick} variant=\"secondary\">\n Reset Form\n </Button>\n);\n\n// =============================================================================\n// NAVIGATION BUTTONS COMPONENT\n// =============================================================================\n\nexport const NavigationButtons: React.FC<NavigationButtonProps> = ({\n onPrevious,\n onNext,\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config,\n isFirstTab = false,\n isLastTab = false\n}) => {\n const { formData, config: formConfig } = useSmartForm();\n \n // Evaluate submitDisabled state\n const isSubmitDisabled = typeof formConfig.submitDisabled === 'function' \n ? formConfig.submitDisabled(formData) \n : formConfig.submitDisabled || false;\n \n // Count buttons in the right section\n const hasResetButton = !!onReset;\n const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;\n const hasSubmitOrNextButton = isLastTab || !!onNext;\n const rightSectionButtons = [hasResetButton, hasDraftButton, hasSubmitOrNextButton].filter(Boolean).length;\n \n // Check if there's only one button in the right section and no previous button\n const hasPreviousButton = !!onPrevious;\n const isSingleButton = rightSectionButtons === 1 && !hasPreviousButton;\n\n return (\n <div className=\"flex justify-between items-center mt-8 pt-6 border-t border-gray-200\">\n <div className=\"flex gap-4\">\n {onPrevious && (\n <Button\n onClick={onPrevious}\n disabled={isFirstTab}\n variant=\"secondary\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Previous\n </Button>\n )}\n </div>\n\n <div className={isSingleButton ? \"w-full\" : \"flex gap-4\"}>\n {onReset && <ResetButton onClick={onReset} />}\n \n {config.allowSaveDraft && onSaveDraft && (\n <DraftSaveButton onClick={onSaveDraft} disabled={isDraftSaving} />\n )}\n\n {isLastTab ? (\n <SubmitButton \n onClick={onSubmit} \n disabled={isLoading || isSubmitDisabled}\n isLoading={isLoading}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n {config.submitButtonIcon}\n {config.submitButtonText || 'Submit'}\n </SubmitButton>\n ) : (\n onNext && (\n <Button \n onClick={onNext}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n )\n )}\n </div>\n </div>\n );\n};\n\n// =============================================================================\n// SIMPLE FORM BUTTONS COMPONENT (for single-page forms)\n// =============================================================================\n\nexport const SimpleFormButtons: React.FC<FormButtonProps> = ({\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config\n}) => {\n const { formData, config: formConfig } = useSmartForm();\n \n // Evaluate submitDisabled state\n const isSubmitDisabled = typeof formConfig.submitDisabled === 'function' \n ? formConfig.submitDisabled(formData) \n : formConfig.submitDisabled || false;\n \n // Count how many buttons will be rendered\n const hasResetButton = !!onReset;\n const hasDraftButton = config.allowSaveDraft && !!onSaveDraft;\n const hasSubmitButton = true; // Submit button is always present\n const totalButtons = [hasResetButton, hasDraftButton, hasSubmitButton].filter(Boolean).length;\n \n // If only one button (submit button), make it full width\n const isSingleButton = totalButtons === 1;\n\n return (\n <div className=\"flex justify-end mt-8 pt-6 border-t border-gray-200\">\n <div className={isSingleButton ? \"w-full\" : \"flex gap-4\"}>\n {onReset && <ResetButton onClick={onReset} />}\n \n {config.allowSaveDraft && onSaveDraft && (\n <DraftSaveButton onClick={onSaveDraft} disabled={isDraftSaving} />\n )}\n\n <SubmitButton \n onClick={onSubmit} \n disabled={isLoading || isSubmitDisabled}\n isLoading={isLoading}\n className={isSingleButton ? \"w-full\" : \"\"}\n >\n {config.submitButtonIcon}\n {config.submitButtonText || 'Submit'}\n </SubmitButton>\n </div>\n </div>\n );\n};\n","import React, { isValidElement, type ReactElement } from 'react';\nimport { useSmartForm } from './SmartFormProvider';\nimport { BaseSmartForm, type BaseSmartFormProps, Footer } from './BaseSmartForm';\nimport { SimpleFormButtons } from './FormButtons';\n\n// =============================================================================\n// SMART FORM TYPES\n// =============================================================================\n\nexport type SmartFormProps = BaseSmartFormProps;\n\n// =============================================================================\n// SUBMIT BUTTON COMPONENT\n// =============================================================================\n\nconst SubmitButton: React.FC = () => {\n const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, config } = useSmartForm();\n\n const shouldShowReset = config.showReset || config.enableLocalStorage;\n\n return (\n <SimpleFormButtons\n onSubmit={submitForm}\n onSaveDraft={config.allowSaveDraft ? saveDraft : undefined}\n onReset={shouldShowReset ? resetForm : undefined}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n />\n );\n};\n\n// =============================================================================\n// SMART FORM COMPONENT\n// =============================================================================\n\nexport const SmartForm: React.FC<SmartFormProps> = (props) => {\n // Separate Footer components from other children\n const { children, ...otherProps } = props;\n const childArray = React.Children.toArray(children);\n \n const footerChildren: ReactElement[] = [];\n const regularChildren: ReactElement[] = [];\n \n childArray.forEach((child) => {\n if (isValidElement(child) && child.type === Footer) {\n footerChildren.push(child);\n } else {\n regularChildren.push(child as ReactElement);\n }\n });\n\n return (\n <BaseSmartForm {...otherProps}>\n <div className=\"space-y-6\">\n {regularChildren}\n </div>\n <SubmitButton />\n {footerChildren.length > 0 && (\n <div className=\"space-y-4\">\n {footerChildren}\n </div>\n )}\n </BaseSmartForm>\n );\n};\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction TabsList({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import React, { useContext } from 'react';\n\ninterface TabIndexContextType {\n tabIndex: number;\n}\n\nconst TabIndexContext = React.createContext<TabIndexContextType | null>(null);\n\nexport const useTabIndex = () => {\n const context = useContext(TabIndexContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n\nexport const TabIndexProvider: React.FC<{ children: React.ReactNode; tabIndex: number }> = ({ \n children, \n tabIndex \n}) => {\n return (\n <TabIndexContext.Provider value={{ tabIndex }}>\n {children}\n </TabIndexContext.Provider>\n );\n};\n","import { createContext } from 'react';\n\n// =============================================================================\n// EXTERNAL FORM REGISTRATION TYPES\n// =============================================================================\n\nexport interface ExternalFormContextType {\n registerTabFields: (tabIndex: number, fields: string[]) => void;\n currentTabIndex: number;\n}\n\nexport const ExternalFormContext = createContext<ExternalFormContextType | null>(null);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode, isValidElement, type ReactElement } from 'react';\nimport { useSmartForm } from './SmartFormProvider';\nimport { BaseSmartForm, type BaseSmartFormProps, Footer } from './BaseSmartForm';\nimport { NavigationButtons } from './FormButtons';\nimport { z } from 'zod';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from './components/ui/tabs';\nimport { Check, X } from 'lucide-react';\nimport { TabIndexProvider } from './TabIndexContext';\n\nimport { ExternalFormContext } from './constants/externalFormContext';\n\n\n\n// =============================================================================\n// MULTI TAB SMART FORM TYPES\n// =============================================================================\n\nexport interface TabProps {\n title: string;\n children: ReactNode;\n}\n\nexport interface MultiTabSmartFormProps extends BaseSmartFormProps {\n showProgressBar?: boolean;\n showTabNumbers?: boolean;\n}\n\n// =============================================================================\n// TAB COMPONENT\n// =============================================================================\n\nexport const Tab: React.FC<TabProps> = ({ children }) => {\n return <>{children}</>;\n};\n\n\n// =============================================================================\n// NAVIGATION BUTTONS WRAPPER COMPONENT\n// =============================================================================\n\ninterface NavigationButtonsWrapperProps {\n activeTab: number;\n totalTabs: number;\n onPrevious: () => void;\n onNext: () => void;\n onSubmit: () => void;\n onSaveDraft?: () => void;\n onReset?: () => void;\n isLoading: boolean;\n isDraftSaving: boolean;\n config: Record<string, unknown>;\n}\n\nconst NavigationButtonsWrapper: React.FC<NavigationButtonsWrapperProps> = ({\n activeTab,\n totalTabs,\n onPrevious,\n onNext,\n onSubmit,\n onSaveDraft,\n onReset,\n isLoading,\n isDraftSaving,\n config\n}) => {\n const isLastTab = activeTab === totalTabs - 1;\n const isFirstTab = activeTab === 0;\n\n return (\n <NavigationButtons\n onPrevious={onPrevious}\n onNext={onNext}\n onSubmit={onSubmit}\n onSaveDraft={onSaveDraft}\n onReset={onReset}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n isFirstTab={isFirstTab}\n isLastTab={isLastTab}\n />\n );\n};\n\n// =============================================================================\n// MULTI TAB SMART FORM COMPONENT\n// =============================================================================\n\nexport const MultiTabSmartForm: React.FC<MultiTabSmartFormProps> = ({\n children,\n showProgressBar = true,\n showTabNumbers = true,\n ...baseProps\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [tabFields, setTabFields] = useState<string[][]>([]);\n const [completedTabs, setCompletedTabs] = useState<Set<number>>(new Set());\n const [validationErrorTabs, setValidationErrorTabs] = useState<Set<number>>(new Set());\n const [externalTabFields, setExternalTabFields] = useState<{ [tabIndex: number]: string[] }>({});\n\n // Separate Footer components from other children\n const { footerChildren, regularChildren } = useMemo(() => {\n const childArray = React.Children.toArray(children);\n const footerChildren: ReactElement[] = [];\n const regularChildren: ReactElement[] = [];\n \n childArray.forEach((child) => {\n if (isValidElement(child) && child.type === Footer) {\n footerChildren.push(child);\n } else {\n regularChildren.push(child as ReactElement);\n }\n });\n \n return { footerChildren, regularChildren };\n }, [children]);\n\n // Extract tab information from regular children and track fields\n const tabs: string[] = [];\n React.Children.forEach(regularChildren, (child) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const props = child.props as TabProps;\n if (props.title) {\n tabs.push(props.title);\n }\n }\n });\n\n // Helper function to recursively find smart form controls and collect their field names\n const findSmartInputs = useCallback((children: React.ReactNode): string[] => {\n const fields: string[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n // Check if it's any smart control with a `field` prop\n const fieldProps = child.props as Record<string, unknown>;\n if (fieldProps && typeof fieldProps === 'object' && 'field' in fieldProps && fieldProps.field) {\n fields.push(fieldProps.field as string);\n }\n // Recurse into children for nested components (e.g., groups)\n else if (child.props && typeof child.props === 'object' && 'children' in child.props) {\n const nestedFields = findSmartInputs((child.props as Record<string, unknown>).children as React.ReactNode);\n fields.push(...nestedFields);\n }\n }\n });\n\n return fields;\n }, []);\n\n // Function to register fields from external forms\n const registerTabFields = useCallback((tabIndex: number, fields: string[]) => {\n setExternalTabFields(prev => ({\n ...prev,\n [tabIndex]: fields\n }));\n }, []);\n\n // Initialize tab fields array\n React.useEffect(() => {\n const fields: string[][] = [];\n React.Children.forEach(regularChildren, (child) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabFieldsInTab = findSmartInputs((child.props as TabProps).children);\n fields.push(tabFieldsInTab);\n }\n });\n setTabFields(fields);\n }, [regularChildren, findSmartInputs]);\n\n // Combine internal and external fields for each tab\n const getCombinedTabFields = useCallback((tabIndex: number) => {\n const internalFields = tabFields[tabIndex] || [];\n const externalFields = externalTabFields[tabIndex] || [];\n return [...internalFields, ...externalFields];\n }, [tabFields, externalTabFields]);\n\n\n const config = {\n ...baseProps,\n showProgressBar,\n showTabNumbers\n };\n\n const handleTabChange = useCallback((index: number) => {\n setActiveTab(index);\n }, []);\n\n const handlePrevious = useCallback(() => {\n if (activeTab > 0) {\n setActiveTab(activeTab - 1);\n }\n }, [activeTab]);\n\n const handleNext = useCallback(() => {\n // This will be called from the NavigationButtons component with validation\n if (activeTab < tabs.length - 1) {\n setActiveTab(activeTab + 1);\n }\n }, [activeTab, tabs.length]);\n\n // Memoize the context value to prevent unnecessary re-renders\n const externalFormContextValue = useMemo(() => ({\n registerTabFields,\n currentTabIndex: activeTab\n }), [registerTabFields, activeTab]);\n\n return (\n <BaseSmartForm {...baseProps}>\n <ExternalFormContext.Provider value={externalFormContextValue}>\n <MultiTabFormContent\n activeTab={activeTab}\n tabs={tabs}\n getCombinedTabFields={getCombinedTabFields}\n config={config}\n onTabChange={handleTabChange}\n onPrevious={handlePrevious}\n onNext={handleNext}\n completedTabs={completedTabs}\n setCompletedTabs={setCompletedTabs}\n validationErrorTabs={validationErrorTabs}\n setValidationErrorTabs={setValidationErrorTabs}\n footerChildren={footerChildren}\n >\n {regularChildren}\n </MultiTabFormContent>\n </ExternalFormContext.Provider>\n </BaseSmartForm>\n );\n};\n\n// =============================================================================\n// MULTI TAB FORM CONTENT COMPONENT\n// =============================================================================\n\ninterface MultiTabFormContentProps {\n activeTab: number;\n tabs: string[];\n getCombinedTabFields: (tabIndex: number) => string[];\n config: Record<string, unknown>;\n onTabChange: (index: number) => void;\n onPrevious: () => void;\n onNext: () => void;\n completedTabs: Set<number>;\n setCompletedTabs: React.Dispatch<React.SetStateAction<Set<number>>>;\n validationErrorTabs: Set<number>;\n setValidationErrorTabs: React.Dispatch<React.SetStateAction<Set<number>>>;\n footerChildren: ReactElement[];\n children: ReactNode;\n}\n\nconst MultiTabFormContent: React.FC<MultiTabFormContentProps> = ({\n activeTab,\n tabs,\n getCombinedTabFields,\n config,\n onTabChange,\n onPrevious,\n onNext,\n completedTabs,\n setCompletedTabs,\n validationErrorTabs,\n setValidationErrorTabs,\n footerChildren,\n children\n}) => {\n const { isLoading, isDraftSaving, submitForm, saveDraft, resetForm, validateFields, formData, validationRegistry, setErrors } = useSmartForm();\n \n // Calculate maximum content height needed across all tabs\n const [maxContentHeight, setMaxContentHeight] = useState<number>(0);\n const contentRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Debounce function for validation\n const debounce = (func: (...args: unknown[]) => void, wait: number) => {\n let timeout: ReturnType<typeof setTimeout>;\n return function executedFunction(...args: unknown[]) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n };\n\n // Effect to calculate and update maximum content height\n React.useEffect(() => {\n const calculateMaxHeight = () => {\n let maxHeight = 0;\n contentRefs.current.forEach((ref: HTMLDivElement | null) => {\n if (ref) {\n const height = ref.scrollHeight;\n maxHeight = Math.max(maxHeight, height);\n }\n });\n if (maxHeight > 0) {\n setMaxContentHeight(maxHeight);\n }\n };\n\n // Calculate height after a short delay to ensure content is rendered\n const timeoutId = setTimeout(calculateMaxHeight, 100);\n \n // Also calculate on window resize\n window.addEventListener('resize', calculateMaxHeight);\n \n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', calculateMaxHeight);\n };\n }, [children, activeTab]);\n\n // Real-time tab completion detection (only for green checkmarks)\n React.useEffect(() => {\n const checkTabCompletion = debounce(() => {\n // Check all tabs for completion status (green checkmarks only)\n tabs.forEach((_, tabIndex) => {\n const tabFieldsInTab = getCombinedTabFields(tabIndex);\n \n if (tabFieldsInTab.length === 0) {\n // No fields in this tab, remove from completed set\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n return;\n }\n\n // Check if all fields in this tab are valid\n let allFieldsValid = true;\n let hasAnyValue = false;\n\n for (const field of tabFieldsInTab) {\n const validation = validationRegistry[field];\n const fieldValue = formData[field];\n \n // Check if field has any value\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n hasAnyValue = true;\n }\n\n if (validation) {\n try {\n (validation as z.ZodSchema).parse(fieldValue);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allFieldsValid = false;\n break;\n }\n }\n }\n }\n\n // Update completion status (only green checkmarks)\n if (hasAnyValue && allFieldsValid) {\n // All fields valid - mark as completed and clear any validation errors\n setCompletedTabs(prev => new Set([...prev, tabIndex]));\n setValidationErrorTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n } else {\n // Not complete - remove from completed set\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(tabIndex);\n return newSet;\n });\n }\n });\n }, 300);\n\n checkTabCompletion();\n }, [formData, validationRegistry, getCombinedTabFields, tabs, setCompletedTabs, setValidationErrorTabs]);\n\n // Handle tab change with error checking\n const handleTabChangeWithErrorCheck = useCallback((index: number) => {\n onTabChange(index);\n\n // The real-time validation effect will handle tab status updates\n }, [onTabChange]);\n\n // Handle Next with validation\n const handleNextWithValidation = useCallback(() => {\n const currentTabFields = getCombinedTabFields(activeTab);\n if (currentTabFields.length > 0) {\n // Use form data and validation registry from context to validate synchronously\n\n const allErrors: Record<string, string> = {};\n let isValid = true;\n\n // Validate fields synchronously to get immediate error information\n for (const field of currentTabFields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n (validation as z.ZodSchema).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n if (isValid) {\n // Mark current tab as completed\n setCompletedTabs(prev => new Set([...prev, activeTab]));\n // Clear validation errors for this tab\n setValidationErrorTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(activeTab);\n return newSet;\n });\n onNext();\n } else {\n // Remove completed status if validation fails\n setCompletedTabs(prev => {\n const newSet = new Set(prev);\n newSet.delete(activeTab);\n return newSet;\n });\n\n // Mark this tab as having validation errors\n setValidationErrorTabs(prev => new Set([...prev, activeTab]));\n\n // Update errors state\n validateFields(currentTabFields);\n\n // Find the first field with error from our synchronous validation\n const firstErrorField = currentTabFields.find(field => allErrors[field]);\n if (firstErrorField) {\n // Small delay to ensure DOM is updated with error states\n setTimeout(() => {\n const element = document.querySelector(`[data-field=\"${firstErrorField}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n (element as HTMLElement).focus();\n }\n }, 50);\n }\n }\n } else {\n // No fields to validate, proceed\n onNext();\n }\n }, [activeTab, getCombinedTabFields, validateFields, onNext, setCompletedTabs, setValidationErrorTabs, validationRegistry, formData]);\n\n // Handle form submission with validation and tab navigation\n const handleSubmitWithValidation = useCallback(async () => {\n // Perform validation synchronously to get immediate results\n const allErrors: Record<string, string> = {};\n let isValid = true;\n let firstErrorTabIndex = -1;\n\n // Validate all fields and collect errors\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as z.ZodSchema).parse === 'function') {\n try {\n (validation as z.ZodSchema).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Update errors state\n setErrors(allErrors);\n\n if (isValid) {\n // Form is valid, proceed with submission\n await submitForm();\n } else {\n // Clear all validation error tabs first\n setValidationErrorTabs(new Set());\n\n // Find the first tab with errors and mark tabs with errors\n for (let tabIndex = 0; tabIndex < tabs.length; tabIndex++) {\n const tabFieldsInTab = getCombinedTabFields(tabIndex);\n const hasErrorsInTab = tabFieldsInTab.some(field => allErrors[field]);\n\n if (hasErrorsInTab) {\n // Mark this tab as having validation errors\n setValidationErrorTabs(prev => new Set([...prev, tabIndex]));\n \n if (firstErrorTabIndex === -1) {\n firstErrorTabIndex = tabIndex;\n }\n }\n }\n\n if (firstErrorTabIndex !== -1) {\n // Navigate to the first tab with errors\n onTabChange(firstErrorTabIndex);\n\n // Scroll to first error field in that tab\n setTimeout(() => {\n const tabFieldsInTab = getCombinedTabFields(firstErrorTabIndex);\n const firstErrorField = tabFieldsInTab.find(field => allErrors[field]);\n\n if (firstErrorField) {\n const element = document.querySelector(`[data-field=\"${firstErrorField}\"]`);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n (element as HTMLElement).focus();\n }\n }\n }, 100);\n }\n }\n }, [submitForm, getCombinedTabFields, onTabChange, tabs.length, validationRegistry, formData, setErrors, setValidationErrorTabs]);\n\n // Convert activeTab index to tab value for shadcn Tabs\n const activeTabValue = tabs[activeTab] || tabs[0] || '';\n\n return (\n <>\n\n <Tabs value={activeTabValue} onValueChange={(value) => {\n const newIndex = tabs.indexOf(value);\n if (newIndex !== -1) {\n handleTabChangeWithErrorCheck(newIndex);\n }\n }} className=\"w-full\">\n <TabsList className={`grid w-full mb-8`} style={{ gridTemplateColumns: `repeat(${tabs.length}, 1fr)` }}>\n {tabs.map((tab, index) => (\n <TabsTrigger key={tab} value={tab} className=\"flex items-center gap-2\">\n {(config.showTabNumbers as boolean) && <span>{index + 1}.</span>}\n {tab}\n {completedTabs.has(index) && (\n <Check className=\"h-4 w-4 text-green-600\" />\n )}\n {validationErrorTabs.has(index) && (\n <X className=\"h-4 w-4 text-red-600\" />\n )}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabProps = child.props as TabProps;\n return (\n <TabsContent key={index} value={tabProps.title}>\n <TabIndexProvider tabIndex={index}>\n <div \n ref={(el) => { contentRefs.current[index] = el; }}\n className=\"space-y-6\"\n style={{ minHeight: maxContentHeight > 0 ? `${maxContentHeight}px` : undefined }}\n >\n {tabProps.children}\n </div>\n </TabIndexProvider>\n </TabsContent>\n );\n }\n return null;\n })}\n\n {/* Hidden render of all tab content for immediate field registration and height calculation */}\n <div style={{ position: 'absolute', left: '-9999px', top: '-9999px', visibility: 'hidden' }}>\n {React.Children.map(children, (child, index) => {\n if (React.isValidElement(child) && child.type === Tab) {\n const tabProps = child.props as TabProps;\n return (\n <TabIndexProvider key={`hidden-${index}`} tabIndex={index}>\n <div \n ref={(el) => { contentRefs.current[index] = el; }}\n className=\"space-y-6\"\n >\n {tabProps.children}\n </div>\n </TabIndexProvider>\n );\n }\n return null;\n })}\n </div>\n </Tabs>\n\n <NavigationButtonsWrapper\n activeTab={activeTab}\n totalTabs={tabs.length}\n onPrevious={onPrevious}\n onNext={handleNextWithValidation}\n onSubmit={handleSubmitWithValidation}\n onSaveDraft={config.allowSaveDraft ? saveDraft : undefined}\n onReset={(config.showReset || config.enableLocalStorage) ? resetForm : undefined}\n isLoading={isLoading}\n isDraftSaving={isDraftSaving}\n config={config}\n />\n\n {/* Footer components */}\n {footerChildren.length > 0 && (\n <div className=\"space-y-4\">\n {footerChildren}\n </div>\n )}\n\n {/* Progress Indicator */}\n {(config.showProgressBar as boolean) && (\n <div className=\"mt-6\">\n <div className=\"flex justify-between text-sm text-muted-foreground mb-2\">\n <span>Progress</span>\n <span>{Math.round(((activeTab + 1) / tabs.length) * 100)}%</span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{ width: `${((activeTab + 1) / tabs.length) * 100}%` }}\n ></div>\n </div>\n </div>\n )}\n </>\n );\n};\n","import { useSmartForm } from '../SmartFormProvider';\n\n// =============================================================================\n// FORM WRAPPER HOOK\n// =============================================================================\n\nexport const useFormWrapper = () => {\n return useSmartForm();\n};\n","import { useContext } from 'react';\nimport { ExternalFormContext, type ExternalFormContextType } from '../constants/externalFormContext';\n\n// =============================================================================\n// EXTERNAL FORM REGISTRATION HOOK\n// =============================================================================\n\nexport const useExternalFormRegistration = (): ExternalFormContextType => {\n const context = useContext(ExternalFormContext);\n if (!context) {\n throw new Error('useExternalFormRegistration must be used within a MultiTabSmartForm');\n }\n return context;\n};\n","import { useEffect, useMemo } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\n\n/**\n * Hook for external forms to register their fields with MultiTabSmartForm\n * This allows external forms to participate in validation and tab switching\n */\nexport const useExternalFormFields = (fields: string[], tabIndex: number) => {\n const { registerTabFields } = useExternalFormRegistration();\n\n // Create a stable reference to the fields array\n const stableFields = useMemo(() => fields, [fields.join(',')]);\n\n useEffect(() => {\n if (stableFields.length > 0) {\n registerTabFields(tabIndex, stableFields);\n }\n }, [stableFields, tabIndex, registerTabFields]);\n};\n","import React from 'react';\nimport { FieldDetectionContext } from './FieldDetectionHook';\n\nexport const ExternalFieldProvider: React.FC<{ \n children: React.ReactNode; \n registerField: (fieldName: string) => void \n}> = ({ \n children, \n registerField \n}) => {\n return (\n <FieldDetectionContext.Provider value={{ registerField }}>\n {children}\n </FieldDetectionContext.Provider>\n );\n};\n","import { useCallback, useRef } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\nimport { ExternalFieldProvider } from './ExternalFieldProvider';\n\n/**\n * Hook that automatically detects SmartInput fields in external forms\n * This eliminates the need to manually specify field names\n */\nexport const useAutoDetectFields = (tabIndex: number) => {\n const { registerTabFields } = useExternalFormRegistration();\n const hasRegistered = useRef(false);\n const detectedFields = useRef<Set<string>>(new Set());\n\n // Function to register a field when it's detected\n const registerField = useCallback((fieldName: string) => {\n detectedFields.current.add(fieldName);\n \n // Register all detected fields with the MultiTabSmartForm\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }, [tabIndex, registerTabFields]);\n\n return { registerField, ExternalFieldProvider };\n};\n","import { useCallback, useRef, useEffect } from 'react';\nimport { useExternalFormRegistration } from './hooks/useExternalFormRegistration';\nimport { ExternalFieldProvider } from './ExternalFieldProvider';\nimport { useTabIndex } from './TabIndexContext';\n\n/**\n * Hook that automatically detects both tab index and fields in external forms\n * This eliminates the need to manually specify both tab index and field names\n */\nexport const useExternalTab = () => {\n const { registerTabFields } = useExternalFormRegistration();\n const tabIndexContext = useTabIndex();\n const detectedFields = useRef<Set<string>>(new Set());\n const registrationTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasRegistered = useRef(false);\n\n // Use the tab index from context, or fallback to 0 if not available\n const tabIndex = tabIndexContext?.tabIndex ?? 0;\n\n // Function to register a field when it's detected\n const registerField = useCallback((fieldName: string) => {\n detectedFields.current.add(fieldName);\n \n // Clear any existing timeout\n if (registrationTimeout.current) {\n clearTimeout(registrationTimeout.current);\n }\n \n // Debounce the registration to allow all fields to be detected\n registrationTimeout.current = setTimeout(() => {\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n if (fieldsArray.length > 0) {\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }\n }, 200); // Longer delay to ensure all fields are detected\n }, [tabIndex, registerTabFields]);\n\n // Force registration after component mount to catch all fields\n useEffect(() => {\n const forceRegistrationTimeout = setTimeout(() => {\n if (!hasRegistered.current) {\n const fieldsArray = Array.from(detectedFields.current);\n if (fieldsArray.length > 0) {\n registerTabFields(tabIndex, fieldsArray);\n hasRegistered.current = true;\n }\n }\n }, 1000); // Force registration after 1 second\n\n return () => {\n clearTimeout(forceRegistrationTimeout);\n if (registrationTimeout.current) {\n clearTimeout(registrationTimeout.current);\n }\n };\n }, [tabIndex, registerTabFields]);\n\n return { registerField, ExternalFieldProvider };\n};\n","import React, { type ReactNode } from 'react';\n\n// =============================================================================\n// FORM FIELD GROUP TYPES\n// =============================================================================\n\nexport interface FormFieldGroupProps {\n children: ReactNode;\n className?: string;\n}\n\n// =============================================================================\n// FORM FIELD GROUP COMPONENT\n// =============================================================================\n\nexport const FormFieldGroup: React.FC<FormFieldGroupProps> = ({\n children,\n className = ''\n}) => {\n return (\n <div className={`flex flex-wrap gap-2 md:gap-4 mb-4 ${className}`}>\n {children}\n </div>\n );\n};\n"]}