diff --git a/client/src/components/Calendar.tsx b/client/src/components/Calendar.tsx index 765bfaf..ddfa6c3 100644 --- a/client/src/components/Calendar.tsx +++ b/client/src/components/Calendar.tsx @@ -20,18 +20,30 @@ export const formatDateRange = (startDate: string, startTime: string, endDate: s } else { return `${format(start, 'MMMM d, yyyy')}\n${formatTime(startDate, startTime)} - ${format(end, 'MMMM d, yyyy')}\n${formatTime(endDate, endTime)}`; } -};const EventPopup: React.FC<{ event: Event; position: { top: number; left: number }; onClose: () => void }> = ({ event, position, onClose }) => ( +}; + +const EventPopup: React.FC<{ event: Event; position: { top: number; left: number }; onClose: () => void }> = ({ event, position, onClose }) => ( e.stopPropagation()} > +

{event.title}

{formatDateRange(event.date, event.startTime, event.date, event.endTime)}

{event.description}

@@ -64,6 +76,19 @@ const Calendar: React.FC = () => { }; }, [selectedEvent]); + useEffect(() => { + const handleEscapeKey = (event: KeyboardEvent) => { + if (event.key === 'Escape' && selectedEvent) { + setSelectedEvent(null); + } + }; + + document.addEventListener('keydown', handleEscapeKey); + return () => { + document.removeEventListener('keydown', handleEscapeKey); + }; + }, [selectedEvent]); + const isEventUpcoming = (eventDate: string) => { const today = startOfDay(new Date()); const parsedEventDate = startOfDay(parseISO(eventDate)); @@ -104,10 +129,11 @@ const Calendar: React.FC = () => { whileTap={{ scale: 0.9 }} className="text-2xl text-[#8C1D40]" onClick={prevMonth} + aria-label={`Previous month: ${monthNames[(currentMonth.getMonth() - 1 + 12) % 12]}`} > ← -

+

{monthNames[currentMonth.getMonth()]} {currentMonth.getFullYear()}

{ whileTap={{ scale: 0.9 }} className="text-2xl text-[#8C1D40]" onClick={nextMonth} + aria-label={`Next month: ${monthNames[(currentMonth.getMonth() + 1) % 12]}`} > → -
- {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map(day => ( -
- {day} +
+ {['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'].map(day => ( +
+ {day.charAt(0)}
))} {emptyDays.map(day => ( -
+ ))} {days.map(day => { const currentDate = new Date(currentMonth.getFullYear(), currentMonth.getMonth(), day); @@ -138,19 +179,22 @@ const Calendar: React.FC = () => { key={day} className="bg-white p-1 sm:p-2 h-16 sm:h-24 cursor-pointer flex flex-col items-start justify-start overflow-hidden" whileHover={{ backgroundColor: '#FFCCCB' }} + role="gridcell" + aria-label={`${format(currentDate, 'MMMM d, yyyy')}${dayEvents.length ? `. ${dayEvents.length} events scheduled` : '. No events'}`} > {day} {dayEvents.map((event, index) => ( -
handleEventClick(event)} + aria-label={`${event.title} on ${format(parseISO(event.date), 'MMMM d')} from ${formatTime(event.date, event.startTime)} to ${formatTime(event.date, event.endTime)}`} >
{event.title}
{formatTime(event.date, event.startTime)} - {formatTime(event.date, event.endTime)}
-
+ ))} ); @@ -167,21 +211,28 @@ const Calendar: React.FC = () => {
-

Upcoming Events

-
- {upcomingEvents.map((event, index) => ( - - ))} +

+ Upcoming Events +

+
+ {upcomingEvents.map((event, index) => ( +
+ +
+ ))} +
-
); }; -export default Calendar; +export default Calendar; \ No newline at end of file diff --git a/client/src/components/Footer.tsx b/client/src/components/Footer.tsx index 48a9126..4c5f625 100644 --- a/client/src/components/Footer.tsx +++ b/client/src/components/Footer.tsx @@ -88,7 +88,7 @@ const Footer: React.FC = () => { }; return ( -