dsh-vscode-mode 0.1.17 → 0.1.20

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.
@@ -6,24 +6,63 @@
6
6
  */
7
7
  import React from 'react'
8
8
  import { callIdAttr } from '../state/records.js'
9
+ import { diffDockText } from '../diffDock.js'
9
10
  import { badgeOf } from './shared.js'
10
11
 
12
+ /**
13
+ * 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。
14
+ * @author ddj 2026年08月25号
15
+ * @param open 是否已展开
16
+ * @returns 14×14 的装饰性 chevron SVG
17
+ */
18
+ function chevronOf(open) {
19
+ const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'
20
+ return React.createElement('svg', {
21
+ width: 14,
22
+ height: 14,
23
+ viewBox: '0 0 14 14',
24
+ fill: 'none',
25
+ 'aria-hidden': true,
26
+ focusable: false,
27
+ }, React.createElement('path', {
28
+ d: path,
29
+ stroke: 'currentColor',
30
+ strokeWidth: 1.2,
31
+ strokeLinecap: 'round',
32
+ strokeLinejoin: 'round',
33
+ }))
34
+ }
35
+
11
36
  /**
12
37
  * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单
13
38
  * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。
14
39
  */
15
40
  export function DiffBox(props) {
16
41
  const {
17
- pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,
18
- allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,
19
- diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,
42
+ pendingRegions = [], staleRegions = [], onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,
43
+ allPendingCount = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,
44
+ diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,
45
+ mode = 'editor', onOpenNextFile, dock = false,
20
46
  } = props
21
47
  const [expanded, setExpanded] = React.useState(false)
22
- const [menuOpen, setMenuOpen] = React.useState(false)
48
+ const [detailsOpen, setDetailsOpen] = React.useState(false)
49
+ const detailsId = React.useId()
23
50
  const canAct = pendingRegions.length > 0
24
51
 
25
52
  const base = String(activePath || '').split(/[\\/]/).pop() || ''
26
53
 
54
+ if (mode === 'chat' || mode === 'editor-empty') {
55
+ return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },
56
+ React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },
57
+ React.createElement('button', {
58
+ type: 'button',
59
+ className: 'edrv-diffbar-dock-button',
60
+ title: '切换到下一个差异文件',
61
+ 'aria-label': diffDockText(fileTotal),
62
+ onClick: onOpenNextFile,
63
+ }, diffDockText(fileTotal))))
64
+ }
65
+
27
66
  let bodyEl = null
28
67
  if (expanded) {
29
68
  const rows = pendingRegions.map((r) => {
@@ -49,32 +88,42 @@ export function DiffBox(props) {
49
88
  bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)
50
89
  }
51
90
 
52
- const menu = menuOpen
53
- ? React.createElement(React.Fragment, null,
54
- React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 44 }, onClick: () => setMenuOpen(false) }),
55
- React.createElement('div', { className: 'edrv-diffbar-menu' },
56
- React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: () => { onAcceptAllFiles(); setMenuOpen(false) } }, '✓ Keep All(全部文件采纳)'),
57
- React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: () => { onUndoAllFiles(); setMenuOpen(false) } }, '↩ Undo All(全部文件不采纳)'),
58
- React.createElement('div', { className: 'edrv-diffmenu-sep' }),
59
- React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('pending'); setMenuOpen(false) } }, '🗂 差异总览'),
60
- React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onOpenLauncher('archive'); setMenuOpen(false) } }, '📁 归档'),
61
- React.createElement('div', { className: 'edrv-diffmenu-sep' }),
62
- React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),
63
- React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))
91
+ const details = detailsOpen
92
+ ? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },
93
+ React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),
94
+ React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),
95
+ React.createElement('div', { className: 'edrv-diffmenu-sep' }),
96
+ React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),
97
+ React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),
98
+ React.createElement('div', { className: 'edrv-diffmenu-sep' }),
99
+ React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),
100
+ React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))
64
101
  : null
65
102
 
66
- return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },
67
- React.createElement('div', { className: 'edrv-diffbar-row' },
68
- React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),
69
- React.createElement('span', { className: 'edrv-diffbar-count', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),
70
- React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓'),
71
- React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),
72
- React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),
73
- React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),
74
- React.createElement('span', { className: 'edrv-diffbar-file', title: activePath || '' }, base),
75
- React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),
76
- React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),
77
- React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '更多操作', onClick: () => setMenuOpen((v) => !v) }, '⋮')),
103
+ return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },
104
+ React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },
105
+ React.createElement('div', { className: 'edrv-diffbar-editor-content' },
106
+ React.createElement('div', { className: 'edrv-diffbar-nav' },
107
+ React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),
108
+ React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),
109
+ React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓')),
110
+ React.createElement('div', { className: 'edrv-diffbar-files' },
111
+ React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),
112
+ React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file edrv-diffbar-progress', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),
113
+ React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),
114
+ React.createElement('span', { className: 'edrv-diffbar-file edrv-diffbar-summary', title: activePath || '' }, base)),
115
+
116
+ React.createElement('div', { className: 'edrv-diffbar-actions' },
117
+ React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),
118
+ React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),
119
+ React.createElement('button', {
120
+ className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',
121
+ title: detailsOpen ? '收起差异操作' : '展开差异操作',
122
+ 'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',
123
+ 'aria-expanded': detailsOpen,
124
+ 'aria-controls': detailsId,
125
+ onClick: () => setDetailsOpen((value) => !value),
126
+ }, chevronOf(detailsOpen))))),
78
127
  bodyEl,
79
- menu)
128
+ details)
80
129
  }