Przejdź do treści

Collapsible

Stabilny

Pojedynczy obszar, który można pokazać lub ukryć — najmniejsza jednostka stopniowego ujawniania treści.

components/ui · 4 pliki
accordion.tsx

Instalacja

$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/collapsible.json

Użycie

import {
  Collapsible,
  CollapsibleContent,
  CollapsibleTrigger,
} from "@/components/ui/collapsible"
<Collapsible>
  <CollapsibleTrigger render={<Button variant="ghost" size="sm" />}>
    Show details
  </CollapsibleTrigger>
  <CollapsibleContent>Anything you want to reveal.</CollapsibleContent>
</Collapsible>

CollapsibleTrigger renderuje <button> bez stylów. Żeby nadać mu wygląd, przekaż przez render Button z prfct — zachowa on własne style i zyska działanie oraz atrybuty ARIA wyzwalacza.

Przykłady

Pokaż więcej

Odsłoń resztę długiego podsumowania. Kontroluj open, gdy etykieta wyzwalacza ma się zmieniać razem ze stanem — Pokaż wszystkie zmiany zmienia się w Pokaż mniej.

Wydanie 2.4 · 18 września

Szybsze kompilacje, spokojniejsze logi

Kompilacje przyrostowe korzystają teraz z pamięci podręcznej między gałęziami, co skraca medianę czasu kompilacji o 38%. Logi grupują powtarzające się ostrzeżenia, zamiast wypisywać każde z osobna.

Drzewo plików

Komponenty Collapsible bez problemu się zagnieżdżają, dlatego są podstawą drzew. Każdy folder to osobny Collapsible; strzałka odczytuje atrybut data-panel-open swojego wyzwalacza, więc każdy poziom obraca się niezależnie.

layout.tsx
page.tsx
package.json
Drzewo to więcej niż rozwijanie
Po drzewie plików zbudowanym z komponentów Collapsible można poruszać się klawiszem Tab. Pełne drzewo ARIA (role="tree" z nawigacją strzałkami i wyszukiwaniem przez wpisywanie) to inny wzorzec — sięgnij po nie, gdy użytkownicy przeglądają setki węzłów.

Ustawienia zaawansowane

Schowaj rzadko zmieniane opcje pod najważniejszymi polami formularza. Pola pozostają w kolejności DOM dokładnie tam, gdzie mają zastosowanie, więc formularz nadal czyta się od góry do dołu.

Ruch

CollapsibleContent animuje zmierzoną wysokość (--collapsible-panel-height) z czasem trwania base i krzywą przejścia standard, w tym samym takcie płynnie pokazując lub ukrywając treść. Animację wyłączysz, nadpisując przejście w swojej kopii komponentu, a o ograniczony ruch nie musisz się martwić: przy prefers-reduced-motion panel otwiera się natychmiast.

Wytyczne

Kiedy używać

  • Do ukrycia jednego bloku drugorzędnej treści za czytelną etykietą: szczegółów, opcji zaawansowanych, reszty długiej listy.
  • Jako podstawa własnych wzorców rozwijania treści — drzew plików, sekcji paska bocznego, podsumowań z „pokaż więcej”.

Kiedy nie używać

  • Do kilku powiązanych sekcji, które mają działać jako zestaw — użyj komponentu Accordion.
  • Do treści, która ma unosić się nad stroną — użyj komponentu Popover.
  • Do ukrywania treści potrzebnej do wykonania bieżącego zadania.

Nazwij efekt

Wyzwalacz powinien mówić, co się pojawi — Ustawienia zaawansowane, Pokaż wszystkie zmiany, Jeszcze 3 pliki — a nie tylko Więcej. Połącz tekst z obracającą się strzałką; sama ikona nie mówi, co jest ukryte.

Dobrze.Etykieta mówi, co się pokaże, jeszcze przed kliknięciem.
Źle.„Więcej” nie mówi nic o tym, co jest ukryte ani ile tego jest.

Zostaw wyzwalacz na miejscu

Umieść wyzwalacz przed treścią, którą steruje, i nie przesuwaj go po otwarciu panelu. Użytkownik powinien móc zamknąć to, co właśnie otworzył, bez szukania kontrolki.

Dostępność

Wyzwalacz to natywny <button>aria-expanded, a gdy panel jest otwarty — także z aria-controls wskazującym na panel.

KlawiszDziałanie
Tab
Przenosi fokus na wyzwalacz, a potem do treści otwartego panelu.
EnterSpacja
Otwiera lub zamyka panel.
  • Wyszukiwanie na stronie. Ustaw hiddenUntilFound na CollapsibleContent, a przeglądarka będzie mogła przeszukiwać zamknięty panel i otworzy go po znalezieniu dopasowania.
  • Fokus zostaje na miejscu. Otwarcie panelu nie przenosi fokusu; następne naciśnięcie Tab przeniesie go do środka.
  • Własne wyzwalacze. Gdy przez render renderujesz coś innego niż Button, upewnij się, że to nadal prawdziwy przycisk — albo przekaż nativeButton={false}, żeby Base UI dodał semantykę przycisku.

Dokumentacja API

Collapsible

Zarządza stanem otwarcia. Renderuje <div>. Przyjmuje wszystkie propsy Collapsible.Root z Base UI.

PropTypDomyślnie
defaultOpen

Czy panel jest otwarty przy pierwszym renderowaniu (tryb niekontrolowany).

booleanfalse
open

Czy panel jest otwarty (tryb kontrolowany). Używaj razem z onOpenChange.

booleanBrak wartości domyślnej
onOpenChange

Wywoływana, gdy panel się otwiera lub zamyka.

(open: boolean, details) => voidBrak wartości domyślnej
disabled

Blokuje otwieranie i zamykanie panelu.

booleanfalse
render

Podmienia element główny — np. na <li>, gdy Collapsible jest elementem listy.

ReactElement | (props, state) => ReactElementBrak wartości domyślnej

CollapsibleTrigger

Przycisk, który otwiera i zamyka panel. Gdy panel jest otwarty, dostaje data-panel-open — to przydatne przy obracaniu ikon. Przyjmuje wszystkie propsy Collapsible.Trigger z Base UI, w tym rendernativeButton.

CollapsibleContent

Panel. Domyślnie animuje swoją wysokość.

PropTypDomyślnie
hiddenUntilFound

Zostawia zamknięty panel w DOM z hidden="until-found", żeby wyszukiwanie na stronie mogło go odsłonić.

booleanfalse
keepMounted

Zostawia zamknięty panel w DOM. Ignorowany, gdy ustawiono hiddenUntilFound.

booleanfalse

Atrybuty data

AtrybutElementObecny, gdy
data-open / data-closedelement główny, panelPanel jest otwarty / zamknięty.
data-panel-openwyzwalaczPanel jest otwarty.
data-starting-style / data-ending-styleelement główny, panelPanel animuje się przy otwieraniu / zamykaniu.