From 9757449e21d31b4ce17baa5305b09506f4a54cf4 Mon Sep 17 00:00:00 2001 From: Thomas Hallock Date: Tue, 11 Nov 2025 16:44:25 -0600 Subject: [PATCH] fix: remove pages from visible set when they leave viewport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The virtualization was adding pages but never removing them, causing all pages to eventually be rendered and defeating the purpose. Changed logic to: 1. Start with empty set for each observer callback 2. Add currently intersecting pages + adjacent pages 3. Keep pages that weren't observed in this callback (unchanged) 4. Remove pages that are observed but not intersecting This ensures pages are removed from the visible set when scrolled away. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../worksheets/components/WorksheetPreview.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/create/worksheets/components/WorksheetPreview.tsx b/apps/web/src/app/create/worksheets/components/WorksheetPreview.tsx index 184b7df3..2cdd0491 100644 --- a/apps/web/src/app/create/worksheets/components/WorksheetPreview.tsx +++ b/apps/web/src/app/create/worksheets/components/WorksheetPreview.tsx @@ -185,8 +185,9 @@ function PreviewContent({ formState, initialData, isScrolling = false }: Workshe // Update visible pages set (only when virtualizing) if (shouldVirtualize) { setVisiblePages((prev) => { - const next = new Set(prev) + const next = new Set() + // Only keep pages that are currently intersecting entries.forEach((entry) => { const pageIndex = Number(entry.target.getAttribute('data-page-index')) @@ -197,6 +198,16 @@ function PreviewContent({ formState, initialData, isScrolling = false }: Workshe // Preload adjacent pages for smooth scrolling if (pageIndex > 0) next.add(pageIndex - 1) if (pageIndex < totalPages - 1) next.add(pageIndex + 1) + } else { + console.log('[VIRTUALIZATION] Page ' + pageIndex + ' is NOT intersecting - checking if should remove') + } + }) + + // Keep any pages from prev that weren't in entries (not observed in this callback) + prev.forEach((pageIndex) => { + const wasObserved = entries.some((entry) => Number(entry.target.getAttribute('data-page-index')) === pageIndex) + if (!wasObserved) { + next.add(pageIndex) } })