import React, { useState } from 'react'; import { usePages } from '../../state/PageContext'; import { clickableProps } from '../../utils/a11y'; export const PagesPanel: React.FC = () => { const { pages, activePageId, isEditingHeader, isEditingFooter, switchPage, editHeader, editFooter, addPage, deletePage, renamePage, } = usePages(); const [isAdding, setIsAdding] = useState(false); const [newName, setNewName] = useState(''); const [newSlug, setNewSlug] = useState(''); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(''); const [editSlug, setEditSlug] = useState(''); const [deleteConfirmId, setDeleteConfirmId] = useState(null); const handleAdd = () => { if (!newName.trim()) return; addPage(newName.trim(), newSlug.trim()); setNewName(''); setNewSlug(''); setIsAdding(false); }; const handleRename = (pageId: string) => { if (!editName.trim()) return; renamePage(pageId, editName.trim(), editSlug.trim()); setEditingId(null); }; const handleDelete = (pageId: string) => { deletePage(pageId); setDeleteConfirmId(null); }; const startEditing = (page: { id: string; name: string; slug: string }) => { setEditingId(page.id); setEditName(page.name); setEditSlug(page.slug); setDeleteConfirmId(null); }; const autoSlug = (name: string): string => { return name .toLowerCase() .trim() .replace(/[^a-z0-9\s-]/g, '') .replace(/\s+/g, '-') .replace(/-+/g, '-'); }; /* ---------- Zone button style ---------- */ const zoneButtonStyle = (isActive: boolean): React.CSSProperties => ({ display: 'flex', alignItems: 'center', gap: 8, width: '100%', padding: '10px 12px', fontSize: 12, fontWeight: 600, color: isActive ? '#f59e0b' : '#fbbf24', background: isActive ? 'rgba(245, 158, 11, 0.15)' : 'rgba(245, 158, 11, 0.06)', border: `1px solid ${isActive ? 'rgba(245, 158, 11, 0.5)' : 'rgba(245, 158, 11, 0.2)'}`, borderRadius: 'var(--radius-md)', cursor: 'pointer', transition: 'all var(--transition-fast)', textAlign: 'left' as const, }); return (
{/* Header/Footer zone buttons */}
{/* Section label for pages */}
Pages
{/* Page list */} {pages.map((page, pageIndex) => { const isLanding = pageIndex === 0; return (
{editingId === page.id ? ( /* Editing mode */
{ setEditName(e.target.value); setEditSlug(autoSlug(e.target.value)); }} placeholder="Page name" className="control-input" style={{ fontSize: 12 }} autoFocus onKeyDown={(e) => { if (e.key === 'Enter') handleRename(page.id); if (e.key === 'Escape') setEditingId(null); }} /> {isLanding ? (
Landing page — URL locked to /
) : ( setEditSlug(e.target.value)} placeholder="page-slug" className="control-input" style={{ fontSize: 11 }} /> )}
) : deleteConfirmId === page.id ? ( /* Delete confirmation */
Delete "{page.name}"?
) : ( /* Normal page item */
switchPage(page.id))} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '8px 10px', background: page.id === activePageId ? 'var(--color-accent-subtle)' : 'var(--color-bg-elevated)', border: `1px solid ${page.id === activePageId ? 'var(--color-accent)' : 'var(--color-border)'}`, borderRadius: 'var(--radius-md)', cursor: 'pointer', transition: 'all var(--transition-fast)', }} >
{page.name} {isLanding && ( Landing )}
{isLanding ? '/' : '/' + page.slug}
e.stopPropagation()} > {pages.length > 1 && !isLanding && ( )}
)}
); })} {/* Add page section */} {isAdding ? (
{ setNewName(e.target.value); setNewSlug(autoSlug(e.target.value)); }} placeholder="Page name" className="control-input" style={{ fontSize: 12 }} autoFocus onKeyDown={(e) => { if (e.key === 'Enter') handleAdd(); if (e.key === 'Escape') { setIsAdding(false); setNewName(''); setNewSlug(''); } }} /> setNewSlug(e.target.value)} placeholder="page-slug" className="control-input" style={{ fontSize: 11 }} />
) : ( )}
); };