Files
dashboard/DESIGN.md
T
eafonyang b9ba1d5ed4 ui 优化
2026-07-10 15:00:49 +08:00

359 lines
11 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.
# Luxsin CMS Dashboard — Design System Specification
> **Version**: 1.0
> **Style**: Glassmorphism + Dimensional Layering + Dark Mode OLED
> **Scope**: Vue 3 + Element Plus SPA (内部管理系统)
---
## 1. Design Philosophy
Luxsin CMS Dashboard 采用三层融合设计语言,将登录页的精致玻璃美学统一到全站:
| 层级 | 风格 | 占比 | 职责 |
|---|---|---|---|
| **主风格** | Glassmorphism | 60% | 半透明毛玻璃表面、`backdrop-filter` 模糊、微弱边框光晕 |
| **辅助风格** | Dimensional Layering | 25% | 4 级 elevation 空间层级,通过阴影和浮起建立信息层次 |
| **辅助风格** | Dark Mode OLED | 15% | 深空黑底色保障对比度,焦点 ring 反馈,minimal glow |
### Design Principles
1. **Glass everywhere** — 侧栏、顶栏、卡片、表格、对话框、输入框全部使用半透明玻璃
2. **Depth through layers** — 4 级 elevation (bg → content → floating → overlay) 建立空间秩序
3. **Contrast first** — 所有文本确保 WCAG AA (4.5:1),关键文本 AAA (7:1)
4. **Consistency over creativity** — 统一 Token 驱动,不做页面级定制
---
## 2. Color System
### 2.1 Primitives (不可变)
```css
/* 基础色板 */
--lux-space-900: #020617;
--lux-space-800: #0a0e14; /* 页面底色 */
--lux-space-700: #0f172a; /* 输入框底色 */
--lux-space-600: #1e293b; /* 卡片底色 */
--lux-space-500: #334155;
--lux-space-400: #475569;
--lux-space-300: #94a3b8; /* muted text */
--lux-space-200: #cbd5e1;
--lux-space-100: #e2e8f0; /* strong text */
/* 品牌色 */
--lux-cyan: #38bdf8; /* 主品牌 */
--lux-cyan-light: #7dd3fc;
--lux-cyan-glow: rgba(56, 189, 248, 0.25);
--lux-indigo: #6366f1;
--lux-violet: #7c3aed;
```
### 2.2 Semantic Tokens
```css
/* 页面 */
--lux-page-bg: #0a0e14;
--lux-page-gradient: radial-gradient(ellipse 120% 90% at 50% -15%, #1a2840 0%, #0d1117 48%, #0a0e14 100%);
/* 文本 */
--lux-text-strong: #e2e8f0; /* 标题、重要文本 — 对比度 13.5:1 */
--lux-text-body: #cbd5e1; /* 正文 — 对比度 10.2:1 */
--lux-text-muted: #94a3b8; /* 辅助文本 — 对比度 5.8:1 */
--lux-text-dim: #64748b; /* 最弱文本 — 对比度 3.5:1 (仅装饰性) */
/* 玻璃表面 */
--lux-glass-bg-card: rgba(30, 41, 59, 0.55); /* 卡片 */
--lux-glass-bg-table: rgba(30, 41, 59, 0.45); /* 表格 */
--lux-glass-bg-input: rgba(15, 23, 42, 0.45); /* 输入框 */
--lux-glass-bg-dialog: rgba(30, 41, 59, 0.72); /* 对话框 */
--lux-glass-bg-sidebar: rgba(15, 23, 42, 0.60); /* 侧栏 */
--lux-glass-bg-header: rgba(30, 41, 59, 0.75); /* 顶栏 */
--lux-glass-bg-tab: rgba(30, 41, 59, 0.35); /* 标签页 */
/* 玻璃边框 */
--lux-glass-border: rgba(255, 255, 255, 0.08);
--lux-glass-border-hover: rgba(255, 255, 255, 0.14);
--lux-glass-border-focus: rgba(56, 189, 248, 0.45);
/* 模糊强度 */
--lux-blur-sm: blur(8px);
--lux-blur-md: blur(14px);
--lux-blur-lg: blur(20px);
--lux-blur-xl: blur(24px);
```
### 2.3 Elevation Shadows
```css
/* 4级 Elevation */
--lux-shadow-1: 0 2px 8px rgba(0, 0, 0, 0.18); /* 卡片 resting */
--lux-shadow-2: 0 4px 16px rgba(0, 0, 0, 0.25); /* 卡片 hover / 浮起 */
--lux-shadow-3: 0 8px 32px rgba(0, 0, 0, 0.35); /* 弹出层 */
--lux-shadow-4: 0 25px 50px rgba(0, 0, 0, 0.50); /* 对话框 overlay */
/* 品牌 glow (焦点态) */
--lux-glow-cyan: 0 0 0 3px rgba(56, 189, 248, 0.15), 0 0 0 1px rgba(56, 189, 248, 0.45) inset;
```
---
## 3. Typography
### Font Stack
```css
--lux-font: 'Inter', 'Segoe UI', system-ui, -apple-system, 'PingFang SC', 'Microsoft YaHei', sans-serif;
--lux-font-mono: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', ui-monospace, monospace;
```
### Scale
| Token | Size | Weight | Use |
|---|---|---|---|
| `--lux-text-hero` | 24px | 700 | 首页欢迎标题 |
| `--lux-text-h1` | 18px | 700 | 页面标题、卡片标题 |
| `--lux-text-h2` | 16px | 600 | 子标题、对话框标题 |
| `--lux-text-body` | 14px | 400 | 正文、表格单元格 |
| `--lux-text-sm` | 13px | 400 | 辅助文本、分页 |
| `--lux-text-xs` | 12px | 500 | 标签、徽章、脚注 |
### Letter Spacing
- 标题: `-0.02em`
- 正文: `0`
- 大写标签: `0.03em`
---
## 4. Spacing
```css
--lux-space-1: 4px;
--lux-space-2: 8px;
--lux-space-3: 12px;
--lux-space-4: 16px;
--lux-space-5: 20px;
--lux-space-6: 24px;
--lux-space-8: 32px;
--lux-space-10: 40px;
--lux-space-12: 48px;
```
---
## 5. Border Radius
```css
--lux-radius-sm: 8px; /* 标签、小按钮 */
--lux-radius-md: 10px; /* 输入框、下拉菜单 */
--lux-radius-lg: 14px; /* 卡片、搜索栏 */
--lux-radius-xl: 18px; /* 对话框 */
--lux-radius-2xl: 24px; /* 登录卡片 */
--lux-radius-pill: 999px; /* 徽章、圆形按钮 */
```
---
## 6. Elevation System (Dimensional Layering)
| Level | Z-index | Surface | Use |
|---|---|---|---|
| **L0 — Background** | 0 | 页面渐变 + 光球 | 宇宙底色装饰层 |
| **L1 — Content** | 1 | 玻璃卡片 (blur 14–20px) | 搜索栏、表格卡片、首页卡片 |
| **L2 — Floating** | 10100 | 侧栏、顶栏、TabsView | 导航/定位组件 |
| **L3 — Overlay** | 2000+ | 对话框、下拉菜单 | Teleport 弹出层 |
---
## 7. Component Specifications
### 7.1 Card (el-card)
```
背景: var(--lux-glass-bg-card)
模糊: var(--lux-blur-lg) [20px]
边框: 1px solid var(--lux-glass-border)
圆角: var(--lux-radius-lg) [14px]
阴影: var(--lux-shadow-1)
hover 阴影: var(--lux-shadow-2)
padding: 20px (body), 16px 20px (header)
```
### 7.2 Table (el-table)
```
表头背景: rgba(15, 23, 42, 0.65) + blur(14px)
行背景: transparent (卡片底色透出)
hover 行: rgba(56, 189, 248, 0.06)
边框色: rgba(255, 255, 255, 0.06)
文字: var(--lux-text-body)
表头文字: var(--lux-text-muted)
圆角: 12px (overflow hidden)
```
### 7.3 Dialog (el-dialog, Teleport)
```
背景: var(--lux-glass-bg-dialog) + blur(24px)
边框: 1px solid var(--lux-glass-border)
圆角: var(--lux-radius-xl) [18px]
阴影: var(--lux-shadow-4) + inset glow
header: 1px solid rgba(255, 255, 255, 0.08) 底分割
```
### 7.4 Input (el-input, el-select)
```
背景: var(--lux-glass-bg-input)
圆角: var(--lux-radius-md) [10px]
边框: 1px solid var(--lux-glass-border)
focus: 1px solid var(--lux-glass-border-focus) + var(--lux-glow-cyan)
placeholder: var(--lux-text-dim)
```
### 7.5 Button — Primary
```
背景: linear-gradient(135deg, #38bdf8, #22d3ee)
文字: #fff
圆角: var(--lux-radius-md) [10px]
阴影: 0 4px 12px rgba(56, 189, 248, 0.25)
hover 阴影: 0 6px 16px rgba(56, 189, 248, 0.35)
```
### 7.6 Sidebar
```
背景: var(--lux-glass-bg-sidebar)
模糊: var(--lux-blur-lg) [18px]
宽度: 64px (collapsed) / 220px (expanded)
边框右: 1px solid rgba(255, 255, 255, 0.08)
z-index: 100 (L2)
active item: gradient bg rgba(56,189,248,0.22) → rgba(99,102,241,0.14)
+ 1px inset border rgba(56,189,248,0.25)
```
### 7.7 Header
```
背景: var(--lux-glass-bg-header)
模糊: var(--lux-blur-md) [14px]
高度: 44px
圆角: 10px
边框: 1px solid var(--lux-glass-border)
阴影: var(--lux-shadow-1)
```
### 7.8 TabsView
```
inactive: rgba(30, 41, 59, 0.35) 背景, 无模糊
active: rgba(30, 41, 59, 0.55) + 上方 2px cyan 指示条
圆角: 10px
gap: 4px
```
### 7.9 Pagination
```
背景: transparent
active: #38bdf8 实心背景 + white text + 8px radius
hover: cyan 文字
```
### 7.10 Tag (el-tag)
```
圆角: 8px
背景: rgba 半透明 (继承 Element Plus type 色 at 15% alpha)
```
### 7.11 Dropdown Menu
```
背景: rgba(30, 41, 59, 0.82) + blur(18px)
边框: 1px solid var(--lux-glass-border)
圆角: 10px
hover item: rgba(56, 189, 248, 0.12)
```
---
## 8. Motion
```css
/* 过渡时间 */
--lux-duration-fast: 0.15s; /* hover 状态切换 */
--lux-duration-normal: 0.25s; /* 展开/折叠 */
--lux-duration-slow: 0.35s; /* 页面切换 */
/* 缓动 */
--lux-ease: ease;
--lux-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
```
### Key Transitions
- **卡片 hover**: `transform: translateY(-2px)` + shadow 加深, 0.15s
- **侧栏展开/折叠**: width 64→220px, 0.30s ease
- **对话框进出**: Element Plus 默认 fade + scale (不覆盖)
- **输入框 focus**: box-shadow ring 0.2s ease
---
## 9. Accessibility
| 项目 | 标准 |
|---|---|
| 正文文本对比度 | WCAG AA ≥ 4.5:1 (实际 `#e2e8f0` on `#0a0e14` = 13.5:1) |
| 辅助文本对比度 | WCAG AA ≥ 4.5:1 (实际 `#94a3b8` on `#1e293b` = 5.8:1) |
| 焦点指示 | 3px cyan glow ring (box-shadow) |
| 触摸目标 | 按钮 ≥ 32×32px, 输入框高度 ≥ 32px |
| 半透明文本 | 不低于 `rgba(255,255,255,0.55)` |
---
## 10. Bug Fixes (Pre-refactoring)
| 文件 | 问题 | 修复 |
|---|---|---|
| `views/brand/index.vue` | `.title { color: #333 }` 深色背景不可见 | → `#e2e8f0` |
| `views/blacklist/index.vue` | `.title { color: #333 }` | → `#e2e8f0` |
| `views/ota-target-device/index.vue` | `.title { color: #333 }` | → `#e2e8f0` |
---
## 11. File Impact Map
| 文件 | 改动类型 | 改动范围 |
|---|---|---|
| `styles/lux-theme.css` | **主改** | Token 扩展 + 全组件玻璃化 (~60% 改动) |
| `components/TabsView.vue` | 样式 | 玻璃标签页样式 |
| `views/home/index.vue` | 样式 | 首页卡片玻璃化 |
| `views/brand/index.vue` | 样式+bug | 列表页玻璃化 + 修复 `.title` |
| `views/model/index.vue` | 样式 | 列表页玻璃化 |
| `views/ota/index.vue` | 样式 | 列表页玻璃化 |
| `views/blacklist/index.vue` | 样式+bug | 列表页玻璃化 + 修复 `.title` |
| `views/ota-target-device/index.vue` | 样式+bug | 列表页玻璃化 + 修复 `.title` |
| `views/share-code/log.vue` | 样式 | 列表页玻璃化 |
| `views/system/users/index.vue` | 样式 | 列表页玻璃化 |
| `views/login/index.vue` | 无改动 | 已是标杆实现 |
| `layout/index.vue` | 无改动 | 已是玻璃化实现 |
---
## 12. Implementation Phases
1. **Token 扩展** — lux-theme.css 新增 glass/elevation/spacing 变量
2. **Bug 修复** — 3 个文件 `.title` 颜色修复
3. **卡片玻璃化**`.el-card` 改为半透明 + blur
4. **表格玻璃化**`.el-table` 透明底 + 半透明表头
5. **输入框玻璃化**`.el-input` / `.el-select` 玻璃输入
6. **对话框玻璃化**`.el-dialog` 玻璃面板
7. **按钮/标签/分页** — 统一 glass 风格
8. **TabsView 玻璃化** — 标签栏玻璃标签
9. **列表页 scoped 样式** — 各页面 `.title`/`.card-header` 统一
10. **首页增强** — 快捷入口卡片 + 今日新增卡片玻璃化
11. **下拉菜单/消息框** — 弹出层玻璃化