diff --git a/src/lib/components/calendar.svelte b/src/lib/components/calendar.svelte index 77ad8dd..0d4f9e3 100644 --- a/src/lib/components/calendar.svelte +++ b/src/lib/components/calendar.svelte @@ -5,43 +5,51 @@ image?: string; content: string; } - + let { - year = $bindable('2026'), - month = $bindable('0'), - entries - } = $props() - + year = $bindable("2026"), + month = $bindable("0"), + entries, + } = $props(); + var headers = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; let days = $state([]); let expanded = $state(false); let currentYear = $state(parseInt(year)); let currentMonth = $state(parseInt(month)); - + // Helper function to find entry for a specific day - function getEntryForDay(year: number, month: number, date: number): Entry | undefined { + function getEntryForDay( + year: number, + month: number, + date: number, + ): Entry | undefined { if (!entries) return undefined; - const dateStr = new Date(year, month, date).toISOString().split('T')[0]; - return entries.find(entry => { - const entryDate = entry.date.split('T')[0]; + const dateStr = new Date(year, month, date).toISOString().split("T")[0]; + return entries.find((entry) => { + const entryDate = entry.date.split("T")[0]; return entryDate === dateStr; }); } - + // Get current week when in week view function getCurrentWeek() { const today = new Date(); const currentDay = today.getDay(); const diff = currentDay === 0 ? -6 : 1 - currentDay; // Adjust for Monday start - + const monday = new Date(today); monday.setDate(today.getDate() + diff); - + const week = []; for (let i = 0; i < 7; i++) { const day = new Date(monday); day.setDate(monday.getDate() + i); - const entry = getEntryForDay(day.getFullYear(), day.getMonth(), day.getDate()); + const entry = getEntryForDay( + day.getFullYear(), + day.getMonth(), + day.getDate(), + ); week.push({ date: day.getDate(), month: day.getMonth(), @@ -49,24 +57,24 @@ dayName: headers[i], isCurrentMonth: day.getMonth() === today.getMonth(), isToday: day.toDateString() === today.toDateString(), - entry + entry, }); } return week; } - + // Generate calendar for a full month function generateMonth(year: number, month: number) { const firstDay = new Date(year, month, 1); const lastDay = new Date(year, month + 1, 0); const daysInMonth = lastDay.getDate(); - + // Get the day of week for first day (0 = Sunday, adjust to Monday = 0) let startDay = firstDay.getDay() - 1; if (startDay === -1) startDay = 6; // Sunday becomes 6 - + const days = []; - + // Previous month days const prevMonthLastDay = new Date(year, month, 0).getDate(); for (let i = startDay - 1; i >= 0; i--) { @@ -82,16 +90,17 @@ dayName: headers[dayIndex], isCurrentMonth: false, isToday: false, - entry + entry, }); } - + // Current month days const today = new Date(); for (let i = 1; i <= daysInMonth; i++) { - const isToday = today.getDate() === i && - today.getMonth() === month && - today.getFullYear() === year; + const isToday = + today.getDate() === i && + today.getMonth() === month && + today.getFullYear() === year; const dayIndex = days.length % 7; const entry = getEntryForDay(year, month, i); days.push({ @@ -101,10 +110,10 @@ dayName: headers[dayIndex], isCurrentMonth: true, isToday, - entry + entry, }); } - + // Next month days to fill the grid const remaining = 42 - days.length; // 6 rows * 7 days for (let i = 1; i <= remaining; i++) { @@ -119,13 +128,13 @@ dayName: headers[dayIndex], isCurrentMonth: false, isToday: false, - entry + entry, }); } - + return days; } - + // Update days when expanded state or month changes $effect(() => { if (expanded) { @@ -134,7 +143,7 @@ days = getCurrentWeek(); } }); - + function toggleExpanded() { expanded = !expanded; if (expanded) { @@ -144,7 +153,7 @@ currentMonth = today.getMonth(); } } - + function previousMonth() { if (!expanded) return; if (currentMonth === 0) { @@ -154,7 +163,7 @@ currentMonth--; } } - + function nextMonth() { if (!expanded) return; if (currentMonth === 11) { @@ -164,34 +173,53 @@ currentMonth++; } } - - const monthNames = ["January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"]; - + + const monthNames = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ];