# EasyFlow Design Tokens 草案 v1

## 1. 文档目标

本草案用于定义 EasyFlow 后续主题系统、设计变量与公共层实现的统一方向，指导 `@core/base/design`、`@core/ui-kit` 与 `effects/*` 中的 Token 沉淀方式。

本草案不要求一次性重构所有现有 Token，而是用于：

- 为后续主题统一提供命名和分层标准
- 为设计与前端提供同一套语义映射
- 为浅色 / 深色、三端统一和组件族一致性提供基础
- 为 EasyFlow 从传统管理后台视觉演进到现代工作台视觉提供稳定底座

## 2. Token 设计原则

### 2.1 先语义，后数值

优先暴露“用途”而不是“值”。

推荐：

- `--color-primary`
- `--color-text-strong`
- `--radius-panel`

不推荐直接在页面层使用：

- `#1677FF`
- `16px`
- `0 20px 40px ...`

### 2.2 全局 Token 与组件 Token 分层

建议分为三层：

1. `Foundation Tokens`
   - 原始色阶、字号、间距、圆角、阴影、时长、z-index
2. `Semantic Tokens`
   - 主色、文本、背景、边框、状态、焦点、浮层等产品语义
3. `Component Alias Tokens`
   - 按钮、输入框、卡片、表格、抽屉、弹窗等组件专用映射

### 2.3 页面不直接发明视觉体系

页面层可消费组件 Token 或语义 Token，不直接定义新的品牌色、中性色、阴影和圆角体系。

### 2.4 Token 必须服务现代工作台体验

Token 不只是为了“统一”，还要确保 EasyFlow 能稳定呈现更现代的产品气质。

应优先支持：

- 更鲜明的品牌色角色，而不是只剩一个主按钮蓝
- 更清晰的表面层级，而不是靠边框堆结构
- 更轻的导航骨架材质，如轻度液态玻璃、弱染色表面、轻悬浮
- 更开放的大屏工作台布局，而不是传统表单后台的硬切分区

## 3. 推荐目录与命名方向

建议未来逐步按以下能力组织：

```text
design-tokens/
  color/
    foundation.css
    semantic-light.css
    semantic-dark.css
  radius.css
  shadow.css
  spacing.css
  typography.css
  motion.css
  z-index.css
  component/
    button.css
    input.css
    panel.css
    modal.css
    table.css
```

若短期内不拆文件，也建议先遵守同样的命名语义。

## 4. 色彩 Token 草案

### 4.1 品牌色

| Token | 值 | 说明 |
| --- | --- | --- |
| `--color-primary` | `#1677FF` | 主按钮、选中态、焦点、关键链接 |
| `--color-primary-hover` | `#3D8BFF` | 主按钮悬停 |
| `--color-primary-active` | `#0F5FD6` | 主按钮按下 |
| `--color-primary-soft` | `#EAF3FF` | 品牌浅底 |
| `--color-primary-container` | `#DDEBFF` | 品牌容器 / 当前态柔和承载面 |
| `--color-primary-foreground` | `#FFFFFF` | 品牌色上的文字 |

补充：

- 参考 Material Design 3 的 `color roles` 思路，品牌色不应只出现在按钮，还应进入导航当前态、局部染色表面、焦点和关键反馈。
- 参考 Apple 导航骨架表达，品牌色进入表面层时应优先使用低浓度容器色，而不是整块纯色铺底。

### 4.2 中性色

| Token | 值 | 说明 |
| --- | --- | --- |
| `--color-bg-app` | `#F6F8FB` | 页面背景 |
| `--color-bg-canvas` | `#F2F5F9` | 内容画布或区域底色 |
| `--color-bg-panel` | `#FFFFFF` | 卡片、面板、弹窗主背景 |
| `--color-bg-subtle` | `#F8FAFD` | 次层背景 |
| `--color-bg-elevated` | `#FCFDFF` | 轻浮起表面 |
| `--color-bg-glass` | `rgba(255,255,255,0.72)` | 轻度液态玻璃表面 |
| `--color-bg-hover` | `#EEF3F9` | hover 背景 |
| `--color-border` | `#DCE3EC` | 常规边框 |
| `--color-border-strong` | `#CBD6E2` | 稍强边框 |
| `--color-divider` | `#E6EDF5` | 分割线 |
| `--color-text-strong` | `#1C2430` | 主文本 |
| `--color-text` | `#334154` | 正文 |
| `--color-text-secondary` | `#5B6574` | 次文本 |
| `--color-text-muted` | `#8691A2` | 辅助文本 |
| `--color-text-disabled` | `#A7B1BF` | 禁用文本 |

### 4.3 语义色

