Tabs 标签页

一组分层的内容部分—称为标签面板—一次显示一个。

组件特性

  • 🎨 3 种视觉变体:支持 linesegmentpill 视觉变体。
  • 📐 4 种位置:支持上、下、左、右标签位置。
  • 📱 可滚动:支持标签溢出时的水平滚动。
  • ✖️ 可关闭:支持可关闭的标签面板。
  • 可拖拽:支持拖拽重排标签。
  • 懒加载:支持标签面板内容的懒渲染。
  • 📱 响应式折叠:支持标签溢出的响应式折叠。
  • 🎨 主题定制:基于 BrConfigProvider 支持全局主题配置和 TailwindCSS 局部覆盖。

基础用法

<script setup lang="ts">
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent } from '@breezeui/vue'
</script>

<template>
  <BrTabs default-value="account" class="w-full">
    <BrTabsList>
      <BrTabsTrigger value="account">Account</BrTabsTrigger>
      <BrTabsTrigger value="password">Password</BrTabsTrigger>
    </BrTabsList>
    <BrTabsContent value="account">Make changes to your account here.</BrTabsContent>
    <BrTabsContent value="password">Change your password here.</BrTabsContent>
  </BrTabs>
</template>

变体

使用 variant 属性控制标签页的视觉样式。

  • Line: 默认样式,带有底部边框和活动指示器。
  • Card: 卡片样式,带有边框。
  • Underline: 简单的下划线样式。
<script setup lang="ts">
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent } from '@breezeui/vue'
</script>

<template>
  <div class="space-y-4 w-full">
    <div class="space-y-2">
      <h3 class="text-sm font-medium">Line Variant</h3>
      <BrTabs default-value="tab1" variant="line" class="w-full">
        <BrTabsList>
          <BrTabsTrigger value="tab1">Tab 1</BrTabsTrigger>
          <BrTabsTrigger value="tab2">Tab 2</BrTabsTrigger>
        </BrTabsList>
        <BrTabsContent value="tab1" class="p-4 border rounded-md">Content 1</BrTabsContent>
        <BrTabsContent value="tab2" class="p-4 border rounded-md">Content 2</BrTabsContent>
      </BrTabs>
    </div>

    <div class="space-y-2">
      <h3 class="text-sm font-medium">Card Variant</h3>
      <BrTabs default-value="tab1" variant="card" class="w-full">
        <BrTabsList>
          <BrTabsTrigger value="tab1">Tab 1</BrTabsTrigger>
          <BrTabsTrigger value="tab2">Tab 2</BrTabsTrigger>
        </BrTabsList>
        <BrTabsContent value="tab1" class="p-4 border rounded-md mt-2">Content 1</BrTabsContent>
        <BrTabsContent value="tab2" class="p-4 border rounded-md mt-2">Content 2</BrTabsContent>
      </BrTabs>
    </div>

    <div class="space-y-2">
      <h3 class="text-sm font-medium">Underline Variant</h3>
      <BrTabs default-value="tab1" variant="underline" class="w-full">
        <BrTabsList>
          <BrTabsTrigger value="tab1">Tab 1</BrTabsTrigger>
          <BrTabsTrigger value="tab2">Tab 2</BrTabsTrigger>
        </BrTabsList>
        <BrTabsContent value="tab1" class="p-4 border rounded-md">Content 1</BrTabsContent>
        <BrTabsContent value="tab2" class="p-4 border rounded-md">Content 2</BrTabsContent>
      </BrTabs>
    </div>
  </div>
</template>

垂直标签页

使用 position 属性控制标签列表的位置。

<script setup lang="ts">
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent } from '@breezeui/vue'
</script>

<template>
  <BrTabs default-value="account" position="left" class="w-full h-[300px]">
    <BrTabsList class="w-32">
      <BrTabsTrigger value="account">Account</BrTabsTrigger>
      <BrTabsTrigger value="password">Password</BrTabsTrigger>
      <BrTabsTrigger value="notifications">Notifications</BrTabsTrigger>
      <BrTabsTrigger value="display">Display</BrTabsTrigger>
    </BrTabsList>
    <BrTabsContent value="account" class="p-6">Account settings here.</BrTabsContent>
    <BrTabsContent value="password" class="p-6">Password settings here.</BrTabsContent>
    <BrTabsContent value="notifications" class="p-6">Notification settings here.</BrTabsContent>
    <BrTabsContent value="display" class="p-6">Display settings here.</BrTabsContent>
  </BrTabs>
</template>

可滚动标签页

