dsh-mpkg-wallpaper 3.13.12 → 3.14.0

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
@@ -258,8 +258,6 @@ Contains the *Show wallpaper* sub-section.
258
258
  | Title bar frost amount | `headerBlurAmount` | 0% | Frost thickness 0–100% (default 0 = transparent) | 0 |
259
259
  | Set title bar frost separately | `headerFrostOwn` | off | on = `headerFrostAmount` overrides the frost radius | off |
260
260
  | Title bar frost strength | `headerFrostAmount` | 30px | 0–60 | 0 |
261
- | Right sidebar / dock blur | `rightSidebarBlur` | on | The DSH right sidebar and bottom dock | off |
262
- | Blur amount / surface opacity | `rightSidebarBlurAmount` / `rightSidebarAlpha` | 14px / 45% | 0–40 / 0–100% | — |
263
261
 
264
262
  ### 4. Surface unify (unify)
265
263
 
@@ -273,15 +271,24 @@ Contains the *Show wallpaper* sub-section.
273
271
  | Unified fog (full-screen mask) | `aquaMask` | off | All surfaces share one fog colour (moved here from the Aqua section) | off |
274
272
  | Unified fog strength | `aquaMaskAlpha` | 82% | 0–100% | — |
275
273
 
274
+ > **What the two sliders mean (fixed since 2026-10-02; judged by `tools/fog-model-test.mjs`)**:
275
+ > *Full-screen blur degree* = blur radius (**0 = no blur at all**: the title bar / sidebar / right sidebar / dock
276
+ > return to a **solid** surface, so the un-blurred raw wallpaper is never shown through);
277
+ > *Left sidebar / title-bar opacity* = fog thickness on every surface (**0 = fully transparent**: the *blurred*
278
+ > wallpaper only, no fog and no wallpaper-sampled tint) — it only matters while the blur degree is > 0.
279
+ > Both apply to the **whole UI shell** (left sidebar, title bar, right sidebar and dock share one set of tokens).
280
+
276
281
  ### 5. UI blur (blur)
277
282
 
278
283
  | Label | Key | Default | Amount key / default | Off |
279
284
  |---|---|---|---|---|
285
+ | UI blur follows Unified blur | `blurFollowUnify` | **on** | on = the taken-over rows on this page follow the *Full-screen blur degree* + *Left sidebar / title-bar opacity*; off = they become independently adjustable | — |
280
286
  | Blur dialogs | `dialogBlur` | on | `dialogAmount` 14px | off |
281
287
  | Blur settings panel | `settingsBlur` | on | `settingsAmount` 14px | off |
282
288
  | Blur download/confirm popups | `confirmBlur` | on | `confirmAmount` 12px | off |
283
289
  | Blur popovers | `popoverBlur` | on | `popoverAmount` 10px; plus `popoverAlpha` 94% surface opacity | off |
284
290
  | Blur mask (full-screen backdrop) | `maskBlur` | on | `maskAmount` 8px | off |
291
+ | Right sidebar / dock blur | `rightSidebarBlur` | on | `rightSidebarBlurAmount` 14px + `rightSidebarAlpha` 45%; both are taken over while following Unified blur | off |
285
292
 
286
293
  ### 6. Other (other)
287
294
 
package/README.md CHANGED
@@ -273,8 +273,6 @@ node tools/build-bundle.mjs
273
273
  | 标题栏磨砂程度 | `headerBlurAmount` | 0% | 白雾厚度 0–100%(默认 0 = 透明) | 0 |
274
274
  | 单独调节标题栏磨砂 | `headerFrostOwn` | 关 | 开 = 用 `headerFrostAmount` 覆盖磨砂半径 | 关 |
275
275
  | 标题栏磨砂强度 | `headerFrostAmount` | 30px | 0–60 | 0 |
276
- | 右侧边栏/dock 虚化 | `rightSidebarBlur` | 开 | DSH 自带右侧边栏与底部 dock | 关 |
277
- | 虚化程度 / 表面透明度 | `rightSidebarBlurAmount` / `rightSidebarAlpha` | 14px / 45% | 0–40 / 0–100% | — |
278
276
 
279
277
  ### 4. 界面统一(unify)
280
278
 
@@ -288,15 +286,24 @@ node tools/build-bundle.mjs
288
286
  | 统一雾(全屏遮罩) | `aquaMask` | 关 | 所有表面共享一种雾色(原 Aqua 实验项) | 关 |
289
287
  | 统一雾强度 | `aquaMaskAlpha` | 82% | 0–100% | — |
290
288
 
289
+ > **两个条的语义(2026-10-02 起口径固定,判据 `tools/fog-model-test.mjs`)**:
290
+ > 「整屏虚化程度」= 模糊半径(**0 = 完全不虚化**:标题栏/侧边栏/右栏/dock 也回到**实心**,
291
+ > 不会把未模糊的原始壁纸透出来);
292
+ > 「左侧边栏/标题栏透明度」= 各表面白雾厚度(**0 = 完全透明**:只看到**模糊**壁纸,不留雾、不留面板取色)——
293
+ > 它只在「整屏虚化程度 > 0」时决定观感。
294
+ > 两者对**整个界面外壳**生效(左栏/标题栏/右栏/dock 共用同一套表面 token)。
295
+
291
296
  ### 5. 界面虚化(blur)
292
297
 
293
298
  | 面板文案 | 内部键 | 默认 | 程度键 / 默认 | 关 |
294
299
  |---|---|---|---|---|
300
+ | 界面虚化跟随统一虚化 | `blurFollowUnify` | **开** | 开 = 本页被接管的项交给「整屏虚化程度 + 左侧边栏/标题栏透明度」统一驱动;关 = 各自独立可调 | — |
295
301
  | 虚化对话框 | `dialogBlur` | 开 | `dialogAmount` 14px | 关 |
296
302
  | 虚化设置面板 | `settingsBlur` | 开 | `settingsAmount` 14px | 关 |
297
303
  | 虚化下载/确认弹窗 | `confirmBlur` | 开 | `confirmAmount` 12px | 关 |
298
304
  | 虚化弹层 | `popoverBlur` | 开 | `popoverAmount` 10px;另有 `popoverAlpha` 94% 表面不透明度 | 关 |
299
305
  | 虚化遮罩(全屏背景) | `maskBlur` | 开 | `maskAmount` 8px | 关 |
306
+ | 右侧边栏/dock 虚化 | `rightSidebarBlur` | 开 | `rightSidebarBlurAmount` 14px + `rightSidebarAlpha` 45%;跟随统一虚化时两项都被接管 | 关 |
300
307
 
301
308
  ### 6. 其他(other)
302
309
 
