dsh-plugin-core 0.6.0 → 0.7.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.
Files changed (42) hide show
  1. package/dist/explorer/open.d.ts +11 -4
  2. package/dist/explorer/open.d.ts.map +1 -1
  3. package/dist/explorer/open.js +146 -60
  4. package/dist/explorer/open.js.map +1 -1
  5. package/dist/ui/PanelDock.d.ts +5 -0
  6. package/dist/ui/PanelDock.d.ts.map +1 -1
  7. package/dist/ui/PanelDock.js +85 -9
  8. package/dist/ui/PanelDock.js.map +1 -1
  9. package/dist/ui/Picker.d.ts.map +1 -1
  10. package/dist/ui/Picker.js +3 -1
  11. package/dist/ui/Picker.js.map +1 -1
  12. package/dist/ui/host-data.d.ts +6 -0
  13. package/dist/ui/host-data.d.ts.map +1 -1
  14. package/dist/ui/host-data.js +22 -15
  15. package/dist/ui/host-data.js.map +1 -1
  16. package/dist/ui/index.d.ts +2 -2
  17. package/dist/ui/index.d.ts.map +1 -1
  18. package/dist/ui/index.js +2 -2
  19. package/dist/ui/index.js.map +1 -1
  20. package/dist/ui/panel-dock-css.generated.d.ts +1 -1
  21. package/dist/ui/panel-dock-css.generated.d.ts.map +1 -1
  22. package/dist/ui/panel-dock-css.generated.js +1 -1
  23. package/dist/ui/panel-dock-css.generated.js.map +1 -1
  24. package/dist/ui/panel-dock-logic.d.ts +21 -4
  25. package/dist/ui/panel-dock-logic.d.ts.map +1 -1
  26. package/dist/ui/panel-dock-logic.js +55 -9
  27. package/dist/ui/panel-dock-logic.js.map +1 -1
  28. package/dist/ui/picker-css.generated.d.ts +1 -1
  29. package/dist/ui/picker-css.generated.d.ts.map +1 -1
  30. package/dist/ui/picker-css.generated.js +1 -1
  31. package/dist/ui/picker-css.generated.js.map +1 -1
  32. package/dist/utils/i18n.d.ts +1 -1
  33. package/dist/utils/i18n.d.ts.map +1 -1
  34. package/dist/utils/i18n.js +4 -0
  35. package/dist/utils/i18n.js.map +1 -1
  36. package/docs/design/architecture.md +11 -7
  37. package/docs/help/explorer.doc.ts +33 -14
  38. package/docs/help/explorer.md +24 -14
  39. package/docs/help/ui.doc.ts +9 -5
  40. package/docs/help/ui.md +9 -5
  41. package/docs/requirements.md +10 -2
  42. package/package.json +1 -1
@@ -9,10 +9,12 @@ export interface FilePreviewHandle {
9
9
  }
