Files
EasyFlow/docs/design/design-tokens-draft.md
陈子默 37e185e74a docs: 补充现代工作台设计规范
- 完善产品主题、组件语言与交互动效的设计说明

- 补充导航骨架、表面层级与设计 Token 的现代化规范
2026-03-06 20:04:13 +08:00

404 lines
12 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.
# 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 实际代码映射表