yangwenjie1231/dsh-zhuang-fangyi ↗★ 0
dsh-zhuang-fangyi
庄方宜主题 for DeepSeek Harness —— 接入官方 ctx.theme 体系(4 套配色 × 浅色/深色完整适配),附皮肤层(观测台官方右栏标签页 + 浮层兜底 / 头像气泡重绘)、官方素材壁纸与强调色色相自选。官方素材量化取色,非官方同人作品。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yangwenjie1231/dsh-zhuang-fangyiREADME
Read the full README ↗dsh-zhuang-fangyi
庄方宜主题 for DeepSeek Harness —— 4 套风格预设(配色 / 明度 / 边框 / 材质 / 排版五个维度)× 浅色/深色各自完整适配,附官方素材壁纸、观测台(官方右栏标签页 + 浮层兜底)与头像气泡重绘。
非官方同人作品;配色与素材取自《明日方舟:终末地》官方公开物料的量化提取。
特性
- 接入官方主题体系:注册 4 预设 × 2 明暗 = 8 个主题进「外观」下拉,与其它主题插件互不干扰。
- 浅色与深色各自适配:每个 token 都提供两套值,明暗切换由外壳属性驱动,纯 CSS 跟随。
- 可跟随系统:默认走 token 层而不改 preference,
prefers-color-scheme不被锁定。 - 观测台:会话读数(轮次/步数/速率/token/缓存/上下文)+ 运行耗时 + 配色色板 + 壁纸切换。优先作为官方右栏标签页(
sidebarRightTabs扩展席位,与文件/终端并列、可拖拽调宽),右栏收起时以浮层显示在右侧 —— 两条路径由railOwner()单点裁决,不会同时让位。 - 皮肤层:助手头像与气泡/输入框重绘(可单独关闭)。
- 官方取色:荧光黄绿
#F2E957/ 青#75DCD9/ 酒红#D86766/ 橄榄绿#9EBD87/ 米白#E8D4D2;大招形态 墨青#1D3D30/ 冰白青#D2E7E0/ 香槟金#C4D579。 - 双壳适配:桌面端与网页端跑的是两套类名完全不同的壳,插件用「语义锚点 → 哈希反查 → 后缀兜底」三层定位同时兼容(详见
docs/双壳适配说明.md)。 - 竖图不裁人:
portrait/vertical这类竖图自动改用contain完整显示,两侧由同图重模糊垫底填充(判据来自生成器产出的art/wallpapers.json,不硬编码图名)。 - 无构建步骤:两个半边都是手写 JS,除外壳已提供的
react外零依赖。 - 强调色自选:
accentHue可把强调色转到任意色相(0–359°),保留原配色饱和度;明度按对比度自动校正,任意色相都可读(有 672 项色相扫描兜底)。 - 可验证:
npm test串起 392 项对比度断言 + 672 项强调色色相扫描 + 933 项浏览器半边无头测试(含 13 组真实浏览器引擎实测、65 项断言)+ 发行清单自检(桩忠实复刻插槽冲突校验、官方 tab 注册契约、样式表形态与壁纸渲染链)。另有/diag真机自检(含壁纸渲染五环探针)。
与 Mornye(莫宁 Observation Skin)的对照
本插件的设计参考了开源项目 Mornye-Observation-Skin
(data-plugin-css 哈希反查、状态推导优先级、原生面板让位策略均学自它,MIT)。
功能对照如下:
| 能力 | Mornye 0.4.2 | 本插件 |
|---|---|---|
| 明暗适配 | 仅浅色完整,深色回退官方 | 浅色/深色各自完整适配(8 主题) |
| 观测台载体 | 页面内浮层 | 官方右栏标签页(+ 浮层兜底,单点裁决) |
| 适配壳版本 | 桌面 0.1.7-rc.2(锁死) | 桌面 0.2.0-rc.2 + 双壳三层定位(Web 代码兼容、未真机验证) |
| 壁纸 | 无 | 8 张 × 明暗两版 = 16 张官方素材 WebP;透明度/模糊/位置可调;竖图自动 contain + 模糊垫底(不裁人) |
| 统计 | 轮/步/缓存,— 兜底 | 同策略,另解析 tok/s、token 总量、上下文占比(六卡自适应 240–380px) |
| 状态区 | RUNNING/TOOL/DONE/ERROR/STOPPED + 耗时 | tool/running/error/stopped/done + 运行耗时(1s 走字,running↔tool 不重置) |
| 预设深度 | 三套浅色预设,主要差异在强调色与透明度 | 风格预设:明度基调 + 色度性格 + 边框强度 + 材质深度 + 排版 + 配套壁纸,切预设一眼可辨(明度极差 0.0522) |
| 排版 | 有(字体按颜色/排版/组件三层细化) | 有:5 档字体栈 + 3 档字号(±5%),覆盖 --dsw-font-family(不动字号与代码字体) |
| 无障碍 | 未提及 | 响应 prefers-reduced-transparency 与 forced-colors(壁纸整层撤掉,不改用户设置) |
| 发行工程 | npm + 市场收录 | LICENSE + dshWorkshop 清单 + CI + 清单自检(见 docs/RELEASE.md) |
| 强调色自选 | 有(三种预设强调色,固定) | 有且更开放:任意色相 0–359°,且明度自动校正保证可读(672 项扫描) |
| 静止模式 | 有(开关) | 有(跟随系统 / 静止),只关本插件自己的过渡,不越权全局 |
| 聊天导航 | 有(读页面 DOM,只覆盖已加载内容) | 不实现 —— 官方已提供且更强,见下方「为什么不重复实现聊天导航」 |
| 自动化测试 | Playwright runtime/parity + 语义契约 | 933 无头断言(含 13 组真实引擎实测)+ 392 对比度断言 + 672 色相扫描 + 发行清单自检 + /diag 真机自检 |
| 发行工程 | ZIP + install/uninstall + SHA256SUMS + PRIVACY | 同套(见 tools/package.ps1、PRIVACY.md、ASSETS-NOTICE.md) |
对照原则:只把「官方没有、Mornye 有」算作缺口。官方已有的能力直接用官方实现, 不重复造 —— 否则做出的是更差的版本,还会与官方 UI 打架。
为什么不重复实现聊天导航
规划中曾把「本地聊天导航」列为本插件的主要缺口(因为 Mornye 有)。核实官方后撤销了这项:
| Mornye 的导航 | 官方已有 | |
|---|---|---|
| 数据源 | 读页面 DOM(只覆盖已加载内容) | Host 投影 turnOutline(覆盖全部已开始轮次,含未加载) |
| 覆盖 | 当前页可见内容 | 全部轮次 |
| 定位 | scrollIntoView | 官方轮次导航轨(右侧刻度梯,10px 间距,可滚动,支持加载更早历史) |
| 搜索 | 有 | dsh-client-ui-trajectory 提供(含时间线、token 用量、TTFT 耗时) |
即:Mornye 的导航是在较老壳版本(0.1.7-rc.2)上补的 DOM 版;在本插件适配的 0.2.0-rc.2 上,官方已把这件事做得更根本。自己再做一遍只会更差且重复,所以不做。
对标收尾:Mornye 有、官方没有的剩余项是外观控制器的强调色自选 ——
该项已在 v0.3.0 实现(accentHue,任意色相 + 对比度自动校正),见下方「强调色色相」一节。
安装
从 GitHub 直装(推荐,无需 npm):
dsh plugin --profile desktop add github:yangwenjie1231/dsh-zhuang-fangyi
装完重启 DSH(bundle 在启动时装配;宿主半边改动更是必须重启)。
从本地源码装(改代码时用):
# 从本地目录装进 desktop profile
dsh plugin --profile desktop add /path/to/dsh-zhuang-fangyi
或手动:把本目录放到 $DSH_HOME/profiles/ /node_modules/dsh-zhuang-fangyi,
并在该 profile 的 package.json 里加依赖与 dsh.profile.bundles 条目,然后重启 DSH。
改代码后怎么生效
| 改了什么 | 生效方式 |
|---|---|
client.js | 走 HMR(模块注册表按 mtime/size 派生 revision),必要时刷新页面 |
index.js / src/*.js | 必须重启 DSH |
plugin_manager 的 disable → enable 只重跑 apply(),不会重新 import
依赖模块 —— Node 的 ESM 缓存按路径生效,所以改了 index.js 或 src/*.js
后页面仍是旧代码。这不是代码写错了。
用构建标记可以一眼确认跑的是哪一版(tools/deploy.ps1 部署时写入):
Invoke-WebRequest http://127.0.0.1:19387/api/zhuang-fangyi/themes | % Content
# {"build":"20261005-123748", ...} ← 与部署时间一致即已生效
从发行 ZIP 安装(用户视角)
# 解压发行包后,先校验再安装:
.\install.ps1 -DshPath 'D:\path\to\DeepSeek Harness' -CheckOnly
.\install.ps1 -DshPath 'D:\path\to\DeepSeek Harness'
install.ps1 会把插件写入 profiles/desktop/node_modules、更新 profile 的依赖与
bundles 条目,并备份 package.json 原始字节供 uninstall.ps1 还原。
发行包由 tools/package.ps1 生成(ZIP + SHA256SUMS.txt,按明确文件清单打包)。
设置
「设置 → 庄方宜」:
| 分组 | 项 |
|---|---|
| 主题 | 启用 · 风格预设(本体黄绿·明亮轻盈 / 大招墨青金·厚重深沉 / 青·清爽中性 / 酒红·浓郁暖调)· 明暗模式(跟随系统 / 固定浅色 / 固定深色) |
| 背景 | 背景图(缩略图条,随明暗显示对应版本)· 不透明度 0–90%(拖满近乎全透)· 模糊 0–16px · 位置(铺满 / 靠右 / 平铺) |
| 装饰 | 字体(默认 / 无衬线 / 衬线 / 圆体 / 等宽)· 字号(紧凑 / 标准 / 宽松)· 阅读宽度(紧凑 760px / 标准 / 宽松 1080px)· 强调色色相(0–359° 或「预设」)· 动效(开启 / 跟随系统 / 关闭)· 启动动效 · 等高线细边框 · 强调色微光 · 空白页头像 · 标题栏跟随 |
| 皮肤 | 右侧观测栏 · 观测栏宽度 240–380px · 头像与气泡重绘 |
底部两个按钮:恢复默认(POST {"reset":true} 真正写回 defaultSettings())与重试(重新保存当前设置)。
侧栏底部另有一键开关。
观测台的双路径行为
| 当前状态 | 谁来显示观测台 |
|---|---|
| 右栏收起 | 浮层(shell.overlay,position:fixed 贴右边、避让 40px 标题栏) |
| 右栏展开 | 官方标签页(自动 openTab,与文件/终端并列、可拖拽调宽) |
| tab 挂着但面板收起 | 浮层接手 —— 官方实现里 docked 内容收起时仍挂载(只是平移出右边缘),所以「挂着」不等于「看得见」 |
| 用户手动关掉我们的 tab | 不反复重开(尊重选择),浮层也不接管(面板还开着,可从「指南」重开) |
| 视口 0`(tab 真的挂着内容) | |
且 nativeRightbarOpen()(面板确实展开)。只看前者会在收起后误判 —— 那时 tab | |
| 仍挂载但已移出可视区,结果两边都看不见(实测踩过两次:一次是「注册≠打开」, | |
| 一次是「挂着≠可见」)。 |
- 观测台刻意不读取消息正文 —— 读数只来自外壳已渲染的统计行,本插件是皮肤,
不该碰会话内容(隐私边界见
PRIVACY.md)。 - 头像与气泡:助手消息旁显示圆形头像 + 「庄方宜」标签;用户气泡与输入框 改为细边框 + 圆角。
设置落盘于 $DSH_HOME/zhuang-fangyi/settings.json(临时文件 + rename 原子写)。
文件损坏时会备份为 .corrupt- 并回落默认值,不覆盖原文件。
设置结构版本 v3(v1→v2 加观测栏/气泡,v2→v3 加强调色色相与静止模式);
旧文件会无损升级(新键补默认值,已有字段全部保留)。
观测台的读数从哪来(权威推送 + DOM 兜底)
六个读数(轮 / 步 / tok/s / token 总量 / 缓存命中 / 上下文占比)与状态点优先来自宿主:
宿主事件:turn/start · turn/end · step/start · assistant/message.usage
tool/call · tool/result · request/context · api-session/status
↓ src/sessionState.js 折叠(**白名单**:只取数字与枚举)
GET /api/zhuang-fangyi/stream?session= SSE(200ms 合并 · 15s 心跳)
↓
客户端 EventSource:有新鲜帧(10s 内)就用它;否则回退解析 DOM
为什么要换:这些数字原本全靠解析 DOM 文字 —— 已经因为「外壳结构变了」栽过三次 (右栏 pane / 左栏内层 / 输入区座位),每次都是同一个病:读的不是权威来源。
字段级回退:cacheHit / rate / context.used 宿主可能给不出(provider 没报、
上下文窗口未知)—— 那几格用 DOM 的值,其余仍用宿主的。整条流不可用(没连上 / 打开的
是历史会话不在宿主 / 环境没有 EventSource / 断了正在退避)→ 六项全回退,也就是
换之前的行为一字不差。
隐私:载荷逐字段写出(绝不 spread 事件对象),只有数字读数与状态枚举; 消息正文、工具参数、流式文本一律不读。有断言盯着字段集 —— 想加一个泄漏字段就会失败。
退路:?once=1 返回同形的单个 JSON 快照。万一某个载体的协议不吃流式响应,
客户端改成轮询即可(一行)。/api/zhuang-fangyi/diag 里的 statsSource
(sse / dom)能一眼看出当前走的是哪条路。
成本:只有有人订阅的会话才折叠事件(先查 Map,其他会话零开销);变化按 200ms
合并;上下文占比调 tokenMeter.measure()(O(surface))按 2s 限流、回合结束时补一次;
订阅者断完即回收 tracker 与计时器。
风格预设:为什么「只换配色」不够,以及怎么修
用户反馈「切换主题就改个配色会不会太少了」。实测证实了这个判断:
| 对比 | 浅色 base 亮度差 | 深色 base 亮度差 |
|---|---|---|
| 修复前(四套预设两两) | 0.0019 – 0.0144 | 0.0001 – 0.0012 |
深色下 0.0001 = 肉眼完全不可辨。根因有两条,叠加起来就是「切预设 ≈ 只换按钮颜色」:
- 旧版四套预设的
chroma/chromaDark全是 5/6,只有hue不同 - 而
hue对大面积表面的影响被「按面积分配」刻意压到极低(那是 v3 为了 大面积不显脏而定的原则,本身是对的)
修法:预设升级为风格预设,每套带 4 个维度:
| 维度 | 作用 | 实测效果 |
|---|---|---|
明度基调 surfaceShift | 表面明度整体平移 | 浅色极差 0.0144 → 0.0522;深色 0.0012 → 0.0034 |
色度性格 chroma | 各套不同(4/7、8/11、6/8、7/10) | 表面冷暖浓度可辨 |
边框强度 borderAlpha | 缩放 border-l1..l4 | 0.72/0.9/0.6/0.8 |
材质深度 depth | 覆盖 --dsw-elevation-* 三档 | flat 纸面 / soft 官方 / deep 实体面板 |
外加配套壁纸(只作推荐,见下)。
⚠️ 「文字更柔和」这个维度的可用幅度极小:textSoft 给 4.5 个百分点时,
burst/light 与 wine/light 的「三级文字 / 二级面」会跌破 4.5:1(实测
4.20–4.41),所以最终只能给 2.0。这是设计约束不是可调参数 —— 想更柔必须
同时压深 surfaceAlt,不能单独拉高文字明度。
配套壁纸只作推荐,绝不自动切换
每套预设声明一张配套壁纸(sakura / dark / pool / promo),客户端在壁纸缩略图条
上给它打一个小圆点标记,title 追加「(本预设推荐)」。
切换预设不会改动 settings.background 一个字节 —— 有测试断言锁死。
选择权完全在用户手里。
(那个小圆点是圆形标记,用了 border-radius:50% + corner-shape:round
—— 外壳全局把 *,:before,:after 设成 superellipse(1.5),不还原的话圆点会
变成圆角方块。全仓除此之外没有任何圆角改动。)
补全 alias token:为什么「只有一部分控件变色」
外壳共 120 个 alias token,旧版只注册 77 个。没注册的 token,外壳会用回 它自己的默认值 —— 这就是「切主题只有一部分控件变色」的根因。
按外壳引用次数从高到低补齐了 41 个(引用多 = 出现得多):
| 引用 | token | 说明 |
|---|---|---|
| 142 | state-error-primary | 错误态 |
| 44 | state-success-primary | 成功态 |
| 28 | state-warn-primary | 警告态 |
| 25 / 22 | state-warn-label / -tertiary | 警告文字 |
| 14 | label-deep-diving | 「深度思考」标签 |
| 10 | button-tool-bar-fill | 工具栏按钮(用户看到的「某些按钮」) |
| … | 遮罩 5 个、分层背景 3 个、填充 4 个、diff 9 个、分隔/选区/浮标 |
状态色的设计原则:色相锚定语义(成功=绿 145°、警告=琥珀 42°、错误=红 8°), 只让明度骨架与色度尺度向预设靠拢。把「错误」染成主题色是错的 —— 用户会认不出它。所以:
- 状态色用固定色度基线(60)而不是
c * N:表面色的 chroma 只有 4–11, 按它的尺度算出来是灰的(实测#9AAFA3灰绿、#B4A29F灰粉), 完全起不到提示作用 - 明度按明暗分开(浅色压深、深色提亮),否则浅色底上对比度不足
(实测
stateIdle两边都用 55% 时跌破 3:1)
覆盖率:77/120 → 118/120。差的 2 个是模板字符串拼接出的非常规名
(--dsw-alias-scrollbar-${level} 之类),不是真实 token。
强调色色相(accentHue)为什么不能只转色相
accentHue 允许把强调色转到任意色相(0–359°),保留原配色的饱和度。
最初的实现只旋转色相、保留明度,理由是「预设的 accentLight 明度已按可读性
调过,换色相后依然成立」。这个推理是错的 —— 相对亮度取决于色相:人眼对绿最
敏感、对蓝最迟钝,同一明度下黄绿转蓝后亮度显著下降。
contrast.js 里有一条色相扫描(12 色相 × 4 预设 × 2 明暗 × 7 断言 = 672 项)
把这件事变成了可测量的:初版实现有 62 项跌破阈值,例如
wine/light转 60°(黄):链接 3.25:1。这正是最初「只改了配色」的根因 | | 客户端插样式表用el.textContent = css,**不能带 `` 标签** |/style.css必须发纯 CSS(structureCss());带标签会让浏览器把紧随的html{}块整块丢弃 →--zf-art-*` 全失效 → 壁纸画不出来(而观测台样式仍正常,极具迷惑性) | | Node ESM 按路径缓存,disable/enable 不重新 import | 改 Host 侧代码必须重启 DSH → 加构建标记以便判别 |
两层覆盖
- 19 级中性色阶
--dsw-static-neutral-bluish-*—— 只在body{}定义一次, 明暗两套 alias 各自引用其中不同级数。覆盖一次色阶 = 明暗双向同时生效, 并自动兜住未列举的组件。 - 语义 alias 直写 —— 色阶只给整体色调倾向;浅色下
bg-base、layer-1、layer-3、按钮、输入框全部映射到同一级static-00,分层靠描边而非填色, 必须直写才能给出层次。
配色:色度、以及为什么必须「按面积分配」
HSL 的饱和度是相对量,在明度两端会被压缩。同一个 s=0.13:
L=96.5%→#F7F7F5,几乎纯灰(肉眼看不出颜色)L=50%→ 明显有色
界面底色恰恰全在明度两端(浅色 89–99%、深色 8–21%),所以「调饱和度」在底色上
几乎无效。改用色度(max-min,0..255)—— 绝对量,直接对应「看起来有多少颜色」:
S = chroma / (255 · (1-|2L-1|))
这样无论明度多高多低,色相都保持同样的可见强度。见 src/palette.js 的 tint()。
但色度不能当成「整体染色」的旋钮 —— 这里踩过两次坑:
| 版本 | 做法 | 反馈 |
|---|---|---|
| v1 | 表面色度 3–5 | 整屏发灰,「太丑」 |
| v2 | 表面色度 12–22 | 「像给整个画面加了一层滤镜」 |
| v3(当前) | 按面积分配 | 近中性底 + 主题色点缀 |
v3 的原则:色度按面积分配。
| 面积 | 部位 | 色度 | 作用 |
|---|---|---|---|
| 大面积 | base / surface / surfaceAlt / sidebar | 2–6 | 近中性,只留一丝冷暖暗示 |
| 中面积 | code / codeBanner / inlineCode | 7–10 | 把代码块从底上分出来 |
| 选中态 | navActive / brandSoft / 气泡 | 15–21 | 明显带主题色,但不抢眼 |
| 小面积 | brand / link / focusRing | 58–155 | 主题色只在这里出现 |
大面积带色相必然显脏、像滤镜 —— 真实界面的大面积色度都很低
(GitHub dark #0D1117 色度 10、VS Code #1E1E1E 色度 0)。
这也正是「更明显的主题色」的正确实现:不是把底色染绿,而是让强调色在近中性
的底上跳出来。调色时改 PRESET_SPECS 里的 hue 与 chroma 两个数即可。
为什么「跟随系统」用 overrideTokens 而不是 setTheme
桌面版下,setTheme(固定id) 会让 presenter 把 html[data-ds-theme-source] 设为该
scheme,桌面壳 preload 再转发给 nativeTheme.themeSource —— 一旦如此,
prefers-color-scheme 就被锁定,系统换主题不再触发。
所以「跟随系统」走 token 层(不改 preference,data-ds-theme-source 保持 system),
「固定浅色/深色」才走注册表。两条路径各司其职。
壁纸的「纱」为什么不能改 token
最初给 --dsw-alias-bg-base 套 alpha 让外壳透出壁纸,实测无效:presenter 把
全部 token 写成 body 的行内样式,行内优先级高于任何样式表规则。
正确做法:不动 token,而是把外壳那几层不透明的背景改成半透明。半透明色由
客户端按当前预设与明暗算好,写成 --zf-veil*(外壳不认识的新变量)。
还有个容易错的点:外壳是嵌套的,若给每层都套 alpha,可见度会连乘
(两层各 0.83 只剩 0.69;实测「壁纸完全看不见」时只剩 3%)。所以外层
(body / #root / frame)全部透明,只让三个列各带一层纱。
壁纸渲染链(五环,逐环可诊断)
壁纸从设置到画出来要经过五环,任一环断掉的表现都是「背景没反应」,
所以 /diag 里有一条 wallpaper 探针逐环报告计算值:
| 环 | 内容 | 断掉的表现 |
|---|---|---|
| ① 属性 | html[data-zf-wallpaper] / body[data-zf-wallpaper] | 整条链不启动 |
| ② 间接引用 | 行内 --zf-art-src: var(--zf-art-) | 计算值为空 |
| ③ 被引用变量 | 样式表 html{ --zf-art-: url(...) } | ② 解析失败 → 整条属性失效 |
| ④ 绘制层 | html::before 的 background-image 计算值 | none = 没画 |
| ⑤ 上层透明 | 纱色 / frame / 中栏的实际背景 | 不透明就盖住壁纸 |
第 ③ 环曾经断过很久:/style.css 带了 `` 标签,浏览器把紧随的
html{} 块整块丢弃 → 21 个 --zf-art-* 全没定义 → 壁纸怎么都出不来,
而观测台样式(在文件后半段)完全正常。详见
docs/双壳适配说明.md 第八节。
纱之上还有别的层(右栏整片黑的原因)
上面五环全绿、中栏也透出壁纸了,右栏仍可能整片黑。「开始」页和 tab 条尤其 明显 —— 这不是壁纸链断了,而是壳在纱之上又铺了一层不透明底。
壳源码实测:右栏 dockkit 的每个 pane 都带
._tabHost_6nhg2_162:not(._float_6nhg2_156),._emptyTabHost_6nhg2_143{background:var(--dsw-alias-bg-base)}
而 tabHost 就是 pane 本身(children = tabHostHeader(tab 条) + tabHostBody(页面内容)),
所以 tab 条与「开始」页/文件页都坐在它上面 —— 而这两个元素自己都没有背景。
判据:先问「谁在这块上声明了 background」,从最上面的元素往下查,
而不是从壁纸往上猜。修法与「三处刻意不碰」见
docs/双壳适配说明.md 第九节。
同一类还有左栏(会话列表那侧):Windows 上列(sidebarCol)与内层组件
(_2H3hWW_root)是两层同色不透明底,内层把纱盖回去 —— 官方只给 macOS 写了
内层透明(background:0 0)。这里的修法不是去点名内层组件(它的本地名是
root,[class*="_root"] 这种写法会误伤一大片),而是在列上把
--dsw-specific-sidebar-fill 置透明:自定义属性按最近祖先解析,内层引用的那个
变量就地透明 —— 不依赖任何类名哈希,纯 CSS 首帧生效。
第三个面是输入区:.Dc7zOa_composerSeat 铺了一条「透明 → bg-base」的 36px
渐变(Dc7zOa_root[data-phase=active] / Dc7zOa_embeddedBody[data-content-phase=active]
两条规则)。它的用意是让滚动中的消息消失在输入条上方 —— 但壁纸开启时
bg-base 是主题的不透明底色,于是输入区上方成了一条黑色渐变带。
壁纸模式下改成不涂(透明),那条带子就露出中栏的纱,与周围同色。
代价:座位不再遮滚动中的文字,消息会显示到输入卡上沿(卡片本身不透明, 所以只在它上方那圈留白里看得到)。要更安静的话,可以换成「渐到纱色」或 加一道轻
backdrop-filter—— 两者都比原来那条黑带轻。
透明度只有一个来源(观测栏)
观测栏(右栏收起时的那个浮层)背景是透明的,它不涂自己那层纱:露出的就是 它下面中栏那层纱。所以它永远等于滑杆那一档,不会出现「数值同源、观感不同」。
早先它走自己的一套:私有变量
--zf-rail-veil+ 私有底色 + 62% 兜底。数值确实 来自同一个滑杆,但它是在中栏那层纱之上又涂一层 —— 14% 档两层相乘 ≈ 0.98 (几乎全实),90% 档 ≈ 0.19(仍比别处实)。这正是用户看到并反馈的差。backdrop-filter保留:它不改透明度(纱是一层纯色,模糊它还是那个色), 只把壁纸细节糊掉 —— 高档位下小字号的可读性保险。
跟随预设的小细节(选中色 / 输入光标 / 代码高亮 / 换图)
这四处以前不跟随主题,现在都跟了:
| 处 | 以前 | 现在 |
|---|---|---|
选中文字 ::selection | 浏览器默认蓝,在壁纸上很跳 | 强调色兑 30% 透明做底,文字保持 label-primary(底色只做提示,不压花字) |
输入光标 caret-color | 系统默认色 |