| Token | 值 | 说明 |
| --- | --- | --- |
| `--color-success` | `#2FA36B` | 成功 |
| `--color-success-soft` | `#EAF8F1` | 成功浅底 |
| `--color-warning` | `#D89A27` | 警告 |
| `--color-warning-soft` | `#FFF6E5` | 警告浅底 |
| `--color-danger` | `#D84F5F` | 错误 / 危险 |
| `--color-danger-soft` | `#FDECEF` | 错误浅底 |
| `--color-info` | `#4B83D8` | 信息 |
| `--color-info-soft` | `#EEF4FF` | 信息浅底 |

### 4.4 深色模式建议

深色模式不是简单反相，建议维持以下结构：

- `--color-bg-app-dark`: 石墨深灰
- `--color-bg-panel-dark`: 比背景略亮一层
- `--color-border-dark`: 低对比灰蓝
- `--color-text-strong-dark`: 高亮浅灰
- `--color-primary-dark`: 延续主蓝，但不大幅提高饱和度

### 4.5 导航与骨架表面 Token 草案

这组 Token 用于支撑顶栏、侧栏、tab、搜索入口、浮层等“现代工作台骨架”。

| Token | 建议值 | 说明 |
| --- | --- | --- |
| `--color-nav-surface` | `rgba(255,255,255,0.78)` | 导航主表面 |
| `--color-nav-surface-subtle` | `rgba(255,255,255,0.64)` | 导航次层表面 |
| `--color-nav-item-hover` | `rgba(22,119,255,0.08)` | 导航 hover |
| `--color-nav-item-active` | `rgba(22,119,255,0.14)` | 导航当前态容器 |
| `--color-nav-item-active-text` | `#125ACC` | 导航当前态文字 |
| `--color-nav-muted-text` | `#536174` | 导航弱文本 |
| `--color-glass-border` | `rgba(255,255,255,0.68)` | 玻璃表面边界高光 |

说明：

- 这组 Token 不鼓励厚边框和强高光，而是为“轻度液态玻璃 + 柔和染色 + 轻悬浮”提供统一语义。
- 页面层不得自己发明玻璃 rgba 值，应优先回到 Token。

## 5. 圆角 Token 草案

| Token | 值 | 用途 |
| --- | --- | --- |
| `--radius-xs` | `8px` | 标签、小型徽标 |
| `--radius-sm` | `10px` | 按钮、输入框 |
| `--radius-md` | `12px` | 下拉面板、工具条 |
| `--radius-lg` | `16px` | 卡片、主面板 |
| `--radius-xl` | `20px` | 抽屉、弹窗 |
| `--radius-pill` | `999px` | 胶囊标签、分段控件 |

说明：

- 圆角应该柔和但理性，不做玩具化超大圆角。
- 页面层禁止新增“只适合本页”的圆角数值。
- 导航工具按钮、搜索入口、轻浮层控制点可适度更圆润，但必须通过共享 Token 表达，而不是页面层临时放大圆角。

## 6. 阴影 Token 草案

| Token | 建议值 | 用途 |
| --- | --- | --- |
| `--shadow-sm` | `0 10px 24px -24px rgba(18, 36, 62, 0.18)` | 基础卡片 |
| `--shadow-md` | `0 18px 36px -28px rgba(18, 36, 62, 0.22)` | 菜单、浮层 |
| `--shadow-lg` | `0 28px 56px -32px rgba(18, 36, 62, 0.26)` | 弹窗、抽屉 |
| `--shadow-glass` | `0 18px 40px -30px rgba(18, 36, 62, 0.2)` | 玻璃骨架 / 导航悬浮 |

说明：

- 阴影用于表达层级，不用于制造厚重“高级感”。
- 同一页面内避免多套阴影并存。
- 对导航骨架，优先使用轻玻璃阴影和表面层差，而不是把阴影做厚。

## 7. 间距 Token 草案

使用 8pt 体系，建议保留以下档位：

| 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` |

说明：

- `12px` 和 `20px` 可用于组件内部微调。
- 页面主节奏优先使用 `8 / 16 / 24 / 32`。

## 8. 字体 Token 草案

### 8.1 字体族

```text
--font-family-sans:
  "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
