Complete the #5449 architecture on the v2 timeline, following the
LegendList author's direction to lean on the list's native mechanisms
instead of app-side scroll layers:
- maintainScrollAtEnd is enabled and owned by LegendList, gated off only
while the user reads history (liveFollowEnabled), while a sent turn
anchors near the top (anchoredEndSpace), or during the two-frame settle
of a fold toggle.
- maintainVisibleContentPosition compensates size changes natively
({data, size, shouldRestorePosition}); fold toggles anchor compensation
to the toggled row via a disclosure anchor key, so the trigger stays
under the pointer instead of the viewport chasing the end.
- ChatView's hand-rolled streaming follow (double-rAF scrollToEnd on
every data change) is gone; the app now only owns streaming
adjustments during anchored-end-space mode, mirroring main.
- timelineLiveFollowEnabled state mirrors the follow refs so the
render-visible gate switches native follow off when a gesture breaks
follow and back on when the viewport returns to the end band.
Timeline tests updated to assert the native-ownership invariants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>Julius Marminge committed on 8/29/2026, 6:02:11 AMparent55b5154
3 files changedLine totals unavailable