BrTabsList 上设置 scrollable 属性,以便在标签超出容器宽度时启用滚动。

<script setup lang="ts">
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent } from '@breezeui/vue'
</script>

<template>
  <BrTabs default-value="tab1" class="w-full">
    <BrTabsList scrollable>
      <BrTabsTrigger v-for="i in 15" :key="i" :value="`tab${i}`">
        Tab {{ i }}
      </BrTabsTrigger>
    </BrTabsList>
    <BrTabsContent v-for="i in 15" :key="i" :value="`tab${i}`" class="p-4 border rounded-md mt-2">
      Content {{ i }}
    </BrTabsContent>
  </BrTabs>
</template>

可关闭标签页

BrTabsBrTabsTrigger 上设置 closable 属性以使标签可关闭。

<script setup lang="ts">
import { ref } from 'vue'
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent } from '@breezeui/vue'

const activeTab = ref('tab1')

const tabs = ref([
  { value: 'tab1', title: 'Tab 1', content: 'Content 1' },
  { value: 'tab2', title: 'Tab 2', content: 'Content 2' },
  { value: 'tab3', title: 'Tab 3', content: 'Content 3' },
])

const handleClose = (value: string | number) => {
  const index = tabs.value.findIndex(tab => tab.value === value)
  if (index === -1) return

  tabs.value.splice(index, 1)

  // If the active one is closed tab,automatically activate the previous or next one
  if (activeTab.value === value) {
    if (tabs.value.length > 0) {
      const nextIndex = index >= tabs.value.length ? index - 1 : index
      activeTab.value = tabs.value[nextIndex].value
    } else {
      activeTab.value = ''
    }
  }
}
</script>

<template>
  <BrTabs v-model="activeTab" class="w-full" closable>
    <BrTabsList>
      <BrTabsTrigger 
        v-for="tab in tabs" 
        :key="tab.value" 
        :value="tab.value"
        @close="handleClose"
      >
        {{ tab.title }}
      </BrTabsTrigger>
    </BrTabsList>
    <BrTabsContent 
      v-for="tab in tabs" 
      :key="tab.value" 
      :value="tab.value"
      class="p-4 border rounded-md mt-2"
    >
      {{ tab.content }}
    </BrTabsContent>
  </BrTabs>
</template>

主题

全局定制 (BrConfigProvider)

你可以通过 BrConfigProvidertheme 属性覆盖默认的 CSS 变量。

<script setup lang="ts">
import { BrTabs, BrTabsList, BrTabsTrigger, BrTabsContent, BrConfigProvider } from '@breezeui/vue'

const theme = {
  primary: '#10b981', // emerald-500
  radius: 0.5,
}
</script>

<template>
  <BrConfigProvider :theme="theme">
    <div class="space-y-4 w-full">
      <h3 class="font-medium">Emerald Theme with ConfigProvider</h3>
      <BrTabs default-value="account" variant="line" class="w-full">
        <BrTabsList>
          <BrTabsTrigger value="account">Account</BrTabsTrigger>
          <BrTabsTrigger value="password">Password</BrTabsTrigger>
        </BrTabsList>
        <BrTabsContent value="account" class="p-4 border mt-2">Account (Emerald Theme)</BrTabsContent>
        <BrTabsContent value="password" class="p-4 border mt-2">Password (Emerald Theme)</BrTabsContent>
      </BrTabs>
    </div>
  </BrConfigProvider>
</template>

API

BrTabs Props

名称类型默认值描述
variantstring'line'视觉样式变体: line, card, underline
positionstring'top'标签列表的位置: top, right, bottom, left
responsivebooleanfalse是否响应式
closablebooleanfalse是否可关闭
draggablebooleanfalse是否可拖拽
lazyLoadbooleantrue是否懒加载内容
limitnumber0折叠前的最大可见标签数

以及所有 Radix Vue TabsRoot 的属性。

BrTabsList Props

名称类型默认值描述
scrollablebooleanfalse是否可滚动

以及所有 Radix Vue TabsList 的属性。

BrTabsTrigger Props

名称类型默认值描述
closablebooleanundefined是否可关闭。覆盖父级 closable
draggablebooleanundefined是否可拖拽。覆盖父级 draggable

以及所有 Radix Vue TabsTrigger 的属性。

BrTabsContent Props

所有 Radix Vue TabsContent 的属性。

Emits

名称描述参数
update:modelValue选中标签改变时触发`(value: string
close点击标签关闭按钮时触发`(value: string
drag-end拖拽结束时触发`(newOrder: (string