diff options
| author | Yihui Khuu <[email protected]> | 2025-08-09 04:14:09 +1000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-08 13:14:09 -0500 |
| commit | fe26b4a7b11a0443c3dab0cb97f8f9b10746b485 (patch) | |
| tree | 76ff7a2fac07976709b64c0fac8bc84f291175bb | |
| parent | 8c173e18b7e0e52fe8345a7a1112ea617d83118f (diff) | |
| download | opencode-fe26b4a7b11a0443c3dab0cb97f8f9b10746b485.tar.gz opencode-fe26b4a7b11a0443c3dab0cb97f8f9b10746b485.zip | |
fix(tui): preserve scroll position when reflowing due to message stream (#1716)
| -rw-r--r-- | packages/tui/internal/components/chat/messages.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 46036b75f..22cb97fb5 100644 --- a/packages/tui/internal/components/chat/messages.go +++ b/packages/tui/internal/components/chat/messages.go @@ -210,7 +210,18 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.clipboard = msg.clipboard m.loading = false m.tail = m.viewport.AtBottom() + + // Preserve scroll across reflow + // if the user was at bottom, keep following; otherwise restore the previous offset. + wasAtBottom := m.viewport.AtBottom() + prevYOffset := m.viewport.YOffset m.viewport = msg.viewport + if wasAtBottom { + m.viewport.GotoBottom() + } else { + m.viewport.YOffset = prevYOffset + } + m.header = msg.header if m.dirty { cmds = append(cmds, m.renderView()) @@ -218,7 +229,6 @@ func (m *messagesComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } m.tail = m.viewport.AtBottom() - viewport, cmd := m.viewport.Update(msg) m.viewport = viewport cmds = append(cmds, cmd) |
