@sky_wing_dn/dsh-fairy-zzz 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -8,7 +8,7 @@ Boot animation → greeting → docked eye badge, plus a "Wire-Net Terminal" hos
8
8
 
9
9
  [中文](README.md) · [Changelog](docs/CHANGELOG.md) · [Technical notes](docs/TECHNICAL.md) · [Performance report](docs/PERFORMANCE.md)
10
10
 
11
- ![version](https://img.shields.io/badge/version-2.0.2-D8FA00?style=flat-square&labelColor=101110)
11
+ ![version](https://img.shields.io/badge/version-2.0.3-D8FA00?style=flat-square&labelColor=101110)
12
12
  [![npm](https://img.shields.io/npm/v/@sky_wing_dn%2Fdsh-fairy-zzz?style=flat-square&labelColor=101110&color=D8FA00)](https://www.npmjs.com/package/@sky_wing_dn/dsh-fairy-zzz)
13
13
  ![license](https://img.shields.io/badge/license-MIT-101110?style=flat-square)
14
14
  ![platform](https://img.shields.io/badge/DSH-Desktop%20%26%20Web-101110?style=flat-square)
@@ -288,7 +288,7 @@ Attach the tarball from `npm pack` to the GitHub Release; npm-installed users wi
288
288
 
289
289
  ## Changelog
290
290
 
291
- Milestones: v1.1–v1.6 performance and eye-runtime rewrite; v1.7 Wire-Net Terminal skin, fee readout, boot colour correction; v2.0 one-click self-update. User-visible changes per release live in [docs/CHANGELOG.md](docs/CHANGELOG.md); implementation notes and trade-offs in [docs/TECHNICAL.md](docs/TECHNICAL.md).
291
+ Milestones: v1.1–v1.6 performance and eye-runtime rewrite; v1.7 Wire-Net Terminal skin, fee readout, boot colour correction; v2.0 one-click self-update; v2.0.3 the fee dock sits above the footer and no longer covers the session list. User-visible changes per release live in [docs/CHANGELOG.md](docs/CHANGELOG.md); implementation notes and trade-offs in [docs/TECHNICAL.md](docs/TECHNICAL.md).
292
292
 
293
293
  ## License
294
294
 
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [English](README.en.md) · [变更记录](docs/CHANGELOG.md) · [技术说明](docs/TECHNICAL.md) · [性能报告](docs/PERFORMANCE.md)
10
10
 
11
- ![version](https://img.shields.io/badge/version-2.0.2-D8FA00?style=flat-square&labelColor=101110)
11
+ ![version](https://img.shields.io/badge/version-2.0.3-D8FA00?style=flat-square&labelColor=101110)
12
12
  [![npm](https://img.shields.io/npm/v/@sky_wing_dn%2Fdsh-fairy-zzz?style=flat-square&labelColor=101110&color=D8FA00)](https://www.npmjs.com/package/@sky_wing_dn/dsh-fairy-zzz)
13
13
  ![license](https://img.shields.io/badge/license-MIT-101110?style=flat-square)
14
14
  ![platform](https://img.shields.io/badge/DSH-Desktop%20%26%20Web-101110?style=flat-square)
@@ -288,7 +288,7 @@ GitHub Release 附 `npm pack` 生成的 tarball;从 npm 装的用户下次打
288
288
 
289
289
  ## 变更记录
290
290
 
291
- 主要节点:v1.1–v1.6 性能与眼徽重写;v1.7 绳网终端皮肤、电费读数、开机颜色校正;v2.0 一键自更新。逐版本的用户可见改动见 [docs/CHANGELOG.md](docs/CHANGELOG.md);实现细节与设计取舍在 [docs/TECHNICAL.md](docs/TECHNICAL.md)。
291
+ 主要节点:v1.1–v1.6 性能与眼徽重写;v1.7 绳网终端皮肤、电费读数、开机颜色校正;v2.0 一键自更新;v2.0.3 电费坞贴底、不再压住会话列表。逐版本的用户可见改动见 [docs/CHANGELOG.md](docs/CHANGELOG.md);实现细节与设计取舍在 [docs/TECHNICAL.md](docs/TECHNICAL.md)。
292
292
 
293
293
  ## 许可
294
294
 
package/client.js CHANGED
@@ -1363,11 +1363,14 @@ html[data-fz3-theme="light"] .fz3-set-switch[data-on="1"]::after{background:#041
1363
1363
  /* ---------- 常驻电费读数(v1.7.5) ---------- */
1364
1364
  /* 不做成卡片:没有底色、描边和阴影,就是侧栏页脚上方的几行字 + 一行计费说明,
1365
1365
  和侧栏自己在同一个平面上,不会在窗口里再「套一个窗口」抢视线。
1366
- 位置仍在页脚胶囊正上方(同一条左边界、向上生长),不会盖住胶囊或「默认工作区」行。
1366
+ 位置(v2.0.3):贴在侧栏页脚上沿 6px 处,具体值由 BillDock 实测页脚 top 后写进
1367
+ --fz3-bill-bottom(窗口高度 / 页脚高度变化会跟着重算);86px 只是 JS 未生效时的兜底。
1368
+ 同时 BillDock 把「电费坞高度 + 上下留白」写进 --fz3-bill-reserve,侧栏列表区底部
1369
+ 让出等高的空白(见下方 regionArea 规则),工作区列表再长也滚不到电费坞底下。
1367
1370
  这里就是电费唯一的出口:不再有气泡,也没有点击;眼徽退回纯状态指示。
1368
1371
  数据走 usageCache 的 30s / 60s TTL,20s 轮询基本都命中缓存,不会反复解压会话日志。 */
1369
1372
  .fz3-bill{
1370
- position:fixed;left:12px;bottom:86px;width:255px;z-index:2;box-sizing:border-box;
1373
+ position:fixed;left:12px;bottom:var(--fz3-bill-bottom,86px);width:255px;z-index:2;box-sizing:border-box;
1371
1374
  display:grid;gap:1px;padding:8px 10px 9px;border-radius:8px;
1372
1375
  pointer-events:auto;background:transparent;
1373
1376
  font-family:var(--fz3-font);font-size:14px;line-height:1.45;color:rgba(242,242,238,.72);
@@ -1391,6 +1394,12 @@ html[data-fz3-theme="light"] .fz3-bill-clock{color:#2f8757}
1391
1394
  html[data-fz3-theme="light"] .fz3-bill-note{color:rgba(16,17,16,.44);border-top-color:rgba(16,17,16,.09)}
1392
1395
  html[data-fz3-theme="light"] .fz3-bill[data-tone="peak"] .fz3-bill-clock{color:#a06718}
1393
1396
 
1397
+ /* v2.0.3:侧栏工作区列表区底部让出电费坞的高度,列表最后一行永远停在电费坞上方。
1398
+ 变量由 BillDock 实测写入(电费坞高度 + 14px),默认 0 = 不占位。
1399
+ regionArea 是 flex 列 + overflow:hidden,padding-bottom 只会缩内层滚动区的底边,
1400
+ 不会把页脚顶走(已按宿主 content-box 实测:regionArea 高度不变,列表 -152px)。 */
1401
+ [class*="_regionArea"]{padding-bottom:var(--fz3-bill-reserve,0px)}
1402
+
1394
1403
  /* ==================================================================
1395
1404
  * v1.7.0 — 「绳网终端 / WIRE-NET TERMINAL」宿主皮肤层
1396
1405
  * 语言来源:zzz.mihoyo.com(纸面 zine:纸白/墨黑/荧光青柠/斜切块/胶片孔/Impact 数字)
@@ -3006,6 +3015,7 @@ html[data-fz3-theme="light"] [class*="_shortcut_"] [class*="_key"]{color:rgba(16
3006
3015
  const [nowTick, setNowTick] = useState(() => Date.now())
3007
3016
  const alive = useRef(true)
3008
3017
  const flipRef = useRef(0)
3018
+ const dockRef = useRef(null)
3009
3019
 
3010
3020
  const refresh = useCallback(async (force) => {
3011
3021
  const [usage, balance] = await Promise.all([loadUsage(!!force), loadBalance(!!force)])
@@ -3025,6 +3035,69 @@ html[data-fz3-theme="light"] [class*="_shortcut_"] [class*="_key"]{color:rgba(16
3025
3035
  }
3026
3036
  }, [refresh])
3027
3037
 
3038
+ /* v2.0.3:电费坞贴住侧栏页脚上沿,并把自身高度让给工作区列表区。
3039
+ 只写两个 CSS 变量,不动宿主 DOM:
3040
+ --fz3-bill-bottom 电费坞底边 = 页脚 top 反算(窗口 / 页脚高度变化自动跟随)
3041
+ --fz3-bill-reserve 列表区底部预留 = 电费坞高 + 14px(列表滚到底也压不到坞)
3042
+ 侧栏收起 / 页脚不可见时 apply() 返回 false,保持 CSS 兜底值,不硬挪。 */
3043
+ useEffect(() => {
3044
+ const root = document.documentElement
3045
+ let tries = 0
3046
+ let timer = null
3047
+ let resizeTimer = null
3048
+ let observer = null
3049
+
3050
+ const apply = () => {
3051
+ const dock = dockRef.current
3052
+ const foot = document.querySelector('[class*="_footArea"]')
3053
+ if (!dock || !foot) return false
3054
+ const fr = foot.getBoundingClientRect()
3055
+ /* 宽度 <200px = 侧栏被收成窄条,页脚不是正常形态,别跟着它算 */
3056
+ if (fr.height <= 0 || fr.width < 200) return false
3057
+ root.style.setProperty('--fz3-bill-bottom', Math.max(8, Math.round(window.innerHeight - fr.top + 6)) + 'px')
3058
+ const h = Math.round(dock.offsetHeight)
3059
+ if (h > 0) root.style.setProperty('--fz3-bill-reserve', h + 14 + 'px')
3060
+ return true
3061
+ }
3062
+ const onResize = () => {
3063
+ if (resizeTimer) return
3064
+ resizeTimer = setTimeout(() => {
3065
+ resizeTimer = null
3066
+ try { apply() } catch (e) {}
3067
+ }, 120)
3068
+ }
3069
+ const attach = () => {
3070
+ const foot = document.querySelector('[class*="_footArea"]')
3071
+ if (foot && typeof ResizeObserver === 'function') {
3072
+ observer = new ResizeObserver(() => {
3073
+ try { apply() } catch (e) {}
3074
+ })
3075
+ try {
3076
+ observer.observe(foot)
3077
+ if (dockRef.current) observer.observe(dockRef.current)
3078
+ } catch (e) {}
3079
+ }
3080
+ window.addEventListener('resize', onResize)
3081
+ }
3082
+ const tick = () => {
3083
+ let ok = false
3084
+ try { ok = apply() } catch (e) {}
3085
+ if (ok || tries >= 20) return attach()
3086
+ tries += 1
3087
+ timer = setTimeout(tick, 300)
3088
+ return undefined
3089
+ }
3090
+ tick()
3091
+ return () => {
3092
+ if (timer) clearTimeout(timer)
3093
+ if (resizeTimer) clearTimeout(resizeTimer)
3094
+ if (observer) observer.disconnect()
3095
+ window.removeEventListener('resize', onResize)
3096
+ root.style.removeProperty('--fz3-bill-bottom')
3097
+ root.style.removeProperty('--fz3-bill-reserve')
3098
+ }
3099
+ }, [])
3100
+
3028
3101
  const usage = data.usage
3029
3102
  const balance = data.balance
3030
3103
  const peak = usage && usage.peak
@@ -3047,7 +3120,7 @@ html[data-fz3-theme="light"] [class*="_shortcut_"] [class*="_key"]{color:rgba(16
3047
3120
 
3048
3121
  return h(
3049
3122
  'div',
3050
- { className: 'fz3-bill', 'data-tone': tone, 'data-loading': usage || balance ? '0' : '1' },
3123
+ { ref: dockRef, className: 'fz3-bill', 'data-tone': tone, 'data-loading': usage || balance ? '0' : '1' },
3051
3124
  h('div', { className: 'fz3-bill-head' }, 'Fairyの电费'),
3052
3125
  h(
3053
3126
  'div',
package/docs/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。记录原则:小改动一行带过,大版本 / 大功能才展开。
6
6
 
7
+ ## [2.0.3] — 2026-11-08
8
+
9
+ ### 修复
10
+
11
+ - **电费坞压住工作区列表**:电费坞原来固定在左下角一个写死的位置,会话多、列表滚到底时最后几行会滑到电费坞下面。现在电费坞按侧栏页脚的实际位置贴底(页脚上方 6px),工作区列表底部预留电费坞的高度,滚到底最后一行也会停在电费坞上方。
12
+
13
+ ### 变更
14
+
15
+ - 版本号 2.0.2 → 2.0.3。
16
+
7
17
  ## [2.0.2] — 2026-11-08
8
18
 
9
19
  ### 修复
package/docs/TECHNICAL.md CHANGED
@@ -1,7 +1,7 @@
1
- # dsh-fairy-zzz 插件技术说明(v2.0.2)
1
+ # dsh-fairy-zzz 插件技术说明(v2.0.3)
2
2
 
3
3
  > 目标读者:**没有参与过本项目、但要继续维护或修改这个插件的人 / AI 智能体**。读完这篇文档,应该能独立定位代码、改功能、打版本、发布到 GitHub,并复现验证。
4
- > 最后更新:2026-11-08,对应版本 v2.0.2。v2.0.2 修好自更新从发布起就没真正跑通过的两个根因:cordis 的 inject 少声明 `remote.pluginManager`(访问即抛 `cannot get property "remote.pluginManager" without inject`,检查永远静默失败、胶囊从不出现),以及 `updateBundle` 传了空 registry 被宿主当 URL 正规化而拒绝(`gateway/internal`);顺带把「安装期间插件被卸载、结果浮层跟着消失」改成结果落盘、重挂载后补显示(§22.7)。v2.0.1 修更新失败的提示(宿主只回 `error.code`,现在翻成中文、分三步、带上回滚结果)并在查询阶段跳过与当前 DSH 不兼容的新版本,见 §22.6。v2.0.0 新增插件自更新(§22:查 npm 版本 + 走宿主 `pluginManager.updateBundle` 安装;`link:` 安装不可更新),并修账户菜单快捷键的对比度(根因是 skin 里 kbd 选择器漏写容器前缀,见 §22.4)。v1.7.4–v1.7.6 的完整改动见 README 的中英版本段落,本节只留结构性的几条(§19 顶部两条)。v1.7.6 把眼徽呼吸拆成五层(巩膜 / 虹膜外圈 / 虹膜 / 瞳仁 / 高光各自幅度与相位,周期 1.4s),思考态眼皮随同一相位开合;上一轮基线 v1.7.3(v1.7.3 修底部状态栏透字:composer 座位渐变的终点改为不透明画布色;并把只被覆盖层子树消费的 `--fz3-dock-*` / `--fz3-brand-*` 从 `:root` 改写到 `.fz3-layer`、hero 标题同步改挂载 / 卸载事件、dock 测量改锚点退避重试、dock 相氛围层降为普通合成——4K 下打开 21k 字大会话 style 637→567 ms、long task 1254→1140 ms,见 §21.9;v1.7.2 修 v1.7.1 遗留的两处选中态边线伪影:侧栏 active 胶囊左端青柠月牙、顶栏 active tab 下缘青柠下划线,见 §21.8;v1.7.1 修 v1.7.0 皮肤期的 6 类用户回归:删 boot 左上 `// H.D.D. NORTH SEEK DATA SYSTEM`;问候 kicker / 中文标题回 Fairy 冰蓝;禁用插件后 `--dsw-*` token 残留改为自己挂 `ctx.effect` 释放 `overrideTokens` 的 disposer;重启用插件不再重播开机动画(`bootPlayed` 存到 `window`);设置弹窗几何恢复宿主默认、皮肤只换色;附件缩略图焦点环由外扩改内嵌、重绘移除按钮。v1.7.0 新增「绳网终端」宿主皮肤层,见 §21。此前:v1.6.2 删掉设置页「外观三档」,皮肤始终自动跟随宿主深浅色;「试听问候」改为每次点击都从本时段 5 条语音里重新随机抽一条并显示台词,不再复用开机抽中的那条。v1.6.0 把眼徽渲染从 v1.5.0 的「4 份 HTML 合成层 + CSS steps 动画」换回 **单 SVG + 15fps JS 向量重绘**:合成层的旋转 / 缩放动的是已经栅格化的位图副本,眼睑 clip 边、深蓝眼眶这类高对比边缘在重采样时会出现台阶 / 发虚(用户截图报「像素没覆盖到」);v1.6.0 每 66.7ms 直接写 `#corners` / `#fz3-lens` / `#fz3-drift` 的 SVG transform 属性,由 Skia 按设备像素重新抗锯齿,边缘始终干净。代价:隔离 harness GPU 0.99% → 1.52%(+0.5 点)、主线程 0% → 0.8%;真实页面同轮 A/B 在噪声内(2.28% → 2.10 / 1.98%),相对 v1.4.0 的 9.3–11.8% / 47–54% 仍是约 1/6 与 1/50;192px 原生截图清晰度 +2%–4%。没有新增常驻层,动画数量与 v1.5.0 相同(4 个,全部 15fps)。v1.5.1 修问候语音 greet-night-2 的断句停顿:v1.4.0 那 20 条 mp3 本就按早期草稿台词合成,其中全角「;」不在引擎 cut5 的切分符号里,导致「我值班 / 您不睡」连读;现按同一份草稿台词重新合成,把该处「;」改成「。」,并在合成后于该句号的自然停顿处补 0.20s 静音(总停顿约 0.44s);注意引擎 `merge_short_text_in_array(threshold=5)` 会把「我值班。」(4 字)与「您不睡,」(4 字)合并回同一片段,仅改标点只有模型自然的 ~0.2s 微停顿;屏幕字幕仍保留简洁版、与音频不强制逐字一致,V1 原版 5 条未动;v1.5.0 眼徽动效重做:4 份静态 SVG 副本 + 叶片公转 / 目光微动,持续动画用 steps() 量化到 15fps,GPU / CPU 再降约 80% / 90%;v1.4.0 新增问候语音库:每个时段 5 条(原 1 条 + 新录 4 条),按 Fairy 人设撰写 / 录制,随机播放且避免连续重复,屏幕台词为音频的简洁理解版;v1.3.4 修气泡脚注半句与眼标悬停原生提示;v1.3.0 新增:眼徽用量 / 花费气泡、眼徽拖拽与隐藏、外观三档(跟随 / 深色 / 浅色)、欢迎页文案改写,以及 host 侧 GET /fairy-zzz/usage 路由与 5 个稳定性修复;v1.3.1 把拖拽重写为 transform-only + 四边吸附 + 遮挡让位、用量改为预取缓存(点开即显)、气泡支持点外 / Esc 关闭、设置页删掉「(本地 CPU 推理)」后缀;v1.3.2 把拖拽与吸附范围从整个视口收进**会话内容区**(左 = 侧栏右缘、上 = 标题栏底缘,右 / 下 = 窗口边缘),边界在每次 pointerdown 时实时重量;v1.2.1 的死代码清理成果保留;v1.3.3 只改文案:气泡里的「用量 / 花费 / 峰谷」统一成「电费」口径(用量→电费、余额→电费余额、今日花费→今日电费、峰谷→五倍电费 / 十倍电费,峰段窗口提示为「十倍电费」),客户端对旧宿主的「高峰 / 空闲」字样做兜底改写)。
4
+ > 最后更新:2026-11-08,对应版本 v2.0.3。v2.0.3 修电费坞压住会话列表:`.fz3-bill` 的 `bottom` 从写死的 86px 改成 `var(--fz3-bill-bottom, 86px)`,由 `BillDock` 按 `[class*="_footArea"]` 的实测 top 反算;新增基础 CSS `[class*="_regionArea"]{padding-bottom:var(--fz3-bill-reserve,0px)}`,`--fz3-bill-reserve` = 电费坞高 + 14px;页脚尚未出现 / 侧栏折叠成窄条时回落到 86px,页脚与坞都跟 `ResizeObserver`、窗口 resize 120ms 防抖(见 §19 与 UI-DESIGN §16.6)。v2.0.2 修好自更新从发布起就没真正跑通过的两个根因:cordis 的 inject 少声明 `remote.pluginManager`(访问即抛 `cannot get property "remote.pluginManager" without inject`,检查永远静默失败、胶囊从不出现),以及 `updateBundle` 传了空 registry 被宿主当 URL 正规化而拒绝(`gateway/internal`);顺带把「安装期间插件被卸载、结果浮层跟着消失」改成结果落盘、重挂载后补显示(§22.7)。v2.0.1 修更新失败的提示(宿主只回 `error.code`,现在翻成中文、分三步、带上回滚结果)并在查询阶段跳过与当前 DSH 不兼容的新版本,见 §22.6。v2.0.0 新增插件自更新(§22:查 npm 版本 + 走宿主 `pluginManager.updateBundle` 安装;`link:` 安装不可更新),并修账户菜单快捷键的对比度(根因是 skin 里 kbd 选择器漏写容器前缀,见 §22.4)。v1.7.4–v1.7.6 的完整改动见 README 的中英版本段落,本节只留结构性的几条(§19 顶部两条)。v1.7.6 把眼徽呼吸拆成五层(巩膜 / 虹膜外圈 / 虹膜 / 瞳仁 / 高光各自幅度与相位,周期 1.4s),思考态眼皮随同一相位开合;上一轮基线 v1.7.3(v1.7.3 修底部状态栏透字:composer 座位渐变的终点改为不透明画布色;并把只被覆盖层子树消费的 `--fz3-dock-*` / `--fz3-brand-*` 从 `:root` 改写到 `.fz3-layer`、hero 标题同步改挂载 / 卸载事件、dock 测量改锚点退避重试、dock 相氛围层降为普通合成——4K 下打开 21k 字大会话 style 637→567 ms、long task 1254→1140 ms,见 §21.9;v1.7.2 修 v1.7.1 遗留的两处选中态边线伪影:侧栏 active 胶囊左端青柠月牙、顶栏 active tab 下缘青柠下划线,见 §21.8;v1.7.1 修 v1.7.0 皮肤期的 6 类用户回归:删 boot 左上 `// H.D.D. NORTH SEEK DATA SYSTEM`;问候 kicker / 中文标题回 Fairy 冰蓝;禁用插件后 `--dsw-*` token 残留改为自己挂 `ctx.effect` 释放 `overrideTokens` 的 disposer;重启用插件不再重播开机动画(`bootPlayed` 存到 `window`);设置弹窗几何恢复宿主默认、皮肤只换色;附件缩略图焦点环由外扩改内嵌、重绘移除按钮。v1.7.0 新增「绳网终端」宿主皮肤层,见 §21。此前:v1.6.2 删掉设置页「外观三档」,皮肤始终自动跟随宿主深浅色;「试听问候」改为每次点击都从本时段 5 条语音里重新随机抽一条并显示台词,不再复用开机抽中的那条。v1.6.0 把眼徽渲染从 v1.5.0 的「4 份 HTML 合成层 + CSS steps 动画」换回 **单 SVG + 15fps JS 向量重绘**:合成层的旋转 / 缩放动的是已经栅格化的位图副本,眼睑 clip 边、深蓝眼眶这类高对比边缘在重采样时会出现台阶 / 发虚(用户截图报「像素没覆盖到」);v1.6.0 每 66.7ms 直接写 `#corners` / `#fz3-lens` / `#fz3-drift` 的 SVG transform 属性,由 Skia 按设备像素重新抗锯齿,边缘始终干净。代价:隔离 harness GPU 0.99% → 1.52%(+0.5 点)、主线程 0% → 0.8%;真实页面同轮 A/B 在噪声内(2.28% → 2.10 / 1.98%),相对 v1.4.0 的 9.3–11.8% / 47–54% 仍是约 1/6 与 1/50;192px 原生截图清晰度 +2%–4%。没有新增常驻层,动画数量与 v1.5.0 相同(4 个,全部 15fps)。v1.5.1 修问候语音 greet-night-2 的断句停顿:v1.4.0 那 20 条 mp3 本就按早期草稿台词合成,其中全角「;」不在引擎 cut5 的切分符号里,导致「我值班 / 您不睡」连读;现按同一份草稿台词重新合成,把该处「;」改成「。」,并在合成后于该句号的自然停顿处补 0.20s 静音(总停顿约 0.44s);注意引擎 `merge_short_text_in_array(threshold=5)` 会把「我值班。」(4 字)与「您不睡,」(4 字)合并回同一片段,仅改标点只有模型自然的 ~0.2s 微停顿;屏幕字幕仍保留简洁版、与音频不强制逐字一致,V1 原版 5 条未动;v1.5.0 眼徽动效重做:4 份静态 SVG 副本 + 叶片公转 / 目光微动,持续动画用 steps() 量化到 15fps,GPU / CPU 再降约 80% / 90%;v1.4.0 新增问候语音库:每个时段 5 条(原 1 条 + 新录 4 条),按 Fairy 人设撰写 / 录制,随机播放且避免连续重复,屏幕台词为音频的简洁理解版;v1.3.4 修气泡脚注半句与眼标悬停原生提示;v1.3.0 新增:眼徽用量 / 花费气泡、眼徽拖拽与隐藏、外观三档(跟随 / 深色 / 浅色)、欢迎页文案改写,以及 host 侧 GET /fairy-zzz/usage 路由与 5 个稳定性修复;v1.3.1 把拖拽重写为 transform-only + 四边吸附 + 遮挡让位、用量改为预取缓存(点开即显)、气泡支持点外 / Esc 关闭、设置页删掉「(本地 CPU 推理)」后缀;v1.3.2 把拖拽与吸附范围从整个视口收进**会话内容区**(左 = 侧栏右缘、上 = 标题栏底缘,右 / 下 = 窗口边缘),边界在每次 pointerdown 时实时重量;v1.2.1 的死代码清理成果保留;v1.3.3 只改文案:气泡里的「用量 / 花费 / 峰谷」统一成「电费」口径(用量→电费、余额→电费余额、今日花费→今日电费、峰谷→五倍电费 / 十倍电费,峰段窗口提示为「十倍电费」),客户端对旧宿主的「高峰 / 空闲」字样做兜底改写)。
5
5
  > 姊妹文档:[docs/PERFORMANCE.md](PERFORMANCE.md)(性能优化报告:为什么这么改、数据怎么量出来的)。
6
6
 
7
7
  ---
@@ -736,6 +736,7 @@ v1.3.0 的回归 harness(`tmp/merge/`,一次性):`t7-routes.mjs`(8 个
736
736
  | 改叶片转速 / 眼球呼吸 / 目光微动 | `FZ3_RUNTIME`:`FZ3_ORBIT_MS/STEPS`、`FZ3_LENS_MS/STEPS/SCALE`、`scheduleGaze`;观感对照表见 8.4 |
737
737
  | 改眼闪 / 花屏 / 光晕 / 脉冲 | `FZ3_RUNTIME`(`scheduleFlicker` / `scheduleGlitch` / `FZ3_FAULT`)+ CSS `@keyframes fz3-halo-breathe` / `fz3-lash-pulse` |
738
738
  | 改电费读数 / 计价展示 | `BillDock`(侧栏底部常驻);金额格式化 `yuan`、`clockText` |
739
+ | 改电费坞位置 / 列表预留高度 | CSS 变量 `--fz3-bill-bottom` / `--fz3-bill-reserve`(`BillDock` 内测量 effect) |
739
740
  | 改价目 / 峰谷时段 / 节假日 | index.js `PRICES` / `PEAK_RANGES` / `HOLIDAY_RANGES` |
740
741
  | 改拖拽 / 显隐默认值 / 吸附距离 | `DRAG_KEY` / `EYE_KEY` + `FairySkin`;设置页在 `FairySettings` |
741
742
  | 改外观跟随逻辑(无设置项) | `theme-watch` + CSS 浅色主题段 + `TOKENS` |
@@ -746,6 +747,11 @@ v1.3.0 的回归 harness(`tmp/merge/`,一次性):`t7-routes.mjs`(8 个
746
747
 
747
748
  ## 19. 变更记录
748
749
 
750
+ ### 2.0.3(2026-11-08)
751
+
752
+ - **修电费坞压住工作区列表**:`.fz3-bill` 原来写死 `bottom:86px`,会话列表滚到底时最后几行会滑到电费坞下面。现在 `bottom:var(--fz3-bill-bottom,86px)`;`BillDock` 挂载后读 `[class*="_footArea"]` 的 `getBoundingClientRect().top`,把「窗口高 - 页脚顶 + 6」写进变量;同一 effect 用自身 `offsetHeight + 14` 写 `--fz3-bill-reserve`,基础 CSS 新增 `[class*="_regionArea"]{padding-bottom:var(--fz3-bill-reserve,0px)}` 给列表让位。页脚不可见(高度 0 / 宽度 < 200,侧栏折叠成窄条)时保留 86px 兜底;页脚与电费坞都挂 `ResizeObserver`,窗口 resize 120ms 防抖;卸载时清 timer / observer / listener 并 `removeProperty` 两个变量。
753
+ - `package.json` 2.0.2 → 2.0.3。
754
+
749
755
  ### 2.0.2(2026-11-08)
750
756
 
751
757
  - **修「胶囊永远不出现」**:插件 `apply` 返回的 inject 只有 `remote.account`,而访问 `ctx.remote.pluginManager` 是 cordis 注入的硬检查——没有声明就抛 `cannot get property "remote.pluginManager" without inject`,`checkPluginUpdate()` 在取 manager 这一步就中断,2.0.0 / 2.0.1 的更新检查从来没有执行过。现在 inject 加上 `remote.pluginManager`,并加 `pluginManagerOf(ctx)` 兜底(先试 `ctx.remote.pluginManager`,抛错再试 `ctx['remote.pluginManager']`)。
package/docs/UI-DESIGN.md CHANGED
@@ -596,6 +596,12 @@ v1.7.2 的两处修复都是「边线装饰放错了形状」:
596
596
  - 「设置」右侧的 Ctrl+, 从几乎不可见抬到 `rgba(242,242,238,.56)`(浅色 `rgba(16,17,16,.52)`);菜单项标题仍是 label-primary `#f2f2ee`,快捷键低一个层级,不抢「设置」。
597
597
  - 根因记录:skin 里 `.wtg9ga_newSession [class*="_kbd"],[class*="_key"],[class*="_separator"]` 的后两个选择器漏了容器前缀,全局把菜单快捷键刷成墨黑;v2.0.0 补前缀 + K 段统一抬对比度(技术细节见 TECHNICAL §22.4)。
598
598
 
599
+ ### 16.6 电费坞贴底与工作区预留(v2.0.3)
600
+
601
+ - 位置:电费坞不再写死 `bottom:86px`,改为 `bottom:var(--fz3-bill-bottom,86px)`;`BillDock` 挂载后读 `[class*="_footArea"]` 的 `getBoundingClientRect().top`,把「窗口高 - 页脚顶 + 6」写进变量,坞底离页脚 6px。
602
+ - 预留:同一 effect 用坞自身 `offsetHeight + 14` 写 `--fz3-bill-reserve`,基础 CSS 加 `[class*="_regionArea"]{padding-bottom:var(--fz3-bill-reserve,0px)}`,会话列表可视区底边停在坞顶上方约 8px。
603
+ - 兜底与跟随:页脚未挂载 / 高度为 0(侧栏折叠成窄条)时保留 86px;页脚与坞都挂 `ResizeObserver`,窗口 resize 120ms 防抖;卸载时清 timer / observer / listener 并移除两个变量。
604
+
599
605
  ## 17. 截图索引
600
606
 
601
607
  - 皮肤(欢迎页):[浅色](img/skin-v17-light-home.jpg) / [深色](img/skin-v17-dark-home.jpg)(1624×1042,含侧栏、欢迎页、composer、幽灵 05)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sky_wing_dn/dsh-fairy-zzz",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Unofficial Zenless Zone Zero \"Fairy\" H.D.D skin for the DSH Web UI: boot animation, animated eye badge, hour-based greeting, Wire-Net Terminal host skin, always-on fee readout, and optional local GPT-SoVITS voice. Starts from AssassinVIX/fairy-zzz-plugin (MIT); eye artwork from Chengzhibense/Fairy-DSH (Apache-2.0); changelog in docs/CHANGELOG.md.",
5
5
  "type": "module",
6
6
  "license": "MIT",