@linxin666/dsh-client-ui-skin-center 0.4.2 → 0.4.4

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.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # node scripts/verify-docs.mjs --write <dir>
5
- README.md: 8b34505d28cb73c142cf095bde313a15a25ca9d5
6
- README.zh.md: a160ba8c5e3e0e6650284ec86be989b2586c3c78
5
+ README.md: 8fc72ea8f5f3518ef2ca8c2149ab02924dbdc8db
6
+ README.zh.md: 7ed5f3ff164123f0381713bab88161ec37f7ebba
package/README.md CHANGED
@@ -11,10 +11,26 @@ English | [中文](README.zh.md)
11
11
  - Skin format (v2): `skin.json` (validated fail-closed, v1 fields `package`/`wiring`/`bodyAttr` ignored with migration warnings), `skin.css` (L1 token remaps + L2 semantic selectors), optional `patches.css` (L3 free selectors, high sensitivity), optional `hooks.mjs` (trusted escape hatch, high sensitivity), `assets/`, `preview/`. All CSS passes the safety pipeline (`src/core/css-safety/transform.ts`): every selector is force-scoped under `html[data-dsh-skin]`, `@import` / remote or protocol-relative URLs / escaping paths are hard errors. See `contracts/README.md`.
12
12
  - Coverage contract: L1 remaps the official `--dsw-*` design tokens; L2 styles the semantic attributes (`data-dsh-surface` / `data-dsh-part` / `data-dsh-plugin`, enumeration in `contracts/semantic-attrs-v1.md`) which a compat adapter (`src/client/runtime/semantic-adapter.ts`) stamps onto the official shell DOM from stable anchors (`data-slot` outlets, `data-chat-flow-kind`, etc.); L3 patches carry any selector at the skin author's own risk. Plugins that output the semantic attributes themselves get the full L2 coverage; plugins that do not only get L1. A shared shell-rendering adapter applies only while a catalog skin, custom theme or wallpaper is active: it removes the workspace-list end fade, gives the composer placeholder an opaque theme-secondary text color, and reserves bottom clearance on conversation scrollports so messages remain readable above the sticky composer (#978), so individual skins do not need duplicate patches.
13
13
  - Background priority: a Wallpaper Engine wallpaper always wins over the user manual background scrim, which wins over the skin's manifest background media; toggling the wallpaper re-evaluates the priority live.
14
- - Background controls: a background-occlusion slider (0–100%) veils the backdrop behind the panels for skins that paint one, two per-state Gaussian-blur sliders (0–20 px) control the backdrop for empty and populated conversations, an input-card blur slider (0–20 px) controls only the frosted area behind the composer, and a bubble-opacity slider (0–100%) drives translucent message bubbles for skins that expose bubble alpha. Wallpaper-wide blur remains an independent wallpaper setting. The active background blur uses a fixed `backdrop-filter` element behind the shell; 0 disables it entirely (no element, no GPU cost).
14
+ - Background controls: a background-occlusion slider (0–100%) veils the backdrop behind the panels for skins that paint one, two per-state Gaussian-blur sliders (0–20 px) control the backdrop for empty and populated conversations, an input-card blur slider (0–20 px) controls only the frosted area behind the composer, and a bubble-opacity slider (0–100%) drives translucent message bubbles for skins that expose bubble alpha. Wallpaper-wide blur remains an independent wallpaper setting. The active background blur uses a fixed `backdrop-filter` element behind the shell; 0 disables it entirely (no element, no GPU cost). The input-card frost rides its own body-level fixed follower (the `data-dsh-composer-frost` element) sized to the composer card, never the card itself: a `backdrop-filter` on the card would make it the containing block for the shell's fixed tooltips inside it and jolt the conversation on every hover.
15
15
  - Wallpaper Engine bridge: the card can use the machine's local Wallpaper Engine library as the GUI backdrop. The host half (`src/we-library.ts` + `src/we-routes.ts`) locates the WE install (Steam app 431960: registry, every path in `libraryfolders.vdf`, durable `appmanifest_431960.acf` ownership, and probe paths on Windows), scans its projects and workshop content plus optional manual folders, and serves the inventory, media (Range-streamed), previews, web-wallpaper project files (with the WE API shim injected), and scene main-texture PNGs (decoded in-process from PKG/TEX by `src/pkg-extract.ts`, cached on disk) through same-origin `/api/skin-center/we/*` routes. Video wallpapers render in a `<video>`, web wallpapers in a sandboxed `<iframe>`, scene wallpapers live in the built-in WebGL player (2D layered scenes and 3D model scenes replayed with WE material/shader semantics); scene-embedded scripts are ignored while supported image, reflection, water and particle passes remain live, and a "static frame" render mode pins a zero-animation-cost image for any type. Per-wallpaper Import copies the project into `<harness-home>/skin-center/wallpapers/` so it survives Steam library changes, with update detection against the workshop original. Wallpapers are the user's own local files and are never uploaded or redistributed — Workshop content belongs to its authors. The Manual folders row accepts loose `.mp4`/`.webm` media, one project, a project collection, a Wallpaper Engine install root, or a Steam library root (`~` expands to the home directory).
