fix(chat): keep auto-scroll pinned while streaming - #174
Merged
Conversation
fix(chat): keep auto-scroll pinned while streaming O handler de `scroll` decidia se o usuário havia rolado para cima apenas pela distância até o fundo. Durante o streaming o conteúdo cresce sem que o usuário toque na barra, e essa mesma distância aumenta — então qualquer render que adicionasse mais de 100px (bloco de código, tabela, KaTeX) marcava "usuário rolou para cima" e o auto-scroll desligava no meio da resposta. A escrita programática de `scrollTop` também realimentava o próprio handler, produzindo saltos. Passa a distinguir os dois casos: só uma redução real de `scrollTop` descola do fundo; crescimento de conteúdo não. Voltar ao fundo recola, então o estado se auto-corrige. A decisão vira uma função pura em lib/chat-utils para poder ser testada. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> @
Contributor
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
@
Contexto
Sequência de tentativas anteriores no scroll do chat (#171, #172, #173) atacou o thumb do Radix
ScrollArea. O #173 removeu o Radix da área de mensagens e passou a usar scroll nativo — isso resolve a classe de bug do thumb desenhado em JS.Este PR corrige um segundo bug, independente, que sobrevive à troca por scroll nativo: o auto-scroll desligava sozinho durante o streaming.
Causa raiz
O handler de
scrolldecidia "usuário rolou para cima" só pela distância até o fundo:Essa distância aumenta em dois casos distintos:
O código tratava os dois igual. Qualquer render que adicionasse mais de 100px de uma vez (bloco de código destacado, tabela, KaTeX) marcava "rolou para cima" e o chat parava de acompanhar no meio da resposta. Pior: a escrita programática
viewport.scrollTop = viewport.scrollHeightdisparascroll, realimentando o próprio handler — daí os saltos.Correção
Só uma redução real de
scrollTopdescola. Crescimento de conteúdo não mexe emscrollTop, então não descola mais. Chegar ao fundo recola, então o estado se auto-corrige e não trava em nenhum dos dois lados.A decisão virou função pura (
resolveStickToBottom) emlib/chat-utils.ts, testável sem DOM.Test plan
pnpm test— 333 passam, 1 skipresolveStickToBottom, incluindo o caso de regressão (conteúdo cresce 400px,scrollTopparado → continua colado)pnpm typechecklimpopnpm lint— 0 erros (1 warning pré-existente emlast-ndc.ts, não relacionado)Nota sobre produção
O #173 (scroll nativo) entrou no
mainàs 13:01. Se o teste em produção foi feito antes desse deploy subir, o que se via ainda era o thumb do Radix. Vale revalidar prod já com o #173 + este PR antes de concluir que o sintoma persiste.🤖 Generated with Claude Code
@