Collapsible
Região expansível de seção única. O bloco de construção mínimo para toggles de mostrar-mais e disclosures inline.
Visão geral
Collapsible é o primitivo de disclosure mais simples: um trigger, um painel, um estado aberto/fechado. Três partes - Collapsible (Root), CollapsibleTrigger, CollapsibleContent - envolvem o Radix Collapsible.
Use o Collapsible quando você tem uma coisa que expande: o toggle "mais detalhes" de um card, o expand/collapse de um grupo na sidebar, um disclosure inline dentro de um texto longo. Quando você tem múltiplas seções coordenadas que compartilham navegação por teclado e a invariante de um-aberto, use Accordion - o Accordion é construído sobre os mesmos primitivos, mas coordena um grupo.
Preview
'use client';import { Collapsible, CollapsibleContent, CollapsibleTrigger,} from '@gremorie/rx-display';import { Button } from '@gremorie/rx-forms';import { ChevronDown } from 'lucide-react';import { useState } from 'react';export function CollapsiblePreview() { const [open, setOpen] = useState(false); return ( <Collapsible open={open} onOpenChange={setOpen} className="w-full max-w-md"> <CollapsibleTrigger asChild> <Button variant="outline" className="w-full justify-between"> What's inside Gremorie? <ChevronDown className={`size-4 transition-transform ${open ? 'rotate-180' : ''}`} /> </Button> </CollapsibleTrigger> <CollapsibleContent className="mt-2 rounded-md border p-4 text-sm"> 100 primitives across 9 React packages and 4 Angular packages, plus the token engine, registry, and MCP handler. </CollapsibleContent> </Collapsible> );}Anatomia
Collapsible the Radix Root (holds open / onOpenChange)
├─ CollapsibleTrigger the toggle (pass asChild to use your own button)
└─ CollapsibleContent the region revealed when openInstalação
bash npx gremorie@latest add rx-collapsible bash pnpm dlx gremorie@latest add rx-collapsible
bash yarn dlx gremorie@latest add rx-collapsible
bash bunx --bun gremorie@latest add rx-collapsible
Uso
import {
Collapsible,
CollapsibleTrigger,
CollapsibleContent,
} from "@gremorie/rx-display";
import { Button } from "@gremorie/rx-forms";
export function Example() {
return (
<Collapsible>
<CollapsibleTrigger asChild>
<Button variant="outline">Toggle details</Button>
</CollapsibleTrigger>
<CollapsibleContent className="mt-2 rounded-md border p-4 text-sm">
Hidden content revealed when the trigger fires.
</CollapsibleContent>
</Collapsible>
);
}A edição Angular deste componente hoje é distribuída a partir do source (veja o side-by-side no workbench); sua entrada no registry vem a seguir.
API
<Collapsible>
Envolve o Collapsible.Root do Radix.
| Prop | Type | Default | Description |
|---|---|---|---|
open | boolean | - | Estado aberto controlado. |
defaultOpen | boolean | false | Default não controlado. |
onOpenChange | (open: boolean) => void | - | Dispara quando o estado aberto muda. |
disabled | boolean | false | Impede o trigger de disparar. |
<CollapsibleTrigger>
O elemento clicável que alterna o painel. Envolve o Collapsible.Trigger do Radix.
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Quando true, renderiza o filho imediato como o trigger (padrão típico: envolver um Button). |
Quando asChild é usado, o filho recebe aria-expanded, aria-controls e o handler de clique.
<CollapsibleContent>
O painel que abre e fecha. Envolve o Collapsible.Content do Radix. Expõe o atributo data-state="open" \| "closed" para que você possa animar via seu próprio CSS ou keyframes do Tailwind.
O CollapsibleContent do Gremorie não vem com animações padrão - adicione animate-collapsible-down / animate-collapsible-up se quiser o reveal padrão, ou componha o seu próprio com seletores data-[state].
Composição
<Collapsible>detém o estado aberto/fechado.<CollapsibleTrigger>fica dentro - tipicamente envolvendo umButtonviaasChild.<CollapsibleContent>guarda o conteúdo oculto. Estilize como quiser; o Radix definehiddenquando fechado edata-state="open"quando aberto.
O trigger e o conteúdo podem ficar em qualquer profundidade dentro da raiz - o Radix Collapsible coordena via contexto, não pela ordem do DOM.
Variações
Toggle mostrar mais
'use client';import { Collapsible, CollapsibleContent, CollapsibleTrigger,} from '@gremorie/rx-display';import { Button } from '@gremorie/rx-forms';import { ChevronDown } from 'lucide-react';export function CollapsibleOpenPreview() { return ( <Collapsible defaultOpen className="w-full max-w-md"> <CollapsibleTrigger asChild> <Button variant="outline" className="w-full justify-between"> Show full bio <ChevronDown className="size-4 transition-transform data-[state=open]:rotate-180" /> </Button> </CollapsibleTrigger> <CollapsibleContent className="mt-2 rounded-md border p-4 text-sm text-muted-foreground"> Nog is the chief engineer of the Kalvner crew. Implements code, infra, and ships. Backs up before destructive changes. Never commits secrets. </CollapsibleContent> </Collapsible> );}defaultOpen renderiza o painel expandido no mount. O chevron gira em data-[state=open] para que o trigger reflita o estado atual. Remova defaultOpen para começar recolhido.
Aberto controlado
const [open, setOpen] = useState(false);
<Collapsible open={open} onOpenChange={setOpen}>
<CollapsibleTrigger asChild>
<Button>{open ? 'Hide' : 'Show'} advanced settings</Button>
</CollapsibleTrigger>
<CollapsibleContent>
<SettingsPanel />
</CollapsibleContent>
</Collapsible>;Disclosure inline
<p>
Gremorie ships 83 primitives.{' '}
<Collapsible className="inline">
<CollapsibleTrigger>Show breakdown</CollapsibleTrigger>
<CollapsibleContent>
<ul>...</ul>
</CollapsibleContent>
</Collapsible>
</p>Acessibilidade
- ARIA: o trigger recebe
aria-expanded(true/false) earia-controlsapontando para o painel de conteúdo; o painel de conteúdo ficahiddenquando fechado. - Teclado:
SpaceouEnterno trigger alterna o painel. Semântica padrão de<button>ao usarasChildcom umButton. - Foco: o foco permanece no trigger entre as alternâncias. O conteúdo não tem focus-trap - o leitor pode dar Tab por ele quando aberto.
- Animação: use seletores
data-[state=open]edata-[state=closed]para que os reveals respeitemprefers-reduced-motionvia seus próprios keyframes. - Estado desabilitado:
disabled={true}na raiz desabilita o trigger e o remove da ordem de tabulação.