Search Bar
Em andamentoFormulário de busca de um campo só, sobre o Input do sistema: lupa à esquerda, "Limpar busca" quando há texto, role="search", rótulo para o leitor, envio pelo Enter e, se pedido, o botão "Buscar".
- Função
- Formulário e ação
- Também chamado de
- busca, campo de busca, pesquisa, search
- Mora em
- app/components/molecules/SearchBar.tsx
- Última mudança
- 2026-09-29
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
Para buscar dentro de uma lista ou de um catálogo, quando a busca é o controle principal da área.
Faça
- Dê um
labelque diga o que se busca ("Buscar cursos") — oplaceholdersome quando se digita. - Trate o
onSubmit: ele recebe o termo, e o componente já impede o recarregamento da página. - Use
botaoEnviarquando quem usa pode não saber que o Enter envia. - Sem estado no pai, use
defaultValue: a busca guarda o próprio texto (E60).
Evite
- Dois SearchBar na mesma página sem nomes diferentes: são duas regiões de busca com o mesmo nome.
Quando não usar. Para a busca de cursos da página inicial, que exige o tipo de curso, o Hero já traz a dele. Para um campo de texto comum num formulário, o Input.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Formulário — `role="search"`, ocupando a largura disponível.
- Lupa — Ícone decorativo, à esquerda, dentro do campo.
- Campo — O Input do sistema, `type="search"`, com a lupa no encaixe de início.
- Limpar busca — Botão de 44×44 que aparece quando há texto.
- Buscar — Com `botaoEnviar`: Button primário ao lado do campo.
- Rótulo — Só para o leitor de tela (`sr-only`), "Buscar" por padrão.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Padrão | Borda --border-interactive, placeholder em cinza. |
| Foco | Borda --border-focus de 2px, por CSS. |
| Com termo | O texto digitado e o botão "Limpar busca" (o X nativo do navegador sai, para não haver dois). |
Comportamento
| Situação | O que acontece |
|---|---|
| Enter | Envia: impede o recarregamento e chama onSubmit — medido: a story mostra "Buscou por: gestao". |
| Esc ou "Limpar busca" com termo | Limpa o campo, chama onLimpar e deixa o foco no campo — conferido no teste da ficha. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { SearchBar } from '@/app/components/molecules/SearchBar';
<SearchBar>…</SearchBar>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
placeholder | string | 'Buscar...' | não | — |
value | string | — | não | Valor controlado. Sem ele, a busca guarda o próprio texto (E60). |
defaultValue | string | — | não | Valor inicial, no uso não controlado. |
onChange | (e: React.ChangeEvent<HTMLInputElement>) => void | — | não | — |
onSubmit | (e: React.FormEvent, termo: string) => void | — | não | Recebe o texto buscado. |
onLimpar | () => void | — | não | Chamado ao limpar (botão ou Esc). No uso controlado, é aqui que o valor volta a vazio. |
label | string | 'Buscar' | não | Nome acessível do campo. O placeholder não serve para isso: some assim que a pessoa começa a digitar, e é justamente aí que ela pode precisar reconferir o que aquele campo é. |
botaoEnviar | boolean | false | não | Mostra o botão "Buscar" ao lado do campo (E60). Sem ele, envia no Enter. |
Aceita também: Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onChange' | 'onSubmit' | 'defaultValue'>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Altura com texto `text-sm` | 46px (medido) | py-3 |
| Espaço da lupa | 40px à esquerda | encaixe `inicio` do Input |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
Nenhum token de cor encontrado no arquivo.
Teclado
| Tecla | Faz |
|---|---|
| Tab | Leva o foco ao campo; com termo, a próxima parada é "Limpar busca"; com `botaoEnviar`, depois "Buscar". |
| Enter | Envia a busca — medido. |
| Esc | Limpa o termo — medido; o foco fica no campo. |
Leitor de tela
O que é anunciado, e por quê.
role="search"faz do formulário um marco de busca: quem usa leitor de tela chega nele pela lista de regiões.- O nome do campo vem do
labelescondido, não doplaceholder.
O que sustenta o estado
Esta peça usa estatico. 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: estatico — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/molecules/SearchBar.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.
fdd10ff2026-09-29ESTADO: E109 concluida, roteiro final fechado; proximo o merge na main
O histórico completo está no GitHub (abre em outra aba).