fix(mobile): folding the Duo keeps the thread's end or the reader's line in place

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>
5b5e9062d3Julius Marminge committed on 10/21/2026, 11:43:06 PMparenta701ab2

Checks

All checks passed
5 files changedLine totals unavailable