# fix\(web\): timeline follow listeners attach once the list exists · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/commit/ca449ec80ee41858d61e7ad1d48e83308f20872c)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

Requested revision: ca449ec80ee41858d61e7ad1d48e83308f20872c

Requested commit: ca449ec80ee41858d61e7ad1d48e83308f20872c

Commit: ca449ec80ee41858d61e7ad1d48e83308f20872c

Tree: b2c3a0b8285fbd9fba2501d61e2e3bb61c94dde7

Author: Julius Marminge

Committer: Julius Marminge

## Message

```
fix(web): timeline follow listeners attach once the list exists

The opt-out listeners (wheel, keys, scrollbar, touch, chained scroll)
attached through a 12-frame requestAnimationFrame retry keyed on the
thread id. A thread that was still hydrating rendered the loading
placeholder with no LegendList, so the retry expired and the listeners
never attached once the list mounted. Scrolling up moved the viewport,
live follow stayed on, and the next tool boundary snapped back to the end.

MessagesTimeline now reports its scroll node through a ref callback and
the hook attaches to that node whenever it mounts or remounts. The
unpositioned-tail overflow fallback from the previous attempt is
reverted: LegendList positions appended rows synchronously on data
change, and the real cause was the missing listeners.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

```

## Parents

- [e4e1b8c3440b9576bc23a590685fc5520ca004ff](https://git.cafe/pingdotgg/t3code/commit/e4e1b8c3440b9576bc23a590685fc5520ca004ff?format=markdown)

[Source at this commit](https://git.cafe/pingdotgg/t3code/tree/ca449ec80ee41858d61e7ad1d48e83308f20872c?format=markdown)
