@saastro/forms 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Form.tsx","../src/factory/fieldRenderers.tsx","../src/utils/stepUtils.ts","../src/lib/utils.ts","../src/utils/tailwind-classes.ts","../src/factory/variants.ts","../src/utils/icon-helper.tsx","../src/factory/FieldWrapper.tsx","../src/factory/renderers/componentGuard.tsx","../src/factory/renderers/textRenderers.tsx","../src/factory/renderers/selectionRenderers.tsx","../src/factory/constants.ts","../src/factory/renderers/toggleRenderers.tsx","../src/factory/renderers/dateRenderers.tsx","../src/factory/renderers/specialRenderers.tsx","../src/hooks/useFormButtons.ts","../src/hooks/useFormLayout.ts","../src/hooks/useFormState.ts","../src/validation/guards.ts","../src/validation/compiler.ts","../src/validation/presets.ts","../src/hooks/useFormSteps.ts","../src/hooks/useFormSubmit.ts","../src/utils/defaultSubmit.ts","../src/hooks/useFormValidation.ts","../src/hooks/useHiddenFieldResolvers.ts","../src/hooks/useComputedFields.ts","../src/hooks/useRecaptcha.ts","../src/hooks/useSubmitConfirmation.ts","../src/hooks/useSubmitActionTriggers.ts","../src/utils/fieldTypeComponents.ts","../src/core/PluginManager.ts","../src/builders/FieldBuilder.ts","../src/types/plugin.ts","../src/plugins/databowl.ts","../src/builders/FormBuilder.ts","../src/builders/field-builder-map.ts","../src/plugins/localStorage.ts","../src/plugins/analytics.ts","../src/plugins/autosave.ts","../src/plugins/recaptcha.ts","../src/presets/shadcn.ts","../src/core/ComponentResolver.ts","../src/hooks/useFormStepsInfo.ts","../src/components/StepsAccordion.tsx","../src/components/StepsNavigation.tsx","../src/components/StepsProgress.tsx","../src/types/submitActions.ts","../src/utils/testDataGenerator.ts"],"sourcesContent":["/**\n * Form Component - Renders a complete form from FormConfig\n *\n * This component is the main entry point for rendering forms from configuration.\n * Supports two modes:\n * 1. Zero-config: Provide components inline via `components` prop\n * 2. Legacy: Wrap with ComponentProvider for global component injection\n */\n\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo } from 'react';\nimport { FormProvider } from 'react-hook-form';\nimport { FieldRenderer } from '../factory/fieldRenderers';\nimport { useFormButtons } from '../hooks/useFormButtons';\nimport { useFormLayout } from '../hooks/useFormLayout';\nimport { useFormState } from '../hooks/useFormState';\nimport { useRecaptcha } from '../hooks/useRecaptcha';\nimport { useSubmitConfirmation } from '../hooks/useSubmitConfirmation';\nimport { useSubmitActionTriggers } from '../hooks/useSubmitActionTriggers';\nimport type { FormConfig } from '../types/common';\nimport type { UseFormReturn } from 'react-hook-form';\nimport type { ComponentOverrides, PartialComponentRegistry } from '../types/components';\nimport { getFieldClass, normalizeFieldLayout } from '../utils/tailwind-classes';\nimport {\n useComponents,\n useHasComponentProvider,\n InternalComponentProvider,\n mergeComponentRegistries,\n parseGlobModules,\n type GlobModules,\n} from '../context/ComponentContext';\nimport { getRequiredComponents, getMissingComponents } from '../utils/fieldTypeComponents';\nimport { MissingComponentFallback } from './MissingComponentFallback';\n\n/** Methods exposed via ref on the Form component */\nexport interface FormRef {\n setValue: UseFormReturn['setValue'];\n reset: UseFormReturn['reset'];\n getValues: UseFormReturn['getValues'];\n trigger: UseFormReturn['trigger'];\n}\n\nexport interface FormProps {\n /** Form configuration */\n config: FormConfig;\n /**\n * UI components for the form. Accepts either:\n *\n * 1. **Glob modules (Recommended)** - Pass Vite's import.meta.glob result directly:\n * ```tsx\n * <Form\n * config={config}\n * components={import.meta.glob('@/components/ui/*.tsx', { eager: true })}\n * />\n * ```\n *\n * 2. **Component object** - Pass individual components:\n * ```tsx\n * <Form\n * config={config}\n * components={{ Input, Button, Label }}\n * />\n * ```\n *\n * Both approaches support partial registries - only provide what you need.\n * Missing components will show helpful installation instructions.\n */\n components?: ComponentOverrides | GlobModules;\n /**\n * Called when the form is submitted successfully\n */\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>;\n /**\n * Called when form submission fails\n */\n onError?: (error: Error) => void;\n /**\n * CSS class for the form element\n */\n className?: string;\n}\n\n/**\n * Internal form implementation that uses the component context\n */\nconst FormInner = forwardRef<FormRef, Omit<FormProps, 'components'>>(function FormInner(\n { config, onSubmit, onError, className },\n ref,\n): React.ReactElement {\n const components = useComponents();\n\n const {\n currentStepId,\n loading,\n submitted,\n error,\n methods,\n prevStep,\n validateAndNext,\n isLast,\n getSuccessMessage,\n getErrorMessage,\n handleSubmit,\n stepHistory,\n } = useFormState({\n config,\n fields: config.fields,\n steps: config.steps,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n setValue: methods.setValue,\n reset: methods.reset,\n getValues: methods.getValues,\n trigger: methods.trigger,\n }),\n [methods],\n );\n\n const { gridClassName, gridStyle } = useFormLayout(config.layout);\n\n const { buttonConfigs } = useFormButtons(config.buttons, {\n next: { action: validateAndNext },\n back: { action: prevStep },\n });\n\n // Initialize recaptcha if configured\n useRecaptcha(config);\n\n // ===== SUBMIT ACTION TRIGGERS (onFieldChange, onFieldBlur, onStepEnter/Exit, onDelay) =====\n const hasSubmitActions = !!(config.submitActions && Object.keys(config.submitActions).length > 0);\n\n const { triggerFieldChange, triggerFieldBlur } = useSubmitActionTriggers({\n config,\n getValues: methods.getValues,\n currentStep: currentStepId,\n enabled: hasSubmitActions,\n });\n\n // Wire field change triggers via RHF watch subscription (no re-renders)\n useEffect(() => {\n if (!hasSubmitActions) return;\n const subscription = methods.watch((_values, { name, type }) => {\n if (name && type === 'change') {\n triggerFieldChange(name, _values[name]);\n }\n });\n return () => subscription.unsubscribe();\n }, [hasSubmitActions, methods, triggerFieldChange]);\n\n // Wire blur triggers via form-level event delegation\n const handleFieldBlur = useCallback(\n (e: React.FocusEvent<HTMLFormElement>) => {\n if (!hasSubmitActions) return;\n const fieldName = (e.target as unknown as HTMLInputElement).name;\n if (fieldName && config.fields[fieldName]) {\n triggerFieldBlur(fieldName);\n }\n },\n [hasSubmitActions, triggerFieldBlur, config.fields],\n );\n\n // Submit confirmation for optional fields (submit button)\n // Wraps handleSubmit with validateAndNext to ensure Zod validation runs\n // before submitting (the submit button is type=\"button\" for confirmation UX,\n // so it bypasses the native <form onSubmit> flow)\n const submitConfirmation = useSubmitConfirmation(\n config,\n methods.watch(),\n async () => {\n await validateAndNext();\n },\n 'submit',\n );\n\n // Next confirmation for optional fields (next button)\n const nextConfirmation = useSubmitConfirmation(config, methods.watch(), validateAndNext, 'next');\n\n // Get current step fields\n const currentStepFields = config.steps[currentStepId]?.fields || [];\n\n const isInline = config.buttons?.inline ?? false;\n const align = config.buttons?.align ?? 'end';\n\n // Generate button container classes based on alignment\n const getButtonContainerClass = () => {\n const baseClasses = isInline ? 'flex gap-3' : 'mt-6 flex gap-3';\n\n switch (align) {\n case 'start':\n return `${baseClasses} justify-start`;\n case 'center':\n return `${baseClasses} justify-center`;\n case 'end':\n return `${baseClasses} justify-end`;\n case 'between':\n return `${baseClasses} justify-between`;\n case 'responsive':\n return `${baseClasses} flex-col sm:flex-row sm:justify-end`;\n default:\n return `${baseClasses} justify-end`;\n }\n };\n\n // Handler for form submission\n const onFormSubmit = async (data: Record<string, unknown>) => {\n try {\n if (isLast) {\n await handleSubmit(data);\n if (onSubmit) {\n await onSubmit(data);\n }\n } else {\n await validateAndNext();\n }\n } catch (err) {\n if (onError && err instanceof Error) {\n onError(err);\n }\n }\n };\n\n // If form is submitted successfully, show success message\n if (submitted) {\n return (\n <div\n className=\"border rounded-lg p-4 border-emerald-500 bg-emerald-50 dark:bg-emerald-950\"\n role=\"alert\"\n >\n <div className=\"text-emerald-900 dark:text-emerald-100\">\n {typeof getSuccessMessage() === 'string' ? (\n <div dangerouslySetInnerHTML={{ __html: getSuccessMessage() }} />\n ) : (\n getSuccessMessage()\n )}\n </div>\n </div>\n );\n }\n\n // Check for missing Button component before rendering buttons\n const ButtonComponent = components.Button;\n const hasMissingButton = !ButtonComponent;\n\n // Render buttons section\n const renderButtons = () => {\n if (hasMissingButton) {\n return (\n <MissingComponentFallback\n fieldName=\"_form_buttons\"\n fieldType=\"form\"\n missingComponents={['Button']}\n message=\"Form buttons require the Button component\"\n />\n );\n }\n\n return (\n <div className={getButtonContainerClass()}>\n {/* Back Button */}\n {stepHistory.length > 0 && (\n <ButtonComponent\n type=\"button\"\n variant={buttonConfigs.back.variant}\n size={buttonConfigs.back.size}\n onClick={prevStep}\n disabled={loading}\n >\n {buttonConfigs.back.icon}\n {buttonConfigs.back.label}\n </ButtonComponent>\n )}\n\n {/* Next/Submit Button */}\n {isLast ? (\n <ButtonComponent\n type=\"button\"\n variant={\n submitConfirmation.isAwaitingConfirmation\n ? submitConfirmation.buttonProps.variant || buttonConfigs.submit.variant\n : buttonConfigs.submit.variant\n }\n size={buttonConfigs.submit.size}\n onClick={submitConfirmation.handleClick}\n disabled={loading}\n >\n {loading\n ? 'Enviando...'\n : submitConfirmation.isAwaitingConfirmation\n ? submitConfirmation.buttonProps.text\n : buttonConfigs.submit.label}\n {buttonConfigs.submit.icon}\n </ButtonComponent>\n ) : (\n <ButtonComponent\n type=\"button\"\n variant={\n nextConfirmation.isAwaitingConfirmation\n ? nextConfirmation.buttonProps.variant || buttonConfigs.next.variant\n : buttonConfigs.next.variant\n }\n size={buttonConfigs.next.size}\n onClick={nextConfirmation.handleClick}\n disabled={loading}\n >\n {nextConfirmation.isAwaitingConfirmation\n ? nextConfirmation.buttonProps.text\n : buttonConfigs.next.label}\n {buttonConfigs.next.icon}\n </ButtonComponent>\n )}\n </div>\n );\n };\n\n return (\n <FormProvider {...methods}>\n <form\n id={config.formId}\n onSubmit={methods.handleSubmit(onFormSubmit)}\n onBlur={handleFieldBlur}\n className={className || 'w-full'}\n >\n {/* Inline layout: fields and buttons in same container */}\n {isInline ? (\n <div className={`${gridClassName} items-end`} style={gridStyle}>\n {currentStepFields.map((fieldName) => {\n const fieldConfig = config.fields[fieldName];\n if (!fieldConfig) return null;\n\n const fieldLayoutConfig =\n normalizeFieldLayout(fieldConfig.layout) ||\n (fieldConfig.columns ? { columns: fieldConfig.columns } : undefined);\n const fieldClassName = getFieldClass(config.layout, fieldLayoutConfig);\n\n return (\n <FieldRenderer\n key={fieldName}\n name={fieldName}\n fieldConfig={fieldConfig}\n control={methods.control}\n colSpanItem={fieldClassName}\n pluginManager={config.pluginManager}\n />\n );\n })}\n {renderButtons()}\n </div>\n ) : (\n <>\n {/* Standard layout: fields and buttons separate */}\n <div className={gridClassName} style={gridStyle}>\n {currentStepFields.map((fieldName) => {\n const fieldConfig = config.fields[fieldName];\n if (!fieldConfig) return null;\n\n const fieldLayoutConfig =\n normalizeFieldLayout(fieldConfig.layout) ||\n (fieldConfig.columns ? { columns: fieldConfig.columns } : undefined);\n const fieldClassName = getFieldClass(config.layout, fieldLayoutConfig);\n\n return (\n <FieldRenderer\n key={fieldName}\n name={fieldName}\n fieldConfig={fieldConfig}\n control={methods.control}\n colSpanItem={fieldClassName}\n />\n );\n })}\n </div>\n {renderButtons()}\n </>\n )}\n\n {/* Error Message */}\n {error && (\n <div\n className=\"mt-4 border rounded-lg p-4 border-destructive bg-destructive/10\"\n role=\"alert\"\n >\n <div className=\"text-destructive\">\n {typeof getErrorMessage() === 'string' ? (\n <div dangerouslySetInnerHTML={{ __html: getErrorMessage() }} />\n ) : (\n getErrorMessage()\n )}\n </div>\n </div>\n )}\n </form>\n </FormProvider>\n );\n});\n\n/**\n * Detect if the input looks like Vite glob modules.\n * Glob modules have keys that look like file paths: '/components/ui/button.tsx'\n */\nfunction isGlobModules(input: unknown): input is GlobModules {\n if (!input || typeof input !== 'object') return false;\n const keys = Object.keys(input);\n if (keys.length === 0) return false;\n // Check if first key looks like a file path (contains / and ends with .tsx or .ts)\n const firstKey = keys[0] as string;\n return firstKey.includes('/') && /\\.(tsx?|jsx?)$/.test(firstKey);\n}\n\n/**\n * Form component that renders a complete form from configuration.\n *\n * Supports multiple modes:\n *\n * **1. Auto-discovery with glob (Recommended):**\n * Pass Vite's import.meta.glob result directly - components are auto-discovered.\n *\n * ```tsx\n * import { Form } from \"@saastro/forms\";\n *\n * <Form\n * config={config}\n * components={import.meta.glob('@/components/ui/*.tsx', { eager: true })}\n * />\n * ```\n *\n * **2. Explicit components:**\n * Pass specific components you need.\n *\n * ```tsx\n * import { Form } from \"@saastro/forms\";\n * import { Input, Button } from \"@/components/ui\";\n *\n * <Form\n * config={config}\n * components={{ Input, Button }}\n * />\n * ```\n *\n * **3. Provider-based (Legacy):**\n * Wrap with `ComponentProvider` or `FormComponentsProvider`.\n *\n * ```tsx\n * <FormComponentsProvider components={globModules}>\n * <Form config={config} />\n * </FormComponentsProvider>\n * ```\n *\n * The `components` prop takes precedence over context-provided components.\n */\nexport const Form = forwardRef<FormRef, FormProps>(function Form(\n { config, components: componentInput, onSubmit, onError, className },\n ref,\n): React.ReactElement {\n // Check if we're inside a legacy ComponentProvider\n const hasLegacyProvider = useHasComponentProvider();\n\n // Determine which components to use\n // Auto-detect if input is glob modules and parse accordingly\n const resolvedComponents = useMemo((): PartialComponentRegistry | undefined => {\n if (!componentInput || Object.keys(componentInput).length === 0) {\n return undefined;\n }\n\n // Auto-detect glob modules vs component registry\n if (isGlobModules(componentInput)) {\n // Parse glob modules into component registry\n return parseGlobModules(componentInput);\n }\n\n // Already a component registry\n return componentInput as PartialComponentRegistry;\n }, [componentInput]);\n\n // Validate required components\n const missingComponents = useMemo(() => {\n if (!resolvedComponents && !hasLegacyProvider) {\n // No components provided and no provider - all components are missing\n const required = getRequiredComponents(config);\n return required;\n }\n\n if (resolvedComponents) {\n const required = getRequiredComponents(config);\n return getMissingComponents(required, resolvedComponents);\n }\n\n return [];\n }, [config, resolvedComponents, hasLegacyProvider]);\n\n // If no provider and no components prop, show helpful error\n if (!hasLegacyProvider && !resolvedComponents) {\n return (\n <div\n className=\"border-2 border-dashed border-red-400 bg-red-50 dark:bg-red-950/20 rounded-lg p-6\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3\">\n <span className=\"text-red-600 dark:text-red-400 text-2xl flex-shrink-0\">❌</span>\n <div className=\"text-sm\">\n <p className=\"font-semibold text-red-800 dark:text-red-200 text-base mb-2\">\n Missing UI Components\n </p>\n <p className=\"text-red-700 dark:text-red-300 mb-4\">\n Form requires UI components to render. Add one line:\n </p>\n\n <div className=\"space-y-4\">\n <div className=\"bg-red-100 dark:bg-red-900/30 rounded p-3\">\n <p className=\"font-medium text-red-800 dark:text-red-200 mb-2\">\n Auto-discover (Recommended)\n </p>\n <pre className=\"text-xs overflow-x-auto\">\n <code className=\"text-red-700 dark:text-red-300\">{`<Form\n config={config}\n components={import.meta.glob('@/components/ui/*.tsx', { eager: true })}\n/>`}</code>\n </pre>\n </div>\n\n <div className=\"bg-red-100 dark:bg-red-900/30 rounded p-3\">\n <p className=\"font-medium text-red-800 dark:text-red-200 mb-2\">\n Or explicit components\n </p>\n <pre className=\"text-xs overflow-x-auto\">\n <code className=\"text-red-700 dark:text-red-300\">{`import { Input, Button } from \"@/components/ui\";\n\n<Form\n config={config}\n components={{ Input, Button }}\n/>`}</code>\n </pre>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // If using zero-config mode with missing components, show warnings\n if (resolvedComponents && missingComponents.length > 0) {\n // Still render the form but with warnings for missing components\n // The individual field renderers will show MissingComponentFallback\n }\n\n // Zero-config mode: wrap with internal provider\n if (resolvedComponents && !hasLegacyProvider) {\n return (\n <InternalComponentProvider components={resolvedComponents}>\n <FormInner\n ref={ref}\n config={config}\n onSubmit={onSubmit}\n onError={onError}\n className={className}\n />\n </InternalComponentProvider>\n );\n }\n\n // Legacy mode or override mode: use existing context, optionally merge overrides\n if (hasLegacyProvider && resolvedComponents) {\n // Merge context components with overrides (overrides take precedence)\n return (\n <InternalComponentProvider components={resolvedComponents}>\n <FormInner\n ref={ref}\n config={config}\n onSubmit={onSubmit}\n onError={onError}\n className={className}\n />\n </InternalComponentProvider>\n );\n }\n\n // Pure legacy mode: use context directly\n return (\n <FormInner\n ref={ref}\n config={config}\n onSubmit={onSubmit}\n onError={onError}\n className={className}\n />\n );\n});\n","import { Info } from 'lucide-react';\nimport React, { useCallback, useMemo, type ReactNode } from 'react';\nimport { useWatch, type Control } from 'react-hook-form';\nimport type { ConditionGroup } from '../types/logic';\nimport { evaluateConditionGroup } from '../utils/stepUtils';\nimport { useComponents } from '../context/ComponentContext';\n\nimport { cn } from '../lib/utils';\nimport { getHiddenClasses } from '../utils/tailwind-classes';\nimport { iconVariants } from './variants';\nimport { getIcon } from '../utils/icon-helper';\n\nimport type { FieldConfig } from '../types/fields';\nimport type { RendererContext } from './rendererTypes';\nimport type { PluginManager } from '../core/PluginManager';\n\n// Category renderers\nimport {\n renderTextField,\n renderTextareaField,\n renderInputGroupField,\n} from './renderers/textRenderers';\nimport {\n renderSelectField,\n renderNativeSelectField,\n renderComboboxField,\n renderCommandField,\n} from './renderers/selectionRenderers';\nimport {\n renderCheckboxOrSwitch,\n renderRadioField,\n renderButtonCardField,\n renderButtonCheckboxField,\n renderButtonRadioField,\n renderCheckboxGroupField,\n renderSwitchGroupField,\n} from './renderers/toggleRenderers';\nimport { renderDateField, renderDateRangeField } from './renderers/dateRenderers';\nimport {\n renderSliderField,\n renderOtpField,\n renderFileField,\n renderRepeaterField,\n renderHtmlField,\n renderButtonField,\n} from './renderers/specialRenderers';\n\ninterface Props {\n /** React-Hook-Form control */\n control: Control<Record<string, unknown>>;\n /** Field name (path) */\n name: string;\n fieldConfig: FieldConfig;\n /** Clase CSS opcional para el Field */\n colSpanItem?: string;\n /** Plugin manager for custom field types */\n pluginManager?: PluginManager;\n}\n\n// Helper para saber si un FieldConfig tiene icon\nconst hasIcon = (fc: FieldConfig): fc is FieldConfig & { icon: ReactNode } =>\n 'icon' in fc && fc.icon !== undefined && fc.icon !== null;\n\n// Helper para evaluar si un campo está oculto\nconst isHidden = (hidden: FieldConfig['hidden'], values: Record<string, unknown>): boolean => {\n if (typeof hidden === 'function') {\n return hidden(values);\n }\n if (typeof hidden === 'object' && hidden !== null) {\n if (\n 'default' in hidden ||\n 'sm' in hidden ||\n 'md' in hidden ||\n 'lg' in hidden ||\n 'xl' in hidden ||\n '2xl' in hidden\n ) {\n const breakpointVisibility = hidden as Partial<Record<string, 'visible' | 'hidden'>>;\n return breakpointVisibility.default === 'hidden';\n }\n return evaluateConditionGroup(hidden as ConditionGroup, values);\n }\n return !!hidden;\n};\n\n// Helper para evaluar si un campo está deshabilitado\nconst isDisabled = (\n disabled: FieldConfig['disabled'],\n values: Record<string, unknown>,\n): boolean => {\n if (typeof disabled === 'function') {\n return disabled(values);\n }\n if (typeof disabled === 'object' && disabled !== null) {\n return evaluateConditionGroup(disabled as ConditionGroup, values);\n }\n return !!disabled;\n};\n\n// Helper para evaluar si un campo es de solo lectura\nconst isReadOnly = (\n readOnly: FieldConfig['readOnly'],\n values: Record<string, unknown>,\n): boolean => {\n if (typeof readOnly === 'function') {\n return readOnly(values);\n }\n if (typeof readOnly === 'object' && readOnly !== null) {\n return evaluateConditionGroup(readOnly as ConditionGroup, values);\n }\n return !!readOnly;\n};\n\n// Type guards\nconst isString = (value: unknown): value is string => typeof value === 'string';\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\nconst isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';\nconst isDate = (value: unknown): value is Date => value instanceof Date;\nconst isArray = (value: unknown): value is unknown[] => Array.isArray(value);\n\n// Helper function to safely cast field values\nconst getFieldValue = (\n field: { value: unknown },\n fieldConfig: FieldConfig,\n type: 'string' | 'number' | 'boolean' | 'date' | 'array' | 'html',\n): unknown => {\n if (fieldConfig.value !== undefined) return fieldConfig.value;\n\n switch (type) {\n case 'string':\n return isString(field.value) ? field.value : undefined;\n case 'number':\n return isNumber(field.value) ? field.value : undefined;\n case 'boolean':\n return isBoolean(field.value) ? field.value : undefined;\n case 'date':\n return isDate(field.value) ? field.value : undefined;\n case 'array':\n return isArray(field.value) ? field.value : undefined;\n case 'html':\n return field.value as React.ReactNode;\n default:\n return field.value;\n }\n};\n\nconst getOptionsLayoutClassesMemo = (fieldConfig: FieldConfig): string => {\n const optionsConfig = fieldConfig as { optionsClassName?: string };\n const { optionsClassName } = optionsConfig;\n\n if (optionsClassName) {\n return optionsClassName;\n }\n\n if (fieldConfig.type === 'button-radio') {\n return 'grid grid-cols-2 gap-2';\n }\n\n return 'grid grid-cols-1 gap-2';\n};\n\nconst getPlaceholderMemo = (fieldConfig: FieldConfig): string => {\n if (!fieldConfig) return 'Introduce un valor...';\n\n if (\n fieldConfig.type !== 'button-card' &&\n 'placeholder' in fieldConfig &&\n fieldConfig.placeholder\n ) {\n return fieldConfig.placeholder;\n }\n\n if (fieldConfig.type === 'select') {\n return 'Selecciona una opción...';\n }\n\n if (fieldConfig.type === 'email') return 'Introduce un email...';\n if (fieldConfig.type === 'tel') return 'Introduce un teléfono...';\n return 'Introduce un valor...';\n};\n\nconst FieldRendererComponent: React.FC<Props> = ({\n control,\n name,\n fieldConfig,\n colSpanItem,\n pluginManager,\n}) => {\n const components = useComponents();\n const common = { control, name } as const;\n\n const hasDynamicConditions =\n typeof fieldConfig.hidden === 'function' ||\n typeof fieldConfig.disabled === 'function' ||\n typeof fieldConfig.readOnly === 'function' ||\n (typeof fieldConfig.hidden === 'object' && fieldConfig.hidden !== null) ||\n (typeof fieldConfig.disabled === 'object' && fieldConfig.disabled !== null) ||\n (typeof fieldConfig.readOnly === 'object' && fieldConfig.readOnly !== null);\n\n const watchedValues = useWatch({\n control,\n disabled: !hasDynamicConditions,\n }) as Record<string, unknown>;\n\n const shouldHide = useMemo(\n () => isHidden(fieldConfig.hidden, watchedValues),\n [fieldConfig.hidden, watchedValues],\n );\n\n const shouldDisable = useMemo(\n () => isDisabled(fieldConfig.disabled, watchedValues),\n [fieldConfig.disabled, watchedValues],\n );\n\n const shouldReadOnly = useMemo(\n () => isReadOnly(fieldConfig.readOnly, watchedValues),\n [fieldConfig.readOnly, watchedValues],\n );\n\n if (shouldHide) {\n return null;\n }\n\n const optionsLayoutClasses = useMemo(\n () => getOptionsLayoutClassesMemo(fieldConfig),\n [fieldConfig],\n );\n\n const placeholder = useMemo(() => getPlaceholderMemo(fieldConfig), [fieldConfig]);\n\n const renderLabel = useCallback(\n (label?: string) => {\n if (!label) return null;\n\n const { FieldLabel, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } = components;\n\n const labelElement = /<[a-z][\\s\\S]*>/i.test(label) ? (\n <FieldLabel\n className={cn('inline pt-1', fieldConfig.label_className)}\n dangerouslySetInnerHTML={{ __html: label }}\n />\n ) : (\n <FieldLabel className={cn('inline pt-1', fieldConfig.label_className)}>{label}</FieldLabel>\n );\n\n if (fieldConfig.tooltip) {\n return (\n <div className=\"flex items-center gap-1.5\">\n {labelElement}\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 rounded-sm\"\n aria-label=\"Más información\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{fieldConfig.tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n );\n }\n\n return labelElement;\n },\n [fieldConfig.label_className, fieldConfig.tooltip, components],\n );\n\n // Checkbox and switch use horizontal orientation in Field component,\n // so they must not get flex-col which would override flex-row from the variant\n const isHorizontalField = fieldConfig.type === 'checkbox' || fieldConfig.type === 'switch';\n\n const formItemClassName = useMemo(\n () =>\n cn(\n !isHorizontalField && 'flex flex-col',\n colSpanItem,\n getHiddenClasses(\n typeof fieldConfig.hidden === 'object' &&\n fieldConfig.hidden !== null &&\n !('operator' in fieldConfig.hidden) &&\n !('conditions' in fieldConfig.hidden)\n ? (fieldConfig.hidden as Partial<Record<string, 'visible' | 'hidden'>>)\n : undefined,\n ),\n fieldConfig.wrapper_className,\n ),\n [isHorizontalField, fieldConfig.wrapper_className, colSpanItem, fieldConfig.hidden],\n );\n\n const renderFieldIcon = useCallback(() => {\n if (!hasIcon(fieldConfig) || !fieldConfig.icon) return null;\n const baseClassName = iconVariants({ size: fieldConfig.size });\n const customProps = fieldConfig.iconProps || {};\n const { className: customClassName, ...restProps } = customProps;\n return getIcon(fieldConfig.icon, {\n className: cn(baseClassName, customClassName),\n ...restProps,\n });\n }, [fieldConfig.icon, fieldConfig.size, fieldConfig.iconProps]);\n\n const optionsArray = useMemo(() => {\n const config = fieldConfig as {\n options?: Array<{ value: string; label: string; icon?: ReactNode }>;\n };\n return (config.options || []) as Array<{\n value: string;\n label: string;\n icon?: ReactNode;\n }>;\n }, [(fieldConfig as { options?: unknown[] }).options]);\n\n // Build context for renderer functions\n const ctx: RendererContext = {\n common,\n components,\n formItemClassName,\n shouldDisable,\n shouldReadOnly,\n placeholder,\n optionsLayoutClasses,\n optionsArray,\n renderLabel,\n renderFieldIcon,\n getFieldValue,\n };\n\n switch (fieldConfig.type) {\n case 'text':\n case 'email':\n case 'tel':\n case 'url':\n case 'password':\n case 'number':\n return renderTextField(fieldConfig, ctx, control, name);\n\n case 'textarea':\n return renderTextareaField(fieldConfig, ctx, control, name);\n\n case 'input-group':\n case 'currency':\n return renderInputGroupField(fieldConfig as any, ctx, control, name);\n\n case 'date':\n return renderDateField(fieldConfig as any, ctx, control, name);\n\n case 'daterange':\n return renderDateRangeField(fieldConfig as any, ctx, control, name);\n\n case 'slider':\n case 'range':\n return renderSliderField(fieldConfig as any, ctx);\n\n case 'checkbox':\n case 'switch':\n return renderCheckboxOrSwitch(fieldConfig, ctx);\n\n case 'select':\n return renderSelectField(fieldConfig, ctx, control, name);\n\n case 'combobox':\n return renderComboboxField(fieldConfig, ctx, control, name);\n\n case 'native-select':\n return renderNativeSelectField(fieldConfig, ctx, control, name);\n\n case 'command':\n return renderCommandField(fieldConfig, ctx, control, name);\n\n case 'otp':\n return renderOtpField(fieldConfig as any, ctx, control, name);\n\n case 'radio':\n return renderRadioField(fieldConfig, ctx, control, name);\n\n case 'button-card':\n return renderButtonCardField(fieldConfig, ctx);\n\n case 'button-checkbox':\n return renderButtonCheckboxField(fieldConfig, ctx);\n\n case 'button-radio':\n return renderButtonRadioField(fieldConfig, ctx);\n\n case 'checkbox-group':\n return renderCheckboxGroupField(fieldConfig, ctx);\n\n case 'switch-group':\n return renderSwitchGroupField(fieldConfig, ctx);\n\n case 'file':\n return renderFileField(fieldConfig as any, ctx, control, name);\n\n case 'repeater':\n return renderRepeaterField(\n fieldConfig as any,\n ctx,\n control,\n name,\n (subControl, subName, subConfig, subClassName) => (\n <FieldRendererComponent\n key={subName}\n control={subControl}\n name={subName}\n fieldConfig={subConfig}\n colSpanItem={subClassName}\n pluginManager={pluginManager}\n />\n ),\n );\n\n case 'hidden':\n return null; // No visible UI — value resolved by useHiddenFieldResolvers\n\n case 'html':\n return renderHtmlField(fieldConfig as any, formItemClassName);\n\n case 'button':\n case 'submit':\n case 'next':\n case 'back':\n return renderButtonField(fieldConfig as any, ctx);\n\n default: {\n // Check for plugin-registered custom field types\n const CustomField = pluginManager?.getCustomField((fieldConfig as { type: string }).type);\n if (CustomField) {\n return (\n <CustomField\n name={name}\n fieldConfig={fieldConfig}\n control={control}\n colSpanItem={formItemClassName}\n />\n );\n }\n return null;\n }\n }\n};\n\n/**\n * Comparación profunda optimizada para props del FieldRenderer\n */\nconst arePropsEqual = (prevProps: Props, nextProps: Props): boolean => {\n if (\n prevProps.name !== nextProps.name ||\n prevProps.control !== nextProps.control ||\n prevProps.colSpanItem !== nextProps.colSpanItem ||\n prevProps.pluginManager !== nextProps.pluginManager\n ) {\n return false;\n }\n\n const prevConfig = prevProps.fieldConfig;\n const nextConfig = nextProps.fieldConfig;\n\n if (prevConfig === nextConfig) return true;\n\n if (\n prevConfig.type !== nextConfig.type ||\n prevConfig.hidden !== nextConfig.hidden ||\n prevConfig.disabled !== nextConfig.disabled ||\n prevConfig.readOnly !== nextConfig.readOnly ||\n prevConfig.value !== nextConfig.value ||\n prevConfig.label !== nextConfig.label ||\n prevConfig.helperText !== nextConfig.helperText ||\n prevConfig.hideLabel !== nextConfig.hideLabel ||\n prevConfig.tooltip !== nextConfig.tooltip\n ) {\n return false;\n }\n\n const prevPlaceholder = (prevConfig as { placeholder?: string }).placeholder;\n const nextPlaceholder = (nextConfig as { placeholder?: string }).placeholder;\n if (prevPlaceholder !== nextPlaceholder) return false;\n\n if (\n prevConfig.wrapper_className !== nextConfig.wrapper_className ||\n prevConfig.input_className !== nextConfig.input_className ||\n prevConfig.label_className !== nextConfig.label_className ||\n prevConfig.helper_className !== nextConfig.helper_className ||\n prevConfig.error_className !== nextConfig.error_className\n ) {\n return false;\n }\n\n const prevOptions = (prevConfig as { options?: unknown[] }).options;\n const nextOptions = (nextConfig as { options?: unknown[] }).options;\n\n if (prevOptions !== nextOptions) {\n if (Array.isArray(prevOptions) && Array.isArray(nextOptions)) {\n if (prevOptions.length !== nextOptions.length) return false;\n for (let i = 0; i < prevOptions.length; i++) {\n if (prevOptions[i] !== nextOptions[i]) return false;\n }\n } else {\n return false;\n }\n }\n\n if (prevConfig.type === 'slider') {\n const prev = prevConfig as { min?: number; max?: number; step?: number };\n const next = nextConfig as { min?: number; max?: number; step?: number };\n if (prev.min !== next.min || prev.max !== next.max || prev.step !== next.step) {\n return false;\n }\n }\n\n if (prevConfig.type === 'textarea') {\n const prev = prevConfig as { rows?: number; maxLength?: number };\n const next = nextConfig as { rows?: number; maxLength?: number };\n if (prev.rows !== next.rows || prev.maxLength !== next.maxLength) {\n return false;\n }\n }\n\n if (prevConfig.type === 'otp') {\n const prev = prevConfig as { length?: number };\n const next = nextConfig as { length?: number };\n if (prev.length !== next.length) return false;\n }\n\n return true;\n};\n\nexport const FieldRenderer = React.memo(FieldRendererComponent, arePropsEqual);\n","import type { Condition, ConditionGroup } from '../types/logic';\nimport type { StepCondition } from '../types/steps';\n\n/**\n * Evaluates a single condition against a set of values\n */\nexport const evaluateCondition = (\n condition: Condition,\n values: Record<string, unknown>,\n): boolean => {\n const fieldValue = values[condition.field];\n const conditionValue = condition.value;\n\n switch (condition.operator) {\n case 'equals':\n return fieldValue === conditionValue;\n case 'notEquals':\n return fieldValue !== conditionValue;\n case 'contains':\n return Array.isArray(fieldValue)\n ? fieldValue.includes(conditionValue)\n : String(fieldValue).includes(String(conditionValue));\n case 'notContains':\n return Array.isArray(fieldValue)\n ? !fieldValue.includes(conditionValue)\n : !String(fieldValue).includes(String(conditionValue));\n case 'greaterThan':\n return (fieldValue as number) > (conditionValue as number);\n case 'lessThan':\n return (fieldValue as number) < (conditionValue as number);\n case 'greaterThanOrEqual':\n return (fieldValue as number) >= (conditionValue as number);\n case 'lessThanOrEqual':\n return (fieldValue as number) <= (conditionValue as number);\n case 'isTrue':\n return fieldValue === true;\n case 'isFalse':\n return fieldValue === false;\n case 'isEmpty':\n return (\n !fieldValue ||\n (typeof fieldValue === 'string' && fieldValue.trim() === '') ||\n (Array.isArray(fieldValue) && fieldValue.length === 0)\n );\n case 'isNotEmpty':\n return (\n fieldValue !== undefined &&\n fieldValue !== null &&\n ((typeof fieldValue === 'string' && fieldValue.trim() !== '') ||\n (Array.isArray(fieldValue) && fieldValue.length > 0) ||\n (typeof fieldValue !== 'string' && !Array.isArray(fieldValue)))\n );\n default:\n return false;\n }\n};\n\n/**\n * Evaluates a group of conditions (AND/OR)\n */\nexport const evaluateConditionGroup = (\n group: ConditionGroup,\n values: Record<string, unknown>,\n): boolean => {\n if (!group.conditions || group.conditions.length === 0) {\n return true; // Default to true if no conditions\n }\n\n const results = group.conditions.map((condition) => evaluateCondition(condition, values));\n\n return group.operator === 'AND' ? results.every(Boolean) : results.some(Boolean);\n};\n\n/**\n * Evaluates a step navigation condition\n */\nexport const evaluateStepCondition = (\n stepCondition: StepCondition,\n values: Record<string, unknown>,\n): boolean => {\n return evaluateConditionGroup(stepCondition, values);\n};\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type React from 'react';\n\n/**\n * Mapeos de clases Tailwind para uso dinámico\n * Estas clases están escritas explícitamente para que Tailwind las detecte\n * sin necesidad de safelist\n *\n * OPTIMIZACIÓN:\n * - Grid cols: Solo default (sin breakpoints) porque siempre es fijo\n * - Gap: Solo default (sin breakpoints) porque nunca cambia\n * - Col span: Con breakpoints porque los campos pueden cambiar de tamaño\n * - Order: Con breakpoints porque los campos pueden reordenarse\n * - Hidden: Con breakpoints para visibilidad responsive\n */\n\n// ============================================\n// GRID COLUMNS (sin breakpoints)\n// ============================================\n// En modo manual: siempre usamos grid-cols-{n} sin breakpoints\n// En modo auto: usamos inline styles con gridTemplateColumns\nexport const GRID_COLS_CLASSES = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 5: 'grid-cols-5',\n 6: 'grid-cols-6',\n 7: 'grid-cols-7',\n 8: 'grid-cols-8',\n 9: 'grid-cols-9',\n 10: 'grid-cols-10',\n 11: 'grid-cols-11',\n 12: 'grid-cols-12',\n} as const;\n\n// ============================================\n// COL SPAN (con breakpoints)\n// ============================================\n// Los campos pueden cambiar su ancho según el breakpoint\nexport const COL_SPAN_CLASSES = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n 7: 'col-span-7',\n 8: 'col-span-8',\n 9: 'col-span-9',\n 10: 'col-span-10',\n 11: 'col-span-11',\n 12: 'col-span-12',\n full: 'col-span-full',\n} as const;\n\nexport const COL_SPAN_CLASSES_SM = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n full: 'sm:col-span-full',\n} as const;\n\nexport const COL_SPAN_CLASSES_MD = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n full: 'md:col-span-full',\n} as const;\n\nexport const COL_SPAN_CLASSES_LG = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n 7: 'lg:col-span-7',\n 8: 'lg:col-span-8',\n 9: 'lg:col-span-9',\n 10: 'lg:col-span-10',\n 11: 'lg:col-span-11',\n 12: 'lg:col-span-12',\n full: 'lg:col-span-full',\n} as const;\n\nexport const COL_SPAN_CLASSES_XL = {\n 1: 'xl:col-span-1',\n 2: 'xl:col-span-2',\n 3: 'xl:col-span-3',\n 4: 'xl:col-span-4',\n 5: 'xl:col-span-5',\n 6: 'xl:col-span-6',\n 7: 'xl:col-span-7',\n 8: 'xl:col-span-8',\n 9: 'xl:col-span-9',\n 10: 'xl:col-span-10',\n 11: 'xl:col-span-11',\n 12: 'xl:col-span-12',\n full: 'xl:col-span-full',\n} as const;\n\nexport const COL_SPAN_CLASSES_2XL = {\n 1: '2xl:col-span-1',\n 2: '2xl:col-span-2',\n 3: '2xl:col-span-3',\n 4: '2xl:col-span-4',\n 5: '2xl:col-span-5',\n 6: '2xl:col-span-6',\n 7: '2xl:col-span-7',\n 8: '2xl:col-span-8',\n 9: '2xl:col-span-9',\n 10: '2xl:col-span-10',\n 11: '2xl:col-span-11',\n 12: '2xl:col-span-12',\n full: '2xl:col-span-full',\n} as const;\n\n// ============================================\n// GAP (sin breakpoints)\n// ============================================\n// El gap del grid siempre es fijo, no cambia por breakpoint\nexport const GAP_CLASSES = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 7: 'gap-7',\n 8: 'gap-8',\n 9: 'gap-9',\n 10: 'gap-10',\n 11: 'gap-11',\n 12: 'gap-12',\n 14: 'gap-14',\n 16: 'gap-16',\n 20: 'gap-20',\n 24: 'gap-24',\n} as const;\n\n// ============================================\n// ORDER (con breakpoints)\n// ============================================\n// Los campos SÍ pueden cambiar de orden según el breakpoint\nexport const ORDER_CLASSES = {\n 1: 'order-1',\n 2: 'order-2',\n 3: 'order-3',\n 4: 'order-4',\n 5: 'order-5',\n 6: 'order-6',\n 7: 'order-7',\n 8: 'order-8',\n 9: 'order-9',\n 10: 'order-10',\n 11: 'order-11',\n 12: 'order-12',\n first: 'order-first',\n last: 'order-last',\n none: 'order-none',\n} as const;\n\nexport const ORDER_CLASSES_SM = {\n 1: 'sm:order-1',\n 2: 'sm:order-2',\n 3: 'sm:order-3',\n 4: 'sm:order-4',\n 5: 'sm:order-5',\n 6: 'sm:order-6',\n 7: 'sm:order-7',\n 8: 'sm:order-8',\n 9: 'sm:order-9',\n 10: 'sm:order-10',\n 11: 'sm:order-11',\n 12: 'sm:order-12',\n first: 'sm:order-first',\n last: 'sm:order-last',\n none: 'sm:order-none',\n} as const;\n\nexport const ORDER_CLASSES_MD = {\n 1: 'md:order-1',\n 2: 'md:order-2',\n 3: 'md:order-3',\n 4: 'md:order-4',\n 5: 'md:order-5',\n 6: 'md:order-6',\n 7: 'md:order-7',\n 8: 'md:order-8',\n 9: 'md:order-9',\n 10: 'md:order-10',\n 11: 'md:order-11',\n 12: 'md:order-12',\n first: 'md:order-first',\n last: 'md:order-last',\n none: 'md:order-none',\n} as const;\n\nexport const ORDER_CLASSES_LG = {\n 1: 'lg:order-1',\n 2: 'lg:order-2',\n 3: 'lg:order-3',\n 4: 'lg:order-4',\n 5: 'lg:order-5',\n 6: 'lg:order-6',\n 7: 'lg:order-7',\n 8: 'lg:order-8',\n 9: 'lg:order-9',\n 10: 'lg:order-10',\n 11: 'lg:order-11',\n 12: 'lg:order-12',\n first: 'lg:order-first',\n last: 'lg:order-last',\n none: 'lg:order-none',\n} as const;\n\nexport const ORDER_CLASSES_XL = {\n 1: 'xl:order-1',\n 2: 'xl:order-2',\n 3: 'xl:order-3',\n 4: 'xl:order-4',\n 5: 'xl:order-5',\n 6: 'xl:order-6',\n 7: 'xl:order-7',\n 8: 'xl:order-8',\n 9: 'xl:order-9',\n 10: 'xl:order-10',\n 11: 'xl:order-11',\n 12: 'xl:order-12',\n first: 'xl:order-first',\n last: 'xl:order-last',\n none: 'xl:order-none',\n} as const;\n\nexport const ORDER_CLASSES_2XL = {\n 1: '2xl:order-1',\n 2: '2xl:order-2',\n 3: '2xl:order-3',\n 4: '2xl:order-4',\n 5: '2xl:order-5',\n 6: '2xl:order-6',\n 7: '2xl:order-7',\n 8: '2xl:order-8',\n 9: '2xl:order-9',\n 10: '2xl:order-10',\n 11: '2xl:order-11',\n 12: '2xl:order-12',\n first: '2xl:order-first',\n last: '2xl:order-last',\n none: '2xl:order-none',\n} as const;\n\n// ============================================\n// HIDDEN (con breakpoints)\n// ============================================\n// Para ocultar campos según el breakpoint\nexport const HIDDEN_CLASSES = {\n default: 'hidden',\n sm: 'sm:hidden',\n md: 'md:hidden',\n lg: 'lg:hidden',\n xl: 'xl:hidden',\n '2xl': '2xl:hidden',\n} as const;\n\nexport const BLOCK_CLASSES = {\n default: 'block',\n sm: 'sm:block',\n md: 'md:block',\n lg: 'lg:block',\n xl: 'xl:block',\n '2xl': '2xl:block',\n} as const;\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\ntype Breakpoint = 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/**\n * Normalizes field layout configuration\n * @param layout - Field layout configuration object\n * @returns Normalized layout object or undefined\n */\nexport function normalizeFieldLayout(layout?: {\n columns?: Partial<Record<Breakpoint, number>>;\n order?: number | Partial<Record<Breakpoint, number>>;\n}):\n | {\n columns?: Partial<Record<Breakpoint, number>>;\n order?: number | Partial<Record<Breakpoint, number>>;\n }\n | undefined {\n if (!layout) return undefined;\n return layout;\n}\n\n/**\n * Helper para obtener clase de grid-cols (solo default)\n */\nexport function getGridColsClass(breakpoint: 'default', cols: number): string | undefined {\n if (cols < 1 || cols > 12) return undefined;\n return GRID_COLS_CLASSES[cols as keyof typeof GRID_COLS_CLASSES];\n}\n\n/**\n * Helper para obtener clase de col-span (con breakpoints)\n */\nexport function getColSpanClass(breakpoint: Breakpoint, span: number): string | undefined {\n if (span < 1 || span > 12) return undefined;\n\n switch (breakpoint) {\n case 'default':\n return COL_SPAN_CLASSES[span as keyof typeof COL_SPAN_CLASSES];\n case 'sm':\n return COL_SPAN_CLASSES_SM[span as keyof typeof COL_SPAN_CLASSES_SM];\n case 'md':\n return COL_SPAN_CLASSES_MD[span as keyof typeof COL_SPAN_CLASSES_MD];\n case 'lg':\n return COL_SPAN_CLASSES_LG[span as keyof typeof COL_SPAN_CLASSES_LG];\n case 'xl':\n return COL_SPAN_CLASSES_XL[span as keyof typeof COL_SPAN_CLASSES_XL];\n case '2xl':\n return COL_SPAN_CLASSES_2XL[span as keyof typeof COL_SPAN_CLASSES_2XL];\n default:\n return undefined;\n }\n}\n\n/**\n * Helper para obtener clase de gap (solo default)\n */\nexport function getGapClass(size: number): string | undefined {\n const validSizes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24];\n if (!validSizes.includes(size)) return undefined;\n return GAP_CLASSES[size as keyof typeof GAP_CLASSES];\n}\n\n/**\n * Helper para obtener clase de order (con breakpoints)\n */\nexport function getOrderClass(\n breakpoint: Breakpoint,\n order: number | 'first' | 'last' | 'none',\n): string | undefined {\n type OrderKey = keyof typeof ORDER_CLASSES;\n\n switch (breakpoint) {\n case 'default':\n return ORDER_CLASSES[order as OrderKey];\n case 'sm':\n return ORDER_CLASSES_SM[order as OrderKey];\n case 'md':\n return ORDER_CLASSES_MD[order as OrderKey];\n case 'lg':\n return ORDER_CLASSES_LG[order as OrderKey];\n case 'xl':\n return ORDER_CLASSES_XL[order as OrderKey];\n case '2xl':\n return ORDER_CLASSES_2XL[order as OrderKey];\n default:\n return undefined;\n }\n}\n\n/**\n * Convierte píxeles a rem (asumiendo base 16px)\n */\nexport function pxToRem(px: number): number {\n return px / 16;\n}\n\n/**\n * Genera las clases CSS para el grid del formulario\n */\nexport function getFormGridClass(layout?: {\n mode?: 'manual' | 'auto';\n columns?: number;\n gap?: number;\n minFieldWidth?: number;\n}): { className: string; style: React.CSSProperties } {\n const classes: string[] = ['grid'];\n const style: React.CSSProperties = {};\n\n if (!layout) {\n // Default: modo manual con 1 columna\n classes.push('grid-cols-1');\n classes.push('gap-4');\n return { className: classes.join(' '), style };\n }\n\n // Gap (siempre fijo) - Si gap es 0, no agregar clase\n const gapValue = layout.gap ?? 4;\n if (gapValue > 0) {\n const gapClass = getGapClass(gapValue);\n if (gapClass) {\n classes.push(gapClass);\n }\n }\n\n if (layout.mode === 'auto') {\n // Modo auto: usa inline styles con gridTemplateColumns\n // NO usamos clases dinámicas de Tailwind porque no se detectan en build time\n const minWidth = layout.minFieldWidth ?? 240;\n const minRem = pxToRem(minWidth);\n const maxColumns = layout.columns;\n\n if (maxColumns && maxColumns > 0) {\n // Con límite de columnas: usar auto-fit con max() para respetar tanto el mínimo como el máximo\n // El truco es calcular el ancho máximo por columna considerando los gaps\n const gapValue = layout.gap ?? 4;\n const gapRem = gapValue * 0.25; // 1 gap unit = 0.25rem (4px en Tailwind)\n\n // Calcular el ancho máximo por columna: (100% - gaps) / maxColumns\n // Para 8 columnas con gap-4: (100% - 7 * 1rem) / 8\n const gapsTotal = gapRem * (maxColumns - 1);\n const maxWidthPerColumn = `calc((100% - ${gapsTotal}rem) / ${maxColumns})`;\n\n // Usar max() para tomar el mayor entre el mínimo y el máximo calculado\n // Esto asegura que las columnas nunca sean más pequeñas que minWidth\n // ni más grandes que maxWidthPerColumn\n style.gridTemplateColumns = `repeat(auto-fit, minmax(max(${minRem}rem, ${maxWidthPerColumn}), 1fr))`;\n } else {\n // Sin límite de columnas: usar auto-fit para que cree tantas columnas como quepan\n style.gridTemplateColumns = `repeat(auto-fit, minmax(${minRem}rem, 1fr))`;\n }\n } else {\n // Modo manual: usa grid fijo\n const columns = layout.columns ?? 1;\n const colsClass = getGridColsClass('default', columns);\n if (colsClass) {\n classes.push(colsClass);\n }\n }\n\n return { className: classes.join(' '), style };\n}\n\n/**\n * Genera las clases CSS para un campo individual\n */\nexport function getFieldClass(\n formLayout?: { mode?: 'manual' | 'auto'; columns?: number },\n fieldLayout?: {\n columns?: Partial<Record<Breakpoint, number>>;\n order?: number | Partial<Record<Breakpoint, number>>;\n },\n): string {\n // En modo auto, col-span no funciona porque el grid es dinámico (auto-fit)\n // Solo aplicar col-span en modo manual (grid fijo)\n if (formLayout?.mode === 'auto') {\n return '';\n }\n\n // Si no hay fieldLayout o columns definido, usar 1 columna por defecto\n if (!fieldLayout || !fieldLayout.columns) {\n return 'col-span-1';\n }\n\n const classes: string[] = [];\n const fieldColumns = fieldLayout.columns;\n\n // Orden de breakpoints para cascada (de menor a mayor)\n const breakpointOrder: Breakpoint[] = ['default', 'sm', 'md', 'lg', 'xl', '2xl'];\n\n // Generar clases de col-span por breakpoint con cascada de Tailwind\n // Solo generar clases cuando el valor cambia respecto al breakpoint anterior\n let prevCols: number | undefined;\n\n breakpointOrder.forEach((bp) => {\n // Obtener el valor para este breakpoint (si existe) o usar el anterior (cascada)\n const currentCols = fieldColumns[bp] ?? prevCols;\n\n // Si no hay valor, saltar este breakpoint\n if (currentCols === undefined || currentCols < 1 || currentCols > 12) {\n return;\n }\n\n // Solo generar clase si el valor cambió respecto al breakpoint anterior\n // (Tailwind ya hace cascada automáticamente)\n if (currentCols !== prevCols) {\n // Usar col-span numérico directo\n // col-span-full solo si explícitamente es 12 o mayor\n const spanClass = getColSpanClass(bp, currentCols);\n if (spanClass) {\n classes.push(spanClass);\n }\n prevCols = currentCols;\n }\n });\n\n // Orden (soporta número fijo o responsive por breakpoint)\n if (fieldLayout.order !== undefined) {\n if (typeof fieldLayout.order === 'number') {\n // Orden fijo\n const orderClass = getOrderClass('default', fieldLayout.order);\n if (orderClass) {\n classes.push(orderClass);\n }\n } else {\n // Orden responsive por breakpoint\n (Object.entries(fieldLayout.order) as [Breakpoint, number][]).forEach(([bp, orderValue]) => {\n const orderClass = getOrderClass(bp, orderValue);\n if (orderClass) {\n classes.push(orderClass);\n }\n });\n }\n }\n\n return classes.join(' ');\n}\n\n/**\n * Genera clases de hidden responsive\n */\nexport function getHiddenClasses(\n hidden?: Partial<Record<Breakpoint, 'visible' | 'hidden'>>,\n): string {\n if (!hidden) return '';\n\n const classes: string[] = [];\n\n // Para cada breakpoint, si está \"hidden\" agregar la clase hidden\n // Si está \"visible\", agregar la clase block para contrarrestar el hidden anterior\n (Object.entries(hidden) as [Breakpoint, 'visible' | 'hidden'][]).forEach(([bp, visibility]) => {\n if (visibility === 'hidden') {\n classes.push(HIDDEN_CLASSES[bp]);\n } else if (visibility === 'visible') {\n classes.push(BLOCK_CLASSES[bp]);\n }\n });\n return classes.join(' ');\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const inputVariantsConfig = {\n variants: {\n size: {\n xs: 'h-6 px-2 text-xs',\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-3 py-2 text-base', // Tamaño base de ShadCN UI\n lg: 'h-12 px-4 text-lg',\n xl: 'h-14 px-4 text-xl',\n },\n },\n defaultVariants: {\n size: 'md' as const,\n },\n} as const;\n\nexport const textareaVariantsConfig = {\n variants: {\n size: {\n xs: 'px-2 text-xs',\n sm: 'px-3 text-sm',\n md: 'px-3 py-2 text-base', // Tamaño base de ShadCN UI\n lg: 'px-4 text-lg',\n xl: 'px-4 text-xl',\n },\n },\n defaultVariants: {\n size: 'md' as const,\n },\n} as const;\n\nexport const inputVariants = cva(\n 'flex w-full rounded-md border border-input bg-background ring-offset-background file:border-0 file:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n inputVariantsConfig,\n);\n\nexport const textareaVariants = cva(\n 'flex w-full rounded-md border border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n textareaVariantsConfig,\n);\n\nexport const iconVariantsConfig = {\n variants: {\n size: {\n xs: 'absolute h-3 w-3 top-1.5 right-1.5',\n sm: 'absolute h-4 w-4 top-2 right-2',\n md: 'absolute h-5 w-5 top-2.5 right-2.5',\n lg: 'absolute h-6 w-6 top-3 right-3',\n xl: 'absolute h-7 w-7 top-3.5 right-3.5',\n },\n },\n defaultVariants: {\n size: 'md' as const,\n },\n} as const;\n\nexport const iconVariants = cva('', iconVariantsConfig);\n\n// Extraer el tipo para la propiedad 'size'\nexport type InputSize = VariantProps<typeof inputVariants>['size'];\n","import React from 'react';\nimport { Icon } from '@iconify/react';\nimport type { ReactNode } from 'react';\n\n/**\n * Helper para renderizar iconos\n * @param icon - Puede ser un string (nombre de icono) o un elemento React\n * @param props - Props opcionales para el icono (className, etc)\n * @returns El elemento React correspondiente al icono\n */\nexport const getIcon = (icon: ReactNode, props?: Record<string, unknown>): ReactNode => {\n if (typeof icon === 'string') {\n return <Icon icon={icon} {...props} />;\n }\n return React.cloneElement(icon as React.ReactElement, props);\n};\n","import React, { type ReactNode } from 'react';\nimport type { Control } from 'react-hook-form';\nimport { useComponents } from '../context/ComponentContext';\nimport type { FieldConfig } from '../types/fields';\n\n/**\n * ============================================\n * FIELD WRAPPER - Componente DRY para campos\n * ============================================\n *\n * Componente wrapper que encapsula la estructura común de todos los campos:\n * - FormField con render prop\n * - Field container con clases\n * - Label condicional\n * - FormControl\n * - HelperText condicional\n * - FieldError\n *\n * BENEFICIO: Elimina ~2500 líneas de código duplicado en fieldRenderers.tsx\n */\n\n/**\n * Render callback parameters - uses looser types for compatibility\n * with different react-hook-form versions and FormField implementations\n */\ninterface FieldRenderParams {\n field: {\n value: unknown;\n onChange: (value: unknown) => void;\n onBlur: () => void;\n name: string;\n ref: React.Ref<unknown>;\n };\n fieldState: {\n invalid: boolean;\n isTouched: boolean;\n isDirty: boolean;\n isValidating: boolean;\n error?: { message?: string };\n };\n}\n\ninterface FieldWrapperProps {\n /** React-Hook-Form control */\n control: Control<Record<string, unknown>>;\n /** Field name (path) */\n name: string;\n /** Field configuration */\n fieldConfig: FieldConfig;\n /** Clase CSS para el Field container */\n formItemClassName: string;\n /** Función para renderizar el label */\n renderLabel: (label?: string) => ReactNode;\n /** Función para renderizar el icono del campo */\n renderFieldIcon: () => ReactNode;\n /** Función render que recibe field y fieldState */\n children: (params: FieldRenderParams) => ReactNode;\n}\n\n/**\n * Componente wrapper para campos de formulario.\n * Encapsula la estructura común de Field, Label, Control, Helper y Error.\n */\nexport const FieldWrapper: React.FC<FieldWrapperProps> = React.memo(\n ({ control, name, fieldConfig, formItemClassName, renderLabel, renderFieldIcon, children }) => {\n const { FormField, FormControl, Field, FieldDescription, FieldError } = useComponents();\n return (\n <FormField\n control={control}\n name={name}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={formItemClassName}>\n {renderFieldIcon()}\n {!fieldConfig.hideLabel && renderLabel(fieldConfig.label)}\n <FormControl>{children({ field, fieldState })}</FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n },\n);\n\nFieldWrapper.displayName = 'FieldWrapper';\n","import React from 'react';\nimport { MissingComponentFallback } from '../../components/MissingComponentFallback';\nimport type { ComponentRegistry } from '../../types/components';\n\n/**\n * Type for a list of component names to check\n */\nexport type ComponentCheck = (keyof ComponentRegistry)[];\n\n/**\n * Checks if all required components exist in the registry.\n * If any are missing, returns a MissingComponentFallback element.\n * If all exist, returns null (allowing the renderer to proceed).\n *\n * @param components - The component registry from context\n * @param requiredComponents - Array of component names to check\n * @param fieldName - Name of the field for error display\n * @param fieldType - Type of the field for error display\n * @param className - Optional className for layout (e.g., column span classes)\n * @returns React element with fallback UI if missing, null if all present\n *\n * @example\n * ```tsx\n * function renderTextField(fieldConfig, ctx) {\n * const missing = checkMissingComponents(\n * ctx.components,\n * ['Input', 'Label'],\n * ctx.common.name,\n * fieldConfig.type,\n * ctx.formItemClassName\n * );\n * if (missing) return missing;\n *\n * const { Input, Label } = ctx.components;\n * // ... rest of renderer\n * }\n * ```\n */\nexport function checkMissingComponents(\n components: Partial<ComponentRegistry>,\n requiredComponents: ComponentCheck,\n fieldName: string,\n fieldType: string,\n className?: string,\n): React.ReactElement | null {\n const missing: string[] = [];\n\n for (const componentName of requiredComponents) {\n if (!components[componentName]) {\n missing.push(componentName);\n }\n }\n\n if (missing.length > 0) {\n return (\n <MissingComponentFallback\n fieldName={fieldName}\n fieldType={fieldType}\n missingComponents={missing}\n className={className}\n />\n );\n }\n\n return null;\n}\n\n/**\n * Component guard for FieldWrapper-based renderers.\n * Checks for common field components plus specific ones.\n *\n * @param components - The component registry from context\n * @param specificComponents - Additional components specific to this field type\n * @param fieldName - Name of the field\n * @param fieldType - Type of the field\n * @param className - Optional className for layout (e.g., column span classes)\n */\nexport function checkFieldComponents(\n components: Partial<ComponentRegistry>,\n specificComponents: ComponentCheck,\n fieldName: string,\n fieldType: string,\n className?: string,\n): React.ReactElement | null {\n // FieldWrapper uses FormField, FormControl, Field, FieldDescription, FieldError internally\n const baseComponents: ComponentCheck = [\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldDescription',\n 'FieldError',\n ];\n\n return checkMissingComponents(\n components,\n [...baseComponents, ...specificComponents],\n fieldName,\n fieldType,\n className,\n );\n}\n","import React from 'react';\nimport type { Control } from 'react-hook-form';\nimport type { FieldConfig } from '../../types/fields';\nimport { FieldWrapper } from '../FieldWrapper';\nimport { cn } from '../../lib/utils';\nimport { inputVariants, textareaVariants } from '../variants';\nimport type { RendererContext } from '../rendererTypes';\nimport { checkFieldComponents } from './componentGuard';\n\nexport function renderTextField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['Input'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Input } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <div className=\"relative\">\n <Input\n {...field}\n type={fieldConfig.type === 'text' ? 'text' : fieldConfig.type}\n placeholder={ctx.placeholder}\n className={cn(\n inputVariants({ size: fieldConfig.size }),\n fieldConfig.input_className,\n 'icon' in fieldConfig && fieldConfig.icon && 'pr-10',\n )}\n disabled={ctx.shouldDisable}\n readOnly={ctx.shouldReadOnly}\n value={\n ctx.getFieldValue(field, fieldConfig, 'string') as\n | string\n | number\n | readonly string[]\n | undefined\n }\n onChange={ctx.shouldReadOnly ? undefined : field.onChange}\n />\n {ctx.renderFieldIcon()}\n </div>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderTextareaField(\n fieldConfig: FieldConfig & { rows?: number; maxLength?: number },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['Textarea'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Textarea } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <div className=\"relative\">\n <Textarea\n placeholder={fieldConfig.placeholder}\n {...field}\n rows={fieldConfig.rows}\n maxLength={fieldConfig.maxLength}\n className={cn(\n textareaVariants({ size: fieldConfig.size }),\n fieldConfig.input_className,\n )}\n disabled={ctx.shouldDisable}\n readOnly={ctx.shouldReadOnly}\n value={\n ctx.getFieldValue(field, fieldConfig, 'string') as\n | string\n | number\n | readonly string[]\n | undefined\n }\n onChange={ctx.shouldReadOnly ? undefined : field.onChange}\n />\n {ctx.renderFieldIcon()}\n </div>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderInputGroupField(\n fieldConfig: FieldConfig & { prefix?: string; suffix?: string },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['Input'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Input } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <div className=\"flex items-center\">\n {fieldConfig.prefix && (\n <span className=\"inline-flex items-center rounded-l-md border border-r-0 border-input bg-muted px-3 text-sm text-muted-foreground\">\n {fieldConfig.prefix}\n </span>\n )}\n <Input\n {...field}\n type=\"text\"\n placeholder={fieldConfig.placeholder || ctx.placeholder}\n className={cn(\n inputVariants({ size: fieldConfig.size }),\n fieldConfig.input_className,\n fieldConfig.prefix && 'rounded-l-none',\n fieldConfig.suffix && 'rounded-r-none',\n )}\n disabled={ctx.shouldDisable}\n readOnly={ctx.shouldReadOnly}\n value={\n ctx.getFieldValue(field, fieldConfig, 'string') as\n | string\n | number\n | readonly string[]\n | undefined\n }\n onChange={ctx.shouldReadOnly ? undefined : field.onChange}\n />\n {fieldConfig.suffix && (\n <span className=\"inline-flex items-center rounded-r-md border border-l-0 border-input bg-muted px-3 text-sm text-muted-foreground\">\n {fieldConfig.suffix}\n </span>\n )}\n </div>\n )}\n </FieldWrapper>\n );\n}\n","import React, { useState, type ReactNode } from 'react';\nimport type { Control } from 'react-hook-form';\nimport { ChevronsUpDownIcon } from 'lucide-react';\nimport type { FieldConfig } from '../../types/fields';\nimport { FieldWrapper } from '../FieldWrapper';\nimport { cn } from '../../lib/utils';\nimport { getIcon } from '../../utils/icon-helper';\nimport { COMMON_STRINGS } from '../constants';\nimport type { RendererContext } from '../rendererTypes';\nimport { checkFieldComponents, checkMissingComponents } from './componentGuard';\n\nexport function renderSelectField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['Select', 'SelectTrigger', 'SelectValue', 'SelectContent', 'SelectItem'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <Select\n onValueChange={fieldConfig.readOnly ? undefined : field.onChange}\n value={ctx.getFieldValue(field, fieldConfig, 'string') as string | undefined}\n disabled={ctx.shouldDisable}\n >\n <SelectTrigger className={cn('w-full', fieldConfig.input_className)}>\n <SelectValue placeholder={ctx.placeholder} />\n </SelectTrigger>\n <SelectContent>\n {ctx.optionsArray.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.icon && <div className=\"mr-2\">{getIcon(opt.icon)}</div>}\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderNativeSelectField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['NativeSelect'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { NativeSelect } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <NativeSelect\n value={ctx.getFieldValue(field, fieldConfig, 'string') as string | undefined}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {\n if (!ctx.shouldReadOnly) {\n field.onChange(e.target.value);\n }\n }}\n disabled={ctx.shouldDisable}\n className={cn('w-full', fieldConfig.input_className)}\n >\n <option value=\"\">{ctx.placeholder}</option>\n {ctx.optionsArray.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </NativeSelect>\n )}\n </FieldWrapper>\n );\n}\n\nfunction CommandPopover({\n common,\n fieldConfig,\n ctx,\n options,\n}: {\n common: { control: Control<Record<string, unknown>>; name: string };\n fieldConfig: FieldConfig;\n ctx: RendererContext;\n options: {\n options: Array<{ label: string; value: string; icon?: ReactNode }>;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n };\n}) {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n [\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldDescription',\n 'FieldError',\n 'Popover',\n 'PopoverTrigger',\n 'PopoverContent',\n 'Command',\n 'CommandInput',\n 'CommandList',\n 'CommandEmpty',\n 'CommandGroup',\n 'CommandItem',\n ],\n common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const {\n Button,\n FormField,\n FormControl,\n Field,\n FieldDescription,\n FieldError,\n Popover,\n PopoverTrigger,\n PopoverContent,\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n } = ctx.components;\n const [open, setOpen] = useState(false);\n return (\n <FormField\n {...common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {ctx.renderFieldIcon()}\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn('w-full justify-between', fieldConfig.input_className)}\n disabled={ctx.shouldDisable}\n >\n {field.value\n ? options.options.find((opt) => opt.value === field.value)?.label\n : options.placeholder || ctx.placeholder}\n <ChevronsUpDownIcon className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[--radix-popover-trigger-width] p-0\" align=\"start\">\n <Command>\n <CommandInput\n placeholder={\n options.searchPlaceholder || COMMON_STRINGS.COMMAND_SEARCH_PLACEHOLDER\n }\n />\n <CommandList>\n <CommandEmpty>{options.emptyText || COMMON_STRINGS.COMMAND_EMPTY}</CommandEmpty>\n <CommandGroup>\n {options.options.map((opt) => (\n <CommandItem\n key={opt.value}\n value={opt.value}\n onSelect={(currentValue: string) => {\n field.onChange(currentValue === field.value ? '' : currentValue);\n setOpen(false);\n }}\n >\n {opt.icon && <span className=\"mr-2\">{getIcon(opt.icon)}</span>}\n {opt.label}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderComboboxField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n const config = fieldConfig as {\n options: Array<{ label: string; value: string; icon?: ReactNode }>;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n };\n return (\n <CommandPopover common={ctx.common} fieldConfig={fieldConfig} ctx={ctx} options={config} />\n );\n}\n\nexport function renderCommandField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n const config = fieldConfig as {\n options: Array<{ label: string; value: string; icon?: ReactNode }>;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n };\n return (\n <CommandPopover common={ctx.common} fieldConfig={fieldConfig} ctx={ctx} options={config} />\n );\n}\n","/**\n * ============================================\n * CONSTANTS - Magic numbers and strings\n * ============================================\n *\n * Constantes extraídas para mejorar mantenibilidad\n */\n\n/**\n * Valores por defecto para campos de formulario\n */\nexport const FIELD_DEFAULTS = {\n /** Valor por defecto para slider min */\n SLIDER_MIN: 0,\n /** Valor por defecto para slider max */\n SLIDER_MAX: 100,\n /** Valor por defecto para slider step */\n SLIDER_STEP: 1,\n /** Valor por defecto para slider defaultValue */\n SLIDER_DEFAULT_VALUE: [0] as number[],\n /** Longitud por defecto para OTP */\n OTP_DEFAULT_LENGTH: 6,\n} as const;\n\n/**\n * Clases CSS comunes para componentes\n */\nexport const COMMON_CLASSES = {\n /** Clase para width completo */\n FULL_WIDTH: 'w-full',\n /** Clase para gap entre elementos */\n GAP_4: 'gap-4',\n /** Clase para padding right cuando hay icono */\n ICON_PADDING: 'pr-10',\n /** Clase para items center */\n ITEMS_CENTER: 'items-center',\n /** Clase para flex */\n FLEX: 'flex',\n /** Clase para space-x-2 */\n SPACE_X_2: 'space-x-2',\n} as const;\n\n/**\n * Mensajes y strings comunes\n */\nexport const COMMON_STRINGS = {\n /** Placeholder por defecto para daterange */\n DATERANGE_PLACEHOLDER: 'Select date range',\n /** Texto por defecto cuando no hay opciones en command */\n COMMAND_EMPTY: 'No option found.',\n /** Placeholder por defecto para búsqueda en command */\n COMMAND_SEARCH_PLACEHOLDER: 'Search...',\n} as const;\n\n/**\n * Configuraciones de loading/suspense\n */\nexport const SUSPENSE_CONFIG = {\n /** Fallback para date picker */\n DATE_FALLBACK: 'h-10 w-full animate-pulse rounded-md bg-muted',\n} as const;\n","import React from 'react';\nimport type { Control } from 'react-hook-form';\nimport type {\n FieldConfig,\n ButtonCardFieldProps,\n ButtonCheckboxFieldProps,\n ButtonRadioFieldProps,\n} from '../../types/fields';\nimport { FieldWrapper } from '../FieldWrapper';\nimport { cn } from '../../lib/utils';\nimport { getIcon } from '../../utils/icon-helper';\nimport type { RendererContext } from '../rendererTypes';\nimport { checkMissingComponents, checkFieldComponents } from './componentGuard';\n\nexport function renderCheckboxOrSwitch(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n const componentName = fieldConfig.type === 'checkbox' ? 'Checkbox' : 'Switch';\n\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n [componentName, 'FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Checkbox, Switch, FormField, FormControl, Field, FieldDescription, FieldError } =\n ctx.components;\n const ControlComponent = fieldConfig.type === 'checkbox' ? Checkbox : Switch;\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field\n data-invalid={!!fieldState.error}\n orientation=\"horizontal\"\n className={ctx.formItemClassName}\n >\n {ctx.renderFieldIcon()}\n <FormControl>\n <ControlComponent\n checked={ctx.getFieldValue(field, fieldConfig, 'boolean') as boolean | undefined}\n onCheckedChange={fieldConfig.readOnly ? undefined : field.onChange}\n className={cn(\n {\n 'h-6 w-6': fieldConfig.type === 'checkbox',\n },\n fieldConfig.input_className,\n )}\n disabled={ctx.shouldDisable}\n />\n </FormControl>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderRadioField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['RadioGroup', 'RadioGroupItem'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { RadioGroup, RadioGroupItem } = ctx.components;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <RadioGroup\n className={cn('flex gap-4', fieldConfig.input_className)}\n value={ctx.getFieldValue(field, fieldConfig, 'string') as string | undefined}\n onValueChange={fieldConfig.readOnly ? undefined : field.onChange}\n disabled={ctx.shouldDisable}\n >\n {ctx.optionsArray.map((opt) => (\n <div key={opt.value} className=\"flex items-center gap-3\">\n <RadioGroupItem value={opt.value} id={opt.value} />\n <label\n htmlFor={opt.value}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer\"\n >\n {opt.label}\n </label>\n {opt.icon && <div className=\"mr-2\">{getIcon(opt.icon)}</div>}\n </div>\n ))}\n </RadioGroup>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderButtonCardField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['Button', 'FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Button, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n const cardConfig = fieldConfig as ButtonCardFieldProps;\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <div className={ctx.optionsLayoutClasses}>\n {cardConfig.options.map((option) => {\n const isSelected = cardConfig.multiple\n ? ((field.value as unknown[]) || []).includes(option.value)\n : field.value === option.value;\n\n return (\n <Button\n key={option.value}\n type=\"button\"\n variant={isSelected ? 'default' : 'outline'}\n className={cn(\n 'w-full h-auto p-4 flex flex-col items-start text-left',\n isSelected && 'ring-2 ring-primary',\n )}\n onClick={() => {\n if (cardConfig.multiple) {\n const currentValue = (field.value as unknown[]) || [];\n const newValue = isSelected\n ? currentValue.filter((v: unknown) => v !== option.value)\n : [...currentValue, option.value];\n field.onChange(newValue);\n } else {\n field.onChange(option.value);\n }\n }}\n disabled={ctx.shouldDisable}\n >\n <div className=\"flex items-center gap-2\">\n {option.icon && <div className=\"mr-2\">{getIcon(option.icon)}</div>}\n {option.text && <span className=\"font-semibold\">{option.text}</span>}\n {option.description && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{option.description}</p>\n )}\n </div>\n </Button>\n );\n })}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderButtonCheckboxField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Button, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n const checkboxConfig = fieldConfig as ButtonCheckboxFieldProps;\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <div className={ctx.optionsLayoutClasses}>\n {checkboxConfig.options.map((option) => {\n const isSelected = ((field.value as unknown[]) || []).includes(option.value);\n return (\n <Button\n key={option.value}\n type=\"button\"\n variant={isSelected ? 'default' : 'outline'}\n className={cn('w-full justify-start', isSelected && 'ring-2 ring-primary')}\n onClick={() => {\n const currentValue = (field.value as unknown[]) || [];\n const newValue = isSelected\n ? currentValue.filter((v: unknown) => v !== option.value)\n : [...currentValue, option.value];\n field.onChange(newValue);\n }}\n disabled={ctx.shouldDisable}\n >\n <div className=\"flex items-center gap-2\">\n {option.icon && <div className=\"mr-2\">{getIcon(option.icon)}</div>}\n {option.label && <span>{option.label}</span>}\n </div>\n </Button>\n );\n })}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderButtonRadioField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Button, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n const radioConfig = fieldConfig as ButtonRadioFieldProps;\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <div className={ctx.optionsLayoutClasses}>\n {radioConfig.options.map((option) => {\n const isSelected = field.value === option.value;\n return (\n <Button\n key={option.value}\n type=\"button\"\n variant={isSelected ? 'default' : 'outline'}\n className={cn(\n 'w-full justify-start',\n isSelected && 'ring-2 ring-primary bg-primary/80',\n )}\n onClick={() => field.onChange(option.value)}\n disabled={ctx.shouldDisable}\n >\n <div className=\"flex items-center gap-2\">\n {option.icon && <div className=\"mr-2\">{getIcon(option.icon)}</div>}\n {option.label && <span>{option.label}</span>}\n </div>\n </Button>\n );\n })}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderCheckboxGroupField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['Checkbox', 'FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Checkbox, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n const groupConfig = fieldConfig as {\n options: Array<{ value: string; label: string; icon?: string }>;\n };\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <div className={ctx.optionsLayoutClasses}>\n {groupConfig.options.map((option) => {\n const isSelected = ((field.value as unknown[]) || []).includes(option.value);\n const checkboxId = `${ctx.common.name}-${option.value}`;\n return (\n <div key={option.value} className=\"flex items-center gap-3\">\n <Checkbox\n id={checkboxId}\n checked={isSelected}\n onCheckedChange={(checked) => {\n const currentValue = (field.value as unknown[]) || [];\n const newValue = checked\n ? [...currentValue, option.value]\n : currentValue.filter((v: unknown) => v !== option.value);\n field.onChange(newValue);\n }}\n disabled={ctx.shouldDisable}\n />\n <label\n htmlFor={checkboxId}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer\"\n >\n {option.label}\n </label>\n {option.icon && <div className=\"ml-2\">{getIcon(option.icon)}</div>}\n </div>\n );\n })}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n\nexport function renderSwitchGroupField(\n fieldConfig: FieldConfig,\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['Switch', 'FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Switch, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n const groupConfig = fieldConfig as {\n options: Array<{ value: string; label: string; icon?: string }>;\n };\n return (\n <FormField\n {...ctx.common}\n render={({ field, fieldState }) => (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n <FormControl>\n <div className={ctx.optionsLayoutClasses}>\n {groupConfig.options.map((option) => {\n const isSelected = ((field.value as unknown[]) || []).includes(option.value);\n const switchId = `${ctx.common.name}-${option.value}`;\n return (\n <div key={option.value} className=\"flex items-center gap-3\">\n <Switch\n id={switchId}\n checked={isSelected}\n onCheckedChange={(checked) => {\n const currentValue = (field.value as unknown[]) || [];\n const newValue = checked\n ? [...currentValue, option.value]\n : currentValue.filter((v: unknown) => v !== option.value);\n field.onChange(newValue);\n }}\n disabled={ctx.shouldDisable}\n />\n <label\n htmlFor={switchId}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer\"\n >\n {option.label}\n </label>\n {option.icon && <div className=\"ml-2\">{getIcon(option.icon)}</div>}\n </div>\n );\n })}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n )}\n />\n );\n}\n","import React, { Suspense, lazy } from 'react';\nimport type { DateRange } from 'react-day-picker';\nimport type { Control } from 'react-hook-form';\nimport type { FieldConfig } from '../../types/fields';\nimport { FieldWrapper } from '../FieldWrapper';\nimport { COMMON_STRINGS } from '../constants';\nimport type { RendererContext } from '../rendererTypes';\n\nconst DateRenderersLazy = lazy(() =>\n import('../DateRenderers').then((m) => ({ default: m.DateRenderers })),\n);\n\nexport function renderDateField(\n fieldConfig: FieldConfig & {\n dateType?: 'simple' | 'popover';\n showTime?: boolean;\n presets?: Array<{ label: string; value: number }>;\n },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <Suspense fallback={<div className=\"h-10 w-full animate-pulse rounded-md bg-muted\" />}>\n <DateRenderersLazy\n type={fieldConfig.dateType || 'popover'}\n value={ctx.getFieldValue(field, fieldConfig, 'date') as Date | undefined}\n onChange={ctx.shouldReadOnly ? undefined : field.onChange}\n disabled={ctx.shouldDisable}\n label={fieldConfig.label}\n placeholder={fieldConfig.placeholder}\n className={fieldConfig.input_className}\n showTime={fieldConfig.showTime}\n presets={fieldConfig.presets}\n />\n </Suspense>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderDateRangeField(\n fieldConfig: FieldConfig & { placeholder?: string },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => {\n const rangeValue = field.value as { from?: Date; to?: Date } | undefined;\n const dateRangeValue: DateRange | undefined = rangeValue\n ? rangeValue.from instanceof Date || rangeValue.to instanceof Date\n ? {\n from: rangeValue.from instanceof Date ? rangeValue.from : undefined,\n to: rangeValue.to instanceof Date ? rangeValue.to : undefined,\n }\n : undefined\n : undefined;\n\n return (\n <Suspense fallback={<div className=\"h-10 w-full animate-pulse rounded-md bg-muted\" />}>\n <DateRenderersLazy\n type=\"range\"\n value={dateRangeValue}\n onChange={\n ctx.shouldReadOnly\n ? undefined\n : (dateOrRange: Date | DateRange | undefined) => {\n const range = dateOrRange as DateRange | undefined;\n field.onChange(\n range\n ? {\n from: range.from,\n to: range.to,\n }\n : undefined,\n );\n }\n }\n disabled={ctx.shouldDisable}\n label={fieldConfig.label}\n placeholder={fieldConfig.placeholder || COMMON_STRINGS.DATERANGE_PLACEHOLDER}\n className={fieldConfig.input_className}\n />\n </Suspense>\n );\n }}\n </FieldWrapper>\n );\n}\n","import React from 'react';\nimport type { Control } from 'react-hook-form';\nimport { useFieldArray, useFormContext } from 'react-hook-form';\nimport type { FieldConfig } from '../../types/fields';\nimport { FieldWrapper } from '../FieldWrapper';\nimport { FIELD_DEFAULTS } from '../constants';\nimport type { RendererContext } from '../rendererTypes';\nimport { checkMissingComponents, checkFieldComponents } from './componentGuard';\n\nexport function renderSliderField(\n fieldConfig: FieldConfig & {\n defaultValue?: number[];\n max?: number;\n min?: number;\n step?: number;\n variant?: 'default' | 'range' | 'multi';\n orientation?: 'horizontal' | 'vertical';\n thumbCount?: number;\n showLabels?: boolean;\n showValue?: boolean;\n valueFormat?: string;\n },\n ctx: RendererContext,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkMissingComponents(\n ctx.components,\n ['Slider', 'FormField', 'FormControl', 'Field', 'FieldDescription', 'FieldError'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Slider, FormField, FormControl, Field, FieldDescription, FieldError } = ctx.components;\n\n const min = fieldConfig.min ?? FIELD_DEFAULTS.SLIDER_MIN;\n const max = fieldConfig.max ?? FIELD_DEFAULTS.SLIDER_MAX;\n const step = fieldConfig.step ?? FIELD_DEFAULTS.SLIDER_STEP;\n const variant = fieldConfig.variant ?? 'default';\n const orientation = fieldConfig.orientation ?? 'horizontal';\n const showLabels = fieldConfig.showLabels ?? true;\n const showValue = fieldConfig.showValue ?? true;\n const thumbCount = fieldConfig.thumbCount ?? 3;\n\n // Get initial default value based on variant\n const getDefaultValue = (): number[] => {\n if (fieldConfig.defaultValue) return fieldConfig.defaultValue;\n if (typeof fieldConfig.value === 'number') return [fieldConfig.value];\n\n switch (variant) {\n case 'range':\n return [min + (max - min) * 0.25, min + (max - min) * 0.75];\n case 'multi':\n // Distribute thumbs evenly\n return Array.from({ length: thumbCount }, (_, i) =>\n Math.round(min + ((max - min) * (i + 1)) / (thumbCount + 1)),\n );\n default:\n return [min + (max - min) * 0.5];\n }\n };\n\n const getSliderValue = (fieldValue: unknown): number[] => {\n if (Array.isArray(fieldValue)) return fieldValue as number[];\n if (typeof fieldValue === 'number') return [fieldValue];\n return getDefaultValue();\n };\n\n // Format value for display\n const formatValue = (val: number): string => {\n if (fieldConfig.valueFormat) {\n return fieldConfig.valueFormat.replace('{value}', String(val));\n }\n return String(val);\n };\n\n // Display value(s) based on variant\n const getDisplayValue = (values: number[]): string => {\n if (variant === 'range' && values.length >= 2) {\n return `${formatValue(values[0] ?? min)} - ${formatValue(values[1] ?? max)}`;\n }\n if (variant === 'multi') {\n return values.map((v) => formatValue(v)).join(', ');\n }\n return formatValue(values[0] ?? min);\n };\n\n const isVertical = orientation === 'vertical';\n\n return (\n <FormField\n control={ctx.common.control}\n name={ctx.common.name}\n render={({ field, fieldState }) => {\n const currentValues = getSliderValue(field.value);\n\n return (\n <Field data-invalid={!!fieldState.error} className={ctx.formItemClassName}>\n {ctx.renderFieldIcon()}\n <div\n className={\n isVertical\n ? 'flex flex-col items-center gap-2'\n : 'flex justify-between items-center mb-2'\n }\n >\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n {showValue && (\n <span className=\"text-sm text-primary font-bold\">\n {getDisplayValue(currentValues)}\n </span>\n )}\n </div>\n <FormControl>\n <div className={isVertical ? 'flex flex-col items-center h-44' : 'space-y-2'}>\n <Slider\n defaultValue={getDefaultValue()}\n max={max}\n min={min}\n step={step}\n value={currentValues}\n onValueChange={\n ctx.shouldReadOnly ? undefined : (val: number[]) => field.onChange(val)\n }\n disabled={ctx.shouldDisable}\n orientation={orientation}\n className={fieldConfig.input_className}\n />\n {showLabels && !isVertical && (\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n )}\n {showLabels && isVertical && (\n <div className=\"flex flex-col justify-between h-full text-xs text-muted-foreground mt-2\">\n <span>{formatValue(max)}</span>\n <span>{formatValue(min)}</span>\n </div>\n )}\n </div>\n </FormControl>\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={fieldState.error ? [{ message: fieldState.error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n );\n }}\n />\n );\n}\n\nexport function renderOtpField(\n fieldConfig: FieldConfig & { length?: number },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n // Check for missing components first\n const missing = checkFieldComponents(\n ctx.components,\n ['InputOTP', 'InputOTPGroup', 'InputOTPSlot'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { InputOTP, InputOTPGroup, InputOTPSlot } = ctx.components;\n const length = fieldConfig.length || FIELD_DEFAULTS.OTP_DEFAULT_LENGTH;\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => (\n <InputOTP\n maxLength={length}\n value={ctx.getFieldValue(field, fieldConfig, 'string') as string | undefined}\n onChange={(value: string) => {\n if (!ctx.shouldReadOnly) {\n field.onChange(value);\n }\n }}\n disabled={ctx.shouldDisable}\n containerClassName={fieldConfig.input_className}\n >\n <InputOTPGroup>\n {Array.from({ length }).map((_, index) => (\n <InputOTPSlot key={index} index={index} />\n ))}\n </InputOTPGroup>\n </InputOTP>\n )}\n </FieldWrapper>\n );\n}\n\nexport function renderRepeaterField(\n fieldConfig: FieldConfig & {\n itemFields: Record<string, FieldConfig>;\n minItems?: number;\n maxItems?: number;\n addLabel?: string;\n removeLabel?: string;\n },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n renderSubField: (\n control: Control<Record<string, unknown>>,\n fieldName: string,\n fieldConfig: FieldConfig,\n className?: string,\n ) => React.ReactNode,\n): React.ReactElement | null {\n const missing = checkMissingComponents(\n ctx.components,\n ['Button', 'Field', 'FieldDescription', 'FieldError'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Button, Field, FieldDescription, FieldError, FormField } = ctx.components;\n const minItems = fieldConfig.minItems ?? 0;\n const maxItems = fieldConfig.maxItems;\n const addLabel = fieldConfig.addLabel ?? 'Add item';\n const removeLabel = fieldConfig.removeLabel ?? 'Remove';\n\n return (\n <FormField\n control={control}\n name={name}\n render={({ fieldState }) => (\n <RepeaterInner\n name={name}\n fieldConfig={fieldConfig}\n ctx={ctx}\n minItems={minItems}\n maxItems={maxItems}\n addLabel={addLabel}\n removeLabel={removeLabel}\n renderSubField={renderSubField}\n Field={Field}\n FieldDescription={FieldDescription}\n FieldError={FieldError}\n Button={Button}\n error={fieldState.error}\n />\n )}\n />\n );\n}\n\n/**\n * Inner component that can call useFieldArray (must be inside FormProvider).\n */\nfunction RepeaterInner({\n name,\n fieldConfig,\n ctx,\n minItems,\n maxItems,\n addLabel,\n removeLabel,\n renderSubField,\n Field,\n FieldDescription,\n FieldError,\n Button,\n error,\n}: {\n name: string;\n fieldConfig: FieldConfig & { itemFields: Record<string, FieldConfig> };\n ctx: RendererContext;\n minItems: number;\n maxItems?: number;\n addLabel: string;\n removeLabel: string;\n renderSubField: (\n control: Control<Record<string, unknown>>,\n fieldName: string,\n fieldConfig: FieldConfig,\n className?: string,\n ) => React.ReactNode;\n Field: React.ComponentType<any>;\n FieldDescription: React.ComponentType<any>;\n FieldError: React.ComponentType<any>;\n Button: React.ComponentType<any>;\n error?: { message?: string };\n}): React.ReactElement {\n const { control } = useFormContext();\n const { fields, append, remove } = useFieldArray({\n control: control as Control<Record<string, unknown[]>>,\n name: name as never,\n });\n\n const canAdd = !maxItems || fields.length < maxItems;\n const canRemove = fields.length > minItems;\n\n // Build default item from itemFields\n const defaultItem: Record<string, unknown> = {};\n for (const [key, cfg] of Object.entries(fieldConfig.itemFields)) {\n defaultItem[key] = cfg.value ?? '';\n }\n\n return (\n <Field data-invalid={!!error} className={ctx.formItemClassName}>\n {!fieldConfig.hideLabel && ctx.renderLabel(fieldConfig.label)}\n\n <div className=\"space-y-3\">\n {fields.map((item, index) => (\n <div key={item.id} className=\"relative flex items-start gap-3 rounded-md border p-3\">\n <div className=\"flex-1 grid grid-cols-1 gap-3\">\n {Object.entries(fieldConfig.itemFields).map(([subName, subConfig]) =>\n renderSubField(\n control as Control<Record<string, unknown>>,\n `${name}.${index}.${subName}`,\n subConfig,\n ),\n )}\n </div>\n {canRemove && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => remove(index)}\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n >\n {removeLabel}\n </Button>\n )}\n </div>\n ))}\n </div>\n\n {canAdd && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => append(defaultItem)}\n className=\"mt-2\"\n >\n {addLabel}\n </Button>\n )}\n\n {fieldConfig.helperText && (\n <FieldDescription className={fieldConfig.helper_className}>\n {fieldConfig.helperText}\n </FieldDescription>\n )}\n <FieldError\n errors={error ? [{ message: error.message }] : undefined}\n className={fieldConfig.error_className}\n />\n </Field>\n );\n}\n\nexport function renderFileField(\n fieldConfig: FieldConfig & {\n accept?: string;\n multiple?: boolean;\n maxSize?: number;\n },\n ctx: RendererContext,\n control: Control<Record<string, unknown>>,\n name: string,\n): React.ReactElement | null {\n const missing = checkFieldComponents(\n ctx.components,\n ['Input'],\n name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n return (\n <FieldWrapper\n control={control}\n name={name}\n fieldConfig={fieldConfig}\n formItemClassName={ctx.formItemClassName}\n renderLabel={ctx.renderLabel}\n renderFieldIcon={ctx.renderFieldIcon}\n >\n {({ field }) => {\n const fileList = field.value as FileList | File[] | undefined;\n const fileNames = fileList\n ? Array.from(fileList)\n .map((f) => f.name)\n .join(', ')\n : '';\n\n return (\n <div className=\"space-y-2\">\n <input\n type=\"file\"\n accept={fieldConfig.accept}\n multiple={fieldConfig.multiple}\n disabled={ctx.shouldDisable}\n className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${fieldConfig.input_className || ''}`}\n onChange={(e) => {\n if (ctx.shouldReadOnly) return;\n const files = e.target.files;\n if (fieldConfig.multiple) {\n field.onChange(files ? Array.from(files) : []);\n } else {\n field.onChange(files?.[0] ?? null);\n }\n }}\n />\n {fileNames && <p className=\"text-xs text-muted-foreground truncate\">{fileNames}</p>}\n </div>\n );\n }}\n </FieldWrapper>\n );\n}\n\nexport function renderHtmlField(\n fieldConfig: FieldConfig & { html?: string; content?: string },\n formItemClassName: string,\n): React.ReactElement | null {\n // Support multiple ways to provide HTML content:\n // 1. fieldConfig.html (legacy)\n // 2. fieldConfig.content (JSON config)\n // 3. fieldConfig.value (from .value() in FormBuilder)\n const htmlContent =\n fieldConfig.html || fieldConfig.content || (fieldConfig.value as string) || '';\n\n if (!htmlContent) {\n return null;\n }\n\n return (\n <div\n className={`${formItemClassName} ${fieldConfig.wrapper_className || ''}`}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n );\n}\n\nexport function renderButtonField(\n fieldConfig: FieldConfig & {\n type: 'button' | 'submit' | 'next' | 'back';\n variant?: string;\n size?: string;\n effect?: string;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n action?: () => void;\n loading?: boolean;\n },\n ctx: RendererContext,\n): React.ReactElement | null {\n const missing = checkMissingComponents(\n ctx.components,\n ['Button'],\n ctx.common.name,\n fieldConfig.type,\n ctx.formItemClassName,\n );\n if (missing) return missing;\n\n const { Button } = ctx.components;\n const {\n type,\n label,\n variant = 'default',\n size: originalSize = 'default',\n icon,\n iconPosition = 'left',\n action,\n loading,\n } = fieldConfig;\n\n const mapSize = (size: string) => {\n switch (size) {\n case 'xs':\n return 'xs';\n case 'sm':\n return 'sm';\n case 'md':\n return 'md';\n case 'lg':\n return 'lg';\n case 'xl':\n return 'xl';\n default:\n return 'md';\n }\n };\n const size = mapSize(originalSize);\n\n return (\n <div className={ctx.formItemClassName}>\n <Button\n type={type === 'submit' ? 'submit' : 'button'}\n variant={variant}\n size={size}\n disabled={ctx.shouldDisable || loading}\n onClick={action}\n >\n {loading && <>Loading...</>}\n {icon && iconPosition === 'left' && <span className=\"mr-2\">{icon}</span>}\n {label}\n {icon && iconPosition === 'right' && <span className=\"ml-2\">{icon}</span>}\n </Button>\n </div>\n );\n}\n","import type { FormButtons } from '../types/buttons';\nimport { getIcon } from '../utils/icon-helper';\n\nexport function useFormButtons(\n buttons: FormButtons = {},\n actions: {\n next?: { action: () => void };\n back?: { action: () => void };\n } = {},\n) {\n // Configuración por defecto para los botones\n const defaultButtons = {\n submit: {\n type: 'submit' as const,\n label: 'Enviar',\n variant: 'default' as const,\n size: 'default' as const,\n columns: { default: 1 },\n },\n next: {\n type: 'next' as const,\n label: 'Siguiente →',\n variant: 'outline' as const,\n size: 'default' as const,\n columns: { default: 1 },\n action: actions.next?.action,\n },\n back: {\n type: 'back' as const,\n label: '← Atrás',\n variant: 'ghost' as const,\n size: 'default' as const,\n columns: { default: 1 },\n action: actions.back?.action,\n },\n };\n\n // Combinar configuración por defecto con la personalizada\n const buttonConfigs = {\n submit: {\n ...defaultButtons.submit,\n ...buttons.submit,\n icon: buttons.submit?.icon ? getIcon(buttons.submit.icon) : undefined,\n },\n next: {\n ...defaultButtons.next,\n ...buttons.next,\n icon: buttons.next?.icon ? getIcon(buttons.next.icon) : undefined,\n },\n back: {\n ...defaultButtons.back,\n ...buttons.back,\n icon: buttons.back?.icon ? getIcon(buttons.back.icon) : undefined,\n },\n };\n\n return {\n buttonConfigs,\n };\n}\n","import type { FormLayout } from '../types/common';\nimport { getFormGridClass } from '../utils/tailwind-classes';\n\nexport function useFormLayout(layout?: FormLayout) {\n const gridStyle = getFormGridClass(layout);\n\n return {\n gridClassName: gridStyle.className,\n gridStyle: gridStyle.style,\n };\n}\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useEffect, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\nimport type { Fields, FormConfig, Steps } from '../types/common';\nimport { isZodSchema } from '../validation/guards';\nimport { compileValidationRules } from '../validation/compiler';\nimport { useFormSteps } from './useFormSteps';\nimport { useFormSubmit } from './useFormSubmit';\nimport { useFormValidation } from './useFormValidation';\nimport { useHiddenFieldResolvers } from './useHiddenFieldResolvers';\nimport { useComputedFields } from './useComputedFields';\n\nexport function useFormState({\n config: rawConfig,\n fields: rawFields,\n steps: rawSteps,\n}: {\n config: FormConfig;\n fields: Fields;\n steps?: Steps;\n}) {\n // ===== PLUGIN HOOK: transformConfig =====\n // Apply plugin config transformations before using the config\n const config = useMemo(() => {\n if (rawConfig.pluginManager) {\n return rawConfig.pluginManager.transformConfig(rawConfig);\n }\n return rawConfig;\n }, [rawConfig]);\n\n const fields = config.fields;\n const steps = config.steps;\n\n // Memoizar construcción del schema y defaultValues\n const { schemaShape, defaultValues } = useMemo(() => {\n const schema: Record<string, z.ZodTypeAny> = {};\n const defaults: Record<string, unknown> = {};\n\n for (const [name, cfg] of Object.entries(fields)) {\n // Hidden fields: accept any value, no user-facing validation\n if (cfg.type === 'hidden') {\n schema[name] = z.any();\n defaults[name] = '';\n continue;\n }\n // File fields: accept any value (File objects can't be validated with standard Zod)\n if (cfg.type === 'file') {\n schema[name] = z.any();\n defaults[name] = null;\n continue;\n }\n // Repeater fields: array of objects, validated as z.any() (sub-fields handle their own)\n if (cfg.type === 'repeater') {\n schema[name] = z.any();\n defaults[name] = cfg.value ?? [];\n continue;\n }\n if (cfg.schema) {\n let fieldSchema: z.ZodTypeAny = isZodSchema(cfg.schema)\n ? cfg.schema\n : compileValidationRules(cfg.schema, cfg.type);\n\n // ===== PLUGIN: custom validators (sync + async) =====\n // Chain plugin-registered validators via async superRefine.\n // zodResolver uses safeParseAsync so async refinements work natively.\n if (cfg.customValidators?.length && config.pluginManager) {\n const pm = config.pluginManager;\n const validatorNames = cfg.customValidators;\n fieldSchema = fieldSchema.superRefine(async (val, ctx) => {\n for (const validatorName of validatorNames) {\n const validatorFn = pm.getValidator(validatorName);\n if (validatorFn) {\n const result = await validatorFn(val, { fieldName: name, allValues: {} });\n if (typeof result === 'string') {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: result });\n } else if (result === false) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Validation \"${validatorName}\" failed`,\n });\n }\n }\n }\n });\n }\n\n schema[name] = fieldSchema;\n }\n defaults[name] =\n cfg.value ??\n (() => {\n switch (cfg.type) {\n case 'checkbox':\n case 'switch':\n return false;\n case 'checkbox-group':\n case 'switch-group':\n case 'button-checkbox':\n return [];\n case 'daterange':\n return { from: '', to: '' };\n default:\n return '';\n }\n })();\n }\n\n return { schemaShape: schema, defaultValues: defaults };\n }, [fields, config.pluginManager]);\n\n const methods = useForm({\n resolver: zodResolver(z.object(schemaShape)),\n defaultValues,\n });\n\n // ===== HIDDEN FIELD RESOLVERS =====\n useHiddenFieldResolvers(methods, fields);\n\n // ===== COMPUTED FIELDS =====\n useComputedFields(methods, fields);\n\n // ===== PLUGIN HOOK: onFormInit =====\n useEffect(() => {\n if (config.pluginManager) {\n config.pluginManager.executeHook('onFormInit', { formConfig: config });\n }\n // Solo ejecutar una vez al montar\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ===== PLUGIN HOOK: onFieldChange =====\n useEffect(() => {\n if (!config.pluginManager) return;\n\n const subscription = methods.watch((values, { name, type }) => {\n if (name && type === 'change') {\n config.pluginManager!.executeHook('onFieldChange', name, values[name], values);\n }\n });\n\n return () => subscription.unsubscribe();\n }, [config.pluginManager, methods]);\n\n // Si no hay steps, crear uno por defecto con todos los campos\n const stepsWithDefaults = useMemo(() => {\n if (!steps || Object.keys(steps).length === 0) {\n const allFields = Object.keys(fields);\n return {\n default: {\n id: 'default',\n fields: allFields,\n },\n };\n }\n return steps;\n }, [steps, fields]);\n\n const initialStep = config.initialStep ?? Object.keys(stepsWithDefaults)[0];\n if (!initialStep) {\n throw new Error('No steps defined in the form configuration');\n }\n\n if (!stepsWithDefaults[initialStep]) {\n throw new Error(`Initial step \"${initialStep}\" not found in steps configuration`);\n }\n\n const { currentStepId, stepHistory, nextStep, prevStep, isLastStep } = useFormSteps(\n stepsWithDefaults,\n initialStep,\n );\n\n // Validar que todos los campos referenciados en los pasos existen\n Object.entries(stepsWithDefaults).forEach(([stepId, step]) => {\n step.fields.forEach((fieldName) => {\n if (!fields[fieldName]) {\n throw new Error(\n `Field \"${fieldName}\" referenced in step \"${stepId}\" not found in fields configuration`,\n );\n }\n });\n });\n\n const { validateStep } = useFormValidation(methods, stepsWithDefaults, currentStepId);\n\n const {\n loading,\n submitted,\n error,\n handleSubmit,\n resetError,\n getSuccessMessage,\n getErrorMessage,\n } = useFormSubmit(methods, config);\n\n const validateAndNext = async (e?: React.MouseEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n const valid = await validateStep();\n\n if (valid) {\n const values = methods.getValues();\n const previousStepId = currentStepId;\n const hasNext = nextStep(values);\n\n if (hasNext) {\n // ===== PLUGIN HOOK: onStepChange =====\n if (config.pluginManager) {\n await config.pluginManager.executeHook('onStepChange', currentStepId, values);\n }\n\n // Ejecutar callback del usuario si existe\n if (config.onStepChange) {\n config.onStepChange(currentStepId);\n }\n } else {\n handleSubmit(values);\n }\n }\n };\n\n // Wrapper para prevStep con plugin hook\n const handlePrevStep = () => {\n const success = prevStep();\n\n if (success) {\n const values = methods.getValues();\n\n // ===== PLUGIN HOOK: onStepChange =====\n if (config.pluginManager) {\n config.pluginManager.executeHook('onStepChange', currentStepId, values);\n }\n\n // Ejecutar callback del usuario si existe\n if (config.onStepChange) {\n config.onStepChange(currentStepId);\n }\n }\n\n return success;\n };\n\n return {\n currentStepId,\n loading,\n submitted,\n error,\n methods,\n nextStep,\n prevStep: handlePrevStep,\n handleSubmit,\n validateAndNext,\n isLast: isLastStep(methods.getValues()),\n getSuccessMessage,\n getErrorMessage,\n resetError,\n stepHistory,\n };\n}\n","import type { z } from 'zod';\nimport type { ValidationRules } from '../types/validation';\n\n/**\n * Check if a schema value is a Zod schema instance.\n * Zod schemas have a `_def` property on their prototype.\n */\nexport function isZodSchema(schema: unknown): schema is z.ZodType {\n return (\n schema !== null && typeof schema === 'object' && '_def' in (schema as Record<string, unknown>)\n );\n}\n\n/**\n * Check if a schema value is a plain ValidationRules object (serializable JSON).\n */\nexport function isValidationRules(schema: unknown): schema is ValidationRules {\n return schema !== null && typeof schema === 'object' && !isZodSchema(schema);\n}\n","import { z } from 'zod';\nimport type { ValidationRules } from '../types/validation';\nimport { resolvePreset } from './presets';\n\n// ── Field type → Zod base type mapping ──────────────────────\n\nconst STRING_FIELD_TYPES = new Set([\n 'text',\n 'email',\n 'tel',\n 'textarea',\n 'url',\n 'password',\n 'otp',\n 'input-group',\n 'currency',\n 'combobox',\n 'command',\n 'select',\n 'radio',\n 'button-radio',\n 'native-select',\n]);\n\nconst NUMBER_FIELD_TYPES = new Set(['number', 'slider', 'range']);\n\nconst ARRAY_FIELD_TYPES = new Set([\n 'checkbox-group',\n 'switch-group',\n 'button-checkbox',\n 'button-card',\n]);\n\nconst BOOLEAN_FIELD_TYPES = new Set(['checkbox', 'switch']);\n\nconst DATE_FIELD_TYPES = new Set(['date', 'daterange']);\n\n// ── Format applicators ──────────────────────────────────────\n\nfunction applyFormat(\n schema: z.ZodString,\n format: ValidationRules['format'],\n message?: string,\n): z.ZodString {\n switch (format) {\n case 'email':\n return schema.email(message ?? 'Invalid email address');\n case 'url':\n return schema.url(message ?? 'Invalid URL');\n case 'uuid':\n return schema.uuid(message ?? 'Invalid UUID');\n case 'cuid':\n return schema.cuid(message ?? 'Invalid CUID');\n case 'emoji':\n return schema.emoji(message ?? 'Invalid emoji');\n default:\n return schema;\n }\n}\n\n// ── String schema builder ───────────────────────────────────\n\nfunction buildStringSchema(rules: ValidationRules): z.ZodTypeAny {\n let schema = z.string();\n\n if (rules.format) {\n schema = applyFormat(schema, rules.format, rules.formatMessage);\n }\n\n if (rules.minLength !== undefined) {\n schema = schema.min(\n rules.minLength,\n rules.minLengthMessage ?? `Minimum ${rules.minLength} characters`,\n );\n }\n\n if (rules.maxLength !== undefined) {\n schema = schema.max(\n rules.maxLength,\n rules.maxLengthMessage ?? `Maximum ${rules.maxLength} characters`,\n );\n }\n\n if (rules.pattern) {\n schema = schema.regex(new RegExp(rules.pattern), rules.patternMessage ?? 'Invalid format');\n }\n\n if (rules.required === false) {\n return schema.optional();\n }\n\n if (rules.required) {\n return schema.min(1, rules.requiredMessage ?? 'This field is required');\n }\n\n return schema;\n}\n\n// ── Number schema builder ───────────────────────────────────\n\nfunction buildNumberSchema(rules: ValidationRules): z.ZodTypeAny {\n let schema = z.number();\n\n if (rules.min !== undefined) {\n schema = schema.min(rules.min, rules.minMessage ?? `Must be at least ${rules.min}`);\n }\n\n if (rules.max !== undefined) {\n schema = schema.max(rules.max, rules.maxMessage ?? `Must be at most ${rules.max}`);\n }\n\n if (rules.integer) {\n schema = schema.int(rules.integerMessage ?? 'Must be a whole number');\n }\n\n if (rules.positive) {\n schema = schema.positive(rules.positiveMessage ?? 'Must be a positive number');\n }\n\n if (rules.required === false) {\n return schema.optional();\n }\n\n return schema;\n}\n\n// ── Array schema builder ────────────────────────────────────\n\nfunction buildArraySchema(rules: ValidationRules): z.ZodTypeAny {\n let schema = z.array(z.string());\n\n if (rules.minItems !== undefined) {\n schema = schema.min(\n rules.minItems,\n rules.minItemsMessage ?? `Select at least ${rules.minItems}`,\n );\n }\n\n if (rules.maxItems !== undefined) {\n schema = schema.max(\n rules.maxItems,\n rules.maxItemsMessage ?? `Select maximum ${rules.maxItems}`,\n );\n }\n\n if (rules.required === false) {\n return schema.optional();\n }\n\n return schema;\n}\n\n// ── Boolean schema builder ──────────────────────────────────\n\nfunction buildBooleanSchema(rules: ValidationRules): z.ZodTypeAny {\n const schema = z.boolean();\n\n if (rules.mustBeTrue) {\n return schema.refine((val) => val === true, {\n message: rules.mustBeTrueMessage ?? 'You must accept this',\n });\n }\n\n if (rules.required === false) {\n return schema.optional();\n }\n\n return schema;\n}\n\n// ── Date schema builder ─────────────────────────────────────\n\nfunction buildDateSchema(rules: ValidationRules): z.ZodTypeAny {\n const msg = rules.requiredMessage ?? 'This field is required';\n\n // Preprocess: coerce valid date strings/values to Date, empty/invalid to undefined.\n // This replaces z.coerce.date() so we can use z.date() with proper required_error.\n // z.coerce.date() turns \"\" → new Date(\"\") → Invalid Date with a generic error message.\n const toDate = (val: unknown): Date | undefined => {\n if (val === '' || val === undefined || val === null) return undefined;\n if (val instanceof Date) return isNaN(val.getTime()) ? undefined : val;\n if (typeof val === 'string' || typeof val === 'number') {\n const d = new Date(val);\n return isNaN(d.getTime()) ? undefined : d;\n }\n return undefined;\n };\n\n let inner: z.ZodTypeAny = z.date({ required_error: msg, invalid_type_error: msg });\n\n if (rules.minDate) {\n const minDate = new Date(rules.minDate);\n inner = (inner as z.ZodDate).min(minDate, rules.minDateMessage ?? 'Date is too early');\n }\n\n if (rules.maxDate) {\n const maxDate = new Date(rules.maxDate);\n inner = (inner as z.ZodDate).max(maxDate, rules.maxDateMessage ?? 'Date is too late');\n }\n\n if (rules.mustBeFuture) {\n inner = inner.refine((val: Date) => val > new Date(), {\n message: rules.mustBeFutureMessage ?? 'Date must be in the future',\n });\n }\n\n if (rules.mustBePast) {\n inner = inner.refine((val: Date) => val < new Date(), {\n message: rules.mustBePastMessage ?? 'Date must be in the past',\n });\n }\n\n if (rules.required === false) {\n return z.preprocess(toDate, inner.optional());\n }\n\n return z.preprocess(toDate, inner);\n}\n\n// ── Main compiler ───────────────────────────────────────────\n\n/**\n * Compile a serializable `ValidationRules` object into a Zod schema.\n *\n * @param rules - The declarative validation rules\n * @param fieldType - The field type (used to determine the base Zod type)\n * @returns A Zod schema ready for use with react-hook-form\n */\nexport function compileValidationRules(rules: ValidationRules, fieldType: string): z.ZodTypeAny {\n // 1. Resolve preset and merge (explicit rules override preset defaults)\n let mergedRules = rules;\n if (rules.preset) {\n const presetRules = resolvePreset(rules.preset);\n if (presetRules) {\n mergedRules = { ...presetRules, ...rules };\n }\n }\n\n // 2. Determine base type from field type and build schema\n if (STRING_FIELD_TYPES.has(fieldType)) {\n return buildStringSchema(mergedRules);\n }\n\n if (NUMBER_FIELD_TYPES.has(fieldType)) {\n return buildNumberSchema(mergedRules);\n }\n\n if (ARRAY_FIELD_TYPES.has(fieldType)) {\n return buildArraySchema(mergedRules);\n }\n\n if (BOOLEAN_FIELD_TYPES.has(fieldType)) {\n return buildBooleanSchema(mergedRules);\n }\n\n if (DATE_FIELD_TYPES.has(fieldType)) {\n return buildDateSchema(mergedRules);\n }\n\n // Fallback: string schema (safest default for unknown field types)\n return buildStringSchema(mergedRules);\n}\n","import type { ValidationRules } from '../types/validation';\n\nexport type ValidationPresetMeta = {\n id: string;\n label: string;\n description: string;\n category: 'string' | 'number' | 'array' | 'boolean' | 'date';\n rules: ValidationRules;\n};\n\n// ── Built-in presets (migrated from form-builder) ────────────\n\nconst BUILT_IN_PRESETS: ValidationPresetMeta[] = [\n {\n id: 'email',\n label: 'Email',\n description: 'Standard email format',\n category: 'string',\n rules: {\n format: 'email',\n formatMessage: 'Invalid email address',\n },\n },\n {\n id: 'phone-us',\n label: 'Phone (US)',\n description: 'US phone number (555-123-4567)',\n category: 'string',\n rules: {\n pattern: '^\\\\d{3}-\\\\d{3}-\\\\d{4}$',\n patternMessage: 'Format: 555-123-4567',\n minLength: 12,\n maxLength: 12,\n },\n },\n {\n id: 'phone-international',\n label: 'Phone (International)',\n description: 'International format (+1-555-123-4567)',\n category: 'string',\n rules: {\n pattern: '^\\\\+\\\\d{1,3}-\\\\d{3}-\\\\d{3}-\\\\d{4}$',\n patternMessage: 'Format: +1-555-123-4567',\n },\n },\n {\n id: 'url',\n label: 'URL',\n description: 'Valid web URL',\n category: 'string',\n rules: {\n format: 'url',\n formatMessage: 'Invalid URL format',\n },\n },\n {\n id: 'postal-code-us',\n label: 'ZIP Code (US)',\n description: 'US ZIP code (12345 or 12345-6789)',\n category: 'string',\n rules: {\n pattern: '^\\\\d{5}(-\\\\d{4})?$',\n patternMessage: 'Format: 12345 or 12345-6789',\n },\n },\n {\n id: 'postal-code-ca',\n label: 'Postal Code (Canada)',\n description: 'Canadian postal code (A1B 2C3)',\n category: 'string',\n rules: {\n pattern: '^[A-Z]\\\\d[A-Z] \\\\d[A-Z]\\\\d$',\n patternMessage: 'Format: A1B 2C3',\n },\n },\n {\n id: 'credit-card',\n label: 'Credit Card',\n description: 'Credit card number (1234-5678-9012-3456)',\n category: 'string',\n rules: {\n pattern: '^\\\\d{4}-\\\\d{4}-\\\\d{4}-\\\\d{4}$',\n patternMessage: 'Format: 1234-5678-9012-3456',\n minLength: 19,\n maxLength: 19,\n },\n },\n {\n id: 'password-simple',\n label: 'Password (Simple)',\n description: 'At least 8 characters',\n category: 'string',\n rules: {\n minLength: 8,\n minLengthMessage: 'Password must be at least 8 characters',\n },\n },\n {\n id: 'password-medium',\n label: 'Password (Medium)',\n description: '8+ chars, 1 uppercase, 1 lowercase, 1 number',\n category: 'string',\n rules: {\n minLength: 8,\n pattern: '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d).+$',\n patternMessage: 'Must contain at least 1 uppercase, 1 lowercase, and 1 number',\n },\n },\n {\n id: 'password-strong',\n label: 'Password (Strong)',\n description: '8+ chars, uppercase, lowercase, number, special char',\n category: 'string',\n rules: {\n minLength: 8,\n pattern: '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)(?=.*[@$!%*?&]).+$',\n patternMessage: 'Must contain uppercase, lowercase, number, and special character',\n },\n },\n {\n id: 'username',\n label: 'Username',\n description: 'Alphanumeric, underscore, 3-20 chars',\n category: 'string',\n rules: {\n pattern: '^[a-zA-Z0-9_]{3,20}$',\n patternMessage: '3-20 characters, letters, numbers, underscores only',\n minLength: 3,\n maxLength: 20,\n },\n },\n {\n id: 'slug',\n label: 'URL Slug',\n description: 'Lowercase, hyphens, alphanumeric',\n category: 'string',\n rules: {\n pattern: '^[a-z0-9]+(?:-[a-z0-9]+)*$',\n patternMessage: 'Lowercase letters, numbers, hyphens only',\n },\n },\n {\n id: 'hex-color',\n label: 'Hex Color',\n description: 'Hex color code (#RRGGBB)',\n category: 'string',\n rules: {\n pattern: '^#[0-9A-Fa-f]{6}$',\n patternMessage: 'Format: #RRGGBB (e.g., #FF5733)',\n minLength: 7,\n maxLength: 7,\n },\n },\n {\n id: 'ipv4',\n label: 'IPv4 Address',\n description: 'IP address (192.168.1.1)',\n category: 'string',\n rules: {\n pattern:\n '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',\n patternMessage: 'Invalid IP address format',\n },\n },\n {\n id: 'date-iso',\n label: 'Date (ISO)',\n description: 'ISO 8601 date (YYYY-MM-DD)',\n category: 'string',\n rules: {\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}$',\n patternMessage: 'Format: YYYY-MM-DD',\n },\n },\n {\n id: 'time-24h',\n label: 'Time (24h)',\n description: '24-hour time format (14:30)',\n category: 'string',\n rules: {\n pattern: '^([01]?[0-9]|2[0-3]):[0-5][0-9]$',\n patternMessage: 'Format: HH:MM (24-hour)',\n },\n },\n {\n id: 'ssn',\n label: 'SSN (US)',\n description: 'Social Security Number (123-45-6789)',\n category: 'string',\n rules: {\n pattern: '^\\\\d{3}-\\\\d{2}-\\\\d{4}$',\n patternMessage: 'Format: 123-45-6789',\n minLength: 11,\n maxLength: 11,\n },\n },\n {\n id: 'alpha-only',\n label: 'Letters Only',\n description: 'Alphabetic characters only',\n category: 'string',\n rules: {\n pattern: '^[a-zA-Z]+$',\n patternMessage: 'Letters only',\n },\n },\n {\n id: 'alphanumeric',\n label: 'Alphanumeric',\n description: 'Letters and numbers only',\n category: 'string',\n rules: {\n pattern: '^[a-zA-Z0-9]+$',\n patternMessage: 'Letters and numbers only',\n },\n },\n];\n\n// ── Mutable registry ────────────────────────────────────────\n\nconst presetRegistry = new Map<string, ValidationPresetMeta>(\n BUILT_IN_PRESETS.map((p) => [p.id, p]),\n);\n\n/**\n * Resolve a preset ID to its ValidationRules.\n * Returns `undefined` if the preset doesn't exist.\n */\nexport function resolvePreset(id: string): ValidationRules | undefined {\n return presetRegistry.get(id)?.rules;\n}\n\n/**\n * Register a custom validation preset at runtime.\n */\nexport function registerPreset(preset: ValidationPresetMeta): void {\n presetRegistry.set(preset.id, preset);\n}\n\n/**\n * Get all available presets (built-in + registered).\n */\nexport function getAvailablePresets(): ValidationPresetMeta[] {\n return Array.from(presetRegistry.values());\n}\n","import { useState } from 'react';\nimport type { Steps } from '../types/common';\nimport { evaluateStepCondition } from '../utils/stepUtils';\n\nexport function useFormSteps(steps: Steps, initialStepId: string) {\n const [currentStepId, setCurrentStepId] = useState(initialStepId);\n const [stepHistory, setStepHistory] = useState<string[]>([]);\n\n const getNextStep = (values: Record<string, unknown>): string | undefined => {\n const currentStep = steps[currentStepId];\n if (!currentStep) return undefined;\n\n // Si no hay condiciones definidas, usar defaultNext\n if (!currentStep.next || currentStep.next.length === 0) {\n return currentStep.defaultNext;\n }\n\n // Evaluar cada condición\n for (const stepCondition of currentStep.next) {\n const result = evaluateStepCondition(stepCondition, values);\n\n if (result) {\n return stepCondition.target;\n }\n }\n\n // Si ninguna condición se cumple, usar defaultNext\n return currentStep.defaultNext;\n };\n\n const nextStep = (values: Record<string, unknown>) => {\n const nextStepId = getNextStep(values);\n\n if (nextStepId && steps[nextStepId]) {\n setStepHistory((prev) => [...prev, currentStepId]);\n setCurrentStepId(nextStepId);\n return true;\n }\n return false;\n };\n\n const prevStep = () => {\n if (stepHistory.length > 0) {\n const previousStep = stepHistory[stepHistory.length - 1];\n if (previousStep) {\n setStepHistory((prev) => prev.slice(0, -1));\n setCurrentStepId(previousStep);\n return true;\n }\n }\n return false;\n };\n\n const isLastStep = (values: Record<string, unknown>): boolean => {\n const nextStepId = getNextStep(values);\n return !nextStepId || !steps[nextStepId];\n };\n\n return {\n currentStepId,\n stepHistory,\n nextStep,\n prevStep,\n isLastStep,\n getNextStep,\n };\n}\n","import { useCallback, useState } from 'react';\nimport { UseFormReturn } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport type { FormConfig } from '../types/common';\nimport type { SubmitActionsResult } from '../types/submitActions';\nimport { defaultSubmit } from '../utils/defaultSubmit';\nimport { applyFieldTransforms } from '../utils/fieldMapping';\nimport { getActionsByTrigger, executeSubmitActions } from '../utils/submitOrchestrator';\n\nexport function useFormSubmit(methods: UseFormReturn<Record<string, unknown>>, config: FormConfig) {\n const [loading, setLoading] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [submitActionsResult, setSubmitActionsResult] = useState<SubmitActionsResult | null>(null);\n\n const handleSubmit = async (data: Record<string, unknown>) => {\n setLoading(true);\n setError(null);\n setSubmitActionsResult(null);\n\n try {\n // ===== FIELD-LEVEL TRANSFORMS =====\n // Apply per-field transforms (trim, lowercase, dateISO, etc.) before plugins\n const fieldTransformed = applyFieldTransforms(config.fields, data);\n\n // ===== PLUGIN HOOK: transformValues =====\n // Apply plugin value transformations before submission (supports async)\n const processedValues = config.pluginManager\n ? await config.pluginManager.transformValues(fieldTransformed)\n : fieldTransformed;\n\n // ===== PLUGIN HOOK: onBeforeSubmit =====\n // Este hook es solo para validación previa, no modifica los valores\n if (config.pluginManager) {\n await config.pluginManager.executeHook('onBeforeSubmit', processedValues);\n }\n\n let responseData: unknown;\n\n // ===== NUEVO: Submit Actions (Sistema Modular) =====\n const onSubmitActions = getActionsByTrigger(config, 'onSubmit');\n\n if (onSubmitActions.length > 0) {\n // Usar el nuevo sistema modular de submit actions\n const result = await executeSubmitActions(onSubmitActions, processedValues, config);\n setSubmitActionsResult(result);\n\n // Si hubo errores y stopOnFirstError está activo, lanzar error\n if (!result.allSuccessful) {\n const failedAction = result.results.find((r) => !r.success);\n if (failedAction?.error) {\n throw failedAction.error;\n }\n }\n\n responseData = result;\n } else if (config.submit?.type === 'custom') {\n // Fallback: submit custom legacy\n responseData = await config.submit.onSubmit(processedValues);\n } else if (config.submit) {\n // Fallback: submit default legacy\n responseData = await defaultSubmit({ values: processedValues, config });\n }\n\n // ===== PLUGIN HOOK: onAfterSubmit =====\n if (config.pluginManager) {\n await config.pluginManager.executeHook('onAfterSubmit', processedValues, responseData);\n }\n\n setSubmitted(true);\n if (config.onSuccess) {\n config.onSuccess(processedValues);\n }\n\n // ===== REDIRECT =====\n if (config.redirect) {\n const url =\n typeof config.redirect === 'function'\n ? config.redirect(processedValues)\n : config.redirect;\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n\n // ===== PLUGIN HOOK: onError =====\n if (config.pluginManager) {\n await config.pluginManager.executeHook('onError', error, data);\n }\n\n setError(error);\n if (config.onError) {\n config.onError(error, data);\n }\n toast.error(error.message || 'Error al enviar el formulario');\n } finally {\n setLoading(false);\n }\n };\n\n const resetError = useCallback(() => setError(null), []);\n\n const getSuccessMessage = useCallback(() => {\n if (!config.successMessage) return '✅ ¡Gracias!';\n if (typeof config.successMessage === 'function') {\n return config.successMessage(methods.getValues());\n }\n return config.successMessage;\n }, [config.successMessage, methods]);\n\n const getErrorMessage = useCallback(() => {\n if (!config.errorMessage) return '❌ Ha ocurrido un error al enviar el formulario.';\n if (typeof config.errorMessage === 'function') {\n return config.errorMessage(error!, methods.getValues());\n }\n return config.errorMessage;\n }, [config.errorMessage, error, methods]);\n\n return {\n loading,\n submitted,\n error,\n submitActionsResult,\n handleSubmit,\n resetError,\n getSuccessMessage,\n getErrorMessage,\n };\n}\n","import { toast } from 'sonner';\nimport { FormConfig } from '../types/common';\nimport { SubmitConfig } from '../types/submit';\n\n// ── reCAPTCHA helper ──────────────────────────────────────────\nasync function getRecaptchaToken(config: SubmitConfig): Promise<string | undefined> {\n if (config.type === 'default' && config.recaptcha?.siteKey) {\n // Wait until grecaptcha is injected\n await new Promise<void>((resolve) => {\n const check = () => {\n if ((window as unknown as { grecaptcha?: unknown }).grecaptcha) resolve();\n else setTimeout(check, 100);\n };\n check();\n });\n return (\n window as unknown as {\n grecaptcha: {\n execute: (siteKey: string, options: { action: string }) => Promise<string>;\n };\n }\n ).grecaptcha.execute(config.recaptcha.siteKey, {\n action: config.recaptcha.action || 'submit',\n });\n }\n return undefined;\n}\n\n// ── Happy‑path Fastify submit (same as today) ─────────────────\nexport async function defaultSubmit({\n values,\n config,\n}: {\n values: Record<string, unknown>;\n config: FormConfig;\n}) {\n try {\n if (!config.submit) {\n throw new Error('Configuración de submit no encontrada');\n }\n\n const submitConfig = config.submit;\n\n if (submitConfig.type === 'custom') {\n await submitConfig.onSubmit(values);\n return;\n }\n\n if (!submitConfig.endpoint?.url) {\n throw new Error('Endpoint URL no configurado');\n }\n\n const token = await getRecaptchaToken(submitConfig);\n\n const res = await fetch(submitConfig.endpoint.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n clientId: submitConfig.endpoint.clientId || 'test',\n formId: config.formId,\n data: values,\n ...(token && { recaptchaToken: token }),\n }),\n });\n\n if (!res.ok) throw new Error('Network error');\n } catch (err) {\n // Solo loggear en desarrollo, no en producción\n if (process.env.NODE_ENV === 'development') {\n console.error('Error submitting form:', err);\n }\n toast.error('Error al enviar el formulario. Por favor, inténtalo de nuevo.');\n throw err; // Let caller handle toast if needed\n }\n}\n","import { UseFormReturn } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport type { Steps } from '../types/common';\n\nexport function useFormValidation(\n methods: UseFormReturn<Record<string, unknown>>,\n steps: Steps,\n currentStepId: string,\n) {\n const validateStep = async (): Promise<boolean> => {\n const currentStep = steps[currentStepId];\n if (!currentStep) return false;\n\n // Si no hay campos en el paso actual, la validación es exitosa\n if (!currentStep.fields || currentStep.fields.length === 0) {\n return true;\n }\n\n try {\n const valid = await methods.trigger(currentStep.fields as (keyof Record<string, unknown>)[], {\n shouldFocus: true,\n });\n\n if (!valid) {\n toast.error('Por favor, corrige los errores antes de continuar');\n }\n\n return valid;\n } catch {\n toast.error('Ha ocurrido un error al validar el paso');\n return false;\n }\n };\n\n return {\n validateStep,\n };\n}\n","import { useEffect } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport type { Fields } from '../types/common';\nimport type { HiddenFieldProps } from '../types/fields';\nimport { resolveValue } from '../utils/fieldMapping';\n\n/**\n * Resolves hidden field values at form init.\n * Filters fields with type 'hidden', runs their resolvers,\n * and sets the values via react-hook-form's setValue.\n */\nexport function useHiddenFieldResolvers(\n methods: UseFormReturn<Record<string, unknown>>,\n fields: Fields,\n) {\n useEffect(() => {\n const hiddenFields = Object.entries(fields).filter(([, cfg]) => cfg.type === 'hidden') as [\n string,\n HiddenFieldProps,\n ][];\n\n if (hiddenFields.length === 0) return;\n\n let cancelled = false;\n\n const resolve = async () => {\n const results = await Promise.all(\n hiddenFields.map(async ([name, cfg]) => ({\n name,\n value: await resolveValue(cfg.resolver),\n })),\n );\n\n if (cancelled) return;\n\n for (const { name, value } of results) {\n methods.setValue(name, value, { shouldDirty: false });\n }\n };\n\n resolve();\n\n return () => {\n cancelled = true;\n };\n }, [fields, methods]);\n}\n","import { useEffect, useMemo } from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\nimport type { Fields } from '../types/common';\n\n/**\n * useComputedFields\n *\n * Watches dependency fields and reactively updates computed field values.\n * Only runs when at least one field has a `computed` config.\n */\nexport function useComputedFields(\n methods: UseFormReturn<Record<string, unknown>>,\n fields: Fields,\n): void {\n // Collect fields with computed configs\n const computedEntries = useMemo(() => {\n const entries: Array<{\n name: string;\n dependsOn: string[];\n compute: (values: Record<string, unknown>) => unknown;\n }> = [];\n\n for (const [name, cfg] of Object.entries(fields)) {\n if (cfg.computed) {\n entries.push({\n name,\n dependsOn: cfg.computed.dependsOn,\n compute: cfg.computed.compute,\n });\n }\n }\n\n return entries;\n }, [fields]);\n\n // All dependency field names (deduplicated)\n const allDeps = useMemo(() => {\n const deps = new Set<string>();\n for (const entry of computedEntries) {\n for (const dep of entry.dependsOn) {\n deps.add(dep);\n }\n }\n return [...deps];\n }, [computedEntries]);\n\n useEffect(() => {\n if (computedEntries.length === 0) return;\n\n const subscription = methods.watch((_values, { name }) => {\n // Only recompute when a dependency field changes\n if (!name || !allDeps.includes(name)) return;\n\n const currentValues = methods.getValues();\n\n for (const entry of computedEntries) {\n if (entry.dependsOn.includes(name)) {\n const newValue = entry.compute(currentValues);\n const current = currentValues[entry.name];\n // Avoid unnecessary setValue calls\n if (newValue !== current) {\n methods.setValue(entry.name, newValue, { shouldDirty: false });\n }\n }\n }\n });\n\n // Run initial computation on mount\n const currentValues = methods.getValues();\n for (const entry of computedEntries) {\n const newValue = entry.compute(currentValues);\n methods.setValue(entry.name, newValue, { shouldDirty: false });\n }\n\n return () => subscription.unsubscribe();\n }, [computedEntries, allDeps, methods]);\n}\n","import { useEffect } from 'react';\nimport type { FormConfig } from '../types/common';\n\n/**\n * @deprecated Use `recaptchaPlugin()` instead. This hook only injects the script —\n * the plugin also handles token generation via `transformValues`.\n *\n * ```tsx\n * // Before (hook — only injects script, token must be handled manually):\n * useRecaptcha(config);\n *\n * // After (plugin — injects script AND adds token to submitted values):\n * import { recaptchaPlugin } from '@saastro/forms';\n * pm.register(recaptchaPlugin({ siteKey: '...' }));\n * ```\n */\nexport function useRecaptcha(config: FormConfig) {\n useEffect(() => {\n // Solo cargar reCAPTCHA si es necesario\n if (config.submit?.type === 'default' && config.submit.recaptcha?.siteKey) {\n const windowWithGrecaptcha = window as unknown as {\n grecaptcha?: unknown;\n };\n\n // Verificar si ya está cargado\n if (windowWithGrecaptcha.grecaptcha) return;\n\n // Verificar si el script ya existe en el DOM\n const existingScript = document.querySelector(`script[src*=\"recaptcha/api.js\"]`);\n if (existingScript) return;\n\n const script = document.createElement('script');\n script.src = `https://www.google.com/recaptcha/api.js?render=${config.submit.recaptcha.siteKey}`;\n script.async = true;\n script.defer = true;\n document.body.appendChild(script);\n\n return () => {\n // Solo remover si el script fue añadido por este efecto\n if (script.parentNode) {\n script.parentNode.removeChild(script);\n }\n };\n }\n }, [config.submit]);\n}\n","import { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport type { FormConfig, SubmitConfirmationConfig } from '../types/common';\nimport type { ButtonConfig } from '../types/buttons';\n\n/**\n * Estado interno del hook de confirmación\n */\ninterface ConfirmationState {\n /** true = esperando segundo click para confirmar */\n pendingConfirmation: boolean;\n /** true = ya se mostró la advertencia en esta sesión */\n confirmationShown: boolean;\n /** Lista de nombres de campos vacíos que generaron la advertencia */\n warningFields: string[];\n}\n\n/**\n * Props override para el botón durante advertencia\n */\ninterface ButtonOverrideProps {\n text?: string;\n variant?: ButtonConfig['variant'];\n effect?: ButtonConfig['effect'];\n}\n\n/**\n * Resultado del hook useSubmitConfirmation\n */\nexport interface UseSubmitConfirmationReturn {\n /** Hay campos opcionales vacíos que requieren confirmación? */\n needsConfirmation: boolean;\n /** Esperando segundo click para confirmar? */\n isAwaitingConfirmation: boolean;\n /** Campos vacíos detectados */\n warningFields: string[];\n /** Props para override del botón (text, variant, effect) */\n buttonProps: ButtonOverrideProps;\n /** Handler del click que intercepta y gestiona la confirmación */\n handleClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n /** Reset manual del estado de confirmación */\n resetConfirmation: () => void;\n}\n\n/**\n * Hook para manejar confirmación condicional de submit/navegación.\n *\n * Detecta si hay campos opcionales vacíos configurados y requiere\n * doble click para confirmar (primera vez muestra advertencia cambiando\n * el botón, segunda vez procede con la acción).\n *\n * @param config - Configuración del formulario\n * @param currentValues - Valores actuales del formulario (de methods.watch())\n * @param onProceed - Callback a ejecutar cuando se confirma o no hay advertencia\n * @param buttonType - Tipo de botón: \"submit\" o \"next\" (para aplicar según applyOn)\n * @returns Objeto con estado y handlers para gestionar la confirmación\n *\n * @example\n * ```tsx\n * const submitConfirmation = useSubmitConfirmation(\n * config,\n * methods.watch(),\n * () => methods.handleSubmit(onFormSubmit)(),\n * \"submit\"\n * );\n *\n * <ButtonPro\n * onClick={submitConfirmation.handleClick}\n * variant={submitConfirmation.isAwaitingConfirmation\n * ? submitConfirmation.buttonProps.variant\n * : \"default\"}\n * >\n * {submitConfirmation.isAwaitingConfirmation\n * ? submitConfirmation.buttonProps.text\n * : \"Submit\"}\n * </ButtonPro>\n * ```\n */\nexport function useSubmitConfirmation(\n config: FormConfig,\n currentValues: Record<string, unknown>,\n onProceed: () => void,\n buttonType: 'submit' | 'next' = 'submit',\n): UseSubmitConfirmationReturn {\n const [state, setState] = useState<ConfirmationState>({\n pendingConfirmation: false,\n confirmationShown: false,\n warningFields: [],\n });\n\n // Ref para timeout de reset automático\n const resetTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Limpiar timeout al desmontar\n useEffect(() => {\n return () => {\n if (resetTimeoutRef.current) {\n clearTimeout(resetTimeoutRef.current);\n }\n };\n }, []);\n\n // Determinar si aplicar confirmación según buttonType y applyOn\n const shouldApplyConfirmation = useMemo(() => {\n if (!config.submitConfirmation) return false;\n\n const { applyOn } = config.submitConfirmation;\n\n if (applyOn === 'both') return true;\n if (applyOn === 'submit' && buttonType === 'submit') return true;\n if (applyOn === 'steps' && buttonType === 'next') return true;\n\n return false;\n }, [config.submitConfirmation, buttonType]);\n\n // Detectar campos opcionales vacíos\n const emptyOptionalFields = useMemo(() => {\n if (!shouldApplyConfirmation || !config.submitConfirmation) {\n return [];\n }\n\n return config.submitConfirmation.optionalFields.filter((field) => {\n const value = currentValues[field.name];\n\n // Considerar vacío si:\n // - es undefined o null\n // - es string vacío\n // - es array vacío\n // - es objeto vacío\n if (value === undefined || value === null) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0)\n return true;\n\n return false;\n });\n }, [shouldApplyConfirmation, config.submitConfirmation, currentValues]);\n\n // Hay campos que requieren confirmación?\n const needsConfirmation = emptyOptionalFields.length > 0;\n\n // Si showOnce=true y ya se mostró, no mostrar de nuevo\n const showOnce =\n config.submitConfirmation?.showOnce !== undefined ? config.submitConfirmation.showOnce : true;\n const shouldShow =\n shouldApplyConfirmation && needsConfirmation && (!showOnce || !state.confirmationShown);\n\n // Handler del click\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!shouldShow) {\n // No hay advertencia, proceder directamente\n onProceed();\n return;\n }\n\n // Prevenir submit del form\n e.preventDefault();\n e.stopPropagation();\n\n if (!state.pendingConfirmation) {\n // PRIMER CLICK: Mostrar advertencia\n setState((prev) => ({\n ...prev,\n pendingConfirmation: true,\n warningFields: emptyOptionalFields.map((f) => f.name),\n }));\n\n // Limpiar timeout anterior si existe\n if (resetTimeoutRef.current) {\n clearTimeout(resetTimeoutRef.current);\n }\n\n // Reset automático después de resetDelay\n const delay = config.submitConfirmation?.buttonBehavior.resetDelay || 3000;\n resetTimeoutRef.current = setTimeout(() => {\n setState((prev) => ({\n ...prev,\n pendingConfirmation: false,\n }));\n resetTimeoutRef.current = null;\n }, delay);\n } else {\n // SEGUNDO CLICK: Confirmar y proceder\n setState((prev) => ({\n ...prev,\n pendingConfirmation: false,\n confirmationShown: true,\n }));\n\n // Limpiar timeout\n if (resetTimeoutRef.current) {\n clearTimeout(resetTimeoutRef.current);\n resetTimeoutRef.current = null;\n }\n\n // Proceder con la acción\n onProceed();\n }\n },\n [\n shouldShow,\n state.pendingConfirmation,\n emptyOptionalFields,\n config.submitConfirmation,\n onProceed,\n ],\n );\n\n // Props override para el botón\n const buttonProps: ButtonOverrideProps = useMemo(() => {\n if (!state.pendingConfirmation || !config.submitConfirmation) {\n return {};\n }\n\n return {\n text: config.submitConfirmation.buttonBehavior.warningText,\n variant: config.submitConfirmation.buttonBehavior.warningVariant,\n effect: config.submitConfirmation.buttonBehavior.warningEffect,\n };\n }, [state.pendingConfirmation, config.submitConfirmation]);\n\n // Reset manual\n const resetConfirmation = useCallback(() => {\n setState((prev) => ({\n ...prev,\n pendingConfirmation: false,\n }));\n\n if (resetTimeoutRef.current) {\n clearTimeout(resetTimeoutRef.current);\n resetTimeoutRef.current = null;\n }\n }, []);\n\n return {\n needsConfirmation: shouldShow,\n isAwaitingConfirmation: state.pendingConfirmation,\n warningFields: state.warningFields,\n buttonProps,\n handleClick,\n resetConfirmation,\n };\n}\n","/**\n * useSubmitActionTriggers\n *\n * Hook que maneja la ejecución automática de submit actions\n * basada en diferentes triggers (step change, field change, delay).\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport type { FormConfig } from '../types/common';\nimport type { SubmitActionsResult } from '../types/submitActions';\nimport {\n executeSubmitActionsByTrigger,\n getActionsByTrigger,\n getMinDelayMs,\n} from '../utils/submitOrchestrator';\n\ninterface UseSubmitActionTriggersOptions {\n /** Configuración del formulario */\n config: FormConfig;\n /** Función para obtener los valores actuales (evita re-renders por valores) */\n getValues: () => Record<string, unknown>;\n /** Step actual */\n currentStep: string;\n /** Callback cuando se ejecuta una acción */\n onActionExecuted?: (result: SubmitActionsResult) => void;\n /** Callback cuando hay un error */\n onActionError?: (error: Error, actionName: string) => void;\n /** Si los triggers están habilitados */\n enabled?: boolean;\n}\n\ninterface UseSubmitActionTriggersReturn {\n /** Ejecutar acciones para un cambio de campo específico */\n triggerFieldChange: (fieldName: string, value: unknown) => void;\n /** Ejecutar acciones para blur de un campo */\n triggerFieldBlur: (fieldName: string) => void;\n /** Ejecutar acciones manuales */\n triggerManual: (actionIds?: string[]) => Promise<SubmitActionsResult>;\n /** Verificar si hay acciones para un trigger específico */\n hasActionsForTrigger: (\n triggerType:\n | 'onSubmit'\n | 'onStepEnter'\n | 'onStepExit'\n | 'onFieldChange'\n | 'onFieldBlur'\n | 'onDelay'\n | 'manual',\n triggerValue?: string,\n ) => boolean;\n}\n\nexport function useSubmitActionTriggers({\n config,\n getValues,\n currentStep,\n onActionExecuted,\n onActionError,\n enabled = true,\n}: UseSubmitActionTriggersOptions): UseSubmitActionTriggersReturn {\n const previousStepRef = useRef<string | null>(null);\n const debounceTimersRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n const idleTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastActivityRef = useRef<number>(Date.now());\n\n // ─── Step Change Triggers ────────────────────────────────────────\n\n useEffect(() => {\n if (!enabled) return;\n\n const previousStep = previousStepRef.current;\n\n // Trigger onStepExit para el step anterior\n if (previousStep && previousStep !== currentStep) {\n const currentValues = getValues();\n executeSubmitActionsByTrigger(config, 'onStepExit', currentValues, previousStep)\n .then((result) => {\n if (!result.allSuccessful && onActionError) {\n const failedAction = result.results.find((r) => !r.success);\n if (failedAction?.error) {\n onActionError(failedAction.error, failedAction.actionName);\n }\n }\n onActionExecuted?.(result);\n })\n .catch((err) => {\n onActionError?.(err, 'onStepExit');\n });\n }\n\n // Trigger onStepEnter para el step actual\n if (currentStep && previousStep !== currentStep) {\n const currentValues = getValues();\n executeSubmitActionsByTrigger(config, 'onStepEnter', currentValues, currentStep)\n .then((result) => {\n if (!result.allSuccessful && onActionError) {\n const failedAction = result.results.find((r) => !r.success);\n if (failedAction?.error) {\n onActionError(failedAction.error, failedAction.actionName);\n }\n }\n onActionExecuted?.(result);\n })\n .catch((err) => {\n onActionError?.(err, 'onStepEnter');\n });\n }\n\n previousStepRef.current = currentStep;\n }, [currentStep, config, getValues, enabled, onActionExecuted, onActionError]);\n\n // ─── Idle/Delay Triggers ─────────────────────────────────────────\n\n useEffect(() => {\n if (!enabled) return;\n\n const minDelay = getMinDelayMs(config);\n if (minDelay === 0) return;\n\n const resetIdleTimer = () => {\n lastActivityRef.current = Date.now();\n\n if (idleTimerRef.current) {\n clearTimeout(idleTimerRef.current);\n }\n\n idleTimerRef.current = setTimeout(() => {\n executeSubmitActionsByTrigger(config, 'onDelay', getValues())\n .then((result) => {\n onActionExecuted?.(result);\n })\n .catch((err) => {\n onActionError?.(err, 'onDelay');\n });\n }, minDelay);\n };\n\n // Eventos que resetean el timer de inactividad\n const events = ['mousedown', 'keydown', 'touchstart', 'scroll'];\n events.forEach((event) => {\n window.addEventListener(event, resetIdleTimer, { passive: true });\n });\n\n // Iniciar timer\n resetIdleTimer();\n\n return () => {\n events.forEach((event) => {\n window.removeEventListener(event, resetIdleTimer);\n });\n if (idleTimerRef.current) {\n clearTimeout(idleTimerRef.current);\n }\n };\n }, [config, getValues, enabled, onActionExecuted, onActionError]);\n\n // ─── Field Change Trigger ────────────────────────────────────────\n\n const triggerFieldChange = useCallback(\n (fieldName: string, _value: unknown) => {\n if (!enabled) return;\n\n const actions = getActionsByTrigger(config, 'onFieldChange', fieldName);\n if (actions.length === 0) return;\n\n // Obtener debounce del primer action (o 300ms por defecto)\n const debounceMs = actions[0]?.trigger.debounceMs ?? 300;\n\n // Cancelar timer anterior para este campo\n const existingTimer = debounceTimersRef.current.get(fieldName);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Crear nuevo timer con debounce\n const timer = setTimeout(() => {\n executeSubmitActionsByTrigger(config, 'onFieldChange', getValues(), fieldName)\n .then((result) => {\n onActionExecuted?.(result);\n })\n .catch((err) => {\n onActionError?.(err, `onFieldChange:${fieldName}`);\n });\n\n debounceTimersRef.current.delete(fieldName);\n }, debounceMs);\n\n debounceTimersRef.current.set(fieldName, timer);\n },\n [config, getValues, enabled, onActionExecuted, onActionError],\n );\n\n // ─── Field Blur Trigger ──────────────────────────────────────────\n\n const triggerFieldBlur = useCallback(\n (fieldName: string) => {\n if (!enabled) return;\n\n executeSubmitActionsByTrigger(config, 'onFieldBlur', getValues(), fieldName)\n .then((result) => {\n if (result.results.length > 0) {\n onActionExecuted?.(result);\n }\n })\n .catch((err) => {\n onActionError?.(err, `onFieldBlur:${fieldName}`);\n });\n },\n [config, getValues, enabled, onActionExecuted, onActionError],\n );\n\n // ─── Manual Trigger ──────────────────────────────────────────────\n\n const triggerManual = useCallback(\n async (actionIds?: string[]): Promise<SubmitActionsResult> => {\n let actions = getActionsByTrigger(config, 'manual');\n\n // Filtrar por IDs específicos si se proporcionan\n if (actionIds && actionIds.length > 0) {\n actions = actions.filter((a) => actionIds.includes(a.id));\n }\n\n if (actions.length === 0) {\n return {\n results: [],\n allSuccessful: true,\n successCount: 0,\n failureCount: 0,\n totalDurationMs: 0,\n };\n }\n\n const { executeSubmitActions } = await import('../utils/submitOrchestrator');\n const result = await executeSubmitActions(actions, getValues(), config);\n\n onActionExecuted?.(result);\n\n if (!result.allSuccessful) {\n const failedAction = result.results.find((r) => !r.success);\n if (failedAction?.error && onActionError) {\n onActionError(failedAction.error, failedAction.actionName);\n }\n }\n\n return result;\n },\n [config, getValues, onActionExecuted, onActionError],\n );\n\n // ─── Helper para verificar acciones ──────────────────────────────\n\n const hasActionsForTrigger = useCallback(\n (\n triggerType:\n | 'onSubmit'\n | 'onStepEnter'\n | 'onStepExit'\n | 'onFieldChange'\n | 'onFieldBlur'\n | 'onDelay'\n | 'manual',\n triggerValue?: string,\n ): boolean => {\n return getActionsByTrigger(config, triggerType, triggerValue).length > 0;\n },\n [config],\n );\n\n // ─── Cleanup ─────────────────────────────────────────────────────\n\n useEffect(() => {\n return () => {\n // Limpiar todos los timers al desmontar\n debounceTimersRef.current.forEach((timer) => clearTimeout(timer));\n debounceTimersRef.current.clear();\n\n if (idleTimerRef.current) {\n clearTimeout(idleTimerRef.current);\n }\n };\n }, []);\n\n return {\n triggerFieldChange,\n triggerFieldBlur,\n triggerManual,\n hasActionsForTrigger,\n };\n}\n","/**\n * ============================================\n * FIELD TYPE COMPONENTS - Mapping System\n * ============================================\n *\n * Maps field types to their required UI components.\n * Used for auto-discovery to determine which components need to be loaded.\n */\n\nimport type { FormConfig } from '../types/common';\nimport type { ComponentRegistry } from '../types/components';\n\n/**\n * Type for the component registry keys\n */\nexport type ComponentName = keyof ComponentRegistry;\n\n/**\n * Mapping of field type → required components\n * Each field type lists all the UI components it needs to render properly\n */\nexport const fieldTypeComponents: Record<string, ComponentName[]> = {\n // Text inputs\n text: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n email: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n tel: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n url: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n password: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n number: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n textarea: [\n 'Textarea',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'input-group': [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n currency: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n // Selection\n select: [\n 'Select',\n 'SelectTrigger',\n 'SelectContent',\n 'SelectItem',\n 'SelectValue',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'native-select': [\n 'NativeSelect',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n combobox: [\n 'Command',\n 'CommandInput',\n 'CommandList',\n 'CommandEmpty',\n 'CommandGroup',\n 'CommandItem',\n 'Popover',\n 'PopoverTrigger',\n 'PopoverContent',\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n command: [\n 'Command',\n 'CommandInput',\n 'CommandList',\n 'CommandEmpty',\n 'CommandGroup',\n 'CommandItem',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n // Toggle controls\n checkbox: [\n 'Checkbox',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n switch: [\n 'Switch',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n radio: [\n 'RadioGroup',\n 'RadioGroupItem',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'button-radio': [\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'button-checkbox': [\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'button-card': [\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'checkbox-group': [\n 'Checkbox',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n 'switch-group': [\n 'Switch',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n // Date controls\n date: [\n 'Calendar',\n 'Popover',\n 'PopoverTrigger',\n 'PopoverContent',\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n daterange: [\n 'Calendar',\n 'Popover',\n 'PopoverTrigger',\n 'PopoverContent',\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n // Special controls\n slider: [\n 'Slider',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n range: [\n 'Slider',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n otp: [\n 'InputOTP',\n 'InputOTPGroup',\n 'InputOTPSlot',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n file: [\n 'Input',\n 'Label',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n repeater: [\n 'Button',\n 'FormField',\n 'FormControl',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n ],\n\n // Static/Action\n html: [], // No components needed, renders raw HTML\n button: ['Button'],\n submit: ['Button'],\n next: ['Button'],\n back: ['Button'],\n};\n\n/**\n * Core components that are always needed for any form\n */\nexport const coreComponents: ComponentName[] = [\n 'Button',\n 'Field',\n 'FieldLabel',\n 'FieldDescription',\n 'FieldError',\n];\n\n/**\n * Optional components for enhanced features\n */\nexport const optionalComponents: Record<string, ComponentName[]> = {\n tooltip: ['Tooltip', 'TooltipTrigger', 'TooltipContent', 'TooltipProvider'],\n accordion: ['Accordion', 'AccordionItem', 'AccordionTrigger', 'AccordionContent'],\n dialog: [\n 'Dialog',\n 'DialogTrigger',\n 'DialogContent',\n 'DialogHeader',\n 'DialogTitle',\n 'DialogDescription',\n ],\n separator: ['Separator'],\n};\n\n/**\n * Get all required components for a form configuration\n *\n * @param config - The form configuration\n * @returns Array of unique component names needed for this form\n *\n * @example\n * ```ts\n * const config = FormBuilder.create('contact')\n * .addField('name', f => f.type('text'))\n * .addField('email', f => f.type('email'))\n * .build();\n *\n * const needed = getRequiredComponents(config);\n * // ['Input', 'Label', 'Button', 'Field', 'FieldLabel', 'FieldDescription', 'FieldError', 'FormField', 'FormControl']\n * ```\n */\nexport function getRequiredComponents(config: FormConfig): ComponentName[] {\n const needed = new Set<ComponentName>();\n\n // Always add core components\n for (const component of coreComponents) {\n needed.add(component);\n }\n\n // Add components for each field type\n for (const field of Object.values(config.fields)) {\n const components = fieldTypeComponents[field.type] || [];\n for (const component of components) {\n needed.add(component);\n }\n\n // Check for tooltip usage\n if ('tooltip' in field && field.tooltip) {\n const tooltipComponents = optionalComponents.tooltip;\n if (tooltipComponents) {\n for (const component of tooltipComponents) {\n needed.add(component);\n }\n }\n }\n }\n\n // Check for multi-step forms (accordion navigation)\n const stepCount = Object.keys(config.steps).length;\n if (stepCount > 1) {\n // Multi-step forms may use accordion or other navigation\n // Components are added based on stepsNavigation config if present\n }\n\n return Array.from(needed);\n}\n\n/**\n * Get missing components by comparing required vs provided\n *\n * @param required - Components needed for the form\n * @param provided - Components available in the registry\n * @returns Array of missing component names\n */\nexport function getMissingComponents(\n required: ComponentName[],\n provided: Partial<Record<ComponentName, unknown>>,\n): ComponentName[] {\n return required.filter((name) => !provided[name]);\n}\n\n/**\n * Group missing components by their source package\n * Useful for generating install commands\n */\nexport function groupMissingByPackage(missing: ComponentName[]): Record<string, ComponentName[]> {\n const packageMap: Record<string, string> = {\n // Inputs\n Input: 'input',\n Textarea: 'textarea',\n Button: 'button',\n Label: 'label',\n\n // Selection\n Checkbox: 'checkbox',\n Switch: 'switch',\n RadioGroup: 'radio-group',\n RadioGroupItem: 'radio-group',\n Select: 'select',\n SelectTrigger: 'select',\n SelectContent: 'select',\n SelectItem: 'select',\n SelectValue: 'select',\n NativeSelect: 'native-select',\n Slider: 'slider',\n\n // Overlays\n Popover: 'popover',\n PopoverTrigger: 'popover',\n PopoverContent: 'popover',\n Tooltip: 'tooltip',\n TooltipTrigger: 'tooltip',\n TooltipContent: 'tooltip',\n TooltipProvider: 'tooltip',\n Dialog: 'dialog',\n DialogTrigger: 'dialog',\n DialogContent: 'dialog',\n DialogHeader: 'dialog',\n DialogTitle: 'dialog',\n DialogDescription: 'dialog',\n\n // Command\n Command: 'command',\n CommandInput: 'command',\n CommandList: 'command',\n CommandEmpty: 'command',\n CommandGroup: 'command',\n CommandItem: 'command',\n\n // Others\n Separator: 'separator',\n InputOTP: 'input-otp',\n InputOTPGroup: 'input-otp',\n InputOTPSlot: 'input-otp',\n Accordion: 'accordion',\n AccordionItem: 'accordion',\n AccordionTrigger: 'accordion',\n AccordionContent: 'accordion',\n Calendar: 'calendar',\n\n // Form\n FormField: 'form',\n FormControl: 'form',\n Field: 'field',\n FieldLabel: 'field',\n FieldDescription: 'field',\n FieldError: 'field',\n };\n\n const grouped: Record<string, ComponentName[]> = {};\n\n for (const component of missing) {\n const pkg = packageMap[component] || 'unknown';\n if (!grouped[pkg]) {\n grouped[pkg] = [];\n }\n grouped[pkg].push(component);\n }\n\n return grouped;\n}\n\n/**\n * Generate a shell command to install missing components\n */\nexport function getInstallCommand(missing: ComponentName[]): string {\n const grouped = groupMissingByPackage(missing);\n const packages = Object.keys(grouped).filter((p) => p !== 'unknown');\n\n if (packages.length === 0) {\n return '';\n }\n\n return `npx shadcn@latest add ${packages.join(' ')}`;\n}\n","import type { FormPlugin, FieldRenderer, ValidationContext } from '../types/plugin';\nimport type { FormConfig } from '../types/common';\n\n/**\n * ============================================\n * PLUGIN MANAGER - Plugin System Core\n * ============================================\n *\n * Gestiona el registro, ejecución y coordinación de plugins.\n */\n\nexport class PluginManager {\n private plugins: Map<string, FormPlugin> = new Map();\n private customFields: Map<string, FieldRenderer> = new Map();\n private validators: Map<\n string,\n (value: unknown, context: ValidationContext) => boolean | string | Promise<boolean | string>\n > = new Map();\n\n /**\n * Registra un nuevo plugin.\n *\n * @param plugin - Plugin a registrar\n * @throws Error si el plugin ya está registrado\n *\n * @example\n * ```tsx\n * const pluginManager = new PluginManager();\n * pluginManager.register(localStoragePlugin);\n * pluginManager.register(analyticsPlugin);\n * ```\n */\n register(plugin: FormPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(\n `Plugin \"${plugin.name}\" is already registered.\\n` + `Each plugin must have a unique name.`,\n );\n }\n\n // Registrar el plugin\n this.plugins.set(plugin.name, plugin);\n\n // Registrar campos personalizados\n if (plugin.registerFields) {\n const fields = plugin.registerFields();\n Object.entries(fields).forEach(([type, renderer]) => {\n if (this.customFields.has(type)) {\n console.warn(\n `PluginManager: Field type \"${type}\" from plugin \"${plugin.name}\" ` +\n `is overwriting an existing field type.`,\n );\n }\n this.customFields.set(type, renderer);\n });\n }\n\n // Registrar validadores\n if (plugin.validators) {\n Object.entries(plugin.validators).forEach(([name, validator]) => {\n if (this.validators.has(name)) {\n console.warn(\n `PluginManager: Validator \"${name}\" from plugin \"${plugin.name}\" ` +\n `is overwriting an existing validator.`,\n );\n }\n this.validators.set(name, validator);\n });\n }\n\n // Inicializar el plugin si tiene método init\n if (plugin.init) {\n plugin.init(plugin.options);\n }\n }\n\n /**\n * Desregistra un plugin.\n *\n * @param pluginName - Nombre del plugin a desregistrar\n * @returns true si se desregistró, false si no existía\n */\n unregister(pluginName: string): boolean {\n const plugin = this.plugins.get(pluginName);\n if (!plugin) {\n return false;\n }\n\n // Ejecutar cleanup si existe\n if (plugin.cleanup) {\n plugin.cleanup();\n }\n\n // Eliminar campos personalizados del plugin\n if (plugin.registerFields) {\n const fields = plugin.registerFields();\n Object.keys(fields).forEach((type) => {\n this.customFields.delete(type);\n });\n }\n\n // Eliminar validadores del plugin\n if (plugin.validators) {\n Object.keys(plugin.validators).forEach((name) => {\n this.validators.delete(name);\n });\n }\n\n this.plugins.delete(pluginName);\n return true;\n }\n\n /**\n * Obtiene un plugin registrado.\n *\n * @param pluginName - Nombre del plugin\n * @returns Plugin o undefined si no existe\n */\n getPlugin(pluginName: string): FormPlugin | undefined {\n return this.plugins.get(pluginName);\n }\n\n /**\n * Obtiene todos los plugins registrados.\n *\n * @returns Array de plugins\n */\n getAllPlugins(): FormPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Obtiene un renderer de campo personalizado.\n *\n * @param type - Tipo de campo\n * @returns Renderer o undefined si no existe\n */\n getCustomField(type: string): FieldRenderer | undefined {\n return this.customFields.get(type);\n }\n\n /**\n * Verifica si existe un tipo de campo personalizado.\n *\n * @param type - Tipo de campo\n * @returns true si existe\n */\n hasCustomField(type: string): boolean {\n return this.customFields.has(type);\n }\n\n /**\n * Obtiene un validador personalizado.\n *\n * @param name - Nombre del validador\n * @returns Validador o undefined si no existe\n */\n getValidator(name: string) {\n return this.validators.get(name);\n }\n\n /**\n * Ejecuta un hook en todos los plugins que lo implementen.\n *\n * @param hook - Nombre del hook a ejecutar\n * @param args - Argumentos para el hook\n *\n * @example\n * ```tsx\n * await pluginManager.executeHook(\"onFormInit\", formConfig);\n * await pluginManager.executeHook(\"onStepChange\", \"step2\", values);\n * ```\n */\n async executeHook(hook: keyof FormPlugin, ...args: any[]): Promise<void> {\n const promises: Promise<unknown>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const hookFn = plugin[hook];\n if (hookFn && typeof hookFn === 'function') {\n try {\n // @ts-ignore - Dynamic hook execution\n const result = hookFn(...args);\n if (result instanceof Promise) {\n promises.push(result);\n }\n } catch (error) {\n console.error(\n `PluginManager: Error executing hook \"${String(hook)}\" in plugin \"${plugin.name}\":`,\n error,\n );\n // Continuar con otros plugins incluso si uno falla\n }\n }\n }\n\n // Esperar a que todos los hooks asíncronos terminen\n if (promises.length > 0) {\n await Promise.all(promises);\n }\n }\n\n /**\n * Transforma la configuración del formulario aplicando todos los transformers.\n *\n * @param config - Configuración original\n * @returns Configuración transformada\n */\n transformConfig(config: FormConfig): FormConfig {\n let transformed = config;\n\n for (const plugin of this.plugins.values()) {\n if (plugin.transformConfig) {\n try {\n transformed = plugin.transformConfig(transformed);\n } catch (error) {\n console.error(\n `PluginManager: Error transforming config in plugin \"${plugin.name}\":`,\n error,\n );\n // Continuar con la configuración actual si falla\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Transforma los valores del formulario aplicando todos los transformers.\n * Supports both sync and async transformers (chained in registration order).\n *\n * @param values - Valores originales\n * @returns Valores transformados\n */\n async transformValues(values: Record<string, unknown>): Promise<Record<string, unknown>> {\n let transformed = values;\n\n for (const plugin of this.plugins.values()) {\n if (plugin.transformValues) {\n try {\n transformed = await plugin.transformValues(transformed);\n } catch (error) {\n console.error(\n `PluginManager: Error transforming values in plugin \"${plugin.name}\":`,\n error,\n );\n // Continuar con los valores actuales si falla\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Limpia todos los plugins registrados.\n */\n cleanup(): void {\n for (const plugin of this.plugins.values()) {\n if (plugin.cleanup) {\n try {\n plugin.cleanup();\n } catch (error) {\n console.error(`PluginManager: Error cleaning up plugin \"${plugin.name}\":`, error);\n }\n }\n }\n\n this.plugins.clear();\n this.customFields.clear();\n this.validators.clear();\n }\n\n /**\n * Obtiene estadísticas del plugin manager.\n *\n * @returns Objeto con estadísticas\n */\n getStats() {\n return {\n totalPlugins: this.plugins.size,\n customFields: this.customFields.size,\n validators: this.validators.size,\n plugins: Array.from(this.plugins.values()).map((p) => ({\n name: p.name,\n version: p.version,\n description: p.description,\n })),\n };\n }\n}\n\n/**\n * Instancia global del plugin manager (opcional).\n * Los usuarios pueden crear sus propias instancias si lo prefieren.\n */\nexport const globalPluginManager = new PluginManager();\n","import type { z } from 'zod';\nimport type { FieldConfig, Option, ButtonCardOption, FieldLayoutConfig } from '../types/fields';\nimport type { Breakpoint } from '../types/common';\nimport type { ReactNode } from 'react';\nimport type { ConditionGroup } from '../types/logic';\nimport type {\n BuiltinTransform,\n FieldTransformFn,\n SerializableFieldResolver,\n} from '../types/submitActions';\nimport type { ValidationRules } from '../types/validation';\nimport { applyTransform } from '../utils/fieldMapping';\n\n/**\n * ============================================\n * FIELD BUILDER - Fluent API for Field Configuration\n * ============================================\n *\n * Builder pattern para crear configuraciones de campo de forma fluida y type-safe.\n */\n\nexport class FieldBuilder {\n private config: Partial<FieldConfig> & Record<string, unknown> = {};\n\n constructor(private name: string) {}\n\n /**\n * Configura el tipo de campo.\n *\n * @param type - Tipo de campo\n * @returns this para encadenamiento\n */\n type(type: FieldConfig['type']): this {\n this.config.type = type;\n return this;\n }\n\n /**\n * Configura el label del campo.\n *\n * @param label - Texto del label\n * @returns this para encadenamiento\n */\n label(label: string): this {\n this.config.label = label;\n return this;\n }\n\n /**\n * Oculta el label del campo.\n *\n * @returns this para encadenamiento\n */\n hideLabel(): this {\n this.config.hideLabel = true;\n return this;\n }\n\n /**\n * Configura el esquema de validación Zod.\n *\n * @param schema - Esquema Zod\n * @returns this para encadenamiento\n */\n schema(schema: z.ZodType): this {\n this.config.schema = schema;\n return this;\n }\n\n /**\n * Adds plugin-registered validator names to apply to this field.\n *\n * @param names - Validator names registered via plugin.validators\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * field.type('email').customValidators('uniqueEmail', 'corporateOnly')\n * ```\n */\n customValidators(...names: string[]): this {\n this.config.customValidators = [...(this.config.customValidators || []), ...names];\n return this;\n }\n\n /**\n * Configura el placeholder del campo.\n *\n * @param placeholder - Texto placeholder\n * @returns this para encadenamiento\n */\n placeholder(placeholder: string): this {\n this.config.placeholder = placeholder;\n return this;\n }\n\n /**\n * Configura el valor inicial del campo.\n *\n * @param value - Valor inicial\n * @returns this para encadenamiento\n */\n value(value: unknown): this {\n this.config.value = value;\n return this;\n }\n\n /**\n * Configura el texto de ayuda del campo.\n *\n * @param helperText - Texto de ayuda\n * @returns this para encadenamiento\n */\n helperText(helperText: string): this {\n this.config.helperText = helperText;\n return this;\n }\n\n /**\n * Configura el tooltip del campo.\n *\n * @param tooltip - Texto del tooltip\n * @returns this para encadenamiento\n */\n tooltip(tooltip: string): this {\n this.config.tooltip = tooltip;\n return this;\n }\n\n /**\n * Configura el icono del campo.\n *\n * @param icon - Elemento React del icono\n * @param iconProps - Props adicionales para el icono\n * @returns this para encadenamiento\n */\n icon(icon: ReactNode, iconProps?: Record<string, unknown>): this {\n this.config.icon = icon;\n if (iconProps) {\n this.config.iconProps = iconProps;\n }\n return this;\n }\n\n /**\n * Configura el tamaño del campo.\n *\n * @param size - Tamaño del campo\n * @returns this para encadenamiento\n */\n size(size: 'sm' | 'md' | 'lg'): this {\n this.config.size = size;\n return this;\n }\n\n /**\n * Configura las opciones del campo (para select, radio, checkbox-group, etc.).\n *\n * @param options - Array de opciones\n * @returns this para encadenamiento\n */\n options(options: Option[]): this {\n this.config.options = options;\n return this;\n }\n\n /**\n * Configura las opciones de button-card.\n *\n * @param options - Array de opciones de button-card\n * @returns this para encadenamiento\n */\n buttonCardOptions(options: ButtonCardOption[]): this {\n // ButtonCardOption es compatible con el tipo options de FieldConfig\n this.config.options = options as unknown as Option[];\n return this;\n }\n\n /**\n * Configura el número de filas (para textarea).\n *\n * @param rows - Número de filas\n * @returns this para encadenamiento\n */\n rows(rows: number): this {\n this.config.rows = rows as never; // Type assertion necesaria por limitación de FieldConfig union\n return this;\n }\n\n /**\n * Configura el máximo de caracteres (para textarea).\n *\n * @param maxLength - Máximo de caracteres\n * @returns this para encadenamiento\n */\n maxLength(maxLength: number): this {\n this.config.maxLength = maxLength as never; // Type assertion necesaria por limitación de FieldConfig union\n return this;\n }\n\n /**\n * Configura el rango del slider.\n *\n * @param min - Valor mínimo\n * @param max - Valor máximo\n * @param step - Paso del slider\n * @returns this para encadenamiento\n */\n range(min: number, max: number, step?: number): this {\n this.config.min = min as never; // Type assertion necesaria por limitación de FieldConfig union\n this.config.max = max as never; // Type assertion necesaria por limitación de FieldConfig union\n if (step !== undefined) {\n this.config.step = step as never; // Type assertion necesaria por limitación de FieldConfig union\n }\n return this;\n }\n\n /**\n * Configura la variante del slider.\n *\n * @param variant - 'default' (single thumb), 'range' (two thumbs), 'multi' (multiple thumbs)\n * @returns this para encadenamiento\n *\n * @example\n * .sliderVariant('range') // Two thumbs for min/max selection\n */\n sliderVariant(variant: 'default' | 'range' | 'multi'): this {\n this.config.variant = variant as never;\n return this;\n }\n\n /**\n * Configura la orientación del slider.\n *\n * @param orientation - 'horizontal' o 'vertical'\n * @returns this para encadenamiento\n *\n * @example\n * .sliderOrientation('vertical')\n */\n sliderOrientation(orientation: 'horizontal' | 'vertical'): this {\n this.config.orientation = orientation as never;\n return this;\n }\n\n /**\n * Configura el número de thumbs para slider 'multi'.\n *\n * @param count - Número de thumbs (default: 3)\n * @returns this para encadenamiento\n *\n * @example\n * .thumbCount(4)\n */\n thumbCount(count: number): this {\n this.config.thumbCount = count as never;\n return this;\n }\n\n /**\n * Muestra u oculta las etiquetas min/max del slider.\n *\n * @param show - true para mostrar, false para ocultar\n * @returns this para encadenamiento\n */\n showLabels(show: boolean): this {\n this.config.showLabels = show as never;\n return this;\n }\n\n /**\n * Muestra u oculta el valor actual del slider.\n *\n * @param show - true para mostrar, false para ocultar\n * @returns this para encadenamiento\n */\n showValue(show: boolean): this {\n this.config.showValue = show as never;\n return this;\n }\n\n /**\n * Formato para mostrar el valor del slider.\n * Usa {value} como placeholder para el valor numérico.\n *\n * @param format - String de formato (e.g., \"${value}\", \"{value}%\", \"{value}°C\")\n * @returns this para encadenamiento\n *\n * @example\n * .valueFormat('${value}') // Shows \"$50\"\n * .valueFormat('{value}%') // Shows \"75%\"\n * .valueFormat('{value}°C') // Shows \"22°C\"\n */\n valueFormat(format: string): this {\n this.config.valueFormat = format as never;\n return this;\n }\n\n /**\n * Configura la condición de visibilidad del campo.\n *\n * @param condition - Condición booleana, función, grupo de condiciones, o visibilidad responsive por breakpoint\n * @returns this para encadenamiento\n *\n * @example\n * // Ocultar siempre\n * .hidden(true)\n *\n * @example\n * // Ocultar condicionalmente\n * .hidden((values) => values.premium === false)\n *\n * @example\n * // Ocultar responsive: oculto en mobile, visible en desktop\n * .hidden({ default: \"hidden\", md: \"visible\" })\n *\n * @example\n * // Visible hasta tablet, oculto en desktop\n * .hidden({ default: \"visible\", lg: \"hidden\" })\n */\n hidden(\n condition:\n | boolean\n | ((values: Record<string, unknown>) => boolean)\n | Partial<Record<Breakpoint, 'visible' | 'hidden'>>\n | ConditionGroup,\n ): this {\n this.config.hidden = condition as never; // Type assertion necesaria por limitación de FieldConfig union\n return this;\n }\n\n /**\n * Configura la condición de deshabilitación del campo.\n *\n * @param condition - Condición booleana, función o grupo de condiciones\n * @returns this para encadenamiento\n */\n disabled(\n condition: boolean | ((values: Record<string, unknown>) => boolean) | ConditionGroup,\n ): this {\n this.config.disabled = condition as never; // Type assertion necesaria por limitación de FieldConfig union\n return this;\n }\n\n /**\n * Configura la condición de solo lectura del campo.\n *\n * @param condition - Condición booleana, función o grupo de condiciones\n * @returns this para encadenamiento\n */\n readOnly(\n condition: boolean | ((values: Record<string, unknown>) => boolean) | ConditionGroup,\n ): this {\n this.config.readOnly = condition as never; // Type assertion necesaria por limitación de FieldConfig union\n return this;\n }\n\n /**\n * Configura el layout del campo.\n *\n * @param layout - Configuración de layout\n * @returns this para encadenamiento\n */\n layout(layout: FieldLayoutConfig): this {\n this.config.layout = layout;\n return this;\n }\n\n /**\n * Configura las columnas del campo por breakpoint.\n *\n * Si no se define, el campo ocupará todas las columnas disponibles del formulario.\n *\n * @param columns - Objeto con columnas por breakpoint (1-12)\n *\n * @example\n * // Ocupar todo el ancho en mobile, mitad en desktop\n * .columns({ default: 12, md: 6 })\n *\n * @example\n * // Ocupar todo el ancho siempre\n * .columns({ default: 12 })\n *\n * @example\n * // Ocupar 1/3 en mobile, 1/2 en tablet, 1/4 en desktop\n * .columns({ default: 12, sm: 6, md: 4, lg: 3 })\n *\n * @returns this para encadenamiento\n */\n columns(columns: Partial<Record<Breakpoint, number>>): this {\n const existingLayout = typeof this.config.layout === 'object' ? this.config.layout : {};\n this.config.layout = {\n ...existingLayout,\n columns,\n };\n return this;\n }\n\n /**\n * Configura el orden del campo.\n *\n * @param order - Orden de visualización (número fijo o responsive por breakpoint)\n * @returns this para encadenamiento\n *\n * @example\n * // Orden fijo\n * .order(1)\n *\n * @example\n * // Orden responsive: primero en mobile, tercero en desktop\n * .order({ default: 1, md: 3 })\n *\n * @example\n * // Reordenar según tamaño: último en mobile, primero en desktop\n * .order({ default: 5, lg: 1 })\n */\n order(order: number | Partial<Record<Breakpoint, number>>): this {\n const existingLayout = typeof this.config.layout === 'object' ? this.config.layout : {};\n this.config.layout = {\n ...existingLayout,\n order,\n };\n return this;\n }\n\n /**\n * Configura clases CSS personalizadas.\n *\n * @param wrapper - Clases para el wrapper\n * @param input - Clases para el input\n * @param label - Clases para el label\n * @param error - Clases para el mensaje de error\n * @param helper - Clases para el mensaje de ayuda\n * @returns this para encadenamiento\n */\n classNames(options: {\n wrapper?: string;\n input?: string;\n label?: string;\n error?: string;\n helper?: string;\n }): this {\n if (options.wrapper) this.config.wrapper_className = options.wrapper;\n if (options.input) this.config.input_className = options.input;\n if (options.label) this.config.label_className = options.label;\n if (options.error) this.config.error_className = options.error;\n if (options.helper) this.config.helper_className = options.helper;\n return this;\n }\n\n /**\n * Sets value transform(s) applied before submission.\n * Accepts a single built-in transform name, multiple names (chained left-to-right),\n * or a custom function.\n *\n * @example\n * .transform('trim')\n * .transform('trim', 'lowercase')\n * .transform((v) => String(v).replace(/\\s+/g, '-'))\n */\n transform(...transforms: (BuiltinTransform | FieldTransformFn)[]): this {\n if (transforms.length === 1) {\n this.config.transform = transforms[0] as never;\n } else {\n const allBuiltin = transforms.every((t) => typeof t === 'string');\n if (allBuiltin) {\n this.config.transform = transforms as BuiltinTransform[] as never;\n } else {\n // Compose into a single function\n this.config.transform = ((value: unknown) =>\n transforms.reduce((v, t) => applyTransform(v, t), value)) as never;\n }\n }\n return this;\n }\n\n // ═══════════════════════════════════════════════════════════\n // Type-Specific Configuration Methods\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Sets the slider minimum value (individual setter; see also `.range()`).\n */\n min(value: number): this {\n this.config.min = value as never;\n return this;\n }\n\n /**\n * Sets the slider maximum value (individual setter; see also `.range()`).\n */\n max(value: number): this {\n this.config.max = value as never;\n return this;\n }\n\n /**\n * Sets the slider step size (individual setter; see also `.range()`).\n */\n step(value: number): this {\n this.config.step = value as never;\n return this;\n }\n\n /**\n * Sets the date picker style.\n *\n * @param style - 'simple' (inline calendar) or 'popover' (dropdown calendar)\n */\n dateType(style: 'simple' | 'popover'): this {\n this.config.dateType = style as never;\n return this;\n }\n\n /**\n * Enables or disables the time picker on date fields.\n */\n showTime(show: boolean): this {\n this.config.showTime = show as never;\n return this;\n }\n\n /**\n * Sets quick-select date presets.\n *\n * @param presets - Array of { label, value } where value is days from today\n */\n datePresets(presets: Array<{ label: string; value: number }>): this {\n this.config.presets = presets as never;\n return this;\n }\n\n /**\n * Sets the input-group prefix text.\n */\n prefix(text: string): this {\n this.config.prefix = text as never;\n return this;\n }\n\n /**\n * Sets the input-group suffix text.\n */\n suffix(text: string): this {\n this.config.suffix = text as never;\n return this;\n }\n\n /**\n * Sets the combobox/command search placeholder.\n */\n searchPlaceholder(text: string): this {\n this.config.searchPlaceholder = text as never;\n return this;\n }\n\n /**\n * Sets the combobox/command empty state text.\n */\n emptyText(text: string): this {\n this.config.emptyText = text as never;\n return this;\n }\n\n /**\n * Enables or disables multi-select on button-card fields.\n */\n multiple(allow: boolean): this {\n this.config.multiple = allow as never;\n return this;\n }\n\n /**\n * Sets the OTP digit count.\n *\n * @param length - Number of digits (default: 6)\n */\n otpLength(length: number): this {\n this.config.length = length as never;\n return this;\n }\n\n /**\n * Sets the field default value.\n */\n defaultValue(value: unknown): this {\n this.config.defaultValue = value as never;\n return this;\n }\n\n /**\n * Sets the field description (metadata, shown as additional text or tooltip).\n */\n description(text: string): this {\n this.config.description = text as never;\n return this;\n }\n\n /**\n * Sets the HTML autocomplete attribute.\n */\n autocomplete(attr: string): this {\n this.config.autocomplete = attr as never;\n return this;\n }\n\n /**\n * Sets CSS classes for the options grid layout (checkbox-group, button-radio, etc.).\n */\n optionsClassName(cls: string): this {\n this.config.optionsClassName = cls as never;\n return this;\n }\n\n /**\n * Sets the resolver for a hidden field.\n * Resolvers compute dynamic values (IP, URL params, timestamps, etc.) at form init.\n *\n * @param config - Serializable resolver configuration\n * @returns this for chaining\n *\n * @example\n * field.type('hidden').resolver({ $resolver: 'timestamp' })\n * field.type('hidden').resolver({ $resolver: 'urlParam', param: 'utm_source', fallback: 'direct' })\n * field.type('hidden').resolver({ $resolver: 'ip' })\n */\n resolver(config: SerializableFieldResolver): this {\n this.config.resolver = config as never;\n return this;\n }\n\n /**\n * Sets accepted file types for a file field.\n *\n * @param types - MIME types or extensions (e.g. \"image/*\", \".pdf,.doc\")\n * @returns this for chaining\n *\n * @example\n * field.type('file').accept('image/*')\n * field.type('file').accept('.pdf,.docx')\n */\n accept(types: string): this {\n (this.config as Record<string, unknown>).accept = types;\n return this;\n }\n\n /**\n * Sets maximum file size in bytes for a file field.\n *\n * @param bytes - Max size in bytes\n * @returns this for chaining\n *\n * @example\n * field.type('file').maxSize(5 * 1024 * 1024) // 5MB\n */\n maxSize(bytes: number): this {\n (this.config as Record<string, unknown>).maxSize = bytes;\n return this;\n }\n\n /**\n * Sets the sub-field definitions for a repeater field.\n * @example\n * field.type('repeater').itemFields({ name: { type: 'text', label: 'Name' } })\n */\n itemFields(fields: Record<string, unknown>): this {\n (this.config as Record<string, unknown>).itemFields = fields;\n return this;\n }\n\n /** Minimum number of items for a repeater field. */\n minItems(n: number): this {\n (this.config as Record<string, unknown>).minItems = n;\n return this;\n }\n\n /** Maximum number of items for a repeater field. */\n maxItems(n: number): this {\n (this.config as Record<string, unknown>).maxItems = n;\n return this;\n }\n\n /** Label for the repeater \"add\" button. */\n addLabel(label: string): this {\n (this.config as Record<string, unknown>).addLabel = label;\n return this;\n }\n\n /** Label for the repeater \"remove\" button. */\n removeLabel(label: string): this {\n (this.config as Record<string, unknown>).removeLabel = label;\n return this;\n }\n\n // ═══════════════════════════════════════════════════════════\n // Declarative Validation Methods (produce ValidationRules)\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Ensures `this.config.schema` is a ValidationRules object (not a Zod schema).\n * If it's already a Zod schema, it's left untouched and a new ValidationRules is created.\n */\n private ensureValidationRules(): ValidationRules {\n const current = this.config.schema;\n // If already a ValidationRules object (plain object without _def)\n if (current && typeof current === 'object' && !('_def' in current)) {\n return current as ValidationRules;\n }\n // Create a new ValidationRules and assign it\n const rules: ValidationRules = {};\n this.config.schema = rules;\n return rules;\n }\n\n /**\n * Mark the field as required (validation).\n */\n required(message?: string): this {\n const rules = this.ensureValidationRules();\n rules.required = true;\n if (message) rules.requiredMessage = message;\n return this;\n }\n\n /**\n * Mark the field as optional (validation).\n */\n optional(): this {\n const rules = this.ensureValidationRules();\n rules.required = false;\n return this;\n }\n\n /**\n * Set minimum length validation (string fields).\n */\n minLength(n: number, message?: string): this {\n const rules = this.ensureValidationRules();\n rules.minLength = n;\n if (message) rules.minLengthMessage = message;\n return this;\n }\n\n /**\n * Set maximum length validation (string fields).\n * Note: This sets validation rules, not the HTML maxLength attribute.\n * For textarea HTML maxLength, use the existing `.maxLength()` method before calling validation methods.\n */\n maxLengthValidation(n: number, message?: string): this {\n const rules = this.ensureValidationRules();\n rules.maxLength = n;\n if (message) rules.maxLengthMessage = message;\n return this;\n }\n\n /**\n * Set email format validation.\n */\n email(message?: string): this {\n const rules = this.ensureValidationRules();\n rules.format = 'email';\n if (message) rules.formatMessage = message;\n return this;\n }\n\n /**\n * Set URL format validation.\n */\n url(message?: string): this {\n const rules = this.ensureValidationRules();\n rules.format = 'url';\n if (message) rules.formatMessage = message;\n return this;\n }\n\n /**\n * Set regex pattern validation.\n */\n regex(pattern: string, message?: string): this {\n const rules = this.ensureValidationRules();\n rules.pattern = pattern;\n if (message) rules.patternMessage = message;\n return this;\n }\n\n /**\n * Set number range validation.\n */\n numberRange(min?: number, max?: number): this {\n const rules = this.ensureValidationRules();\n if (min !== undefined) rules.min = min;\n if (max !== undefined) rules.max = max;\n return this;\n }\n\n /**\n * Set array item count validation.\n */\n itemCount(min?: number, max?: number): this {\n const rules = this.ensureValidationRules();\n if (min !== undefined) rules.minItems = min;\n if (max !== undefined) rules.maxItems = max;\n return this;\n }\n\n /**\n * Require the boolean field to be true (e.g. terms checkbox).\n */\n mustBeTrue(message?: string): this {\n const rules = this.ensureValidationRules();\n rules.mustBeTrue = true;\n if (message) rules.mustBeTrueMessage = message;\n return this;\n }\n\n /**\n * Apply a named validation preset.\n */\n preset(id: string): this {\n const rules = this.ensureValidationRules();\n rules.preset = id;\n return this;\n }\n\n // ═══════════════════════════════════════════════════════════\n // Build\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Construye y valida la configuración final del campo.\n *\n * @returns FieldConfig completo y validado\n * @throws Error si falta información requerida\n */\n build(): FieldConfig {\n if (!this.config.type) {\n throw new Error(`FieldBuilder: field \"${this.name}\" requires a type`);\n }\n\n // Hidden fields don't require a schema — they bypass user validation\n // Allow ValidationRules (even empty {}) as a valid schema —\n // the compiler will produce a sensible default from the field type.\n if (!this.config.schema && this.config.type !== 'hidden') {\n throw new Error(`FieldBuilder: field \"${this.name}\" requires a schema`);\n }\n\n return this.config as FieldConfig;\n }\n\n /**\n * Construye sin validaciones (útil para desarrollo).\n *\n * @returns FieldConfig parcial\n */\n buildUnsafe(): Partial<FieldConfig> {\n return this.config as Partial<FieldConfig>;\n }\n}\n","import type { FormConfig } from './common';\n\n/**\n * ============================================\n * PLUGIN SYSTEM - Extensibility Architecture\n * ============================================\n *\n * Sistema de plugins para extender funcionalidad sin modificar código fuente.\n */\n\n/**\n * Contexto de validación para plugins.\n */\nexport interface ValidationContext {\n fieldName: string;\n allValues: Record<string, unknown>;\n abortSignal?: AbortSignal;\n}\n\n/**\n * Renderer personalizado de campo para plugins.\n */\nexport type FieldRenderer = React.ComponentType<{\n name: string;\n fieldConfig: any;\n control: any;\n colSpanItem: string;\n}>;\n\n/**\n * Interfaz principal de un plugin de formulario.\n *\n * Los plugins pueden interceptar el ciclo de vida del formulario,\n * registrar campos personalizados y transformar configuraciones.\n */\nexport interface FormPlugin {\n /** Nombre único del plugin */\n name: string;\n\n /** Versión del plugin */\n version: string;\n\n /** Descripción opcional del plugin */\n description?: string;\n\n // ═══════════════════════════════════════════════════════════\n // LIFECYCLE HOOKS\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Se ejecuta cuando el formulario se inicializa.\n *\n * @param config - Configuración del formulario\n */\n onFormInit?: (config: FormConfig) => void;\n\n /**\n * Se ejecuta cuando cambia el step actual.\n *\n * @param stepId - ID del nuevo step\n * @param values - Valores actuales del formulario\n */\n onStepChange?: (stepId: string, values: Record<string, unknown>) => void;\n\n /**\n * Se ejecuta antes de enviar el formulario.\n * Puede ser asíncrono para validaciones adicionales.\n *\n * @param values - Valores a enviar\n * @throws Error si la validación falla\n */\n onBeforeSubmit?: (values: Record<string, unknown>) => void | Promise<void>;\n\n /**\n * Se ejecuta después de enviar exitosamente el formulario.\n *\n * @param values - Valores enviados\n * @param response - Respuesta del servidor\n */\n onAfterSubmit?: (values: Record<string, unknown>, response: unknown) => void;\n\n /**\n * Se ejecuta cuando ocurre un error.\n *\n * @param error - Error ocurrido\n * @param values - Valores actuales del formulario\n */\n onError?: (error: Error, values?: Record<string, unknown>) => void;\n\n /**\n * Se ejecuta cuando un campo cambia de valor.\n *\n * @param fieldName - Nombre del campo\n * @param value - Nuevo valor\n * @param allValues - Todos los valores del formulario\n */\n onFieldChange?: (fieldName: string, value: unknown, allValues: Record<string, unknown>) => void;\n\n // ═══════════════════════════════════════════════════════════\n // CUSTOM FIELDS\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Registra campos personalizados.\n *\n * @returns Objeto con tipos de campo y sus renderizadores\n *\n * @example\n * ```tsx\n * registerFields() {\n * return {\n * signature: SignatureFieldRenderer,\n * wysiwyg: WysiwygFieldRenderer,\n * };\n * }\n * ```\n */\n registerFields?: () => Record<string, FieldRenderer>;\n\n // ═══════════════════════════════════════════════════════════\n // TRANSFORMERS\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Transforma la configuración del formulario antes de usarla.\n *\n * @param config - Configuración original\n * @returns Configuración transformada\n *\n * @example\n * ```tsx\n * transformConfig(config) {\n * // Agregar prefijo a todos los campos\n * return {\n * ...config,\n * fields: Object.fromEntries(\n * Object.entries(config.fields).map(([key, value]) => [\n * `prefix_${key}`,\n * value\n * ])\n * )\n * };\n * }\n * ```\n */\n transformConfig?: (config: FormConfig) => FormConfig;\n\n /**\n * Transforma los valores antes de enviar.\n *\n * @param values - Valores originales\n * @returns Valores transformados\n *\n * @example\n * ```tsx\n * transformValues(values) {\n * // Convertir fechas a ISO string\n * return Object.fromEntries(\n * Object.entries(values).map(([key, value]) => [\n * key,\n * value instanceof Date ? value.toISOString() : value\n * ])\n * );\n * }\n * ```\n */\n transformValues?: (\n values: Record<string, unknown>,\n ) => Record<string, unknown> | Promise<Record<string, unknown>>;\n\n // ═══════════════════════════════════════════════════════════\n // VALIDATORS\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Registra validadores personalizados.\n *\n * @returns Objeto con nombre del validador y función de validación\n *\n * @example\n * ```tsx\n * validators: {\n * uniqueEmail: async (value, context) => {\n * const response = await fetch(`/api/check-email?email=${value}`);\n * const { exists } = await response.json();\n * return exists ? \"Email already registered\" : true;\n * }\n * }\n * ```\n */\n validators?: Record<\n string,\n (value: unknown, context: ValidationContext) => boolean | string | Promise<boolean | string>\n >;\n\n // ═══════════════════════════════════════════════════════════\n // CONFIGURATION\n // ═══════════════════════════════════════════════════════════\n\n /**\n * Opciones de configuración del plugin.\n */\n options?: Record<string, unknown>;\n\n /**\n * Inicializa el plugin con opciones personalizadas.\n *\n * @param options - Opciones de configuración\n */\n init?: (options?: Record<string, unknown>) => void;\n\n /**\n * Limpia recursos del plugin.\n */\n cleanup?: () => void;\n}\n\n/**\n * Tipo helper para crear plugins con type safety.\n */\nexport type DefinePlugin = (options?: Record<string, unknown>) => FormPlugin;\n\n/**\n * Helper para definir un plugin con type safety.\n *\n * @param plugin - Configuración del plugin\n * @returns Plugin tipado\n *\n * @example\n * ```tsx\n * export const myPlugin = definePlugin({\n * name: \"my-plugin\",\n * version: \"1.0.0\",\n * onFormInit(config) {\n * console.log(\"Form initialized:\", config.formId);\n * },\n * });\n * ```\n */\nexport function definePlugin(plugin: FormPlugin): FormPlugin {\n return plugin;\n}\n","import { definePlugin } from '../types/plugin';\nimport type { HttpSubmitAction, FieldMappingConfig } from '../types/submitActions';\n\n// ───────────────────────────────────────────────────────────────\n// Types\n// ───────────────────────────────────────────────────────────────\n\nexport interface DatabowlConfig {\n /** DataBowl API token (Bearer auth) */\n token: string;\n /**\n * API endpoint. Default: `https://www.databowl.com/api/v4/leads`\n *\n * Set to a local proxy route (e.g. `/api/send-lead`) for CORS/security.\n * The proxy should forward the request to DataBowl.\n */\n endpoint?: string;\n /**\n * Field mapping — simple rename or advanced with transforms/inject.\n *\n * @example\n * ```ts\n * // Simple rename\n * fieldMapping: { nombre: \"first_name\", telefono: \"phone\" }\n *\n * // Advanced: transform dates, booleans, inject computed fields\n * fieldMapping: {\n * fields: {\n * nombre: \"first_name\",\n * fecha_nacimiento: { to: \"birth_date\", transform: \"dateYMD\" },\n * seguro_enfermedad: { to: \"has_insurance\", transform: \"booleanString\" },\n * },\n * inject: {\n * campaign_id: \"10653\",\n * ip: { $resolver: \"custom\", fn: () => fetchIpAddress() },\n * sub_aff_id: { $resolver: \"urlParam\", param: \"sub_aff_id\", fallback: \"seo_organico\" },\n * timestamp: { $resolver: \"timestamp\" },\n * hostname: { $resolver: \"hostname\" },\n * },\n * }\n * ```\n */\n fieldMapping?: FieldMappingConfig;\n /** Extra static fields to include in every submission */\n staticFields?: Record<string, unknown>;\n /**\n * Body format. Default: `'url-encoded'` (DataBowl standard).\n * Set to `'json'` if your proxy expects JSON.\n */\n bodyFormat?: 'json' | 'url-encoded';\n /** Action ID (default: \"databowl\") */\n actionId?: string;\n /** Continue form submission if DataBowl fails (default: false) */\n continueOnError?: boolean;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Action Helper — for use with .submitAction()\n// ───────────────────────────────────────────────────────────────\n\n/**\n * Creates a pre-configured HTTP submit action for DataBowl.\n *\n * Use this with `.submitAction()` when you need fine-grained control\n * or want to combine it with other actions.\n *\n * @example\n * ```tsx\n * FormBuilder.create(\"lead\")\n * .addField(\"nombre\", f => f.type(\"text\").label(\"Nombre\"))\n * .addStep(\"main\", [\"nombre\"])\n * .submitAction(\"databowl\", databowlAction({\n * token: import.meta.env.DATABOWL_TOKEN,\n * endpoint: \"/api/send-lead-databowl\", // proxy\n * }), \"onSubmit\", {\n * fieldMapping: { nombre: \"first_name\" },\n * })\n * .build();\n * ```\n */\nexport function databowlAction(\n config: Pick<DatabowlConfig, 'token' | 'endpoint' | 'bodyFormat'>,\n): HttpSubmitAction {\n return {\n type: 'http',\n name: 'DataBowl Lead',\n endpoint: {\n url: config.endpoint || 'https://www.databowl.com/api/v4/leads',\n method: 'POST',\n },\n body: { format: config.bodyFormat || 'url-encoded' },\n auth: { type: 'bearer', token: config.token },\n timeout: 15000,\n };\n}\n\n// ───────────────────────────────────────────────────────────────\n// Plugin — auto-injects submitAction via transformConfig\n// ───────────────────────────────────────────────────────────────\n\n/**\n * DataBowl plugin for @saastro/forms.\n *\n * Automatically injects a DataBowl submit action into the form config.\n * Handles field mapping (with transforms + inject), static fields, and error tracking.\n *\n * @example\n * ```tsx\n * // Basic usage with simple rename\n * const pm = new PluginManager();\n * pm.register(databowlPlugin({\n * token: import.meta.env.DATABOWL_TOKEN,\n * fieldMapping: {\n * nombre: \"first_name\",\n * email: \"email_address\",\n * telefono: \"phone\",\n * },\n * staticFields: {\n * source: \"landing-energy\",\n * },\n * }));\n *\n * // Advanced: proxy + transforms + computed fields\n * pm.register(databowlPlugin({\n * token: import.meta.env.DATABOWL_TOKEN,\n * endpoint: \"/api/send-lead-databowl\",\n * bodyFormat: \"json\", // proxy expects JSON, converts to url-encoded\n * fieldMapping: {\n * fields: {\n * nombre: \"first_name\",\n * fecha_nacimiento: { to: \"birth_date\", transform: \"dateYMD\" },\n * seguro_enfermedad: { to: \"has_insurance\", transform: \"booleanString\" },\n * },\n * inject: {\n * campaign_id: \"10653\",\n * sub_aff_id: { $resolver: \"urlParam\", param: \"sub_aff_id\", fallback: \"seo_organico\" },\n * timestamp: { $resolver: \"timestamp\" },\n * hostname: { $resolver: \"hostname\" },\n * },\n * },\n * }));\n *\n * const form = FormBuilder.create(\"lead\")\n * .usePlugins(pm)\n * .addField(\"nombre\", f => f.type(\"text\").label(\"Nombre\"))\n * .addStep(\"main\", [\"nombre\"])\n * .redirect(\"/gracias\")\n * .build();\n * ```\n */\nexport const databowlPlugin = (config: DatabowlConfig) => {\n const actionId = config.actionId || 'databowl';\n\n return definePlugin({\n name: 'databowl',\n version: '1.0.0',\n description: 'DataBowl lead integration',\n options: config as unknown as Record<string, unknown>,\n\n transformConfig(formConfig) {\n return {\n ...formConfig,\n submitActions: {\n ...formConfig.submitActions,\n [actionId]: {\n id: actionId,\n action: databowlAction(config),\n trigger: { type: 'onSubmit' as const },\n fieldMapping: config.fieldMapping,\n continueOnError: config.continueOnError ?? false,\n },\n },\n };\n },\n\n transformValues(values) {\n // Merge static fields into values (applied before all actions)\n if (config.staticFields) {\n return { ...values, ...config.staticFields };\n }\n return values;\n },\n\n onError(error) {\n console.error(`[databowl] Submission failed: ${error.message}`);\n },\n });\n};\n","import type { FormButtons } from '../types/buttons';\nimport type {\n ColumnsValue,\n Fields,\n FormConfig,\n GapValue,\n SubmitConfirmationConfig,\n} from '../types/common';\nimport type { StepCondition } from '../types/steps';\nimport type { SubmitConfig } from '../types/submit';\nimport type {\n SubmitAction,\n SubmitTrigger,\n SubmitTriggerType,\n SubmitActionCondition,\n SubmitExecutionConfig,\n FieldMappingConfig,\n} from '../types/submitActions';\nimport { PluginManager } from '../core/PluginManager';\nimport { FieldBuilder } from './FieldBuilder';\nimport { databowlPlugin, type DatabowlConfig } from '../plugins/databowl';\n\n/**\n * ============================================\n * FORM BUILDER - Fluent API for Form Configuration\n * ============================================\n *\n * Builder pattern para crear configuraciones de formulario de forma fluida y type-safe.\n */\n\nexport class FormBuilder {\n private config: Partial<FormConfig> = {\n fields: {},\n steps: {},\n };\n\n /**\n * Asegura que el objeto layout existe en la configuración.\n * @private\n */\n private ensureLayout(): void {\n if (!this.config.layout) {\n this.config.layout = { mode: 'auto' };\n }\n }\n\n /**\n * Asegura que el PluginManager existe en la configuración.\n * @private\n */\n private ensurePluginManager(): PluginManager {\n if (!this.config.pluginManager) {\n this.config.pluginManager = new PluginManager();\n }\n return this.config.pluginManager;\n }\n\n /**\n * Valida la configuración de botones.\n * @private\n */\n private validateButtons(buttons: FormButtons): void {\n const validAligns = ['start', 'center', 'end', 'between', 'responsive'];\n\n if (buttons.align && !validAligns.includes(buttons.align)) {\n throw new Error(\n `[@saastro/forms] Invalid button align value: \"${buttons.align}\".\\n` +\n `Valid values are: ${validAligns.join(', ')}\\n` +\n `Example: .buttons({ align: \"center\" })`,\n );\n }\n }\n\n /**\n * Crea una nueva instancia del builder.\n *\n * @param formId - ID único del formulario\n * @returns Nueva instancia de FormBuilder\n *\n * @example\n * ```tsx\n * const form = FormBuilder.create(\"registro\")\n * .layout(\"manual\")\n * .columns(4)\n * .build();\n * ```\n */\n static create(formId: string): FormBuilder {\n const builder = new FormBuilder();\n builder.config.formId = formId;\n return builder;\n }\n\n /**\n * Configura el modo de layout del formulario.\n *\n * @param mode - \"auto\" (adaptativo) o \"manual\" (fijo)\n * @returns this para encadenamiento\n */\n layout(mode: 'auto' | 'manual'): this {\n this.ensureLayout();\n this.config.layout!.mode = mode;\n return this;\n }\n\n /**\n * Configura el gap entre campos.\n *\n * @param gap - Valor de gap (1-12), cada unidad = 0.25rem\n * @returns this para encadenamiento\n */\n gap(gap: GapValue): this {\n this.ensureLayout();\n this.config.layout!.gap = gap;\n return this;\n }\n\n /**\n * Configura el número de columnas del grid.\n *\n * - En modo 'manual': crea un grid fijo de N columnas (col-span funciona)\n * - En modo 'auto': actúa como límite máximo de columnas\n *\n * @param columns - Número de columnas (1-12)\n * @returns this para encadenamiento\n */\n columns(columns: ColumnsValue): this {\n this.ensureLayout();\n this.config.layout!.columns = columns;\n return this;\n }\n\n /**\n * Configura el ancho mínimo de campo (solo para modo \"auto\").\n *\n * @param minWidth - Ancho mínimo en píxeles\n * @returns this para encadenamiento\n */\n minFieldWidth(minWidth: number): this {\n this.ensureLayout();\n this.config.layout!.minFieldWidth = minWidth;\n return this;\n }\n\n /**\n * Agrega clases CSS personalizadas al contenedor del formulario.\n *\n * @param className - Clases CSS\n * @returns this para encadenamiento\n */\n layoutClassName(className: string): this {\n this.ensureLayout();\n this.config.layout!.className = className;\n return this;\n }\n\n /**\n * Agrega un campo al formulario usando un builder fluido.\n *\n * @param name - Nombre único del campo\n * @param builder - Función que recibe un FieldBuilder y retorna la configuración\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * builder.addField(\"email\", field =>\n * field\n * .type(\"email\")\n * .label(\"Email\")\n * .schema(z.string().email())\n * .columns({ default: 12, md: 6 })\n * )\n * ```\n */\n addField(name: string, builder: (field: FieldBuilder) => FieldBuilder): this {\n const fieldBuilder = new FieldBuilder(name);\n this.config.fields![name] = builder(fieldBuilder).build();\n return this;\n }\n\n /**\n * Agrega múltiples campos al formulario.\n *\n * @param fields - Objeto con campos configurados\n * @returns this para encadenamiento\n */\n addFields(fields: Fields): this {\n this.config.fields = { ...this.config.fields, ...fields };\n return this;\n }\n\n /**\n * Agrega un step al formulario.\n *\n * @param stepId - ID único del step\n * @param fields - Array de nombres de campos que pertenecen a este step\n * @param options - Opciones adicionales del step\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * builder.addStep(\"step1\", [\"email\", \"password\"])\n * ```\n */\n addStep(\n stepId: string,\n fields: string[],\n options?: {\n defaultNext?: string;\n next?: StepCondition[];\n },\n ): this {\n this.config.steps![stepId] = {\n id: stepId,\n fields,\n ...options,\n };\n return this;\n }\n\n /**\n * Configura el step inicial del formulario.\n *\n * @param stepId - ID del step inicial\n * @returns this para encadenamiento\n */\n initialStep(stepId: string): this {\n this.config.initialStep = stepId;\n return this;\n }\n\n /**\n * Configura el callback de éxito.\n *\n * @param callback - Función que se ejecuta al enviar exitosamente\n * @returns this para encadenamiento\n */\n onSuccess(callback: (values: Record<string, unknown>) => void): this {\n this.config.onSuccess = callback;\n return this;\n }\n\n /**\n * Configura el callback de error.\n *\n * @param callback - Función que se ejecuta al fallar el envío\n * @returns this para encadenamiento\n */\n onError(callback: (error: Error, values: Record<string, unknown>) => void): this {\n this.config.onError = callback;\n return this;\n }\n\n /**\n * Configura el callback de cambio de step.\n *\n * @param callback - Función que se ejecuta al cambiar de step\n * @returns this para encadenamiento\n */\n onStepChange(callback: (stepId: string) => void): this {\n this.config.onStepChange = callback;\n return this;\n }\n\n /**\n * Configura el mensaje de éxito.\n *\n * @param message - Mensaje estático o función que retorna el mensaje\n * @returns this para encadenamiento\n */\n successMessage(message: string | ((values: Record<string, unknown>) => string)): this {\n this.config.successMessage = message;\n return this;\n }\n\n /**\n * Configura el mensaje de error.\n *\n * @param message - Mensaje estático o función que retorna el mensaje\n * @returns this para encadenamiento\n */\n errorMessage(\n message: string | ((error: Error, values: Record<string, unknown>) => string),\n ): this {\n this.config.errorMessage = message;\n return this;\n }\n\n /**\n * Configura los botones del formulario.\n *\n * @param buttons - Configuración de botones\n * @returns this para encadenamiento\n */\n buttons(buttons: FormButtons): this {\n this.validateButtons(buttons);\n this.config.buttons = buttons;\n return this;\n }\n\n /**\n * Configura el envío del formulario.\n *\n * @param submit - Configuración de envío\n * @returns this para encadenamiento\n */\n submit(submit: SubmitConfig): this {\n this.config.submit = submit;\n return this;\n }\n\n /**\n * Redirect after successful submission.\n *\n * @param url - Static URL string or function that receives values and returns URL\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * FormBuilder.create(\"lead\")\n * .redirect(\"/thanks\")\n * // or dynamic:\n * .redirect((values) => `/thanks?email=${values.email}`)\n * ```\n */\n redirect(url: string | ((values: Record<string, unknown>) => string)): this {\n this.config.redirect = url;\n return this;\n }\n\n /**\n * Configura el gestor de plugins del formulario.\n *\n * @param pluginManager - Instancia de PluginManager con plugins registrados\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * import { FormBuilder, PluginManager, analyticsPlugin } from \"@saastro/forms\";\n *\n * const pluginManager = new PluginManager();\n * pluginManager.register(analyticsPlugin());\n *\n * const form = FormBuilder.create(\"my-form\")\n * .usePlugins(pluginManager)\n * .addField(\"name\", f => f.type(\"text\").label(\"Name\"))\n * .build();\n * ```\n */\n usePlugins(pluginManager: PluginManager): this {\n this.config.pluginManager = pluginManager;\n return this;\n }\n\n /**\n * Enable DataBowl lead integration.\n *\n * Automatically registers the DataBowl plugin, which injects an HTTP submit\n * action via `transformConfig` and merges `staticFields` via `transformValues`.\n * Compatible with other plugins — can be combined with `.usePlugins()`.\n *\n * @param config - DataBowl configuration\n * @returns this for chaining\n *\n * @example\n * ```tsx\n * FormBuilder.create(\"lead-energy\")\n * .addField(\"nombre\", f => f.type(\"text\").label(\"Nombre\"))\n * .addField(\"email\", f => f.type(\"email\").label(\"Email\"))\n * .addField(\"telefono\", f => f.type(\"tel\").label(\"Teléfono\"))\n * .addStep(\"main\", [\"nombre\", \"email\", \"telefono\"])\n *\n * .useDatabowl({\n * token: import.meta.env.DATABOWL_TOKEN,\n * fieldMapping: {\n * nombre: \"first_name\",\n * email: \"email_address\",\n * telefono: \"phone\",\n * },\n * staticFields: {\n * source: \"landing-energy\",\n * campaign: \"google-ads\",\n * },\n * })\n *\n * .redirect(\"/gracias\")\n * .build();\n * ```\n */\n useDatabowl(config: DatabowlConfig): this {\n const pm = this.ensurePluginManager();\n pm.register(databowlPlugin(config));\n return this;\n }\n\n /**\n * Configura advertencia de confirmación para campos opcionales.\n *\n * Permite mostrar una advertencia cuando el usuario intenta enviar el formulario\n * (o navegar entre steps) con campos opcionales vacíos. El botón cambia su texto\n * y variant, requiriendo un segundo click para confirmar.\n *\n * @param config - Configuración de confirmación\n * @returns this para encadenamiento\n *\n * @example\n * ```tsx\n * FormBuilder.create(\"registro\")\n * .addField(\"email\", f => f.type(\"email\").label(\"Email\").schema(z.string().email()))\n * .addField(\"phone\", f => f.type(\"text\").label(\"Teléfono (opcional)\"))\n * .addStep(\"main\", [\"email\", \"phone\"])\n *\n * .submitConfirmation({\n * optionalFields: [\n * {\n * name: \"phone\",\n * message: \"Sin teléfono no podremos contactarte para confirmar\"\n * }\n * ],\n * buttonBehavior: {\n * warningText: \"⚠️ Continuar sin teléfono\",\n * warningVariant: \"outline\",\n * resetDelay: 4000\n * },\n * applyOn: \"submit\",\n * showOnce: true\n * })\n *\n * .buttons({\n * submit: { type: \"submit\", label: \"Crear Cuenta\" }\n * })\n * .build();\n * ```\n */\n submitConfirmation(config: SubmitConfirmationConfig): this {\n this.config.submitConfirmation = config;\n return this;\n }\n\n /**\n * Add a modular submit action to the form.\n *\n * Submit actions replace the legacy `.submit()` config with a more flexible system\n * that supports multiple endpoints, webhooks, emails, and custom handlers — each\n * with its own trigger, condition, and execution order.\n *\n * @param id - Unique action identifier\n * @param action - Action configuration (http, webhook, email, or custom)\n * @param trigger - When to execute: trigger type string or full SubmitTrigger object\n * @param options - Optional: condition, order, continueOnError, disabled\n * @returns this for chaining\n *\n * @example\n * ```tsx\n * FormBuilder.create(\"lead\")\n * .addField(\"email\", f => f.type(\"email\").label(\"Email\"))\n * .addField(\"name\", f => f.type(\"text\").label(\"Name\"))\n * .addStep(\"main\", [\"email\", \"name\"])\n *\n * // HTTP POST to your API\n * .submitAction(\"save-lead\", {\n * type: \"http\",\n * name: \"Save Lead\",\n * endpoint: { url: \"/api/leads\", method: \"POST\" },\n * body: { format: \"json\" },\n * }, \"onSubmit\")\n *\n * // Webhook to external service\n * .submitAction(\"notify-crm\", {\n * type: \"webhook\",\n * name: \"CRM Webhook\",\n * url: \"https://hooks.example.com/lead\",\n * }, \"onSubmit\", { continueOnError: true, order: 2 })\n *\n * // Custom handler\n * .submitAction(\"analytics\", {\n * type: \"custom\",\n * name: \"Track Conversion\",\n * handler: async (values) => { analytics.track(\"lead\", values); },\n * }, \"onSubmit\", { continueOnError: true })\n *\n * // Field mapping: form uses \"nombre\"/\"email\", API expects \"first_name\"/\"email_address\"\n * .submitAction(\"crm\", {\n * type: \"http\",\n * name: \"CRM Sync\",\n * endpoint: { url: \"https://crm.example.com/api/leads\", method: \"POST\" },\n * }, \"onSubmit\", {\n * fieldMapping: { nombre: \"first_name\", email: \"email_address\" },\n * })\n *\n * .submitExecution({ mode: \"sequential\", stopOnFirstError: true })\n * .build();\n * ```\n */\n submitAction(\n id: string,\n action: SubmitAction,\n trigger: SubmitTriggerType | SubmitTrigger,\n options?: {\n condition?: SubmitActionCondition;\n order?: number;\n continueOnError?: boolean;\n disabled?: boolean;\n /** Map form field names to API-expected field names (simple or advanced) */\n fieldMapping?: FieldMappingConfig;\n },\n ): this {\n if (!this.config.submitActions) {\n this.config.submitActions = {};\n }\n\n const triggerObj: SubmitTrigger = typeof trigger === 'string' ? { type: trigger } : trigger;\n\n this.config.submitActions[id] = {\n id,\n action,\n trigger: triggerObj,\n ...options,\n };\n\n return this;\n }\n\n /**\n * Configure how multiple submit actions are executed.\n *\n * @param config - Execution configuration\n * @returns this for chaining\n *\n * @example\n * ```tsx\n * builder\n * .submitAction(\"primary\", { ... }, \"onSubmit\")\n * .submitAction(\"secondary\", { ... }, \"onSubmit\", { continueOnError: true })\n * .submitExecution({ mode: \"sequential\", stopOnFirstError: true })\n * ```\n */\n submitExecution(config: SubmitExecutionConfig): this {\n this.config.submitExecution = config;\n return this;\n }\n\n /**\n * Construye y valida la configuración final del formulario.\n *\n * @returns FormConfig completo y validado\n * @throws Error si falta información requerida\n */\n build(): FormConfig {\n // Validaciones con mensajes mejorados\n if (!this.config.formId) {\n throw new Error(\n '[@saastro/forms] FormBuilder: formId is required.\\n' +\n \"Use FormBuilder.create('yourFormId') to create a builder.\\n\" +\n \"Example: FormBuilder.create('contact-form')\",\n );\n }\n\n if (!this.config.fields || Object.keys(this.config.fields).length === 0) {\n throw new Error(\n '[@saastro/forms] FormBuilder: at least one field is required.\\n' +\n 'Use .addField() to add fields to your form.\\n' +\n \"Example: .addField('email', f => f.type('email').label('Email'))\",\n );\n }\n\n if (!this.config.steps || Object.keys(this.config.steps).length === 0) {\n throw new Error(\n '[@saastro/forms] FormBuilder: at least one step is required.\\n' +\n 'Use .addStep() to create steps for your form.\\n' +\n \"Example: .addStep('main', ['email', 'password'])\",\n );\n }\n\n // Validar que todos los campos en steps existen\n for (const [stepId, step] of Object.entries(this.config.steps)) {\n for (const fieldName of step.fields) {\n if (!this.config.fields[fieldName]) {\n const availableFields = Object.keys(this.config.fields).join(', ');\n throw new Error(\n `[@saastro/forms] FormBuilder: field \"${fieldName}\" in step \"${stepId}\" does not exist.\\n` +\n `Available fields: ${availableFields}\\n` +\n `Did you forget to add this field with .addField()?`,\n );\n }\n }\n }\n\n // Validar initialStep\n if (this.config.initialStep && !this.config.steps[this.config.initialStep]) {\n const availableSteps = Object.keys(this.config.steps).join(', ');\n throw new Error(\n `[@saastro/forms] FormBuilder: initialStep \"${this.config.initialStep}\" does not exist.\\n` +\n `Available steps: ${availableSteps}\\n` +\n `Use one of the existing step IDs or create this step first.`,\n );\n }\n\n return this.config as FormConfig;\n }\n\n /**\n * Construye sin validaciones (útil para desarrollo).\n *\n * @returns FormConfig parcial\n */\n buildUnsafe(): Partial<FormConfig> {\n return this.config;\n }\n}\n","/**\n * ============================================\n * FIELD BUILDER REGISTRY MAP\n * ============================================\n *\n * Single source of truth that keeps FieldBuilder methods, the TSX code generator,\n * and the docs in sync. A contract test verifies all three stay aligned.\n *\n * When `method` is omitted in a PropertyMapping, it defaults to `prop` (the common case).\n * Entries where prop ≠ method are the historic bug sources (e.g. presets → datePresets).\n */\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport type SerializationHint = 'string' | 'number' | 'boolean' | 'json';\n\nexport type PropertyMapping = {\n /** The config property name on the FieldConfig object */\n prop: string;\n /** The FieldBuilder method name. Defaults to `prop` if omitted. */\n method?: string;\n /** How to serialize the value in generated code */\n serialize: SerializationHint;\n};\n\n// ─── Type-Specific Properties ────────────────────────────────\n\n/**\n * Maps field types to their type-specific config properties and the\n * corresponding FieldBuilder methods. Used by the TSX generator to\n * emit the correct method calls.\n */\nexport const TYPE_SPECIFIC_PROPERTIES: Record<string, PropertyMapping[]> = {\n slider: [\n { prop: 'min', serialize: 'number' },\n { prop: 'max', serialize: 'number' },\n { prop: 'step', serialize: 'number' },\n { prop: 'variant', method: 'sliderVariant', serialize: 'string' },\n { prop: 'orientation', method: 'sliderOrientation', serialize: 'string' },\n { prop: 'thumbCount', serialize: 'number' },\n { prop: 'showLabels', serialize: 'boolean' },\n { prop: 'showValue', serialize: 'boolean' },\n { prop: 'valueFormat', serialize: 'string' },\n { prop: 'defaultValue', serialize: 'json' },\n ],\n\n date: [\n { prop: 'dateType', serialize: 'string' },\n { prop: 'showTime', serialize: 'boolean' },\n { prop: 'presets', method: 'datePresets', serialize: 'json' },\n ],\n\n daterange: [],\n\n combobox: [\n { prop: 'searchPlaceholder', serialize: 'string' },\n { prop: 'emptyText', serialize: 'string' },\n ],\n\n command: [\n { prop: 'searchPlaceholder', serialize: 'string' },\n { prop: 'emptyText', serialize: 'string' },\n ],\n\n 'button-card': [{ prop: 'multiple', serialize: 'boolean' }],\n\n otp: [{ prop: 'length', method: 'otpLength', serialize: 'number' }],\n\n 'input-group': [\n { prop: 'prefix', serialize: 'string' },\n { prop: 'suffix', serialize: 'string' },\n ],\n\n textarea: [\n { prop: 'rows', serialize: 'number' },\n { prop: 'maxLength', serialize: 'number' },\n ],\n\n currency: [\n { prop: 'prefix', serialize: 'string' },\n { prop: 'suffix', serialize: 'string' },\n ],\n\n range: [\n { prop: 'min', serialize: 'number' },\n { prop: 'max', serialize: 'number' },\n { prop: 'step', serialize: 'number' },\n { prop: 'variant', method: 'sliderVariant', serialize: 'string' },\n { prop: 'orientation', method: 'sliderOrientation', serialize: 'string' },\n { prop: 'thumbCount', serialize: 'number' },\n { prop: 'showLabels', serialize: 'boolean' },\n { prop: 'showValue', serialize: 'boolean' },\n { prop: 'valueFormat', serialize: 'string' },\n { prop: 'defaultValue', serialize: 'json' },\n ],\n\n file: [\n { prop: 'accept', serialize: 'string' },\n { prop: 'multiple', serialize: 'boolean' },\n { prop: 'maxSize', serialize: 'number' },\n ],\n\n repeater: [\n { prop: 'itemFields', serialize: 'json' },\n { prop: 'minItems', serialize: 'number' },\n { prop: 'maxItems', serialize: 'number' },\n { prop: 'addLabel', serialize: 'string' },\n { prop: 'removeLabel', serialize: 'string' },\n ],\n\n hidden: [{ prop: 'resolver', serialize: 'json' }],\n};\n\n// ─── Option-Based Types ──────────────────────────────────────\n\n/**\n * Field types that accept an `.options()` array.\n * The generator emits `.options(...)` for these when options exist.\n */\nexport const OPTION_BASED_TYPES: string[] = [\n 'select',\n 'radio',\n 'button-radio',\n 'checkbox-group',\n 'switch-group',\n 'button-checkbox',\n 'native-select',\n 'combobox',\n 'command',\n 'button-card',\n];\n\n// ─── Method Categories ───────────────────────────────────────\n\n/**\n * Methods available on all field types (common configuration).\n */\nexport const COMMON_METHODS: string[] = [\n 'type',\n 'label',\n 'hideLabel',\n 'schema',\n 'customValidators',\n 'placeholder',\n 'value',\n 'helperText',\n 'tooltip',\n 'icon',\n 'size',\n 'options',\n 'buttonCardOptions',\n 'hidden',\n 'disabled',\n 'readOnly',\n 'layout',\n 'columns',\n 'order',\n 'classNames',\n 'transform',\n 'defaultValue',\n 'description',\n 'autocomplete',\n 'optionsClassName',\n];\n\n/**\n * Declarative validation methods (produce ValidationRules).\n */\nexport const VALIDATION_METHODS: string[] = [\n 'required',\n 'optional',\n 'minLength',\n 'maxLengthValidation',\n 'email',\n 'url',\n 'regex',\n 'numberRange',\n 'itemCount',\n 'mustBeTrue',\n 'preset',\n];\n\n/**\n * Build methods (terminal operations).\n */\nexport const BUILD_METHODS: string[] = ['build', 'buildUnsafe'];\n\n// ─── Derived Helpers ─────────────────────────────────────────\n\n/**\n * Extracts all unique method names referenced in TYPE_SPECIFIC_PROPERTIES.\n */\nfunction getTypeSpecificMethods(): string[] {\n const methods = new Set<string>();\n for (const mappings of Object.values(TYPE_SPECIFIC_PROPERTIES)) {\n for (const m of mappings) {\n methods.add(m.method ?? m.prop);\n }\n }\n return [...methods];\n}\n\n/**\n * Returns the union of all known FieldBuilder method names across all categories.\n * Used by the contract test to verify FieldBuilder ↔ Map completeness.\n *\n * Includes: common, type-specific, validation, build methods,\n * plus composite helpers like `range()` that set multiple props.\n */\nexport function getAllKnownMethods(): string[] {\n const all = new Set<string>([\n ...COMMON_METHODS,\n ...getTypeSpecificMethods(),\n ...VALIDATION_METHODS,\n ...BUILD_METHODS,\n // Composite helpers that don't map 1:1 to a config prop\n 'range', // sets min + max + step\n 'multiple', // button-card specific\n 'searchPlaceholder', // combobox/command\n 'emptyText', // combobox/command\n 'prefix', // input-group\n 'suffix', // input-group\n 'rows', // textarea\n 'maxLength', // textarea\n 'resolver', // hidden\n 'accept', // file\n 'maxSize', // file\n 'itemFields', // repeater\n 'minItems', // repeater\n 'maxItems', // repeater\n 'addLabel', // repeater\n 'removeLabel', // repeater\n ]);\n return [...all];\n}\n","import type { FormConfig } from '../types/common';\nimport { definePlugin } from '../types/plugin';\n\n/**\n * Generates the localStorage key for a form.\n */\nfunction getStorageKey(formId: string): string {\n return `form-${formId}`;\n}\n\n/**\n * Plugin para persistir el estado del formulario en localStorage.\n *\n * Uses `transformConfig` to restore saved values as field defaults,\n * `onFieldChange` to persist progress, and `onAfterSubmit` to clean up.\n *\n * @example\n * ```tsx\n * const pluginManager = new PluginManager();\n * pluginManager.register(localStoragePlugin);\n *\n * const config = FormBuilder.create('contact')\n * .addField('name', f => f.type('text').label('Name'))\n * .pluginManager(pluginManager)\n * .build();\n *\n * // On page reload, field values are automatically restored.\n * ```\n */\nexport const localStoragePlugin = definePlugin({\n name: 'localStorage',\n version: '1.1.0',\n description: 'Persiste el estado del formulario en localStorage',\n\n transformConfig(config: FormConfig): FormConfig {\n if (typeof window === 'undefined') return config;\n\n const storageKey = getStorageKey(config.formId);\n\n let saved: Record<string, unknown> | null = null;\n try {\n const raw = localStorage.getItem(storageKey);\n if (raw) {\n saved = JSON.parse(raw);\n }\n } catch {\n // Corrupted data — ignore and let form use original defaults\n }\n\n if (!saved || typeof saved !== 'object') return config;\n\n // Inject saved values as field defaults via the `value` property\n const fields = { ...config.fields };\n for (const [fieldName, savedValue] of Object.entries(saved)) {\n if (fields[fieldName] && savedValue !== undefined && savedValue !== '') {\n fields[fieldName] = { ...fields[fieldName], value: savedValue };\n }\n }\n\n return { ...config, fields };\n },\n\n onFieldChange(_fieldName, _value, allValues) {\n if (typeof window === 'undefined') return;\n\n // We need the formId but onFieldChange doesn't receive config.\n // Store with a session key; transformConfig will read with the correct key.\n // The formId is set during onFormInit.\n const storageKey = (this as any).__storageKey || 'form-progress';\n try {\n localStorage.setItem(storageKey, JSON.stringify(allValues));\n } catch {\n // localStorage full or unavailable — silently ignore\n }\n },\n\n onFormInit(config) {\n // Cache the storage key so onFieldChange/onAfterSubmit can use it\n (this as any).__storageKey = getStorageKey(config.formId);\n },\n\n onAfterSubmit() {\n if (typeof window === 'undefined') return;\n\n const storageKey = (this as any).__storageKey || 'form-progress';\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // Silently ignore\n }\n },\n\n cleanup() {\n delete (this as any).__storageKey;\n },\n});\n","import { definePlugin } from '../types/plugin';\n\n/**\n * Plugin para tracking de analytics (Google Analytics, Mixpanel, etc.).\n *\n * @param options - Opciones de configuración\n * @returns Plugin configurado\n *\n * @example\n * ```tsx\n * const pluginManager = new PluginManager();\n * pluginManager.register(analyticsPlugin());\n * ```\n */\nexport const analyticsPlugin = definePlugin({\n name: 'analytics',\n version: '1.0.0',\n description: 'Tracking de eventos para analytics',\n\n onFormInit(config) {\n // Track form initialization\n if (typeof window !== 'undefined' && (window as any).gtag) {\n (window as any).gtag('event', 'form_init', {\n form_id: config.formId,\n });\n }\n },\n\n onStepChange(stepId, values) {\n // Track step changes\n if (typeof window !== 'undefined' && (window as any).gtag) {\n (window as any).gtag('event', 'form_step', {\n step_id: stepId,\n });\n }\n },\n\n onAfterSubmit(values, response) {\n // Track successful submission\n if (typeof window !== 'undefined' && (window as any).gtag) {\n (window as any).gtag('event', 'form_submit', {\n success: true,\n });\n }\n },\n\n onError(error, values) {\n // Track errors\n if (typeof window !== 'undefined' && (window as any).gtag) {\n (window as any).gtag('event', 'form_error', {\n error_message: error.message,\n });\n }\n },\n});\n","import { definePlugin } from '../types/plugin';\n\n/**\n * Plugin para guardado automático periódico.\n *\n * @param options - Opciones de configuración\n * @returns Plugin configurado\n *\n * @example\n * ```tsx\n * const pluginManager = new PluginManager();\n * pluginManager.register(autosavePlugin({ interval: 30000 })); // 30 segundos\n * ```\n */\nexport const autosavePlugin = (options?: { interval?: number; endpoint?: string }) =>\n definePlugin({\n name: 'autosave',\n version: '1.0.0',\n description: 'Guardado automático periódico del formulario',\n options,\n\n onFieldChange(fieldName, value, allValues) {\n const interval = options?.interval || 60000; // 1 minuto por defecto\n const endpoint = options?.endpoint || '/api/autosave';\n\n // Debounce el guardado automático\n if (typeof window !== 'undefined') {\n const key = 'autosave-timeout';\n const existingTimeout = (window as any)[key];\n\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n }\n\n (window as any)[key] = setTimeout(async () => {\n try {\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(allValues),\n });\n } catch (error) {\n console.error('autosave plugin: Error saving', error);\n }\n }, interval);\n }\n },\n\n cleanup() {\n if (typeof window !== 'undefined') {\n const key = 'autosave-timeout';\n const existingTimeout = (window as any)[key];\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n }\n }\n },\n });\n","/**\n * ============================================\n * RECAPTCHA PLUGIN - Google reCAPTCHA v3\n * ============================================\n *\n * Injects the reCAPTCHA v3 script and attaches a fresh token\n * to every submission via `transformValues`.\n */\n\nimport { definePlugin } from '../types/plugin';\n\nexport interface RecaptchaPluginConfig {\n /** reCAPTCHA v3 site key */\n siteKey: string;\n /** Action name sent to Google (default: 'submit') */\n action?: string;\n /** Field name for the token in submitted values (default: '_recaptchaToken') */\n tokenField?: string;\n}\n\ndeclare global {\n interface Window {\n grecaptcha?: {\n ready: (cb: () => void) => void;\n execute: (siteKey: string, options: { action: string }) => Promise<string>;\n };\n }\n}\n\n/**\n * Google reCAPTCHA v3 plugin.\n *\n * - `onFormInit`: Injects the reCAPTCHA script into `<body>` (once, deduped)\n * - `transformValues`: Fetches a fresh token and adds it to the submitted values\n * - `cleanup`: Removes the injected script\n *\n * @example\n * ```tsx\n * import { recaptchaPlugin, PluginManager, FormBuilder } from '@saastro/forms';\n *\n * const pm = new PluginManager();\n * pm.register(recaptchaPlugin({ siteKey: 'your-site-key' }));\n *\n * const config = FormBuilder.create('contact')\n * .usePlugins(pm)\n * .addField('email', (f) => f.type('email').label('Email').required().email())\n * .addStep('main', ['email'])\n * .build();\n * ```\n */\nexport function recaptchaPlugin(config: RecaptchaPluginConfig) {\n const { siteKey, action = 'submit', tokenField = '_recaptchaToken' } = config;\n let scriptElement: HTMLScriptElement | null = null;\n\n return definePlugin({\n name: 'recaptcha-v3',\n version: '1.0.0',\n description: 'Google reCAPTCHA v3 — script injection and token generation',\n\n onFormInit() {\n if (typeof window === 'undefined') return;\n\n // Already loaded\n if (window.grecaptcha) return;\n\n // Script already in DOM (injected by another instance or manually)\n if (document.querySelector('script[src*=\"recaptcha/api.js\"]')) return;\n\n scriptElement = document.createElement('script');\n scriptElement.src = `https://www.google.com/recaptcha/api.js?render=${siteKey}`;\n scriptElement.async = true;\n scriptElement.defer = true;\n document.body.appendChild(scriptElement);\n },\n\n async transformValues(values) {\n if (typeof window === 'undefined' || !window.grecaptcha) {\n return values;\n }\n\n try {\n const token = await new Promise<string>((resolve, reject) => {\n window.grecaptcha!.ready(() => {\n window.grecaptcha!.execute(siteKey, { action }).then(resolve).catch(reject);\n });\n });\n\n return { ...values, [tokenField]: token };\n } catch (error) {\n console.error('recaptchaPlugin: Failed to get token:', error);\n return values;\n }\n },\n\n cleanup() {\n if (scriptElement?.parentNode) {\n scriptElement.parentNode.removeChild(scriptElement);\n scriptElement = null;\n }\n },\n });\n}\n","/**\n * ============================================\n * SHADCN/UI PRESET - Component Registry\n * ============================================\n *\n * Preset predefinido para usar con shadcn/ui.\n * Los usuarios pueden importar este preset y usarlo directamente,\n * o crear su propio mapeo personalizado.\n */\n\nimport type { ComponentRegistry, ComponentRegistryInput } from '../types/components';\n\n/**\n * Crea un registry de componentes UI a partir de un objeto con los componentes importados.\n * Genérico — funciona con shadcn/ui, saastro, o cualquier set de componentes compatibles.\n *\n * @param components - Objeto con todos los componentes UI importados\n * @returns ComponentRegistry completo listo para usar con ComponentProvider\n *\n * @example\n * ```tsx\n * import { ComponentProvider, createComponentRegistry } from \"@saastro/forms\";\n * import * as uiComponents from \"@/lib/form-components-shadcn\";\n *\n * const registry = createComponentRegistry(uiComponents);\n *\n * function App() {\n * return (\n * <ComponentProvider components={registry}>\n * <MyForm />\n * </ComponentProvider>\n * );\n * }\n * ```\n */\nexport function createComponentRegistry(components: ComponentRegistryInput): ComponentRegistry {\n return {\n // Inputs\n Input: components.Input,\n Textarea: components.Textarea,\n Button: components.Button,\n Label: components.Label,\n\n // Checkbox & Switch\n Checkbox: components.Checkbox,\n Switch: components.Switch,\n\n // Radio Group\n RadioGroup: components.RadioGroup,\n RadioGroupItem: components.RadioGroupItem,\n\n // Select\n Select: components.Select,\n SelectTrigger: components.SelectTrigger,\n SelectContent: components.SelectContent,\n SelectItem: components.SelectItem,\n SelectValue: components.SelectValue,\n\n // Native Select\n NativeSelect: components.NativeSelect,\n\n // Slider\n Slider: components.Slider,\n\n // Popover\n Popover: components.Popover,\n PopoverTrigger: components.PopoverTrigger,\n PopoverContent: components.PopoverContent,\n\n // Tooltip\n Tooltip: components.Tooltip,\n TooltipTrigger: components.TooltipTrigger,\n TooltipContent: components.TooltipContent,\n TooltipProvider: components.TooltipProvider,\n\n // Separator\n Separator: components.Separator,\n\n // Dialog\n Dialog: components.Dialog,\n DialogTrigger: components.DialogTrigger,\n DialogContent: components.DialogContent,\n DialogHeader: components.DialogHeader,\n DialogTitle: components.DialogTitle,\n DialogDescription: components.DialogDescription,\n\n // Command\n Command: components.Command,\n CommandInput: components.CommandInput,\n CommandList: components.CommandList,\n CommandEmpty: components.CommandEmpty,\n CommandGroup: components.CommandGroup,\n CommandItem: components.CommandItem,\n\n // Input OTP\n InputOTP: components.InputOTP,\n InputOTPGroup: components.InputOTPGroup,\n InputOTPSlot: components.InputOTPSlot,\n\n // Accordion\n Accordion: components.Accordion,\n AccordionItem: components.AccordionItem,\n AccordionTrigger: components.AccordionTrigger,\n AccordionContent: components.AccordionContent,\n\n // Calendar\n Calendar: components.Calendar,\n\n // Form components\n FormField: components.FormField,\n FormControl: components.FormControl,\n\n // Field components\n Field: components.Field,\n FieldLabel: components.FieldLabel,\n FieldDescription: components.FieldDescription,\n FieldError: components.FieldError,\n };\n}\n\n/** @deprecated Use createComponentRegistry instead */\nexport const createShadcnRegistry = createComponentRegistry;\n","/**\n * ============================================\n * COMPONENT RESOLVER - Auto-discovery System\n * ============================================\n *\n * Automatically resolves UI components from the user's project.\n * Detects shadcn/ui installation and loads components dynamically.\n *\n * Features:\n * - Zero config for shadcn/ui projects\n * - Caches resolved components\n * - Graceful fallback for missing components\n * - Works with custom component paths\n */\n\nimport type React from 'react';\nimport type { ComponentRegistry, PartialComponentRegistry } from '../types/components';\n\n/**\n * Configuration for component resolution\n */\nexport interface ComponentResolverConfig {\n /** Base path for UI components (e.g., \"@/components/ui\") */\n uiPath?: string;\n /** Custom component importers for non-standard setups */\n importers?: Record<string, () => Promise<React.ComponentType<any>>>;\n}\n\n/**\n * Result of component resolution\n */\nexport interface ResolvedComponents {\n /** Successfully resolved components */\n components: PartialComponentRegistry;\n /** Components that failed to load */\n missing: string[];\n}\n\n/**\n * Mapping of component name to its typical file location in shadcn/ui\n */\nconst COMPONENT_FILE_MAP: Record<keyof ComponentRegistry, string> = {\n // Inputs\n Input: 'input',\n Textarea: 'textarea',\n Button: 'button',\n Label: 'label',\n\n // Checkbox & Switch\n Checkbox: 'checkbox',\n Switch: 'switch',\n\n // Radio Group\n RadioGroup: 'radio-group',\n RadioGroupItem: 'radio-group',\n\n // Select\n Select: 'select',\n SelectTrigger: 'select',\n SelectContent: 'select',\n SelectItem: 'select',\n SelectValue: 'select',\n\n // Native Select (custom component)\n NativeSelect: 'native-select',\n\n // Slider\n Slider: 'slider',\n\n // Popover\n Popover: 'popover',\n PopoverTrigger: 'popover',\n PopoverContent: 'popover',\n\n // Tooltip\n Tooltip: 'tooltip',\n TooltipTrigger: 'tooltip',\n TooltipContent: 'tooltip',\n TooltipProvider: 'tooltip',\n\n // Separator\n Separator: 'separator',\n\n // Dialog\n Dialog: 'dialog',\n DialogTrigger: 'dialog',\n DialogContent: 'dialog',\n DialogHeader: 'dialog',\n DialogTitle: 'dialog',\n DialogDescription: 'dialog',\n\n // Command\n Command: 'command',\n CommandInput: 'command',\n CommandList: 'command',\n CommandEmpty: 'command',\n CommandGroup: 'command',\n CommandItem: 'command',\n\n // Input OTP\n InputOTP: 'input-otp',\n InputOTPGroup: 'input-otp',\n InputOTPSlot: 'input-otp',\n\n // Accordion\n Accordion: 'accordion',\n AccordionItem: 'accordion',\n AccordionTrigger: 'accordion',\n AccordionContent: 'accordion',\n\n // Calendar\n Calendar: 'calendar',\n\n // Form components (from shadcn/ui form)\n FormField: 'form',\n FormControl: 'form',\n\n // Field components (custom)\n Field: 'field',\n FieldLabel: 'field',\n FieldDescription: 'field',\n FieldError: 'field',\n};\n\n/**\n * Export name mapping for components that use different export names\n */\nconst COMPONENT_EXPORT_MAP: Partial<Record<keyof ComponentRegistry, string>> = {\n // Most components export with their exact name, but some may differ\n};\n\n/**\n * Singleton instance\n */\nlet resolverInstance: ComponentResolver | null = null;\n\n/**\n * ComponentResolver - Handles auto-discovery and caching of UI components\n */\nexport class ComponentResolver {\n private cache = new Map<string, React.ComponentType<any> | null>();\n private uiPath: string;\n private importers: Record<string, () => Promise<React.ComponentType<any>>>;\n private resolvePromises = new Map<string, Promise<React.ComponentType<any> | null>>();\n\n constructor(config: ComponentResolverConfig = {}) {\n this.uiPath = config.uiPath || '@/components/ui';\n this.importers = config.importers || {};\n }\n\n /**\n * Get or create the singleton resolver instance\n */\n static getInstance(config?: ComponentResolverConfig): ComponentResolver {\n if (!resolverInstance) {\n resolverInstance = new ComponentResolver(config);\n }\n return resolverInstance;\n }\n\n /**\n * Reset the singleton (useful for testing)\n */\n static reset(): void {\n resolverInstance = null;\n }\n\n /**\n * Configure the resolver's UI path\n */\n setUiPath(path: string): void {\n this.uiPath = path;\n // Clear cache when path changes\n this.cache.clear();\n this.resolvePromises.clear();\n }\n\n /**\n * Get the current UI path\n */\n getUiPath(): string {\n return this.uiPath;\n }\n\n /**\n * Register custom importers for specific components\n */\n registerImporter(name: string, importer: () => Promise<React.ComponentType<any>>): void {\n this.importers[name] = importer;\n // Clear cache for this component\n this.cache.delete(name);\n this.resolvePromises.delete(name);\n }\n\n /**\n * Check if a component is cached\n */\n isCached(name: string): boolean {\n return this.cache.has(name);\n }\n\n /**\n * Get a cached component (returns null if not cached or missing)\n */\n getCached(name: string): React.ComponentType<any> | null {\n return this.cache.get(name) ?? null;\n }\n\n /**\n * Pre-cache components (useful for SSR or avoiding loading states)\n */\n preCache(components: PartialComponentRegistry): void {\n for (const [name, component] of Object.entries(components)) {\n if (component) {\n this.cache.set(name, component);\n }\n }\n }\n\n /**\n * Resolve a single component by name\n * Returns null if the component cannot be loaded\n */\n async resolve(name: keyof ComponentRegistry): Promise<React.ComponentType<any> | null> {\n // Return from cache if available\n if (this.cache.has(name)) {\n return this.cache.get(name) ?? null;\n }\n\n // Check for in-flight resolution\n if (this.resolvePromises.has(name)) {\n return this.resolvePromises.get(name)!;\n }\n\n // Start resolution\n const promise = this.doResolve(name);\n this.resolvePromises.set(name, promise);\n\n try {\n const component = await promise;\n this.cache.set(name, component);\n return component;\n } finally {\n this.resolvePromises.delete(name);\n }\n }\n\n /**\n * Internal resolution logic\n */\n private async doResolve(name: string): Promise<React.ComponentType<any> | null> {\n // Check custom importers first\n if (this.importers[name]) {\n try {\n return await this.importers[name]();\n } catch {\n return null;\n }\n }\n\n // Get file path for this component\n const filePath = COMPONENT_FILE_MAP[name as keyof ComponentRegistry];\n if (!filePath) {\n return null;\n }\n\n // Get export name (usually same as component name)\n const exportName = COMPONENT_EXPORT_MAP[name as keyof ComponentRegistry] || name;\n\n try {\n // Dynamic import - this will be handled by the bundler (Vite, webpack, etc.)\n // The actual path resolution depends on the user's bundler configuration\n const modulePath = `${this.uiPath}/${filePath}`;\n\n // We can't actually do dynamic imports at runtime with arbitrary paths\n // This needs to be handled differently - see resolveWithImporter\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Resolve multiple components at once\n * Returns an object with resolved components and a list of missing ones\n */\n async resolveMany(names: Array<keyof ComponentRegistry>): Promise<ResolvedComponents> {\n const components: PartialComponentRegistry = {};\n const missing: string[] = [];\n\n // Resolve all components in parallel\n const results = await Promise.all(\n names.map(async (name) => {\n const component = await this.resolve(name);\n return { name, component };\n }),\n );\n\n for (const { name, component } of results) {\n if (component) {\n (components as any)[name] = component;\n } else {\n missing.push(name);\n }\n }\n\n return { components, missing };\n }\n\n /**\n * Clear the component cache\n */\n clearCache(): void {\n this.cache.clear();\n this.resolvePromises.clear();\n }\n}\n\n/**\n * Get the singleton ComponentResolver instance\n */\nexport function getComponentResolver(config?: ComponentResolverConfig): ComponentResolver {\n return ComponentResolver.getInstance(config);\n}\n\n/**\n * Pre-configure components synchronously (for use in providers)\n * This bypasses dynamic imports by accepting already-imported components\n */\nexport function configureComponents(components: PartialComponentRegistry): void {\n const resolver = getComponentResolver();\n resolver.preCache(components);\n}\n","import { useMemo } from 'react';\nimport { useFormContext } from 'react-hook-form';\nimport type { Fields, Steps } from '../types/common';\nimport { isZodSchema } from '../validation/guards';\nimport { compileValidationRules } from '../validation/compiler';\n\nexport type StepStatus = 'pending' | 'current' | 'completed' | 'error';\n\nexport interface StepInfo {\n id: string;\n fields: string[];\n fieldCount: number;\n status: StepStatus;\n hasErrors: boolean;\n errorCount: number;\n isVisited: boolean;\n isCurrent: boolean;\n isCompleted: boolean;\n canNavigate: boolean;\n}\n\nexport interface FormStepsInfo {\n steps: StepInfo[];\n currentStepId: string;\n totalSteps: number;\n completedSteps: number;\n progress: number; // 0-100\n stepHistory: string[];\n canGoNext: boolean;\n canGoPrev: boolean;\n getStepInfo: (stepId: string) => StepInfo | undefined;\n getStepStatus: (stepId: string) => StepStatus;\n}\n\n/**\n * Hook que expone información completa sobre los pasos del formulario\n * para construir componentes de UI como acordeones, barras de progreso, etc.\n */\nexport function useFormStepsInfo({\n steps,\n currentStepId,\n stepHistory,\n fields,\n}: {\n steps: Steps;\n currentStepId: string;\n stepHistory: string[];\n fields: Fields;\n}): FormStepsInfo {\n const { formState, getValues } = useFormContext();\n\n const stepsInfo = useMemo(() => {\n const stepIds = Object.keys(steps);\n const values = getValues();\n const errors = formState.errors;\n\n return stepIds.map((stepId): StepInfo => {\n const step = steps[stepId];\n if (!step) {\n // Si el paso no existe, retornar info por defecto\n return {\n id: stepId,\n fields: [],\n fieldCount: 0,\n status: 'pending',\n hasErrors: false,\n errorCount: 0,\n isVisited: false,\n isCurrent: false,\n isCompleted: false,\n canNavigate: false,\n };\n }\n\n const isCurrent = stepId === currentStepId;\n const isVisited = stepHistory.includes(stepId) || isCurrent;\n\n // Contar errores en los campos de este paso\n let errorCount = 0;\n step.fields.forEach((fieldName) => {\n if (errors[fieldName]) {\n errorCount++;\n }\n });\n\n const hasErrors = errorCount > 0;\n const isCompleted =\n isVisited &&\n !isCurrent &&\n !hasErrors &&\n step.fields.every((fieldName) => {\n const value = values[fieldName];\n const fieldConfig = fields[fieldName];\n // Considerar completado si tiene valor\n // Verificar si el campo tiene schema requerido\n if (fieldConfig?.schema) {\n try {\n const zodSchema = isZodSchema(fieldConfig.schema)\n ? fieldConfig.schema\n : compileValidationRules(fieldConfig.schema, fieldConfig.type);\n zodSchema.parse(value);\n return true;\n } catch {\n // Si falla la validación, no está completo\n return value !== undefined && value !== null && value !== '';\n }\n }\n // Si no tiene schema, considerar completado si tiene valor\n return value !== undefined && value !== null && value !== '';\n });\n\n let status: StepStatus = 'pending';\n if (isCurrent) {\n status = hasErrors ? 'error' : 'current';\n } else if (isCompleted) {\n status = 'completed';\n } else if (hasErrors && isVisited) {\n status = 'error';\n }\n\n return {\n id: stepId,\n fields: step.fields,\n fieldCount: step.fields.length,\n status,\n hasErrors,\n errorCount,\n isVisited,\n isCurrent,\n isCompleted,\n canNavigate: isVisited || stepHistory.includes(stepId),\n };\n });\n }, [steps, currentStepId, stepHistory, fields, formState.errors, getValues]);\n\n const completedSteps = useMemo(\n () => stepsInfo.filter((step) => step.isCompleted).length,\n [stepsInfo],\n );\n\n const progress = useMemo(() => {\n if (stepsInfo.length === 0) return 0;\n return Math.round((completedSteps / stepsInfo.length) * 100);\n }, [completedSteps, stepsInfo.length]);\n\n const getStepInfo = (stepId: string): StepInfo | undefined => {\n return stepsInfo.find((step) => step.id === stepId);\n };\n\n const getStepStatus = (stepId: string): StepStatus => {\n return getStepInfo(stepId)?.status ?? 'pending';\n };\n\n return {\n steps: stepsInfo,\n currentStepId,\n totalSteps: stepsInfo.length,\n completedSteps,\n progress,\n stepHistory,\n canGoNext: stepHistory.length > 0 || stepsInfo.length > 1,\n canGoPrev: stepHistory.length > 0,\n getStepInfo,\n getStepStatus,\n };\n}\n","import React from 'react';\nimport { useFormStepsInfo, type StepInfo } from '../hooks/useFormStepsInfo';\nimport { useComponents } from '../context/ComponentContext';\nimport { cn } from '../lib/utils';\nimport type { Fields, Steps } from '../types/common';\n\ninterface StepsAccordionProps {\n steps: Steps;\n currentStepId: string;\n stepHistory: string[];\n fields: Fields;\n onStepSelect?: (stepId: string) => void;\n allowNavigation?: boolean; // Si false, solo muestra info sin permitir navegación\n className?: string;\n showFieldCount?: boolean;\n showErrors?: boolean;\n showProgress?: boolean;\n}\n\nconst StepStatusIcon = ({ status }: { status: StepInfo['status'] }) => {\n switch (status) {\n case 'completed':\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-emerald-500 text-xs font-medium text-white\">\n ✓\n </span>\n );\n case 'current':\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-blue-500 text-xs font-medium text-white\">\n •\n </span>\n );\n case 'error':\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-xs font-medium text-white\">\n !\n </span>\n );\n default:\n return (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full border-2 border-gray-400 text-xs font-medium text-gray-400\">\n ○\n </span>\n );\n }\n};\n\nexport function StepsAccordion({\n steps,\n currentStepId,\n stepHistory,\n fields,\n onStepSelect,\n allowNavigation = true,\n className,\n showFieldCount = true,\n showErrors = true,\n showProgress = true,\n}: StepsAccordionProps) {\n const { Accordion, AccordionItem, AccordionTrigger, AccordionContent } = useComponents();\n const stepsInfo = useFormStepsInfo({\n steps,\n currentStepId,\n stepHistory,\n fields,\n });\n\n const handleValueChange = (value: string) => {\n if (allowNavigation && onStepSelect && value) {\n const stepInfo = stepsInfo.getStepInfo(value);\n if (stepInfo?.canNavigate) {\n onStepSelect(value);\n }\n }\n };\n\n return (\n <div className={cn('w-full', className)}>\n {showProgress && (\n <div className=\"mb-4\">\n <div className=\"mb-2 flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">Progreso</span>\n <span className=\"font-medium\">\n {stepsInfo.completedSteps} / {stepsInfo.totalSteps} pasos\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${stepsInfo.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <Accordion\n type=\"single\"\n collapsible\n value={allowNavigation ? currentStepId : undefined}\n onValueChange={handleValueChange}\n className=\"w-full\"\n >\n {stepsInfo.steps.map((stepInfo) => (\n <AccordionItem key={stepInfo.id} value={stepInfo.id}>\n <AccordionTrigger\n className={cn(\n 'hover:no-underline',\n stepInfo.isCurrent && 'text-primary font-semibold',\n stepInfo.hasErrors && 'text-destructive',\n !stepInfo.canNavigate && 'cursor-not-allowed opacity-60',\n )}\n >\n <div className=\"flex items-center gap-3\">\n <StepStatusIcon status={stepInfo.status} />\n <div className=\"flex flex-col items-start\">\n <span>Paso {stepInfo.id}</span>\n {showFieldCount && (\n <span className=\"text-xs text-muted-foreground\">\n {stepInfo.fieldCount} campo\n {stepInfo.fieldCount !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n {showErrors && stepInfo.hasErrors && (\n <span className=\"ml-auto rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive\">\n {stepInfo.errorCount} error\n {stepInfo.errorCount !== 1 ? 'es' : ''}\n </span>\n )}\n </div>\n </AccordionTrigger>\n <AccordionContent className=\"pt-2\">\n <div className=\"space-y-2 text-sm text-muted-foreground\">\n <div>\n <strong>Campos:</strong> {stepInfo.fields.join(', ')}\n </div>\n {stepInfo.isVisited && (\n <div>\n <strong>Estado:</strong>{' '}\n {stepInfo.isCompleted\n ? 'Completado'\n : stepInfo.hasErrors\n ? 'Con errores'\n : 'En progreso'}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n );\n}\n","import React from 'react';\nimport { cn } from '../lib/utils';\nimport { useFormStepsInfo } from '../hooks/useFormStepsInfo';\nimport type { Steps, Fields } from '../types/common';\n\ninterface StepsNavigationProps {\n steps: Steps;\n currentStepId: string;\n stepHistory: string[];\n fields: Fields;\n onStepClick?: (stepId: string) => void;\n className?: string;\n orientation?: 'horizontal' | 'vertical';\n showLabels?: boolean;\n showFieldCount?: boolean;\n allowNavigation?: boolean;\n}\n\nexport function StepsNavigation({\n steps,\n currentStepId,\n stepHistory,\n fields,\n onStepClick,\n className,\n orientation = 'horizontal',\n showLabels = true,\n showFieldCount = false,\n allowNavigation = true,\n}: StepsNavigationProps) {\n const stepsInfo = useFormStepsInfo({\n steps,\n currentStepId,\n stepHistory,\n fields,\n });\n\n const handleStepClick = (stepId: string) => {\n if (!allowNavigation) return;\n const stepInfo = stepsInfo.getStepInfo(stepId);\n if (stepInfo?.canNavigate && onStepClick) {\n onStepClick(stepId);\n }\n };\n\n return (\n <nav\n className={cn(\n 'flex',\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-2',\n className,\n )}\n aria-label=\"Navegación de pasos\"\n >\n {stepsInfo.steps.map((step, index) => {\n const isClickable = allowNavigation && step.canNavigate && onStepClick;\n\n return (\n <button\n key={step.id}\n type=\"button\"\n onClick={() => handleStepClick(step.id)}\n disabled={!isClickable}\n className={cn(\n 'group flex items-center gap-3 rounded-lg border p-3 text-left transition-all',\n orientation === 'vertical' && 'w-full',\n step.isCurrent && 'border-primary bg-primary/5 ring-2 ring-primary/20',\n step.isCompleted && !step.isCurrent && 'border-emerald-500/50 bg-emerald-500/5',\n step.hasErrors && 'border-destructive/50 bg-destructive/5',\n step.status === 'pending' && 'border-muted bg-muted/30',\n isClickable && 'cursor-pointer hover:border-primary/50 hover:bg-primary/10',\n !isClickable && 'cursor-not-allowed opacity-60',\n )}\n aria-current={step.isCurrent ? 'step' : undefined}\n aria-label={`Paso ${index + 1}: ${step.id}`}\n >\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-sm font-medium transition-all',\n step.status === 'completed' && 'border-emerald-500 bg-emerald-500 text-white',\n step.status === 'current' && 'border-primary bg-primary text-primary-foreground',\n step.status === 'error' &&\n 'border-destructive bg-destructive text-destructive-foreground',\n step.status === 'pending' && 'border-muted bg-background text-muted-foreground',\n )}\n >\n {step.status === 'completed' ? '✓' : step.status === 'error' ? '!' : index + 1}\n </div>\n\n {showLabels && (\n <div className=\"flex-1\">\n <div className=\"font-medium\">Paso {index + 1}</div>\n {showFieldCount && (\n <div className=\"text-xs text-muted-foreground\">\n {step.fieldCount} campo{step.fieldCount !== 1 ? 's' : ''}\n </div>\n )}\n {step.hasErrors && (\n <div className=\"text-xs text-destructive\">\n {step.errorCount} error{step.errorCount !== 1 ? 'es' : ''}\n </div>\n )}\n </div>\n )}\n\n {orientation === 'vertical' && step.isCurrent && (\n <div className=\"ml-auto text-xs text-primary\">Actual</div>\n )}\n </button>\n );\n })}\n </nav>\n );\n}\n","import React from 'react';\nimport { cn } from '../lib/utils';\nimport { useFormStepsInfo } from '../hooks/useFormStepsInfo';\nimport type { Steps, Fields } from '../types/common';\n\ninterface StepsProgressProps {\n steps: Steps;\n currentStepId: string;\n stepHistory: string[];\n fields: Fields;\n className?: string;\n showLabels?: boolean;\n showPercentage?: boolean;\n variant?: 'bar' | 'dots' | 'steps';\n}\n\nexport function StepsProgress({\n steps,\n currentStepId,\n stepHistory,\n fields,\n className,\n showLabels = false,\n showPercentage = true,\n variant = 'bar',\n}: StepsProgressProps) {\n const stepsInfo = useFormStepsInfo({\n steps,\n currentStepId,\n stepHistory,\n fields,\n });\n\n if (variant === 'bar') {\n return (\n <div className={cn('w-full', className)}>\n <div className=\"mb-2 flex items-center justify-between text-sm\">\n {showLabels && (\n <span className=\"text-muted-foreground\">\n Paso {stepsInfo.completedSteps + 1} de {stepsInfo.totalSteps}\n </span>\n )}\n {showPercentage && <span className=\"font-medium\">{stepsInfo.progress}%</span>}\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full bg-primary transition-all duration-500 ease-out\"\n style={{ width: `${stepsInfo.progress}%` }}\n />\n </div>\n </div>\n );\n }\n\n if (variant === 'dots') {\n return (\n <div className={cn('flex items-center justify-center gap-2', className)}>\n {stepsInfo.steps.map((step, index) => (\n <div key={step.id} className=\"flex items-center gap-2\">\n <div\n className={cn(\n 'h-3 w-3 rounded-full transition-all',\n step.status === 'completed' && 'bg-emerald-500',\n step.status === 'current' && 'bg-blue-500 ring-2 ring-blue-300',\n step.status === 'error' && 'bg-red-500',\n step.status === 'pending' && 'bg-muted',\n )}\n />\n {index < stepsInfo.steps.length - 1 && (\n <div\n className={cn(\n 'h-0.5 w-8 transition-colors',\n step.status === 'completed' ? 'bg-emerald-500' : 'bg-muted',\n )}\n />\n )}\n </div>\n ))}\n </div>\n );\n }\n\n // variant === \"steps\"\n return (\n <div className={cn('w-full', className)}>\n <div className=\"flex items-center justify-between\">\n {stepsInfo.steps.map((step, index) => (\n <div key={step.id} className=\"flex flex-1 items-center\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full border-2 text-sm font-medium transition-all',\n step.status === 'completed' && 'border-emerald-500 bg-emerald-500 text-white',\n step.status === 'current' &&\n 'border-primary bg-primary text-primary-foreground ring-2 ring-primary/20',\n step.status === 'error' &&\n 'border-destructive bg-destructive text-destructive-foreground',\n step.status === 'pending' && 'border-muted bg-background text-muted-foreground',\n )}\n >\n {step.status === 'completed' ? '✓' : step.status === 'error' ? '!' : index + 1}\n </div>\n {showLabels && (\n <span\n className={cn(\n 'mt-1 text-xs',\n step.status === 'current' && 'font-medium text-primary',\n step.status === 'pending' && 'text-muted-foreground',\n )}\n >\n Paso {index + 1}\n </span>\n )}\n </div>\n {index < stepsInfo.steps.length - 1 && (\n <div\n className={cn(\n 'mx-2 h-0.5 flex-1 transition-colors',\n step.status === 'completed' ? 'bg-emerald-500' : 'bg-muted',\n )}\n />\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","/**\n * Submit Actions Types\n *\n * Sistema modular de acciones de submit que permite configurar\n * múltiples endpoints, webhooks, emails y funciones custom.\n * Cada acción puede tener su propio trigger (cuándo se ejecuta).\n */\n\nimport type { ConditionOperator } from './logic';\n\n// ───────────────────────────────────────────────────────────────\n// Tipos base\n// ───────────────────────────────────────────────────────────────\n\nexport type SubmitActionType = 'http' | 'webhook' | 'email' | 'custom';\n\n// ───────────────────────────────────────────────────────────────\n// Configuración HTTP/API\n// ───────────────────────────────────────────────────────────────\n\nexport interface HttpEndpointConfig {\n url: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n}\n\nexport interface HttpBodyConfig {\n /** Formato del body */\n format: 'json' | 'form-data' | 'url-encoded';\n /** Template con placeholders {{fieldName}} */\n template?: string;\n /** Solo incluir estos campos (si no se especifica, incluye todos) */\n includeFields?: string[];\n /** Excluir estos campos del payload */\n excludeFields?: string[];\n}\n\nexport interface HttpAuthConfig {\n type: 'none' | 'bearer' | 'basic' | 'api-key';\n /** Token para bearer auth */\n token?: string;\n /** Usuario para basic auth */\n username?: string;\n /** Password para basic auth */\n password?: string;\n /** Nombre del header para api-key (default: X-API-Key) */\n headerName?: string;\n}\n\nexport interface HttpRetryConfig {\n enabled: boolean;\n maxAttempts: number;\n delayMs: number;\n}\n\nexport interface HttpSubmitAction {\n type: 'http';\n name: string;\n endpoint: HttpEndpointConfig;\n body?: HttpBodyConfig;\n auth?: HttpAuthConfig;\n retry?: HttpRetryConfig;\n /** Timeout en ms (default: 30000) */\n timeout?: number;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Configuración Webhook\n// ───────────────────────────────────────────────────────────────\n\nexport interface WebhookSubmitAction {\n type: 'webhook';\n name: string;\n url: string;\n /** Secret para firma HMAC (opcional) */\n secret?: string;\n /** Headers adicionales */\n headers?: Record<string, string>;\n /** Template del payload con placeholders {{fieldName}} */\n payloadTemplate?: string;\n /** Solo incluir estos campos */\n includeFields?: string[];\n /** Excluir estos campos */\n excludeFields?: string[];\n}\n\n// ───────────────────────────────────────────────────────────────\n// Configuración Email\n// ───────────────────────────────────────────────────────────────\n\nexport type EmailProvider = 'smtp' | 'sendgrid' | 'resend' | 'mailgun';\n\nexport interface EmailSubmitAction {\n type: 'email';\n name: string;\n /** Proveedor de email */\n provider: EmailProvider;\n /** Endpoint del servicio (para SMTP o API custom) */\n endpoint?: string;\n /** API Key del proveedor */\n apiKey?: string;\n /** Destinatarios */\n to: string | string[];\n cc?: string[];\n bcc?: string[];\n /** From address */\n from?: string;\n /** Asunto del email (soporta placeholders {{fieldName}}) */\n subject: string;\n /** Tipo de template */\n template: 'default' | 'custom';\n /** HTML del template custom (soporta placeholders {{fieldName}}) */\n customTemplate?: string;\n /** Reply-to address */\n replyTo?: string;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Configuración Custom\n// ───────────────────────────────────────────────────────────────\n\nexport interface CustomSubmitAction {\n type: 'custom';\n name: string;\n /** Función que se ejecuta con los valores del formulario */\n handler: (values: Record<string, unknown>) => Promise<unknown>;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Unión de todos los tipos de acciones\n// ───────────────────────────────────────────────────────────────\n\nexport type SubmitAction =\n | HttpSubmitAction\n | WebhookSubmitAction\n | EmailSubmitAction\n | CustomSubmitAction;\n\n// ───────────────────────────────────────────────────────────────\n// Sistema de Triggers\n// ───────────────────────────────────────────────────────────────\n\nexport type SubmitTriggerType =\n | 'onSubmit' // Al enviar el formulario (click en submit)\n | 'onStepEnter' // Al entrar a un step específico\n | 'onStepExit' // Al salir de un step específico\n | 'onFieldChange' // Al cambiar un campo específico\n | 'onFieldBlur' // Al hacer blur en un campo\n | 'onDelay' // Después de X ms de inactividad\n | 'manual'; // Solo mediante código (no automático)\n\nexport interface SubmitTrigger {\n type: SubmitTriggerType;\n /** Para onStepEnter/onStepExit: ID del step */\n stepId?: string;\n /** Para onFieldChange/onFieldBlur: nombre del campo */\n fieldName?: string;\n /** Para onDelay: milisegundos de inactividad */\n delayMs?: number;\n /** Debounce en ms para evitar ejecuciones múltiples (default: 0) */\n debounceMs?: number;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Condición de ejecución\n// ───────────────────────────────────────────────────────────────\n\nexport interface SubmitActionCondition {\n /** Campo a evaluar */\n field: string;\n /** Operador de comparación */\n operator: ConditionOperator;\n /** Valor a comparar */\n value: unknown;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Field Mapping System\n// ───────────────────────────────────────────────────────────────\n\n/** Built-in value transforms applied per-field before sending. */\nexport type BuiltinTransform =\n | 'toString'\n | 'toNumber'\n | 'toBoolean'\n | 'booleanString' // true → \"true\", false → \"false\"\n | 'dateISO' // Date → ISO string\n | 'dateYMD' // Date → YYYY-MM-DD\n | 'dateDMY' // Date → DD/MM/YYYY\n | 'dateTimestamp' // Date → unix timestamp (ms)\n | 'trim'\n | 'lowercase'\n | 'uppercase'\n | 'emptyToNull'; // \"\" | undefined → null\n\n/** Custom transform function for field values. */\nexport type FieldTransformFn = (value: unknown) => unknown;\n\n/** Advanced field mapping entry with rename + transform. */\nexport interface FieldMapEntry {\n /** Target field name in the API payload */\n to: string;\n /** Value transform — built-in name or custom function */\n transform?: BuiltinTransform | FieldTransformFn;\n}\n\n/**\n * A resolver injects computed/dynamic values into the payload.\n * Distinguished from static values by the `$resolver` key.\n */\nexport type FieldResolver =\n | { $resolver: 'timestamp' }\n | { $resolver: 'hostname' }\n | { $resolver: 'urlParam'; param: string; fallback?: string }\n | { $resolver: 'ip'; endpoint?: string; fallback?: string }\n | { $resolver: 'pageUrl' }\n | { $resolver: 'referrer' }\n | { $resolver: 'userAgent' }\n | { $resolver: 'custom'; fn: () => unknown };\n\n/**\n * Serializable subset of FieldResolver (excludes 'custom' which requires a runtime function).\n * Used by hidden fields in the form builder where config must be JSON-serializable.\n */\nexport type SerializableFieldResolver = Exclude<FieldResolver, { $resolver: 'custom' }>;\n\n/**\n * Built-in resolver definitions with labels and descriptions for the builder UI.\n */\nexport const BUILTIN_RESOLVERS = [\n { id: 'timestamp', label: 'Timestamp', description: 'Current date/time in ISO format' },\n { id: 'hostname', label: 'Hostname', description: 'Current page hostname' },\n { id: 'pageUrl', label: 'Page URL', description: 'Full page URL (window.location.href)' },\n { id: 'referrer', label: 'Referrer', description: 'Referring page URL (document.referrer)' },\n { id: 'userAgent', label: 'User Agent', description: 'Browser user agent string' },\n { id: 'ip', label: 'IP Address', description: 'Visitor IP via external API' },\n { id: 'urlParam', label: 'URL Parameter', description: 'Value from a URL query parameter' },\n] as const;\n\n/**\n * Advanced field mapping configuration.\n *\n * Supports renaming, value transforms, computed field injection,\n * field exclusion, and passthrough control.\n *\n * @example\n * ```ts\n * fieldMapping: {\n * fields: {\n * nombre: \"first_name\", // simple rename\n * fecha: { to: \"birth_date\", transform: \"dateYMD\" }, // rename + transform\n * acepta: { to: \"accepts\", transform: \"booleanString\" },\n * },\n * inject: {\n * campaign_id: \"10653\", // static value\n * timestamp: { $resolver: \"timestamp\" }, // computed\n * hostname: { $resolver: \"hostname\" },\n * sub_aff_id: { $resolver: \"urlParam\", param: \"sub_aff_id\", fallback: \"seo_organico\" },\n * },\n * exclude: [\"internal_field\"],\n * passthrough: true,\n * }\n * ```\n */\nexport interface FieldMapping {\n /** Map/transform form fields → API fields */\n fields?: Record<string, string | FieldMapEntry>;\n /** Inject additional fields not from form inputs. Use `{ $resolver: ... }` for dynamic values. */\n inject?: Record<string, unknown>;\n /** Exclude these form fields from the payload */\n exclude?: string[];\n /** If false, only mapped fields are sent. Default: true (unmapped pass through) */\n passthrough?: boolean;\n}\n\n/**\n * Field mapping configuration — supports two formats:\n * - Simple: `Record<string, string>` — rename fields only (backward compatible)\n * - Advanced: `FieldMapping` — rename, transform, inject, exclude\n */\nexport type FieldMappingConfig = Record<string, string> | FieldMapping;\n\n// ───────────────────────────────────────────────────────────────\n// Nodo de Submit Action (configuración completa)\n// ───────────────────────────────────────────────────────────────\n\nexport interface SubmitActionNode {\n /** ID único del nodo */\n id: string;\n /** Configuración de la acción */\n action: SubmitAction;\n /** Cuándo se ejecuta */\n trigger: SubmitTrigger;\n /** Condición opcional para ejecutar (si no se cumple, se salta) */\n condition?: SubmitActionCondition;\n /** Orden de ejecución (para modo secuencial) */\n order?: number;\n /** Si true, continúa con las siguientes acciones aunque esta falle */\n continueOnError?: boolean;\n /** Si true, la acción está deshabilitada */\n disabled?: boolean;\n /**\n * Maps form field names to API-expected field names, with optional\n * value transforms and computed field injection.\n *\n * Supports two formats:\n * 1. Simple rename: `Record<string, string>`\n * 2. Advanced: `FieldMapping` with transforms, inject, exclude\n *\n * @example\n * ```ts\n * // Simple: rename only\n * fieldMapping: {\n * nombre: \"first_name\",\n * email: \"email_address\",\n * }\n *\n * // Advanced: rename + transform + inject\n * fieldMapping: {\n * fields: {\n * nombre: \"first_name\",\n * fecha_nacimiento: { to: \"birth_date\", transform: \"dateYMD\" },\n * seguro_enfermedad: { to: \"has_insurance\", transform: \"booleanString\" },\n * },\n * inject: {\n * campaign_id: \"10653\",\n * ip: { $resolver: \"custom\", fn: () => getIpAddress() },\n * timestamp: { $resolver: \"timestamp\" },\n * },\n * }\n * ```\n */\n fieldMapping?: FieldMappingConfig;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Configuración de ejecución\n// ───────────────────────────────────────────────────────────────\n\nexport interface SubmitExecutionConfig {\n /** Modo de ejecución de múltiples acciones */\n mode: 'sequential' | 'parallel';\n /** Si true, detiene la ejecución en el primer error (solo para sequential) */\n stopOnFirstError?: boolean;\n /** Timeout global para todas las acciones (ms) */\n globalTimeout?: number;\n}\n\n// ───────────────────────────────────────────────────────────────\n// Resultado de ejecución\n// ───────────────────────────────────────────────────────────────\n\nexport interface SubmitActionResult {\n /** ID de la acción ejecutada */\n actionId: string;\n /** Nombre de la acción */\n actionName: string;\n /** Si la ejecución fue exitosa */\n success: boolean;\n /** Datos de respuesta (si success = true) */\n data?: unknown;\n /** Error (si success = false) */\n error?: Error;\n /** Duración de la ejecución en ms */\n durationMs: number;\n /** Timestamp de inicio */\n startedAt: Date;\n /** Timestamp de fin */\n completedAt: Date;\n}\n\nexport interface SubmitActionsResult {\n /** Resultados de todas las acciones */\n results: SubmitActionResult[];\n /** Si todas las acciones fueron exitosas */\n allSuccessful: boolean;\n /** Número de acciones exitosas */\n successCount: number;\n /** Número de acciones fallidas */\n failureCount: number;\n /** Duración total */\n totalDurationMs: number;\n}\n","/**\n * Test Data Generator — generates realistic field values for form testing.\n *\n * Lightweight, no external dependencies (no faker.js).\n * Two layers of intelligence:\n * 1. Field type → appropriate format (email, date, select option, etc.)\n * 2. Label/name heuristics → contextual data (\"nombre\" → \"Carlos\", \"email\" → \"test@example.com\")\n */\n\nimport type { Fields } from '../types/common';\nimport type { FieldConfig } from '../types/fields';\n\nexport type TestDataLocale = 'en' | 'es';\n\nexport interface TestDataOptions {\n /** Force a specific locale instead of auto-detecting */\n locale?: TestDataLocale;\n /** Seed for deterministic pseudo-random (optional) */\n seed?: number;\n}\n\n// ─── Locale Detection ─────────────────────────────────────────\n\nconst SPANISH_PATTERNS = [\n 'nombre',\n 'apellido',\n 'correo',\n 'telefono',\n 'teléfono',\n 'dirección',\n 'direccion',\n 'ciudad',\n 'provincia',\n 'código',\n 'codigo',\n 'mensaje',\n 'empresa',\n 'comentario',\n 'fecha',\n 'edad',\n 'género',\n 'genero',\n 'contraseña',\n 'enviar',\n 'siguiente',\n 'atrás',\n 'acepto',\n 'términos',\n];\n\nexport function detectLocale(fields: Fields): TestDataLocale {\n const allText = Object.entries(fields)\n .map(([name, cfg]) => `${name} ${cfg.label ?? ''}`.toLowerCase())\n .join(' ');\n\n const spanishHits = SPANISH_PATTERNS.filter((p) => allText.includes(p)).length;\n return spanishHits >= 2 ? 'es' : 'en';\n}\n\n// ─── Pseudo-Random ────────────────────────────────────────────\n\nfunction createRng(seed?: number) {\n let s = seed ?? Math.floor(Math.random() * 2147483647);\n return () => {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nfunction pickRandom<T>(arr: T[], rng: () => number): T {\n return arr[Math.floor(rng() * arr.length)]!;\n}\n\nfunction pickMultiple<T>(arr: T[], count: number, rng: () => number): T[] {\n const shuffled = [...arr].sort(() => rng() - 0.5);\n return shuffled.slice(0, Math.min(count, arr.length));\n}\n\n// ─── Name/Label Heuristics ────────────────────────────────────\n\ntype PatternMap = Record<string, Record<TestDataLocale, string>>;\n\nconst NAME_PATTERNS: PatternMap = {\n // Name fields\n 'nombre|first.?name|given.?name|fname': { es: 'Carlos', en: 'James' },\n 'apellido|last.?name|surname|family.?name|lname': { es: 'Garcia', en: 'Smith' },\n 'nombre.?completo|full.?name|name': { es: 'Carlos Garcia', en: 'James Smith' },\n // Contact\n 'correo|email|e.?mail': { es: 'usuario.test@example.com', en: 'test.user@example.com' },\n 'telefono|teléfono|phone|tel|mobile|movil|móvil': {\n es: '+34 612 345 678',\n en: '+1 555 123 4567',\n },\n // Address\n 'dirección|direccion|address|calle|street': {\n es: 'Calle Mayor 15, 3A',\n en: '123 Main Street, Apt 4B',\n },\n 'ciudad|city': { es: 'Madrid', en: 'New York' },\n 'provincia|state|estado': { es: 'Madrid', en: 'California' },\n 'pais|país|country': { es: 'España', en: 'United States' },\n 'cp|codigo.?postal|postal.?code|zip|zipcode': { es: '28001', en: '10001' },\n // Business\n 'empresa|company|organization|compañía|organización': {\n es: 'Soluciones Tech S.L.',\n en: 'Acme Corp',\n },\n 'cargo|position|job.?title|puesto': { es: 'Director de Marketing', en: 'Marketing Director' },\n 'web|website|sitio.?web|url': { es: 'https://ejemplo.es', en: 'https://example.com' },\n // Identity\n 'dni|nif|ssn|id.?number': { es: '12345678A', en: '123-45-6789' },\n 'edad|age': { es: '32', en: '32' },\n // Auth\n 'usuario|username|user': { es: 'carlos_garcia', en: 'james_smith' },\n 'contraseña|password|pass': { es: 'Test1234!', en: 'Test1234!' },\n};\n\nfunction matchPattern(nameOrLabel: string, locale: TestDataLocale): string | null {\n const normalized = nameOrLabel.toLowerCase().replace(/[_\\-\\s]+/g, '');\n for (const [pattern, values] of Object.entries(NAME_PATTERNS)) {\n const regex = new RegExp(pattern.replace(/[_\\-\\s]+/g, ''), 'i');\n if (regex.test(normalized)) {\n return values[locale];\n }\n }\n return null;\n}\n\n// ─── Per-Field Value Generation ───────────────────────────────\n\nconst SKIP_TYPES = new Set(['html', 'button', 'submit', 'next', 'back']);\n\nexport function generateFieldValue(\n name: string,\n config: FieldConfig,\n options?: TestDataOptions & { rng?: () => number },\n): unknown {\n const type = config.type;\n\n if (SKIP_TYPES.has(type)) return undefined;\n\n const locale = options?.locale ?? 'en';\n const rng = options?.rng ?? createRng(options?.seed);\n const labelOrName = config.label ?? name;\n\n // Try label heuristic first (for text-like fields)\n if (\n type === 'text' ||\n type === 'email' ||\n type === 'tel' ||\n type === 'url' ||\n type === 'password' ||\n type === 'number' ||\n type === 'input-group' ||\n type === 'currency'\n ) {\n const heuristic = matchPattern(labelOrName, locale);\n if (heuristic) return heuristic;\n }\n\n switch (type) {\n case 'text':\n return locale === 'es' ? 'Valor de prueba' : 'Test value';\n\n case 'email':\n return locale === 'es' ? 'usuario.test@example.com' : 'test.user@example.com';\n\n case 'tel':\n return locale === 'es' ? '+34 612 345 678' : '+1 555 123 4567';\n\n case 'url':\n return 'https://example.com';\n\n case 'password':\n return 'Test1234!';\n\n case 'number': {\n const cfg = config as { min?: number; max?: number };\n const min = cfg.min ?? 0;\n const max = cfg.max ?? 100;\n return min + Math.floor(rng() * (max - min + 1));\n }\n\n case 'textarea':\n return locale === 'es'\n ? 'Este es un texto de prueba para verificar el formulario. Contiene varias oraciones para simular contenido real.'\n : 'This is a test message to verify the form works correctly. It contains multiple sentences to simulate real content.';\n\n case 'input-group':\n case 'currency': {\n return locale === 'es' ? 'Valor de prueba' : 'Test value';\n }\n\n case 'select':\n case 'combobox':\n case 'radio':\n case 'button-radio':\n case 'native-select':\n case 'command': {\n const opts = (config as { options?: Array<{ value: string }> }).options;\n if (opts && opts.length > 0) {\n return pickRandom(opts, rng).value;\n }\n return '';\n }\n\n case 'checkbox':\n case 'switch':\n return true;\n\n case 'checkbox-group':\n case 'switch-group':\n case 'button-checkbox': {\n const opts = (config as { options?: Array<{ value: string }> }).options;\n if (opts && opts.length > 0) {\n const count = Math.min(1 + Math.floor(rng() * 2), opts.length);\n return pickMultiple(opts, count, rng).map((o) => o.value);\n }\n return [];\n }\n\n case 'button-card': {\n const opts = (config as { options?: Array<{ value: string }>; multiple?: boolean }).options;\n const multiple = (config as { multiple?: boolean }).multiple;\n if (opts && opts.length > 0) {\n if (multiple) {\n const count = Math.min(1 + Math.floor(rng() * 2), opts.length);\n return pickMultiple(opts, count, rng).map((o) => o.value);\n }\n return pickRandom(opts, rng).value;\n }\n return multiple ? [] : '';\n }\n\n case 'date': {\n const label = labelOrName.toLowerCase();\n const isBirth = /nacimiento|birth|cumpleaños|birthday|dob/.test(label);\n if (isBirth) {\n // Date between 18-50 years ago\n const yearsAgo = 18 + Math.floor(rng() * 32);\n const d = new Date();\n d.setFullYear(d.getFullYear() - yearsAgo);\n d.setMonth(Math.floor(rng() * 12));\n d.setDate(1 + Math.floor(rng() * 28));\n return d;\n }\n // Recent date (within last 30 days)\n const d = new Date();\n d.setDate(d.getDate() - Math.floor(rng() * 30));\n return d;\n }\n\n case 'daterange': {\n const from = new Date();\n const to = new Date();\n to.setDate(to.getDate() + 7);\n return { from, to };\n }\n\n case 'slider':\n case 'range': {\n const cfg = config as { min?: number; max?: number };\n const min = cfg.min ?? 0;\n const max = cfg.max ?? 100;\n return [Math.round((min + max) / 2)];\n }\n\n case 'otp': {\n const length = (config as { length?: number }).length ?? 6;\n return Array.from({ length }, () => Math.floor(rng() * 10)).join('');\n }\n\n case 'file':\n return undefined; // Can't generate File objects in test data\n\n case 'repeater':\n return []; // Empty list by default\n\n default:\n return locale === 'es' ? 'Valor de prueba' : 'Test value';\n }\n}\n\n// ─── Main Entry Point ─────────────────────────────────────────\n\nexport function generateTestData(\n fields: Fields,\n options?: TestDataOptions,\n): Record<string, unknown> {\n const locale = options?.locale ?? detectLocale(fields);\n const rng = createRng(options?.seed);\n const result: Record<string, unknown> = {};\n\n for (const [name, config] of Object.entries(fields)) {\n if (SKIP_TYPES.has(config.type)) continue;\n\n const value = generateFieldValue(name, config, { ...options, locale, rng });\n if (value !== undefined) {\n result[name] = value;\n }\n }\n\n return result;\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","React","gapValue","React","jsx","React","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","size","jsx","jsxs","React","useEffect","useMemo","z","useState","useState","useCallback","useState","toast","useState","error","toast","useCallback","toast","useEffect","useMemo","currentValues","useMemo","z","useEffect","useEffect","useState","useMemo","useCallback","useEffect","useCallback","useEffect","useRef","useRef","useEffect","useCallback","executeSubmitActions","Fragment","jsx","jsxs","FormInner","useEffect","useCallback","Form","useMemo","useMemo","useFormContext","useFormContext","useMemo","jsx","jsxs","jsx","jsxs","jsx","jsxs","d"]}