dsh-quick-toc 0.7.7 → 0.7.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.
- package/CHANGELOG.en.md +15 -2
- package/CHANGELOG.md +15 -2
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/lib/client.js +80 -8
- package/package.json +3 -2
package/CHANGELOG.en.md
CHANGED
|
@@ -2,11 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **dsh-quick-toc** are documented here. Chinese version: [CHANGELOG.md](CHANGELOG.md).
|
|
4
4
|
|
|
5
|
+
## [0.7.9] - 2026-09-28
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **The curtain had no drop or retract animation while the system asked for reduced motion (Windows' "animation effects" switched off)**: it appeared and vanished with no movement at all. The curtain now always plays the two, while the rest of the plugin's motion still follows that system setting.
|
|
9
|
+
|
|
10
|
+
## [0.7.8] - 2026-09-27
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- **DSH 0.1.7-rc.2 is supported**: it shares the whole plugin interface with rc.1 (the configuration card still registers into `plugins.item`, `plugins.bundle.config` and the rc line's `settings.plugin.item`, the settings service is still `configForms`, and the Plugins page's slot contract is byte-for-byte rc.1's), so no code change was needed; it was exercised point by point in an isolated environment (host boot, plugin status, the Plugins page's entry and card, a card write landing in the settings document, sessions, panel and curtain).
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **Opening the curtain's search column no longer re-lays out the outline every frame**: the column used to transition its own width, and because the outline is the flex item next to it, every frame re-laid out the whole rendered list (measured on a 34-row list: one width step per frame, ~18ms frames and a 76ms first hitch; the cost grows with the list). The layout now flips once and the movement rides on a transform (the column slides in from off the right edge while the outline is flipped back to where it sat and released), which measured under 32ms for the first frame, with the resting geometry unchanged.
|
|
17
|
+
|
|
5
18
|
## [0.7.7] - 2026-09-27
|
|
6
19
|
|
|
7
20
|
### Fixed
|
|
8
|
-
- **On the 0.1.7 line the
|
|
9
|
-
- **
|
|
21
|
+
- **On the 0.1.7 line the Plugins page had no configuration entry for this plugin**: 0.1.7 removed the whole Settings → Plugins → Plugin configuration page, leaving the configuration card on the bundle page alone (`plugins.bundle.config`, keyed on the npm package name), with no entry for this plugin in the Plugins page's Official group — the settings were unreachable from there. The package now also registers `plugins.item` (`id` `quick-toc`, `order` 50, titled after the panel), and opening that entry shows the card already expanded (both 0.1.7 seats render it with a `view`, so the card starts open there; the rc line's Plugin configuration cell passes no props and keeps the collapsed card list).
|
|
22
|
+
- **Opening the curtain could play its whole drop animation before any of it was seen**: opening the curtain re-lays out the list at the curtain's width, and on a long session that commit is itself a long task, so an animation clock started together with it had already run its 0.46s by the first painted frame (0.7.4 fixed another cause of the same failure: the auto-loader pulling the whole session in at once). The animation is now re-armed once the open state is in the DOM — that layout finishes first, the clock starts after it.
|
|
10
23
|
|
|
11
24
|
## [0.7.6] - 2026-09-24
|
|
12
25
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,11 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
**dsh-quick-toc** 的重要变更都记录在这里。英文版见 [CHANGELOG.en.md](CHANGELOG.en.md)。
|
|
4
4
|
|
|
5
|
+
## [0.7.9] - 2026-09-28
|
|
6
|
+
|
|
7
|
+
### 修复
|
|
8
|
+
- **系统开启「减少动态效果」(Windows 的「动画效果」)时,幕布的展开与收起没有动画**:幕布会直接出现、直接收回,读者看不到展开与收起的过程。现在幕布始终播放展开与收起这两段动画,插件其余动效仍遵循该系统设置。
|
|
9
|
+
|
|
10
|
+
## [0.7.8] - 2026-09-27
|
|
11
|
+
|
|
12
|
+
### 变更
|
|
13
|
+
- **支持 DSH 0.1.7-rc.2**:与 rc.1 共用同一套插件接口(配置卡片仍挂在 `plugins.item`、`plugins.bundle.config` 与 rc 线的 `settings.plugin.item` 上,设置服务仍是 `configForms`,插件管理页的槽位契约与 rc.1 逐字节相同),代码无需改动;隔离环境里逐项实测通过(宿主启动、插件运行状态、插件页条目与卡片、卡片写入落到设置文档、会话、面板与幕布)。
|
|
14
|
+
|
|
15
|
+
### 修复
|
|
16
|
+
- **幕布打开搜索栏时不再逐帧重排大纲**:搜索栏原本过渡自己的宽度,而大纲是与它同行的伸缩项,于是每一帧都要重排整个已渲染列表(34 行的列表实测:每帧一次宽度步进、约 18ms 一帧、首帧卡顿 76ms;列表越长越重)。现在布局只翻转一次,位移交给 transform(搜索栏从右缘外滑入,大纲反向翻转回原位置再释放),实测首帧卡顿降到 32ms 以内,静止时的几何与之前完全一致。
|
|
17
|
+
|
|
5
18
|
## [0.7.7] - 2026-09-27
|
|
6
19
|
|
|
7
20
|
### 修复
|
|
8
|
-
- **0.1.7
|
|
9
|
-
-
|
|
21
|
+
- **0.1.7 线上插件页缺少本插件的配置入口**:0.1.7 移除了「设置 → 插件 → 插件配置」整页,配置卡片只剩组合包页面上的 `plugins.bundle.config`(以 npm 包名为键)一处,插件页「官方」分组里没有本插件的条目,读者在那里找不到设置入口。现在同时注册 `plugins.item`(`id` 为 `quick-toc`、`order` 50、标题取面板名),点开该条目即见已展开的卡片(0.1.7 的两处座位渲染时都带 `view`,卡片因此默认展开;rc 线「插件配置」里那处不带 props,仍是收拢的卡片列表)。
|
|
22
|
+
- **打开幕布时展开动画可能整段播完才被看到**:打开幕布会让列表按幕布的宽度整体重排,长会话里这次提交本身就是一段长任务,动画时钟若与这次提交同时开始,0.46 秒会在首帧绘制之前走完(0.7.4 修的是同一类问题的另一种成因:当时是自动加载把整段会话一次性拉了进来)。现在动画在打开状态写入 DOM 之后重新点火一次,先完成这次布局再开始计时。
|
|
10
23
|
|
|
11
24
|
## [0.7.6] - 2026-09-24
|
|
12
25
|
|
package/README.en.md
CHANGED
|
@@ -42,7 +42,7 @@ A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/
|
|
|
42
42
|
|
|
43
43
|
| Plugin | Supported DSH |
|
|
44
44
|
| --- | --- |
|
|
45
|
-
| **0.7.x** (latest, 0.7.
|
|
45
|
+
| **0.7.x** (latest, 0.7.9) | 0.1.5-rc.3, 0.1.7-alpha.1, 0.1.7-alpha.2, 0.1.7-rc.1, 0.1.7-rc.2 |
|
|
46
46
|
| 0.6.x (0.6.3) | 0.1.5-rc.1, 0.1.5-rc.2 |
|
|
47
47
|
| 0.5.x (0.5.1) | 0.1.5-rc.1, 0.1.5-rc.2 |
|
|
48
48
|
| 0.4.x (0.4.1) | 0.1.5-rc.1, 0.1.5-rc.2 |
|
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
|
|
43
43
|
| 插件版本 | 支持的 DSH 版本 |
|
|
44
44
|
| --- | --- |
|
|
45
|
-
| **0.7.x**(最新,0.7.
|
|
45
|
+
| **0.7.x**(最新,0.7.9) | 0.1.5-rc.3、0.1.7-alpha.1、0.1.7-alpha.2、0.1.7-rc.1、0.1.7-rc.2 |
|
|
46
46
|
| 0.6.x(0.6.3) | 0.1.5-rc.1、0.1.5-rc.2 |
|
|
47
47
|
| 0.5.x(0.5.1) | 0.1.5-rc.1、0.1.5-rc.2 |
|
|
48
48
|
| 0.4.x(0.4.1) | 0.1.5-rc.1、0.1.5-rc.2 |
|
package/lib/client.js
CHANGED
|
@@ -2414,6 +2414,75 @@ window.__ModuleLoader__.load({
|
|
|
2414
2414
|
try { searchRef.current.focus({ preventScroll: true }); }
|
|
2415
2415
|
catch (e) { searchRef.current.focus(); }
|
|
2416
2416
|
}, [searchOpen]);
|
|
2417
|
+
// ---- the curtain's search column: its own box, and the motion that moves it --------
|
|
2418
|
+
// `sheetColW` is how much of the curtain's row the search column claims, and it is
|
|
2419
|
+
// computed HERE (not where the column is built) so the flip effect below keeps a stable
|
|
2420
|
+
// hook list on an empty conversation too — the panel bails out further down, and a hook
|
|
2421
|
+
// added after that point would change the hook count between renders (React #310).
|
|
2422
|
+
var searchColRef = react.useRef(null);
|
|
2423
|
+
var searchGeomRef = react.useRef(null);
|
|
2424
|
+
var sheetColW = (searchOpen || searchAnim === "out") ? SHEET_SEARCH_W : 0;
|
|
2425
|
+
// The column used to animate its own WIDTH, and because the outline is the flex sibling
|
|
2426
|
+
// that grows into the rest of the row, every frame of that re-laid out every rendered row
|
|
2427
|
+
// (measured on a 34-row list: a width step per frame, ~18ms frames and a 76ms first hitch;
|
|
2428
|
+
// the cost grows with the list, which is what made opening search on a long session feel
|
|
2429
|
+
// stuck). The layout now flips in ONE commit — that single reflow is unavoidable, the text
|
|
2430
|
+
// has to re-wrap — and the movement rides on transforms, which the compositor owns:
|
|
2431
|
+
// * opening: the column starts parked off the right edge and slides home, while the list
|
|
2432
|
+
// is flipped back to where it sat before the flip and released, so the outline still
|
|
2433
|
+
// travels left into place instead of jumping there;
|
|
2434
|
+
// * closing: the column keeps its box for the exit and slides off first (the box only
|
|
2435
|
+
// collapses when the exit state ends), then the list is flipped back to full width the
|
|
2436
|
+
// same way.
|
|
2437
|
+
// Both elements are measured, never derived: the flip is the previous box minus the new one.
|
|
2438
|
+
react.useLayoutEffect(function () {
|
|
2439
|
+
var list = listRef.current;
|
|
2440
|
+
var col = searchColRef.current;
|
|
2441
|
+
if (!sheetOpen || !list || !col) { searchGeomRef.current = null; return undefined; }
|
|
2442
|
+
// `offsetLeft` is the box's own position: layout, never a transform. A rect here would
|
|
2443
|
+
// read back the very transform this effect applies, and the next commit would "flip"
|
|
2444
|
+
// from the parked position it just created (measured: the list swung 110px past its
|
|
2445
|
+
// resting spot and eased back).
|
|
2446
|
+
var layoutLeft = list.offsetLeft;
|
|
2447
|
+
var colLayout = sheetColW > 0; // the layout currently on screen
|
|
2448
|
+
var wantOpen = !!searchOpen && searchAnim !== "out"; // "out" is the exit in flight
|
|
2449
|
+
var colWidth = col.getBoundingClientRect().width;
|
|
2450
|
+
var prev = searchGeomRef.current;
|
|
2451
|
+
if (prev && prev.colLayout !== colLayout) {
|
|
2452
|
+
// the layout flipped under the reader: put the list back where it was, then release it
|
|
2453
|
+
var dx = prev.layoutLeft - layoutLeft;
|
|
2454
|
+
if (dx !== 0) {
|
|
2455
|
+
list.style.transition = "none";
|
|
2456
|
+
list.style.transform = "translateX(" + dx + "px)";
|
|
2457
|
+
requestAnimationFrame(function () {
|
|
2458
|
+
list.style.transition = "transform 0.24s " + EASE;
|
|
2459
|
+
list.style.transform = "";
|
|
2460
|
+
setTimeout(function () { list.style.transition = ""; }, 320);
|
|
2461
|
+
});
|
|
2462
|
+
}
|
|
2463
|
+
}
|
|
2464
|
+
if (prev && prev.wantOpen !== wantOpen) {
|
|
2465
|
+
if (wantOpen) {
|
|
2466
|
+
// parked just off the row's right edge, then slid home by the transition
|
|
2467
|
+
col.style.transition = "none";
|
|
2468
|
+
col.style.transform = "translateX(" + (colWidth || SHEET_SEARCH_W) + "px)";
|
|
2469
|
+
requestAnimationFrame(function () {
|
|
2470
|
+
col.style.transition = "transform 0.24s " + EASE;
|
|
2471
|
+
col.style.transform = "";
|
|
2472
|
+
});
|
|
2473
|
+
} else {
|
|
2474
|
+
// out it goes while its box is still there; the box collapses when the exit ends
|
|
2475
|
+
col.style.transition = "transform 0.24s " + EASE;
|
|
2476
|
+
col.style.transform = "translateX(" + (colWidth || SHEET_SEARCH_W) + "px)";
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
if (colWidth === 0) {
|
|
2480
|
+
col.style.transition = "none";
|
|
2481
|
+
col.style.transform = "";
|
|
2482
|
+
}
|
|
2483
|
+
searchGeomRef.current = { colLayout: colLayout, layoutLeft: layoutLeft, wantOpen: wantOpen };
|
|
2484
|
+
return undefined;
|
|
2485
|
+
}, [sheetOpen, sheetColW, searchOpen, searchAnim]);
|
|
2417
2486
|
var onQueryChange = function (v) {
|
|
2418
2487
|
setQuery(v);
|
|
2419
2488
|
setMatchIdx(0);
|
|
@@ -5536,12 +5605,11 @@ window.__ModuleLoader__.load({
|
|
|
5536
5605
|
});
|
|
5537
5606
|
// ---- curtain search column: pushed in from the right edge -----------------
|
|
5538
5607
|
// The panel's own search box and its two buttons, then the hits below them.
|
|
5539
|
-
//
|
|
5540
|
-
//
|
|
5541
|
-
//
|
|
5542
|
-
// curtain is up so both directions animate.
|
|
5543
|
-
var sheetColW = (searchOpen || searchAnim === "out") ? SHEET_SEARCH_W : 0;
|
|
5608
|
+
// The column's WIDTH is what makes room (see `sheetColW` above), an inner box keeps the
|
|
5609
|
+
// full width so the content never squashes while the column narrows, and the column is
|
|
5610
|
+
// always mounted while the curtain is up so both directions animate.
|
|
5544
5611
|
var sheetSearchColEl = sheetOpen ? react_jsx_runtime.jsx("div", {
|
|
5612
|
+
ref: searchColRef,
|
|
5545
5613
|
className: "dqt-sheet-search",
|
|
5546
5614
|
"data-sheet-search": sheetColW > 0 ? "on" : undefined,
|
|
5547
5615
|
style: {
|
|
@@ -5549,8 +5617,7 @@ window.__ModuleLoader__.load({
|
|
|
5549
5617
|
width: sheetColW,
|
|
5550
5618
|
overflow: "hidden",
|
|
5551
5619
|
minHeight: 0,
|
|
5552
|
-
borderLeft: sheetColW > 0 ? "1px solid " + C.panelBorder : "none"
|
|
5553
|
-
transition: "width 0.24s " + EASE + ", border-color 0.24s " + EASE
|
|
5620
|
+
borderLeft: sheetColW > 0 ? "1px solid " + C.panelBorder : "none"
|
|
5554
5621
|
},
|
|
5555
5622
|
children: react_jsx_runtime.jsx("div", {
|
|
5556
5623
|
style: { width: SHEET_SEARCH_W, height: "100%", display: "flex", flexDirection: "column", minHeight: 0 },
|
|
@@ -7535,7 +7602,12 @@ window.__ModuleLoader__.load({
|
|
|
7535
7602
|
"@keyframes dqt-sheet-out{from{transform:translateY(0)}to{transform:translateY(-100%)}}" +
|
|
7536
7603
|
".dqt-sheet-open{animation:dqt-sheet-in 0.46s cubic-bezier(0.22, 0.9, 0.3, 1) both;will-change:transform}" +
|
|
7537
7604
|
".dqt-sheet-closing{animation:dqt-sheet-out 0.3s cubic-bezier(0.4, 0, 1, 1) both;pointer-events:none;will-change:transform}" +
|
|
7538
|
-
|
|
7605
|
+
// The curtain's own drop and retract are deliberately NOT gated on
|
|
7606
|
+
// `prefers-reduced-motion`: with the host system's animations switched off (Windows
|
|
7607
|
+
// "animation effects", which is what Chromium reports as reduce) the curtain used to
|
|
7608
|
+
// appear and vanish with no motion at all — reported three times, and the reader wants
|
|
7609
|
+
// the movement itself. Every other animation this plugin owns still honours the
|
|
7610
|
+
// preference (see the droplet and the mode cross-fade below).
|
|
7539
7611
|
// The curtain handle is a droplet resting on the view-tab strip's lower line:
|
|
7540
7612
|
// its silhouette flares into two concave fillets at the line (surface tension,
|
|
7541
7613
|
// not a detached pill). It grows out of the line when it appears — after a
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-quick-toc",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.9",
|
|
4
4
|
"description": "Conversation TOC for DeepSeek Harness (DSH): a whole-session, turn-grouped Markdown outline with hover previews, a level filter, a full-width curtain, jump-to-end buttons, title/full-text/cross-session search and a Chinese/English interface.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"0.1.5-rc.3": "compatible",
|
|
39
39
|
"0.1.7-alpha.1": "compatible",
|
|
40
40
|
"0.1.7-alpha.2": "compatible",
|
|
41
|
-
"0.1.7-rc.1": "compatible"
|
|
41
|
+
"0.1.7-rc.1": "compatible",
|
|
42
|
+
"0.1.7-rc.2": "compatible"
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
},
|