UNPKG

@akson/cortex-landing-forms

Version:
1 lines 46.9 kB
{"version":3,"sources":["../src/context/FormProvider.tsx","../src/multi-step/MultiStepForm.tsx","../src/multi-step/FormNavigation.tsx","../src/hooks/useFormValidation.ts","../src/hooks/useFormPersistence.ts","../src/modals/LeadCaptureModal.tsx","../src/index.ts"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useCallback, ReactNode } from 'react';\nimport { produce } from 'immer';\n\nexport interface FormData {\n [key: string]: any;\n}\n\nexport interface FormStep {\n id: string;\n name: string;\n fields: string[];\n isValid?: boolean;\n isCompleted?: boolean;\n}\n\nexport interface FormConfig {\n id: string;\n steps: FormStep[];\n initialData?: FormData;\n persistKey?: string;\n onStepChange?: (step: number, data: FormData) => void;\n onComplete?: (data: FormData) => void;\n}\n\ninterface FormContextValue {\n // Data management\n data: FormData;\n updateData: (updates: Partial<FormData>) => void;\n setData: (data: FormData) => void;\n clearData: () => void;\n \n // Step management\n currentStep: number;\n steps: FormStep[];\n goToStep: (step: number) => void;\n nextStep: () => void;\n previousStep: () => void;\n canGoNext: boolean;\n canGoPrevious: boolean;\n \n // Form state\n isDirty: boolean;\n isComplete: boolean;\n completedSteps: Set<number>;\n \n // Validation\n errors: Record<string, string>;\n setError: (field: string, error: string) => void;\n clearError: (field: string) => void;\n clearErrors: () => void;\n validateStep: (step?: number) => boolean;\n \n // Persistence\n save: () => void;\n restore: () => void;\n \n // Config\n config: FormConfig;\n}\n\nconst FormContext = createContext<FormContextValue | null>(null);\n\nexport function useFormContext() {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useFormContext must be used within a FormProvider');\n }\n return context;\n}\n\ninterface FormProviderProps {\n children: ReactNode;\n config: FormConfig;\n}\n\nexport function FormProvider({ children, config }: FormProviderProps) {\n const [data, setDataState] = useState<FormData>(config.initialData || {});\n const [currentStep, setCurrentStep] = useState(0);\n const [completedSteps, setCompletedSteps] = useState<Set<number>>(new Set());\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isDirty, setIsDirty] = useState(false);\n \n // Update data using immer for immutability\n const updateData = useCallback((updates: Partial<FormData>) => {\n setDataState(produce((draft: FormData) => {\n Object.assign(draft, updates);\n }));\n setIsDirty(true);\n }, []);\n \n const setData = useCallback((newData: FormData) => {\n setDataState(newData);\n setIsDirty(true);\n }, []);\n \n const clearData = useCallback(() => {\n setDataState(config.initialData || {});\n setCompletedSteps(new Set());\n setErrors({});\n setIsDirty(false);\n setCurrentStep(0);\n }, [config.initialData]);\n \n // Step navigation\n const goToStep = useCallback((step: number) => {\n if (step >= 0 && step < config.steps.length) {\n setCurrentStep(step);\n config.onStepChange?.(step, data);\n }\n }, [config, data]);\n \n const nextStep = useCallback(() => {\n if (currentStep < config.steps.length - 1) {\n // Mark current step as completed\n setCompletedSteps(prev => new Set([...prev, currentStep]));\n \n const nextStepIndex = currentStep + 1;\n setCurrentStep(nextStepIndex);\n config.onStepChange?.(nextStepIndex, data);\n \n // Check if form is complete\n if (nextStepIndex === config.steps.length - 1) {\n config.onComplete?.(data);\n }\n }\n }, [currentStep, config, data]);\n \n const previousStep = useCallback(() => {\n if (currentStep > 0) {\n const prevStepIndex = currentStep - 1;\n setCurrentStep(prevStepIndex);\n config.onStepChange?.(prevStepIndex, data);\n }\n }, [currentStep, config, data]);\n \n // Validation\n const setError = useCallback((field: string, error: string) => {\n setErrors(prev => ({ ...prev, [field]: error }));\n }, []);\n \n const clearError = useCallback((field: string) => {\n setErrors(prev => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n \n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n \n const validateStep = useCallback((step?: number) => {\n const stepIndex = step ?? currentStep;\n const currentStepConfig = config.steps[stepIndex];\n \n if (!currentStepConfig) return false;\n \n // Check if all required fields in the step have values\n const hasAllFields = currentStepConfig.fields.every(field => {\n const value = data[field];\n return value !== undefined && value !== null && value !== '';\n });\n \n // Check if there are no errors for fields in this step\n const hasNoErrors = currentStepConfig.fields.every(field => !errors[field]);\n \n return hasAllFields && hasNoErrors;\n }, [currentStep, config.steps, data, errors]);\n \n // Persistence\n const save = useCallback(() => {\n if (config.persistKey && typeof window !== 'undefined') {\n const saveData = {\n data,\n currentStep,\n completedSteps: Array.from(completedSteps),\n timestamp: Date.now(),\n };\n localStorage.setItem(config.persistKey, JSON.stringify(saveData));\n }\n }, [config.persistKey, data, currentStep, completedSteps]);\n \n const restore = useCallback(() => {\n if (config.persistKey && typeof window !== 'undefined') {\n const saved = localStorage.getItem(config.persistKey);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n \n // Check if saved data is not too old (24 hours)\n if (Date.now() - parsed.timestamp < 24 * 60 * 60 * 1000) {\n setDataState(parsed.data || {});\n setCurrentStep(parsed.currentStep || 0);\n setCompletedSteps(new Set(parsed.completedSteps || []));\n setIsDirty(false);\n }\n } catch (e) {\n console.error('Failed to restore form data:', e);\n }\n }\n }\n }, [config.persistKey]);\n \n // Computed values\n const canGoNext = currentStep < config.steps.length - 1 && validateStep();\n const canGoPrevious = currentStep > 0;\n const isComplete = completedSteps.size === config.steps.length;\n \n const contextValue: FormContextValue = {\n // Data\n data,\n updateData,\n setData,\n clearData,\n \n // Steps\n currentStep,\n steps: config.steps,\n goToStep,\n nextStep,\n previousStep,\n canGoNext,\n canGoPrevious,\n \n // State\n isDirty,\n isComplete,\n completedSteps,\n \n // Validation\n errors,\n setError,\n clearError,\n clearErrors,\n validateStep,\n \n // Persistence\n save,\n restore,\n \n // Config\n config,\n };\n \n return (\n <FormContext.Provider value={contextValue}>\n {children}\n </FormContext.Provider>\n );\n}","'use client';\n\nimport React, { ReactNode } from 'react';\nimport { Check } from 'lucide-react';\nimport { cn } from '@akson/cortex-landing-core';\n\nexport interface FormStep {\n id: string | number;\n name: string;\n description?: string;\n component?: ReactNode;\n isValid?: () => boolean;\n}\n\ninterface MultiStepFormProps {\n steps: FormStep[];\n currentStep: number;\n onStepChange?: (step: number) => void;\n children?: ReactNode;\n showProgress?: boolean;\n showStepDescription?: boolean;\n className?: string;\n stepperClassName?: string;\n contentClassName?: string;\n mobileCompact?: boolean;\n}\n\nexport function MultiStepForm({\n steps,\n currentStep,\n onStepChange,\n children,\n showProgress = true,\n showStepDescription = true,\n className,\n stepperClassName,\n contentClassName,\n mobileCompact = true,\n}: MultiStepFormProps) {\n const handleStepClick = (stepIndex: number) => {\n // Only allow clicking on completed or current steps\n if (onStepChange && stepIndex <= currentStep) {\n onStepChange(stepIndex);\n }\n };\n\n return (\n <div className={cn('w-full', className)}>\n {showProgress && (\n <>\n {/* Mobile View */}\n {mobileCompact ? (\n <div className=\"md:hidden mb-6\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm text-gray-600\">\n Step {currentStep + 1} of {steps.length}\n </span>\n <span className=\"text-sm font-medium\">\n {steps[currentStep]?.name}\n </span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full transition-all duration-300\"\n style={{\n width: `${((currentStep + 1) / steps.length) * 100}%`,\n }}\n />\n </div>\n </div>\n ) : (\n <div className=\"md:hidden mb-6\">\n <MobileStepIndicator\n steps={steps}\n currentStep={currentStep}\n onStepClick={handleStepClick}\n />\n </div>\n )}\n\n {/* Desktop View */}\n <div className={cn('hidden md:block mb-8', stepperClassName)}>\n <ol className=\"flex items-center w-full\">\n {steps.map((step, index) => (\n <li\n key={step.id}\n className={cn(\n 'flex items-center',\n index !== steps.length - 1 && 'flex-1'\n )}\n >\n <div \n className={cn(\n 'flex flex-col items-center',\n onStepChange && index <= currentStep && 'cursor-pointer'\n )}\n onClick={() => handleStepClick(index)}\n >\n <div\n className={cn(\n 'w-10 h-10 rounded-full flex items-center justify-center font-medium transition-all',\n index < currentStep\n ? 'bg-primary text-white'\n : index === currentStep\n ? 'bg-primary text-white ring-4 ring-primary/20'\n : 'bg-gray-100 text-gray-400'\n )}\n >\n {index < currentStep ? (\n <Check className=\"w-5 h-5\" />\n ) : (\n index + 1\n )}\n </div>\n <div className=\"mt-2 text-center\">\n <p\n className={cn(\n 'text-sm font-medium',\n index <= currentStep\n ? 'text-gray-900'\n : 'text-gray-400'\n )}\n >\n {step.name}\n </p>\n {showStepDescription && step.description && (\n <p className=\"text-xs text-gray-500 mt-1 hidden lg:block max-w-[120px]\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {index !== steps.length - 1 && (\n <div className=\"flex-1 h-0.5 mx-4 mt-5\">\n <div\n className={cn(\n 'h-full transition-all duration-300',\n index < currentStep\n ? 'bg-primary'\n : 'bg-gray-200'\n )}\n />\n </div>\n )}\n </li>\n ))}\n </ol>\n </div>\n </>\n )}\n\n {/* Step Content */}\n <div className={cn('w-full', contentClassName)}>\n {children || steps[currentStep]?.component}\n </div>\n </div>\n );\n}\n\n// Mobile step indicator component\nfunction MobileStepIndicator({\n steps,\n currentStep,\n onStepClick,\n}: {\n steps: FormStep[];\n currentStep: number;\n onStepClick: (step: number) => void;\n}) {\n return (\n <div className=\"flex items-center justify-center space-x-2\">\n {steps.map((step, index) => (\n <button\n key={step.id}\n onClick={() => onStepClick(index)}\n disabled={index > currentStep}\n className={cn(\n 'w-8 h-8 rounded-full flex items-center justify-center text-xs font-medium transition-all',\n index < currentStep\n ? 'bg-primary text-white'\n : index === currentStep\n ? 'bg-primary text-white ring-2 ring-primary/20'\n : 'bg-gray-100 text-gray-400',\n index <= currentStep && 'cursor-pointer'\n )}\n >\n {index < currentStep ? (\n <Check className=\"w-4 h-4\" />\n ) : (\n index + 1\n )}\n </button>\n ))}\n </div>\n );\n}","'use client';\n\nimport React from 'react';\nimport { ArrowLeft, ArrowRight } from 'lucide-react';\nimport { Button } from '@akson/cortex-landing-core';\nimport { cn } from '@akson/cortex-landing-core';\n\ninterface FormNavigationProps {\n onNext?: () => void;\n onPrevious?: () => void;\n onSubmit?: () => void;\n canGoNext?: boolean;\n canGoPrevious?: boolean;\n isLastStep?: boolean;\n isFirstStep?: boolean;\n nextLabel?: string;\n previousLabel?: string;\n submitLabel?: string;\n loading?: boolean;\n className?: string;\n nextButtonProps?: React.ComponentProps<typeof Button>;\n previousButtonProps?: React.ComponentProps<typeof Button>;\n alignment?: 'left' | 'center' | 'right' | 'between';\n}\n\nexport function FormNavigation({\n onNext,\n onPrevious,\n onSubmit,\n canGoNext = true,\n canGoPrevious = true,\n isLastStep = false,\n isFirstStep = false,\n nextLabel = 'Next',\n previousLabel = 'Previous',\n submitLabel = 'Submit',\n loading = false,\n className,\n nextButtonProps,\n previousButtonProps,\n alignment = 'between',\n}: FormNavigationProps) {\n const alignmentClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n between: 'justify-between',\n };\n\n const handleNext = () => {\n if (isLastStep && onSubmit) {\n onSubmit();\n } else if (onNext) {\n onNext();\n }\n };\n\n return (\n <div\n className={cn(\n 'flex items-center gap-4 mt-6',\n alignmentClasses[alignment],\n className\n )}\n >\n {!isFirstStep && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onPrevious}\n disabled={!canGoPrevious || loading}\n leftIcon={<ArrowLeft className=\"w-4 h-4\" />}\n {...previousButtonProps}\n >\n {previousLabel}\n </Button>\n )}\n\n {alignment === 'between' && isFirstStep && <div />}\n\n <Button\n type={isLastStep ? 'submit' : 'button'}\n onClick={handleNext}\n disabled={!canGoNext || loading}\n loading={loading}\n rightIcon={!isLastStep && <ArrowRight className=\"w-4 h-4\" />}\n {...nextButtonProps}\n >\n {isLastStep ? submitLabel : nextLabel}\n </Button>\n </div>\n );\n}","'use client';\nimport { useState, useCallback } from 'react';\nimport { z } from 'zod';\n\nexport interface ValidationRule {\n field: string;\n schema: z.ZodSchema;\n message?: string;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: Record<string, string>;\n}\n\nexport function useFormValidation(rules: ValidationRule[]) {\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n const validateField = useCallback((field: string, value: any): boolean => {\n const rule = rules.find(r => r.field === field);\n if (!rule) return true;\n\n try {\n rule.schema.parse(value);\n setErrors(prev => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n return true;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const message = rule.message || error.errors[0]?.message || 'Invalid value';\n setErrors(prev => ({ ...prev, [field]: message }));\n }\n return false;\n }\n }, [rules]);\n\n const validateAll = useCallback((data: Record<string, any>): ValidationResult => {\n const newErrors: Record<string, string> = {};\n let isValid = true;\n\n rules.forEach(rule => {\n try {\n rule.schema.parse(data[rule.field]);\n } catch (error) {\n isValid = false;\n if (error instanceof z.ZodError) {\n newErrors[rule.field] = rule.message || error.errors[0]?.message || 'Invalid value';\n }\n }\n });\n\n setErrors(newErrors);\n return { isValid, errors: newErrors };\n }, [rules]);\n\n const touchField = useCallback((field: string) => {\n setTouched(prev => new Set([...prev, field]));\n }, []);\n\n const touchAll = useCallback(() => {\n setTouched(new Set(rules.map(r => r.field)));\n }, [rules]);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n\n const clearFieldError = useCallback((field: string) => {\n setErrors(prev => {\n const next = { ...prev };\n delete next[field];\n return next;\n });\n }, []);\n\n const reset = useCallback(() => {\n setErrors({});\n setTouched(new Set());\n }, []);\n\n const getFieldError = useCallback((field: string): string | undefined => {\n return touched.has(field) ? errors[field] : undefined;\n }, [errors, touched]);\n\n return {\n errors,\n touched,\n validateField,\n validateAll,\n touchField,\n touchAll,\n clearErrors,\n clearFieldError,\n reset,\n getFieldError,\n };\n}","'use client';\nimport { useEffect, useCallback, useState } from 'react';\n\ninterface FormPersistenceOptions {\n key: string;\n debounceMs?: number;\n maxAge?: number; // in milliseconds\n excludeFields?: string[];\n}\n\nexport function useFormPersistence<T extends Record<string, any>>(\n data: T,\n options: FormPersistenceOptions\n) {\n const { key, debounceMs = 1000, maxAge = 24 * 60 * 60 * 1000, excludeFields = [] } = options;\n const [isRestoring, setIsRestoring] = useState(true);\n const [hasRestored, setHasRestored] = useState(false);\n\n // Save data to localStorage with debouncing\n useEffect(() => {\n if (!key || isRestoring || typeof window === 'undefined') return;\n\n const timeoutId = setTimeout(() => {\n try {\n // Filter out excluded fields\n const dataToSave = Object.entries(data).reduce((acc, [field, value]) => {\n if (!excludeFields.includes(field)) {\n acc[field] = value;\n }\n return acc;\n }, {} as Record<string, any>);\n\n const savedData = {\n data: dataToSave,\n timestamp: Date.now(),\n version: '1.0',\n };\n\n localStorage.setItem(key, JSON.stringify(savedData));\n } catch (error) {\n console.error('Failed to save form data:', error);\n }\n }, debounceMs);\n\n return () => clearTimeout(timeoutId);\n }, [data, key, debounceMs, excludeFields, isRestoring]);\n\n // Restore data from localStorage\n const restore = useCallback((): Partial<T> | null => {\n if (!key || typeof window === 'undefined') return null;\n\n try {\n const saved = localStorage.getItem(key);\n if (!saved) return null;\n\n const parsed = JSON.parse(saved);\n \n // Check if data is expired\n if (Date.now() - parsed.timestamp > maxAge) {\n localStorage.removeItem(key);\n return null;\n }\n\n return parsed.data;\n } catch (error) {\n console.error('Failed to restore form data:', error);\n return null;\n }\n }, [key, maxAge]);\n\n // Clear saved data\n const clear = useCallback(() => {\n if (!key || typeof window === 'undefined') return;\n \n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('Failed to clear form data:', error);\n }\n }, [key]);\n\n // Auto-restore on mount\n useEffect(() => {\n setIsRestoring(false);\n setHasRestored(true);\n }, []);\n\n return {\n restore,\n clear,\n hasRestored,\n isRestoring,\n };\n}","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { z } from 'zod';\n\nexport interface LeadCaptureModalProps {\n\ttrigger: 'exit_intent' | 'time_based' | 'scroll_based';\n\toffer: string;\n\tdownloadUrl?: string;\n\tdelay?: number; // milliseconds\n\tscrollThreshold?: number; // percentage\n\twhatsappMessage?: string;\n\tbenefits?: string[];\n\tonSubmit?: (data: LeadData) => Promise<void>;\n\tonClose?: () => void;\n\tenabled?: boolean;\n}\n\nexport interface LeadData {\n\temail: string;\n\tunit?: string;\n\tsource: string;\n\ttrigger: string;\n\toffer: string;\n}\n\n// Validation schema\nconst leadCaptureSchema = z.object({\n\temail: z.string().email('Invalid email address'),\n\tunit: z.string().optional(),\n});\n\nexport function LeadCaptureModal({\n\ttrigger,\n\toffer,\n\tdownloadUrl,\n\tdelay = 30000, // 30 seconds default\n\tscrollThreshold = 50,\n\tenabled = true,\n\tonSubmit,\n\tonClose,\n}: LeadCaptureModalProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [hasShown, setHasShown] = useState(false);\n\tconst [email, setEmail] = useState('');\n\tconst [unit, setUnit] = useState('');\n\tconst [isSubmitting, setIsSubmitting] = useState(false);\n\tconst [success, setSuccess] = useState(false);\n\tconst [errors, setErrors] = useState<Record<string, string>>({});\n\n\tuseEffect(() => {\n\t\t// Skip if not enabled\n\t\tif (!enabled) return;\n\n\t\t// Check if modal has been shown in this session\n\t\tconst shown = sessionStorage.getItem('lead_modal_shown');\n\t\tif (shown) {\n\t\t\tsetHasShown(true);\n\t\t\treturn;\n\t\t}\n\n\t\tlet timeoutId: NodeJS.Timeout;\n\t\tlet handleMouseLeave: (e: MouseEvent) => void;\n\t\tlet handleScroll: () => void;\n\n\t\tif (trigger === 'exit_intent') {\n\t\t\thandleMouseLeave = (e: MouseEvent) => {\n\t\t\t\tif (e.clientY <= 0 && !hasShown) {\n\t\t\t\t\tshowModal();\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener('mouseleave', handleMouseLeave);\n\t\t} else if (trigger === 'time_based') {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tif (!hasShown) {\n\t\t\t\t\tshowModal();\n\t\t\t\t}\n\t\t\t}, delay);\n\t\t} else if (trigger === 'scroll_based') {\n\t\t\thandleScroll = () => {\n\t\t\t\tconst scrollPercent =\n\t\t\t\t\t(window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100;\n\t\t\t\tif (scrollPercent >= scrollThreshold && !hasShown) {\n\t\t\t\t\tshowModal();\n\t\t\t\t}\n\t\t\t};\n\t\t\twindow.addEventListener('scroll', handleScroll);\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\tif (handleMouseLeave) document.removeEventListener('mouseleave', handleMouseLeave);\n\t\t\tif (handleScroll) window.removeEventListener('scroll', handleScroll);\n\t\t};\n\t}, [trigger, delay, scrollThreshold, hasShown, enabled]);\n\n\tconst showModal = () => {\n\t\tsetIsOpen(true);\n\t\tsetHasShown(true);\n\t\tsessionStorage.setItem('lead_modal_shown', 'true');\n\t};\n\n\tconst handleFormSubmit = async (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\tsetIsSubmitting(true);\n\t\tsetErrors({});\n\n\t\t// Validate\n\t\ttry {\n\t\t\tleadCaptureSchema.parse({ email, unit });\n\t\t} catch (error) {\n\t\t\tif (error instanceof z.ZodError) {\n\t\t\t\tconst fieldErrors: Record<string, string> = {};\n\t\t\t\terror.errors.forEach((err) => {\n\t\t\t\t\tif (err.path[0]) {\n\t\t\t\t\t\tfieldErrors[err.path[0] as string] = err.message;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsetErrors(fieldErrors);\n\t\t\t\tsetIsSubmitting(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst leadData: LeadData = {\n\t\t\t\temail,\n\t\t\t\tunit,\n\t\t\t\tsource: 'lead_modal',\n\t\t\t\ttrigger,\n\t\t\t\toffer,\n\t\t\t};\n\n\t\t\tif (onSubmit) {\n\t\t\t\tawait onSubmit(leadData);\n\t\t\t} else {\n\t\t\t\t// Default behavior - call the API\n\t\t\t\tconst response = await fetch('/api/leads/capture', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t...leadData,\n\t\t\t\t\t\tstatus: 'email_lead',\n\t\t\t\t\t\tintent: downloadUrl ? 'download' : 'newsletter',\n\t\t\t\t\t\tutm_source: new URLSearchParams(window.location.search).get('utm_source') || 'organic',\n\t\t\t\t\t\tutm_medium: new URLSearchParams(window.location.search).get('utm_medium') || 'website',\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error('Failed to capture lead');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetSuccess(true);\n\n\t\t\t// Download file if URL provided\n\t\t\tif (downloadUrl) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst a = document.createElement('a');\n\t\t\t\t\ta.href = downloadUrl;\n\t\t\t\t\ta.download = downloadUrl.split('/').pop() || 'guide.pdf';\n\t\t\t\t\tdocument.body.appendChild(a);\n\t\t\t\t\ta.click();\n\t\t\t\t\tdocument.body.removeChild(a);\n\t\t\t\t}, 500);\n\t\t\t}\n\n\t\t\t// Close modal after 3 seconds\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetIsOpen(false);\n\t\t\t\tonClose?.();\n\t\t\t}, 3000);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error capturing lead:', error);\n\t\t\tsetErrors({ form: 'An error occurred. Please try again.' });\n\t\t} finally {\n\t\t\tsetIsSubmitting(false);\n\t\t}\n\t};\n\n\tconst handleClose = () => {\n\t\tsetIsOpen(false);\n\t\tonClose?.();\n\t};\n\n\tif (!isOpen || !enabled) return null;\n\n\t// Note: This is a simplified version without the UI components from the landing page\n\t// The actual modal UI should be passed in via render props or use a UI library\n\treturn (\n\t\t<div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n\t\t\t<div className=\"fixed inset-0 bg-black/50\" onClick={handleClose} />\n\t\t\t<div className=\"relative bg-white rounded-lg p-6 max-w-md w-full mx-4\">\n\t\t\t\t<button\n\t\t\t\t\tonClick={handleClose}\n\t\t\t\t\tclassName=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600\"\n\t\t\t\t>\n\t\t\t\t\t×\n\t\t\t\t</button>\n\n\t\t\t\t{success ? (\n\t\t\t\t\t<div className=\"text-center py-6\">\n\t\t\t\t\t\t<h3 className=\"text-lg font-semibold mb-4\">✅ Thank you!</h3>\n\t\t\t\t\t\t<p className=\"text-gray-600\">Your {offer} is on its way!</p>\n\t\t\t\t\t\t<p className=\"text-sm text-gray-500 mt-2\">\n\t\t\t\t\t\t\tCheck your email in a few moments.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<form onSubmit={handleFormSubmit} className=\"space-y-4\">\n\t\t\t\t\t\t<div className=\"text-center mb-4\">\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold mb-2\">🎁 Exclusive Offer</h3>\n\t\t\t\t\t\t\t<p className=\"text-gray-700 font-medium\">{offer}</p>\n\t\t\t\t\t\t\t<p className=\"text-sm text-gray-500 mt-1\">\n\t\t\t\t\t\t\t\tGet your free guide instantly + 10% discount\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label htmlFor=\"email\" className=\"block text-sm font-medium mb-1\">\n\t\t\t\t\t\t\t\t\tEmail *\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"email\"\n\t\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"your.email@example.com\"\n\t\t\t\t\t\t\t\t\tvalue={email}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setEmail(e.target.value)}\n\t\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-3 py-2 border rounded-md\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{errors.email && (\n\t\t\t\t\t\t\t\t\t<p className=\"text-red-500 text-sm mt-1\">{errors.email}</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label htmlFor=\"unit\" className=\"block text-sm font-medium mb-1\">\n\t\t\t\t\t\t\t\t\tMilitary Unit (optional)\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"unit\"\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Ex: Inf Mont 7\"\n\t\t\t\t\t\t\t\t\tvalue={unit}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setUnit(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-3 py-2 border rounded-md\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{errors.unit && (\n\t\t\t\t\t\t\t\t\t<p className=\"text-red-500 text-sm mt-1\">{errors.unit}</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{errors.form && (\n\t\t\t\t\t\t\t<p className=\"text-red-500 text-sm text-center\">{errors.form}</p>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\t\tclassName=\"w-full py-2 px-4 bg-black text-white rounded-md hover:bg-gray-800 disabled:opacity-50\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSubmitting ? 'Sending...' : 'Get Free Guide →'}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<p className=\"text-xs text-center text-gray-500\">\n\t\t\t\t\t\t\tNo spam, promise! You can unsubscribe at any time.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</form>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}","// Context and Providers\nexport { FormProvider, useFormContext } from './context/FormProvider';\nexport type { FormData, FormStep, FormConfig } from './context/FormProvider';\n\n// Multi-step Components\nexport { MultiStepForm } from './multi-step/MultiStepForm';\nexport type { FormStep as MultiStepFormStep } from './multi-step/MultiStepForm';\nexport { FormNavigation } from './multi-step/FormNavigation';\n\n// Field Components\n// FileUploadField has been moved to @akson/cortex-ui-library for better Supabase integration\n\n// Hooks\nexport { useFormValidation } from './hooks/useFormValidation';\nexport type { ValidationRule, ValidationResult } from './hooks/useFormValidation';\nexport { useFormPersistence } from './hooks/useFormPersistence';\n\n// Modal Components\nexport { LeadCaptureModal } from './modals/LeadCaptureModal';\nexport type { LeadCaptureModalProps, LeadData } from './modals/LeadCaptureModal';\n\n// Re-export validation utilities from zod for convenience\nexport { z } from 'zod';\nimport { z } from 'zod';\n\n// Common validation schemas\nexport const validationSchemas = {\n email: () => z.string().email('Invalid email address'),\n phone: () => z.string().min(10, 'Phone number must be at least 10 digits'),\n required: () => z.string().min(1, 'This field is required'),\n minLength: (min: number) => z.string().min(min, `Must be at least ${min} characters`),\n maxLength: (max: number) => z.string().max(max, `Must be at most ${max} characters`),\n number: () => z.number(),\n positiveNumber: () => z.number().positive('Must be a positive number'),\n url: () => z.string().url('Invalid URL'),\n};"],"mappings":"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","names":["jsx","cn","jsx","jsxs","useState","useCallback","useCallback","useState","useEffect","useState","z","jsx","jsxs","z"]}