import { useState } from 'react'; import { ChevronLeft, ChevronRight, Calendar as CalendarIcon } from 'lucide-react'; export interface CalendarEvent { id: string; title: string; date: string; // YYYY-MM-DD time?: string; // HH:MM type: 'meeting' | 'task' | 'milestone' | 'reminder'; participants?: { name: string; avatar?: string }[]; color?: string; // Hex or theme color } export interface CalendarProps { events: CalendarEvent[]; onEventClick?: (event: CalendarEvent) => void; className?: string; } export function Calendar({ events, onEventClick, className = '' }: CalendarProps) { const [currentDate, setCurrentDate] = useState(new Date()); const getDaysInMonth = (year: number, month: number) => { return new Date(year, month + 1, 0).getDate(); }; const getFirstDayOfMonth = (year: number, month: number) => { return new Date(year, month, 1).getDay(); }; const year = currentDate.getFullYear(); const month = currentDate.getMonth(); const daysInMonth = getDaysInMonth(year, month); const firstDay = getFirstDayOfMonth(year, month); const monthNames = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]; const dayNames = ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"]; const handlePrevMonth = () => { setCurrentDate(new Date(year, month - 1, 1)); }; const handleNextMonth = () => { setCurrentDate(new Date(year, month + 1, 1)); }; // Generate calendar grid const days = []; for (let i = 0; i < firstDay; i++) { days.push(
); } for (let day = 1; day <= daysInMonth; day++) { const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`; const dayEvents = events.filter(e => e.date === dateStr); const isToday = dateStr === new Date().toISOString().split('T')[0]; days.push(
{day}
{dayEvents.map(event => (
onEventClick?.(event)} className="px-2 py-1.5 rounded-md bg-background border border-border hover:border-primary/50 text-xs font-medium text-text cursor-pointer truncate flex flex-col gap-1 transition-all shadow-sm hover:shadow-md" >
{event.title}
{event.time && ( {event.time} )}
))}
); } return (
{/* Header */}

{monthNames[month]} {year}

Vista Mensual

{/* Days Header */}
{dayNames.map(day => (
{day}
))}
{/* Calendar Grid */}
{days}
); }