组件/Tuffex 组件
Verified通用组件

Tuffex 组件

塔芙组件库的组件展示中心

Tuffex 组件

组件文档已迁移到统一结构:TuffDemoWrapper + 独立 Demo 组件

组件预览

示例即将加载...
<template>
  <div class="tuff-demo-row">
    <TxButton size="sm">操作</TxButton>
    <TuffSwitch :model-value="true" />
    <TxStatusBadge text="在线" status="success" />
    <TxTag label="专注" />
    <TxProgressBar :percentage="62" style="width: 140px;" />
  </div>
</template>

组合工作台 Demo

这一组 Demo 用真实后台片段校验组件组合:搜索输入、开关、按钮、状态徽标、进度条与可选择表格会在同一个响应式面板里协同工作。

发布工作台

适合作为 Dashboard / Admin 页面组合组件的基础形态。

示例即将加载...
<script setup lang="ts">
import { ref } from 'vue'

const query = ref('')
const selectedKeys = ref([1])
const automationEnabled = ref(true)
</script>

<template>
  <section class="workflow-panel">
    <header>
      <h3>发布工作台</h3>
      <TxButton variant="primary" size="sm" icon="i-carbon-rocket">发布</TxButton>
    </header>
    <TuffInput v-model="query" placeholder="搜索任务" prefix-icon="i-carbon-search" clearable />
    <TuffSwitch v-model="automationEnabled" />
    <TxProgressBar :percentage="84" status="success" show-text />
    <TxStatusBadge text="审阅中" status="warning" />
    <TxDataTable v-model:selected-keys="selectedKeys" :columns="columns" :data="rows" row-key="id" selectable />
  </section>
</template>

后台趋势图

复用 DashboardSparklineChart 封装,替代页面内手写 SVG sparkline。

示例即将加载...
<script setup lang="ts">
import DashboardSparklineChart from '~/components/dashboard/DashboardSparklineChart.client.vue'
</script>

<template>
  <DashboardSparklineChart
    :values="[18, 24, 21, 36, 42, 38, 54]"
    :labels="['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']"
    color="var(--tx-color-primary, #409eff)"
    show-grid
  />
</template>

运营状态面板

将 StatCard、StatusBadge、ProgressBar 与 Switch 组合成后台首屏状态区。

示例即将加载...
<template>
  <section class="grid gap-3">
    <TxStatCard
      variant="progress"
      value="99.9%"
      label="API 可用率"
      meta="正常"
      :progress="99"
      icon-class="i-carbon-cloud-monitoring text-[var(--tx-color-success)]"
    />
    <TxStatusBadge text="审阅完成" status="success" size="sm" />
    <TxProgressBar :percentage="86" status="success" show-text />
  </section>
</template>

后台恢复状态

将 LoadingState、EmptyState、ErrorState 放进同一个数据容器,覆盖加载/无数据/失败路径。

示例即将加载...
<template>
  <section class="grid gap-3">
    <TxLoadingState title="正在加载规则" surface="card" />
    <TxEmptyState variant="no-data" title="还没有自动化规则" surface="card" />
    <TxErrorState title="规则加载失败" surface="card" />
  </section>
</template>

后台任务反馈中心

将 Toast、Tooltip、LoadingOverlay 与 Spinner 组合成后台任务反馈路径。

示例即将加载...
<script setup lang="ts">
import { toast } from '@talex-touch/tuffex/utils'
import { ref } from 'vue'

const syncing = ref(true)
</script>

<template>
  <section class="grid gap-3">
    <TxToastHost />
    <TxTooltip content="Tooltip 只解释当前动作。">
      <TxButton @click="toast({ title: '同步任务已排队', duration: 0 })">发送提示</TxButton>
    </TxTooltip>
    <TxLoadingOverlay :loading="syncing" text="正在刷新任务队列…">
      <TxSpinner :size="16" />
    </TxLoadingOverlay>
  </section>
</template>

后台筛选工具栏

