From 9b49a11710dfb9ded1cf3297696c32ffc64bf7e8 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 26 Sep 2026 07:31:09 -0700 Subject: Feed: only the rows near the viewport are in the DOM, however far you scroll. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A long scroll left hundreds of rows mounted, and every repaint (a zap count, a profile landing, the thirty-second sync) rebuilt and diffed all of them — the slowdown deep in the feed. Rows beyond two and a half screens either side of the viewport are now replaced by a spacer at their measured height, so the page keeps its length (scrollbar, Back, arrival anchoring behave as before) while a repaint touches a few dozen rows. After svelte-virtual-list: measure after paint, estimate unmeasured rows at the running average, hold the reader's row still when a measurement corrects an estimate. Applies to the profile notes list too. Tests: feed-window-dom (120 posts, 27,800px page, 12–24 rows mounted, anchor held, spacers both sides); feed-live looks at the top after scrolling up; the moderation test's stub relay no longer lets real posts in. Co-Authored-By: Claude Fable 5.1 --- src/style.css | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/style.css') diff --git a/src/style.css b/src/style.css index 06ba80c..b136432 100644 --- a/src/style.css +++ b/src/style.css @@ -809,6 +809,9 @@ html.no-scroll { overflow: hidden; scrollbar-gutter: auto; } /* the profile notes feed: page-scrolled (no inner scrollbox); on phones it runs edge to edge — the card walls step outside #app's padding */ .notes-feed { padding: 2px 14px; } +/* rows scrolled well out of view are not in the DOM: a spacer stands in + at their measured height, so the page keeps its length (see listWindow) */ +.feed-spacer { display: block; flex: 0 0 auto; } @media (max-width: 520px) { .notes-feed { margin-left: -16px; margin-right: -16px; -- cgit v1.2.3