package/lib/client.js CHANGED
@@ -373,6 +373,11 @@ function mpwTrace(ev, data) {
373
373
  const DEFAULT_CHAT_FOLLOW = true; // ①(新) 统一虚化是否接管聊天区壁纸(开=整屏统一;关=磨砂条独立控制聊天区,统一虚化只管侧边栏/标题栏)
374
374
  const DEFAULT_SIDEBAR_ALPHA = 35; // ①(新) 统一虚化下侧边栏/标题栏白雾厚度 0-100(默认 35:顶栏/侧边栏一致且白底淡,session log/模式标签后不会太突兀;用户实测 55 太厚)
375
375
  const DEFAULT_SESSION_FOLLOW = true; // 统一虚化下,「新会话」按钮是否随整屏虚化(关=随面板不透明度)
376
+ // ①(2026-10-02 第3项) 「界面虚化」是否跟随统一虚化(默认跟随 = 保持历史接管语义):
377
+ // 开(默认) → 统一虚化开时,界面虚化里被点名接管的项(左侧边栏磨砂/右栏/dock…
378
+ // 以及它们背后的雾厚度)由「整屏虚化程度 + 左侧边栏/标题栏透明度」驱动;
379
+ // 关 → 界面虚化完全独立:各自的开关/滑条自己说了算,统一虚化不再接管它们。
380
+ const DEFAULT_BLUR_FOLLOW_UNIFY = true;
376
381
  const DEFAULT_HYBRID = true; // ①(新) 大文件混合模式:上传到 DSH 宿主流式播放(>600MB 无限制);关=纯浏览器模式
377
382
  // ⑲(新) Aqua 实验模式(借鉴 Bil812 fork,默认全关,不影响原功能):
378
383
  // - aquaMask:统一雾(#mpw-mask 全屏遮罩,所有表面共享一种雾色)
@@ -498,21 +503,50 @@ function mpwTrace(ev, data) {
498
503
  DSH 自己的第一方客户端包统一兜底到 `http://dsh.internal`(`dsh-client-connection` 的 `INTERNAL_BASE`、
499
504
  `dsh-client-file-upload` 的 `resolveUrl`、`dsh-session-log-export`、`dsh-client-ui-open-in-app`、
500
505
  `dsh-api-gateway` 五处同款)——这里照**同一口径**做,桌面壳负责解析这个名字:
501
- · HTTP 档(web profile):origin 有值 ⇒ 返回 `origin + HOST_BASE`,与原相对路径**逐字节等价**;
502
- · 非 HTTP 档:origin 缺失/`"null"` ⇒ 返回 `http://dsh.internal + HOST_BASE`。
506
+ · HTTP 档(web profile):origin 有值 ⇒ **保持原来的相对路径**(`/api/...`)——
507
+ 相对路径天然同源、随宿主 host/port 变化,也是 DSH 第一方客户端包的写法;
508
+ 这里绝对化过一次(改成 `origin + path`),把 5 个门禁的"URL 形状"判据打成红的
509
+ (np-media / np-control / web-wallpaper / pkg-import / media-session-wiring 期望
510
+ 相对路径),属回归 ⇒ 已改回相对;
511
+ · 非 HTTP 档:origin 缺失/`"null"`/file:// ⇒ 返回 `http://dsh.internal + HOST_BASE`。
503
512
  所有宿主 URL 一律经 `HOST_URL`(或 `mpwHostUrl()`),不要再写裸相对路径。 */
504
513
  const MPW_HOST_FALLBACK_ORIGIN = "http://dsh.internal";
505
- function mpwHostOrigin() {
506
- try {
507
- const o = (typeof location !== "undefined" && location) ? location.origin : void 0;
508
- return (typeof o === "string" && o && o !== "null") ? o : MPW_HOST_FALLBACK_ORIGIN;
509
- } catch (e) { return MPW_HOST_FALLBACK_ORIGIN }
514
+ /** 页面 origin;拿不到 / 是 `"null"`(file:// 档)⇒ 返回 ""。
515
+ * ⚠️ 不看 `location.protocol`:桩环境(tools/_stub.mjs)只给 origin/href 不给 protocol,
516
+ * 多这一条会把"HTTP 档"误判成非 HTTP 档 ⇒ 又把 URL 绝对化成 dsh.internal(门禁红)。
517
+ * origin 本身有效就说明是 http(s) 档(file:// 的 origin 恒为字符串 "null")。 */
518
+ function mpwPageOrigin() {
519
+ try {
520
+ const l = (typeof location !== "undefined" && location) ? location : null;
521
+ if (!l) return "";
522
+ const o = String(l.origin || "");
523
+ return (o && o !== "null") ? o : "";
524
+ } catch (e) { return "" }
510
525
  }
511
- /** 绝对化一个宿主路径(已是 http(s) 的原样返回;其余一律前缀宿主 origin)。 */
526
+ /** 宿主 origin(报告/诊断用):可用 origin > `http://dsh.internal` 兜底。 */
527
+ function mpwHostOrigin() { return mpwPageOrigin() || MPW_HOST_FALLBACK_ORIGIN }
528
+ /** 宿主 URL:HTTP 档原样相对路径(逐字节等价),非 HTTP 档才绝对化到 dsh.internal。 */
512
529
  function mpwHostUrl(path) {
513
530
  const p2 = String(path == null ? "" : path);
514
531
  if (/^https?:/i.test(p2)) return p2;
515
- return mpwHostOrigin() + (p2.charAt(0) === "/" ? p2 : "/" + p2);
532
+ const rel = p2.charAt(0) === "/" ? p2 : "/" + p2;
533
+ const o = mpwPageOrigin();
534
+ return o ? rel : MPW_HOST_FALLBACK_ORIGIN + rel;
535
+ }
536
+ /** **交给别的文档/源**的宿主 URL:必须绝对。
537
+ * 哪些地方必须用它(判据:这个字符串会不会被**另一个文档**解析):
538
+ * · 场景渲染器 iframe 的 `pkgurl=`(渲染器可能在另一个源,如回环 :8902 —— 相对路径会被它
539
+ * 按**自己的** origin 解析 ⇒ 取不到包;3.13.11 起这里一直是 `location.origin + HOST_BASE`);
540
+ * · 交给渲染器的 `thumbpost=`(它据此 POST 回宿主)。
541
+ * 页面自己的 fetch/`<img src>` 一律用相对(`mpwHostUrl`)——同源、随宿主 host/port 变化。
542
+ * ①(2026-10-02) 这条纪律是被真红点逼出来的:把 `HOST_URL` 一律改回相对后,
543
+ * `mpwSceneIdentityFromWebUrl()` 里的 `new URL(pkgurl)` 直接抛错 ⇒ 沙箱 strict 的
544
+ * `st` 令牌不再下发(**安全档静默降级 legacy**),scene-url-token-guard 的 A2/B5/C2 变红。 */
545
+ function mpwHostAbsUrl(path) {
546
+ const p2 = String(path == null ? "" : path);
547
+ if (/^https?:/i.test(p2)) return p2;
548
+ const rel = p2.charAt(0) === "/" ? p2 : "/" + p2;
549
+ return mpwHostOrigin() + rel;
516
550
  }
517
551
  /** 反过来:把(可能是绝对的)宿主 URL 还原成以 HOST_BASE 开头的路径;不是宿主 URL 返回 ""。 */
518
552
  function mpwHostPathOf(url) {
@@ -6878,7 +6912,7 @@ function mpwThumbFail(el, why) {
6878
6912
  }
6879
6913
  const q = "custom=1" + (meta.folder ? "&folder=" + encodeURIComponent(meta.folder) : "")
6880
6914
  + "&file=" + encodeURIComponent(meta.rawFile);
6881
- const rawUrl = HOST_URL + "/raw?" + q;
6915
+ const rawUrl = mpwHostAbsUrl("/raw?" + q); // ①(2026-10-02) 交给渲染器 iframe ⇒ 必须绝对(见 mpwHostAbsUrl 注释)
6882
6916
  const base = mpwSceneRendererBase();
6883
6917
  /* ①(P-205 F6) 渲染器目标闸门的判定结果:`st` 下发与 extbase 都由它决定。
6884
6918
  base 已经过闸门(不合法时 `mpwSceneRendererBase()` 回落默认回环),这里再取一次
@@ -6953,7 +6987,7 @@ function mpwThumbFail(el, why) {
6953
6987
  // demo.html 首帧/第 90 帧各 POST 一次(text/plain 简单请求免预检),失败仅日志。
6954
6988
  // ①(批次15 B1) 首帧 POST 同时是**首帧看门狗的信标**(宿主 lastpost=1 查询)。
6955
6989
  // ①(B6) strict 下 token 随 body 走(简单请求,绝不加自定义头:那会触发预检被鉴权墙 401)。
6956
- + "&thumbpost=" + encodeURIComponent(HOST_URL + "/custom-scene-thumb")
6990
+ + "&thumbpost=" + encodeURIComponent(mpwHostAbsUrl("/custom-scene-thumb")) // ①(2026-10-02) 渲染器据此回传首帧 ⇒ 必须绝对
6957
6991
  + (__sbToken ? "&sandbox=strict&thumbtoken=" + encodeURIComponent(__sbToken) : "");
6958
6992
  if (!__sbToken) { try { mpwSandboxPrefetch(__sbPlan.ident); } catch {} }
6959
6993
  try { const sbd = mpwSandboxDiag(); if (window.__mpwDiagSandboxHook) window.__mpwDiagSandboxHook(sbd) } catch {}
@@ -7606,7 +7640,20 @@ function mpwThumbFail(el, why) {
7606
7640
  ? explicitGate
7607
7641
  : (explicitFrost ? explicitGate : (wallpaperOn || hb || un));
7608
7642
  // 半径下限:过去在"没填强度"时会算成 0(=看不到模糊)。现在给可见下限(磨砂 24px、统一虚化取下限 12px)。
7609
- const px = !wanted ? 0 : (own ? Math.max(8, ownAmt) : (un ? Math.max(12, unAmt || 0) : Math.max(12, hbAmt > 0 ? Math.round(hbAmt / 4) : 24)));
7643
+ // ①(2026-10-02 第1项真机) **0 就是 0**:旧写法 `Math.max(12, unAmt || 0)` 把"整屏虚化程度
7644
+ // = 0"也算成 12px ⇒ 用户把统一虚化拉到 0(滑条语义:0 = 不虚化),标题栏却还在模糊。
7645
+ // 现在可见下限只在**值 > 0** 时兜(1–11px 仍抬到 12px 保证看得见),显式 0 → px = 0
7646
+ // ⇒ 走下面的 cleanup 分支(注入层被移除、半透明底被撤掉),"关掉"是真关掉。
7647
+ // 标题栏磨砂条(hbAmt)保留旧语义:它默认 0 = **自动档**(24px),不是"关闭"。
7648
+ const pxFloor = (v, lo) => (Number(v) > 0 ? Math.max(lo, Number(v)) : 0);
7649
+ // ①(2026-10-02 第3项) 「界面虚化是否跟随统一虚化」(新开关,默认跟随):
7650
+ // 跟随 = 标题栏磨砂半径由 unifyAmount 接管(历史语义);不跟随 = 标题栏自己的
7651
+ // 磨砂条(headerBlurAmount / headerFrostOwn)说了算,统一虚化只管壁纸与表面雾。
7652
+ const followUnifyNow = un && mpwFogModel(s).followUnify;
7653
+ const px = !wanted ? 0
7654
+ : (own ? pxFloor(ownAmt, 8)
7655
+ : (followUnifyNow ? pxFloor(unAmt, 12)
7656
+ : (hbAmt > 0 ? Math.max(12, Math.round(hbAmt / 4)) : (un ? pxFloor(unAmt, 12) : 24))));
7610
7657
  // 自动半透明底:让模糊真的看得见(否则顶栏是不透明的,磨砂被挡在后面)。
7611
7658
  // ①(2026-09-16) 半透底色改用**我们自己的命名空间 token**(--mpw-hdr-frost-bg),
7612
7659
  // 不再依赖宿主静态色 token;亮/暗两档由 JS 写入(见下)。
@@ -8306,6 +8353,13 @@ function mpwThumbFail(el, why) {
8306
8353
  const rsBlurOn = section.rightSidebarBlur !== void 0 ? !!section.rightSidebarBlur : DEFAULT_RIGHT_SIDEBAR_BLUR;
8307
8354
  // 关闭时写 "off"(而不是移除属性)——兜底选择器据此精确匹配,避免"无属性=恒关"
8308
8355
  if (rsBlurOn) document.body.setAttribute("data-mpw-rsblur", "on"); else document.body.setAttribute("data-mpw-rsblur", "off");
8356
+ // ①(2026-10-02 第2/3项) 统一虚化接管门控:只有"统一虚化开 + 界面虚化跟随"时才打。
8357
+ // CSS 侧 [data-mpw-unify] 的右栏/dock/better-sidebar 规则据此生效(与
8358
+ // buildCss 里 unifyTakeover 同源:都走 mpwFogModel(section).unifyOn)。
8359
+ try {
8360
+ if (mpwFogModel(section).unifyOn) document.body.setAttribute("data-mpw-unify", "");
8361
+ else document.body.removeAttribute("data-mpw-unify");
8362
+ } catch {}
8309
8363
  // ①(2026-09-13) 标题栏磨砂实现方式开关:默认"本体"(观感稳定);
8310
8364
  // ?hdrblur=pseudo → 改用 .wSkVaW_header::before 伪元素(不产生 containing block/层叠上下文,
8311
8365
  // 用于排障:若某些浮层/面板在"本体"方案下异常,可切到该模式对照)。
@@ -8351,6 +8405,14 @@ function mpwThumbFail(el, why) {
8351
8405
  || (section.aquaTint !== void 0 ? !!section.aquaTint : DEFAULT_AQUA_TINT);
8352
8406
  if (headerTint) document.body.setAttribute("data-mpw-aqua-header", "");
8353
8407
  else document.body.removeAttribute("data-mpw-aqua-header");
8408
+ // ①(2026-10-02 第1项) 刷多厚 = 当前的雾厚度(统一虚化开 → 左侧边栏/标题栏透明度;
8409
+ // 关 → 历史档 62%)。厚度 0 ⇒ 写 0% ⇒ color-mix(...,0%) = 透明,标题栏不被采样色盖住。
8410
+ try {
8411
+ const fog = mpwFogModel(section);
8412
+ const pct = fog.unifyOn ? fog.sidePct : 62;
8413
+ if (headerTint) document.documentElement.style.setProperty("--mpw-aqua-header-alpha", pct + "%");
8414
+ else document.documentElement.style.removeProperty("--mpw-aqua-header-alpha");
8415
+ } catch {}
8354
8416
  if (section.aquaTextEnhance !== void 0 ? !!section.aquaTextEnhance : DEFAULT_AQUA_TEXT_ENHANCE)
8355
8417
  document.body.setAttribute("data-mpw-aqua-text", "");
8356
8418
  else document.body.removeAttribute("data-mpw-aqua-text");
@@ -11105,6 +11167,47 @@ function mpwThumbFail(el, why) {
11105
11167
  }
11106
11168
  } catch {}
11107
11169
  }
11170
+ /**
11171
+ * 雾模型(唯一源,2026-10-02 第 1/2/3 项):所有"表面雾"的**厚度**都从这里取。
11172
+ *
11173
+ * 为什么需要它(真机 bug):厚度与颜色原来各写各的 —— 表面底色读滑条(sidebarAlpha),
11174
+ * 而"面板取色"的 token 覆盖把 alpha 写死(bg-base 62% / sidebar-fill 85%)。
11175
+ * 于是用户把「整屏虚化程度」和「左侧边栏/标题栏透明度」都拉到 0(= 不要雾、
11176
+ * 不要模糊)时,侧边栏里层仍被刷上 85% 的**壁纸采样色**(粉色),观感是
11177
+ * "透明侧边栏 + 壁纸采样粉",而标题栏还留着 12px 模糊(见 syncHeaderFrost 的 0 下限修复)。
11178
+ *
11179
+ * 现在:颜色(取色/mask 色)只决定**色相**,可见程度一律 = 这里的厚度;
11180
+ * 厚度 0 ⇒ 该表面一个像素都不刷(纯壁纸透出),不是"刷一层透明度 0 的颜色"。
11181
+ *
11182
+ * @returns {{followUnify:boolean, unifyOn:boolean, amountPx:number, sidePct:number, chatPct:number}}
11183
+ * followUnify 「界面虚化」是否跟随统一虚化(新开关,默认跟随)
11184
+ * unifyOn = 统一虚化开关 && followUnify ⇒ 一个厚度管全部(左栏/标题栏/右栏/dock/聊天区)
11185
+ * amountPx 整屏虚化程度(0–40px):壁纸层与各栏的模糊半径
11186
+ * sidePct 左侧边栏/标题栏透明度(0–100):所有 chrome 表面的雾厚度(**取色 alpha 用它**)
11187
+ * shellPct chrome 表面的**有效**厚度:amount = 0(不虚化)⇒ 钉到 100 = 实心
11188
+ * (没有模糊时透出原始壁纸 = "零设置却有观感",用户第1项真机反馈)
11189
+ * chatPct 聊天区厚度(面板不透明度,历史下限 50)
11190
+ */
11191
+ function mpwFogModel(section) {
11192
+ const s = section || {};
11193
+ const followUnify = s.blurFollowUnify !== void 0 ? !!s.blurFollowUnify : DEFAULT_BLUR_FOLLOW_UNIFY;
11194
+ const unifyOn = (s.unifyTint !== void 0 ? !!s.unifyTint : DEFAULT_UNIFY_TINT) && followUnify;
11195
+ const rawAmt = Number(s.unifyAmount !== void 0 ? s.unifyAmount : DEFAULT_UNIFY_AMOUNT);
11196
+ const rawSide = Number(s.sidebarAlpha !== void 0 ? s.sidebarAlpha : DEFAULT_SIDEBAR_ALPHA);
11197
+ const rawChat = Number(s.opacity !== void 0 ? s.opacity : DEFAULT_OPACITY);
11198
+ const amountPx = Math.max(0, Math.min(40, Number.isFinite(rawAmt) ? rawAmt : DEFAULT_UNIFY_AMOUNT));
11199
+ const sidePct = Math.max(0, Math.min(100, Number.isFinite(rawSide) ? rawSide : DEFAULT_SIDEBAR_ALPHA));
11200
+ return {
11201
+ followUnify,
11202
+ unifyOn,
11203
+ amountPx,
11204
+ sidePct,
11205
+ /* ①(2026-10-02 第1项) 有效厚度:不虚化 ⇒ 实心(与 buildCss 的 uAlpha 同一条纪律,
11206
+ 两处必须一致:一处管左栏/标题栏,一处管右栏/dock/better-sidebar 的接管 token)。 */
11207
+ shellPct: amountPx > 0 ? sidePct : 100,
11208
+ chatPct: Math.max(50, Math.min(100, Number.isFinite(rawChat) ? rawChat : DEFAULT_OPACITY)),
11209
+ };
11210
+ }
11108
11211
  /** Aqua 开启时的 token 覆盖(mask 色背景 + ink 文字 + 蓝色清理),合并进 applyTokenOverrides。 */
11109
11212
  function aquaTokenOverrides(section) {
11110
11213
  const darkTheme = !!(document.body && document.body.hasAttribute("data-ds-dark-theme"));
@@ -11120,12 +11223,21 @@ function mpwThumbFail(el, why) {
11120
11223
  // 用户实测 aquaTint 开时 full access/加号/模型/推理/上下文选择器被变透明(不该)
11121
11224
  const tintOn = section.aquaTint !== void 0 ? !!section.aquaTint : DEFAULT_AQUA_TINT;
11122
11225
  const maskOn = section.aquaMask !== void 0 ? !!section.aquaMask : DEFAULT_AQUA_MASK;
11226
+ /* ①(2026-10-02 第1项) 取色只管**色相**,可见程度 = 雾模型给的**厚度**:
11227
+ 这两枚"表面"token(主画布 bg-base / 侧边栏填充 sidebar-fill)以前把 alpha 写死
11228
+ 62%/85%,于是「整屏虚化程度 + 左侧边栏/标题栏透明度」都拉到 0 时,侧边栏里层
11229
+ 仍被刷上 85% 的壁纸采样色(真机:透明侧边栏 + 壁纸采样粉)。
11230
+ 现在统一虚化开 → 用 sidebarAlpha(0 ⇒ color-mix(...,0%) = 完全透明,一个像素不刷);
11231
+ 统一虚化关 → 保留历史档(62%/85%),观感与刷新前逐字节一致。 */
11232
+ const fog = mpwFogModel(section);
11233
+ const baseAlpha = fog.unifyOn ? fog.chatPct / 100 : 0.62;
11234
+ const sideAlpha = fog.unifyOn ? fog.sidePct / 100 : 0.85;
11123
11235
  const out = {};
11124
11236
  // 主画布 + 面板/表面类(取色或统一雾开启时生效)
11125
11237
  if (tintOn || maskOn) {
11126
11238
  Object.assign(out, {
11127
- "--dsw-alias-bg-base": { light: tinted(0.62), dark: tinted(0.62) },
11128
- "--dsw-specific-sidebar-fill": { light: tinted(0.85), dark: tinted(0.85) },
11239
+ "--dsw-alias-bg-base": { light: tinted(baseAlpha), dark: tinted(baseAlpha) },
11240
+ "--dsw-specific-sidebar-fill": { light: tinted(sideAlpha), dark: tinted(sideAlpha) },
11129
11241
  "--dsw-specific-sidebar-nav-item-active": { light: tinted(0.72), dark: tinted(0.72) },
11130
11242
  "--dsw-specific-sidebar-nav-item-hover": { light: tinted(0.6), dark: tinted(0.6) },
11131
11243
  "--dsw-specific-sidebar-nav-item-active-accent": { light: tinted(0.6), dark: tinted(0.6) },
@@ -15914,12 +16026,27 @@ module.exports = {
15914
16026
  // unifyTint=true 时各区域不再用各自写死的百分比,全部用 U(原值)=panel,
15915
16027
  // 视觉上侧边栏/聊天区/标题栏/输入框不再"一块白一块透"地分裂背景。
15916
16028
  const unifyTint = section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT;
16029
+ /* ①(2026-10-02 第3项) 「界面虚化跟随统一虚化」开关(默认跟随 = 历史接管语义)。
16030
+ 跟随 ⇒ 界面虚化里被点名接管的项(左侧边栏磨砂/标题栏磨砂/右栏·dock 虚化)
16031
+ 统一由「整屏虚化程度 + 左侧边栏/标题栏透明度」驱动;
16032
+ 不跟随 ⇒ 这些项各自恢复可调(统一虚化只管壁纸模糊与表面雾,不再改它们的半径)。 */
16033
+ const blurFollowUnify = section.blurFollowUnify !== void 0 ? !!section.blurFollowUnify : DEFAULT_BLUR_FOLLOW_UNIFY;
16034
+ const unifyFollowNow = unifyTint && blurFollowUnify;
15917
16035
  // ①(重做) 统一虚化:unifyTint 开时 unifyAmount 控制**壁纸层真实 blur**(虚化程度):
15918
16036
  // 0px = 壁纸清晰,40px = 强模糊。表面白雾统一由「不透明度」条(panel)控制
15919
16037
  //(不再把 unifyAmount 映射成透明度——那只是"改白雾厚度",不是"改虚化程度")。
15920
16038
  const unifyAmount = section.unifyAmount !== void 0 ? section.unifyAmount : DEFAULT_UNIFY_AMOUNT;
15921
16039
  // 侧边栏/标题栏白雾厚度:统一虚化开 → sidebarAlpha 独立条;关 → 各区域原值
15922
- const uAlpha = Math.max(0, Math.min(100, (section.sidebarAlpha !== void 0 ? section.sidebarAlpha : DEFAULT_SIDEBAR_ALPHA)));
16040
+ // ①(2026-10-02 第1项真机语义收口) **整屏虚化程度 = 0 ⇒ 外壳实心**:
16041
+ // 没有模糊时再把"原始(未模糊)壁纸"透出来,观感就是"两个条都拉到 0,
16042
+ // 界面却变成半透明、还带壁纸自己的颜色"——用户报的正是这一条(真机设置:
16043
+ // unifyAmount=0 + sidebarAlpha=0 + chatFollow=false ⇒ 左侧边栏整块透出壁纸)。
16044
+ // 所以 amount = 0 时把外壳厚度钉到 100(实心);只有 amount > 0(真的在虚化)时,
16045
+ // 「左侧边栏/标题栏透明度」才决定"透出多少模糊壁纸"。
16046
+ // ⚠️ 取色(面板取色/统一雾)的 alpha **不看这个钳制**:它仍按那条滑条的原始值给,
16047
+ // 所以厚度 0 时不会有任何采样色层(见 mpwFogModel 与 fog-model D 组判据)。
16048
+ const uAlphaRaw = Math.max(0, Math.min(100, (section.sidebarAlpha !== void 0 ? section.sidebarAlpha : DEFAULT_SIDEBAR_ALPHA)));
16049
+ const uAlpha = Number(unifyAmount) > 0 ? uAlphaRaw : 100;
15923
16050
  const U = (v) => unifyTint ? uAlpha : v;
15924
16051
  /* ①(2026-09-18 §5「功能静默无效」第 2 条 / 用户裁定候选 A)「新会话按钮跟随面板不透明度」:
15925
16052
  开 = 跟随那条透明度(现状公式 U(panel):统一虚化开=sidebarAlpha,关=panel);
@@ -16697,8 +16824,9 @@ body:not([data-ds-dark-theme]) .mpw_dialog {
16697
16824
  `;
16698
16825
  }
16699
16826
  // ── E. 侧边栏磨砂(sidebarBlur,Aqua 方案)──
16700
- // unify 开时由整屏虚化(壁纸层 blur)接管,不输出自身 backdrop-filter(避免双重模糊)
16701
- if (sidebarFrosted && !unifyTint) {
16827
+ // unify 开(且「界面虚化跟随统一虚化」开着)时由整屏虚化(壁纸层 blur)接管,
16828
+ // 不输出自身 backdrop-filter(避免双重模糊);跟随开关关掉 ⇒ 恢复自己那条半径。
16829
+ if (sidebarFrosted && !unifyFollowNow) {
16702
16830
  const sblFilter = `blur(${sidebarBlurAmount}px)`;
16703
16831
  css += `
16704
16832
  /* ── 侧边栏磨砂(Aqua 方案:sidebarCol 自身 backdrop-filter) ──
@@ -16826,9 +16954,16 @@ html body:has([class*="_modal"]) [data-mpw-rs] {
16826
16954
  // 5) 变量由 JS 写入 :root,改设置只改变量、不动 DOM。
16827
16955
  if (bdSupported) {
16828
16956
  // sidebarBlur 是布尔(是否启用侧栏磨砂),数值在 sidebarBlurAmount;未启用时退回统一虚化程度
16829
- const chromeBlur = Math.max(0, Math.round((sidebarBlur ? sidebarBlurAmount : unifyAmount) || 0));
16957
+ // ①(2026-10-02 第3项) 跟随开关开 ⇒ 统一虚化接管(半径一律 unifyAmount,
16958
+ // 不再被 sidebarBlur 的数值分走);关 ⇒ 保持历史公式(侧栏磨砂开就用它自己的数值)。
16959
+ const chromeBlur = Math.max(0, Math.round((unifyFollowNow ? unifyAmount : (sidebarBlur ? sidebarBlurAmount : unifyAmount)) || 0));
16830
16960
  const chromeAlphaRaw = (section && section.sidebarAlpha !== void 0) ? section.sidebarAlpha : DEFAULT_SIDEBAR_ALPHA;
16831
- const chromeAlpha = Math.max(0, Math.min(1, Number(chromeAlphaRaw) / 100));
16961
+ /* ①(2026-10-02 第1项) 与 buildCss 的 uAlpha 同一条纪律、同一判据:
16962
+ 统一虚化开着但「整屏虚化程度」= 0(不虚化)⇒ chrome 表面实心(alpha 1),
16963
+ 否则左栏/标题栏会把**原始未模糊**的壁纸透出来(用户第1项真机反馈)。
16964
+ 统一虚化关着时保持历史语义:sidebarAlpha 决定"透出多少模糊壁纸"。 */
16965
+ const chromeAlphaPct = (unifyTint && !(Number(unifyAmount) > 0)) ? 100 : Number(chromeAlphaRaw);
16966
+ const chromeAlpha = Math.max(0, Math.min(1, Number(chromeAlphaPct) / 100));
16832
16967
  const chromeBg = (typeof unifyTint === 'string' && unifyTint) ? unifyTint : '255,255,255';
16833
16968
  const rsAmt2 = Math.max(0, Math.round(typeof rsAmount === 'number' ? rsAmount : 18));
16834
16969
  const rsAlpha2 = Math.max(0, Math.min(1, (typeof rsAlpha === 'number' ? rsAlpha : 60) / 100));
@@ -16846,6 +16981,37 @@ html body:has([class*="_modal"]) [data-mpw-rs] {
16846
16981
  tok("--mpw-surface-rs-dock", `rgba(${chromeBg === '255,255,255' ? '255,255,255' : chromeBg}, calc(var(--mpw-rs-alpha) * 0.55))`);
16847
16982
  /* 右侧栏 / dockkit 面板表面(暗色底 + 30% 档) */
16848
16983
  tok("--mpw-surface-rs-dock-dark", "rgba(18, 22, 30, calc(var(--mpw-rs-alpha) * 0.75))");
16984
+ /* ①(2026-10-02 第2项) 统一虚化接管时的**共同表面**:与左栏同色同厚度同半径。
16985
+ 三枚 token 只在接管时被下面那块 CSS 引用;不接管时它们不生效(无引用)。
16986
+ 厚度直接取雾模型(= 左侧边栏/标题栏透明度),0 ⇒ rgba(...,0) = 完全透明,
16987
+ 所以"统一虚化程度/透明度都拉到 0"时右栏/dock 也是干净的透出,不留采样色。 */
16988
+ const fogCss = mpwFogModel(section);
16989
+ const unifyTakeover = unifyFollowNow && hasImage;
16990
+ const unifyBlurCss = fogCss.amountPx > 0 ? `blur(${fogCss.amountPx}px) saturate(140%)` : "none";
16991
+ /* ⚠️ 三枚 token **只在接管时**输出:不接管时产物里连变量名都不该出现
16992
+ (tools/fog-model-test 的 B3/E3 判据:不跟随时 `--mpw-unify-*` 必须为 0 处),
16993
+ 否则"有一枚没人用的 token"会被当成"接管逻辑还在"。 */
16994
+ if (unifyTakeover) {
16995
+ tok("--mpw-unify-blur", fogCss.amountPx + "px");
16996
+ tok("--mpw-unify-surface", `rgba(255, 255, 255, ${(fogCss.shellPct / 100).toFixed(3)})`);
16997
+ tok("--mpw-unify-surface-dark", `rgba(18, 22, 30, ${(fogCss.shellPct / 100).toFixed(3)})`);
16998
+ }
16999
+ /* ①(2026-10-02 第2项) better-sidebar 那几条规则**受 bsCompat 总闸门控**(见下方注释):
17000
+ 用户手动关掉适配时产物里不许出现 [data-dsh-better-sidebar] 选择器。
17001
+ 只改底色、不给 backdrop-filter(面板带 backdrop-filter 会困住内部 fixed 内容)。 */
17002
+ const bsCompatTakeover = section && (section.bsCompat !== void 0 ? !!section.bsCompat : DEFAULT_BS_COMPAT);
17003
+ const bsTakeoverSurface = !unifyTakeover || !bsCompatTakeover ? "" : `
17004
+ html body[data-mpw-unify] [data-dsh-better-sidebar] [class*="_panel"]:not([class*="_panelBody"]):not([data-dsh-bottom-panel]),
17005
+ html body[data-mpw-unify] [data-dsh-better-sidebar] [class*="_bottomPanel"],
17006
+ html body[data-mpw-unify] [data-dsh-better-sidebar] [data-dsh-bottom-panel] {
17007
+ background-color: var(--mpw-unify-surface) !important;
17008
+ }
17009
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dsh-better-sidebar] [class*="_panel"]:not([class*="_panelBody"]):not([data-dsh-bottom-panel]),
17010
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dsh-better-sidebar] [class*="_bottomPanel"],
17011
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dsh-better-sidebar] [data-dsh-bottom-panel] {
17012
+ background-color: var(--mpw-unify-surface-dark) !important;
17013
+ }
17014
+ `;
16849
17015
  css += `
16850
17016
  /* ── H. 玻璃统一块(CSS-first):标题栏 / 左侧栏 / 右侧栏(dockkit) ──
16851
17017
  ①(2026-09-18 §5 第1项) 本块不再自建 :root —— 表面 token 全部由 emitSurfaceTokens()
@@ -17161,6 +17327,57 @@ html body[data-mpw-float]:not([data-mpw-traject-clip="off"]) [class*="_overview"
17161
17327
  overflow-x: auto !important; /* 需要时总览自己内部横滚,而不是画到面板外 */
17162
17328
  overscroll-behavior-x: contain !important;
17163
17329
  }
17330
+ ${unifyTakeover ? `
17331
+ /* ═══ ①(2026-10-02 第2项) 统一虚化:右栏 / dock / better-sidebar 与左栏**统一** ═══
17332
+ 为什么单独立这一块:F 块(右栏/dock)与 H 块的右栏规则走的是"自己那套"参数
17333
+ (--mpw-rs-blur / --mpw-rs-alpha ←「右侧边栏/dock 虚化」开关+两条滑条),
17334
+ 而设置界面早已写着「统一虚化开启中:右侧边栏/dock 虚化由『整屏虚化程度』+『透明度』
17335
+ 接管」—— 文案与实现不符(用户第2项:统一虚化只管了左栏/标题栏)。
17336
+ 现在接管真的做出来:这些表面与左栏**读同一套 token**(同色 + 同厚度 + 同半径),
17337
+ 于是"整屏虚化程度 + 左侧边栏/标题栏透明度"一改,右栏/dock 一起变。
17338
+ 位置在本块最后(与前文选择器同特异性时后者胜)⇒ 不需要额外的权重技巧。 */
17339
+ html body[data-mpw-unify] [data-sidebar-right-panel],
17340
+ html body[data-mpw-unify] [data-sidebar-right-float-host],
17341
+ html body[data-mpw-unify] [data-mpw-rs],
17342
+ html body[data-mpw-unify] [data-dockkit-pane],
17343
+ html body[data-mpw-unify] [data-dockkit-strip],
17344
+ html body[data-mpw-unify] [data-dockkit-surface],
17345
+ html body[data-mpw-unify] [data-dockkit-float] {
17346
+ -webkit-backdrop-filter: ${unifyBlurCss} !important;
17347
+ backdrop-filter: ${unifyBlurCss} !important;
17348
+ background-color: var(--mpw-unify-surface) !important;
17349
+ }
17350
+ html body[data-ds-dark-theme][data-mpw-unify] [data-sidebar-right-panel],
17351
+ html body[data-ds-dark-theme][data-mpw-unify] [data-sidebar-right-float-host],
17352
+ html body[data-ds-dark-theme][data-mpw-unify] [data-mpw-rs],
17353
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dockkit-pane],
17354
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dockkit-strip],
17355
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dockkit-surface],
17356
+ html body[data-ds-dark-theme][data-mpw-unify] [data-dockkit-float] {
17357
+ background-color: var(--mpw-unify-surface-dark) !important;
17358
+ }
17359
+ /* better-sidebar 的面板 / 底部工作台:**只跟雾色与厚度,不给 backdrop-filter**。
17360
+ 依据它自己的适配笔记(docs/BETTER-SIDEBAR-COMPAT.md / bsReveal 段注释):
17361
+ 面板带 backdrop-filter 会成为内部 fixed 内容的 containing block("困内容")⇒ 只改底色。
17362
+ ①(2026-10-02) 整段**受 bsCompat 总闸门控**:用户手动关掉 better-sidebar 适配时,
17363
+ 产物里连一条 [data-dsh-better-sidebar] 规则都不许有(tools/bs-compat-default-test
17364
+ 的「尊重用户手动关」判据),所以这里单独插值,不能塞进上面那块无条件规则里。 */
17365
+ ${bsTakeoverSurface}
17366
+ /* 接管同样要"让位":弹窗/设置面板打开时撤掉 backdrop-filter
17367
+ (含 backdrop-filter 的节点是 fixed 弹层的 containing block ⇒ 面板尺寸会被压缩)。
17368
+ 与上文 H 块的抑制规则同款,只是把新加的这些表面也覆盖上。 */
17369
+ html body[data-mpw-unify]:has([class*="_overlay"]) [data-sidebar-right-panel],
17370
+ html body[data-mpw-unify]:has([class*="_overlay"]) [data-dockkit-pane],
17371
+ html body[data-mpw-unify]:has([class*="_overlay"]) [data-dockkit-strip],
17372
+ html body[data-mpw-unify]:has([class*="_overlay"]) [data-dockkit-surface],
17373
+ html body[data-mpw-unify]:has([class*="_modal"]) [data-sidebar-right-panel],
17374
+ html body[data-mpw-unify]:has([class*="_modal"]) [data-dockkit-pane],
17375
+ html body[data-mpw-unify]:has([class*="_modal"]) [data-dockkit-strip],
17376
+ html body[data-mpw-unify]:has([class*="_modal"]) [data-dockkit-surface] {
17377
+ -webkit-backdrop-filter: none !important;
17378
+ backdrop-filter: none !important;
17379
+ }
17380
+ ` : ""}
17164
17381
  `;
17165
17382
  }
17166
17383
  // ②(新) 弹层虚化(菜单/提示/data-surface,独立于对话框)
@@ -17414,9 +17631,12 @@ body[data-mpw-accent] [data-slot*="composer"] [class*="primary"] {
17414
17631
  ①(修正2) 标题栏是否刷 mask 色由 JS 打 data-mpw-aqua-header 门控:
17415
17632
  纯 aquaInk(自适应文字色)时不刷——此时遮罩色=主题中性色(亮色主题=白),
17416
17633
  会把标题栏刷成 62% 白 → session log/标准模式背后的「白框」(用户实测:
17417
- 统一虚化 + 自适应文字色同时开出现)。 */
17634
+ 统一虚化 + 自适应文字色同时开出现)。
17635
+ ①(2026-10-02 第1项) 刷多厚由 **雾厚度** 决定(--mpw-aqua-header-alpha,JS 按
17636
+ 「左侧边栏/标题栏透明度」写;厚度 0 ⇒ 0% = 一个像素都不刷)。原来写死 62%
17637
+ ⇒ 用户把透明度拉到 0 时标题栏仍被壁纸采样色盖住。 */
17418
17638
  body[data-mpw-aqua][data-mpw-aqua-header] .wSkVaW_header {
17419
- background-color: color-mix(in srgb, rgb(var(--mpw-aqua-rgb)) 62%, transparent) !important;
17639
+ background-color: color-mix(in srgb, rgb(var(--mpw-aqua-rgb)) var(--mpw-aqua-header-alpha, 62%), transparent) !important;
17420
17640
  backdrop-filter: none !important;
17421
17641
  }
17422
17642
  body[data-mpw-aqua] .wSkVaW_header {
@@ -20039,6 +20259,7 @@ body[data-mpw-modal] [role="dialog"] {
20039
20259
  popoverBlur: DEFAULT_POPOVER_BLUR, popoverAmount: DEFAULT_POPOVER_AMOUNT,
20040
20260
  maskBlur: DEFAULT_MASK_BLUR, maskAmount: DEFAULT_MASK_AMOUNT,
20041
20261
  unifyTint: DEFAULT_UNIFY_TINT, unifyAmount: DEFAULT_UNIFY_AMOUNT, sidebarAlpha: DEFAULT_SIDEBAR_ALPHA, chatFollow: DEFAULT_CHAT_FOLLOW, sessionFollow: DEFAULT_SESSION_FOLLOW,
20262
+ blurFollowUnify: DEFAULT_BLUR_FOLLOW_UNIFY, // ①(2026-10-02 第3项) 恢复默认 = 回到"界面虚化跟随统一虚化"
20042
20263
  aquaMask: DEFAULT_AQUA_MASK, aquaTint: DEFAULT_AQUA_TINT, aquaInk: DEFAULT_AQUA_INK, aquaColor: "", aquaInkColor: "", aquaTextEnhance: DEFAULT_AQUA_TEXT_ENHANCE, todoBlur: DEFAULT_TODO_BLUR, aquaMaskAlpha: DEFAULT_AQUA_MASK_ALPHA, aquaTintStrength: DEFAULT_AQUA_TINT_STRENGTH, themeColor: DEFAULT_THEME_COLOR,
20043
20264
  hybrid: DEFAULT_HYBRID, roundCompat: DEFAULT_ROUND_COMPAT,
20044
20265
  rotate: DEFAULT_ROTATE, rotateMin: 5, customDirPath: "", brightness: DEFAULT_BRIGHTNESS, float: DEFAULT_FLOAT,
@@ -20062,7 +20283,7 @@ body[data-mpw-modal] [role="dialog"] {
20062
20283
  "headerFrostOwn", "headerFrostAmount", "popoverAlpha", "sceneReport",
20063
20284
  "sceneWatchdog", "sceneWatchdogSecs", "sceneDebugParams", // ①(批次15 B1/B3) 四处接线②:备份导出/导入
20064
20285
  "dialogBlur", "dialogAmount", "popoverBlur", "popoverAmount", "maskBlur", "maskAmount",
20065
- "unifyTint", "unifyAmount", "sidebarAlpha", "chatFollow", "sessionFollow",
20286
+ "unifyTint", "unifyAmount", "sidebarAlpha", "chatFollow", "sessionFollow", "blurFollowUnify",
20066
20287
  "aquaMask", "aquaTint", "aquaInk", "aquaColor", "aquaInkColor", "aquaTextEnhance", "todoBlur",
20067
20288
  "aquaMaskAlpha", "aquaTintStrength", "themeColor", "accent", "glassColor", "glassAlpha",
20068
20289
  "hybrid", "roundCompat", "rotate", "rotateMin", "rotGroups", "rotGroupId", "rotSeeded",
@@ -20108,7 +20329,7 @@ body[data-mpw-modal] [role="dialog"] {
20108
20329
  // ①(修正) 类型校验(评审指出:原实现直接透传,`opacity:"abc"` 会污染设置):
20109
20330
  // 数值类必须为有限数、布尔类必须为 boolean、字符串类必须为 string。
20110
20331
  const numFields = ["opacity", "blur", "zoom", "headerBlurAmount", "headerFrostAmount", "dialogAmount", "popoverAmount", "popoverAlpha", "maskAmount", "unifyAmount", "sidebarAlpha", "aquaMaskAlpha", "aquaTintStrength", "glassAlpha", "lgCssAmount", "rotateMin", "brightness", "playbackRate", "clockSize", "fpsCap", "resMax", "preScale", "bsRevealAlpha", "sceneWatchdogSecs", "npVolume"]; // ①(批次15) 四处接线③:导入数值净化;①(NP-4)① 追加 npVolume
20111
- const boolFields = ["sidebar", "sharp", "headerBlur", "headerBg", "rightSidebarBlur", "dialogBlur", "popoverBlur", "maskBlur", "unifyTint", "chatFollow", "sessionFollow", "aquaMask", "aquaTint", "aquaInk", "aquaTextEnhance", "todoBlur", "hybrid", "roundCompat", "rotate", "float", "newStyle", "mute", "thinkBg", "enabled", "forceEnabled", "clock", "clock24h", "clockSec", "clockDate", "bsCompat", "bsFloat", "bsFont", "bsReveal", "bsAlpha", "bsAqua", "bsBottomAvoid", "lgTest", "lgCss", "lgComposer", "lgSidebar", "lgHeader", "powPauseHidden", "powPauseBlur", "powPauseBattery", "sceneWatchdog", "npNowPlaying", "npLinkWallpaper", "npPaused"]; // ①(批次15) 四处接线④:导入布尔净化;①(NP-1) 末尾追加 npNowPlaying;①(NP-4)② 追加 npLinkWallpaper;①(NP-5) 追加 npPaused
20332
+ const boolFields = ["sidebar", "sharp", "headerBlur", "headerBg", "rightSidebarBlur", "dialogBlur", "popoverBlur", "maskBlur", "unifyTint", "blurFollowUnify", "chatFollow", "sessionFollow", "aquaMask", "aquaTint", "aquaInk", "aquaTextEnhance", "todoBlur", "hybrid", "roundCompat", "rotate", "float", "newStyle", "mute", "thinkBg", "enabled", "forceEnabled", "clock", "clock24h", "clockSec", "clockDate", "bsCompat", "bsFloat", "bsFont", "bsReveal", "bsAlpha", "bsAqua", "bsBottomAvoid", "lgTest", "lgCss", "lgComposer", "lgSidebar", "lgHeader", "powPauseHidden", "powPauseBlur", "powPauseBattery", "sceneWatchdog", "npNowPlaying", "npLinkWallpaper", "npPaused"]; // ①(批次15) 四处接线④:导入布尔净化;①(NP-1) 末尾追加 npNowPlaying;①(NP-4)② 追加 npLinkWallpaper;①(NP-5) 追加 npPaused;①(2026-10-02) 追加 blurFollowUnify
20112
20333
  const strFields = ["aquaColor", "aquaInkColor", "themeColor", "accent", "glassColor", "clockPos", "fontColorGrayColor", "sceneDebugParams"]; // ①(批次15) sceneDebugParams 走字符串净化(非法键/值在写入端丢弃)
20113
20334
  for (const k of BACKUP_FIELDS) {
20114
20335
  const v = settings[k];
@@ -20777,6 +20998,12 @@ body[data-mpw-modal] [role="dialog"] {
20777
20998
  // ①(修正) 第5项:面板颜色匹配壁纸(aquaTint)开关状态 —— 开时「遮罩自定义色」
20778
20999
  // 取色盘禁用变灰(二选一:自动匹配 vs 手动取色)。
20779
21000
  const aquaTintOn = section.aquaTint !== void 0 ? !!section.aquaTint : DEFAULT_AQUA_TINT;
21001
+ /* ①(2026-10-02 第3项) 「界面虚化是否跟随统一虚化」的**渲染派生量**(单一判据):
21002
+ 与 buildCss / mpwFogModel 同源(unifyTint && blurFollowUnify)——
21003
+ 设置行里凡是"被接管"的变灰/强制开/接管提示,都用它门控,避免又出现
21004
+ "文案说接管了、实现没接管"(或反之)的不一致。 */
21005
+ const followUnifyNow = (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)
21006
+ && (section.blurFollowUnify !== void 0 ? !!section.blurFollowUnify : DEFAULT_BLUR_FOLLOW_UNIFY);
20780
21007
  let ffStatus = null; // 状态区文本(null 不显示额外状态行)
20781
21008
  let ffShowDownload = false; // 是否显示下载按钮(missing / downloading 都显示)
20782
21009
  let ffShowUninstall = false; // ①(新) 是否显示卸载按钮(仅 cached 来源;不碰系统/env)
@@ -21831,15 +22058,14 @@ body[data-mpw-modal] [role="dialog"] {
21831
22058
  // 统一虚化开启时:开关+程度条被接管(禁用变灰),并在本项下方就地给接管说明(第6项)。
21832
22059
  h("div", { style: { display: (section.sidebar !== void 0 ? !!section.sidebar : DEFAULT_SIDEBAR) ? "" : "none" } }, [
21833
22060
  toggleRow(t("sidebarBlur"), t("sidebarBlur.desc"), "sidebarBlur", DEFAULT_SIDEBAR_BLUR,
21834
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT),
21835
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)),
22061
+ followUnifyNow, followUnifyNow),
21836
22062
  h("div", { style: {
21837
22063
  display: (section.sidebarBlur !== void 0 ? !!section.sidebarBlur : DEFAULT_SIDEBAR_BLUR) ? "" : "none",
21838
- opacity: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? 0.45 : 1,
21839
- pointerEvents: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? "none" : "auto"
22064
+ opacity: followUnifyNow ? 0.45 : 1,
22065
+ pointerEvents: followUnifyNow ? "none" : "auto"
21840
22066
  } },
21841
22067
  sliderRow(t("sidebarBlurAmount"), "sidebarBlurAmount", 0, 40, "px", 1, DEFAULT_SIDEBAR_BLUR_AMOUNT)),
21842
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)
22068
+ followUnifyNow
21843
22069
  ? h("p", { className: "mpw_hint" }, t("sidebarBlur.overridden"))
21844
22070
  : null,
21845
22071
  ]),
@@ -21857,15 +22083,14 @@ body[data-mpw-modal] [role="dialog"] {
21857
22083
  // 开关(headerBg/headerBlur)仍独立:透出关 = 纯白背景。
21858
22084
  h("div", { style: { display: (section.headerBg !== void 0 ? !!section.headerBg : DEFAULT_HEADER_BG) ? "" : "none" } },
21859
22085
  toggleRow(t("headerBlur"), t("headerBlur.desc"), "headerBlur", DEFAULT_HEADER,
21860
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT),
21861
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT))),
22086
+ followUnifyNow, followUnifyNow)),
21862
22087
  h("div", { style: {
21863
22088
  display: (section.headerBg !== void 0 ? !!section.headerBg : DEFAULT_HEADER_BG) && (section.headerBlur !== void 0 ? !!section.headerBlur : DEFAULT_HEADER) ? "" : "none",
21864
- opacity: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? 0.45 : 1,
21865
- pointerEvents: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? "none" : "auto"
22089
+ opacity: followUnifyNow ? 0.45 : 1,
22090
+ pointerEvents: followUnifyNow ? "none" : "auto"
21866
22091
  } },
21867
22092
  sliderRow(t("headerBlurAmount"), "headerBlurAmount", 0, 100, "%", 1, DEFAULT_HEADER_BLUR_AMOUNT)),
21868
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)
22093
+ followUnifyNow
21869
22094
  ? h("p", { className: "mpw_hint" }, t("headerBlur.overridden"))
21870
22095
  : null,
21871
22096
  // ①(新 2026-09-13 用户要求) 「标题栏磨砂强度」独立滑条:
@@ -21877,20 +22102,10 @@ body[data-mpw-modal] [role="dialog"] {
21877
22102
  } },
21878
22103
  sliderRow(t("headerFrostAmount"), "headerFrostAmount", 0, 60, "px", 1, DEFAULT_HEADER_FROST_AMOUNT)),
21879
22104
 
21880
- // ①(修正 2026-09-13 第1项) 右侧边栏/dock 虚化:纳入统一虚化接管(与侧边栏/标题栏同款提示)
21881
- toggleRow(t("rightSidebarBlur"), t("rightSidebarBlur.desc"), "rightSidebarBlur", DEFAULT_RIGHT_SIDEBAR_BLUR,
21882
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT),
21883
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)),
21884
- h("div", { style: {
21885
- display: (section.rightSidebarBlur !== void 0 ? !!section.rightSidebarBlur : DEFAULT_RIGHT_SIDEBAR_BLUR) ? "" : "none",
21886
- opacity: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? 0.45 : 1,
21887
- pointerEvents: (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT) ? "none" : "auto"
21888
- } },
21889
- sliderRow(t("rightSidebarBlurAmount"), "rightSidebarBlurAmount", 0, 40, "px", 1, DEFAULT_RIGHT_SIDEBAR_AMOUNT),
21890
- sliderRow(t("rightSidebarAlpha"), "rightSidebarAlpha", 0, 100, "%", 1, DEFAULT_RIGHT_SIDEBAR_ALPHA)),
21891
- (section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)
21892
- ? h("p", { className: "mpw_hint" }, t("rightSidebarBlur.overridden"))
21893
- : null,
22105
+ // ①(2026-10-02 第4项) 「右侧边栏/dock 虚化」整组**迁到「界面虚化」页**:
22106
+ // 它是"某个区域的背景虚化",与该页的对话框/弹层/遮罩同类;放在"外观"页时
22107
+ // 用户找不到(用户第4项:右侧边栏/Dock 虚化属于界面虚化)。原来这里的两行
22108
+ // 开关+两条滑条已原样搬到 blur tab 的「右侧边栏 / Dock」分组。
21894
22109
 
21895
22110
 
21896
22111
  ]),
