Folding or unfolding re-wraps every row of the thread feed, and LegendList re-measures them over several commits. A feed following the end pinned it once and then relied on maintainScrollAtEnd, which scrolls a frame or more after each re-measure, so earlier text showed in between. A reader's row kept its top while its text moved, and the feed restored the reader's line 200ms after the rows settled, a visible hop. LegendList now takes a sizeChangeAnchor: the scroll offset a size change should leave, read in the same pass that repositions the rows. It applies through the scroll adjustment LegendList already uses for MVCP, which moves the native offset in the same commit as the new positions. The patch also commits the content height with those positions instead of ahead of them, lets a shrinking list run the pass too, skips the delayed end scroll while an anchor holds, and adjusts only past the offset that shrinking content already pulls back to its end. On iOS the feed holds the end while following, otherwise the reader's line at the same share of its row, from the first width step of a fold to 600ms after the last. Android keeps its after-the-fact restore: its list moves only while MVCP is on, which following turns off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Julius Marminge committed on 10/21/2026, 11:43:06 PMparenta701ab2
Checks
- SuccessfulCodeRabbitGitHub
Review completed
- SuccessfulLabel PR 23147GitHub
- Skipped
- SuccessfulLabel PR sizeGitHub
- Successful
- Neutral
- Neutral
- SuccessfulCollect PR targetsGitHub
- SuccessfulPrepare PR size configGitHub
- SuccessfulNative fingerprint diffGitHub
- SuccessfulCheckGitHub
- Skipped
- SuccessfulTest WebGitHub
- SuccessfulRelease SmokeGitHub
- SuccessfulBuild and TypecheckGitHub
- SuccessfulTestGitHub
- SuccessfulRustGitHub
- SkippedEAS PreviewGitHub
- SkippedDeploy web previewGitHub
- SuccessfulTest Server 8GitHub
- SuccessfulTest Server 4GitHub
- SuccessfulNative fingerprint diffGitHub
- SuccessfulTest Server 7GitHub
- SuccessfulTest Server 2GitHub
- SuccessfulChangesGitHub
- SuccessfulTest Server 3GitHub
- SuccessfulTest Server 1GitHub
- SuccessfulTest Server 6GitHub
- SuccessfulTest Server 5GitHub
- SuccessfulLintGitHub
- Skipped
- SuccessfulLabel PR sizeGitHub
- SuccessfulLabel PR 23147GitHub
- SuccessfulPrepare PR size configGitHub
- SuccessfulCollect PR targetsGitHub
5 files changedLine totals unavailable