@forms.expert/sdk 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/index.cjs +18 -6
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +18 -6
- package/dist/react/index.js.map +1 -1
- package/dist/vanilla/index.cjs +35 -24
- package/dist/vanilla/index.cjs.map +1 -1
- package/dist/vanilla/index.global.js +35 -24
- package/dist/vanilla/index.global.js.map +1 -1
- package/dist/vanilla/index.js +28 -17
- package/dist/vanilla/index.js.map +1 -1
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../react/use-form.tsx","../../core/types.ts","../../core/api-client.ts","../../core/forms-sdk.ts","../../react/forms-expert-form.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n ReactNode,\n} from 'react';\nimport {\n FormsSDK,\n FormsSDKConfig,\n FormStatusResponse,\n SubmissionResponse,\n ValidationError,\n FormValidationError,\n FormsError,\n UploadProgress,\n FileValidationError,\n} from '../core';\n\ninterface FormsContextValue {\n sdk: FormsSDK;\n isReady: boolean;\n}\n\nconst FormsContext = createContext<FormsContextValue | null>(null);\n\ninterface FormsProviderProps {\n config: FormsSDKConfig;\n children: ReactNode;\n}\n\n/**\n * Forms provider component\n */\nexport function FormsProvider({ config, children }: FormsProviderProps) {\n const sdk = useMemo(() => new FormsSDK(config), [config]);\n const value = useMemo(() => ({ sdk, isReady: true }), [sdk]);\n\n return (\n <FormsContext.Provider value={value}>{children}</FormsContext.Provider>\n );\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Hook to access the Forms SDK\n */\nexport function useFormsSDK(): FormsSDK {\n const context = useContext(FormsContext);\n if (!context) {\n throw new Error('useFormsSDK must be used within a FormsProvider');\n }\n return context.sdk;\n}\n\nexport interface UseFormOptions {\n /** Form slug */\n slug: string;\n /** SDK config (if not using provider) */\n config?: FormsSDKConfig;\n /** Track form views for analytics (completion rate). Default: false for SDK usage, pass true to enable. */\n trackViews?: boolean;\n /** Success callback */\n onSuccess?: (response: SubmissionResponse) => void;\n /** Error callback */\n onError?: (error: Error) => void;\n /** Validation error callback */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Auto-initialize on mount */\n autoInit?: boolean;\n /** Language code to pass to backend */\n lang?: string;\n}\n\nexport interface UseFormReturn {\n /** Form configuration */\n config: FormStatusResponse | null;\n /** Form schema (shorthand for config.schema) */\n schema: FormStatusResponse['schema'] | null;\n /** Whether form is loading */\n isLoading: boolean;\n /** Whether form is initializing */\n isInitializing: boolean;\n /** Whether form was submitted successfully */\n isSubmitted: boolean;\n /** Alias for isSubmitted */\n isSuccess: boolean;\n /** Validation errors by field name */\n errors: Record<string, string>;\n /** File validation errors */\n fileErrors: FileValidationError[];\n /** Last submission error (if any) */\n error: Error | null;\n /** Form values */\n values: Record<string, unknown>;\n /** Upload progress (when uploading files) */\n uploadProgress: UploadProgress | null;\n /** Initialize the form */\n initialize: () => Promise<FormStatusResponse>;\n /** Set a field value */\n setValue: (name: string, value: unknown) => void;\n /** Set multiple values */\n setValues: (values: Record<string, unknown>) => void;\n /** Validate form data */\n validate: () => Promise<boolean>;\n /** Validate files against form settings */\n validateFiles: (files: File[]) => FileValidationError[];\n /** Submit the form */\n submit: (captchaToken?: string) => Promise<SubmissionResponse | null>;\n /** Reset form to initial state */\n reset: () => void;\n /** Clear errors */\n clearErrors: () => void;\n /** Whether captcha is required */\n requiresCaptcha: boolean;\n /** Captcha provider */\n captchaProvider: 'turnstile' | 'recaptcha' | 'hcaptcha' | undefined;\n /** Captcha site key */\n captchaSiteKey: string | undefined;\n /** Whether honeypot is enabled */\n honeypotEnabled: boolean;\n /** Whether attachments are allowed */\n allowsAttachments: boolean;\n /** Max attachments allowed */\n maxAttachments: number;\n /** Max attachment size in bytes */\n maxAttachmentSize: number;\n}\n\n/**\n * Hook for managing form state and submission\n */\nexport function useForm(options: UseFormOptions): UseFormReturn {\n const context = useContext(FormsContext);\n\n // Create SDK if config provided, otherwise use context\n const sdk = useMemo(() => {\n if (options.config) {\n return new FormsSDK(options.config);\n }\n if (!context) {\n throw new Error('Either provide config to useForm or use FormsProvider');\n }\n return context.sdk;\n }, [options.config, context]);\n\n const [config, setConfig] = useState<FormStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isInitializing, setIsInitializing] = useState(false);\n const [isSubmitted, setIsSubmitted] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [fileErrors, setFileErrors] = useState<FileValidationError[]>([]);\n const [values, setValues] = useState<Record<string, unknown>>({});\n const [error, setError] = useState<Error | null>(null);\n const [uploadProgress, setUploadProgress] = useState<UploadProgress | null>(null);\n\n // Extract values to avoid stale closure issues\n const { slug, trackViews, lang, autoInit, onSuccess, onError, onValidationError } = options;\n\n const initialize = useCallback(async () => {\n setIsInitializing(true);\n try {\n const formConfig = await sdk.isActive(slug, lang);\n setConfig(formConfig);\n if (trackViews) {\n void sdk.trackView(slug);\n }\n return formConfig;\n } finally {\n setIsInitializing(false);\n }\n }, [sdk, slug, trackViews, lang]);\n\n // Auto-initialize\n useEffect(() => {\n if (autoInit !== false) {\n initialize();\n }\n }, [initialize, autoInit]);\n\n const setValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error on change\n setErrors((prev) => {\n if (prev[name]) {\n const { [name]: _, ...rest } = prev;\n return rest;\n }\n return prev;\n });\n }, []);\n\n const setValuesHandler = useCallback((newValues: Record<string, unknown>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n const validate = useCallback(async () => {\n const result = await sdk.validate(slug, values);\n if (!result.valid) {\n const errorMap = result.errors.reduce(\n (acc, err) => ({ ...acc, [err.field]: err.message }),\n {}\n );\n setErrors(errorMap);\n }\n return result.valid;\n }, [sdk, slug, values]);\n\n const submit = useCallback(\n async (captchaToken?: string) => {\n setIsLoading(true);\n setErrors({});\n setFileErrors([]);\n setError(null);\n setUploadProgress(null);\n\n try {\n // Add honeypot field if enabled\n const submitData = config?.settings?.honeypot\n ? { ...values, _hp: '' }\n : values;\n\n const response = await sdk.submit(slug, submitData, {\n captchaToken,\n onProgress: setUploadProgress,\n });\n setIsSubmitted(true);\n onSuccess?.(response);\n return response;\n } catch (err) {\n if (err instanceof FormValidationError) {\n const errorMap = err.errors.reduce(\n (acc, e) => ({ ...acc, [e.field]: e.message }),\n {}\n );\n setErrors(errorMap);\n onValidationError?.(err.errors);\n } else {\n setError(err as Error);\n onError?.(err as Error);\n }\n return null;\n } finally {\n setIsLoading(false);\n setUploadProgress(null);\n }\n },\n [sdk, slug, values, config?.settings?.honeypot, onSuccess, onError, onValidationError]\n );\n\n const reset = useCallback(() => {\n setValues({});\n setErrors({});\n setFileErrors([]);\n setError(null);\n setIsSubmitted(false);\n setIsLoading(false);\n setUploadProgress(null);\n }, []);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n setFileErrors([]);\n }, []);\n\n // File validation\n const validateFiles = useCallback((files: File[]): FileValidationError[] => {\n const errors: FileValidationError[] = [];\n const maxSize = config?.settings?.maxAttachmentSize ?? 10 * 1024 * 1024; // 10MB default\n const maxCount = config?.settings?.maxAttachments ?? 5;\n\n if (files.length > maxCount) {\n errors.push({\n field: 'attachments',\n file: '',\n error: 'count',\n message: `Maximum ${maxCount} files allowed`,\n });\n }\n\n files.forEach((file) => {\n if (file.size > maxSize) {\n errors.push({\n field: 'attachments',\n file: file.name,\n error: 'size',\n message: `File \"${file.name}\" exceeds maximum size of ${formatBytes(maxSize)}`,\n });\n }\n });\n\n setFileErrors(errors);\n return errors;\n }, [config?.settings?.maxAttachmentSize, config?.settings?.maxAttachments]);\n\n const allowsAttachments = config?.settings?.allowAttachments ?? false;\n const maxAttachments = config?.settings?.maxAttachments ?? 5;\n const maxAttachmentSize = config?.settings?.maxAttachmentSize ?? 10 * 1024 * 1024;\n\n return {\n config,\n schema: config?.schema ?? null,\n isLoading,\n isInitializing,\n isSubmitted,\n isSuccess: isSubmitted,\n errors,\n fileErrors,\n error,\n values,\n uploadProgress,\n initialize,\n setValue,\n setValues: setValuesHandler,\n validate,\n validateFiles,\n submit,\n reset,\n clearErrors,\n requiresCaptcha: config?.captcha?.enabled ?? config?.settings?.captcha?.enabled ?? false,\n captchaProvider: config?.captcha?.provider ?? config?.settings?.captcha?.provider,\n captchaSiteKey: config?.captcha?.siteKey ?? config?.settings?.captcha?.siteKey,\n honeypotEnabled: config?.settings?.honeypot ?? false,\n allowsAttachments,\n maxAttachments,\n maxAttachmentSize,\n };\n}\n","/**\n * Form field types\n */\nexport type BasicFieldType =\n | 'text' | 'email' | 'number' | 'textarea' | 'select'\n | 'checkbox' | 'file' | 'date' | 'hidden';\n\nexport type InteractiveFieldType =\n | 'radio' | 'multiselect' | 'rating' | 'scale' | 'toggle'\n | 'ranking' | 'imageChoice' | 'phone' | 'url' | 'password'\n | 'richText' | 'slider' | 'currency' | 'time' | 'datetime'\n | 'dateRange' | 'address' | 'name' | 'dropdown' | 'colorPicker'\n | 'location' | 'opinionScale' | 'consent';\n\nexport type LayoutFieldType = 'heading' | 'divider' | 'paragraph';\n\nexport type FormFieldType = BasicFieldType | InteractiveFieldType | LayoutFieldType;\n\nexport interface FormFieldOption {\n label: string;\n value: string;\n imageUrl?: string;\n}\n\n/**\n * Form field definition\n */\nexport interface FormField {\n name: string;\n type: FormFieldType;\n label?: string;\n placeholder?: string;\n required?: boolean;\n options?: string[] | FormFieldOption[];\n defaultValue?: unknown;\n maxFileSize?: number;\n allowedMimeTypes?: string[];\n multiple?: boolean;\n min?: number;\n max?: number;\n step?: number;\n ratingMax?: number;\n lowLabel?: string;\n highLabel?: string;\n defaultCountryCode?: string;\n currencyCode?: string;\n currencySymbol?: string;\n addressFields?: ('street' | 'street2' | 'city' | 'state' | 'zip' | 'country')[];\n nameFields?: ('prefix' | 'first' | 'middle' | 'last' | 'suffix')[];\n content?: string;\n paragraphFontSize?: number;\n consentText?: string;\n consentUrl?: string;\n consentFontSize?: number;\n maxLength?: number;\n stepId?: string;\n visibleWhen?: {\n field: string;\n operator: 'eq' | 'neq' | 'contains' | 'gt' | 'lt';\n value: unknown;\n };\n\n // Row layout\n row?: number;\n width?: '1/4' | '1/3' | '1/2' | '2/3' | '3/4' | 'full';\n}\n\n/**\n * Secondary button configuration\n */\nexport interface SecondaryButton {\n enabled: boolean;\n text: string;\n href: string;\n openInNewTab?: boolean;\n position?: 'left' | 'right' | 'below';\n align?: 'left' | 'center' | 'right';\n marginTop?: number;\n marginBottom?: number;\n style?: 'filled' | 'outlined' | 'minimal' | 'link';\n color?: string;\n textColor?: string;\n fontSize?: number;\n icon?: string;\n iconPosition?: 'left' | 'right';\n}\n\n/**\n * Form styling configuration\n */\nexport interface FormStyling {\n theme: 'light' | 'dark' | 'system' | 'custom';\n primaryColor: string;\n backgroundColor: string;\n textColor: string;\n errorColor?: string;\n successColor?: string;\n borderRadius: 'none' | 'sm' | 'md' | 'lg';\n fontSize: 'sm' | 'md' | 'lg' | 'small' | 'medium' | 'large';\n buttonStyle: 'filled' | 'outline' | 'outlined' | 'minimal';\n labelPosition: 'top' | 'left' | 'floating';\n labelClassName?: string;\n fieldClassName?: string;\n buttonClassName?: string;\n customCss?: string;\n // Extended styling (matching hosted form builder)\n fontFamily?: string;\n formWidth?: 'narrow' | 'medium' | 'wide' | 'full';\n fieldLayout?: 'stacked' | 'inline';\n fieldBorderStyle?: 'full' | 'bottom';\n fieldBorderColor?: string;\n fieldBorderRadius?: 'none' | 'small' | 'medium' | 'large' | 'full';\n fieldPaddingX?: number;\n fieldPaddingY?: number;\n separatorColor?: string;\n buttonColor?: string;\n buttonText?: string;\n buttonRadius?: 'none' | 'small' | 'medium' | 'large' | 'full';\n buttonAlign?: 'left' | 'center' | 'right';\n buttonSize?: 'small' | 'medium' | 'large';\n buttonPaddingX?: number;\n buttonPaddingY?: number;\n buttonGradient?: string;\n buttonFullWidth?: boolean;\n buttonFontSize?: number;\n buttonIcon?: string;\n buttonIconPosition?: 'left' | 'right';\n fieldSpacing?: 'compact' | 'normal' | 'relaxed' | 'spacious';\n formPadding?: 'none' | 'compact' | 'normal' | 'relaxed' | 'spacious';\n labelSpacing?: 'compact' | 'normal' | 'relaxed';\n placeholderFontSize?: 'small' | 'medium' | 'large';\n headingSize?: 'small' | 'medium' | 'large' | 'extra-large';\n paragraphSize?: 'small' | 'medium' | 'large';\n formNameFontSize?: number;\n formNameFontWeight?: 'normal' | 'medium' | 'semibold' | 'bold';\n hideRequiredAsterisk?: boolean;\n logoUrl?: string;\n logoPosition?: 'top-left' | 'top-center' | 'top-right';\n coverImageUrl?: string;\n backgroundImageUrl?: string;\n backgroundOverlay?: number;\n transparentBackground?: boolean;\n secondaryButton?: SecondaryButton;\n // Input styling\n inputBackgroundColor?: string;\n placeholderColor?: string;\n}\n\n/**\n * Form schema\n */\nexport interface FormSchema {\n fields: FormField[];\n styling?: FormStyling;\n}\n\n/**\n * Form captcha settings\n */\nexport interface CaptchaSettings {\n enabled: boolean;\n provider?: 'turnstile' | 'recaptcha' | 'hcaptcha';\n siteKey?: string;\n}\n\n/**\n * Form branding configuration\n */\nexport interface FormBranding {\n enabled: boolean;\n text?: string;\n url?: string;\n}\n\n/**\n * Form status response from API\n */\nexport interface FormStatusResponse {\n active: boolean;\n formId?: string;\n name?: string;\n description?: string | null;\n mode?: 'free' | 'schema';\n type?: 'hosted' | 'embed' | 'both';\n layout?: 'single' | 'multi-step';\n schema?: FormSchema;\n steps?: Array<{ title: string; description?: string; fields: string[] }>;\n /** Top-level styling (full hosted styling config) */\n styling?: FormStyling;\n embedConfig?: {\n width?: string;\n height?: string;\n maxHeight?: string;\n minHeight?: string;\n autoResize?: boolean;\n transparentBackground?: boolean;\n [key: string]: unknown;\n };\n error?: string;\n /** Captcha settings (top-level) */\n captcha?: CaptchaSettings;\n settings?: {\n /** @deprecated Use top-level captcha instead */\n captcha?: CaptchaSettings;\n honeypot: boolean;\n allowAttachments: boolean;\n maxAttachments?: number;\n maxAttachmentSize?: number;\n successMessage?: string;\n redirectUrl?: string;\n showFormName?: boolean;\n };\n /** Access control configuration */\n accessControl?: {\n mode: string;\n passwordProtected: boolean;\n };\n /** Branding configuration */\n branding?: FormBranding;\n /** Hosted config (page settings, success page, etc.) */\n hostedConfig?: {\n pageTitle?: string;\n successMessage?: string;\n successPageType?: 'message' | 'redirect' | 'custom';\n redirectUrl?: string;\n customSuccessHtml?: string;\n [key: string]: unknown;\n };\n closesAt?: string | null;\n resourceId?: string;\n /** Available published translation language codes */\n availableLanguages?: string[];\n /** Current language applied to this response (null if base language) */\n currentLanguage?: string | null;\n /** Whether to show language switch UI */\n showLanguageSwitch?: boolean;\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\n/**\n * Validation response from API\n */\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Submission response from API\n */\nexport interface SubmissionResponse {\n success: boolean;\n submissionId: string;\n message: string;\n}\n\n/**\n * Submit options\n */\nexport interface SubmitOptions {\n pageUrl?: string;\n captchaToken?: string;\n /** Callback for upload progress */\n onProgress?: (progress: UploadProgress) => void;\n}\n\n/**\n * Upload progress information\n */\nexport interface UploadProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\n/**\n * File validation error\n */\nexport interface FileValidationError {\n field: string;\n file: string;\n error: 'size' | 'type' | 'count';\n message: string;\n}\n\n/**\n * SDK configuration\n */\nexport interface FormsSDKConfig {\n apiKey: string;\n resourceId: string;\n baseUrl?: string;\n}\n\n/**\n * Form handler options\n */\nexport interface FormHandlerOptions {\n /** Track form views for analytics (completion rate) */\n trackViews?: boolean;\n onSubmitStart?: () => void;\n onSubmitSuccess?: (response: SubmissionResponse) => void;\n onSubmitError?: (error: FormsError) => void;\n onValidationError?: (errors: ValidationError[]) => void;\n}\n\n/**\n * Forms SDK error\n */\nexport class FormsError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number,\n public retryAfter?: number\n ) {\n super(message);\n this.name = 'FormsError';\n }\n}\n\n/**\n * Validation error class\n */\nexport class FormValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n super('Validation failed');\n this.name = 'FormValidationError';\n }\n}\n","import {\n FormsSDKConfig,\n FormStatusResponse,\n ValidationResponse,\n SubmissionResponse,\n SubmitOptions,\n FormsError,\n UploadProgress,\n} from './types';\n\n/**\n * API client for forms backend\n */\nexport class FormsApiClient {\n private baseUrl: string;\n private apiKey: string;\n private resourceId: string;\n\n constructor(config: FormsSDKConfig) {\n this.apiKey = config.apiKey;\n this.resourceId = config.resourceId;\n this.baseUrl = (config.baseUrl || 'https://api.forms.expert/api/v1').replace(/\\/$/, '');\n }\n\n /**\n * Build URL with token query parameter\n */\n private buildUrl(path: string): string {\n const separator = path.includes('?') ? '&' : '?';\n return `${this.baseUrl}${path}${separator}token=${encodeURIComponent(this.apiKey)}`;\n }\n\n /**\n * Make an API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: object\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new FormsError(\n data.message || 'Request failed',\n data.code || 'UNKNOWN_ERROR',\n response.status,\n data.retryAfter\n );\n }\n\n return data;\n }\n\n /**\n * Check if form is active and get configuration\n */\n async isActive(slug: string, lang?: string): Promise<FormStatusResponse> {\n const langParam = lang ? `?lang=${encodeURIComponent(lang)}` : '';\n return this.request('GET', `/f/${this.resourceId}/${slug}/is-active${langParam}`);\n }\n\n /**\n * Validate form data without submitting\n */\n async validate(\n slug: string,\n data: Record<string, unknown>\n ): Promise<ValidationResponse> {\n return this.request('POST', `/f/${this.resourceId}/${slug}/validate`, {\n data,\n });\n }\n\n /**\n * Submit form data (supports files)\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n const url = this.buildUrl(`/f/${this.resourceId}/${slug}`);\n \n // Check if data contains files\n const hasFiles = Object.values(data).some(\n (v) => v instanceof File || (v instanceof FileList && v.length > 0)\n );\n\n if (hasFiles || options?.onProgress) {\n // Use FormData and XMLHttpRequest for file uploads with progress\n return this.submitWithFormData(url, data, options);\n }\n\n // Use regular JSON request for non-file submissions\n return this.request('POST', `/f/${this.resourceId}/${slug}`, {\n data,\n pageUrl: options?.pageUrl || (typeof window !== 'undefined' ? window.location.href : undefined),\n captchaToken: options?.captchaToken,\n });\n }\n\n /**\n * Submit with FormData (for file uploads with progress tracking)\n */\n private submitWithFormData(\n url: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n\n // Add data fields\n for (const [key, value] of Object.entries(data)) {\n if (value instanceof File) {\n formData.append(key, value);\n } else if (value instanceof FileList) {\n Array.from(value).forEach((file) => formData.append(key, file));\n } else if (value !== undefined && value !== null) {\n formData.append(`data[${key}]`, String(value));\n }\n }\n\n // Add metadata\n const pageUrl = options?.pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n if (pageUrl) {\n formData.append('pageUrl', pageUrl);\n }\n if (options?.captchaToken) {\n formData.append('captchaToken', options.captchaToken);\n }\n\n const xhr = new XMLHttpRequest();\n\n // Progress tracking\n if (options?.onProgress) {\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n options.onProgress!({\n loaded: event.loaded,\n total: event.total,\n percentage: Math.round((event.loaded / event.total) * 100),\n });\n }\n });\n }\n\n xhr.addEventListener('load', () => {\n try {\n const response = JSON.parse(xhr.responseText);\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(response);\n } else {\n reject(new FormsError(\n response.message || 'Submission failed',\n response.code || 'UNKNOWN_ERROR',\n xhr.status,\n response.retryAfter\n ));\n }\n } catch {\n reject(new FormsError('Invalid response', 'PARSE_ERROR', xhr.status));\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(new FormsError('Network error', 'NETWORK_ERROR', 0));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new FormsError('Request aborted', 'ABORTED', 0));\n });\n\n xhr.open('POST', url);\n xhr.send(formData);\n });\n }\n\n /**\n * Track a form view (for analytics completion rate)\n */\n async trackView(slug: string): Promise<void> {\n const url = this.buildUrl(`/f/${this.resourceId}/${slug}/view`);\n await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' }).catch(() => {});\n }\n\n /**\n * Get resource ID\n */\n getResourceId(): string {\n return this.resourceId;\n }\n\n /**\n * Get base URL\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n}\n","import { FormsApiClient } from './api-client';\nimport {\n FormsSDKConfig,\n FormStatusResponse,\n ValidationResponse,\n SubmissionResponse,\n SubmitOptions,\n FormHandlerOptions,\n FormsError,\n FormValidationError,\n} from './types';\n\n/**\n * Form handler for a specific form\n */\nexport class FormHandler {\n private apiClient: FormsApiClient;\n private slug: string;\n private config: FormStatusResponse | null = null;\n private options: FormHandlerOptions;\n\n constructor(\n apiClient: FormsApiClient,\n slug: string,\n options: FormHandlerOptions = {}\n ) {\n this.apiClient = apiClient;\n this.slug = slug;\n this.options = options;\n }\n\n /**\n * Initialize form handler and fetch configuration\n */\n async initialize(lang?: string): Promise<FormStatusResponse> {\n this.config = await this.apiClient.isActive(this.slug, lang);\n if (this.options.trackViews) {\n this.apiClient.trackView(this.slug);\n }\n return this.config;\n }\n\n /**\n * Get cached form configuration\n */\n getConfig(): FormStatusResponse | null {\n return this.config;\n }\n\n /**\n * Check if form is active\n */\n isActive(): boolean {\n return this.config?.active ?? false;\n }\n\n /**\n * Check if captcha is required\n */\n requiresCaptcha(): boolean {\n return this.config?.settings?.captcha?.enabled ?? false;\n }\n\n /**\n * Get captcha provider\n */\n getCaptchaProvider(): 'turnstile' | 'recaptcha' | 'hcaptcha' | undefined {\n return this.config?.settings?.captcha?.provider;\n }\n\n /**\n * Get form schema\n */\n getSchema() {\n return this.config?.schema;\n }\n\n /**\n * Validate form data\n */\n async validate(data: Record<string, unknown>): Promise<ValidationResponse> {\n return this.apiClient.validate(this.slug, data);\n }\n\n /**\n * Submit form data\n */\n async submit(\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n this.options.onSubmitStart?.();\n\n try {\n // Validate first if in schema mode\n if (this.config?.mode === 'schema') {\n const validation = await this.validate(data);\n if (!validation.valid) {\n this.options.onValidationError?.(validation.errors);\n throw new FormValidationError(validation.errors);\n }\n }\n\n const response = await this.apiClient.submit(this.slug, data, options);\n this.options.onSubmitSuccess?.(response);\n return response;\n } catch (error) {\n if (error instanceof FormsError) {\n this.options.onSubmitError?.(error);\n }\n throw error;\n }\n }\n\n /**\n * Get success message from config\n */\n getSuccessMessage(): string {\n return this.config?.settings?.successMessage || 'Form submitted successfully!';\n }\n\n /**\n * Get redirect URL from config\n */\n getRedirectUrl(): string | undefined {\n return this.config?.settings?.redirectUrl;\n }\n}\n\n/**\n * Main Forms SDK class\n */\nexport class FormsSDK {\n private apiClient: FormsApiClient;\n\n constructor(config: FormsSDKConfig) {\n this.apiClient = new FormsApiClient(config);\n }\n\n /**\n * Check if form is active and get configuration\n */\n async isActive(slug: string, lang?: string): Promise<FormStatusResponse> {\n return this.apiClient.isActive(slug, lang);\n }\n\n /**\n * Validate form data without submitting\n */\n async validate(\n slug: string,\n data: Record<string, unknown>\n ): Promise<ValidationResponse> {\n return this.apiClient.validate(slug, data);\n }\n\n /**\n * Submit form data\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n return this.apiClient.submit(slug, data, options);\n }\n\n /**\n * Create a form handler for a specific form\n */\n form(slug: string, options?: FormHandlerOptions): FormHandler {\n return new FormHandler(this.apiClient, slug, options);\n }\n\n /**\n * Track a form view (for analytics completion rate)\n */\n async trackView(slug: string): Promise<void> {\n return this.apiClient.trackView(slug);\n }\n\n /**\n * Submit with retry logic for rate limits\n */\n async submitWithRetry(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions & { maxRetries?: number }\n ): Promise<SubmissionResponse> {\n const maxRetries = options?.maxRetries ?? 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await this.submit(slug, data, options);\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof FormsError) {\n // Don't retry validation or auth errors\n if (\n [\n 'VALIDATION_ERROR',\n 'CAPTCHA_REQUIRED',\n 'ORIGIN_NOT_ALLOWED',\n ].includes(error.code)\n ) {\n throw error;\n }\n\n // Retry rate limits with backoff\n if (error.code.includes('RATE_LIMIT')) {\n const retryAfter = error.retryAfter || Math.pow(2, attempt) * 1000;\n await new Promise((resolve) => setTimeout(resolve, retryAfter));\n continue;\n }\n }\n\n // Exponential backoff for network errors\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n\n throw lastError!;\n }\n}\n","import { useState, useEffect, useRef, useMemo, FormEvent, ChangeEvent, CSSProperties } from 'react';\nimport {\n FormsSDKConfig,\n FormField,\n FormStyling,\n SecondaryButton,\n SubmissionResponse,\n ValidationError,\n} from '../core';\nimport { useForm, UseFormOptions } from './use-form';\n\nconst defaultStyling: FormStyling = {\n theme: 'light',\n primaryColor: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderRadius: 'md',\n fontSize: 'md',\n buttonStyle: 'filled',\n labelPosition: 'top',\n};\n\nfunction getBorderRadius(radius: FormStyling['borderRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'sm': return '0.125rem';\n case 'md': return '0.375rem';\n case 'lg': return '0.5rem';\n default: return '0.375rem';\n }\n}\n\nfunction getFieldBorderRadius(radius?: FormStyling['fieldBorderRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'small': return '0.25rem';\n case 'medium': return '0.375rem';\n case 'large': return '0.75rem';\n case 'full': return '9999px';\n default: return '0.375rem';\n }\n}\n\nfunction getWidthPercent(width?: string): string | undefined {\n switch (width) {\n case '1/4': return '25%';\n case '1/3': return '33.333%';\n case '1/2': return '50%';\n case '2/3': return '66.666%';\n case '3/4': return '75%';\n case 'full': return '100%';\n default: return undefined;\n }\n}\n\ntype FieldRow = { type: 'single'; field: FormField } | { type: 'row'; fields: FormField[] };\n\nfunction groupFieldsIntoRows(fields: FormField[]): FieldRow[] {\n const result: FieldRow[] = [];\n let i = 0;\n while (i < fields.length) {\n const field = fields[i];\n if (field.row != null) {\n const rowFields: FormField[] = [field];\n let j = i + 1;\n while (j < fields.length && fields[j].row === field.row) {\n rowFields.push(fields[j]);\n j++;\n }\n if (rowFields.length > 1) {\n result.push({ type: 'row', fields: rowFields });\n } else {\n result.push({ type: 'single', field });\n }\n i = j;\n } else {\n result.push({ type: 'single', field });\n i++;\n }\n }\n return result;\n}\n\nfunction getButtonRadius(radius?: FormStyling['buttonRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'small': return '4px';\n case 'medium': return '8px';\n case 'large': return '12px';\n case 'full': return '9999px';\n default: return '8px';\n }\n}\n\nfunction getFontSize(size: FormStyling['fontSize']): string {\n switch (size) {\n case 'sm': case 'small': return '0.875rem';\n case 'md': case 'medium': return '1rem';\n case 'lg': case 'large': return '1.125rem';\n default: return '1rem';\n }\n}\n\nfunction getPlaceholderFontSize(size?: FormStyling['placeholderFontSize']): string {\n switch (size) {\n case 'small': return '0.75rem';\n case 'large': return '1rem';\n default: return '0.875rem';\n }\n}\n\nfunction getFieldSpacing(spacing?: FormStyling['fieldSpacing']): string {\n switch (spacing) {\n case 'compact': return '0.5rem';\n case 'relaxed': return '1.5rem';\n case 'spacious': return '2rem';\n default: return '1rem';\n }\n}\n\nfunction getFormPadding(padding?: FormStyling['formPadding']): string {\n switch (padding) {\n case 'none': return '0';\n case 'compact': return '1rem';\n case 'relaxed': return '2.5rem';\n case 'spacious': return '3.5rem';\n default: return '1.5rem';\n }\n}\n\nfunction getLabelSpacing(spacing?: FormStyling['labelSpacing']): string {\n switch (spacing) {\n case 'compact': return '0.125rem';\n case 'relaxed': return '0.75rem';\n default: return '0.25rem';\n }\n}\n\nfunction getFormMaxWidth(width?: FormStyling['formWidth']): string {\n switch (width) {\n case 'narrow': return '28rem';\n case 'wide': return '48rem';\n case 'full': return '100%';\n default: return '36rem';\n }\n}\n\nfunction getButtonAlign(align?: FormStyling['buttonAlign']): string {\n switch (align) {\n case 'left': return 'flex-start';\n case 'right': return 'flex-end';\n default: return 'center';\n }\n}\n\nfunction getHeadingSize(size?: FormStyling['headingSize']): string {\n switch (size) {\n case 'small': return '1.125rem';\n case 'large': return '1.875rem';\n case 'extra-large': return '2.25rem';\n default: return '1.5rem';\n }\n}\n\nfunction getParagraphSize(size?: FormStyling['paragraphSize']): string {\n switch (size) {\n case 'small': return '0.875rem';\n case 'large': return '1.125rem';\n default: return '1rem';\n }\n}\n\ninterface FormsExpertFormProps {\n /** SDK configuration (optional if using FormsProvider) */\n config?: FormsSDKConfig;\n /** Form slug */\n slug: string;\n /** Track form views for analytics (completion rate). Default: true */\n trackViews?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Success callback */\n onSuccess?: (response: SubmissionResponse) => void;\n /** Error callback */\n onError?: (error: Error) => void;\n /** Validation error callback */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: CSSProperties;\n /** Language code to pass to backend */\n lang?: string;\n}\n\n/**\n * Forms Expert form component\n */\nexport function FormsExpertForm({\n config,\n slug,\n trackViews = true,\n submitText = 'Submit',\n onSuccess,\n onError,\n onValidationError,\n className,\n style,\n lang,\n}: FormsExpertFormProps) {\n const form = useForm({\n slug,\n config,\n trackViews,\n onSuccess,\n onError,\n onValidationError,\n autoInit: true,\n lang,\n });\n\n const [captchaToken, setCaptchaToken] = useState<string | null>(null);\n const captchaContainerRef = useRef<HTMLDivElement>(null);\n const captchaWidgetId = useRef<string | null>(null);\n const captchaScriptLoaded = useRef(false);\n const formScopeId = useMemo(() => 'fe-' + Math.random().toString(36).slice(2, 8), []);\n\n // Load captcha script and render widget\n useEffect(() => {\n if (!form.requiresCaptcha || !form.captchaSiteKey || !form.captchaProvider) return;\n if (captchaScriptLoaded.current) return;\n\n const provider = form.captchaProvider;\n const siteKey = form.captchaSiteKey;\n\n const renderWidget = () => {\n if (!captchaContainerRef.current) return;\n\n const w = window as any;\n if (provider === 'turnstile' && w.turnstile) {\n captchaWidgetId.current = w.turnstile.render(captchaContainerRef.current, {\n sitekey: siteKey,\n callback: (token: string) => setCaptchaToken(token),\n 'expired-callback': () => setCaptchaToken(null),\n 'error-callback': () => setCaptchaToken(null),\n });\n } else if (provider === 'hcaptcha' && w.hcaptcha) {\n captchaWidgetId.current = w.hcaptcha.render(captchaContainerRef.current, {\n sitekey: siteKey,\n callback: (token: string) => setCaptchaToken(token),\n 'expired-callback': () => setCaptchaToken(null),\n 'error-callback': () => setCaptchaToken(null),\n });\n } else if (provider === 'recaptcha' && w.grecaptcha) {\n // reCAPTCHA v3 — execute immediately, no visible widget\n w.grecaptcha.ready(() => {\n w.grecaptcha.execute(siteKey, { action: 'submit' }).then((token: string) => {\n setCaptchaToken(token);\n });\n });\n }\n };\n\n // Check if script already loaded\n const w = window as any;\n if (\n (provider === 'turnstile' && w.turnstile) ||\n (provider === 'hcaptcha' && w.hcaptcha) ||\n (provider === 'recaptcha' && w.grecaptcha)\n ) {\n captchaScriptLoaded.current = true;\n renderWidget();\n return;\n }\n\n // Load script\n const script = document.createElement('script');\n if (provider === 'turnstile') {\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\n } else if (provider === 'hcaptcha') {\n script.src = 'https://js.hcaptcha.com/1/api.js?render=explicit';\n } else if (provider === 'recaptcha') {\n script.src = `https://www.google.com/recaptcha/api.js?render=${siteKey}`;\n }\n script.async = true;\n script.defer = true;\n script.onload = () => {\n captchaScriptLoaded.current = true;\n // Small delay for script initialization\n setTimeout(renderWidget, 100);\n };\n document.head.appendChild(script);\n\n return () => {\n // Clean up widget on unmount\n if (captchaWidgetId.current !== null) {\n const w = window as any;\n if (provider === 'turnstile' && w.turnstile) {\n w.turnstile.remove(captchaWidgetId.current);\n } else if (provider === 'hcaptcha' && w.hcaptcha) {\n w.hcaptcha.reset(captchaWidgetId.current);\n }\n }\n };\n }, [form.requiresCaptcha, form.captchaProvider, form.captchaSiteKey]);\n\n const resetCaptcha = () => {\n setCaptchaToken(null);\n if (captchaWidgetId.current !== null) {\n const w = window as any;\n if (form.captchaProvider === 'turnstile' && w.turnstile) {\n w.turnstile.reset(captchaWidgetId.current);\n } else if (form.captchaProvider === 'hcaptcha' && w.hcaptcha) {\n w.hcaptcha.reset(captchaWidgetId.current);\n } else if (form.captchaProvider === 'recaptcha' && w.grecaptcha) {\n w.grecaptcha.execute(form.captchaSiteKey, { action: 'submit' }).then((token: string) => {\n setCaptchaToken(token);\n });\n }\n }\n };\n\n const styling = { ...defaultStyling, ...form.config?.schema?.styling, ...form.config?.styling };\n const radius = getBorderRadius(styling.borderRadius);\n const btnRadius = getButtonRadius(styling.buttonRadius);\n const fontSize = getFontSize(styling.fontSize);\n const phFontSize = getPlaceholderFontSize(styling.placeholderFontSize);\n const fieldSpacing = getFieldSpacing(styling.fieldSpacing);\n const formPadding = getFormPadding(styling.formPadding);\n const labelSpacing = getLabelSpacing(styling.labelSpacing);\n const formMaxWidth = getFormMaxWidth(styling.formWidth);\n const btnBgColor = styling.primaryColor;\n const btnTextColor = styling.buttonColor;\n // Normalize font family - support legacy single values by adding fallbacks\n // For SDK embedded forms, default to 'inherit' so the form uses the website's font\n const fontFamily = styling.fontFamily \n ? (styling.fontFamily.includes(',') ? styling.fontFamily : `${styling.fontFamily}, sans-serif`)\n : 'inherit';\n const btnAlign = getButtonAlign(styling.buttonAlign);\n const resolvedButtonText = styling.buttonText || submitText;\n\n // Google Fonts that need to be loaded\n const googleFonts = ['Inter', 'Roboto', 'Open Sans', 'Lato', 'Poppins', 'Montserrat', 'Nunito', 'Source Sans Pro', 'Raleway', 'Ubuntu', 'Playfair Display', 'Merriweather'];\n const fontToLoad = styling.fontFamily?.split(',')[0]?.trim();\n \n // Check if page already has custom fonts loaded (don't override existing fonts)\n const hasExistingFonts = useMemo(() => {\n if (typeof document === 'undefined') return false;\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of links) {\n const href = (link as HTMLLinkElement).href || '';\n if (href.includes('fonts.googleapis.com') || href.includes('fonts.gstatic.com') || href.includes('typekit') || href.includes('fonts.')) {\n return true;\n }\n }\n // Also check for @font-face in existing stylesheets\n try {\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (rules) {\n for (const rule of rules) {\n if (rule instanceof CSSFontFaceRule) {\n return true;\n }\n }\n }\n } catch {\n // Cross-origin stylesheets will throw, ignore\n }\n }\n } catch {\n // Ignore errors\n }\n return false;\n }, []);\n\n const googleFontUrl = fontToLoad && googleFonts.includes(fontToLoad) && !hasExistingFonts\n ? `https://fonts.googleapis.com/css2?family=${fontToLoad.replace(/ /g, '+')}:wght@400;500;600;700&display=swap`\n : null;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n const result = await form.submit(captchaToken || undefined);\n if (!result) {\n // Reset captcha on failure\n resetCaptcha();\n }\n };\n\n const handleChange = (\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>\n ) => {\n const { name, value, type } = e.target;\n if (type === 'checkbox') {\n form.setValue(name, (e.target as HTMLInputElement).checked);\n } else if (type === 'file') {\n form.setValue(name, (e.target as HTMLInputElement).files?.[0]);\n } else {\n form.setValue(name, value);\n }\n };\n\n if (form.isInitializing) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n ...style,\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style={{ animation: 'spin 1s linear infinite', color: '#9ca3af' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeDasharray=\"31.4 31.4\" strokeLinecap=\"round\"/>\n </svg>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n }\n\n // Show loading spinner if config hasn't loaded yet\n if (!form.config) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n ...style,\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style={{ animation: 'spin 1s linear infinite', color: '#9ca3af' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeDasharray=\"31.4 31.4\" strokeLinecap=\"round\"/>\n </svg>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n }\n\n if (!form.config.active) {\n return (\n <div\n className={className}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#ef4444',\n ...style,\n }}\n >\n This form is not available\n </div>\n );\n }\n\n if (form.isSubmitted) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100%',\n padding: formPadding,\n textAlign: 'center',\n backgroundColor: styling.transparentBackground ? 'transparent' : styling.backgroundColor,\n color: styling.textColor,\n borderRadius: radius,\n maxWidth: formMaxWidth,\n margin: '0 auto',\n fontFamily,\n ...style,\n }}\n >\n <div>\n <svg\n style={{\n width: '3rem',\n height: '3rem',\n margin: '0 auto 1rem',\n color: styling.successColor || '#22c55e',\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n <p style={{ fontSize: '1.125rem', fontWeight: 500 }}>\n {form.config.settings?.successMessage || 'Form submitted successfully!'}\n </p>\n <button\n type=\"button\"\n onClick={form.reset}\n style={{\n marginTop: '1rem',\n background: 'none',\n border: 'none',\n color: styling.primaryColor,\n textDecoration: 'underline',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n Submit again\n </button>\n </div>\n </div>\n );\n }\n\n const fields = form.config.schema?.fields || [];\n const showBranding = form.config.branding?.enabled !== false;\n const brandingText = form.config.branding?.text || 'Powered by forms.expert';\n const brandingUrl = form.config.branding?.url || 'https://forms.expert';\n\n const wrapperStyle: CSSProperties = {\n ...(styling.backgroundImageUrl ? {\n backgroundImage: `url(${styling.backgroundImageUrl})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n } : {}),\n position: 'relative' as const,\n };\n\n const formEl = (\n <form\n onSubmit={handleSubmit}\n className={className}\n data-fe-scope={formScopeId}\n style={{\n fontFamily,\n fontSize,\n backgroundColor: styling.transparentBackground ? 'transparent' : styling.backgroundColor,\n color: styling.textColor,\n padding: formPadding,\n borderRadius: radius,\n maxWidth: formMaxWidth,\n width: '100%',\n margin: '0 auto',\n position: 'relative',\n ...style,\n }}\n >\n {/* Load Google Font if needed */}\n {googleFontUrl && (\n <link rel=\"stylesheet\" href={googleFontUrl} />\n )}\n {/* Scoped placeholder styles */}\n <style dangerouslySetInnerHTML={{ __html: `\n form[data-fe-scope=\"${formScopeId}\"] input::placeholder, form[data-fe-scope=\"${formScopeId}\"] textarea::placeholder { font-size: ${phFontSize};${styling.placeholderColor ? ` color: ${styling.placeholderColor};` : ''} }\n form[data-fe-scope=\"${formScopeId}\"] button[type=\"submit\"]:hover:not(:disabled) { filter: brightness(0.9); }\n form[data-fe-scope=\"${formScopeId}\"] button[type=\"submit\"]:active:not(:disabled) { filter: brightness(0.85); transform: scale(0.98); }\n form[data-fe-scope=\"${formScopeId}\"] a[href]:hover { filter: brightness(0.9); }\n form[data-fe-scope=\"${formScopeId}\"] a[href]:active { filter: brightness(0.85); }\n form[data-fe-scope=\"${formScopeId}\"] input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus,\n form[data-fe-scope=\"${formScopeId}\"] textarea:focus,\n form[data-fe-scope=\"${formScopeId}\"] select:focus {\n outline: none !important;\n border-color: ${styling.primaryColor || '#3b82f6'} !important;\n box-shadow: 0 0 0 2px ${styling.primaryColor || '#3b82f6'}33 !important;\n -webkit-appearance: none;\n }\n ` }} />\n {/* Logo */}\n {styling.logoUrl && (\n <div style={{\n textAlign: styling.logoPosition === 'top-left' ? 'left' : styling.logoPosition === 'top-right' ? 'right' : 'center',\n marginBottom: '1rem',\n }}>\n <img src={styling.logoUrl} alt=\"\" style={{ maxHeight: '48px' }} />\n </div>\n )}\n\n {/* Cover image */}\n {styling.coverImageUrl && (\n <img\n src={styling.coverImageUrl}\n alt=\"\"\n style={{\n width: '100%',\n maxHeight: '200px',\n objectFit: 'cover',\n borderRadius: `${radius} ${radius} 0 0`,\n marginBottom: '1rem',\n }}\n />\n )}\n\n {/* Form name */}\n {(form.config.settings?.showFormName !== false) && form.config.name && (\n <div style={{\n fontSize: styling.formNameFontSize != null ? `${styling.formNameFontSize}px` : '1.5rem',\n fontWeight: styling.formNameFontWeight === 'normal' ? 400 : styling.formNameFontWeight === 'medium' ? 500 : styling.formNameFontWeight === 'semibold' ? 600 : 700,\n marginBottom: '0.5rem',\n color: styling.textColor,\n }}>\n {form.config.hostedConfig?.pageTitle || form.config.name}\n </div>\n )}\n\n {groupFieldsIntoRows(fields).map((group, idx) => {\n if (group.type === 'single') {\n return (\n <FormFieldInput\n key={group.field.name}\n field={group.field}\n value={form.values[group.field.name]}\n error={form.errors[group.field.name]}\n onChange={handleChange}\n onValueChange={(name, val) => form.setValue(name, val)}\n styling={styling}\n fieldSpacing={fieldSpacing}\n labelSpacing={labelSpacing}\n phFontSize={phFontSize}\n />\n );\n }\n return (\n <div key={`row-${idx}`} style={{ display: 'flex', gap: '0.75rem', flexWrap: 'wrap', marginBottom: fieldSpacing }}>\n {group.fields.map((f) => (\n <div key={f.name} style={{ flex: getWidthPercent(f.width) ? `0 0 calc(${getWidthPercent(f.width)} - 0.75rem)` : '1 1 0', minWidth: '180px' }}>\n <FormFieldInput\n field={f}\n value={form.values[f.name]}\n error={form.errors[f.name]}\n onChange={handleChange}\n onValueChange={(name, val) => form.setValue(name, val)}\n styling={styling}\n fieldSpacing={'0'}\n labelSpacing={labelSpacing}\n phFontSize={phFontSize}\n />\n </div>\n ))}\n </div>\n );\n })}\n\n {/* Honeypot field — hidden from users, catches bots */}\n {form.honeypotEnabled && (\n <div style={{ position: 'absolute', left: '-9999px', opacity: 0, height: 0, overflow: 'hidden' }} aria-hidden=\"true\">\n <input type=\"text\" name=\"_hp\" tabIndex={-1} autoComplete=\"off\" />\n </div>\n )}\n\n {/* Captcha widget */}\n {form.requiresCaptcha && form.captchaProvider !== 'recaptcha' && (\n <div ref={captchaContainerRef} style={{ marginTop: '1rem' }} />\n )}\n\n {(() => {\n const btnSizeMap: Record<string, { px: string; py: string; fs: string }> = {\n small: { px: '0.75rem', py: '0.375rem', fs: '0.875rem' },\n medium: { px: '1.25rem', py: '0.625rem', fs: '1rem' },\n large: { px: '1.75rem', py: '0.875rem', fs: '1.125rem' },\n };\n const btnSize = btnSizeMap[styling.buttonSize || 'medium'];\n const btnPx = styling.buttonPaddingX != null ? `${styling.buttonPaddingX}px` : btnSize.px;\n const btnPy = styling.buttonPaddingY != null ? `${styling.buttonPaddingY}px` : btnSize.py;\n const btnFs = styling.buttonFontSize != null ? `${styling.buttonFontSize}px` : btnSize.fs;\n const btnBg = styling.buttonGradient || (styling.buttonStyle === 'filled' ? btnBgColor : 'transparent');\n\n const sec = styling.secondaryButton as SecondaryButton | undefined;\n const secColor = sec?.color || btnBgColor;\n const secStyle: CSSProperties | undefined = sec?.enabled ? {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: `${btnPy} ${btnPx}`,\n fontWeight: 500,\n fontSize: sec.fontSize != null ? `${sec.fontSize}px` : btnFs,\n fontFamily: 'inherit',\n borderRadius: btnRadius,\n cursor: 'pointer',\n textDecoration: sec.style === 'link' ? 'underline' : 'none',\n background: sec.style === 'filled' ? secColor : 'transparent',\n color: sec.textColor || (sec.style === 'filled' ? '#ffffff' : secColor),\n border: sec.style === 'outlined' ? `2px solid ${secColor}` : 'none',\n marginTop: sec.marginTop != null ? `${sec.marginTop}px` : undefined,\n marginBottom: sec.marginBottom != null ? `${sec.marginBottom}px` : undefined,\n maxWidth: '100%',\n boxSizing: 'border-box' as const,\n flexShrink: 1,\n minWidth: 0,\n whiteSpace: 'nowrap' as const,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n } : undefined;\n\n return (\n <>\n <div style={{ display: 'flex', justifyContent: btnAlign, marginTop: '1rem', gap: '0.5rem', flexWrap: 'wrap' }}>\n {sec?.enabled && secStyle && sec.position === 'left' && (\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem' }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n )}\n <button\n type=\"submit\"\n disabled={form.isLoading}\n className={styling.buttonClassName}\n style={{\n ...(styling.buttonFullWidth ? { width: '100%' } : (styling.buttonAlign ? {} : { width: '100%' })),\n padding: `${btnPy} ${btnPx}`,\n fontWeight: 500,\n fontSize: btnFs,\n fontFamily: 'inherit',\n borderRadius: btnRadius,\n cursor: form.isLoading ? 'not-allowed' : 'pointer',\n opacity: form.isLoading ? 0.5 : 1,\n background: btnBg,\n color:\n styling.buttonStyle === 'filled'\n ? (btnTextColor || 'white')\n : btnBgColor,\n border:\n styling.buttonStyle === 'filled'\n ? 'none'\n : `2px solid ${btnBgColor}`,\n maxWidth: '100%',\n boxSizing: 'border-box',\n flexShrink: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n }}\n >\n {!form.isLoading && styling.buttonIcon && styling.buttonIconPosition !== 'right' && (\n <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: styling.buttonIcon }} />\n )}\n <span>{form.isLoading ? 'Submitting...' : resolvedButtonText}</span>\n {!form.isLoading && styling.buttonIcon && styling.buttonIconPosition === 'right' && (\n <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: styling.buttonIcon }} />\n )}\n </button>\n {sec?.enabled && secStyle && sec.position !== 'left' && sec.position !== 'below' && (\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem', marginLeft: 'auto' }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n )}\n </div>\n {sec?.enabled && secStyle && sec.position === 'below' && (\n <div style={{\n display: 'flex',\n justifyContent: sec.align === 'center' ? 'center' : sec.align === 'right' ? 'flex-end' : sec.align === 'left' ? 'flex-start' : btnAlign,\n marginTop: sec.marginTop != null ? `${sec.marginTop}px` : '0.5rem',\n marginBottom: sec.marginBottom != null ? `${sec.marginBottom}px` : undefined,\n }}>\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem', marginTop: 0, marginBottom: 0 }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n </div>\n )}\n </>\n );\n })()}\n\n {showBranding && (\n <div\n style={{\n textAlign: 'center',\n marginTop: '1rem',\n paddingTop: '0.75rem',\n borderTop: `1px solid ${styling.theme === 'dark' ? '#374151' : '#e5e7eb'}`,\n }}\n >\n <a\n href={brandingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280',\n textDecoration: 'none',\n fontSize: '0.75rem',\n }}\n >\n {brandingText}\n </a>\n </div>\n )}\n </form>\n );\n\n if (styling.backgroundImageUrl) {\n return (\n <div style={wrapperStyle}>\n {styling.backgroundOverlay ? (\n <div style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: `rgba(0,0,0,${styling.backgroundOverlay})`,\n pointerEvents: 'none',\n }} />\n ) : null}\n {formEl}\n </div>\n );\n }\n\n return formEl;\n}\n\ninterface FormFieldInputProps {\n field: FormField;\n value: unknown;\n error?: string;\n onChange: (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => void;\n onValueChange: (name: string, value: unknown) => void;\n styling: FormStyling;\n fieldSpacing: string;\n labelSpacing: string;\n phFontSize: string;\n}\n\nfunction FormFieldInput({\n field,\n value,\n error,\n onChange,\n onValueChange,\n styling,\n fieldSpacing,\n labelSpacing,\n phFontSize,\n}: FormFieldInputProps) {\n const radius = getBorderRadius(styling.borderRadius);\n const fieldRadius = getFieldBorderRadius(styling.fieldBorderRadius);\n const fontSize = getFontSize(styling.fontSize);\n const isInline = styling.labelPosition === 'left' || styling.fieldLayout === 'inline';\n\n const isBottomBorder = styling.fieldBorderStyle === 'bottom';\n const fieldPadding = styling.fieldPaddingX != null || styling.fieldPaddingY != null\n ? `${styling.fieldPaddingY ?? 8}px ${styling.fieldPaddingX ?? 12}px`\n : '0.5rem 0.75rem';\n\n const defaultBorderColor = error ? '#ef4444' : styling.fieldBorderColor || (styling.theme === 'dark' ? '#4b5563' : '#d1d5db');\n\n const inputStyle: CSSProperties = {\n width: '100%',\n padding: fieldPadding,\n border: isBottomBorder ? 'none' : `1px solid ${defaultBorderColor}`,\n ...(isBottomBorder ? { borderBottom: `1px solid ${defaultBorderColor}` } : {}),\n borderRadius: isBottomBorder ? 0 : fieldRadius,\n fontSize,\n fontFamily: 'inherit',\n backgroundColor: styling.inputBackgroundColor || (styling.theme === 'dark' ? '#374151' : '#ffffff'),\n color: styling.textColor,\n };\n\n const getOpts = (): { value: string; label: string; imageUrl?: string }[] => {\n if (!field.options) return [];\n return field.options.map((o) => typeof o === 'string' ? { value: o, label: o } : o);\n };\n\n // Layout fields (no data)\n if (field.type === 'heading') {\n return (\n <div style={{ marginBottom: fieldSpacing }}>\n <h2 style={{ fontSize: getHeadingSize(styling.headingSize), fontWeight: 600 }}>{field.label}</h2>\n {field.content && (\n <p style={{ fontSize: '0.875rem', color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280', marginTop: '0.25rem' }}>{field.content}</p>\n )}\n </div>\n );\n }\n if (field.type === 'divider') {\n return <hr style={{ marginBottom: fieldSpacing, border: 'none', borderTop: `1px solid ${styling.separatorColor || (styling.theme === 'dark' ? '#4b5563' : '#d1d5db')}` }} />;\n }\n if (field.type === 'paragraph') {\n const pSize = field.paragraphFontSize ? `${field.paragraphFontSize}px` : getParagraphSize(styling.paragraphSize);\n return (\n <div style={{ marginBottom: fieldSpacing }}>\n {field.label && (\n <p style={{ fontWeight: 500, fontSize: pSize, marginBottom: '0.25rem' }}>{field.label}</p>\n )}\n {field.content && (\n <div\n style={{ fontSize: pSize, color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280' }}\n dangerouslySetInnerHTML={{ __html: field.content }}\n />\n )}\n </div>\n );\n }\n if (field.type === 'hidden') {\n return <input type=\"hidden\" name={field.name} value={String(value || field.defaultValue || '')} />;\n }\n\n // Checkbox / toggle / consent — inline layout\n if (field.type === 'checkbox' || field.type === 'toggle' || field.type === 'consent') {\n const consentSize = field.type === 'consent' && field.consentFontSize ? `${field.consentFontSize}px` : undefined;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '0.5rem', marginBottom: fieldSpacing }}>\n <input\n type=\"checkbox\"\n id={field.name}\n name={field.name}\n checked={Boolean(value)}\n onChange={onChange}\n required={field.required}\n style={{ width: '1rem', height: '1rem', accentColor: styling.primaryColor, marginTop: '0.125rem', flexShrink: 0, backgroundColor: 'transparent' }}\n />\n <div>\n {(field.label || (field.type === 'consent' && field.consentText)) && (\n <label htmlFor={field.name} className={styling.labelClassName} style={{ cursor: 'pointer', ...(consentSize ? { fontSize: consentSize } : {}) }}>\n {field.type === 'consent' && field.consentText\n ? field.consentText\n : field.label}\n {field.required && !styling.hideRequiredAsterisk && <span style={{ color: '#ef4444', marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n {field.type === 'consent' && field.consentUrl && (\n <a href={field.consentUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: styling.primaryColor, fontSize: '0.75rem', marginTop: '0.125rem', display: 'inline-block' }}>View policy</a>\n )}\n {error && <div style={{ color: styling.errorColor || '#ef4444', fontSize: '0.875rem', marginTop: '0.25rem' }}>{error}</div>}\n </div>\n </div>\n );\n }\n\n const labelEl = field.label ? (\n <label\n htmlFor={field.name}\n className={styling.labelClassName}\n style={{\n display: 'block',\n fontWeight: 500,\n ...(isInline\n ? { width: '33%', flexShrink: 0, paddingTop: '0.5rem', marginBottom: 0 }\n : { marginBottom: labelSpacing }),\n }}\n >\n {field.label}\n {field.required && !styling.hideRequiredAsterisk && <span style={{ color: '#ef4444', marginLeft: '0.25rem' }}>*</span>}\n </label>\n ) : null;\n\n const errorEl = error ? (\n <div style={{ color: styling.errorColor || '#ef4444', fontSize: '0.875rem', marginTop: '0.25rem' }}>{error}</div>\n ) : null;\n\n let fieldEl: JSX.Element;\n\n if (field.type === 'textarea' || field.type === 'richText') {\n fieldEl = (\n <textarea\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n placeholder={field.placeholder}\n required={field.required}\n style={{ ...inputStyle, minHeight: '100px', resize: 'vertical' }}\n className={styling.fieldClassName}\n />\n );\n } else if (field.type === 'select' || field.type === 'dropdown') {\n fieldEl = (\n <select id={field.name} name={field.name} value={String(value || '')} onChange={onChange} required={field.required} style={inputStyle} className={styling.fieldClassName}>\n <option value=\"\">Select an option...</option>\n {getOpts().map((opt) => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n );\n } else if (field.type === 'radio') {\n fieldEl = (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {getOpts().map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={field.name}\n value={opt.value}\n checked={(value as string) === opt.value}\n onChange={() => onValueChange(field.name, opt.value)}\n style={{ accentColor: styling.primaryColor }}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n } else if (field.type === 'multiselect') {\n const selected = Array.isArray(value) ? (value as string[]) : [];\n fieldEl = (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {getOpts().map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selected.includes(opt.value)}\n onChange={() => {\n const next = selected.includes(opt.value)\n ? selected.filter((v) => v !== opt.value)\n : [...selected, opt.value];\n onValueChange(field.name, next);\n }}\n style={{ accentColor: styling.primaryColor }}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n } else if (field.type === 'rating') {\n const max = field.ratingMax || 5;\n const current = Number(value) || 0;\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.25rem' }}>\n {Array.from({ length: max }, (_, i) => i + 1).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onValueChange(field.name, n)}\n style={{\n width: '2rem', height: '2rem', cursor: 'pointer', border: 'none',\n background: 'none', padding: 0, fontSize: '1.5rem',\n color: n <= current ? '#f59e0b' : (styling.theme === 'dark' ? '#4b5563' : '#d1d5db'),\n transition: 'color 0.15s',\n }}\n >★</button>\n ))}\n </div>\n );\n } else if (field.type === 'scale' || field.type === 'opinionScale') {\n const min = field.min ?? 1;\n const max = field.max ?? 10;\n const current = value as number | undefined;\n fieldEl = (\n <div>\n <div style={{ display: 'flex', gap: '0.25rem', flexWrap: 'wrap' }}>\n {Array.from({ length: max - min + 1 }, (_, i) => min + i).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onValueChange(field.name, n)}\n style={{\n minWidth: '2.25rem', height: '2.25rem', borderRadius: radius, cursor: 'pointer',\n border: `1px solid ${styling.theme === 'dark' ? '#4b5563' : '#d1d5db'}`,\n background: current === n ? styling.primaryColor : (styling.theme === 'dark' ? '#374151' : '#ffffff'),\n color: current === n ? 'white' : styling.textColor,\n fontSize: '0.875rem', transition: 'all 0.15s',\n }}\n >{n}</button>\n ))}\n </div>\n {(field.lowLabel || field.highLabel) && (\n <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: '0.75rem', color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280', marginTop: '0.25rem' }}>\n <span>{field.lowLabel}</span>\n <span>{field.highLabel}</span>\n </div>\n )}\n </div>\n );\n } else if (field.type === 'slider') {\n const min = field.min ?? 0;\n const max = field.max ?? 100;\n const step = field.step ?? 1;\n fieldEl = (\n <div>\n <input\n type=\"range\"\n id={field.name}\n name={field.name}\n min={min}\n max={max}\n step={step}\n value={Number(value) || min}\n onChange={(e) => onValueChange(field.name, Number(e.target.value))}\n style={{ width: '100%', accentColor: styling.primaryColor }}\n />\n <div style={{ textAlign: 'center', fontSize: '0.875rem', marginTop: '0.25rem' }}>{String(value ?? min)}</div>\n </div>\n );\n } else if (field.type === 'imageChoice') {\n const selected = value as string | undefined;\n fieldEl = (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem' }}>\n {getOpts().map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onValueChange(field.name, opt.value)}\n style={{\n border: `2px solid ${selected === opt.value ? styling.primaryColor : (styling.theme === 'dark' ? '#4b5563' : '#d1d5db')}`,\n borderRadius: radius, padding: '0.5rem', cursor: 'pointer', textAlign: 'center',\n background: 'none', transition: 'border-color 0.15s',\n }}\n >\n {opt.imageUrl && <img src={opt.imageUrl} alt={opt.label} style={{ maxWidth: '80px', maxHeight: '80px', objectFit: 'cover', borderRadius: radius }} />}\n <div style={{ fontSize: '0.875rem', marginTop: '0.25rem' }}>{opt.label}</div>\n </button>\n ))}\n </div>\n );\n } else if (field.type === 'file') {\n const fileValue = value as File | undefined;\n const formatSize = (size: number) => size < 1024 ? `${size} B` : size < 1048576 ? `${(size / 1024).toFixed(1)} KB` : `${(size / 1048576).toFixed(1)} MB`;\n const borderColor = error ? (styling.errorColor || '#ef4444') : styling.theme === 'dark' ? '#4b5563' : '#d1d5db';\n const mutedColor = styling.theme === 'dark' ? '#9ca3af' : '#6b7280';\n fieldEl = (\n <label\n htmlFor={field.name}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n borderRadius: fieldRadius,\n border: `2px dashed ${borderColor}`,\n padding: '1.5rem',\n cursor: 'pointer',\n transition: 'border-color 0.15s, background-color 0.15s',\n backgroundColor: fileValue ? (styling.theme === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.02)') : 'transparent',\n }}\n onDragOver={(e) => { e.preventDefault(); e.currentTarget.style.borderColor = styling.primaryColor || '#3b82f6'; e.currentTarget.style.backgroundColor = styling.theme === 'dark' ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.04)'; }}\n onDragLeave={(e) => { e.currentTarget.style.borderColor = borderColor; e.currentTarget.style.backgroundColor = fileValue ? (styling.theme === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.02)') : 'transparent'; }}\n onDrop={(e) => {\n e.preventDefault();\n e.currentTarget.style.borderColor = borderColor;\n e.currentTarget.style.backgroundColor = 'transparent';\n const file = e.dataTransfer.files?.[0];\n if (file) onValueChange(field.name, file);\n }}\n >\n <input\n id={field.name}\n name={field.name}\n type=\"file\"\n style={{ position: 'absolute', width: '1px', height: '1px', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: 0 }}\n onChange={onChange}\n required={field.required}\n accept={field.allowedMimeTypes?.join(',')}\n multiple={field.multiple}\n />\n {fileValue ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={styling.primaryColor || '#3b82f6'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>\n <span style={{ fontSize: '0.875rem', fontWeight: 500, maxWidth: '100%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{fileValue.name}</span>\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>{formatSize(fileValue.size)}</span>\n <button\n type=\"button\"\n style={{ fontSize: '0.75rem', color: styling.errorColor || '#ef4444', background: 'none', border: 'none', cursor: 'pointer', marginTop: '0.25rem', textDecoration: 'underline' }}\n onClick={(e) => { e.preventDefault(); onValueChange(field.name, undefined); }}\n >\n Remove\n </button>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={mutedColor} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\"/></svg>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>Drag & drop a file here, or click to browse</span>\n {field.allowedMimeTypes && field.allowedMimeTypes.length > 0 && (\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>{field.allowedMimeTypes.join(', ')}</span>\n )}\n {field.maxFileSize && (\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>Max size: {formatSize(field.maxFileSize)}</span>\n )}\n </>\n )}\n </label>\n );\n } else if (field.type === 'name') {\n const nameVal = (value || {}) as Record<string, string>;\n const nameFields = field.nameFields || ['first', 'last'];\n const labels: Record<string, string> = { prefix: 'Prefix', first: 'First Name', middle: 'Middle', last: 'Last Name', suffix: 'Suffix' };\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n {nameFields.map((nf) => (\n <input\n key={nf}\n placeholder={labels[nf] || nf}\n value={nameVal[nf] || ''}\n onChange={(e) => onValueChange(field.name, { ...nameVal, [nf]: e.target.value })}\n style={{ ...inputStyle, flex: 1, minWidth: '120px' }}\n className={styling.fieldClassName}\n />\n ))}\n </div>\n );\n } else if (field.type === 'address') {\n const addr = (value || {}) as Record<string, string>;\n const addrFields = field.addressFields || ['street', 'city', 'state', 'zip', 'country'];\n const labels: Record<string, string> = { street: 'Street', street2: 'Street 2', city: 'City', state: 'State', zip: 'ZIP', country: 'Country' };\n fieldEl = (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {addrFields.map((af) => (\n <input\n key={af}\n placeholder={labels[af] || af}\n value={addr[af] || ''}\n onChange={(e) => onValueChange(field.name, { ...addr, [af]: e.target.value })}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n ))}\n </div>\n );\n } else if (field.type === 'currency') {\n fieldEl = (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.25rem' }}>\n {field.currencySymbol && <span>{field.currencySymbol}</span>}\n <input\n type=\"number\"\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n step={0.01}\n min={field.min}\n max={field.max}\n required={field.required}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n </div>\n );\n } else if (field.type === 'colorPicker') {\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>\n <input\n type=\"color\"\n id={field.name}\n value={String(value || '#000000')}\n onChange={(e) => onValueChange(field.name, e.target.value)}\n style={{ width: '3rem', height: '2.25rem', border: 'none', cursor: 'pointer', padding: 0 }}\n />\n <input\n type=\"text\"\n value={String(value || '')}\n onChange={(e) => onValueChange(field.name, e.target.value)}\n placeholder=\"#000000\"\n style={{ ...inputStyle, flex: 1 }}\n className={styling.fieldClassName}\n />\n </div>\n );\n } else if (field.type === 'dateRange') {\n const range = (value || {}) as { start?: string; end?: string };\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>\n <input type=\"date\" value={range.start || ''} onChange={(e) => onValueChange(field.name, { ...range, start: e.target.value })} style={{ ...inputStyle, flex: 1 }} className={styling.fieldClassName} />\n <span>to</span>\n <input type=\"date\" value={range.end || ''} onChange={(e) => onValueChange(field.name, { ...range, end: e.target.value })} style={{ ...inputStyle, flex: 1 }} className={styling.fieldClassName} />\n </div>\n );\n } else {\n // Default: text, email, number, date, phone, url, password, time, datetime, etc.\n const typeMap: Record<string, string> = {\n phone: 'tel', url: 'url', datetime: 'datetime-local', time: 'time', date: 'date',\n number: 'number', email: 'email', password: 'password',\n };\n fieldEl = (\n <input\n type={typeMap[field.type] || 'text'}\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n placeholder={field.placeholder}\n required={field.required}\n min={field.min}\n max={field.max}\n step={field.step}\n maxLength={field.maxLength}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n );\n }\n\n return (\n <div\n style={{\n marginBottom: fieldSpacing,\n ...(isInline ? { display: 'flex', alignItems: 'flex-start', gap: '1rem' } : {}),\n }}\n >\n {labelEl}\n <div style={isInline ? { flex: 1 } : {}}>\n {fieldEl}\n {errorEl}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["errors","useState","useEffect","useMemo","jsx","useState","useMemo","useEffect","w"]}
|
|
1
|
+
{"version":3,"sources":["../../react/use-form.tsx","../../core/types.ts","../../core/api-client.ts","../../core/forms-sdk.ts","../../react/forms-expert-form.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n ReactNode,\n} from 'react';\nimport {\n FormsSDK,\n FormsSDKConfig,\n FormStatusResponse,\n SubmissionResponse,\n ValidationError,\n FormValidationError,\n FormsError,\n UploadProgress,\n FileValidationError,\n} from '../core';\n\ninterface FormsContextValue {\n sdk: FormsSDK;\n isReady: boolean;\n}\n\nconst FormsContext = createContext<FormsContextValue | null>(null);\n\ninterface FormsProviderProps {\n config: FormsSDKConfig;\n children: ReactNode;\n}\n\n/**\n * Forms provider component\n */\nexport function FormsProvider({ config, children }: FormsProviderProps) {\n const sdk = useMemo(() => new FormsSDK(config), [config]);\n const value = useMemo(() => ({ sdk, isReady: true }), [sdk]);\n\n return (\n <FormsContext.Provider value={value}>{children}</FormsContext.Provider>\n );\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Hook to access the Forms SDK\n */\nexport function useFormsSDK(): FormsSDK {\n const context = useContext(FormsContext);\n if (!context) {\n throw new Error('useFormsSDK must be used within a FormsProvider');\n }\n return context.sdk;\n}\n\nexport interface UseFormOptions {\n /** Form slug */\n slug: string;\n /** SDK config (if not using provider) */\n config?: FormsSDKConfig;\n /** Track form views for analytics (completion rate). Default: false for SDK usage, pass true to enable. */\n trackViews?: boolean;\n /** Success callback */\n onSuccess?: (response: SubmissionResponse) => void;\n /** Error callback */\n onError?: (error: Error) => void;\n /** Validation error callback */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Auto-initialize on mount */\n autoInit?: boolean;\n /** Language code to pass to backend */\n lang?: string;\n}\n\nexport interface UseFormReturn {\n /** Form configuration */\n config: FormStatusResponse | null;\n /** Form schema (shorthand for config.schema) */\n schema: FormStatusResponse['schema'] | null;\n /** Whether form is loading */\n isLoading: boolean;\n /** Whether form is initializing */\n isInitializing: boolean;\n /** Whether form was submitted successfully */\n isSubmitted: boolean;\n /** Alias for isSubmitted */\n isSuccess: boolean;\n /** Validation errors by field name */\n errors: Record<string, string>;\n /** File validation errors */\n fileErrors: FileValidationError[];\n /** Last submission error (if any) */\n error: Error | null;\n /** Form values */\n values: Record<string, unknown>;\n /** Upload progress (when uploading files) */\n uploadProgress: UploadProgress | null;\n /** Initialize the form */\n initialize: () => Promise<FormStatusResponse>;\n /** Set a field value */\n setValue: (name: string, value: unknown) => void;\n /** Set multiple values */\n setValues: (values: Record<string, unknown>) => void;\n /** Validate form data */\n validate: () => Promise<boolean>;\n /** Validate files against form settings */\n validateFiles: (files: File[]) => FileValidationError[];\n /** Submit the form */\n submit: (captchaToken?: string) => Promise<SubmissionResponse | null>;\n /** Reset form to initial state */\n reset: () => void;\n /** Clear errors */\n clearErrors: () => void;\n /** Whether captcha is required */\n requiresCaptcha: boolean;\n /** Captcha provider */\n captchaProvider: 'turnstile' | 'recaptcha' | 'hcaptcha' | undefined;\n /** Captcha site key */\n captchaSiteKey: string | undefined;\n /** Whether honeypot is enabled */\n honeypotEnabled: boolean;\n /** Whether attachments are allowed */\n allowsAttachments: boolean;\n /** Max attachments allowed */\n maxAttachments: number;\n /** Max attachment size in bytes */\n maxAttachmentSize: number;\n}\n\n/**\n * Hook for managing form state and submission\n */\nexport function useForm(options: UseFormOptions): UseFormReturn {\n const context = useContext(FormsContext);\n\n // Create SDK if config provided, otherwise use context\n const sdk = useMemo(() => {\n if (options.config) {\n return new FormsSDK(options.config);\n }\n if (!context) {\n throw new Error('Either provide config to useForm or use FormsProvider');\n }\n return context.sdk;\n }, [options.config, context]);\n\n const [config, setConfig] = useState<FormStatusResponse | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isInitializing, setIsInitializing] = useState(false);\n const [isSubmitted, setIsSubmitted] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [fileErrors, setFileErrors] = useState<FileValidationError[]>([]);\n const [values, setValues] = useState<Record<string, unknown>>({});\n const [error, setError] = useState<Error | null>(null);\n const [uploadProgress, setUploadProgress] = useState<UploadProgress | null>(null);\n\n // Extract values to avoid stale closure issues\n const { slug, trackViews, lang, autoInit, onSuccess, onError, onValidationError } = options;\n\n const initialize = useCallback(async () => {\n setIsInitializing(true);\n try {\n const formConfig = await sdk.isActive(slug, lang);\n setConfig(formConfig);\n if (trackViews) {\n void sdk.trackView(slug);\n }\n return formConfig;\n } finally {\n setIsInitializing(false);\n }\n }, [sdk, slug, trackViews, lang]);\n\n // Auto-initialize\n useEffect(() => {\n if (autoInit !== false) {\n initialize();\n }\n }, [initialize, autoInit]);\n\n const setValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error on change\n setErrors((prev) => {\n if (prev[name]) {\n const { [name]: _, ...rest } = prev;\n return rest;\n }\n return prev;\n });\n }, []);\n\n const setValuesHandler = useCallback((newValues: Record<string, unknown>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n const validate = useCallback(async () => {\n const result = await sdk.validate(slug, values);\n if (!result.valid) {\n const errorMap = result.errors.reduce(\n (acc, err) => ({ ...acc, [err.field]: err.message }),\n {}\n );\n setErrors(errorMap);\n }\n return result.valid;\n }, [sdk, slug, values]);\n\n const submit = useCallback(\n async (captchaToken?: string) => {\n setIsLoading(true);\n setErrors({});\n setFileErrors([]);\n setError(null);\n setUploadProgress(null);\n\n try {\n // Add honeypot field if enabled\n const submitData = config?.settings?.honeypot\n ? { ...values, _hp: '' }\n : values;\n\n const response = await sdk.submit(slug, submitData, {\n captchaToken,\n onProgress: setUploadProgress,\n });\n setIsSubmitted(true);\n onSuccess?.(response);\n return response;\n } catch (err) {\n if (err instanceof FormValidationError) {\n const errorMap = err.errors.reduce(\n (acc, e) => ({ ...acc, [e.field]: e.message }),\n {}\n );\n setErrors(errorMap);\n onValidationError?.(err.errors);\n } else {\n setError(err as Error);\n onError?.(err as Error);\n }\n return null;\n } finally {\n setIsLoading(false);\n setUploadProgress(null);\n }\n },\n [sdk, slug, values, config?.settings?.honeypot, onSuccess, onError, onValidationError]\n );\n\n const reset = useCallback(() => {\n setValues({});\n setErrors({});\n setFileErrors([]);\n setError(null);\n setIsSubmitted(false);\n setIsLoading(false);\n setUploadProgress(null);\n }, []);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n setFileErrors([]);\n }, []);\n\n // File validation\n const validateFiles = useCallback((files: File[]): FileValidationError[] => {\n const errors: FileValidationError[] = [];\n const maxSize = config?.settings?.maxAttachmentSize ?? 10 * 1024 * 1024; // 10MB default\n const maxCount = config?.settings?.maxAttachments ?? 5;\n\n if (files.length > maxCount) {\n errors.push({\n field: 'attachments',\n file: '',\n error: 'count',\n message: `Maximum ${maxCount} files allowed`,\n });\n }\n\n files.forEach((file) => {\n if (file.size > maxSize) {\n errors.push({\n field: 'attachments',\n file: file.name,\n error: 'size',\n message: `File \"${file.name}\" exceeds maximum size of ${formatBytes(maxSize)}`,\n });\n }\n });\n\n setFileErrors(errors);\n return errors;\n }, [config?.settings?.maxAttachmentSize, config?.settings?.maxAttachments]);\n\n const allowsAttachments = config?.settings?.allowAttachments ?? false;\n const maxAttachments = config?.settings?.maxAttachments ?? 5;\n const maxAttachmentSize = config?.settings?.maxAttachmentSize ?? 10 * 1024 * 1024;\n\n return {\n config,\n schema: config?.schema ?? null,\n isLoading,\n isInitializing,\n isSubmitted,\n isSuccess: isSubmitted,\n errors,\n fileErrors,\n error,\n values,\n uploadProgress,\n initialize,\n setValue,\n setValues: setValuesHandler,\n validate,\n validateFiles,\n submit,\n reset,\n clearErrors,\n requiresCaptcha: config?.captcha?.enabled ?? config?.settings?.captcha?.enabled ?? false,\n captchaProvider: config?.captcha?.provider ?? config?.settings?.captcha?.provider,\n captchaSiteKey: config?.captcha?.siteKey ?? config?.settings?.captcha?.siteKey,\n honeypotEnabled: config?.settings?.honeypot ?? false,\n allowsAttachments,\n maxAttachments,\n maxAttachmentSize,\n };\n}\n","/**\n * Form field types\n */\nexport type BasicFieldType =\n | 'text' | 'email' | 'number' | 'textarea' | 'select'\n | 'checkbox' | 'file' | 'date' | 'hidden';\n\nexport type InteractiveFieldType =\n | 'radio' | 'multiselect' | 'rating' | 'scale' | 'toggle'\n | 'ranking' | 'imageChoice' | 'phone' | 'url' | 'password'\n | 'richText' | 'slider' | 'currency' | 'time' | 'datetime'\n | 'dateRange' | 'address' | 'name' | 'dropdown' | 'colorPicker'\n | 'location' | 'opinionScale' | 'consent';\n\nexport type LayoutFieldType = 'heading' | 'divider' | 'paragraph';\n\nexport type FormFieldType = BasicFieldType | InteractiveFieldType | LayoutFieldType;\n\nexport interface FormFieldOption {\n label: string;\n value: string;\n imageUrl?: string;\n}\n\n/**\n * Form field definition\n */\nexport interface FormField {\n name: string;\n type: FormFieldType;\n label?: string;\n placeholder?: string;\n required?: boolean;\n options?: string[] | FormFieldOption[];\n defaultValue?: unknown;\n maxFileSize?: number;\n allowedMimeTypes?: string[];\n multiple?: boolean;\n min?: number;\n max?: number;\n step?: number;\n ratingMax?: number;\n lowLabel?: string;\n highLabel?: string;\n defaultCountryCode?: string;\n currencyCode?: string;\n currencySymbol?: string;\n addressFields?: ('street' | 'street2' | 'city' | 'state' | 'zip' | 'country')[];\n nameFields?: ('prefix' | 'first' | 'middle' | 'last' | 'suffix')[];\n content?: string;\n paragraphFontSize?: number;\n consentText?: string;\n consentUrl?: string;\n consentFontSize?: number;\n maxLength?: number;\n stepId?: string;\n visibleWhen?: {\n field: string;\n operator: 'eq' | 'neq' | 'contains' | 'gt' | 'lt';\n value: unknown;\n };\n\n // Row layout\n row?: number;\n width?: '1/4' | '1/3' | '1/2' | '2/3' | '3/4' | 'full';\n}\n\n/**\n * Secondary button configuration\n */\nexport interface SecondaryButton {\n enabled: boolean;\n text: string;\n href: string;\n openInNewTab?: boolean;\n position?: 'left' | 'right' | 'below';\n align?: 'left' | 'center' | 'right';\n marginTop?: number;\n marginBottom?: number;\n style?: 'filled' | 'outlined' | 'minimal' | 'link';\n color?: string;\n textColor?: string;\n fontSize?: number;\n icon?: string;\n iconPosition?: 'left' | 'right';\n}\n\n/**\n * Form styling configuration\n */\nexport interface FormStyling {\n theme: 'light' | 'dark' | 'system' | 'custom';\n primaryColor: string;\n backgroundColor: string;\n textColor: string;\n errorColor?: string;\n successColor?: string;\n borderRadius: 'none' | 'sm' | 'md' | 'lg';\n fontSize: 'sm' | 'md' | 'lg' | 'small' | 'medium' | 'large';\n buttonStyle: 'filled' | 'outline' | 'outlined' | 'minimal';\n labelPosition: 'top' | 'left' | 'floating';\n labelClassName?: string;\n fieldClassName?: string;\n buttonClassName?: string;\n customCss?: string;\n // Extended styling (matching hosted form builder)\n fontFamily?: string;\n formWidth?: 'narrow' | 'medium' | 'wide' | 'full';\n fieldLayout?: 'stacked' | 'inline';\n fieldBorderStyle?: 'full' | 'bottom';\n fieldBorderColor?: string;\n fieldBorderRadius?: 'none' | 'small' | 'medium' | 'large' | 'full';\n fieldPaddingX?: number;\n fieldPaddingY?: number;\n separatorColor?: string;\n buttonColor?: string;\n buttonText?: string;\n buttonRadius?: 'none' | 'small' | 'medium' | 'large' | 'full';\n buttonAlign?: 'left' | 'center' | 'right';\n buttonSize?: 'small' | 'medium' | 'large';\n buttonPaddingX?: number;\n buttonPaddingY?: number;\n buttonGradient?: string;\n buttonFullWidth?: boolean;\n buttonFontSize?: number;\n buttonIcon?: string;\n buttonIconPosition?: 'left' | 'right';\n fieldSpacing?: 'compact' | 'normal' | 'relaxed' | 'spacious';\n formPadding?: 'none' | 'compact' | 'normal' | 'relaxed' | 'spacious';\n labelSpacing?: 'compact' | 'normal' | 'relaxed';\n placeholderFontSize?: 'small' | 'medium' | 'large';\n headingSize?: 'small' | 'medium' | 'large' | 'extra-large';\n paragraphSize?: 'small' | 'medium' | 'large';\n formNameFontSize?: number;\n formNameFontWeight?: 'normal' | 'medium' | 'semibold' | 'bold';\n hideRequiredAsterisk?: boolean;\n logoUrl?: string;\n logoPosition?: 'top-left' | 'top-center' | 'top-right';\n coverImageUrl?: string;\n backgroundImageUrl?: string;\n backgroundOverlay?: number;\n transparentBackground?: boolean;\n secondaryButton?: SecondaryButton;\n // Input styling\n inputBackgroundColor?: string;\n placeholderColor?: string;\n}\n\n/**\n * Form schema\n */\nexport interface FormSchema {\n fields: FormField[];\n styling?: FormStyling;\n}\n\n/**\n * Form captcha settings\n */\nexport interface CaptchaSettings {\n enabled: boolean;\n provider?: 'turnstile' | 'recaptcha' | 'hcaptcha';\n siteKey?: string;\n}\n\n/**\n * Form branding configuration\n */\nexport interface FormBranding {\n enabled: boolean;\n text?: string;\n url?: string;\n}\n\n/**\n * Form status response from API\n */\nexport interface FormStatusResponse {\n active: boolean;\n formId?: string;\n name?: string;\n description?: string | null;\n mode?: 'free' | 'schema';\n type?: 'hosted' | 'embed' | 'both';\n layout?: 'single' | 'multi-step';\n schema?: FormSchema;\n steps?: Array<{ title: string; description?: string; fields: string[] }>;\n /** Top-level styling (full hosted styling config) */\n styling?: FormStyling;\n embedConfig?: {\n width?: string;\n height?: string;\n maxHeight?: string;\n minHeight?: string;\n autoResize?: boolean;\n transparentBackground?: boolean;\n [key: string]: unknown;\n };\n error?: string;\n /** Captcha settings (top-level) */\n captcha?: CaptchaSettings;\n settings?: {\n /** @deprecated Use top-level captcha instead */\n captcha?: CaptchaSettings;\n honeypot: boolean;\n allowAttachments: boolean;\n maxAttachments?: number;\n maxAttachmentSize?: number;\n successMessage?: string;\n redirectUrl?: string;\n showFormName?: boolean;\n };\n /** Access control configuration */\n accessControl?: {\n mode: string;\n passwordProtected: boolean;\n };\n /** Branding configuration */\n branding?: FormBranding;\n /** Hosted config (page settings, success page, etc.) */\n hostedConfig?: {\n pageTitle?: string;\n successMessage?: string;\n successPageType?: 'message' | 'redirect' | 'custom';\n redirectUrl?: string;\n customSuccessHtml?: string;\n [key: string]: unknown;\n };\n closesAt?: string | null;\n resourceId?: string;\n /** Available published translation language codes */\n availableLanguages?: string[];\n /** Current language applied to this response (null if base language) */\n currentLanguage?: string | null;\n /** Whether to show language switch UI */\n showLanguageSwitch?: boolean;\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n}\n\n/**\n * Validation response from API\n */\nexport interface ValidationResponse {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Submission response from API\n */\nexport interface SubmissionResponse {\n success: boolean;\n submissionId: string;\n message: string;\n}\n\n/**\n * Submit options\n */\nexport interface SubmitOptions {\n pageUrl?: string;\n captchaToken?: string;\n /** Callback for upload progress */\n onProgress?: (progress: UploadProgress) => void;\n}\n\n/**\n * Upload progress information\n */\nexport interface UploadProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\n/**\n * File validation error\n */\nexport interface FileValidationError {\n field: string;\n file: string;\n error: 'size' | 'type' | 'count';\n message: string;\n}\n\n/**\n * SDK configuration\n */\nexport interface FormsSDKConfig {\n apiKey: string;\n resourceId: string;\n baseUrl?: string;\n}\n\n/**\n * Form handler options\n */\nexport interface FormHandlerOptions {\n /** Track form views for analytics (completion rate) */\n trackViews?: boolean;\n onSubmitStart?: () => void;\n onSubmitSuccess?: (response: SubmissionResponse) => void;\n onSubmitError?: (error: FormsError) => void;\n onValidationError?: (errors: ValidationError[]) => void;\n}\n\n/**\n * Forms SDK error\n */\nexport class FormsError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode: number,\n public retryAfter?: number\n ) {\n super(message);\n this.name = 'FormsError';\n }\n}\n\n/**\n * Validation error class\n */\nexport class FormValidationError extends Error {\n constructor(public errors: ValidationError[]) {\n super('Validation failed');\n this.name = 'FormValidationError';\n }\n}\n","import {\n FormsSDKConfig,\n FormStatusResponse,\n ValidationResponse,\n SubmissionResponse,\n SubmitOptions,\n FormsError,\n UploadProgress,\n} from './types';\n\n/**\n * API client for forms backend\n */\nexport class FormsApiClient {\n private baseUrl: string;\n private apiKey: string;\n private resourceId: string;\n\n constructor(config: FormsSDKConfig) {\n this.apiKey = config.apiKey;\n this.resourceId = config.resourceId;\n this.baseUrl = (config.baseUrl || 'https://api.forms.expert/api/v1').replace(/\\/$/, '');\n }\n\n /**\n * Build URL with token query parameter\n */\n private buildUrl(path: string): string {\n const separator = path.includes('?') ? '&' : '?';\n return `${this.baseUrl}${path}${separator}token=${encodeURIComponent(this.apiKey)}`;\n }\n\n /**\n * Make an API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: object\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new FormsError(\n data.message || 'Request failed',\n data.code || 'UNKNOWN_ERROR',\n response.status,\n data.retryAfter\n );\n }\n\n return data;\n }\n\n /**\n * Check if form is active and get configuration\n */\n async isActive(slug: string, lang?: string): Promise<FormStatusResponse> {\n const langParam = lang ? `?lang=${encodeURIComponent(lang)}` : '';\n return this.request('GET', `/f/${this.resourceId}/${slug}/is-active${langParam}`);\n }\n\n /**\n * Validate form data without submitting\n */\n async validate(\n slug: string,\n data: Record<string, unknown>\n ): Promise<ValidationResponse> {\n return this.request('POST', `/f/${this.resourceId}/${slug}/validate`, {\n data,\n });\n }\n\n /**\n * Submit form data (supports files)\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n const url = this.buildUrl(`/f/${this.resourceId}/${slug}`);\n \n // Check if data contains files\n const hasFiles = Object.values(data).some(\n (v) => v instanceof File || (v instanceof FileList && v.length > 0)\n );\n\n if (hasFiles || options?.onProgress) {\n // Use FormData and XMLHttpRequest for file uploads with progress\n return this.submitWithFormData(url, data, options);\n }\n\n // Use regular JSON request for non-file submissions\n return this.request('POST', `/f/${this.resourceId}/${slug}`, {\n data,\n pageUrl: options?.pageUrl || (typeof window !== 'undefined' ? window.location.href : undefined),\n captchaToken: options?.captchaToken,\n });\n }\n\n /**\n * Submit with FormData (for file uploads with progress tracking)\n */\n private submitWithFormData(\n url: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n return new Promise((resolve, reject) => {\n const formData = new FormData();\n\n // Add data fields\n for (const [key, value] of Object.entries(data)) {\n if (value instanceof File) {\n formData.append(key, value);\n } else if (value instanceof FileList) {\n Array.from(value).forEach((file) => formData.append(key, file));\n } else if (value !== undefined && value !== null) {\n formData.append(`data[${key}]`, String(value));\n }\n }\n\n // Add metadata\n const pageUrl = options?.pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n if (pageUrl) {\n formData.append('pageUrl', pageUrl);\n }\n if (options?.captchaToken) {\n formData.append('captchaToken', options.captchaToken);\n }\n\n const xhr = new XMLHttpRequest();\n\n // Progress tracking\n if (options?.onProgress) {\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n options.onProgress!({\n loaded: event.loaded,\n total: event.total,\n percentage: Math.round((event.loaded / event.total) * 100),\n });\n }\n });\n }\n\n xhr.addEventListener('load', () => {\n try {\n const response = JSON.parse(xhr.responseText);\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(response);\n } else {\n reject(new FormsError(\n response.message || 'Submission failed',\n response.code || 'UNKNOWN_ERROR',\n xhr.status,\n response.retryAfter\n ));\n }\n } catch {\n reject(new FormsError('Invalid response', 'PARSE_ERROR', xhr.status));\n }\n });\n\n xhr.addEventListener('error', () => {\n reject(new FormsError('Network error', 'NETWORK_ERROR', 0));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new FormsError('Request aborted', 'ABORTED', 0));\n });\n\n xhr.open('POST', url);\n xhr.send(formData);\n });\n }\n\n /**\n * Track a form view (for analytics completion rate)\n */\n async trackView(slug: string): Promise<void> {\n const url = this.buildUrl(`/f/${this.resourceId}/${slug}/view`);\n await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' }).catch(() => {});\n }\n\n /**\n * Get resource ID\n */\n getResourceId(): string {\n return this.resourceId;\n }\n\n /**\n * Get base URL\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n}\n","import { FormsApiClient } from './api-client';\nimport {\n FormsSDKConfig,\n FormStatusResponse,\n ValidationResponse,\n SubmissionResponse,\n SubmitOptions,\n FormHandlerOptions,\n FormsError,\n FormValidationError,\n} from './types';\n\n/**\n * Form handler for a specific form\n */\nexport class FormHandler {\n private apiClient: FormsApiClient;\n private slug: string;\n private config: FormStatusResponse | null = null;\n private options: FormHandlerOptions;\n\n constructor(\n apiClient: FormsApiClient,\n slug: string,\n options: FormHandlerOptions = {}\n ) {\n this.apiClient = apiClient;\n this.slug = slug;\n this.options = options;\n }\n\n /**\n * Initialize form handler and fetch configuration\n */\n async initialize(lang?: string): Promise<FormStatusResponse> {\n this.config = await this.apiClient.isActive(this.slug, lang);\n if (this.options.trackViews) {\n this.apiClient.trackView(this.slug);\n }\n return this.config;\n }\n\n /**\n * Get cached form configuration\n */\n getConfig(): FormStatusResponse | null {\n return this.config;\n }\n\n /**\n * Check if form is active\n */\n isActive(): boolean {\n return this.config?.active ?? false;\n }\n\n /**\n * Check if captcha is required\n */\n requiresCaptcha(): boolean {\n return this.config?.settings?.captcha?.enabled ?? false;\n }\n\n /**\n * Get captcha provider\n */\n getCaptchaProvider(): 'turnstile' | 'recaptcha' | 'hcaptcha' | undefined {\n return this.config?.settings?.captcha?.provider;\n }\n\n /**\n * Get form schema\n */\n getSchema() {\n return this.config?.schema;\n }\n\n /**\n * Validate form data\n */\n async validate(data: Record<string, unknown>): Promise<ValidationResponse> {\n return this.apiClient.validate(this.slug, data);\n }\n\n /**\n * Submit form data\n */\n async submit(\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n this.options.onSubmitStart?.();\n\n try {\n // Validate first if in schema mode\n if (this.config?.mode === 'schema') {\n const validation = await this.validate(data);\n if (!validation.valid) {\n this.options.onValidationError?.(validation.errors);\n throw new FormValidationError(validation.errors);\n }\n }\n\n const response = await this.apiClient.submit(this.slug, data, options);\n this.options.onSubmitSuccess?.(response);\n return response;\n } catch (error) {\n if (error instanceof FormsError) {\n this.options.onSubmitError?.(error);\n }\n throw error;\n }\n }\n\n /**\n * Get success message from config\n */\n getSuccessMessage(): string {\n return this.config?.settings?.successMessage || 'Form submitted successfully!';\n }\n\n /**\n * Get redirect URL from config\n */\n getRedirectUrl(): string | undefined {\n return this.config?.settings?.redirectUrl;\n }\n}\n\n/**\n * Main Forms SDK class\n */\nexport class FormsSDK {\n private apiClient: FormsApiClient;\n\n constructor(config: FormsSDKConfig) {\n this.apiClient = new FormsApiClient(config);\n }\n\n /**\n * Check if form is active and get configuration\n */\n async isActive(slug: string, lang?: string): Promise<FormStatusResponse> {\n return this.apiClient.isActive(slug, lang);\n }\n\n /**\n * Validate form data without submitting\n */\n async validate(\n slug: string,\n data: Record<string, unknown>\n ): Promise<ValidationResponse> {\n return this.apiClient.validate(slug, data);\n }\n\n /**\n * Submit form data\n */\n async submit(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions\n ): Promise<SubmissionResponse> {\n return this.apiClient.submit(slug, data, options);\n }\n\n /**\n * Create a form handler for a specific form\n */\n form(slug: string, options?: FormHandlerOptions): FormHandler {\n return new FormHandler(this.apiClient, slug, options);\n }\n\n /**\n * Track a form view (for analytics completion rate)\n */\n async trackView(slug: string): Promise<void> {\n return this.apiClient.trackView(slug);\n }\n\n /**\n * Submit with retry logic for rate limits\n */\n async submitWithRetry(\n slug: string,\n data: Record<string, unknown>,\n options?: SubmitOptions & { maxRetries?: number }\n ): Promise<SubmissionResponse> {\n const maxRetries = options?.maxRetries ?? 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await this.submit(slug, data, options);\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof FormsError) {\n // Don't retry validation or auth errors\n if (\n [\n 'VALIDATION_ERROR',\n 'CAPTCHA_REQUIRED',\n 'ORIGIN_NOT_ALLOWED',\n ].includes(error.code)\n ) {\n throw error;\n }\n\n // Retry rate limits with backoff\n if (error.code.includes('RATE_LIMIT')) {\n const retryAfter = error.retryAfter || Math.pow(2, attempt) * 1000;\n await new Promise((resolve) => setTimeout(resolve, retryAfter));\n continue;\n }\n }\n\n // Exponential backoff for network errors\n await new Promise((resolve) =>\n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n\n throw lastError!;\n }\n}\n","import { useState, useEffect, useRef, useMemo, FormEvent, ChangeEvent, CSSProperties } from 'react';\nimport {\n FormsSDKConfig,\n FormField,\n FormStyling,\n SecondaryButton,\n SubmissionResponse,\n ValidationError,\n} from '../core';\nimport { useForm, UseFormOptions } from './use-form';\n\nconst defaultStyling: FormStyling = {\n theme: 'light',\n primaryColor: '#3b82f6',\n backgroundColor: '#ffffff',\n textColor: '#1f2937',\n borderRadius: 'md',\n fontSize: 'md',\n buttonStyle: 'filled',\n labelPosition: 'top',\n};\n\nfunction getBorderRadius(radius: FormStyling['borderRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'sm': return '0.125rem';\n case 'md': return '0.375rem';\n case 'lg': return '0.5rem';\n default: return '0.375rem';\n }\n}\n\nfunction getFieldBorderRadius(radius?: FormStyling['fieldBorderRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'small': return '0.25rem';\n case 'medium': return '0.375rem';\n case 'large': return '0.75rem';\n case 'full': return '9999px';\n default: return '0.375rem';\n }\n}\n\nfunction getWidthPercent(width?: string): string | undefined {\n switch (width) {\n case '1/4': return '25%';\n case '1/3': return '33.333%';\n case '1/2': return '50%';\n case '2/3': return '66.666%';\n case '3/4': return '75%';\n case 'full': return '100%';\n default: return undefined;\n }\n}\n\ntype FieldRow = { type: 'single'; field: FormField } | { type: 'row'; fields: FormField[] };\n\nfunction groupFieldsIntoRows(fields: FormField[]): FieldRow[] {\n const result: FieldRow[] = [];\n let i = 0;\n while (i < fields.length) {\n const field = fields[i];\n if (field.row != null) {\n const rowFields: FormField[] = [field];\n let j = i + 1;\n while (j < fields.length && fields[j].row === field.row) {\n rowFields.push(fields[j]);\n j++;\n }\n if (rowFields.length > 1) {\n result.push({ type: 'row', fields: rowFields });\n } else {\n result.push({ type: 'single', field });\n }\n i = j;\n } else {\n result.push({ type: 'single', field });\n i++;\n }\n }\n return result;\n}\n\nfunction getButtonRadius(radius?: FormStyling['buttonRadius']): string {\n switch (radius) {\n case 'none': return '0';\n case 'small': return '4px';\n case 'medium': return '8px';\n case 'large': return '12px';\n case 'full': return '9999px';\n default: return '8px';\n }\n}\n\nfunction getFontSize(size: FormStyling['fontSize']): string {\n switch (size) {\n case 'sm': case 'small': return '0.875rem';\n case 'md': case 'medium': return '1rem';\n case 'lg': case 'large': return '1.125rem';\n default: return '1rem';\n }\n}\n\nfunction getPlaceholderFontSize(size?: FormStyling['placeholderFontSize']): string {\n switch (size) {\n case 'small': return '0.75rem';\n case 'large': return '1rem';\n default: return '0.875rem';\n }\n}\n\nfunction getFieldSpacing(spacing?: FormStyling['fieldSpacing']): string {\n switch (spacing) {\n case 'compact': return '0.5rem';\n case 'relaxed': return '1.5rem';\n case 'spacious': return '2rem';\n default: return '1rem';\n }\n}\n\nfunction getFormPadding(padding?: FormStyling['formPadding']): string {\n switch (padding) {\n case 'none': return '0';\n case 'compact': return '1rem';\n case 'relaxed': return '2.5rem';\n case 'spacious': return '3.5rem';\n default: return '1.5rem';\n }\n}\n\nfunction getLabelSpacing(spacing?: FormStyling['labelSpacing']): string {\n switch (spacing) {\n case 'compact': return '0.125rem';\n case 'relaxed': return '0.75rem';\n default: return '0.25rem';\n }\n}\n\nfunction getFormMaxWidth(width?: FormStyling['formWidth']): string {\n switch (width) {\n case 'narrow': return '28rem';\n case 'wide': return '48rem';\n case 'full': return '100%';\n default: return '36rem';\n }\n}\n\nfunction getButtonAlign(align?: FormStyling['buttonAlign']): string {\n switch (align) {\n case 'left': return 'flex-start';\n case 'right': return 'flex-end';\n default: return 'center';\n }\n}\n\nfunction getHeadingSize(size?: FormStyling['headingSize']): string {\n switch (size) {\n case 'small': return '1.125rem';\n case 'large': return '1.875rem';\n case 'extra-large': return '2.25rem';\n default: return '1.5rem';\n }\n}\n\nfunction getParagraphSize(size?: FormStyling['paragraphSize']): string {\n switch (size) {\n case 'small': return '0.875rem';\n case 'large': return '1.125rem';\n default: return '1rem';\n }\n}\n\ninterface FormsExpertFormProps {\n /** SDK configuration (optional if using FormsProvider) */\n config?: FormsSDKConfig;\n /** Form slug */\n slug: string;\n /** Track form views for analytics (completion rate). Default: true */\n trackViews?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Success callback */\n onSuccess?: (response: SubmissionResponse) => void;\n /** Error callback */\n onError?: (error: Error) => void;\n /** Validation error callback */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Custom class name */\n className?: string;\n /** Custom styles */\n style?: CSSProperties;\n /** Language code to pass to backend */\n lang?: string;\n}\n\n/**\n * Forms Expert form component\n */\nexport function FormsExpertForm({\n config,\n slug,\n trackViews = true,\n submitText = 'Submit',\n onSuccess,\n onError,\n onValidationError,\n className,\n style,\n lang,\n}: FormsExpertFormProps) {\n const form = useForm({\n slug,\n config,\n trackViews,\n onSuccess,\n onError,\n onValidationError,\n autoInit: true,\n lang,\n });\n\n const [captchaToken, setCaptchaToken] = useState<string | null>(null);\n const captchaContainerRef = useRef<HTMLDivElement>(null);\n const captchaWidgetId = useRef<string | null>(null);\n const captchaScriptLoaded = useRef(false);\n const formScopeId = useMemo(() => 'fe-' + Math.random().toString(36).slice(2, 8), []);\n\n // Load captcha script and render widget\n useEffect(() => {\n if (!form.requiresCaptcha || !form.captchaSiteKey || !form.captchaProvider) return;\n if (captchaScriptLoaded.current) return;\n\n const provider = form.captchaProvider;\n const siteKey = form.captchaSiteKey;\n\n const renderWidget = () => {\n if (!captchaContainerRef.current) return;\n\n const w = window as any;\n if (provider === 'turnstile' && w.turnstile) {\n captchaWidgetId.current = w.turnstile.render(captchaContainerRef.current, {\n sitekey: siteKey,\n callback: (token: string) => setCaptchaToken(token),\n 'expired-callback': () => setCaptchaToken(null),\n 'error-callback': () => setCaptchaToken(null),\n });\n } else if (provider === 'hcaptcha' && w.hcaptcha) {\n captchaWidgetId.current = w.hcaptcha.render(captchaContainerRef.current, {\n sitekey: siteKey,\n callback: (token: string) => setCaptchaToken(token),\n 'expired-callback': () => setCaptchaToken(null),\n 'error-callback': () => setCaptchaToken(null),\n });\n } else if (provider === 'recaptcha' && w.grecaptcha) {\n // reCAPTCHA v3 — execute immediately, no visible widget\n w.grecaptcha.ready(() => {\n w.grecaptcha.execute(siteKey, { action: 'submit' }).then((token: string) => {\n setCaptchaToken(token);\n });\n });\n }\n };\n\n // Check if script already loaded\n const w = window as any;\n if (\n (provider === 'turnstile' && w.turnstile) ||\n (provider === 'hcaptcha' && w.hcaptcha) ||\n (provider === 'recaptcha' && w.grecaptcha)\n ) {\n captchaScriptLoaded.current = true;\n renderWidget();\n return;\n }\n\n // Load script\n const script = document.createElement('script');\n if (provider === 'turnstile') {\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit';\n } else if (provider === 'hcaptcha') {\n script.src = 'https://js.hcaptcha.com/1/api.js?render=explicit';\n } else if (provider === 'recaptcha') {\n script.src = `https://www.google.com/recaptcha/api.js?render=${siteKey}`;\n }\n script.async = true;\n script.defer = true;\n script.onload = () => {\n captchaScriptLoaded.current = true;\n // Small delay for script initialization\n setTimeout(renderWidget, 100);\n };\n document.head.appendChild(script);\n\n return () => {\n // Clean up widget on unmount\n if (captchaWidgetId.current !== null) {\n const w = window as any;\n if (provider === 'turnstile' && w.turnstile) {\n w.turnstile.remove(captchaWidgetId.current);\n } else if (provider === 'hcaptcha' && w.hcaptcha) {\n w.hcaptcha.reset(captchaWidgetId.current);\n }\n }\n };\n }, [form.requiresCaptcha, form.captchaProvider, form.captchaSiteKey]);\n\n const resetCaptcha = () => {\n setCaptchaToken(null);\n if (captchaWidgetId.current !== null) {\n const w = window as any;\n if (form.captchaProvider === 'turnstile' && w.turnstile) {\n w.turnstile.reset(captchaWidgetId.current);\n } else if (form.captchaProvider === 'hcaptcha' && w.hcaptcha) {\n w.hcaptcha.reset(captchaWidgetId.current);\n } else if (form.captchaProvider === 'recaptcha' && w.grecaptcha) {\n w.grecaptcha.execute(form.captchaSiteKey, { action: 'submit' }).then((token: string) => {\n setCaptchaToken(token);\n });\n }\n }\n };\n\n const styling = { ...defaultStyling, ...form.config?.schema?.styling, ...form.config?.styling };\n const radius = getBorderRadius(styling.borderRadius);\n const btnRadius = getButtonRadius(styling.buttonRadius);\n const fontSize = getFontSize(styling.fontSize);\n const phFontSize = getPlaceholderFontSize(styling.placeholderFontSize);\n const fieldSpacing = getFieldSpacing(styling.fieldSpacing);\n const formPadding = getFormPadding(styling.formPadding);\n const labelSpacing = getLabelSpacing(styling.labelSpacing);\n const formMaxWidth = getFormMaxWidth(styling.formWidth);\n const btnBgColor = styling.primaryColor;\n const btnTextColor = styling.buttonColor;\n // Normalize font family - support legacy single values by adding fallbacks\n // For SDK embedded forms, default to 'inherit' so the form uses the website's font\n const fontFamily = styling.fontFamily \n ? (styling.fontFamily.includes(',') ? styling.fontFamily : `${styling.fontFamily}, sans-serif`)\n : 'inherit';\n const btnAlign = getButtonAlign(styling.buttonAlign);\n const resolvedButtonText = styling.buttonText || submitText;\n\n // Google Fonts that need to be loaded\n const googleFonts = ['Inter', 'Roboto', 'Open Sans', 'Lato', 'Poppins', 'Montserrat', 'Nunito', 'Source Sans Pro', 'Raleway', 'Ubuntu', 'Playfair Display', 'Merriweather'];\n const fontToLoad = styling.fontFamily?.split(',')[0]?.trim();\n \n // Check if page already has custom fonts loaded (don't override existing fonts)\n const hasExistingFonts = useMemo(() => {\n if (typeof document === 'undefined') return false;\n const links = document.querySelectorAll('link[rel=\"stylesheet\"]');\n for (const link of links) {\n const href = (link as HTMLLinkElement).href || '';\n if (href.includes('fonts.googleapis.com') || href.includes('fonts.gstatic.com') || href.includes('typekit') || href.includes('fonts.')) {\n return true;\n }\n }\n // Also check for @font-face in existing stylesheets\n try {\n for (const sheet of document.styleSheets) {\n try {\n const rules = sheet.cssRules || sheet.rules;\n if (rules) {\n for (const rule of rules) {\n if (rule instanceof CSSFontFaceRule) {\n return true;\n }\n }\n }\n } catch {\n // Cross-origin stylesheets will throw, ignore\n }\n }\n } catch {\n // Ignore errors\n }\n return false;\n }, []);\n\n const googleFontUrl = fontToLoad && googleFonts.includes(fontToLoad) && !hasExistingFonts\n ? `https://fonts.googleapis.com/css2?family=${fontToLoad.replace(/ /g, '+')}:wght@400;500;600;700&display=swap`\n : null;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n const result = await form.submit(captchaToken || undefined);\n if (!result) {\n // Reset captcha on failure\n resetCaptcha();\n }\n };\n\n const handleChange = (\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>\n ) => {\n const { name, value, type } = e.target;\n if (type === 'checkbox') {\n form.setValue(name, (e.target as HTMLInputElement).checked);\n } else if (type === 'file') {\n form.setValue(name, (e.target as HTMLInputElement).files?.[0]);\n } else {\n form.setValue(name, value);\n }\n };\n\n if (form.isInitializing) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n ...style,\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style={{ animation: 'spin 1s linear infinite', color: '#9ca3af' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeDasharray=\"31.4 31.4\" strokeLinecap=\"round\"/>\n </svg>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n }\n\n // Show loading spinner if config hasn't loaded yet\n if (!form.config) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n ...style,\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style={{ animation: 'spin 1s linear infinite', color: '#9ca3af' }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeDasharray=\"31.4 31.4\" strokeLinecap=\"round\"/>\n </svg>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n );\n }\n\n if (!form.config.active) {\n return (\n <div\n className={className}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#ef4444',\n ...style,\n }}\n >\n This form is not available\n </div>\n );\n }\n\n if (form.isSubmitted) {\n return (\n <div\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100%',\n padding: formPadding,\n textAlign: 'center',\n backgroundColor: styling.transparentBackground ? 'transparent' : styling.backgroundColor,\n color: styling.textColor,\n borderRadius: radius,\n maxWidth: formMaxWidth,\n margin: '0 auto',\n fontFamily,\n ...style,\n }}\n >\n <div>\n <svg\n style={{\n width: '3rem',\n height: '3rem',\n margin: '0 auto 1rem',\n color: styling.successColor || '#22c55e',\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n <p style={{ fontSize: '1.125rem', fontWeight: 500 }}>\n {form.config.settings?.successMessage || 'Form submitted successfully!'}\n </p>\n <button\n type=\"button\"\n onClick={form.reset}\n style={{\n marginTop: '1rem',\n background: 'none',\n border: 'none',\n color: styling.primaryColor,\n textDecoration: 'underline',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n Submit again\n </button>\n </div>\n </div>\n );\n }\n\n const fields = form.config.schema?.fields || [];\n const showBranding = form.config.branding?.enabled !== false;\n const brandingText = form.config.branding?.text || 'Powered by forms.expert';\n const brandingUrl = form.config.branding?.url || 'https://forms.expert';\n\n const wrapperStyle: CSSProperties = {\n ...(styling.backgroundImageUrl ? {\n backgroundImage: `url(${styling.backgroundImageUrl})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n } : {}),\n position: 'relative' as const,\n };\n\n const formEl = (\n <form\n onSubmit={handleSubmit}\n className={className}\n data-fe-scope={formScopeId}\n style={{\n fontFamily,\n fontSize,\n backgroundColor: styling.transparentBackground ? 'transparent' : styling.backgroundColor,\n color: styling.textColor,\n padding: formPadding,\n borderRadius: radius,\n maxWidth: formMaxWidth,\n width: '100%',\n margin: '0 auto',\n position: 'relative',\n ...style,\n }}\n >\n {/* Load Google Font if needed */}\n {googleFontUrl && (\n <link rel=\"stylesheet\" href={googleFontUrl} />\n )}\n {/* Scoped placeholder styles */}\n <style dangerouslySetInnerHTML={{ __html: `\n form[data-fe-scope=\"${formScopeId}\"] input::placeholder, form[data-fe-scope=\"${formScopeId}\"] textarea::placeholder { font-size: ${phFontSize};${styling.placeholderColor ? ` color: ${styling.placeholderColor};` : ''} }\n form[data-fe-scope=\"${formScopeId}\"] button[type=\"submit\"]:hover:not(:disabled) { filter: brightness(0.9); }\n form[data-fe-scope=\"${formScopeId}\"] button[type=\"submit\"]:active:not(:disabled) { filter: brightness(0.85); transform: scale(0.98); }\n form[data-fe-scope=\"${formScopeId}\"] a[href]:hover { filter: brightness(0.9); }\n form[data-fe-scope=\"${formScopeId}\"] a[href]:active { filter: brightness(0.85); }\n form[data-fe-scope=\"${formScopeId}\"] input:not([type=\"checkbox\"]):not([type=\"radio\"]):focus,\n form[data-fe-scope=\"${formScopeId}\"] textarea:focus,\n form[data-fe-scope=\"${formScopeId}\"] select:focus {\n outline: none !important;\n border-color: ${styling.primaryColor || '#3b82f6'} !important;\n box-shadow: 0 0 0 2px ${styling.primaryColor || '#3b82f6'}33 !important;\n -webkit-appearance: none;\n }\n ` }} />\n {/* Logo */}\n {styling.logoUrl && (\n <div style={{\n textAlign: styling.logoPosition === 'top-left' ? 'left' : styling.logoPosition === 'top-right' ? 'right' : 'center',\n marginBottom: '1rem',\n }}>\n <img src={styling.logoUrl} alt=\"\" style={{ maxHeight: '48px' }} />\n </div>\n )}\n\n {/* Cover image */}\n {styling.coverImageUrl && (\n <img\n src={styling.coverImageUrl}\n alt=\"\"\n style={{\n width: '100%',\n maxHeight: '200px',\n objectFit: 'cover',\n borderRadius: `${radius} ${radius} 0 0`,\n marginBottom: '1rem',\n }}\n />\n )}\n\n {/* Form name */}\n {(form.config.settings?.showFormName !== false) && form.config.name && (\n <div style={{\n fontSize: styling.formNameFontSize != null ? `${styling.formNameFontSize}px` : '1.5rem',\n fontWeight: styling.formNameFontWeight === 'normal' ? 400 : styling.formNameFontWeight === 'medium' ? 500 : styling.formNameFontWeight === 'semibold' ? 600 : 700,\n marginBottom: '0.5rem',\n color: styling.textColor,\n }}>\n {form.config.hostedConfig?.pageTitle || form.config.name}\n </div>\n )}\n\n {groupFieldsIntoRows(fields).map((group, idx) => {\n if (group.type === 'single') {\n return (\n <FormFieldInput\n key={group.field.name}\n field={group.field}\n value={form.values[group.field.name]}\n error={form.errors[group.field.name]}\n onChange={handleChange}\n onValueChange={(name, val) => form.setValue(name, val)}\n styling={styling}\n fieldSpacing={fieldSpacing}\n labelSpacing={labelSpacing}\n phFontSize={phFontSize}\n />\n );\n }\n return (\n <div key={`row-${idx}`} style={{ display: 'flex', gap: '0.75rem', flexWrap: 'wrap', marginBottom: fieldSpacing }}>\n {group.fields.map((f) => (\n <div key={f.name} style={{ flex: getWidthPercent(f.width) ? `0 0 calc(${getWidthPercent(f.width)} - 0.75rem)` : '1 1 0', minWidth: '180px' }}>\n <FormFieldInput\n field={f}\n value={form.values[f.name]}\n error={form.errors[f.name]}\n onChange={handleChange}\n onValueChange={(name, val) => form.setValue(name, val)}\n styling={styling}\n fieldSpacing={'0'}\n labelSpacing={labelSpacing}\n phFontSize={phFontSize}\n />\n </div>\n ))}\n </div>\n );\n })}\n\n {/* Honeypot field — hidden from users, catches bots */}\n {form.honeypotEnabled && (\n <div style={{ position: 'absolute', left: '-9999px', opacity: 0, height: 0, overflow: 'hidden' }} aria-hidden=\"true\">\n <input type=\"text\" name=\"_hp\" tabIndex={-1} autoComplete=\"off\" />\n </div>\n )}\n\n {/* Captcha widget */}\n {form.requiresCaptcha && form.captchaProvider !== 'recaptcha' && (\n <div ref={captchaContainerRef} style={{ marginTop: '1rem' }} />\n )}\n\n {(() => {\n const btnSizeMap: Record<string, { px: string; py: string; fs: string }> = {\n small: { px: '0.75rem', py: '0.375rem', fs: '0.875rem' },\n medium: { px: '1.25rem', py: '0.625rem', fs: '1rem' },\n large: { px: '1.75rem', py: '0.875rem', fs: '1.125rem' },\n };\n const btnSize = btnSizeMap[styling.buttonSize || 'medium'];\n const btnPx = styling.buttonPaddingX != null ? `${styling.buttonPaddingX}px` : btnSize.px;\n const btnPy = styling.buttonPaddingY != null ? `${styling.buttonPaddingY}px` : btnSize.py;\n const btnFs = styling.buttonFontSize != null ? `${styling.buttonFontSize}px` : btnSize.fs;\n const btnBg = styling.buttonGradient || (styling.buttonStyle === 'filled' ? btnBgColor : 'transparent');\n\n const sec = styling.secondaryButton as SecondaryButton | undefined;\n const secColor = sec?.color || btnBgColor;\n const secStyle: CSSProperties | undefined = sec?.enabled ? {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: `${btnPy} ${btnPx}`,\n fontWeight: 500,\n fontSize: sec.fontSize != null ? `${sec.fontSize}px` : btnFs,\n fontFamily: 'inherit',\n borderRadius: btnRadius,\n cursor: 'pointer',\n textDecoration: sec.style === 'link' ? 'underline' : 'none',\n background: sec.style === 'filled' ? secColor : 'transparent',\n color: sec.textColor || (sec.style === 'filled' ? '#ffffff' : secColor),\n border: sec.style === 'outlined' ? `2px solid ${secColor}` : 'none',\n marginTop: sec.marginTop != null ? `${sec.marginTop}px` : undefined,\n marginBottom: sec.marginBottom != null ? `${sec.marginBottom}px` : undefined,\n maxWidth: '100%',\n boxSizing: 'border-box' as const,\n flexShrink: 1,\n minWidth: 0,\n whiteSpace: 'nowrap' as const,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n } : undefined;\n\n return (\n <>\n <div style={{ display: 'flex', justifyContent: btnAlign, marginTop: '1rem', gap: '0.5rem', flexWrap: 'wrap' }}>\n {sec?.enabled && secStyle && sec.position === 'left' && (\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem' }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n )}\n <button\n type=\"submit\"\n disabled={form.isLoading}\n className={styling.buttonClassName}\n style={{\n ...(styling.buttonFullWidth ? { width: '100%' } : (styling.buttonAlign ? {} : { width: '100%' })),\n padding: `${btnPy} ${btnPx}`,\n fontWeight: 500,\n fontSize: btnFs,\n fontFamily: 'inherit',\n borderRadius: btnRadius,\n cursor: form.isLoading ? 'not-allowed' : 'pointer',\n opacity: form.isLoading ? 0.5 : 1,\n background: btnBg,\n color:\n styling.buttonStyle === 'filled'\n ? (btnTextColor || 'white')\n : btnBgColor,\n border:\n styling.buttonStyle === 'filled'\n ? 'none'\n : `2px solid ${btnBgColor}`,\n maxWidth: '100%',\n boxSizing: 'border-box',\n flexShrink: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n }}\n >\n {!form.isLoading && styling.buttonIcon && styling.buttonIconPosition !== 'right' && (\n <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: styling.buttonIcon }} />\n )}\n <span>{form.isLoading ? 'Submitting...' : resolvedButtonText}</span>\n {!form.isLoading && styling.buttonIcon && styling.buttonIconPosition === 'right' && (\n <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: styling.buttonIcon }} />\n )}\n </button>\n {sec?.enabled && secStyle && sec.position !== 'left' && sec.position !== 'below' && (\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem', marginLeft: 'auto' }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n )}\n </div>\n {sec?.enabled && secStyle && sec.position === 'below' && (\n <div style={{\n display: 'flex',\n justifyContent: sec.align === 'center' ? 'center' : sec.align === 'right' ? 'flex-end' : sec.align === 'left' ? 'flex-start' : btnAlign,\n marginTop: sec.marginTop != null ? `${sec.marginTop}px` : '0.5rem',\n marginBottom: sec.marginBottom != null ? `${sec.marginBottom}px` : undefined,\n }}>\n <a href={sec.href || '#'} target={sec.openInNewTab ? '_blank' : undefined} rel={sec.openInNewTab ? 'noopener noreferrer' : undefined} style={{ ...secStyle, display: 'inline-flex', alignItems: 'center', gap: '0.5rem', marginTop: 0, marginBottom: 0 }}>\n {sec.icon && sec.iconPosition !== 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n <span>{sec.text || 'Learn More'}</span>\n {sec.icon && sec.iconPosition === 'right' && <span style={{ display: 'inline-flex', flexShrink: 0 }} dangerouslySetInnerHTML={{ __html: sec.icon }} />}\n </a>\n </div>\n )}\n </>\n );\n })()}\n\n {showBranding && (\n <div\n style={{\n textAlign: 'center',\n marginTop: '1rem',\n paddingTop: '0.75rem',\n borderTop: `1px solid ${styling.separatorColor || (styling.theme === 'dark' ? '#374151' : '#e5e7eb')}`,\n }}\n >\n <a\n href={brandingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280',\n textDecoration: 'none',\n fontSize: '0.75rem',\n }}\n >\n {brandingText}\n </a>\n </div>\n )}\n </form>\n );\n\n if (styling.backgroundImageUrl) {\n return (\n <div style={wrapperStyle}>\n {styling.backgroundOverlay ? (\n <div style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: `rgba(0,0,0,${styling.backgroundOverlay})`,\n pointerEvents: 'none',\n }} />\n ) : null}\n {formEl}\n </div>\n );\n }\n\n return formEl;\n}\n\ninterface FormFieldInputProps {\n field: FormField;\n value: unknown;\n error?: string;\n onChange: (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => void;\n onValueChange: (name: string, value: unknown) => void;\n styling: FormStyling;\n fieldSpacing: string;\n labelSpacing: string;\n phFontSize: string;\n}\n\nfunction FormFieldInput({\n field,\n value,\n error,\n onChange,\n onValueChange,\n styling,\n fieldSpacing,\n labelSpacing,\n phFontSize,\n}: FormFieldInputProps) {\n const radius = getBorderRadius(styling.borderRadius);\n const fieldRadius = getFieldBorderRadius(styling.fieldBorderRadius);\n const fontSize = getFontSize(styling.fontSize);\n const isInline = styling.labelPosition === 'left' || styling.fieldLayout === 'inline';\n\n const isBottomBorder = styling.fieldBorderStyle === 'bottom';\n const fieldPadding = styling.fieldPaddingX != null || styling.fieldPaddingY != null\n ? `${styling.fieldPaddingY ?? 8}px ${styling.fieldPaddingX ?? 12}px`\n : '0.5rem 0.75rem';\n\n const defaultBorderColor = error ? '#ef4444' : styling.fieldBorderColor || (styling.theme === 'dark' ? '#4b5563' : '#d1d5db');\n\n const inputStyle: CSSProperties = {\n width: '100%',\n padding: fieldPadding,\n border: isBottomBorder ? 'none' : `1px solid ${defaultBorderColor}`,\n ...(isBottomBorder ? { borderBottom: `1px solid ${defaultBorderColor}` } : {}),\n borderRadius: isBottomBorder ? 0 : fieldRadius,\n fontSize,\n fontFamily: 'inherit',\n backgroundColor: styling.inputBackgroundColor || (styling.theme === 'dark' ? '#374151' : '#ffffff'),\n color: styling.textColor,\n };\n\n const getOpts = (): { value: string; label: string; imageUrl?: string }[] => {\n if (!field.options) return [];\n return field.options.map((o) => typeof o === 'string' ? { value: o, label: o } : o);\n };\n\n // Layout fields (no data)\n if (field.type === 'heading') {\n return (\n <div style={{ marginBottom: fieldSpacing }}>\n <h2 style={{ fontSize: getHeadingSize(styling.headingSize), fontWeight: 600 }}>{field.label}</h2>\n {field.content && (\n <p style={{ fontSize: '0.875rem', color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280', marginTop: '0.25rem' }}>{field.content}</p>\n )}\n </div>\n );\n }\n if (field.type === 'divider') {\n return <hr style={{ marginBottom: fieldSpacing, border: 'none', borderTop: `1px solid ${styling.separatorColor || (styling.theme === 'dark' ? '#4b5563' : '#d1d5db')}` }} />;\n }\n if (field.type === 'paragraph') {\n const pSize = field.paragraphFontSize ? `${field.paragraphFontSize}px` : getParagraphSize(styling.paragraphSize);\n return (\n <div style={{ marginBottom: fieldSpacing }}>\n {field.label && (\n <p style={{ fontWeight: 500, fontSize: pSize, marginBottom: '0.25rem' }}>{field.label}</p>\n )}\n {field.content && (\n <div\n style={{ fontSize: pSize, color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280' }}\n dangerouslySetInnerHTML={{ __html: field.content }}\n />\n )}\n </div>\n );\n }\n if (field.type === 'hidden') {\n return <input type=\"hidden\" name={field.name} value={String(value || field.defaultValue || '')} />;\n }\n\n // Checkbox / toggle / consent — inline layout\n if (field.type === 'checkbox' || field.type === 'toggle' || field.type === 'consent') {\n const consentSize = field.type === 'consent' && field.consentFontSize ? `${field.consentFontSize}px` : undefined;\n return (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: '0.5rem', marginBottom: fieldSpacing }}>\n <input\n type=\"checkbox\"\n id={field.name}\n name={field.name}\n checked={Boolean(value)}\n onChange={onChange}\n required={field.required}\n style={{ width: '1rem', height: '1rem', accentColor: styling.primaryColor, marginTop: '0.125rem', flexShrink: 0, backgroundColor: 'transparent' }}\n />\n <div>\n {(field.label || (field.type === 'consent' && field.consentText)) && (\n <label htmlFor={field.name} className={styling.labelClassName} style={{ cursor: 'pointer', ...(consentSize ? { fontSize: consentSize } : {}) }}>\n {field.type === 'consent' && field.consentText\n ? field.consentText\n : field.label}\n {field.required && !styling.hideRequiredAsterisk && <span style={{ color: '#ef4444', marginLeft: '0.25rem' }}>*</span>}\n </label>\n )}\n {field.type === 'consent' && field.consentUrl && (\n <a href={field.consentUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: styling.primaryColor, fontSize: '0.75rem', marginTop: '0.125rem', display: 'inline-block' }}>View policy</a>\n )}\n {error && <div style={{ color: styling.errorColor || '#ef4444', fontSize: '0.875rem', marginTop: '0.25rem' }}>{error}</div>}\n </div>\n </div>\n );\n }\n\n const labelEl = field.label ? (\n <label\n htmlFor={field.name}\n className={styling.labelClassName}\n style={{\n display: 'block',\n fontWeight: 500,\n ...(isInline\n ? { width: '33%', flexShrink: 0, paddingTop: '0.5rem', marginBottom: 0 }\n : { marginBottom: labelSpacing }),\n }}\n >\n {field.label}\n {field.required && !styling.hideRequiredAsterisk && <span style={{ color: '#ef4444', marginLeft: '0.25rem' }}>*</span>}\n </label>\n ) : null;\n\n const errorEl = error ? (\n <div style={{ color: styling.errorColor || '#ef4444', fontSize: '0.875rem', marginTop: '0.25rem' }}>{error}</div>\n ) : null;\n\n let fieldEl: JSX.Element;\n\n if (field.type === 'textarea' || field.type === 'richText') {\n fieldEl = (\n <textarea\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n placeholder={field.placeholder}\n required={field.required}\n style={{ ...inputStyle, minHeight: '100px', resize: 'vertical' }}\n className={styling.fieldClassName}\n />\n );\n } else if (field.type === 'select' || field.type === 'dropdown') {\n fieldEl = (\n <select id={field.name} name={field.name} value={String(value || '')} onChange={onChange} required={field.required} style={inputStyle} className={styling.fieldClassName}>\n <option value=\"\">Select an option...</option>\n {getOpts().map((opt) => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n );\n } else if (field.type === 'radio') {\n fieldEl = (\n <div style={{\n ...inputStyle,\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n width: '100%',\n }}>\n {getOpts().map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={field.name}\n value={opt.value}\n checked={(value as string) === opt.value}\n onChange={() => onValueChange(field.name, opt.value)}\n style={{ accentColor: styling.primaryColor, backgroundColor: 'transparent' }}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n } else if (field.type === 'multiselect') {\n const selected = Array.isArray(value) ? (value as string[]) : [];\n fieldEl = (\n <div style={{\n ...inputStyle,\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n width: '100%',\n }}>\n {getOpts().map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={selected.includes(opt.value)}\n onChange={() => {\n const next = selected.includes(opt.value)\n ? selected.filter((v) => v !== opt.value)\n : [...selected, opt.value];\n onValueChange(field.name, next);\n }}\n style={{ accentColor: styling.primaryColor, backgroundColor: 'transparent' }}\n />\n {opt.label}\n </label>\n ))}\n </div>\n );\n } else if (field.type === 'rating') {\n const max = field.ratingMax || 5;\n const current = Number(value) || 0;\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.25rem' }}>\n {Array.from({ length: max }, (_, i) => i + 1).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onValueChange(field.name, n)}\n style={{\n width: '2rem', height: '2rem', cursor: 'pointer', border: 'none',\n background: 'none', padding: 0, fontSize: '1.5rem',\n color: n <= current ? '#f59e0b' : (styling.theme === 'dark' ? '#4b5563' : '#d1d5db'),\n transition: 'color 0.15s',\n }}\n >★</button>\n ))}\n </div>\n );\n } else if (field.type === 'scale' || field.type === 'opinionScale') {\n const min = field.min ?? 1;\n const max = field.max ?? 10;\n const current = value as number | undefined;\n fieldEl = (\n <div>\n <div style={{ display: 'flex', gap: '0.25rem', flexWrap: 'wrap' }}>\n {Array.from({ length: max - min + 1 }, (_, i) => min + i).map((n) => (\n <button\n key={n}\n type=\"button\"\n onClick={() => onValueChange(field.name, n)}\n style={{\n minWidth: '2.25rem', height: '2.25rem', borderRadius: radius, cursor: 'pointer',\n border: `1px solid ${styling.theme === 'dark' ? '#4b5563' : '#d1d5db'}`,\n background: current === n ? styling.primaryColor : (styling.theme === 'dark' ? '#374151' : '#ffffff'),\n color: current === n ? 'white' : styling.textColor,\n fontSize: '0.875rem', transition: 'all 0.15s',\n }}\n >{n}</button>\n ))}\n </div>\n {(field.lowLabel || field.highLabel) && (\n <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: '0.75rem', color: styling.theme === 'dark' ? '#9ca3af' : '#6b7280', marginTop: '0.25rem' }}>\n <span>{field.lowLabel}</span>\n <span>{field.highLabel}</span>\n </div>\n )}\n </div>\n );\n } else if (field.type === 'slider') {\n const min = field.min ?? 0;\n const max = field.max ?? 100;\n const step = field.step ?? 1;\n fieldEl = (\n <div>\n <input\n type=\"range\"\n id={field.name}\n name={field.name}\n min={min}\n max={max}\n step={step}\n value={Number(value) || min}\n onChange={(e) => onValueChange(field.name, Number(e.target.value))}\n style={{ width: '100%', accentColor: styling.primaryColor }}\n />\n <div style={{ textAlign: 'center', fontSize: '0.875rem', marginTop: '0.25rem' }}>{String(value ?? min)}</div>\n </div>\n );\n } else if (field.type === 'imageChoice') {\n const selected = value as string | undefined;\n fieldEl = (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '0.5rem' }}>\n {getOpts().map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onValueChange(field.name, opt.value)}\n style={{\n border: `2px solid ${selected === opt.value ? styling.primaryColor : (styling.theme === 'dark' ? '#4b5563' : '#d1d5db')}`,\n borderRadius: radius, padding: '0.5rem', cursor: 'pointer', textAlign: 'center',\n background: 'none', transition: 'border-color 0.15s',\n }}\n >\n {opt.imageUrl && <img src={opt.imageUrl} alt={opt.label} style={{ maxWidth: '80px', maxHeight: '80px', objectFit: 'cover', borderRadius: radius }} />}\n <div style={{ fontSize: '0.875rem', marginTop: '0.25rem' }}>{opt.label}</div>\n </button>\n ))}\n </div>\n );\n } else if (field.type === 'file') {\n const fileValue = value as File | undefined;\n const formatSize = (size: number) => size < 1024 ? `${size} B` : size < 1048576 ? `${(size / 1024).toFixed(1)} KB` : `${(size / 1048576).toFixed(1)} MB`;\n const borderColor = error ? (styling.errorColor || '#ef4444') : styling.fieldBorderColor || (styling.theme === 'dark' ? '#4b5563' : '#d1d5db');\n const mutedColor = styling.theme === 'dark' ? '#9ca3af' : '#6b7280';\n fieldEl = (\n <label\n htmlFor={field.name}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.5rem',\n borderRadius: fieldRadius,\n border: `2px dashed ${borderColor}`,\n padding: '1.5rem',\n cursor: 'pointer',\n transition: 'border-color 0.15s, background-color 0.15s',\n backgroundColor: fileValue ? (styling.theme === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.02)') : 'transparent',\n }}\n onDragOver={(e) => { e.preventDefault(); e.currentTarget.style.borderColor = styling.primaryColor || '#3b82f6'; e.currentTarget.style.backgroundColor = styling.theme === 'dark' ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.04)'; }}\n onDragLeave={(e) => { e.currentTarget.style.borderColor = borderColor; e.currentTarget.style.backgroundColor = fileValue ? (styling.theme === 'dark' ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.02)') : 'transparent'; }}\n onDrop={(e) => {\n e.preventDefault();\n e.currentTarget.style.borderColor = borderColor;\n e.currentTarget.style.backgroundColor = 'transparent';\n const file = e.dataTransfer.files?.[0];\n if (file) onValueChange(field.name, file);\n }}\n >\n <input\n id={field.name}\n name={field.name}\n type=\"file\"\n style={{ position: 'absolute', width: '1px', height: '1px', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: 0 }}\n onChange={onChange}\n required={field.required}\n accept={field.allowedMimeTypes?.join(',')}\n multiple={field.multiple}\n />\n {fileValue ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={styling.primaryColor || '#3b82f6'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>\n <span style={{ fontSize: '0.875rem', fontWeight: 500, maxWidth: '100%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{fileValue.name}</span>\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>{formatSize(fileValue.size)}</span>\n <button\n type=\"button\"\n style={{ fontSize: '0.75rem', color: styling.errorColor || '#ef4444', background: 'none', border: 'none', cursor: 'pointer', marginTop: '0.25rem', textDecoration: 'underline' }}\n onClick={(e) => { e.preventDefault(); onValueChange(field.name, undefined); }}\n >\n Remove\n </button>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={mutedColor} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\"/></svg>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>Drag & drop a file here, or click to browse</span>\n {field.allowedMimeTypes && field.allowedMimeTypes.length > 0 && (\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>{field.allowedMimeTypes.join(', ')}</span>\n )}\n {field.maxFileSize && (\n <span style={{ fontSize: '0.75rem', color: mutedColor }}>Max size: {formatSize(field.maxFileSize)}</span>\n )}\n </>\n )}\n </label>\n );\n } else if (field.type === 'name') {\n const nameVal = (value || {}) as Record<string, string>;\n const nameFields = field.nameFields || ['first', 'last'];\n const labels: Record<string, string> = { prefix: 'Prefix', first: 'First Name', middle: 'Middle', last: 'Last Name', suffix: 'Suffix' };\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', flexWrap: 'wrap' }}>\n {nameFields.map((nf) => (\n <input\n key={nf}\n placeholder={labels[nf] || nf}\n value={nameVal[nf] || ''}\n onChange={(e) => onValueChange(field.name, { ...nameVal, [nf]: e.target.value })}\n style={{ ...inputStyle, flex: 1, minWidth: '120px' }}\n className={styling.fieldClassName}\n />\n ))}\n </div>\n );\n } else if (field.type === 'address') {\n const addr = (value || {}) as Record<string, string>;\n const addrFields = field.addressFields || ['street', 'city', 'state', 'zip', 'country'];\n const labels: Record<string, string> = { street: 'Street', street2: 'Street 2', city: 'City', state: 'State', zip: 'ZIP', country: 'Country' };\n fieldEl = (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {addrFields.map((af) => (\n <input\n key={af}\n placeholder={labels[af] || af}\n value={addr[af] || ''}\n onChange={(e) => onValueChange(field.name, { ...addr, [af]: e.target.value })}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n ))}\n </div>\n );\n } else if (field.type === 'currency') {\n fieldEl = (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.25rem' }}>\n {field.currencySymbol && <span>{field.currencySymbol}</span>}\n <input\n type=\"number\"\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n step={0.01}\n min={field.min}\n max={field.max}\n required={field.required}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n </div>\n );\n } else if (field.type === 'colorPicker') {\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>\n <input\n type=\"color\"\n id={field.name}\n value={String(value || '#000000')}\n onChange={(e) => onValueChange(field.name, e.target.value)}\n style={{ width: '3rem', height: '2.25rem', border: 'none', cursor: 'pointer', padding: 0 }}\n />\n <input\n type=\"text\"\n value={String(value || '')}\n onChange={(e) => onValueChange(field.name, e.target.value)}\n placeholder=\"#000000\"\n style={{ ...inputStyle, flex: 1 }}\n className={styling.fieldClassName}\n />\n </div>\n );\n } else if (field.type === 'dateRange') {\n const range = (value || {}) as { start?: string; end?: string };\n fieldEl = (\n <div style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>\n <input type=\"date\" value={range.start || ''} onChange={(e) => onValueChange(field.name, { ...range, start: e.target.value })} style={{ ...inputStyle, flex: 1 }} className={styling.fieldClassName} />\n <span>to</span>\n <input type=\"date\" value={range.end || ''} onChange={(e) => onValueChange(field.name, { ...range, end: e.target.value })} style={{ ...inputStyle, flex: 1 }} className={styling.fieldClassName} />\n </div>\n );\n } else {\n // Default: text, email, number, date, phone, url, password, time, datetime, etc.\n const typeMap: Record<string, string> = {\n phone: 'tel', url: 'url', datetime: 'datetime-local', time: 'time', date: 'date',\n number: 'number', email: 'email', password: 'password',\n };\n fieldEl = (\n <input\n type={typeMap[field.type] || 'text'}\n id={field.name}\n name={field.name}\n value={String(value || '')}\n onChange={onChange}\n placeholder={field.placeholder}\n required={field.required}\n min={field.min}\n max={field.max}\n step={field.step}\n maxLength={field.maxLength}\n style={inputStyle}\n className={styling.fieldClassName}\n />\n );\n }\n\n return (\n <div\n style={{\n marginBottom: fieldSpacing,\n ...(isInline ? { display: 'flex', alignItems: 'flex-start', gap: '1rem' } : {}),\n }}\n >\n {labelEl}\n <div style={isInline ? { flex: 1 } : {}}>\n {fieldEl}\n {errorEl}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["errors","useState","useEffect","useMemo","jsx","useState","useMemo","useEffect","w"]}
|