/* * ImageAndTextLayout.tsx * Purpose: Implements one of the generic fallback slide layouts used when a template-specific renderer is unavailable. * Used by: components/slides/SlideFactory. * Depends on: Template styling props and inline field-edit callbacks. */ 'use client'; import React, { useState } from 'react'; import { TemplateStyles } from '@/data/templates'; export interface ImageAndTextLayoutProps { title: string; body?: string; imageUrl?: string; styles: TemplateStyles; slideId?: string; isEditable?: boolean; onFieldUpdate?: (slideId: string, field: string, value: string) => void; } export default function ImageAndTextLayout({ title, body, imageUrl, styles, slideId, isEditable = false, onFieldUpdate, }: ImageAndTextLayoutProps) { const [editingField, setEditingField] = useState(null); const [tempTitle, setTempTitle] = useState(title); const [tempBody, setTempBody] = useState(body || ''); const handleBlur = (field: string) => { if (!slideId || !onFieldUpdate) return; if (field === 'title' && tempTitle !== title) onFieldUpdate(slideId, 'title', tempTitle); if (field === 'body' && tempBody !== body) onFieldUpdate(slideId, 'body', tempBody); setEditingField(null); }; const handleKeyDown = (e: React.KeyboardEvent, field: string) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleBlur(field); } if (e.key === 'Escape') { setEditingField(null); setTempTitle(title); setTempBody(body || ''); } }; return (
{styles.dotPattern && (
)} {/* Image Side */}
{imageUrl ? ( {title} ) : (
Image placeholder
)}
{/* Text Side */}
{/* Title */} {editingField === 'title' ? ( setTempTitle(e.target.value)} onBlur={() => handleBlur('title')} onKeyDown={(e) => handleKeyDown(e, 'title')} className="bg-transparent outline-none mb-6" style={{ fontFamily: styles.fonts.heading, fontSize: '36px', fontWeight: 'bold', textTransform: 'uppercase', color: styles.colors.text, backgroundColor: styles.colors.accent, border: `${styles.border.width} solid ${styles.colors.border}`, boxShadow: styles.border.shadow, padding: '8px 20px', }} autoFocus /> ) : (

{ if (isEditable) { setEditingField('title'); setTempTitle(title); } }} > {title}

)} {/* Body text */} {editingField === 'body' ? (