Bubble
Balões de mensagem de chat com variantes, cantos agrupados, reações e espaço para conteúdo interativo.
pnpm dlx shadcn@latest add https://hextaui.com/r/bubble.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 @base-ui/react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/bubble.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Variantes
Sete tratamentos, de um balão primary marcante a conteúdo ghost sem moldura para respostas do assistente. destructive tinge a superfície e colore os ícones dentro dela.
Alinhamento
align="end" empurra um balão para o fim da linha, para as mensagens do usuário atual. Segue a direção de leitura.
Grupo
Envolva mensagens consecutivas de um mesmo remetente em <BubbleGroup />. Os cantos do lado do remetente se fecham para que a sequência seja lida como um bloco, e um balão isolado continua totalmente arredondado.
Formas
Defina shape em um grupo para estilizar todos os seus balões, ou em um único balão. joined é o padrão.
Cauda
shape="tail" desenha uma cauda no último balão de uma sequência, na cor do balão. Balões outline e ghost não a têm.
Reações
<BubbleReactions /> sobrepõe a borda do balão e reserva o próprio espaço, então a próxima linha não precisa de espaçamento extra. Dê a uma linha estática role="img" e um rótulo, ou use botões para reações interativas.
Mostrar mais
Renderize um <Collapsible /> como conteúdo do balão para recolher mensagens longas. O balão cresce suavemente e o texto oculto continua pesquisável.
Tooltip
Renderize um balão como gatilho de tooltip para mostrar detalhes como o horário de leitura. Adicione tabIndex para que usuários de teclado consigam alcançá-lo.
Popover
Renderize o conteúdo como um <button> para transformar o balão inteiro em gatilho de popover, por exemplo para explicar uma falha de entrega.
Conteúdo longo
Strings sem quebra, URLs, emoji e texto CJK são quebrados dentro do balão em vez de transbordar uma coluna estreita.
Resposta aninhada
Um balão citado dentro de outro mantém os raios concêntricos com o pai.
Da direita para a esquerda
O alinhamento, os cantos unidos, as caudas e as reações são espelhados em layouts da direita para a esquerda.
- Os balões são contêineres simples. Envolva uma conversa em uma lista ou em uma região
role="log"se novas mensagens devem ser anunciadas. - Linhas de reações só com emoji precisam de
role="img"e de umaria-labelque descreva as reações. - Conteúdo interativo renderizado como botão ou link ganha um anel de foco que segue os cantos do balão.
Cada parte renderiza um <div> por padrão e aceita seus atributos, além de uma prop render para trocar o elemento.
| Prop | Tipo | Padrão |
|---|---|---|
variant | "default" | "secondary" | "muted" | "tinted" | "outline" | "ghost" | "destructive" | "default" |
align | "start" | "end" | "start" |
shapeHerdado de BubbleGroup quando não definido. | "uniform" | "joined" | "tail" | "joined" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="bubble" | Seleciona os balões no CSS. |
data-variant | A variante atual. |
data-align | O alinhamento atual. |
data-shape | A forma resolvida. |
--bubble-bg | A cor da superfície, também usada pela cauda. |
--bubble-fg | A cor do texto. |
--bubble-border | A cor do anel. |
--bubble-radius | O raio dos cantos. |
--bubble-radius-joined | O raio mais fechado usado entre balões agrupados. |
--bubble-accent | Cor dos ícones dentro do conteúdo. Definida por destructive. |
| Prop | Tipo | Padrão |
|---|---|---|
renderRenderize um <button> ou <a> para torná-lo interativo. | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="bubble-content" | Seleciona a superfície do balão no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
shapeAplica-se a todo balão dentro do grupo. | "uniform" | "joined" | "tail" | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="bubble-group" | Selecione grupos no CSS. |
data-shape | A forma do grupo, quando definida. |
| Prop | Tipo | Padrão |
|---|---|---|
side | "top" | "bottom" | "bottom" |
align | "start" | "end" | "end" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="bubble-reactions" | Seleciona as linhas de reações no CSS. |
data-side | O lado atual. |
data-align | O alinhamento atual. |
- 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.
- 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.
- MessageUma linha de mensagem de chat com avatar, nome, balões e status, em que as novas mensagens surgem do lado do remetente.
- Message scrollerUma á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.
Usado em blocos
Blocos que se baseiam em Bubble.
- 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 SidebarA barra lateral de um app de chat. Logo, busca e Novo chat no topo, seus próprios links abaixo, chats fixados, projetos que se expandem para mostrar seus chats, recentes agrupados por dia e linhas com menus de hover e de clique direito, renomeação inline, exclusão com desfazer e estados de resposta ao vivo.
- 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.