dsh-git-ui 0.0.2 → 0.1.0

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.
@@ -13,22 +13,39 @@
13
13
  */
14
14
  import type { CSSProperties } from 'react'
15
15
 
16
- /** Pill: compact branch chip, right-aligned in the session header. */
16
+ /** Pill: compact branch chip, right-aligned in the session header.
17
+ * macOS 式发丝描边(inset 无布局位移):层 2 淡底 + l2 极细边,比纯底色更挺括。 */
17
18
  export const pill: CSSProperties = {
18
19
  display: 'inline-flex',
19
20
  alignItems: 'center',
20
21
  gap: 6,
21
22
  height: 24,
22
- padding: '0 8px',
23
+ padding: '0 9px',
23
24
  border: 0,
24
25
  borderRadius: 12,
25
26
  font: 'inherit',
26
27
  fontSize: 12,
27
28
  lineHeight: '18px',
28
29
  whiteSpace: 'nowrap',
30
+ maxWidth: 280,
29
31
  cursor: 'pointer',
30
32
  color: 'var(--dsw-alias-label-secondary)',
31
33
  background: 'var(--dsw-alias-bg-layer-2)',
34
+ boxShadow: 'inset 0 0 0 1px var(--dsw-alias-border-l2)',
35
+ }
36
+
37
+ /** 分支名段:超长可省略,徽标优先保留。 */
38
+ export const pillBranch: CSSProperties = {
39
+ overflow: 'hidden',
40
+ textOverflow: 'ellipsis',
41
+ minWidth: 0,
42
+ flexShrink: 1,
43
+ }
44
+
45
+ /** 徽标段:不截断,始终完整展示(+2 −1 ?3 / ↑1 ↓2)。 */
46
+ export const pillBadges: CSSProperties = {
47
+ flexShrink: 0,
48
+ whiteSpace: 'nowrap',
32
49
  }
33
50
 
34
51
  /** Dimmed pill for degraded states (no repo / unavailable). */
