shine-code-submit 0.2.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.
Files changed (82) hide show
  1. package/.claude-plugin/marketplace.json +13 -0
  2. package/.claude-plugin/plugin.json +10 -0
  3. package/LICENSE +21 -0
  4. package/README.md +217 -0
  5. package/bin/launcher.cjs +35 -0
  6. package/bun.lock +45 -0
  7. package/dist/install.cjs +8 -0
  8. package/hooks/hooks.json +81 -0
  9. package/package.json +68 -0
  10. package/src/cli/main.ts +128 -0
  11. package/src/daemon/auth.ts +7 -0
  12. package/src/daemon/bus.ts +25 -0
  13. package/src/daemon/git.ts +118 -0
  14. package/src/daemon/logger.ts +66 -0
  15. package/src/daemon/main.ts +95 -0
  16. package/src/daemon/server.ts +208 -0
  17. package/src/daemon/spool-consumer.ts +52 -0
  18. package/src/daemon/stats.ts +33 -0
  19. package/src/daemon/store.ts +147 -0
  20. package/src/daemon/token-cache.ts +35 -0
  21. package/src/daemon/transcript.ts +130 -0
  22. package/src/daemon/ui-assets.ts +4 -0
  23. package/src/daemon/ui.ts +34 -0
  24. package/src/daemon/ws.ts +54 -0
  25. package/src/hook/main.ts +154 -0
  26. package/src/install/bun.ts +97 -0
  27. package/src/install/deploy.ts +78 -0
  28. package/src/install/json-safe.ts +43 -0
  29. package/src/install/main.ts +167 -0
  30. package/src/install/paths.ts +28 -0
  31. package/src/install/register.ts +108 -0
  32. package/src/shared/config.ts +77 -0
  33. package/src/shared/daemonctl.ts +110 -0
  34. package/src/shared/id.ts +19 -0
  35. package/src/shared/paths.ts +23 -0
  36. package/src/shared/pidfile.ts +32 -0
  37. package/src/shared/spool.ts +60 -0
  38. package/src/shared/types.ts +116 -0
  39. package/ui/.build/app.js +76 -0
  40. package/ui/app.tsx +31 -0
  41. package/ui/components/App.tsx +55 -0
  42. package/ui/components/CommitsModule.tsx +25 -0
  43. package/ui/components/CommitsView.tsx +84 -0
  44. package/ui/components/Conversation.tsx +101 -0
  45. package/ui/components/DiffBlock.tsx +64 -0
  46. package/ui/components/EventDetail.tsx +8 -0
  47. package/ui/components/EventItem.tsx +24 -0
  48. package/ui/components/EventList.tsx +22 -0
  49. package/ui/components/EventsModule.tsx +123 -0
  50. package/ui/components/Header.tsx +15 -0
  51. package/ui/components/Icon.tsx +114 -0
  52. package/ui/components/Markdown.tsx +13 -0
  53. package/ui/components/Message.tsx +60 -0
  54. package/ui/components/OverviewModule.tsx +86 -0
  55. package/ui/components/SessionDetail.tsx +51 -0
  56. package/ui/components/SessionTree.tsx +94 -0
  57. package/ui/components/SessionsModule.tsx +39 -0
  58. package/ui/components/SessionsPanel.tsx +15 -0
  59. package/ui/components/SideNav.tsx +46 -0
  60. package/ui/components/Splitter.tsx +23 -0
  61. package/ui/components/StatsModule.tsx +133 -0
  62. package/ui/components/Status.tsx +66 -0
  63. package/ui/components/SummaryView.tsx +83 -0
  64. package/ui/components/SystemModule.tsx +38 -0
  65. package/ui/components/ToolCard.tsx +57 -0
  66. package/ui/hooks/useAllCommits.ts +59 -0
  67. package/ui/hooks/useApi.ts +13 -0
  68. package/ui/hooks/useCommits.ts +45 -0
  69. package/ui/hooks/useConversation.ts +43 -0
  70. package/ui/hooks/useEvents.ts +45 -0
  71. package/ui/hooks/useSplitter.ts +43 -0
  72. package/ui/hooks/useStatsPolling.ts +35 -0
  73. package/ui/hooks/useWebSocket.ts +38 -0
  74. package/ui/index.html +13 -0
  75. package/ui/lib/aggregate.ts +81 -0
  76. package/ui/lib/diff.ts +45 -0
  77. package/ui/lib/export.ts +45 -0
  78. package/ui/lib/format.ts +100 -0
  79. package/ui/lib/util.ts +106 -0
  80. package/ui/state/AppContext.tsx +65 -0
  81. package/ui/style.css +849 -0
  82. package/ui/types.ts +46 -0
