Message scroller
Uma área de rolagem de chat que acompanha as novas mensagens, mantém sua posição enquanto você relê e conta o que você perdeu no botão de saltar.
New chat
How can I help you today?
The prompt is read only. Press send to play the next turn.
pnpm dlx shadcn@latest add https://hextaui.com/r/message-scroller.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @shadcn/react @tabler/icons-react cnCopie e cole o código a seguir no seu projeto.
components/ui/message-scroller.tsx components/ui/button.tsx lib/motion.ts Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Dê a cada item um messageId estável. O scroller o usa para acompanhar novas mensagens, manter sua posição e contar o que você não viu. Combine com <Message /> e <Bubble /> para as linhas.
Chat em grupo
Âncoras não precisam ser mensagens. Aqui um <Marker /> de alguém entrando inicia o turno. Role para cima, receba mensagens e o botão de salto conta o que chegou enquanto você estava fora.
Mantendo o contexto
scrollPreviousItemPeek mantém uma fatia do turno anterior acima de um recém-ancorado, para a conversa continuar parecendo contínua. Experimente cada valor e depois faça a próxima pergunta.
Abrindo conversas salvas
defaultScrollPosition="last-anchor" reabre uma conversa na última pergunta, com a resposta abaixo, em vez de largar o leitor no meio da resposta, no final.
Carregando mensagens anteriores
Mensagens antigas adicionadas acima mantêm no lugar o que você está lendo (preserveScrollOnPrepend, ativado por padrão).
Saltar para mensagens
useMessageScroller controla a conversa de fora dela, e useMessageScrollerVisibility informa o turno atual, para que o sumário destaque onde você está.
Dentro do provider, estes hooks permitem que seus próprios controles rolem a conversa e reajam ao que está na tela.
| Tecla | Ação |
|---|---|
| Tab | Foca a conversa. O botão de salto só entra na ordem de tabulação enquanto está visível. |
| ↑↓ | Rola a conversa. |
| Page UpPage Down | Rola uma tela. |
| HomeEnd | Salta para a primeira ou a última mensagem. |
- O viewport é uma região rotulada e focável e o conteúdo é um
role="log", então os leitores de tela anunciam as novas mensagens conforme chegam. Dê ao viewport umaria-label. - O rótulo do botão de salto diz quantas mensagens são novas, então "3 novas mensagens" é lido em voz alta, e não apenas uma seta.
- Acompanhar novas mensagens nunca move a tela enquanto você relê o histórico. Só retoma quando você volta ao final.
| Prop | Tipo | Padrão |
|---|---|---|
autoScrollAcompanha as novas mensagens enquanto o leitor está no final. | boolean | false |
defaultScrollPositionOnde a conversa abre. | "start" | "end" | "last-anchor" | "end" |
scrollPreviousItemPeekQuanto do item anterior continua visível acima de uma nova âncora. | number | 64 |
scrollEdgeThresholdPixels de uma borda que ainda contam como estar nela. | number | – |
scrollMarginEspaço mantido acima das mensagens roladas para a vista. | number | – |
| Prop | Tipo | Padrão |
|---|---|---|
preserveScrollOnPrependMantém a posição de leitura quando mensagens são adicionadas acima. | boolean | false |
aria-labelDá nome à região da conversa. | string | – |
| Atributo | Descrição |
|---|---|
data-scrollable="start end" | Quais bordas têm mais conteúdo para rolar. Controla os esmaecimentos das bordas. |
data-autoscrolling | Presente enquanto acompanha novas mensagens. A barra de rolagem fica oculta. |
--scroller-fade-start / --scroller-fade-end | Tamanho dos esmaecimentos das bordas. Eles animam na entrada e na saída. |
| Prop | Tipo | Padrão |
|---|---|---|
messageIdId estável para acompanhamento, âncoras e contagens. | string | – |
scrollAnchorRola este item até o topo quando ele chega, com defaultScrollPosition="last-anchor". | boolean | false |
| Prop | Tipo | Padrão |
|---|---|---|
direction | "start" | "end" | "end" |
showUnseenCresce até virar uma pílula que conta as mensagens que chegaram enquanto você estava rolado para cima. | boolean | true |
unseenLabel | (count: number) => ReactNode | "3 new messages" |
variant | Button variant | "outline" |
behavior | ScrollBehavior | "smooth" |
| Atributo | Descrição |
|---|---|
data-slot="message-scroller-button" | Seleciona o botão no CSS. |
data-active | "true" enquanto houver para onde saltar. |
data-unseen | A contagem de não vistas, enquanto for maior que zero. |
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- MotionAs curvas de easing, as durações e a verificação de movimento reduzido com que todo componente anima, além de hooks para transformações de tamanho e destaques deslizantes.
- MessageUma linha de mensagem de chat com avatar, nome, balões e status, em que as novas mensagens surgem do lado do remetente.
- AttachmentCards de arquivo e imagem para uploads, com progresso, estados, ações, um gatilho no card inteiro e nomes que mantêm a extensão.
- BubbleBalões de mensagem de chat com variantes, cantos agrupados, reações e espaço para conteúdo interativo.
- MarkerNotas discretas entre o conteúdo, como divisores de data e eventos do sistema, com datas e horários fixos que aparecem como Hoje ou Ontem.
Usado em blocos
Blocos que se baseiam em Message scroller.
- Prompt InputUm campo de conversa que começa como uma linha discreta, cresce até virar um card conforme você escreve e desce quando a conversa começa. Enter envia, de forma segura com entrada em japonês e chinês. Cole, solte ou escolha arquivos com prévias, progresso e nova tentativa. @ adiciona arquivos e / executa comandos a partir de um menu no cursor. Um seletor de modelo com teclas numéricas, um slider de esforço que ganha vida no Max, um anel de contexto, ditado com forma de onda ao vivo, chips de ferramentas, uma fila para mensagens digitadas enquanto uma resposta é transmitida e rascunhos que sobrevivem a um recarregamento.
- Agent TodosMostre o plano de um agente enquanto ele trabalha. Cada etapa passa de backlog para a fazer, em andamento e concluída, com tempos ao vivo, falhas e as chamadas de ferramenta por trás dela. Uma pílula de status para acima do composer, mudanças no plano que você consegue ver e uma etapa de revisão para editar o plano antes de executá-lo.
- Chat ThreadA conversa inteira ao redor do composer. Sua pergunta fica fixa no topo enquanto a resposta chega em streaming, checkpoints na lateral saltam entre mensagens, e toda resposta pode ser copiada, editada, repetida, avaliada e alternada entre versões. As respostas renderizam Markdown com blocos de código, tabelas e citações, e o raciocínio, as chamadas de ferramenta e o Prompt Input se encaixam diretamente.
- Code BlockBlocos de código feitos para respostas de IA. Realce de sintaxe que acompanha o streaming, copiar, baixar e quebra de linha, números de linha e linhas destacadas, diffs com aceitar e rejeitar e um terminal para comandos.