geo/docs/02-design/ui-style-guide.md

444 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GEO 平台 - UI 风格指南
## 概述
本文档定义 GEO 平台的前端 UI 风格规范确保全平台视觉一致性。所有前端开发人员、UI 设计师和产品经理应遵循本指南进行界面设计和开发。
GEO 平台的 UI 设计遵循以下核心原则:
- **专业可信**:体现企业级 SaaS 平台的专业感和可信度
- **简洁高效**:减少视觉噪音,让用户聚焦于数据和操作
- **层次分明**:通过清晰的信息层级引导用户注意力
- **响应式适配**:适配桌面端、平板和移动端设备
## 风格特征总结
### 设计语言
| 特征 | 描述 | 应用场景 |
|------|------|----------|
| 扁平化设计 | 去除冗余装饰,强调内容和功能 | 全局 |
| 卡片化布局 | 使用卡片容器组织信息模块 | 仪表盘、列表页 |
| 留白呼吸感 | 充足的内边距和外边距 | 全局 |
| 微妙的层次感 | 通过阴影和边框区分层级 | 卡片、弹窗、下拉 |
| 数据可视化 | 丰富的图表和数据展示 | 仪表盘、报告页 |
| 状态色彩编码 | 使用颜色直观表达状态 | 状态标签、进度条 |
### 整体氛围
- **主色调**:深蓝/靛蓝色系,传达专业、科技、可信
- **辅助色**:翠绿色表示成功/正向,琥珀色表示警告,红色表示错误
- **中性色**:丰富的灰度层级用于文字和边框
- **背景**:浅色背景为主,深色模式作为可选项
## Design Tokens
### 颜色体系
#### 主色调Primary
| Token | 色值 | 用途 |
|-------|------|------|
| `--color-primary-50` | `#EEF2FF` | 极浅背景、hover 状态 |
| `--color-primary-100` | `#E0E7FF` | 轻色背景、选中状态 |
| `--color-primary-200` | `#C7D2FE` | 边框高亮 |
| `--color-primary-300` | `#A5B4FC` | 禁用状态主色 |
| `--color-primary-400` | `#818CF8` | 次要强调 |
| `--color-primary-500` | `#6366F1` | **主色** - 按钮、链接、图标 |
| `--color-primary-600` | `#4F46E5` | 按钮 hover、深色调 |
| `--color-primary-700` | `#4338CA` | 按钮 active |
| `--color-primary-800` | `#3730A3` | 深色背景文字 |
| `--color-primary-900` | `#312E81` | 标题、深色元素 |
#### 语义色Semantic
| Token | 色值 | 用途 |
|-------|------|------|
| `--color-success-50` | `#F0FDF4` | 成功状态轻背景 |
| `--color-success-500` | `#22C55E` | **成功** - 成功提示、正向指标 |
| `--color-success-600` | `#16A34A` | 成功 hover |
| `--color-warning-50` | `#FFFBEB` | 警告状态轻背景 |
| `--color-warning-500` | `#F59E0B` | **警告** - 警告提示、待处理 |
| `--color-warning-600` | `#D97706` | 警告 hover |
| `--color-error-50` | `#FEF2F2` | 错误状态轻背景 |
| `--color-error-500` | `#EF4444` | **错误** - 错误提示、失败状态 |
| `--color-error-600` | `#DC2626` | 错误 hover |
| `--color-info-50` | `#EFF6FF` | 信息状态轻背景 |
| `--color-info-500` | `#3B82F6` | **信息** - 信息提示 |
#### 中性色Neutral
| Token | 色值 | 用途 |
|-------|------|------|
| `--color-gray-50` | `#F9FAFB` | 页面背景、hover 背景 |
| `--color-gray-100` | `#F3F4F6` | 卡片背景、分隔背景 |
| `--color-gray-200` | `#E5E7EB` | 边框、分隔线 |
| `--color-gray-300` | `#D1D5DB` | 禁用边框、占位符 |
| `--color-gray-400` | `#9CA3AF` | 次要文字、图标 |
| `--color-gray-500` | `#6B7280` | 辅助文字 |
| `--color-gray-600` | `#4B5563` | 正文文字 |
| `--color-gray-700` | `#374151` | 标题文字 |
| `--color-gray-800` | `#1F2937` | 深色标题 |
| `--color-gray-900` | `#111827` | 主标题、深色文字 |
### 圆角Border Radius
| Token | 值 | 用途 |
|-------|-----|------|
| `--radius-none` | `0` | 直角(表格、特殊场景) |
| `--radius-sm` | `4px` | 小元素(标签、徽章) |
| `--radius-md` | `6px` | 默认(按钮、输入框) |
| `--radius-lg` | `8px` | 卡片、容器 |
| `--radius-xl` | `12px` | 大卡片、模态框 |
| `--radius-2xl` | `16px` | 页面级容器 |
| `--radius-full` | `9999px` | 圆形(头像、状态点) |
### 阴影Shadow
| Token | 值 | 用途 |
|-------|-----|------|
| `--shadow-sm` | `0 1px 2px 0 rgba(0,0,0,0.05)` | 轻微提升(按钮 hover |
| `--shadow-md` | `0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)` | 卡片默认 |
| `--shadow-lg` | `0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)` | 下拉菜单、浮层 |
| `--shadow-xl` | `0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px -6px rgba(0,0,0,0.1)` | 模态框、抽屉 |
| `--shadow-inner` | `inset 0 2px 4px 0 rgba(0,0,0,0.05)` | 内嵌效果 |
### 字体Typography
#### 字体族
| Token | 值 | 用途 |
|-------|-----|------|
| `--font-sans` | `Inter, "PingFang SC", "Microsoft YaHei", sans-serif` | 正文、UI 文字 |
| `--font-mono` | `"JetBrains Mono", "Fira Code", monospace` | 代码、数据值 |
#### 字号层级
| Token | 大小 | 字重 | 行高 | 用途 |
|-------|------|------|------|------|
| `--text-xs` | `12px` | 400 | `16px` | 辅助说明、时间戳 |
| `--text-sm` | `14px` | 400 | `20px` | 次要文字、描述 |
| `--text-base` | `16px` | 400 | `24px` | **正文默认** |
| `--text-lg` | `18px` | 500 | `28px` | 小标题、强调文字 |
| `--text-xl` | `20px` | 600 | `28px` | 卡片标题 |
| `--text-2xl` | `24px` | 600 | `32px` | 页面小标题 |
| `--text-3xl` | `30px` | 700 | `36px` | 页面标题 |
| `--text-4xl` | `36px` | 700 | `40px` | 大标题、数字展示 |
### 间距Spacing
| Token | 值 | 用途 |
|-------|-----|------|
| `--space-1` | `4px` | 极小间距 |
| `--space-2` | `8px` | 紧凑间距(图标与文字) |
| `--space-3` | `12px` | 小间距 |
| `--space-4` | `16px` | **默认间距**(内边距基础) |
| `--space-5` | `20px` | 中等间距 |
| `--space-6` | `24px` | 卡片内边距 |
| `--space-8` | `32px` | 区块间距 |
| `--space-10` | `40px` | 大区块间距 |
| `--space-12` | `48px` | 页面级间距 |
| `--space-16` | `64px` | 大页面间距 |
## 组件改造计划
GEO 平台基于 shadcn/ui 组件库进行构建,以下是对核心组件的定制化规范。
### Button 按钮
| 变体 | 背景 | 文字 | 边框 | Hover | 用途 |
|------|------|------|------|-------|------|
| `default` | `primary-500` | white | none | `primary-600` | 主要操作 |
| `secondary` | `gray-100` | `gray-900` | none | `gray-200` | 次要操作 |
| `outline` | transparent | `gray-700` | `gray-200` | `gray-50` | 辅助操作 |
| `ghost` | transparent | `gray-700` | none | `gray-100` | 极简操作 |
| `destructive` | `error-500` | white | none | `error-600` | 危险操作 |
| `link` | transparent | `primary-500` | none | underline | 链接样式 |
**尺寸规范**
- `sm``h-8 px-3 text-sm`
- `md`(默认):`h-10 px-4 text-base`
- `lg``h-12 px-6 text-lg`
### Card 卡片
```
默认样式:
- 背景white
- 圆角:`radius-lg` (8px)
- 阴影:`shadow-md`
- 内边距:`space-6` (24px)
- 边框:`1px solid gray-200`
Hover 状态:
- 阴影提升:`shadow-lg`
- 过渡:`transition-shadow duration-200`
```
**卡片变体**
| 变体 | 说明 |
|------|------|
| `default` | 标准卡片,用于信息展示 |
| `stats` | 统计卡片,大号数字 + 描述 |
| `interactive` | 可交互卡片hover 有明显反馈 |
| `flat` | 扁平卡片,无阴影,用于列表项 |
### Input 输入框
```
默认样式:
- 高度:`h-10`
- 圆角:`radius-md` (6px)
- 边框:`1px solid gray-300`
- 内边距:`px-3`
- 字体:`text-base`
- 背景white
Focus 状态:
- 边框:`primary-500`
- 阴影:`0 0 0 2px primary-100`
- 过渡:`transition-all duration-200`
错误状态:
- 边框:`error-500`
- 阴影:`0 0 0 2px error-50`
```
### Badge 标签
| 变体 | 背景 | 文字 | 用途 |
|------|------|------|------|
| `default` | `primary-100` | `primary-700` | 默认标签 |
| `secondary` | `gray-100` | `gray-700` | 次要标签 |
| `success` | `success-50` | `success-600` | 成功状态 |
| `warning` | `warning-50` | `warning-600` | 警告状态 |
| `error` | `error-50` | `error-600` | 错误状态 |
| `info` | `info-50` | `info-600` | 信息状态 |
### Table 表格
```
默认样式:
- 表头背景:`gray-50`
- 表头文字:`gray-700` font-medium text-sm
- 行高:`h-12`
- 行边框:`border-b border-gray-200`
- 行 hover`bg-gray-50`
- 单元格内边距:`px-4 py-3`
- 空状态:居中显示插图 + 提示文字
```
**特殊行样式**
| 状态 | 样式 |
|------|------|
| 选中行 | `bg-primary-50` |
| 禁用行 | `opacity-50` |
| 高亮行 | `bg-warning-50` |
### Modal / Dialog 模态框
```
默认样式:
- 遮罩:`bg-black/50`
- 容器背景white
- 圆角:`radius-xl` (12px)
- 阴影:`shadow-xl`
- 最大宽度:`max-w-lg` (512px)
- 内边距:`p-6`
- 动画fade-in + scale-in
头部:
- 标题:`text-lg font-semibold`
- 关闭按钮:右上角 ghost 按钮
底部操作区:
- 居右排列
- 主按钮在右,次按钮在左
- 间距:`gap-3`
```
### Toast 通知
| 类型 | 图标 | 背景 | 边框 |
|------|------|------|------|
| `success` | CheckCircle | white | `success-200` |
| `warning` | AlertTriangle | white | `warning-200` |
| `error` | XCircle | white | `error-200` |
| `info` | Info | white | `info-200` |
```
默认样式:
- 位置:右上角固定
- 最大宽度:`400px`
- 圆角:`radius-lg`
- 阴影:`shadow-lg`
- 内边距:`p-4`
- 自动关闭:`5秒`
- 动画slide-in-right + fade-out
```
### Navigation 导航
**侧边栏导航**
```
默认样式:
- 宽度:`w-64` (256px)
- 背景:`gray-900`
- 文字:`gray-300`
选中状态:
- 背景:`primary-600`
- 文字white
- 左侧边框指示:`3px solid primary-400`
Hover 状态:
- 背景:`gray-800`
- 文字white
```
**顶部导航**
```
默认样式:
- 高度:`h-16`
- 背景white
- 边框:`border-b border-gray-200`
- 阴影:`shadow-sm`
```
## 交互规范
### 过渡动画
| 场景 | 时长 | 缓动函数 | 属性 |
|------|------|----------|------|
| 按钮 hover | `150ms` | `ease-in-out` | `background-color, border-color, box-shadow` |
| 卡片 hover | `200ms` | `ease-out` | `box-shadow, transform` |
| 模态框出现 | `200ms` | `cubic-bezier(0.16, 1, 0.3, 1)` | `opacity, transform` |
| 下拉菜单 | `150ms` | `ease-out` | `opacity, transform` |
| Toast 出现/消失 | `300ms` | `ease-in-out` | `opacity, transform` |
| 页面切换 | `200ms` | `ease-in-out` | `opacity` |
| 数据加载骨架屏 | `pulse 2s infinite` | - | `opacity` |
### 加载状态
| 场景 | 样式 |
|------|------|
| 页面加载 | 全屏骨架屏 + Logo |
| 数据加载 | 卡片/表格骨架屏 |
| 按钮加载 | 按钮内 Spinner禁用点击 |
| 无限滚动 | 底部 Spinner |
| 文件上传 | 进度条 + 百分比 |
### 空状态
```
统一空状态样式:
- 居中布局
- 插图/图标:`primary-200` 色调
- 标题:`text-lg font-medium text-gray-700`
- 描述:`text-sm text-gray-500`
- 操作按钮(可选):`primary` 按钮
```
### 错误状态
```
统一错误状态样式:
- 错误图标:`error-500` 色的 AlertTriangle
- 标题:`text-lg font-medium text-gray-900`
- 描述:`text-sm text-gray-600`
- 重试按钮:`outline` 按钮
- 错误详情(可选):可展开的折叠面板
```
### 表单校验
```
校验提示样式:
- 错误信息:`text-xs text-error-500 mt-1`
- 错误图标:输入框右侧 `error-500` 图标
- 成功图标:输入框右侧 `success-500` Check 图标
- 实时校验:输入后 `300ms` 延迟触发
```
## 布局规范
### 页面结构
```
┌─────────────────────────────────────────────┐
│ 顶部导航栏 (h-16, fixed) │
├──────────┬──────────────────────────────────┤
│ │ 页面标题区 │
│ 侧边栏 │ ┌────────────────────────────┐ │
│ (w-64) │ │ 内容区 │ │
│ fixed │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │ │ │ 卡片 │ │ 卡片 │ │ 卡片 │ │ │
│ │ │ └──────┘ └──────┘ └──────┘ │ │
│ │ │ ┌────────────────────────┐ │ │
│ │ │ │ 表格/列表 │ │ │
│ │ │ └────────────────────────┘ │ │
│ │ └────────────────────────────┘ │
└──────────┴──────────────────────────────────┘
```
### 响应式断点
| 断点 | 宽度 | 布局调整 |
|------|------|----------|
| `sm` | `640px` | 移动端基础适配 |
| `md` | `768px` | 侧边栏可折叠 |
| `lg` | `1024px` | 完整桌面布局 |
| `xl` | `1280px` | 宽屏扩展 |
| `2xl` | `1536px` | 超宽屏 |
### 网格系统
- 采用 CSS Grid + Flexbox 混合布局
- 仪表盘卡片网格:`grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4`
- 卡片间距:`gap-6`
- 页面最大宽度:`max-w-7xl` (1280px),居中显示
## 图表规范
GEO 平台大量使用数据可视化图表,基于 Recharts 实现。
### 配色方案
```
图表主色系:
- 系列 1`#6366F1` (primary-500)
- 系列 2`#22C55E` (success-500)
- 系列 3`#F59E0B` (warning-500)
- 系列 4`#EF4444` (error-500)
- 系列 5`#8B5CF6` (violet-500)
- 系列 6`#06B6D4` (cyan-500)
```
### 图表样式
```
通用样式:
- 背景:透明
- 网格线:`gray-200`,虚线
- 坐标轴文字:`gray-500`text-xs
- 图例:底部居中
- Tooltip白色背景圆角阴影
柱状图:
- 圆角:`radius-sm` 顶部
- 间距:`barGap=4`
折线图:
- 线条宽度:`2px`
- 数据点:`r=4`hover `r=6`
- 填充区域:`fillOpacity=0.1`
饼图/环形图:
- 内半径:`60%`
- 标签:外部引导线 + 百分比
```
---
*本文档定义 GEO 平台的 UI 风格规范,所有前端实现应严格遵循以上 Design Tokens 和组件规范。*