"use client"; import { useState } from "react"; import Link from "next/link"; import { type BlogPost, imageSrc, imageDescription } from "@/data/content"; import "../styles/blog.css"; type Props = { post: BlogPost; visible: boolean; }; /** One blog post: the card in the blog list. Unlike ProjectCard, clicking * navigates to the post instead of expanding in place. */ export default function BlogPostCard({ post, visible }: Props) { const [hovered, setHovered] = useState(false); function postTagsComponent() { return (
{post.tags.map((tag) => ( {tag} ))}
); } function coverImageComponent() { if (!post.images || post.images.length === 0) return null; const image = post.images![0]; return ( {imageDescription(image) ); } return ( setHovered(true)} onMouseLeave={() => setHovered(false)} style={{ display: "block", 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", }} >
{post.title}
{post.date}
{postTagsComponent()}

{post.description}

{post.images && post.images.length > 0 && coverImageComponent()} ); }