Collapsible 折叠面板

一个可以展开/折叠内容的交互式面板组件,基于 Radix Vue 实现。

组件特性

  • 🛠️ 完全可控:轻松控制组件的展开和折叠状态。
  • 📐 多种尺寸:全面支持 xssmmdlgxl2xldefault 尺寸,适应不同场景。
  • 🎨 高度定制:可轻松替换默认图标或自定义触发器内容。
  • ⌨️ 无障碍支持:开箱即用的全键盘操作支持和屏幕阅读器兼容。
  • 🎭 主题定制:完全支持基于 BrConfigProvider 的全局主题配置。

基础用法

最基础的折叠面板展示。

<script setup lang="ts">
import { ref } from 'vue'

const isOpen = ref(false)
</script>

<template>
  <div class="w-full max-w-[400px]">
    <BrCollapsible v-model:open="isOpen">
      <BrCollapsibleTrigger>
        Can I use this in my project?
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        Yes. Free to use for personal and commercial projects. No attribution
        required.
      </BrCollapsibleContent>
    </BrCollapsible>
  </div>
</template>

尺寸

通过 size 属性可以调整折叠面板的尺寸。支持全局配置体系的所有尺寸 (xs, sm, md, lg, xl, 2xl, default)。

<script setup lang="ts">
</script>

<template>
  <div class="flex flex-col gap-4 w-full max-w-[400px]">
    <BrCollapsible size="sm">
      <BrCollapsibleTrigger>
        Small Size
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        This is a small size collapsible component.
      </BrCollapsibleContent>
    </BrCollapsible>

    <BrCollapsible size="md">
      <BrCollapsibleTrigger>
        Medium Size (Default)
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        This is a medium size collapsible component.
      </BrCollapsibleContent>
    </BrCollapsible>

    <BrCollapsible size="lg">
      <BrCollapsibleTrigger>
        Large Size
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        This is a large size collapsible component.
      </BrCollapsibleContent>
    </BrCollapsible>
  </div>
</template>

自定义图标

使用 BrCollapsibleTrigger 上的 icon 插槽可以自定义展开/折叠的图标。

<script setup lang="ts">
import { ArrowDown } from 'lucide-vue-next'
</script>

<template>
  <div class="w-full max-w-[400px]">
    <BrCollapsible>
      <BrCollapsibleTrigger>
        Custom Icon
        <template #icon>
          <ArrowDown class="h-4 w-4 shrink-0 transition-transform duration-300" />
        </template>
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        You can customize the icon using the icon slot in BrCollapsibleTrigger.
      </BrCollapsibleContent>
    </BrCollapsible>
  </div>
</template>

禁用状态

使用 disabled 属性可以禁用折叠面板的交互。

<script setup lang="ts">
</script>

<template>
  <div class="w-full max-w-[400px]">
    <BrCollapsible disabled>
      <BrCollapsibleTrigger>
        Disabled Collapsible
      </BrCollapsibleTrigger>
      <BrCollapsibleContent>
        This content cannot be expanded because the component is disabled.
      </BrCollapsibleContent>
    </BrCollapsible>
  </div>
</template>

主题定制

结合 BrConfigProvider,可以全局覆盖组件默认样式。

<script setup lang="ts">
import { ref } from 'vue'

const isOpen = ref(false)
</script>

<template>
  <div class="w-full max-w-[400px]">
    <BrConfigProvider
      :theme="{
        cssVars: {
          light: {
            '--br-radius': '1rem',
            '--br-primary': '262.1 83.3% 57.8%',
            '--br-border': '262.1 83.3% 80%',
            '--br-muted': '262.1 83.3% 95%',
          },
          dark: {
            '--br-radius': '1rem',
            '--br-primary': '262.1 83.3% 57.8%',
            '--br-border': '262.1 83.3% 30%',
            '--br-muted': '262.1 83.3% 20%',
          }
        }
      }"
    >
      <BrCollapsible v-model:open="isOpen" class="border-2 border-primary/20 shadow-md">
        <BrCollapsibleTrigger class="hover:bg-primary/10 data-[state=open]:bg-primary/5">
          <span class="text-primary font-bold">Themed Collapsible</span>
        </BrCollapsibleTrigger>
        <BrCollapsibleContent class="bg-primary/5 border-t-primary/20">
          This collapsible uses a custom theme provided by BrConfigProvider, 
          along with some specific Tailwind classes to match the theme.
        </BrCollapsibleContent>
      </BrCollapsible>
    </BrConfigProvider>
  </div>
</template>

API 说明

BrCollapsible

属性类型默认值说明
open (v-model)boolean-控制折叠面板的展开状态
defaultOpenbooleanfalse初始渲染时的默认展开状态
disabledbooleanfalse是否禁用
size'default' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''default'折叠面板的尺寸
lazyRenderbooleantrue是否在展开时才渲染内容(懒渲染)

BrCollapsibleTrigger

属性类型默认值说明
asChildbooleanfalse是否将当前组件作为子元素的包装器
hideIconbooleanfalse是否隐藏默认的展开/折叠图标

BrCollapsibleContent

属性类型默认值说明
asChildbooleanfalse是否将当前组件作为子元素的包装器
forceMountboolean-是否强制挂载内容(配合动画使用时)