Files
quick-share/docs/11-UI设计规范与交互原则.md

300 lines
15 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.
# 15 - UI 设计规范与交互原则DataTool
> 本文作为 DataTool 项目前端的统一 UI 设计规范与交互基线,后续所有功能开发应在不违背本规范的前提下扩展。若有必要变更,请同步更新本文件。
---
## 1. 产品定位与使用场景
- **产品类型**:轻量级、基于浏览器的数据传输工具
- **核心场景**:在 VNC / 远程桌面 / 内网隔离等环境中,通过 6 位房间号在多端之间快速传文本、文件、图片和剪贴板内容
- **受众角色**:开发 / 运维 / 支持工程师、内网用户
- **体验方向****稳定、可靠、低干扰、专业、轻量**
---
## 2. 整体设计原则
- **一致性优先**
- 所有页面沿用统一的色板、字体、圆角与阴影体系。
- 所有按钮、输入框、消息卡片、文件卡片必须复用同一套组件样式,不允许在局部自行定义“新样式”。
- **信息层次清晰**
- 强调房间号与连接状态,其次是消息内容与文件进度,最后是系统提示和辅助信息。
- 使用颜色 / 字号 / 粗细 / 间距来区分重要程度,避免靠纯颜色或纯位置。
- **状态可感知**
- WebSocket 连接状态、房间加入/退出、文件发送与接收进度必须在 UI 中可见且明确。
- 所有异步操作(发送消息、上传文件、读取剪贴板等)都有“进行中 / 成功 / 失败”的视觉反馈。
- **轻量与性能**
- 大量消息场景下保持滚动流畅,避免复杂阴影和高成本动画。
- 组件优先考虑简单、可扩展的布局,预留虚拟列表等性能优化空间。
- **可访问与可维护**
- 遵守基本对比度、可聚焦与键盘可操作性。
- 使用统一的设计 token颜色/间距/字号),便于全局调整。
---
## 3. 视觉设计规范
### 3.1 色彩体系(建议映射到 CSS 变量 / Tailwind token
- **品牌主色Primary**
- 基准色:`#2563EB`(蓝,类似 Tailwind `blue-600`
- Hover`#1D4ED8``blue-700`
- Active`#1E40AF``blue-800`
- 主要用于:主按钮、主操作高亮、房间号强调、连接状态“已连接”标识。
- **强调色Success / Danger / Warning**
- Success`#16A34A``green-600`)—— 文件传输完成、连接成功、操作成功提示。
- Danger`#DC2626``red-600`)—— 错误、连接失败、限制触发。
- Warning`#F97316``orange-500`)—— 限制接近阈值、网络不稳定等。
- **中性色(背景 / 边框 / 文本)**
- 页面背景:`#F8FAFC``slate-50`
- 卡片背景:`#FFFFFF`
- 边框:`#E2E8F0``slate-200`
- 分割线:`#E5E7EB``gray-200`
- 主文本:`#0F172A``slate-900`
- 次级文本:`#475569``slate-600`
- 弱化文本/占位:`#9CA3AF``gray-400`)及以上,不使用更浅灰值作为正文。
- **系统消息与提示色**
- 系统消息背景:`#EFF6FF``blue-50`),文字使用 `#1D4ED8`
- 提示条Banner背景 `#F1F5F9``slate-100`),根据状态加左侧色条(蓝/绿/橙/红)。
> 所有新页面不得新增“第二主色”若确有需要先在本文件补充“辅助色Secondary”章节再使用。
### 3.2 字体与排版
- **字体族**
- 优先:`system-ui, -apple-system, BlinkMacSystemFont, "SF Pro SC", "PingFang SC", "Microsoft YaHei", sans-serif`
- **字号层级(桌面端基线)**
- 标题 H124px / 32px用于页面主标题如“房间 123456”
- 标题 H220px / 28px用于分区标题在线用户、消息区、文件传输
- 标题 H316px / 24px用于小模块标题、卡片标题
- 正文14px / 22px首选行高 1.6
- 标签/次要信息12px / 18px谨慎使用保证可读性
- **文字对齐**
- 文本与输入框左对齐,数字型信息(如进度百分比)可以右对齐。
- **行宽与段落**
- 文本区域最大宽度建议控制在 6575 个汉字以内,避免极长单行。
### 3.3 圆角、阴影与描边
- **圆角**
- 输入框/按钮:`4px`
- 卡片(消息卡片、文件卡片):`8px`
- 悬浮面板 / 弹窗:`12px`
- **阴影**
- 默认卡片:无阴影,仅边框(`border-slate-200`
- 悬浮/高层级元素(如弹窗、悬浮面板):轻量阴影 `0 10px 25px rgba(15,23,42,0.08)`
- **描边**
- 主按钮默认无边框仅用色块Hover 时可增加内阴影或细微深色。
- 输入框:有 1px 描边,聚焦时描边色切换为主色并增加轻微光晕。
### 3.4 间距与栅格
- 页面左右内边距:桌面端 `24px`,窄屏端 `16px`
- 区块间距(模块与模块之间):`24px`
- 元素垂直间距(标题与内容 / 行与行):`812px`
- 列表项内边距:上下 `8px` / 左右 `12px`
- 使用 4 的倍数作为统一间距刻度:`4 / 8 / 12 / 16 / 24 / 32`
---
## 4. 布局与信息架构
### 4.1 整体布局结构
- **桌面端(≥ 1024px**
- 顶部:窄高度顶部栏,包含项目 Logo/名称、当前房间号、连接状态指示、小范围操作(帮助、设置)。
- 主区:左右双栏布局。
- 左侧(约 2530% 宽度):`RoomPanel`,包含房间信息、在线用户列表、基础操作(退出、清空、导出)。
- 右侧(约 7075% 宽度):消息与文件显示区域(消息列表 + 文件/图片预览),底部为输入与文件操作区域。
- **窄屏端(< 1024px**
- 顶部栏保留,主内容上下布局:
- 默认展示消息区域,在线用户通过折叠面板或底部抽屉查看。
- 拖拽上传在窄屏上使用明显的上传按钮 + 粘贴提示,拖拽仅作为增强能力。
### 4.2 关键页面说明
- **首页 `HomeView`**
- 中心内容区居中显示:
- 左:创建房间卡片(展示自动生成 6 位房间号 + “创建并进入”按钮)
- 右:加入房间卡片(房间号输入框 + 加入按钮)
- 明确提示“数据不落库 / 仅当前会话可见”等安全特性(简短描述)。
- 若已有最近加入的房间记录,可在下方列出“最近使用的房间”列表(历史记录相关)。
- **房间页 `RoomView`**
- 顶部显示:
- 房间号(可点击复制)+ 小标签(如“临时房间”)
- 连接状态:圆点 + 文本(连接中/已连接/断开/重连中)
- 左侧 `RoomPanel`
- 在线用户列表(昵称 + 状态点),当前用户行高亮。
- 简要统计信息:在线人数、当前传输中文件数量等。
- 操作按钮:退出房间(弱化但明确)、清空本地历史、导出历史。
- 右侧主区:
- 上方消息与系统提示列表含文本、图片、文件卡片、SYSTEM 消息)。
- 下方:输入区域(文本输入 + 发送按钮 + 附件/文件按钮 + 剪贴板按钮)。
### 4.3 消息列表布局
- **文本消息**
- 根据发送者区分左右对齐(可选),也可统一左对齐,通过头像首字母+昵称区分。
- 时间戳放置在右下角,使用次级文字色。
- **系统消息**
- 居中对齐,使用浅色条带样式,与普通消息明显区分。
- 内容如“xxx 加入房间 / 离开房间 / 连接已重连”等。
- **文件与图片消息**
- 使用卡片样式,包含文件名、大小、进度条、状态图标以及操作按钮(下载/打开)。
---
## 5. 核心组件规范
> 实现时建议将以下元素封装为 Vue 组件,并在使用前优先复用。
### 5.1 按钮(`Button`
- **尺寸**
- 大:高度 4044px主要操作如“创建房间”“加入房间”“发送”
- 中:高度 3236px列表操作、弹窗确认等
- 小:高度 2832px标签型按钮、图标按钮
- **类型**
- 主按钮Primary填充主色白色文字圆角 4px。
- 次按钮Secondary白底 + 主色描边 + 主色文字。
- 危险按钮Danger红色填充 + 白色文字,仅用于删除/退出等操作。
- 文本按钮Ghost/Text透明背景 + 主色文字,用于低权重操作。
- **状态**
- 默认 / Hover / Active / Disabled 四态。
- Hover亮度 + 边框/阴影轻微变化,不允许大幅缩放导致布局抖动。
- Disabled降低对比度并移除悬浮态鼠标指针改为默认。
### 5.2 输入与表单(`Input`, `Textarea`, `FormField`
- **样式**
- 高度 3640px左右有 1216px 内边距。
- 边框颜色:默认 `#E2E8F0`,聚焦 `primary`
- 占位文字使用 `gray-400`,不可与正常正文颜色相同。
- **校验**
- 房间号输入框限制为 6 位数字,错误时在输入框下方展示红色错误文案,并将边框颜色切换为 `red-500`
- 提交按钮在校验不通过时为禁用状态。
### 5.3 标签与状态(`Tag`, `Badge`, `StatusDot`
- 用于表示连接状态、房间类型、文件状态等。
- 状态点尺寸 810px放置在用户名左侧或右上角。
- 颜色与状态映射保持统一(如:绿色=在线,灰色=离线,橙色=异常)。
### 5.4 消息气泡与系统消息(`MessageItem`, `SystemMessage`
- 消息气泡:
- 背景使用白色或略带浅灰,边框微弱(可选)。
- 内部包含:昵称(可选)/ 消息内容 / 时间戳。
- 系统消息:
- 使用全宽度条带,背景为 `blue-50``slate-100`,文字居中。
- 与气泡在视觉上区分开(不使用“对话气泡”样式)。
### 5.5 文件卡片与进度条(`FileMessage`, `ProgressBar`
- **文件卡片内容**
- 文件名(可省略中间,用省略号显示)+ 文件大小 + 文件类型图标。
- 进度条(发送端、接收端皆可见)+ 状态标签(传输中 / 已完成 / 失败)。
- 操作按钮:下载、打开所在文件夹(浏览器可行范围内)、重新下载(失败时)。
- **进度条样式**
- 高度 46px圆角 999px。
- 背景条颜色 `slate-200`,前景条使用主色或状态色。
### 5.6 图片预览卡片(`ImageMessage`, `ImagePreviewModal`
- 消息列表中展示缩略图(固定宽高比,如 4:3点击后打开大图预览。
- 大图使用居中遮罩弹窗,背景半透明黑色,支持点击空白处关闭或 Esc 关闭。
### 5.7 Toast 与通知(`Toast`, `AlertBanner`
- Toast 适合短暂状态提示(发送成功、复制成功),出现在右上角或右下角,自动消失。
- AlertBanner 适合持久的提醒(当前使用 HTTP 协议、传输大小接近上限等),固定在内容区顶部。
---
## 6. 关键交互流程规范
### 6.1 加入 / 创建房间
- **创建房间**
- 点击“创建房间”后立即显示加载状态(按钮禁用 + Loading 图标)。
- 创建成功后自动跳转到房间页,并以系统消息提示“你已创建并进入房间 123456”。
- **加入房间**
- 用户输入 6 位房间号,实时校验;不足 6 位或包含非数字字符时按钮禁用。
- 加入失败(房间不存在/连接错误)时:
- 在输入框下方显示清晰错误文案。
- 可用 Toast 或 Banner 补充说明。
### 6.2 WebSocket 连接与状态恢复
- 顶部栏右上区域固定显示连接状态:
- 连接中:黄色点 + “连接中…”
- 已连接:绿色点 + “已连接”
- 重连中:橙色点 + “重连中…”
- 已断开:红色点 + “已断开”
- 当状态从“断开/重连中”恢复到“已连接”时:
- 插入一条 SYSTEM 消息说明“已重新连接,已重新加入房间”。
### 6.3 消息发送与错误处理
- 按下 Enter 发送消息Shift+Enter 换行(在文本框旁明确提示)。
- 发送过程中,发送按钮进入 Loading 状态并禁用,避免重复点击。
- 若发送失败(网络中断等):
- 消息在列表中使用“失败”样式(如左侧红色竖线 + 灰度文字)。
- 提供“重试发送”小按钮。
### 6.4 文件拖拽上传 / 粘贴
- **拖拽区域**
- 在输入区域上方或消息列表顶部提供明显的拖拽提示区域(浅虚线边框 + 上传图标)。
- 拖拽文件进入页面时,高亮整个拖拽区域,并在靠顶部位置显示提示条(如“释放鼠标以发送文件到房间 123456”
- **粘贴文件 / 剪贴板**
- 当用户使用 Ctrl+V 粘贴文件或图片时,提示一次确认(可选):“是否将剪贴板中的图片/文件发送到当前房间?”。
- 剪贴板权限被浏览器限制时,弹出说明性对话框,引导用户手动拖拽或选择文件。
### 6.5 历史记录与本地存储
- 在房间页的 `RoomPanel` 中提供“历史记录”入口,可选择:
- 清空当前房间历史(弹出确认对话框)。
- 导出当前房间历史(文件命名建议:`DataTool-房间号-时间戳.json`)。
- 刷新页面后自动加载当前房间的本地历史,并通过淡入动画呈现。
---
## 7. 可访问性与通用 UX 要求
- **颜色对比度**
- 正文文本与背景对比度 ≥ 4.5:1次级文本不低于 3:1。
- **键盘导航**
- 所有按钮和可点击卡片必须可通过 Tab 聚焦,按 Enter/Space 触发。
- 焦点样式清晰可见(外发光或描边),不依赖颜色变化微弱的 hover 效果。
- **ARIA 与语义化**
- 图标按钮(仅图标无文字)添加 `aria-label`
- 使用语义标签(`<main>`, `<header>`, `<nav>`, `<section>`)构建布局。
- **动画与动效**
- 常规动效时长控制在 150250ms 内。
- 支持 `prefers-reduced-motion`,在该设置下减弱或关闭动画。
---
## 8. 动画与微交互规则
- **Hover 与点击**
- 按钮、卡片 hover 使用颜色/阴影变化,不使用大幅 scale 动画。
- 点击反馈可使用轻微按压效果(阴影变小/颜色略深)。
- **加载与进度**
- 使用细线进度条或简洁 Spinner不使用大型覆盖式 Loading 遮罩,避免阻塞操作。
- **列表更新**
- 新消息出现时可使用轻微淡入效果(不超过 150ms避免大幅滑入动画。
---
## 9. 实现与扩展建议
- 建议在前端建立统一的设计 token`dt-color-primary`, `dt-radius-card`, `dt-spacing-md` 等),由基础样式文件或 Tailwind 配置统一生成。
- 新增页面或组件时:
- **必须** 复用现有颜色、字体、间距与组件模式。
- 如需突破现有规范(例如新增“标签页导航组件”),请先在本文件新增对应的组件规范小节,再在代码中实现。
- 后续 Phase 3/4 中的剪贴板、图片预览、历史记录等功能应基于本规范中的组件文件卡片、图片卡片、Toast、Modal 等)组合实现,不单独发明新样式。