# awem Web UI 设计规范 - **状态**:v1.4(2026-10-27 总览改左树右表:左侧归属导航树 + 右侧全列表格;去除页内 Tab 与平铺/树形切换;所属项目/小队合并为一列;新增版本列;页面名保持「总览」,图表留二期),随 web/ 实施迭代。 - **定位**:[design.md](design.md) §9 定义页面结构与功能;本规范定义**视觉与交互**。两者冲突时以 design.md 为准,并按"先改文档、再改代码"的流程修订。 - **适用**:`web/` 下 React SPA(`go:embed` 内嵌,仅 127.0.0.1 本机访问)。 --- ## 1. 设计原则 1. **信息密度优先**:这是运维工具,不是营销页。一屏看清全部执行器的双状态(本地进程 + 平台)。 2. **克制的色彩**:中性灰为底,唯一强调色;彩色只表达状态与可操作项,不做装饰。 3. **操作直达**:start/stop/restart 行内完成;破坏性操作(remove、stop 全部)必须显式确认。 4. **状态即事实**:本地状态与平台状态**并列展示、不合并**,视觉上能区分来源(design.md 决策 #9)。 5. **轻量快速**:SPA 体积小、首屏快;动画少而短,且尊重 `prefers-reduced-motion`。 ## 2. 设计令牌(Design Tokens) 落地为 CSS 自定义属性,命名 `--awem-*`;`:root` 为浅色,`[data-theme="dark"]` 覆盖为深色。**组件只引用变量,不写死色值。** ### 2.1 中性色与强调色 | 令牌 | 浅色 | 深色 | 用途 | |---|---|---|---| | `--awem-bg` | `#ffffff` | `#0f1113` | 页面背景 | | `--awem-bg-subtle` | `#f6f7f9` | `#16191d` | 卡片/面板背景 | | `--awem-bg-muted` | `#eef0f3` | `#1e2227` | hover、填充、表头 | | `--awem-fg` | `#1a1d21` | `#e6e8eb` | 正文 | | `--awem-fg-secondary` | `#5a6169` | `#9aa1a9` | 次要文字 | | `--awem-fg-faint` | `#8b9199` | `#6b727a` | 占位/禁用 | | `--awem-border` | `#e2e5e9` | `#2a2f36` | 边框、分隔线 | | `--awem-accent` | `#2563eb` | `#3b82f6` | 主按钮、链接、焦点环 | | `--awem-accent-hover` | `#1d4ed8` | `#60a5fa` | accent 悬停 | ### 2.2 状态色(语义固定,不得挪作装饰) | 语义 | 令牌 | 浅色 | 深色 | 用在 | |---|---|---|---|---| | 成功 / ONLINE | `--awem-success` | `#16a34a` | `#22c55e` | 本地"运行中"、平台 ONLINE | | 忙碌 / BUSY | `--awem-busy` | `#2563eb` | `#3b82f6` | 平台 BUSY(与 accent 同色系,靠文字区分) | | 停止 / OFFLINE | `--awem-off` | `#8b9199` | `#6b727a` | 本地"已停止"、平台 OFFLINE | | 警告 / 漂移 | `--awem-warn` | `#d97706` | `#f59e0b` | 配置漂移黄标、崩溃重连中 | | 错误 / 危险 | `--awem-danger` | `#dc2626` | `#ef4444` | 失败状态、破坏性操作按钮 | 状态一律"**圆点(8px)+ 文字**"双编码,不只用颜色(可访问性)。 ### 2.3 字体与排版 | 令牌 | 值 | 用途 | |---|---|---| | `--awem-font-sans` | `-apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif` | 全局 UI | | `--awem-font-mono` | `ui-monospace, "SF Mono", "Cascadia Mono", "JetBrains Mono", Consolas, Menlo, monospace` | 启动命令、token、executor-id、日志 | - 字号阶梯:**12**(辅助/徽标)· **13**(表格、日志)· **14**(正文/表单)· **16**(小节标题)· **20**(页面标题)。 - 行高:正文 1.5;等宽日志 1.45。 - 数字与 ID 用等宽;正文不混用等宽字体。 ### 2.4 间距、圆角、阴影、动效 - **间距**:4px 基准网格,只用 4 / 8 / 12 / 16 / 24 / 32 六档。 - **圆角**:控件 6px;卡片/面板 8px;徽标 pill(全圆角)。 - **阴影**:卡片**不用阴影**(用 1px 边框);阴影仅给浮层(下拉、Dialog、Toast):`0 4px 16px rgba(0,0,0,.12)`。 - **动效**:150–200ms `ease-out`,仅 hover 过渡、浮层出现、Toast 滑入;日志流滚动无动画。 ## 3. 布局 - 内容最大宽 1600px 居中,左右留白 24px;总览表格可占满该宽度 (2026-10-27 由 1440px 调整:左树 280px + 间距 16px 后 1440px 放不下联动 11 列, 表格出现横向滚动)。 - 总览为**左树右表**:左侧归属导航树(宽 280px)与右侧表格区同高——行容器 flex stretch 拉高较矮一侧,且树卡片与表格卡片各自在容器内 `flex: 1` 撑满补齐(任一内容更高时, 另一侧卡片背景同步到底边,不出现高度差);两者各自按视口剩余高度限高、底边对齐; 表格仅表体纵向滚动、表头吸顶;最小表体高 240px(视口过矮时允许页面滚动兜底)。 - 表格**默认不出现横向滚动条**:「名称」「所属小队」两列为可收缩列,宽度不足时 溢出截断(`text-overflow: ellipsis`)并带 `title` 悬浮提示;仅极窄视口 (表格可用宽 < 约 900px)才在容器内横向滚动兜底。 - 左树纵向超出时内部滚动;**横向永不出现滚动条**:节点名溢出截断(`text-overflow: ellipsis`) 并带 `title` 悬浮提示;树节点悬浮/选中背景横向沾满整行(左右留卡片内边距 8px)。 - 详情页为**一屏左右分栏**(2026-10-27 起):左列(弹性宽)从上到下 = 进程卡片 → 运行时间带卡片 →(漂移明细卡,有条件的)→ 日志卡片(`flex:1` 填满左列剩余高度, 日志框内部滚动);右列编辑卡片固定宽 380px、表单单列排列,内容超高时卡片内部滚动。 整页按视口剩余高度定高(JS 计算,下限 480px;视口过矮时允许页面滚动兜底)。 - 顶栏一行:左侧产品名 `awem`,右侧 daemon/平台连接状态点 + 设置入口。 - 页面骨架统一:**标题行(页面标题 + 主操作按钮)→ 内容区**。不加面包屑(页面仅一层)。 - 不做移动端适配,但宽度 ≤ 768px 时布局不得错乱(允许横向滚动表格)。 ## 4. 组件规范 | 组件 | 规范 | |---|---| | 按钮 | primary(accent 填充)、secondary(描边)、danger(仅破坏性操作)、ghost(行内图标按钮)。高 32px(紧凑)/ 36px(表单) | | 状态徽标 | 8px 圆点 + 13px 文字;漂移用 warn 色 pill 徽标(文案"漂移"),挂在执行器名称旁 | | 表格 | 总览用表格不用卡片列表;行高 44px;表头 12px 次要色;行内操作按钮 hover 显现、焦点显现;总览列表表体视口自适应限高、表头 sticky 吸顶(见 §3) | | 查询条件行 | 总览表格上方、工具行上方、滚动容器之外;名称(文本,去首尾空格、不区分大小写、匹配平台显示名或执行器标识任一)、本地进程(自定义 Select 下拉,含已知状态与数据中出现的未知状态)、重置;条件 AND、输入即筛选;筛选变化清空已选;无命中保留筛选行与表头并显示「没有匹配的执行器」「清除筛选」;≤768px 可换行。项目/小队归属过滤由左侧导航树承担,不进查询条件行 | | 下拉选择(Select) | 自绘触发按钮 + 弹层,**不用原生 `