将 SearchInput、SearchSelect、SearchEmpty 组合成列表筛选与空结果恢复路径。

示例即将加载...
<script setup lang="ts">
import { computed, ref } from 'vue'

const query = ref('')
const selectedScope = ref<string | number>('all')
const scopeOptions = [
  { value: 'all', label: '全部' },
  { value: 'docs', label: '文档' },
  { value: 'tasks', label: '任务' },
]
const filteredRecords = computed(() => (query.value ? [] : scopeOptions))
</script>

<template>
  <section class="grid gap-3">
    <TxSearchInput v-model="query" remote placeholder="搜索插件 / 文档 / 任务" />
    <TxSearchSelect v-model="selectedScope" :options="scopeOptions" placeholder="筛选范围" />
    <TxSearchEmpty v-if="!filteredRecords.length" surface="card" />
  </section>
</template>

数据运维面板

将 DataTable、Pagination、Skeleton 与 LayoutSkeleton 组合成后台数据区。

示例即将加载...
<template>
  <section class="grid gap-3">
    <TxDataTable :columns="columns" :data="pagedRows" row-key="id" selectable />
    <TxPagination v-model:current-page="page" :total="rows.length" :page-size="4" show-info />
    <TxSkeleton :loading="true" :lines="3" />
  </section>
</template>

权限编排面板

将 Tree、TreeSelect、Transfer 与 Timeline 组合成后台授权工作流。

示例即将加载...
<script setup lang="ts">
import { ref } from 'vue'

const selectedScope = ref<string | number>('release')
const ownerTeam = ref<string | number | undefined>('docs')
const assignedKeys = ref<Array<string | number>>(['read-docs'])
</script>

<template>
  <section class="grid gap-3">
    <TxTree v-model="selectedScope" :nodes="scopeNodes" />
    <TxTreeSelect v-model="ownerTeam" :nodes="teamNodes" placeholder="归属团队" />
    <TxTransfer v-model="assignedKeys" :data="resources" />
    <TxTimeline>
      <TxTimelineItem title="分配资源" time="10:20" color="success" active />
    </TxTimeline>
  </section>
</template>

发布策略配置

将 Cascader、FlatSelect、SegmentedSlider、Slider 与 TagInput 组合成后台发布配置流。

示例即将加载...
<script setup lang="ts">
import { ref } from 'vue'

const releasePath = ref(['desktop', 'stable', 'macos'])
const packageFormat = ref('signed')
const rolloutMode = ref('phased')
const riskLevel = ref(2)
const traffic = ref(35)
const labels = ref(['nexus', 'verified'])
const scopeOptions = [
  {
    value: 'desktop',
    label: '桌面端',
    children: [
      {
        value: 'stable',
        label: '稳定通道',
        children: [{ value: 'macos', label: 'macOS', leaf: true }],
      },
    ],
  },
]
const riskSegments = [
  { value: 1, label: '低' },
  { value: 2, label: '中' },
  { value: 3, label: '高' },
  { value: 4, label: '冻结' },
]
</script>

<template>
  <section class="grid gap-3">
    <TxCascader v-model="releasePath" :options="scopeOptions" placeholder="发布范围" />
    <TxFlatSelect v-model="packageFormat" placeholder="包格式">
      <TxFlatSelectItem value="signed" label="签名构建" />
    </TxFlatSelect>
    <TxFlatSelect v-model="rolloutMode" placeholder="发布模式">
      <TxFlatSelectItem value="phased" label="分阶段" />
    </TxFlatSelect>
    <TxSegmentedSlider v-model="riskLevel" :segments="riskSegments" />
    <TxSlider v-model="traffic" :min="5" :max="100" :step="5" show-value />
    <TxTagInput v-model="labels" placeholder="输入标签后回车" />
  </section>
</template>

后台导航配置壳层

将 Tabs、DropdownMenu、Popover 与 Drawer 组合成后台设置页骨架。

