ec-web 0.0.1 → 0.0.2

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.
@@ -0,0 +1,4138 @@
1
+ /* 亮色主题(默认) */
2
+ :root, [data-theme="light"] {
3
+ color-scheme: light;
4
+ --bg: #f5f7fa;
5
+ --bg2: #ffffff;
6
+ --bg3: #eef1f6;
7
+ --border: #e2e6ed;
8
+ --fg: #1a202c;
9
+ --dim: #718096;
10
+ --accent: #4f6ef7;
11
+ --green: #38a169;
12
+ --red: #e53e3e;
13
+ --orange: #dd6b20;
14
+ --yellow: #b88700;
15
+ --blue: #4f6ef7;
16
+ --magenta: #805ad5;
17
+ --msg-in: #1f9d55;
18
+ --msg-out: #2563eb;
19
+ --user-bubble-bg: #e3f4e9;
20
+ --scroll-track: #eef1f6;
21
+ --scroll-thumb: #b8c0cc;
22
+ --scroll-thumb-hover: #8f9aaa;
23
+ }
24
+
25
+ /* 暗色主题 */
26
+ [data-theme="dark"] {
27
+ color-scheme: dark;
28
+ --bg: #0d1117;
29
+ --bg2: #161b22;
30
+ --bg3: #21262d;
31
+ --border: #30363d;
32
+ --fg: #e6edf3;
33
+ --dim: #8b949e;
34
+ --accent: #58a6ff;
35
+ --green: #3fb950;
36
+ --red: #f85149;
37
+ --orange: #db8e3c;
38
+ --yellow: #d4a72c;
39
+ --blue: #58a6ff;
40
+ --magenta: #bc8cff;
41
+ --msg-in: #56e39f;
42
+ --msg-out: #79b8ff;
43
+ --user-bubble-bg: #183729;
44
+ --scroll-track: #0d1117;
45
+ --scroll-thumb: #30363d;
46
+ --scroll-thumb-hover: #484f58;
47
+ }
48
+
49
+ * { box-sizing: border-box; margin: 0; padding: 0; }
50
+
51
+ [hidden] {
52
+ display: none !important;
53
+ }
54
+
55
+ .visually-hidden {
56
+ position: absolute !important;
57
+ width: 1px !important;
58
+ height: 1px !important;
59
+ padding: 0 !important;
60
+ margin: -1px !important;
61
+ overflow: hidden !important;
62
+ clip: rect(0, 0, 0, 0) !important;
63
+ white-space: nowrap !important;
64
+ border: 0 !important;
65
+ }
66
+
67
+ html {
68
+ scrollbar-color: var(--scroll-thumb) var(--scroll-track);
69
+ scrollbar-width: thin;
70
+ }
71
+
72
+ * {
73
+ scrollbar-color: var(--scroll-thumb) var(--scroll-track);
74
+ scrollbar-width: thin;
75
+ }
76
+
77
+ *::-webkit-scrollbar {
78
+ width: 10px;
79
+ height: 10px;
80
+ }
81
+
82
+ *::-webkit-scrollbar-track {
83
+ background: var(--scroll-track);
84
+ }
85
+
86
+ *::-webkit-scrollbar-thumb {
87
+ background-color: var(--scroll-thumb);
88
+ border: 2px solid var(--scroll-track);
89
+ border-radius: 999px;
90
+ }
91
+
92
+ *::-webkit-scrollbar-thumb:hover {
93
+ background-color: var(--scroll-thumb-hover);
94
+ }
95
+
96
+ *::-webkit-scrollbar-corner {
97
+ background: var(--scroll-track);
98
+ }
99
+
100
+ body {
101
+ font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", monospace;
102
+ background: var(--bg);
103
+ color: var(--fg);
104
+ font-size: 13px;
105
+ height: 100vh;
106
+ overflow: hidden;
107
+ }
108
+
109
+ /* ── 配对页 ── */
110
+ .pair-page {
111
+ display: flex; align-items: center; justify-content: center;
112
+ height: 100vh;
113
+ }
114
+ .pair-box {
115
+ background: var(--bg2);
116
+ border: 1px solid var(--border);
117
+ border-radius: 12px;
118
+ padding: 40px 48px;
119
+ text-align: center;
120
+ min-width: 320px;
121
+ }
122
+ .pair-box h1 { font-size: 22px; margin-bottom: 8px; }
123
+ .pair-hint { color: var(--dim); margin-bottom: 24px; }
124
+ .pair-box input {
125
+ width: 100%;
126
+ font-size: 28px;
127
+ letter-spacing: 12px;
128
+ text-align: center;
129
+ padding: 12px;
130
+ background: var(--bg);
131
+ border: 1px solid var(--border);
132
+ border-radius: 8px;
133
+ color: var(--fg);
134
+ margin-bottom: 16px;
135
+ }
136
+ .pair-box input:focus { outline: none; border-color: var(--accent); }
137
+ .pair-box button {
138
+ width: 100%;
139
+ padding: 12px;
140
+ font-size: 15px;
141
+ background: var(--accent);
142
+ color: #fff;
143
+ border: none;
144
+ border-radius: 8px;
145
+ cursor: pointer;
146
+ }
147
+ .pair-box button:hover { opacity: 0.9; }
148
+ .pair-error { color: var(--red); margin-top: 12px; min-height: 18px; }
149
+ .pair-code-display { font-size: 48px; font-weight: 700; letter-spacing: 8px; color: var(--accent); margin: 16px 0 4px; cursor: default; }
150
+ .pair-countdown { font-size: 12px; color: var(--dim); margin-bottom: 20px; }
151
+
152
+ /* ── 主面板布局 ── */
153
+ .app { display: flex; flex-direction: column; height: 100vh; }
154
+ .topbar {
155
+ display: flex; align-items: center; gap: 24px;
156
+ padding: 0 16px; height: 44px;
157
+ background: var(--bg2);
158
+ border-bottom: 1px solid var(--border);
159
+ flex-shrink: 0;
160
+ }
161
+ .brand { font-weight: 600; }
162
+ .tabs { display: flex; gap: 4px; }
163
+ .tab {
164
+ background: none; border: none; color: var(--dim);
165
+ padding: 6px 14px; cursor: pointer; border-radius: 6px;
166
+ font-size: 13px; font-family: inherit;
167
+ }
168
+ .tab:hover { color: var(--fg); background: var(--bg3); }
169
+ .tab.active { color: var(--accent); background: var(--bg3); }
170
+ .conn-status { margin-left: auto; color: var(--dim); font-size: 12px; }
171
+ .conn-status.ok { color: var(--green); }
172
+ .conn-status.err { color: var(--red); }
173
+ .logout-btn { margin-left: 8px; padding: 2px 8px; font-size: 12px; background: none; border: 1px solid var(--border); border-radius: 4px; color: var(--dim); cursor: pointer; }
174
+ .logout-btn:hover { color: var(--red); border-color: var(--red); }
175
+
176
+ .content { flex: 1; overflow: hidden; position: relative; }
177
+ .view { display: none; height: 100%; overflow: auto; }
178
+ .view.active { display: block; }
179
+ #view-usage.active { display: flex; flex-direction: column; overflow: hidden; }
180
+ #view-logs.active { display: block; overflow: hidden; }
181
+
182
+ /* ── Logs ── */
183
+ .log-layout { display: flex; flex-direction: column; height: 100%; min-width: 0; background: var(--bg); }
184
+ .log-toolbar {
185
+ display: grid; grid-template-columns: minmax(150px, 1.1fr) minmax(78px, .45fr) minmax(150px, 1.25fr) minmax(180px, 4fr) minmax(72px, .45fr) max-content;
186
+ align-items: center; gap: 12px; overflow-x: auto;
187
+ padding: 12px 16px; background: var(--bg2); border-bottom: 1px solid var(--border); flex-shrink: 0;
188
+ }
189
+ .log-control, .log-search { display: flex; min-width: 0; flex-direction: column; gap: 4px; color: var(--dim); font-size: 11px; }
190
+ .log-control select, .log-search input {
191
+ width: 100%; min-width: 0;
192
+ height: 30px; border: 1px solid var(--border); border-radius: 5px; background: var(--bg); color: var(--fg);
193
+ padding: 0 9px; font-family: inherit; font-size: 12px; outline: none;
194
+ }
195
+ .log-control select:focus, .log-search input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 15%, transparent); }
196
+ .log-follow { display: inline-flex; align-items: center; gap: 6px; height: 30px; color: var(--fg); font-size: 12px; white-space: nowrap; cursor: pointer; }
197
+ .log-follow input { accent-color: var(--accent); }
198
+ .log-live { display: inline-flex; align-items: center; gap: 6px; color: var(--dim); font-size: 11px; white-space: nowrap; }
199
+ .log-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 3px color-mix(in srgb, var(--green) 15%, transparent); }
200
+ .log-meta { display: flex; justify-content: space-between; gap: 12px; padding: 7px 16px; color: var(--dim); font-size: 11px; border-top: 1px solid var(--border); background: var(--bg2); flex-shrink: 0; font-variant-numeric: tabular-nums; }
201
+ .log-meta-status { display: inline-flex; align-items: center; gap: 16px; margin-left: auto; }
202
+ .log-stream { flex: 1; min-height: 0; overflow: auto; padding: 6px 0 16px; background: var(--bg); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 11px; line-height: 1.5; }
203
+ .log-entry { border-bottom: 1px solid color-mix(in srgb, var(--border) 55%, transparent); }
204
+ .log-line { display: grid; grid-template-columns: 112px 56px 150px minmax(320px, 1fr); gap: 10px; padding: 4px 16px; align-items: start; }
205
+ .log-line:hover { background: var(--bg2); }
206
+ .log-time { color: var(--dim); white-space: nowrap; font-variant-numeric: tabular-nums; }
207
+ .log-level { font-size: 10px; font-weight: 700; letter-spacing: .03em; white-space: nowrap; }
208
+ .log-level-trace, .log-level-debug { color: var(--magenta); }
209
+ .log-level-info { color: var(--blue); }
210
+ .log-level-warn { color: var(--orange); }
211
+ .log-level-error, .log-level-fatal { color: var(--red); }
212
+ .log-level-other { color: var(--dim); }
213
+ .log-module { width: fit-content; max-width: 150px; padding: 0 6px; border-radius: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; background: color-mix(in srgb, currentColor 10%, transparent); }
214
+ .log-module-0 { color: #2563eb; }
215
+ .log-module-1 { color: #0891b2; }
216
+ .log-module-2 { color: #0f766e; }
217
+ .log-module-3 { color: #4f46e5; }
218
+ .log-module-4 { color: #6d28d9; }
219
+ .log-module-5 { color: #0369a1; }
220
+ .log-module-6 { color: #4338ca; }
221
+ .log-module-7 { color: #0e7490; }
222
+ [data-theme="dark"] .log-module-0 { color: #93c5fd; }
223
+ [data-theme="dark"] .log-module-1 { color: #67e8f9; }
224
+ [data-theme="dark"] .log-module-2 { color: #5eead4; }
225
+ [data-theme="dark"] .log-module-3 { color: #a5b4fc; }
226
+ [data-theme="dark"] .log-module-4 { color: #c4b5fd; }
227
+ [data-theme="dark"] .log-module-5 { color: #7dd3fc; }
228
+ [data-theme="dark"] .log-module-6 { color: #818cf8; }
229
+ [data-theme="dark"] .log-module-7 { color: #38bdf8; }
230
+ .log-content { display: flex; align-items: baseline; flex-wrap: wrap; gap: 5px; min-width: 0; color: var(--fg); }
231
+ .log-message { white-space: pre-wrap; overflow-wrap: anywhere; }
232
+ .log-user-message .log-message { color: #0891b2; }
233
+ [data-theme="dark"] .log-user-message .log-message { color: #67e8f9; }
234
+ .log-direction, .log-event, .log-actor { flex-shrink: 0; font-size: 10px; font-weight: 700; border-radius: 3px; padding: 0 5px; }
235
+ .log-direction-in { color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
236
+ .log-direction-out { color: var(--orange); background: color-mix(in srgb, var(--orange) 12%, transparent); }
237
+ .log-event { color: var(--magenta); background: color-mix(in srgb, var(--magenta) 10%, transparent); }
238
+ .log-actor { color: var(--blue); background: color-mix(in srgb, var(--blue) 10%, transparent); }
239
+ .log-fields { display: inline-flex; align-items: baseline; flex-wrap: wrap; gap: 5px; }
240
+ .log-field { color: var(--dim); }
241
+ .log-field > span, .log-kv-key { color: var(--blue); }
242
+ .log-field > .log-field-value, .log-kv-value { color: var(--fg); }
243
+ .log-entry-error .log-line, .log-entry-fatal .log-line { background: color-mix(in srgb, var(--red) 4%, transparent); }
244
+ .log-entry-warn .log-line { background: color-mix(in srgb, var(--orange) 3%, transparent); }
245
+ @media (max-width: 900px) {
246
+ .log-toolbar { grid-template-columns: 150px 78px 150px minmax(180px, 1fr) 72px max-content; }
247
+ .log-line { grid-template-columns: 108px 52px minmax(260px, 1fr); }
248
+ .log-module { display: none; }
249
+ }
250
+
251
+ .role-management-shell {
252
+ min-height: 100%;
253
+ padding-top: 20px;
254
+ }
255
+
256
+ .role-management-toolbar {
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: space-between;
260
+ gap: 20px;
261
+ width: min(100%, 1400px);
262
+ margin: 0 auto;
263
+ padding: 0 20px;
264
+ }
265
+
266
+ .role-subtabs {
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ .role-subpanel {
271
+ min-width: 0;
272
+ }
273
+
274
+ @media (max-width: 720px) {
275
+ .role-management-toolbar {
276
+ width: 100%;
277
+ padding: 0 16px;
278
+ align-items: stretch;
279
+ flex-direction: column;
280
+ gap: 10px;
281
+ }
282
+
283
+ .role-subtabs {
284
+ width: 100%;
285
+ }
286
+
287
+ .role-subtab {
288
+ flex: 1;
289
+ }
290
+
291
+ .role-management-toolbar .btn-new-role {
292
+ align-self: flex-end;
293
+ }
294
+ }
295
+
296
+ /* ── AID 表格 ── */
297
+ table { width: 100%; border-collapse: collapse; font-size: 12px; }
298
+ th, td { text-align: left; padding: 7px 12px; border-bottom: 1px solid var(--border); white-space: nowrap; }
299
+ th { color: var(--dim); font-weight: 500; position: sticky; top: 0; background: var(--bg2); }
300
+ tr:hover td { background: var(--bg2); }
301
+ .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; }
302
+ .dot.on { background: var(--green); }
303
+ .dot.off { background: var(--red); }
304
+ .dot.idle { background: var(--orange); }
305
+ .preview { color: var(--dim); max-width: 360px; overflow: hidden; text-overflow: ellipsis; }
306
+ .banner { padding: 10px 16px; background: #3d2a1a; color: var(--orange); border-bottom: 1px solid var(--border); }
307
+ .empty { padding: 40px; text-align: center; color: var(--dim); }
308
+
309
+ /* ── Messages 三栏 ── */
310
+ .msg-layout, .sess-layout { display: flex; height: 100%; }
311
+ .msg-col { overflow-y: auto; height: 100%; }
312
+ .msg-aids { width: 220px; border-right: 1px solid var(--border); flex-shrink: 0; }
313
+ .msg-peers { width: 240px; border-right: 1px solid var(--border); flex-shrink: 0; }
314
+ .msg-stream { flex: 1; padding: 0; }
315
+ .msg-stream-body { padding: 12px; }
316
+ .list-item {
317
+ padding: 8px 12px; cursor: pointer; border-bottom: 1px solid var(--border);
318
+ }
319
+ .list-item:hover { background: var(--bg2); }
320
+ .list-item.sel { background: var(--bg3); border-left: 2px solid var(--accent); }
321
+ .list-item .name { font-weight: 500; }
322
+ .list-item .sub { color: var(--dim); font-size: 11px; margin-top: 2px; }
323
+ .col-title { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; color: var(--dim); font-size: 11px; text-transform: uppercase; position: sticky; top: 0; background: var(--bg); border-bottom: 1px solid var(--border); }
324
+ .col-count { color: var(--fg); font-variant-numeric: tabular-nums; }
325
+ .msg-peers .list-item .name { display: flex; align-items: center; gap: 4px; min-width: 0; }
326
+ .msg-peer-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
327
+ .msg-partition-mark {
328
+ display: inline-flex; align-items: center; flex-shrink: 0; height: 18px; padding: 0 5px;
329
+ border-radius: 3px; font-size: 10px; font-weight: 600; line-height: 1;
330
+ }
331
+ .msg-partition-main { color: var(--dim); background: var(--bg3); }
332
+ .msg-partition-thread { color: #0369a1; background: color-mix(in srgb, #38bdf8 14%, transparent); }
333
+ .msg-partition-legacy { color: #64748b; background: color-mix(in srgb, #94a3b8 15%, transparent); }
334
+ [data-theme="dark"] .msg-partition-thread { color: #7dd3fc; }
335
+ [data-theme="dark"] .msg-partition-legacy { color: #cbd5e1; }
336
+ .msg-group-mark {
337
+ display: inline-flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ min-width: 18px;
341
+ height: 18px;
342
+ padding: 0 4px;
343
+ border-radius: 3px;
344
+ background: var(--fg);
345
+ color: var(--bg);
346
+ font-size: 11px;
347
+ font-weight: 700;
348
+ line-height: 1;
349
+ flex-shrink: 0;
350
+ }
351
+
352
+ .bubble { margin-bottom: 12px; max-width: 80%; }
353
+ .bubble.in, .bubble.out { margin-left: 0; margin-right: auto; }
354
+ .bubble .meta { font-size: 11px; color: var(--dim); margin-bottom: 3px; }
355
+ .bubble .body {
356
+ padding: 8px 10px; border-radius: 8px; white-space: pre-wrap; word-break: break-word;
357
+ background: var(--bg2); border: 1px solid var(--border);
358
+ }
359
+ .bubble.in .body { background: var(--user-bubble-bg); border-left: 2px solid var(--green); }
360
+ .bubble.out .body { border-left: 2px solid var(--blue); }
361
+ .msg-tag { display: inline-block; padding: 0 5px; border-radius: 3px; font-size: 10px; margin-left: 4px; background: var(--bg3); color: var(--magenta); font-weight: 400; line-height: 1.4; vertical-align: baseline; }
362
+
363
+ .msg-session-header { height: 44px; min-height: 44px; padding: 12px 16px; box-sizing: border-box; z-index: 2; }
364
+ .msg-session-header .sh-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
365
+ .msg-session-context-row { display: flex; align-items: baseline; gap: 28px; min-width: 0; }
366
+ .msg-session-id-row { display: flex; align-items: baseline; gap: 10px; min-width: 0; flex-shrink: 0; }
367
+ .msg-session-id { color: var(--fg); font-family: ui-monospace, "SF Mono", Consolas, monospace; font-size: 12px; line-height: 1.35; white-space: nowrap; }
368
+ .msg-session-grid { display: grid; grid-template-columns: repeat(6, max-content); justify-content: space-between; gap: 16px; min-width: 0; flex: 1; }
369
+ .msg-session-stat { display: flex; align-items: baseline; min-width: 0; gap: 8px; }
370
+ .msg-session-label { color: var(--dim); font-size: 10px; line-height: 1.2; flex-shrink: 0; }
371
+ .msg-session-value { overflow: hidden; color: var(--fg); font-size: 12px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
372
+ .msg-session-value.mono { font-family: ui-monospace, "SF Mono", Consolas, monospace; }
373
+ .msg-session-value.status { display: inline-flex; align-items: center; gap: 5px; }
374
+ .msg-session-value.status.processing { color: var(--green); }
375
+ .msg-session-value .dot { width: 7px; height: 7px; margin: 0; flex-shrink: 0; }
376
+ .msg-session-empty { display: flex; align-items: center; }
377
+ .msg-session-empty .sh-title { margin-bottom: 0; }
378
+
379
+ /* ── Sessions ── */
380
+ .sess-list { width: 360px; border-right: 1px solid var(--border); flex-shrink: 0; display: flex; flex-direction: column; overflow: hidden; }
381
+ .sess-filter { padding: 10px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; flex-shrink: 0; }
382
+ .sess-select-row { display: grid; grid-template-columns: minmax(92px, 0.72fr) minmax(0, 1.28fr); gap: 8px; }
383
+ .sess-filter-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 24px; }
384
+ .sess-filter select {
385
+ width: 100%; padding: 6px 8px; background: var(--bg); color: var(--fg);
386
+ border: 1px solid var(--border); border-radius: 6px; font-size: 12px; font-family: inherit;
387
+ min-width: 0;
388
+ }
389
+ .sess-filter select:focus { outline: none; border-color: var(--accent); }
390
+ .sess-count { font-size: 11px; color: var(--dim); }
391
+ .sess-switch { display: inline-flex; align-items: center; gap: 7px; color: var(--dim); font-size: 11px; cursor: pointer; user-select: none; }
392
+ .sess-switch input { position: absolute; opacity: 0; pointer-events: none; }
393
+ .sess-switch-track { width: 34px; height: 18px; padding: 2px; border-radius: 999px; background: var(--bg3); border: 1px solid var(--border); transition: background .16s ease, border-color .16s ease; }
394
+ .sess-switch-thumb { display: block; width: 12px; height: 12px; border-radius: 50%; background: var(--dim); transition: transform .16s ease, background .16s ease; }
395
+ .sess-switch input:checked + .sess-switch-track { background: var(--accent); border-color: var(--accent); }
396
+ .sess-switch input:checked + .sess-switch-track .sess-switch-thumb { transform: translateX(16px); background: #fff; }
397
+ .sess-switch:hover { color: var(--fg); }
398
+ .sess-items { flex: 1; overflow-y: auto; }
399
+
400
+ .sess-items .list-item .name { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
401
+ .sess-items .list-item .sub { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
402
+ .bind-badge { display: inline-flex; align-items: center; gap: 3px; padding: 0 5px; border-radius: 3px; background: var(--bg3); color: var(--accent); font-size: 10px; }
403
+ .bind-badge .dot { width: 6px; height: 6px; margin: 0; }
404
+ .msg-count { color: var(--dim); }
405
+
406
+ .sess-detail { flex: 1; padding: 0; overflow-y: auto; }
407
+
408
+ /* 会话头 */
409
+ .sess-header { position: sticky; top: 0; background: var(--bg2); border-bottom: 1px solid var(--border); padding: 12px 20px; z-index: 1; }
410
+ .sh-title { font-size: 15px; font-weight: 600; margin-bottom: 8px; }
411
+ .sh-title-row { display: flex; align-items: center; height: 24px; min-width: 0; }
412
+ .sh-title-row .sh-title { flex: 1; min-width: 0; margin-bottom: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
413
+ .sh-stats { display: flex; flex-wrap: wrap; gap: 12px; font-size: 12px; color: var(--dim); }
414
+ .sh-stat { display: inline-flex; align-items: center; gap: 4px; }
415
+ .sh-stat .dot { width: 7px; height: 7px; margin: 0 2px; }
416
+ .sess-view-control { display: flex; align-items: center; gap: 10px; min-width: 0; flex-shrink: 0; }
417
+ .sh-footer-row { display: flex; align-items: center; gap: 14px; min-width: 0; margin-top: 8px; }
418
+ .sh-footer-row .sh-cats { min-width: 0; margin-top: 0; }
419
+
420
+ /* 顶部 4 类分类条 */
421
+ .sh-cats { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
422
+ .cat-chip { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 10px; font-size: 11px; background: var(--bg3); }
423
+ .cat-swatch { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
424
+ .cat-chip.cat-user_input .cat-swatch { background: var(--green); }
425
+ .cat-chip.cat-model_output .cat-swatch { background: var(--blue); }
426
+ .cat-chip.cat-tool_call .cat-swatch { background: var(--magenta); }
427
+ .cat-chip.cat-tool_result .cat-swatch { background: var(--orange); }
428
+ .cat-chip.cat-msg_send .cat-swatch { background: var(--cyan, #22d3a8); }
429
+
430
+ /* 视图切换位于会话信息栏内,不额外占用纵向空间 */
431
+ .view-toggle { height: 26px; padding: 2px 11px; border-radius: 13px; border: 1px solid var(--border); background: var(--bg3); color: var(--fg); cursor: pointer; font-size: 12px; line-height: 1; font-family: inherit; white-space: nowrap; transition: background .16s ease, border-color .16s ease, color .16s ease; }
432
+ .view-toggle:hover { border-color: var(--accent); }
433
+ .view-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
434
+ .view-toggle.active { background: var(--accent); border-color: var(--accent); color: #fff; }
435
+ .toolbar-hint { font-size: 11px; color: var(--dim); white-space: nowrap; }
436
+ .turn-list { padding-top: 8px; }
437
+
438
+ @media (max-width: 1100px) {
439
+ .sess-view-control .toolbar-hint { display: none; }
440
+ }
441
+
442
+ /* 对话视图气泡 */
443
+ .chat-row { display: flex; flex-direction: column; margin: 10px 20px; max-width: 72%; }
444
+ .chat-row.in, .chat-row.out { align-items: flex-start; margin-left: 20px; margin-right: auto; }
445
+ .chat-bubble { padding: 9px 13px; border-radius: 12px; white-space: pre-wrap; word-break: break-word; line-height: 1.5; font-size: 13px; }
446
+ .chat-row.in .chat-bubble { background: var(--user-bubble-bg); color: var(--fg); border-bottom-left-radius: 3px; }
447
+ .chat-row.out .chat-bubble { background: var(--bg3); color: var(--fg); border-bottom-left-radius: 3px; }
448
+ .chat-meta-row { display: block; width: 100%; min-width: 0; margin-top: 3px; }
449
+ .chat-time { flex-shrink: 0; font-size: 10px; color: var(--dim); }
450
+
451
+ /* 处理过程折叠组 */
452
+ .proc-group { margin: 8px 20px; }
453
+ .proc-group > summary { cursor: pointer; color: var(--dim); font-size: 11px; padding: 4px 0; text-align: center; list-style: none; }
454
+ .proc-group > summary::-webkit-details-marker { display: none; }
455
+ .proc-group > summary:hover { color: var(--fg); }
456
+ .proc-group-inline { width: 100%; min-width: 0; margin: 0; }
457
+ .proc-group-inline > summary { display: grid; grid-template-columns: max-content minmax(0, 1fr); align-items: start; column-gap: 16px; padding: 0; line-height: 1.4; }
458
+ .proc-group-inline .proc-summary-label { min-width: 0; text-align: center; }
459
+ .proc-group-inline .proc-body { margin-top: 8px; margin-left: 0; }
460
+ .proc-body { border-left: 2px dashed var(--border); margin-left: 8px; padding-left: 4px; }
461
+ .proc-body .turn { margin: 8px 12px; }
462
+
463
+ /* 轮次:按 4 类着色(左色条 + 角色标签色)*/
464
+ .turn { margin: 0 20px 18px; border-left: 3px solid var(--border); padding-left: 12px; }
465
+ .turn:first-of-type { margin-top: 16px; }
466
+ .turn.cat-user_input { border-left-color: var(--green); }
467
+ .turn.cat-model_output { border-left-color: var(--blue); }
468
+ .turn.cat-tool_call { border-left-color: var(--magenta); }
469
+ .turn.cat-tool_result { border-left-color: var(--orange); }
470
+ .turn.cat-system { border-left-color: var(--dim); }
471
+
472
+ .turn-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; }
473
+ .turn-role { font-weight: 600; font-size: 12px; }
474
+ .turn.cat-user_input .turn-role { color: var(--green); }
475
+ .turn.cat-model_output .turn-role { color: var(--blue); }
476
+ .turn.cat-tool_call .turn-role { color: var(--magenta); }
477
+ .turn.cat-tool_result .turn-role { color: var(--orange); }
478
+ .turn.cat-system .turn-role { color: var(--dim); }
479
+ .turn-time { font-size: 11px; color: var(--dim); }
480
+ .turn-usage { font-size: 11px; color: var(--dim); margin-left: auto; }
481
+ .turn-blocks { display: flex; flex-direction: column; gap: 8px; }
482
+
483
+ /* 普通文本块 */
484
+ .blk-text { white-space: pre-wrap; word-break: break-word; line-height: 1.55; }
485
+
486
+ /* 思考块(默认展开,可折叠) */
487
+ .blk-thinking { font-size: 12px; }
488
+ .blk-thinking summary { cursor: pointer; color: var(--magenta); opacity: 0.8; }
489
+ .blk-thinking-body { white-space: pre-wrap; word-break: break-word; color: var(--dim); margin-top: 6px; padding-left: 12px; border-left: 2px solid var(--border); font-style: italic; }
490
+
491
+ /* 工具调用块(默认展开,可折叠) */
492
+ .blk-tool { background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; }
493
+ .tool-head { cursor: pointer; font-size: 12px; }
494
+ .blk-tool[open] .tool-head { margin-bottom: 4px; }
495
+ .tool-params:empty { display: none; }
496
+ .tool-name { font-weight: 600; color: var(--accent); font-family: ui-monospace, "SF Mono", Consolas, monospace; }
497
+ .tool-param { display: flex; gap: 8px; margin-top: 3px; font-size: 12px; align-items: baseline; }
498
+ .tool-param .pk { color: var(--dim); flex-shrink: 0; min-width: 64px; }
499
+ .tool-param .pv {
500
+ font-family: ui-monospace, "SF Mono", Consolas, monospace; color: var(--fg);
501
+ background: var(--bg); padding: 1px 6px; border-radius: 4px; word-break: break-all;
502
+ white-space: pre-wrap; display: block; flex: 1;
503
+ }
504
+
505
+ /* 工具结果块(默认展开,可折叠) */
506
+ .blk-result { font-size: 12px; }
507
+ .blk-result summary { cursor: pointer; color: var(--dim); }
508
+ .blk-result.err summary { color: var(--red); }
509
+ .result-body {
510
+ margin-top: 6px; padding: 8px 10px; background: var(--bg); border: 1px solid var(--border);
511
+ border-radius: 6px; white-space: pre-wrap; word-break: break-word; max-height: 280px; overflow-y: auto;
512
+ font-family: ui-monospace, "SF Mono", Consolas, monospace; font-size: 11.5px; line-height: 1.5;
513
+ }
514
+ .blk-result.err .result-body { border-color: var(--red); }
515
+
516
+ /* ── Cache 视图 ── */
517
+ #view-cache { padding: 16px 18px; }
518
+ .cache-cards {
519
+ display: grid;
520
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
521
+ gap: 10px;
522
+ margin-bottom: 22px;
523
+ }
524
+ .cache-card {
525
+ background: var(--bg2);
526
+ border: 1px solid var(--border);
527
+ border-radius: 8px;
528
+ padding: 12px 14px;
529
+ }
530
+ .cc-label { color: var(--dim); font-size: 11px; letter-spacing: 0.3px; }
531
+ .cc-value { font-size: 22px; font-weight: 600; margin: 4px 0 2px; font-variant-numeric: tabular-nums; }
532
+ .cc-value.on { color: var(--green); }
533
+ .cc-value.idle { color: var(--orange); }
534
+ .cc-value.off { color: var(--red); }
535
+ .cc-sub { color: var(--dim); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
536
+ .cache-h {
537
+ font-size: 12px; font-weight: 600; color: var(--dim);
538
+ text-transform: uppercase; letter-spacing: 0.5px;
539
+ margin: 8px 0 6px; padding-top: 6px;
540
+ }
541
+ #view-cache table { margin-bottom: 8px; }
542
+ #view-cache td { font-variant-numeric: tabular-nums; }
543
+ .cache-tag {
544
+ display: inline-block; padding: 1px 7px; border-radius: 10px;
545
+ font-size: 10.5px; border: 1px solid var(--border); color: var(--dim);
546
+ }
547
+ .cache-tag-agent { color: var(--blue); border-color: var(--blue); }
548
+ .cache-tag-relation { color: var(--magenta); border-color: var(--magenta); }
549
+
550
+ /* ── Theme toggle ── */
551
+ .theme-btn {
552
+ background: none; border: 1px solid var(--border); border-radius: 6px;
553
+ color: var(--fg); cursor: pointer; padding: 2px 8px; font-size: 14px;
554
+ margin-left: 8px;
555
+ }
556
+ .theme-btn:hover { background: var(--bg3); }
557
+
558
+ /* ── Usage view ── */
559
+ .usage-layout {
560
+ padding: 0; overflow: hidden; flex: 1; display: flex; flex-direction: column;
561
+ }
562
+ .usage-subtabs { flex-shrink: 0; padding: 12px 16px 0; }
563
+ .usage-subpanel { display: none; flex: 1; overflow: hidden; }
564
+ .usage-subpanel.active { display: flex; flex-direction: column; }
565
+ #usage-overview { overflow-y: auto; padding: 16px; }
566
+ .overview-filters {
567
+ margin-bottom: 16px;
568
+ padding: 12px;
569
+ background: var(--bg2);
570
+ border: 1px solid var(--border);
571
+ border-radius: 8px;
572
+ }
573
+ .ov-range-tabs {
574
+ display: flex;
575
+ gap: 8px;
576
+ flex-wrap: wrap;
577
+ }
578
+ .ov-range-btn {
579
+ padding: 6px 14px;
580
+ font-size: 12px;
581
+ border: 1px solid var(--border);
582
+ background: var(--bg3);
583
+ color: var(--fg);
584
+ border-radius: 5px;
585
+ cursor: pointer;
586
+ transition: all 0.2s;
587
+ }
588
+ .ov-range-btn:hover {
589
+ border-color: var(--accent);
590
+ color: var(--accent);
591
+ }
592
+ .ov-range-btn.active {
593
+ background: var(--accent);
594
+ color: white;
595
+ border-color: var(--accent);
596
+ }
597
+ .ov-custom-date {
598
+ display: none;
599
+ margin-top: 12px;
600
+ gap: 10px;
601
+ align-items: center;
602
+ }
603
+ .ov-custom-date label {
604
+ display: flex;
605
+ align-items: center;
606
+ gap: 6px;
607
+ font-size: 12px;
608
+ color: var(--dim);
609
+ }
610
+ .ov-custom-date input[type="date"] {
611
+ padding: 4px 8px;
612
+ font-size: 12px;
613
+ border: 1px solid var(--border);
614
+ border-radius: 4px;
615
+ background: var(--bg3);
616
+ color: var(--fg);
617
+ }
618
+ .ov-custom-date button {
619
+ padding: 5px 16px;
620
+ font-size: 12px;
621
+ border: 1px solid var(--accent);
622
+ background: var(--accent);
623
+ color: white;
624
+ border-radius: 4px;
625
+ cursor: pointer;
626
+ }
627
+ .ov-custom-date button:hover {
628
+ opacity: 0.9;
629
+ }
630
+ .detail-filters {
631
+ display: flex;
632
+ gap: 12px;
633
+ align-items: center;
634
+ flex-wrap: wrap;
635
+ margin-bottom: 12px;
636
+ }
637
+ .detail-filters label {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 6px;
641
+ font-size: 12px;
642
+ color: var(--dim);
643
+ }
644
+ .detail-filters select,
645
+ .detail-filters input[type="date"] {
646
+ padding: 4px 8px;
647
+ font-size: 12px;
648
+ border: 1px solid var(--border);
649
+ border-radius: 4px;
650
+ background: var(--bg3);
651
+ color: var(--fg);
652
+ min-width: 120px;
653
+ }
654
+ .detail-filters button {
655
+ padding: 5px 16px;
656
+ font-size: 12px;
657
+ border: 1px solid var(--accent);
658
+ background: var(--accent);
659
+ color: white;
660
+ border-radius: 4px;
661
+ cursor: pointer;
662
+ }
663
+ .detail-filters button:hover {
664
+ opacity: 0.9;
665
+ }
666
+ .detail-pagination {
667
+ display: flex;
668
+ align-items: center;
669
+ gap: 8px;
670
+ margin-top: 12px;
671
+ padding: 8px 0;
672
+ }
673
+ .detail-pagination button {
674
+ padding: 4px 12px;
675
+ font-size: 12px;
676
+ border: 1px solid var(--border);
677
+ background: var(--bg3);
678
+ color: var(--fg);
679
+ border-radius: 4px;
680
+ cursor: pointer;
681
+ }
682
+ .detail-pagination button:hover:not(:disabled) {
683
+ border-color: var(--accent);
684
+ color: var(--accent);
685
+ }
686
+ .detail-pagination button:disabled {
687
+ opacity: 0.4;
688
+ cursor: not-allowed;
689
+ }
690
+ .detail-pagination input[type="number"] {
691
+ padding: 4px 8px;
692
+ font-size: 12px;
693
+ border: 1px solid var(--border);
694
+ border-radius: 4px;
695
+ background: var(--bg3);
696
+ color: var(--fg);
697
+ }
698
+ .usage-cards {
699
+ display: flex;
700
+ flex-wrap: wrap;
701
+ gap: 16px;
702
+ margin-bottom: 20px;
703
+ }
704
+ .usage-card {
705
+ background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
706
+ padding: 16px; text-align: center;
707
+ box-shadow: 0 1px 3px rgba(0,0,0,0.06);
708
+ flex: 1 1 140px;
709
+ min-width: 140px;
710
+ }
711
+ /* 多值卡片样式 */
712
+ .usage-card.multi-value-card {
713
+ flex: 1 1 280px;
714
+ min-width: 280px;
715
+ text-align: left;
716
+ }
717
+ .usage-card .card-title {
718
+ font-size: 13px;
719
+ font-weight: 600;
720
+ color: var(--fg);
721
+ margin-bottom: 12px;
722
+ padding-bottom: 8px;
723
+ border-bottom: 1px solid var(--border);
724
+ }
725
+ .usage-card .card-items {
726
+ display: grid;
727
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
728
+ gap: 10px;
729
+ }
730
+ .usage-card .card-item {
731
+ display: flex;
732
+ flex-direction: column;
733
+ gap: 4px;
734
+ }
735
+ .usage-card .card-item-label {
736
+ font-size: 10px;
737
+ color: var(--dim);
738
+ text-transform: uppercase;
739
+ letter-spacing: 0.5px;
740
+ }
741
+ .usage-card .card-item-value {
742
+ font-size: 16px;
743
+ font-weight: 700;
744
+ color: var(--accent);
745
+ font-variant-numeric: tabular-nums;
746
+ }
747
+ /* 会话组卡片 - 蓝色调 */
748
+ .usage-card.session-group {
749
+ border-left: 3px solid #4f6ef7;
750
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(79, 110, 247, 0.03) 100%);
751
+ }
752
+ .usage-card.session-group .card-value,
753
+ .usage-card.session-group .card-item-value {
754
+ color: #4f6ef7;
755
+ }
756
+ /* 用量组卡片 - 绿色调 */
757
+ .usage-card.usage-group {
758
+ border-left: 3px solid #38a169;
759
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(56, 161, 105, 0.03) 100%);
760
+ }
761
+ .usage-card.usage-group .card-value,
762
+ .usage-card.usage-group .card-item-value {
763
+ color: #38a169;
764
+ }
765
+ /* 花费组卡片 - 橙色调 */
766
+ .usage-card.cost-group {
767
+ border-left: 3px solid #dd6b20;
768
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(221, 107, 32, 0.03) 100%);
769
+ flex: 1 1 210px;
770
+ }
771
+ .usage-card.cost-group .card-value,
772
+ .usage-card.cost-group .card-item-value {
773
+ color: #dd6b20;
774
+ }
775
+ .usage-card .card-value {
776
+ font-size: 22px; font-weight: 700; color: var(--accent);
777
+ font-variant-numeric: tabular-nums;
778
+ }
779
+ .usage-card .card-label {
780
+ font-size: 11px; color: var(--dim); margin-top: 4px; text-transform: uppercase;
781
+ letter-spacing: 0.5px;
782
+ }
783
+ .usage-chart-row {
784
+ display: flex; gap: 16px; margin-bottom: 20px;
785
+ }
786
+ .usage-chart {
787
+ flex: 2; height: 260px; background: var(--bg2); border: 1px solid var(--border);
788
+ border-radius: 10px; padding: 12px;
789
+ }
790
+ .usage-chart-sm {
791
+ flex: 1; height: 260px; background: var(--bg2); border: 1px solid var(--border);
792
+ border-radius: 10px; padding: 12px;
793
+ }
794
+ .usage-table-section {
795
+ background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
796
+ padding: 16px;
797
+ }
798
+ .usage-table-section h3 {
799
+ font-size: 13px; color: var(--dim); margin-bottom: 10px; font-weight: 500;
800
+ }
801
+ .usage-table {
802
+ width: 100%; border-collapse: collapse; font-size: 12px;
803
+ }
804
+ .usage-table th {
805
+ text-align: left; padding: 6px 10px; color: var(--dim); font-weight: 500;
806
+ border-bottom: 1px solid var(--border);
807
+ }
808
+ .usage-table td {
809
+ padding: 6px 10px; border-bottom: 1px solid var(--border);
810
+ font-variant-numeric: tabular-nums;
811
+ }
812
+ .usage-table tr:last-child td { border-bottom: none; }
813
+
814
+ @media (max-width: 800px) {
815
+ .usage-chart-row { flex-direction: column; }
816
+ .usage-chart, .usage-chart-sm { flex: none; height: 200px; }
817
+ }
818
+ .cache-tag-kits { color: var(--green); border-color: var(--green); }
819
+ .cache-tag-global { color: var(--orange); border-color: var(--orange); }
820
+ .cache-note { color: var(--dim); font-size: 11px; margin: 14px 2px 24px; line-height: 1.6; }
821
+
822
+ /* ── Control 视图 ── */
823
+ .ctrl-wrap { padding: 12px; overflow-y: auto; height: 100%; }
824
+ .ctrl-section { margin-bottom: 20px; }
825
+ .ctrl-h { font-size: 11px; color: var(--dim); text-transform: uppercase; letter-spacing: .06em; margin-bottom: 8px; }
826
+ .ctrl-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 8px; }
827
+ .ctrl-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; }
828
+ .ctrl-card.ctrl-locked { opacity: .5; }
829
+ .ctrl-card h3 { font-size: 11px; color: var(--dim); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 8px; }
830
+ .ctrl-kv { display: grid; grid-template-columns: auto 1fr; gap: 2px 8px; }
831
+ .kv-row { display: contents; }
832
+ .kv-k { color: var(--dim); font-size: 11.5px; }
833
+ .kv-v { color: var(--fg); font-size: 11.5px; word-break: break-all; }
834
+ .ctrl-cur { color: var(--accent); font-size: 12px; margin-right: 6px; }
835
+ .ctrl-select { font-size: 12px; background: var(--bg3); border: 1px solid var(--border); border-radius: 4px; color: var(--fg); padding: 3px 6px; max-width: 160px; }
836
+ .ctrl-row { display: flex; align-items: center; margin: 4px 0; }
837
+ .ctrl-msg { font-size: 12px; color: var(--dim); margin: 4px 0; }
838
+ .ctrl-msg.muted { color: var(--border); }
839
+ .ctrl-list { list-style: none; padding: 0; margin: 6px 0 0; }
840
+ .ctrl-list li { display: flex; align-items: center; gap: 5px; padding: 3px 0; border-bottom: 1px solid var(--border); font-size: 12px; }
841
+ .ctrl-list li:last-child { border-bottom: none; }
842
+ .ctrl-list .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
843
+ .ctrl-tag { font-size: 11px; color: var(--dim); }
844
+ .ctrl-btns { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
845
+ .ctrl-btn { font-size: 11px; padding: 2px 8px; border-radius: 3px; border: 1px solid var(--border); background: var(--bg3); color: var(--fg); cursor: pointer; }
846
+ a.ctrl-btn { display: inline-flex; align-items: center; text-decoration: none; line-height: 1.35; }
847
+ .ctrl-btn:hover { border-color: var(--accent); color: var(--accent); }
848
+ .ctrl-btn.danger { color: var(--red); border-color: var(--red); }
849
+ .ctrl-btn:disabled { opacity: .4; cursor: not-allowed; }
850
+ .ctrl-toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: var(--bg3); border: 1px solid var(--border); border-radius: 5px; padding: 6px 14px; font-size: 12px; opacity: 0; pointer-events: none; transition: opacity .2s; z-index: 260; }
851
+ .ctrl-toast.show { opacity: 1; }
852
+ .ctrl-toast.err { border-color: var(--red); color: var(--red); }
853
+
854
+
855
+ /* ── Agents 页 ── */
856
+ .agents-toolbar {
857
+ display: flex;
858
+ align-items: center;
859
+ gap: 10px;
860
+ padding: 7px 8px;
861
+ border-bottom: 1px solid var(--border);
862
+ background: var(--bg2);
863
+ }
864
+ .agent-ops-cell { white-space: nowrap; vertical-align: middle; }
865
+
866
+ /* disabled 行淡化 */
867
+ tr.ag-disabled td { opacity: .5; }
868
+ tr.ag-disabled .ag-name { color: var(--dim); }
869
+
870
+ /* 操作区:主按钮 + ··· 下拉 */
871
+ .agent-ops { display: flex; align-items: center; gap: 5px; }
872
+ .agent-ops .ctrl-btn { padding: 2px 9px; font-size: 11px; }
873
+ .ops-enable { color: var(--green) !important; border-color: var(--green) !important; }
874
+ .ops-clear-queue { color: var(--orange) !important; border-color: var(--orange) !important; }
875
+
876
+ /* 操作进行中状态 */
877
+ .agent-ops-busy { display: flex; align-items: center; gap: 6px; }
878
+ .ops-busy-label { font-size: 11px; color: var(--dim); font-style: italic; }
879
+
880
+ /* ··· 下拉菜单 */
881
+ .ops-more { position: relative; }
882
+ .ops-more-btn { letter-spacing: 2px; padding: 2px 6px !important; }
883
+ .ops-dropdown {
884
+ display: none; position: absolute; right: 0; top: calc(100% + 4px); z-index: 100;
885
+ background: var(--bg2); border: 1px solid var(--border); border-radius: 6px;
886
+ box-shadow: 0 4px 12px rgba(0,0,0,.15); min-width: 140px; overflow: hidden;
887
+ }
888
+ .ops-more.open .ops-dropdown { display: block; }
889
+ .ops-dd-item {
890
+ display: block; width: 100%; padding: 7px 14px; text-align: left;
891
+ font-size: 12px; background: none; border: none; color: var(--fg);
892
+ cursor: pointer; text-decoration: none; white-space: nowrap;
893
+ }
894
+ .ops-dd-item:hover { background: var(--bg3); }
895
+ .ops-dd-item.danger { color: var(--red); }
896
+ .ops-dd-item.danger:hover { background: var(--bg3); }
897
+ .ops-dd-item:disabled {
898
+ opacity: .45;
899
+ cursor: not-allowed;
900
+ }
901
+ .ops-dd-item:disabled:hover { background: none; }
902
+
903
+ /* 顶部统计条(对齐终端 watch aid 状态栏)*/
904
+ .agents-stats {
905
+ display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px;
906
+ padding: 9px 14px; border-bottom: 1px solid var(--border);
907
+ background: var(--bg2); font-size: 12px; font-variant-numeric: tabular-nums;
908
+ }
909
+ .agents-stats .sg { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
910
+ .agents-stats .sg-k { color: var(--green); font-weight: 600; }
911
+ .agents-stats .sg-gw { font-family: ui-monospace, Consolas, monospace; color: var(--fg); }
912
+ .agents-stats .num-on { color: var(--green); font-weight: 600; }
913
+ .agents-stats .num-off { color: var(--red); font-weight: 600; }
914
+ .agents-stats .in { color: var(--green); }
915
+ .agents-stats .out { color: var(--blue); }
916
+
917
+ /* 两行一个 agent:主行 + 信息行 */
918
+ #view-agents tr.ag-main > td { border-bottom: none; padding-bottom: 3px; }
919
+ #view-agents tr.ag-sub > td { padding-top: 0; padding-bottom: 9px; color: var(--dim); }
920
+ #view-agents tr.ag-main:hover td, #view-agents tr.ag-sub:hover td { background: var(--bg2); }
921
+
922
+ /* AID 单元:状态点 + 显示名(主) + aid(次,dim) */
923
+ .ag-id { display: flex; align-items: center; gap: 7px; }
924
+ .ag-id .dot { margin: 0; flex-shrink: 0; }
925
+ .ag-id-text { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
926
+ .ag-name { font-weight: 600; color: var(--fg); overflow: hidden; text-overflow: ellipsis; }
927
+ .ag-aid { font-size: 10.5px; color: var(--dim); font-family: ui-monospace, Consolas, monospace; overflow: hidden; text-overflow: ellipsis; }
928
+
929
+ /* 工作状态徽标(无边框,纯色文字) */
930
+ .state-badge { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 11px; font-weight: 700; }
931
+ .state-badge.working { color: #fff; background: var(--orange); }
932
+ .state-badge.queued { color: #fff; background: var(--orange); }
933
+ .state-badge.idle { color: var(--dim); background: var(--bg3); }
934
+ .state-badge.connected { color: var(--green); background: var(--bg3); }
935
+ .state-badge.muted { color: var(--magenta); background: var(--bg3); }
936
+ .state-badge.stopped { color: var(--dim); background: var(--bg3); }
937
+
938
+ /* 队列数列 */
939
+ .ag-queue-num { color: var(--orange); font-weight: 600; font-variant-numeric: tabular-nums; }
940
+ .ag-queue-empty { color: var(--dim); }
941
+
942
+ /* 子标签栏 */
943
+ .ag-subtabs {
944
+ display: inline-flex;
945
+ align-items: center;
946
+ gap: 3px;
947
+ padding: 2px;
948
+ border-radius: 6px;
949
+ background: var(--bg3);
950
+ }
951
+ .ag-subtab {
952
+ background: transparent;
953
+ border: none;
954
+ border-radius: 4px;
955
+ padding: 4px 11px;
956
+ font-size: 12px;
957
+ color: var(--dim);
958
+ cursor: pointer;
959
+ font-family: inherit;
960
+ }
961
+ .ag-subtab:hover { color: var(--fg); background: var(--bg2); }
962
+ .ag-subtab.active {
963
+ background: var(--bg2);
964
+ color: var(--accent);
965
+ font-weight: 600;
966
+ }
967
+ .agent-new-btn {
968
+ margin-left: 4px;
969
+ background: transparent;
970
+ color: var(--dim);
971
+ border-color: var(--border);
972
+ }
973
+ .agent-new-btn:hover {
974
+ background: var(--bg3);
975
+ color: var(--accent);
976
+ border-color: var(--accent);
977
+ }
978
+
979
+ /* Agent 配置抽屉 */
980
+ .ag-edit-backdrop {
981
+ position: fixed;
982
+ inset: 0;
983
+ z-index: 220;
984
+ display: flex;
985
+ justify-content: flex-end;
986
+ background: rgba(0,0,0,.38);
987
+ }
988
+ .ag-edit-drawer {
989
+ width: min(620px, 100vw);
990
+ height: 100dvh;
991
+ display: flex;
992
+ flex-direction: column;
993
+ background: var(--bg2);
994
+ color: var(--fg);
995
+ border-left: 1px solid var(--border);
996
+ box-shadow: -14px 0 34px rgba(0,0,0,.22);
997
+ animation: ag-drawer-in .16s ease-out;
998
+ }
999
+ @keyframes ag-drawer-in {
1000
+ from { transform: translateX(20px); opacity: .72; }
1001
+ to { transform: translateX(0); opacity: 1; }
1002
+ }
1003
+ .ag-edit-head {
1004
+ display: flex;
1005
+ align-items: flex-start;
1006
+ justify-content: space-between;
1007
+ gap: 14px;
1008
+ padding: 16px 18px 14px;
1009
+ border-bottom: 1px solid var(--border);
1010
+ flex-shrink: 0;
1011
+ }
1012
+ .ag-edit-title { font-size: 16px; font-weight: 700; color: var(--fg); }
1013
+ .ag-edit-subtitle {
1014
+ display: flex;
1015
+ flex-wrap: wrap;
1016
+ gap: 6px 10px;
1017
+ margin-top: 5px;
1018
+ color: var(--dim);
1019
+ font-size: 12px;
1020
+ }
1021
+ .ag-edit-subtitle code {
1022
+ color: var(--dim);
1023
+ background: var(--bg3);
1024
+ border: 1px solid var(--border);
1025
+ border-radius: 4px;
1026
+ padding: 1px 5px;
1027
+ font-size: 11px;
1028
+ }
1029
+ .ag-edit-subtitle-path {
1030
+ min-width: 0;
1031
+ max-width: 320px;
1032
+ overflow: hidden;
1033
+ text-overflow: ellipsis;
1034
+ white-space: nowrap;
1035
+ color: var(--dim);
1036
+ font-family: ui-monospace, Consolas, monospace;
1037
+ }
1038
+ .ag-edit-close {
1039
+ width: 28px;
1040
+ height: 28px;
1041
+ border: 1px solid var(--border);
1042
+ border-radius: 4px;
1043
+ background: var(--bg3);
1044
+ color: var(--dim);
1045
+ cursor: pointer;
1046
+ font: 18px/1 ui-monospace, Consolas, monospace;
1047
+ }
1048
+ .ag-edit-close:hover { color: var(--fg); border-color: var(--accent); }
1049
+ .ag-edit-body {
1050
+ flex: 1;
1051
+ overflow-y: auto;
1052
+ padding: 0 18px 18px;
1053
+ }
1054
+ .ag-edit-section {
1055
+ padding: 18px 0;
1056
+ border-bottom: 1px solid var(--border);
1057
+ }
1058
+ .ag-edit-section:last-child { border-bottom: none; }
1059
+ .ag-edit-section h3 {
1060
+ font-size: 12px;
1061
+ font-weight: 700;
1062
+ color: var(--dim);
1063
+ margin-bottom: 12px;
1064
+ }
1065
+ .ag-edit-grid {
1066
+ display: grid;
1067
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1068
+ gap: 12px;
1069
+ }
1070
+ .ag-edit-field {
1071
+ display: flex;
1072
+ flex-direction: column;
1073
+ gap: 5px;
1074
+ min-width: 0;
1075
+ margin-bottom: 12px;
1076
+ }
1077
+ .ag-edit-field:last-child { margin-bottom: 0; }
1078
+ .ag-edit-field span {
1079
+ font-size: 12px;
1080
+ color: var(--dim);
1081
+ font-weight: 600;
1082
+ }
1083
+ .ag-edit-field input,
1084
+ .ag-edit-field textarea,
1085
+ .ag-edit-field select {
1086
+ width: 100%;
1087
+ min-width: 0;
1088
+ font-size: 13px;
1089
+ line-height: 1.45;
1090
+ padding: 7px 9px;
1091
+ border: 1px solid var(--border);
1092
+ border-radius: 5px;
1093
+ background: var(--bg);
1094
+ color: var(--fg);
1095
+ font-family: inherit;
1096
+ }
1097
+ .ag-edit-field textarea {
1098
+ resize: vertical;
1099
+ min-height: 58px;
1100
+ font-family: ui-monospace, Consolas, monospace;
1101
+ font-size: 12px;
1102
+ }
1103
+ #ag-edit-owners {
1104
+ height: calc(2 * 1.45em + 16px);
1105
+ min-height: calc(2 * 1.45em + 16px);
1106
+ }
1107
+ .ag-edit-field input:focus,
1108
+ .ag-edit-field textarea:focus,
1109
+ .ag-edit-field select:focus {
1110
+ outline: none;
1111
+ border-color: var(--accent);
1112
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 14%, transparent);
1113
+ }
1114
+ .ag-edit-channel-list {
1115
+ display: flex;
1116
+ flex-direction: column;
1117
+ gap: 7px;
1118
+ }
1119
+ .ag-edit-channel {
1120
+ display: grid;
1121
+ grid-template-columns: minmax(120px, .7fr) minmax(0, 1fr) auto;
1122
+ align-items: center;
1123
+ gap: 8px;
1124
+ padding: 8px 10px;
1125
+ background: var(--bg);
1126
+ border: 1px solid var(--border);
1127
+ border-radius: 5px;
1128
+ min-width: 0;
1129
+ }
1130
+ .ag-edit-channel-main {
1131
+ display: flex;
1132
+ align-items: baseline;
1133
+ gap: 7px;
1134
+ min-width: 0;
1135
+ }
1136
+ .ag-edit-channel-type {
1137
+ color: var(--accent);
1138
+ font-weight: 700;
1139
+ font-size: 12px;
1140
+ flex-shrink: 0;
1141
+ }
1142
+ .ag-edit-channel-name {
1143
+ min-width: 0;
1144
+ overflow: hidden;
1145
+ text-overflow: ellipsis;
1146
+ white-space: nowrap;
1147
+ color: var(--fg);
1148
+ font-size: 12px;
1149
+ }
1150
+ .ag-edit-channel-owners {
1151
+ min-width: 0;
1152
+ overflow: hidden;
1153
+ text-overflow: ellipsis;
1154
+ white-space: nowrap;
1155
+ font-size: 12px;
1156
+ color: var(--dim);
1157
+ font-family: ui-monospace, Consolas, monospace;
1158
+ }
1159
+ .ag-edit-channel-owner-control {
1160
+ min-width: 0;
1161
+ }
1162
+ .ag-edit-channel-owners-value {
1163
+ display: block;
1164
+ width: 100%;
1165
+ min-width: 0;
1166
+ overflow: hidden;
1167
+ text-overflow: ellipsis;
1168
+ white-space: nowrap;
1169
+ padding: 0;
1170
+ border: 0;
1171
+ background: transparent;
1172
+ color: var(--dim);
1173
+ font: 12px/1.45 ui-monospace, Consolas, monospace;
1174
+ text-align: left;
1175
+ cursor: text;
1176
+ }
1177
+ .ag-edit-channel-owners-value:hover {
1178
+ color: var(--fg);
1179
+ }
1180
+ .ag-edit-channel-owners-input {
1181
+ display: none;
1182
+ width: 100%;
1183
+ min-width: 0;
1184
+ height: 31px;
1185
+ font-size: 12px;
1186
+ line-height: 1.35;
1187
+ padding: 6px 8px;
1188
+ border: 1px solid var(--border);
1189
+ border-radius: 5px;
1190
+ background: var(--bg2);
1191
+ color: var(--fg);
1192
+ font-family: ui-monospace, Consolas, monospace;
1193
+ }
1194
+ .ag-edit-channel-owner-control.editing {
1195
+ display: block;
1196
+ }
1197
+ .ag-edit-channel-owner-control.editing .ag-edit-channel-owners-value {
1198
+ display: none;
1199
+ }
1200
+ .ag-edit-channel-owner-control.editing .ag-edit-channel-owners-input {
1201
+ display: block;
1202
+ }
1203
+ .ag-edit-channel-owners-input:focus {
1204
+ outline: none;
1205
+ border-color: var(--accent);
1206
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 14%, transparent);
1207
+ }
1208
+ .ag-edit-channel-status {
1209
+ justify-self: end;
1210
+ min-width: 38px;
1211
+ padding: 1px 6px;
1212
+ border-radius: 4px;
1213
+ background: var(--bg3);
1214
+ color: var(--dim);
1215
+ font-size: 11px;
1216
+ text-align: center;
1217
+ white-space: nowrap;
1218
+ }
1219
+ .ag-edit-channel-status.active { color: var(--green); }
1220
+ .ag-edit-channel-status.disabled { color: var(--dim); }
1221
+ .ag-edit-channel-status.inactive { color: var(--red); }
1222
+ @media (max-width: 560px) {
1223
+ .ag-edit-channel {
1224
+ grid-template-columns: minmax(0, 1fr) auto;
1225
+ }
1226
+ .ag-edit-channel-main,
1227
+ .ag-edit-channel-owners,
1228
+ .ag-edit-channel-owner-control,
1229
+ .ag-edit-channel-owners-input {
1230
+ grid-column: 1 / -1;
1231
+ }
1232
+ }
1233
+ .ag-edit-empty {
1234
+ padding: 10px 0;
1235
+ color: var(--dim);
1236
+ font-size: 12px;
1237
+ }
1238
+ .ag-edit-cap-list {
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ gap: 7px;
1242
+ }
1243
+ .ag-edit-cap-details {
1244
+ background: var(--bg);
1245
+ border: 1px solid var(--border);
1246
+ border-radius: 5px;
1247
+ overflow: hidden;
1248
+ }
1249
+ .ag-edit-cap-row {
1250
+ display: grid;
1251
+ grid-template-columns: auto minmax(72px, auto) minmax(92px, auto) minmax(72px, 1fr) auto;
1252
+ align-items: center;
1253
+ gap: 8px;
1254
+ padding: 8px 10px;
1255
+ min-width: 0;
1256
+ cursor: pointer;
1257
+ list-style: none;
1258
+ }
1259
+ .ag-edit-cap-row::-webkit-details-marker { display: none; }
1260
+ .ag-edit-cap-row::before {
1261
+ content: '›';
1262
+ color: var(--dim);
1263
+ transform: rotate(0deg);
1264
+ transition: transform .15s ease;
1265
+ }
1266
+ .ag-edit-cap-details[open] .ag-edit-cap-row::before {
1267
+ transform: rotate(90deg);
1268
+ }
1269
+ .ag-edit-cap-type {
1270
+ color: var(--accent);
1271
+ font-weight: 700;
1272
+ font-size: 12px;
1273
+ }
1274
+ .ag-edit-cap-mode,
1275
+ .ag-edit-cap-overrides {
1276
+ overflow: hidden;
1277
+ text-overflow: ellipsis;
1278
+ white-space: nowrap;
1279
+ color: var(--dim);
1280
+ font-size: 12px;
1281
+ }
1282
+ .ag-edit-cap-state {
1283
+ justify-self: end;
1284
+ min-width: 48px;
1285
+ padding: 1px 6px;
1286
+ border-radius: 4px;
1287
+ background: var(--bg3);
1288
+ color: var(--dim);
1289
+ font-size: 11px;
1290
+ text-align: center;
1291
+ white-space: nowrap;
1292
+ }
1293
+ .ag-edit-cap-state.ok { color: var(--green); }
1294
+ .ag-edit-cap-state.off { color: var(--red); }
1295
+ .ag-edit-cap-empty {
1296
+ padding: 10px 0;
1297
+ color: var(--dim);
1298
+ font-size: 12px;
1299
+ }
1300
+ .ag-edit-cap-items {
1301
+ border-top: 1px solid var(--border);
1302
+ padding: 8px 10px 10px;
1303
+ background: color-mix(in srgb, var(--bg) 72%, var(--bg2));
1304
+ }
1305
+ .ag-edit-cap-items .ag-edit-cap-empty {
1306
+ padding: 4px 0;
1307
+ }
1308
+ .ag-edit-cap-items-list {
1309
+ display: flex;
1310
+ flex-direction: column;
1311
+ gap: 7px;
1312
+ }
1313
+ .ag-edit-cap-item {
1314
+ min-width: 0;
1315
+ padding: 7px 8px;
1316
+ border: 1px solid var(--border);
1317
+ border-radius: 4px;
1318
+ background: var(--bg2);
1319
+ }
1320
+ .ag-edit-cap-item-main {
1321
+ display: flex;
1322
+ align-items: center;
1323
+ justify-content: space-between;
1324
+ gap: 8px;
1325
+ min-width: 0;
1326
+ }
1327
+ .ag-edit-cap-item-name {
1328
+ min-width: 0;
1329
+ overflow: hidden;
1330
+ text-overflow: ellipsis;
1331
+ white-space: nowrap;
1332
+ color: var(--fg);
1333
+ font-size: 12px;
1334
+ font-weight: 600;
1335
+ }
1336
+ .ag-edit-cap-item-state {
1337
+ flex-shrink: 0;
1338
+ padding: 1px 6px;
1339
+ border-radius: 4px;
1340
+ background: var(--bg3);
1341
+ color: var(--dim);
1342
+ font-size: 11px;
1343
+ white-space: nowrap;
1344
+ }
1345
+ .ag-edit-cap-item-state.ok { color: var(--green); }
1346
+ .ag-edit-cap-item-state.off { color: var(--red); }
1347
+ .ag-edit-cap-item-state.inherit { color: var(--dim); }
1348
+ .ag-edit-cap-item-meta,
1349
+ .ag-edit-cap-item-desc {
1350
+ margin-top: 4px;
1351
+ color: var(--dim);
1352
+ font-size: 11px;
1353
+ line-height: 1.45;
1354
+ overflow-wrap: anywhere;
1355
+ }
1356
+ @media (max-width: 560px) {
1357
+ .ag-edit-cap-row {
1358
+ grid-template-columns: auto minmax(64px, auto) minmax(0, 1fr) auto;
1359
+ }
1360
+ .ag-edit-cap-overrides {
1361
+ grid-column: 3 / 4;
1362
+ }
1363
+ .ag-edit-cap-state {
1364
+ grid-column: 4 / 5;
1365
+ grid-row: 1 / 3;
1366
+ }
1367
+ }
1368
+ .ag-edit-section-json summary {
1369
+ cursor: pointer;
1370
+ color: var(--dim);
1371
+ font-weight: 700;
1372
+ font-size: 12px;
1373
+ }
1374
+ .ag-edit-json {
1375
+ margin-top: 10px;
1376
+ width: 100%;
1377
+ min-height: 180px;
1378
+ max-height: 70dvh;
1379
+ resize: vertical;
1380
+ overflow: auto;
1381
+ padding: 12px;
1382
+ background: var(--bg);
1383
+ border: 1px solid var(--border);
1384
+ border-radius: 5px;
1385
+ color: var(--fg);
1386
+ font-size: 11px;
1387
+ line-height: 1.5;
1388
+ font-family: ui-monospace, Consolas, monospace;
1389
+ white-space: pre-wrap;
1390
+ word-break: break-word;
1391
+ }
1392
+ @media (max-width: 760px) {
1393
+ .ag-edit-grid {
1394
+ grid-template-columns: 1fr;
1395
+ }
1396
+ .ag-edit-subtitle-path { max-width: 100%; }
1397
+ }
1398
+ .ag-edit-actions {
1399
+ display: flex;
1400
+ justify-content: flex-end;
1401
+ gap: 8px;
1402
+ padding: 12px 18px;
1403
+ border-top: 1px solid var(--border);
1404
+ background: var(--bg2);
1405
+ flex-shrink: 0;
1406
+ }
1407
+ .ag-edit-actions .ctrl-btn {
1408
+ min-height: 28px;
1409
+ padding: 5px 12px;
1410
+ font-size: 12px;
1411
+ }
1412
+ .ag-create-form {
1413
+ flex: 1;
1414
+ display: flex;
1415
+ flex-direction: column;
1416
+ min-height: 0;
1417
+ }
1418
+ .ag-create-form .ag-edit-body { flex: 1; }
1419
+ .ag-create-grid .ag-edit-field-wide { grid-column: 1 / -1; }
1420
+ @media (max-width: 760px) {
1421
+ .ag-create-grid .ag-edit-field-wide { grid-column: auto; }
1422
+ }
1423
+
1424
+ /* 操作按钮:实心立体风 */
1425
+ .ops-stop { background: var(--red) !important; color: #fff !important; border: none !important; box-shadow: 0 2px 4px rgba(229,62,62,.3); }
1426
+ .ops-stop:hover { opacity: 0.85; }
1427
+ .ops-interrupt { background: var(--orange) !important; color: #fff !important; border: none !important; box-shadow: 0 2px 4px rgba(221,107,32,.3); }
1428
+ .ops-interrupt:hover { opacity: 0.85; }
1429
+ .ops-start { background: var(--green) !important; color: #fff !important; border: none !important; box-shadow: 0 2px 4px rgba(56,161,105,.3); }
1430
+ .ops-start:hover { opacity: 0.85; }
1431
+ .ops-clear-queue { background: var(--orange) !important; color: #fff !important; border: none !important; box-shadow: 0 2px 4px rgba(221,107,32,.3); }
1432
+ .ops-clear-queue:hover { opacity: 0.85; }
1433
+ .ops-enable { background: var(--green) !important; color: #fff !important; border: none !important; box-shadow: 0 2px 4px rgba(56,161,105,.3); }
1434
+ .ops-enable:hover { opacity: 0.85; }
1435
+ .ops-mute { background: var(--magenta) !important; color: #fff !important; border: none !important; }
1436
+ .ops-unmute { background: var(--green) !important; color: #fff !important; border: none !important; }
1437
+
1438
+ /* 信息行:最近消息(进绿/出蓝,对端橙)+ 项目路径 */
1439
+ .ag-info { display: flex; flex-direction: column; gap: 2px; }
1440
+ .ag-msg-wrap { position: relative; }
1441
+ .ag-msg { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 70vw; }
1442
+ .ag-msg .arrow-in { color: var(--msg-in); font-weight: 700; }
1443
+ .ag-msg .arrow-out { color: var(--msg-out); font-weight: 700; }
1444
+ .ag-msg .peer { color: var(--orange); font-weight: 600; }
1445
+ .ag-msg .text-in { color: var(--msg-in); font-weight: 500; }
1446
+ .ag-msg .text-out { color: var(--msg-out); font-weight: 500; }
1447
+ .ag-msg .mtag { display: inline-block; padding: 0 4px; margin: 0 2px; border-radius: 3px; font-size: 10px; background: var(--bg3); color: var(--magenta); vertical-align: middle; }
1448
+ .ag-msg .mtag-reply { color: var(--green); font-weight: 700; }
1449
+ .ag-msg .mtags { color: var(--magenta); font-size: 10.5px; }
1450
+ .ag-path { font-family: ui-monospace, Consolas, monospace; font-size: 10.5px; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 70vw; }
1451
+
1452
+ /* 消息 tooltip(JS 定位的单例浮层)*/
1453
+ .msg-tip-src { display: none; }
1454
+ .msg-tip { display: none; position: fixed; top: 0; left: 0; z-index: 200; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 8px 12px; min-width: 300px; max-width: 600px; white-space: normal; }
1455
+ .msg-tip.show { display: block; }
1456
+ .tip-row { font-size: 12px; line-height: 1.6; font-weight: 500; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-word; }
1457
+ .tip-row-in { color: var(--msg-in); }
1458
+ .tip-row-out { color: var(--msg-out); }
1459
+ .tip-time { margin-right: 4px; color: var(--dim); font-size: 10.5px; font-variant-numeric: tabular-nums; }
1460
+ .tip-kind { margin: 0 2px; font-weight: 600; }
1461
+ .tip-kind-reply { color: var(--green); font-weight: 700; }
1462
+ .tip-flag { margin: 0 2px; padding: 0 4px; border-radius: 3px; background: var(--bg3); color: var(--magenta); font-size: 10.5px; }
1463
+ .tip-row b { color: var(--orange); font-weight: 600; }
1464
+
1465
+
1466
+ /* ── System 页 ── */
1467
+ .sys-wrap { padding: 12px; overflow-y: auto; height: 100%; }
1468
+ .sys-actions { display: flex; gap: 8px; flex-wrap: wrap; }
1469
+ .sys-content { min-width: 0; }
1470
+ .sys-content .mon-layout { padding: 0; min-height: 0; }
1471
+ .sys-health { display: flex; flex-direction: column; gap: 8px; }
1472
+ .sys-health-summary { margin-bottom: 8px; }
1473
+ .daemon-line { display: flex; align-items: center; gap: 6px; min-width: 0; color: var(--fg); font-size: 13px; line-height: 1.35; }
1474
+ .daemon-aid { display: block; color: var(--dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; line-height: 1.35; font-weight: 400; }
1475
+ .daemon-card .dot { margin-right: 0; }
1476
+ .card-label { font-size: 11px; color: var(--dim); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 4px; }
1477
+ .card-val { font-size: 13px; color: var(--fg); }
1478
+
1479
+ /* EvolAgent 实例健康卡片网格 */
1480
+ .agent-health-grid {
1481
+ display: grid;
1482
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1483
+ gap: 10px;
1484
+ }
1485
+ .agent-health-card {
1486
+ background: var(--bg2);
1487
+ border: 1px solid var(--border);
1488
+ border-radius: 8px;
1489
+ padding: 12px 14px;
1490
+ }
1491
+ .ahc-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; }
1492
+ .ahc-aid { font-weight: 600; font-size: 13px; color: var(--fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1493
+ .ahc-status { margin-left: auto; font-size: 11px; color: var(--dim); }
1494
+ .ahc-row { display: flex; gap: 8px; font-size: 12px; margin: 3px 0; }
1495
+ .ahc-k { color: var(--dim); width: 32px; flex-shrink: 0; }
1496
+ .ahc-v { color: var(--fg); flex: 1; min-width: 0; }
1497
+ .ahc-path { font-family: var(--mono, ui-monospace, monospace); color: var(--dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1498
+ .ch-row { line-height: 1.6; }
1499
+ .ahc-err { margin-top: 6px; font-size: 12px; color: var(--red); white-space: normal; word-break: break-word; }
1500
+
1501
+ /* ── Triggers 页 ── */
1502
+ .trig-layout { display: flex; height: 100%; overflow: hidden; }
1503
+ .trig-agents-col { width: 200px; border-right: 1px solid var(--border); flex-shrink: 0; overflow-y: auto; transition: width .16s ease; }
1504
+ .trig-agents-col.collapsed { width: 34px; overflow: hidden; }
1505
+ .trig-title { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
1506
+ .trig-agents-col.collapsed .trig-title { justify-content: center; padding-left: 4px; padding-right: 4px; }
1507
+ .trig-agents-col.collapsed .trig-title span { display: none; }
1508
+ .trig-collapse-btn {
1509
+ width: 18px; height: 18px; border: none; border-radius: 4px; background: transparent;
1510
+ color: var(--dim); cursor: pointer; font-size: 14px; line-height: 18px; padding: 0;
1511
+ }
1512
+ .trig-collapse-btn:hover { background: var(--bg3); color: var(--fg); }
1513
+ .trig-table-col { flex: 1; overflow: auto; padding: 0; }
1514
+ .trig-table-col table { width: 100%; border-collapse: collapse; font-size: 12px; }
1515
+ .trig-table-col th { position: sticky; top: 0; background: var(--bg); padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border); color: var(--dim); font-weight: 500; white-space: nowrap; }
1516
+ .trig-table-col td { padding: 6px 10px; border-bottom: 1px solid var(--border); vertical-align: top; white-space: nowrap; }
1517
+ .trig-table-col tr:hover td { background: var(--bg2); }
1518
+ .trig-table-col th:first-child,
1519
+ .trig-table-col td:first-child { position: sticky; left: 0; background: var(--bg); z-index: 1; max-width: 140px; overflow: hidden; text-overflow: ellipsis; }
1520
+ .trig-table-col th:first-child { z-index: 3; }
1521
+ .trig-table-col tr:hover td:first-child { background: var(--bg2); }
1522
+ .trig-table-col .trig-ops-col {
1523
+ position: sticky;
1524
+ right: 0;
1525
+ z-index: 2;
1526
+ min-width: 112px;
1527
+ background: var(--bg);
1528
+ box-shadow: -1px 0 0 var(--border);
1529
+ }
1530
+ .trig-table-col th.trig-ops-col { z-index: 4; }
1531
+ .trig-table-col td.trig-ops-col:has(.ops-more.open) { z-index: 5; }
1532
+ .trig-table-col tr:hover td.trig-ops-col { background: var(--bg2); }
1533
+ .trig-table-col .trig-prompt { max-width: 240px; overflow: hidden; text-overflow: ellipsis; }
1534
+ .trig-table-col tr.trig-disabled td:not(:last-child) { color: var(--dim); }
1535
+ .trig-table-col tr.trig-disabled td:last-child { color: var(--fg); }
1536
+ .trig-badge { display: inline-block; padding: 1px 7px; border-radius: 9px; font-size: 11px; border: 1px solid transparent; white-space: nowrap; }
1537
+ .trig-badge-active { color: var(--green, #3fb950); border-color: var(--green, #3fb950); }
1538
+ .trig-badge-disabled { color: var(--dim); border-color: var(--border); }
1539
+ .trig-badge-fired { color: var(--dim); border-color: var(--border); }
1540
+ .trig-badge-cancelled { color: var(--red); border-color: var(--red); }
1541
+ .trig-badge-expired { color: var(--dim); border-color: var(--border); }
1542
+ .trig-sub { display: inline-block; padding: 1px 7px; border-radius: 9px; font-size: 11px; border: 1px solid var(--border); white-space: nowrap; }
1543
+ .trig-sub.ok { color: var(--green, #3fb950); border-color: var(--green, #3fb950); }
1544
+ .trig-sub.warn { color: var(--orange); border-color: var(--orange); }
1545
+ .trig-sub.err { color: var(--red); border-color: var(--red); }
1546
+ .trig-sub.muted { color: var(--dim); }
1547
+ .trig-ops {
1548
+ display: inline-flex;
1549
+ align-items: center;
1550
+ gap: 5px;
1551
+ min-width: max-content;
1552
+ }
1553
+ .trig-ops .ctrl-btn {
1554
+ min-height: 22px;
1555
+ padding: 2px 8px;
1556
+ white-space: nowrap;
1557
+ }
1558
+ .trig-ops-busy {
1559
+ color: var(--dim);
1560
+ font-size: 11px;
1561
+ }
1562
+ .trig-edit-load-error {
1563
+ max-width: 240px;
1564
+ color: var(--red);
1565
+ font-size: 11px;
1566
+ line-height: 1.3;
1567
+ white-space: normal;
1568
+ word-break: break-word;
1569
+ }
1570
+ .ops-run { color: var(--accent) !important; border-color: var(--accent) !important; }
1571
+ .ops-disable { color: var(--orange) !important; border-color: var(--orange) !important; }
1572
+ .ops-delete { color: var(--red) !important; border-color: var(--red) !important; }
1573
+ .trig-edit-drawer {
1574
+ width: min(680px, 100vw);
1575
+ }
1576
+ .trig-history-drawer {
1577
+ width: min(980px, 100vw);
1578
+ }
1579
+ .trig-history-content {
1580
+ display: grid;
1581
+ grid-template-columns: 300px minmax(0, 1fr);
1582
+ min-height: 0;
1583
+ flex: 1;
1584
+ overflow: hidden;
1585
+ }
1586
+ .trig-history-list-pane {
1587
+ min-width: 0;
1588
+ overflow-y: auto;
1589
+ border-right: 1px solid var(--border);
1590
+ background: var(--bg);
1591
+ }
1592
+ .trig-history-pane-title {
1593
+ position: sticky;
1594
+ top: 0;
1595
+ z-index: 1;
1596
+ padding: 10px 12px;
1597
+ border-bottom: 1px solid var(--border);
1598
+ background: var(--bg2);
1599
+ color: var(--dim);
1600
+ font-size: 11px;
1601
+ font-weight: 700;
1602
+ }
1603
+ .trig-history-list {
1604
+ display: flex;
1605
+ flex-direction: column;
1606
+ }
1607
+ .trig-history-item {
1608
+ width: 100%;
1609
+ min-width: 0;
1610
+ padding: 10px 12px;
1611
+ border: 0;
1612
+ border-bottom: 1px solid var(--border);
1613
+ border-left: 3px solid transparent;
1614
+ background: transparent;
1615
+ color: var(--fg);
1616
+ text-align: left;
1617
+ cursor: pointer;
1618
+ font: inherit;
1619
+ }
1620
+ .trig-history-item:hover { background: var(--bg2); }
1621
+ .trig-history-item.selected {
1622
+ border-left-color: var(--accent);
1623
+ background: var(--bg3);
1624
+ }
1625
+ .trig-history-item-head {
1626
+ display: flex;
1627
+ align-items: center;
1628
+ justify-content: space-between;
1629
+ gap: 8px;
1630
+ color: var(--fg);
1631
+ font-size: 12px;
1632
+ font-variant-numeric: tabular-nums;
1633
+ }
1634
+ .trig-history-item-meta {
1635
+ display: flex;
1636
+ gap: 5px 10px;
1637
+ margin-top: 5px;
1638
+ color: var(--dim);
1639
+ font-size: 10.5px;
1640
+ overflow: hidden;
1641
+ }
1642
+ .trig-history-item-meta span {
1643
+ overflow: hidden;
1644
+ text-overflow: ellipsis;
1645
+ white-space: nowrap;
1646
+ }
1647
+ .trig-history-item-preview {
1648
+ margin-top: 6px;
1649
+ overflow: hidden;
1650
+ color: var(--dim);
1651
+ font-size: 11px;
1652
+ line-height: 1.35;
1653
+ text-overflow: ellipsis;
1654
+ white-space: nowrap;
1655
+ }
1656
+ .trig-run-status {
1657
+ flex-shrink: 0;
1658
+ padding: 1px 6px;
1659
+ border: 1px solid var(--border);
1660
+ border-radius: 4px;
1661
+ color: var(--dim);
1662
+ font-size: 10px;
1663
+ font-weight: 600;
1664
+ white-space: nowrap;
1665
+ }
1666
+ .trig-run-status-completed { color: var(--green); border-color: color-mix(in srgb, var(--green) 55%, var(--border)); }
1667
+ .trig-run-status-degraded,
1668
+ .trig-run-status-noop,
1669
+ .trig-run-status-skipped { color: var(--orange); border-color: color-mix(in srgb, var(--orange) 55%, var(--border)); }
1670
+ .trig-run-status-failed { color: var(--red); border-color: color-mix(in srgb, var(--red) 55%, var(--border)); }
1671
+ .trig-run-status-dry-run { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); }
1672
+ .trig-history-detail {
1673
+ min-width: 0;
1674
+ overflow-y: auto;
1675
+ padding: 16px 18px 24px;
1676
+ background: var(--bg2);
1677
+ }
1678
+ .trig-history-detail-title {
1679
+ display: flex;
1680
+ align-items: center;
1681
+ justify-content: space-between;
1682
+ gap: 12px;
1683
+ margin-bottom: 4px;
1684
+ color: var(--fg);
1685
+ font-size: 15px;
1686
+ font-weight: 700;
1687
+ }
1688
+ .trig-history-section {
1689
+ padding: 14px 0;
1690
+ border-bottom: 1px solid var(--border);
1691
+ }
1692
+ .trig-history-section h3 {
1693
+ margin: 0 0 10px;
1694
+ color: var(--dim);
1695
+ font-size: 11px;
1696
+ font-weight: 700;
1697
+ }
1698
+ .trig-history-summary {
1699
+ display: grid;
1700
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1701
+ gap: 8px 18px;
1702
+ }
1703
+ .trig-history-kv {
1704
+ display: grid;
1705
+ grid-template-columns: 84px minmax(0, 1fr);
1706
+ gap: 10px;
1707
+ margin: 6px 0;
1708
+ color: var(--fg);
1709
+ font-size: 12px;
1710
+ line-height: 1.45;
1711
+ }
1712
+ .trig-history-kv > span,
1713
+ .trig-history-block-label { color: var(--dim); }
1714
+ .trig-history-kv code {
1715
+ overflow-wrap: anywhere;
1716
+ color: var(--fg);
1717
+ font-size: 11px;
1718
+ }
1719
+ .trig-history-object-grid .trig-history-kv {
1720
+ grid-template-columns: minmax(132px, .9fr) minmax(0, 1.1fr);
1721
+ }
1722
+ .trig-history-delivery-grid .trig-history-kv {
1723
+ grid-template-columns: 112px minmax(0, 1fr);
1724
+ }
1725
+ .trig-history-object-grid .trig-history-kv > span {
1726
+ overflow-wrap: anywhere;
1727
+ }
1728
+ .trig-history-object-grid-single {
1729
+ grid-template-columns: 1fr;
1730
+ }
1731
+ .trig-history-highlight-block {
1732
+ margin-top: 12px;
1733
+ padding: 10px 12px;
1734
+ border: 1px solid color-mix(in srgb, var(--yellow) 65%, var(--border));
1735
+ border-radius: 5px;
1736
+ background: color-mix(in srgb, var(--yellow) 7%, var(--bg2));
1737
+ }
1738
+ .trig-history-highlight-title,
1739
+ .trig-history-effect-title {
1740
+ margin-bottom: 8px;
1741
+ color: var(--yellow);
1742
+ font-size: 11px;
1743
+ font-weight: 700;
1744
+ }
1745
+ .trig-history-effect-item + .trig-history-effect-item {
1746
+ margin-top: 12px;
1747
+ padding-top: 12px;
1748
+ border-top: 1px solid color-mix(in srgb, var(--yellow) 40%, var(--border));
1749
+ }
1750
+ .trig-history-highlight-block .trig-history-kv {
1751
+ margin-top: 4px;
1752
+ margin-bottom: 4px;
1753
+ }
1754
+ .trig-history-block { margin-top: 10px; }
1755
+ .trig-history-block-label {
1756
+ margin-bottom: 5px;
1757
+ font-size: 11px;
1758
+ }
1759
+ .trig-history-block pre,
1760
+ .trig-history-raw pre {
1761
+ max-height: 360px;
1762
+ margin: 0;
1763
+ overflow: auto;
1764
+ padding: 10px 11px;
1765
+ border: 1px solid var(--border);
1766
+ border-radius: 5px;
1767
+ background: var(--bg);
1768
+ color: var(--fg);
1769
+ font: 11px/1.5 var(--mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1770
+ white-space: pre-wrap;
1771
+ overflow-wrap: anywhere;
1772
+ }
1773
+ .trig-history-empty,
1774
+ .trig-history-error,
1775
+ .trig-history-detail-empty {
1776
+ padding: 24px 14px;
1777
+ color: var(--dim);
1778
+ font-size: 12px;
1779
+ line-height: 1.5;
1780
+ text-align: center;
1781
+ }
1782
+ .trig-history-error { color: var(--red); }
1783
+ .trig-history-detail-empty {
1784
+ display: grid;
1785
+ min-height: 100%;
1786
+ place-items: center;
1787
+ }
1788
+ .trig-history-raw { margin-top: 16px; }
1789
+ .trig-history-raw summary {
1790
+ cursor: pointer;
1791
+ color: var(--dim);
1792
+ font-size: 11px;
1793
+ font-weight: 700;
1794
+ }
1795
+ .trig-history-raw pre { margin-top: 10px; }
1796
+ .trig-exec-grid {
1797
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1798
+ }
1799
+ .trig-script-path-field {
1800
+ grid-column: span 2;
1801
+ }
1802
+ .trig-script-preview-field {
1803
+ margin-top: 10px;
1804
+ }
1805
+ .trig-script-preview {
1806
+ font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1807
+ resize: vertical;
1808
+ min-height: 160px;
1809
+ white-space: pre;
1810
+ }
1811
+ .trig-filter-box {
1812
+ margin-top: 12px;
1813
+ padding-top: 12px;
1814
+ border-top: 1px solid var(--border);
1815
+ }
1816
+ .trig-filter-head {
1817
+ display: flex;
1818
+ align-items: center;
1819
+ justify-content: space-between;
1820
+ gap: 10px;
1821
+ margin-bottom: 10px;
1822
+ }
1823
+ .trig-filter-head > span {
1824
+ font-size: 12px;
1825
+ color: var(--dim);
1826
+ font-weight: 700;
1827
+ }
1828
+ .trig-filter-actions {
1829
+ display: flex;
1830
+ gap: 6px;
1831
+ }
1832
+ .trig-filter-list {
1833
+ display: flex;
1834
+ flex-direction: column;
1835
+ gap: 8px;
1836
+ }
1837
+ .trig-filter-row {
1838
+ display: grid;
1839
+ grid-template-columns: minmax(160px, 1.4fr) minmax(110px, .8fr) minmax(150px, 1fr) 28px;
1840
+ gap: 8px;
1841
+ align-items: end;
1842
+ }
1843
+ .trig-filter-row .ag-edit-field {
1844
+ margin-bottom: 0;
1845
+ }
1846
+ .trig-filter-remove {
1847
+ min-width: 28px;
1848
+ height: 32px;
1849
+ padding: 0 !important;
1850
+ line-height: 1;
1851
+ }
1852
+ .trig-filter-empty {
1853
+ color: var(--dim);
1854
+ font-size: 12px;
1855
+ padding: 8px 0;
1856
+ }
1857
+ .trig-filter-json {
1858
+ margin-top: 10px;
1859
+ }
1860
+ .trig-filter-json summary {
1861
+ cursor: pointer;
1862
+ color: var(--dim);
1863
+ font-size: 12px;
1864
+ }
1865
+ .trig-filter-json textarea {
1866
+ width: 100%;
1867
+ margin-top: 8px;
1868
+ min-height: 90px;
1869
+ resize: vertical;
1870
+ font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1871
+ font-size: 12px;
1872
+ line-height: 1.45;
1873
+ padding: 7px 9px;
1874
+ border: 1px solid var(--border);
1875
+ border-radius: 5px;
1876
+ background: var(--bg);
1877
+ color: var(--fg);
1878
+ }
1879
+ .trig-limit-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
1880
+ .trig-section-title {
1881
+ display: flex;
1882
+ align-items: center;
1883
+ justify-content: space-between;
1884
+ gap: 12px;
1885
+ margin-bottom: 12px;
1886
+ }
1887
+ .ag-edit-section .trig-section-title h3 { margin-bottom: 0; }
1888
+ .trig-delivery-switch[hidden] { display: none; }
1889
+ .trig-script-feedback {
1890
+ margin-top: 16px;
1891
+ padding-top: 16px;
1892
+ border-top: 1px solid var(--border);
1893
+ }
1894
+ .trig-feedback-templates-title {
1895
+ margin-bottom: 12px;
1896
+ font-size: 12px;
1897
+ font-weight: 700;
1898
+ color: var(--dim);
1899
+ }
1900
+ .trig-feedback-templates {
1901
+ display: grid;
1902
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1903
+ gap: 12px;
1904
+ }
1905
+ .trig-feedback-templates .ag-edit-field { margin-bottom: 0; }
1906
+ .trig-feedback-templates textarea { min-height: 104px; resize: vertical; }
1907
+ .trig-edit-grid .ag-edit-field-wide {
1908
+ grid-column: 1 / -1;
1909
+ }
1910
+ @media (max-width: 760px) {
1911
+ .trig-history-backdrop { justify-content: flex-start; }
1912
+ .trig-history-content {
1913
+ grid-template-columns: 1fr;
1914
+ grid-template-rows: minmax(160px, 38dvh) minmax(0, 1fr);
1915
+ }
1916
+ .trig-history-list-pane {
1917
+ border-right: 0;
1918
+ border-bottom: 1px solid var(--border);
1919
+ }
1920
+ .trig-history-summary { grid-template-columns: 1fr; }
1921
+ .trig-exec-grid,
1922
+ .trig-limit-grid,
1923
+ .trig-feedback-templates {
1924
+ grid-template-columns: 1fr;
1925
+ }
1926
+ .trig-script-path-field {
1927
+ grid-column: auto;
1928
+ }
1929
+ .trig-filter-row {
1930
+ grid-template-columns: 1fr;
1931
+ }
1932
+ .trig-filter-remove {
1933
+ width: 100%;
1934
+ }
1935
+ .trig-edit-grid .ag-edit-field-wide { grid-column: auto; }
1936
+ }
1937
+ /* ── Usage subtabs ── */
1938
+ .usage-subtabs {
1939
+ display: flex; gap: 4px; margin-bottom: 16px;
1940
+ }
1941
+ .usage-subtab {
1942
+ background: var(--bg3); border: 1px solid var(--border); border-radius: 6px;
1943
+ padding: 5px 14px; font-size: 12px; color: var(--dim); cursor: pointer;
1944
+ }
1945
+ .usage-subtab.active {
1946
+ background: var(--accent); color: #fff; border-color: var(--accent);
1947
+ }
1948
+
1949
+ /* ── Explorer time filters (类似总览的时间选择) ── */
1950
+ .exp-time-filters {
1951
+ margin-bottom: 16px;
1952
+ padding: 12px;
1953
+ background: var(--bg3);
1954
+ border-radius: 8px;
1955
+ border: 1px solid var(--border);
1956
+ }
1957
+
1958
+ .exp-range-tabs {
1959
+ display: flex;
1960
+ gap: 8px;
1961
+ flex-wrap: wrap;
1962
+ margin-bottom: 8px;
1963
+ }
1964
+
1965
+ .exp-range-btn {
1966
+ padding: 6px 12px;
1967
+ font-size: 12px;
1968
+ border: 1px solid var(--border);
1969
+ background: var(--bg2);
1970
+ color: var(--fg);
1971
+ border-radius: 6px;
1972
+ cursor: pointer;
1973
+ transition: all 0.2s;
1974
+ }
1975
+
1976
+ .exp-range-btn:hover {
1977
+ background: var(--bg3);
1978
+ border-color: var(--accent);
1979
+ }
1980
+
1981
+ .exp-range-btn.active {
1982
+ background: var(--accent);
1983
+ color: white;
1984
+ border-color: var(--accent);
1985
+ }
1986
+
1987
+ .exp-custom-date {
1988
+ display: flex;
1989
+ gap: 12px;
1990
+ align-items: flex-end;
1991
+ flex-wrap: wrap;
1992
+ padding-top: 8px;
1993
+ border-top: 1px solid var(--border);
1994
+ }
1995
+
1996
+ .exp-custom-date label {
1997
+ display: flex;
1998
+ flex-direction: column;
1999
+ gap: 4px;
2000
+ font-size: 12px;
2001
+ color: var(--dim);
2002
+ }
2003
+
2004
+ .exp-custom-date input {
2005
+ padding: 6px 10px;
2006
+ font-size: 12px;
2007
+ border: 1px solid var(--border);
2008
+ border-radius: 4px;
2009
+ background: var(--bg2);
2010
+ color: var(--fg);
2011
+ min-width: 200px;
2012
+ }
2013
+
2014
+ .exp-custom-date button {
2015
+ padding: 6px 16px;
2016
+ background: var(--accent);
2017
+ color: white;
2018
+ border: none;
2019
+ border-radius: 6px;
2020
+ cursor: pointer;
2021
+ font-size: 12px;
2022
+ font-weight: 500;
2023
+ }
2024
+
2025
+ .exp-custom-date button:hover {
2026
+ opacity: 0.9;
2027
+ }
2028
+
2029
+ /* ── Explorer filters (优化后的样式) ── */
2030
+ .explorer-filters {
2031
+ display: flex;
2032
+ gap: 12px;
2033
+ align-items: flex-end;
2034
+ flex-wrap: wrap;
2035
+ margin-bottom: 16px;
2036
+ padding: 12px;
2037
+ background: var(--bg3);
2038
+ border-radius: 8px;
2039
+ border: 1px solid var(--border);
2040
+ }
2041
+
2042
+ .explorer-filters label {
2043
+ display: flex;
2044
+ flex-direction: column;
2045
+ gap: 4px;
2046
+ font-size: 12px;
2047
+ color: var(--dim);
2048
+ min-width: 160px;
2049
+ }
2050
+
2051
+ .explorer-filters label span {
2052
+ font-weight: 500;
2053
+ }
2054
+
2055
+ .explorer-filters input,
2056
+ .explorer-filters select {
2057
+ padding: 6px 10px;
2058
+ font-size: 13px;
2059
+ border: 1px solid var(--border);
2060
+ border-radius: 4px;
2061
+ background: var(--bg2);
2062
+ color: var(--fg);
2063
+ width: 100%;
2064
+ }
2065
+
2066
+ .explorer-filters select {
2067
+ cursor: pointer;
2068
+ }
2069
+
2070
+ .explorer-filters button {
2071
+ padding: 7px 20px;
2072
+ background: var(--accent);
2073
+ color: white;
2074
+ border: none;
2075
+ border-radius: 6px;
2076
+ cursor: pointer;
2077
+ font-size: 13px;
2078
+ font-weight: 500;
2079
+ transition: all 0.2s;
2080
+ }
2081
+
2082
+ .explorer-filters button:hover {
2083
+ opacity: 0.9;
2084
+ transform: translateY(-1px);
2085
+ }
2086
+
2087
+ /* ── Explorer layout (左侧列表 + 右侧详情) ── */
2088
+ .exp-layout { display: flex; flex: 1; overflow: hidden; }
2089
+ .exp-sidebar {
2090
+ width: 220px; border-right: 1px solid var(--border); flex-shrink: 0;
2091
+ overflow-y: auto; background: var(--bg2);
2092
+ }
2093
+ .exp-sidebar-group { padding: 8px 0; }
2094
+ .exp-sidebar-title {
2095
+ font-size: 10px; font-weight: 600; text-transform: uppercase;
2096
+ color: var(--dim); padding: 4px 12px; letter-spacing: 0.5px;
2097
+ }
2098
+ .exp-sidebar-item {
2099
+ padding: 6px 12px; cursor: pointer; border-radius: 4px;
2100
+ margin: 1px 6px; font-size: 12px; display: flex; justify-content: space-between;
2101
+ align-items: center; transition: background 0.1s;
2102
+ }
2103
+ .exp-sidebar-item:hover { background: var(--bg3); }
2104
+ .exp-sidebar-item.active { background: var(--accent); color: #fff; }
2105
+ .exp-sidebar-item .item-name {
2106
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1;
2107
+ }
2108
+ .exp-sidebar-item .item-meta {
2109
+ font-size: 10px; color: var(--dim); margin-left: 6px; flex-shrink: 0;
2110
+ }
2111
+ .exp-sidebar-item.active .item-meta { color: rgba(255,255,255,0.7); }
2112
+ .peer-tag {
2113
+ display: inline-block;
2114
+ padding: 2px 6px;
2115
+ margin-right: 6px;
2116
+ font-size: 10px;
2117
+ border-radius: 4px;
2118
+ font-weight: 600;
2119
+ line-height: 1.2;
2120
+ vertical-align: middle;
2121
+ }
2122
+ .peer-tag-group {
2123
+ background: #e3f2fd;
2124
+ color: #1976d2;
2125
+ border: 1px solid #bbdefb;
2126
+ }
2127
+ .peer-tag-private {
2128
+ background: #f3e5f5;
2129
+ color: #7b1fa2;
2130
+ border: 1px solid #e1bee7;
2131
+ }
2132
+ .peer-tag-count {
2133
+ background: var(--bg3);
2134
+ color: var(--dim);
2135
+ margin-left: 6px;
2136
+ margin-right: 0;
2137
+ border: 1px solid var(--border);
2138
+ }
2139
+ .exp-sidebar-item.active .peer-tag-group {
2140
+ background: rgba(227, 242, 253, 0.3);
2141
+ color: #90caf9;
2142
+ border-color: rgba(255,255,255,0.3);
2143
+ }
2144
+ .exp-sidebar-item.active .peer-tag-private {
2145
+ background: rgba(243, 229, 245, 0.3);
2146
+ color: #ce93d8;
2147
+ border-color: rgba(255,255,255,0.3);
2148
+ }
2149
+ .exp-sidebar-item.active .peer-tag-count {
2150
+ background: rgba(255,255,255,0.2);
2151
+ color: rgba(255,255,255,0.8);
2152
+ border-color: rgba(255,255,255,0.2);
2153
+ }
2154
+ .exp-detail { flex: 1; padding: 16px; overflow-y: auto; }
2155
+ .exp-detail-header {
2156
+ font-size: 14px; font-weight: 600; margin-bottom: 12px; color: var(--fg);
2157
+ }
2158
+
2159
+ /* ── Monitor ─────────────────────────────────── */
2160
+ .mon-layout { padding: 16px; display: flex; flex-direction: column; gap: 14px; min-height: 100%; box-sizing: border-box; }
2161
+ .mon-toolbar { display: flex; align-items: center; gap: 12px; flex-shrink: 0; }
2162
+ .mon-toolbar-label { font-size: 12px; color: var(--dim); font-weight: 500; }
2163
+ .mon-range-tabs { display: flex; gap: 2px; background: var(--bg3); border-radius: 6px; padding: 2px; }
2164
+ .mon-range { padding: 4px 12px; border: none; background: none; border-radius: 5px; font-size: 12px; font-family: inherit; color: var(--dim); cursor: pointer; }
2165
+ .mon-range:hover { color: var(--fg); }
2166
+ .mon-range.active { background: var(--accent); color: #fff; }
2167
+ .mon-row2 { display: flex; gap: 14px; }
2168
+ .mon-chart { flex: 1; height: 250px; min-width: 0; background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 6px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
2169
+ @media (max-width: 900px) {
2170
+ .mon-row2 { flex-direction: column; }
2171
+ .mon-chart { height: 190px; }
2172
+ .mon-toolbar { flex-wrap: wrap; }
2173
+ }
2174
+
2175
+
2176
+ /* ── Gateway 视图 ── */
2177
+ .gw-wrap { padding: 12px 16px; }
2178
+
2179
+ /* 环境变量配置不一致横幅 */
2180
+ .gw-env-mismatch-banner {
2181
+ display: flex;
2182
+ flex-direction: column;
2183
+ gap: 12px;
2184
+ padding: 16px;
2185
+ margin-bottom: 16px;
2186
+ background: linear-gradient(135deg, #fee 0%, #fdd 100%);
2187
+ border: 2px solid #f88;
2188
+ border-radius: 8px;
2189
+ box-shadow: 0 2px 8px rgba(255, 100, 100, 0.15);
2190
+ }
2191
+ [data-theme="dark"] .gw-env-mismatch-banner {
2192
+ background: linear-gradient(135deg, #3a1a1a 0%, #4a1a1a 100%);
2193
+ border-color: #c44;
2194
+ }
2195
+ .gw-env-mismatch-header {
2196
+ display: flex;
2197
+ align-items: flex-start;
2198
+ gap: 12px;
2199
+ }
2200
+ .gw-env-mismatch-icon {
2201
+ font-size: 28px;
2202
+ flex-shrink: 0;
2203
+ }
2204
+ .gw-env-mismatch-content {
2205
+ flex: 1;
2206
+ display: flex;
2207
+ flex-direction: column;
2208
+ gap: 8px;
2209
+ }
2210
+ .gw-env-mismatch-title {
2211
+ font-size: 15px;
2212
+ font-weight: 700;
2213
+ color: #c00;
2214
+ }
2215
+ [data-theme="dark"] .gw-env-mismatch-title {
2216
+ color: #f88;
2217
+ }
2218
+ .gw-env-mismatch-desc {
2219
+ font-size: 13px;
2220
+ color: #800;
2221
+ line-height: 1.5;
2222
+ }
2223
+ [data-theme="dark"] .gw-env-mismatch-desc {
2224
+ color: #daa;
2225
+ }
2226
+ .gw-mismatch-details {
2227
+ display: flex;
2228
+ flex-direction: column;
2229
+ gap: 8px;
2230
+ margin-top: 8px;
2231
+ padding: 12px;
2232
+ background: rgba(255, 255, 255, 0.7);
2233
+ border-radius: 6px;
2234
+ border: 1px solid #faa;
2235
+ }
2236
+ [data-theme="dark"] .gw-mismatch-details {
2237
+ background: rgba(0, 0, 0, 0.3);
2238
+ border-color: #844;
2239
+ }
2240
+ .gw-mismatch-empty-hint {
2241
+ padding: 12px;
2242
+ text-align: center;
2243
+ color: #999;
2244
+ font-size: 12px;
2245
+ font-style: italic;
2246
+ }
2247
+ [data-theme="dark"] .gw-mismatch-empty-hint {
2248
+ color: #666;
2249
+ }
2250
+ .gw-mismatch-item {
2251
+ display: flex;
2252
+ flex-direction: column;
2253
+ gap: 8px;
2254
+ padding: 12px;
2255
+ background: #fff;
2256
+ border-left: 3px solid #f44;
2257
+ border-radius: 4px;
2258
+ font-size: 12px;
2259
+ }
2260
+ [data-theme="dark"] .gw-mismatch-item {
2261
+ background: #2a1a1a;
2262
+ border-color: #f44;
2263
+ }
2264
+ .gw-mismatch-item.gw-mismatch-sensitive {
2265
+ border-left-color: #f90;
2266
+ background: #fffaf0;
2267
+ }
2268
+ [data-theme="dark"] .gw-mismatch-item.gw-mismatch-sensitive {
2269
+ border-left-color: #f90;
2270
+ background: #2a2010;
2271
+ }
2272
+ .gw-mismatch-header-row {
2273
+ display: flex;
2274
+ align-items: center;
2275
+ gap: 8px;
2276
+ padding-bottom: 6px;
2277
+ border-bottom: 1px solid #eee;
2278
+ }
2279
+ [data-theme="dark"] .gw-mismatch-header-row {
2280
+ border-bottom-color: #444;
2281
+ }
2282
+ .gw-mismatch-scope {
2283
+ font-weight: 700;
2284
+ font-size: 13px;
2285
+ color: #c00;
2286
+ }
2287
+ [data-theme="dark"] .gw-mismatch-scope {
2288
+ color: #f88;
2289
+ }
2290
+ .gw-mismatch-field {
2291
+ font-family: monospace;
2292
+ font-size: 11px;
2293
+ color: #666;
2294
+ background: #f5f5f5;
2295
+ padding: 3px 8px;
2296
+ border-radius: 3px;
2297
+ }
2298
+ [data-theme="dark"] .gw-mismatch-field {
2299
+ color: #aaa;
2300
+ background: #1a1a1a;
2301
+ }
2302
+ .gw-mismatch-info {
2303
+ display: flex;
2304
+ flex-direction: column;
2305
+ gap: 6px;
2306
+ }
2307
+ .gw-info-row {
2308
+ display: flex;
2309
+ align-items: baseline;
2310
+ gap: 8px;
2311
+ font-size: 12px;
2312
+ }
2313
+ .gw-info-label {
2314
+ flex-shrink: 0;
2315
+ width: 100px;
2316
+ color: #666;
2317
+ font-weight: 500;
2318
+ }
2319
+ [data-theme="dark"] .gw-info-label {
2320
+ color: #aaa;
2321
+ }
2322
+ .gw-info-value {
2323
+ flex: 1;
2324
+ word-break: break-all;
2325
+ }
2326
+ .gw-info-value code,
2327
+ .gw-info-value.gw-value-config {
2328
+ background: #f8f8f8;
2329
+ padding: 2px 6px;
2330
+ border-radius: 3px;
2331
+ font-size: 11px;
2332
+ font-family: monospace;
2333
+ color: #333;
2334
+ }
2335
+ [data-theme="dark"] .gw-info-value code,
2336
+ [data-theme="dark"] .gw-info-value.gw-value-config {
2337
+ background: #2a2a2a;
2338
+ color: #ddd;
2339
+ }
2340
+ .gw-value-env {
2341
+ color: #080;
2342
+ font-weight: 600;
2343
+ font-family: monospace;
2344
+ }
2345
+ [data-theme="dark"] .gw-value-env {
2346
+ color: #6d6;
2347
+ }
2348
+ .gw-value-file {
2349
+ font-family: monospace;
2350
+ }
2351
+ .gw-value-diff {
2352
+ color: #c60;
2353
+ text-decoration: line-through;
2354
+ opacity: 0.7;
2355
+ }
2356
+ [data-theme="dark"] .gw-value-diff {
2357
+ color: #f90;
2358
+ }
2359
+ .gw-info-hint {
2360
+ margin-top: 6px;
2361
+ padding: 6px 10px;
2362
+ background: #f0f8ff;
2363
+ border-left: 3px solid #4a90e2;
2364
+ border-radius: 3px;
2365
+ font-size: 11px;
2366
+ color: #555;
2367
+ line-height: 1.5;
2368
+ }
2369
+ [data-theme="dark"] .gw-info-hint {
2370
+ background: #1a2a3a;
2371
+ border-color: #58a6ff;
2372
+ color: #bbb;
2373
+ }
2374
+ .gw-mismatch-empty {
2375
+ color: #f00;
2376
+ font-weight: 600;
2377
+ }
2378
+ .gw-env-mismatch-help {
2379
+ padding: 10px 12px;
2380
+ background: rgba(255, 255, 255, 0.8);
2381
+ border-radius: 6px;
2382
+ font-size: 12px;
2383
+ line-height: 1.6;
2384
+ color: #555;
2385
+ border-left: 3px solid #4a90e2;
2386
+ }
2387
+ [data-theme="dark"] .gw-env-mismatch-help {
2388
+ background: rgba(0, 0, 0, 0.3);
2389
+ color: #bbb;
2390
+ border-color: #58a6ff;
2391
+ }
2392
+ .gw-env-mismatch-help code {
2393
+ background: #e8f4ff;
2394
+ padding: 2px 5px;
2395
+ border-radius: 3px;
2396
+ color: #0066cc;
2397
+ font-size: 11px;
2398
+ }
2399
+ [data-theme="dark"] .gw-env-mismatch-help code {
2400
+ background: #1a2a3a;
2401
+ color: #58a6ff;
2402
+ }
2403
+ .gw-env-mismatch-actions {
2404
+ display: flex;
2405
+ gap: 8px;
2406
+ align-items: center;
2407
+ justify-content: flex-end;
2408
+ padding-top: 8px;
2409
+ border-top: 1px solid rgba(200, 0, 0, 0.2);
2410
+ }
2411
+ [data-theme="dark"] .gw-env-mismatch-actions {
2412
+ border-top-color: rgba(200, 68, 68, 0.3);
2413
+ }
2414
+ .gw-env-mismatch-actions .ctrl-btn {
2415
+ padding: 6px 12px;
2416
+ font-size: 12px;
2417
+ white-space: nowrap;
2418
+ background: #fff;
2419
+ border: 1px solid #c44;
2420
+ color: #c00;
2421
+ }
2422
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn {
2423
+ background: #2a1a1a;
2424
+ border-color: #c44;
2425
+ color: #f88;
2426
+ }
2427
+ .gw-env-mismatch-actions .ctrl-btn:hover {
2428
+ background: #c00;
2429
+ color: #fff;
2430
+ border-color: #c00;
2431
+ }
2432
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn:hover {
2433
+ background: #c44;
2434
+ color: #fff;
2435
+ border-color: #c44;
2436
+ }
2437
+ .gw-dismiss-banner {
2438
+ background: transparent !important;
2439
+ border: none !important;
2440
+ font-size: 20px !important;
2441
+ padding: 4px 8px !important;
2442
+ color: #800 !important;
2443
+ cursor: pointer;
2444
+ }
2445
+ [data-theme="dark"] .gw-dismiss-banner {
2446
+ color: #daa !important;
2447
+ }
2448
+ .gw-dismiss-banner:hover {
2449
+ background: rgba(0,0,0,0.1) !important;
2450
+ color: #c00 !important;
2451
+ }
2452
+
2453
+ /* Agent 选择模态框 */
2454
+ .gw-agent-select-list {
2455
+ display: flex;
2456
+ flex-direction: column;
2457
+ gap: 8px;
2458
+ max-height: 400px;
2459
+ overflow-y: auto;
2460
+ padding: 8px;
2461
+ background: var(--bg);
2462
+ border: 1px solid var(--border);
2463
+ border-radius: 6px;
2464
+ }
2465
+ .gw-agent-select-item {
2466
+ display: flex;
2467
+ align-items: center;
2468
+ gap: 10px;
2469
+ padding: 10px 12px;
2470
+ background: var(--bg2);
2471
+ border: 1px solid var(--border);
2472
+ border-radius: 5px;
2473
+ cursor: pointer;
2474
+ transition: all 0.15s ease;
2475
+ }
2476
+ .gw-agent-select-item:hover {
2477
+ background: var(--bg3);
2478
+ border-color: var(--accent);
2479
+ }
2480
+ .gw-agent-checkbox {
2481
+ flex-shrink: 0;
2482
+ cursor: pointer;
2483
+ }
2484
+ .gw-agent-label {
2485
+ font-size: 13px;
2486
+ font-weight: 600;
2487
+ color: var(--fg);
2488
+ min-width: 80px;
2489
+ }
2490
+ .gw-agent-aid {
2491
+ font-size: 11px;
2492
+ color: var(--dim);
2493
+ font-family: monospace;
2494
+ overflow: hidden;
2495
+ text-overflow: ellipsis;
2496
+ white-space: nowrap;
2497
+ }
2498
+
2499
+ .gw-intro { font-size: 12px; color: var(--dim); line-height: 1.6; margin-bottom: 16px; padding: 8px 12px; background: var(--bg3); border-radius: 5px; border: 1px solid var(--border); }
2500
+ .gw-intro code { background: var(--bg); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 11px; }
2501
+ .gw-scope { margin-bottom: 20px; }
2502
+ .gw-scope-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
2503
+ .gw-scope-title { font-size: 14px; font-weight: 700; color: var(--fg); }
2504
+ .gw-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
2505
+ .gw-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 12px; display: flex; flex-direction: column; }
2506
+ .gw-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; }
2507
+ .gw-card-icon { font-size: 16px; }
2508
+ .gw-card-title { font-weight: 700; font-size: 13px; color: var(--fg); }
2509
+ .gw-card-type { font-size: 10px; color: var(--dim); background: var(--bg3); padding: 1px 6px; border-radius: 8px; margin-left: auto; }
2510
+ .gw-card-body { display: flex; flex-direction: column; gap: 5px; margin-bottom: 10px; }
2511
+ .gw-row { display: flex; align-items: baseline; gap: 8px; font-size: 12px; }
2512
+ .gw-row-label { flex-shrink: 0; width: 72px; color: var(--dim); }
2513
+ .gw-row-val { flex: 1; color: var(--fg); word-break: break-all; }
2514
+ .gw-model-effort { color: var(--dim); white-space: nowrap; }
2515
+ .gw-dim { color: var(--dim); font-style: italic; }
2516
+ .gw-env { background: var(--bg3); padding: 1px 5px; border-radius: 3px; color: var(--green); font-size: 11px; }
2517
+ .gw-card-actions { display: flex; gap: 5px; margin-top: auto; padding-top: 8px; border-top: 1px solid var(--border); }
2518
+ .gw-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
2519
+ .gw-dot-ok { background: var(--green); }
2520
+ .gw-dot-err { background: var(--red); }
2521
+ .gw-dot-unknown { background: var(--dim); opacity: .4; }
2522
+ .ctrl-btn.primary { color: #fff; background: var(--accent); border-color: var(--accent); }
2523
+ .ctrl-btn.primary:hover { opacity: .9; }
2524
+
2525
+ /* Gateway 编辑弹窗 */
2526
+ .gw-modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; z-index: 200; }
2527
+ .gw-modal { background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; width: 440px; max-width: 92vw; max-height: 88vh; overflow-y: auto; box-shadow: 0 8px 32px rgba(0,0,0,.3); }
2528
+ .gw-modal-head { font-size: 15px; font-weight: 700; padding: 14px 18px; border-bottom: 1px solid var(--border); color: var(--fg); }
2529
+ .gw-modal-body { padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
2530
+ .gw-field { display: flex; flex-direction: column; gap: 4px; }
2531
+ .gw-field-label { font-size: 12px; color: var(--dim); font-weight: 500; }
2532
+ .gw-field input, .gw-field select { font-size: 13px; padding: 6px 9px; border: 1px solid var(--border); border-radius: 4px; background: var(--bg); color: var(--fg); font-family: inherit; }
2533
+ .gw-field input:focus, .gw-field select:focus { outline: none; border-color: var(--accent); }
2534
+ .gw-field input:disabled { opacity: .55; cursor: not-allowed; }
2535
+ .gw-hint { font-size: 11px; color: var(--dim); line-height: 1.5; }
2536
+ .gw-hint code { background: var(--bg3); padding: 1px 4px; border-radius: 3px; color: var(--accent); }
2537
+ .gw-modal-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--border); }
2538
+
2539
+ /* Event Trigger 测试执行 */
2540
+ .trig-test-modal { width: 620px; }
2541
+ .trig-test-meta { display: flex; align-items: flex-start; gap: 10px; font-size: 12px; color: var(--dim); }
2542
+ .trig-test-meta > span { flex: 0 0 92px; padding-top: 2px; }
2543
+ .trig-test-meta code,
2544
+ .trig-test-meta pre { flex: 1; min-width: 0; margin: 0; padding: 3px 7px; border-radius: 4px; background: var(--bg3); color: var(--fg); font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
2545
+ .trig-test-payload { width: 100%; box-sizing: border-box; resize: vertical; padding: 9px 10px; border: 1px solid var(--border); border-radius: 4px; background: var(--bg); color: var(--fg); font: 12px/1.55 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
2546
+ .trig-test-payload:focus { outline: none; border-color: var(--accent); }
2547
+ .trig-test-error { padding: 7px 9px; border: 1px solid color-mix(in srgb, var(--red) 35%, var(--border)); border-radius: 4px; background: color-mix(in srgb, var(--red) 8%, transparent); color: var(--red); font-size: 12px; }
2548
+
2549
+ /* Gateway Effective 视图 */
2550
+ .gw-effective-section { margin-top: 24px; padding-top: 16px; border-top: 2px solid var(--border); }
2551
+ .gw-eff-agent { margin-bottom: 16px; }
2552
+ .gw-eff-agent-head { font-size: 13px; font-weight: 700; color: var(--fg); margin-bottom: 8px; }
2553
+ .gw-eff-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
2554
+ .gw-eff-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; }
2555
+ .gw-eff-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
2556
+ .gw-eff-card-body { display: flex; flex-direction: column; gap: 4px; }
2557
+ .gw-eff-row { display: flex; align-items: baseline; gap: 6px; font-size: 12px; }
2558
+ .gw-eff-row.gw-eff-inherited { opacity: .7; font-style: italic; }
2559
+ .gw-eff-label { flex-shrink: 0; width: 64px; color: var(--dim); font-style: normal; }
2560
+ .gw-eff-val { flex: 1; color: var(--fg); word-break: break-all; font-style: normal; }
2561
+ .gw-eff-src { flex-shrink: 0; font-size: 10px; padding: 1px 5px; border-radius: 8px; white-space: nowrap; }
2562
+ .gw-src-agent { color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent); }
2563
+ .gw-src-defaults { color: var(--dim); background: var(--bg3); }
2564
+ .gw-src-env { color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
2565
+ .gw-src-none { color: var(--dim); background: transparent; }
2566
+ .gw-eff-card.gw-eff-inherited-block { border-left: 3px solid var(--dim); opacity: .85; }
2567
+ .gw-eff-block-hint { margin-left: auto; font-size: 14px; opacity: .7; }
2568
+
2569
+ /* Gateway Effective 表格(替换卡片布局) */
2570
+ .gw-eff-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 12px; background: var(--bg2); border-radius: 6px; overflow: hidden; }
2571
+ .gw-eff-table thead { background: var(--bg3); }
2572
+ .gw-eff-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
2573
+ .gw-eff-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
2574
+ .gw-eff-tr:hover { background: var(--bg3); }
2575
+ .gw-eff-tr-inherited { opacity: .75; }
2576
+ .gw-eff-td-aid { font-weight: 600; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2577
+ .gw-eff-td-url { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: monospace; font-size: 11px; }
2578
+ .gw-eff-src-tag { padding: 2px 6px; border-radius: 8px; font-size: 10px; white-space: nowrap; }
2579
+ .gw-eff-edit { padding: 3px 8px; font-size: 11px; }
2580
+
2581
+ /* Effective 表格:URL 完整显示 + 操作列 + 模型弹窗 */
2582
+ .gw-eff-td-url { max-width: none; white-space: normal; word-break: break-all; font-family: monospace; font-size: 11px; min-width: 240px; }
2583
+ .gw-eff-td-actions { white-space: nowrap; }
2584
+ .gw-eff-td-actions .ctrl-btn { padding: 3px 10px; font-size: 11px; margin-right: 4px; }
2585
+ .gw-model-list { max-height: 50vh; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }
2586
+ .gw-model-item { padding: 6px 10px; background: var(--bg3); border-radius: 4px; }
2587
+ .gw-model-item code { font-size: 12px; color: var(--fg); background: transparent; }
2588
+
2589
+ /* Gateway config modal (wide) + price table */
2590
+ .gw-modal-wide { max-width: 90vw; width: 1100px; }
2591
+ .gw-modal-subtitle { font-size: 12px; font-weight: normal; color: var(--dim); margin-top: 4px; }
2592
+ .gw-price-table { width: 100%; border-collapse: collapse; font-size: 12px; }
2593
+ .gw-price-table thead { background: var(--bg3); }
2594
+ .gw-price-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
2595
+ .gw-price-subhead th { font-weight: 500; font-size: 11px; padding: 4px 10px; }
2596
+ .gw-price-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
2597
+ .gw-price-row:hover { background: var(--bg3); }
2598
+ .gw-price-model code { font-size: 11px; background: transparent; color: var(--fg); }
2599
+ .gw-price-edit { padding: 3px 10px; font-size: 11px; }
2600
+ .gw-src-gateway { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
2601
+ .gw-src-local { background: var(--bg3); color: var(--dim); }
2602
+
2603
+ /* API 端点配置:模型系列分组 */
2604
+ .gw-model-series { margin-bottom: 16px; }
2605
+ .gw-series-header {
2606
+ display: flex;
2607
+ align-items: center;
2608
+ gap: 8px;
2609
+ padding: 10px 12px;
2610
+ background: var(--bg3);
2611
+ border: 1px solid var(--border);
2612
+ border-radius: 6px;
2613
+ cursor: pointer;
2614
+ user-select: none;
2615
+ transition: background 0.15s;
2616
+ }
2617
+ .gw-series-header:hover { background: color-mix(in srgb, var(--bg3) 90%, var(--accent)); }
2618
+ .gw-series-toggle {
2619
+ font-size: 10px;
2620
+ color: var(--dim);
2621
+ transition: transform 0.2s;
2622
+ width: 12px;
2623
+ display: inline-block;
2624
+ }
2625
+ .gw-series-title {
2626
+ font-weight: 600;
2627
+ font-size: 13px;
2628
+ color: var(--fg);
2629
+ flex: 1;
2630
+ }
2631
+ .gw-series-count {
2632
+ font-size: 11px;
2633
+ color: var(--dim);
2634
+ background: var(--bg2);
2635
+ padding: 2px 8px;
2636
+ border-radius: 10px;
2637
+ }
2638
+ .gw-series-content {
2639
+ margin-top: 8px;
2640
+ overflow: hidden;
2641
+ transition: max-height 0.3s ease;
2642
+ }
2643
+ .gw-series-content .gw-price-table {
2644
+ border: 1px solid var(--border);
2645
+ border-radius: 4px;
2646
+ overflow: hidden;
2647
+ }
2648
+ .roles-layout {
2649
+ padding: 20px;
2650
+ max-width: 1400px;
2651
+ margin: 0 auto;
2652
+ }
2653
+
2654
+ .roles-header {
2655
+ margin-bottom: 24px;
2656
+ padding: 16px;
2657
+ background: var(--bg2);
2658
+ border-radius: 8px;
2659
+ border: 1px solid var(--border);
2660
+ }
2661
+
2662
+ .roles-header label {
2663
+ display: flex;
2664
+ align-items: center;
2665
+ gap: 12px;
2666
+ font-weight: 500;
2667
+ }
2668
+
2669
+ .roles-header select {
2670
+ padding: 8px 12px;
2671
+ font-size: 14px;
2672
+ border: 1px solid var(--border);
2673
+ border-radius: 4px;
2674
+ background: var(--bg);
2675
+ color: var(--fg);
2676
+ min-width: 300px;
2677
+ }
2678
+
2679
+ /* ========== Roles Assignment View ========== */
2680
+ .role-assign-layout {
2681
+ padding: 20px;
2682
+ max-width: 1400px;
2683
+ margin: 0 auto;
2684
+ }
2685
+
2686
+ .assign-header {
2687
+ display: flex;
2688
+ gap: 16px;
2689
+ align-items: center;
2690
+ margin-bottom: 24px;
2691
+ padding: 20px;
2692
+ background: var(--bg2);
2693
+ border: 1px solid var(--border);
2694
+ border-radius: 8px;
2695
+ }
2696
+
2697
+ .assign-header label {
2698
+ display: flex;
2699
+ align-items: center;
2700
+ gap: 12px;
2701
+ font-size: 14px;
2702
+ font-weight: 500;
2703
+ flex: 1;
2704
+ }
2705
+
2706
+ .assign-header select {
2707
+ flex: 1;
2708
+ max-width: 400px;
2709
+ padding: 10px 12px;
2710
+ font-size: 14px;
2711
+ border: 1px solid var(--border);
2712
+ border-radius: 6px;
2713
+ background: var(--bg);
2714
+ color: var(--fg);
2715
+ cursor: pointer;
2716
+ transition: border-color 0.2s;
2717
+ }
2718
+
2719
+ .assign-header select:hover {
2720
+ border-color: var(--accent);
2721
+ }
2722
+
2723
+ .assign-header select:focus {
2724
+ outline: none;
2725
+ border-color: var(--accent);
2726
+ box-shadow: 0 0 0 3px rgba(52, 168, 83, 0.1);
2727
+ }
2728
+
2729
+ #filter-verify {
2730
+ flex: 0 0 auto;
2731
+ min-width: 160px;
2732
+ max-width: 180px;
2733
+ padding: 10px 12px;
2734
+ font-size: 14px;
2735
+ border: 1px solid var(--border);
2736
+ border-radius: 6px;
2737
+ background: var(--bg);
2738
+ color: var(--fg);
2739
+ cursor: pointer;
2740
+ transition: border-color 0.2s;
2741
+ }
2742
+
2743
+ #filter-verify:hover {
2744
+ border-color: var(--accent);
2745
+ }
2746
+
2747
+ #filter-verify:focus {
2748
+ outline: none;
2749
+ border-color: var(--accent);
2750
+ box-shadow: 0 0 0 3px rgba(52, 168, 83, 0.1);
2751
+ }
2752
+
2753
+ .search-box {
2754
+ flex: 1;
2755
+ max-width: 300px;
2756
+ }
2757
+
2758
+ .search-box input {
2759
+ width: 100%;
2760
+ padding: 10px 12px;
2761
+ font-size: 14px;
2762
+ border: 1px solid var(--border);
2763
+ border-radius: 6px;
2764
+ background: var(--bg);
2765
+ color: var(--fg);
2766
+ transition: border-color 0.2s;
2767
+ }
2768
+
2769
+ .search-box input:focus {
2770
+ outline: none;
2771
+ border-color: var(--accent);
2772
+ box-shadow: 0 0 0 3px rgba(52, 168, 83, 0.1);
2773
+ }
2774
+
2775
+ /* 会话类型标签 */
2776
+ .chat-tag {
2777
+ display: inline-block;
2778
+ font-size: 11px;
2779
+ padding: 3px 8px;
2780
+ border-radius: 12px;
2781
+ font-weight: 500;
2782
+ white-space: nowrap;
2783
+ }
2784
+
2785
+ .chat-tag-private {
2786
+ background: rgba(59, 130, 246, 0.12);
2787
+ color: #2563eb;
2788
+ border: 1px solid rgba(59, 130, 246, 0.25);
2789
+ }
2790
+
2791
+ .chat-tag-group {
2792
+ background: rgba(168, 85, 247, 0.12);
2793
+ color: #9333ea;
2794
+ border: 1px solid rgba(168, 85, 247, 0.25);
2795
+ }
2796
+
2797
+ /* 验签状态徽章 */
2798
+ .verify-badge {
2799
+ display: inline-block;
2800
+ font-size: 11px;
2801
+ padding: 2px 6px;
2802
+ border-radius: 3px;
2803
+ margin-left: 6px;
2804
+ font-weight: 500;
2805
+ vertical-align: middle;
2806
+ }
2807
+
2808
+ .verify-badge.verify-invalid {
2809
+ background: rgba(239, 68, 68, 0.15);
2810
+ color: #dc2626;
2811
+ border: 1px solid rgba(239, 68, 68, 0.3);
2812
+ }
2813
+
2814
+ .verify-badge.verify-unknown {
2815
+ background: rgba(156, 163, 175, 0.15);
2816
+ color: #6b7280;
2817
+ border: 1px solid rgba(156, 163, 175, 0.3);
2818
+ }
2819
+
2820
+ .verify-badge.verify-unverified {
2821
+ background: rgba(251, 146, 60, 0.15);
2822
+ color: #ea580c;
2823
+ border: 1px solid rgba(251, 146, 60, 0.3);
2824
+ }
2825
+
2826
+ /* 未验证对端的类型单元格样式 */
2827
+ .peer-unverified {
2828
+ opacity: 0.7;
2829
+ font-style: italic;
2830
+ }
2831
+
2832
+ .peer-unknown {
2833
+ opacity: 0.6;
2834
+ color: var(--dim);
2835
+ }
2836
+
2837
+ .assign-peer-roles {
2838
+ margin-top: 0;
2839
+ }
2840
+
2841
+ .roles-grid {
2842
+ display: grid;
2843
+ grid-template-columns: repeat(3, 1fr);
2844
+ gap: 20px;
2845
+ }
2846
+
2847
+ .role-column {
2848
+ border: 1px solid var(--border);
2849
+ border-radius: 8px;
2850
+ padding: 16px;
2851
+ background: var(--bg2);
2852
+ }
2853
+
2854
+ .role-column h3 {
2855
+ margin: 0 0 16px 0;
2856
+ font-size: 16px;
2857
+ color: var(--fg);
2858
+ padding-bottom: 12px;
2859
+ border-bottom: 1px solid var(--border);
2860
+ }
2861
+
2862
+ .role-list {
2863
+ min-height: 120px;
2864
+ margin-bottom: 12px;
2865
+ }
2866
+
2867
+ .role-empty {
2868
+ color: var(--dim);
2869
+ font-size: 13px;
2870
+ text-align: center;
2871
+ padding: 20px;
2872
+ }
2873
+
2874
+ .role-item {
2875
+ display: flex;
2876
+ justify-content: space-between;
2877
+ align-items: center;
2878
+ padding: 10px 12px;
2879
+ margin-bottom: 8px;
2880
+ background: var(--bg);
2881
+ border-radius: 4px;
2882
+ font-size: 13px;
2883
+ border: 1px solid var(--border);
2884
+ transition: all 0.2s;
2885
+ }
2886
+
2887
+ .role-item:hover {
2888
+ border-color: var(--accent);
2889
+ background: var(--bg2);
2890
+ }
2891
+
2892
+ .role-user-id {
2893
+ font-family: 'Consolas', 'Monaco', monospace;
2894
+ color: var(--fg);
2895
+ word-break: break-all;
2896
+ }
2897
+
2898
+ .role-item .remove-btn {
2899
+ background: #ef4444;
2900
+ color: white;
2901
+ border: none;
2902
+ border-radius: 4px;
2903
+ width: 24px;
2904
+ height: 24px;
2905
+ cursor: pointer;
2906
+ font-size: 16px;
2907
+ line-height: 1;
2908
+ flex-shrink: 0;
2909
+ transition: background 0.2s;
2910
+ }
2911
+
2912
+ .role-item .remove-btn:hover {
2913
+ background: #dc2626;
2914
+ }
2915
+
2916
+ .add-role-btn {
2917
+ width: 100%;
2918
+ padding: 10px;
2919
+ background: var(--accent);
2920
+ color: white;
2921
+ border: none;
2922
+ border-radius: 4px;
2923
+ cursor: pointer;
2924
+ font-size: 14px;
2925
+ font-weight: 500;
2926
+ transition: all 0.2s;
2927
+ }
2928
+
2929
+ .add-role-btn:hover {
2930
+ background: var(--accent);
2931
+ transform: translateY(-1px);
2932
+ }
2933
+
2934
+ .assign-peer-roles {
2935
+ margin-top: 32px;
2936
+ }
2937
+
2938
+ .assign-peer-roles > h3 {
2939
+ margin: 0 0 20px 0;
2940
+ font-size: 18px;
2941
+ color: var(--fg);
2942
+ font-weight: 600;
2943
+ }
2944
+
2945
+ .relations-section {
2946
+ margin-top: 20px;
2947
+ }
2948
+
2949
+ .relations-section h3 {
2950
+ margin: 0 0 16px 0;
2951
+ font-size: 18px;
2952
+ color: var(--fg);
2953
+ }
2954
+
2955
+ .relations-table {
2956
+ width: 100%;
2957
+ border-collapse: collapse;
2958
+ background: var(--bg2);
2959
+ border-radius: 8px;
2960
+ overflow: hidden;
2961
+ border: 1px solid var(--border);
2962
+ }
2963
+
2964
+ .relations-table th,
2965
+ .relations-table td {
2966
+ padding: 12px 16px;
2967
+ text-align: left;
2968
+ border-bottom: 1px solid var(--border);
2969
+ }
2970
+
2971
+ .relations-table th {
2972
+ background: var(--bg2);
2973
+ font-weight: 600;
2974
+ font-size: 13px;
2975
+ color: var(--dim);
2976
+ text-transform: uppercase;
2977
+ letter-spacing: 0.5px;
2978
+ }
2979
+
2980
+ .relations-table td {
2981
+ font-size: 14px;
2982
+ }
2983
+
2984
+ .relations-table tbody tr:last-child td {
2985
+ border-bottom: none;
2986
+ }
2987
+
2988
+ .relations-table tbody tr:hover {
2989
+ background: var(--bg2);
2990
+ }
2991
+
2992
+ .relations-table code {
2993
+ font-family: 'Consolas', 'Monaco', monospace;
2994
+ font-size: 12px;
2995
+ background: var(--bg);
2996
+ padding: 2px 6px;
2997
+ border-radius: 3px;
2998
+ color: var(--fg);
2999
+ }
3000
+
3001
+ .role-badge {
3002
+ display: inline-block;
3003
+ padding: 4px 10px;
3004
+ border-radius: 4px;
3005
+ font-size: 12px;
3006
+ font-weight: 600;
3007
+ text-transform: uppercase;
3008
+ letter-spacing: 0.5px;
3009
+ }
3010
+
3011
+ .role-owner {
3012
+ background: #fef3c7;
3013
+ color: #92400e;
3014
+ }
3015
+
3016
+ .role-admin {
3017
+ background: #dbeafe;
3018
+ color: #1e40af;
3019
+ }
3020
+
3021
+ .role-member {
3022
+ background: #d1fae5;
3023
+ color: #065f46;
3024
+ }
3025
+
3026
+ .role-visitor {
3027
+ background: #f3f4f6;
3028
+ color: #4b5563;
3029
+ }
3030
+
3031
+ .role-none {
3032
+ background: #fef2f2;
3033
+ color: #991b1b;
3034
+ }
3035
+
3036
+ .role-source {
3037
+ font-size: 12px;
3038
+ color: var(--dim);
3039
+ font-style: italic;
3040
+ }
3041
+
3042
+ .edit-peer-role-btn {
3043
+ padding: 6px 12px;
3044
+ background: var(--bg);
3045
+ color: var(--fg);
3046
+ border: 1px solid var(--border);
3047
+ border-radius: 4px;
3048
+ cursor: pointer;
3049
+ font-size: 12px;
3050
+ font-weight: 500;
3051
+ transition: all 0.2s;
3052
+ }
3053
+
3054
+ .edit-peer-role-btn:hover {
3055
+ background: var(--bg2);
3056
+ border-color: var(--accent);
3057
+ transform: translateY(-1px);
3058
+ }
3059
+
3060
+ .group-expand-btn {
3061
+ width: 22px;
3062
+ height: 22px;
3063
+ margin-right: 8px;
3064
+ border: 1px solid var(--border);
3065
+ border-radius: 4px;
3066
+ background: var(--bg);
3067
+ color: var(--fg);
3068
+ cursor: pointer;
3069
+ font-size: 13px;
3070
+ line-height: 18px;
3071
+ }
3072
+
3073
+ .group-conversation-row {
3074
+ background: var(--bg2);
3075
+ }
3076
+
3077
+ .group-member-row td {
3078
+ background: var(--bg);
3079
+ }
3080
+
3081
+ .group-member-indent {
3082
+ display: inline-block;
3083
+ padding-left: 24px;
3084
+ color: var(--fg);
3085
+ }
3086
+
3087
+ .group-member-empty td {
3088
+ color: var(--dim);
3089
+ font-size: 13px;
3090
+ }
3091
+
3092
+ .role-visitor {
3093
+ background: #f3f4f6;
3094
+ color: #374151;
3095
+ }
3096
+
3097
+ .role-none {
3098
+ background: #fee2e2;
3099
+ color: #991b1b;
3100
+ }
3101
+
3102
+ .role-source {
3103
+ font-size: 12px;
3104
+ color: var(--dim);
3105
+ font-style: italic;
3106
+ }
3107
+
3108
+ /* Dark theme adjustments */
3109
+ [data-theme="dark"] .role-owner {
3110
+ background: #78350f;
3111
+ color: #fef3c7;
3112
+ }
3113
+
3114
+ [data-theme="dark"] .role-admin {
3115
+ background: #1e3a8a;
3116
+ color: #dbeafe;
3117
+ }
3118
+
3119
+ [data-theme="dark"] .role-member {
3120
+ background: #064e3b;
3121
+ color: #d1fae5;
3122
+ }
3123
+
3124
+ [data-theme="dark"] .role-visitor {
3125
+ background: #374151;
3126
+ color: #f3f4f6;
3127
+ }
3128
+
3129
+ [data-theme="dark"] .role-none {
3130
+ background: #7f1d1d;
3131
+ color: #fee2e2;
3132
+ }
3133
+
3134
+ /* ========== Role Definitions Tab ========== */
3135
+ .role-defs-layout {
3136
+ padding: 20px;
3137
+ max-width: 1400px;
3138
+ margin: 0 auto;
3139
+ }
3140
+
3141
+ .role-defs-layout h2 {
3142
+ margin: 0 0 24px 0;
3143
+ font-size: 24px;
3144
+ color: var(--fg);
3145
+ }
3146
+
3147
+ /* 全局默认角色选择器 */
3148
+ .role-default-selector {
3149
+ margin-bottom: 24px;
3150
+ padding: 16px;
3151
+ background: var(--bg3);
3152
+ border: 1px solid var(--border);
3153
+ border-radius: 8px;
3154
+ display: flex;
3155
+ flex-direction: column;
3156
+ gap: 12px;
3157
+ }
3158
+
3159
+ .role-default-label {
3160
+ display: flex;
3161
+ align-items: center;
3162
+ gap: 12px;
3163
+ font-size: 14px;
3164
+ font-weight: 500;
3165
+ color: var(--fg);
3166
+ }
3167
+
3168
+ .role-default-label span {
3169
+ min-width: 180px;
3170
+ }
3171
+
3172
+ .role-default-label .form-select {
3173
+ max-width: 240px;
3174
+ }
3175
+
3176
+ .role-cards-grid {
3177
+ display: grid;
3178
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
3179
+ gap: 20px;
3180
+ }
3181
+
3182
+ .role-card {
3183
+ border: 2px solid var(--border);
3184
+ border-radius: 8px;
3185
+ padding: 20px;
3186
+ background: var(--bg2);
3187
+ transition: all 0.2s;
3188
+ }
3189
+
3190
+ .role-card:hover {
3191
+ transform: translateY(-2px);
3192
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
3193
+ }
3194
+
3195
+ .role-card.role-owner { border-color: #fef3c7; }
3196
+ .role-card.role-admin { border-color: #dbeafe; }
3197
+ .role-card.role-member { border-color: #d1fae5; }
3198
+ .role-card.role-visitor { border-color: #f3f4f6; }
3199
+ .role-card.role-none { border-color: #fee2e2; }
3200
+
3201
+ .role-card-header {
3202
+ display: flex;
3203
+ align-items: center;
3204
+ gap: 12px;
3205
+ margin-bottom: 12px;
3206
+ }
3207
+
3208
+ .role-icon {
3209
+ font-size: 32px;
3210
+ }
3211
+
3212
+ .role-name {
3213
+ margin: 0;
3214
+ font-size: 18px;
3215
+ color: var(--fg);
3216
+ }
3217
+
3218
+ .role-description {
3219
+ margin: 0 0 16px 0;
3220
+ font-size: 14px;
3221
+ color: var(--dim);
3222
+ line-height: 1.5;
3223
+ }
3224
+
3225
+ .role-preview {
3226
+ background: var(--bg);
3227
+ border-radius: 4px;
3228
+ padding: 12px;
3229
+ margin-bottom: 16px;
3230
+ }
3231
+
3232
+ .role-preview-item {
3233
+ display: flex;
3234
+ justify-content: space-between;
3235
+ margin-bottom: 8px;
3236
+ font-size: 13px;
3237
+ }
3238
+
3239
+ .role-preview-item:last-child {
3240
+ margin-bottom: 0;
3241
+ }
3242
+
3243
+ .role-preview-item .label {
3244
+ color: var(--dim);
3245
+ }
3246
+
3247
+ .role-preview-item .value {
3248
+ font-weight: 500;
3249
+ color: var(--fg);
3250
+ font-family: 'Consolas', monospace;
3251
+ }
3252
+
3253
+ /* 聊天模式:按场景(私聊/群聊/非人类)分栏的下拉选择 */
3254
+ .chatmode-grid {
3255
+ display: flex;
3256
+ flex-wrap: wrap;
3257
+ gap: 8px;
3258
+ }
3259
+
3260
+ .chatmode-scene {
3261
+ display: flex;
3262
+ flex-direction: column;
3263
+ gap: 4px;
3264
+ flex: 1;
3265
+ min-width: 120px;
3266
+ }
3267
+
3268
+ .chatmode-scene-label {
3269
+ font-size: 12px;
3270
+ color: var(--dim);
3271
+ }
3272
+
3273
+ .role-card-actions {
3274
+ display: flex;
3275
+ gap: 8px;
3276
+ margin-top: 4px;
3277
+ }
3278
+
3279
+ .role-card-actions button {
3280
+ flex: 1;
3281
+ padding: 8px 12px;
3282
+ border: 1px solid var(--border);
3283
+ border-radius: 4px;
3284
+ background: var(--bg);
3285
+ color: var(--fg);
3286
+ cursor: pointer;
3287
+ font-size: 12px;
3288
+ font-weight: 500;
3289
+ transition: all 0.2s;
3290
+ }
3291
+
3292
+ .role-card-actions button:hover {
3293
+ transform: translateY(-1px);
3294
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
3295
+ }
3296
+
3297
+ .btn-view-role {
3298
+ background: var(--bg) !important;
3299
+ color: var(--fg) !important;
3300
+ border-color: var(--border) !important;
3301
+ }
3302
+
3303
+ .btn-view-role:hover {
3304
+ background: var(--bg2) !important;
3305
+ border-color: var(--dim) !important;
3306
+ }
3307
+
3308
+ .btn-edit-role {
3309
+ background: var(--bg) !important;
3310
+ color: var(--fg) !important;
3311
+ border-color: var(--fg) !important;
3312
+ }
3313
+
3314
+ .btn-edit-role:hover {
3315
+ background: var(--bg2) !important;
3316
+ border-color: var(--fg) !important;
3317
+ }
3318
+
3319
+ .btn-reset-role {
3320
+ background: var(--bg) !important;
3321
+ color: #f59e0b !important;
3322
+ border-color: #f59e0b !important;
3323
+ }
3324
+
3325
+ .btn-reset-role:hover {
3326
+ background: #fffbeb !important;
3327
+ border-color: #f59e0b !important;
3328
+ box-shadow: 0 2px 4px rgba(245, 158, 11, 0.2) !important;
3329
+ }
3330
+
3331
+ .btn-delete-role {
3332
+ background: var(--bg) !important;
3333
+ color: #dc2626 !important;
3334
+ border-color: #dc2626 !important;
3335
+ }
3336
+
3337
+ .btn-delete-role:hover {
3338
+ background: #fef2f2 !important;
3339
+ border-color: #dc2626 !important;
3340
+ box-shadow: 0 2px 4px rgba(220, 38, 38, 0.2) !important;
3341
+ }
3342
+
3343
+ /* Modal */
3344
+ .modal {
3345
+ position: fixed;
3346
+ top: 0;
3347
+ left: 0;
3348
+ width: 100%;
3349
+ height: 100%;
3350
+ background: rgba(0,0,0,0.5);
3351
+ display: flex;
3352
+ align-items: center;
3353
+ justify-content: center;
3354
+ z-index: 1000;
3355
+ overflow-y: auto;
3356
+ }
3357
+
3358
+ .modal-content {
3359
+ background: var(--bg);
3360
+ border-radius: 8px;
3361
+ max-width: 700px;
3362
+ width: 90%;
3363
+ max-height: 90vh;
3364
+ display: flex;
3365
+ flex-direction: column;
3366
+ box-shadow: 0 8px 32px rgba(0,0,0,0.3);
3367
+ margin: auto;
3368
+ }
3369
+
3370
+ .modal-header {
3371
+ display: flex;
3372
+ justify-content: space-between;
3373
+ align-items: center;
3374
+ padding: 20px;
3375
+ border-bottom: 1px solid var(--border);
3376
+ }
3377
+
3378
+ .modal-header h3 {
3379
+ margin: 0;
3380
+ font-size: 18px;
3381
+ color: var(--fg);
3382
+ }
3383
+
3384
+ .modal-close {
3385
+ background: none;
3386
+ border: none;
3387
+ font-size: 24px;
3388
+ color: var(--dim);
3389
+ cursor: pointer;
3390
+ width: 32px;
3391
+ height: 32px;
3392
+ display: flex;
3393
+ align-items: center;
3394
+ justify-content: center;
3395
+ border-radius: 4px;
3396
+ transition: all 0.2s;
3397
+ }
3398
+
3399
+ .modal-close:hover {
3400
+ background: var(--bg2);
3401
+ color: var(--fg);
3402
+ }
3403
+
3404
+ .modal-body {
3405
+ padding: 20px;
3406
+ overflow-y: auto;
3407
+ flex: 1;
3408
+ }
3409
+
3410
+ .modal-footer {
3411
+ display: flex;
3412
+ justify-content: flex-end;
3413
+ gap: 12px;
3414
+ padding: 20px;
3415
+ border-top: 1px solid var(--border);
3416
+ }
3417
+
3418
+ .btn-primary, .btn-secondary {
3419
+ padding: 10px 20px;
3420
+ border-radius: 4px;
3421
+ border: none;
3422
+ cursor: pointer;
3423
+ font-size: 14px;
3424
+ font-weight: 500;
3425
+ transition: all 0.2s;
3426
+ }
3427
+
3428
+ .btn-primary {
3429
+ background: var(--accent);
3430
+ color: white;
3431
+ }
3432
+
3433
+ .btn-primary:hover {
3434
+ background: var(--accent);
3435
+ }
3436
+
3437
+ /* 角色编辑弹窗的保存按钮:黑色边框 + 黑色字体(非白色填充) */
3438
+ #role-edit-save.btn-primary,
3439
+ #peer-role-save.btn-primary {
3440
+ background: var(--bg);
3441
+ color: var(--fg);
3442
+ border: 1px solid var(--fg);
3443
+ }
3444
+
3445
+ #role-edit-save.btn-primary:hover,
3446
+ #peer-role-save.btn-primary:hover {
3447
+ background: var(--bg2);
3448
+ }
3449
+
3450
+ .btn-secondary {
3451
+ background: var(--bg2);
3452
+ color: var(--fg);
3453
+ border: 1px solid var(--border);
3454
+ }
3455
+
3456
+ .btn-secondary:hover {
3457
+ background: var(--bg2);
3458
+ }
3459
+
3460
+ /* Form */
3461
+ .role-edit-form {
3462
+ display: flex;
3463
+ flex-direction: column;
3464
+ gap: 20px;
3465
+ }
3466
+
3467
+ .role-edit-form h4 {
3468
+ margin: 0 0 8px 0;
3469
+ font-size: 14px;
3470
+ color: var(--dim);
3471
+ text-transform: uppercase;
3472
+ letter-spacing: 0.5px;
3473
+ }
3474
+
3475
+ .role-edit-form pre {
3476
+ background: var(--bg2);
3477
+ padding: 12px;
3478
+ border-radius: 4px;
3479
+ overflow-x: auto;
3480
+ font-size: 12px;
3481
+ line-height: 1.5;
3482
+ }
3483
+
3484
+ .form-group {
3485
+ display: flex;
3486
+ flex-direction: column;
3487
+ gap: 8px;
3488
+ }
3489
+
3490
+ .form-group label {
3491
+ font-weight: 500;
3492
+ font-size: 14px;
3493
+ color: var(--fg);
3494
+ }
3495
+
3496
+ .form-group input,
3497
+ .form-group select,
3498
+ .form-group textarea {
3499
+ padding: 8px 12px;
3500
+ border: 1px solid var(--border);
3501
+ border-radius: 4px;
3502
+ background: var(--bg);
3503
+ color: var(--fg);
3504
+ font-size: 14px;
3505
+ font-family: inherit;
3506
+ }
3507
+
3508
+ .form-group input:focus,
3509
+ .form-group select:focus,
3510
+ .form-group textarea:focus {
3511
+ outline: none;
3512
+ border-color: var(--accent);
3513
+ }
3514
+
3515
+ .form-group small {
3516
+ font-size: 12px;
3517
+ color: var(--dim);
3518
+ }
3519
+
3520
+ .form-group textarea {
3521
+ resize: vertical;
3522
+ min-height: 60px;
3523
+ }
3524
+
3525
+ /* Dark theme adjustments for role cards */
3526
+ [data-theme="dark"] .role-card.role-owner { border-color: #78350f; }
3527
+ [data-theme="dark"] .role-card.role-admin { border-color: #1e3a8a; }
3528
+ [data-theme="dark"] .role-card.role-member { border-color: #064e3b; }
3529
+ [data-theme="dark"] .role-card.role-visitor { border-color: #374151; }
3530
+ [data-theme="dark"] .role-card.role-none { border-color: #7f1d1d; }
3531
+ /* Role Edit Form Styles */
3532
+ .role-edit-form {
3533
+ display: flex;
3534
+ flex-direction: column;
3535
+ gap: 24px;
3536
+ }
3537
+
3538
+ .form-section {
3539
+ display: flex;
3540
+ flex-direction: column;
3541
+ gap: 12px;
3542
+ }
3543
+
3544
+ .form-section h4 {
3545
+ margin: 0;
3546
+ font-size: 15px;
3547
+ font-weight: 600;
3548
+ color: var(--fg);
3549
+ border-bottom: 1px solid var(--border);
3550
+ padding-bottom: 8px;
3551
+ }
3552
+
3553
+ .form-textarea {
3554
+ width: 100%;
3555
+ padding: 10px;
3556
+ border: 1px solid var(--border);
3557
+ border-radius: 4px;
3558
+ background: var(--bg);
3559
+ color: var(--fg);
3560
+ font-family: inherit;
3561
+ font-size: 14px;
3562
+ resize: vertical;
3563
+ }
3564
+
3565
+ .form-textarea:focus {
3566
+ outline: none;
3567
+ border-color: var(--accent);
3568
+ }
3569
+
3570
+ .form-input, .form-select {
3571
+ width: 100%;
3572
+ padding: 8px 12px;
3573
+ border: 1px solid var(--border);
3574
+ border-radius: 4px;
3575
+ background: var(--bg);
3576
+ color: var(--fg);
3577
+ font-size: 14px;
3578
+ }
3579
+
3580
+ .role-editor-tabs {
3581
+ display: inline-flex;
3582
+ align-self: flex-start;
3583
+ gap: 2px;
3584
+ padding: 2px;
3585
+ border: 1px solid var(--border);
3586
+ border-radius: 6px;
3587
+ background: var(--bg3);
3588
+ }
3589
+
3590
+ .role-editor-tab {
3591
+ border: none;
3592
+ border-radius: 4px;
3593
+ background: transparent;
3594
+ color: var(--dim);
3595
+ cursor: pointer;
3596
+ font-size: 13px;
3597
+ font-weight: 600;
3598
+ padding: 7px 12px;
3599
+ }
3600
+
3601
+ .role-editor-tab.active {
3602
+ background: var(--bg);
3603
+ color: var(--fg);
3604
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
3605
+ }
3606
+
3607
+ .role-editor-tab-panel {
3608
+ display: none;
3609
+ }
3610
+
3611
+ .role-editor-tab-panel.active {
3612
+ display: block;
3613
+ }
3614
+
3615
+ .command-permissions-section {
3616
+ gap: 14px;
3617
+ }
3618
+
3619
+ .cli-summary {
3620
+ display: flex;
3621
+ flex-wrap: wrap;
3622
+ gap: 8px;
3623
+ }
3624
+
3625
+ .cli-summary span,
3626
+ .cli-status,
3627
+ .cli-danger {
3628
+ display: inline-flex;
3629
+ align-items: center;
3630
+ min-height: 22px;
3631
+ padding: 3px 8px;
3632
+ border: 1px solid var(--border);
3633
+ border-radius: 4px;
3634
+ background: var(--bg2);
3635
+ color: var(--fg);
3636
+ font-size: 12px;
3637
+ line-height: 1;
3638
+ }
3639
+
3640
+ .cli-help {
3641
+ color: var(--dim);
3642
+ font-size: 12px;
3643
+ line-height: 1.5;
3644
+ }
3645
+
3646
+ .cli-category-section {
3647
+ display: flex;
3648
+ flex-direction: column;
3649
+ gap: 8px;
3650
+ }
3651
+
3652
+ .cli-category-section h5 {
3653
+ display: flex;
3654
+ align-items: center;
3655
+ gap: 8px;
3656
+ margin: 0;
3657
+ padding: 8px 0 4px;
3658
+ border-bottom: 1px solid var(--border);
3659
+ color: var(--fg);
3660
+ font-size: 13px;
3661
+ font-weight: 700;
3662
+ }
3663
+
3664
+ .cli-category-section h5 span {
3665
+ color: var(--dim);
3666
+ font-size: 12px;
3667
+ font-weight: 500;
3668
+ }
3669
+
3670
+ .cli-permission-list {
3671
+ display: flex;
3672
+ flex-direction: column;
3673
+ gap: 8px;
3674
+ }
3675
+
3676
+ .cli-permission-row {
3677
+ display: grid;
3678
+ grid-template-columns: minmax(0, 1fr) minmax(190px, 240px);
3679
+ gap: 12px;
3680
+ padding: 12px;
3681
+ border: 1px solid var(--border);
3682
+ border-left-width: 4px;
3683
+ border-radius: 6px;
3684
+ background: var(--bg2);
3685
+ }
3686
+
3687
+ .cli-permission-row.allow {
3688
+ border-left-color: #16a34a;
3689
+ }
3690
+
3691
+ .cli-permission-row.deny {
3692
+ border-left-color: #dc2626;
3693
+ }
3694
+
3695
+ .cli-permission-row.readonly {
3696
+ grid-template-columns: minmax(0, 1fr);
3697
+ }
3698
+
3699
+ .cli-op-main {
3700
+ min-width: 0;
3701
+ }
3702
+
3703
+ .cli-op-title {
3704
+ display: flex;
3705
+ flex-wrap: wrap;
3706
+ align-items: center;
3707
+ gap: 8px;
3708
+ }
3709
+
3710
+ .cli-op-title code {
3711
+ color: var(--fg);
3712
+ font-size: 13px;
3713
+ }
3714
+
3715
+ .cli-status.allow {
3716
+ border-color: #16a34a;
3717
+ color: #15803d;
3718
+ }
3719
+
3720
+ .cli-status.deny {
3721
+ border-color: #dc2626;
3722
+ color: #b91c1c;
3723
+ }
3724
+
3725
+ .cli-danger {
3726
+ border-color: #f59e0b;
3727
+ color: #b45309;
3728
+ }
3729
+
3730
+ .cli-op-desc,
3731
+ .cli-op-meta {
3732
+ margin-top: 6px;
3733
+ color: var(--dim);
3734
+ font-size: 12px;
3735
+ line-height: 1.4;
3736
+ word-break: break-word;
3737
+ }
3738
+
3739
+ .cli-op-controls {
3740
+ display: flex;
3741
+ flex-direction: column;
3742
+ gap: 8px;
3743
+ }
3744
+
3745
+ .cli-field-row {
3746
+ display: flex;
3747
+ flex-direction: column;
3748
+ gap: 5px;
3749
+ color: var(--dim);
3750
+ font-size: 12px;
3751
+ }
3752
+
3753
+ .cli-field-row.compact {
3754
+ gap: 4px;
3755
+ }
3756
+
3757
+ .cli-danger-grant,
3758
+ .cli-scope-option,
3759
+ .cli-constraint-option {
3760
+ display: inline-flex;
3761
+ align-items: center;
3762
+ gap: 6px;
3763
+ color: var(--fg);
3764
+ font-size: 12px;
3765
+ }
3766
+
3767
+ .cli-advanced {
3768
+ grid-column: 1 / -1;
3769
+ border-top: 1px solid var(--border);
3770
+ padding-top: 8px;
3771
+ }
3772
+
3773
+ .cli-advanced summary {
3774
+ cursor: pointer;
3775
+ color: var(--dim);
3776
+ font-size: 12px;
3777
+ font-weight: 600;
3778
+ }
3779
+
3780
+ .cli-advanced-grid {
3781
+ display: grid;
3782
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
3783
+ gap: 12px;
3784
+ margin-top: 10px;
3785
+ }
3786
+
3787
+ .cli-scope-grid,
3788
+ .cli-constraint-grid {
3789
+ display: flex;
3790
+ flex-wrap: wrap;
3791
+ gap: 7px 10px;
3792
+ }
3793
+
3794
+ .cli-subtitle {
3795
+ margin-bottom: 6px;
3796
+ color: var(--dim);
3797
+ font-size: 12px;
3798
+ font-weight: 700;
3799
+ }
3800
+
3801
+ .cli-reason {
3802
+ grid-column: 1 / -1;
3803
+ }
3804
+
3805
+ @media (max-width: 760px) {
3806
+ .cli-permission-row,
3807
+ .cli-advanced-grid {
3808
+ grid-template-columns: 1fr;
3809
+ }
3810
+ }
3811
+
3812
+ .form-input:focus, .form-select:focus {
3813
+ outline: none;
3814
+ border-color: var(--accent);
3815
+ }
3816
+
3817
+ .perm-group {
3818
+ background: var(--bg2);
3819
+ padding: 12px;
3820
+ border-radius: 6px;
3821
+ border: 1px solid var(--border);
3822
+ }
3823
+
3824
+ .perm-header {
3825
+ display: flex;
3826
+ justify-content: space-between;
3827
+ align-items: center;
3828
+ margin-bottom: 8px;
3829
+ }
3830
+
3831
+ .perm-label {
3832
+ font-size: 14px;
3833
+ font-weight: 500;
3834
+ color: var(--fg);
3835
+ }
3836
+
3837
+ .perm-override {
3838
+ display: flex;
3839
+ align-items: center;
3840
+ gap: 6px;
3841
+ font-size: 13px;
3842
+ color: var(--dim);
3843
+ cursor: pointer;
3844
+ }
3845
+
3846
+ .perm-override input[type="checkbox"] {
3847
+ cursor: pointer;
3848
+ }
3849
+
3850
+ .model-permissions-panel {
3851
+ display: flex;
3852
+ flex-direction: column;
3853
+ gap: 12px;
3854
+ }
3855
+
3856
+ .model-field-label {
3857
+ font-size: 12px;
3858
+ color: var(--dim);
3859
+ font-weight: 600;
3860
+ }
3861
+
3862
+ .model-mode-tabs {
3863
+ display: flex;
3864
+ flex-wrap: wrap;
3865
+ align-items: center;
3866
+ gap: 8px;
3867
+ }
3868
+
3869
+ .model-mode-option {
3870
+ display: inline-flex;
3871
+ align-items: center;
3872
+ gap: 6px;
3873
+ padding: 5px 8px;
3874
+ border: 1px solid var(--border);
3875
+ border-radius: 4px;
3876
+ background: var(--bg);
3877
+ color: var(--fg);
3878
+ font-size: 12px;
3879
+ cursor: pointer;
3880
+ }
3881
+
3882
+ .model-mode-note {
3883
+ color: var(--dim);
3884
+ font-size: 12px;
3885
+ }
3886
+
3887
+ .model-allowed-editor {
3888
+ display: flex;
3889
+ flex-direction: column;
3890
+ gap: 8px;
3891
+ padding: 8px;
3892
+ border: 1px solid var(--border);
3893
+ border-radius: 4px;
3894
+ background: var(--bg);
3895
+ }
3896
+
3897
+ .model-allowed-list {
3898
+ display: flex;
3899
+ flex-wrap: wrap;
3900
+ gap: 6px;
3901
+ min-height: 32px;
3902
+ }
3903
+
3904
+ .model-allowed-chip {
3905
+ display: inline-flex;
3906
+ align-items: center;
3907
+ gap: 6px;
3908
+ max-width: 100%;
3909
+ padding: 4px 8px;
3910
+ border: 1px solid var(--border);
3911
+ border-radius: 4px;
3912
+ background: var(--bg3);
3913
+ color: var(--fg);
3914
+ font-size: 12px;
3915
+ }
3916
+
3917
+ .model-allowed-chip span {
3918
+ overflow: hidden;
3919
+ text-overflow: ellipsis;
3920
+ white-space: nowrap;
3921
+ }
3922
+
3923
+ .model-allowed-remove {
3924
+ display: inline-flex;
3925
+ align-items: center;
3926
+ justify-content: center;
3927
+ width: 16px;
3928
+ height: 16px;
3929
+ padding: 0;
3930
+ border: none;
3931
+ border-radius: 50%;
3932
+ background: transparent;
3933
+ color: var(--dim);
3934
+ cursor: pointer;
3935
+ font-size: 14px;
3936
+ line-height: 1;
3937
+ }
3938
+
3939
+ .model-allowed-remove:hover {
3940
+ background: var(--bg2);
3941
+ color: var(--red);
3942
+ }
3943
+
3944
+ .model-allowed-add {
3945
+ display: flex;
3946
+ gap: 8px;
3947
+ }
3948
+
3949
+ .model-allowed-add .model-allowed-input {
3950
+ min-width: 0;
3951
+ }
3952
+
3953
+ .model-mode-panel {
3954
+ border: 1px solid var(--border);
3955
+ border-radius: 4px;
3956
+ padding: 8px;
3957
+ background: var(--bg);
3958
+ }
3959
+
3960
+ .model-option-grid,
3961
+ .model-explicit-list {
3962
+ display: grid;
3963
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
3964
+ gap: 8px;
3965
+ max-height: 240px;
3966
+ overflow: auto;
3967
+ }
3968
+
3969
+ .model-option {
3970
+ display: flex;
3971
+ align-items: center;
3972
+ gap: 8px;
3973
+ min-width: 0;
3974
+ font-size: 13px;
3975
+ color: var(--fg);
3976
+ }
3977
+
3978
+ .model-option-row span {
3979
+ overflow: hidden;
3980
+ text-overflow: ellipsis;
3981
+ white-space: nowrap;
3982
+ }
3983
+
3984
+ .model-option-row small {
3985
+ margin-left: auto;
3986
+ color: var(--dim);
3987
+ font-size: 11px;
3988
+ }
3989
+
3990
+ .model-preview {
3991
+ border-top: 1px solid var(--border);
3992
+ padding-top: 10px;
3993
+ color: var(--dim);
3994
+ font-size: 12px;
3995
+ }
3996
+
3997
+ .model-preview-count {
3998
+ margin-bottom: 6px;
3999
+ }
4000
+
4001
+ .model-preview-list {
4002
+ display: flex;
4003
+ flex-wrap: wrap;
4004
+ gap: 6px;
4005
+ }
4006
+
4007
+ .model-chip {
4008
+ display: inline-flex;
4009
+ align-items: center;
4010
+ max-width: 240px;
4011
+ padding: 3px 7px;
4012
+ border: 1px solid var(--border);
4013
+ border-radius: 4px;
4014
+ background: var(--bg3);
4015
+ color: var(--fg);
4016
+ overflow: hidden;
4017
+ text-overflow: ellipsis;
4018
+ white-space: nowrap;
4019
+ }
4020
+
4021
+ .model-preview-error {
4022
+ color: var(--red);
4023
+ }
4024
+
4025
+ /* Tags Input */
4026
+ .tags-input-container {
4027
+ display: flex;
4028
+ flex-direction: column;
4029
+ gap: 8px;
4030
+ padding: 8px;
4031
+ border: 1px solid var(--border);
4032
+ border-radius: 4px;
4033
+ background: var(--bg);
4034
+ min-height: 80px;
4035
+ }
4036
+
4037
+ .tags-list {
4038
+ display: flex;
4039
+ flex-wrap: wrap;
4040
+ gap: 6px;
4041
+ min-height: 30px;
4042
+ }
4043
+
4044
+ .tag {
4045
+ display: inline-flex;
4046
+ align-items: center;
4047
+ gap: 6px;
4048
+ padding: 4px 8px;
4049
+ background: var(--accent);
4050
+ color: white;
4051
+ border-radius: 4px;
4052
+ font-size: 13px;
4053
+ }
4054
+
4055
+ .tag-remove {
4056
+ background: none;
4057
+ border: none;
4058
+ color: white;
4059
+ font-size: 16px;
4060
+ cursor: pointer;
4061
+ padding: 0;
4062
+ width: 16px;
4063
+ height: 16px;
4064
+ display: flex;
4065
+ align-items: center;
4066
+ justify-content: center;
4067
+ border-radius: 50%;
4068
+ transition: background 0.2s;
4069
+ }
4070
+
4071
+ .tag-remove:hover {
4072
+ background: rgba(255, 255, 255, 0.2);
4073
+ }
4074
+
4075
+ .tags-input {
4076
+ border: none;
4077
+ outline: none;
4078
+ padding: 6px;
4079
+ background: transparent;
4080
+ color: var(--fg);
4081
+ font-size: 14px;
4082
+ width: 100%;
4083
+ }
4084
+
4085
+ .tags-input::placeholder {
4086
+ color: var(--dim);
4087
+ }
4088
+
4089
+ /* Role Error Display */
4090
+ .role-error {
4091
+ padding: 40px;
4092
+ text-align: center;
4093
+ color: var(--dim);
4094
+ font-size: 14px;
4095
+ }
4096
+
4097
+ .btn-new-role {
4098
+ padding: 10px 20px;
4099
+ background: var(--accent);
4100
+ color: white;
4101
+ border: none;
4102
+ border-radius: 4px;
4103
+ cursor: pointer;
4104
+ font-size: 14px;
4105
+ font-weight: 500;
4106
+ transition: all 0.2s;
4107
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
4108
+ }
4109
+
4110
+ .btn-new-role:hover {
4111
+ background: var(--accent);
4112
+ transform: translateY(-1px);
4113
+ box-shadow: 0 4px 8px rgba(59, 130, 246, 0.3);
4114
+ }
4115
+
4116
+ /* Custom Role Badge */
4117
+ .role-custom-badge {
4118
+ display: inline-block;
4119
+ padding: 2px 8px;
4120
+ background: var(--accent);
4121
+ color: white;
4122
+ font-size: 11px;
4123
+ border-radius: 12px;
4124
+ margin-left: 8px;
4125
+ }
4126
+
4127
+ /* Dark theme adjustments for role buttons */
4128
+ [data-theme="dark"] .btn-reset-role:hover {
4129
+ background: #78350f !important;
4130
+ }
4131
+
4132
+ [data-theme="dark"] .btn-delete-role:hover {
4133
+ background: #7f1d1d !important;
4134
+ }
4135
+
4136
+ [data-theme="dark"] .btn-view-role:hover {
4137
+ background: var(--bg2) !important;
4138
+ }