@@ -21933,6 +22148,13 @@ body[data-mpw-modal] [role="dialog"] {
21933
22148
  ]),
21934
22149
  // ═══ 界面虚化 ═══
21935
22150
  h("div", { "data-mpw-tabkey": "blur", style: { flex: "0 0 100%", minWidth: "100%", boxSizing: "border-box", paddingRight: "4px" } }, [
22151
+ // ①(2026-10-02 第3项) **说明行 + 跟随开关放在 tab 栏与「界面虚化」标题之间**:
22152
+ // 用户先读到"这一页的虚化程度默认由统一虚化接管",再看到具体滑条;
22153
+ // 开关默认开(=跟随),与 buildCss/mpwFogModel 同源(DEFAULT_BLUR_FOLLOW_UNIFY)。
22154
+ // ⚠️ toggleRow 含 hooks ⇒ 必须常挂载(这里无条件渲染;统一虚化关时只禁用,不卸载)。
22155
+ h("p", { className: "mpw_hint", style: { marginTop: 0 } }, t("blur.follow.hint")),
22156
+ toggleRow(t("blurFollowUnify"), t("blurFollowUnify.desc"), "blurFollowUnify", DEFAULT_BLUR_FOLLOW_UNIFY,
22157
+ !(section.unifyTint !== void 0 ? !!section.unifyTint : DEFAULT_UNIFY_TINT)),
21936
22158
  h("div", { className: "mpw_section" }, t("sec.blur")),
21937
22159
  h("p", { className: "mpw_hint" }, t("sec.blur.desc")),
21938
22160
 
@@ -21970,6 +22192,26 @@ body[data-mpw-modal] [role="dialog"] {
21970
22192
  h("div", { style: { display: (section.maskBlur !== void 0 ? !!section.maskBlur : DEFAULT_MASK_BLUR) ? "" : "none" } },
21971
22193
  sliderRow(t("maskBlurAmount"), "maskAmount", 0, 40, "px", 1, DEFAULT_MASK_AMOUNT)),
21972
22194
 
22195
+ // ── 右侧边栏 / Dock(①(2026-10-02 第4项) 从「外观」页迁来:它属于本页)──
22196
+ // 统一虚化开启且「跟随」开着时整组被接管(开关强制开+变灰,滑条变灰),
22197
+ // 并在下方就地给出接管说明;关掉上面的跟随开关即可恢复本组可调。
22198
+ h("div", { className: "mpw_section", style: { marginTop: 18 } }, t("sec.blurRight")),
22199
+ h("p", { className: "mpw_hint" }, t("sec.blurRight.desc")),
22200
+ toggleRow(t("rightSidebarBlur"), t("rightSidebarBlur.desc"), "rightSidebarBlur", DEFAULT_RIGHT_SIDEBAR_BLUR,
22201
+ followUnifyNow, followUnifyNow),
22202
+ h("div", { style: {
22203
+ display: (section.rightSidebarBlur !== void 0 ? !!section.rightSidebarBlur : DEFAULT_RIGHT_SIDEBAR_BLUR) ? "" : "none",
22204
+ opacity: followUnifyNow ? 0.45 : 1,
22205
+ pointerEvents: followUnifyNow ? "none" : "auto"
22206
+ } },
22207
+ sliderRow(t("rightSidebarBlurAmount"), "rightSidebarBlurAmount", 0, 40, "px", 1, DEFAULT_RIGHT_SIDEBAR_AMOUNT),
22208
+ h("p", { className: "mpw_hint", style: { marginTop: -4 } }, t("rightSidebarBlurAmount.desc")),
22209
+ sliderRow(t("rightSidebarAlpha"), "rightSidebarAlpha", 0, 100, "%", 1, DEFAULT_RIGHT_SIDEBAR_ALPHA),
22210
+ h("p", { className: "mpw_hint", style: { marginTop: -4 } }, t("rightSidebarAlpha.desc"))),
22211
+ followUnifyNow
22212
+ ? h("p", { className: "mpw_hint" }, t("rightSidebarBlur.overridden"))
22213
+ : null,
22214
+
21973
22215
  ]),
21974
22216
  // ═══ 其他 ═══
21975
22217
  h("div", { "data-mpw-tabkey": "other", style: { flex: "0 0 100%", minWidth: "100%", boxSizing: "border-box", paddingRight: "4px" } }, [
@@ -22466,8 +22708,6 @@ body[data-mpw-modal] [role="dialog"] {
22466
22708
  "none": "无",
22467
22709
  "pause.pause": "暂停壁纸",
22468
22710
  "pause.play": "播放壁纸",
22469
- "pause.pause": "暂停壁纸",
22470
- "pause.play": "播放壁纸",
22471
22711
  "refresh.bg": "刷新壁纸",
22472
22712
  "refresh.done": "壁纸已刷新",
22473
22713
  "master.desc": "开启后应用所选背景",
@@ -22491,7 +22731,6 @@ body[data-mpw-modal] [role="dialog"] {
22491
22731
  "web.confirmBody": "网页壁纸可能卡顿或无法加载",
22492
22732
  "web.riskHeavy": "⚠ 预检:Spine/L2D 骨骼动画壁纸,低性能设备上可能卡住界面",
22493
22733
  "web.riskExternal": "⚠ 预检:依赖外网资源(SDK/CDN),加载可能失败",
22494
- "web.confirmBody": "网页壁纸可能卡顿或无法加载",
22495
22734
  "web.confirmHint": "部分网页壁纸(事件页/动效重)会在低性能设备上卡住界面;卡住时刷新页面即可恢复(不会自动重新加载)。若加载失败,壁纸会显示黑底并出现刷新按钮——那是壁纸自身的内容,属正常现象。",
22496
22735
  "web.confirmShim": "沙箱模式(推荐)",
22497
22736
  "web.confirmCompat": "兼容模式(同源)",
@@ -22563,9 +22802,14 @@ body[data-mpw-modal] [role="dialog"] {
22563
22802
  "sec.appearance": "外观",
22564
22803
  "sec.appearance.desc": "面板不透明度=所有区域白雾厚度;磨砂模糊=整张壁纸的模糊程度(0=清晰);镜头缩放/位置=背景画面的放大与平移(缩小可看到画面边缘的组件)",
22565
22804
  "sec.blur": "界面虚化",
22566
- "sec.blur.desc": "各类弹层/面板打开时的背景虚化:对话框(通用居中窗口+聊天输入框)、设置面板、下载确认弹窗各自独立;弹层=菜单/下拉/提示;遮罩=弹层背后的全屏背景;左侧边栏磨砂=左侧边栏自身玻璃化",
22805
+ "sec.blur.desc": "各区域的背景虚化:对话框(通用居中窗口+聊天输入框)、设置面板、下载确认弹窗各自独立;弹层=菜单/下拉/提示;遮罩=弹层背后的全屏背景;右侧边栏/dock=DSH 自带右栏与底部浮层。默认「跟随统一虚化」:统一虚化开着时,被接管的项(左侧边栏磨砂/标题栏磨砂/右侧边栏·dock)由「整屏虚化程度 + 左侧边栏/标题栏透明度」统一驱动。",
22806
+ "blurFollowUnify": "界面虚化跟随统一虚化",
22807
+ "blurFollowUnify.desc": "开(默认)=本页里被接管的项(左侧边栏磨砂、标题栏磨砂、右侧边栏/dock 虚化)交给统一虚化统一驱动,整屏一致;关=这些项各自独立可调,统一虚化只管壁纸模糊与各表面白雾,不再改它们的半径。",
22808
+ "blur.follow.hint": "下面这组「界面虚化」的虚化程度默认由「界面统一」页的滑条统一接管(统一虚化开启时);想让它们各自独立调节,请关掉下面这个开关。未被接管的项(对话框/设置面板/下载确认/弹层/遮罩)始终独立生效。",
22809
+ "sec.blurRight": "右侧边栏 / Dock",
22810
+ "sec.blurRight.desc": "DSH 自带的右侧边栏与底部 dock 浮层(含 better-sidebar 的面板与底部工作台)。跟随统一虚化时本组由统一虚化接管,且与左侧边栏使用同一套表面颜色与厚度。",
22567
22811
  "sec.unify": "界面统一",
22568
- "sec.unify.desc": "整屏界面外观统一管理,两类效果互不干扰:①统一虚化=壁纸模糊度+白雾厚度(左侧边栏/标题栏整体毛玻璃);②统一雾=全屏色调雾罩(所有表面共享一种雾色/浓度)。开启后「界面虚化」里的左侧边栏磨砂被接管",
22812
+ "sec.unify.desc": "整屏界面外观统一管理,两类效果互不干扰:①统一虚化=壁纸模糊度+白雾厚度(左侧边栏/标题栏/右侧边栏/dock 等整个界面外壳一起毛玻璃);②统一雾=全屏色调雾罩(所有表面共享一种雾色/浓度)。统一虚化开启时,「界面虚化」页里被点名的项由这里的两个条接管(可在那一页关掉「跟随统一虚化」让它们独立)。",
22569
22813
  "sec.unifyFog": "统一雾(色调)",
22570
22814
  "sec.unifyFog.desc": "全屏纯色雾罩:所有表面(左侧边栏/标题栏/聊天区/按钮)共享一种雾色与浓度,让整屏色调统一;关 = 保持原有分区配色",
22571
22815
  "sec.show": "透出壁纸",
@@ -22906,12 +23150,13 @@ body[data-mpw-modal] [role="dialog"] {
22906
23150
  "headerFrostAmount": "标题栏磨砂强度",
22907
23151
 
22908
23152
  "unifyTint": "统一虚化",
22909
- "unifyTint.desc": "开启后,左侧边栏获得类似聊天框的毛玻璃虚化(整块模糊、无缝隙),强度由「整屏虚化程度」条控制;左侧边栏表面白雾厚度由「左侧边栏透明度」条控制;标题栏始终按自己的磨砂条(默认透明)。关闭后各区域单独调节",
23153
+ "unifyTint.desc": "开启后,整个界面外壳(左侧边栏/标题栏/右侧边栏/dock)一起变成毛玻璃:模糊半径由「整屏虚化程度」控制,表面白雾厚度由「左侧边栏/标题栏透明度」控制;「界面虚化」页里被点名的项默认跟随这两个条(可在那一页关掉「跟随统一虚化」让它们独立)。关闭后各区域单独调节",
22910
23154
  "unifyAmount": "整屏虚化程度",
23155
+ "unifyAmount.desc": "整屏的模糊半径(px):0 = 不虚化(壁纸完全清晰,标题栏/侧边栏/右栏/dock 也回到实心,不会再把原始壁纸透出来);40 = 强毛玻璃。统一虚化开启时这是整个界面外壳唯一的模糊来源。",
22911
23156
  "sidebarAlpha": "左侧边栏/标题栏透明度",
22912
- "sidebarAlpha.desc": "统一虚化开启时:左侧边栏表面的白雾厚度(0 = 全透明透出模糊壁纸,100 = 实心)。与「整屏虚化程度」解耦,可单独调;标题栏不再跟随(按自己的磨砂条)",
23157
+ "sidebarAlpha.desc": "各表面白雾的厚度(%):0 = 完全透明(只看到**模糊**壁纸,不留雾、不留取色);100 = 完全不透明。统一虚化开启时,左侧边栏/标题栏/右侧边栏/dock 的表面厚度都由它决定。⚠ 它只在「整屏虚化程度 > 0」时决定观感:程度 = 0(不虚化)时外壳一律实心,避免把未模糊的原始壁纸透出来。",
22913
23158
  "chatFollow": "聊天区跟随整屏虚化",
22914
- "chatFollow.desc": "统一虚化开启时:开 = 聊天区壁纸模糊也随「整屏虚化程度」(磨砂条被接管禁用);关 = 磨砂条恢复可调,聊天区壁纸由磨砂条控制(统一虚化只虚化左侧边栏/标题栏)",
23159
+ "chatFollow.desc": "统一虚化开启时:开 = 聊天区壁纸模糊也随「整屏虚化程度」(磨砂条被接管禁用);关 = 磨砂条恢复可调,聊天区壁纸由磨砂条控制(统一虚化仍负责界面外壳:左栏/标题栏/右栏/dock)",
22915
23160
  "sessionFollow": "新会话按钮跟随面板不透明度",
22916
23161
  "sessionFollow.desc": "统一虚化开启时:「添加新会话」按钮是否随「不透明度」条。关 = 保持原按钮色",
22917
23162
  "dialogBlur": "虚化对话框",
@@ -22934,13 +23179,14 @@ body[data-mpw-modal] [role="dialog"] {
22934
23179
  "sidebarBlur": "左侧边栏磨砂",
22935
23180
  "rightSidebarBlur": "右侧边栏/dock 虚化",
22936
23181
  "rightSidebarBlurAmount": "虚化程度",
23182
+ "rightSidebarBlurAmount.desc": "右侧边栏/dock 背后壁纸的模糊半径(px)。「界面虚化跟随统一虚化」开着且统一虚化开启时,本项由「整屏虚化程度」接管。",
22937
23183
  "rightSidebarAlpha": "表面透明度",
22938
- "rightSidebarBlur.desc": "适配 DSH 0.1.5 自带的右侧边栏与底部 dock 浮层(补打旧类名使其命中同一套虚化规则)。",
23184
+ "rightSidebarAlpha.desc": "右侧边栏/dock 表面白雾的浓淡(%):0 = 完全透明(只看到壁纸);100 = 完全不透明。跟随统一虚化时由「左侧边栏/标题栏透明度」接管。",
23185
+ "rightSidebarBlur.desc": "适配 DSH 自带的右侧边栏与底部 dock 浮层(补打旧类名使其命中同一套虚化规则)。跟随统一虚化开启时,本组整体由统一虚化的两个条接管。",
22939
23186
  "sidebarBlur.desc": "左侧边栏自身玻璃化(backdrop-filter 模糊其背后的壁纸),开启后左侧边栏有类似 Aqua 的磨砂玻璃质感;打开弹窗时自动摘除以防弹窗被左侧边栏模糊层困住",
22940
23187
  "sidebarBlurAmount": "左侧边栏磨砂程度",
22941
23188
  "sidebarBlur.overridden": "统一虚化开启中:左侧边栏磨砂由「整屏虚化程度」+「透明度」接管;关闭统一虚化后此开关恢复可调",
22942
- "rightSidebarBlur.overridden": "Unified blur is on: right sidebar / dock frost is taken over by the screen blur amount + surface opacity; turn Unified blur off to adjust this switch again",
22943
- "rightSidebarBlur.overridden": "统一虚化开启中:右侧边栏/dock 虚化由「整屏虚化程度」+「透明度」接管;关闭统一虚化后此开关恢复可调",
23189
+ "rightSidebarBlur.overridden": "统一虚化开启中(且「界面虚化跟随统一虚化」开着):右侧边栏/dock 虚化由「整屏虚化程度」+「左侧边栏/标题栏透明度」接管;在「界面虚化」页关掉跟随开关即可恢复本组可调",
22944
23190
  "sidebarBlur.needReveal": "需先开启「左侧边栏透出壁纸」才能使用左侧边栏磨砂(受左侧边栏透出控制)",
22945
23191
  "headerBlur.overridden": "统一虚化开启中:标题栏磨砂由「整屏虚化程度」+「透明度」接管;关闭统一虚化后此开关恢复可调",
22946
23192
  "thinkBg": "Deep diving 背景方框",
@@ -23138,9 +23384,14 @@ body[data-mpw-modal] [role="dialog"] {
23138
23384
  "sec.appearance": "Appearance",
23139
23385
  "sec.appearance.desc": "Panel opacity = frosted tint thickness of all areas; Frosted blur = how blurred the wallpaper itself is (0 = sharp); Lens zoom/position = zoom and pan of the background image (zoom out to see components at the picture edges)",
23140
23386
  "sec.blur": "UI blur",
23141
- "sec.blur.desc": "Backdrop blur when each popup layer opens: dialogs (generic center windows + chat input), the settings panel, and download/confirm popups each have their own switch; popovers = menus/dropdowns/tooltips; mask = the full-screen dim behind popups; sidebar frost = the sidebar itself becomes glass",
23387
+ "sec.blur.desc": "Backdrop blur per area: dialogs (generic center windows + chat input), the settings panel and download/confirm popups each have their own switch; popovers = menus/dropdowns/tooltips; mask = the full-screen dim behind popups; right sidebar/dock = the built-in right panel and bottom dock. By default this page follows Unified blur: the taken-over rows (left sidebar frost, title-bar frost, right sidebar/dock) are driven by the Full-screen blur degree + Left sidebar / title-bar opacity.",
23388
+ "blurFollowUnify": "UI blur follows Unified blur",
23389
+ "blurFollowUnify.desc": "On (default) = the taken-over rows on this page (left sidebar frost, title-bar frost, right sidebar/dock blur) are driven by Unified blur so the whole shell matches; Off = those rows become independently adjustable, and Unified blur only owns the wallpaper blur and the surface fog.",
23390
+ "blur.follow.hint": "The frost amounts below are taken over by the two sliders on the “Surface unify” page while Unified blur is on. Turn the switch below off to make them independent. Rows that are not taken over (dialogs / settings panel / download-confirm / popovers / mask) always stay independent.",
23391
+ "sec.blurRight": "Right sidebar / Dock",
23392
+ "sec.blurRight.desc": "The built-in right sidebar and bottom dock overlays (including better-sidebar panels and its bottom workbench). While following Unified blur this group is taken over and shares one surface color and thickness with the left sidebar.",
23142
23393
  "sec.unify": "Surface unify",
23143
- "sec.unify.desc": "One place manages the whole-surface look with two independent groups: ①Unified frost = wallpaper blur + fog thickness (sidebar/title-bar frosted glass); ②Unified fog = full-screen color mist shared by every surface. When on, the sidebar frost below is taken over",
23394
+ "sec.unify.desc": "One place manages the whole-surface look with two independent groups: ①Unified blur = wallpaper blur radius + fog thickness (the whole UI shell — left sidebar, title bar, right sidebar, dock — becomes frosted glass together); ②Unified fog = full-screen color mist shared by every surface. While Unified blur is on, the taken-over rows on the “UI blur” page follow these two sliders (turn “UI blur follows Unified blur” off there to decouple them).",
23144
23395
  "sec.unifyFog": "Unified fog (tint)",
23145
23396
  "sec.unifyFog.desc": "Full-screen solid-color mist: every surface (sidebar/title bar/chat/buttons) shares one fog color and density for a unified tint; off = keep per-area colors",
23146
23397
  "sec.show": "Show wallpaper",
@@ -23351,12 +23602,13 @@ body[data-mpw-modal] [role="dialog"] {
23351
23602
  "headerFrostAmount": "Title bar frost strength",
23352
23603
 
23353
23604
  "unifyTint": "Unify blur",
23354
- "unifyTint.desc": "On: the sidebar gets a chat-box-like frosted blur (one seamless layer, no seams); strength by the Full-screen blur degree; sidebar white-fog thickness by the Sidebar opacity slider; the title bar always follows its own frost slider (transparent by default). Off = per-area control",
23605
+ "unifyTint.desc": "On: the whole UI shell (left sidebar / title bar / right sidebar / dock) becomes one seamless frosted glass; blur radius by the Full-screen blur degree, surface fog thickness by the Left sidebar / title-bar opacity slider. The rows taken over on the UI-blur page follow these two sliders by default (turn “UI blur follows Unified blur” off there to decouple them). Off = per-area control",
23355
23606
  "unifyAmount": "Full-screen blur degree",
23607
+ "unifyAmount.desc": "Blur radius (px) for the whole screen: 0 = no blur at all (the wallpaper is fully sharp and the title bar / sidebar / right sidebar / dock return to a solid surface — no raw wallpaper showing through); 40 = heavy frosted glass. While Unified blur is on this is the only blur source for the UI shell.",
23356
23608
  "sidebarAlpha": "Left sidebar / title-bar opacity",
23357
- "sidebarAlpha.desc": "When unified blur is on: white-fog thickness on the sidebar and title bar (0 = fully transparent showing blurred wallpaper, 100 = solid). Decoupled from the blur degree, adjustable independently",
23609
+ "sidebarAlpha.desc": "Fog thickness (%) on every chrome surface: 0 = fully transparent (the *blurred* wallpaper only — no fog and no wallpaper-sampled tint); 100 = fully opaque. While Unified blur is on it drives the left sidebar, title bar, right sidebar and dock alike. ⚠ It only matters while *Full-screen blur degree* > 0: with the degree at 0 (no blur) the shell stays solid, so the un-blurred wallpaper is never shown through.",
23358
23610
  "chatFollow": "Chat follows full-screen blur",
23359
- "chatFollow.desc": "When unified blur is on: On = the chat area wallpaper blur also follows the Full-screen blur degree (frosted slider taken over & disabled); Off = the frosted slider becomes adjustable again, the chat area wallpaper follows it (unified blur only frosts the sidebar/title bar)",
23611
+ "chatFollow.desc": "When unified blur is on: On = the chat area wallpaper blur also follows the Full-screen blur degree (frosted slider taken over & disabled); Off = the frosted slider becomes adjustable again and the chat-area wallpaper follows it (unified blur still owns the UI shell: sidebar / title bar / right sidebar / dock)",
23360
23612
  "sessionFollow": "New-chat button follows panel opacity",
23361
23613
  "sessionFollow.desc": "When unified blur is on: whether the New chat button follows the Opacity slider. Off = keeps its original button color",
23362
23614
  "dialogBlur": "Blur dialogs",
@@ -23379,13 +23631,15 @@ body[data-mpw-modal] [role="dialog"] {
23379
23631
  "sidebarBlur": "Left sidebar frost",
23380
23632
  "rightSidebarBlur": "Right sidebar / dock blur",
23381
23633
  "rightSidebarBlurAmount": "Blur amount",
23634
+ "rightSidebarBlurAmount.desc": "Backdrop blur radius (px) for the right sidebar / dock. While “UI blur follows Unified blur” is on and Unified blur is enabled, this is taken over by the Full-screen blur degree.",
23382
23635
  "rightSidebarAlpha": "Surface opacity",
23383
- "rightSidebarBlur.desc": "Adapts DSH 0.1.5 built-in right sidebar and bottom dock overlays to the same frost rules.",
23636
+ "rightSidebarAlpha.desc": "White-fog density (%) on the right sidebar / dock surface: 0 = fully transparent (wallpaper only), 100 = fully opaque. Taken over by “Left sidebar / title-bar opacity” while following Unified blur.",
23637
+ "rightSidebarBlur.desc": "Adapts the built-in right sidebar and bottom dock overlays to the same frost rules. While Unified blur takes over, this whole group follows its two sliders.",
23384
23638
  "sidebarBlur.desc": "The sidebar itself becomes glass (backdrop-filter blurs the wallpaper behind it, Aqua-style); automatically lifted while a dialog is open so the blur layer cannot trap fixed popups",
23385
23639
  "sidebarBlurAmount": "Left sidebar frost amount",
23386
- "sidebarBlur.overridden": "Unified blur is on: left sidebar frost is taken over by the Full-screen blur degree + Surface opacity; turn unified blur off to adjust this switch",
23640
+ "sidebarBlur.overridden": "Unified blur is on: left sidebar frost is taken over by the Full-screen blur degree + Left sidebar / title-bar opacity. Turn off “UI blur follows Unified blur” on the UI-blur page to adjust this switch again",
23387
23641
  "sidebarBlur.needReveal": "Turn on the sidebar wallpaper reveal first to use sidebar frost (controlled by the sidebar reveal)",
23388
- "headerBlur.overridden": "Unified blur is on: title-bar frost is taken over by Full-screen blur degree + transparency; turn unified blur off to adjust this switch",
23642
+ "headerBlur.overridden": "Unified blur is on: title-bar frost is taken over by the Full-screen blur degree + Left sidebar / title-bar opacity. Turn off “UI blur follows Unified blur” on the UI-blur page to adjust this switch again",
23389
23643
  "thinkBg": "Deep diving background box",
23390
23644
  "thinkBg.desc": "On: show a blurred background box behind the Deep diving thinking status; Off (default): transparent, text sits directly on the wallpaper",
23391
23645
  "blur.unsupported": "⚠️ This browser (Via/WebView) does not truly render backdrop blur; blur appears as translucency only. Use Chrome/Firefox for the full frosted effect",
@@ -23516,7 +23770,7 @@ body[data-mpw-modal] [role="dialog"] {
23516
23770
  "themeColor": "Theme color",
23517
23771
  "themeColor.hint": "Tints the left sidebar / title bar / new-session button / settings dialog background (picker + presets); brand interactive elements (buttons/selection/links) are controlled by the Aqua “Accent color”; empty = disabled",
23518
23772
  "themeColorReset": "Default",
23519
- "rightSidebarBlur.overridden": "Unified blur is on: right sidebar/dock blur is handled by “Global blur amount” + “Opacity”; turn unified blur off to make this switch adjustable again",
23773
+ "rightSidebarBlur.overridden": "Unified blur is on (and “UI blur follows Unified blur” is on): right sidebar/dock blur is handled by the Full-screen blur degree + Left sidebar / title-bar opacity; turn the follow switch off on the UI-blur page to make this group adjustable again",
23520
23774
  // ①(P-66 真 bug 修复) 原来硬编码在 JSX 里的中文(英文界面会漏中文)
23521
23775
  "hybrid.status": "Status",
23522
23776
  "scnRender.reapplied": " (remounted)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mpkg-wallpaper",
3
- "version": "3.13.12",
3
+ "version": "3.14.0",
4
4
  "description": "DSH Web 壁纸引擎 Wallpaper Engine mpkg 背景插件:浏览器内直接解析 .mpkg(preview.gif 动态背景/内嵌 mp4 视频/多时段切换),整屏统一虚化/对话框/弹层/遮罩独立虚化、镜头缩放平移、时钟、冲突检测。",
5
5
  "private": false,
6
6
  "type": "module",