Comprimibile
Una coppia di pulsanti e pannelli per le strutture ad albero dei file, le impostazioni avanzate e le sezioni “Mostra altro” — con lo stile neobrutalista caratterizzato da bordi e ombre.
"use client"
import * as React from "react"Il collapsible è il fratello a sezione singola dell’accordion: un trigger, un pannello, aperto o chiuso. Costruito sul componente Base UI Collapsible e rifinito secondo la ricetta neobrutalista: bordi spessi, ombre nette e tipografia in grassetto.
Quando usarlo:
- Alberi di file e navigazione annidata — annida i collapsible per espandere le cartelle (vedi l’esempio dell’albero di file qui sotto).
- Impostazioni avanzate — tieni in vista le opzioni comuni e ripiega il resto dietro un interruttore.
- Contenuti “mostra altro” — changelog lunghi, elenchi troncati, dettagli facoltativi su pagine dense.
Installazione#
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
Installa le seguenti dipendenze:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
Copia e incolla il seguente codice nel tuo progetto.
"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 }
Aggiorna i percorsi di importazione in base alla configurazione del tuo progetto.
Utilizzo#
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>Composizione#
Usa la seguente composizione per costruire un Collapsible:
Collapsible
├── CollapsibleTrigger
└── CollapsibleContentStato controllato#
Usa le prop open e onOpenChange per controllare lo stato.
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>
)
}Esempi#
Base#
import { ChevronDownIcon } from "@/registry/icons/__lucide__"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"Pannello impostazioni#
Usa un pulsante trigger per mostrare impostazioni aggiuntive.
"use client"
import * as React from "react"Albero dei file#
Usa collapsible annidati per costruire un albero dei file.
import { ChevronRightIcon, FileIcon, FolderIcon } from "lucide-react"
import { Button } from "@/components/ui/button"RTL#
Per abilitare il supporto RTL in Neobrutalism, consulta la guida alla configurazione RTL.
"use client"
import * as React from "react"Accessibilità#
Il collapsible segue il pattern WAI-ARIA Disclosure: il trigger è un vero pulsante collegato tramite aria-expanded e aria-controls, quindi gli screen reader annunciano se il pannello è aperto.
Interazioni da tastiera:
| Tasto | Azione |
|---|---|
Tab / Shift + Tab | Sposta il focus sul trigger e via da esso |
Space / Enter | Apre o chiude il pannello |
Riferimento API#
Consulta la documentazione di Base UI per maggiori informazioni.