Card
Em andamentoA superfície que agrupa um conteúdo, com partes que cuidam do próprio espaço — CardMedia (imagem de ponta a ponta), CardHeader, CardTitle, CardDescription, CardContent e CardFooter — em quatro tratamentos, um deles para o cartão clicável inteiro.
- Função
- Conteúdo
- Também chamado de
- cartão, card, bloco, caixa
- Mora em
- app/components/atoms/Card.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
Para agrupar informação sobre uma coisa só — um curso, um post, uma estatística — que se repete numa grade.
Faça
- Monte com as partes: cada uma já tem o seu preenchimento.
- Use
CardMediapara imagem de ponta a ponta, com a proporção (16/9,4/3,1/1oulivre). - Acerte o nível do título com
asnoCardTitle(h3por padrão). - Para cartão clicável inteiro,
variant="interactive"com oCardLinkno título (E68): um link só, estendido sobre o cartão. - Use
as="article"quando o cartão é um item que vale sozinho numa grade (curso, notícia, evento);lidentro de lista.
Evite
- Somar preenchimento no cartão e nas partes ao mesmo tempo: o espaço dobra.
- O cartão inteiro como link com outros controles dentro — são interativos aninhados.
interactivesem link dentro: o hover promete um clique que não existe.
Quando não usar. Para curso, post ou evento, use a peça pronta (CourseCard, BlogCard, EventCard). Para um número com rótulo, o StatCard. Para separar seções da página, espaço e título (SectionTitle), não caixas.
Nota de uso
O Card é só a superfície; cada parte cuida do próprio espaço (CardHeader, CardContent, CardFooter com p-6). Não some padding no cartão e no conteúdo ao mesmo tempo — era assim que o espaço dobrava. Para imagem de ponta a ponta, use CardMedia. Para cartão clicável inteiro, variant="interactive" com o `CardLink` no título (E68): um link só, estendido sobre o cartão, com o título como nome — nunca o cartão inteiro como link com outros controles dentro. O anel acende só no foco por teclado. as="article" para item de grade. O CardTitle aceita as para acertar o nível do cabeçalho.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Cartão — `--card`, cantos `rounded-xl`, borda e sombra conforme a variante.
- Mídia — `CardMedia`: imagem de ponta a ponta na proporção escolhida, fundo `--muted`.
- Cabeçalho — `CardHeader`: título (`CardTitle`) e descrição (`CardDescription`), `p-6 pb-0`.
- Conteúdo — `CardContent`, `p-6`.
- Rodapé — `CardFooter`: preso embaixo (`mt-auto`), com borda em cima.
- Link — `CardLink` (E68): o link do título, com `after:absolute after:inset-0` cobrindo o cartão; `novaAba` avisa a outra aba.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Padrão | default: borda --border e sombra leve. |
| Elevado | elevated: sombra grande. |
| Contorno | outline: borda --border-interactive, sem sombra. |
| Interativo | interactive: relative; no hover, borda de controle e sombra maior; com o foco por teclado no link de dentro, o anel de foco em volta do cartão (has-focus-visible, E68 — o focus-within acendia também no clique). |
Comportamento
| Situação | O que acontece |
|---|---|
| Grade de cartões com alturas diferentes | O CardFooter fica colado embaixo (mt-auto), alinhando os rodapés. |
| Foco por teclado no link de dentro (`interactive`) | O cartão inteiro ganha o anel de foco; no clique de mouse, não. |
| Clique em qualquer lugar do cartão clicável | Cai no CardLink — conferido no teste da ficha (um clique na descrição chega ao link). |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Card } from '@/app/components/atoms/Card';
<Card>…</Card>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
variant | 'default' | 'elevated' | 'outline' | 'interactive' | 'default' | não | Variante do cva. |
as | 'div' | 'article' | 'section' | 'li' | 'div' | não | O elemento da raiz (E68). article quando o cartão é um item que vale sozinho — um curso, uma notícia, um evento numa grade —; li dentro de uma lista. Padrão div. |
Aceita também: React.HTMLAttributes<HTMLElement>.
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 |
--border-interactive | #8C8C8C | border-border-interactive |
--card | #FFFFFF | bg-card |
--card-foreground | #1A1A1A | text-card-foreground |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | No cartão clicável, uma parada: o `CardLink` do título, e o anel acende no cartão inteiro — conferido no teste da ficha. Cartão sem link não recebe foco. |
| Enter | Segue o link do cartão. |
Leitor de tela
O que é anunciado, e por quê.
- O Card é um
<div>sem papel: quem dá estrutura é o título (CardTitle, um cabeçalho). - No cartão clicável, o nome do link é o que o leitor diz — faça dele o título, não "Saiba mais".
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/Card.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).