@sanqianx/claude-ai-workbench 0.11.0 → 0.12.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.
@@ -1,566 +1,566 @@
1
- /* Agent Terminal — desktop-flat theme.
2
- Design scale: spacing 4/8/12/16/24 · type 11/12.5/13/15/18 · radius 6/9/13 (+pills)
3
- control heights 26/30/36 (22px micro icon buttons) · two shadow levels:
4
- --shadow-1 hover/floating, --shadow-2 popovers & modals. */
5
-
6
- /* ===== tokens ===== */
7
- :root {
8
- --page:#0d0d0d; --side:#0d0d0d; --surface:#1a1a1a; --surface2:#242424;
9
- --line:#242424; --line2:#303030; --pop:#1f1f1f;
10
- --text:#ececec; --muted:#909090; --faint:#5f5f5f;
11
- --good:#4cc38a; --warn:#e2b466; --bad:#f08080; --accent:#e8863c; --blue:#4f8ef7;
12
- --good-soft:rgba(76,195,138,.12); --bad-soft:rgba(240,128,128,.1);
13
- --blue-soft:rgba(79,142,247,.14); --accent-soft:rgba(232,134,60,.14);
14
- --focus:rgba(79,142,247,.55); --focus-line:rgba(79,142,247,.45);
15
- --code-bg:#141417; --code-line:#26262b;
16
- --shadow-1:0 2px 10px rgba(0,0,0,.3);
17
- --shadow-2:0 12px 32px rgba(0,0,0,.55);
18
- }
19
- body.light {
20
- --page:#f7f7f7; --side:#f7f7f7; --surface:#ececec; --surface2:#e2e2e2;
21
- --line:#dcdcdc; --line2:#c9c9c9; --pop:#ffffff;
22
- --text:#1c1c1c; --muted:#666666; --faint:#9a9a9a;
23
- --good:#258263; --warn:#9d6e21; --bad:#bd4e4e; --accent:#c26a1e; --blue:#2f6fd0;
24
- --good-soft:rgba(37,130,99,.12); --bad-soft:rgba(189,78,78,.1);
25
- --blue-soft:rgba(47,111,208,.12); --accent-soft:rgba(194,106,30,.12);
26
- --focus:rgba(47,111,208,.5); --focus-line:rgba(47,111,208,.45);
27
- --code-bg:#f2f3f5; --code-line:#dfe1e6;
28
- --shadow-1:0 2px 10px rgba(30,30,30,.1);
29
- --shadow-2:0 12px 32px rgba(30,30,30,.18);
30
- }
31
-
32
- /* ===== base ===== */
33
- * { box-sizing:border-box; }
34
- [hidden] { display:none !important; }
35
- body { margin:0; overflow:hidden; background:var(--page); color:var(--text);
36
- font:13px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif; }
37
- button, input, textarea, select { font:inherit; }
38
- button { cursor:pointer; color:inherit; }
39
- :focus-visible { outline:2px solid var(--focus); outline-offset:1px; }
40
- .fin:focus-visible, .pop-search:focus-visible, .composer textarea:focus-visible { outline:none; }
41
- .view { display:none; height:100vh; }
42
- .view.active { display:flex; }
43
- .linklike { border:0; color:var(--blue); background:transparent; padding:0; font-size:inherit; }
44
- .linklike:hover { text-decoration:underline; }
45
-
46
- /* Shared micro-interaction: every flat interactive surface eases its state change. */
47
- .session, .proj-item, .add-proj, .stab, .mgmt-item, .pop-item, .bar-btn, .ghost, .new-session,
48
- .act-btn, .foot-btn, .io-copy, .bubble-copy, .cb-copy, .attachment-remove, .del,
49
- .path-row .browse, .cta, .btn-allow, .btn-deny, .jump-latest, .send, .toggle-caret {
50
- transition:background-color .12s ease, color .12s ease, border-color .12s ease, filter .12s ease, transform .06s ease;
51
- }
52
-
53
- /* ===== generic buttons ===== */
54
- .ghost { display:inline-flex; align-items:center; gap:8px; height:26px; padding:0 12px;
55
- border:0; color:var(--muted); background:transparent; font-size:12.5px; border-radius:6px; }
56
- .ghost:hover { color:var(--text); background:var(--surface); }
57
-
58
- /* ===== 侧栏 ===== */
59
- .sidebar { display:flex; flex-direction:column; width:264px; flex:0 0 auto;
60
- background:var(--side); border-right:1px solid var(--line); }
61
- .brand { display:flex; align-items:center; justify-content:space-between; padding:16px 16px 12px; }
62
- .brand h1 { display:flex; align-items:center; gap:8px; margin:0; font-size:15px; font-weight:700; }
63
- .brand h1 svg.ics { width:15px; height:15px; color:var(--accent); }
64
- .brand .ver { color:var(--faint); font-size:11px; }
65
- .new-session { display:flex; align-items:center; gap:8px; height:30px; margin:4px 12px 8px;
66
- padding:0 12px; border:1px solid var(--line2); border-radius:9px; color:var(--muted);
67
- background:var(--surface); text-align:left; font-size:12.5px; }
68
- .new-session:hover { color:var(--text); background:var(--surface2); border-color:var(--line2); }
69
- .session-scroll { flex:1; overflow-y:auto; padding:4px 12px 12px; }
70
- .group-label { margin:16px 4px 4px; color:var(--faint); font-size:11px; letter-spacing:.12em; text-transform:uppercase; }
71
-
72
- /* 项目行:折叠箭头 + 名称 + 悬浮操作。激活项目以左侧主色条标记。 */
73
- .proj-item { display:flex; align-items:center; gap:8px; width:100%; height:26px; padding:0 8px;
74
- border:0; border-radius:6px; color:var(--text); background:transparent;
75
- font-size:12.5px; font-weight:600; text-align:left; }
76
- .proj-item:hover { background:var(--surface); }
77
- .proj.active > .proj-item { background:var(--surface); box-shadow:inset 2px 0 0 var(--accent); }
78
- .p-caret { display:inline-flex; align-items:center; justify-content:center; width:12px; height:12px;
79
- flex:0 0 auto; color:var(--faint); transition:transform .15s ease; }
80
- .p-caret.closed { transform:rotate(-90deg); }
81
- .proj-item .p-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
82
- .toggle-caret { display:inline-flex; align-items:center; justify-content:center; width:12px; height:12px;
83
- flex:0 0 auto; color:inherit; transition:transform .15s ease; }
84
- .toggle-caret.closed { transform:rotate(-90deg); }
85
- .sess-list { padding:0 0 4px; }
86
- .sess-list .session { padding-left:24px; }
87
- .session { display:flex; align-items:center; gap:8px; width:100%; height:26px; padding:0 8px;
88
- border:0; border-radius:6px; background:transparent; color:var(--muted); text-align:left; font-size:12.5px; }
89
- .session:hover { background:var(--surface); color:var(--text); }
90
- .session.active { background:var(--surface2); color:var(--text); box-shadow:inset 2px 0 0 var(--accent); }
91
- .session .s-title { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
92
- .session .when { margin-left:auto; color:var(--faint); font-size:11px; flex:0 0 auto; }
93
- .session:hover > .when { display:none; }
94
- .agent-badge { display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto;
95
- width:18px; height:18px; border-radius:6px; color:#fff; font-size:11px; font-weight:700; }
96
- .agent-badge.claude-code { background:#c9642d; }
97
- .agent-badge.codex { background:#2e7d5b; }
98
- .agent-badge.zcode { background:#6d5bd0; }
99
- .agent-badge.opencode { background:#33739e; }
100
- .add-proj { display:flex; align-items:center; gap:8px; width:100%; height:26px; margin:4px 0 0;
101
- padding:0 8px; border:0; border-radius:6px; color:var(--muted); background:transparent;
102
- font-size:12.5px; text-align:left; }
103
- .add-proj:hover { color:var(--text); background:var(--surface); }
104
- .proj-empty { padding:4px 8px 8px 24px; color:var(--faint); font-size:11px; }
105
-
106
- /* 侧栏空态:SVG 图标组合的插画式提示,不依赖外部资源。 */
107
- .side-empty { display:grid; justify-items:center; gap:4px; margin:8px 4px 12px; padding:16px 12px;
108
- border:1px dashed var(--line2); border-radius:9px; color:var(--faint); font-size:12.5px; text-align:center; }
109
- .side-empty-art { display:flex; align-items:center; justify-content:center; width:40px; height:40px;
110
- border-radius:9px; background:var(--surface); color:var(--faint); }
111
- .side-empty-sub { font-size:11px; }
112
-
113
- .row-acts { display:none; align-items:center; gap:2px; margin-left:auto; flex:0 0 auto; }
114
- .session:hover > .row-acts, .proj-item:hover > .row-acts { display:inline-flex; }
115
- .act-btn { display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px;
116
- padding:0; border:0; color:var(--muted); background:transparent; border-radius:6px; user-select:none; }
117
- .act-btn:hover { color:var(--text); background:var(--surface2); }
118
- .act-btn.danger:hover { color:var(--bad); background:var(--bad-soft); }
119
-
120
- /* 归档区:分隔线 + 可折叠标题 + 计数徽标。 */
121
- .arch-toggle { display:flex; align-items:center; gap:4px; width:calc(100% - 8px); margin:16px 0 4px;
122
- padding:8px 4px 4px; border:0; border-top:1px solid var(--line); background:transparent;
123
- color:var(--faint); font-size:11px; letter-spacing:.12em; text-transform:uppercase; text-align:left; }
124
- .arch-toggle:hover { color:var(--muted); }
125
- .arch-count { margin-left:4px; padding:0 4px; border-radius:99px; background:var(--surface);
126
- color:var(--faint); font-size:11px; letter-spacing:0; }
127
- .arch-list .session .s-title { color:var(--muted); }
128
- .arch-list .agent-badge { opacity:.75; }
129
- .sidebar-foot { display:flex; align-items:center; gap:8px; padding:12px 16px;
130
- border-top:1px solid var(--line); color:var(--faint); font-size:11px; }
131
- .sidebar-foot .ghost { padding:0 4px; }
132
- .dot { display:inline-block; width:7px; height:7px; flex:0 0 auto; border-radius:99px; background:var(--good); }
133
- .dot.run { animation:pulse 1.4s infinite; }
134
- @keyframes pulse { 50% { opacity:.4; } }
135
-
136
- /* ===== 主区 ===== */
137
- .main { display:flex; flex-direction:column; flex:1; min-width:0; position:relative; }
138
- .top-strip { display:flex; flex-wrap:wrap; align-items:center; gap:8px; padding:12px 24px 8px; }
139
- .top-strip .t { font-weight:600; font-size:13px; }
140
- .session-provider { color:var(--faint); font-size:11px; overflow:hidden; text-overflow:ellipsis;
141
- white-space:nowrap; min-width:0; }
142
- .top-strip .st { display:inline-flex; align-items:center; gap:8px; margin-left:auto; padding:4px 12px;
143
- border-radius:99px; color:#9db8ff; background:var(--blue-soft); font-size:12.5px; }
144
- body.light .top-strip .st { color:#2f5fd0; }
145
-
146
- /* ===== 消息流(ZCode 风格:过程折叠,正文直出)===== */
147
- .stream { flex:1; overflow-y:auto; padding:8px 24px 24px; }
148
- .col { max-width:860px; margin:0 auto; }
149
- .empty-hint { text-align:center; color:var(--muted); margin-top:18vh; font-size:13px; line-height:1.7; }
150
- .empty-hint .big { display:flex; align-items:center; justify-content:center; margin-bottom:12px; }
151
- .hint-wrap { position:relative; display:inline-flex; }
152
- .hint-art { display:flex; align-items:center; justify-content:center; width:56px; height:56px;
153
- border-radius:13px; border:1px solid var(--line); background:var(--surface); color:var(--muted); }
154
- .hint-art svg { width:24px; height:24px; }
155
- .hint-art svg, .hint-spark svg { fill:none; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
156
- .hint-spark { position:absolute; top:-6px; right:-8px; display:flex; align-items:center; justify-content:center;
157
- width:20px; height:20px; border-radius:99px; background:var(--surface2); color:var(--accent); box-shadow:var(--shadow-1); }
158
- .hint-spark svg { width:11px; height:11px; }
159
- .empty-hint p { margin:4px 0 0; }
160
-
161
- /* 用户消息:轻量右置色块(尾部小圆角);AI 消息:全宽白板。 */
162
- .msg.user { display:grid; justify-items:end; margin:24px 0 12px; }
163
- .bubble { max-width:82%; padding:8px 12px; border:1px solid var(--line); border-radius:13px 13px 4px 13px;
164
- background:var(--surface2); color:var(--text); font-size:13px; line-height:1.65;
165
- white-space:pre-wrap; overflow-wrap:anywhere; }
166
- body.light .bubble { background:var(--surface); }
167
- .msg.ai { margin:12px 0 16px; }
168
- .msg.ai p { margin:0 0 12px; white-space:pre-wrap; overflow-wrap:anywhere; line-height:1.7; }
169
- .msg.ai .dim { color:var(--muted); }
170
-
171
- /* 回合折叠区:头部即计时行(工作中 X 秒 → 已工作 X 秒) */
172
- .proc { margin:4px 0 12px; user-select:none; }
173
- .proc > summary { display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
174
- color:var(--muted); font-size:12.5px; padding:4px 8px; margin-left:-8px; border-radius:6px; }
175
- .proc > summary:hover { color:var(--text); background:var(--surface); }
176
- .proc > summary::-webkit-details-marker { display:none; }
177
- .proc .caret { display:inline-flex; color:var(--faint); transition:transform .15s ease; }
178
- .proc[open] > summary .caret { transform:rotate(90deg); }
179
- .proc .p-meta { color:var(--faint); }
180
- .proc-steps { display:grid; gap:2px; margin:2px 0 8px 16px; padding-left:12px; border-left:1px solid var(--line); }
181
- .turn-note { display:flex; align-items:center; gap:8px; margin:4px 0 16px; color:var(--faint); font-size:12.5px; }
182
-
183
- /* 过程行:思考分段 / 工具步骤 / 备注行 */
184
- .think-seg { margin:4px 0 8px; }
185
- .think-label { display:flex; align-items:center; gap:8px; color:var(--muted); font-size:12.5px; padding:2px 0; }
186
- .t-glyph { color:var(--faint); }
187
- .t-meta { color:var(--faint); font-size:12.5px; }
188
- .think-body { color:var(--faint); font-size:12.5px; line-height:1.65; white-space:pre-wrap;
189
- overflow-wrap:anywhere; margin:2px 0 4px 16px; max-height:280px; overflow-y:auto; }
190
- .step { color:var(--muted); font-size:12.5px; }
191
- .step > summary { display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
192
- flex-wrap:wrap; padding:4px 0; min-width:0; }
193
- .step > summary::-webkit-details-marker { display:none; }
194
- .s-caret { display:inline-flex; color:var(--faint); flex:0 0 auto; transition:transform .15s ease; }
195
- .step[open] > summary .s-caret { transform:rotate(90deg); }
196
- .s-dot { width:8px; height:8px; flex:0 0 auto; border-radius:99px; background:var(--blue); }
197
- .step.failed .s-dot { background:var(--bad); }
198
- .step.note .s-dot { background:var(--faint); }
199
- .s-name { font-weight:600; color:var(--text); font-size:12.5px; }
200
- .s-desc { color:var(--faint); font-size:12.5px; overflow:hidden; text-overflow:ellipsis;
201
- white-space:nowrap; min-width:0; max-width:60%; }
202
- .s-meta { color:var(--faint); font-size:12.5px; margin-left:auto; flex:0 0 auto; }
203
- .s-meta.failed { color:var(--bad); }
204
- .step-body { display:grid; gap:8px; margin:2px 0 12px 16px; }
205
- .step-line { display:flex; align-items:center; gap:8px; color:var(--faint); font-size:12.5px; padding:2px 0; }
206
- .step-line .s-dot { width:6px; height:6px; background:var(--warn); }
207
-
208
- /* 输入/输出卡片:语言标签 + 复制按钮 + 语法高亮 */
209
- .io-card { border:1px solid var(--line); border-radius:9px; background:var(--surface); overflow:hidden; }
210
- .io-head { display:flex; align-items:center; justify-content:space-between; padding:4px 4px 0 12px; }
211
- .io-tag { display:inline-flex; align-items:center; gap:4px; color:var(--faint); font-size:11px;
212
- letter-spacing:.05em; text-transform:uppercase; }
213
- .io-brace { font:11px Consolas,monospace; color:var(--muted); }
214
- .io-copy { display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px;
215
- border:0; color:var(--faint); background:transparent; border-radius:6px; }
216
- .io-copy:hover { color:var(--text); background:var(--surface2); }
217
- .io-card pre { margin:0; padding:4px 12px 8px; color:var(--muted);
218
- font:12.5px/1.6 Consolas,"Microsoft YaHei",monospace; white-space:pre-wrap;
219
- overflow-wrap:anywhere; max-height:320px; overflow-y:auto; }
220
- .j-key { color:#7aa2f7; }
221
- .j-str { color:#9ece6a; }
222
- .j-num { color:#e0af68; }
223
- .j-bool { color:#bb9af7; }
224
- body.light .j-key { color:#2f5fd0; }
225
- body.light .j-str { color:#3a7d3a; }
226
- body.light .j-num { color:#9d6e21; }
227
- body.light .j-bool { color:#7a4fb3; }
228
- .file-changes { display:grid; gap:4px; font-size:12.5px; }
229
- .file-change { display:flex; gap:8px; align-items:baseline; min-width:0; }
230
- .file-path { min-width:0; overflow-wrap:anywhere; }
231
- .diff-add { color:var(--good); }
232
- .diff-remove { color:var(--bad); }
233
-
234
- /* 用户气泡复制按钮 */
235
- .bubble-copy { display:inline-flex; align-items:center; justify-content:center; height:22px;
236
- min-width:26px; margin:4px 2px 0 auto; border:0; color:var(--faint); background:transparent;
237
- border-radius:6px; }
238
- .bubble-copy:hover { color:var(--text); background:var(--surface2); }
239
- .copied .ic { color:var(--good); }
240
-
241
- /* 最终消息操作条:复制 / 重试 / 模型 · 时间 */
242
- .msg-foot { display:flex; align-items:center; gap:2px; margin:4px 0 16px; }
243
- .foot-btn { display:inline-flex; align-items:center; justify-content:center; width:26px; height:24px;
244
- border:0; color:var(--faint); background:transparent; border-radius:6px; }
245
- .foot-btn:hover { color:var(--text); background:var(--surface2); }
246
- .foot-time { color:var(--faint); font-size:11px; margin-left:8px; }
247
-
248
- /* 回合文件变更汇总 */
249
- .turn-diffs { margin:4px 0 16px; }
250
- .turn-diffs-head { display:flex; align-items:center; gap:8px; padding:2px 0 4px; }
251
- .td-label { color:var(--muted); font-size:12.5px; font-weight:600; }
252
- .td-count { display:inline-flex; align-items:center; gap:8px; font:11px Consolas,monospace; }
253
- .td-approx { font-style:normal; color:var(--faint); font-size:11px; }
254
- .turn-diffs-list { padding:0 0 0 12px; display:grid; gap:2px; }
255
- .td-row { display:flex; gap:8px; align-items:baseline; justify-content:space-between;
256
- font-size:12.5px; color:var(--faint); }
257
- .td-rowcount { font:11px Consolas,monospace; color:var(--faint); flex:0 0 auto; }
258
- .td-more { color:var(--faint); }
259
-
260
- /* 工具行参数徽章与运行态 shimmer */
261
- .s-args { display:inline-flex; gap:4px; }
262
- .s-args i { font-style:normal; font:11px Consolas,"Microsoft YaHei",monospace; color:var(--faint);
263
- background:var(--surface2); padding:1px 4px; border-radius:99px; }
264
- .s-meta.running { background:linear-gradient(90deg, var(--faint) 25%, var(--text) 50%, var(--faint) 75%);
265
- background-size:200% 100%; -webkit-background-clip:text; background-clip:text; color:transparent;
266
- animation:shimmer 1.6s linear infinite; }
267
- @keyframes shimmer { to { background-position:-200% 0; } }
268
-
269
- /* 回到底部悬浮按钮 */
270
- .jump-latest { position:absolute; right:24px; bottom:136px; z-index:5; display:inline-flex;
271
- align-items:center; gap:4px; height:26px; padding:0 12px; border:1px solid var(--line2);
272
- border-radius:99px; background:var(--pop); color:var(--muted); font-size:12.5px;
273
- box-shadow:var(--shadow-2); }
274
- .jump-latest:hover { color:var(--text); background:var(--surface); }
275
-
276
- /* 助手正文 markdown */
277
- .md-body { font-size:15px; line-height:1.7; color:#d8d8d8; overflow-wrap:anywhere; }
278
- body.light .md-body { color:var(--text); }
279
- .md-body.streaming::after { content:"▍"; animation:pulse 1s infinite; color:var(--text); }
280
- .md-body p { margin:0 0 12px; white-space:pre-wrap; }
281
- .md-body p:last-child { margin-bottom:0; }
282
- .md-body h3, .md-body h4, .md-body h5, .md-body h6 { margin:16px 0 8px; font-size:15px; font-weight:650; }
283
- .md-body h3 { font-size:18px; }
284
- .md-body h5, .md-body h6 { font-weight:600; color:var(--muted); }
285
- .md-body ul, .md-body ol { margin:0 0 12px; padding-left:24px; }
286
- .md-body li { margin:4px 0; }
287
- .md-body blockquote { margin:0 0 12px; padding:4px 12px; border-left:2px solid var(--line2); color:var(--muted); }
288
- .md-body hr { border:0; border-top:1px solid var(--line); margin:16px 0; }
289
- .md-body strong { color:var(--text); font-weight:650; }
290
- .md-body code { padding:1px 4px; border-radius:6px; background:rgba(255,255,255,.07);
291
- font:12.5px/1.5 Consolas,"Microsoft YaHei",monospace; }
292
- body.light .md-body code { background:rgba(0,0,0,.06); }
293
- .md-body a { color:var(--blue); }
294
- .codeblock { margin:0 0 12px; border:1px solid var(--code-line); border-radius:9px;
295
- background:var(--code-bg); overflow:hidden; }
296
- .cb-head { display:flex; align-items:center; justify-content:space-between; padding:4px 4px 4px 12px;
297
- border-bottom:1px solid var(--code-line); }
298
- .cb-lang { color:var(--faint); font-size:11px; letter-spacing:.05em; text-transform:uppercase; }
299
- .cb-copy { display:inline-flex; align-items:center; height:22px; padding:0 4px; border:0;
300
- color:var(--muted); background:transparent; font-size:11px; border-radius:6px; }
301
- .cb-copy:hover { color:var(--text); background:var(--surface2); }
302
- .codeblock pre { margin:0; padding:8px 12px; overflow-x:auto; }
303
- .codeblock code { font:12.5px/1.65 Consolas,"Microsoft YaHei",monospace; background:transparent;
304
- padding:0; color:#cfd8ea; }
305
- body.light .codeblock code { color:#24304a; }
306
-
307
- /* 权限确认卡 */
308
- .perm { display:flex; align-items:center; gap:12px; margin:16px 0; padding:12px 16px;
309
- border:1px solid var(--line); border-radius:13px; background:var(--surface); }
310
- .perm.settled { display:inline-flex; margin:4px 0; padding:0; background:transparent; border:0; }
311
- .perm.settled .p-title { font-weight:400; color:var(--faint); font-size:12.5px; }
312
- .perm.settled .p-sub, .perm.settled .p-icon { display:none; }
313
- .perm.settled .p-state { font-size:12.5px; }
314
- .perm .p-icon { flex:0 0 auto; color:var(--warn); display:inline-flex; }
315
- .perm .p-body { flex:1; min-width:0; }
316
- .perm .p-title { font-size:13px; font-weight:600; }
317
- .perm .p-sub { margin-top:2px; color:var(--muted); font-size:11px; font-family:Consolas,monospace; overflow-wrap:anywhere; }
318
- .perm .p-actions { display:flex; gap:8px; }
319
- .perm .btn-allow { height:30px; padding:0 16px; border:0; border-radius:9px; color:#161616;
320
- background:var(--accent); font-weight:650; font-size:12.5px; }
321
- .perm .btn-allow:hover { filter:brightness(1.08); }
322
- body.light .perm .btn-allow { color:#fff; }
323
- .perm .btn-deny { height:30px; padding:0 12px; border:0; border-radius:9px; color:var(--muted);
324
- background:transparent; font-size:12.5px; }
325
- .perm .btn-deny:hover { color:var(--bad); }
326
- .perm .p-state { color:var(--muted); font-size:12.5px; }
327
- .perm .p-state.no { color:var(--bad); }
328
-
329
- /* 附件托盘:缩略图统一 48px,移除按钮悬浮于角标 */
330
- .attach-tray { display:flex; flex-wrap:wrap; gap:8px; justify-content:flex-end; margin:-8px 0 12px; }
331
- .attach-tray img { width:48px; height:48px; object-fit:cover; display:block;
332
- border-radius:9px; border:1px solid var(--line); }
333
- .attachment-item { position:relative; display:flex; align-items:center; gap:4px; max-width:100%; }
334
- .attachment-file { display:inline-flex; align-items:center; gap:4px; max-width:100%; padding:4px 8px;
335
- border:1px solid var(--line); border-radius:9px; background:var(--surface);
336
- color:var(--muted); font-size:12.5px; overflow-wrap:anywhere; }
337
- .attachment-remove { display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px;
338
- border:0; border-radius:99px; background:transparent; color:var(--muted); }
339
- .attachment-item.img .attachment-remove { position:absolute; top:-6px; right:-6px;
340
- background:var(--surface2); box-shadow:var(--shadow-1); z-index:1; }
341
- .attachment-remove:hover { color:var(--bad); background:var(--surface2); }
342
- .composer .attach-tray { justify-content:flex-start; margin:0 0 8px; }
343
-
344
- /* ===== 底部输入容器 ===== */
345
- .composer-wrap { padding:8px 24px 16px; }
346
- .composer { max-width:860px; margin:0 auto; border-radius:13px; background:var(--surface);
347
- border:1px solid var(--line); padding:12px 12px 8px;
348
- transition:border-color .15s ease, box-shadow .15s ease; }
349
- .composer:focus-within { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
350
- .composer textarea { width:100%; min-height:22px; max-height:150px; padding:2px 2px 8px; border:0;
351
- color:var(--text); background:transparent; resize:none; outline:none; font:13px/1.6 inherit; }
352
- .composer textarea::placeholder { color:var(--faint); }
353
- .cmdrow { display:flex; align-items:center; gap:4px; }
354
- .bar-btn { display:inline-flex; align-items:center; gap:4px; height:26px; padding:0 8px;
355
- border:0; border-radius:6px; color:var(--muted); background:transparent;
356
- font-size:12.5px; white-space:nowrap; }
357
- .bar-btn:hover { background:var(--surface2); color:var(--text); }
358
- .bar-btn .chev { display:inline-flex; color:var(--faint); }
359
- #model-label { max-width:min(34vw,330px); overflow:hidden; text-overflow:ellipsis; }
360
- .bar-btn.plus .ic { width:15px; height:15px; }
361
- .bar-btn.mode { color:var(--text); }
362
- .bar-btn.mode .shield { display:inline-flex; filter:grayscale(1); opacity:.85; }
363
- .bar-btn.mode.accent { color:var(--accent); }
364
- .bar-btn.mode.accent .shield { filter:none; opacity:1; }
365
- .cmd-spacer { flex:1; }
366
- .ring { display:inline-block; width:13px; height:13px; flex:0 0 auto; margin:0 8px 0 0;
367
- border:2px solid var(--faint); border-top-color:var(--text); border-right-color:var(--text);
368
- border-radius:50%; transform:rotate(-35deg); animation:spin 1s linear infinite; }
369
- .ctx-mini { position:relative; width:54px; height:4px; margin:0 2px; border-radius:99px;
370
- background:var(--surface2); overflow:hidden; }
371
- .ctx-mini i { position:absolute; top:0; bottom:0; left:0; border-radius:99px;
372
- background:linear-gradient(90deg, var(--good), var(--warn)); }
373
- @keyframes spin { to { transform:rotate(325deg); } }
374
- .send { display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px;
375
- border:0; border-radius:99px; background:var(--accent); }
376
- .send:hover { filter:brightness(1.1); }
377
- .send:active { transform:scale(.94); }
378
- .send .up, .send .sq { color:#161616; }
379
- .send .up { display:inline-flex; align-items:center; justify-content:center; }
380
- .send .sq { width:10px; height:10px; border-radius:2px; background:#161616; }
381
- body.light .send .up { color:#fff; }
382
- body.light .send .sq { background:#fff; }
383
-
384
- /* ===== 弹出层 ===== */
385
- .anchor { position:relative; display:inline-flex; }
386
- .pop { position:absolute; bottom:calc(100% + 8px); z-index:40; min-width:240px; padding:4px;
387
- border-radius:13px; background:var(--pop); border:1px solid var(--line2);
388
- box-shadow:var(--shadow-2); animation:pop-in .12s ease; }
389
- .pop[hidden] { display:none; }
390
- .pop.from-left { left:0; } .pop.from-right { right:0; }
391
- .pop-group { display:flex; align-items:center; gap:8px; padding:8px 8px 4px; color:var(--muted); font-size:12.5px; }
392
- .tag { display:inline-flex; align-items:center; padding:1px 8px; border-radius:6px;
393
- background:var(--surface2); color:var(--muted); font-size:11px; }
394
- .pop-item { display:flex; align-items:center; gap:8px; width:100%; padding:4px 8px; border:0;
395
- border-radius:6px; color:var(--text); background:transparent; font-size:13px; text-align:left; }
396
- .pop-item:hover:not(:disabled) { background:var(--surface2); }
397
- .pop-item:disabled { opacity:.4; cursor:not-allowed; }
398
- /* Whole menu scrolls as one — no nested inner scrollbar. */
399
- #pop-model { max-height:min(560px,76vh); max-width:min(480px,90vw); overflow:auto; }
400
- .pop-item .grow { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
401
- .pop-item .check { display:inline-flex; color:var(--blue); visibility:hidden; }
402
- .pop-item.selected .check { visibility:visible; }
403
- .pop-item.selected .grow { font-weight:600; }
404
- .pop-item.muted { color:var(--muted); }
405
- .pop-sep { height:1px; margin:4px; background:var(--line); }
406
- .ctx-pop { width:360px; padding:16px; }
407
- .ctx-head { display:flex; justify-content:space-between; align-items:center; font-size:12.5px; }
408
- .ctx-head .num { color:var(--muted); }
409
- .bar { height:5px; margin:8px 0 12px; border-radius:99px; background:var(--surface2); overflow:hidden; }
410
- .bar > i { display:block; height:100%; border-radius:99px; background:var(--blue); }
411
- .ctx-row { display:flex; justify-content:space-between; padding:4px 0; color:var(--muted); font-size:12.5px; }
412
- .ctx-sep { height:1px; margin:8px 0; background:var(--line); }
413
-
414
- /* ===== 设置页 ===== */
415
- .settings-wrap { display:flex; flex:1; min-width:0; }
416
- .settings-nav { width:190px; flex:0 0 auto; padding:16px 8px; border-right:1px solid var(--line); }
417
- .settings-nav strong { display:block; padding:0 12px 12px; font-size:13px; }
418
- .settings-back { margin:0 0 12px; padding-left:0; }
419
- .stab { width:100%; height:30px; margin:1px 0; padding:0 12px; border:0; border-radius:6px;
420
- color:var(--muted); background:transparent; text-align:left; font-size:12.5px; }
421
- .stab:hover { color:var(--text); background:var(--surface); }
422
- .stab.active { color:var(--text); background:var(--surface2); box-shadow:inset 2px 0 0 var(--accent); }
423
- .settings-body { flex:1; overflow-y:auto; padding:24px; }
424
- .settings-body h2 { margin:0 0 4px; font-size:18px; }
425
- .settings-body .sub { margin:0 0 24px; color:var(--muted); font-size:12.5px; }
426
- .spanel { display:none; } .spanel.active { display:block; }
427
- .prov-cols { display:grid; grid-template-columns:210px minmax(0,1fr); gap:12px; align-items:start; }
428
- .mgmt-side { padding:8px; border-radius:13px; background:var(--surface); border:1px solid var(--line); }
429
- .mgmt-group { padding:8px 8px 4px; color:var(--faint); font-size:11px; }
430
- .mgmt-item { display:flex; align-items:center; gap:8px; width:100%; height:30px; padding:0 8px;
431
- border:0; border-radius:6px; color:var(--text); background:transparent; font-size:13px; text-align:left; }
432
- .mgmt-item:hover { background:var(--surface2); }
433
- .mgmt-item.active { background:var(--surface2); }
434
- .mgmt-item .grow { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
435
- .mgmt-item .dot { width:6px; height:6px; }
436
- .mgmt-item .dot.off { background:var(--faint); }
437
- .mgmt-detail { min-height:380px; padding:24px; border-radius:13px; background:var(--surface);
438
- border:1px solid var(--line); }
439
- .empty-models { padding:24px 0; color:var(--faint); font-size:12.5px; text-align:center; }
440
- .pd { display:none; } .pd.active { display:block; }
441
- .pd-head { display:flex; align-items:center; gap:8px; }
442
- .pd-head h3 { margin:0; font-size:15px; }
443
- .status-chip { display:inline-flex; align-items:center; height:22px; padding:0 12px; border-radius:99px;
444
- font-size:11px; color:var(--good); background:var(--good-soft); }
445
- .status-chip.off { color:var(--muted); background:var(--surface2); }
446
- .pd-head .sp { flex:1; }
447
- .pd-head .del { display:inline-flex; align-items:center; justify-content:center; width:26px; height:26px;
448
- border:0; border-radius:6px; color:var(--muted); background:transparent; }
449
- .pd-head .del:hover { color:var(--bad); background:var(--bad-soft); }
450
- .f { display:grid; gap:8px; margin-top:16px; }
451
- .f > label { color:var(--text); font-size:12.5px; }
452
- .field-note { color:var(--muted); font-size:11px; }
453
- .fin { width:100%; height:36px; padding:0 12px; border:1px solid var(--line2); border-radius:9px;
454
- color:var(--text); background:var(--page); font-size:13px; outline:none;
455
- transition:border-color .12s ease, box-shadow .12s ease; }
456
- .fin:focus { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
457
- .fin::placeholder { color:var(--faint); }
458
- .key-row { position:relative; }
459
- .key-row .fin { padding-right:42px; }
460
- .eye { position:absolute; right:4px; top:50%; transform:translateY(-50%); display:inline-flex;
461
- align-items:center; justify-content:center; width:26px; height:26px; border:0; border-radius:6px;
462
- color:var(--muted); background:transparent; }
463
- .eye:hover { color:var(--text); background:var(--surface2); }
464
- .pd-foot { display:flex; align-items:center; gap:8px; margin-top:24px; }
465
- .pd-foot .note { flex:1; display:flex; align-items:center; gap:8px; color:var(--muted); font-size:12.5px; }
466
- .cta { height:30px; padding:0 16px; border:0; border-radius:9px; color:#161616;
467
- background:var(--accent); font-weight:650; font-size:12.5px; }
468
- .cta:hover { filter:brightness(1.08); }
469
- body.light .cta { color:#fff; }
470
- .cta[disabled] { opacity:.45; cursor:not-allowed; filter:none; }
471
- .agent-card { display:flex; align-items:flex-start; gap:12px; margin-bottom:12px; padding:16px;
472
- border-radius:13px; background:var(--surface); border:1px solid var(--line); }
473
- .agent-card.missing { opacity:.55; }
474
- .agent-card .agent-badge { width:22px; height:22px; font-size:11px; }
475
- .agent-card .a-body { flex:1; min-width:0; }
476
- .agent-card .a-name { display:flex; align-items:center; gap:8px; font-weight:650; font-size:13px; }
477
- .agent-card .a-meta { margin-top:4px; color:var(--muted); font-size:11px; }
478
- .cap-chips { display:flex; flex-wrap:wrap; gap:4px; margin-top:8px; }
479
- .chip { display:inline-flex; align-items:center; padding:1px 8px; border-radius:99px;
480
- background:var(--surface2); color:var(--muted); font-size:11px; }
481
- .chip.good { color:var(--good); background:var(--good-soft); }
482
- .cap-chips .chip.off { color:var(--faint); opacity:.6; }
483
- .auth-note { margin:16px 0 0; padding:2px 0 2px 16px; border-left:2px solid var(--line2);
484
- color:var(--muted); font-size:12.5px; }
485
-
486
- /* ===== 弹窗 / 提示 ===== */
487
- .modal { position:fixed; inset:0; z-index:70; display:none; align-items:center; justify-content:center;
488
- background:rgba(0,0,0,.55); }
489
- .modal.open { display:flex; animation:fade-in .12s ease; }
490
- body.light .modal { background:rgba(20,20,20,.35); }
491
- .modal-box { width:min(470px,92vw); border-radius:13px; background:var(--pop);
492
- border:1px solid var(--line2); padding:24px; box-shadow:var(--shadow-2); }
493
- .modal.open .modal-box { animation:modal-in .14s cubic-bezier(.2,.9,.3,1); }
494
- .modal-box h3 { margin:0 0 4px; font-size:15px; }
495
- .modal-box .sub { margin:0 0 16px; color:var(--muted); font-size:12.5px; }
496
- .modal-actions { display:flex; justify-content:flex-end; gap:8px; margin-top:24px; }
497
- .form-error { margin-top:12px; padding:8px 12px; border-radius:9px; color:var(--bad);
498
- background:var(--bad-soft); font-size:12.5px; border:1px solid rgba(240,128,128,.2); }
499
- body.light .form-error { border-color:rgba(189,78,78,.2); }
500
- /* 添加项目弹窗:路径输入 + 系统浏览按钮同行 */
501
- .path-row { display:flex; gap:8px; align-items:stretch; }
502
- .path-row .fin { flex:1; min-width:0; width:auto; }
503
- .path-row .browse { flex:0 0 auto; display:inline-flex; align-items:center; height:36px; padding:0 12px;
504
- border:1px solid var(--line2); border-radius:9px; }
505
- .path-row .browse:hover { background:var(--surface); border-color:var(--faint); }
506
- .path-row .browse:disabled { opacity:.45; cursor:not-allowed; }
507
-
508
- /* Toast:类型化配色 + 图标,底部居中堆叠,进入/退出动画。 */
509
- .toast-host { position:fixed; bottom:24px; left:0; right:0; z-index:90; display:flex;
510
- flex-direction:column; align-items:center; gap:8px; pointer-events:none; }
511
- .toast { pointer-events:auto; display:flex; align-items:center; gap:8px; max-width:min(480px,90vw);
512
- padding:8px 16px; border-radius:9px; border:1px solid var(--line2); background:var(--pop);
513
- color:var(--text); font-size:12.5px; box-shadow:var(--shadow-2); animation:toast-in .16s ease; }
514
- .toast .ic { color:var(--muted); }
515
- .toast.good .ic { color:var(--good); }
516
- .toast.bad .ic { color:var(--bad); }
517
- .toast.leaving { animation:toast-out .15s ease forwards; }
518
-
519
- .pop-search { width:100%; height:30px; padding:0 8px; margin-bottom:4px; border:1px solid var(--line2);
520
- border-radius:6px; color:var(--text); background:var(--page); font-size:12.5px; outline:none;
521
- transition:border-color .12s ease, box-shadow .12s ease; }
522
- .pop-search:focus { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
523
-
524
- /* Themed scrollbars: slim rounded thumb, no track chrome or arrow buttons. */
525
- * { scrollbar-width: thin; scrollbar-color: #3f3f3f transparent; }
526
- ::-webkit-scrollbar { width: 10px; height: 10px; }
527
- ::-webkit-scrollbar-track { background: transparent; }
528
- ::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
529
- ::-webkit-scrollbar-thumb { background: #3f3f3f; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
530
- ::-webkit-scrollbar-thumb:hover { background: #525252; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
531
- ::-webkit-scrollbar-corner { background: transparent; }
532
- body.light * { scrollbar-color: #c4c4c4 transparent; }
533
- body.light ::-webkit-scrollbar-thumb { background: #c4c4c4; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
534
- body.light ::-webkit-scrollbar-thumb:hover { background: #adadad; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
535
- .f[hidden] { display:none; }
536
-
537
- /* ===================== icon system & runtime polish ===================== */
538
- .ic { display:inline-flex; flex:0 0 auto; vertical-align:-2px; color:inherit; }
539
- .ic svg, svg.ics { width:100%; height:100%; fill:none; stroke:currentColor; stroke-width:1.8;
540
- stroke-linecap:round; stroke-linejoin:round; }
541
- svg.ics { width:13px; height:13px; flex:0 0 auto; }
542
- #open-settings, #btn-rescan { display:inline-flex; align-items:center; }
543
-
544
- /* Thinking hint: shown while the driver streams nothing yet (reasoning phase). */
545
- .think-hint { display:flex; align-items:center; gap:8px; margin:12px 2px; color:var(--muted); font-size:12.5px; }
546
-
547
- /* Unified error row replaces the bare ⚠ paragraph. */
548
- .msg.ai.error { display:flex; gap:8px; align-items:flex-start; margin:16px 0; padding:8px 12px;
549
- border:1px solid rgba(255,96,96,.3); background:var(--bad-soft); border-radius:9px;
550
- color:#ff9c9c; font-size:13px; line-height:1.5; }
551
- .msg.ai.error .ic { margin-top:2px; }
552
- body.light .msg.ai.error { color:#b42318; border-color:rgba(180,35,24,.25); background:rgba(180,35,24,.05); }
553
-
554
- /* Gentle reveal when a fold opens; hover feedback on rows. */
555
- .proc[open] > .proc-steps, .step[open] > .step-body { animation:fade-in .18s ease; }
556
- @keyframes fade-in { from { opacity:0; transform:translateY(-3px); } }
557
- @keyframes pop-in { from { opacity:0; transform:translateY(4px); } }
558
- @keyframes modal-in { from { opacity:0; transform:translateY(6px) scale(.985); } }
559
- @keyframes toast-in { from { opacity:0; transform:translateY(8px); } }
560
- @keyframes toast-out { to { opacity:0; transform:translateY(6px); } }
561
-
562
- @media (prefers-reduced-motion: reduce) {
563
- *, *::before, *::after { animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; }
1
+ /* Agent Terminal — desktop-flat theme.
2
+ Design scale: spacing 4/8/12/16/24 · type 11/12.5/13/15/18 · radius 6/9/13 (+pills)
3
+ control heights 26/30/36 (22px micro icon buttons) · two shadow levels:
4
+ --shadow-1 hover/floating, --shadow-2 popovers & modals. */
5
+
6
+ /* ===== tokens ===== */
7
+ :root {
8
+ --page:#0d0d0d; --side:#0d0d0d; --surface:#1a1a1a; --surface2:#242424;
9
+ --line:#242424; --line2:#303030; --pop:#1f1f1f;
10
+ --text:#ececec; --muted:#909090; --faint:#5f5f5f;
11
+ --good:#4cc38a; --warn:#e2b466; --bad:#f08080; --accent:#e8863c; --blue:#4f8ef7;
12
+ --good-soft:rgba(76,195,138,.12); --bad-soft:rgba(240,128,128,.1);
13
+ --blue-soft:rgba(79,142,247,.14); --accent-soft:rgba(232,134,60,.14);
14
+ --focus:rgba(79,142,247,.55); --focus-line:rgba(79,142,247,.45);
15
+ --code-bg:#141417; --code-line:#26262b;
16
+ --shadow-1:0 2px 10px rgba(0,0,0,.3);
17
+ --shadow-2:0 12px 32px rgba(0,0,0,.55);
18
+ }
19
+ body.light {
20
+ --page:#f7f7f7; --side:#f7f7f7; --surface:#ececec; --surface2:#e2e2e2;
21
+ --line:#dcdcdc; --line2:#c9c9c9; --pop:#ffffff;
22
+ --text:#1c1c1c; --muted:#666666; --faint:#9a9a9a;
23
+ --good:#258263; --warn:#9d6e21; --bad:#bd4e4e; --accent:#c26a1e; --blue:#2f6fd0;
24
+ --good-soft:rgba(37,130,99,.12); --bad-soft:rgba(189,78,78,.1);
25
+ --blue-soft:rgba(47,111,208,.12); --accent-soft:rgba(194,106,30,.12);
26
+ --focus:rgba(47,111,208,.5); --focus-line:rgba(47,111,208,.45);
27
+ --code-bg:#f2f3f5; --code-line:#dfe1e6;
28
+ --shadow-1:0 2px 10px rgba(30,30,30,.1);
29
+ --shadow-2:0 12px 32px rgba(30,30,30,.18);
30
+ }
31
+
32
+ /* ===== base ===== */
33
+ * { box-sizing:border-box; }
34
+ [hidden] { display:none !important; }
35
+ body { margin:0; overflow:hidden; background:var(--page); color:var(--text);
36
+ font:13px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif; }
37
+ button, input, textarea, select { font:inherit; }
38
+ button { cursor:pointer; color:inherit; }
39
+ :focus-visible { outline:2px solid var(--focus); outline-offset:1px; }
40
+ .fin:focus-visible, .pop-search:focus-visible, .composer textarea:focus-visible { outline:none; }
41
+ .view { display:none; height:100vh; }
42
+ .view.active { display:flex; }
43
+ .linklike { border:0; color:var(--blue); background:transparent; padding:0; font-size:inherit; }
44
+ .linklike:hover { text-decoration:underline; }
45
+
46
+ /* Shared micro-interaction: every flat interactive surface eases its state change. */
47
+ .session, .proj-item, .add-proj, .stab, .mgmt-item, .pop-item, .bar-btn, .ghost, .new-session,
48
+ .act-btn, .foot-btn, .io-copy, .bubble-copy, .cb-copy, .attachment-remove, .del,
49
+ .path-row .browse, .cta, .btn-allow, .btn-deny, .jump-latest, .send, .toggle-caret {
50
+ transition:background-color .12s ease, color .12s ease, border-color .12s ease, filter .12s ease, transform .06s ease;
51
+ }
52
+
53
+ /* ===== generic buttons ===== */
54
+ .ghost { display:inline-flex; align-items:center; gap:8px; height:26px; padding:0 12px;
55
+ border:0; color:var(--muted); background:transparent; font-size:12.5px; border-radius:6px; }
56
+ .ghost:hover { color:var(--text); background:var(--surface); }
57
+
58
+ /* ===== 侧栏 ===== */
59
+ .sidebar { display:flex; flex-direction:column; width:264px; flex:0 0 auto;
60
+ background:var(--side); border-right:1px solid var(--line); }
61
+ .brand { display:flex; align-items:center; justify-content:space-between; padding:16px 16px 12px; }
62
+ .brand h1 { display:flex; align-items:center; gap:8px; margin:0; font-size:15px; font-weight:700; }
63
+ .brand h1 svg.ics { width:15px; height:15px; color:var(--accent); }
64
+ .brand .ver { color:var(--faint); font-size:11px; }
65
+ .new-session { display:flex; align-items:center; gap:8px; height:30px; margin:4px 12px 8px;
66
+ padding:0 12px; border:1px solid var(--line2); border-radius:9px; color:var(--muted);
67
+ background:var(--surface); text-align:left; font-size:12.5px; }
68
+ .new-session:hover { color:var(--text); background:var(--surface2); border-color:var(--line2); }
69
+ .session-scroll { flex:1; overflow-y:auto; padding:4px 12px 12px; }
70
+ .group-label { margin:16px 4px 4px; color:var(--faint); font-size:11px; letter-spacing:.12em; text-transform:uppercase; }
71
+
72
+ /* 项目行:折叠箭头 + 名称 + 悬浮操作。激活项目以左侧主色条标记。 */
73
+ .proj-item { display:flex; align-items:center; gap:8px; width:100%; height:26px; padding:0 8px;
74
+ border:0; border-radius:6px; color:var(--text); background:transparent;
75
+ font-size:12.5px; font-weight:600; text-align:left; }
76
+ .proj-item:hover { background:var(--surface); }
77
+ .proj.active > .proj-item { background:var(--surface); box-shadow:inset 2px 0 0 var(--accent); }
78
+ .p-caret { display:inline-flex; align-items:center; justify-content:center; width:12px; height:12px;
79
+ flex:0 0 auto; color:var(--faint); transition:transform .15s ease; }
80
+ .p-caret.closed { transform:rotate(-90deg); }
81
+ .proj-item .p-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
82
+ .toggle-caret { display:inline-flex; align-items:center; justify-content:center; width:12px; height:12px;
83
+ flex:0 0 auto; color:inherit; transition:transform .15s ease; }
84
+ .toggle-caret.closed { transform:rotate(-90deg); }
85
+ .sess-list { padding:0 0 4px; }
86
+ .sess-list .session { padding-left:24px; }
87
+ .session { display:flex; align-items:center; gap:8px; width:100%; height:26px; padding:0 8px;
88
+ border:0; border-radius:6px; background:transparent; color:var(--muted); text-align:left; font-size:12.5px; }
89
+ .session:hover { background:var(--surface); color:var(--text); }
90
+ .session.active { background:var(--surface2); color:var(--text); box-shadow:inset 2px 0 0 var(--accent); }
91
+ .session .s-title { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
92
+ .session .when { margin-left:auto; color:var(--faint); font-size:11px; flex:0 0 auto; }
93
+ .session:hover > .when { display:none; }
94
+ .agent-badge { display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto;
95
+ width:18px; height:18px; border-radius:6px; color:#fff; font-size:11px; font-weight:700; }
96
+ .agent-badge.claude-code { background:#c9642d; }
97
+ .agent-badge.codex { background:#2e7d5b; }
98
+ .agent-badge.zcode { background:#6d5bd0; }
99
+ .agent-badge.opencode { background:#33739e; }
100
+ .add-proj { display:flex; align-items:center; gap:8px; width:100%; height:26px; margin:4px 0 0;
101
+ padding:0 8px; border:0; border-radius:6px; color:var(--muted); background:transparent;
102
+ font-size:12.5px; text-align:left; }
103
+ .add-proj:hover { color:var(--text); background:var(--surface); }
104
+ .proj-empty { padding:4px 8px 8px 24px; color:var(--faint); font-size:11px; }
105
+
106
+ /* 侧栏空态:SVG 图标组合的插画式提示,不依赖外部资源。 */
107
+ .side-empty { display:grid; justify-items:center; gap:4px; margin:8px 4px 12px; padding:16px 12px;
108
+ border:1px dashed var(--line2); border-radius:9px; color:var(--faint); font-size:12.5px; text-align:center; }
109
+ .side-empty-art { display:flex; align-items:center; justify-content:center; width:40px; height:40px;
110
+ border-radius:9px; background:var(--surface); color:var(--faint); }
111
+ .side-empty-sub { font-size:11px; }
112
+
113
+ .row-acts { display:none; align-items:center; gap:2px; margin-left:auto; flex:0 0 auto; }
114
+ .session:hover > .row-acts, .proj-item:hover > .row-acts { display:inline-flex; }
115
+ .act-btn { display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px;
116
+ padding:0; border:0; color:var(--muted); background:transparent; border-radius:6px; user-select:none; }
117
+ .act-btn:hover { color:var(--text); background:var(--surface2); }
118
+ .act-btn.danger:hover { color:var(--bad); background:var(--bad-soft); }
119
+
120
+ /* 归档区:分隔线 + 可折叠标题 + 计数徽标。 */
121
+ .arch-toggle { display:flex; align-items:center; gap:4px; width:calc(100% - 8px); margin:16px 0 4px;
122
+ padding:8px 4px 4px; border:0; border-top:1px solid var(--line); background:transparent;
123
+ color:var(--faint); font-size:11px; letter-spacing:.12em; text-transform:uppercase; text-align:left; }
124
+ .arch-toggle:hover { color:var(--muted); }
125
+ .arch-count { margin-left:4px; padding:0 4px; border-radius:99px; background:var(--surface);
126
+ color:var(--faint); font-size:11px; letter-spacing:0; }
127
+ .arch-list .session .s-title { color:var(--muted); }
128
+ .arch-list .agent-badge { opacity:.75; }
129
+ .sidebar-foot { display:flex; align-items:center; gap:8px; padding:12px 16px;
130
+ border-top:1px solid var(--line); color:var(--faint); font-size:11px; }
131
+ .sidebar-foot .ghost { padding:0 4px; }
132
+ .dot { display:inline-block; width:7px; height:7px; flex:0 0 auto; border-radius:99px; background:var(--good); }
133
+ .dot.run { animation:pulse 1.4s infinite; }
134
+ @keyframes pulse { 50% { opacity:.4; } }
135
+
136
+ /* ===== 主区 ===== */
137
+ .main { display:flex; flex-direction:column; flex:1; min-width:0; position:relative; }
138
+ .top-strip { display:flex; flex-wrap:wrap; align-items:center; gap:8px; padding:12px 24px 8px; }
139
+ .top-strip .t { font-weight:600; font-size:13px; }
140
+ .session-provider { color:var(--faint); font-size:11px; overflow:hidden; text-overflow:ellipsis;
141
+ white-space:nowrap; min-width:0; }
142
+ .top-strip .st { display:inline-flex; align-items:center; gap:8px; margin-left:auto; padding:4px 12px;
143
+ border-radius:99px; color:#9db8ff; background:var(--blue-soft); font-size:12.5px; }
144
+ body.light .top-strip .st { color:#2f5fd0; }
145
+
146
+ /* ===== 消息流(ZCode 风格:过程折叠,正文直出)===== */
147
+ .stream { flex:1; overflow-y:auto; padding:8px 24px 24px; }
148
+ .col { max-width:860px; margin:0 auto; }
149
+ .empty-hint { text-align:center; color:var(--muted); margin-top:18vh; font-size:13px; line-height:1.7; }
150
+ .empty-hint .big { display:flex; align-items:center; justify-content:center; margin-bottom:12px; }
151
+ .hint-wrap { position:relative; display:inline-flex; }
152
+ .hint-art { display:flex; align-items:center; justify-content:center; width:56px; height:56px;
153
+ border-radius:13px; border:1px solid var(--line); background:var(--surface); color:var(--muted); }
154
+ .hint-art svg { width:24px; height:24px; }
155
+ .hint-art svg, .hint-spark svg { fill:none; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
156
+ .hint-spark { position:absolute; top:-6px; right:-8px; display:flex; align-items:center; justify-content:center;
157
+ width:20px; height:20px; border-radius:99px; background:var(--surface2); color:var(--accent); box-shadow:var(--shadow-1); }
158
+ .hint-spark svg { width:11px; height:11px; }
159
+ .empty-hint p { margin:4px 0 0; }
160
+
161
+ /* 用户消息:轻量右置色块(尾部小圆角);AI 消息:全宽白板。 */
162
+ .msg.user { display:grid; justify-items:end; margin:24px 0 12px; }
163
+ .bubble { max-width:82%; padding:8px 12px; border:1px solid var(--line); border-radius:13px 13px 4px 13px;
164
+ background:var(--surface2); color:var(--text); font-size:13px; line-height:1.65;
165
+ white-space:pre-wrap; overflow-wrap:anywhere; }
166
+ body.light .bubble { background:var(--surface); }
167
+ .msg.ai { margin:12px 0 16px; }
168
+ .msg.ai p { margin:0 0 12px; white-space:pre-wrap; overflow-wrap:anywhere; line-height:1.7; }
169
+ .msg.ai .dim { color:var(--muted); }
170
+
171
+ /* 回合折叠区:头部即计时行(工作中 X 秒 → 已工作 X 秒) */
172
+ .proc { margin:4px 0 12px; user-select:none; }
173
+ .proc > summary { display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
174
+ color:var(--muted); font-size:12.5px; padding:4px 8px; margin-left:-8px; border-radius:6px; }
175
+ .proc > summary:hover { color:var(--text); background:var(--surface); }
176
+ .proc > summary::-webkit-details-marker { display:none; }
177
+ .proc .caret { display:inline-flex; color:var(--faint); transition:transform .15s ease; }
178
+ .proc[open] > summary .caret { transform:rotate(90deg); }
179
+ .proc .p-meta { color:var(--faint); }
180
+ .proc-steps { display:grid; gap:2px; margin:2px 0 8px 16px; padding-left:12px; border-left:1px solid var(--line); }
181
+ .turn-note { display:flex; align-items:center; gap:8px; margin:4px 0 16px; color:var(--faint); font-size:12.5px; }
182
+
183
+ /* 过程行:思考分段 / 工具步骤 / 备注行 */
184
+ .think-seg { margin:4px 0 8px; }
185
+ .think-label { display:flex; align-items:center; gap:8px; color:var(--muted); font-size:12.5px; padding:2px 0; }
186
+ .t-glyph { color:var(--faint); }
187
+ .t-meta { color:var(--faint); font-size:12.5px; }
188
+ .think-body { color:var(--faint); font-size:12.5px; line-height:1.65; white-space:pre-wrap;
189
+ overflow-wrap:anywhere; margin:2px 0 4px 16px; max-height:280px; overflow-y:auto; }
190
+ .step { color:var(--muted); font-size:12.5px; }
191
+ .step > summary { display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
192
+ flex-wrap:wrap; padding:4px 0; min-width:0; }
193
+ .step > summary::-webkit-details-marker { display:none; }
194
+ .s-caret { display:inline-flex; color:var(--faint); flex:0 0 auto; transition:transform .15s ease; }
195
+ .step[open] > summary .s-caret { transform:rotate(90deg); }
196
+ .s-dot { width:8px; height:8px; flex:0 0 auto; border-radius:99px; background:var(--blue); }
197
+ .step.failed .s-dot { background:var(--bad); }
198
+ .step.note .s-dot { background:var(--faint); }
199
+ .s-name { font-weight:600; color:var(--text); font-size:12.5px; }
200
+ .s-desc { color:var(--faint); font-size:12.5px; overflow:hidden; text-overflow:ellipsis;
201
+ white-space:nowrap; min-width:0; max-width:60%; }
202
+ .s-meta { color:var(--faint); font-size:12.5px; margin-left:auto; flex:0 0 auto; }
203
+ .s-meta.failed { color:var(--bad); }
204
+ .step-body { display:grid; gap:8px; margin:2px 0 12px 16px; }
205
+ .step-line { display:flex; align-items:center; gap:8px; color:var(--faint); font-size:12.5px; padding:2px 0; }
206
+ .step-line .s-dot { width:6px; height:6px; background:var(--warn); }
207
+
208
+ /* 输入/输出卡片:语言标签 + 复制按钮 + 语法高亮 */
209
+ .io-card { border:1px solid var(--line); border-radius:9px; background:var(--surface); overflow:hidden; }
210
+ .io-head { display:flex; align-items:center; justify-content:space-between; padding:4px 4px 0 12px; }
211
+ .io-tag { display:inline-flex; align-items:center; gap:4px; color:var(--faint); font-size:11px;
212
+ letter-spacing:.05em; text-transform:uppercase; }
213
+ .io-brace { font:11px Consolas,monospace; color:var(--muted); }
214
+ .io-copy { display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px;
215
+ border:0; color:var(--faint); background:transparent; border-radius:6px; }
216
+ .io-copy:hover { color:var(--text); background:var(--surface2); }
217
+ .io-card pre { margin:0; padding:4px 12px 8px; color:var(--muted);
218
+ font:12.5px/1.6 Consolas,"Microsoft YaHei",monospace; white-space:pre-wrap;
219
+ overflow-wrap:anywhere; max-height:320px; overflow-y:auto; }
220
+ .j-key { color:#7aa2f7; }
221
+ .j-str { color:#9ece6a; }
222
+ .j-num { color:#e0af68; }
223
+ .j-bool { color:#bb9af7; }
224
+ body.light .j-key { color:#2f5fd0; }
225
+ body.light .j-str { color:#3a7d3a; }
226
+ body.light .j-num { color:#9d6e21; }
227
+ body.light .j-bool { color:#7a4fb3; }
228
+ .file-changes { display:grid; gap:4px; font-size:12.5px; }
229
+ .file-change { display:flex; gap:8px; align-items:baseline; min-width:0; }
230
+ .file-path { min-width:0; overflow-wrap:anywhere; }
231
+ .diff-add { color:var(--good); }
232
+ .diff-remove { color:var(--bad); }
233
+
234
+ /* 用户气泡复制按钮 */
235
+ .bubble-copy { display:inline-flex; align-items:center; justify-content:center; height:22px;
236
+ min-width:26px; margin:4px 2px 0 auto; border:0; color:var(--faint); background:transparent;
237
+ border-radius:6px; }
238
+ .bubble-copy:hover { color:var(--text); background:var(--surface2); }
239
+ .copied .ic { color:var(--good); }
240
+
241
+ /* 最终消息操作条:复制 / 重试 / 模型 · 时间 */
242
+ .msg-foot { display:flex; align-items:center; gap:2px; margin:4px 0 16px; }
243
+ .foot-btn { display:inline-flex; align-items:center; justify-content:center; width:26px; height:24px;
244
+ border:0; color:var(--faint); background:transparent; border-radius:6px; }
245
+ .foot-btn:hover { color:var(--text); background:var(--surface2); }
246
+ .foot-time { color:var(--faint); font-size:11px; margin-left:8px; }
247
+
248
+ /* 回合文件变更汇总 */
249
+ .turn-diffs { margin:4px 0 16px; }
250
+ .turn-diffs-head { display:flex; align-items:center; gap:8px; padding:2px 0 4px; }
251
+ .td-label { color:var(--muted); font-size:12.5px; font-weight:600; }
252
+ .td-count { display:inline-flex; align-items:center; gap:8px; font:11px Consolas,monospace; }
253
+ .td-approx { font-style:normal; color:var(--faint); font-size:11px; }
254
+ .turn-diffs-list { padding:0 0 0 12px; display:grid; gap:2px; }
255
+ .td-row { display:flex; gap:8px; align-items:baseline; justify-content:space-between;
256
+ font-size:12.5px; color:var(--faint); }
257
+ .td-rowcount { font:11px Consolas,monospace; color:var(--faint); flex:0 0 auto; }
258
+ .td-more { color:var(--faint); }
259
+
260
+ /* 工具行参数徽章与运行态 shimmer */
261
+ .s-args { display:inline-flex; gap:4px; }
262
+ .s-args i { font-style:normal; font:11px Consolas,"Microsoft YaHei",monospace; color:var(--faint);
263
+ background:var(--surface2); padding:1px 4px; border-radius:99px; }
264
+ .s-meta.running { background:linear-gradient(90deg, var(--faint) 25%, var(--text) 50%, var(--faint) 75%);
265
+ background-size:200% 100%; -webkit-background-clip:text; background-clip:text; color:transparent;
266
+ animation:shimmer 1.6s linear infinite; }
267
+ @keyframes shimmer { to { background-position:-200% 0; } }
268
+
269
+ /* 回到底部悬浮按钮 */
270
+ .jump-latest { position:absolute; right:24px; bottom:136px; z-index:5; display:inline-flex;
271
+ align-items:center; gap:4px; height:26px; padding:0 12px; border:1px solid var(--line2);
272
+ border-radius:99px; background:var(--pop); color:var(--muted); font-size:12.5px;
273
+ box-shadow:var(--shadow-2); }
274
+ .jump-latest:hover { color:var(--text); background:var(--surface); }
275
+
276
+ /* 助手正文 markdown */
277
+ .md-body { font-size:15px; line-height:1.7; color:#d8d8d8; overflow-wrap:anywhere; }
278
+ body.light .md-body { color:var(--text); }
279
+ .md-body.streaming::after { content:"▍"; animation:pulse 1s infinite; color:var(--text); }
280
+ .md-body p { margin:0 0 12px; white-space:pre-wrap; }
281
+ .md-body p:last-child { margin-bottom:0; }
282
+ .md-body h3, .md-body h4, .md-body h5, .md-body h6 { margin:16px 0 8px; font-size:15px; font-weight:650; }
283
+ .md-body h3 { font-size:18px; }
284
+ .md-body h5, .md-body h6 { font-weight:600; color:var(--muted); }
285
+ .md-body ul, .md-body ol { margin:0 0 12px; padding-left:24px; }
286
+ .md-body li { margin:4px 0; }
287
+ .md-body blockquote { margin:0 0 12px; padding:4px 12px; border-left:2px solid var(--line2); color:var(--muted); }
288
+ .md-body hr { border:0; border-top:1px solid var(--line); margin:16px 0; }
289
+ .md-body strong { color:var(--text); font-weight:650; }
290
+ .md-body code { padding:1px 4px; border-radius:6px; background:rgba(255,255,255,.07);
291
+ font:12.5px/1.5 Consolas,"Microsoft YaHei",monospace; }
292
+ body.light .md-body code { background:rgba(0,0,0,.06); }
293
+ .md-body a { color:var(--blue); }
294
+ .codeblock { margin:0 0 12px; border:1px solid var(--code-line); border-radius:9px;
295
+ background:var(--code-bg); overflow:hidden; }
296
+ .cb-head { display:flex; align-items:center; justify-content:space-between; padding:4px 4px 4px 12px;
297
+ border-bottom:1px solid var(--code-line); }
298
+ .cb-lang { color:var(--faint); font-size:11px; letter-spacing:.05em; text-transform:uppercase; }
299
+ .cb-copy { display:inline-flex; align-items:center; height:22px; padding:0 4px; border:0;
300
+ color:var(--muted); background:transparent; font-size:11px; border-radius:6px; }
301
+ .cb-copy:hover { color:var(--text); background:var(--surface2); }
302
+ .codeblock pre { margin:0; padding:8px 12px; overflow-x:auto; }
303
+ .codeblock code { font:12.5px/1.65 Consolas,"Microsoft YaHei",monospace; background:transparent;
304
+ padding:0; color:#cfd8ea; }
305
+ body.light .codeblock code { color:#24304a; }
306
+
307
+ /* 权限确认卡 */
308
+ .perm { display:flex; align-items:center; gap:12px; margin:16px 0; padding:12px 16px;
309
+ border:1px solid var(--line); border-radius:13px; background:var(--surface); }
310
+ .perm.settled { display:inline-flex; margin:4px 0; padding:0; background:transparent; border:0; }
311
+ .perm.settled .p-title { font-weight:400; color:var(--faint); font-size:12.5px; }
312
+ .perm.settled .p-sub, .perm.settled .p-icon { display:none; }
313
+ .perm.settled .p-state { font-size:12.5px; }
314
+ .perm .p-icon { flex:0 0 auto; color:var(--warn); display:inline-flex; }
315
+ .perm .p-body { flex:1; min-width:0; }
316
+ .perm .p-title { font-size:13px; font-weight:600; }
317
+ .perm .p-sub { margin-top:2px; color:var(--muted); font-size:11px; font-family:Consolas,monospace; overflow-wrap:anywhere; }
318
+ .perm .p-actions { display:flex; gap:8px; }
319
+ .perm .btn-allow { height:30px; padding:0 16px; border:0; border-radius:9px; color:#161616;
320
+ background:var(--accent); font-weight:650; font-size:12.5px; }
321
+ .perm .btn-allow:hover { filter:brightness(1.08); }
322
+ body.light .perm .btn-allow { color:#fff; }
323
+ .perm .btn-deny { height:30px; padding:0 12px; border:0; border-radius:9px; color:var(--muted);
324
+ background:transparent; font-size:12.5px; }
325
+ .perm .btn-deny:hover { color:var(--bad); }
326
+ .perm .p-state { color:var(--muted); font-size:12.5px; }
327
+ .perm .p-state.no { color:var(--bad); }
328
+
329
+ /* 附件托盘:缩略图统一 48px,移除按钮悬浮于角标 */
330
+ .attach-tray { display:flex; flex-wrap:wrap; gap:8px; justify-content:flex-end; margin:-8px 0 12px; }
331
+ .attach-tray img { width:48px; height:48px; object-fit:cover; display:block;
332
+ border-radius:9px; border:1px solid var(--line); }
333
+ .attachment-item { position:relative; display:flex; align-items:center; gap:4px; max-width:100%; }
334
+ .attachment-file { display:inline-flex; align-items:center; gap:4px; max-width:100%; padding:4px 8px;
335
+ border:1px solid var(--line); border-radius:9px; background:var(--surface);
336
+ color:var(--muted); font-size:12.5px; overflow-wrap:anywhere; }
337
+ .attachment-remove { display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px;
338
+ border:0; border-radius:99px; background:transparent; color:var(--muted); }
339
+ .attachment-item.img .attachment-remove { position:absolute; top:-6px; right:-6px;
340
+ background:var(--surface2); box-shadow:var(--shadow-1); z-index:1; }
341
+ .attachment-remove:hover { color:var(--bad); background:var(--surface2); }
342
+ .composer .attach-tray { justify-content:flex-start; margin:0 0 8px; }
343
+
344
+ /* ===== 底部输入容器 ===== */
345
+ .composer-wrap { padding:8px 24px 16px; }
346
+ .composer { max-width:860px; margin:0 auto; border-radius:13px; background:var(--surface);
347
+ border:1px solid var(--line); padding:12px 12px 8px;
348
+ transition:border-color .15s ease, box-shadow .15s ease; }
349
+ .composer:focus-within { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
350
+ .composer textarea { width:100%; min-height:22px; max-height:150px; padding:2px 2px 8px; border:0;
351
+ color:var(--text); background:transparent; resize:none; outline:none; font:13px/1.6 inherit; }
352
+ .composer textarea::placeholder { color:var(--faint); }
353
+ .cmdrow { display:flex; align-items:center; gap:4px; }
354
+ .bar-btn { display:inline-flex; align-items:center; gap:4px; height:26px; padding:0 8px;
355
+ border:0; border-radius:6px; color:var(--muted); background:transparent;
356
+ font-size:12.5px; white-space:nowrap; }
357
+ .bar-btn:hover { background:var(--surface2); color:var(--text); }
358
+ .bar-btn .chev { display:inline-flex; color:var(--faint); }
359
+ #model-label { max-width:min(34vw,330px); overflow:hidden; text-overflow:ellipsis; }
360
+ .bar-btn.plus .ic { width:15px; height:15px; }
361
+ .bar-btn.mode { color:var(--text); }
362
+ .bar-btn.mode .shield { display:inline-flex; filter:grayscale(1); opacity:.85; }
363
+ .bar-btn.mode.accent { color:var(--accent); }
364
+ .bar-btn.mode.accent .shield { filter:none; opacity:1; }
365
+ .cmd-spacer { flex:1; }
366
+ .ring { display:inline-block; width:13px; height:13px; flex:0 0 auto; margin:0 8px 0 0;
367
+ border:2px solid var(--faint); border-top-color:var(--text); border-right-color:var(--text);
368
+ border-radius:50%; transform:rotate(-35deg); animation:spin 1s linear infinite; }
369
+ .ctx-mini { position:relative; width:54px; height:4px; margin:0 2px; border-radius:99px;
370
+ background:var(--surface2); overflow:hidden; }
371
+ .ctx-mini i { position:absolute; top:0; bottom:0; left:0; border-radius:99px;
372
+ background:linear-gradient(90deg, var(--good), var(--warn)); }
373
+ @keyframes spin { to { transform:rotate(325deg); } }
374
+ .send { display:inline-flex; align-items:center; justify-content:center; width:30px; height:30px;
375
+ border:0; border-radius:99px; background:var(--accent); }
376
+ .send:hover { filter:brightness(1.1); }
377
+ .send:active { transform:scale(.94); }
378
+ .send .up, .send .sq { color:#161616; }
379
+ .send .up { display:inline-flex; align-items:center; justify-content:center; }
380
+ .send .sq { width:10px; height:10px; border-radius:2px; background:#161616; }
381
+ body.light .send .up { color:#fff; }
382
+ body.light .send .sq { background:#fff; }
383
+
384
+ /* ===== 弹出层 ===== */
385
+ .anchor { position:relative; display:inline-flex; }
386
+ .pop { position:absolute; bottom:calc(100% + 8px); z-index:40; min-width:240px; padding:4px;
387
+ border-radius:13px; background:var(--pop); border:1px solid var(--line2);
388
+ box-shadow:var(--shadow-2); animation:pop-in .12s ease; }
389
+ .pop[hidden] { display:none; }
390
+ .pop.from-left { left:0; } .pop.from-right { right:0; }
391
+ .pop-group { display:flex; align-items:center; gap:8px; padding:8px 8px 4px; color:var(--muted); font-size:12.5px; }
392
+ .tag { display:inline-flex; align-items:center; padding:1px 8px; border-radius:6px;
393
+ background:var(--surface2); color:var(--muted); font-size:11px; }
394
+ .pop-item { display:flex; align-items:center; gap:8px; width:100%; padding:4px 8px; border:0;
395
+ border-radius:6px; color:var(--text); background:transparent; font-size:13px; text-align:left; }
396
+ .pop-item:hover:not(:disabled) { background:var(--surface2); }
397
+ .pop-item:disabled { opacity:.4; cursor:not-allowed; }
398
+ /* Whole menu scrolls as one — no nested inner scrollbar. */
399
+ #pop-model { max-height:min(560px,76vh); max-width:min(480px,90vw); overflow:auto; }
400
+ .pop-item .grow { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
401
+ .pop-item .check { display:inline-flex; color:var(--blue); visibility:hidden; }
402
+ .pop-item.selected .check { visibility:visible; }
403
+ .pop-item.selected .grow { font-weight:600; }
404
+ .pop-item.muted { color:var(--muted); }
405
+ .pop-sep { height:1px; margin:4px; background:var(--line); }
406
+ .ctx-pop { width:360px; padding:16px; }
407
+ .ctx-head { display:flex; justify-content:space-between; align-items:center; font-size:12.5px; }
408
+ .ctx-head .num { color:var(--muted); }
409
+ .bar { height:5px; margin:8px 0 12px; border-radius:99px; background:var(--surface2); overflow:hidden; }
410
+ .bar > i { display:block; height:100%; border-radius:99px; background:var(--blue); }
411
+ .ctx-row { display:flex; justify-content:space-between; padding:4px 0; color:var(--muted); font-size:12.5px; }
412
+ .ctx-sep { height:1px; margin:8px 0; background:var(--line); }
413
+
414
+ /* ===== 设置页 ===== */
415
+ .settings-wrap { display:flex; flex:1; min-width:0; }
416
+ .settings-nav { width:190px; flex:0 0 auto; padding:16px 8px; border-right:1px solid var(--line); }
417
+ .settings-nav strong { display:block; padding:0 12px 12px; font-size:13px; }
418
+ .settings-back { margin:0 0 12px; padding-left:0; }
419
+ .stab { width:100%; height:30px; margin:1px 0; padding:0 12px; border:0; border-radius:6px;
420
+ color:var(--muted); background:transparent; text-align:left; font-size:12.5px; }
421
+ .stab:hover { color:var(--text); background:var(--surface); }
422
+ .stab.active { color:var(--text); background:var(--surface2); box-shadow:inset 2px 0 0 var(--accent); }
423
+ .settings-body { flex:1; overflow-y:auto; padding:24px; }
424
+ .settings-body h2 { margin:0 0 4px; font-size:18px; }
425
+ .settings-body .sub { margin:0 0 24px; color:var(--muted); font-size:12.5px; }
426
+ .spanel { display:none; } .spanel.active { display:block; }
427
+ .prov-cols { display:grid; grid-template-columns:210px minmax(0,1fr); gap:12px; align-items:start; }
428
+ .mgmt-side { padding:8px; border-radius:13px; background:var(--surface); border:1px solid var(--line); }
429
+ .mgmt-group { padding:8px 8px 4px; color:var(--faint); font-size:11px; }
430
+ .mgmt-item { display:flex; align-items:center; gap:8px; width:100%; height:30px; padding:0 8px;
431
+ border:0; border-radius:6px; color:var(--text); background:transparent; font-size:13px; text-align:left; }
432
+ .mgmt-item:hover { background:var(--surface2); }
433
+ .mgmt-item.active { background:var(--surface2); }
434
+ .mgmt-item .grow { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
435
+ .mgmt-item .dot { width:6px; height:6px; }
436
+ .mgmt-item .dot.off { background:var(--faint); }
437
+ .mgmt-detail { min-height:380px; padding:24px; border-radius:13px; background:var(--surface);
438
+ border:1px solid var(--line); }
439
+ .empty-models { padding:24px 0; color:var(--faint); font-size:12.5px; text-align:center; }
440
+ .pd { display:none; } .pd.active { display:block; }
441
+ .pd-head { display:flex; align-items:center; gap:8px; }
442
+ .pd-head h3 { margin:0; font-size:15px; }
443
+ .status-chip { display:inline-flex; align-items:center; height:22px; padding:0 12px; border-radius:99px;
444
+ font-size:11px; color:var(--good); background:var(--good-soft); }
445
+ .status-chip.off { color:var(--muted); background:var(--surface2); }
446
+ .pd-head .sp { flex:1; }
447
+ .pd-head .del { display:inline-flex; align-items:center; justify-content:center; width:26px; height:26px;
448
+ border:0; border-radius:6px; color:var(--muted); background:transparent; }
449
+ .pd-head .del:hover { color:var(--bad); background:var(--bad-soft); }
450
+ .f { display:grid; gap:8px; margin-top:16px; }
451
+ .f > label { color:var(--text); font-size:12.5px; }
452
+ .field-note { color:var(--muted); font-size:11px; }
453
+ .fin { width:100%; height:36px; padding:0 12px; border:1px solid var(--line2); border-radius:9px;
454
+ color:var(--text); background:var(--page); font-size:13px; outline:none;
455
+ transition:border-color .12s ease, box-shadow .12s ease; }
456
+ .fin:focus { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
457
+ .fin::placeholder { color:var(--faint); }
458
+ .key-row { position:relative; }
459
+ .key-row .fin { padding-right:42px; }
460
+ .eye { position:absolute; right:4px; top:50%; transform:translateY(-50%); display:inline-flex;
461
+ align-items:center; justify-content:center; width:26px; height:26px; border:0; border-radius:6px;
462
+ color:var(--muted); background:transparent; }
463
+ .eye:hover { color:var(--text); background:var(--surface2); }
464
+ .pd-foot { display:flex; align-items:center; gap:8px; margin-top:24px; }
465
+ .pd-foot .note { flex:1; display:flex; align-items:center; gap:8px; color:var(--muted); font-size:12.5px; }
466
+ .cta { height:30px; padding:0 16px; border:0; border-radius:9px; color:#161616;
467
+ background:var(--accent); font-weight:650; font-size:12.5px; }
468
+ .cta:hover { filter:brightness(1.08); }
469
+ body.light .cta { color:#fff; }
470
+ .cta[disabled] { opacity:.45; cursor:not-allowed; filter:none; }
471
+ .agent-card { display:flex; align-items:flex-start; gap:12px; margin-bottom:12px; padding:16px;
472
+ border-radius:13px; background:var(--surface); border:1px solid var(--line); }
473
+ .agent-card.missing { opacity:.55; }
474
+ .agent-card .agent-badge { width:22px; height:22px; font-size:11px; }
475
+ .agent-card .a-body { flex:1; min-width:0; }
476
+ .agent-card .a-name { display:flex; align-items:center; gap:8px; font-weight:650; font-size:13px; }
477
+ .agent-card .a-meta { margin-top:4px; color:var(--muted); font-size:11px; }
478
+ .cap-chips { display:flex; flex-wrap:wrap; gap:4px; margin-top:8px; }
479
+ .chip { display:inline-flex; align-items:center; padding:1px 8px; border-radius:99px;
480
+ background:var(--surface2); color:var(--muted); font-size:11px; }
481
+ .chip.good { color:var(--good); background:var(--good-soft); }
482
+ .cap-chips .chip.off { color:var(--faint); opacity:.6; }
483
+ .auth-note { margin:16px 0 0; padding:2px 0 2px 16px; border-left:2px solid var(--line2);
484
+ color:var(--muted); font-size:12.5px; }
485
+
486
+ /* ===== 弹窗 / 提示 ===== */
487
+ .modal { position:fixed; inset:0; z-index:70; display:none; align-items:center; justify-content:center;
488
+ background:rgba(0,0,0,.55); }
489
+ .modal.open { display:flex; animation:fade-in .12s ease; }
490
+ body.light .modal { background:rgba(20,20,20,.35); }
491
+ .modal-box { width:min(470px,92vw); border-radius:13px; background:var(--pop);
492
+ border:1px solid var(--line2); padding:24px; box-shadow:var(--shadow-2); }
493
+ .modal.open .modal-box { animation:modal-in .14s cubic-bezier(.2,.9,.3,1); }
494
+ .modal-box h3 { margin:0 0 4px; font-size:15px; }
495
+ .modal-box .sub { margin:0 0 16px; color:var(--muted); font-size:12.5px; }
496
+ .modal-actions { display:flex; justify-content:flex-end; gap:8px; margin-top:24px; }
497
+ .form-error { margin-top:12px; padding:8px 12px; border-radius:9px; color:var(--bad);
498
+ background:var(--bad-soft); font-size:12.5px; border:1px solid rgba(240,128,128,.2); }
499
+ body.light .form-error { border-color:rgba(189,78,78,.2); }
500
+ /* 添加项目弹窗:路径输入 + 系统浏览按钮同行 */
501
+ .path-row { display:flex; gap:8px; align-items:stretch; }
502
+ .path-row .fin { flex:1; min-width:0; width:auto; }
503
+ .path-row .browse { flex:0 0 auto; display:inline-flex; align-items:center; height:36px; padding:0 12px;
504
+ border:1px solid var(--line2); border-radius:9px; }
505
+ .path-row .browse:hover { background:var(--surface); border-color:var(--faint); }
506
+ .path-row .browse:disabled { opacity:.45; cursor:not-allowed; }
507
+
508
+ /* Toast:类型化配色 + 图标,底部居中堆叠,进入/退出动画。 */
509
+ .toast-host { position:fixed; bottom:24px; left:0; right:0; z-index:90; display:flex;
510
+ flex-direction:column; align-items:center; gap:8px; pointer-events:none; }
511
+ .toast { pointer-events:auto; display:flex; align-items:center; gap:8px; max-width:min(480px,90vw);
512
+ padding:8px 16px; border-radius:9px; border:1px solid var(--line2); background:var(--pop);
513
+ color:var(--text); font-size:12.5px; box-shadow:var(--shadow-2); animation:toast-in .16s ease; }
514
+ .toast .ic { color:var(--muted); }
515
+ .toast.good .ic { color:var(--good); }
516
+ .toast.bad .ic { color:var(--bad); }
517
+ .toast.leaving { animation:toast-out .15s ease forwards; }
518
+
519
+ .pop-search { width:100%; height:30px; padding:0 8px; margin-bottom:4px; border:1px solid var(--line2);
520
+ border-radius:6px; color:var(--text); background:var(--page); font-size:12.5px; outline:none;
521
+ transition:border-color .12s ease, box-shadow .12s ease; }
522
+ .pop-search:focus { border-color:var(--focus-line); box-shadow:0 0 0 3px var(--blue-soft); }
523
+
524
+ /* Themed scrollbars: slim rounded thumb, no track chrome or arrow buttons. */
525
+ * { scrollbar-width: thin; scrollbar-color: #3f3f3f transparent; }
526
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
527
+ ::-webkit-scrollbar-track { background: transparent; }
528
+ ::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
529
+ ::-webkit-scrollbar-thumb { background: #3f3f3f; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
530
+ ::-webkit-scrollbar-thumb:hover { background: #525252; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
531
+ ::-webkit-scrollbar-corner { background: transparent; }
532
+ body.light * { scrollbar-color: #c4c4c4 transparent; }
533
+ body.light ::-webkit-scrollbar-thumb { background: #c4c4c4; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
534
+ body.light ::-webkit-scrollbar-thumb:hover { background: #adadad; border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
535
+ .f[hidden] { display:none; }
536
+
537
+ /* ===================== icon system & runtime polish ===================== */
538
+ .ic { display:inline-flex; flex:0 0 auto; vertical-align:-2px; color:inherit; }
539
+ .ic svg, svg.ics { width:100%; height:100%; fill:none; stroke:currentColor; stroke-width:1.8;
540
+ stroke-linecap:round; stroke-linejoin:round; }
541
+ svg.ics { width:13px; height:13px; flex:0 0 auto; }
542
+ #open-settings, #btn-rescan { display:inline-flex; align-items:center; }
543
+
544
+ /* Thinking hint: shown while the driver streams nothing yet (reasoning phase). */
545
+ .think-hint { display:flex; align-items:center; gap:8px; margin:12px 2px; color:var(--muted); font-size:12.5px; }
546
+
547
+ /* Unified error row replaces the bare ⚠ paragraph. */
548
+ .msg.ai.error { display:flex; gap:8px; align-items:flex-start; margin:16px 0; padding:8px 12px;
549
+ border:1px solid rgba(255,96,96,.3); background:var(--bad-soft); border-radius:9px;
550
+ color:#ff9c9c; font-size:13px; line-height:1.5; }
551
+ .msg.ai.error .ic { margin-top:2px; }
552
+ body.light .msg.ai.error { color:#b42318; border-color:rgba(180,35,24,.25); background:rgba(180,35,24,.05); }
553
+
554
+ /* Gentle reveal when a fold opens; hover feedback on rows. */
555
+ .proc[open] > .proc-steps, .step[open] > .step-body { animation:fade-in .18s ease; }
556
+ @keyframes fade-in { from { opacity:0; transform:translateY(-3px); } }
557
+ @keyframes pop-in { from { opacity:0; transform:translateY(4px); } }
558
+ @keyframes modal-in { from { opacity:0; transform:translateY(6px) scale(.985); } }
559
+ @keyframes toast-in { from { opacity:0; transform:translateY(8px); } }
560
+ @keyframes toast-out { to { opacity:0; transform:translateY(6px); } }
561
+
562
+ @media (prefers-reduced-motion: reduce) {
563
+ *, *::before, *::after { animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; }
564
564
  }
565
565
 
566
566
  /* ===== embed 模式(被知识库壳嵌入):折叠左侧项目栏,由壳 postMessage 控制 ===== */