示例即将加载...
<template>
  <section class="grid gap-3">
    <TxDropdownMenu>
      <template #trigger>
        <TxButton>发布操作</TxButton>
      </template>
      <TxDropdownItem>快速发布</TxDropdownItem>
    </TxDropdownMenu>
    <TxPopover>
      <template #reference>
        <TxButton variant="secondary">策略说明</TxButton>
      </template>
      浮层只放短说明和轻量动作。
    </TxPopover>
    <TxTabs placement="left" indicator-variant="pill">
      <TxTabItem name="总览" activation>总览配置</TxTabItem>
    </TxTabs>
    <TxDrawer :visible="false" title="发布策略" />
  </section>
</template>

教程路径

  • 新手先读《Tuffex 组合界面教程》,掌握“操作区 → 状态区 → 数据区”的页面切法。
  • 后台首屏建议从“运营状态面板”模式开始,再按需向下展开表格、趋势图、导航配置和详情抽屉。
  • 列表页优先把关键词、范围筛选和无结果恢复设计成同一条路径,复用 TxSearchInputTxSearchSelectTxSearchEmpty
  • 数据列表建议使用 TxDataTable 承担主体、TxPagination 承担页码、TxSkeleton / TxLayoutSkeleton 承担等待态。
  • 设置页与后台壳层建议使用 TxTabs 固定分区,TxDropdownMenu / TxPopover 放轻操作与短说明,TxDrawer 承载高密度配置。
  • 数据区必须同时设计加载、空态和错误恢复路径,优先复用 TxLoadingStateTxEmptyStateTxErrorState
  • 任务反馈路径建议使用 TxToastHost 挂载通知、TxTooltip 解释动作、TxLoadingOverlay 阻断局部刷新、TxSpinner 表达行内等待。
  • 权限编排路径建议用 TxTree 选择权限域、TxTreeSelect 选择归属团队、TxTransfer 分配资源、TxTimeline 展示审计进度。
  • 发布配置路径建议用 TxCascader 选择发布范围、TxFlatSelect 选择包格式与发布模式、TxSegmentedSlider 表达风险档位、TxSlider 调整灰度比例、TxTagInput 记录短标签。
  • 组件细节按下方分组查阅;侧边栏仅突出仍需关注的迁移状态,已审阅页面只在状态看板中显示 已确认
  • 后台页优先使用 TxDataTableTxStatusBadgeTxProgressBar 与图表组件组合,避免手写一次性 SVG 或重复状态 UI。

迁移状态看板

  • 开发中:文档仍在完善,示例/API 可能继续调整。
  • AI 迁移:已完成迁移,但仍建议结合源码核对。
  • 已审阅:人工审阅完成。
