dsh-quick-toc 0.10.0 → 0.10.1
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 +11 -0
- package/CHANGELOG.md +11 -0
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/lib/client.js +106 -14
- package/package.json +1 -1
package/CHANGELOG.en.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **dsh-quick-toc** are documented here. Chinese version: [CHANGELOG.md](CHANGELOG.md).
|
|
4
4
|
|
|
5
|
+
## [0.10.1] - 2026-10-21
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Collapsing and expanding used to land on different spots**: the place the panel came to rest and the place it reappeared from differed slightly; both now sit on the same line.
|
|
9
|
+
- **A narrow window left a strip of the panel behind**: on a narrow window the collapsed panel kept a visible edge; it now clears away completely.
|
|
10
|
+
- **The collapsed handle did not line up with the panel's edge**: the handle sat a little to one side of the panel edge; the two now share a line.
|
|
11
|
+
- **On the right dock the outer shadow arrived before the content**: while expanding, the halo around the panel showed before the content underneath it; both are now clipped together, and the halo settles once the slide is done.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- **A panel wider than the space available now narrows instead**: when the window cannot hold the width that was chosen, the panel narrows sideways and stays against the conversation area's edge rather than being pushed away from it; a wider window brings the chosen width back.
|
|
15
|
+
|
|
5
16
|
## [0.10.0] - 2026-10-19
|
|
6
17
|
|
|
7
18
|
### Added
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
**dsh-quick-toc** 的重要变更都记录在这里。英文版见 [CHANGELOG.en.md](CHANGELOG.en.md)。
|
|
4
4
|
|
|
5
|
+
## [0.10.1] - 2026-10-21
|
|
6
|
+
|
|
7
|
+
### 修复
|
|
8
|
+
- **收起与展开的落点不一致**:收起后停下的位置与再次展开时出现的位置略有偏差,现在两者落在同一条线上。
|
|
9
|
+
- **窄窗口下收起后残留一条面板**:窗口较窄时,面板收起后仍会留下一条边,现在完全收起。
|
|
10
|
+
- **收起后的把手与面板边缘未对齐**:收起时把手比面板边缘偏一点,现在两者对齐。
|
|
11
|
+
- **右停靠展开时外框先于内容出现**:展开过程中,面板外圈的阴影会先于内容出现;现在阴影与内容一起裁切,展开完成后再自然铺开。
|
|
12
|
+
|
|
13
|
+
### 变更
|
|
14
|
+
- **面板宽度超出可用空间时改为收窄**:窗口放不下设定的宽度时,面板会横向收窄并继续贴着对话区边缘,不再被推离边缘;窗口变宽后恢复设定的宽度。
|
|
15
|
+
|
|
5
16
|
## [0.10.0] - 2026-10-19
|
|
6
17
|
|
|
7
18
|
### 新增
|
package/README.en.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **English** | [中文](README.md)
|
|
4
4
|
|
|
5
|
-
A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH): it turns the Markdown headings (H1–H6) of AI replies into a navigable outline — the same list as a side panel or as a full-width curtain — grouped by conversation turn and covering the whole session (including turns that are not loaded yet), with title/prompts/full-text/cross-session search, hover previews,
|
|
5
|
+
A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH): it turns the Markdown headings (H1–H6) of AI replies into a navigable outline — the same list as a side panel or as a full-width curtain — grouped by conversation turn and covering the whole session (including turns that are not loaded yet), with title/prompts/full-text/cross-session search, hover previews, a right-click menu for jumping and copying, bookmarks with a bookmarks-only view, six theme colours and a translucent material, and a reading position that both follows and is remembered.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -44,7 +44,7 @@ A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/
|
|
|
44
44
|
|
|
45
45
|
| Plugin | Supported DSH |
|
|
46
46
|
| --- | --- |
|
|
47
|
-
| **0.10.x** (latest, 0.10.
|
|
47
|
+
| **0.10.x** (latest, 0.10.1) | 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, 0.2.0-rc.1, 0.2.0-rc.2, 0.2.1-alpha.1, 0.2.1-alpha.2, 0.2.1-alpha.3, 0.2.1-alpha.4, 0.2.1-alpha.5, 0.2.1-rc.1, 0.2.1-rc.2 |
|
|
48
48
|
| **0.9.x** (0.9.5) | 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, 0.2.0-rc.1, 0.2.0-rc.2, 0.2.1-alpha.1, 0.2.1-alpha.2, 0.2.1-alpha.3, 0.2.1-alpha.4, 0.2.1-alpha.5 |
|
|
49
49
|
| 0.8.x (0.8.2) | 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, 0.2.0-rc.1, 0.2.0-rc.2 |
|
|
50
50
|
| 0.7.x (0.7.14) | 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, 0.2.0-rc.1, 0.2.0-rc.2 |
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> [English](README.en.md) | **中文**
|
|
4
4
|
|
|
5
|
-
**DeepSeek Harness(DSH)对话大纲插件**:把 AI 回复中的 Markdown 标题(H1–H6
|
|
5
|
+
**DeepSeek Harness(DSH)对话大纲插件**:把 AI 回复中的 Markdown 标题(H1–H6)提取成可导航的大纲——侧边面板与全屏幕布两种视图,按对话回合分组、覆盖整段会话(含尚未加载进窗口的回合)。支持标题/提问/全文/跨会话四档检索、悬停预览、右键跳转与复制、书签与「只看书签」视图,六种主题色与半透明材质,阅读位置自动跟随并可记住。
|
|
6
6
|
|
|
7
7
|
## 功能
|
|
8
8
|
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
|
|
45
45
|
| 插件版本 | 支持的 DSH 版本 |
|
|
46
46
|
| --- | --- |
|
|
47
|
-
| **0.10.x**(最新,0.10.
|
|
47
|
+
| **0.10.x**(最新,0.10.1) | 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、0.2.0-rc.1、0.2.0-rc.2、0.2.1-alpha.1、0.2.1-alpha.2、0.2.1-alpha.3、0.2.1-alpha.4、0.2.1-alpha.5、0.2.1-rc.1、0.2.1-rc.2 |
|
|
48
48
|
| **0.9.x**(0.9.5) | 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、0.2.0-rc.1、0.2.0-rc.2、0.2.1-alpha.1、0.2.1-alpha.2、0.2.1-alpha.3、0.2.1-alpha.4、0.2.1-alpha.5 |
|
|
49
49
|
| 0.8.x(0.8.2) | 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、0.2.0-rc.1、0.2.0-rc.2 |
|
|
50
50
|
| 0.7.x(0.7.14) | 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、0.2.0-rc.1、0.2.0-rc.2 |
|
package/lib/client.js
CHANGED
|
@@ -3160,6 +3160,21 @@ window.__ModuleLoader__.load({
|
|
|
3160
3160
|
var _sAside = react.useState(null);
|
|
3161
3161
|
var panelAside = _sAside[0];
|
|
3162
3162
|
var setPanelAside = _sAside[1];
|
|
3163
|
+
// The outer halo may only relax to its full bleed once a slide has LANDED. Riding
|
|
3164
|
+
// the same transition let the shadow reach past the panel's own (still clipped)
|
|
3165
|
+
// edge during an expansion, which reads as a frame appearing before the surface.
|
|
3166
|
+
// Declared up here with the other hooks so an early "nothing to show" return never
|
|
3167
|
+
// changes the hook count.
|
|
3168
|
+
var lastLineRef = react.useRef(null);
|
|
3169
|
+
var _sShadowSettled = react.useState(true);
|
|
3170
|
+
var shadowSettled = _sShadowSettled[0];
|
|
3171
|
+
var setShadowSettled = _sShadowSettled[1];
|
|
3172
|
+
var geoOpenNow = open && !panelAside;
|
|
3173
|
+
react.useEffect(function () {
|
|
3174
|
+
if (!geoOpenNow) { setShadowSettled(false); return undefined; }
|
|
3175
|
+
var t = setTimeout(function () { setShadowSettled(true); }, 640);
|
|
3176
|
+
return function () { clearTimeout(t); };
|
|
3177
|
+
}, [geoOpenNow]);
|
|
3163
3178
|
// The curtain hangs from just BELOW the centre column's view tabs (对话 / 轨迹 /
|
|
3164
3179
|
// 上下文), not from the top of the scroll container: when those tabs live inside
|
|
3165
3180
|
// that container, viewport.top sits above them and the curtain would cover them.
|
|
@@ -5421,18 +5436,33 @@ window.__ModuleLoader__.load({
|
|
|
5421
5436
|
// (The collapsed panel is parked deliberately outside the area and is hidden
|
|
5422
5437
|
// by its own clip, so only the open position is clamped.)
|
|
5423
5438
|
var clampLeft = function (x) {
|
|
5424
|
-
|
|
5439
|
+
// clamp against the width the panel will actually be drawn at (geoW, below):
|
|
5440
|
+
// the stored preference can exceed the window, and clamping to THAT put the
|
|
5441
|
+
// open edge in the wrong place
|
|
5442
|
+
return Math.max(8, Math.min(Math.max(8, window.innerWidth - geoW - 8), x));
|
|
5425
5443
|
};
|
|
5426
5444
|
// While the panel is being handed over to (or back from) the curtain it is
|
|
5427
5445
|
// rendered at its COLLAPSED geometry, so the same transform/clip transition that
|
|
5428
5446
|
// serves open/collapse also serves the handoff: no teleport, no flash.
|
|
5429
5447
|
var geoOpen = open && !panelAside;
|
|
5430
|
-
|
|
5448
|
+
// The panel is docked AT the area's edge. When the stored width cannot fit beside
|
|
5449
|
+
// it, the WIDTH gives way for this render — never the position. Moving the open
|
|
5450
|
+
// panel inwards (the old fallback, via clampLeft) both covered the sidebar and
|
|
5451
|
+
// shortened the collapse below the panel's own width, so the tuck line stopped
|
|
5452
|
+
// agreeing with the line the panel came back out of: the panel appeared to close
|
|
5453
|
+
// to one place and reopen from another. The stored preference is untouched, so a
|
|
5454
|
+
// wider window brings the chosen width back.
|
|
5455
|
+
var geoW = Math.max(120, Math.min(panelW,
|
|
5456
|
+
dockRight
|
|
5457
|
+
? (window.innerWidth - (viewport ? viewport.right + 48 : 60)) - 8
|
|
5458
|
+
: window.innerWidth - (viewport ? viewport.left : 0) - 16));
|
|
5459
|
+
// Parked against the area, one panel width further out.
|
|
5460
|
+
var anchorLeft = viewport ? viewport.left - geoW - 8 : -(geoW + 48);
|
|
5431
5461
|
var openLeft;
|
|
5432
5462
|
if (dockRight) {
|
|
5433
5463
|
// RIGHT dock: keep the panel's VISIBLE right edge pinned at the SAME
|
|
5434
5464
|
// line when collapsed as when expanded (the expand edge is correct).
|
|
5435
|
-
var openRight = window.innerWidth - (viewport ? viewport.right + 48 : 60) -
|
|
5465
|
+
var openRight = window.innerWidth - (viewport ? viewport.right + 48 : 60) - geoW;
|
|
5436
5466
|
openLeft = clampLeft(openRight);
|
|
5437
5467
|
} else {
|
|
5438
5468
|
// LEFT dock open (left dock is the confirmed-correct reference — untouched)
|
|
@@ -5455,15 +5485,35 @@ window.__ModuleLoader__.load({
|
|
|
5455
5485
|
geoOpenRef.current = geoOpen;
|
|
5456
5486
|
geoHoldRef.current = geoOpen ? 0 : Date.now() + COLLAPSE_HOLD_MS;
|
|
5457
5487
|
geoSnapRef.current = geoOpen ? null : { anchorLeft: anchorLeft, openLeft: openLeft, dock: dock };
|
|
5488
|
+
// remember the line it is going into, so the next expansion can come back out
|
|
5489
|
+
// of exactly that line (see below)
|
|
5490
|
+
if (!geoOpen) lastLineRef.current = { openLeft: openLeft, dock: dock, w: window.innerWidth, h: window.innerHeight };
|
|
5458
5491
|
}
|
|
5459
5492
|
var geoFrozen = geoSnapRef.current !== null && geoSnapRef.current.dock === dock
|
|
5460
5493
|
&& Date.now() < geoHoldRef.current;
|
|
5461
5494
|
if (geoFrozen) {
|
|
5462
5495
|
anchorLeft = geoSnapRef.current.anchorLeft;
|
|
5463
5496
|
openLeft = geoSnapRef.current.openLeft;
|
|
5497
|
+
} else {
|
|
5498
|
+
// The host re-measures its area between the two legs (a slow beat), and a few
|
|
5499
|
+
// pixels of drift there is what made the panel reopen slightly to the RIGHT of
|
|
5500
|
+
// the place it had tucked into. While the drift is small the line it went into
|
|
5501
|
+
// wins — over BOTH legs, so the tuck line and the open line are the same
|
|
5502
|
+
// number. A larger difference means the reader really moved something (the
|
|
5503
|
+
// sidebar, the window), and the fresh measurement wins instead.
|
|
5504
|
+
var lastLine = lastLineRef.current;
|
|
5505
|
+
if (lastLine && lastLine.dock === dock
|
|
5506
|
+
&& lastLine.w === window.innerWidth && lastLine.h === window.innerHeight
|
|
5507
|
+
&& Math.abs(lastLine.openLeft - openLeft) <= 24
|
|
5508
|
+
&& lastLine.openLeft !== openLeft) {
|
|
5509
|
+
openLeft = lastLine.openLeft;
|
|
5510
|
+
// travel becomes geoW + 16 again, so `anchorLeft + clip` (the tuck line)
|
|
5511
|
+
// evaluates to this same line
|
|
5512
|
+
anchorLeft = openLeft - geoW - 16;
|
|
5513
|
+
}
|
|
5464
5514
|
}
|
|
5465
5515
|
var openOffset = openLeft - anchorLeft;
|
|
5466
|
-
var parkedOffset = dockRight ? (openLeft +
|
|
5516
|
+
var parkedOffset = dockRight ? (openLeft + geoW) - anchorLeft : 0;
|
|
5467
5517
|
var panelLeft = anchorLeft;
|
|
5468
5518
|
var panelOffset = geoOpen ? openOffset : parkedOffset;
|
|
5469
5519
|
var panelTransform = panelOffset === 0 ? "none" : "translateX(" + zLen(panelOffset) + ")";
|
|
@@ -6272,12 +6322,26 @@ window.__ModuleLoader__.load({
|
|
|
6272
6322
|
// the wipe edge drift 24px through the slide); the shadow lives on the panel's
|
|
6273
6323
|
// twin element instead.
|
|
6274
6324
|
var panelClip = "inset(0 0 0 0px)";
|
|
6325
|
+
// ONE line, and that is a geometric necessity rather than a taste: the visible
|
|
6326
|
+
// edge of a clipped box can never be left of the box's own left edge, so the
|
|
6327
|
+
// only way the tuck line and the open line can both sit somewhere is for the
|
|
6328
|
+
// wipe to equal the travel. Any other value makes the edge sweep between two
|
|
6329
|
+
// lines through the animation (pull it 8px back and the panel visibly slides
|
|
6330
|
+
// 8px further left as it vanishes, then reappears from the open line instead).
|
|
6331
|
+
//
|
|
6332
|
+
// It can never be SHORTER than the box it hides either: `clampLeft` pulls the
|
|
6333
|
+
// open position inwards when the window is narrow relative to the panel, which
|
|
6334
|
+
// shortened the travel below the panel width and left a strip of the parked
|
|
6335
|
+
// panel standing on the workspace (measured at 284px on a 13" screen). (The
|
|
6336
|
+
// right dock needs no guard — its travel is one panel width by construction.)
|
|
6337
|
+
// The halo twin reads the same number, so the two are clipped by one wipe.
|
|
6338
|
+
var clipWipe = Math.max(travelPx, geoW + 2);
|
|
6275
6339
|
if (!geoOpen) {
|
|
6276
6340
|
if (dockRight) {
|
|
6277
6341
|
// mirror of LEFT: clip the RIGHT side (panel flies right, shrinking from its right)
|
|
6278
6342
|
panelClip = "inset(0 " + zLen(travelPx) + " 0 0)";
|
|
6279
6343
|
} else {
|
|
6280
|
-
panelClip = "inset(0 0 0 " + zLen(
|
|
6344
|
+
panelClip = "inset(0 0 0 " + zLen(clipWipe) + ")";
|
|
6281
6345
|
}
|
|
6282
6346
|
}
|
|
6283
6347
|
// faded out entirely while another center-column view is active
|
|
@@ -7208,7 +7272,7 @@ window.__ModuleLoader__.load({
|
|
|
7208
7272
|
position: "fixed",
|
|
7209
7273
|
top: zLen(baseTopPx),
|
|
7210
7274
|
left: zLen(panelLeft),
|
|
7211
|
-
width: zLen(
|
|
7275
|
+
width: zLen(geoW),
|
|
7212
7276
|
maxHeight: zLen(vMaxH),
|
|
7213
7277
|
height: panelH > 0 ? zLen(panelH) : undefined,
|
|
7214
7278
|
zoom: zoom === 1 ? undefined : zoom,
|
|
@@ -7234,20 +7298,35 @@ window.__ModuleLoader__.load({
|
|
|
7234
7298
|
// One halo on ALL four sides — evenly, corners included (a card lifted off
|
|
7235
7299
|
// the conversation; no downward bias, or the top corners stay bare). Dark
|
|
7236
7300
|
// scheme gets a WHITE one — the theme's own raised language.
|
|
7237
|
-
//
|
|
7238
|
-
//
|
|
7239
|
-
//
|
|
7301
|
+
//
|
|
7302
|
+
// SHADOW_REACH: how far the edge OPPOSITE the wipe is pulled in while the panel
|
|
7303
|
+
// is parked, so the twin's halo cannot spill past the tuck line once the panel
|
|
7304
|
+
// body has been clipped away.
|
|
7305
|
+
// SHADOW_BLEED: how far all four sides bleed while the panel is at rest — the
|
|
7306
|
+
// deepest reach of the halo (15px below with the offset, more at the corners).
|
|
7240
7307
|
var SHADOW_REACH = 8;
|
|
7241
7308
|
var SHADOW_BLEED = 24;
|
|
7242
|
-
|
|
7309
|
+
// The WIPE side is the one the panel slides through. It is clipped by exactly the
|
|
7310
|
+
// same wipe as the panel while anything is moving — zero reach, so the halo is
|
|
7311
|
+
// never drawn where the panel itself is still hidden (any reach there reads as an
|
|
7312
|
+
// outer frame arriving before the surface). The halo the reader wants lives on the
|
|
7313
|
+
// OTHER three sides during the slide, and on this side only once the slide has
|
|
7314
|
+
// LANDED, when it relaxes to the full bleed.
|
|
7315
|
+
//
|
|
7316
|
+
// The relaxation waits for `shadowSettled` (set by the timer in the hook block
|
|
7317
|
+
// above) instead of riding the same transition: transitioning it together was
|
|
7318
|
+
// what let the halo lead the panel's clipped edge.
|
|
7319
|
+
var shadowDockSide = (geoOpen && shadowSettled)
|
|
7320
|
+
? -SHADOW_BLEED
|
|
7321
|
+
: (geoOpen ? 0 : (dockRight ? travelPx : clipWipe));
|
|
7243
7322
|
// Keep the four-sided halo while open. During a tuck, move the wipe edge
|
|
7244
7323
|
// with the panel AND bring the opposite horizontal clip edge inward to meet
|
|
7245
7324
|
// it at the parked position. Leaving that edge at -24px let the shadow twin
|
|
7246
7325
|
// paint a visible strip after the panel body had been clipped away (wider on
|
|
7247
7326
|
// the right dock, a thin sliver on the left dock).
|
|
7248
7327
|
var shadowClip = dockRight
|
|
7249
|
-
? "inset(" + zLen(-SHADOW_BLEED) + " " + zLen(
|
|
7250
|
-
: "inset(" + zLen(-SHADOW_BLEED) + " " + zLen(geoOpen ? -SHADOW_BLEED : -SHADOW_REACH) + " " + zLen(-SHADOW_BLEED) + " " + zLen(
|
|
7328
|
+
? "inset(" + zLen(-SHADOW_BLEED) + " " + zLen(shadowDockSide) + " " + zLen(-SHADOW_BLEED) + " " + zLen(geoOpen ? -SHADOW_BLEED : SHADOW_REACH) + ")"
|
|
7329
|
+
: "inset(" + zLen(-SHADOW_BLEED) + " " + zLen(geoOpen ? -SHADOW_BLEED : -SHADOW_REACH) + " " + zLen(-SHADOW_BLEED) + " " + zLen(shadowDockSide) + ")";
|
|
7251
7330
|
// The panel's blur lives OUTSIDE the clipping wrapper (see the portal list):
|
|
7252
7331
|
// inside it, any backdrop-filter promotes a layer in that subtree and the
|
|
7253
7332
|
// panel drops beneath the conversation. As a body-level twin with the same
|
|
@@ -7313,6 +7392,10 @@ window.__ModuleLoader__.load({
|
|
|
7313
7392
|
});
|
|
7314
7393
|
var panelEl = react_jsx_runtime.jsx("div", {
|
|
7315
7394
|
ref: panelRootRef,
|
|
7395
|
+
// a marker for the reader's own console checks (and for support): the panel
|
|
7396
|
+
// root used to have no attribute at all, so a lookup by class silently
|
|
7397
|
+
// returned null and read as "the panel is gone"
|
|
7398
|
+
"data-dqt-panel": "1",
|
|
7316
7399
|
// the panel takes focus on any click inside it (except into a text field), so
|
|
7317
7400
|
// ↑/↓/Enter/Esc keep working right after a mouse interaction instead of only
|
|
7318
7401
|
// when the user tabs into the widget first
|
|
@@ -7614,8 +7697,17 @@ window.__ModuleLoader__.load({
|
|
|
7614
7697
|
// below the threshold it slides back into the divider (its usual motion), while the
|
|
7615
7698
|
// droplet above the conversation stays put as the way in
|
|
7616
7699
|
var edgeShown = !open && handleShown && chatViewActive && !narrowWindow;
|
|
7617
|
-
|
|
7618
|
-
|
|
7700
|
+
// The pill is 12px centred in the 26px box, so its edge sits 7px inside the box
|
|
7701
|
+
// edge. Left dock: the panel opens at `area + 8`, so parking the box 1px out puts
|
|
7702
|
+
// the pill's left edge exactly on the panel's own left edge — one line.
|
|
7703
|
+
//
|
|
7704
|
+
// Right dock: deliberately NOT aligned. The panel is held 48px clear of the
|
|
7705
|
+
// area's right edge (the milestone rail lives there), so the pill — which hangs
|
|
7706
|
+
// on that edge — is 11px inside the panel's right edge by construction. Pulling
|
|
7707
|
+
// it out to meet the panel would push the pill into the rail, which is worse
|
|
7708
|
+
// than two lines nobody sees at the same time.
|
|
7709
|
+
var edgeLineLeft = (viewport ? viewport.left : 0) + 1;
|
|
7710
|
+
var edgeLineRight = (viewport ? viewport.right + 52 : 60); // clear of the milestone rail
|
|
7619
7711
|
var edgeEl = (!open || !edgeGone) ? react_jsx_runtime.jsx("div", {
|
|
7620
7712
|
style: {
|
|
7621
7713
|
position: "fixed",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-quick-toc",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Conversation TOC for DeepSeek Harness (DSH): a whole-session, turn-grouped Markdown outline with hover previews, heading-level preferences, a full-width curtain, jump-to-end buttons, title/prompts/full-text/cross-session search and a Chinese/English interface.",
|
|
5
5
|
"icon": "./icon.svg",
|
|
6
6
|
"type": "module",
|