@@ -60,7 +77,7 @@ export const popup: CSSProperties = {
60
77
  width: 340,
61
78
  maxHeight: 420,
62
79
  overflowY: 'auto',
63
- padding: '10px 12px',
80
+ padding: '12px 14px',
64
81
  fontSize: 12,
65
82
  lineHeight: '18px',
66
83
  background: 'var(--dsw-alias-bg-layer-3)',
@@ -70,74 +87,152 @@ export const popup: CSSProperties = {
70
87
  boxShadow: 'var(--dsw-shadow-lv3)',
71
88
  }
72
89
 
73
- export const popupTitle: CSSProperties = {
74
- margin: 0,
90
+ /** 上下文头部:分支 prominent + 徽标 + 根路径(回响 pill 的分支/脏/同步信息)。 */
91
+ export const popupHeader: CSSProperties = {
92
+ display: 'flex',
93
+ flexDirection: 'column',
94
+ gap: 4,
95
+ paddingBottom: 10,
96
+ marginBottom: 10,
97
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
98
+ }
99
+
100
+ export const popupHeaderMain: CSSProperties = {
101
+ display: 'flex',
102
+ alignItems: 'center',
103
+ gap: 6,
104
+ flexWrap: 'wrap',
105
+ }
106
+
107
+ /** 分支名:头部视觉重心(13px semibold primary)。 */
108
+ export const popupHeaderBranch: CSSProperties = {
75
109
  fontSize: 13,
76
110
  fontWeight: 600,
77
- marginBottom: 6,
111
+ color: 'var(--dsw-alias-label-primary)',
112
+ }
113
+
114
+ /** 头部徽标(脏状态 / 同步 / unborn):次级弱化文本,不喧宾夺主。 */
115
+ export const popupBadge: CSSProperties = {
116
+ fontSize: 11,
117
+ color: 'var(--dsw-alias-label-secondary)',
118
+ fontVariantNumeric: 'tabular-nums',
119
+ }
120
+
121
+ /** 根路径行:文件夹图标 + 弱化省略路径。 */
122
+ export const popupHeaderRoot: CSSProperties = {
123
+ display: 'flex',
124
+ alignItems: 'center',
125
+ gap: 5,
126
+ color: 'var(--dsw-alias-label-tertiary)',
78
127
  }
79
128
 
80
- export const rootLine: CSSProperties = {
129
+ export const popupHeaderRootText: CSSProperties = {
81
130
  overflow: 'hidden',
82
131
  textOverflow: 'ellipsis',
83
132
  whiteSpace: 'nowrap',
84
- color: 'var(--dsw-alias-label-tertiary)',
85
- marginBottom: 8,
133
+ fontSize: 11,
86
134
  }
87
135
 
88
- export const countGrid: CSSProperties = {
89
- display: 'grid',
90
- gridTemplateColumns: 'repeat(5, 1fr)',
91
- gap: 6,
92
- marginBottom: 8,
136
+ /** 头部分支内联切换按钮(无框融入头部,带 chevron 下拉)。 */
137
+ export const popupBranchMenu: CSSProperties = {
138
+ display: 'inline-flex',
139
+ alignItems: 'center',
140
+ gap: 4,
141
+ border: 'none',
142
+ background: 'transparent',
143
+ padding: '2px 4px',
144
+ cursor: 'pointer',
145
+ font: 'inherit',
146
+ fontSize: 13,
147
+ fontWeight: 600,
148
+ lineHeight: '20px',
149
+ color: 'var(--dsw-alias-label-primary)',
150
+ borderRadius: 4,
93
151
  }
94
152
 
95
- export const countCell: CSSProperties = {
96
- textAlign: 'center',
97
- padding: '4px 2px',
98
- borderRadius: 8,
99
- background: 'var(--dsw-alias-bg-layer-2)',
153
+ /** 紧凑状态条:横排计数(取代独立格子 grid),省垂直空间。 */
154
+ export const popupStatusBar: CSSProperties = {
155
+ display: 'flex',
156
+ alignItems: 'center',
157
+ gap: 12,
158
+ flexWrap: 'wrap',
159
+ marginBottom: 10,
160
+ }
161
+
162
+ export const popupStatItem: CSSProperties = {
163
+ display: 'inline-flex',
164
+ alignItems: 'baseline',
165
+ gap: 4,
100
166
  }
101
167
 
102
- export const countValue: CSSProperties = {
168
+ export const popupStatValue: CSSProperties = {
103
169
  fontWeight: 600,
104
- fontSize: 14,
170
+ fontSize: 13,
105
171
  color: 'var(--dsw-alias-label-primary)',
172
+ fontVariantNumeric: 'tabular-nums',
106
173
  }
107
174
 
108
- export const countLabel: CSSProperties = {
175
+ export const popupStatLabel: CSSProperties = {
109
176
  fontSize: 11,
110
177
  color: 'var(--dsw-alias-label-tertiary)',
111
178
  }
112
179
 
180
+ /** 分支操作行(新建分支,上提至头部区下方)。 */
181
+ export const popupBranchOps: CSSProperties = {
182
+ display: 'flex',
183
+ alignItems: 'center',
184
+ gap: 6,
185
+ marginBottom: 6,
186
+ }
187
+
188
+ /** 分组小标题:macOS 式 11px semibold 弱化色(弃用全大写+字距的报表风)。 */
113
189
  export const sectionTitle: CSSProperties = {
114
- margin: '8px 0 4px',
190
+ margin: '14px 0 6px',
115
191
  fontSize: 11,
116
192
  fontWeight: 600,
117
- color: 'var(--dsw-alias-label-secondary)',
118
- textTransform: 'uppercase',
119
- letterSpacing: 0.4,
193
+ color: 'var(--dsw-alias-label-tertiary)',
120
194
  }
121
195
 
196
+ /** 提交行:两段式(主题全宽 / hash·作者·时间 次行),消除窄弹窗内主题截断。 */
122
197
  export const commitRow: CSSProperties = {
123
198
  display: 'flex',
124
- gap: 6,
125
- alignItems: 'baseline',
126
- padding: '2px 0',
199
+ flexDirection: 'column',
200
+ gap: 1,
201
+ padding: '3px 6px',
202
+ margin: '0 -6px',
203
+ borderRadius: 6,
127
204
  }
128
205
 
129
206
  export const commitHash: CSSProperties = {
130
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
207
+ flex: 'none',
208
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
131
209
  fontSize: 11,
132
210
  color: 'var(--dsw-alias-label-secondary)',
133
211
  }
134
212
 
135
- export const commitSubject: CSSProperties = {
213
+ /** 主题行:全宽省略,popup 内不再被 hash/meta 挤压。 */
214
+ export const commitSubjectPop: CSSProperties = {
136
215
  overflow: 'hidden',
137
216
  textOverflow: 'ellipsis',
138
217
  whiteSpace: 'nowrap',
139
- flex: 1,
140
218
  color: 'var(--dsw-alias-label-primary)',
219
+ fontSize: 12,
220
+ }
221
+
222
+ /** 次行元数据:hash · 作者 · 相对时间,弱化横排。 */
223
+ export const commitMetaLine: CSSProperties = {
224
+ display: 'flex',
225
+ alignItems: 'center',
226
+ gap: 4,
227
+ fontSize: 11,
228
+ color: 'var(--dsw-alias-label-tertiary)',
229
+ whiteSpace: 'nowrap',
230
+ }
231
+
232
+ /** 元数据分隔点。 */
233
+ export const commitDot: CSSProperties = {
234
+ color: 'var(--dsw-alias-label-tertiary)',
235
+ opacity: 0.6,
141
236
  }
142
237
 
143
238
  export const commitMeta: CSSProperties = {
@@ -148,36 +243,98 @@ export const commitMeta: CSSProperties = {
148
243
 
149
244
  export const changeRow: CSSProperties = {
150
245
  display: 'flex',
151
- gap: 6,
246
+ gap: 8,
152
247
  alignItems: 'center',
153
- padding: '1px 0',
248
+ padding: '2px 0',
154
249
  borderRadius: 6,
155
250
  }
156
251
 
252
+ /** 状态字符徽标:紧凑方块芯片,小一号字 + 加粗,视觉重心更稳。 */
157
253
  export const changeChip: CSSProperties = {
158
- width: 20,
254
+ width: 18,
159
255
  textAlign: 'center',
160
- borderRadius: 4,
161
- fontSize: 11,
162
- fontWeight: 600,
256
+ borderRadius: 5,
257
+ fontSize: 10,
258
+ lineHeight: '14px',
259
+ fontWeight: 700,
163
260
  flexShrink: 0,
164
- color: '#fff',
165
261
  }
166
262
 
167
- export const changePath: CSSProperties = {
263
+ /**
264
+ * 状态字符徽标配色:color-mix 淡晕背景(~12%)+ label-primary 文字(始终高对比可读)。
265
+ * 取代旧 state-*-secondary 饱和填充 + state-*-primary 文字(同色系 bg+text 低对比,如 added 绿底绿字看不清)。
266
+ * 与差异视图 sbsDel/sbsAdd 同一配色语言。
267
+ */
268
+ export const chipStyles: Record<string, CSSProperties> = {
269
+ added: { background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)', color: 'var(--dsw-alias-label-primary)' },
270
+ modified: { background: 'color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)', color: 'var(--dsw-alias-label-primary)' },
271
+ deleted: { background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent)', color: 'var(--dsw-alias-label-primary)' },
272
+ renamed: { background: 'color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent)', color: 'var(--dsw-alias-label-primary)' },
273
+ untracked: { background: 'var(--dsw-alias-bg-layer-2)', color: 'var(--dsw-alias-label-secondary)' },
274
+ conflicted: { background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 18%, transparent)', color: 'var(--dsw-alias-label-primary)' },
275
+ typechange: { background: 'color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)', color: 'var(--dsw-alias-label-primary)' },
276
+ }
277
+
278
+ /** 变更文件名段:prominent,按需收缩(目录优先省略)。
279
+ * 颜色由全局类控制(基础 label-primary / hover business-primary),否则内联
280
+ * color 会压掉样式表的 :hover 主色。 */
281
+ export const changeNamePop: CSSProperties = {
282
+ flex: '0 1 auto',
283
+ minWidth: 0,
284
+ maxWidth: '60%',
168
285
  overflow: 'hidden',
169
286
  textOverflow: 'ellipsis',
170
287
  whiteSpace: 'nowrap',
288
+ }
289
+
290
+ /** 变更文件名按钮(popup):可点击打开 Git 中心 diff,hover 由全局类反馈。 */
291
+ export const changeNamePopBtn: CSSProperties = {
292
+ ...changeNamePop,
293
+ border: 'none',
294
+ background: 'transparent',
295
+ padding: 0,
296
+ fontFamily: 'inherit',
297
+ fontSize: 13,
298
+ lineHeight: '20px',
299
+ textAlign: 'left',
300
+ cursor: 'pointer',
301
+ }
302
+
303
+ /** 变更目录段:弱化,flex:1 优先省略,文件名尽量完整。 */
304
+ export const changeDirPop: CSSProperties = {
171
305
  flex: 1,
172
- color: 'var(--dsw-alias-label-primary)',
306
+ minWidth: 0,
307
+ overflow: 'hidden',
308
+ textOverflow: 'ellipsis',
309
+ whiteSpace: 'nowrap',
310
+ fontSize: 11,
311
+ color: 'var(--dsw-alias-label-tertiary)',
173
312
  }
174
313
 
314
+ /** 底栏:发丝分隔线把操作区与内容轻轻分开(macOS 工具栏语义)。 */
175
315
  export const footerRow: CSSProperties = {
176
316
  display: 'flex',
177
317
  alignItems: 'center',
178
318
  justifyContent: 'space-between',
179
319
  gap: 8,
180
- marginTop: 10,
320
+ marginTop: 12,
321
+ paddingTop: 10,
322
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
323
+ }
324
+
325
+ /** 底栏操作组。 */
326
+ export const footerActions: CSSProperties = {
327
+ display: 'inline-flex',
328
+ alignItems: 'center',
329
+ gap: 4,
330
+ }
331
+
332
+ /** 主操作(打开 Git 中心):强调描边按钮,主题安全(不依赖未验证的 on-business 前景令牌)。 */
333
+ export const footerPrimary: CSSProperties = {
334
+ background: 'var(--dsw-alias-bg-layer-2)',
335
+ border: '1px solid var(--dsw-alias-state-business-primary)',
336
+ color: 'var(--dsw-alias-state-business-primary)',
337
+ fontWeight: 600,
181
338
  }
182
339
 
183
340
  export const checkedAt: CSSProperties = {
@@ -202,6 +359,19 @@ export const emptyNote: CSSProperties = {
202
359
  padding: '4px 0',
203
360
  }
204
361
 
362
+ /** 居中空状态占位(IDEA 式:大区空背景时中心显示提示文字)。 */
363
+ export const centeredEmpty: CSSProperties = {
364
+ flex: 1,
365
+ minHeight: 0,
366
+ display: 'flex',
367
+ alignItems: 'center',
368
+ justifyContent: 'center',
369
+ color: 'var(--dsw-alias-label-tertiary)',
370
+ fontSize: 12,
371
+ lineHeight: '18px',
372
+ padding: '16px 0',
373
+ }
374
+
205
375
  /**
206
376
  * Global styles for pseudo-class interactions (inline styles can't express
207
377
  * :hover/:focus-visible). Injected once per document under a plugin-scoped id.
@@ -209,15 +379,94 @@ export const emptyNote: CSSProperties = {
209
379
  const GLOBAL_CSS_ID = 'dsh-git-ui/styles'
210
380
 
211
381
  const globalCss = [
212
- '.dsh-git-ui__pill:hover { background: var(--dsw-alias-interactive-bg-hover); }',
213
- '.dsh-git-ui__pill:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
382
+ // Elevated 面滚动条重绑(宿主 scrollbar.css 契约:浮起表面须用 l2 滑块对,
383
+ // 否则滑块底色与 layer-3 面同色而隐形)——popup / Git 中心 Modal / 自绘下拉。
384
+ '.dsh-git-ui__pop, .dsh-git-ui__center, .dsh-git-ui__select-menu { --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2); }',
385
+
386
+ // 浮层入场(emil「勿从 scale(0) 入场」「浮层 origin-aware」):
387
+ // popup 默认下展 → top center;SelectMenu 始终按钮左下展 → top left。
388
+ // @starting-style 无 JS 入场;不支持的引擎降级为瞬现(无功能回归)。
389
+ '.dsh-git-ui__pop, .dsh-git-ui__select-menu { transition: opacity 150ms ease-out, transform 150ms ease-out; }',
390
+ '.dsh-git-ui__pop { transform-origin: top center; }',
391
+ '.dsh-git-ui__select-menu { transform-origin: top left; }',
392
+ '.dsh-git-ui__pop, .dsh-git-ui__select-menu { opacity: 1; transform: scale(1); @starting-style { opacity: 0; transform: scale(0.97); } }',
393
+
394
+ // ── 基础几何 + 过渡(含按压 transform,GPU 友好;禁用 transition: all)──────
214
395
  '.dsh-git-ui__row { border-radius: 6px; }',
215
- '.dsh-git-ui__row:hover { background: var(--dsw-alias-interactive-bg-hover); }',
216
- '.dsh-git-ui__refresh:hover { color: var(--dsw-alias-state-business-primary); }',
396
+ // 按压即时缩放:所有可按压元素 :active 时 scale(0.97),松手回弹(emil「按钮必须可按压」)。
397
+ '.dsh-git-ui__pill { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
398
+ '.dsh-git-ui__commit-row, .dsh-git-ui__row { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
399
+ '.dsh-git-ui__refresh { transition: transform var(--ds-transition-duration-fast) ease-out, color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
400
+ // 输入框 hover 反馈:边框由 l2 加深至 l1(聚焦环由 focus-visible 承担)。
401
+ '.dsh-git-ui__branch-input, .dsh-git-ui__commit-input { transition: border-color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
402
+ // System tab underline: 2px bar below the active tab.
403
+ '.dsh-git-ui__tab { transition: transform var(--ds-transition-duration-fast) ease-out, color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
404
+ '.dsh-git-ui__tab::after { content: ""; position: absolute; right: 0; bottom: 1px; left: 0; height: 2px; border-radius: 2px; background: transparent; transition: background var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
405
+ '.dsh-git-ui__tab--active::after { background: var(--dsw-alias-state-business-primary); }',
406
+ // 工具栏下拉按钮:hover 淡底 + 缓动(与图标按钮同一交互语言)。
407
+ '.dsh-git-ui__toolbar-select { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out), border-color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
408
+ // IDEA 式悬停操作:行尾图标默认隐藏,悬停/键盘聚焦显现(元素常驻,无布局跳动)。
409
+ '.dsh-git-ui__row-actions { opacity: 0; transition: opacity var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
410
+ '.dsh-git-ui__row:focus-within .dsh-git-ui__row-actions { opacity: 1; }',
411
+ // 行操作图标按钮的过渡。
412
+ '.dsh-git-ui__icon-btn { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out), color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
413
+ '.dsh-git-ui__icon-btn:disabled { opacity: 0.45; cursor: default; }',
414
+ '.dsh-git-ui__refresh:disabled { opacity: 0.45; cursor: default; }',
415
+ // popup 变更文件名按钮(打开 Git 中心 diff):基础主文本色 + hover 主色 + 按压缩放反馈。
416
+ // 基础色也走样式表(内联 color 会压掉 :hover 规则)。
417
+ '.dsh-git-ui__change-link { color: var(--dsw-alias-label-primary); transition: transform var(--ds-transition-duration-fast) ease-out, color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
418
+ '.dsh-git-ui__change-link:hover { color: var(--dsw-alias-state-business-primary); }',
419
+ '.dsh-git-ui__change-link:active { transform: scale(0.97); }',
420
+ '.dsh-git-ui__diff-fold { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out), color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
421
+ // 底栏主操作过渡(按压缩放 + hover 淡底)。
422
+ '.dsh-git-ui__footer-primary { transition: transform var(--ds-transition-duration-fast) ease-out, background var(--ds-transition-duration-fast) var(--ds-ease-in-out), border-color var(--ds-transition-duration-fast) var(--ds-ease-in-out); }',
423
+
424
+ // ── 按压态(:active,触屏与指针均触发,不闸控)────────────────────────
425
+ // 仅叶子按钮缩放;.dsh-git-ui__row 是含 checkbox/按钮的容器行,:active 会向
426
+ // 祖先传播——按压其子按钮会令整行缩放(非预期),故行级仅用底色反馈(见下条)。
427
+ '.dsh-git-ui__pill:active, .dsh-git-ui__icon-btn:active, .dsh-git-ui__tab:active, .dsh-git-ui__refresh:active, .dsh-git-ui__toolbar-select:active, .dsh-git-ui__diff-fold:active, .dsh-git-ui__commit-row:active, .dsh-git-ui__footer-primary:active { transform: scale(0.97); }',
428
+ '.dsh-git-ui__commit-row:active, .dsh-git-ui__row:active { background: var(--dsw-alias-interactive-bg-active); }',
429
+ '.dsh-git-ui__icon-btn:active { background: var(--dsw-alias-interactive-bg-active); }',
430
+
431
+ // ── 键盘焦点(始终可见,不闸控)──────────────────────────────────────
432
+ '.dsh-git-ui__pill:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
433
+ '.dsh-git-ui__row:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
434
+ '.dsh-git-ui__commit-row:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
217
435
  '.dsh-git-ui__refresh:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: 2px; }',
218
- // Git center dialog: widen the platform Modal card (headless mode).
219
- '.dsh-git-ui__center { width: min(880px, 100vw); max-height: min(720px, calc(100vh - 48px)); }',
220
436
  '.dsh-git-ui__commit-input:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
437
+ '.dsh-git-ui__branch-input:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
438
+ '.dsh-git-ui__tab:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; border-radius: 4px; }',
439
+ '.dsh-git-ui__toolbar-select:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
440
+ '.dsh-git-ui__icon-btn:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
441
+ '.dsh-git-ui__diff-fold:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
442
+ '.dsh-git-ui__footer-primary:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }',
443
+
444
+ // Git center dialog: widen the platform Modal card (headless mode).
445
+ '.dsh-git-ui__center { width: min(1200px, 100vw); height: min(760px, calc(100vh - 48px)); }',
446
+
447
+ // ── 悬停态(仅指针设备,触屏 tap 不误激活——emil/apple 闸控规则)──────
448
+ '@media (hover: hover) and (pointer: fine) {',
449
+ ' .dsh-git-ui__pill:hover { background: var(--dsw-alias-interactive-bg-hover); }',
450
+ ' .dsh-git-ui__row:hover { background: var(--dsw-alias-interactive-bg-hover); }',
451
+ ' .dsh-git-ui__commit-row:hover { background: var(--dsw-alias-interactive-bg-hover); }',
452
+ ' .dsh-git-ui__splitter:hover { background: var(--dsw-alias-interactive-bg-hover); }',
453
+ ' .dsh-git-ui__refresh:hover { color: var(--dsw-alias-state-business-primary); }',
454
+ ' .dsh-git-ui__branch-input:hover, .dsh-git-ui__commit-input:hover { border-color: var(--dsw-alias-border-l1); }',
455
+ ' .dsh-git-ui__tab:hover { color: var(--dsw-alias-label-primary); }',
456
+ ' .dsh-git-ui__toolbar-select:hover { background: var(--dsw-alias-interactive-bg-hover); border-color: var(--dsw-alias-border-l1); }',
457
+ ' .dsh-git-ui__icon-btn:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }',
458
+ ' .dsh-git-ui__diff-fold:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-secondary); }',
459
+ ' .dsh-git-ui__footer-primary:hover { background: var(--dsw-alias-interactive-bg-hover); }',
460
+ ' .dsh-git-ui__row:hover .dsh-git-ui__row-actions { opacity: 1; }',
461
+ '}',
462
+
463
+ // 触屏(无 hover)回退:行尾操作常驻显现,弥补 hover 闸控后触屏不可见的缺口。
464
+ '@media (hover: none) { .dsh-git-ui__row-actions { opacity: 1; } }',
465
+
466
+ // ── 减弱动效(保留辅助理解的透明度/颜色过渡,移除位移与缩放——apple 规则)──
467
+ '@media (prefers-reduced-motion: reduce) {',
468
+ ' .dsh-git-ui__pill, .dsh-git-ui__pop, .dsh-git-ui__select-menu, .dsh-git-ui__icon-btn, .dsh-git-ui__tab, .dsh-git-ui__commit-row, .dsh-git-ui__row, .dsh-git-ui__branch-input, .dsh-git-ui__commit-input, .dsh-git-ui__toolbar-select, .dsh-git-ui__diff-fold, .dsh-git-ui__refresh, .dsh-git-ui__footer-primary, .dsh-git-ui__change-link { transition: opacity 200ms ease, background 200ms ease, color 200ms ease, border-color 200ms ease !important; transform: none !important; }',
469
+ '}',
221
470
  ].join('\n')
222
471
 
223
472
  /** Ensure the global interaction styles exist (idempotent; browser only). */
@@ -237,8 +486,6 @@ export const centerShell: CSSProperties = {
237
486
  display: 'flex',
238
487
  flexDirection: 'column',
239
488
  height: '100%',
240
- maxHeight: 'min(720px, calc(100vh - 48px))',
241
- minHeight: 420,
242
489
  fontSize: 13,
243
490
  lineHeight: '20px',
244
491
  color: 'var(--dsw-alias-label-primary)',
@@ -248,16 +495,16 @@ export const centerHeader: CSSProperties = {
248
495
  display: 'flex',
249
496
  alignItems: 'center',
250
497
  gap: 10,
251
- padding: '18px 20px 12px',
252
- borderBottom: '1px solid var(--dsw-alias-border-l1)',
498
+ padding: '16px 20px 12px',
499
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
253
500
  flex: 'none',
254
501
  }
255
502
 
256
503
  export const centerTitle: CSSProperties = {
257
504
  margin: 0,
258
- fontSize: 16,
259
- lineHeight: '24px',
260
- fontWeight: 500,
505
+ fontSize: 15,
506
+ lineHeight: '22px',
507
+ fontWeight: 600,
261
508
  flex: 1,
262
509
  overflow: 'hidden',
263
510
  textOverflow: 'ellipsis',
@@ -268,42 +515,138 @@ export const centerTitle: CSSProperties = {
268
515
  export const centerBody: CSSProperties = {
269
516
  flex: 1,
270
517
  overflowY: 'auto',
271
- padding: '10px 20px',
518
+ padding: '12px 20px',
272
519
  display: 'flex',
273
520
  flexDirection: 'column',
274
521
  gap: 10,
275
522
  }
276
523
 
277
- export const groupTitle: CSSProperties = {
278
- margin: '8px 0 4px',
279
- fontSize: 11,
280
- fontWeight: 600,
281
- color: 'var(--dsw-alias-label-secondary)',
282
- textTransform: 'uppercase',
283
- letterSpacing: 0.4,
284
- }
285
-
286
524
  export const centerRow: CSSProperties = {
287
525
  display: 'flex',
288
526
  alignItems: 'center',
289
- gap: 8,
290
- padding: '2px 8px',
291
- borderRadius: 8,
527
+ gap: 6,
528
+ height: 28,
529
+ flexShrink: 0,
530
+ padding: '0 8px',
531
+ borderRadius: 6,
292
532
  }
293
533
 
294
- export const changeCheckbox: CSSProperties = {
534
+ /** 差异对照激活行:淡底标识当前查看的文件(IDEA 选中行语义)。 */
535
+ export const centerRowActive: CSSProperties = {
536
+ background: 'var(--dsw-alias-interactive-bg-hover)',
537
+ }
538
+
539
+ /** 行尾操作槽:定宽右对齐(常驻占位,图标显隐由全局 CSS 控制,杜绝悬停布局跳动)。 */
540
+ export const rowActions: CSSProperties = {
541
+ display: 'inline-flex',
542
+ alignItems: 'center',
543
+ justifyContent: 'flex-end',
544
+ gap: 2,
295
545
  flex: 'none',
296
- accentColor: 'var(--dsw-alias-state-business-primary)',
546
+ width: 78,
547
+ }
548
+
549
+ /** 行操作图标按钮(24px 方形、透明底;交互态见全局 CSS)。 */
550
+ export const rowIconButton: CSSProperties = {
551
+ display: 'inline-flex',
552
+ alignItems: 'center',
553
+ justifyContent: 'center',
554
+ flex: 'none',
555
+ width: 24,
556
+ height: 24,
557
+ border: 'none',
558
+ background: 'transparent',
559
+ borderRadius: 6,
560
+ cursor: 'pointer',
561
+ padding: 0,
562
+ color: 'var(--dsw-alias-label-secondary)',
297
563
  }
298
564
 
299
- export const changePathText: CSSProperties = {
565
+ /** 文件名前的轻量文件图标槽。 */
566
+ export const rowFileIcon: CSSProperties = {
567
+ flex: 'none',
568
+ display: 'inline-flex',
569
+ alignItems: 'center',
570
+ color: 'var(--dsw-alias-label-tertiary)',
571
+ }
572
+
573
+ /**
574
+ * 文件名按钮(状态着色由行内注入)。
575
+ * flex:'0 1 auto' + minWidth:0 + 封顶 65%:按需收缩、可省略;目录优先省略、
576
+ * 文件名尽量完整(旧 maxWidth:55% 相对整行宽,短名也过度占位、挤压目录)。
577
+ */
578
+ export const changeName: CSSProperties = {
579
+ border: 'none',
580
+ background: 'transparent',
581
+ cursor: 'pointer',
582
+ padding: 0,
583
+ fontFamily: 'inherit',
584
+ fontSize: 13,
585
+ lineHeight: '20px',
586
+ textAlign: 'left',
587
+ flex: '0 1 auto',
588
+ minWidth: 0,
589
+ maxWidth: '65%',
300
590
  overflow: 'hidden',
301
591
  textOverflow: 'ellipsis',
302
592
  whiteSpace: 'nowrap',
593
+ }
594
+
595
+ /** 行尾状态字母:无底色,IDEA 式单色字符。 */
596
+ export const statusLetter: CSSProperties = {
597
+ flex: 'none',
598
+ width: 14,
599
+ textAlign: 'center',
600
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
601
+ fontSize: 11,
602
+ fontWeight: 600,
603
+ }
604
+
605
+ /** IDEA 式分组头:粘性吸顶,全选复选 + 折叠箭头 + 名称 + 计数。
606
+ * 发丝级底部分隔(l2)让吸顶头与滚动内容轻轻分离,不产生重边框。 */
607
+ export const groupHeader: CSSProperties = {
608
+ position: 'sticky',
609
+ top: 0,
610
+ zIndex: 1,
611
+ display: 'flex',
612
+ alignItems: 'center',
613
+ gap: 6,
614
+ height: 30,
615
+ flexShrink: 0,
616
+ padding: '0 8px',
617
+ background: 'var(--dsw-alias-bg-layer-2)',
618
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
619
+ }
620
+
621
+ /** 分组头折叠按钮(箭头 + 名称 + 计数一体可点)。 */
622
+ export const groupHeaderToggle: CSSProperties = {
623
+ display: 'flex',
624
+ alignItems: 'center',
625
+ gap: 6,
303
626
  flex: 1,
304
- color: 'var(--dsw-alias-label-primary)',
305
- fontSize: 13,
627
+ minWidth: 0,
628
+ border: 'none',
629
+ background: 'transparent',
630
+ cursor: 'pointer',
631
+ padding: 0,
632
+ fontFamily: 'inherit',
633
+ fontSize: 12,
306
634
  lineHeight: '20px',
635
+ fontWeight: 600,
636
+ textAlign: 'left',
637
+ color: 'var(--dsw-alias-label-secondary)',
638
+ }
639
+
640
+ /** 分组头计数(弱化)。 */
641
+ export const groupHeaderCount: CSSProperties = {
642
+ fontWeight: 400,
643
+ fontSize: 11,
644
+ color: 'var(--dsw-alias-label-tertiary)',
645
+ }
646
+
647
+ export const changeCheckbox: CSSProperties = {
648
+ flex: 'none',
649
+ accentColor: 'var(--dsw-alias-state-business-primary)',
307
650
  }
308
651
 
309
652
  export const toolRow: CSSProperties = {
@@ -315,12 +658,13 @@ export const toolRow: CSSProperties = {
315
658
  }
316
659
 
317
660
  export const commitBox: CSSProperties = {
318
- borderTop: '1px solid var(--dsw-alias-border-l1)',
661
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
319
662
  padding: '12px 20px 16px',
320
663
  display: 'flex',
321
664
  flexDirection: 'column',
322
665
  gap: 8,
323
666
  flex: 'none',
667
+ marginTop: 'auto',
324
668
  background: 'var(--dsw-alias-bg-layer-1)',
325
669
  }
326
670
 
@@ -329,11 +673,11 @@ export const commitInput: CSSProperties = {
329
673
  boxSizing: 'border-box',
330
674
  minHeight: 64,
331
675
  resize: 'vertical',
332
- border: '1px solid var(--dsw-alias-border-l1)',
676
+ border: '1px solid var(--dsw-alias-border-l2)',
333
677
  borderRadius: 8,
334
678
  padding: '6px 10px',
335
- fontSize: 14,
336
- lineHeight: '22px',
679
+ fontSize: 13,
680
+ lineHeight: '20px',
337
681
  fontFamily: 'inherit',
338
682
  background: 'var(--dsw-alias-bg-layer-2)',
339
683
  color: 'var(--dsw-alias-label-primary)',
@@ -361,22 +705,967 @@ export const feedbackError: CSSProperties = {
361
705
  borderRadius: 8,
362
706
  fontSize: 12,
363
707
  lineHeight: '18px',
364
- background: 'var(--dsw-alias-state-error-secondary)',
365
- color: 'var(--dsw-alias-state-error-primary)',
708
+ // 淡晕背景 + 高对比文字(与 sbsDel/chip 同一配色语言);
709
+ // 旧用 state-error-secondary 饱和填充 + error-primary 同色系文字,
710
+ // 对比度极低、文字几乎不可读。
711
+ background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent)',
712
+ color: 'var(--dsw-alias-label-primary)',
713
+ borderLeft: '3px solid var(--dsw-alias-state-error-primary)',
366
714
  whiteSpace: 'pre-wrap',
367
715
  wordBreak: 'break-word',
368
716
  maxHeight: 120,
369
717
  overflowY: 'auto',
370
718
  }
371
719
 
372
- export const feedbackClose: CSSProperties = {
720
+ /** popup 告警横幅(emil §cohesion:告警而非 panic):
721
+ * 淡晕背景 + 高对比文字 + 左侧红色语义条 + 图标引导。
722
+ * 与 popup 同一圆角/间距体系,不是「错误弹窗」是「内嵌告警」。 */
723
+ export const popupNote: CSSProperties = {
724
+ display: 'flex',
725
+ alignItems: 'flex-start',
726
+ gap: 8,
727
+ margin: '8px 12px 0',
728
+ padding: '8px 10px',
729
+ borderRadius: 8,
730
+ fontSize: 12,
731
+ lineHeight: '18px',
732
+ background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent)',
733
+ color: 'var(--dsw-alias-label-primary)',
734
+ borderLeft: '3px solid var(--dsw-alias-state-error-primary)',
735
+ wordBreak: 'break-word',
736
+ }
737
+
738
+ /** 告警图标槽:error-primary 色,与左侧条同色呼应。 */
739
+ export const popupNoteIcon: CSSProperties = {
373
740
  flex: 'none',
374
- border: 0,
741
+ display: 'inline-flex',
742
+ alignItems: 'center',
743
+ color: 'var(--dsw-alias-state-error-primary)',
744
+ marginTop: 1,
745
+ }
746
+
747
+ /** 告警文案段:flex 收缩 + 省略兜底。 */
748
+ export const popupNoteText: CSSProperties = {
749
+ flex: 1,
750
+ minWidth: 0,
751
+ color: 'var(--dsw-alias-label-secondary)',
752
+ }
753
+
754
+ /** 告警行动按钮:error-primary 文字 + 无框(非 primary Button,内联轻量)。 */
755
+ export const popupNoteAction: CSSProperties = {
756
+ flex: 'none',
757
+ border: 'none',
375
758
  background: 'transparent',
376
- padding: '0 2px',
377
- cursor: 'pointer',
378
- color: 'inherit',
379
- fontSize: 13,
759
+ padding: '2px 6px',
760
+ font: 'inherit',
761
+ fontSize: 12,
380
762
  lineHeight: '18px',
381
- opacity: 0.7,
763
+ cursor: 'pointer',
764
+ color: 'var(--dsw-alias-state-error-primary)',
765
+ whiteSpace: 'nowrap',
766
+ }
767
+
768
+ /** 告警关闭按钮:弱化,不影响告警内容阅读。 */
769
+ export const popupNoteClose: CSSProperties = {
770
+ flex: 'none',
771
+ display: 'inline-flex',
772
+ alignItems: 'center',
773
+ justifyContent: 'center',
774
+ width: 20,
775
+ height: 20,
776
+ border: 'none',
777
+ background: 'transparent',
778
+ padding: 0,
779
+ cursor: 'pointer',
780
+ font: 'inherit',
781
+ color: 'var(--dsw-alias-label-tertiary)',
782
+ opacity: 0.7,
783
+ }
784
+
785
+ export const feedbackClose: CSSProperties = {
786
+ flex: 'none',
787
+ border: 0,
788
+ background: 'transparent',
789
+ padding: '0 2px',
790
+ cursor: 'pointer',
791
+ color: 'inherit',
792
+ fontSize: 13,
793
+ lineHeight: '18px',
794
+ opacity: 0.7,
795
+ }
796
+
797
+ // ── Changes 双栏布局(IDEA 式:左列表 + 右对照)─────────────────────
798
+
799
+ export const changesLayout: CSSProperties = {
800
+ display: 'flex',
801
+ gap: 12,
802
+ flex: 1,
803
+ minHeight: 0,
804
+ }
805
+
806
+ export const changesLeft: CSSProperties = {
807
+ flex: 'none',
808
+ minWidth: 0,
809
+ display: 'flex',
810
+ flexDirection: 'column',
811
+ minHeight: 0,
812
+ }
813
+
814
+ export const changesList: CSSProperties = {
815
+ flex: 1,
816
+ minHeight: 0,
817
+ overflowY: 'auto',
818
+ display: 'flex',
819
+ flexDirection: 'column',
820
+ gap: 0,
821
+ }
822
+
823
+ export const changesRight: CSSProperties = {
824
+ flex: 1,
825
+ minWidth: 0,
826
+ display: 'flex',
827
+ flexDirection: 'column',
828
+ gap: 6,
829
+ borderLeft: '1px solid var(--dsw-alias-border-l2)',
830
+ paddingLeft: 12,
831
+ }
832
+
833
+ /** 变更行目录部分(弱化显示,与文件名同阶 12px,IDEA 同尺寸弱化)。 */
834
+ export const changeDir: CSSProperties = {
835
+ overflow: 'hidden',
836
+ textOverflow: 'ellipsis',
837
+ whiteSpace: 'nowrap',
838
+ flex: 1,
839
+ minWidth: 0,
840
+ color: 'var(--dsw-alias-label-tertiary)',
841
+ fontSize: 12,
842
+ }
843
+
844
+ // ── 并排差异对照 ───────────────────────────────────────────────────────
845
+
846
+ /**
847
+ * 差异并排容器:双列独立横向滚动。
848
+ * display:flex 横排两列;纵向单一滚动(overflow-y:auto)保证左右行同步对齐,
849
+ * 横向不滚动(overflow-x:hidden)——每列各自 overflow-x:auto 独立滚动,
850
+ * 内容只在本列展示,根治长行左右重叠。
851
+ */
852
+ export const sbsContainer: CSSProperties = {
853
+ flex: 1,
854
+ minHeight: 0,
855
+ display: 'flex',
856
+ overflowY: 'auto',
857
+ overflowX: 'hidden',
858
+ alignItems: 'flex-start',
859
+ border: '1px solid var(--dsw-alias-border-l2)',
860
+ borderRadius: 8,
861
+ background: 'var(--dsw-alias-bg-layer-2)',
862
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
863
+ fontSize: 11,
864
+ lineHeight: '18px',
865
+ }
866
+
867
+ /** 差异列(左/右各一):独立横向滚动,纵向不滚动(由容器统一滚动)。 */
868
+ export const sbsCol: CSSProperties = {
869
+ flex: 1,
870
+ minWidth: 0,
871
+ overflowX: 'auto',
872
+ overflowY: 'hidden',
873
+ }
874
+
875
+ /** 右列:左侧发丝分隔线(取代旧 sbsCellRight 的单元格边框)。 */
876
+ export const sbsColRight: CSSProperties = {
877
+ borderLeft: '1px solid var(--dsw-alias-border-l2)',
878
+ }
879
+
880
+ /**
881
+ * 列内容包装:width:max-content 使长行撑宽触发本列横向滚动;
882
+ * min-width:100% 使短行背景填满列宽。两列独立,互不重叠。
883
+ */
884
+ export const sbsColInner: CSSProperties = {
885
+ minWidth: '100%',
886
+ width: 'max-content',
887
+ }
888
+
889
+ /** 差异行单元格:填满列内宽(width:100%),背景覆盖整行——根治滑动后同行后半段无配色。 */
890
+ export const sbsCell: CSSProperties = {
891
+ boxSizing: 'border-box',
892
+ display: 'flex',
893
+ gap: 6,
894
+ padding: '0 8px',
895
+ whiteSpace: 'pre',
896
+ width: '100%',
897
+ }
898
+
899
+ /** 代码文本段:pre 不换行、flex:none 不收缩(保持原始列宽,不被压缩)。 */
900
+ export const sbsCode: CSSProperties = {
901
+ whiteSpace: 'pre',
902
+ flex: 'none',
903
+ }
904
+
905
+ /** 行号槽:定宽右对齐 + 右侧发丝线,数字与代码间留 8px 呼吸。 */
906
+ export const sbsNum: CSSProperties = {
907
+ flex: 'none',
908
+ width: 36,
909
+ textAlign: 'right',
910
+ paddingRight: 8,
911
+ marginRight: 2,
912
+ color: 'var(--dsw-alias-label-tertiary)',
913
+ userSelect: 'none',
914
+ borderRight: '1px solid var(--dsw-alias-border-l2)',
915
+ }
916
+
917
+ /**
918
+ * 差异行配色(IDEA 式:低饱和淡晕背景 + 始终可读的文字)。
919
+ * 旧实现用 state-*-secondary 饱和填充作背景、state-*-primary 作文字色,
920
+ * 同色系背景覆盖同色系文字,明暗主题下均低对比且与页面风格冲突。
921
+ * 现以 color-mix 由语义令牌派生 ~12% 淡晕(主题自适应;旧引擎降级为透明,
922
+ * 文字仍可读),文字统一 label-primary。
923
+ */
924
+ export const sbsDel: CSSProperties = {
925
+ background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)',
926
+ color: 'var(--dsw-alias-label-primary)',
927
+ }
928
+
929
+ export const sbsAdd: CSSProperties = {
930
+ background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)',
931
+ color: 'var(--dsw-alias-label-primary)',
932
+ }
933
+
934
+ export const sbsEmpty: CSSProperties = {
935
+ background: 'var(--dsw-alias-bg-layer-1)',
936
+ }
937
+
938
+ // ── 差异工具栏(IDEA 式:基线徽标 + 路径 + 前后导航 + 关闭)──────────────
939
+
940
+ /** 差异面板工具栏。 */
941
+ export const diffToolbar: CSSProperties = {
942
+ display: 'flex',
943
+ alignItems: 'center',
944
+ gap: 6,
945
+ flex: 'none',
946
+ height: 32,
947
+ padding: '0 2px',
948
+ }
949
+
950
+ /** 差异基线徽标(暂存区 / 工作区):pill 同族的发丝描边小胶囊。 */
951
+ export const diffBaseBadge: CSSProperties = {
952
+ flex: 'none',
953
+ padding: '2px 8px',
954
+ borderRadius: 10,
955
+ border: '1px solid var(--dsw-alias-border-l2)',
956
+ background: 'var(--dsw-alias-bg-layer-2)',
957
+ color: 'var(--dsw-alias-label-secondary)',
958
+ fontSize: 11,
959
+ lineHeight: '14px',
960
+ fontWeight: 500,
961
+ whiteSpace: 'nowrap',
962
+ }
963
+
964
+ /** 差异路径目录段(弱化、flex:1 优先省略,文件名尽量完整)。 */
965
+ export const diffPathDir: CSSProperties = {
966
+ flex: 1,
967
+ minWidth: 0,
968
+ overflow: 'hidden',
969
+ textOverflow: 'ellipsis',
970
+ whiteSpace: 'nowrap',
971
+ fontSize: 12,
972
+ color: 'var(--dsw-alias-label-tertiary)',
973
+ }
974
+
975
+ /** 差异路径文件名段(强调)。 */
976
+ export const diffPathName: CSSProperties = {
977
+ flex: 'none',
978
+ fontSize: 12,
979
+ fontWeight: 500,
980
+ color: 'var(--dsw-alias-label-primary)',
981
+ whiteSpace: 'nowrap',
982
+ }
983
+
984
+ /** 差异变更摘要芯片(+n −m,等宽)。 */
985
+ export const diffSummary: CSSProperties = {
986
+ flex: 'none',
987
+ display: 'inline-flex',
988
+ gap: 8,
989
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
990
+ fontSize: 11,
991
+ fontWeight: 600,
992
+ lineHeight: '16px',
993
+ }
994
+
995
+ export const diffSummaryAdd: CSSProperties = {
996
+ color: 'var(--dsw-alias-state-success-primary)',
997
+ }
998
+
999
+ export const diffSummaryDel: CSSProperties = {
1000
+ color: 'var(--dsw-alias-state-error-primary)',
1001
+ }
1002
+
1003
+ /** 折叠条:可点击展开的「… N 行未变更」横条(发丝实线上下缘,层 1 淡底)。 */
1004
+ export const diffFold: CSSProperties = {
1005
+ display: 'block',
1006
+ width: '100%',
1007
+ border: 'none',
1008
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
1009
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1010
+ background: 'var(--dsw-alias-bg-layer-1)',
1011
+ color: 'var(--dsw-alias-label-tertiary)',
1012
+ fontSize: 11,
1013
+ lineHeight: '20px',
1014
+ padding: '2px 8px',
1015
+ cursor: 'pointer',
1016
+ fontFamily: 'inherit',
1017
+ textAlign: 'center',
1018
+ }
1019
+
1020
+ /** 提交区快捷键提示(等宽弱化)。 */
1021
+ export const commitKbd: CSSProperties = {
1022
+ flex: 'none',
1023
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
1024
+ fontSize: 11,
1025
+ color: 'var(--dsw-alias-label-tertiary)',
1026
+ }
1027
+
1028
+ // ── Git center tabs (system tab spec: 13/16/500, 2px indicator) ───────────
1029
+
1030
+ export const tabs: CSSProperties = {
1031
+ display: 'flex',
1032
+ gap: 24,
1033
+ padding: '0 20px',
1034
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1035
+ flex: 'none',
1036
+ }
1037
+
1038
+ export const tab: CSSProperties = {
1039
+ position: 'relative',
1040
+ padding: '0 0 11px',
1041
+ border: 'none',
1042
+ background: 'transparent',
1043
+ fontSize: 13,
1044
+ lineHeight: '16px',
1045
+ fontWeight: 500,
1046
+ color: 'var(--dsw-alias-label-tertiary)',
1047
+ cursor: 'pointer',
1048
+ fontFamily: 'inherit',
1049
+ }
1050
+
1051
+ /** Active-tab underline rides a pseudo-element (see global CSS). */
1052
+ export const tabActive: CSSProperties = {
1053
+ color: 'var(--dsw-alias-state-business-primary)',
1054
+ }
1055
+
1056
+ // ── History tab ───────────────────────────────────────────────────────────
1057
+
1058
+ /**
1059
+ * 历史行高:单一事实来源。行样式与分支图 SVG 共用该常量,
1060
+ * 保证条带占满整行、竖线在行间连续衔接(旧实现 36px 条带 vs 50px 行高导致虚线)。
1061
+ */
1062
+ export const HISTORY_ROW_H = 32
1063
+
1064
+ export const historyLayout: CSSProperties = {
1065
+ display: 'flex',
1066
+ gap: 0,
1067
+ flex: 1,
1068
+ minHeight: 0,
1069
+ }
1070
+
1071
+ /** 左栏滚动区(外壳 paneSide 提供宽/底/边线)。 */
1072
+ export const historyTree: CSSProperties = {
1073
+ flex: 1,
1074
+ minHeight: 0,
1075
+ overflowY: 'auto',
1076
+ display: 'flex',
1077
+ flexDirection: 'column',
1078
+ gap: 1,
1079
+ padding: 6,
1080
+ fontSize: 12,
1081
+ lineHeight: '20px',
1082
+ }
1083
+
1084
+ export const treeGroupTitle: CSSProperties = {
1085
+ margin: '8px 0 2px',
1086
+ padding: '0 8px',
1087
+ fontSize: 11,
1088
+ fontWeight: 600,
1089
+ color: 'var(--dsw-alias-label-tertiary)',
1090
+ }
1091
+
1092
+ /** 可折叠分组头(箭头 + 标题)。 */
1093
+ export const treeSectionHead: CSSProperties = {
1094
+ display: 'flex',
1095
+ alignItems: 'center',
1096
+ gap: 4,
1097
+ margin: '8px 0 2px',
1098
+ padding: '2px 8px',
1099
+ border: 'none',
1100
+ background: 'transparent',
1101
+ borderRadius: 6,
1102
+ cursor: 'pointer',
1103
+ fontFamily: 'inherit',
1104
+ fontSize: 11,
1105
+ fontWeight: 600,
1106
+ lineHeight: '16px',
1107
+ textAlign: 'left',
1108
+ color: 'var(--dsw-alias-label-tertiary)',
1109
+ }
1110
+
1111
+ export const treeRow: CSSProperties = {
1112
+ display: 'flex',
1113
+ alignItems: 'center',
1114
+ gap: 6,
1115
+ width: '100%',
1116
+ padding: '4px 8px',
1117
+ border: 'none',
1118
+ background: 'transparent',
1119
+ borderRadius: 6,
1120
+ cursor: 'pointer',
1121
+ fontFamily: 'inherit',
1122
+ fontSize: 12,
1123
+ lineHeight: '20px',
1124
+ textAlign: 'left',
1125
+ color: 'var(--dsw-alias-label-primary)',
1126
+ }
1127
+
1128
+ export const treeRowActive: CSSProperties = {
1129
+ background: 'var(--dsw-alias-interactive-bg-active)',
1130
+ color: 'var(--dsw-alias-state-business-primary)',
1131
+ }
1132
+
1133
+ export const treeIcon: CSSProperties = {
1134
+ flex: 'none',
1135
+ width: 14,
1136
+ display: 'inline-flex',
1137
+ alignItems: 'center',
1138
+ justifyContent: 'center',
1139
+ color: 'var(--dsw-alias-label-tertiary)',
1140
+ }
1141
+
1142
+ /** 文件树折叠箭头槽(与叶子行隐藏占位对齐)。 */
1143
+ export const treeCaret: CSSProperties = {
1144
+ flex: 'none',
1145
+ width: 10,
1146
+ display: 'inline-flex',
1147
+ alignItems: 'center',
1148
+ color: 'var(--dsw-alias-label-tertiary)',
1149
+ }
1150
+
1151
+ /** 文件树图标槽。 */
1152
+ export const treeFolderIcon: CSSProperties = {
1153
+ flex: 'none',
1154
+ display: 'inline-flex',
1155
+ color: 'var(--dsw-alias-label-tertiary)',
1156
+ }
1157
+
1158
+ /** 右栏文件名按变更状态着色(IDEA 式:增绿/改蓝/删红/重命名蓝)。 */
1159
+ export const statusTextColor: Record<string, string> = {
1160
+ added: 'var(--dsw-alias-state-success-primary)',
1161
+ untracked: 'var(--dsw-alias-state-success-primary)',
1162
+ modified: 'var(--dsw-alias-state-business-primary)',
1163
+ renamed: 'var(--dsw-alias-state-business-primary)',
1164
+ deleted: 'var(--dsw-alias-state-error-primary)',
1165
+ conflicted: 'var(--dsw-alias-state-error-primary)',
1166
+ typechange: 'var(--dsw-alias-state-warn-primary)',
1167
+ }
1168
+
1169
+ /** 嵌套层引导线(IDEA 式目录树竖线):发丝级 l2,暗态下不喧宾夺主。 */
1170
+ export const treeChildren: CSSProperties = {
1171
+ marginLeft: 12,
1172
+ borderLeft: '1px solid var(--dsw-alias-border-l2)',
1173
+ }
1174
+
1175
+ export const treeName: CSSProperties = {
1176
+ overflow: 'hidden',
1177
+ textOverflow: 'ellipsis',
1178
+ whiteSpace: 'nowrap',
1179
+ flex: 1,
1180
+ minWidth: 0,
1181
+ }
1182
+
1183
+ export const treeNameCurrent: CSSProperties = {
1184
+ color: 'var(--dsw-alias-state-business-primary)',
1185
+ fontWeight: 600,
1186
+ }
1187
+
1188
+ /** 分支与远程同步差异徽标(↑n ↓m),弱化等宽小字。 */
1189
+ export const treeSyncBadge: CSSProperties = {
1190
+ flex: 'none',
1191
+ fontSize: 10,
1192
+ lineHeight: '14px',
1193
+ color: 'var(--dsw-alias-label-tertiary)',
1194
+ fontVariantNumeric: 'tabular-nums',
1195
+ whiteSpace: 'nowrap',
1196
+ }
1197
+
1198
+ /** 过滤树头部 fetch 按钮(与搜索框同栏)。 */
1199
+ export const treeFetchBtn: CSSProperties = {
1200
+ flex: 'none',
1201
+ border: '1px solid var(--dsw-alias-border-l2)',
1202
+ borderRadius: 8,
1203
+ background: 'var(--dsw-alias-bg-layer-2)',
1204
+ color: 'var(--dsw-alias-label-secondary)',
1205
+ fontSize: 11,
1206
+ lineHeight: '14px',
1207
+ padding: '4px 8px',
1208
+ cursor: 'pointer',
1209
+ font: 'inherit',
1210
+ whiteSpace: 'nowrap',
1211
+ }
1212
+
1213
+ /** fetch 结果提示(成功弱化色 / 失败可见文本)。 */
1214
+ export const treeFetchNote: CSSProperties = {
1215
+ flex: 'none',
1216
+ fontSize: 11,
1217
+ lineHeight: '16px',
1218
+ color: 'var(--dsw-alias-label-tertiary)',
1219
+ padding: '4px 12px',
1220
+ overflow: 'hidden',
1221
+ textOverflow: 'ellipsis',
1222
+ whiteSpace: 'nowrap',
1223
+ }
1224
+
1225
+ /** 中栏顶部工具栏:与左右 paneHead 同高同边线,组成统一头带。 */
1226
+ export const historyToolbar: CSSProperties = {
1227
+ display: 'flex',
1228
+ alignItems: 'center',
1229
+ gap: 6,
1230
+ flex: 'none',
1231
+ height: 40,
1232
+ padding: '0 8px',
1233
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1234
+ }
1235
+
1236
+ export const toolbarSearch: CSSProperties = {
1237
+ flex: 1,
1238
+ minWidth: 80,
1239
+ border: '1px solid var(--dsw-alias-border-l2)',
1240
+ borderRadius: 8,
1241
+ padding: '4px 10px',
1242
+ fontSize: 12,
1243
+ lineHeight: '18px',
1244
+ fontFamily: 'inherit',
1245
+ background: 'var(--dsw-alias-bg-layer-2)',
1246
+ color: 'var(--dsw-alias-label-primary)',
1247
+ }
1248
+
1249
+ export const toolbarSelect: CSSProperties = {
1250
+ flex: 'none',
1251
+ maxWidth: 150,
1252
+ display: 'inline-flex',
1253
+ alignItems: 'center',
1254
+ gap: 6,
1255
+ border: '1px solid var(--dsw-alias-border-l2)',
1256
+ borderRadius: 8,
1257
+ padding: '4px 8px',
1258
+ fontSize: 12,
1259
+ lineHeight: '18px',
1260
+ fontFamily: 'inherit',
1261
+ background: 'var(--dsw-alias-bg-layer-2)',
1262
+ color: 'var(--dsw-alias-label-primary)',
1263
+ cursor: 'pointer',
1264
+ }
1265
+
1266
+ export const selectLabel: CSSProperties = {
1267
+ overflow: 'hidden',
1268
+ textOverflow: 'ellipsis',
1269
+ whiteSpace: 'nowrap',
1270
+ flex: 1,
1271
+ minWidth: 0,
1272
+ textAlign: 'left',
1273
+ }
1274
+
1275
+ /** 自绘下拉菜单卡(平台 Menu 规范:layer-3 面 + l1 边 + lv3 阴影)。 */
1276
+ export const selectMenu: CSSProperties = {
1277
+ position: 'fixed',
1278
+ zIndex: 1200,
1279
+ display: 'flex',
1280
+ flexDirection: 'column',
1281
+ gap: 1,
1282
+ padding: 4,
1283
+ maxHeight: 280,
1284
+ overflowY: 'auto',
1285
+ background: 'var(--dsw-alias-bg-layer-3)',
1286
+ border: '1px solid var(--dsw-alias-border-l1)',
1287
+ borderRadius: 12,
1288
+ boxShadow: 'var(--dsw-shadow-lv3)',
1289
+ }
1290
+
1291
+ export const selectOption: CSSProperties = {
1292
+ display: 'flex',
1293
+ alignItems: 'center',
1294
+ gap: 6,
1295
+ padding: '4px 10px',
1296
+ border: 'none',
1297
+ background: 'transparent',
1298
+ borderRadius: 6,
1299
+ cursor: 'pointer',
1300
+ fontFamily: 'inherit',
1301
+ fontSize: 12,
1302
+ lineHeight: '20px',
1303
+ textAlign: 'left',
1304
+ color: 'var(--dsw-alias-label-primary)',
1305
+ }
1306
+
1307
+ export const selectOptionActive: CSSProperties = {
1308
+ background: 'var(--dsw-alias-interactive-bg-hover)',
1309
+ color: 'var(--dsw-alias-state-business-primary)',
1310
+ }
1311
+
1312
+ /** 无限滚动底部哨兵区。 */
1313
+ export const loadSentinel: CSSProperties = {
1314
+ flex: 'none',
1315
+ padding: '8px 0',
1316
+ textAlign: 'center',
1317
+ color: 'var(--dsw-alias-label-tertiary)',
1318
+ fontSize: 11,
1319
+ lineHeight: '16px',
1320
+ }
1321
+
1322
+ /** 三pane 统一头带(40px,底边线对齐成带)。 */
1323
+ export const paneHead: CSSProperties = {
1324
+ flex: 'none',
1325
+ display: 'flex',
1326
+ alignItems: 'center',
1327
+ gap: 6,
1328
+ height: 40,
1329
+ padding: '0 8px',
1330
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1331
+ }
1332
+
1333
+ /** 左右侧栏外壳(淡底;分隔线按侧内联)。 */
1334
+ export const paneSide: CSSProperties = {
1335
+ flex: 'none',
1336
+ display: 'flex',
1337
+ flexDirection: 'column',
1338
+ minWidth: 0,
1339
+ background: 'var(--dsw-alias-interactive-bg-hover)',
1340
+ }
1341
+
1342
+ /** 左栏搜索框(分支或标签)。 */
1343
+ export const treeSearch: CSSProperties = {
1344
+ flex: 1,
1345
+ minWidth: 0,
1346
+ border: '1px solid var(--dsw-alias-border-l2)',
1347
+ borderRadius: 8,
1348
+ padding: '3px 8px',
1349
+ fontSize: 12,
1350
+ lineHeight: '18px',
1351
+ fontFamily: 'inherit',
1352
+ background: 'var(--dsw-alias-bg-layer-2)',
1353
+ color: 'var(--dsw-alias-label-primary)',
1354
+ }
1355
+
1356
+ /** 左栏搜索匹配文字高亮。 */
1357
+ export const treeMatch: CSSProperties = {
1358
+ color: 'var(--dsw-alias-state-business-primary)',
1359
+ fontWeight: 600,
1360
+ }
1361
+
1362
+ /** 头带小图标按钮(全部展开/收起等)。 */
1363
+ export const paneHeadButton: CSSProperties = {
1364
+ flex: 'none',
1365
+ display: 'inline-flex',
1366
+ alignItems: 'center',
1367
+ justifyContent: 'center',
1368
+ width: 24,
1369
+ height: 24,
1370
+ border: 'none',
1371
+ background: 'transparent',
1372
+ borderRadius: 6,
1373
+ cursor: 'pointer',
1374
+ color: 'var(--dsw-alias-label-secondary)',
1375
+ }
1376
+
1377
+ /** 拖拽分割条:常驻发丝线(暗态可见)+ 悬停淡底提示可拖。 */
1378
+ export const splitter: CSSProperties = {
1379
+ flex: 'none',
1380
+ width: 5,
1381
+ marginLeft: -3,
1382
+ cursor: 'col-resize',
1383
+ background: 'transparent',
1384
+ borderLeft: '1px solid var(--dsw-alias-border-l2)',
1385
+ zIndex: 1,
1386
+ }
1387
+
1388
+ export const splitterRow: CSSProperties = {
1389
+ flex: 'none',
1390
+ height: 5,
1391
+ marginTop: -3,
1392
+ cursor: 'row-resize',
1393
+ background: 'transparent',
1394
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
1395
+ zIndex: 1,
1396
+ }
1397
+
1398
+ /** 中栏外壳:工具栏固定 + 滚动列表(工具栏不随列表滚动)。 */
1399
+ export const historyColumn: CSSProperties = {
1400
+ display: 'flex',
1401
+ flexDirection: 'column',
1402
+ flex: 1,
1403
+ minHeight: 0,
1404
+ minWidth: 0,
1405
+ }
1406
+
1407
+ export const historyList: CSSProperties = {
1408
+ flex: 1,
1409
+ minHeight: 0,
1410
+ overflowY: 'auto',
1411
+ overflowX: 'auto',
1412
+ display: 'flex',
1413
+ flexDirection: 'column',
1414
+ gap: 0,
1415
+ paddingRight: 8,
1416
+ }
1417
+
1418
+ /** 单行表格行:固定行高,图 + refs + 主题 + 哈希 + 作者 + 时间一行排布。
1419
+ * 列宽由组件内 gridTemplateColumns 注入(与表头共用同一模板)。
1420
+ * 行盒 = max(内容宽, 列表宽):超宽图时撑开列表横向滚动区。 */
1421
+ export const historyRow: CSSProperties = {
1422
+ display: 'grid',
1423
+ alignItems: 'center',
1424
+ alignSelf: 'flex-start',
1425
+ columnGap: 8,
1426
+ minWidth: '100%',
1427
+ width: 'auto',
1428
+ height: HISTORY_ROW_H,
1429
+ flexShrink: 0,
1430
+ padding: 0,
1431
+ border: 'none',
1432
+ background: 'transparent',
1433
+ textAlign: 'left',
1434
+ cursor: 'pointer',
1435
+ fontFamily: 'inherit',
1436
+ fontSize: 13,
1437
+ lineHeight: '20px',
1438
+ color: 'var(--dsw-alias-label-primary)',
1439
+ }
1440
+
1441
+ /** 搜索条目装饰圆点槽(28px 列居中,替代分支图位置,条目不紧贴左侧)。 */
1442
+ export const searchDot: CSSProperties = {
1443
+ display: 'flex',
1444
+ alignItems: 'center',
1445
+ justifyContent: 'center',
1446
+ }
1447
+
1448
+ /** 装饰圆点本体:8px 直径 + 背景描边(与分支图节点圆同一视觉语言)。 */
1449
+ export const searchDotInner: CSSProperties = {
1450
+ width: 8,
1451
+ height: 8,
1452
+ borderRadius: '50%',
1453
+ border: '1.5px solid var(--dsw-alias-bg-layer-2)',
1454
+ flex: 'none',
1455
+ }
1456
+
1457
+ export const historyRowSelected: CSSProperties = {
1458
+ background: 'var(--dsw-alias-interactive-bg-active)',
1459
+ }
1460
+
1461
+ /** 表头:粘性置顶,与行共用列模板(跨行对齐的表格契约)。
1462
+ * macOS 表头规范:11px semibold 弱化色(原 400 字重过轻,列名立不住)。 */
1463
+ export const historyHead: CSSProperties = {
1464
+ position: 'sticky',
1465
+ top: 0,
1466
+ zIndex: 1,
1467
+ display: 'grid',
1468
+ alignItems: 'center',
1469
+ alignSelf: 'flex-start',
1470
+ columnGap: 8,
1471
+ minWidth: '100%',
1472
+ width: 'auto',
1473
+ height: 28,
1474
+ flexShrink: 0,
1475
+ padding: 0,
1476
+ background: 'var(--dsw-alias-bg-layer-2)',
1477
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1478
+ fontSize: 11,
1479
+ fontWeight: 600,
1480
+ lineHeight: '16px',
1481
+ color: 'var(--dsw-alias-label-tertiary)',
1482
+ }
1483
+
1484
+ /** 主题格:refs 胶囊 + 可省略主题文本。 */
1485
+ export const historySubjectCell: CSSProperties = {
1486
+ display: 'flex',
1487
+ alignItems: 'center',
1488
+ gap: 6,
1489
+ minWidth: 0,
1490
+ }
1491
+
1492
+ export const commitSubjectLine: CSSProperties = {
1493
+ overflow: 'hidden',
1494
+ textOverflow: 'ellipsis',
1495
+ whiteSpace: 'nowrap',
1496
+ flex: 1,
1497
+ minWidth: 0,
1498
+ fontSize: 13,
1499
+ lineHeight: '20px',
1500
+ color: 'var(--dsw-alias-label-primary)',
1501
+ }
1502
+
1503
+ export const historyHash: CSSProperties = {
1504
+ overflow: 'hidden',
1505
+ textOverflow: 'ellipsis',
1506
+ whiteSpace: 'nowrap',
1507
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
1508
+ fontSize: 11,
1509
+ color: 'var(--dsw-alias-label-secondary)',
1510
+ }
1511
+
1512
+ export const historyAuthor: CSSProperties = {
1513
+ overflow: 'hidden',
1514
+ textOverflow: 'ellipsis',
1515
+ whiteSpace: 'nowrap',
1516
+ fontSize: 12,
1517
+ color: 'var(--dsw-alias-label-tertiary)',
1518
+ }
1519
+
1520
+ export const historyTime: CSSProperties = {
1521
+ textAlign: 'right',
1522
+ fontSize: 11,
1523
+ color: 'var(--dsw-alias-label-tertiary)',
1524
+ }
1525
+
1526
+ // ── refs 胶囊(IDEA 分支标签风格)──────────────────────────────────────
1527
+
1528
+ /** 胶囊基样式;变体见 refPillHead / refPillBranch / refPillRemote / refPillTag。 */
1529
+ export const refPill: CSSProperties = {
1530
+ flex: 'none',
1531
+ maxWidth: 140,
1532
+ overflow: 'hidden',
1533
+ textOverflow: 'ellipsis',
1534
+ whiteSpace: 'nowrap',
1535
+ padding: '1px 7px',
1536
+ borderRadius: 9,
1537
+ border: '1px solid',
1538
+ fontSize: 10,
1539
+ fontWeight: 500,
1540
+ lineHeight: '13px',
1541
+ }
1542
+
1543
+ /** 当前分支(HEAD ->):描边式胶囊(与列表标签胶囊同族,避免绿底绿字低对比)。 */
1544
+ export const refPillHead: CSSProperties = {
1545
+ color: 'var(--dsw-alias-state-success-primary)',
1546
+ borderColor: 'var(--dsw-alias-state-success-primary)',
1547
+ background: 'transparent',
1548
+ }
1549
+
1550
+ /** 其他本地分支:中性描边。 */
1551
+ export const refPillBranch: CSSProperties = {
1552
+ color: 'var(--dsw-alias-label-secondary)',
1553
+ borderColor: 'var(--dsw-alias-border-l1)',
1554
+ background: 'var(--dsw-alias-bg-layer-2)',
1555
+ }
1556
+
1557
+ /** 远程分支:弱化灰色。 */
1558
+ export const refPillRemote: CSSProperties = {
1559
+ color: 'var(--dsw-alias-label-tertiary)',
1560
+ borderColor: 'var(--dsw-alias-border-l1)',
1561
+ background: 'transparent',
1562
+ }
1563
+
1564
+ /** 标签:警示色描边。 */
1565
+ export const refPillTag: CSSProperties = {
1566
+ color: 'var(--dsw-alias-state-warn-primary)',
1567
+ borderColor: 'var(--dsw-alias-state-warn-primary)',
1568
+ background: 'var(--dsw-alias-bg-layer-2)',
1569
+ }
1570
+
1571
+ /** 右栏内容列(外壳 paneSide 提供宽/底/边线)。 */
1572
+ export const historyRight: CSSProperties = {
1573
+ flex: 1,
1574
+ minHeight: 0,
1575
+ display: 'flex',
1576
+ flexDirection: 'column',
1577
+ gap: 8,
1578
+ paddingLeft: 12,
1579
+ overflowY: 'hidden',
1580
+ }
1581
+
1582
+ export const rightFiles: CSSProperties = {
1583
+ flex: 1,
1584
+ minHeight: 0,
1585
+ overflowY: 'auto',
1586
+ display: 'flex',
1587
+ flexDirection: 'column',
1588
+ gap: 1,
1589
+ }
1590
+
1591
+ export const rightMsg: CSSProperties = {
1592
+ flex: 1,
1593
+ minHeight: 0,
1594
+ overflowY: 'auto',
1595
+ display: 'flex',
1596
+ flexDirection: 'column',
1597
+ gap: 4,
1598
+ }
1599
+
1600
+ /** 提交正文(等宽保留换行)。 */
1601
+ export const msgBody: CSSProperties = {
1602
+ margin: 0,
1603
+ fontFamily: 'var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace)',
1604
+ fontSize: 11,
1605
+ lineHeight: '17px',
1606
+ whiteSpace: 'pre-wrap',
1607
+ wordBreak: 'break-word',
1608
+ color: 'var(--dsw-alias-label-secondary)',
1609
+ }
1610
+
1611
+ /** 右栏未选中时的占位区(IDEA 式双区居中提示)。 */
1612
+ export const rightEmptyZone: CSSProperties = {
1613
+ flex: 1,
1614
+ minHeight: 0,
1615
+ display: 'flex',
1616
+ alignItems: 'center',
1617
+ justifyContent: 'center',
1618
+ color: 'var(--dsw-alias-label-tertiary)',
1619
+ fontSize: 12,
1620
+ lineHeight: '18px',
1621
+ }
1622
+
1623
+ /** 下占位区(提交详细信息):固定比例 + 顶部分隔线。 */
1624
+ export const rightEmptyZoneBottom: CSSProperties = {
1625
+ flex: 'none',
1626
+ height: '34%',
1627
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
1628
+ }
1629
+
1630
+ export const commitDetailHeader: CSSProperties = {
1631
+ display: 'flex',
1632
+ flexDirection: 'column',
1633
+ gap: 4,
1634
+ padding: '2px 0 10px',
1635
+ borderBottom: '1px solid var(--dsw-alias-border-l2)',
1636
+ }
1637
+
1638
+ export const commitDetailSubject: CSSProperties = {
1639
+ fontSize: 14,
1640
+ lineHeight: '22px',
1641
+ fontWeight: 600,
1642
+ color: 'var(--dsw-alias-label-primary)',
1643
+ wordBreak: 'break-word',
1644
+ }
1645
+
1646
+ export const commitDetailMeta: CSSProperties = {
1647
+ fontSize: 12,
1648
+ lineHeight: '18px',
1649
+ color: 'var(--dsw-alias-label-secondary)',
1650
+ }
1651
+
1652
+ // ── Branches 管理(popup)─────────────────────────────────────────────
1653
+
1654
+ export const branchNameInput: CSSProperties = {
1655
+ flex: 1,
1656
+ minWidth: 120,
1657
+ border: '1px solid var(--dsw-alias-border-l2)',
1658
+ borderRadius: 8,
1659
+ padding: '5px 10px',
1660
+ fontSize: 13,
1661
+ lineHeight: '20px',
1662
+ fontFamily: 'inherit',
1663
+ background: 'var(--dsw-alias-bg-layer-2)',
1664
+ color: 'var(--dsw-alias-label-primary)',
1665
+ }
1666
+
1667
+ export const branchMark: CSSProperties = {
1668
+ flex: 'none',
1669
+ color: 'var(--dsw-alias-state-business-primary)',
1670
+ fontSize: 12,
382
1671
  }