Event Card
Em andamentoCartão de evento — congresso, live, encontro: imagem, a etiqueta do tipo (ou "Ao vivo agora", ou encerrado), data e duração, título, palestrante, descrição e a chamada, que muda com o estado: "Saiba mais", "Assistir agora" ou "Ver gravação". Sobre o Card: o link é o título, estendido sobre o cartão (E68).
- Função
- Eventos
- Também chamado de
- cartão de evento, card de evento, live, webinar
- Mora em
- app/components/organisms/EventCard.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 grades e listas de eventos, na página de eventos e em destaques da página inicial.
Faça
- Enquanto os dados chegam, mostre o
EventCardEsqueleto(E157) — um por cartão esperado, dentro de umEsqueletoGrupo rotulo="Carregando eventos"—, e troque o grupo inteiro pelos cartões quando chegarem. - Passe
status="live"só durante a transmissão, e"closed"quando houver gravação — o tipo só aceitalive,closedeopen(E68). - Use
externalquando o link sair do site: abre em outra aba e o link avisa. - Passe
dateem formato que oDateentenda (ISO): o EventDate formata em pt-BR.
Evite
- Pôr outro link ou botão dentro do cartão: a área do link do título o cobre.
status="live"num evento que ainda não começou.
Quando não usar. Para o destaque de topo da página de eventos, com slides, use o HeroCarousel. Para a programação de um evento, o EventSchedule. Para curso, o CourseCard.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Cartão — O Card `interactive` como `<article>` (E68).
- Imagem — Decorativa (`alt=""`, E68 — repetia o título); aproxima no hover, com movimento liberado.
- Etiqueta — Uma Tag: o tipo (`default`), "Ao vivo agora" (`live`) ou o tipo em cinza (`closed`).
- Data — O EventDate (E68): calendário, a data num `<time>` e a duração.
- Título — `h3` de até duas linhas, com o `CardLink`.
- Palestrante e descrição — O EventSpeaker (E68) e a descrição, de até duas linhas.
- Chamada — Texto com seta, preso embaixo, `aria-hidden`.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Carregando | O EventCardEsqueleto (E157): a mesma superfície e proporção, com as linhas e a imagem em esqueleto, decorativo (aria-hidden); o grupo diz "Carregando eventos" uma vez. Medido na ficha: a mesma largura e menos de 20% de diferença de altura. |
| Próximo | Etiqueta vermelha com o tipo; chamada "Saiba mais". |
| Ao vivo | status="live": etiqueta "Ao vivo agora" com o ponto pulsante; chamada "Assistir agora". |
| Encerrado | status="closed": etiqueta cinza, chamada "Ver gravação" e, no hover, um véu com o ícone de play. |
| Foco | O anel de foco do cartão, só no teclado. |
| Hover | Sombra maior, imagem aproxima, título vermelho. |
Comportamento
| Situação | O que acontece |
|---|---|
| Sem `link` | Leva a /eventos/live/<id>. |
| `external` | Abre em outra aba (rel="noopener noreferrer") e o nome do link termina em "(abre em nova aba)" — conferido no teste da ficha. |
| Data que o `Date` não entende | O EventDate mostra o texto como veio. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { EventCard } from '@/app/components/organisms/EventCard';
<EventCard id={…} title={…} description={…} date={…} image={…} type={…}>…</EventCard>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
id | number | string | — | sim | — |
title | string | — | sim | — |
description | string | — | sim | — |
date | string | — | sim | — |
image | string | — | sim | — |
type | string | — | sim | — |
link | string | — | não | Destino. Padrão /eventos/live/<id>. |
external | boolean | false | não | O destino é de fora: abre em outra aba, e o link avisa (E68). |
speaker | string | — | não | — |
duration | string | — | não | — |
status | 'live' | 'closed' | 'open' | 'open' | não | Tipado desde a E68: com string, status="Live" ou "encerrado" passava sem erro, e o cartão caía em silêncio no visual de evento aberto. |
Aceita também: Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id'>.
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 |
--foreground | #1A1A1A | text-ink |
--ink-inverse | #FAFAFA | text-ink-inverse |
--muted-foreground | #595959 | text-muted-foreground |
--primary | #D42B2B | text-primary |
--primary-dark | #A81E1E | text-primary-dark |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Uma parada por cartão: o link do título — conferido no teste da ficha. |
| Enter | Abre o evento (em outra aba, se `external`). |
Leitor de tela
O que é anunciado, e por quê.
- O nome do link é o título (mais o aviso de nova aba, no externo) — conferido no teste da ficha. Antes era o texto inteiro do cartão, com o título duas vezes.
- A etiqueta "Ao vivo agora" diz o estado em texto; o ponto pulsante e o véu de play são decorativos.
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/organisms/EventCard.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).