# 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 和组件规范。*
