diff --git a/apps/web/src/components/timeline/TimelineView.tsx b/apps/web/src/components/timeline/TimelineView.tsx index 0937683..ec4cc2d 100644 --- a/apps/web/src/components/timeline/TimelineView.tsx +++ b/apps/web/src/components/timeline/TimelineView.tsx @@ -689,17 +689,15 @@ function TimelineViewContent({ const pendingLeftCompensationPx = useRef(0); // Flag: scroll viewport to today after the next viewStart-driven re-layout. const pendingScrollToTodayRef = useRef(false); - // Guard: only auto-scroll to today once on initial mount. - const scrolledToTodayOnMount = useRef(false); - // Scroll to today on first mount so the viewport opens with today at the left edge. + // Scroll to today on mount so the viewport opens with today at the left edge. + // Empty deps: intentionally runs once (and twice in React Strict Mode dev, both correct). + useLayoutEffect(() => { - if (scrolledToTodayOnMount.current) return; const el = scrollContainerRef.current; if (!el) return; el.scrollLeft = toLeft(today); - scrolledToTodayOnMount.current = true; - }, [toLeft, today]); + }, []); // Apply scroll compensation synchronously after the canvas grows (left-extend or Today button). useLayoutEffect(() => {