import React, { useState, useEffect } from 'react' import { getFieldType } from '../extensions/registry' import { useFormStore } from '../store/useFormStore' import FontFamilyToggle, { loadGoogleFont } from './FontFamilyToggle' import InfoTip from './property/InfoTip' import { ColorRow, NumberRow, SelectRow, SubHeading, Segmented, inputBase } from './property/Controls' import { RotateCcw } from 'lucide-react' // Theme panel (the reference builder F:8344-10479): accordion General / Colors / Fonts / Input, one section open at a time, // General open first. WP keeps its own settings keys (normalizeSchema maps them to the renderer's keys). const DEFAULT_SETTINGS = { submitButtonBgColor: '#4f46e5', submitButtonTextColor: '#ffffff', formBgColor: '#ffffff', labelColor: '#374151', inputBgColor: '#F9FAFB', inputBorderColor: '#d1d5db', inputTextColor: '#000000', placeholderColor: '#9CA3AF', hoverBorderColor: '#6B7280', focusBorderColor: '#3B82F6', descriptionColor: '#9CA3AF', checkboxSelectedColor: '#2563EB', checkboxUnselectedColor: '#D1D5DB', radioSelectedColor: '#2563EB', selectedValueColor: '#000000', requiredAsteriskColor: '#EF4444', fontSize: 14, lineHeight: 20, letterSpacing: 0, descriptionFontSize: 13, labelFontSize: 14, labelFontWeight: 500, labelLineHeight: 20, headingH1Size: 32, headingH2Size: 28, headingH3Size: 24, headingH4Size: 20, headingLineHeight: 24, headingLetterSpacing: 0, formWidth: 600, formPadding: 24, inputBorderWidth: 1, inputBorderRadius: 8, formBorderRadius: 8, labelPlacement: 'top', descriptionPlacement: 'below', } // the reference builder colorSchemes (F:1179) mapped to the WP theme keys. primaryColor → submit button + focus. const FP_SCHEMES = [ ['Classic Blue', { primaryColor: '#3B82F6', backgroundColor: '#FFFFFF', inputBackgroundColor: '#F9FAFB', primaryTextColor: '#000000', placeholderTextColor: '#9CA3AF', inputBorderColor: '#D1D5DB', hoverBorderColor: '#6B7280', focusBorderColor: '#3B82F6', descriptionColor: '#9CA3AF', submitTextColor: '#ffffff', checkboxSelectedColor: '#2563EB', checkboxUnselectedColor: '#D1D5DB' }], ['Green Serenity', { primaryColor: '#22C55E', backgroundColor: '#ECFDF5', inputBackgroundColor: '#D1FAE5', primaryTextColor: '#065F46', placeholderTextColor: '#6EE7B7', inputBorderColor: '#6EE7B7', hoverBorderColor: '#22C55E', focusBorderColor: '#22C55E', descriptionColor: '#10B981', submitTextColor: '#ffffff', checkboxSelectedColor: '#22C55E', checkboxUnselectedColor: '#6EE7B7' }], ['Elegant Gray', { primaryColor: '#9CA3AF', backgroundColor: '#F9FAFB', inputBackgroundColor: '#E5E7EB', primaryTextColor: '#374151', placeholderTextColor: '#6B7280', inputBorderColor: '#D1D5DB', hoverBorderColor: '#9CA3AF', focusBorderColor: '#6B7280', descriptionColor: '#6B7280', submitTextColor: '#ffffff', checkboxSelectedColor: '#6B7280', checkboxUnselectedColor: '#D1D5DB' }], ['Sunset Glow', { primaryColor: '#F59E0B', backgroundColor: '#FEFCE8', inputBackgroundColor: '#FDF4C5', primaryTextColor: '#92400E', placeholderTextColor: '#D97706', inputBorderColor: '#D1D5DB', hoverBorderColor: '#F59E0B', focusBorderColor: '#F59E0B', descriptionColor: '#D97706', submitTextColor: '#ffffff', checkboxSelectedColor: '#F59E0B', checkboxUnselectedColor: '#FDF4C5' }], ['Warm Sunset', { primaryColor: '#EF4444', backgroundColor: '#FFF5F5', inputBackgroundColor: '#FFE4E4', primaryTextColor: '#991B1B', placeholderTextColor: '#DC2626', inputBorderColor: '#FECACA', hoverBorderColor: '#F87171', focusBorderColor: '#EF4444', descriptionColor: '#DC2626', submitTextColor: '#ffffff', checkboxSelectedColor: '#EF4444', checkboxUnselectedColor: '#FECACA' }], ['Cool Aqua', { primaryColor: '#06B6D4', backgroundColor: '#ECFEFF', inputBackgroundColor: '#CFFAFE', primaryTextColor: '#164E63', placeholderTextColor: '#0E7490', inputBorderColor: '#A7F3D0', hoverBorderColor: '#06B6D4', focusBorderColor: '#06B6D4', descriptionColor: '#0E7490', submitTextColor: '#ffffff', checkboxSelectedColor: '#06B6D4', checkboxUnselectedColor: '#CFFAFE' }], ['Soft Lavender', { primaryColor: '#8B5CF6', backgroundColor: '#F5F3FF', inputBackgroundColor: '#EDE9FE', primaryTextColor: '#4C1D95', placeholderTextColor: '#7C3AED', inputBorderColor: '#DDD6FE', hoverBorderColor: '#C4B5FD', focusBorderColor: '#8B5CF6', descriptionColor: '#7C3AED', submitTextColor: '#ffffff', checkboxSelectedColor: '#8B5CF6', checkboxUnselectedColor: '#EDE9FE' }], ['Rose Gold', { primaryColor: '#F472B6', backgroundColor: '#FFF1F2', inputBackgroundColor: '#FCE7F3', primaryTextColor: '#831843', placeholderTextColor: '#F472B6', inputBorderColor: '#FBCFE8', hoverBorderColor: '#F472B6', focusBorderColor: '#F472B6', descriptionColor: '#F472B6', submitTextColor: '#ffffff', checkboxSelectedColor: '#F472B6', checkboxUnselectedColor: '#FCE7F3' }], ['Midnight', { primaryColor: '#1E293B', backgroundColor: '#0F172A', inputBackgroundColor: '#1E293B', primaryTextColor: '#F1F5F9', placeholderTextColor: '#64748B', inputBorderColor: '#334155', hoverBorderColor: '#64748B', focusBorderColor: '#2563EB', descriptionColor: '#64748B', submitTextColor: '#ffffff', checkboxSelectedColor: '#2563EB', checkboxUnselectedColor: '#334155' }], ['Minty Fresh', { primaryColor: '#34D399', backgroundColor: '#ECFDF5', inputBackgroundColor: '#D1FAE5', primaryTextColor: '#065F46', placeholderTextColor: '#34D399', inputBorderColor: '#A7F3D0', hoverBorderColor: '#34D399', focusBorderColor: '#34D399', descriptionColor: '#34D399', submitTextColor: '#ffffff', checkboxSelectedColor: '#34D399', checkboxUnselectedColor: '#D1FAE5' }], ] export const schemeToSettings = (name, c) => ({ colorSchemeName: name, formBgColor: c.backgroundColor, inputBgColor: c.inputBackgroundColor, inputBorderColor: c.inputBorderColor, hoverBorderColor: c.hoverBorderColor, focusBorderColor: c.focusBorderColor, labelColor: c.primaryTextColor, inputTextColor: c.primaryTextColor, placeholderColor: c.placeholderTextColor, placeholderTextColor: c.placeholderTextColor, descriptionColor: c.descriptionColor, checkboxSelectedColor: c.checkboxSelectedColor, checkboxUnselectedColor: c.checkboxUnselectedColor, radioSelectedColor: c.checkboxSelectedColor, submitButtonBgColor: c.primaryColor, submitButtonTextColor: c.submitTextColor, primaryColor: c.primaryColor, }) // Per-field colour overrides the reference builder resets when a scheme is applied (resetFieldsToScheme F:2737). WP clears them so // the fields follow the new theme colours. const FIELD_SCHEME_KEYS = ['labelTextColor', 'labelColor', 'inputBackgroundColor', 'inputBorderColor', 'textColor', 'placeholderTextColor', 'descriptionColor'] const LAYOUT_TYPES = ['grid', 'static-content', 'html', 'section', 'image', 'submit', 'promo-banner', 'trust-badges', 'faq-accordion', 'countdown-banner'] const isLayoutField = (type) => LAYOUT_TYPES.includes(type) || Boolean(getFieldType(type)?.noValue) function clearFieldColors(list) { return (list || []).map((f) => { let next = f if (!isLayoutField(f.type)) { next = { ...f } for (const k of FIELD_SCHEME_KEYS) if (k in next) next[k] = null } if (f.columns && !Array.isArray(f.columns) && typeof f.columns === 'object') { const cols = {} for (const [k, v] of Object.entries(f.columns)) cols[k] = Array.isArray(v) ? clearFieldColors(v) : v next = { ...next, columns: cols } } return next }) } function Section({ id, title, open, onToggle, tip, children }) { return (