# UI 设计规范 — 平台层必须 100% 复用 CarLog UI
> **核心原则**:用户很喜欢 CarLog 现有 UI。**平台层新页面(GlobalSettings / SubsystemSettings / Subsystems / Dashboard)必须严格复用现有设计系统**,不另起设计,不引入新依赖,不写新 CSS 变量。
>
> 一切样式从 `client/src/style.css` 的 CSS 变量 + 工具类 + 现有组件取。
---
## 0. 不做的事(明确边界)
- ❌ **不引入新 UI 库**(ant-design / element-plus / naive-ui / vuetify 都不行)
- ❌ **不写新的 CSS 变量**(除非有明确理由并记录)
- ❌ **不写 styled-component / CSS module / scoped 颜色**
- ❌ **不另起一套设计语言**(不要"平台层用 X 配色 / Y 字体")
- ❌ **不要 inline `style="color: #xxx"`**(用 `.text-brand` / `.text-danger` 等类)
- ❌ **不要自定义 button 样式**(用 `.btn` + 变体)
---
## 1. 设计令牌(CSS 变量)
全部定义在 `client/src/style.css` 顶部 `:root`。**直接用,不要复制**:
```css
/* 颜色 */
--bg: #E8F4F9; /* 页面背景(淡蓝) */
--bg-soft: #F2F8FB; /* 卡片 hover / 二级背景 */
--card: #FFFFFF; /* 卡片背景 */
--text: #0F2233; /* 主文字(深蓝近黑) */
--text-soft: #5A6F80; /* 次要文字 */
--text-mute: #8A9CAB; /* 辅助文字 / 描述 */
--line: #E1ECF2; /* 分隔线 / 输入框边框 */
--accent: #0F2233; /* 主按钮背景(深蓝近黑) */
--accent-soft: #1A3A55; /* 主按钮 hover */
--brand: #1E5B8A; /* 蓝色 brand(链接 / 强调) */
--brand-soft: #2C7AB0;
--green: #4DBA9A; /* 成功 */
--warn: #E8A33D; /* 警告 */
--danger: #D9695C; /* 错误 */
--info: #5AA8D8; /* 信息 */
/* 圆角 */
--radius: 14px;
--radius-sm: 8px;
--radius-lg: 22px;
--pill: 999px;
/* 字体 */
--font: 'Outfit', system-ui, -apple-system, 'PingFang SC', 'Microsoft YaHei', sans-serif;
/* 阴影 */
--card-shadow: 0 2px 8px rgba(40, 80, 110, 0.06);
--card-shadow-hover: 0 4px 16px rgba(40, 80, 110, 0.10);
```
---
## 2. 工具类速查表
全部在 `client/src/style.css`,**直接 `
` 这样用**:
### 2.1 按钮
```html
```
| 类 | 用途 |
|---|---|
| `.btn` | 基础(inline-flex / 圆角 / 过渡) |
| `.btn-primary` | 主操作(深蓝背景白字) |
| `.btn-ghost` | 次要(透明 + 边框) |
| `.btn-danger` | 危险(红背景白字) |
| `.btn-danger-outline` | 危险但次要(红边框) |
| `.btn-sm` | 小尺寸 |
### 2.2 卡片
```html
标题
内容
```
- `.card` — 白底 + 圆角 + 阴影
- `.card-pad` — 24px padding(默认所有卡片都用这个)
### 2.3 输入控件
```html
```
### 2.4 标签 / Pill
```html
新
完成
待办
错误
默认
```
### 2.5 文字颜色
```html
普通
次要
辅助
蓝色强调
成功
错误
```
### 2.6 布局
```html
左
中
右
```
| 类 | 效果 |
|---|---|
| `.flex` / `.flex-col` | flex 布局 |
| `.items-center` / `.justify-between` / `.justify-center` | flex 对齐 |
| `.gap-2` / `gap-3` / `gap-4` / `gap-6` | gap 8/12/16/24px |
| `.mt-2/3/4/6` / `.mb-2/3/4/6` | margin-top/bottom 8/12/16/24px |
| `.row` | flex 横向 + gap |
### 2.7 响应式
```html
只在手机显示
只在桌面显示
```
断点(在 `style.css`):
- `--bp-sm` 480px(小屏手机)
- `--bp-md` 768px(大屏手机/小平板)
- `--bp-lg` 1024px(平板)
- `--bp-xl` 1440px(桌面)
移动端样式(在 `style.css` 已自动处理):
- `
` 自动 16px(防 iOS 缩放)
- `table.data` 自动横向滚动
- `.container` 自动 padding 调整
### 2.8 表格
```html
```
- 自动 hover 高亮(`tr:hover td`)
- 移动端自动横向滚动
---
## 3. 布局组件(必须复用)
### 3.1 AppLayout.vue — 所有页面顶层
```vue
页面标题
副标题
内容
```
**所有平台层 view 必须用 `
` 包起来**(Settings.vue / WashesList.vue 等都这么做)。
### 3.2 AppHeader.vue — 顶栏
现有 AppHeader.vue 已经包含左侧菜单 + 用户信息 + 主题切换。**平台层不需要新写顶栏**,复用现有的。
### 3.3 MobileCardList.vue — 移动端列表
```vue
```
平台层如有列表(Subsystems.vue),桌面端用 `table.data`,移动端用 `` 兜底(参考 `WashesList.vue` 怎么用)。
### 3.4 StatCard.vue — 数据卡片
```vue
```
平台 Dashboard 用这个组件展示统计数据。
### 3.5 ChartBlock.vue — 图表
```vue
```
平台 Dashboard 如果有图表就用这个。
### 3.6 ConfirmDangerDialog.vue — 危险操作确认
```vue
```
平台层启停 / 删除子系统前用这个。
### 3.7 AiFallbackModal.vue — AI 失败兜底
平台层暂不需要(无 AI 集成)。保留供将来用。
---
## 4. 平台层 view 模板(参考 Settings.vue)
### 4.1 GlobalSettings.vue(总设置)
```vue
总设置
全局 UI / 备份 / Dashboard 配置
加载中…
{{ error }}
```
### 4.2 SubsystemSettings.vue(通用渲染器)
跟 GlobalSettings 同结构,**每个字段用 `` 包 label + 控件**:
```vue
{{ subsystemName }} 设置
子系统配置(保存到 platform_settings 表)
加载中…
{{ error }}
```
### 4.3 Subsystems.vue(管理页)
```vue
子系统管理
启停 / 注册子系统
加载中…
{{ error }}
```
### 4.4 Dashboard.vue(替换现有 Home.vue)
参考现有 `Home.vue` 用 `StatCard` + `ChartBlock`:
```vue
Dashboard
i 平台概览
```
---
## 5. 错误 / 消息样式
### 5.1 加载中
```html
加载中…
```
### 5.2 错误
```html
{{ error }}
```
### 5.3 操作成功 / 失败消息(表单内)
```html
已保存
保存失败:{{ error }}
```
### 5.4 提示文字(灰色小字)
```html
说明文字
```
---
## 6. 标题层级
```html
页面大标题
卡片内分节标题
小节标题
```
- `class="title"` — 页面级(h1)
- `class="section-title"` — 卡片内分节(h2)
- `class="subsection-title"` — 小节(h3)
(参考 `Settings.vue` 里 `
` + `` 的用法)
---
## 7. 主题色使用规则
| 场景 | 用什么 |
|---|---|
| 主操作按钮 | `.btn-primary`(深蓝近黑) |
| 次要按钮 | `.btn-ghost` |
| 危险操作(删除/禁用) | `.btn-danger` / `.btn-danger-outline` |
| 链接 / 强调文字 | `.text-brand` |
| 成功提示 | `.text-green` / `.pill-green` |
| 警告 | `.text-warn`(无对应工具类但 CSS 变量有 `var(--warn)`) / `.pill-warn` |
| 错误 | `.text-danger` / `.pill-danger` |
| 描述文字 | `.text-soft` |
| 占位 / 不可点 | `.text-mute` |
---
## 8. 移动端注意事项
- 所有 `` 自动 16px(iOS 防缩放,已在 style.css 处理)
- `
` 自动横向滚动
- 用 `.mobile-only` / `.desktop-only` 切换桌面/移动组件
- 不要写 fixed width(用 max-width + 自适应)
- Container padding 自带响应式(不用自己写)
---
## 9. Trae 自检清单(提交前过一遍)
提交 PR 前 Trae 自己 grep 检查:
```bash
# 1. 没有任何 inline style 写颜色
grep -rn "style=\"color:" client/src/views/Platform/
# 期望: 没有输出
# 2. 没有任何引入新 UI 库
grep -rn "ant-design\|element-plus\|naive-ui\|vuetify\|@mui" client/src/
# 期望: 没有输出
# 3. 所有平台 view 用了 AppLayout
grep -L "AppLayout" client/src/views/Platform/*.vue
# 期望: 没有输出(每个文件都 import 了)
# 4. 没有写新的 CSS 变量(除非 style.css 里没有的)
grep -rn "^ --" client/src/views/Platform/
# 期望: 没有输出(变量定义在 style.css,不在 view 里)
```
---
## 10. Mavis review 时会看的 UI 验收点
我(reviewer)会按这个清单看:
- [ ] 所有平台 view 顶部用 `` 包(看 template 第一行)
- [ ] 颜色 / 字体 / 间距全部走 CSS 变量(grep `style="color"` 应该没结果)
- [ ] 没有引入新 UI 库(package.json + 静态分析)
- [ ] 没有新加 CSS 变量(除非 style.css 里没的)
- [ ] 按钮用 `.btn` + 变体,不是 `