Blog Card
Em andamentoCartão de post do blog, em dois desenhos: o padrão (capa, etiqueta, data, título, resumo e autor com foto) e o de destaque (size="lg", capa larga com o título por cima, a etiqueta de destaque e o tempo de leitura). Nos dois, o link é o título, estendido sobre o cartão (E68).
- Função
- Institucional
- Também chamado de
- cartão de post, card de blog, artigo
- Mora em
- app/components/molecules/BlogCard.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
Em listas e grades do blog, com os dados de um `BlogPost`; o destaque, para o post principal da página.
Faça
- Enquanto os dados chegam, mostre o
BlogCardEsqueleto(E157) — um por cartão esperado, dentro de umEsqueletoGrupo rotulo="Carregando publicações"—, e troque o grupo inteiro pelos cartões quando chegarem. - Passe
formatDatepara a data ficar legível ("12 de outubro"): sem ele, sai como veio. - Use
size="lg"em um post só por página — o título dele éh2—, e troque a etiqueta comdestaque("Mais lido"). - Troque o
hrefquando o site clonado tiver outras rotas (padrão/blog/<id>). - Dê
readTimequando souber: aparece no destaque. - Passe
href={null}quando a publicação não tiver página: o cartão só informa, sem link (E77) — é o que o Blog faz.
Evite
- Dois destaques na mesma página.
- Pôr outro link dentro do cartão: a área do link do título o cobre.
Quando não usar. Para a vitrine fixa da página inicial, o Blog já existe (sem dados). Para eventos, o EventCard; para cursos, o CourseCard.
Nota de uso
A variante grande usava <h1> dentro de um cartão, o que quebra a hierarquia de qualquer página que mostre mais de um. Hoje o nível é o do cartão.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Capa — Imagem decorativa (`alt=""`); não é mais link (E68).
- Etiqueta e data — A primeira tag do post (Tag `outline`, ou "Artigo") e a data num `<time>`.
- Título — No padrão, `h3`; no destaque, `h2` sobre a capa. Os dois com o `CardLink`.
- Resumo — Até três linhas; no destaque, só a partir de 768px. Fora do nome do link.
- Autor — No padrão: o PessoaResumo (E72) — Avatar pequeno, o nome e "Autoria".
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Carregando | O BlogCardEsqueleto (E157): a mesma superfície e proporção, com as linhas e a imagem em esqueleto, decorativo (aria-hidden); o grupo diz "Carregando publicações" uma vez. Medido na ficha: a mesma largura e menos de 20% de diferença de altura. |
| Padrão | md: coluna com capa 16:10. O sm saiu na E68 — era igual ao md. |
| Destaque | lg: capa 4:3 (21:9 a partir de 768px) com degradê escuro, a etiqueta (destaque, padrão "Em destaque") e o título grande em branco. |
| Hover | A capa aproxima (com movimento liberado); no padrão, o título fica vermelho. |
| Foco | O anel de foco no cartão inteiro, só no teclado — nos dois tamanhos. |
Comportamento
| Situação | O que acontece |
|---|---|
| Clique em qualquer lugar do cartão | Leva ao href (padrão /blog/<id>). |
| Post sem tags | A etiqueta diz "Artigo". |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { BlogCard } from '@/app/components/molecules/BlogCard';
<BlogCard post={…}>…</BlogCard>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
post | BlogPost | — | sim | — |
size | 'md' | 'lg' | 'md' | não | md na grade; lg em destaque, com a capa por trás do texto. O sm saiu na E68 (decisão com padrão): era igual ao md e ninguém o usava — uma prop morta publicada no catálogo. |
formatDate | (date: string) => string | (d) => d | não | — |
href | string | null | — | não | Destino (E68). Padrão /blog/<id>. null (E77) = sem link: o cartão só informa — é o que o Blog faz com a publicação que vem sem endereço. |
destaque | string | 'Em destaque' | não | Etiqueta do lg (E68): "Mais lido", "Novo". Padrão "Em destaque". |
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 |
|---|---|---|
--foreground | #1A1A1A | from-ink/80text-inkvia-ink/20 |
--border | #E5E5E5 | border-bordertext-border |
--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 |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Uma parada por cartão, nos dois tamanhos: o link do título — conferido no teste da ficha. |
| Enter | Abre o post. |
Leitor de tela
O que é anunciado, e por quê.
- O nome do link é o título, nos dois tamanhos — conferido no teste da ficha. No destaque era a etiqueta, o título, o resumo e a data.
- A capa é decorativa: o título está em texto logo ao lado.
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/BlogCard.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.
251416b2026-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).