10
10
  export interface OpenFilePreviewOptions {
11
11
  /**
12
- * 工作区文件服务(文件预览要用)。传了 `content` 时(自定义审阅内容,例如变更 diff),
13
- * 这一组文件定位参数都可省略——核心只负责把 `content` 渲染进同一个右侧 dock,不解析路径。
12
+ * 工作区文件服务。**一般不用传**:`connectHost(ctx)` 接线后核心自己持有
13
+ * (`getWorkspaceFiles()`)。传了就以传入的为准(多服务 / 覆盖场景)。
14
+ * 传了 `content` 时(自定义审阅内容,例如变更 diff),这一组文件定位参数都可省略。
14
15
  */
15
16
  workspaceFiles?: WorkspaceFilesFace;
17
+ /** 该工作区的真实会话 id。**一般不用传**:按路径匹配工作区 / 最近有会话的工作区自动解析。 */
16
18
  sessionId?: string;
17
19
  /** 文件或文件夹路径。与 `content` 二选一:传 `content` 时本字段可省略。 */
18
20
  path?: string;
@@ -62,6 +64,9 @@ export interface OpenFilePreviewOptions {
62
64
  /**
63
65
  * 打开工作区文件/文件夹的**停靠**预览(分栏:挤窄 `mount` 左边的兄弟,不是盖上去)。
64
66
  * 重复打开会关掉上一个(同侧边栏位)。
67
+ *
68
+ * 消费方最少写法(`connectHost(ctx)` 已接线):
69
+ * `openFilePreview({ mount, path })` —— 文件服务、会话 id 都由核心自己解。
65
70
  */
66
71
  export declare function openFilePreview(options: OpenFilePreviewOptions): FilePreviewHandle | null;
67
72
  export interface PickedFile {
@@ -71,8 +76,10 @@ export interface PickedFile {
71
76
  isDir: boolean;
72
77
  }
73
78
  export interface PickWorkspaceFileOptions {
74
- workspaceFiles: WorkspaceFilesFace;
75
- sessionId: string;
79
+ /** 工作区文件服务。**一般不用传**:`connectHost(ctx)` 接线后核心自己持有。 */
80
+ workspaceFiles?: WorkspaceFilesFace;
81
+ /** 该工作区的真实会话 id。**一般不用传**:缺省取「最近有会话的工作区」。 */
82
+ sessionId?: string;
76
83
  /** 锚点元素:弹窗左缘与之对齐、优先落在它**下方**(下方不够才翻到上方);不传 = 屏幕居中。 */
77
84
  anchor?: HTMLElement | null;
78
85
  /** 过滤:exts = 只要这些扩展名(小写无点);dirs = 只要文件夹;不传 = 不限。 */
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/explorer/open.ts"],"names":[],"mappings":"AAWA,OAAO,EAAsD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAK1F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIjH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,KAAK,IAAI,IAAI,CAAA;IACb,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACpC,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;;;;OAMG;IACH,KAAK,EAAE,WAAW,CAAA;CACnB;AA8DD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,IAAI,CA2GzF;AAID,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,uBAAuB;IACvB,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,kBAAkB,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,oDAAoD;IACpD,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACpC,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAWD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA4F/F"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/explorer/open.ts"],"names":[],"mappings":"AAWA,OAAO,EAAsD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAK1F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIjH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,KAAK,IAAI,IAAI,CAAA;IACb,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,SAAS,CAAA;IACzB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACpC,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;;;;OAMG;IACH,KAAK,EAAE,WAAW,CAAA;CACnB;AA8ED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,IAAI,CA2KzF;AAID,MAAM,WAAW,UAAU;IACzB,eAAe;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,uBAAuB;IACvB,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,oDAAoD;IACpD,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACpC,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAWD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAuG/F"}
@@ -12,10 +12,10 @@
12
12
  import { createElement as h, useState, useSyncExternalStore } from 'react';
13
13
  import { createRoot } from 'react-dom/client';
14
14
  import { ensureControls, getStyleKit } from '../ui/css.js';
15
- import { workspaceList } from '../ui/host-data.js';
15
+ import { getWorkspaceFiles, workspaceList } from '../ui/host-data.js';
16
16
  import { DockPanel, PanelDock, createPanelDock } from '../ui/PanelDock.js';
17
17
  import { FileBrowser } from './FileBrowser.js';
18
- import { anchorSessionForTitle, workspaceAnchorForPath } from './types.js';
18
+ import { anchorSessionForTitle, pickWorkspaceAnchor, workspaceAnchorForPath } from './types.js';
19
19
  /**
20
20
  * 预览体:`openFilePreview` 的 FileBrowser 包裹层。职责只有一个——**切工作区**:
21
21
  * ▾ 下拉点工作区 ⇒ 换该工作区的锚点会话、key 重挂载、path 回根。
@@ -42,7 +42,10 @@ function PreviewBody(props) {
42
42
  // null = 还在入口态(path 用调用方给的那个文件);非 null = 用户点过工作区,从它的根开始列。
43
43
  const [picked, setPicked] = useState(null);
44
44
  const wsTitle = picked ?? entryTitle;
45
- const sessionId = anchorSessionForTitle(anchors, wsTitle) ?? options.sessionId;
45
+ const sessionId = anchorSessionForTitle(anchors, wsTitle)
46
+ ?? options.sessionId
47
+ ?? pickWorkspaceAnchor(anchors)?.sessionId
48
+ ?? '';
46
49
  const switchable = anchors.filter((a) => (a.sessionIds?.length ?? 0) > 0).map((a) => a.title);
47
50
  return h(FileBrowser, {
48
51
  // key 带工作区+会话 ⇒ 切换即重挂载(FileBrowser 的 dir/listing/学根全属于旧工作区)。
@@ -73,36 +76,84 @@ function PreviewBody(props) {
73
76
  const PREVIEW_HOST_ID = 'dshpc-file-preview-host';
74
77
  /** dock 里的面板 id(本 container 里只有一个)。 */
75
78
  const PREVIEW_PANEL_ID = 'file-preview';
76
- /** 当前打开着的预览的 close(重复打开时走它,保证 React 根被真正卸载)。 */
77
- let activePreviewClose = null;
79
+ /**
80
+ * 挂载宿主行自动补的类:主区伸展 / 子项不收溢出的规则挂在它下面(`src/ui/panel-dock.css`)。
81
+ * 消费方不必自己写 —— 打开时加、关闭时摘。
82
+ */
83
+ const DOCK_HOST_CLASS = 'dshpc-dock-host';
84
+ let activePreview = null;
78
85
  /**
79
86
  * 打开工作区文件/文件夹的**停靠**预览(分栏:挤窄 `mount` 左边的兄弟,不是盖上去)。
80
87
  * 重复打开会关掉上一个(同侧边栏位)。
88
+ *
89
+ * 消费方最少写法(`connectHost(ctx)` 已接线):
90
+ * `openFilePreview({ mount, path })` —— 文件服务、会话 id 都由核心自己解。
81
91
  */
82
92
  export function openFilePreview(options) {
83
93
  if (typeof document === 'undefined')
84
94
  return null;
85
- // 布局契约自检:PanelDock 是布局成员,mount 必须是 flex 行,否则 dock 不停右侧、高度也塌。
86
- // 只 dev 期警告、不改行为——消费方传错时至少留痕,别静默破相。
87
- if (typeof getComputedStyle === 'function') {
88
- const cs = getComputedStyle(options.mount);
89
- if (cs.display !== 'flex' && cs.display !== 'inline-flex') {
90
- console.warn('[dsh-plugin-core/explorer] openFilePreview: mount 不是 flex 行 —— PanelDock 是布局成员'
91
- + '(停靠右侧 + 挤窄主区)。请传你页面「主区 + 侧栏」那一层 flex 容器,'
92
- + '不要传 document.body 或无定高的窄容器。');
93
- }
95
+ const custom = options.content !== undefined;
96
+ // 接线归核心:服务来自 connectHost,会话按「路径所属工作区 → 最近有会话的工作区」解。
97
+ const files = options.workspaceFiles ?? getWorkspaceFiles();
98
+ const anchors = options.workspaceAnchors ?? workspaceList.getSnapshot();
99
+ const sessionId = options.sessionId
100
+ ?? workspaceAnchorForPath(options.path ?? '', anchors)?.sessionId
101
+ ?? pickWorkspaceAnchor(anchors)?.sessionId;
102
+ if (!custom && (files === undefined || sessionId === undefined)) {
103
+ console.warn('[dsh-plugin-core/explorer] openFilePreview: '
104
+ + (files === undefined
105
+ ? '没有工作区文件服务(client apply 里没调 connectHost,或宿主没提供 remote.workspaceFiles)'
106
+ : '找不到可用的工作区会话(宿主 workspaces 里没有带会话的工作区)')
107
+ + ' ⇒ 不打开预览');
108
+ return null;
109
+ }
110
+ const opts = { ...options, workspaceFiles: files, sessionId };
111
+ // 只允许一个预览。**已经开着 ⇒ 换内容**(用户 2026-10-28:侧栏已经在那了,点别的文件就该
112
+ // 直接切 —— 不重播展开动效、也不改用户拖好的宽度)。换页面 / 换容器就地把挂载体搬过去。
113
+ if (activePreview !== null) {
114
+ activePreview.keepWidth();
115
+ activePreview.adopt(opts.mount);
116
+ activePreview.draw(opts);
117
+ return { close: activePreview.close, path: opts.path ?? '' };
94
118
  }
95
- // 同位置只允许一个预览:先**关**旧的(不是 remove 掉挂载体)。
96
- // 直接 remove 会把 React 根的卸载清理一起跳过 ⇒ PanelDock 永远不回收它发布的宽度,
97
- // 遮罩从此卡在让位状态(2026-10-22 真机:点第二个文件链接后再关,遮罩不回弹)。
98
- activePreviewClose?.();
99
119
  const container = document.createElement('div');
100
120
  container.id = PREVIEW_HOST_ID;
101
121
  container.setAttribute('data-dshpc-file-preview', '');
102
122
  // display:contents ⇒ 容器自身不产生盒子,核心 .dshpc-dock 直接成为 mount 的 flex 子项
103
123
  // (这样才「挤」得动左边的兄弟;套一层真盒子会把 dock 变成 mount 的整行块)。
104
124
  container.style.cssText = 'display:contents';
105
- options.mount.appendChild(container);
125
+ // 布局自愈:那行不必自己写成 flex —— 核心补(换位置 / 关闭时还原),只对「本来就是别的布局」不动手。
126
+ let hostEl = null;
127
+ let hostPrevDisplay = '';
128
+ let hostHadClass = false;
129
+ const restoreHost = () => {
130
+ if (hostEl === null)
131
+ return;
132
+ hostEl.style.display = hostPrevDisplay;
133
+ if (!hostHadClass)
134
+ hostEl.classList.remove(DOCK_HOST_CLASS);
135
+ hostEl = null;
136
+ };
137
+ const adopt = (next) => {
138
+ if (next === hostEl)
139
+ return;
140
+ restoreHost();
141
+ // 唯一仍算错的是传 body(那是浮层,不是分栏),只留痕不改行为。
142
+ if (next === document.body) {
143
+ console.warn('[dsh-plugin-core/explorer] openFilePreview: 不要传 document.body —— PanelDock 是布局成员'
144
+ + '(停靠右侧 + 挤窄主区)。请传你页面里包住主区的那个元素。');
145
+ }
146
+ hostPrevDisplay = next.style.display;
147
+ hostHadClass = next.classList.contains(DOCK_HOST_CLASS);
148
+ next.classList.add(DOCK_HOST_CLASS);
149
+ const display = typeof getComputedStyle === 'function' ? getComputedStyle(next).display : '';
150
+ if (display !== 'flex' && display !== 'inline-flex')
151
+ next.style.display = 'flex';
152
+ // 已在文档里的节点 appendChild 就是「移动」,React 根不受影响。
153
+ next.appendChild(container);
154
+ hostEl = next;
155
+ };
156
+ adopt(options.mount);
106
157
  const dock = createPanelDock({
107
158
  maxPanels: 1,
108
159
  defaultWidth: options.width ?? 460,
@@ -121,11 +172,13 @@ export function openFilePreview(options) {
121
172
  if (closed)
122
173
  return;
123
174
  closed = true;
124
- if (activePreviewClose === close)
125
- activePreviewClose = null;
175
+ if (activePreview?.close === close)
176
+ activePreview = null;
126
177
  window.removeEventListener('keydown', onKeyDown);
127
178
  root.unmount();
128
179
  container.remove();
180
+ // 还原 mount:只撤销我们自己加的那点,关掉后页面回到原样。
181
+ restoreHost();
129
182
  options.onClose?.();
130
183
  };
131
184
  const onKeyDown = (event) => {
@@ -134,43 +187,67 @@ export function openFilePreview(options) {
134
187
  };
135
188
  window.addEventListener('keydown', onKeyDown);
136
189
  ensureControls(getStyleKit());
137
- // 总是走 PreviewBody:调用方没自接 onSelectWorkspace 时,▾ 下拉「切工作区」由核心接管
138
- // (anchors 为空 ⇒ 回调空转,行为与旧版一致)。自接了 ⇒ 原样透传给 FileBrowser。
139
- const internalSwitch = options.onSelectWorkspace === undefined;
140
- root.render(h('div',
141
- // 高度吃调用方给的 --dshpc-dock-h(demo 的页面行给 100%);退化成视口高是整页场景。
142
- { style: { display: 'contents', ['--dshpc-dock-h']: '100%' } }, h(PanelDock, { dock, mainMinWidth: options.mainMinWidth ?? 480, translate: options.translate }, h(DockPanel, {
143
- id: PREVIEW_PANEL_ID,
144
- // 不要头部(用户 2026-10-21:核心的『无 header』那版)——上面不再多一条线。
145
- header: null,
146
- // 关闭钮不用核心浮动的(那是 absolute 固定偏移、不垂直居中);关掉它的,
147
- // 改用 FileBrowser 自己的 ✕(和 pick 弹窗同一个 crumb-bar 钮,垂直居中)。
148
- closeButton: 'none',
149
- ariaLabel: options.title,
150
- width: options.width ?? 460,
151
- minWidth: options.minWidth ?? 320,
152
- maxWidth: options.maxWidth,
153
- }, options.content !== undefined
154
- ? options.content()
155
- : internalSwitch
156
- ? h(PreviewBody, { options, onClose: close })
157
- : h(FileBrowser, {
158
- workspaceFiles: options.workspaceFiles,
159
- officeToPdf: options.officeToPdf ?? null,
160
- sessionId: options.sessionId,
161
- path: options.path,
162
- rootName: options.rootName,
163
- workspaces: options.workspaces,
164
- workspaceAnchors: options.workspaceAnchors,
165
- onSelectWorkspace: options.onSelectWorkspace,
166
- rootCache: options.rootCache,
167
- translate: options.translate,
168
- // 传 onClose ⇒ FileBrowser 在面包屑行尾渲染自己的 ✕(垂直居中,与 pick 一致)。
169
- onClose: close,
170
- style: { height: '100%', minHeight: 0 },
171
- })))));
172
- activePreviewClose = close;
173
- return { close, path: options.path ?? '' };
190
+ // 宽度归用户:换内容前把当前渲染宽度钉回去(dock 状态里本该有,显式再钉一次;
191
+ // 入场动效期间量到的是动画中间值,低于下限一律忽略,免得把栏钉窄)。
192
+ let pinnedWidth = null;
193
+ const keepWidth = () => {
194
+ const panel = container.querySelector('.dshpc-dock__panel');
195
+ if (panel === null)
196
+ return;
197
+ const width = Math.round(panel.getBoundingClientRect().width);
198
+ if (width < (options.minWidth ?? 320))
199
+ return;
200
+ pinnedWidth = width;
201
+ dock.setWidth(PREVIEW_PANEL_ID, width);
202
+ };
203
+ // 画(可重画:同一个 dock 换内容时只重渲染,不重建 DOM ⇒ 不重播展开动效)。
204
+ // 内层以 path 作 key:目录 / 切过的工作区这些内部状态属于上一个文件,换文件必须重挂。
205
+ const draw = (o) => {
206
+ // 用户把它收起来过 ⇒ 再点文件要自动弹回来(收着还换内容,等于点了没反应 —— 2026-10-28 真机)。
207
+ if (dock.isCollapsed(PREVIEW_PANEL_ID))
208
+ dock.expand(PREVIEW_PANEL_ID);
209
+ // 总是走 PreviewBody:调用方没自接 onSelectWorkspace 时,▾ 下拉「切工作区」由核心接管
210
+ // (anchors 为空 ⇒ 回调空转,行为与旧版一致)。自接了 ⇒ 原样透传给 FileBrowser。
211
+ const internalSwitch = o.onSelectWorkspace === undefined;
212
+ const contentKey = o.path ?? '';
213
+ root.render(h('div',
214
+ // 高度吃调用方给的 --dshpc-dock-h(demo 的页面行给 100%);退化成视口高是整页场景。
215
+ { style: { display: 'contents', ['--dshpc-dock-h']: '100%' } }, h(PanelDock, { dock, mainMinWidth: o.mainMinWidth ?? 480, translate: o.translate }, h(DockPanel, {
216
+ id: PREVIEW_PANEL_ID,
217
+ // 不要头部(用户 2026-10-21:核心的『无 header』那版)——上面不再多一条线。
218
+ header: null,
219
+ // 关闭钮不用核心浮动的(那是 absolute 固定偏移、不垂直居中);关掉它的,
220
+ // 改用 FileBrowser 自己的 ✕(和 pick 弹窗同一个 crumb-bar 钮,垂直居中)。
221
+ closeButton: 'none',
222
+ ariaLabel: o.title,
223
+ // 重画时沿用用户拖出来的宽度(pinnedWidth),不回到默认值。
224
+ width: pinnedWidth ?? o.width ?? 460,
225
+ minWidth: o.minWidth ?? 320,
226
+ maxWidth: o.maxWidth,
227
+ }, o.content !== undefined
228
+ ? o.content()
229
+ : internalSwitch
230
+ ? h(PreviewBody, { key: contentKey, options: o, onClose: close })
231
+ : h(FileBrowser, {
232
+ key: contentKey,
233
+ workspaceFiles: o.workspaceFiles,
234
+ officeToPdf: o.officeToPdf ?? null,
235
+ sessionId: o.sessionId,
236
+ path: o.path,
237
+ rootName: o.rootName,
238
+ workspaces: o.workspaces,
239
+ workspaceAnchors: o.workspaceAnchors,
240
+ onSelectWorkspace: o.onSelectWorkspace,
241
+ rootCache: o.rootCache,
242
+ translate: o.translate,
243
+ // 传 onClose ⇒ FileBrowser 在面包屑行尾渲染自己的 ✕(垂直居中,与 pick 一致)。
244
+ onClose: close,
245
+ style: { height: '100%', minHeight: 0 },
246
+ })))));
247
+ };
248
+ draw(opts);
249
+ activePreview = { adopt, keepWidth, draw, close };
250
+ return { close, path: opts.path ?? '' };
174
251
  }
175
252
  /** 弹窗宽度(源实现 480,用户 2026-09-29 微调定值)。 */
176
253
  const PICKER_WIDTH = 480;
@@ -193,6 +270,15 @@ export function pickWorkspaceFile(options) {
193
270
  resolve(null);
194
271
  return;
195
272
  }
273
+ const files = options.workspaceFiles ?? getWorkspaceFiles();
274
+ const sessionId = options.sessionId ?? pickWorkspaceAnchor(workspaceList.getSnapshot())?.sessionId;
275
+ if (files === undefined || sessionId === undefined) {
276
+ console.warn('[dsh-plugin-core/explorer] pickWorkspaceFile: '
277
+ + (files === undefined ? '没有工作区文件服务(client apply 里没调 connectHost)' : '找不到可用的工作区会话')
278
+ + ' ⇒ 不弹选择框');
279
+ resolve(null);
280
+ return;
281
+ }
196
282
  let settled = false;
197
283
  const backdrop = document.createElement('div');
198
284
  backdrop.setAttribute('data-dshpc-picker-backdrop', '');
@@ -262,9 +348,9 @@ export function pickWorkspaceFile(options) {
262
348
  ensureControls(getStyleKit());
263
349
  const root = createRoot(panel);
264
350
  root.render(h(FileBrowser, {
265
- workspaceFiles: options.workspaceFiles,
351
+ workspaceFiles: files,
266
352
  officeToPdf: options.officeToPdf ?? null,
267
- sessionId: options.sessionId,
353
+ sessionId,
268
354
  path: '',
269
355
  rootName: options.rootName,
270
356
  rootCache: options.rootCache,
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/explorer/open.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/explorer/open.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,11 @@ export interface PanelDockController {
93
93
  close(id?: string, reason?: DockCloseReason): void;
94
94
  toggle(id?: string): OpenResult;
95
95
  isOpen(id?: string): boolean;
96
+ /** 收起:面板退出布局、变成右侧固定耳朵(宽度保留,展开还原)。 */
97
+ collapse(id?: string): void;
98
+ /** 展开:把耳朵收回、面板回到布局。已满栏时拒绝(触发 onLimitReached)。 */
99
+ expand(id?: string): void;
100
+ isCollapsed(id?: string): boolean;
96
101
  ids(): string[];
97
102
  setWidth(id: string, width: number): void;
98
103
  subscribe(listener: () => void): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"PanelDock.d.ts","sourceRoot":"","sources":["../../src/ui/PanelDock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PanelDock.d.ts","sourceRoot":"","sources":["../../src/ui/PanelDock.ts"],"names":[],"mappings":"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"}
@@ -10,16 +10,20 @@
10
10
  * · **头部可控** —— `title` / `icon` / `extra` 三件套;要更自由就 `header` 整块替换,`header={null}` 表示不要头部;
11
11
  * · **关闭钮可退让** —— `closable={false}` 不出;`closeButton="floating"` 浮在右上角,不占头部布局。
12
12
  */
13
- import { Children, createElement as h, isValidElement, useEffect, useRef, useSyncExternalStore } from 'react';
13
+ import { Children, createElement as h, isValidElement, useEffect, useRef, useState, useSyncExternalStore } from 'react';
14
14
  import { ensureControls } from './css.js';
15
15
  import { t } from '../utils/i18n.js';
16
16
  import { startResizeLayoutWidth } from './resizer.js';
17
- import { DEFAULT_PANEL_ID, clampWidth, closePanel, emptyDock, isOpen, openPanel, othersWidth, setPanelWidth, } from './panel-dock-logic.js';
17
+ import { DEFAULT_PANEL_ID, clampWidth, closePanel, collapsePanel, emptyDock, expandPanel, isCollapsed as isCollapsedState, isOpen, openPanel, othersWidth, setPanelWidth, } from './panel-dock-logic.js';
18
18
  // ── 分栏占宽契约(用户 2026-10-22 拍板)──
19
19
  // 遮罩必须知道「页面右侧被分栏占掉多少」,否则它会把 dock 一起压暗、还吃掉点击
20
20
  // (`.dshpc-modal-mask` 的 right inset 读的就是这个变量)。挂在根元素上,是因为遮罩不保证
21
21
  // 是本 dock 那个 flex 行的后代;同页多个 dock 按实例求和,全部关掉即移除变量。
22
22
  const INSET_VAR = '--dshpc-page-inset-right';
23
+ /** 分栏开着时给主区滚动条留的缝(px):滚动条与分隔线只留 1px(用户 2026-10-28:
24
+ * 「有一像素就可以了」)。缝隙也是 dock 的足迹 —— 遮罩让位量要一并计入,否则遮罩会盖住它。
25
+ * 调用方可用 `--dshpc-dock-gap` 盖缝宽,但 TS 这份要跟着改。 */
26
+ const DOCK_GAP = 1;
23
27
  const dockInsets = new Map();
24
28
  let dockSeq = 0;
25
29
  function publishInset(key, width, el) {
@@ -114,7 +118,8 @@ export function createPanelDock(options = {}) {
114
118
  return result;
115
119
  },
116
120
  close(id = DEFAULT_PANEL_ID, reason = 'api') {
117
- if (!isOpen(state, id))
121
+ // 对已收起的耳朵也放行:关闭 = 连耳朵一起抹掉。
122
+ if (!isOpen(state, id) && !isCollapsedState(state, id))
118
123
  return;
119
124
  if (options.onBeforeClose?.({ id, reason }) === false)
120
125
  return;
@@ -128,9 +133,27 @@ export function createPanelDock(options = {}) {
128
133
  }
129
134
  return controller.open(id);
130
135
  },
136
+ collapse(id = DEFAULT_PANEL_ID) {
137
+ if (!isOpen(state, id))
138
+ return;
139
+ emit(collapsePanel(state, id));
140
+ },
141
+ expand(id = DEFAULT_PANEL_ID) {
142
+ if (!isCollapsedState(state, id))
143
+ return;
144
+ // 展开也是「多开一栏」,同样受数量闸约束;不静默超额。
145
+ if (state.ids.length >= maxPanels) {
146
+ options.onLimitReached?.({ id });
147
+ return;
148
+ }
149
+ emit(expandPanel(state, id));
150
+ },
131
151
  isOpen(id = DEFAULT_PANEL_ID) {
132
152
  return isOpen(state, id);
133
153
  },
154
+ isCollapsed(id = DEFAULT_PANEL_ID) {
155
+ return isCollapsedState(state, id);
156
+ },
134
157
  ids() {
135
158
  return state.ids;
136
159
  },
@@ -174,6 +197,28 @@ export function PanelDock(props) {
174
197
  const panes = panesOf(props.children);
175
198
  const { defaultWidth, minWidth: fallbackMin } = props.dock.defaults;
176
199
  const widthOf = (pane) => state.widths[pane.id] ?? clampWidth(pane.width ?? defaultWidth, pane.minWidth ?? fallbackMin, pane.maxWidth);
200
+ // 耳朵**只显示一个箭头**(用户 2026-10-28 三轮:图标也不放,那会把面板的玩意带出来)。
201
+ // 名字只进无障碍名:优先面板标题(字符串),否则无障碍名,再退回组名。
202
+ const earLabelOf = (id) => {
203
+ const pane = panes.find((item) => item.id === id);
204
+ if (pane === undefined)
205
+ return id;
206
+ if (typeof pane.title === 'string')
207
+ return pane.title;
208
+ if (typeof pane.ariaLabel === 'string')
209
+ return pane.ariaLabel;
210
+ return id;
211
+ };
212
+ // 收起的出场动效:先把栏宽收到 0(CSS transition),落定后再真正退出布局 ——
213
+ // 用户 2026-10-28:「突然就出来了,特别奇怪」。展开方向的入场走 CSS 挂载动画,不需要 JS。
214
+ const [closing, setClosing] = useState([]);
215
+ const collapseWithAnim = (id) => {
216
+ setClosing((prev) => (prev.includes(id) ? prev : [...prev, id]));
217
+ window.setTimeout(() => {
218
+ setClosing((prev) => prev.filter((item) => item !== id));
219
+ props.dock.collapse(id);
220
+ }, 220);
221
+ };
177
222
  // 本 dock 在「页面右侧占宽」里的那一份:实例唯一键,拖拽期也用它实时更新。
178
223
  const insetKey = useRef('');
179
224
  if (insetKey.current === '')
@@ -186,8 +231,9 @@ export function PanelDock(props) {
186
231
  .filter((pane) => state.ids.includes(pane.id))
187
232
  .reduce((sum, pane) => sum + widthOf(pane), 0);
188
233
  // 开合 / 拖宽松手后同步一次(拖拽中的实时值由 onMove 写);卸载归零,别把变量留给下一个人。
234
+ // 让位量 = 已开栏宽 + 开着时的留缝(缝隙也算 dock 足迹,遮罩边界才贴得到分隔线上)。
189
235
  useEffect(() => {
190
- publishInset(insetKey.current, totalWidth, rootRef.current);
236
+ publishInset(insetKey.current, state.ids.length > 0 ? totalWidth + DOCK_GAP : 0, rootRef.current);
191
237
  });
192
238
  useEffect(() => () => {
193
239
  publishInset(insetKey.current, 0, null);
@@ -206,6 +252,8 @@ export function PanelDock(props) {
206
252
  const startWidth = widthOf(pane);
207
253
  const min = pane.minWidth ?? fallbackMin;
208
254
  const mainMin = props.mainMinWidth ?? 480;
255
+ // 拖拽期点亮**这一栏**:染的是面板自己的 border-left,不是另画一条线(用户 2026-10-28 四轮)。
256
+ element.classList.add('dshpc-dock__panel--resizing');
209
257
  startResizeLayoutWidth({
210
258
  startEvent: event,
211
259
  root: rootRef.current,
@@ -219,10 +267,11 @@ export function PanelDock(props) {
219
267
  },
220
268
  onMove: (width) => {
221
269
  element.style.width = `${width}px`;
222
- // 遮罩的右边界跟着走,否则拖出去的那条缝会被遮罩压住(用户 2026-10-22)。
223
- publishInset(insetKey.current, restWidth(pane.id) + width, rootRef.current);
270
+ // 遮罩的右边界跟着走,否则拖出去的那条缝会被遮罩压住(用户 2026-10-22);含留缝。
271
+ publishInset(insetKey.current, restWidth(pane.id) + width + DOCK_GAP, rootRef.current);
224
272
  },
225
273
  onCommit: (width) => {
274
+ element.classList.remove('dshpc-dock__panel--resizing');
226
275
  props.dock.setWidth(pane.id, width);
227
276
  },
228
277
  });
@@ -267,9 +316,11 @@ export function PanelDock(props) {
267
316
  onClick: () => props.dock.close(pane.id, 'button'),
268
317
  }, pane.closeIcon ?? '✕');
269
318
  };
319
+ // 开着时根元素带 --open:CSS 据此给主区滚动条让出一条缝(全关即无缝,不留白边)。
320
+ const rootClass = `dshpc-dock${state.ids.length > 0 ? ' dshpc-dock--open' : ''}${props.className === undefined ? '' : ` ${props.className}`}`;
270
321
  return h('div', {
271
322
  ref: rootRef,
272
- className: props.className === undefined ? 'dshpc-dock' : `dshpc-dock ${props.className}`,
323
+ className: rootClass,
273
324
  }, panes
274
325
  .filter((pane) => state.ids.includes(pane.id))
275
326
  .map((pane) => h('section', {
@@ -280,7 +331,7 @@ export function PanelDock(props) {
280
331
  else
281
332
  panelRefs.current.set(pane.id, element);
282
333
  },
283
- className: 'dshpc-dock__panel',
334
+ className: closing.includes(pane.id) ? 'dshpc-dock__panel dshpc-dock__panel--closing' : 'dshpc-dock__panel',
284
335
  style: { width: `${widthOf(pane)}px` },
285
336
  'data-panel': pane.id,
286
337
  'aria-label': pane.ariaLabel ?? (typeof pane.title === 'string' ? pane.title : pane.id),
@@ -292,6 +343,31 @@ export function PanelDock(props) {
292
343
  onPointerDown: (event) => {
293
344
  beginResize(pane, event);
294
345
  },
295
- }), renderHeader(pane), headerCloseOf(pane), floatingCloseOf(pane), h('div', { className: 'dshpc-dock__body' }, pane.children ?? null))));
346
+ }),
347
+ // 收起钮是 resizer 的**兄弟**,不是子元素 —— 用户 2026-10-28:鼠标停在按钮上时,
348
+ // 拖宽线不能亮、也不能出蓝色发光(那是在拖宽,不是点按钮)。挂在面板左缘外。
349
+ h('button', {
350
+ type: 'button',
351
+ className: 'dshpc-dock__collapse',
352
+ 'aria-label': tt('dockCollapse'),
353
+ onClick: () => collapseWithAnim(pane.id),
354
+ }, '›'), renderHeader(pane), headerCloseOf(pane), floatingCloseOf(pane), h('div', { className: 'dshpc-dock__body' }, pane.children ?? null))),
355
+ // 收起后的耳朵:**独立的 fixed 浮层**,与分栏不是一体(用户 2026-10-28 口径)。
356
+ // 多个耳朵按收起顺序纵向堆叠,点一只展开回来。
357
+ state.collapsed.length === 0
358
+ ? null
359
+ : h('div', { className: 'dshpc-dock__ears' }, state.collapsed.map((id) => {
360
+ const label = earLabelOf(id);
361
+ return h('button', {
362
+ key: id,
363
+ type: 'button',
364
+ className: 'dshpc-dock__ear',
365
+ // 不放 title:原生 tooltip 会把面板标题弹出来,用户明确「不要显示任何标题」。
366
+ 'aria-label': `${label} · ${tt('dockExpand')}`,
367
+ onClick: () => props.dock.expand(id),
368
+ },
369
+ // 只有一个箭头,与收起钮同尺寸反向:收起钮 ›(往右收),耳朵 ‹(往左拉回来)。
370
+ h('span', { className: 'dshpc-dock__ear-arrow', 'aria-hidden': true }, '‹'));
371
+ })));
296
372
  }
297
373
  //# sourceMappingURL=PanelDock.js.map