import { useMemo } from 'react'; import { startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isToday, isSameDay, format, } from 'date-fns'; import { motion } from 'framer-motion'; import { clsx } from 'clsx'; import type { CalendarEvent, Member } from '@/lib/api'; const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; interface Props { month: Date; events: CalendarEvent[]; members: Member[]; onDayClick: (date: Date) => void; onEventClick: (event: CalendarEvent) => void; } function eventColor(event: CalendarEvent, members: Member[]): string { if (event.color) return event.color; if (event.member_id) { return members.find((m) => m.id === event.member_id)?.color ?? '#6366f1'; } return '#6366f1'; } export function CalendarGrid({ month, events, members, onDayClick, onEventClick }: Props) { const days = useMemo(() => { const start = startOfWeek(startOfMonth(month)); const end = endOfWeek(endOfMonth(month)); return eachDayOfInterval({ start, end }); }, [month]); function dayEvents(day: Date) { return events.filter((e) => { const start = new Date(e.start_at); const end = new Date(e.end_at); // All-day or events that touch this day return isSameDay(start, day) || (start <= day && end >= day); }); } return (