Collapsible Card
Organism
Collapsible Card preserva o resumo visível e permite revelar detalhe sem trocar de superfície.
Use para detalhes técnicos, configurações avançadas, evidências secundárias e logs compactos. Não esconda a consequência principal, risco crítico ou ação obrigatória dentro do conteúdo colapsado.
Exemplos copiáveis
React
React
import * as React from "react"
type PulsoCollapsibleCardProps = {
title: string
description?: string
defaultOpen?: boolean
children: React.ReactNode
}
export function PulsoCollapsibleCard({ title, description, defaultOpen = false, children }: PulsoCollapsibleCardProps) {
const [open, setOpen] = React.useState(defaultOpen)
const contentId = React.useId()
return (
<article className="rounded-[var(--radius-lg)] border border-[var(--border)] bg-[var(--card)]">
<header className="flex items-start justify-between gap-4 p-4">
<div>
<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}
</div>
<button
type="button"
aria-expanded={open}
aria-controls={contentId}
onClick={() => setOpen((current) => !current)}
className="rounded-[var(--radius-sm)] border border-[var(--border-strong)] px-3 py-2 text-sm"
>
{open ? "Ocultar" : "Mostrar"}
</button>
</header>
{open ? <div id={contentId} className="border-t border-[var(--border)] p-4">{children}</div> : null}
</article>
)
}<PulsoCollapsibleCard title="Evidências técnicas" description="Detalhes usados pela Cris para recomendar atenção." defaultOpen>
<p>3 fontes primárias confirmadas e 2 menções em monitoramento.</p>
</PulsoCollapsibleCard>Regras
- Header precisa conter resumo suficiente para decidir abrir ou não.
- Use
aria-expandedearia-controlsno trigger. - Não esconda estados críticos ou ações obrigatórias.
- Preserve motion suave, mas respeite
prefers-reduced-motion.
Last updated on