import { format, isPast, isToday } from "date-fns"; import { motion, useReducedMotion } from "framer-motion"; import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import type { Card, Label } from "@/types/board"; import { LabelDots } from "@/components/board/LabelDots"; import { ChecklistBar } from "@/components/board/ChecklistBar"; interface CardThumbnailProps { card: Card; boardLabels: Label[]; columnId: string; onCardClick?: (cardId: string) => void; } export function CardThumbnail({ card, boardLabels, columnId, onCardClick }: CardThumbnailProps) { const prefersReducedMotion = useReducedMotion(); const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id: card.id, data: { type: "card", columnId }, }); const style = { transform: CSS.Transform.toString(transform), transition, opacity: isDragging ? 0.3 : undefined, }; const hasDueDate = card.dueDate != null; const dueDate = hasDueDate ? new Date(card.dueDate!) : null; const overdue = dueDate != null && isPast(dueDate) && !isToday(dueDate); function handleClick() { onCardClick?.(card.id); } return ( {/* Label dots */} {card.labels.length > 0 && (
)} {/* Card title */}

{card.title}

{/* Footer row: due date + checklist */} {(hasDueDate || card.checklist.length > 0) && (
{dueDate && ( {format(dueDate, "MMM d")} )} {card.checklist.length > 0 && ( )}
)}
); }