Alert
Atom
Alert vive na página. Ele informa, orienta ou evidencia sem interromper o fluxo como um Dialog.
Use Alert quando a informação precisa permanecer visível até ser resolvida, dispensada ou substituída por um estado novo. Para feedback efêmero, use Toast. Para decisão bloqueante, use Dialog ou Alert Dialog.
Exemplos copiáveis
React
React
import * as React from "react"
type AlertTone = "info" | "success" | "warning" | "destructive" | "evidence"
type PulsoAlertProps = React.HTMLAttributes<HTMLDivElement> & {
tone?: AlertTone
title: string
action?: React.ReactNode
}
const toneClass: Record<AlertTone, string> = {
info: "border-[var(--border-strong)] bg-[var(--card)] text-[var(--fg)]",
success: "border-[var(--risk-stable-border)] bg-[var(--risk-stable-bg)] text-[var(--risk-stable-text)]",
warning: "border-[var(--risk-attention-border)] bg-[var(--risk-attention-bg)] text-[var(--risk-attention-text)]",
destructive: "border-[var(--destructive-border)] bg-[var(--destructive-bg)] text-[var(--destructive)]",
evidence: "border-[var(--border)] bg-[var(--muted)] text-[var(--fg)]",
}
export function PulsoAlert({ tone = "info", title, action, children, className, ...props }: PulsoAlertProps) {
const urgent = tone === "destructive" || tone === "warning"
return (
<div
role={urgent ? "alert" : "status"}
className={[
"grid gap-2 rounded-[var(--radius-md)] border p-4 text-sm leading-6",
toneClass[tone],
className,
].filter(Boolean).join(" ")}
{...props}
>
<div className="flex items-start justify-between gap-4">
<strong className="text-sm font-semibold text-[var(--fg-strong)]">{title}</strong>
{action ? <div className="shrink-0">{action}</div> : null}
</div>
{children ? <div className="text-[var(--fg-muted)]">{children}</div> : null}
</div>
)
}<PulsoAlert title="Fonte temporariamente indisponível" tone="warning">
Os dados desta fonte podem estar atrasados. Última sincronização há 18 min.
</PulsoAlert>
<PulsoAlert title="Resumo assistido pela Cris" tone="evidence">
Baseado em 12 fontes verificadas. Confiança moderada; revise antes de escalar.
</PulsoAlert>Alert vs Toast vs Dialog
| Superfície | Persistência | Bloqueia? | Uso |
|---|---|---|---|
Alert | Persistente | Não | Estado relevante dentro da página |
Toast | Efêmero | Não | Feedback curto após ação |
Dialog | Até decisão | Sim | Foco curto e bloqueante |
Alert Dialog | Até confirmação | Sim | Ação destrutiva ou irreversível |
Quando usar
- Estado que precisa permanecer visível.
- Evidência assistida pela Cris que exige revisão.
- Degradação de fonte ou sincronização atrasada.
- Próxima ação clara sem bloquear fluxo.
Quando não usar
- Para feedback efêmero.
- Para decisão bloqueante.
- Para substituir erro inline de campo.
- Para empilhar múltiplos banners competindo pela atenção.
Acessibilidade
- Use
role="alert"para atenção imediata. - Use
role="status"para estado informativo não urgente. - Título nomeia o estado; descrição explica consequência ou próxima ação.
- Não dependa só de cor para severidade.
Regras
- Alert não bloqueia fluxo.
- Use Dialog quando a tarefa precisa parar.
- Use Alert Dialog quando há ação destrutiva ou irreversível.
- Um banner sólido de alta atenção por página, no máximo.
- Alert de evidência precisa apontar origem ou base verificável.
- Alert dispensável não pode esconder problema ainda ativo.
Last updated on