Course Card
Em andamentoCartão de curso do catálogo: imagem, categoria e selos ("Em breve", "Lista de espera", destaque), modalidade e carga horária, título, descrição, preço opcional (com o cheio riscado) e a chamada "Ver detalhes do curso". Sobre o Card: o link é o título, estendido sobre o cartão inteiro (E68).
- Função
- Cursos e matrícula
- Também chamado de
- cartão de curso, card de curso, vitrine de curso
- Mora em
- app/components/molecules/CourseCard.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 do catálogo de cursos, com os dados de um `CatalogCourseDTO`.
Faça
- Enquanto os dados chegam, mostre o
CourseCardEsqueleto(E157) — um por cartão esperado, dentro de umEsqueletoGrupo rotulo="Carregando cursos"—, e troque o grupo inteiro pelos cartões quando chegarem. - Passe o curso como vem do serviço (
CatalogCourseDTO): a opção principal, a categoria e o estado saem dele. - Use
precosó quando o valor for real; comoriginal, o cheio aparece riscado e o leitor ouve "Preço original" e "Preço com desconto". - Mantenha a mesma
imageAspectRatioem todos os cartões de uma grade. - Troque o
hrefquando o site clonado tiver outras rotas (padrão/curso/<slug>, E68).
Evite
- Envolver o cartão em outro link: o título já leva ao curso, e o cartão inteiro é a área dele.
- Pôr outro controle dentro do cartão sem
relative z-(--z-elevado): a área do link o cobre.
Quando não usar. Para a vitrine de destaque da página inicial, com setas, use o TopCourses. Para as turmas de um curso, o TurmaCard. Para um cartão genérico, o Card.
Nota de uso
Curso inativo deixa de ser link. Antes virava <Link href="#">: recebia foco, anunciava-se como link e não levava a lugar nenhum — uma parada morta repetida a cada cartão inativo da grade.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Cartão — O Card `interactive` como `<article>` (E68): `--card`, cantos `rounded-superficie`, borda e sombra do sistema.
- Imagem — O `CardMedia`, decorativo (`alt=""`), na proporção escolhida; aproxima no hover, só com movimento liberado.
- Selos sobre a foto — A categoria (Tag `vidro`, cortada no limite do cartão), "Em breve" (`indisponivel`), "Lista de espera" (`aviso`) e o destaque (`destaque`) — a Tag do sistema desde a E64.
- Informações — Modalidade com ícone e carga horária, em Tag `neutro` (E64).
- Título — `h3` de até duas linhas, com o `CardLink` dentro — o único link do cartão.
- Descrição — Até três linhas.
- Preço — Com `preco`: rótulo ("Investimento"), o cheio riscado, o atual e as parcelas.
- Chamada — "Ver detalhes do curso" (ou "Avise-me", na lista de espera): texto com aparência de botão verde, `aria-hidden` — quem leva é o link do título.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Carregando | O CourseCardEsqueleto (E157): a mesma superfície e proporção, com as linhas e a imagem em esqueleto, decorativo (aria-hidden); o grupo diz "Carregando cursos" uma vez. Medido na ficha: a mesma largura e menos de 20% de diferença de altura. |
| Aberto | Link para o href; no hover, sobe 4px (com movimento liberado), a sombra cresce e o título fica vermelho. |
| Lista de espera | aggregateStatus="closed": selo "Lista de espera" e chamada "Avise-me". |
| Em breve | aggregateStatus="inactive": selo "Em breve", 80% de opacidade, sem hover, sem preço nem chamada — e sem link. |
| Foco | O anel de foco do cartão inteiro, só no teclado (has-focus-visible, E68). |
Comportamento
| Situação | O que acontece |
|---|---|
| Clique em qualquer lugar do cartão | Leva ao curso: a área do link do título cobre o cartão. |
| Curso inativo | Sem link: não recebe foco nem se anuncia como link — antes era um href="#" morto. O ref chega à raiz nos dois casos (E68). |
| Várias opções no curso | A principal é a primeira ativa ou em espera; sem nenhuma, a primeira. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import CourseCard from '@/app/components/molecules/CourseCard';
<CourseCard course={…}>…</CourseCard>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
course | CatalogCourseDTO | — | sim | — |
imageAspectRatio | '1:1' | '4:3' | '3:4' | '16:9' | '9:16' | '16:9' | não | — |
preco | PrecoDoCurso | — | não | — |
href | string | — | não | Destino do cartão (E68). Padrão /curso/<slug> — troque se o site clonado tiver outras rotas. |
Aceita também: Omit<React.HTMLAttributes<HTMLElement>, 'title'>.
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 |
--muted-foreground | #595959 | text-muted-foreground |
--primary | #D42B2B | text-primary |
--secondary | #0B8434 | bg-secondary |
--secondary-dark | #0D6B2E | bg-secondary-dark |
--secondary-foreground | #FFFFFF | text-secondary-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Uma parada por cartão aberto: o link do título — conferido no teste da ficha (E68; eram duas, o link e o botão de dentro). O cartão "Em breve" não recebe foco. |
| Enter | No link, abre a página do curso. |
Leitor de tela
O que é anunciado, e por quê.
- O nome do link é o título do curso — conferido no teste da ficha. Antes era o texto inteiro do cartão.
- O preço riscado diz, por escrito, "Preço original" e "Preço com desconto": o traço não é anunciado.
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/CourseCard.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).