// components/ProjectModal.jsx — case-study overlay · v2 print style function ProjectModal({ project, onClose }) { // close on Escape React.useEffect(() => { if (!project) return; const onKey = (e) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [project, onClose]); if (!project) return null; return (
e.stopPropagation()} style={{ background: '#FFFFFF', border: '1px solid var(--c-border)', maxWidth: 980, width: '100%', boxShadow: 'var(--shadow-lg)', overflow: 'hidden', position: 'relative', }}> {/* Header bar */}
{project.number} Case study · TRK {project.number}
{/* Hero */}
{project.venue} · {project.year}

{project.title}

{project.subtitle}
{project.tags.map((t, i) => {t.label})} } />
{/* Sections */}
{project.sections.map((sec, i) => )}
{/* Footer */}
End of track {project.number} Press ESC to eject
); } function Meta({ label, value }) { return (
{label}
{value}
); } function CaseSection({ section }) { if (section.kind === 'intro') { return (
{section.eyebrow}

{section.body}

); } if (section.kind === 'pillars') { return (
{section.eyebrow}

{section.title}

{section.items.map((it, i) => (
{it.n} · {it.label}
{it.body}
))}
); } if (section.kind === 'todo') { return (
{section.eyebrow} {section.prompt}
); } if (section.kind === 'evidence') { return (
{section.eyebrow}
{section.slots.map((s) => ( ))}
); } if (section.kind === 'gallery') { return (
{section.eyebrow}

{section.title}

{section.sub}

{[1, 2, 3].map(i => (
Plate 0{i}
0{i}
))}

Photography placeholders — final case study will carry workshop and bench photography.

); } if (section.kind === 'reflection') { return (
{section.eyebrow} {section.body}
); } return null; } window.ProjectModal = ProjectModal; window.CaseSection = CaseSection; window.CaseMeta = Meta;