diff --git a/frontend/src/components/calendar/CalendarPage.tsx b/frontend/src/components/calendar/CalendarPage.tsx index 27b03c5..9e2d975 100644 --- a/frontend/src/components/calendar/CalendarPage.tsx +++ b/frontend/src/components/calendar/CalendarPage.tsx @@ -61,16 +61,21 @@ export default function CalendarPage() { return SIDEBAR_DEFAULT; }); const isResizingRef = useRef(false); + const sidebarRef = useRef(null); const handleSidebarMouseDown = useCallback((e: React.MouseEvent) => { e.preventDefault(); isResizingRef.current = true; const startX = e.clientX; const startWidth = sidebarWidth; + let latestWidth = startWidth; const onMouseMove = (ev: MouseEvent) => { - const newWidth = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, startWidth + (ev.clientX - startX))); - setSidebarWidth(newWidth); + latestWidth = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, startWidth + (ev.clientX - startX))); + // Direct DOM mutation — bypasses React entirely during drag, zero re-renders + if (sidebarRef.current) { + sidebarRef.current.style.width = latestWidth + 'px'; + } }; const onMouseUp = () => { @@ -79,6 +84,8 @@ export default function CalendarPage() { document.removeEventListener('mouseup', onMouseUp); document.body.style.cursor = ''; document.body.style.userSelect = ''; + // Single React state commit on release — triggers localStorage persist + final reconciliation + setSidebarWidth(latestWidth); }; document.body.style.cursor = 'col-resize'; @@ -468,7 +475,7 @@ export default function CalendarPage() { return (
- +
(function CalendarSidebar({ onUseTemplate, onSharedVisibilityChange, width }, ref) { const queryClient = useQueryClient(); const { data: calendars = [], sharedData: sharedCalendars = [] } = useCalendars(); const [showForm, setShowForm] = useState(false); @@ -94,7 +94,7 @@ export default function CalendarSidebar({ onUseTemplate, onSharedVisibilityChang }; return ( -
+
Calendars