package/ui/style.css ADDED
@@ -0,0 +1,849 @@
1
+ :root {
2
+ /* VS Code Dark+ 配色 */
3
+ --bg: #1e1e1e;
4
+ --sidebar: #252526;
5
+ --titlebar: #323233;
6
+ --border: #2d2d2d;
7
+ --border-light: #3c3c3c;
8
+ --text: #cccccc;
9
+ --muted: #858585;
10
+ --accent: #0e639c;
11
+ --accent-hover: #1177bb;
12
+ --accent-line: #007acc;
13
+ --selected: #04395e;
14
+ --hover: #2a2d2e;
15
+ --err: #f48771;
16
+ --c-session: #4ec9b0;
17
+ --c-prompt: #569cd6;
18
+ --c-posttool: #c586c0;
19
+ --c-pretool: #ce9178;
20
+ --nav-w: 200px;
21
+ --tree-w: 200px;
22
+ --footer-h: 170px;
23
+ /* 设计 token:间距 / 字号 / 圆角 / 图标尺寸 */
24
+ --space-1: 0.25rem;
25
+ --space-2: 0.5rem;
26
+ --space-3: 0.8rem;
27
+ --space-4: 1.15rem;
28
+ --fs-xs: 11px;
29
+ --fs-sm: 12px;
30
+ --fs-base: 13px;
31
+ --fs-md: 14px;
32
+ --fs-lg: 15px;
33
+ --radius-sm: 3px;
34
+ --radius-md: 6px;
35
+ --radius-lg: 10px;
36
+ --icon: 16px;
37
+ /* 状态徽章配色 */
38
+ --ok: #4ec9b0;
39
+ --warn: #dcdcaa;
40
+ --err-bg: rgba(244, 135, 113, 0.14);
41
+ --warn-bg: rgba(220, 220, 170, 0.12);
42
+ --ok-bg: rgba(78, 201, 176, 0.12);
43
+ }
44
+
45
+ * { box-sizing: border-box; }
46
+ html, body { margin: 0; height: 100%; }
47
+ body {
48
+ background: var(--bg);
49
+ color: var(--text);
50
+ font-family: -apple-system, "Segoe UI", "Windows Sans Serif", sans-serif;
51
+ font-size: 13px;
52
+ display: flex;
53
+ flex-direction: column;
54
+ overflow: hidden;
55
+ }
56
+ /* React 挂在 #root:必须让它占满 body 并成为 flex column 容器,
57
+ 否则 Header/.body-middle/LogPanel 的 flex 链从顶层断裂 → 内容撑出 body 被 overflow:hidden 裁掉、滚不动、splitter 拖拽无效。*/
58
+ #root { display: flex; flex-direction: column; height: 100%; min-height: 0; }
59
+
60
+ header {
61
+ flex: 0 0 36px;
62
+ display: flex;
63
+ align-items: center;
64
+ gap: var(--space-3);
65
+ padding: 0 var(--space-3);
66
+ background: var(--titlebar);
67
+ border-bottom: 1px solid var(--border);
68
+ }
69
+ header .title {
70
+ display: flex;
71
+ align-items: center;
72
+ gap: var(--space-2);
73
+ font-weight: 600;
74
+ font-size: var(--fs-sm);
75
+ letter-spacing: 0.3px;
76
+ color: var(--text);
77
+ }
78
+ header .title .icon { color: var(--c-session); }
79
+ .view-toggles { display: flex; gap: var(--space-1); }
80
+ .toggle-btn {
81
+ display: inline-flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ background: transparent;
85
+ color: var(--muted);
86
+ border: 1px solid transparent;
87
+ border-radius: var(--radius-sm);
88
+ width: 24px;
89
+ height: 24px;
90
+ padding: 0;
91
+ cursor: pointer;
92
+ }
93
+ .toggle-btn:hover { background: var(--hover); color: var(--text); }
94
+ .toggle-btn.active { color: var(--accent-line); border-color: var(--border-light); }
95
+ .toggle-btn:focus-visible { outline: 2px solid var(--accent-line); outline-offset: 1px; }
96
+
97
+ /* 图标基类 */
98
+ .icon { display: inline-block; vertical-align: middle; flex: 0 0 auto; }
99
+ button .icon, .tab .icon, .card-trigger .icon { display: block; }
100
+
101
+ /* 顶栏右侧运行状态:核心指标常驻 + 次要指标 hover/focus popover */
102
+ .status {
103
+ margin-left: auto;
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--space-2);
107
+ color: var(--muted);
108
+ font-size: var(--fs-xs);
109
+ }
110
+ .status > span { white-space: nowrap; }
111
+ .st-ver { color: var(--muted); font-variant-numeric: tabular-nums; }
112
+ .st-rate { display: inline-flex; align-items: center; gap: 4px; color: var(--ok); font-variant-numeric: tabular-nums; }
113
+ .st-rate .icon { color: inherit; }
114
+ .st-tokens { color: #9dbefe; font-variant-numeric: tabular-nums; white-space: nowrap; }
115
+ .st-dot.connecting { color: var(--warn); }
116
+
117
+ /* 徽章 */
118
+ .badge {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ padding: 1px 7px;
122
+ border-radius: 999px;
123
+ font-size: var(--fs-xs);
124
+ font-weight: 600;
125
+ line-height: 1.5;
126
+ border: 1px solid transparent;
127
+ }
128
+ .badge.err { color: var(--err); background: var(--err-bg); border-color: rgba(244, 135, 113, 0.4); }
129
+ .badge.warn { color: var(--warn); background: var(--warn-bg); border-color: rgba(220, 220, 170, 0.35); }
130
+ .badge.ok { color: var(--ok); background: var(--ok-bg); border-color: rgba(78, 201, 176, 0.35); }
131
+
132
+ /* 运行详情 popover(纯 CSS hover/focus 显隐)*/
133
+ .status-detail { position: relative; display: inline-flex; color: var(--muted); cursor: help; }
134
+ .status-detail:focus { outline: none; }
135
+ .status-detail:focus-visible .icon { color: var(--accent-line); }
136
+ .status-detail .popover {
137
+ display: none;
138
+ position: absolute;
139
+ top: calc(100% + 6px);
140
+ right: 0;
141
+ z-index: 50;
142
+ min-width: 196px;
143
+ padding: var(--space-2) var(--space-3);
144
+ background: #2a2a2b;
145
+ border: 1px solid var(--border-light);
146
+ border-radius: var(--radius-md);
147
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
148
+ font-size: var(--fs-xs);
149
+ color: var(--text);
150
+ cursor: default;
151
+ }
152
+ .status-detail:hover .popover,
153
+ .status-detail:focus-within .popover { display: block; }
154
+ .pop-row { display: flex; justify-content: space-between; gap: var(--space-2); padding: 2px 0; }
155
+ .pop-row span { color: var(--muted); }
156
+ .pop-row b { font-weight: 500; font-variant-numeric: tabular-nums; }
157
+ .pop-err { margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--border); color: var(--err); word-break: break-word; }
158
+
159
+ .body-middle { flex: 1; display: flex; flex-direction: row; min-height: 0; }
160
+
161
+ .panel { min-width: 0; min-height: 0; display: flex; flex-direction: column; background: var(--bg); }
162
+ .panel-header { flex: 0 0 auto; padding: 0.45rem 0.8rem; border-bottom: 1px solid var(--border); }
163
+ h2 {
164
+ margin: 0;
165
+ font-size: 11px;
166
+ font-weight: 600;
167
+ text-transform: uppercase;
168
+ letter-spacing: 0.6px;
169
+ color: var(--muted);
170
+ }
171
+ ul { list-style: none; margin: 0; padding: 0; }
172
+
173
+ #nav-panel { flex: 0 0 auto; background: var(--sidebar); overflow: hidden; border-right: 1px solid var(--border); }
174
+ #sessions-panel ul { flex: 1; overflow: auto; }
175
+ #events-panel { flex: 1 1 0; overflow: hidden; }
176
+
177
+ .splitter { flex: 0 0 4px; background: var(--border); position: relative; z-index: 5; transition: background 0.1s; }
178
+ .splitter:hover, .splitter.dragging { background: var(--accent-line); }
179
+ .splitter-v { cursor: col-resize; width: 4px; height: 100%; }
180
+ .splitter-h { cursor: row-resize; height: 4px; width: 100%; }
181
+ .splitter.hidden { display: none; }
182
+ #nav-panel.collapsed { flex: 0 0 48px !important; overflow: hidden; border: 0; }
183
+
184
+ /* 左侧模块导航 */
185
+ .side-nav {
186
+ flex: 1;
187
+ display: flex;
188
+ flex-direction: column;
189
+ padding: 0.4rem 0;
190
+ }
191
+ .nav-list { list-style: none; margin: 0; padding: 0; flex: 1; display: flex; flex-direction: column; gap: 2px; }
192
+ .nav-item {
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 0.7rem;
196
+ padding: 0.5rem 0.9rem;
197
+ margin: 0 0.4rem;
198
+ border: none;
199
+ border-left: 2px solid transparent;
200
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
201
+ background: transparent;
202
+ color: var(--muted);
203
+ font-size: var(--fs-sm);
204
+ cursor: pointer;
205
+ text-align: left;
206
+ white-space: nowrap;
207
+ overflow: hidden;
208
+ }
209
+ .nav-item:hover { background: var(--hover); color: var(--text); }
210
+ .nav-item.active { color: var(--text); border-left-color: var(--accent-line); background: var(--selected); }
211
+ .nav-item .icon { color: inherit; flex: 0 0 auto; }
212
+ .nav-label { overflow: hidden; text-overflow: ellipsis; }
213
+ .nav-collapse {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ margin: 0 0.4rem;
218
+ padding: 0.4rem;
219
+ border: none;
220
+ background: transparent;
221
+ color: var(--muted);
222
+ cursor: pointer;
223
+ border-radius: var(--radius-sm);
224
+ }
225
+ .nav-collapse:hover { background: var(--hover); color: var(--text); }
226
+ .side-nav .nav-collapse svg { transition: transform 0.15s; }
227
+ .side-nav:not(.collapsed) .nav-collapse svg { transform: rotate(180deg); }
228
+ /* 收起态:只显图标,标签隐藏,导航项居中 */
229
+ .side-nav.collapsed .nav-label { display: none; }
230
+ .side-nav.collapsed .nav-item { justify-content: center; padding: 0.5rem 0; margin: 0 0.2rem; }
231
+ .side-nav.collapsed .nav-list { align-items: center; }
232
+ #log-panel.collapsed { flex: 0 0 auto !important; }
233
+ #log-panel.collapsed #log { display: none; }
234
+
235
+ .session-tree { padding: 0.4rem 0; font-family: Consolas, "Courier New", monospace; font-size: 12px; }
236
+ .session-tree .group { padding: 0; color: var(--text); }
237
+ .session-tree .group-head {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 4px;
241
+ padding: 0.3rem 0.8rem;
242
+ cursor: pointer;
243
+ user-select: none;
244
+ }
245
+ .session-tree .group-head:hover { background: var(--hover); }
246
+ .session-tree .group-caret { flex: 0 0 auto; color: var(--muted); font-size: 10px; }
247
+ .session-tree .group-cwd {
248
+ flex: 1 1 auto;
249
+ min-width: 0;
250
+ overflow: hidden;
251
+ text-overflow: ellipsis;
252
+ white-space: nowrap;
253
+ font-family: Consolas, "Courier New", monospace;
254
+ }
255
+ .session-tree ul { padding-left: 0.8rem; }
256
+ .session-tree li li {
257
+ display: flex;
258
+ flex-direction: column;
259
+ gap: 1px;
260
+ padding: 0.25rem 0.5rem;
261
+ border-radius: 3px;
262
+ cursor: pointer;
263
+ color: var(--muted);
264
+ }
265
+ .session-tree li li:hover { background: var(--hover); }
266
+ .session-tree li li.active { background: var(--selected); color: var(--text); }
267
+ .session-tree .sess-row { display: flex; align-items: baseline; gap: 0.4rem; min-width: 0; }
268
+ .session-tree .sess-time { flex: 0 0 auto; color: var(--muted); font-size: 10px; }
269
+ .session-tree .sess-sid { flex: 1 1 auto; min-width: 0; color: var(--text); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
270
+ .session-tree .sess-sub { font-size: 10px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
271
+
272
+ /* 空状态 / 加载骨架 */
273
+ .empty-state {
274
+ display: flex;
275
+ flex-direction: column;
276
+ align-items: center;
277
+ justify-content: center;
278
+ gap: var(--space-2);
279
+ min-height: 100%;
280
+ flex: 1;
281
+ padding: var(--space-4) var(--space-3);
282
+ color: var(--muted);
283
+ text-align: center;
284
+ font-size: var(--fs-sm);
285
+ }
286
+ .empty-state .icon { color: var(--border-light); }
287
+ .empty-state .es-hint { color: var(--text); font-size: var(--fs-base); }
288
+ .empty-state .es-sub { color: var(--muted); font-size: var(--fs-xs); }
289
+ .skeleton {
290
+ background: linear-gradient(90deg, #2a2a2a 0%, #333 50%, #2a2a2a 100%);
291
+ background-size: 200% 100%;
292
+ animation: skel 1.3s ease-in-out infinite;
293
+ border-radius: var(--radius-sm);
294
+ }
295
+ .skel-bubble { height: 40px; width: 58%; border-radius: var(--radius-md); margin: 12px 0 12px auto; }
296
+ .skel-block { height: 52px; width: 80%; border-radius: var(--radius-md); margin: 12px 0; }
297
+ @keyframes skel { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
298
+ @media (prefers-reduced-motion: reduce) {
299
+ .skeleton { animation: none; background: #2a2a2a; }
300
+ }
301
+
302
+ /* toolbar + tabs */
303
+ .toolbar {
304
+ flex: 0 0 auto;
305
+ display: flex;
306
+ align-items: center;
307
+ gap: var(--space-3);
308
+ padding: var(--space-2) var(--space-3);
309
+ border-bottom: 1px solid var(--border);
310
+ color: var(--muted);
311
+ }
312
+ .tabs { display: flex; gap: var(--space-1); }
313
+ .tab {
314
+ background: transparent;
315
+ color: var(--muted);
316
+ border: none;
317
+ border-bottom: 2px solid transparent;
318
+ border-radius: 0;
319
+ padding: var(--space-1) 0.7rem;
320
+ font-size: var(--fs-sm);
321
+ cursor: pointer;
322
+ }
323
+ .tab.active { color: var(--text); border-bottom-color: var(--accent-line); }
324
+ .tab:hover { background: var(--hover); }
325
+ .icon-btn {
326
+ display: inline-flex;
327
+ align-items: center;
328
+ justify-content: center;
329
+ background: transparent;
330
+ color: var(--muted);
331
+ border: 1px solid var(--border-light);
332
+ border-radius: var(--radius-sm);
333
+ width: 26px;
334
+ height: 26px;
335
+ padding: 0;
336
+ cursor: pointer;
337
+ }
338
+ .icon-btn:hover { background: var(--hover); color: var(--text); border-color: var(--accent-line); }
339
+ .icon-btn:focus-visible { outline: 2px solid var(--accent-line); outline-offset: 1px; }
340
+ .search-input {
341
+ background: var(--bg);
342
+ color: var(--text);
343
+ border: 1px solid var(--border-light);
344
+ border-radius: 3px;
345
+ padding: 0.2rem 0.5rem;
346
+ font-size: 12px;
347
+ flex: 1 1 auto;
348
+ min-width: 120px;
349
+ max-width: 360px;
350
+ outline: none;
351
+ }
352
+ .search-input:focus { border-color: var(--accent-line); }
353
+ .search-input::placeholder { color: var(--muted); }
354
+ .session-select {
355
+ background: var(--bg);
356
+ color: var(--text);
357
+ border: 1px solid var(--border-light);
358
+ border-radius: 3px;
359
+ padding: 0.2rem 0.4rem;
360
+ font-size: 12px;
361
+ flex: 0 1 auto;
362
+ max-width: 240px;
363
+ min-width: 120px;
364
+ outline: none;
365
+ cursor: pointer;
366
+ }
367
+ .session-select:focus { border-color: var(--accent-line); }
368
+
369
+ /* 事件模块:左侧会话树 + 右侧事件流(两栏) */
370
+ .events-with-tree { flex: 1; display: flex; flex-direction: row; min-height: 0; }
371
+ .events-tree-panel { flex: 0 0 var(--tree-w); background: var(--sidebar); overflow: auto; }
372
+ .events-main { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
373
+ /* 会话模块:同事件模块的两栏布局(左会话树 + 右对话) */
374
+ .sessions-with-tree { flex: 1; display: flex; flex-direction: row; min-height: 0; }
375
+ .sessions-tree-panel { flex: 0 0 var(--tree-w); background: var(--sidebar); overflow: auto; }
376
+ .sessions-main { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
377
+ /* 会话树「全部」项(事件模块筛选用) */
378
+ .session-tree .tree-all {
379
+ padding: 0.3rem 0.8rem;
380
+ color: var(--text);
381
+ cursor: pointer;
382
+ font-size: 12px;
383
+ border-bottom: 1px solid var(--border);
384
+ }
385
+ .session-tree .tree-all:hover { background: var(--hover); }
386
+ .session-tree .tree-all.active { background: var(--selected); color: var(--text); }
387
+ .search-count { padding: 0.3rem 0 0.5rem; color: var(--accent-line); font-size: 11px; }
388
+
389
+ /* 视图容器:三视图常驻 DOM(keep-alive),切换只切 display,避免卸载/重挂导致的大批 DOM 重建闪烁 */
390
+ .views { flex: 1 1 0; min-height: 0; display: flex; flex-direction: column; }
391
+ .view { flex: 1 1 0; min-height: 0; display: none; flex-direction: column; }
392
+ .view.active { display: flex; }
393
+
394
+ /* 事件流 */
395
+ .event-list { flex: 1; overflow: auto; font-family: Consolas, "Courier New", monospace; font-size: 11.5px; }
396
+ .event-list li {
397
+ display: flex;
398
+ flex-direction: column;
399
+ border-bottom: 1px solid var(--border-light);
400
+ cursor: pointer;
401
+ }
402
+ .event-list li:hover { background: var(--hover); }
403
+ .event-row {
404
+ display: grid;
405
+ grid-template-columns: 80px 116px 96px 1fr;
406
+ gap: 0.5rem;
407
+ padding: 0.12rem 0.7rem;
408
+ white-space: nowrap;
409
+ }
410
+ .event-list.filtered .event-row { grid-template-columns: 80px 116px 1fr; }
411
+ .event-list.filtered .sess { display: none; }
412
+ .event-list .ts { color: var(--muted); }
413
+ .event-list .type { font-weight: 600; }
414
+ .event-list .sess { color: var(--muted); }
415
+ .event-list .summary { color: var(--text); overflow: hidden; text-overflow: ellipsis; }
416
+ .event-list .SessionStart .type,
417
+ .event-list .SessionEnd .type { color: var(--c-session); }
418
+ .event-list .UserPromptSubmit .type { color: var(--c-prompt); }
419
+ .event-list .PostToolUse .type { color: var(--c-posttool); }
420
+ .event-list .PreToolUse .type { color: var(--c-pretool); }
421
+ .event-detail {
422
+ display: none;
423
+ margin: 0.2rem 0.5rem 0.4rem;
424
+ padding: 0.5rem 0.7rem;
425
+ background: var(--sidebar);
426
+ border-left: 2px solid var(--accent);
427
+ font-family: -apple-system, "Segoe UI", sans-serif;
428
+ font-size: 12px;
429
+ color: var(--text);
430
+ max-height: 380px;
431
+ overflow: auto;
432
+ }
433
+ .event.open .event-detail { display: block; }
434
+ .detail-section { margin-bottom: 0.55rem; }
435
+ .detail-section:last-child { margin-bottom: 0; }
436
+ .detail-label {
437
+ font-size: 10px;
438
+ font-weight: 700;
439
+ color: var(--accent);
440
+ text-transform: uppercase;
441
+ letter-spacing: 0.6px;
442
+ margin-bottom: 0.25rem;
443
+ }
444
+ .detail-content { color: var(--text); }
445
+ .detail-text {
446
+ white-space: pre-wrap;
447
+ word-break: break-word;
448
+ font-size: 12.5px;
449
+ line-height: 1.5;
450
+ color: #d4d4d4;
451
+ }
452
+ .detail-json {
453
+ white-space: pre-wrap;
454
+ word-break: break-word;
455
+ font-family: Consolas, "Courier New", monospace;
456
+ background: rgba(0, 0, 0, 0.3);
457
+ padding: 0.45rem 0.6rem;
458
+ border-radius: 3px;
459
+ font-size: 11.5px;
460
+ line-height: 1.45;
461
+ color: #cccccc;
462
+ }
463
+ .tool-name { color: var(--c-posttool); font-family: Consolas, monospace; }
464
+ .j-key { color: #9cdcfe; }
465
+ .j-str { color: #ce9178; }
466
+ .j-num { color: #b5cea8; }
467
+ .j-bool { color: #569cd6; }
468
+
469
+ /* 对话视图(精修气泡式:用户右气泡 · 助手左流 + 角色头 · 卡片左色条)*/
470
+ .conversation {
471
+ flex: 1; overflow: auto;
472
+ position: relative;
473
+ /* top 固定留给浮动的 conv-token-bar:无论 bar 显隐/数字变化,消息都从此处开始,不跳动 */
474
+ padding: 2.6rem 1.4rem 1.8rem;
475
+ font-size: 13.5px; line-height: 1.7;
476
+ }
477
+ .conversation .empty { color: var(--muted); padding: 2rem; text-align: center; }
478
+ .msg-row { margin-bottom: 1rem; }
479
+
480
+ /* 用户气泡:右侧,蓝调渐变 + 阴影,右下小圆角拟"尾巴" */
481
+ .user-row { display: flex; justify-content: flex-end; }
482
+ .user-row .bubble {
483
+ max-width: min(80%, 64ch);
484
+ background: linear-gradient(135deg, #2c4a7a, #27406e);
485
+ border: 1px solid rgba(120, 160, 220, 0.22);
486
+ color: #eaf0fb;
487
+ padding: 0.62rem 1rem;
488
+ border-radius: 14px 14px 4px 14px;
489
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.28);
490
+ white-space: pre-wrap;
491
+ word-break: break-word;
492
+ }
493
+
494
+ /* 助手:左侧流,顶部小角色头(◆ Claude · 时间)*/
495
+ .assistant-row { display: flex; flex-direction: column; gap: 0.55rem; align-items: flex-start; }
496
+ .role-head { display: flex; align-items: baseline; gap: 0.45rem; margin: 0.1rem 0 0; }
497
+ .role-mark { color: var(--c-session); font-size: 11px; line-height: 1; }
498
+ .role-name { color: var(--c-session); font-size: 11px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; }
499
+ .role-ts { color: var(--muted); font-size: 10.5px; }
500
+ .assistant-text { padding: 0 !important; font-size: 14px; line-height: 1.72; max-width: 92%; }
501
+ .assistant-text > *:first-child { margin-top: 0; }
502
+ .assistant-text > *:last-child { margin-bottom: 0; }
503
+ /* 卡片(工具/思考/结果):圆角 + 阴影 + 左色条区分类型 */
504
+ .tool-card, .think-card, .result-card {
505
+ border: 1px solid var(--border-light);
506
+ border-radius: 8px;
507
+ background: rgba(255, 255, 255, 0.022);
508
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
509
+ overflow: hidden;
510
+ width: 100%;
511
+ align-self: stretch;
512
+ max-width: 92%;
513
+ }
514
+ .tool-card { border-left: 3px solid var(--c-posttool); }
515
+ .think-card { border-left: 3px solid var(--c-pretool); }
516
+ .result-card { border-left: 3px solid var(--muted); }
517
+ .result-card.is-error { border-left-color: var(--err); }
518
+ .card-trigger {
519
+ display: flex; align-items: center; gap: 0.5rem;
520
+ padding: 0.45rem 0.75rem; cursor: pointer; font-size: 12.5px;
521
+ user-select: none; color: var(--text); list-style: none;
522
+ }
523
+ .card-trigger::-webkit-details-marker { display: none; }
524
+ .card-trigger:hover { background: rgba(255, 255, 255, 0.045); }
525
+ .card-chev { flex: 0 0 auto; color: var(--muted); transition: transform 0.18s; font-size: 10px; }
526
+ .tool-card[open] .card-chev, .think-card[open] .card-chev, .result-card[open] .card-chev { transform: rotate(90deg); }
527
+ .tool-icon { flex: 0 0 auto; }
528
+ .tool-title { flex: 0 0 auto; color: var(--text); font-weight: 600; }
529
+ .tool-sub { flex: 1; min-width: 0; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: Consolas, "Courier New", monospace; font-size: 12px; }
530
+ .tool-stat { flex: 0 0 auto; font-family: Consolas, "Courier New", monospace; font-size: 11px; white-space: nowrap; }
531
+ .tool-stat .s-add { color: #9bcd97; }
532
+ .tool-stat .s-del { color: #fc533a; }
533
+ .think-label, .result-label { color: var(--muted); font-size: 12px; font-weight: 600; }
534
+ .result-card.is-error .result-label { color: var(--err); }
535
+ .tool-content { border-top: 1px solid var(--border-light); }
536
+ .card-output {
537
+ margin: 0; padding: 0.55rem 0.8rem; background: #181818;
538
+ font-size: 11.5px; color: #ccc; max-height: 320px; overflow: auto;
539
+ white-space: pre-wrap; word-break: break-word; font-family: Consolas, "Courier New", monospace;
540
+ }
541
+ .think-body { padding: 0.6rem 0.85rem; font-size: 12.5px; color: var(--muted); border-top: 1px solid var(--border-light); line-height: 1.62; }
542
+ .think-body > *:first-child { margin-top: 0; }
543
+ .think-body > *:last-child { margin-bottom: 0; }
544
+ .think-body p { margin: 0 0 0.4rem; }
545
+ .think-body code { font-family: Consolas, "Courier New", monospace; background: rgba(0, 0, 0, 0.35); padding: 0.1rem 0.3rem; border-radius: 3px; font-size: 0.92em; }
546
+ .think-body pre { background: #181818; padding: 0.5rem 0.7rem; border-radius: 5px; overflow: auto; margin: 0.35rem 0; }
547
+ .think-body pre code { background: none; padding: 0; }
548
+ /* diff(行级,+绿/-红、连续 context 折叠蓝色分隔条)*/
549
+ .diff-block {
550
+ margin: 0; padding: 0.45rem 0; background: #181818;
551
+ font-family: Consolas, "Courier New", monospace; font-size: 11.5px; line-height: 1.6;
552
+ max-height: 440px; overflow: auto;
553
+ }
554
+ .diff-line { display: flex; gap: 0.4rem; padding: 0 0.6rem; white-space: pre-wrap; word-break: break-word; }
555
+ .diff-line .diff-sign { flex: 0 0 auto; width: 0.8em; font-weight: 700; }
556
+ .diff-line.add { background: rgba(155, 205, 151, 0.12); }
557
+ .diff-line.add .diff-sign, .diff-line.add .diff-text { color: #9bcd97; }
558
+ .diff-line.del { background: rgba(252, 83, 58, 0.10); }
559
+ .diff-line.del .diff-sign, .diff-line.del .diff-text { color: #fc533a; }
560
+ .diff-line.ctx .diff-text { color: var(--muted); }
561
+ .diff-folds { padding: 0.25rem; color: #9dbefe; background: rgba(157, 190, 254, 0.07); font-size: 11px; text-align: center; }
562
+ /* 助手正文 Markdown(.msg-text 由 assistant-text 复用:纯流式,无气泡底)*/
563
+ .msg-text { word-break: break-word; font-size: 14px; line-height: 1.72; color: #d7d7d7; }
564
+ .msg-text p { margin: 0 0 0.55rem; }
565
+ .msg-text p:last-child { margin-bottom: 0; }
566
+ .msg-text h1, .msg-text h2, .msg-text h3, .msg-text h4 { margin: 0.8rem 0 0.4rem; line-height: 1.3; font-weight: 600; color: #ececec; }
567
+ .msg-text h1 { font-size: 1.3em; }
568
+ .msg-text h2 { font-size: 1.18em; }
569
+ .msg-text h3 { font-size: 1.06em; }
570
+ .msg-text ul, .msg-text ol { margin: 0.4rem 0; padding-left: 1.5rem; }
571
+ .msg-text li { margin: 0.18rem 0; }
572
+ .msg-text code {
573
+ font-family: Consolas, "Courier New", monospace;
574
+ background: rgba(0, 0, 0, 0.38);
575
+ border: 1px solid var(--border-light);
576
+ padding: 0.08rem 0.32rem;
577
+ border-radius: 4px;
578
+ font-size: 0.88em;
579
+ color: #ce9178;
580
+ }
581
+ .msg-text pre {
582
+ background: #181818;
583
+ border: 1px solid var(--border-light);
584
+ border-radius: 6px;
585
+ padding: 0.65rem 0.85rem;
586
+ overflow: auto;
587
+ margin: 0.55rem 0;
588
+ }
589
+ .msg-text pre code { background: none; border: 0; padding: 0; font-size: 12.5px; color: #d4d4d4; }
590
+ .msg-text table { border-collapse: collapse; margin: 0.5rem 0; font-size: 0.95em; }
591
+ .msg-text th, .msg-text td { border: 1px solid var(--border-light); padding: 0.3rem 0.55rem; }
592
+ .msg-text th { background: rgba(255, 255, 255, 0.05); font-weight: 600; }
593
+ .msg-text blockquote {
594
+ border-left: 3px solid var(--accent-line);
595
+ padding: 0.1rem 0.2rem 0.1rem 0.75rem;
596
+ margin: 0.5rem 0;
597
+ color: var(--muted);
598
+ }
599
+ .msg-text blockquote p { margin: 0.15rem 0; }
600
+ .msg-text strong { color: #f0f0f0; font-weight: 600; }
601
+ .msg-text em { font-style: italic; }
602
+ .msg-text a { color: var(--accent-line); text-decoration: none; }
603
+ .msg-text a:hover { text-decoration: underline; }
604
+ .msg-text hr { border: none; border-top: 1px solid var(--border-light); margin: 0.7rem 0; }
605
+ /* 全局细滚动条(VS Code Dark+ 风格:透明轨道 · 圆角 thumb · hover/active 渐亮)
606
+ 通配 * 覆盖所有可滚动区(事件流 / session 树 / 日志 / 对话 / 代码块 / diff …),避免漏配留原生滚动条 */
607
+ *::-webkit-scrollbar { width: 10px; height: 10px; }
608
+ *::-webkit-scrollbar-track,
609
+ *::-webkit-scrollbar-corner { background: transparent; }
610
+ *::-webkit-scrollbar-thumb {
611
+ background-color: #3a3a3a;
612
+ border-radius: 5px;
613
+ border: 2px solid transparent;
614
+ background-clip: content-box;
615
+ transition: background-color 0.15s ease;
616
+ }
617
+ *::-webkit-scrollbar-thumb:hover { background-color: #4f4f4f; }
618
+ *::-webkit-scrollbar-thumb:active { background-color: var(--accent-line); }
619
+ /* Firefox 回退(无 hover 态)*/
620
+ * { scrollbar-width: thin; scrollbar-color: #3a3a3a transparent; }
621
+
622
+ #log-panel { flex: 0 0 var(--footer-h); background: var(--sidebar); overflow: hidden; }
623
+ #log {
624
+ flex: 1;
625
+ overflow: auto;
626
+ margin: 0;
627
+ padding: 0.5rem 0.8rem;
628
+ font-family: Consolas, "Courier New", monospace;
629
+ font-size: 12px;
630
+ color: var(--muted);
631
+ white-space: pre-wrap;
632
+ }
633
+
634
+ /* ===== token 角标 / 会话累计(对话视图 + session 树)===== */
635
+ .role-tokens {
636
+ color: #9dbefe;
637
+ font-size: 10.5px;
638
+ font-family: Consolas, "Courier New", monospace;
639
+ font-variant-numeric: tabular-nums;
640
+ }
641
+ .conv-token-bar {
642
+ position: absolute; /* 脱离文档流:显隐/更新数字都不推动消息内容,消除切换跳动 */
643
+ top: 0.5rem;
644
+ left: 1.4rem;
645
+ right: 1.4rem;
646
+ z-index: 3;
647
+ margin: 0;
648
+ padding: 0.4rem 0.7rem;
649
+ background: var(--sidebar);
650
+ border: 1px solid var(--border-light);
651
+ border-radius: var(--radius-md);
652
+ font-size: var(--fs-xs);
653
+ color: var(--muted);
654
+ }
655
+ .conv-token-bar b {
656
+ color: #9dbefe;
657
+ font-family: Consolas, "Courier New", monospace;
658
+ font-variant-numeric: tabular-nums;
659
+ }
660
+ .conv-token-cache { color: var(--muted); }
661
+ .sess-tokens { color: #9dbefe; font-family: Consolas, "Courier New", monospace; font-variant-numeric: tabular-nums; flex: 0 0 auto; white-space: nowrap; }
662
+
663
+ /* ===== 汇总视图(Token 按会话 + 提交按时间)===== */
664
+ .summary-view {
665
+ flex: 1;
666
+ overflow: auto;
667
+ padding: 0.9rem 1.1rem 1.6rem;
668
+ display: flex;
669
+ flex-direction: column;
670
+ gap: 1.1rem;
671
+ }
672
+ .sum-section {
673
+ border: 1px solid var(--border-light);
674
+ border-radius: var(--radius-md);
675
+ background: rgba(255, 255, 255, 0.015);
676
+ overflow: hidden;
677
+ }
678
+ .sum-head {
679
+ display: flex;
680
+ align-items: center;
681
+ justify-content: space-between;
682
+ padding: 0.45rem 0.8rem;
683
+ border-bottom: 1px solid var(--border);
684
+ background: var(--sidebar);
685
+ }
686
+ .sum-head h3 { margin: 0; font-size: var(--fs-sm); color: var(--text); font-weight: 600; }
687
+ .sum-total { font-size: var(--fs-xs); color: var(--muted); font-variant-numeric: tabular-nums; }
688
+ .sum-empty { padding: 0.9rem 0.8rem; color: var(--muted); font-size: var(--fs-xs); }
689
+ .sum-list { margin: 0; padding: 0.25rem 0; list-style: none; max-height: 340px; overflow: auto; }
690
+ .sum-list li {
691
+ display: flex;
692
+ align-items: baseline;
693
+ gap: 0.6rem;
694
+ padding: 0.2rem 0.8rem;
695
+ font-size: var(--fs-xs);
696
+ color: var(--muted);
697
+ white-space: nowrap;
698
+ }
699
+ .sum-list li:hover { background: var(--hover); }
700
+ .sum-ts { flex: 0 0 auto; color: var(--muted); font-family: Consolas, "Courier New", monospace; }
701
+ .sum-cwd { color: var(--c-session); overflow: hidden; text-overflow: ellipsis; }
702
+ .sum-tok { flex: 0 0 auto; color: #9dbefe; font-variant-numeric: tabular-nums; font-family: Consolas, "Courier New", monospace; }
703
+ .sum-add { color: #9bcd97; font-variant-numeric: tabular-nums; flex: 0 0 auto; min-width: 3rem; text-align: right; }
704
+ .sum-del { color: #fc533a; font-variant-numeric: tabular-nums; flex: 0 0 auto; min-width: 2.5rem; text-align: right; }
705
+ .sum-subject { color: var(--text); overflow: hidden; text-overflow: ellipsis; }
706
+ /* token 行:cwd 占中间伸缩,token 靠右 */
707
+ .sum-token-list .sum-cwd { flex: 1 1 auto; min-width: 0; }
708
+ /* 提交行:cwd 固定,subject 占中间伸缩 */
709
+ .sum-commit-list .sum-cwd { flex: 0 1 auto; min-width: 0; }
710
+ .sum-commit-list .sum-subject { flex: 1 1 auto; min-width: 0; }
711
+
712
+ /* 会话详情(SessionsModule 选中会话后) */
713
+ .session-detail { flex: 1; display: flex; flex-direction: column; min-height: 0; }
714
+ .detail-head {
715
+ display: flex;
716
+ align-items: center;
717
+ gap: 0.6rem;
718
+ padding: 0.45rem 0.8rem;
719
+ border-bottom: 1px solid var(--border);
720
+ }
721
+ .detail-back .icon { transform: rotate(180deg); }
722
+ .detail-sid { font-family: Consolas, "Courier New", monospace; color: var(--text); font-size: var(--fs-sm); }
723
+ .detail-cwd { color: var(--c-session); font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
724
+ .detail-token { margin-left: auto; color: #9dbefe; font-variant-numeric: tabular-nums; font-size: var(--fs-xs); }
725
+ .detail-tabs {
726
+ display: flex;
727
+ align-items: center;
728
+ gap: var(--space-2);
729
+ padding: 0 var(--space-3);
730
+ border-bottom: 1px solid var(--border);
731
+ }
732
+ .detail-search { max-width: 260px; }
733
+ .detail-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
734
+
735
+ /* 概览首页(KPI 卡 + 近期活动) */
736
+ .overview-view { flex: 1; overflow: auto; padding: 0.9rem 1.1rem 1.5rem; display: flex; flex-direction: column; gap: 1.1rem; }
737
+ .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.7rem; }
738
+ .kpi-card {
739
+ display: flex;
740
+ flex-direction: column;
741
+ gap: 0.25rem;
742
+ padding: 0.7rem 0.9rem;
743
+ background: var(--sidebar);
744
+ border: 1px solid var(--border-light);
745
+ border-radius: var(--radius-md);
746
+ }
747
+ .kpi-label { color: var(--muted); font-size: var(--fs-xs); }
748
+ .kpi-value { color: var(--text); font-size: 1.25rem; font-variant-numeric: tabular-nums; font-family: Consolas, "Courier New", monospace; }
749
+ .tl-kind { flex: 0 0 auto; padding: 0 0.4rem; border-radius: var(--radius-sm); font-size: 10px; }
750
+ .tl-kind.event { color: var(--c-posttool); background: rgba(197, 134, 192, 0.12); }
751
+ .tl-kind.commit { color: #9bcd97; background: rgba(155, 205, 151, 0.12); }
752
+
753
+ /* 统计模块(纯 CSS 条形,无图表库) */
754
+ .stats-view { flex: 1; display: flex; flex-direction: column; min-height: 0; }
755
+ .stats-body { flex: 1; overflow: auto; padding: 0.9rem 1.1rem 1.5rem; }
756
+ .bar-list { padding: 0.5rem 0.8rem; display: flex; flex-direction: column; gap: 0.35rem; }
757
+ .bar-row { display: flex; align-items: center; gap: 0.6rem; font-size: var(--fs-xs); }
758
+ .bar-label { flex: 0 0 88px; color: var(--c-session); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
759
+ .bar-list.day .bar-label { flex: 0 0 48px; color: var(--muted); font-family: Consolas, "Courier New", monospace; }
760
+ .bar-track { flex: 1 1 auto; height: 14px; background: var(--bg); border-radius: 7px; overflow: hidden; min-width: 0; }
761
+ .bar-fill { height: 100%; border-radius: 7px; min-width: 2px; transition: width 0.2s; }
762
+ .bar-fill.tok { background: linear-gradient(90deg, #2c4a7a, #4a7ac4); }
763
+ .bar-fill.commit { background: linear-gradient(90deg, #2d6a4f, #52b788); }
764
+ .bar-val { flex: 0 0 auto; color: var(--muted); font-variant-numeric: tabular-nums; font-family: Consolas, "Courier New", monospace; }
765
+
766
+ /* 系统模块(daemon 信息 + 日志尾 + 数据目录) */
767
+ .system-view { flex: 1; overflow: auto; padding: 0.9rem 1.1rem 1.5rem; display: flex; flex-direction: column; gap: 1.1rem; }
768
+ .sys-grid { padding: 0.3rem 0.8rem; display: flex; flex-direction: column; }
769
+ .sys-row {
770
+ display: flex;
771
+ justify-content: space-between;
772
+ gap: 0.6rem;
773
+ padding: 0.3rem 0;
774
+ font-size: var(--fs-xs);
775
+ border-bottom: 1px solid var(--border);
776
+ }
777
+ .sys-row:last-child { border-bottom: none; }
778
+ .sys-row span { color: var(--muted); flex: 0 0 auto; }
779
+ .sys-row b {
780
+ color: var(--text);
781
+ font-variant-numeric: tabular-nums;
782
+ font-family: Consolas, "Courier New", monospace;
783
+ text-align: right;
784
+ word-break: break-all;
785
+ }
786
+ .sys-row.err b { color: var(--err); }
787
+ .sys-log {
788
+ margin: 0;
789
+ padding: 0.6rem 0.8rem;
790
+ font-family: Consolas, "Courier New", monospace;
791
+ font-size: 11.5px;
792
+ line-height: 1.5;
793
+ color: var(--muted);
794
+ white-space: pre-wrap;
795
+ word-break: break-word;
796
+ max-height: 340px;
797
+ overflow: auto;
798
+ }
799
+ .sys-empty { padding: 0.7rem 0.8rem; color: var(--muted); font-size: var(--fs-xs); line-height: 1.6; }
800
+ .sys-empty code { color: var(--c-session); font-family: Consolas, "Courier New", monospace; }
801
+
802
+ /* ===== 提交视图(git log:时间 + +新增/-删除 + 说明 + 作者)===== */
803
+ .commits-view {
804
+ flex: 1;
805
+ overflow: auto;
806
+ font-family: Consolas, "Courier New", monospace;
807
+ font-size: 11.5px;
808
+ }
809
+ .commit-list { list-style: none; margin: 0; padding: 0; }
810
+ .commit {
811
+ display: flex;
812
+ flex-direction: column;
813
+ border-bottom: 1px solid var(--border-light);
814
+ cursor: pointer;
815
+ }
816
+ .commit:hover { background: var(--hover); }
817
+ .commit-row {
818
+ display: grid;
819
+ grid-template-columns: 92px 50px 50px 1fr 96px;
820
+ gap: 0.5rem;
821
+ padding: 0.18rem 0.7rem;
822
+ white-space: nowrap;
823
+ align-items: baseline;
824
+ }
825
+ .commit-ts { color: var(--muted); }
826
+ .commit-add { color: #9bcd97; text-align: right; }
827
+ .commit-del { color: #fc533a; text-align: right; }
828
+ .commit-subject { color: var(--text); overflow: hidden; text-overflow: ellipsis; }
829
+ .commit-author { color: var(--muted); overflow: hidden; text-overflow: ellipsis; }
830
+ .commit-files {
831
+ list-style: none;
832
+ margin: 0.15rem 0 0.4rem 0.7rem;
833
+ padding: 0.3rem 0.5rem;
834
+ background: var(--sidebar);
835
+ border-left: 2px solid var(--accent);
836
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
837
+ max-height: 320px;
838
+ overflow: auto;
839
+ }
840
+ .commit-files li {
841
+ display: grid;
842
+ grid-template-columns: 46px 46px 1fr;
843
+ gap: 0.4rem;
844
+ padding: 0.1rem 0;
845
+ white-space: nowrap;
846
+ }
847
+ .cf-add { color: #9bcd97; text-align: right; }
848
+ .cf-del { color: #fc533a; text-align: right; }
849
+ .cf-path { color: var(--text); overflow: hidden; text-overflow: ellipsis; }