/** * Template Customizer * Phase 7: Layout & Template System * Component for customizing template settings and styles */ import React, { useState } from 'react'; import { SettingsIcon, PaletteIcon, TypeIcon, LayoutIcon } from 'lucide-react'; import { Card } from '../../ui/card'; import Label from '../../form/Label'; import SelectDropdown from '../../form/SelectDropdown'; import Button from '../../ui/button/Button'; export interface TemplateCustomization { layout: string; colorScheme: string; typography: string; spacing: string; headerStyle: string; footerStyle: string; sidebarPosition?: 'left' | 'right' | 'none'; customStyles?: Record; } interface TemplateCustomizerProps { templateId: string; templateName: string; customization: TemplateCustomization; onChange: (customization: TemplateCustomization) => void; onSave?: () => void; onReset?: () => void; } export default function TemplateCustomizer({ templateId, templateName, customization, onChange, onSave, onReset, }: TemplateCustomizerProps) { const [activeTab, setActiveTab] = useState<'layout' | 'colors' | 'typography' | 'spacing'>('layout'); const updateCustomization = (updates: Partial) => { onChange({ ...customization, ...updates }); }; return (

Customize: {templateName}

Adjust template settings and styles

{onReset && ( )} {onSave && ( )}
{/* Tabs */}
{/* Layout Tab */} {activeTab === 'layout' && (
updateCustomization({ layout: value })} />
updateCustomization({ headerStyle: value })} />
updateCustomization({ footerStyle: value })} />
{customization.sidebarPosition !== undefined && (
updateCustomization({ sidebarPosition: value as 'left' | 'right' | 'none' })} />
)}
)} {/* Colors Tab */} {activeTab === 'colors' && (
updateCustomization({ colorScheme: value })} />
updateCustomization({ customStyles: { ...customization.customStyles, primaryColor: e.target.value }, }) } className="w-16 h-10 rounded border border-gray-300 dark:border-gray-700 cursor-pointer" /> updateCustomization({ customStyles: { ...customization.customStyles, primaryColor: e.target.value }, }) } placeholder="#3b82f6" className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md dark:bg-gray-800 dark:text-white" />
updateCustomization({ customStyles: { ...customization.customStyles, backgroundColor: e.target.value }, }) } className="w-16 h-10 rounded border border-gray-300 dark:border-gray-700 cursor-pointer" /> updateCustomization({ customStyles: { ...customization.customStyles, backgroundColor: e.target.value }, }) } placeholder="#ffffff" className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md dark:bg-gray-800 dark:text-white" />
)} {/* Typography Tab */} {activeTab === 'typography' && (
updateCustomization({ typography: value })} />
updateCustomization({ customStyles: { ...customization.customStyles, headingSize: value }, }) } />
updateCustomization({ customStyles: { ...customization.customStyles, bodySize: value }, }) } />
)} {/* Spacing Tab */} {activeTab === 'spacing' && (
updateCustomization({ spacing: value })} />
updateCustomization({ customStyles: { ...customization.customStyles, sectionPadding: value }, }) } />
updateCustomization({ customStyles: { ...customization.customStyles, containerWidth: value }, }) } />
)}
); }