Display
Accordion
Pilha vertical de seções expansíveis, ancorada em Radix Accordion.
Overview
Accordion é uma pilha vertical de seções expansíveis. Use quando há
várias perguntas/blocos relacionados e o leitor quer pular entre
eles sem trocar de página — FAQs, configurações em grupos,
breakdowns de release notes.
A diferença em relação a Tabs é estrutural: Accordion preserva contexto vertical (todas as seções continuam visíveis no scroll), Tabs trocam o painel inteiro. Quando os irmãos precisam continuar visíveis, Accordion vence.
Preview
FAQ com type="single" + collapsible.
Anatomy
<Accordion type="single" | "multiple">
└─ <AccordionItem value="x">
├─ <AccordionTrigger> ← header clicável + chevron rotativo
└─ <AccordionContent> ← seção animada (open/close)
</Accordion>Usage
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger
} from "@kalvner/kds/display/accordion";
export function Faq() {
return (
<Accordion type="single" collapsible>
<AccordionItem value="q1">
<AccordionTrigger>Pergunta?</AccordionTrigger>
<AccordionContent>Resposta.</AccordionContent>
</AccordionItem>
</Accordion>
);
}Props
Accordion (Root)
| Prop | Tipo | Default | Descrição |
|---|---|---|---|
type | 'single' | 'multiple' | — | Único ou múltiplos itens abertos. |
collapsible | boolean | false | (single) permite fechar tudo. |
value / defaultValue | string | string[] | — | Item(s) aberto(s). |
onValueChange | (v) => void | — | Callback de mudança. |
disabled | boolean | false | Bloqueia toda a árvore. |
AccordionItem · AccordionTrigger · AccordionContent
| Prop | Tipo | Default | Descrição |
|---|---|---|---|
value (Item) | string | — | Identificador único. |
disabled (Item) | boolean | false | Bloqueia este item. |
className | string | — | Tailwind / overrides. |
Subcomponents
AccordionItem— wrapper de um par trigger + content; carrega ovalueque identifica o item.AccordionTrigger— header clicável; o chevron embutido rotaciona nodata-state=open.AccordionContent— região revelada; animada viadata-[state=closed]:animate-accordion-upeaccordion-down.
Variants
Type · Single + collapsible
FAQ — uma pergunta de cada vez, todas podem fechar.
Type · Multiple
Release notes — várias seções abertas em paralelo.
Hidratação 30% mais rápida.
States
| Estado | Comportamento |
|---|---|
data-state=closed | Trigger sem fundo ativo, content display: none. |
data-state=open | Trigger com fundo accent, content animado para baixo. |
disabled | Item ignora cliques e foco; opacidade 50%. |
Composition
Accordion combina bem com Card (cada item dentro de um cartão para hierarquia visual mais forte) ou Sidebar Section (grupos colapsáveis na navegação lateral). Não aninhe além de 2 níveis — vira caça ao tesouro.
When to use
- FAQ com 5+ perguntas relacionadas.
- Configurações agrupadas (Conta, Faturamento, Notificações).
- Release notes ou changelogs por versão.
- Filtros laterais com seções colapsáveis.
When not to use
- Quando há um único bloco que expande — use Collapsible.
- Quando trocar a seção significa trocar todo o painel — use Tabs.
- Para conteúdo crítico que precisa estar sempre visível — Accordion esconde por padrão.
Best practices
- Headers descrevem o conteúdo, não a ação ("O que é o KDS?", não "Clique para expandir").
- Em FAQ, prefira
type="single" collapsible— só uma resposta visível evita parede de texto. - O primeiro item pode vir aberto (
defaultValue="item-1") quando há uma resposta dominante. - Não esconda CTAs primários atrás de Accordion. Se o usuário precisa vê-lo, mostre fora.
Accessibility
| Concern | Comportamento |
|---|---|
| Roles | Radix gera region por content + button no trigger com aria-expanded. |
| Keyboard | Space/Enter alterna; ↑/↓ navegam entre triggers. |
| Focus | Trigger tem focus-visible:ring-[3px] (3px ring). |
| Screen reader | Anuncia "expandido" / "recolhido" no toggle. |
Related
- Collapsible — primitivo subjacente, uma única seção.
- Tabs — quando trocar implica painel inteiro.
- Sidebar — usa Collapsible para grupos navegáveis.