import React, { useState, useCallback } from 'react' import { AnimatePresence, motion } from 'framer-motion' import { ExternalLink } from 'lucide-react' import { investigations } from '@/data/investigations' import { Card, CardHeader } from '../Card' import type { Investigation } from '@/types/pmr' const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches const statusColorMap: Record = { Complete: '#059669', Ongoing: '#0D6E6E', Live: '#059669', } interface ProjectItemProps { project: Investigation isExpanded: boolean onToggle: () => void } function ProjectItem({ project, isExpanded, onToggle }: ProjectItemProps) { const dotColor = statusColorMap[project.status] || '#0D6E6E' const isLive = project.status === 'Live' const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() onToggle() } else if (e.key === 'Escape' && isExpanded) { e.preventDefault() onToggle() } }, [isExpanded, onToggle], ) return (
{ e.currentTarget.style.borderColor = 'var(--accent-border)' }} onMouseLeave={(e) => { if (!isExpanded) { e.currentTarget.style.borderColor = 'var(--border-light)' } }} > {/* Item header row */}
{/* Expanded content */} {isExpanded && (
{/* Methodology */} {project.methodology && (

{project.methodology}

)} {/* Tech stack tags */} {project.techStack && project.techStack.length > 0 && (
{project.techStack.map((tech) => ( {tech} ))}
)} {/* Results */} {project.results && project.results.length > 0 && (
    {project.results.map((result, i) => (
  • {result}
  • ))}
)} {/* External link */} {project.externalUrl && ( e.stopPropagation()} style={{ display: 'inline-flex', alignItems: 'center', gap: '5px', fontSize: '10.5px', fontWeight: 500, color: 'var(--accent)', textDecoration: 'none', padding: '4px 8px', borderRadius: '4px', background: 'var(--accent-light)', border: '1px solid var(--accent-border)', transition: 'background 0.15s', }} onMouseEnter={(e) => { e.currentTarget.style.background = 'rgba(10,128,128,0.14)' }} onMouseLeave={(e) => { e.currentTarget.style.background = 'var(--accent-light)' }} > View Results )}
)}
) } export function ProjectsTile() { const [expandedItemId, setExpandedItemId] = useState(null) const handleToggle = useCallback( (id: string) => { setExpandedItemId((prev) => (prev === id ? null : id)) }, [], ) return (
{investigations.map((project) => ( handleToggle(project.id)} /> ))}
) }