16
16
  - Legacy migration: on the first boot after the v2 upgrade, a one-shot bridge (`src/legacy-bridge.ts`) reads the retired `dsh-skin` managed section from the harness home `cordis.patch.yml` (where the v1 CLI wrote it; the active profile's `cordis.patch.yml` is probed as a secondary location), migrates the active skin id into the v2 selection store, and strips the legacy rows. The migration is idempotent and fails closed (the old state stays untouched on any error). It logs only when it migrated, cleaned, or failed — the nothing-to-migrate steady state stays silent (issue #788).
17
17
 
18
+ ## Most popular skins
19
+
20
+ The three most-liked skins in the Workshop's skin category on [dsh-market.com](https://dsh-market.com), in the site's default popularity order:
21
+
22
+ | Skin | Author | Look |
23
+ |---|---|---|
24
+ | [Abyssal Maid Atelier](https://dsh-market.com/#skin:maid-atelier) (`maid-atelier`) | Small-tailqwq | Twin-maid atelier backdrop, deep-sea blue lace surfaces and a chibi sidebar |
25
+ | [Whale Song](https://dsh-market.com/#skin:whale-song) (`whale-song`) | dsh-web | Deep-sea whale goddess backdrop, ice-blue ocean palette and gold hairlines |
26
+ | [Blue Fantasy](https://dsh-market.com/#skin:blue-fantasy) (`blue-fantasy`) | powerdog996 (DreamSkin community), adapted by dsh-web | Whale-illustration backdrop, periwinkle indigo palette and translucent panels |
27
+
28
+ | Abyssal Maid Atelier | Whale Song | Blue Fantasy |
29
+ |---|---|---|
30
+ | ![Abyssal Maid Atelier](skins/maid-atelier/preview/light.jpg) | ![Whale Song](skins/whale-song/preview/light.jpg) | ![Blue Fantasy](skins/blue-fantasy/preview/light.jpg) |
31
+
32
+ Install any of them from the Workshop in one click; `blue-fantasy` is also the skin this package ships as its built-in default.
33
+
18
34
  ## Install
19
35
 
20
36
  ```sh
@@ -51,7 +67,7 @@ skin-center is a self-contained bundle meeting the official DSH plugin standard
51
67
 
52
68
  ## Telemetry
53
69
 
54
- The browser half sends one anonymous install heartbeat per UTC day to dsh-market.com: a random localStorage id plus this package's name, nothing else. The server stores only a salted hash of that id, never IP addresses, and exposes aggregate counts only. See [docs/telemetry.md](../../../docs/telemetry.md) for the full contract.
70
+ The browser half sends one anonymous install heartbeat per UTC day to dsh-market.com: a random localStorage id plus this package's name, nothing else. The server stores only a salted hash of that id, never IP addresses, and exposes aggregate counts only. See [docs/telemetry.md](../../docs/telemetry.md) for the full contract.
55
71
 
56
72
  ## Directory structure
57
73
 
package/README.zh.md CHANGED
@@ -11,10 +11,26 @@
11
11
  - 皮肤格式(v2):`skin.json`(fail-closed 校验,v1 字段 `package`/`wiring`/`bodyAttr` 忽略并给迁移警告)、`skin.css`(L1 token 重映射 + L2 语义选择器)、可选 `patches.css`(L3 自由选择器,高敏感)、可选 `hooks.mjs`(受信逃逸舱,高敏感)、`assets/`、`preview/`。所有 CSS 经过安全管线(`src/core/css-safety/transform.ts`):每个选择器强制限定在 `html[data-dsh-skin]` 下,`@import` / 远程或协议相对 URL / 越界路径直接报错。见 `contracts/README.md`。
12
12
  - 覆盖契约:L1 重映射官方 `--dsw-*` 设计 token;L2 样式语义属性(`data-dsh-surface` / `data-dsh-part` / `data-dsh-plugin`,枚举见 `contracts/semantic-attrs-v1.md`),由兼容适配器(`src/client/runtime/semantic-adapter.ts`)从稳定锚点(`data-slot` 出口、`data-chat-flow-kind` 等)为官方壳层 DOM 打标;L3 补丁任意选择器,脆弱性由皮肤作者自负。主动输出语义属性的插件获得完整 L2 覆盖;不输出的只享受 L1。目录皮肤、自定义主题或壁纸激活期间还会启用公共壳层渲染适配器:它清除工作区列表末端 fade,将 composer 占位符固定为不透明的主题次级文本色,并为会话滚动口保留底部安全间距以保证吸底正文不被输入区覆盖(#978),各皮肤无需重复补丁。
13
13
  - 背景优先级:Wallpaper Engine 壁纸永远优先于用户手动背景遮罩,后者优先于皮肤清单背景媒体;开关壁纸会实时重估优先级。
14
- - 背景控制:背景遮蔽滑杆(0–100%)为画背景的皮肤在面板后加纱,两个按状态的高斯模糊滑杆(0–20 px)分别控制空对话与有内容时的背景,输入卡模糊滑杆(0–20 px)只控制输入卡背后的磨砂区域,气泡不透明度滑杆(0–100%)控制支持气泡 alpha 的皮肤消息气泡。整张壁纸模糊仍是独立的壁纸设置。背景模糊通过外壳之后的固定 `backdrop-filter` 元素施加;0 完全关闭(无元素、无 GPU 开销)。
14
+ - 背景控制:背景遮蔽滑杆(0–100%)为画背景的皮肤在面板后加纱,两个按状态的高斯模糊滑杆(0–20 px)分别控制空对话与有内容时的背景,输入卡模糊滑杆(0–20 px)只控制输入卡背后的磨砂区域,气泡不透明度滑杆(0–100%)控制支持气泡 alpha 的皮肤消息气泡。整张壁纸模糊仍是独立的壁纸设置。背景模糊通过外壳之后的固定 `backdrop-filter` 元素施加;0 完全关闭(无元素、无 GPU 开销)。输入卡磨砂由独立的 body 级固定跟随层(`data-dsh-composer-frost` 元素)承担并按输入卡尺寸跟随,**不**挂在卡片本体上:卡片一旦带 `backdrop-filter` 就会成为其中 shell fixed tooltip 的包含块,悬停时整页会话会被顶动。
15
15
  - Wallpaper Engine 桥:卡片可把本机 Wallpaper Engine 库用作 GUI 背景。host 半区(`src/we-library.ts` + `src/we-routes.ts`)定位 WE 安装(Steam 应用 431960:Windows 注册表、`libraryfolders.vdf` 中的全部库路径、持久的 `appmanifest_431960.acf` 所有权事实与探测路径),扫描项目与创意工坊内容及可选手动文件夹,经同源 `/api/skin-center/we/*` 路由提供清单、媒体(Range 流式)、预览图、web 壁纸项目文件(注入 WE API shim)与场景壁纸主贴图 PNG(由 `src/pkg-extract.ts` 进程内解码 PKG/TEX,磁盘缓存)。视频壁纸用 `<video>` 渲染,web 壁纸用沙箱 `<iframe>`,场景壁纸经内置 WebGL 播放器实时渲染(2D 图层场景与 3D 模型场景按 WE 材质/着色器语义回放);场景内嵌脚本会被忽略,但受支持的图像、反射、水面与粒子通道仍保持实时渲染,「静态帧」模式可为任意类型钉一张零动画开销的图。单张壁纸的导入会把项目复制进 `<harness-home>/skin-center/wallpapers/`,脱离 Steam 库变更也能用,并检测创意工坊原作更新。壁纸都是用户本机文件,从不上传或再分发——创意工坊内容归原作者。「手动文件夹」行可接收零散 `.mp4`/`.webm` 媒体、单个项目、项目合集、Wallpaper Engine 安装根目录或 Steam 库根目录(`~` 展开为主目录)。
16
16
  - 旧版迁移:v2 升级后的首次启动,一次性桥(`src/legacy-bridge.ts`)读取 harness home 根 `cordis.patch.yml`(v1 CLI 写入处;活动 profile 的 `cordis.patch.yml` 作为次级位置也会探测)里已退役的 `dsh-skin` 受管段,把活动皮肤 id 迁进 v2 选择存储,并清除旧行。迁移幂等且 fail-closed(出错时旧状态原样保留)。仅在发生迁移、清理或失败时输出日志,无 legacy 状态的稳态保持静默(issue #788)。
17
17
 
18
+ ## 人气皮肤
19
+
20
+ [dsh-market.com](https://dsh-market.com) 创意工坊皮肤分类里人气最高的三款皮肤,按网站默认的「按人气」排序:
21
+
22
+ | 皮肤 | 作者 | 外观 |
23
+ |---|---|---|
24
+ | [深海女仆工坊](https://dsh-market.com/#skin:maid-atelier)(`maid-atelier`) | Small-tailqwq | 双女仆工坊背景、深海蓝蕾丝界面与 Q 版侧栏 |
25
+ | [鲸吟](https://dsh-market.com/#skin:whale-song)(`whale-song`) | dsh-web | 深海鲸语女神背景 · 冰蓝海洋调色板 · 金色细线点缀 |
26
+ | [蓝色幻想](https://dsh-market.com/#skin:blue-fantasy)(`blue-fantasy`) | powerdog996(DreamSkin 社区)· dsh-web 适配 | 鲸鱼插画背景 · periwinkle 靛蓝调色板 · 半透明面板 |
27
+
28
+ | 深海女仆工坊 | 鲸吟 | 蓝色幻想 |
29
+ |---|---|---|
30
+ | ![深海女仆工坊](skins/maid-atelier/preview/light.jpg) | ![鲸吟](skins/whale-song/preview/light.jpg) | ![蓝色幻想](skins/blue-fantasy/preview/light.jpg) |
31
+
32
+ 三款都可从创意工坊一键安装;其中 `blue-fantasy` 同时也是本包内置的默认皮肤。
33
+
18
34
  ## 安装
19
35
 
20
36
  ```sh
@@ -51,7 +67,7 @@ dsh plugin --profile web add @linxin666/dsh-client-ui-skin-center
51
67
 
52
68
  ## 数据遥测
53
69
 
54
- 浏览器半区每个 UTC 日向 dsh-market.com 发送一次匿名安装心跳:仅含一个 localStorage 随机 ID 与本包名,无其他数据。服务端只存储该 ID 的加盐哈希,不存 IP,且只暴露聚合计数。完整契约见 [docs/telemetry.md](../../../docs/telemetry.md)。
70
+ 浏览器半区每个 UTC 日向 dsh-market.com 发送一次匿名安装心跳:仅含一个 localStorage 随机 ID 与本包名,无其他数据。服务端只存储该 ID 的加盐哈希,不存 IP,且只暴露聚合计数。完整契约见 [docs/telemetry.md](../../docs/telemetry.md)。
55
71
 
56
72
  ## 目录结构
57
73
 
@@ -43,9 +43,10 @@
43
43
  | `data-dsh-backdrop-active` | html + body(body/html 级,另行管理) | 皮肤背景媒体(`backgroundMedia`)或 WE 壁纸任一挂载期间置 `true`(`backdrop-scene.ts` 汇总双侧来源),卸载 / 禁用清净;供 composer seat 遮罩统一中和与输入区前置磨砂面板规则锚定,皮肤与壁纸场景行为一致(#777) |
44
44
  | `data-dsh-conversation-content` | html + body(body/html 级,另行管理) | 当前对话存在消息行(`[data-chat-anchor-key]`)期间置 `true`;`backdrop-scene.ts` 在背景可见时随 MutationObserver 更新。输入卡磨砂仅在 backdrop-active 且本标记置位时启用,空对话不显示多余模糊(#777 follow-up) |
45
45
  | `data-dsh-wallpaper-active` | html + body(body/html 级,另行管理) | WE 壁纸挂载期间置 `true`,卸载 / 禁用清除;供皮肤 CSS 与壁纸中和规则锚定(#734) |
46
+ | `data-dsh-composer-frost` | body 级空元素(元素级,owner: skin-center) | 皮肤中心在 backdrop-active 且 conversation-content 置位期间挂载的输入卡磨砂层:body 级 fixed 兄弟元素,按输入卡 border box 跟随(rAF 合并测量),仅承载 `backdrop-filter`;标记清除即移除。磨砂**不能**挂在输入卡上——非 none 的 `backdrop-filter` 会让卡片成为其 fixed 后代的包含块,把官方 tooltip 推进会话滚动口并撑高 `scrollHeight`(#1724) |
46
47
  | `data-dsh-wallpaper-surface` | 官方 shell 全视口背景元素 + 侧栏工作区淡化条(元素级) | `WallpaperController.markWallpaperSurfaces()` 在 WE 壁纸挂载期间打标(全视口 bg-base 背景 + `data-slot="sidebar.workspaces"` 内渐变淡化条),命中 `html[data-dsh-wallpaper-active] [data-dsh-wallpaper-surface]` 中和;卸载清除,不含哈希类依赖(#734) |
47
48
 
48
- ## part 组(79 行,含各 owner 行)
49
+ ## part 组(81 行,含各 owner 行)
49
50
 
50
51
  shell 区域(owner: shell):
51
52
 
@@ -65,7 +66,7 @@ family / 插件区域:
65
66
 
66
67
  | data-dsh-part | owner | 含义 / 锚定方式 |
67
68
  | --- | --- | --- |
68
- | `sidebar-entry` | family | 插件注入的侧栏入口行;`[data-dsh-*-entry]` |
69
+ | `sidebar-entry` | shell(行盒)+ 注册插件(身份) | 插件经 `sidebar.panellist` 注册的侧栏面板行(任务看板 / ssh / 技能中心;官方 Plugins / Schedule 行不属此值)。行盒归 shell,兼容适配器按 `[class*="panelRow"]:has([data-dsh-panel-entry])` 补打——CSS-module 后缀 + 插件字形身份,同 `new-session` 手法;上游诉求见下文脆弱点 2 |
69
70
  | `header` | task-board | 看板头;`[data-dsh-taskboard-board] > header` |
70
71
  | `column` | task-board | 状态列;`section[data-status]` |
71
72
  | `card` | task-board | 任务卡;列内 `[data-status]` 条目 |
@@ -92,16 +93,16 @@ family / 插件区域:
92
93
  | `summon-button` | pet | 召唤钮;`[data-testid="pet-summon"]` |
93
94
  | `preset-panel` | preset-center | 创意工坊「预设」标签页面板根;`[data-dsh-plugin="preset-center"] [data-dsh-part="preset-panel"]` |
94
95
  | `plugin-item` | web-ui-settings | 家族插件设置卡;`[data-slot="web-ui.plugin.item"]` 内 entry |
95
- | `head` | skill-explorer | 技能中心模态卡头部;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="card"] > header` |
96
- | `card` | skill-explorer | 技能中心模态卡;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="card"]` |
97
- | `tab-bar` / `tab` | skill-explorer | 技能中心页签条/页签;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab-bar"]` / `[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab"]` |
96
+ | `tab-bar` / `tab` | skill-explorer | 技能中心页签条/页签(中间列面板,同 ssh);`[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab-bar"]` / `[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab"]` |
98
97
  | `skill-row` | skill-explorer | 技能卡行;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="skill-row"]` |
99
- | `filter-bar` | skill-explorer | 技能列表筛选条(搜索框 + 工作区选择);`[data-dsh-plugin="skill-explorer"] [data-dsh-part="filter-bar"]` |
98
+ | `filter-bar` | skill-explorer | 技能列表筛选条(搜索框 + 工作区选择 + 刷新);`[data-dsh-plugin="skill-explorer"] [data-dsh-part="filter-bar"]` |
100
99
  | `entry` | session-id | 侧栏 footer 触发器;`button[data-dsh-part="entry"]`(`[data-dsh-plugin="session-id"]` 容器内) |
101
100
  | `panel` | session-id | 会话 ID 模态面板;`[role="dialog"]` 根(`[data-dsh-part="panel"]`) |
102
101
  | `row` | session-id | 会话列表行;面板内行容器(`[data-dsh-part="row"]`) |
103
102
  | `copy` | session-id | 每行复制按钮;`button[data-dsh-part="copy"]` |
104
103
  | `search` | session-id | 面板搜索输入框;`input[type="search"][data-dsh-part="search"]` |
104
+ | `entry` | dsh-update | 侧栏 footer 更新触发器;`[data-dsh-plugin="update"] [data-dsh-part="entry"]` |
105
+ | `panel` | dsh-update | 更新面板模态根;`[data-dsh-plugin="update"] [data-dsh-part="panel"]` |
105
106
  | `sprite` | miku-pet | 宠物帧舞台;`[data-dsh-plugin="miku-pet"] [data-dsh-part="sprite"]` |
106
107
  | `menu` | miku-pet | 悬停菜单(两级);`[data-dsh-part="menu"]` |
107
108
  | `stats` | miku-pet | 左侧属性彩条;`[data-dsh-part="stats"]` |
@@ -136,17 +137,33 @@ family / 插件区域:
136
137
  | `lever-burst` | liangshen | 拨下命中后的中奖特效浮层(闪光 / 冲击环 / 火花 / 横幅);`[data-dsh-part="lever-burst"]`,`prefers-reduced-motion` 下退化为淡出 |
137
138
  | `lever-banner` | liangshen | 特效中的梁神横幅(模式名 + 文言文/二进制/摩斯三行);burst 内 `[data-dsh-part="lever-banner"]` |
138
139
 
139
- ## plugin 组(13 个)
140
+ ### 面板行身份锚点 `data-dsh-panel-entry`(owner: 各注册面板的插件)
141
+
142
+ `sidebar.panellist` 的行盒、标签与选中态归 shell,插件的客户端代码在这行里**只**
143
+ 拥有自己的字形(`renderSlot('sidebar.panellist', …, { only: id })` 的返回值,落在
144
+ shell 的 `[class*="panelGlyph"]` 内)。shell 目前不把 entry id 透传到 DOM,因此行身份
145
+ 由**字形自带**该属性,皮肤用 `:has()` 从行反查归属:
146
+
147
+ | 属性 | owner | 取值 / 锚定方式 |
148
+ | --- | --- | --- |
149
+ | `data-dsh-panel-entry` | task-board / ssh / skill-explorer | 面板行字形的 `id`(与注册进 `sidebar.panellist` 的 entry id、`main` 槽的 key 同源),即 `task-board` / `ssh` / `skill-explorer`;行级选择器形如 `[data-dsh-part="sidebar-entry"]:has([data-dsh-panel-entry="ssh"])` |
150
+
151
+ 该属性独立于 surface / part / plugin 三组(与 `data-dsh-usage-foot-card` 同类,见纪律节),
152
+ 不进 `data-dsh-plugin`:plugin 属性标记插件面板根,皮肤里已有
153
+ `[data-dsh-plugin="ssh"] [class*="panel"]` 一类把根当作面板子树起点的规则,把字形也算进去会误伤。
154
+
155
+ ## plugin 组(14 个)
140
156
 
141
157
  | data-dsh-plugin | owner | 锚定方式 |
142
158
  | --- | --- | --- |
143
- | `task-board` | dsh-task-board | `[data-dsh-taskboard-view]` / `[data-dsh-taskboard-entry]` / slot entry id |
144
- | `ssh` | dsh-ssh | `[data-dsh-ssh-view]` / `[data-dsh-ssh-entry]` |
159
+ | `task-board` | dsh-task-board | `[data-dsh-taskboard-view]` / 面板行字形 `[data-dsh-panel-entry="task-board"]` / `sidebar.panellist` entry id |
160
+ | `ssh` | dsh-ssh | `[data-dsh-ssh-view]` / 面板行字形 `[data-dsh-panel-entry="ssh"]` |
145
161
  | `git-graph` | dsh-git-graph | slot entry id `git-graph`;`[data-gitgraph-chip-anchor]` / `[data-gitgraph-dialog]` |
146
162
  | `pet` | dsh-pet | `[data-dsh-pet-root]`;一级设置分区 settings.section id `pet`(只列内置与已安装宠物) |
147
163
  | `remote-web-ui` | dsh-remote-web-ui | slot entry id `remote-web-ui` |
164
+ | `update` | dsh-update | footer action slot entry id `update`;`[data-dsh-plugin="update"]`(面板根 + 入口触发器) |
148
165
  | `web-ui-settings` | dsh-web-settings | settings.section id `web-ui-plugins` |
149
- | `skill-explorer` | dsh-skill-explorer | `[data-dsh-skill-explorer-view]` / `[data-dsh-skill-explorer-entry]` |
166
+ | `skill-explorer` | dsh-skill-explorer | `[data-dsh-skill-explorer-view]` / 面板行字形 `[data-dsh-panel-entry="skill-explorer"]` |
150
167
  | `dsh-web-ui-market` | dsh-market | 创意工坊商店一级页(settings.section id `dsh-web-ui-market`),商店卡与目录条目容器 |
151
168
  | `skin-center` | skins/skin-center | 一级设置分区 settings.section id `skin-center`(列已安装皮肤,属内置源时显式标记) |
152
169
  | `session-id` | dsh-session-id | footer action slot entry id `session-id`;`[data-dsh-plugin="session-id"]`(面板 overlay 根 + 入口触发器) |
@@ -158,6 +175,6 @@ family / 插件区域:
158
175
  ## 已知脆弱点(上游主题缝 PR 诉求)
159
176
 
160
177
  1. AppFrame 三列容器本体只有 hash 类,列级钩子缺失 → 诉求:三列自带稳定 data 钩子。
161
- 2. 侧栏导航行无官方 slot,插件靠 DOM 注入 → 诉求:sidebar 导航 list slot。
178
+ 2. 侧栏导航行已有官方 list slot(`sidebar.panellist`,2026-09 面板家族迁移后插件不再注入 DOM),但行盒本体仍只有 CSS-module 类、无稳定 data 钩子 → 诉求:`sidebar.panellist` 的行盒自带稳定属性(现由兼容适配器从 `[class*="panelRow"]:has([data-dsh-panel-entry])` 补打 `sidebar-entry`,见 part 组)。
162
179
  3. 设置模态只有 `role="dialog"`(与其他对话框撞车)→ 诉求:设置 dialog 根专属标识。
163
- 4. list slot 的单 entry 无 DOM 归属标识 → 诉求:slot entry 渲染透传 entry id 到 DOM。
180
+ 4. list slot 的单 entry 无 DOM 归属标识 → 诉求:slot entry 渲染透传 entry id 到 DOM(现由各插件字形自带的 `data-dsh-panel-entry` 代偿,见 part 组末尾)。