From fe26b4a7b11a0443c3dab0cb97f8f9b10746b485 Mon Sep 17 00:00:00 2001 From: Yihui Khuu Date: Sat, 9 Aug 2025 04:14:09 +1000 Subject: [PATCH] fix(tui): preserve scroll position when reflowing due to message stream (#1716) --- packages/tui/internal/components/chat/messages.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go index 46036b75..22cb97fb 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)