Einklappbar
Ein Trigger-und-Panel-Paar für Dateibäume, erweiterte Einstellungen und „Mehr anzeigen“-Bereiche – mit dem neobrutalistischen Design aus Rahmen und Schatten.
"use client"
import * as React from "react"Das Collapsible ist das einabschnittige Geschwister des Accordions: ein Trigger, ein Panel, offen oder geschlossen. Es basiert auf der Base UI Collapsible-Komponente und folgt dem neobrutalistischen Rezept: dicke Rahmen, harte Schatten und kräftige Typografie.
Die richtige Wahl für:
- Dateibäume und verschachtelte Navigation – verschachtele Collapsibles, um Ordner aufzuklappen (siehe das Dateibaum-Beispiel unten).
- Erweiterte Einstellungen – lass die gängigen Optionen sichtbar und falte den Rest hinter einen Umschalter.
- „Mehr anzeigen“-Inhalte – lange Changelogs, gekürzte Listen, optionale Details auf dichten Seiten.
Installation#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/collapsible.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/collapsible.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/collapsible.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/collapsible.json
Installiere die folgenden Abhängigkeiten:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
Kopiere den folgenden Code und füge ihn in dein Projekt ein.
"use client"
import { Collapsible as CollapsiblePrimitive } from "radix-ui"
import { cn } from "@/lib/utils"
function Collapsible({
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {
return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
}
function CollapsibleTrigger({
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {
return (
<CollapsiblePrimitive.CollapsibleTrigger
data-slot="collapsible-trigger"
{...props}
/>
)
}
function CollapsibleContent({
className,
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {
return (
<CollapsiblePrimitive.CollapsibleContent
data-slot="collapsible-content"
// Radix publishes the measured height as
// `--radix-collapsible-content-height`; the collapsible-down/up keyframes
// interpolate against it for a real slide open/close.
className={cn(
"overflow-hidden data-[state=open]:animate-collapsible-down data-[state=closed]:animate-collapsible-up",
className
)}
{...props}
/>
)
}
export { Collapsible, CollapsibleTrigger, CollapsibleContent }
Passe die Importpfade an deine Projektkonfiguration an.
Verwendung#
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible"<Collapsible>
<CollapsibleTrigger>Can I use this in my project?</CollapsibleTrigger>
<CollapsibleContent>
Yes. Free to use for personal and commercial projects. No attribution
required.
</CollapsibleContent>
</Collapsible>Komposition#
Verwende die folgende Komposition, um ein Collapsible zu erstellen:
Collapsible
├── CollapsibleTrigger
└── CollapsibleContentKontrollierter Zustand#
Verwende die Props open und onOpenChange, um den Zustand zu steuern.
import * as React from "react"
export function Example() {
const [open, setOpen] = React.useState(false)
return (
<Collapsible open={open} onOpenChange={setOpen}>
<CollapsibleTrigger>Toggle</CollapsibleTrigger>
<CollapsibleContent>Content</CollapsibleContent>
</Collapsible>
)
}Beispiele#
Grundlegend#
import { ChevronDownIcon } from "@/registry/icons/__lucide__"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"Einstellungs-Panel#
Verwende einen Trigger-Button, um zusätzliche Einstellungen anzuzeigen.
"use client"
import * as React from "react"Dateibaum#
Verwende verschachtelte Collapsibles, um einen Dateibaum zu erstellen.
import { ChevronRightIcon, FileIcon, FolderIcon } from "lucide-react"
import { Button } from "@/components/ui/button"RTL#
Um RTL-Unterstützung in Neobrutalism zu aktivieren, siehe die RTL-Konfigurationsanleitung.
"use client"
import * as React from "react"Barrierefreiheit#
Das Collapsible folgt dem WAI-ARIA-Disclosure-Pattern: Der Trigger ist ein echter Button, verdrahtet mit aria-expanded und aria-controls, sodass Screenreader ankündigen, ob das Panel offen ist.
Tastaturinteraktionen:
| Taste | Aktion |
|---|---|
Tab / Shift + Tab | Bewegt den Fokus zum Trigger hin und von ihm weg |
Space / Enter | Öffnet oder schließt das Panel |
API-Referenz#
Weitere Informationen findest du in der Base UI-Dokumentation.