diff --git a/frontend/src/components/calendar/CalendarPage.tsx b/frontend/src/components/calendar/CalendarPage.tsx
index 794c8d8..e9d490c 100644
--- a/frontend/src/components/calendar/CalendarPage.tsx
+++ b/frontend/src/components/calendar/CalendarPage.tsx
@@ -20,6 +20,7 @@ import { Select } from '@/components/ui/select';
import { Sheet, SheetContent, SheetClose } from '@/components/ui/sheet';
import CalendarSidebar from './CalendarSidebar';
import EventDetailPanel from './EventDetailPanel';
+import MobileDetailOverlay from '@/components/shared/MobileDetailOverlay';
import type { CreateDefaults } from './EventDetailPanel';
type CalendarView = 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay';
@@ -639,26 +640,18 @@ export default function CalendarPage() {
{/* Mobile detail panel overlay */}
{panelOpen && !isDesktop && (
-
-
e.stopPropagation()}
- >
-
-
-
+
+
+
)}
);
diff --git a/frontend/src/components/shared/EntityTable.tsx b/frontend/src/components/shared/EntityTable.tsx
index 6204150..22f5823 100644
--- a/frontend/src/components/shared/EntityTable.tsx
+++ b/frontend/src/components/shared/EntityTable.tsx
@@ -145,24 +145,15 @@ export function EntityTable({
diff --git a/frontend/src/components/shared/MobileDetailOverlay.tsx b/frontend/src/components/shared/MobileDetailOverlay.tsx
index 81cc7a6..93019ff 100644
--- a/frontend/src/components/shared/MobileDetailOverlay.tsx
+++ b/frontend/src/components/shared/MobileDetailOverlay.tsx
@@ -1,4 +1,4 @@
-import { useEffect } from 'react';
+import { useEffect, useRef } from 'react';
import { cn } from '@/lib/utils';
interface MobileDetailOverlayProps {
@@ -20,15 +20,19 @@ export default function MobileDetailOverlay({
children,
className,
}: MobileDetailOverlayProps) {
+ // Stable ref to avoid re-registering listener on every render
+ const onCloseRef = useRef(onClose);
+ onCloseRef.current = onClose;
+
// Escape key handler
useEffect(() => {
if (!open) return;
const handler = (e: KeyboardEvent) => {
- if (e.key === 'Escape') onClose();
+ if (e.key === 'Escape') onCloseRef.current();
};
document.addEventListener('keydown', handler);
return () => document.removeEventListener('keydown', handler);
- }, [open, onClose]);
+ }, [open]);
// Body scroll lock
useEffect(() => {