Сворачиваемый
Комбинация триггера и панели для дерева файлов, расширенных настроек и разделов «Показать больше» — с оформлением в стиле необрутализма, включающим рамки и тени.
"use client"
import * as React from "react"Collapsible — младший брат аккордеона на одну секцию: один триггер, одна панель, открыто или закрыто. Построен на компоненте Base UI Collapsible и оформлен по рецепту необрутализма: толстые рамки, жёсткие тени и жирный шрифт.
Когда это пригодится:
- Дерево файлов и вложенная навигация — вкладывайте collapsible друг в друга, чтобы раскрывать папки (смотрите пример с деревом файлов ниже).
- Расширенные настройки — оставьте на виду частые параметры, а остальное сложите под переключатель.
- Содержимое под «Показать больше» — длинные журналы изменений, урезанные списки, необязательные подробности на плотных страницах.
Установка#
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
Установите следующие зависимости:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
Скопируйте и вставьте следующий код в свой проект.
"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 }
Обновите пути импорта в соответствии с настройками вашего проекта.
Использование#
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>Композиция#
Используйте следующую композицию для создания Collapsible:
Collapsible
├── CollapsibleTrigger
└── CollapsibleContentУправляемое состояние#
Используйте свойства open и onOpenChange для управления состоянием.
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>
)
}Примеры#
Базовый#
import { ChevronDownIcon } from "@/registry/icons/__lucide__"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"Панель настроек#
Используйте кнопку-триггер, чтобы показать дополнительные настройки.
"use client"
import * as React from "react"Дерево файлов#
Используйте вложенные collapsible, чтобы построить дерево файлов.
import { ChevronRightIcon, FileIcon, FolderIcon } from "lucide-react"
import { Button } from "@/components/ui/button"RTL#
Чтобы включить поддержку RTL в Neobrutalism, см. руководство по настройке RTL.
"use client"
import * as React from "react"Доступность#
Collapsible следует паттерну WAI-ARIA Disclosure: триггер — настоящая кнопка с aria-expanded и aria-controls, поэтому программы чтения с экрана сообщают, открыта панель или нет.
Управление с клавиатуры:
| Клавиша | Действие |
|---|---|
Tab / Shift + Tab | Перевести фокус на триггер и убрать с него |
Space / Enter | Открыть или закрыть панель |
Справочник API#
Подробнее см. в документации Base UI.