# 组件库
## 一句话概述
**基于 Radix UI 原语和 Tailwind CSS 构建的可复用 UI 组件综合集合,遵循 shadcn/ui 模式,提供一致、可访问和可定制的界面。**
---
## 概述
**位置**: `ccw/frontend/src/components/ui/`
**用途**: 为构建 CCW 前端应用程序提供一致的 UI 组件集合。
**技术栈**:
- **Radix UI**: 无样式、可访问的组件原语
- **Tailwind CSS**: 带自定义主题的实用优先样式
- **class-variance-authority (CVA)**: 类型安全的变体 props 管理
- **Lucide React**: 一致的图标系统
---
## 实时演示:组件库展示
:::demo ComponentGallery
# component-gallery.tsx
/**
* 组件库展示演示
* 所有 UI 组件的交互式展示
*/
export function ComponentGallery() {
const [selectedCategory, setSelectedCategory] = React.useState('all')
const [buttonVariant, setButtonVariant] = React.useState('default')
const [switchState, setSwitchState] = React.useState(false)
const [checkboxState, setCheckboxState] = React.useState(false)
const [selectedTab, setSelectedTab] = React.useState('variants')
const categories = [
{ id: 'all', label: '全部组件' },
{ id: 'buttons', label: '按钮' },
{ id: 'forms', label: '表单' },
{ id: 'feedback', label: '反馈' },
{ id: 'navigation', label: '导航' },
{ id: 'overlays', label: '叠加层' },
]
const components = {
buttons: [
{ name: 'Button', variants: ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link', 'gradient'] },
],
forms: [
{ name: 'Input', type: 'text' },
{ name: 'Textarea', type: 'textarea' },
{ name: 'Select', type: 'select' },
{ name: 'Checkbox', type: 'checkbox' },
{ name: 'Switch', type: 'switch' },
],
feedback: [
{ name: 'Badge', variants: ['default', 'secondary', 'success', 'warning', 'destructive'] },
{ name: 'Progress', type: 'progress' },
{ name: 'Alert', type: 'alert' },
],
navigation: [
{ name: 'Tabs', type: 'tabs' },
{ name: 'Breadcrumb', type: 'breadcrumb' },
],
overlays: [
{ name: 'Dialog', type: 'dialog' },
{ name: 'Drawer', type: 'drawer' },
{ name: 'Dropdown', type: 'dropdown' },
],
}
const buttonVariants = ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link']
return (
{/* 标题 */}
{/* 分类过滤 */}
{categories.map((cat) => (
))}
{/* 按钮部分 */}
{(selectedCategory === 'all' || selectedCategory === 'buttons') && (
按钮
{/* 变体选择器 */}
{buttonVariants.map((variant) => (
))}
{/* 按钮尺寸 */}
{/* 所有按钮变体 */}
)}
{/* 表单部分 */}
{(selectedCategory === 'all' || selectedCategory === 'forms') && (
表单组件
{/* 输入框 */}
{/* 文本区域 */}
{/* 复选框 */}
{/* 开关 */}
{/* 下拉选择 */}
{/* 表单操作 */}
)}
{/* 反馈部分 */}
{(selectedCategory === 'all' || selectedCategory === 'feedback') && (
反馈组件
{/* 徽章 */}
{/* 进度条 */}
{/* 警告 */}
)}
{/* 导航部分 */}
{(selectedCategory === 'all' || selectedCategory === 'navigation') && (
导航组件
{/* 标签页 */}
{['概览', '文档', 'API 参考', '示例'].map((tab) => (
))}
{/* 面包屑 */}
)}
{/* 叠加层部分 */}
{(selectedCategory === 'all' || selectedCategory === 'overlays') && (
叠加层组件
对话框
用于焦点用户交互的模态对话框。
)}
)
}
:::
---
## 可用组件
### 表单组件
| 组件 | 描述 | Props |
|------|------|------|
| [Button](/components/ui/button) | 可点击的操作按钮,带变体和尺寸 | `variant`, `size`, `asChild` |
| [Input](/components/ui/input) | 文本输入字段 | `error` |
| [Textarea](/components/ui/textarea) | 多行文本输入 | `error` |
| [Select](/components/ui/select) | 下拉选择(Radix) | Select 组件 |
| [Checkbox](/components/ui/checkbox) | 布尔复选框(Radix) | `checked`, `onCheckedChange` |
| [Switch](/components/ui/switch) | 切换开关 | `checked`, `onCheckedChange` |
### 布局组件
| 组件 | 描述 | Props |
|------|------|------|
| [Card](/components/ui/card) | 带标题/脚注的内容容器 | 嵌套组件 |
| [Separator](/components/ui/separator) | 视觉分隔符 | `orientation` |
| [ScrollArea](/components/ui/scroll-area) | 自定义滚动条容器 | - |
### 反馈组件
| 组件 | 描述 | Props |
|------|------|------|
| [Badge](/components/ui/badge) | 状态指示器标签 | `variant` |
| [Progress](/components/ui/progress) | 进度条 | `value` |
| [Alert](/components/ui/alert) | 通知消息 | `variant` |
| [Toast](/components/ui/toast) | 临时通知(Radix) | Toast 组件 |
### 导航组件
| 组件 | 描述 | Props |
|------|------|------|
| [Tabs](/components/ui/tabs) | 标签页导航(Radix) | Tabs 组件 |
| [TabsNavigation](/components/ui/tabs-navigation) | 自定义标签栏 | `tabs`, `value`, `onValueChange` |
| [Breadcrumb](/components/ui/breadcrumb) | 导航面包屑 | Breadcrumb 组件 |
### 叠加层组件
| 组件 | 描述 | Props |
|------|------|------|
| [Dialog](/components/ui/dialog) | 模态对话框(Radix) | `open`, `onOpenChange` |
| [Drawer](/components/ui/drawer) | 侧边面板(Radix) | `open`, `onOpenChange` |
| [Dropdown Menu](/components/ui/dropdown) | 上下文菜单(Radix) | Dropdown 组件 |
| [Popover](/components/ui/popover) | 浮动内容(Radix) | `open`, `onOpenChange` |
| [Tooltip](/components/ui/tooltip) | 悬停工具提示(Radix) | `content` |
| [AlertDialog](/components/ui/alert-dialog) | 确认对话框(Radix) | Dialog 组件 |
### 展开组件
| 组件 | 描述 | Props |
|------|------|------|
| [Collapsible](/components/ui/collapsible) | 展开/折叠内容(Radix) | `open`, `onOpenChange` |
| [Accordion](/components/ui/accordion) | 可折叠部分(Radix) | Accordion 组件 |
---
## 按钮变体
Button 组件通过 CVA(class-variance-authority)支持 8 种变体:
| 变体 | 用途 | 预览 |
|---------|----------|--------|
| `default` | 主要操作 | 默认 |
| `destructive` | 危险操作 | 危险 |
| `outline` | 次要操作 | 轮廓 |
| `secondary` | 较少强调 | 次要 |
| `ghost` | 微妙操作 | 幽灵 |
| `link` | 文本链接 | 链接 |
| `gradient` | 特色操作 | 渐变 |
| `gradientPrimary` | 主要渐变 | 主要 |
### 按钮尺寸
| 尺寸 | 高度 | 内边距 |
|------|--------|---------|
| `sm` | 36px | 水平 12px |
| `default` | 40px | 水平 16px |
| `lg` | 44px | 水平 32px |
| `icon` | 40px | 正方形(仅图标) |
---
## 徽章变体
Badge 组件支持 9 种变体,用于不同的状态类型:
| 变体 | 用途 | 颜色 |
|---------|----------|-------|
| `default` | 一般信息 | 主要主题 |
| `secondary` | 较少强调 | 次要主题 |
| `destructive` | 错误/危险 | 危险主题 |
| `outline` | 微妙 | 仅文本颜色 |
| `success` | 成功状态 | 绿色 |
| `warning` | 警告状态 | 琥珀色 |
| `info` | 信息 | 蓝色 |
| `review` | 审查状态 | 紫色 |
| `gradient` | 特色 | 品牌渐变 |
---
## 使用示例
### Button
```tsx
import { Button } from '@/components/ui/Button'
```
### Input with Error State
```tsx
import { Input } from '@/components/ui/Input'
setName(e.target.value)}
/>
```
### Checkbox
```tsx
import { Checkbox } from '@/components/ui/Checkbox'
```
### Switch
```tsx
import { Switch } from '@/components/ui/Switch'
启用功能
```
### Card
```tsx
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/Card'
卡片标题
简短描述在这里
主要内容放在这里。
```
### Badge
```tsx
import { Badge, badgeVariants } from '@/components/ui/Badge'
已完成
待处理
失败
```
---
## 可访问性
所有组件遵循 Radix UI 的可访问性标准:
- **键盘导航**:所有交互组件完全可键盘访问
- **ARIA 属性**:正确的角色、状态和属性
- **屏幕阅读器支持**:语义化 HTML 和 ARIA 标签
- **焦点管理**:可见的焦点指示器和逻辑 Tab 顺序
- **颜色对比度**:符合 WCAG AA 标准的颜色组合
### 键盘快捷键
| 组件 | 按键 |
|-----------|-------|
| Button | Enter, Space |
| Checkbox/Switch | Space 切换 |
| Select | Arrow 键,Enter 选择,Esc 关闭 |
| Dialog | Esc 关闭 |
| Tabs | Arrow 键导航 |
| Dropdown | Arrow 键,Enter 选择 |
---
## 相关链接
- [Radix UI Primitives](https://www.radix-ui.com/) - 无头 UI 组件库
- [Tailwind CSS](https://tailwindcss.com/) - 实用优先 CSS 框架
- [shadcn/ui](https://ui.shadcn.com/) - 组件模式参考
- [CVA Documentation](https://cva.style/) - Class Variance Authority