@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.
- package/README.md +2 -2
- package/apps/agent-terminal/app.css +563 -563
- package/apps/agent-terminal/app.js +2348 -2348
- package/docs/sdk/openapi.yaml +1 -1
- package/package.json +1 -1
- package/packages/client/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/core/package.json +2 -2
- package/packages/server/bin/agent-terminal-server.js +31 -31
- package/packages/server/bin/claude-workbench-server.js +40 -40
- package/packages/server/lib/drivers/cli-json-runner.js +960 -960
- package/packages/server/lib/drivers/opencode-driver.js +1527 -1527
- package/packages/server/lib/folder-picker.js +623 -623
- package/packages/server/lib/http-handler.js +252 -252
- package/packages/server/package.json +2 -2
- package/packages/ui/package.json +2 -2
- package/src/backend/lib/automation-config.js +179 -179
- package/src/backend/lib/claude-cli-runner.js +1749 -1749
- package/src/backend/lib/llm-client.js +148 -148
|
@@ -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 控制 ===== */
|