Link
Em andamentoO link de texto — num parágrafo, numa lista de referências, no pé de um cartão —, sempre sublinhado. Interno vai pelo roteador do Next; externo, mailto: e tel:, por <a>. Com novaAba, avisa que abre em outra aba. Com previa (E155), mostra um cartão com o destino no ponteiro e no foco.
- Função
- Navegação e estrutura
- Também chamado de
- link, hiperlink, âncora, link de texto, hover preview, prévia de link, cartão de prévia
- Mora em
- app/components/atoms/Link.tsx
- Última mudança
- 2026-10-01
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 **navegar** a partir de um texto: o edital no meio de um parágrafo, o e-mail da secretaria, "Ver todos os cursos" no fim de uma lista.
Faça
- Escreva o destino no texto do link: "o edital completo", nunca "clique aqui".
- Use
novaAbasó para fora do site, e com parcimônia: sair da aba é decisão de quem lê. - Use
variant="inverso"sobre fundo escuro, esutilem texto corrido cinza. - Use
previa={{ titulo, descricao, imagem }}(E155) quando o destino não é óbvio pelo texto — um curso citado num parágrafo, um documento externo. O título e a descrição dizem o que há do outro lado; a imagem é decorativa. - Escreva a prévia como o destino se apresenta (E155b): o título é o nome da página de destino, como ela o mostra; a descrição é uma frase, de até ~160 caracteres, dizendo o que a pessoa encontra lá. O cartão tem formato fixo — a descrição para em 3 linhas —, e o texto passa inteiro para o leitor de tela.
Evite
- Tirar o sublinhado: no meio do texto, a cor sozinha não separa o link para quem não distingue o vermelho (WCAG 1.4.1).
- Link sem destino (
href="#") para disparar ação: aí é Button. - Dois links seguidos para o mesmo lugar.
- Pôr na prévia o que a pessoa precisa saber para decidir: no celular não há ponteiro, e ela só aparece no foco. O essencial vai no texto do link.
- Prévia em todo link de um texto: vira ruído. Uma ou duas por bloco, nos destinos que pedem.
- Esperar que a prévia se preencha sozinha a partir do destino: ela não lê a página do outro lado (decisão do Marcelo, 2026-10-01, E155b) — buscar o Open Graph pelo servidor abria risco de segurança (SSRF), de página ou build travados por destino lento ou fora do ar, e de texto e imagem que ninguém revisou.
Quando não usar. Para agir no lugar (enviar, abrir, fechar), use o Button. Para um link com cara de botão ("Inscrever-se"), o Button com href. Para o caminho de páginas, o Breadcrumb.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Texto — Peso médio, sublinhado de 1px afastado 4px, na cor da variante.
- Ícone de nova aba — Com `novaAba`: `ExternalLink` de 12px, decorativo, e "(abre em nova aba)" só para o leitor.
- Prévia — Com `previa` (E155): cartão `--card` de 288px (até a largura da tela menos 32px), borda e sombra, embaixo do link: a imagem 16:9 (decorativa, `alt=""`), o título, a descrição e, para link de fora, o endereç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 | padrao: --primary; sutil: --ink; inverso: --ink-inverse. |
| Hover | O sublinhado engrossa para 2px, e a cor escurece (ou, no sutil, fica vermelha). |
| Foco | O anel de foco (anel-de-foco; no inverso, o inverso), só no teclado. |
| Prévia aberta | O cartão embaixo do link (em cima, se embaixo não couber; empurrado para dentro da tela, se passaria da borda). Abre no ponteiro depois de 400ms e no foco na hora. Formato fixo (E155b): imagem 16:9, título que quebra linha sem corte, descrição em até 3 linhas — testado na ficha com texto longo. |
Comportamento
| Situação | O que acontece |
|---|---|
| Endereço interno (`/cursos`) | Vai pelo next/link: pré-carrega e não recarrega a página. |
| Externo, `mailto:` ou `tel:` | Um <a> comum. |
| Com `novaAba` | target="_blank" e rel="noopener noreferrer", e o aviso para quem ouve — conferido no teste da ficha. |
| Ponteiro do link para a prévia | A prévia continua aberta enquanto o ponteiro vai do link ao cartão, e fecha quando ele deixa a região do link e do cartão — medido com o mouse no navegador, a 1280 e a 320px (E155, SC 1.4.13). |
| Prévia com imagem | A imagem só carrega quando a prévia abre: nada vem de outro site antes de a pessoa pedir. |
| Aviso fora do Link | O pedaço AvisoDeNovaAba (ícone e "(abre em nova aba)") é exportado para links que não usam o Link — o Footer e os menus da Navbar (E71). |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Link } from '@/app/components/atoms/Link';
<Link href={…}>…</Link>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
variant | 'padrao' | 'sutil' | 'inverso' | 'padrao' | não | Variante do cva. |
href | string | — | sim | — |
novaAba | boolean | false | não | Abre em outra aba (E67). Ganha o ícone e o aviso "(abre em nova aba)" para quem ouve, e o rel="noopener noreferrer". Use pouco: tirar a pessoa da aba em que ela está é decisão dela. |
previa | PreviaDoLink | — | não | Prévia do destino (E155, o "hover preview" da revisão 4): um cartão com a imagem, o título e a descrição do que está do outro lado, no ponteiro e no foco. Complementa o link — o nome continua sendo o texto dele —, e não tem nada clicável dentro. No celular, sem ponteiro, aparece no foco. |
Aceita também: Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| Sublinhado | 1px (2px no hover), afastado 4px | decoration-1 underline-offset-4 |
| Ícone de nova aba | 12px | Icone tamanho="xs" |
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 |
|---|---|---|
--border | #E5E5E5 | border-border |
--card | #FFFFFF | bg-card |
--foreground | #1A1A1A | text-ink |
--ink-inverse | #FAFAFA | text-ink-inverse |
--ink-inverse-muted | #C7C7C7 | text-ink-inverse-muted |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
--primary | #D42B2B | text-primary |
--primary-dark | #A81E1E | text-primary-dark |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Leva o foco ao link — conferido no teste da ficha. |
| Enter | Segue o link (Espaço não: é link, não botão). |
| Esc | Com a prévia aberta, fecha a prévia e o foco fica no link — conferido no teste da ficha. |
Leitor de tela
O que é anunciado, e por quê.
- O nome é o texto do link; com
novaAba, "Portal do MEC (abre em nova aba)" — conferido no teste da ficha. - Não tem o alvo de 44px: é texto corrido, a mesma exceção do
Button variant="link". - A prévia descreve o link (
aria-describedby, como o Tooltip): o leitor diz o nome do link e depois o título e a descrição — conferido no teste da ficha. Não tem nada clicável dentro.
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/atoms/Link.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.
7b99f032026-10-01E155b: Link com prévia — formato fixo, e a prévia não lê o destino251416b2026-10-01E159: Testimonials — o vídeo toca dentro do cartão, YouTube e Vimeo
O histórico completo está no GitHub (abre em outra aba).