Chat Window
Em andamentoJanela de conversa de aula ao vivo: mensagens (que chegam sozinhas, simuladas, quando ao vivo), um botão para pausar essa chegada e o campo de envio. É um role="log" que anuncia só o que chega.
- Função
- Conteúdo
- Também chamado de
- chat, conversa, bate-papo, chat ao vivo
- Mora em
- app/components/organisms/ChatWindow.tsx
- Última mudança
- 2026-09-30
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Ao lado de uma transmissão ao vivo, dentro de uma tela que traga o título e o botão de fechar.
Faça
- Traga o título e o fechar na tela que monta a janela: ela não tem cabeçalho próprio.
- Mantenha o botão de pausa: conteúdo que se atualiza sozinho precisa de como parar (WCAG 2.2.2).
- Use
isLive={false}quando a transmissão acabou — o campo fica desabilitado e diz por quê.
Evite
- Usar a simulação de mensagens em produção: os nomes e textos são sorteados no componente.
- Tirar o
role="log": sem ele, quem usa leitor de tela não sabe que alguém falou.
Quando não usar. Para um formulário de contato, use o ContactForm. Para uma mensagem do sistema, o Alert.
Nota de uso
Tem controle de pausa para a simulação de mensagens ao vivo, dentro da própria região role="log" — sem ele, quem usa leitor de tela era interrompido a cada 8 segundos sem como parar. Se você for montar um chat, o botão de pausa não é enfeite: é o que a WCAG 2.2.2 exige de conteúdo que se atualiza sozinho.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Mensagens — Região `role="log"` com rolagem própria, fundo `--muted`, e as mensagens numa lista (`ul`, E73).
- Pausa — Só ao vivo: botão "Pausar as mensagens", no topo da região.
- Mensagem — Nome e hora em cima; balão do sistema (vermelho claro), de outros (branco) ou seu (vermelho, à direita).
- Envio — O Input do sistema, redondo, com rótulo escondido, e o Button "Enviar mensagem" no encaixe do fim (E73).
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Ao vivo | isLive (padrão): chega uma mensagem sorteada a cada 8 segundos e o botão de pausa aparece. |
| Pausado | Sem mensagens novas; o botão vira "Retomar as mensagens", com aria-pressed="true". |
| Encerrado | isLive={false}: sem simulação, sem pausa, campo desabilitado ("Chat encerrado"). |
| Fechado | isOpen={false}: a janela sai esmaecendo. |
| Enviar indisponível | Com o campo vazio, o botão de enviar fica aria-disabled (continua focável, o clique não envia); encerrado, fica disabled. |
Comportamento
| Situação | O que acontece |
|---|---|
| Mensagem nova | Rola o contêiner até o fim (E73; o scrollIntoView de antes levava a página junto), suave, ou direto com movimento reduzido; o leitor anuncia só a nova (aria-atomic="false"). |
| Enter no campo com texto | Envia como "Você" e limpa o campo — medido; o foco fica no campo. |
| Enviar pelo botão | Envia, limpa o campo e devolve o foco a ele — medido no teste da ficha. |
| Movimento reduzido no sistema | A simulação já nasce parada (usePausaDeMovimento). |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { ChatWindow } from '@/app/components/organisms/ChatWindow';
<ChatWindow isOpen={…} />Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
isOpen | boolean | — | sim | — |
isLive | boolean | true | não | — |
className | string | — | não | — |
initialMessages | Message[] | [] | não | — |
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Enviar | 44 × 44px (medido) | h-alvo-toque w-alvo-toque |
| Campo | 48px de altura, borda de controle | Input · classNameDoCampo="min-h-12 rounded-full" |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--primary | #D42B2B | bg-primarytext-primary |
--border | #E5E5E5 | border-border |
--border-interactive | #8C8C8C | border-border-interactive |
--card | #FFFFFF | bg-card |
--destructive | #BA0517 | border-destructive/25 |
--destructive-strong | #BA0517 | text-destructive-strong |
--destructive-subtle | #F9EBEC | bg-destructive-subtle |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--primary-foreground | #FFFFFF | text-primary-foreground |
--ring | var(--footer-red)), decisão da revisão 2. Se outra peça precisar
* dele como superfície, o nome vira de papel (ex.: --surface-brand-strong). */
--footer-red: #7D1B1B | ring-ring |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Passa por "Pausar as mensagens" (ao vivo), pelo campo e por "Enviar mensagem" (indisponível com o campo vazio); encerrado, nada recebe foco. |
| EnterEspaço | No botão de pausa, pausa ou retoma — medido. |
| Enter | No campo, envia a mensagem — medido. |
Leitor de tela
O que é anunciado, e por quê.
- A região é
role="log"comaria-live="polite": mensagem de outra pessoa não corta o que está sendo lido. - O botão de pausa fica dentro da região, no topo: quem chega ao log encontra como calá-lo antes da próxima mensagem.
- Cada mensagem é dita como frase — "Maria Silva, às 18:58: Boa noite a todos!" — por um texto
sr-only; o desenho do nome, da hora e do balão éaria-hidden(E73, conferido no teste da ficha).
O que sustenta o estado
Esta peça usa regiaoViva, carrossel. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: regiaoViva, carrossel — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/organisms/ChatWindow.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
0298af82026-09-30E147: fechamento da Entrega 11 — REPORT.md, verificação cross-agent e o gate estático estrito
O histórico completo está no GitHub (abre em outra aba).