Files
cc-web/.trellis/tasks/07-17-gilded-wasteland-theme/research/visual-rework-audit.md
2026-07-18 10:14:38 +08:00

375 lines
17 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.

# 暗金荒野视觉返工审计
审计对象:
- 参考图:`sessions/_attachments/f01c1388-b603-434a-b226-2ff5771d4925.webp`
- 背景图:`sessions/_attachments/094d7907-875d-41f4-9985-992c87c9b9cc.webp`
- 当前 CSS:`public/style.css`,重点为 `/* === 暗金荒野` 到文件末尾
- 当前 mock:`.planning/gilded-wasteland-theme/visual-preview.html`
审计结论:当前版本的问题不是主题元素不够多,而是过度把所有组件做成厚金边、硬切角、重阴影卡片。参考图的核心语言是“全画布骑士背景 + 半透明黑铁薄面板 + 1px 旧金蚀刻线 + 局部角饰”,需要删重而不是继续加装饰。
## 1. 参考图 1672x941 像素比例
以下尺寸为按原尺寸图像检查后的近似像素坐标,误差约 2-6px,适合作为 CSS 目标值。
| 区域 | 参考图坐标 | 像素尺寸 | 视口占比 | 当前 CSS/Mock 主要偏差 |
|---|---:|---:|---:|---|
| 左侧栏整体 | `x=0-316, y=0-941` | `316x941` | 宽 `18.9%`,高 `100%` | 当前 `--sidebar-width: 280px`,仅 `16.7%`,明显偏窄 |
| 主工作区 | `x=316-1672, y=0-941` | `1356x941` | 宽 `81.1%` | 当前主区更早暴露背景,但侧栏比例不对 |
| 顶栏 | `x=316-1672, y=0-57` | `1356x57` | 高 `6.1%` | 当前 `--header-height: 52px`,略矮 |
| 侧栏顶部按钮组 | `x=15-303, y=10-57` | `288x47` | 侧栏内宽 `91.1%` | 当前按钮形状可接近,但金边过亮、切角太统一 |
| 新会话主按钮 | `x=15-245, y=10-57` | `230x47` | 侧栏宽 `72.8%` | 当前宽度受 280px 侧栏影响,整体缩窄 |
| 新会话下拉 | `x=250-303, y=10-57` | `53x47` | 侧栏宽 `16.8%` | 当前可以保留分裂按钮,但边框需要降亮度 |
| 搜索框 | `x=15-303, y=68-102` | `288x34` | 侧栏宽 `91.1%` | 当前 `clip-path` 切角不应扩散到搜索框 |
| 会话列表主区 | `x=15-303, y=118-870` | `288x752` | 高 `79.9%` | 当前 active item 过厚、阴影过明显 |
| 侧栏底栏 | `x=0-316, y=870-941` | `316x71` | 高 `7.5%` | 当前底栏暗度可保留,但不要成为厚卡片 |
| 消息可视带 | `x=316-1672, y=57-795` | `1356x738` | 高 `78.4%` | 当前消息卡片堆叠感更强 |
| 第一条 assistant 面板 | `x=400-1043, y=87-431` | `643x344` | 宽 `38.5%`,高 `36.6%` | 当前 max-width 接近,但黑底和切角过重 |
| 用户气泡 | `x=1152-1572, y=453-516` | `420x63` | 宽 `25.1%`,高 `6.7%` | 当前用户气泡过暗、阴影厚 |
| 第二条 assistant 面板 | `x=400-1397, y=516-774` | `997x258` | 宽 `59.6%`,高 `27.4%` | 当前 tool-call 产生太多内部卡片层 |
| 输入区总高度 | `x=316-1672, y=795-941` | `1356x146` | 高 `15.5%` | 当前 `.input-area` 作为整条暗底带太明显 |
| 模式按钮行 | `x=563-899, y=795-824` | `336x29` | 主区宽 `24.8%` | 当前状态胶囊可保留,边框和填充应更轻 |
| 输入框外框 | `x=557-1363, y=832-905` | `806x73` | 宽 `48.2%`,高 `7.8%` | 当前 max-width `800px` 接近,但高度 `54px` 偏矮,阴影偏重 |
建议直接落地的布局变量:
```css
html[data-theme='wasteland'] {
--sidebar-width: 316px;
--header-height: 57px;
}
```
移动端不应照搬 316px,可继续使用 `min(88vw, 320px)`,但桌面 mock 必须先贴近参考图。
## 2. 边框、透明度、切角和面板层级
### 边框线宽
| 元素类型 | 参考图特征 | 建议 CSS 值 | 当前问题 |
|---|---|---|---|
| 全局旧金线 | 大多是 1px,抗锯齿后局部看似 2px | `1px solid rgba(185, 139, 75, 0.28)` | 当前多处用 `rgba(..., 0.52-0.64)`,视觉太亮 |
| 高亮角线 | 只在角、按钮边缘、active 状态短暂增强 | `rgba(223, 180, 108, 0.44-0.58)` | 当前整条边都亮,不像蚀刻线 |
| 内发亮线 | 很弱,只用于面板顶部/内侧 | `inset 0 1px rgba(255, 230, 180, 0.04-0.08)` | 当前叠加了大阴影,层级失真 |
| active 会话 | 1px 金线 + 微弱背景,不是粗卡片 | `border-color: rgba(196,154,90,.46)` | 当前 `inset 3px` + 外阴影太重 |
| tool-call 内框 | 1px 细线,嵌在消息面板内 | `border-color: rgba(185,139,75,.30)` | 当前 `border-left: 2px` 和 `clip-path` 抢层级 |
### 透明度层级
参考图不是纯黑 UI,而是让背景纹理穿过面板。建议把层级收敛为 4 档:
| 层级 | 用途 | 建议值 |
|---|---|---|
| 页面遮罩 | 保证左侧可读,右侧人物可见 | 左侧最高 `0.72`,人物区 `0.04-0.18`,底部 `0.44` |
| 侧栏大底 | 黑铁主面板 | `rgba(5, 7, 7, 0.72-0.78)` |
| 消息/输入面板 | 半透明工作区卡面 | `rgba(8, 10, 10, 0.62-0.76)` |
| 小按钮/标签 | 状态和工具按钮 | `rgba(12, 14, 12, 0.48-0.66)` |
当前 CSS 中这些值偏重:
- `body` 左侧遮罩 `0.96/0.90/0.68`,会把背景压成黑墙。
- `.sidebar` 背景 `rgba(7,9,8,0.92)`,比参考图更像实心抽屉。
- `.msg.assistant` 背景 `rgba(12,15,13,0.88)`,压掉背景纹理。
- `.input-wrapper` 背景 `rgba(8,10,9,0.91)`,过实。
- `.wasteland-panel-strong` `0.93` 加上 `--shadow-strong`,弹层会变成厚卡片。
### 切角位置
参考图的切角是“局部外框语言”,不是全组件形状规则。
| 区域 | 参考图切角 | 建议 |
|---|---|---|
| 新会话主按钮/下拉按钮 | 顶部左右约 `6-8px` 斜切,底边更克制 | 可保留小切角 |
| 输入框外框 | 外框角部约 `6-8px`,并带底部中心装饰 | 可保留局部角饰,但不要把内容裁掉 |
| 消息面板 | 基本是轻圆角矩形,角部仅有细线高光 | 删除 `clip-path`,用 `border-radius: 8px` |
| 会话列表项 | active 项有边框和微弱纹理,不是每一项都硬切 | 删除普通项 `clip-path` |
| 搜索框/状态胶囊 | 小圆角/轻边框 | 删除切角 |
| tool-call | 内嵌细线框,局部角线即可 | 删除 `clip-path` 和厚左边 |
| 弹层/菜单 | 可使用轻角饰,但不能整块重卡片 | 优先用 border/pseudo corner,不用全局裁切 |
核心建议:不要继续依赖 `--wasteland-cut` 做全局形状。只保留一个小尺寸切角变量给主按钮和输入框外框,其余组件回到圆角或直角薄线。
## 3. 人物/背景可见范围与遮罩梯度
背景图与项目资源一致,`public/assets/themes/wasteland/background.webp` 和给定背景附件 hash 一致。背景本身就是 1672x941,桌面 `cover center` 不会裁切,这是好事。
参考图中人物可见范围:
| 背景元素 | 参考图大致范围 | 视觉要求 |
|---|---:|---|
| 骑士头盔/头肩 | `x=1180-1370, y=85-265` | 必须清晰可辨,不能被右侧遮罩压黑 |
| 胸甲主体 | `x=1110-1415, y=190-620` | 是第一视觉锚点,应保留高光轮廓 |
| 法杖/右臂 | `x=1375-1535, y=330-610` | 需要在用户气泡后仍可见 |
| 披风左延展 | `x=660-1230, y=270-730` | 应穿过消息面板背后,增强深度 |
| 下摆/地面 | `x=1000-1510, y=610-941` | 输入区背后应能隐约看到,不要全黑 |
| 圆环符文 | `x=910-1580, y=15-655` | 右半背景层次的关键,不应被径向金色光斑覆盖 |
参考图遮罩规律:
1. 左侧 0-320px 需要更暗,但不是全黑,仍能看到纹理。
2. 中间 400-1000px 是消息阅读区,面板负责可读性,页面遮罩不应过重。
3. 人物区域 1050-1500px 遮罩最轻,保留胸甲和头肩轮廓。
4. 底部 800-941px 有自然暗角,但输入框外部仍可透出地面和披风。
5. 人工火星不应叠加到很显眼,背景图已有足够颗粒和火星。
建议替换 `body` 背景遮罩:
```css
html[data-theme='wasteland'] body {
background-color: #080a09;
background-image:
linear-gradient(
90deg,
rgba(3, 5, 5, 0.72) 0%,
rgba(3, 5, 5, 0.58) 18%,
rgba(3, 5, 5, 0.34) 43%,
rgba(3, 5, 5, 0.08) 66%,
rgba(3, 5, 5, 0.18) 100%
),
linear-gradient(
180deg,
rgba(0, 0, 0, 0.18) 0%,
rgba(0, 0, 0, 0.02) 32%,
rgba(0, 0, 0, 0.12) 72%,
rgba(0, 0, 0, 0.44) 100%
),
url('assets/themes/wasteland/background.webp');
background-position: center;
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
}
```
建议删除当前 `body::after` 人工火星层。若必须保留,`opacity` 不应超过 `0.18`,且不要动画漂移。
## 4. 当前 CSS 最不相似的 10 项
| 排名 | 影响 | 当前位置 | 不相似点 | 返工方向 |
|---:|---|---|---|---|
| 1 | 极高 | `style.css:7498-7502` | 页面遮罩太黑,左侧 `0.96`、中部 `0.68`、底部 `0.74`,人物和纹理被压扁 | 降低遮罩,人物区保持 `0.04-0.18` |
| 2 | 极高 | `style.css:805`、`7589-7594`、`7664-7665`、`7722-7723`、`7739-7744`、`7775-7780`、`7831-7838`、`7942-7948`、`7998-8009` | `clip-path` 被扩散到消息、弹层、输入、会话项、tool-call、按钮、搜索框和欢迎卡片 | 只给新会话按钮、输入外框少量角饰;其余删除 |
| 3 | 极高 | `style.css:7831-7838` | 主按钮边框 `rgba(...,0.64)` 加切角和阴影,变成厚金属按钮 | 边框降到 `0.42-0.48`,阴影删掉,角饰局部化 |
| 4 | 高 | `style.css:7541-7548` | 侧栏 `0.92` 实心黑 + `18px 48px` 侧向阴影,参考图更轻、更透 | 侧栏背景降到 `0.72-0.78`,只留内侧细线 |
| 5 | 高 | `style.css:7566-7572` | 顶栏和输入区阴影过强,形成上下厚压条 | 顶栏保留底线;输入区背景透明、无整条阴影 |
| 6 | 高 | `style.css:7584-7617` | 消息面板硬切角、暗底 `0.88-0.90`、外阴影重,不像参考图的薄线半透明面板 | 圆角 `8px`,背景 `0.64-0.70`,删除外阴影 |
| 7 | 高 | `style.css:7716-7726` | 输入框高度 `54px` 偏矮,背景 `0.91` 偏实,阴影厚;参考图为约 `806x73` 的长金属薄框 | `max-width:806px`,`min-height:72px`,背景 `0.76`,轻内线 |
| 8 | 中高 | `style.css:7739-7759` | 会话项每条切角,active 有 `inset 3px` 和外阴影,列表太卡片化 | 普通项无边框,active 仅 1px 旧金线和轻背景 |
| 9 | 中高 | `style.css:7775-7807` | tool-call 独立卡片化,`border-left:2px`、切角、阴影抢走消息层级 | 作为消息内部嵌套细线框,去左粗边和阴影 |
| 10 | 中 | `style.css:7913-7968` | 统一 22-24px bitmap pseudo-icon 并隐藏 SVG,图标偏大偏实 | 图标降到 `16-18px`,优先保留线性符号或降低 bitmap opacity |
补充布局偏差:
- `style.css:31-32` 当前全局 `--sidebar-width: 280px`、`--header-height: 52px`,参考图约为 `316px` 和 `57px`。
- mock 使用 `html data-theme="wasteland"` 并直接引入当前 CSS,因此该比例偏差会直接出现在预览里。
## 5. 可直接落成 CSS 的具体值
### 5.1 主题变量
```css
html[data-theme='wasteland'] {
--sidebar-width: 316px;
--header-height: 57px;
--wasteland-iron: #080a09;
--wasteland-panel: rgba(8, 10, 10, 0.66);
--wasteland-panel-soft: rgba(8, 10, 10, 0.52);
--wasteland-panel-strong: rgba(7, 9, 9, 0.74);
--wasteland-gold: #b98b4b;
--wasteland-gold-bright: #dfb46c;
--wasteland-line: rgba(185, 139, 75, 0.30);
--wasteland-line-strong: rgba(223, 180, 108, 0.44);
--wasteland-corner: rgba(231, 185, 109, 0.58);
--shadow-strong: 0 14px 34px rgba(0, 0, 0, 0.30);
}
```
### 5.2 侧栏和顶部
```css
html[data-theme='wasteland'] .sidebar {
background:
linear-gradient(180deg, rgba(185, 139, 75, 0.035), transparent 24%),
rgba(5, 7, 7, 0.76);
border-right: 1px solid rgba(185, 139, 75, 0.32);
box-shadow: inset -1px 0 rgba(255, 230, 180, 0.08);
backdrop-filter: blur(4px) saturate(0.9);
}
html[data-theme='wasteland'] :is(.sidebar-header, .sidebar-footer, .chat-header) {
background: rgba(7, 9, 9, 0.46);
border-color: rgba(185, 139, 75, 0.26);
backdrop-filter: blur(3px) saturate(0.9);
}
html[data-theme='wasteland'] .chat-header {
box-shadow: none;
}
```
### 5.3 消息面板
```css
html[data-theme='wasteland'] .messages {
padding-top: 29px;
padding-bottom: 20px;
}
html[data-theme='wasteland'] .msg {
max-width: min(74%, 997px);
}
html[data-theme='wasteland'] .msg.user {
max-width: min(42%, 480px);
}
html[data-theme='wasteland'] .msg-bubble {
border: 1px solid rgba(185, 139, 75, 0.28);
border-radius: 8px;
clip-path: none;
backdrop-filter: blur(4px) saturate(0.9);
box-shadow: inset 0 1px rgba(255, 230, 180, 0.05);
}
html[data-theme='wasteland'] :is(
.msg.assistant .msg-bubble,
.msg.cross-conversation .msg-bubble,
.msg.cross-conversation-reply .msg-bubble,
.msg.system .msg-bubble[data-tone='info']
) {
background: rgba(8, 10, 10, 0.66);
border-color: rgba(185, 139, 75, 0.28);
box-shadow: inset 0 1px rgba(255, 230, 180, 0.05);
}
html[data-theme='wasteland'] .msg.user .msg-bubble {
background: rgba(38, 28, 19, 0.62);
border-color: rgba(196, 154, 90, 0.42);
box-shadow: inset 0 1px rgba(255, 230, 180, 0.06);
}
```
### 5.4 输入区
```css
html[data-theme='wasteland'] .input-area {
background: transparent;
border-top: 0;
box-shadow: none;
padding: 10px 16px 36px;
}
html[data-theme='wasteland'] .input-wrapper {
position: relative;
width: min(806px, calc(100% - 48px));
max-width: 806px;
min-height: 72px;
padding: 10px 14px;
border: 1px solid rgba(185, 139, 75, 0.46);
border-radius: 6px;
clip-path: none;
background: rgba(7, 8, 8, 0.76);
box-shadow:
inset 0 0 0 1px rgba(255, 230, 180, 0.06),
0 6px 18px rgba(0, 0, 0, 0.18);
backdrop-filter: blur(4px) saturate(0.9);
}
html[data-theme='wasteland'] .input-wrapper::after {
content: '';
position: absolute;
left: 50%;
bottom: -22px;
width: 62px;
height: 28px;
transform: translateX(-50%);
background:
linear-gradient(135deg, transparent 42%, rgba(223, 180, 108, 0.58) 43% 47%, transparent 48%),
linear-gradient(45deg, transparent 42%, rgba(223, 180, 108, 0.58) 43% 47%, transparent 48%);
opacity: 0.72;
pointer-events: none;
}
```
### 5.5 侧栏项、按钮和 tool-call
```css
html[data-theme='wasteland'] .session-item {
border: 1px solid transparent;
border-radius: 4px;
clip-path: none;
box-shadow: none;
}
html[data-theme='wasteland'] .session-item:hover {
background: rgba(185, 139, 75, 0.08);
border-color: rgba(185, 139, 75, 0.22);
transform: none;
}
html[data-theme='wasteland'] .session-item.active {
background: rgba(43, 31, 20, 0.50);
border-color: rgba(196, 154, 90, 0.46);
box-shadow: inset 1px 0 rgba(223, 180, 108, 0.48);
}
html[data-theme='wasteland'] :is(.tool-call, .ccweb-prompt-card) {
border: 1px solid rgba(185, 139, 75, 0.30);
border-radius: 4px;
background: rgba(8, 10, 10, 0.58);
clip-path: none;
box-shadow: none;
}
html[data-theme='wasteland'] :is(.new-chat-btn, .new-chat-arrow) {
min-height: 48px;
border: 1px solid rgba(196, 154, 90, 0.48);
border-radius: 2px;
background: rgba(10, 12, 11, 0.68);
color: #dfbd82;
box-shadow: inset 0 1px rgba(255, 230, 180, 0.07);
}
html[data-theme='wasteland'] :is(.attach-btn, .send-btn, .abort-btn)::before {
width: 18px;
height: 18px;
opacity: 0.82;
}
```
## 6. 建议删除或替换的当前规则
优先删除这些规则,而不是在后面继续覆盖:
| 当前位置 | 建议动作 | 原因 |
|---|---|---|
| `style.css:7498-7502` | 替换整个 `background-image` | 当前遮罩太黑,径向金光也会污染符文圆环 |
| `style.css:7509-7522` | 删除 `body::after` | 人工火星层太显眼,且动画会让背景像装饰层 |
| `style.css:7546` | 删除侧栏大外阴影 | 参考图没有厚侧投影 |
| `style.css:7566-7572` | 删除顶栏/输入区外阴影 | 上下压条感过强 |
| `style.css:7589-7594` | 删除 `border-radius:0` 和 `clip-path`,降低 blur | 消息面板应轻圆角、半透明 |
| `style.css:7596-7617` | 替换用户/assistant 背景和阴影 | 当前背景太实、阴影太厚 |
| `style.css:7659-7667` | 删除弹层全局 `clip-path` 和 `--shadow-strong` 套用 | 弹层变成厚金属卡片 |
| `style.css:7670-7714` | 拆分大范围组件组 | 所有组件共用一个卡片底会形成卡片堆叠 |
| `style.css:7716-7726` | 替换输入框规则 | 高度、背景透明度、阴影、切角都偏离 |
| `style.css:7728-7736` | 降低 focus/drag 阴影 | 参考图状态变化克制,不应出现 3px 光圈 |
| `style.css:7739-7759` | 删除普通会话项切角、hover 位移、active 厚阴影 | 列表应是薄线面板,不是卡片列表 |
| `style.css:7775-7781` | 删除 tool-call 左粗边、切角和阴影 | tool-call 应嵌在消息面板内部 |
| `style.css:7821-7858` | 替换按钮组厚金边、clip 和 hover 光圈 | 当前最像“游戏按钮皮肤”,不似参考图薄金属线 |
| `style.css:7913-7968` | 缩小或移除统一 pseudo bitmap 图标规则 | 图标过大过实,且隐藏 SVG 后细线感丢失 |
| `style.css:7986-8010` | 删除欢迎卡片厚框、切角和大阴影 | 欢迎页不能另起一套卡片重装饰 |
| `style.css:8068-8071` | 删除 `wastelandEmberDrift` | 若删除 `body::after`,该动画也应删除 |
| `style.css:8074-8087` | 替换移动端重遮罩和 `0.97` 侧栏背景 | 移动端也不应变成纯黑抽屉 |
## 7. 执行顺序建议
1. 先改布局变量:`--sidebar-width:316px`、`--header-height:57px`。
2. 再改 `body` 遮罩,确保骑士主体、符文圆环、披风透出来。
3. 删除全组件 `clip-path`,只保留主按钮和输入框的局部角饰。
4. 降低所有面板背景 alpha 和外阴影,统一回 1px 旧金线。
5. 最后再处理图标尺寸和 active/hover 状态。
如果只做配色微调,不删厚边、全局切角和重阴影,mock 仍会偏离参考图。