/* Hallmark · pre-emit critique: P5 H5 E5 S5 R5 V5 */
/* Hallmark · component: calendar-page · genre: editorial · theme: Atelier (Dark & Light) · studied-DNA: https://inihaus.de */
import React, { useState } from 'react';
import { Calendar as CalendarIcon, ChevronLeft, ChevronRight, ArrowRight, MapPin, Clock, Layers } from 'lucide-react';
export default function CalendarPage({ events, onSelectEvent, branding }) {
const [currentDate, setCurrentDate] = useState(new Date());
const [selectedCalendarEvent, setSelectedCalendarEvent] = useState(null);
const year = currentDate.getFullYear();
const month = currentDate.getMonth();
const monthNames = [
'JANUAR', 'FEBRUAR', 'MÄRZ', 'APRIL', 'MAI', 'JUNI',
'JULI', 'AUGUST', 'SEPTEMBER', 'OKTOBER', 'NOVEMBER', 'DEZEMBER'
];
const prevMonth = () => setCurrentDate(new Date(year, month - 1, 1));
const nextMonth = () => setCurrentDate(new Date(year, month + 1, 1));
const todayMonth = () => setCurrentDate(new Date());
const firstDayOfMonth = new Date(year, month, 1).getDay();
const startOffset = (firstDayOfMonth === 0 ? 6 : firstDayOfMonth - 1);
const daysInMonth = new Date(year, month + 1, 0).getDate();
const formatDateString = (day) => {
const mStr = String(month + 1).padStart(2, '0');
const dStr = String(day).padStart(2, '0');
return `${year}-${mStr}-${dStr}`;
};
const getEventsForDay = (day) => {
const dateStr = formatDateString(day);
return events.filter((evt) => dateStr >= evt.start_date && dateStr <= evt.end_date);
};
const primaryColor = branding?.primary_color || 'var(--brand-primary)';
return (
{/* Calendar Masthead Bar */}
{monthNames[month]} {year}
— INITIATIVE E.V. TERMIN- & SCHICHTÜBERSICHT —
{/* Calendar Grid Container */}
{/* Days Header */}
{/* Days Cells */}
{Array.from({ length: startOffset }).map((_, i) => (
))}
{Array.from({ length: daysInMonth }).map((_, i) => {
const dayNum = i + 1;
const dayEvents = getEventsForDay(dayNum);
const isToday =
new Date().getFullYear() === year &&
new Date().getMonth() === month &&
new Date().getDate() === dayNum;
return (
{dayNum}
{dayEvents.length > 0 && (
{dayEvents.length} {dayEvents.length === 1 ? 'Event' : 'Events'}
)}
{dayEvents.map((evt) => {
const isSelected = selectedCalendarEvent?.id === evt.id;
return (
);
})}
);
})}
{/* Selected Event Detail Drawer */}
{selectedCalendarEvent && (
{new Date(selectedCalendarEvent.start_date).toLocaleDateString('de-DE')} — {new Date(selectedCalendarEvent.end_date).toLocaleDateString('de-DE')}
{selectedCalendarEvent.location && (
{selectedCalendarEvent.location}
)}
{selectedCalendarEvent.title}
{selectedCalendarEvent.description && (
{selectedCalendarEvent.description}
)}
)}
);
}