"use client"; import { CalendarConfig } from "../types"; import { CalendarDay, getWeekDayNames } from "./calendarUtils"; interface MonthViewProps { days: CalendarDay[]; config: CalendarConfig; isCompact?: boolean; // 작은 크기 (2x2, 3x3) selectedDate?: Date | null; // 선택된 날짜 onDateClick?: (date: Date) => void; // 날짜 클릭 핸들러 } /** * 월간 달력 뷰 컴포넌트 */ export function MonthView({ days, config, isCompact = false, selectedDate, onDateClick }: MonthViewProps) { const weekDayNames = getWeekDayNames(config.startWeekOn); // 테마별 스타일 const getThemeStyles = () => { if (config.theme === "custom" && config.customColor) { return { todayBg: config.customColor, holidayText: config.customColor, weekendText: "#dc2626", }; } if (config.theme === "dark") { return { todayBg: "#3b82f6", holidayText: "#f87171", weekendText: "#f87171", }; } // light 테마 return { todayBg: "#3b82f6", holidayText: "#dc2626", weekendText: "#dc2626", }; }; const themeStyles = getThemeStyles(); // 날짜가 선택된 날짜인지 확인 const isSelected = (day: CalendarDay) => { if (!selectedDate || !day.isCurrentMonth) return false; return ( selectedDate.getFullYear() === day.date.getFullYear() && selectedDate.getMonth() === day.date.getMonth() && selectedDate.getDate() === day.date.getDate() ); }; // 날짜 클릭 핸들러 const handleDayClick = (day: CalendarDay) => { if (!day.isCurrentMonth || !onDateClick) return; onDateClick(day.date); }; // 날짜 셀 스타일 클래스 const getDayCellClass = (day: CalendarDay) => { const baseClass = "flex aspect-square items-center justify-center rounded-lg transition-colors"; const sizeClass = isCompact ? "text-xs" : "text-sm"; const cursorClass = day.isCurrentMonth ? "cursor-pointer" : "cursor-default"; let colorClass = "text-gray-700"; // 현재 월이 아닌 날짜 if (!day.isCurrentMonth) { colorClass = "text-gray-300"; } // 선택된 날짜 else if (isSelected(day)) { colorClass = "text-white font-bold"; } // 오늘 else if (config.highlightToday && day.isToday) { colorClass = "text-white font-bold"; } // 공휴일 else if (config.showHolidays && day.isHoliday) { colorClass = "font-semibold"; } // 주말 else if (config.highlightWeekends && day.isWeekend) { colorClass = "text-red-600"; } let bgClass = ""; if (isSelected(day)) { bgClass = ""; // 선택된 날짜는 배경색이 style로 적용됨 } else if (config.highlightToday && day.isToday) { bgClass = ""; } else { bgClass = "hover:bg-gray-100"; } return `${baseClass} ${sizeClass} ${colorClass} ${bgClass} ${cursorClass}`; }; return (