"use client"; import { useEffect, useRef, useState } from "react"; import type { Project } from "@/data/content"; import SimpleGallery from "./SimpleGallery"; import Link from "next/link"; import { relative } from "path"; type Props = { project: Project; visible: boolean; selected: boolean; setSelected: (selected: any) => void; updateHeight: (projectId: number, heightPx: number) => void; }; export default function ProjectCard({ project, visible, selected = false, setSelected, updateHeight}: Props) { const [hovered, setHovered] = useState(false); const [expandedImage, setExpandedImage] = useState(false); const contentRef = useRef(null); function projectTagsComponent(project: Project){ return (
{project.tags.map((tag) => ( {tag} ))}
); } function notSelectedComponent(){ return (
setHovered(true)} onMouseLeave={() => setHovered(false)} onClick={() => setSelected(project.id)} className="project-card" style={{ width: "100%", textDecoration: "none", padding: 28, overflow: "hidden", background: hovered ? "var(--surface-hover)" : "var(--surface)", border: `1px solid ${hovered ? "var(--accent)" : "var(--border)"}`, borderRadius: 8, transition: "all 0.35s cubic-bezier(0.16, 1, 0.3, 1)", transform: visible ? hovered ? "translateY(-3px)" : "translateY(0)" : "translateY(12px)", opacity: visible ? 1 : 0, boxShadow: hovered ? "0 8px 32px rgba(0,0,0,0.12)" : "none", pointerEvents: "auto", cursor: "pointer" }}>
{project.title}
{project.year}
{projectTagsComponent(project)}

{project.description}

{project.images && project.images.length > 0 && imgComponent()}
); } useEffect(() => { if (!contentRef.current) return; const observer = new ResizeObserver((entries) => { const height = entries[0]?.borderBoxSize?.[0]?.blockSize ?? entries[0]?.contentRect.height; if (height > 0) { updateHeight(project.id, height); } }); observer.observe(contentRef.current); return () => observer.disconnect(); }, [updateHeight, project.id]); function selectedComponent(){ return (
setHovered(true)} onMouseLeave={() => setHovered(false)} className="project-card" style={{ minWidth: "10em", overflow: "hidden", textDecoration: "none", padding: 28, background: hovered ? "var(--surface-hover)" : "var(--surface)", border: `2px solid var(--accent)`, borderRadius: 8, transition: "all 0.35s cubic-bezier(0.16, 1, 0.3, 1)", transform: visible ? "translateY(-3px)" : "translateY(0)", opacity: visible ? 1 : 0, boxShadow: hovered ? "0 8px 32px rgba(0,0,0,0.12)" : "none", pointerEvents: "auto", cursor: "pointer" }}>
{project.title}
{project.year}
{projectTagsComponent(project)}

{project.description}

{contentRef.current && project.images && project.images.length > 0 && ( )} See More
); } function imgComponent(){ return ( {`${project.title} ); } useEffect(() => { if (!selected) { if (expandedImage && contentRef.current) { setExpandedImage(false); } } }); if (selected) { return selectedComponent(); } else { return notSelectedComponent(); } }