```

### 8.2 字号层级

| Token | 值 | 用途 |
| --- | --- | --- |
| `--font-size-xs` | `12px` | 辅助说明、标签 |
| `--font-size-sm` | `13px` | 次级信息 |
| `--font-size-base` | `14px` | 正文 |
| `--font-size-md` | `16px` | 表单标题、小区块标题 |
| `--font-size-lg` | `18px` | 页面次标题 |
| `--font-size-xl` | `20px` | 页面标题 |
| `--font-size-2xl` | `24px` | 首页或核心模块标题 |

### 8.3 字重建议

| Token | 值 |
| --- | --- |
| `--font-weight-regular` | `400` |
| `--font-weight-medium` | `500` |
| `--font-weight-semibold` | `600` |

说明：

- 常规产品界面避免大量 `700` 字重。
- 强调信息优先通过层级和留白表达，而不是一味加粗。

## 9. 动效 Token 草案

### 9.1 时长

| Token | 值 | 用途 |
| --- | --- | --- |
| `--motion-duration-fast` | `120ms` | 微交互 |
| `--motion-duration-base` | `160ms` | hover / focus / icon 变化 |
| `--motion-duration-medium` | `220ms` | 面板切换 |
| `--motion-duration-slow` | `280ms` | 弹窗 / 抽屉 |

### 9.2 缓动

| Token | 值 | 用途 |
| --- | --- | --- |
| `--motion-ease-standard` | `cubic-bezier(0.2, 0, 0, 1)` | 常规过渡 |
| `--motion-ease-decelerate` | `cubic-bezier(0.16, 1, 0.3, 1)` | 进入动画 |
| `--motion-ease-accelerate` | `cubic-bezier(0.3, 0, 1, 1)` | 离开动画 |

说明：

- 尽量统一到有限几档，不在组件里各自发明缓动函数。
- 当前仓库已有若干 `transition.css` 和 `ui.css` 动效定义，后续应逐步向统一 Token 收口。

## 10. z-index Token 草案

| Token | 值 | 用途 |
| --- | --- | --- |
| `--z-base` | `1` | 常规内容 |
| `--z-dropdown` | `1000` | 下拉、浮层 |
| `--z-sticky` | `1100` | 吸顶工具条 |
| `--z-overlay` | `1900` | 遮罩 |
| `--z-popup` | `2000` | 弹窗、抽屉 |
| `--z-toast` | `2100` | 全局消息 |

## 11. 组件别名 Token 草案

### 11.1 Button

```text
--button-height-sm: 32px
--button-height-md: 36px
--button-height-lg: 40px
--button-radius: var(--radius-sm)
--button-primary-bg: var(--color-primary)
--button-primary-hover-bg: var(--color-primary-hover)
--button-primary-active-bg: var(--color-primary-active)
```

### 11.2 Input

```text
--input-height-md: 40px
--input-radius: var(--radius-sm)
--input-bg: var(--color-bg-panel)
--input-border: var(--color-border)
--input-border-focus: var(--color-primary)
--input-placeholder: var(--color-text-muted)
```

### 11.3 Navigation Shell

```text
--nav-surface: var(--color-nav-surface)
--nav-surface-subtle: var(--color-nav-surface-subtle)
--nav-item-hover-bg: var(--color-nav-item-hover)
--nav-item-active-bg: var(--color-nav-item-active)
--nav-item-active-text: var(--color-nav-item-active-text)
--nav-item-muted-text: var(--color-nav-muted-text)
--nav-glass-border: var(--color-glass-border)
--nav-shadow: var(--shadow-glass)
--nav-radius: var(--radius-lg)
--nav-control-radius: var(--radius-pill)
```

说明：

- 这组别名 Token 服务顶栏、侧栏、Tab、Breadcrumb、全局搜索、工具按钮等统一导航骨架。
- 导航骨架的现代感必须来自统一别名 Token，而不是页面层散落的 rgba、blur、shadow 临时值。

### 11.4 Panel

```text
--panel-radius: var(--radius-lg)
--panel-bg: var(--color-bg-panel)
--panel-border: var(--color-divider)
--panel-shadow: var(--shadow-sm)
```

### 11.5 Modal / Drawer

```text
--overlay-bg: rgba(15, 23, 42, 0.4)
--modal-radius: var(--radius-xl)
--modal-bg: var(--color-bg-panel)
--modal-shadow: var(--shadow-lg)
```

## 12. 与当前仓库的映射建议

当前仓库已存在如下方向的变量：

- `--primary`
- `--background`
- `--surface-*`
- `--text-*`
- `--shadow-*`
- `--nav-*`
- `--toolbar-*`

建议演进方式：

1. 先保留当前 Token 命名，避免一次性大改。
2. 在公共层补充新的语义映射表。
3. 新组件优先消费新语义 Token。
4. 历史组件在重构时逐步迁移，不做无收益的全面替换。

## 13. 落地策略

### 13.1 应落在 `@core/base/design`

- 色彩、圆角、阴影、间距、字号、动效、z-index 等基础 Token
- 浅色 / 深色语义映射
- 全局过渡与基础状态规则

### 13.2 应落在 `@core/ui-kit`

- 组件别名 Token
- 组件尺寸、状态、变体和内部布局规则

### 13.3 应落在 `effects/*`

- 页面工具栏
- 筛选区
- 面板骨架
- 列表页组合层

### 13.4 不应落在页面层

- 品牌主色
- 新的边框体系
- 新的圆角体系
- 新的阴影体系
- 新的动效时长或缓动

## 14. 后续建议

后续若进入真正的 Token 落地阶段，建议补充：

- `Token -> CSS Variable` 对照表
- `Token -> Figma Variable` 对照表
- 浅色 / 深色完整 token matrix
- 组件别名 token 实际代码映射表
