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