组件同步状态
设计基础— 未迁移
Agents 智能体列表— 未迁移
Alert 警告— 未迁移
AutoSizer 自适应尺寸— 未迁移
Avatar 头像— 未迁移
Avatar Variants 头像变体— 未迁移
Badge 徽标— 未迁移
BaseAnchor 锚点定位— 未迁移
BaseSurface 基础表面层— 未迁移
BlankSlate 空白页— 未迁移
Breadcrumb 面包屑— 未迁移
Button 按钮— 未迁移
Card 卡片— 未迁移
CardItem 卡片项— 未迁移
Cascader 级联选择— 未迁移
Chat 消息列表— 未迁移
ChatComposer 消息输入— 未迁移
Checkbox 复选框— 未迁移
CodeEditor 代码编辑器— 未迁移
Collapse 折叠面板— 未迁移
CommandPalette 命令面板— 未迁移
Container 容器— 未迁移
ContextMenu 右键菜单— 未迁移
CornerOverlay 角标容器— 未迁移
DataTable 数据表格— 未迁移
DatePicker 日期选择— 未迁移
Dialog 对话框— 未迁移
Divider 分割线— 未迁移
Drawer 抽屉— 未迁移
DropdownMenu 下拉菜单— 未迁移
EdgeFadeMask 边缘渐隐遮罩— 未迁移
Empty 空状态— 未迁移
EmptyState 空态引导— 未迁移
ErrorState 错误状态— 未迁移
FileUploader 文件上传— 未迁移
FlatButton 扁平按钮— 未迁移
FlatInput 扁平输入— 未迁移
FlatRadio 平铺选择器— 未迁移
FlatSelect 平铺下拉选择器— 未迁移
Flex 弹性布局— 未迁移
FlipOverlay 翻转遮罩— 未迁移
Floating 浮动层— 未迁移
Form 表单— 未迁移
Fusion 交融— 未迁移
GlassSurface 玻璃拟态— 未迁移
GlowText 扫光— 未迁移
GradientBorder 渐变边框— 未迁移
GradualBlur 渐变模糊— 未迁移
Grid 栅格— 未迁移
GridLayout 网格布局— 未迁移
GroupBlock 分组块— 未迁移
GuideState 引导状态— 未迁移
Icon 图标— 未迁移
ImageGallery 图片预览— 未迁移
ImageUploader 图片上传— 未迁移
Input 输入— 未迁移
KeyframeStrokeText 关键帧描边— 未迁移
LayoutSkeleton 布局骨架— 未迁移
LoadingOverlay 加载遮罩— 未迁移
LoadingState 加载态— 未迁移
MarkdownView Markdown 渲染— 未迁移
Modal 模态框— 未迁移
NavBar 导航栏— 未迁移
NoData 无数据— 未迁移
NoSelection 未选择— 未迁移
OfflineState 离线— 未迁移
OutlineBorder 描边容器— 未迁移
Pagination 分页— 未迁移
PermissionState 权限不足— 未迁移
Picker 滚轮选择— 未迁移
Popover 弹出层— 未迁移
Progress 进度— 未迁移
ProgressBar 进度条— 未迁移
Radio 单选框— 未迁移
Rating 评分— 未迁移
Scroll 滚动— 未迁移
SearchEmpty 搜索空态— 未迁移
SearchInput 搜索输入框— 未迁移
SearchSelect 搜索选择器— 未迁移
SegmentedSlider 分段滑块— 未迁移
Select 选择器— 未迁移
Skeleton 骨架屏— 未迁移
Slider 滑块— 未迁移
SortableList 拖拽排序— 未迁移
Spinner 加载— 未迁移
Splitter 分割面板— 未迁移
Stack 堆叠— 未迁移
Stagger 依次进入— 未迁移
StatCard 指标卡片— 未迁移
StatusBadge 状态徽标— 未迁移
Steps 步骤条— 未迁移
Switch 开关— 未迁移
TabBar 底部导航— 未迁移
Tabs 标签页— 未迁移
Tag 标签— 未迁移
TagInput 标签输入— 未迁移
TextTransformer 文本变换— 未迁移
Timeline 时间线— 未迁移
Toast 提示— 未迁移
Tooltip 提示— 未迁移
Transfer 穿梭框— 未迁移
Transition 动效— 未迁移
Tree 树形— 未迁移
TreeSelect 树选择器— 未迁移
TuffLogoStroke Logo 描边— 未迁移
TypingIndicator 打字中— 未迁移
VirtualList 虚拟列表— 未迁移

章节总览

章节核心范围当前状态
设计模式Surface / Motion / 组合样式✅ migrated
设计案例实战页面与复合范式✅ migrated
暗黑模式与主题Token、深浅色与主题约束✅ migrated
基础与操作Button / Icon / Avatar / Tag✅ migrated
表单与输入Input / Select / Form / Uploader✅ migrated
反馈与状态Dialog / Toast / Progress / Empty✅ migrated
布局与导航Grid / Container / Tabs / Menu✅ migrated
数据与列表DataTable / Tree / VirtualList✅ migrated
内容与媒体Chat / Markdown / Image✅ migrated

设计模式

设计案例

暗黑模式与主题

基础与操作

表单与输入

反馈与状态

布局与导航

数据与列表

内容与媒体