dsh-mpkg-wallpaper 3.15.7 → 3.15.9

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.
Files changed (2) hide show
  1. package/lib/client.js +164 -79
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -17734,6 +17734,12 @@ html body [data-sidebar-right-panel], html body [data-dockkit-pane], html body [
17734
17734
  z-index: 12 !important;
17735
17735
  }
17736
17736
  html body [class*="sidebarCol"]:not([data-sidebar-right-panel]) { z-index: 1 !important; }
17737
+ /* ②(2026-10-05 真机:"设置 → Agent 预设 → 查看,弹出的框被压在设置底下")
17738
+ 根因:宿主把设置弹层渲染在**左栏子树里**(真机读数 VOzbGW_overlay[z=2000] 是 pI_x6G_sidebarCol
17739
+ 的后代),而上面那条把左栏钉成 z-index:1 ⇒ 连同里面的弹窗一起被困在 z=1 的层叠上下文里,
17740
+ 被别的 z=2000 层盖住。⇒ 左栏子树里出现**可见的**宿主弹层/对话框时给左栏打抬升标记;
17741
+ 弹层关掉即摘(收纳态"左栏盖右栏"的老问题不受影响)。 */
17742
+ html body [data-mpw-side-lift] { z-index: 2500 !important; }
17737
17743
  [role="menu"], [role="listbox"], [role="dialog"], [role="tooltip"],
17738
17744
  [class*="_popover"], [class*="_dropdown"], [class*="_selectMenu"], [class*="_menu_"],
17739
17745
  [data-radix-popper-content-wrapper], [data-dsh-popover] {
@@ -24845,31 +24851,6 @@ body[data-mpw-modal] [role="dialog"] {
24845
24851
  return r.width * r.height <= 0.4 * vw * vh && r.height <= vh * 0.9;
24846
24852
  } catch (e) { return false; }
24847
24853
  }
