Card
Organism
Card cria uma unidade de leitura. Ele deve agrupar conteúdo por decisão, não por decoração.
Use Card para métricas, formulários curtos, blocos de configuração, resumos de caso e evidências relacionadas. Um card bom deixa claro: título, contexto, conteúdo principal e ações proporcionais.
Exemplos copiáveis
React
React
import * as React from "react"
type PulsoCardProps = {
title: string
description?: string
children: React.ReactNode
footer?: React.ReactNode
interactive?: boolean
}
export function PulsoCard({ title, description, children, footer, interactive = false }: PulsoCardProps) {
return (
<article
data-interactive={interactive || undefined}
className="rounded-[var(--radius-lg)] border border-[var(--border)] bg-[var(--card)] data-[interactive=true]:transition-[border-color,box-shadow] data-[interactive=true]:duration-[var(--motion-duration-fast)] data-[interactive=true]:hover:border-[var(--border-strong)]"
>
<header className="border-b border-[var(--border)] p-4">
<h3 className="text-base font-semibold text-[var(--fg-strong)]">{title}</h3>
{description ? <p className="mt-1 text-sm text-[var(--fg-muted)]">{description}</p> : null}
</header>
<div className="p-4">{children}</div>
{footer ? <footer className="border-t border-[var(--border)] p-4">{footer}</footer> : null}
</article>
)
}<PulsoCard
title="Configurações de notificação"
description="Canais ativos para alertas de alta prioridade."
footer={<button type="button">Salvar alterações</button>}
>
<p>Email e Slack ativos para risco high e critical.</p>
</PulsoCard>Regras
- Card deve representar uma unidade semântica, normalmente
articleousection. - Não misture ações de pesos diferentes sem alinhamento visual consistente.
- Footer deve conter ações do card, não navegação global.
- Evite cards clicáveis com ações internas conflitantes.
Variantes de contenção
Duas variantes, com papéis distintos (regra consolidada no Crisis Monitor, Issue Crisis-Monitor/Crisis-Monitor#372):
| Variante | Aparência | Quando usar |
|---|---|---|
flat | borda sutil, sem sombra | Card de seção — agrupamento de conteúdo dentro da página (dashboards, abas, listagens) |
default | borda + sombra suave | Conteúdo elevado — dialogs, popovers e destaques que flutuam sobre a página |
Nunca reimplemente contenção de seção com classes ad-hoc por tela: se a página precisa agrupar conteúdo, é flat; se o conteúdo flutua, é default.
Títulos dentro do card
Header de card usa a utility text-heading da escala tipográfica (18px, peso 600). Cabeçalho de seção da página usa text-title; título de página usa text-display. Não recomponha títulos com text-sm font-semibold e afins — as utilities já carregam tamanho, peso e line-height.