Files
admin/dashboard/DESIGN.md
T

359 lines
11 KiB
Markdown
Raw Normal View History

# 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. **下拉菜单/消息框** — 弹出层玻璃化