24848
- function mpwTagPopoverBg() {
24849
- let list = null;
24850
- try { list = document.querySelectorAll(MPW_POP_TAG_SEL); } catch (e) { return; }
24851
- if (!list) return;
24852
- for (let i = 0; i < list.length; i++) {
24853
- const el = list[i];
24854
- let need = false;
24855
- try {
24856
- const cls = (typeof el.className === "string") ? el.className : "";
24857
- if (!MPW_POP_TAG_NOT.test(cls)) {
24858
- const cs = getComputedStyle(el);
24859
- if (cs && cs.display !== "none" && cs.visibility !== "hidden"
24860
- && /blur\(/.test(String(cs.backdropFilter || cs.webkitBackdropFilter || ""))) {
24861
- const a = mpwColorAlpha(cs.backgroundColor);
24862
- if (a < 0.05) need = !mpwPopHasPaintedAncestor(el);
24863
- else if (a >= 0.999) need = mpwPopIsFloating(el);
24864
- }
24865
- }
24866
- } catch (e) { need = false; }
24867
- try {
24868
- if (need) { if (!el.hasAttribute("data-mpw-pop-bg")) el.setAttribute("data-mpw-pop-bg", ""); }
24869
- else if (el.hasAttribute("data-mpw-pop-bg")) el.removeAttribute("data-mpw-pop-bg");
24870
- } catch (e) {}
24871
- }
24872
- }
24873
24854
  /* ②(2026-10-04 真机:"右侧边栏比左栏/标题栏更白")**嵌套表面只画最外层**:
24874
24855
  右栏/dock 家族是互相嵌套的(真机读数:两个命中元素的 rect 只差 1px),把同一枚半透明表面色
24875
24856
  刷在两层上 ⇒ 合成不透明度 1-(1-a)²(a=0.55 时 0.80)≈ 一块近白板;左栏只有一个匹配元素,
@@ -24909,62 +24890,102 @@ body[data-mpw-modal] [role="dialog"] {
24909
24890
  } catch (e) { return 0 }
24910
24891
  }
24911
24892
 
24912
- function mpwTagPopoverBg() {
24913
- let list = null;
24914
- try { list = document.querySelectorAll(MPW_POP_TAG_SEL); } catch (e) { return; }
24915
- if (!list) return;
24916
- for (let i = 0; i < list.length; i++) {
24917
- const el = list[i];
24918
- let need = false;
24919
- try {
24920
- const cls = (typeof el.className === "string") ? el.className : "";
24921
- if (!MPW_POP_TAG_NOT.test(cls)) {
24922
- const cs = getComputedStyle(el);
24923
- if (cs && cs.display !== "none" && cs.visibility !== "hidden"
24924
- && /blur\(/.test(String(cs.backdropFilter || cs.webkitBackdropFilter || ""))) {
24925
- const a = mpwColorAlpha(cs.backgroundColor);
24926
- if (a < 0.05) need = !mpwPopHasPaintedAncestor(el);
24927
- else if (a >= 0.999) need = mpwPopIsFloating(el);
24928
- }
24929
- }
24930
- } catch (e) { need = false; }
24931
- try {
24932
- if (need) { if (!el.hasAttribute("data-mpw-pop-bg")) el.setAttribute("data-mpw-pop-bg", ""); }
24933
- else if (el.hasAttribute("data-mpw-pop-bg")) el.removeAttribute("data-mpw-pop-bg");
24934
- } catch (e) {}
24935
- }
24936
- }
24937
- /* ②(2026-10-04 真机:"右侧边栏比左栏/标题栏更白")**嵌套表面只画最外层**:
24938
- 右栏/dock 家族是互相嵌套的(真机读数:两个命中元素的 rect 只差 1px),把同一枚半透明表面色
24939
- 刷在两层上 ⇒ 合成不透明度 1-(1-a)²(a=0.55 时 0.80)≈ 一块近白板;左栏只有一个匹配元素,
24940
- 于是"左栏灰、右栏白"。这里按**结构**(有没有同样命中的祖先)给最外层打
24941
- `data-mpw-rs-surface`,CSS 只认这个标记(与 `data-mpw-holds-layer` 同一手法)。
24942
- 幂等、无布局读取(只用 matches/parentElement),可随突变跑。 */
24943
- function mpwTagSurfaceOuter() {
24893
+ /* ②(2026-10-05 真机:"刚展开是白色的不透明背景,过一会儿才切换")——**同步快路**:
24894
+ 弹层插进 DOM 的那一刻就判定并打标(在同一个 mutation 回调里,早于下一帧绘制),不再等
24895
+ rAF 合并 + 闸门(那条路最坏 ~400ms,用户看到的就是"先白、过一会儿才变")。
24896
+ 只处理本次**新增子树**里的候选(与弹层数量同阶),不做全文档扫描。 */
24897
+ /* ②(2026-10-05) 左栏里出现"可见的宿主弹层/对话框" ⇒ 给左栏打抬升标记(见上面 CSS 注释)。
24898
+ 只读结构 + 尺寸,弹层关掉同一趟里摘掉;与弹层标记共用同一批触发点。 */
24899
+ const MPW_OVERLAY_SEL = '[class*="_overlay"], [class*="_modal"], [role="dialog"], [role="alertdialog"]';
24900
+ function mpwSideLiftSync() {
24944
24901
  try {
24945
- const all = Array.from(document.querySelectorAll(MPW_RS_FAMILY));
24946
- if (!all.length) return 0;
24947
- const set = new Set(all);
24948
- /* 真机读数:DSH 右栏面板与 dockkit 面板/标签条**互相重叠**(rect 只差 1~2px)却不在同一条
24949
- 祖先链上 ⇒ 只按"有没有命中祖先"判不出重叠,两层 55% 会合成 ~80%(用户看到的"更白")。
24950
- 判据:DSH 自己的右栏面板在场时,dock 子件一律不刷(它们显示的就是那块面板的表面);
24951
- 只有"没有右栏面板、只有 dock"的布局(better-sidebar 底部工作台等)才由 dock 自己承担。 */
24952
- const panel = document.querySelector('[data-sidebar-right-panel]');
24953
- const isDock = (el) => { try { return el.matches('[data-dockkit-pane], [data-dockkit-strip], [data-dockkit-surface], [data-dockkit-float]') } catch (e) { return false } };
24902
+ const sides = Array.from(document.querySelectorAll('[class*="sidebarCol"]:not([data-sidebar-right-panel])'));
24903
+ if (!sides.length) return 0;
24954
24904
  let changed = 0;
24955
- for (const el of all) {
24956
- let inner = false;
24957
- for (let p = el.parentElement, i = 0; p && i < 40; p = p.parentElement, i++) { if (set.has(p)) { inner = true; break } }
24958
- const coveredByPanel = !!(panel && panel !== el && isDock(el));
24959
- const want = !inner && !coveredByPanel;
24960
- const has = el.hasAttribute("data-mpw-rs-surface");
24961
- if (want && !has) { try { el.setAttribute("data-mpw-rs-surface", ""); changed++ } catch {} }
24962
- else if (!want && has) { try { el.removeAttribute("data-mpw-rs-surface"); changed++ } catch {} }
24905
+ for (const side of sides) {
24906
+ let want = false;
24907
+ for (const dlg of Array.from(side.querySelectorAll(MPW_OVERLAY_SEL))) {
24908
+ try {
24909
+ const cs = getComputedStyle(dlg);
24910
+ if (cs.position !== "fixed" || cs.display === "none" || cs.visibility === "hidden") continue;
24911
+ if (Number(cs.opacity) === 0) continue;
24912
+ const r = dlg.getBoundingClientRect();
24913
+ if (r.width <= 0 || r.height <= 0) continue;
24914
+ want = true; break;
24915
+ } catch (e) { /* 单个读不到就跳过 */ }
24916
+ }
24917
+ const has = side.hasAttribute("data-mpw-side-lift");
24918
+ if (want && !has) { try { side.setAttribute("data-mpw-side-lift", ""); changed++ } catch (e) {} }
24919
+ else if (!want && has) { try { side.removeAttribute("data-mpw-side-lift"); changed++ } catch (e) {} }
24963
24920
  }
24964
24921
  return changed;
24965
24922
  } catch (e) { return 0 }
24966
24923
  }
24967
24924
 
24925
+ function mpwTagPopoverFast(records) {
24926
+ try {
24927
+ let n = 0;
24928
+ for (const rec of (records || [])) {
24929
+ /* ②(2026-10-05 真机仍见白帧的根因) 弹层大多是**先插入(隐藏)→ 再靠 class/style 显形**:
24930
+ 只认 addedNodes 时,元素插入那一刻还是 display:none(判定不出"浮层面积",也看不见),
24931
+ 等它显形时走的是 **attributes 突变**,而旧观察器只监听 childList ⇒ 显形那一帧没人管,
24932
+ 用户看到的就是宿主自己的不透明白底。现在把属性突变也接进同步快路(MutationObserver
24933
+ 回调是微任务,跑在**渲染之前** ⇒ 显形的那一帧就已经带上我们的表面)。 */
24934
+ if (rec.type === "attributes") {
24935
+ const t = rec.target;
24936
+ if (!t || t.nodeType !== 1) continue;
24937
+ let hit = false;
24938
+ try { hit = t.matches && t.matches(MPW_POP_TAG_SEL) } catch (e) {}
24939
+ if (hit) { if (mpwTagOnePopover(t)) n++; }
24940
+ continue;
24941
+ }
24942
+ for (const node of (rec.addedNodes || [])) {
24943
+ if (!node || node.nodeType !== 1) continue;
24944
+ const cands = [];
24945
+ try {
24946
+ if (node.matches && node.matches(MPW_POP_TAG_SEL)) cands.push(node);
24947
+ if (node.querySelectorAll) { const subs = node.querySelectorAll(MPW_POP_TAG_SEL); for (let i = 0; i < subs.length && i < 40; i++) cands.push(subs[i]); }
24948
+ } catch (e) {}
24949
+ for (const el of cands) { if (mpwTagOnePopover(el)) n++; }
24950
+ }
24951
+ }
24952
+ try { mpwSideLiftSync(); } catch (e) {}
24953
+ try { mpwPopUntruncSync(); } catch (e) {}
24954
+ return n;
24955
+ } catch (e) { return 0 }
24956
+ }
24957
+ /** 单个元素:该不该有我们的兜底底;返回是否发生了变化。 */
24958
+ function mpwTagOnePopover(el) {
24959
+ let need = false;
24960
+ try {
24961
+ const cls = (typeof el.className === "string") ? el.className : "";
24962
+ if (!MPW_POP_TAG_NOT.test(cls)) {
24963
+ const cs = getComputedStyle(el);
24964
+ const blurred = !!(cs && /blur\(/.test(String(cs.backdropFilter || cs.webkitBackdropFilter || "")));
24965
+ if (blurred) {
24966
+ const a = mpwColorAlpha(cs.backgroundColor);
24967
+ /* ②(2026-10-05) 两类分开判:
24968
+ · 宿主**没有底**(α<0.05)的弹层:**不要求此刻可见** —— 隐藏时打标无害,
24969
+ 等它显形时表面已经在位(这正是"先插入后显形"那条路的白帧来源);
24970
+ · 宿主画了**不透明底**的小浮层:必须量得到面积(隐藏时 rect=0 ⇒ 留给下一次触发)。 */
24971
+ if (a < 0.05) need = !mpwPopHasPaintedAncestor(el);
24972
+ else if (a >= 0.999 && cs.display !== "none" && cs.visibility !== "hidden") need = mpwPopIsFloating(el);
24973
+ }
24974
+ }
24975
+ } catch (e) { need = false; }
24976
+ try {
24977
+ if (need) { if (!el.hasAttribute("data-mpw-pop-bg")) { el.setAttribute("data-mpw-pop-bg", ""); return true } }
24978
+ else if (el.hasAttribute("data-mpw-pop-bg")) { el.removeAttribute("data-mpw-pop-bg"); return true }
24979
+ } catch (e) {}
24980
+ return false;
24981
+ }
24982
+ function mpwTagPopoverBg() {
24983
+ let list = null;
24984
+ try { list = document.querySelectorAll(MPW_POP_TAG_SEL); } catch (e) { return; }
24985
+ if (!list) return;
24986
+ for (let i = 0; i < list.length; i++) mpwTagOnePopover(list[i]);
24987
+ }
24988
+
24968
24989
  /* ①(P3 修复 2026-10-03) 弹层玻璃的 backdrop root 被截断 ⇒ 有半透明、没模糊。
24969
24990
  读数与机制(docs/POPOVER-BLUR.md):挂在宿主输入框卡片(uV2eYG_card,backdrop-filter:
24970
24991
  blur(14px))子树里的弹层,其 backdrop root 被卡片截断 ⇒ 弹层自己的 blur(11px) 只能采样
@@ -24992,13 +25013,29 @@ body[data-mpw-modal] [role="dialog"] {
24992
25013
  const surfaces = document.querySelectorAll("[data-mpw-pop-bg]");
24993
25014
  const targets = new Set();
24994
25015
  const truncated = new Set();
25016
+ const markedNow = Array.from(document.querySelectorAll("[data-mpw-pop-untrunc]"));
24995
25017
  for (let i = 0; i < surfaces.length; i++) {
24996
25018
  const el = surfaces[i];
24997
25019
  let cs = null;
24998
25020
  try { cs = getComputedStyle(el) } catch (e) {}
24999
25021
  /* 硬前提(与 mpwTagPopoverBg 同口径):我们真的给了模糊才值得摘祖先的截断 */
25000
25022
  if (!cs || !cs.backdropFilter || String(cs.backdropFilter).indexOf("blur") < 0) continue;
25023
+ /* ②(2026-10-05 抖动修复) **已经摘过、且仍在这条祖先链上**的祖先,弹层没关就一直保持:
25024
+ 摘掉之后它自己就没有 blur 了,若每轮都重新"找第一个带 blur 的祖先",下一轮就找不到它
25025
+ ⇒ 属性被当陈旧标记摘掉 ⇒ blur 又回来 ⇒ 摘/还原来回抖(真机现象:同一个菜单时好时坏)。 */
25026
+ let kept = false;
25027
+ for (const mEl of markedNow) {
25028
+ if (mEl === el) continue;
25029
+ let onChain = false;
25030
+ /* 用 parentElement 走链(不用 contains:桩 DOM/老引擎上不一定有) */
25031
+ for (let q = el.parentElement, k = 0; q && k < 40; q = q.parentElement, k++) { if (q === mEl) { onChain = true; break } }
25032
+ if (onChain) { targets.add(mEl); kept = true; break }
25033
+ }
25034
+ if (kept) continue;
25001
25035
  let blockedByGlass = false;
25036
+ /* ②(2026-10-05 审查建议) 只在弹层**真的压在这个祖先上面**(矩形相交)时才考虑摘:
25037
+ 菜单飘在屏幕另一头时摘它纯属白丢磨砂,还平白制造一次重绘。 */
25038
+ const ownRect = (() => { try { return el.getBoundingClientRect() } catch (e) { return null } })();
25002
25039
  for (let p = el.parentElement, n = 0; p && p !== document.body && p !== document.documentElement && n < 12; p = p.parentElement, n++) {
25003
25040
  let acs = null;
25004
25041
  try { acs = getComputedStyle(p) } catch (e) { break }
@@ -25008,13 +25045,38 @@ body[data-mpw-modal] [role="dialog"] {
25008
25045
  它是用户能看到的那层模糊(真机现场:子代理展开框/输入框卡片被我们摘掉 blur 之后
25009
25046
  "模糊背景没有了"——正是之前夸过的那处效果)。判据 = 它有可见底色(α ≥ 0.05)。
25010
25047
  这种情况下改为把**弹层自己的表面做实在**(不能糊到页面背后,就别假装是玻璃)。 */
25011
- if (mpwColorAlpha(acs.backgroundColor) >= 0.05) { blockedByGlass = true; break }
25048
+ /* ②(2026-10-05 真机复核) 判据收紧到"**它自己也是我们管的弹层表面**":
25049
+ 子代理展开框/后台任务面板这类"用户正在看的面板"本身就在我们的弹层表面集合里
25050
+ ⇒ 摘它的 blur = 把用户看得见的那层玻璃删掉(真机回归)。
25051
+ 而输入框卡片 `uV2eYG_card`(有底、有 blur,但**不是**弹层表面)只是"碰巧挡在
25052
+ 弹层前面的包装" ⇒ 摘掉它的 blur 换来弹层真模糊,代价是"菜单打开期间它自己不糊"。
25053
+ 真机读数支持这条:四个弹层里只有 body 下的模型选择器有模糊,另三个全被卡片截断。 */
25054
+ try {
25055
+ if (ownRect && ownRect.width > 0 && ownRect.height > 0) {
25056
+ const pr = p.getBoundingClientRect();
25057
+ const overlap = pr.width > 0 && pr.height > 0
25058
+ && ownRect.left < pr.right && ownRect.right > pr.left
25059
+ && ownRect.top < pr.bottom && ownRect.bottom > pr.top;
25060
+ if (!overlap) continue; // 没压住它 ⇒ 不动它的 blur
25061
+ }
25062
+ } catch (e) { /* 量不到就按"压住"处理(保守:保功能) */ }
25063
+ let ancestorIsSurface = false;
25064
+ try { ancestorIsSurface = p.matches(MPW_POP_TAG_SEL) } catch (e) {}
25065
+ if (ancestorIsSurface) { blockedByGlass = true; break }
25066
+ /* ②(2026-10-05 审查后收紧) **只摘"已知包装容器"的 blur**:真机定案的截断者只有一类 ——
25067
+ 输入框卡片这类"碰巧挡在弹层前面的包装"(类名含 `_card` / `composer` / `overlayAnchor`)。
25068
+ 其余任何带 blur 的祖先(标题栏里的子代理展开框、后台任务面板、别的宿主面板)**一律不碰**:
25069
+ 它们是用户**正在看**的玻璃,摘掉就是"效果没了"(真机已因此报过一次)。
25070
+ 代价:包在未知面板里的弹层保持"半透明无模糊"——这是**保守但不会破坏用户看得见的东西**的一侧。 */
25071
+ let strippableWrap = false;
25072
+ try { strippableWrap = /(_card|composer|overlayAnchor|_seat|_stack)/i.test(String(p.className || "")) } catch (e) {}
25073
+ if (!strippableWrap) { blockedByGlass = true; break }
25012
25074
  targets.add(p);
25013
25075
  break;
25014
25076
  }
25015
25077
  if (blockedByGlass) truncated.add(el);
25016
25078
  }
25017
- const stale = document.querySelectorAll("[data-mpw-pop-untrunc]");
25079
+ const stale = markedNow;
25018
25080
  for (let i = 0; i < stale.length; i++) { const el = stale[i]; if (!targets.has(el)) { try { el.removeAttribute("data-mpw-pop-untrunc") } catch (e) {} } }
25019
25081
  for (const el of targets) { if (!el.hasAttribute("data-mpw-pop-untrunc")) { try { el.setAttribute("data-mpw-pop-untrunc", "") } catch (e) {} } }
25020
25082
  /* 被"有底的玻璃祖先"挡住的那批:标记在**弹层自己**身上(绝不碰宿主元素),由 CSS 给实底 */
@@ -25022,7 +25084,26 @@ body[data-mpw-modal] [role="dialog"] {
25022
25084
  for (let i = 0; i < staleT.length; i++) { const el = staleT[i]; if (!truncated.has(el)) { try { el.removeAttribute("data-mpw-pop-trunc") } catch (e) {} } }
25023
25085
  for (const el of truncated) { if (!el.hasAttribute("data-mpw-pop-trunc")) { try { el.setAttribute("data-mpw-pop-trunc", "") } catch (e) {} } }
25024
25086
  if (targets.size) mpwPopUntruncStyle();
25025
- else if (popUntruncStyleEl && popUntruncStyleEl.parentElement) { try { popUntruncStyleEl.remove() } catch (e) {} popUntruncStyleEl = null; }
25087
+ else if (popUntruncStyleEl && popUntruncStyleEl.parentElement) {
25088
+ /* ②(2026-10-05 审查建议) 撤除也要**瞬时**:宿主若给这些元素写了 transition,
25089
+ 直接撤规则会反向播一次"清晰→磨砂"的可感知跳变。先注入一条"禁过渡 + 保持 none",
25090
+ 下一帧再真正撤掉。 */
25091
+ try {
25092
+ const kill = document.createElement("style");
25093
+ kill.setAttribute("data-plugin", "dsh-mpkg-wallpaper");
25094
+ kill.setAttribute("data-mpw-pop-untrunc-kill", "");
25095
+ kill.textContent = "[data-mpw-pop-untrunc]{transition:none !important;backdrop-filter:none !important;-webkit-backdrop-filter:none !important}";
25096
+ (document.head || document.documentElement).appendChild(kill);
25097
+ setTimeout(() => {
25098
+ try { kill.remove() } catch (e) {}
25099
+ try { if (popUntruncStyleEl && popUntruncStyleEl.parentElement) popUntruncStyleEl.remove() } catch (e) {}
25100
+ popUntruncStyleEl = null;
25101
+ }, 0);
25102
+ } catch (e) {
25103
+ try { popUntruncStyleEl.remove() } catch (e2) {}
25104
+ popUntruncStyleEl = null;
25105
+ }
25106
+ }
25026
25107
  return targets.size + truncated.size * 1000; // 千位段 = 被"有底玻璃祖先"挡住、改为实底的弹层数
25027
25108
  } catch (e) { return 0 }
25028
25109
  }
@@ -25031,6 +25112,7 @@ body[data-mpw-modal] [role="dialog"] {
25031
25112
  globalThis.__mpwPopUntruncTest = {
25032
25113
  sync: () => mpwPopUntruncSync(),
25033
25114
  stylePresent: () => !!(popUntruncStyleEl && popUntruncStyleEl.parentElement),
25115
+ killPresent: () => !!document.querySelector("[data-mpw-pop-untrunc-kill]"),
25034
25116
  };
25035
25117
  } catch (e) {}
25036
25118
 
@@ -25069,17 +25151,20 @@ body[data-mpw-modal] [role="dialog"] {
25069
25151
  之后面板出现就变成两层(真机读数:dockPane/dockStrip 仍是 0.55)。
25070
25152
  这里与弹层标记共用同一个 rAF 合并的入口(要素很少,代价可忽略)。 */
25071
25153
  try { mpwTagSurfaceOuter(); } catch (e) {}
25154
+ try { mpwSideLiftSync(); } catch (e) {}
25072
25155
  /* ①(P3) 弹层开着 ⇒ 摘截断祖先的 blur;关了 ⇒ 还原(同一入口,随突变重算) */
25073
25156
  try { mpwPopUntruncSync(); } catch (e) {}
25074
25157
  } catch (e) {}
25075
25158
  };
25076
25159
  try {
25077
- popTagWatch = new MutationObserver(() => {
25160
+ popTagWatch = new MutationObserver((records) => {
25161
+ /* 同步快路:新增的弹层当场判定打标(消灭"先白后变"的过渡态) */
25162
+ try { mpwTagPopoverFast(records); } catch (e) {}
25078
25163
  if (praf) return;
25079
25164
  try { praf = (typeof requestAnimationFrame === "function") ? requestAnimationFrame(prun) : setTimeout(prun, 16); }
25080
25165
  catch (e) { prun(); }
25081
25166
  });
25082
- popTagWatch.observe(document.body, { childList: true, subtree: true });
25167
+ popTagWatch.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ["class", "style", "data-state", "aria-expanded", "hidden"] });
25083
25168
  } catch { popTagWatch = null; }
25084
25169
  mpwTagPopoverBg();
25085
25170
  try { mpwPopUntruncSync(); } catch (e) {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mpkg-wallpaper",
3
- "version": "3.15.7",
3
+ "version": "3.15.9",
4
4
  "description": "DSH Web 壁纸引擎 Wallpaper Engine mpkg 背景插件:浏览器内直接解析 .mpkg(preview.gif 动态背景/内嵌 mp4 视频/多时段切换),整屏统一虚化/对话框/弹层/遮罩独立虚化、镜头缩放平移、时钟、冲突检测。",
5
5
  "private": false,
6
6
  "type": "module",