@algodomain/smart-forms 0.1.0 → 0.1.2

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.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { Button } from './chunk-6WAEAWTD.js';
2
- export { SmartCheckbox, SmartDatePicker, SmartRadioGroup, SmartSelect, SmartTags } from './chunk-6WAEAWTD.js';
3
- import { SmartFormProvider, useSmartForm, FieldDetectionContext, cn } from './chunk-IG4XDQMV.js';
4
- export { SmartFormProvider, SmartInput, useFieldDetection, useFormField, useSmartForm } from './chunk-IG4XDQMV.js';
1
+ import { Button } from './chunk-KDPN4CHW.js';
2
+ export { SmartCheckbox, SmartDatePicker, SmartRadioGroup, SmartSelect, SmartTags } from './chunk-KDPN4CHW.js';
3
+ import { SmartFormProvider, useSmartForm, FieldDetectionContext, cn } from './chunk-5LRBJEZW.js';
4
+ export { SmartFormProvider, SmartInput, useFieldDetection, useFormField, useSmartForm } from './chunk-5LRBJEZW.js';
5
5
  import React3, { createContext, isValidElement, useContext, useState, useMemo, useCallback, useRef, useEffect } from 'react';
6
6
  import { ToastContainer, Bounce } from 'react-toastify';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -66,7 +66,9 @@ var BaseSmartForm = ({
66
66
  showReset = false,
67
67
  showProgressBar = true,
68
68
  showTabNumbers = true,
69
- authentication
69
+ authentication,
70
+ includeQueryParams = false,
71
+ queryParamsToInclude
70
72
  }) => {
71
73
  const config = {
72
74
  api,
@@ -89,7 +91,9 @@ var BaseSmartForm = ({
89
91
  showReset,
90
92
  showProgressBar,
91
93
  showTabNumbers,
92
- authentication
94
+ authentication,
95
+ includeQueryParams,
96
+ queryParamsToInclude
93
97
  };
94
98
  return /* @__PURE__ */ jsx(SmartFormProvider, { config, initialData, children: /* @__PURE__ */ jsxs("div", { className, children: [
95
99
  /* @__PURE__ */ jsx(ToastContainerWrapper, {}),
package/dist/index.js.map CHANGED
@@ -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","jsxs","SubmitButton","React","Fragment","footerChildren","regularChildren","isValidElement","children","useContext","useMemo","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","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}\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}) => {\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 };\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","jsxs","SubmitButton","React","Fragment","footerChildren","regularChildren","isValidElement","children","useContext","useMemo","useRef","useCallback","useEffect"],"mappings":"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","file":"index.js","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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkYV7RVYMD_cjs = require('./chunk-YV7RVYMD.cjs');
3
+ var chunk4H5U5IHH_cjs = require('./chunk-4H5U5IHH.cjs');
4
4
  var zod = require('zod');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactRouterDom = require('react-router-dom');
@@ -14,7 +14,7 @@ var FieldEmail = ({
14
14
  ...props
15
15
  }) => {
16
16
  return /* @__PURE__ */ jsxRuntime.jsx(
17
- chunkYV7RVYMD_cjs.SmartInput,
17
+ chunk4H5U5IHH_cjs.SmartInput,
18
18
  {
19
19
  field,
20
20
  label,
@@ -36,7 +36,7 @@ var FieldPhone = ({
36
36
  ...props
37
37
  }) => {
38
38
  return /* @__PURE__ */ jsxRuntime.jsx(
39
- chunkYV7RVYMD_cjs.SmartInput,
39
+ chunk4H5U5IHH_cjs.SmartInput,
40
40
  {
41
41
  field,
42
42
  label,
@@ -58,7 +58,7 @@ var FieldFirstName = ({
58
58
  ...props
59
59
  }) => {
60
60
  return /* @__PURE__ */ jsxRuntime.jsx(
61
- chunkYV7RVYMD_cjs.SmartInput,
61
+ chunk4H5U5IHH_cjs.SmartInput,
62
62
  {
63
63
  field,
64
64
  label,
@@ -80,7 +80,7 @@ var FieldLastName = ({
80
80
  ...props
81
81
  }) => {
82
82
  return /* @__PURE__ */ jsxRuntime.jsx(
83
- chunkYV7RVYMD_cjs.SmartInput,
83
+ chunk4H5U5IHH_cjs.SmartInput,
84
84
  {
85
85
  field,
86
86
  label,
@@ -102,7 +102,7 @@ var FieldFullName = ({
102
102
  ...props
103
103
  }) => {
104
104
  return /* @__PURE__ */ jsxRuntime.jsx(
105
- chunkYV7RVYMD_cjs.SmartInput,
105
+ chunk4H5U5IHH_cjs.SmartInput,
106
106
  {
107
107
  field,
108
108
  label,
@@ -176,7 +176,7 @@ var FieldPassword = ({
176
176
  ))
177
177
  ] }),
178
178
  /* @__PURE__ */ jsxRuntime.jsx(
179
- chunkYV7RVYMD_cjs.SmartInput,
179
+ chunk4H5U5IHH_cjs.SmartInput,
180
180
  {
181
181
  field,
182
182
  type: "password",
@@ -198,7 +198,7 @@ var FieldConfirmPassword = ({
198
198
  ...props
199
199
  }) => {
200
200
  return /* @__PURE__ */ jsxRuntime.jsx(
201
- chunkYV7RVYMD_cjs.SmartInput,
201
+ chunk4H5U5IHH_cjs.SmartInput,
202
202
  {
203
203
  field,
204
204
  label,
@@ -222,7 +222,7 @@ var FieldAge = ({
222
222
  ...props
223
223
  }) => {
224
224
  return /* @__PURE__ */ jsxRuntime.jsx(
225
- chunkYV7RVYMD_cjs.SmartInput,
225
+ chunk4H5U5IHH_cjs.SmartInput,
226
226
  {
227
227
  field,
228
228
  label,
@@ -248,7 +248,7 @@ var FieldStreetAddress = ({
248
248
  ...props
249
249
  }) => {
250
250
  return /* @__PURE__ */ jsxRuntime.jsx(
251
- chunkYV7RVYMD_cjs.SmartInput,
251
+ chunk4H5U5IHH_cjs.SmartInput,
252
252
  {
253
253
  field,
254
254
  label,
@@ -270,7 +270,7 @@ var FieldCity = ({
270
270
  ...props
271
271
  }) => {
272
272
  return /* @__PURE__ */ jsxRuntime.jsx(
273
- chunkYV7RVYMD_cjs.SmartInput,
273
+ chunk4H5U5IHH_cjs.SmartInput,
274
274
  {
275
275
  field,
276
276
  label,
@@ -292,7 +292,7 @@ var FieldZipCode = ({
292
292
  ...props
293
293
  }) => {
294
294
  return /* @__PURE__ */ jsxRuntime.jsx(
295
- chunkYV7RVYMD_cjs.SmartInput,
295
+ chunk4H5U5IHH_cjs.SmartInput,
296
296
  {
297
297
  field,
298
298
  label,
@@ -314,7 +314,7 @@ var FieldState = ({
314
314
  ...props
315
315
  }) => {
316
316
  return /* @__PURE__ */ jsxRuntime.jsx(
317
- chunkYV7RVYMD_cjs.SmartInput,
317
+ chunk4H5U5IHH_cjs.SmartInput,
318
318
  {
319
319
  field,
320
320
  label,
@@ -339,7 +339,7 @@ var FieldMessage = ({
339
339
  ...props
340
340
  }) => {
341
341
  return /* @__PURE__ */ jsxRuntime.jsx(
342
- chunkYV7RVYMD_cjs.SmartInput,
342
+ chunk4H5U5IHH_cjs.SmartInput,
343
343
  {
344
344
  field,
345
345
  label,
@@ -364,7 +364,7 @@ var FieldComments = ({
364
364
  ...props
365
365
  }) => {
366
366
  return /* @__PURE__ */ jsxRuntime.jsx(
367
- chunkYV7RVYMD_cjs.SmartInput,
367
+ chunk4H5U5IHH_cjs.SmartInput,
368
368
  {
369
369
  field,
370
370
  label,
@@ -380,15 +380,15 @@ var FieldComments = ({
380
380
 
381
381
  Object.defineProperty(exports, "SmartFormProvider", {
382
382
  enumerable: true,
383
- get: function () { return chunkYV7RVYMD_cjs.SmartFormProvider; }
383
+ get: function () { return chunk4H5U5IHH_cjs.SmartFormProvider; }
384
384
  });
385
385
  Object.defineProperty(exports, "useFormField", {
386
386
  enumerable: true,
387
- get: function () { return chunkYV7RVYMD_cjs.useFormField; }
387
+ get: function () { return chunk4H5U5IHH_cjs.useFormField; }
388
388
  });
389
389
  Object.defineProperty(exports, "useSmartForm", {
390
390
  enumerable: true,
391
- get: function () { return chunkYV7RVYMD_cjs.useSmartForm; }
391
+ get: function () { return chunk4H5U5IHH_cjs.useSmartForm; }
392
392
  });
393
393
  exports.FieldAge = FieldAge;
394
394
  exports.FieldCity = FieldCity;
@@ -1,4 +1,4 @@
1
- export { S as SmartFormProvider, a as useFormField, u as useSmartForm } from './SmartFormProvider-B-BTl4wO.cjs';
1
+ export { S as SmartFormProvider, a as useFormField, u as useSmartForm } from './SmartFormProvider-DyJoDBjQ.cjs';
2
2
  import React__default from 'react';
3
3
 
4
4
  interface FieldEmailProps {
@@ -1,4 +1,4 @@
1
- export { S as SmartFormProvider, a as useFormField, u as useSmartForm } from './SmartFormProvider-B-BTl4wO.js';
1
+ export { S as SmartFormProvider, a as useFormField, u as useSmartForm } from './SmartFormProvider-DyJoDBjQ.js';
2
2
  import React__default from 'react';
3
3
 
4
4
  interface FieldEmailProps {
@@ -1,5 +1,5 @@
1
- import { SmartInput } from './chunk-IG4XDQMV.js';
2
- export { SmartFormProvider, useFormField, useSmartForm } from './chunk-IG4XDQMV.js';
1
+ import { SmartInput } from './chunk-5LRBJEZW.js';
2
+ export { SmartFormProvider, useFormField, useSmartForm } from './chunk-5LRBJEZW.js';
3
3
  import { z } from 'zod';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
  import { Link } from 'react-router-dom';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@algodomain/smart-forms",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A powerful React form framework with smart fields, multi-tab support, and seamless API integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -25,7 +25,9 @@
25
25
  "./style.css": "./dist/style.css"
26
26
  },
27
27
  "files": [
28
- "dist"
28
+ "dist",
29
+ "README.md",
30
+ "LICENSE"
29
31
  ],
30
32
  "sideEffects": [
31
33
  "dist/style.css"