章节
组件
"use client"
import * as React from "react"折叠面板是手风琴的单区块版本:一个触发器、一个面板,展开或收起。它基于 Base UI 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#
若要在 Neobrutalism 中启用 RTL 支持,请参阅 RTL 配置指南。
"use client"
import * as React from "react"无障碍#
折叠面板遵循 WAI-ARIA Disclosure 模式:触发器是一个真正的按钮,并接好了 aria-expanded 和 aria-controls,因此屏幕阅读器会读出面板当前是否展开。
键盘交互:
| 按键 | 操作 |
|---|---|
Tab / Shift + Tab | 把焦点移到触发器上或移开 |
Space / Enter | 展开或收起面板 |
API 参考#
更多信息请参阅 Base UI 文档。