Repository navigation
跳到 v0.14.1(仓库里的代码从 0.6.0 一次性更新到 0.14.1,中间 0.7.0 → 0.14.0 的历次改动见 CHANGELOG.md)。
0.14.1
修复:点药丸还是进不了「设置 → 会话喂鱼」。这一版不再猜 DOM,直接调设置面板自己的 store。
-
根因。 设置面板的开合状态(
open/activeId)不是公开 API,是dsh-client-ui-settings-general
自己那个 store 里的状态,而它是挂在槽位注册上的:const shellHandle = createSettingsShellStore(); const shellInstance = shellHandle.create(); const shellStore = { ...shellHandle, create: () => shellInstance }; // 特意 memo 成常量 ctx.slots.register({ name: "sidebar.settings", store: shellStore, children: {…} }, SettingsRoot);
0.14.0 只知道去点 DOM(点侧栏底部的触发器 → 等面板挂载 → 点导航项),
环节多、还要赌懒挂载的时序,用户看到的就是「点了没反应 / 只把设置打开、停在别的分区」。 -
修法(正路)。
SlotCore.entries(key)返回的是原始 entry(不是投影视图),
store就摆在 entry 顶层,所以从插件侧能直接把面板的 store 拿回来:ctx.slots.entries("sidebar.settings")[0].store.create().actions.openSection(NS)
一句
openSection同时展开面板 + 把分区切到我们这一页,不碰 DOM、不等懒挂载。
openPluginSettings()现在先走这条路,命中就返回(openSettingsTrace.step === "store-opened")。 -
DOM 那条路保留为兜底(账本里没有 store 时,或者只有
open()没有openSection()时):visible()改成以el.getClientRects().length > 0为主 —— 渲染器的槽位出口是
display:contents,那种祖先下offsetParent是null,旧写法会把真正的触发器判成不可见。settingsTrigger()在槽位标记缺失时(Windows 侧栏收起时整块footArea都不渲染)
退到[class*='settingsArea']、再退到全文档button[aria-haspopup='dialog']。- 导航项匹配加了关键词兜底(
喂鱼/大白饭/吃会话),只在正式标签会话喂鱼找不到时才用。
-
自检。 控制台
__dshSessionEater.openSettings()现在还会报via(store/dom)、
entries(账本里几条注册)、storeNote(账本那条路为什么没用上:no-ctx/no-api/
no-entry/error)。
0.14.0
这一版按作者的五条复核逐条修:掉图标、点图标不进设置、卡片颜色不协调、拖拽永远是白饭、碗不够大不够高。
- 修复(关键):拖谁都是大白饭。 0.13.0 虽然把三只碗都内联了,但
useRiceModelSrc(id)
是useState(model.url)+useEffect里取图 —— 慢一帧。刷新页面后第一次拖拽时
riceSrcRef.current还是初始值(内联大白饭),于是setDragImage拿到的是白饭;
等 effect 跑完才变成你选的那只。现在内联图同步返回:
if (inline) return model.url;—— 选蛋炒饭,第一次拖就是蛋炒饭。 - 修复:点药丸进不了「会话喂鱼」。 上一版的打开逻辑只轮询
10 × 80ms(0.8 秒),
而设置面板是懒挂载的,面板还没渲染出来就已经放弃。现在:- 触发器从
document.querySelector("[data-slot='sidebar.settings']")(renderer 给每个
槽位出口渲染的稳定锚点)里优先找button[aria-haspopup='dialog'](设置触发器带这个
契约级属性与aria-expanded),再退到button/[class*='trigger']/[role='button']; - 用
requestAnimationFrame逐帧重试,超时 3.6 秒,每过 1 秒补点一次触发器
(只在aria-expanded不是"true"、面板 DOM 也不在场上时才补点 —— 面板开着还点
等于把它关掉); - 「会话喂鱼」导航项只在设置面板这个 dialog(
[data-shortcut-modal='settings'])里找,
面板已经开着时直接点,不走触发器; - 全过程记在
openSettingsTrace里(step/clicks/ms/hasTrigger/hasNav/
expanded/panelOpen,失败终态gave-up),诊断桥多出openSettings()与
tryOpenSettings()两个口子 —— 卡在哪一步,控制台一眼能看到。
- 触发器从
- 修复:卡片颜色和软件不协调。 0.13.0 的卡片写死用
--dsw-alias-bg-module-platform
加一层阴影,浅色主题下是一块偏灰的、和侧栏拼不上的填充。现在运行时采样那一行
自己的底色(sampleSurface(row, slot):从行往上最多 8 层,找第一个不透明的背景,
优先取alpha >= 0.95的实色),写成--dse-surface/--dse-tone,
卡片的底色、描边、hover 全部由它推导(color-mix(in srgb, …)),阴影去掉。
采样不到就退回透明(也就是"跟侧栏长得一样"),不会比原来更难看。 - 修复:容易掉图标。 这条有两个根因,都修了。
- 默认形象指向一条不存在的路由。 「跟随挂件」那一档原来直接用
/dsh-whale/image.png(余额挂件的角色图),但这条路由在本机是 404
(实测GET /dsh-whale/image.png → 404,全盘也没有任何插件注册过它)——
于是每次刷新、每次侧栏重挂,药丸都先加载一次失败、再靠onError换成内置立绘,
中间那一下就是用户看到的"掉图标"。现在先把内置立绘当默认(内联、不可能失败),
同时在后台试加载一次挂件图(useWidgetWhale),确认能用才切过去;
运行时才发现挂掉就撤回结论,不再反复试。探测结论全局只探一次。 - 兜底立绘自己也走宿主路由。 宿主没重启时
API + "/whale.png"也是 404 ——
"想要的源失败 + 兜底也失败 = 头像被摘"。现在whale-fallback.png内联
(WHALE_FALLBACK_DATA,同一个构建脚本生成)。
另外onError从"一次失败就降一级"改成连败计数:连续失败 3 次才收起头像,
中间任何一次成功都清零;图片源一变(换碗、切自定义)计数与"收起"状态一起重置。
- 默认形象指向一条不存在的路由。 「跟随挂件」那一档原来直接用
- 新增:碗更大、更靠上。 默认
rice.size96 → 128,上限 200 → 320。
拖拽时幽灵图的位置从"指针原地"改成"碗浮在指针上方、碗底压着指针":
setDragGhost(true, { x: clientX - size/2, y: clientY - h + 8 })+
setDragImage(ghost, size/2, h * 0.9)—— 拖到会话行上时,碗是对着那一行的。 - 构建流程(内部):
build-rice-models.mjs改成靠显式区域标记定位生成块
(// #region RICE_EXTRA_DATA/// #endregion)。之前靠"找长得像声明的行 + 找收尾的
\t\t};"来切,结果两次把lib/client.js打坏 —— 文件里的 JSDoc 引用了同样的声明
文本、base64 数据行又可能以};开头,切点落进注释里,数据被从中间截断。改标记之后
脚本幂等(--check报"已是最新"),lib/client.js现在约 2.5 MB(三张图 + 兜底立绘全在里面)。