codexmate 0.0.10 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +52 -12
  2. package/README.zh-CN.md +52 -12
  3. package/cli.js +3491 -563
  4. package/{CHANGELOG.md → doc/CHANGELOG.md} +6 -0
  5. package/{CHANGELOG.zh-CN.md → doc/CHANGELOG.zh-CN.md} +6 -0
  6. package/lib/mcp-stdio.js +440 -0
  7. package/package.json +22 -2
  8. package/res/logo.png +0 -0
  9. package/web-ui/app.js +1171 -149
  10. package/web-ui/index.html +1605 -0
  11. package/web-ui/logic.mjs +21 -21
  12. package/web-ui/styles.css +3213 -0
  13. package/web-ui.html +7 -3967
  14. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -27
  15. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -17
  16. package/.github/workflows/ci.yml +0 -26
  17. package/.github/workflows/release.yml +0 -159
  18. package/.planning/.fix-attempts +0 -1
  19. package/.planning/.lock +0 -6
  20. package/.planning/.verify-cache.json +0 -14
  21. package/.planning/CHECKPOINT.json +0 -46
  22. package/.planning/DESIGN.md +0 -26
  23. package/.planning/HISTORY.json +0 -124
  24. package/.planning/PLAN.md +0 -69
  25. package/.planning/REVIEW.md +0 -41
  26. package/.planning/STATE.md +0 -12
  27. package/.planning/STATS.json +0 -13
  28. package/.planning/VERIFICATION.md +0 -70
  29. package/.planning/daude-code-plan.md +0 -51
  30. package/.planning/research/architecture.md +0 -32
  31. package/.planning/research/conventions.md +0 -36
  32. package/.planning/task_1-REVIEW.md +0 -29
  33. package/.planning/task_1-SUMMARY.md +0 -32
  34. package/.planning/task_2-REVIEW.md +0 -24
  35. package/.planning/task_2-SUMMARY.md +0 -37
  36. package/.planning/task_3-REVIEW.md +0 -25
  37. package/.planning/task_3-SUMMARY.md +0 -31
  38. package/cmd/publish-npm.cmd +0 -65
  39. package/tests/e2e/helpers.js +0 -214
  40. package/tests/e2e/recent-health.e2e.js +0 -142
  41. package/tests/e2e/run.js +0 -154
  42. package/tests/e2e/test-claude.js +0 -21
  43. package/tests/e2e/test-config.js +0 -124
  44. package/tests/e2e/test-health-speed.js +0 -79
  45. package/tests/e2e/test-openclaw.js +0 -47
  46. package/tests/e2e/test-session-search.js +0 -114
  47. package/tests/e2e/test-sessions.js +0 -69
  48. package/tests/e2e/test-setup.js +0 -159
  49. package/tests/unit/run.mjs +0 -29
  50. package/tests/unit/web-ui-logic.test.mjs +0 -186
@@ -0,0 +1,3213 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Source+Sans+3:wght@400;500;600&family=Space+Grotesk:wght@400;500;600;700&display=swap');
2
+
3
+ /* ============================================
4
+ 设计系统 - Design Tokens
5
+ ============================================ */
6
+ :root {
7
+ /* 色彩系统:去除杂纹,强调干净留白与温柔橙红 */
8
+ --color-brand: #D0583A;
9
+ --color-brand-dark: #B8442B;
10
+ --color-brand-light: rgba(208, 88, 58, 0.14);
11
+ --color-brand-subtle: rgba(201, 94, 75, 0.2);
12
+
13
+ --color-bg: #F8F2EA;
14
+ --color-surface: #FFFDFC;
15
+ --color-surface-alt: #FFF8F2;
16
+ --color-surface-elevated: #FFFFFF;
17
+ --color-surface-tint: rgba(255, 255, 255, 0.84);
18
+ --color-text-primary: #1B1714;
19
+ --color-text-secondary: #473C34;
20
+ --color-text-tertiary: #6F6054;
21
+ --color-text-muted: #6C5B50;
22
+ --color-border: #D8C9B8;
23
+ --color-border-soft: rgba(216, 201, 184, 0.38);
24
+ --color-border-strong: rgba(216, 201, 184, 0.68);
25
+
26
+ --color-success: #4B8B6A;
27
+ --color-error: #C44536;
28
+
29
+ --bg-warm-gradient:
30
+ radial-gradient(circle at 16% 10%, rgba(201, 94, 75, 0.14), transparent 48%),
31
+ radial-gradient(circle at 90% 6%, rgba(255, 255, 255, 0.9), transparent 42%),
32
+ linear-gradient(135deg, #F8F2EA 0%, #F1E4D8 44%, #F8F2EA 100%);
33
+
34
+ /* 字体系统 */
35
+ --font-family-body: 'Source Sans 3', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
36
+ --font-family-display: 'Space Grotesk', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
37
+ --font-family-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
38
+ --font-family: var(--font-family-body);
39
+
40
+ --font-size-display: 52px;
41
+ --font-size-title: 18px;
42
+ --font-size-body: 15px;
43
+ --font-size-secondary: 13px;
44
+ --font-size-caption: 11px;
45
+
46
+ --font-weight-display: 600;
47
+ --font-weight-title: 600;
48
+ --font-weight-body: 400;
49
+ --font-weight-secondary: 500;
50
+ --font-weight-caption: 500;
51
+
52
+ --line-height-tight: 1.12;
53
+ --line-height-normal: 1.5;
54
+
55
+ /* 间距系统 */
56
+ --spacing-xs: 8px;
57
+ --spacing-sm: 16px;
58
+ --spacing-md: 24px;
59
+ --spacing-lg: 40px;
60
+ --spacing-xl: 64px;
61
+
62
+ /* 圆角系统 */
63
+ --radius-sm: 8px;
64
+ --radius-lg: 12px;
65
+ --radius-xl: 18px;
66
+ --radius-full: 50px;
67
+
68
+ /* 阴影系统 - 多层叠加提升真实感 */
69
+ --shadow-subtle: 0 1px 2px rgba(31, 26, 23, 0.03);
70
+ --shadow-card: 0 6px 18px rgba(31, 26, 23, 0.06);
71
+ --shadow-card-hover: 0 10px 24px rgba(31, 26, 23, 0.08);
72
+ --shadow-float: 0 12px 26px rgba(31, 26, 23, 0.12);
73
+ --shadow-raised: 0 10px 20px rgba(31, 26, 23, 0.1);
74
+ --shadow-modal:
75
+ 0 8px 24px rgba(31, 26, 23, 0.08),
76
+ 0 24px 64px rgba(31, 26, 23, 0.06);
77
+ --shadow-input-focus:
78
+ 0 0 0 3px var(--color-brand-light),
79
+ 0 1px 3px rgba(31, 26, 23, 0.04);
80
+
81
+ /* 动画 - 更细腻的曲线 */
82
+ --transition-instant: 100ms;
83
+ --transition-fast: 120ms;
84
+ --transition-normal: 200ms;
85
+ --transition-slow: 300ms;
86
+ --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
87
+ --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
88
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
89
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
90
+ }
91
+
92
+ /* ============================================
93
+ 基础重置
94
+ ============================================ */
95
+ * {
96
+ margin: 0;
97
+ padding: 0;
98
+ box-sizing: border-box;
99
+ }
100
+
101
+ /* 仅屏幕阅读器可见 */
102
+ .sr-only {
103
+ position: absolute;
104
+ width: 1px;
105
+ height: 1px;
106
+ padding: 0;
107
+ margin: -1px;
108
+ overflow: hidden;
109
+ clip: rect(0, 0, 0, 0);
110
+ white-space: nowrap;
111
+ border: 0;
112
+ }
113
+
114
+ body {
115
+ font-family: var(--font-family-body);
116
+ background-color: var(--color-bg);
117
+ background: var(--bg-warm-gradient);
118
+ color: var(--color-text-primary);
119
+ display: flex;
120
+ justify-content: center;
121
+ align-items: center;
122
+ min-height: 100vh;
123
+ padding: var(--spacing-lg) var(--spacing-md);
124
+ -webkit-font-smoothing: antialiased;
125
+ -moz-osx-font-smoothing: grayscale;
126
+ position: relative;
127
+ overflow-x: hidden;
128
+ }
129
+
130
+ .fab-install {
131
+ position: fixed;
132
+ left: 16px;
133
+ bottom: 16px;
134
+ z-index: 90;
135
+ padding: 12px 16px;
136
+ border-radius: var(--radius-full);
137
+ border: none;
138
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
139
+ color: #fff;
140
+ font-weight: var(--font-weight-secondary);
141
+ letter-spacing: 0.02em;
142
+ box-shadow: var(--shadow-float);
143
+ cursor: pointer;
144
+ transition: transform var(--transition-fast) var(--ease-spring), box-shadow var(--transition-fast) var(--ease-spring);
145
+ }
146
+
147
+ .fab-install:hover {
148
+ transform: translateY(-1px);
149
+ box-shadow: var(--shadow-raised);
150
+ }
151
+
152
+ .fab-install:active {
153
+ transform: translateY(0);
154
+ }
155
+
156
+ @media (max-width: 640px) {
157
+ .fab-install {
158
+ left: 12px;
159
+ bottom: 12px;
160
+ padding: 10px 14px;
161
+ font-size: var(--font-size-secondary);
162
+ }
163
+ }
164
+
165
+ /* ============================================
166
+ 容器
167
+ ============================================ */
168
+ body::before {
169
+ content: "";
170
+ position: fixed;
171
+ inset: 0;
172
+ background-image:
173
+ radial-gradient(circle at 12% 18%, rgba(201, 94, 75, 0.1), transparent 38%),
174
+ repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.4) 0 1px, transparent 1px 120px),
175
+ repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.35) 0 1px, transparent 1px 120px);
176
+ opacity: 0.28;
177
+ pointer-events: none;
178
+ z-index: 0;
179
+ }
180
+
181
+ /* 背景网格 */
182
+ body::after {
183
+ content: "";
184
+ position: fixed;
185
+ inset: 0;
186
+ background-image:
187
+ linear-gradient(90deg, rgba(255, 255, 255, 0.15) 1px, transparent 1px),
188
+ linear-gradient(0deg, rgba(255, 255, 255, 0.12) 1px, transparent 1px);
189
+ background-size: 120px 120px;
190
+ opacity: 0.22;
191
+ pointer-events: none;
192
+ z-index: 0;
193
+ }
194
+
195
+ /* ============================================
196
+ 容器
197
+ ============================================ */
198
+ .container {
199
+ width: 100%;
200
+ max-width: 1460px;
201
+ margin: 0 auto;
202
+ padding: 16px 12px 28px;
203
+ position: relative;
204
+ z-index: 1;
205
+ }
206
+
207
+ /* ============================================
208
+ 布局:三栏(侧栏 + 主区 + 状态检查器)
209
+ ============================================ */
210
+ .app-shell {
211
+ display: grid;
212
+ grid-template-columns: 240px minmax(0, 1fr) 340px;
213
+ gap: 16px;
214
+ align-items: flex-start;
215
+ }
216
+
217
+ .app-shell.standalone {
218
+ grid-template-columns: 1fr;
219
+ }
220
+
221
+ .side-rail {
222
+ position: sticky;
223
+ top: var(--spacing-md);
224
+ align-self: start;
225
+ display: flex;
226
+ flex-direction: column;
227
+ gap: var(--spacing-sm);
228
+ padding: var(--spacing-md) var(--spacing-sm);
229
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 250, 245, 0.9) 100%);
230
+ border: 1px solid rgba(216, 201, 184, 0.65);
231
+ border-radius: var(--radius-xl);
232
+ box-shadow: var(--shadow-card);
233
+ min-height: 420px;
234
+ }
235
+
236
+ .side-rail .brand-title {
237
+ font-size: 24px;
238
+ margin-bottom: 2px;
239
+ }
240
+
241
+ .side-section {
242
+ display: flex;
243
+ flex-direction: column;
244
+ gap: 10px;
245
+ }
246
+
247
+ .side-section-title {
248
+ font-size: var(--font-size-secondary);
249
+ font-weight: var(--font-weight-secondary);
250
+ color: var(--color-text-tertiary);
251
+ letter-spacing: 0.01em;
252
+ padding: 0 var(--spacing-xs);
253
+ }
254
+
255
+ .side-item {
256
+ width: 100%;
257
+ text-align: left;
258
+ padding: 12px var(--spacing-sm);
259
+ border-radius: var(--radius-lg);
260
+ border: 1px solid var(--color-border-soft);
261
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(255, 247, 240, 0.95) 100%);
262
+ color: var(--color-text-secondary);
263
+ cursor: pointer;
264
+ transition: all var(--transition-normal) var(--ease-spring);
265
+ display: flex;
266
+ flex-direction: column;
267
+ gap: 6px;
268
+ box-shadow: var(--shadow-subtle);
269
+ }
270
+
271
+ .side-item:hover {
272
+ border-color: var(--color-brand);
273
+ color: var(--color-text-primary);
274
+ transform: translateY(-1px);
275
+ box-shadow: var(--shadow-card-hover);
276
+ }
277
+
278
+ .side-item.active {
279
+ border-color: var(--color-brand);
280
+ background: linear-gradient(135deg, rgba(201, 94, 75, 0.14), rgba(255, 255, 255, 0.96));
281
+ color: var(--color-text-primary);
282
+ box-shadow: var(--shadow-float);
283
+ }
284
+
285
+ .side-item-title {
286
+ font-size: var(--font-size-body);
287
+ font-weight: var(--font-weight-secondary);
288
+ letter-spacing: -0.01em;
289
+ }
290
+
291
+ .side-item-meta {
292
+ font-size: var(--font-size-caption);
293
+ color: var(--color-text-tertiary);
294
+ display: flex;
295
+ gap: 8px;
296
+ flex-wrap: wrap;
297
+ }
298
+
299
+ .side-item-meta > span {
300
+ min-width: 0;
301
+ overflow-wrap: anywhere;
302
+ word-break: break-word;
303
+ }
304
+
305
+ .top-tabs {
306
+ display: none !important;
307
+ }
308
+
309
+ .brand-block {
310
+ display: grid;
311
+ grid-template-columns: 48px 1fr;
312
+ grid-template-rows: auto auto;
313
+ column-gap: var(--spacing-sm);
314
+ row-gap: 2px;
315
+ align-items: center;
316
+ margin-bottom: var(--spacing-md);
317
+ }
318
+
319
+ .brand-logo-wrap {
320
+ width: 48px;
321
+ height: 48px;
322
+ border-radius: 14px;
323
+ background: rgba(208, 88, 58, 0.08);
324
+ border: 1px solid var(--color-border-soft);
325
+ display: grid;
326
+ place-items: center;
327
+ box-shadow: var(--shadow-subtle);
328
+ flex-shrink: 0;
329
+ grid-row: 1 / span 2;
330
+ }
331
+
332
+ .brand-logo {
333
+ width: 34px;
334
+ height: 34px;
335
+ object-fit: contain;
336
+ display: block;
337
+ }
338
+
339
+ .brand-title {
340
+ font-size: 30px;
341
+ line-height: 1.05;
342
+ font-family: var(--font-family-display);
343
+ color: var(--color-text-primary);
344
+ letter-spacing: -0.02em;
345
+ }
346
+
347
+ .brand-title .accent {
348
+ color: var(--color-brand);
349
+ }
350
+
351
+ .brand-subtitle {
352
+ margin-top: 8px;
353
+ font-size: var(--font-size-secondary);
354
+ color: var(--color-text-tertiary);
355
+ line-height: 1.45;
356
+ }
357
+
358
+ .main-tabs {
359
+ display: flex;
360
+ gap: 10px;
361
+ }
362
+
363
+ .main-tab-btn {
364
+ flex: 1;
365
+ text-align: center;
366
+ border: 1px solid rgba(216, 201, 184, 0.55);
367
+ background: rgba(255, 255, 255, 0.95);
368
+ border-radius: var(--radius-lg);
369
+ padding: 12px 14px;
370
+ cursor: pointer;
371
+ color: var(--color-text-secondary);
372
+ font-size: var(--font-size-body);
373
+ font-weight: var(--font-weight-secondary);
374
+ box-shadow: var(--shadow-subtle);
375
+ transition: all var(--transition-normal) var(--ease-spring);
376
+ }
377
+
378
+ .main-tab-btn:hover {
379
+ border-color: var(--color-brand);
380
+ color: var(--color-text-primary);
381
+ transform: translateY(-1px);
382
+ }
383
+
384
+ .main-tab-btn.active {
385
+ border-color: var(--color-brand);
386
+ box-shadow: 0 10px 24px rgba(27, 23, 20, 0.08);
387
+ color: var(--color-text-primary);
388
+ background: linear-gradient(135deg, rgba(201, 94, 75, 0.12), rgba(255, 255, 255, 0.95));
389
+ }
390
+
391
+ .status-strip {
392
+ display: flex;
393
+ flex-wrap: wrap;
394
+ gap: var(--spacing-xs);
395
+ margin-bottom: var(--spacing-sm);
396
+ margin-top: 6px;
397
+ }
398
+
399
+ .status-chip {
400
+ min-width: 200px;
401
+ padding: 10px 12px;
402
+ border-radius: var(--radius-lg);
403
+ border: 1px solid var(--color-border-soft);
404
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.99) 0%, rgba(255, 250, 245, 0.97) 100%);
405
+ box-shadow: var(--shadow-subtle);
406
+ }
407
+
408
+ .status-chip .label {
409
+ display: block;
410
+ font-size: var(--font-size-caption);
411
+ color: var(--color-text-tertiary);
412
+ margin-bottom: 4px;
413
+ }
414
+
415
+ .status-chip .value {
416
+ font-size: var(--font-size-body);
417
+ font-weight: var(--font-weight-secondary);
418
+ color: var(--color-text-primary);
419
+ letter-spacing: -0.01em;
420
+ white-space: normal;
421
+ overflow-wrap: anywhere;
422
+ word-break: break-word;
423
+ }
424
+
425
+ .main-panel {
426
+ min-width: 0;
427
+ background: rgba(255, 255, 255, 0.95);
428
+ border: 1px solid rgba(216, 201, 184, 0.48);
429
+ border-radius: 18px;
430
+ box-shadow: var(--shadow-card);
431
+ padding: var(--spacing-md) var(--spacing-lg);
432
+ backdrop-filter: blur(8px);
433
+ position: relative;
434
+ overflow-x: hidden;
435
+ overflow-y: visible;
436
+ }
437
+
438
+ .status-inspector {
439
+ position: sticky;
440
+ top: 24px;
441
+ align-self: start;
442
+ height: calc(100vh - 48px);
443
+ overflow: auto;
444
+ padding: 16px;
445
+ border-radius: var(--radius-xl);
446
+ border: 1px solid var(--color-border-soft);
447
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(255, 248, 241, 0.92) 100%);
448
+ box-shadow: var(--shadow-card);
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: 12px;
452
+ }
453
+
454
+ .inspector-head {
455
+ padding: 2px 2px 8px;
456
+ border-bottom: 1px solid rgba(216, 201, 184, 0.35);
457
+ }
458
+
459
+ .inspector-title {
460
+ font-size: 16px;
461
+ line-height: 1.25;
462
+ font-weight: 600;
463
+ color: var(--color-text-primary);
464
+ }
465
+
466
+ .inspector-subtitle {
467
+ margin-top: 4px;
468
+ font-size: 12px;
469
+ color: var(--color-text-tertiary);
470
+ }
471
+
472
+ .inspector-group {
473
+ padding: 12px;
474
+ border-radius: var(--radius-lg);
475
+ border: 1px solid rgba(216, 201, 184, 0.34);
476
+ background: rgba(255, 255, 255, 0.88);
477
+ box-shadow: var(--shadow-subtle);
478
+ }
479
+
480
+ .inspector-group-title {
481
+ font-size: 13px;
482
+ font-weight: 600;
483
+ color: var(--color-text-secondary);
484
+ margin-bottom: 10px;
485
+ }
486
+
487
+ .inspector-kv {
488
+ display: grid;
489
+ grid-template-columns: 92px minmax(0, 1fr);
490
+ gap: 8px 10px;
491
+ align-items: start;
492
+ }
493
+
494
+ .inspector-kv .key {
495
+ font-size: 11px;
496
+ line-height: 1.4;
497
+ color: var(--color-text-muted);
498
+ letter-spacing: 0.01em;
499
+ font-family: var(--font-family-mono);
500
+ }
501
+
502
+ .inspector-kv .value {
503
+ font-size: 14px;
504
+ line-height: 1.35;
505
+ font-weight: 500;
506
+ color: var(--color-text-primary);
507
+ overflow-wrap: anywhere;
508
+ word-break: break-word;
509
+ }
510
+
511
+ .inspector-kv .value.tone-ok {
512
+ color: var(--color-success);
513
+ }
514
+
515
+ .inspector-kv .value.tone-warn {
516
+ color: #8d5b31;
517
+ }
518
+
519
+ .inspector-kv .value.tone-error {
520
+ color: var(--color-error);
521
+ }
522
+
523
+ .panel-header {
524
+ margin-bottom: 12px;
525
+ text-align: left;
526
+ }
527
+
528
+ .hero {
529
+ display: flex;
530
+ align-items: center;
531
+ gap: var(--spacing-sm);
532
+ margin-bottom: var(--spacing-sm);
533
+ }
534
+
535
+ .hero-logo {
536
+ display: none;
537
+ width: 64px;
538
+ height: 64px;
539
+ border-radius: 18px;
540
+ padding: 8px;
541
+ background: var(--color-surface-elevated);
542
+ border: 1px solid var(--color-border-soft);
543
+ box-shadow: var(--shadow-card);
544
+ object-fit: contain;
545
+ }
546
+
547
+ .hero-title {
548
+ font-size: 48px;
549
+ line-height: 1.05;
550
+ font-family: var(--font-family-display);
551
+ color: var(--color-text-primary);
552
+ letter-spacing: -0.02em;
553
+ }
554
+
555
+ .hero-title .accent {
556
+ color: var(--color-brand);
557
+ }
558
+
559
+ .hero-subtitle {
560
+ margin-top: 8px;
561
+ font-size: var(--font-size-body);
562
+ color: var(--color-text-tertiary);
563
+ line-height: 1.5;
564
+ }
565
+
566
+ .top-tabs {
567
+ margin: 14px 0 18px;
568
+ background: rgba(255, 255, 255, 0.92);
569
+ border: 1px solid rgba(255, 255, 255, 0.7);
570
+ border-radius: 14px;
571
+ padding: 6px;
572
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.06);
573
+ display: grid;
574
+ grid-template-columns: repeat(4, 1fr);
575
+ gap: 8px;
576
+ backdrop-filter: blur(6px);
577
+ }
578
+
579
+ .top-tab {
580
+ border: 1px solid rgba(216, 201, 184, 0.55);
581
+ border-radius: 12px;
582
+ background: rgba(255, 255, 255, 0.96);
583
+ padding: 11px 10px;
584
+ font-size: var(--font-size-body);
585
+ color: var(--color-text-secondary);
586
+ text-align: center;
587
+ cursor: pointer;
588
+ transition: all var(--transition-normal) var(--ease-spring);
589
+ box-shadow: var(--shadow-subtle);
590
+ }
591
+
592
+ .top-tab:hover {
593
+ border-color: var(--color-brand);
594
+ color: var(--color-text-primary);
595
+ transform: translateY(-1px);
596
+ }
597
+
598
+ .top-tab.active {
599
+ border-color: var(--color-brand);
600
+ color: var(--color-text-primary);
601
+ background: linear-gradient(135deg, rgba(201, 94, 75, 0.12), rgba(255, 255, 255, 0.95));
602
+ box-shadow: 0 10px 24px rgba(27, 23, 20, 0.08);
603
+ }
604
+
605
+ .config-subtabs {
606
+ display: flex;
607
+ gap: 8px;
608
+ margin-bottom: 16px;
609
+ padding: 6px;
610
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.7));
611
+ border-radius: var(--radius-lg);
612
+ border: 1px solid rgba(255, 255, 255, 0.7);
613
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.05);
614
+ }
615
+
616
+ .config-subtab {
617
+ border: 1px solid var(--color-border-soft);
618
+ border-radius: var(--radius-lg);
619
+ padding: 10px 14px;
620
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(255, 250, 245, 0.9));
621
+ color: var(--color-text-secondary);
622
+ cursor: pointer;
623
+ font-size: var(--font-size-body);
624
+ font-weight: var(--font-weight-secondary);
625
+ transition: all var(--transition-normal) var(--ease-spring);
626
+ box-shadow: var(--shadow-subtle);
627
+ }
628
+
629
+ .config-subtab:hover {
630
+ border-color: var(--color-border-strong);
631
+ color: var(--color-text-primary);
632
+ }
633
+
634
+ .config-subtab.active {
635
+ border-color: var(--color-brand);
636
+ color: var(--color-text-primary);
637
+ background: linear-gradient(135deg, rgba(201, 94, 75, 0.18), rgba(255, 255, 255, 0.95));
638
+ box-shadow: var(--shadow-card);
639
+ }
640
+
641
+ .content-wrapper {
642
+ background: rgba(255, 255, 255, 0.94);
643
+ border: 1px solid rgba(216, 201, 184, 0.35);
644
+ border-radius: var(--radius-lg);
645
+ box-shadow: var(--shadow-subtle);
646
+ padding: 0;
647
+ }
648
+
649
+ .mode-content {
650
+ border-radius: var(--radius-lg);
651
+ background: rgba(255, 255, 255, 0.9);
652
+ box-shadow: var(--shadow-subtle);
653
+ padding: 12px;
654
+ }
655
+
656
+ /* ============================================
657
+ 主标题
658
+ ============================================ */
659
+ .main-title {
660
+ font-size: var(--font-size-display);
661
+ font-weight: var(--font-weight-display);
662
+ line-height: var(--line-height-tight);
663
+ letter-spacing: -0.03em;
664
+ margin-bottom: 10px;
665
+ color: var(--color-text-primary);
666
+ font-family: var(--font-family-display);
667
+ background: linear-gradient(135deg, var(--color-text-primary) 0%, rgba(27, 23, 20, 0.78) 100%);
668
+ -webkit-background-clip: text;
669
+ -webkit-text-fill-color: transparent;
670
+ background-clip: text;
671
+ }
672
+
673
+ .main-title .accent {
674
+ color: var(--color-brand);
675
+ -webkit-text-fill-color: var(--color-brand);
676
+ position: relative;
677
+ }
678
+
679
+ .subtitle {
680
+ font-size: var(--font-size-body);
681
+ color: var(--color-text-tertiary);
682
+ line-height: var(--line-height-normal);
683
+ margin-bottom: 20px;
684
+ max-width: 640px;
685
+ letter-spacing: 0.01em;
686
+ }
687
+
688
+ /* ============================================
689
+ 模式切换器 - Segmented Control
690
+ ============================================ */
691
+ .segmented-control {
692
+ display: flex;
693
+ background: rgba(255, 255, 255, 0.92);
694
+ border-radius: var(--radius-xl);
695
+ padding: 6px;
696
+ margin-bottom: 20px;
697
+ position: relative;
698
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.06);
699
+ border: 1px solid rgba(255, 255, 255, 0.7);
700
+ backdrop-filter: blur(6px);
701
+ }
702
+
703
+ .segment {
704
+ flex: 1;
705
+ padding: 11px 16px;
706
+ border: none;
707
+ background: transparent;
708
+ font-size: var(--font-size-body);
709
+ font-weight: var(--font-weight-secondary);
710
+ color: var(--color-text-secondary);
711
+ cursor: pointer;
712
+ border-radius: 10px;
713
+ transition: all var(--transition-normal) var(--ease-spring);
714
+ position: relative;
715
+ z-index: 2;
716
+ letter-spacing: 0.01em;
717
+ }
718
+
719
+ .segment:hover {
720
+ color: var(--color-text-primary);
721
+ }
722
+
723
+ .segment.active {
724
+ color: var(--color-text-primary);
725
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.8) 100%);
726
+ box-shadow: var(--shadow-subtle), inset 0 1px 0 rgba(255, 255, 255, 0.85);
727
+ }
728
+
729
+ /* ============================================
730
+ 卡片列表
731
+ ============================================ */
732
+ .card-list {
733
+ display: flex;
734
+ flex-direction: column;
735
+ gap: 12px;
736
+ margin-bottom: 12px;
737
+ }
738
+
739
+ /* ============================================
740
+ 卡片
741
+ ============================================ */
742
+ .card {
743
+ background: linear-gradient(180deg, #fffdf9 0%, #fff8f2 100%);
744
+ border-radius: var(--radius-lg);
745
+ padding: 10px;
746
+ display: flex;
747
+ align-items: center;
748
+ justify-content: space-between;
749
+ cursor: pointer;
750
+ transition:
751
+ transform var(--transition-normal) var(--ease-spring),
752
+ box-shadow var(--transition-normal) var(--ease-spring),
753
+ background-color var(--transition-fast) var(--ease-smooth);
754
+ box-shadow: 0 10px 24px rgba(27, 23, 20, 0.08);
755
+ user-select: none;
756
+ will-change: transform;
757
+ border: 1px solid rgba(216, 201, 184, 0.55);
758
+ position: relative;
759
+ overflow: hidden;
760
+ }
761
+
762
+ .card:hover {
763
+ transform: translateY(-1px);
764
+ box-shadow: var(--shadow-card-hover);
765
+ }
766
+
767
+ .card::before,
768
+ .card::after {
769
+ content: "";
770
+ position: absolute;
771
+ pointer-events: none;
772
+ }
773
+
774
+ .card::before {
775
+ left: 0;
776
+ top: 10px;
777
+ bottom: 10px;
778
+ width: 3px;
779
+ border-radius: 999px;
780
+ background: transparent;
781
+ transition: background var(--transition-fast) var(--ease-smooth);
782
+ }
783
+
784
+ .card::after {
785
+ inset: 0;
786
+ border-radius: inherit;
787
+ background: linear-gradient(120deg, rgba(255, 255, 255, 0.7) 0%, transparent 55%);
788
+ opacity: 0;
789
+ transition: opacity var(--transition-normal) var(--ease-smooth);
790
+ }
791
+
792
+ .card:active {
793
+ transform: translateY(0);
794
+ transition: transform var(--transition-instant) var(--ease-smooth);
795
+ }
796
+
797
+ .card.active {
798
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.14) 0%, rgba(255, 255, 255, 0.98) 100%);
799
+ border-color: rgba(201, 94, 75, 0.55);
800
+ box-shadow: 0 10px 28px rgba(210, 107, 90, 0.14);
801
+ }
802
+
803
+ .card.active::before {
804
+ background: linear-gradient(180deg, rgba(201, 94, 75, 0.95) 0%, rgba(201, 94, 75, 0.35) 100%);
805
+ }
806
+
807
+ .card:hover::after {
808
+ opacity: 0.6;
809
+ }
810
+
811
+ .card.active .card-icon {
812
+ transform: scale(1.05);
813
+ }
814
+
815
+ .card-leading {
816
+ display: flex;
817
+ align-items: center;
818
+ gap: var(--spacing-sm);
819
+ flex: 1;
820
+ min-width: 0;
821
+ }
822
+
823
+ .card-icon {
824
+ width: 40px;
825
+ height: 40px;
826
+ border-radius: var(--radius-sm);
827
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(247, 241, 232, 0.65) 100%);
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: center;
831
+ font-size: var(--font-size-title);
832
+ font-weight: var(--font-weight-title);
833
+ color: var(--color-text-secondary);
834
+ flex-shrink: 0;
835
+ transition: all var(--transition-normal) var(--ease-spring-soft);
836
+ box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.7);
837
+ }
838
+
839
+ .card.active .card-icon {
840
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
841
+ color: white;
842
+ box-shadow: 0 2px 8px rgba(210, 107, 90, 0.3);
843
+ }
844
+
845
+ .card-content {
846
+ display: flex;
847
+ flex-direction: column;
848
+ gap: 2px;
849
+ min-width: 0;
850
+ }
851
+
852
+ .card-title {
853
+ display: flex;
854
+ align-items: center;
855
+ gap: 8px;
856
+ min-width: 0;
857
+ font-size: var(--font-size-body);
858
+ font-weight: var(--font-weight-secondary);
859
+ color: var(--color-text-primary);
860
+ white-space: nowrap;
861
+ overflow: hidden;
862
+ text-overflow: ellipsis;
863
+ letter-spacing: -0.01em;
864
+ }
865
+
866
+ .card-title > span:first-child {
867
+ min-width: 0;
868
+ overflow: hidden;
869
+ text-overflow: ellipsis;
870
+ white-space: nowrap;
871
+ }
872
+
873
+ .provider-readonly-badge {
874
+ display: inline-flex;
875
+ align-items: center;
876
+ justify-content: center;
877
+ padding: 2px 8px;
878
+ border-radius: var(--radius-full);
879
+ font-size: 11px;
880
+ line-height: 1;
881
+ color: #6f4b00;
882
+ background: linear-gradient(135deg, rgba(246, 211, 106, 0.32) 0%, rgba(246, 211, 106, 0.2) 100%);
883
+ border: 1px solid rgba(191, 151, 40, 0.35);
884
+ flex-shrink: 0;
885
+ }
886
+
887
+ .card-subtitle {
888
+ font-size: var(--font-size-secondary);
889
+ color: var(--color-text-tertiary);
890
+ white-space: nowrap;
891
+ overflow: hidden;
892
+ text-overflow: ellipsis;
893
+ opacity: 0.8;
894
+ }
895
+
896
+ .card-trailing {
897
+ display: grid;
898
+ grid-auto-flow: column;
899
+ grid-auto-columns: max-content;
900
+ column-gap: var(--spacing-xs);
901
+ row-gap: 6px;
902
+ align-items: center;
903
+ justify-content: end;
904
+ }
905
+
906
+ .card-trailing .card-actions {
907
+ margin-left: 0;
908
+ justify-self: end;
909
+ }
910
+
911
+ .card-trailing .pill,
912
+ .card-trailing .latency {
913
+ justify-self: end;
914
+ }
915
+
916
+ /* 卡片操作按钮 - hover 显示 */
917
+ .card-actions {
918
+ display: flex;
919
+ gap: 8px;
920
+ opacity: 0;
921
+ transform: translateX(4px);
922
+ transition: all var(--transition-normal) var(--ease-spring);
923
+ }
924
+
925
+ .card:hover .card-actions {
926
+ opacity: 1;
927
+ transform: translateX(0);
928
+ }
929
+
930
+ .mode-cards .card-actions {
931
+ opacity: 1;
932
+ transform: translateX(0);
933
+ }
934
+
935
+ .card-action-btn {
936
+ width: 40px;
937
+ height: 40px;
938
+ border-radius: 10px;
939
+ border: 1px solid rgba(70, 86, 110, 0.22);
940
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(255, 255, 255, 0.9));
941
+ color: var(--color-text-secondary);
942
+ cursor: pointer;
943
+ display: flex;
944
+ align-items: center;
945
+ justify-content: center;
946
+ transition: all var(--transition-fast) var(--ease-spring);
947
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
948
+ }
949
+
950
+ .card-action-btn:hover {
951
+ background: linear-gradient(135deg, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.95) 100%);
952
+ color: var(--color-text-primary);
953
+ transform: translateY(-1px);
954
+ }
955
+
956
+ .card-action-btn.delete:hover {
957
+ background: linear-gradient(135deg, rgba(200, 74, 58, 0.1) 0%, rgba(200, 74, 58, 0.05) 100%);
958
+ color: var(--color-error);
959
+ }
960
+
961
+ .card-action-btn:disabled,
962
+ .card-action-btn.disabled {
963
+ opacity: 0.45;
964
+ cursor: not-allowed;
965
+ transform: none;
966
+ filter: grayscale(0.1);
967
+ }
968
+
969
+ .card-action-btn.delete:disabled:hover,
970
+ .card-action-btn.delete.disabled:hover {
971
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(255, 255, 255, 0.9));
972
+ color: var(--color-text-secondary);
973
+ }
974
+
975
+ .card-action-btn svg {
976
+ width: 18px;
977
+ height: 18px;
978
+ }
979
+
980
+ /* ============================================
981
+ 状态徽章
982
+ ============================================ */
983
+ .pill {
984
+ padding: 5px 11px;
985
+ border-radius: var(--radius-full);
986
+ font-size: var(--font-size-caption);
987
+ font-weight: var(--font-weight-caption);
988
+ background-color: rgba(255, 255, 255, 0.8);
989
+ color: var(--color-text-tertiary);
990
+ text-transform: uppercase;
991
+ letter-spacing: 0.06em;
992
+ transition: all var(--transition-fast) var(--ease-smooth);
993
+ box-shadow: inset 0 0.5px 1px rgba(0, 0, 0, 0.04);
994
+ }
995
+
996
+ .pill.configured {
997
+ background: linear-gradient(135deg, rgba(90, 139, 106, 0.15) 0%, rgba(90, 139, 106, 0.08) 100%);
998
+ color: var(--color-success);
999
+ box-shadow: inset 0 0.5px 1px rgba(90, 139, 106, 0.2);
1000
+ }
1001
+
1002
+ .pill.empty {
1003
+ background: linear-gradient(135deg, rgba(200, 74, 58, 0.1) 0%, rgba(200, 74, 58, 0.05) 100%);
1004
+ color: var(--color-error);
1005
+ box-shadow: inset 0 0.5px 1px rgba(200, 74, 58, 0.15);
1006
+ }
1007
+
1008
+ .latency {
1009
+ padding: 4px 10px;
1010
+ border-radius: var(--radius-full);
1011
+ font-size: var(--font-size-caption);
1012
+ font-weight: var(--font-weight-caption);
1013
+ background: var(--color-bg);
1014
+ color: var(--color-text-tertiary);
1015
+ letter-spacing: 0.02em;
1016
+ min-width: 64px;
1017
+ text-align: center;
1018
+ display: inline-flex;
1019
+ align-items: center;
1020
+ justify-content: center;
1021
+ flex-shrink: 0;
1022
+ }
1023
+
1024
+ .latency.ok {
1025
+ color: var(--color-success);
1026
+ background: rgba(90, 139, 106, 0.1);
1027
+ }
1028
+
1029
+ .latency.error {
1030
+ color: var(--color-error);
1031
+ background: rgba(200, 74, 58, 0.08);
1032
+ }
1033
+
1034
+ .card-action-btn.loading svg {
1035
+ animation: spin 0.9s linear infinite;
1036
+ }
1037
+
1038
+ /* ============================================
1039
+ 图标 - SVG 优化
1040
+ ============================================ */
1041
+ .icon {
1042
+ width: 20px;
1043
+ height: 20px;
1044
+ flex-shrink: 0;
1045
+ stroke-linecap: round;
1046
+ stroke-linejoin: round;
1047
+ }
1048
+
1049
+ .icon-chevron-right {
1050
+ color: var(--color-text-tertiary);
1051
+ opacity: 0.5;
1052
+ }
1053
+
1054
+ /* ============================================
1055
+ 选择器 - 用于模型选择
1056
+ ============================================ */
1057
+ .selector-section {
1058
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
1059
+ border-radius: var(--radius-lg);
1060
+ padding: calc(var(--spacing-sm) + 2px);
1061
+ margin-bottom: 16px;
1062
+ box-shadow: var(--shadow-card);
1063
+ border: 1px solid var(--color-border-soft);
1064
+ display: flex;
1065
+ flex-direction: column;
1066
+ gap: var(--spacing-xs);
1067
+ }
1068
+
1069
+ .selector-header {
1070
+ display: flex;
1071
+ justify-content: space-between;
1072
+ align-items: center;
1073
+ margin-bottom: var(--spacing-xs);
1074
+ }
1075
+
1076
+ .selector-title {
1077
+ font-size: var(--font-size-caption);
1078
+ font-weight: var(--font-weight-secondary);
1079
+ color: var(--color-text-muted);
1080
+ text-transform: none;
1081
+ letter-spacing: 0.04em;
1082
+ opacity: 0.85;
1083
+ }
1084
+
1085
+ .selector-actions {
1086
+ display: flex;
1087
+ gap: var(--spacing-xs);
1088
+ }
1089
+
1090
+ .health-report {
1091
+ margin-top: 10px;
1092
+ padding: 10px 12px;
1093
+ border-radius: var(--radius-md);
1094
+ border: 1px solid var(--color-border-soft);
1095
+ background: var(--color-surface-alt);
1096
+ display: grid;
1097
+ gap: 8px;
1098
+ }
1099
+
1100
+ .health-remote-toggle {
1101
+ display: inline-flex;
1102
+ align-items: center;
1103
+ gap: 8px;
1104
+ font-size: var(--font-size-caption);
1105
+ color: var(--color-text-secondary);
1106
+ }
1107
+
1108
+ .health-remote-toggle input {
1109
+ accent-color: var(--color-brand);
1110
+ }
1111
+
1112
+ .health-ok {
1113
+ color: var(--color-success);
1114
+ font-weight: var(--font-weight-secondary);
1115
+ }
1116
+
1117
+ .health-issue {
1118
+ background: #fff6f5;
1119
+ border-left: 3px solid var(--color-error);
1120
+ padding: 8px 10px;
1121
+ border-radius: 10px;
1122
+ }
1123
+
1124
+ .health-issue-title {
1125
+ font-size: var(--font-size-caption);
1126
+ font-weight: var(--font-weight-secondary);
1127
+ color: var(--color-text-primary);
1128
+ margin-bottom: 4px;
1129
+ }
1130
+
1131
+ .health-issue-suggestion {
1132
+ font-size: var(--font-size-caption);
1133
+ color: var(--color-text-secondary);
1134
+ line-height: 1.4;
1135
+ }
1136
+
1137
+ .btn-icon {
1138
+ width: 28px;
1139
+ height: 28px;
1140
+ border-radius: var(--radius-sm);
1141
+ border: none;
1142
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
1143
+ color: white;
1144
+ cursor: pointer;
1145
+ font-size: 16px;
1146
+ display: flex;
1147
+ align-items: center;
1148
+ justify-content: center;
1149
+ transition: all var(--transition-fast) var(--ease-spring);
1150
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
1151
+ }
1152
+
1153
+ .btn-icon:hover {
1154
+ transform: translateY(-1px) scale(1.05);
1155
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
1156
+ }
1157
+
1158
+ .btn-icon:active {
1159
+ transform: translateY(0) scale(0.98);
1160
+ }
1161
+
1162
+ .model-select {
1163
+ width: 100%;
1164
+ padding: 12px var(--spacing-sm);
1165
+ padding-right: 40px;
1166
+ border: 1px solid var(--color-border-soft);
1167
+ border-radius: var(--radius-sm);
1168
+ font-size: var(--font-size-body);
1169
+ font-weight: var(--font-weight-body);
1170
+ background-color: var(--color-surface-alt);
1171
+ color: var(--color-text-primary);
1172
+ outline: none;
1173
+ cursor: pointer;
1174
+ appearance: none;
1175
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='none' stroke='%23505A66' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
1176
+ background-repeat: no-repeat;
1177
+ background-position: right 14px center;
1178
+ background-size: 12px;
1179
+ transition: all var(--transition-fast) var(--ease-smooth);
1180
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
1181
+ }
1182
+
1183
+ .model-select:hover {
1184
+ border-color: var(--color-border-strong);
1185
+ background-color: var(--color-surface);
1186
+ }
1187
+
1188
+ .model-select:focus {
1189
+ background-color: var(--color-surface);
1190
+ border-color: var(--color-brand);
1191
+ box-shadow: var(--shadow-input-focus);
1192
+ }
1193
+
1194
+ .model-input {
1195
+ width: 100%;
1196
+ padding: 12px var(--spacing-sm);
1197
+ border: 1px solid var(--color-border-soft);
1198
+ border-radius: var(--radius-sm);
1199
+ font-size: var(--font-size-body);
1200
+ font-weight: var(--font-weight-body);
1201
+ background-color: var(--color-surface-alt);
1202
+ color: var(--color-text-primary);
1203
+ outline: none;
1204
+ transition: all var(--transition-fast) var(--ease-smooth);
1205
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
1206
+ }
1207
+
1208
+ .model-input:hover {
1209
+ border-color: var(--color-border-strong);
1210
+ background-color: var(--color-surface);
1211
+ }
1212
+
1213
+ .model-input:focus {
1214
+ background-color: var(--color-surface);
1215
+ border-color: var(--color-brand);
1216
+ box-shadow: var(--shadow-input-focus);
1217
+ }
1218
+
1219
+ .config-template-hint {
1220
+ margin-top: 8px;
1221
+ margin-bottom: 10px;
1222
+ font-size: var(--font-size-caption);
1223
+ color: var(--color-text-tertiary);
1224
+ line-height: 1.4;
1225
+ }
1226
+
1227
+ .btn-template-editor {
1228
+ width: 100%;
1229
+ margin-top: 2px;
1230
+ }
1231
+
1232
+ /* ============================================
1233
+ 按钮
1234
+ ============================================ */
1235
+ .btn-add {
1236
+ width: 100%;
1237
+ padding: 14px var(--spacing-sm);
1238
+ border: 1.5px dashed rgba(208, 196, 182, 0.6);
1239
+ border-radius: var(--radius-lg);
1240
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0.15) 100%);
1241
+ font-size: var(--font-size-body);
1242
+ font-weight: var(--font-weight-secondary);
1243
+ color: var(--color-text-tertiary);
1244
+ cursor: pointer;
1245
+ transition: all var(--transition-normal) var(--ease-spring);
1246
+ display: flex;
1247
+ align-items: center;
1248
+ justify-content: center;
1249
+ gap: var(--spacing-xs);
1250
+ }
1251
+
1252
+ .btn-add + .selector-section,
1253
+ .selector-section + .btn-add,
1254
+ .btn-add + .card-list,
1255
+ .card-list + .btn-add {
1256
+ margin-top: 12px;
1257
+ }
1258
+
1259
+ .btn-add:hover {
1260
+ border-color: var(--color-brand);
1261
+ color: var(--color-brand);
1262
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.05) 0%, rgba(210, 107, 90, 0.02) 100%);
1263
+ transform: translateY(-1px);
1264
+ }
1265
+
1266
+ .btn-add:active {
1267
+ transform: translateY(0) scale(0.99);
1268
+ }
1269
+
1270
+ .btn-add .icon {
1271
+ width: 18px;
1272
+ height: 18px;
1273
+ transition: transform var(--transition-normal) var(--ease-spring);
1274
+ }
1275
+
1276
+ .btn-add:hover .icon {
1277
+ transform: rotate(90deg);
1278
+ }
1279
+
1280
+ .btn-tool {
1281
+ padding: 12px var(--spacing-sm);
1282
+ border-radius: var(--radius-sm);
1283
+ border: 1px solid var(--color-border-soft);
1284
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
1285
+ font-size: var(--font-size-body);
1286
+ font-weight: var(--font-weight-secondary);
1287
+ color: var(--color-text-secondary);
1288
+ cursor: pointer;
1289
+ transition: all var(--transition-fast) var(--ease-spring);
1290
+ box-shadow: var(--shadow-subtle);
1291
+ letter-spacing: -0.01em;
1292
+ width: 100%;
1293
+ text-align: center;
1294
+ }
1295
+
1296
+ .selector-section .btn-tool + .btn-tool {
1297
+ margin-left: 0;
1298
+ margin-top: var(--spacing-xs);
1299
+ }
1300
+
1301
+ .btn-tool:hover {
1302
+ border-color: var(--color-brand);
1303
+ color: var(--color-brand);
1304
+ transform: translateY(-1px);
1305
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.12);
1306
+ }
1307
+
1308
+ .btn-tool-compact {
1309
+ padding: 9px 12px;
1310
+ font-size: var(--font-size-secondary);
1311
+ }
1312
+
1313
+ .selector-header .btn-tool-compact {
1314
+ padding: 6px 10px;
1315
+ font-size: var(--font-size-caption);
1316
+ line-height: 1.1;
1317
+ box-shadow: var(--shadow-subtle);
1318
+ }
1319
+
1320
+ .session-toolbar {
1321
+ display: grid;
1322
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1323
+ gap: var(--spacing-xs);
1324
+ margin-bottom: var(--spacing-sm);
1325
+ align-items: end;
1326
+ }
1327
+
1328
+ .session-toolbar-group {
1329
+ display: flex;
1330
+ align-items: center;
1331
+ gap: var(--spacing-xs);
1332
+ flex-wrap: wrap;
1333
+ min-width: 0;
1334
+ }
1335
+
1336
+ .session-toolbar-grow {
1337
+ grid-column: span 2;
1338
+ }
1339
+
1340
+ .session-toolbar-actions {
1341
+ justify-content: flex-end;
1342
+ }
1343
+
1344
+ .session-toolbar-footer {
1345
+ display: flex;
1346
+ align-items: center;
1347
+ justify-content: flex-end;
1348
+ gap: var(--spacing-xs);
1349
+ margin-top: -2px;
1350
+ padding-top: 6px;
1351
+ margin-bottom: 12px;
1352
+ border-top: 1px dashed var(--color-border-soft);
1353
+ }
1354
+
1355
+ .session-toolbar-footer .quick-option {
1356
+ margin: 0;
1357
+ padding: 6px 10px;
1358
+ border-radius: var(--radius-sm);
1359
+ border: 1px solid var(--color-border-soft);
1360
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.8) 100%);
1361
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
1362
+ transition: all var(--transition-fast) var(--ease-spring);
1363
+ line-height: 1.2;
1364
+ }
1365
+
1366
+ .session-toolbar-footer .quick-option:hover {
1367
+ border-color: var(--color-border-strong);
1368
+ }
1369
+
1370
+ .session-source-select,
1371
+ .session-path-select,
1372
+ .session-query-input,
1373
+ .session-role-select,
1374
+ .session-time-select {
1375
+ flex: 1;
1376
+ min-width: 160px;
1377
+ padding: 10px 12px;
1378
+ border-radius: var(--radius-sm);
1379
+ border: 1px solid var(--color-border-soft);
1380
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
1381
+ color: var(--color-text-secondary);
1382
+ font-size: var(--font-size-body);
1383
+ font-family: var(--font-family);
1384
+ outline: none;
1385
+ transition: all var(--transition-fast) var(--ease-spring);
1386
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
1387
+ }
1388
+
1389
+ .session-query-input {
1390
+ flex: 2;
1391
+ min-width: 220px;
1392
+ }
1393
+
1394
+ .session-source-select:hover,
1395
+ .session-path-select:hover,
1396
+ .session-query-input:hover,
1397
+ .session-role-select:hover,
1398
+ .session-time-select:hover {
1399
+ border-color: var(--color-border-strong);
1400
+ }
1401
+
1402
+ .session-source-select:focus,
1403
+ .session-path-select:focus,
1404
+ .session-query-input:focus,
1405
+ .session-role-select:focus,
1406
+ .session-time-select:focus {
1407
+ border-color: var(--color-brand);
1408
+ box-shadow: var(--shadow-input-focus);
1409
+ }
1410
+
1411
+ .session-hint {
1412
+ font-size: var(--font-size-secondary);
1413
+ color: var(--color-text-tertiary);
1414
+ margin-bottom: 12px;
1415
+ line-height: 1.45;
1416
+ }
1417
+
1418
+ .session-card {
1419
+ align-items: flex-start;
1420
+ cursor: default;
1421
+ }
1422
+
1423
+ .session-card:hover {
1424
+ transform: none;
1425
+ box-shadow: var(--shadow-card);
1426
+ }
1427
+
1428
+ .session-card .card-leading {
1429
+ align-items: flex-start;
1430
+ }
1431
+
1432
+ .session-meta {
1433
+ margin-top: 6px;
1434
+ font-size: var(--font-size-caption);
1435
+ color: var(--color-text-tertiary);
1436
+ line-height: 1.4;
1437
+ word-break: break-all;
1438
+ }
1439
+
1440
+ .session-actions {
1441
+ display: flex;
1442
+ gap: var(--spacing-xs);
1443
+ align-items: center;
1444
+ margin-left: var(--spacing-sm);
1445
+ flex-shrink: 0;
1446
+ }
1447
+
1448
+ .session-source {
1449
+ font-size: var(--font-size-caption);
1450
+ color: var(--color-brand);
1451
+ border: 1px solid rgba(210, 107, 90, 0.25);
1452
+ border-radius: 999px;
1453
+ padding: 2px 8px;
1454
+ background: rgba(210, 107, 90, 0.08);
1455
+ white-space: nowrap;
1456
+ }
1457
+
1458
+ .session-count-badge {
1459
+ display: inline-flex;
1460
+ align-items: center;
1461
+ justify-content: center;
1462
+ min-width: 22px;
1463
+ height: 22px;
1464
+ padding: 0 7px;
1465
+ border-radius: 999px;
1466
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
1467
+ color: #fff;
1468
+ font-size: var(--font-size-caption);
1469
+ font-weight: var(--font-weight-secondary);
1470
+ line-height: 1;
1471
+ box-shadow: 0 4px 10px rgba(208, 88, 58, 0.16);
1472
+ flex-shrink: 0;
1473
+ }
1474
+
1475
+ .btn-session-export,
1476
+ .btn-session-open,
1477
+ .btn-session-clone,
1478
+ .btn-session-refresh {
1479
+ border: 1px solid var(--color-border-soft);
1480
+ border-radius: var(--radius-sm);
1481
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.9) 100%);
1482
+ color: var(--color-text-secondary);
1483
+ padding: 8px 12px;
1484
+ font-size: var(--font-size-secondary);
1485
+ font-weight: var(--font-weight-secondary);
1486
+ cursor: pointer;
1487
+ transition: all var(--transition-fast) var(--ease-spring);
1488
+ white-space: nowrap;
1489
+ box-shadow: var(--shadow-subtle);
1490
+ letter-spacing: -0.01em;
1491
+ }
1492
+
1493
+ .btn-session-delete {
1494
+ border: 1px solid rgba(189, 70, 68, 0.45);
1495
+ border-radius: var(--radius-sm);
1496
+ background: linear-gradient(to bottom, rgba(255, 245, 245, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
1497
+ color: #b74545;
1498
+ padding: 8px 12px;
1499
+ font-size: var(--font-size-secondary);
1500
+ font-weight: var(--font-weight-secondary);
1501
+ cursor: pointer;
1502
+ transition: all var(--transition-fast) var(--ease-spring);
1503
+ white-space: nowrap;
1504
+ box-shadow: var(--shadow-subtle);
1505
+ letter-spacing: -0.01em;
1506
+ }
1507
+
1508
+ .btn-session-refresh:hover {
1509
+ border-color: var(--color-brand);
1510
+ color: var(--color-brand);
1511
+ transform: translateY(-1px);
1512
+ }
1513
+
1514
+ .btn-session-refresh:disabled {
1515
+ opacity: 0.5;
1516
+ cursor: not-allowed;
1517
+ transform: none;
1518
+ }
1519
+
1520
+ .btn-session-export:hover,
1521
+ .btn-session-open:hover {
1522
+ border-color: var(--color-brand);
1523
+ color: var(--color-brand);
1524
+ transform: translateY(-1px);
1525
+ }
1526
+
1527
+ .btn-session-export:disabled,
1528
+ .btn-session-open:disabled {
1529
+ opacity: 0.5;
1530
+ cursor: not-allowed;
1531
+ transform: none;
1532
+ }
1533
+
1534
+ .btn-session-clone:hover {
1535
+ border-color: var(--color-brand);
1536
+ color: var(--color-brand);
1537
+ transform: translateY(-1px);
1538
+ }
1539
+
1540
+ .btn-session-clone:disabled {
1541
+ opacity: 0.5;
1542
+ cursor: not-allowed;
1543
+ transform: none;
1544
+ }
1545
+
1546
+ .btn-session-delete:hover {
1547
+ border-color: rgba(189, 70, 68, 0.8);
1548
+ color: #9f3b3b;
1549
+ transform: translateY(-1px);
1550
+ }
1551
+
1552
+ .btn-session-delete:disabled {
1553
+ opacity: 0.5;
1554
+ cursor: not-allowed;
1555
+ transform: none;
1556
+ }
1557
+
1558
+ .session-empty {
1559
+ padding: 28px var(--spacing-sm);
1560
+ text-align: center;
1561
+ border: 1px dashed var(--color-border-soft);
1562
+ border-radius: var(--radius-lg);
1563
+ color: var(--color-text-tertiary);
1564
+ background: var(--bg-warm-gradient);
1565
+ position: relative;
1566
+ box-shadow: var(--shadow-subtle);
1567
+ }
1568
+
1569
+ .session-empty::before {
1570
+ content: "";
1571
+ display: block;
1572
+ width: 36px;
1573
+ height: 36px;
1574
+ border-radius: 50%;
1575
+ margin: 0 auto 10px;
1576
+ background: rgba(210, 107, 90, 0.12);
1577
+ box-shadow: inset 0 0 0 6px rgba(255, 255, 255, 0.7);
1578
+ }
1579
+
1580
+ .session-layout {
1581
+ display: grid;
1582
+ grid-template-columns: minmax(215px, 295px) minmax(0, 1fr);
1583
+ gap: var(--spacing-sm);
1584
+ align-items: start;
1585
+ height: min(72vh, 760px);
1586
+ min-height: 520px;
1587
+ }
1588
+
1589
+ .session-layout.session-standalone {
1590
+ grid-template-columns: minmax(0, 1fr);
1591
+ }
1592
+
1593
+ .session-standalone-page {
1594
+ max-width: 960px;
1595
+ margin: 0 auto;
1596
+ padding: var(--spacing-sm) 0;
1597
+ }
1598
+
1599
+ .session-standalone-title {
1600
+ font-size: var(--font-size-title);
1601
+ font-weight: var(--font-weight-title);
1602
+ color: var(--color-text-primary);
1603
+ margin-bottom: var(--spacing-sm);
1604
+ letter-spacing: -0.01em;
1605
+ }
1606
+
1607
+ .session-standalone-text {
1608
+ white-space: pre-wrap;
1609
+ font-family: var(--font-family-body);
1610
+ font-size: var(--font-size-body);
1611
+ line-height: 1.7;
1612
+ color: var(--color-text-primary);
1613
+ word-break: break-word;
1614
+ }
1615
+
1616
+ .session-list {
1617
+ display: flex;
1618
+ flex-direction: column;
1619
+ gap: var(--spacing-xs);
1620
+ position: sticky;
1621
+ top: 12px;
1622
+ height: 100%;
1623
+ max-height: none;
1624
+ overflow-y: auto;
1625
+ overflow-x: hidden;
1626
+ padding-right: 4px;
1627
+ min-width: 0;
1628
+ scrollbar-width: thin;
1629
+ scrollbar-color: rgba(166, 149, 130, 0.85) transparent;
1630
+ }
1631
+
1632
+ .session-list::-webkit-scrollbar,
1633
+ .session-preview-scroll::-webkit-scrollbar {
1634
+ width: 10px;
1635
+ height: 10px;
1636
+ }
1637
+
1638
+ .session-list::-webkit-scrollbar-track,
1639
+ .session-preview-scroll::-webkit-scrollbar-track {
1640
+ background: transparent;
1641
+ border-radius: 999px;
1642
+ }
1643
+
1644
+ .session-list::-webkit-scrollbar-thumb,
1645
+ .session-preview-scroll::-webkit-scrollbar-thumb {
1646
+ background: linear-gradient(to bottom, rgba(191, 174, 154, 0.95) 0%, rgba(160, 141, 121, 0.95) 100%);
1647
+ border-radius: 999px;
1648
+ border: 2px solid rgba(255, 255, 255, 0.9);
1649
+ }
1650
+
1651
+ .session-list::-webkit-scrollbar-thumb:hover,
1652
+ .session-preview-scroll::-webkit-scrollbar-thumb:hover {
1653
+ background: linear-gradient(to bottom, rgba(175, 156, 136, 0.95) 0%, rgba(145, 126, 107, 0.95) 100%);
1654
+ }
1655
+
1656
+ .session-item {
1657
+ border: 1px solid var(--color-border-soft);
1658
+ border-radius: var(--radius-sm);
1659
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.92) 100%);
1660
+ padding: 14px 16px;
1661
+ cursor: pointer;
1662
+ transition: all var(--transition-fast) var(--ease-spring);
1663
+ user-select: none;
1664
+ min-width: 0;
1665
+ position: relative;
1666
+ overflow: hidden;
1667
+ min-height: 88px;
1668
+ }
1669
+
1670
+ .session-item-header {
1671
+ display: flex;
1672
+ align-items: center;
1673
+ justify-content: space-between;
1674
+ gap: 10px;
1675
+ margin-bottom: 4px;
1676
+ }
1677
+
1678
+ .session-item-main {
1679
+ min-width: 0;
1680
+ flex: 1;
1681
+ display: flex;
1682
+ align-items: center;
1683
+ gap: 8px;
1684
+ }
1685
+
1686
+ .session-item:hover {
1687
+ border-color: var(--color-brand);
1688
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.08) 0%, rgba(255, 255, 255, 0.98) 100%);
1689
+ transform: translateY(-1px);
1690
+ }
1691
+
1692
+ .session-item::before {
1693
+ content: "";
1694
+ position: absolute;
1695
+ left: 0;
1696
+ top: 10px;
1697
+ bottom: 10px;
1698
+ width: 3px;
1699
+ border-radius: 999px;
1700
+ background: rgba(210, 107, 90, 0.15);
1701
+ transition: background var(--transition-fast) var(--ease-spring);
1702
+ }
1703
+
1704
+ .session-item:active {
1705
+ transform: scale(0.99);
1706
+ }
1707
+
1708
+ .session-item.active {
1709
+ border-color: var(--color-brand);
1710
+ background: linear-gradient(to bottom, rgba(210, 107, 90, 0.1) 0%, rgba(255, 255, 255, 0.98) 100%);
1711
+ box-shadow: 0 6px 16px rgba(210, 107, 90, 0.12);
1712
+ }
1713
+
1714
+ .session-item.active::before {
1715
+ background: linear-gradient(180deg, rgba(201, 94, 75, 0.9), rgba(201, 94, 75, 0.4));
1716
+ }
1717
+
1718
+ .session-item-title {
1719
+ font-size: var(--font-size-body);
1720
+ font-weight: var(--font-weight-secondary);
1721
+ color: var(--color-text-primary);
1722
+ line-height: 1.5;
1723
+ display: block;
1724
+ white-space: nowrap;
1725
+ overflow: hidden;
1726
+ text-overflow: ellipsis;
1727
+ flex: 1;
1728
+ max-width: 75%;
1729
+ }
1730
+
1731
+ .session-item-actions {
1732
+ display: inline-flex;
1733
+ align-items: center;
1734
+ gap: 6px;
1735
+ flex-shrink: 0;
1736
+ }
1737
+
1738
+ .session-item-copy {
1739
+ border: 1px solid rgba(70, 86, 110, 0.35);
1740
+ background: rgba(70, 86, 110, 0.08);
1741
+ color: var(--color-text-secondary);
1742
+ width: 28px;
1743
+ height: 28px;
1744
+ border-radius: 8px;
1745
+ display: inline-flex;
1746
+ align-items: center;
1747
+ justify-content: center;
1748
+ cursor: pointer;
1749
+ flex-shrink: 0;
1750
+ transition: all var(--transition-fast) var(--ease-spring);
1751
+ }
1752
+
1753
+ .session-item-copy:hover {
1754
+ border-color: rgba(70, 86, 110, 0.7);
1755
+ background: rgba(70, 86, 110, 0.16);
1756
+ color: var(--color-text-primary);
1757
+ transform: translateY(-1px);
1758
+ }
1759
+
1760
+ .session-item-copy:disabled {
1761
+ opacity: 0.5;
1762
+ cursor: not-allowed;
1763
+ transform: none;
1764
+ }
1765
+
1766
+ .session-item-copy svg {
1767
+ width: 16px;
1768
+ height: 16px;
1769
+ }
1770
+
1771
+ .session-item-sub.session-item-snippet,
1772
+ .session-preview-meta,
1773
+ .session-preview-title {
1774
+ display: none !important;
1775
+ }
1776
+
1777
+ .session-item-sub {
1778
+ font-size: var(--font-size-caption);
1779
+ color: var(--color-text-tertiary);
1780
+ line-height: 1.35;
1781
+ white-space: nowrap;
1782
+ overflow: hidden;
1783
+ text-overflow: ellipsis;
1784
+ }
1785
+
1786
+ .session-item-sub.session-item-wrap {
1787
+ white-space: normal;
1788
+ }
1789
+
1790
+ .session-item-meta {
1791
+ display: flex;
1792
+ flex-wrap: wrap;
1793
+ align-items: center;
1794
+ gap: 6px;
1795
+ margin-top: 2px;
1796
+ margin-bottom: 2px;
1797
+ }
1798
+
1799
+ .session-item-time {
1800
+ font-size: var(--font-size-caption);
1801
+ color: var(--color-text-tertiary);
1802
+ white-space: nowrap;
1803
+ }
1804
+
1805
+ .session-preview {
1806
+ border: 1px solid var(--color-border-soft);
1807
+ border-radius: var(--radius-xl);
1808
+ background: linear-gradient(to bottom, var(--color-surface-elevated) 0%, rgba(255, 255, 255, 0.96) 100%);
1809
+ box-shadow: var(--shadow-card);
1810
+ min-height: 0;
1811
+ max-height: none;
1812
+ height: 100%;
1813
+ display: flex;
1814
+ flex-direction: column;
1815
+ overflow: hidden;
1816
+ transform: translateX(4px);
1817
+ transition: transform var(--transition-normal) var(--ease-spring-soft), box-shadow var(--transition-normal) var(--ease-spring-soft);
1818
+ }
1819
+
1820
+ .session-preview.active {
1821
+ box-shadow: var(--shadow-float);
1822
+ transform: translateX(0);
1823
+ }
1824
+
1825
+ .session-preview-scroll {
1826
+ flex: 1;
1827
+ min-height: 0;
1828
+ overflow-y: auto;
1829
+ overflow-x: hidden;
1830
+ display: flex;
1831
+ flex-direction: column;
1832
+ scrollbar-width: thin;
1833
+ scrollbar-color: rgba(166, 149, 130, 0.85) transparent;
1834
+ }
1835
+
1836
+ .session-preview-header {
1837
+ padding: 12px var(--spacing-sm);
1838
+ border-bottom: 1px solid var(--color-border-soft);
1839
+ display: flex;
1840
+ align-items: flex-start;
1841
+ justify-content: space-between;
1842
+ gap: var(--spacing-sm);
1843
+ position: sticky;
1844
+ top: 0;
1845
+ z-index: 2;
1846
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.98) 0%, rgba(255, 255, 255, 0.92) 100%);
1847
+ backdrop-filter: blur(6px);
1848
+ }
1849
+
1850
+ .session-preview-header > div:first-child {
1851
+ min-width: 0;
1852
+ flex: 1;
1853
+ }
1854
+
1855
+ .session-preview-title {
1856
+ font-size: var(--font-size-body);
1857
+ font-weight: var(--font-weight-title);
1858
+ color: var(--color-text-primary);
1859
+ line-height: 1.4;
1860
+ display: -webkit-box;
1861
+ -webkit-line-clamp: 2;
1862
+ -webkit-box-orient: vertical;
1863
+ overflow: hidden;
1864
+ word-break: break-word;
1865
+ }
1866
+
1867
+ .session-preview-sub {
1868
+ margin-top: 4px;
1869
+ font-size: var(--font-size-caption);
1870
+ color: var(--color-text-tertiary);
1871
+ line-height: 1.35;
1872
+ white-space: nowrap;
1873
+ overflow: hidden;
1874
+ text-overflow: ellipsis;
1875
+ }
1876
+
1877
+ .session-preview-meta {
1878
+ display: flex;
1879
+ flex-wrap: wrap;
1880
+ align-items: center;
1881
+ margin-top: 4px;
1882
+ }
1883
+
1884
+ .session-preview-meta-item {
1885
+ font-size: var(--font-size-caption);
1886
+ color: var(--color-text-tertiary);
1887
+ line-height: 1.35;
1888
+ white-space: nowrap;
1889
+ overflow: hidden;
1890
+ text-overflow: ellipsis;
1891
+ }
1892
+
1893
+ .session-preview-meta-item:not(:last-child)::after {
1894
+ content: "·";
1895
+ margin: 0 6px;
1896
+ color: var(--color-text-tertiary);
1897
+ opacity: 0.7;
1898
+ }
1899
+
1900
+ .session-actions {
1901
+ display: flex;
1902
+ align-items: center;
1903
+ gap: 8px;
1904
+ flex: 0 1 auto;
1905
+ max-width: 100%;
1906
+ margin-left: 0;
1907
+ flex-wrap: wrap;
1908
+ justify-content: flex-end;
1909
+ }
1910
+
1911
+ .session-preview-body {
1912
+ flex: 1;
1913
+ min-height: 0;
1914
+ padding: var(--spacing-sm);
1915
+ display: flex;
1916
+ flex-direction: column;
1917
+ gap: 10px;
1918
+ }
1919
+
1920
+ .session-msg {
1921
+ border-radius: 10px;
1922
+ padding: 10px 12px 10px 18px;
1923
+ border: 1px solid rgba(208, 196, 182, 0.45);
1924
+ background: rgba(255, 255, 255, 0.75);
1925
+ position: relative;
1926
+ box-shadow: 0 2px 6px rgba(31, 26, 23, 0.04);
1927
+ }
1928
+
1929
+ .session-msg.user {
1930
+ border-color: rgba(210, 107, 90, 0.35);
1931
+ background: rgba(210, 107, 90, 0.08);
1932
+ }
1933
+
1934
+ .session-msg::before {
1935
+ content: "";
1936
+ position: absolute;
1937
+ left: 8px;
1938
+ top: 10px;
1939
+ bottom: 10px;
1940
+ width: 3px;
1941
+ border-radius: 999px;
1942
+ background: rgba(139, 118, 104, 0.45);
1943
+ }
1944
+
1945
+ .session-msg.user::before {
1946
+ background: rgba(210, 107, 90, 0.85);
1947
+ }
1948
+
1949
+ .session-msg.assistant::before {
1950
+ background: rgba(90, 139, 106, 0.6);
1951
+ }
1952
+
1953
+ .session-msg-header {
1954
+ display: flex;
1955
+ align-items: flex-start;
1956
+ justify-content: space-between;
1957
+ gap: var(--spacing-xs);
1958
+ margin-bottom: 6px;
1959
+ font-size: var(--font-size-caption);
1960
+ color: var(--color-text-tertiary);
1961
+ }
1962
+
1963
+ .session-msg-meta {
1964
+ min-width: 0;
1965
+ flex: 1;
1966
+ display: flex;
1967
+ align-items: center;
1968
+ gap: 8px;
1969
+ }
1970
+
1971
+ .session-msg-role {
1972
+ font-weight: var(--font-weight-secondary);
1973
+ color: var(--color-text-secondary);
1974
+ }
1975
+
1976
+ .session-msg-time {
1977
+ white-space: nowrap;
1978
+ overflow: hidden;
1979
+ text-overflow: ellipsis;
1980
+ color: var(--color-text-tertiary);
1981
+ }
1982
+
1983
+ .session-msg-content {
1984
+ font-size: var(--font-size-secondary);
1985
+ line-height: 1.55;
1986
+ color: var(--color-text-primary);
1987
+ white-space: pre-wrap;
1988
+ word-break: break-word;
1989
+ }
1990
+
1991
+ .session-preview-empty {
1992
+ flex: 1;
1993
+ display: flex;
1994
+ align-items: center;
1995
+ justify-content: center;
1996
+ color: var(--color-text-tertiary);
1997
+ font-size: var(--font-size-secondary);
1998
+ padding: var(--spacing-md);
1999
+ text-align: center;
2000
+ flex-direction: column;
2001
+ gap: 8px;
2002
+ }
2003
+
2004
+ .session-preview-empty::before {
2005
+ content: "";
2006
+ width: 34px;
2007
+ height: 34px;
2008
+ border-radius: 50%;
2009
+ background: rgba(210, 107, 90, 0.12);
2010
+ box-shadow: inset 0 0 0 6px rgba(255, 255, 255, 0.7);
2011
+ }
2012
+
2013
+ @media (max-width: 1100px) {
2014
+ .session-layout {
2015
+ grid-template-columns: 1fr;
2016
+ height: auto;
2017
+ min-height: 0;
2018
+ }
2019
+
2020
+ .session-toolbar {
2021
+ grid-template-columns: 1fr;
2022
+ }
2023
+
2024
+ .session-toolbar-actions {
2025
+ justify-content: flex-start;
2026
+ }
2027
+
2028
+ .session-toolbar-footer {
2029
+ justify-content: flex-start;
2030
+ }
2031
+
2032
+ .session-list {
2033
+ position: static;
2034
+ max-height: 300px;
2035
+ height: auto;
2036
+ }
2037
+
2038
+ .session-preview {
2039
+ min-height: 360px;
2040
+ max-height: none;
2041
+ height: auto;
2042
+ position: relative;
2043
+ transform: none;
2044
+ box-shadow: var(--shadow-card);
2045
+ }
2046
+
2047
+ .session-preview-header {
2048
+ flex-direction: column;
2049
+ align-items: stretch;
2050
+ }
2051
+
2052
+ .session-actions {
2053
+ justify-content: flex-start;
2054
+ }
2055
+
2056
+ .session-preview.active {
2057
+ box-shadow: var(--shadow-float);
2058
+ }
2059
+ }
2060
+
2061
+ @media (max-width: 520px) {
2062
+ .session-item-header {
2063
+ flex-direction: column;
2064
+ align-items: stretch;
2065
+ }
2066
+
2067
+ .session-item-actions {
2068
+ justify-content: flex-end;
2069
+ }
2070
+
2071
+ .session-actions {
2072
+ width: 100%;
2073
+ flex-direction: column;
2074
+ align-items: stretch;
2075
+ }
2076
+
2077
+ .btn-session-refresh,
2078
+ .btn-session-export {
2079
+ width: 100%;
2080
+ }
2081
+
2082
+ .session-toolbar-group.session-toolbar-actions {
2083
+ flex-direction: column;
2084
+ align-items: stretch;
2085
+ }
2086
+
2087
+ .session-toolbar-group.session-toolbar-actions .btn-tool {
2088
+ width: 100%;
2089
+ }
2090
+ }
2091
+
2092
+ .btn[disabled] {
2093
+ opacity: 0.5;
2094
+ cursor: not-allowed;
2095
+ transform: none;
2096
+ box-shadow: none;
2097
+ }
2098
+
2099
+ /* ============================================
2100
+ 模态框
2101
+ ============================================ */
2102
+ .modal-overlay {
2103
+ position: fixed;
2104
+ top: 0;
2105
+ left: 0;
2106
+ right: 0;
2107
+ bottom: 0;
2108
+ background: linear-gradient(to bottom, rgba(31, 26, 23, 0.3) 0%, rgba(31, 26, 23, 0.5) 100%);
2109
+ display: flex;
2110
+ justify-content: center;
2111
+ align-items: center;
2112
+ z-index: 100;
2113
+ backdrop-filter: blur(8px) saturate(180%);
2114
+ -webkit-backdrop-filter: blur(8px) saturate(180%);
2115
+ animation: fadeIn var(--transition-normal) var(--ease-out-expo);
2116
+ }
2117
+
2118
+ .modal {
2119
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.98) 100%);
2120
+ width: 90%;
2121
+ max-width: 400px;
2122
+ max-height: 90vh;
2123
+ overflow-y: auto;
2124
+ overscroll-behavior: contain;
2125
+ border-radius: var(--radius-lg);
2126
+ padding: var(--spacing-md);
2127
+ box-shadow: var(--shadow-modal);
2128
+ border: 1px solid rgba(255, 255, 255, 0.8);
2129
+ animation: slideUp var(--transition-slow) var(--ease-spring);
2130
+ }
2131
+
2132
+ .modal-wide {
2133
+ max-width: 980px;
2134
+ }
2135
+
2136
+ .modal-editor {
2137
+ width: min(96vw, 980px);
2138
+ max-height: calc(100vh - 24px);
2139
+ display: flex;
2140
+ flex-direction: column;
2141
+ overflow: hidden;
2142
+ padding: 0;
2143
+ }
2144
+
2145
+ .modal-editor-header {
2146
+ margin-bottom: 0;
2147
+ padding: var(--spacing-md) var(--spacing-md) 0;
2148
+ }
2149
+
2150
+ .modal-editor-body {
2151
+ flex: 1;
2152
+ min-height: 0;
2153
+ overflow-y: auto;
2154
+ padding: var(--spacing-sm) var(--spacing-md) 0;
2155
+ }
2156
+
2157
+ .modal-editor-footer {
2158
+ margin-top: 0;
2159
+ padding: var(--spacing-sm) var(--spacing-md) var(--spacing-md);
2160
+ border-top: 1px solid var(--color-border-soft);
2161
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.96) 100%);
2162
+ backdrop-filter: blur(2px);
2163
+ }
2164
+
2165
+ .modal-title {
2166
+ font-size: var(--font-size-title);
2167
+ font-weight: var(--font-weight-title);
2168
+ margin-bottom: var(--spacing-md);
2169
+ color: var(--color-text-primary);
2170
+ letter-spacing: -0.01em;
2171
+ }
2172
+
2173
+ .install-list {
2174
+ display: flex;
2175
+ flex-direction: column;
2176
+ gap: var(--spacing-sm);
2177
+ margin-top: var(--spacing-sm);
2178
+ }
2179
+
2180
+ .install-row {
2181
+ display: flex;
2182
+ align-items: center;
2183
+ gap: var(--spacing-sm);
2184
+ padding: 10px 12px;
2185
+ border: 1px solid var(--color-border-soft);
2186
+ border-radius: var(--radius-lg);
2187
+ background: var(--color-surface-alt);
2188
+ }
2189
+
2190
+ .install-row-main {
2191
+ flex: 1;
2192
+ display: flex;
2193
+ flex-direction: column;
2194
+ gap: 6px;
2195
+ }
2196
+
2197
+ .install-row-title {
2198
+ font-size: var(--font-size-secondary);
2199
+ color: var(--color-text-secondary);
2200
+ }
2201
+
2202
+ .install-command {
2203
+ flex: 1;
2204
+ font-family: var(--font-family-mono);
2205
+ font-size: var(--font-size-secondary);
2206
+ color: var(--color-text-primary);
2207
+ word-break: break-all;
2208
+ background: rgba(255, 255, 255, 0.7);
2209
+ padding: 8px 10px;
2210
+ border-radius: var(--radius-sm);
2211
+ border: 1px solid var(--color-border-soft);
2212
+ }
2213
+
2214
+ .install-row .btn-mini {
2215
+ white-space: nowrap;
2216
+ }
2217
+
2218
+ .install-action-tabs {
2219
+ display: flex;
2220
+ gap: var(--spacing-xs);
2221
+ flex-wrap: wrap;
2222
+ }
2223
+
2224
+ .install-action-tabs .btn-mini.active {
2225
+ background: rgba(201, 94, 75, 0.16);
2226
+ border-color: rgba(201, 94, 75, 0.32);
2227
+ color: var(--color-text-primary);
2228
+ }
2229
+
2230
+ .install-registry-input {
2231
+ width: 100%;
2232
+ }
2233
+
2234
+ .install-registry-hint {
2235
+ width: 100%;
2236
+ margin-top: 2px;
2237
+ }
2238
+
2239
+ .install-help {
2240
+ margin-top: var(--spacing-sm);
2241
+ border-top: 1px dashed var(--color-border-soft);
2242
+ padding-top: var(--spacing-sm);
2243
+ }
2244
+
2245
+ .install-help-list {
2246
+ margin: 6px 0 0;
2247
+ padding-left: 18px;
2248
+ color: var(--color-text-secondary);
2249
+ font-size: var(--font-size-secondary);
2250
+ }
2251
+
2252
+ .install-help-list li + li {
2253
+ margin-top: 4px;
2254
+ }
2255
+
2256
+ .modal-header {
2257
+ display: flex;
2258
+ align-items: center;
2259
+ justify-content: space-between;
2260
+ gap: var(--spacing-sm);
2261
+ margin-bottom: var(--spacing-md);
2262
+ flex-wrap: wrap;
2263
+ }
2264
+
2265
+ .modal-header .modal-title {
2266
+ margin-bottom: 0;
2267
+ }
2268
+
2269
+ .modal-header-actions {
2270
+ display: inline-flex;
2271
+ align-items: center;
2272
+ gap: 8px;
2273
+ margin-left: auto;
2274
+ }
2275
+
2276
+ .btn-modal-copy {
2277
+ padding: 6px 12px;
2278
+ white-space: nowrap;
2279
+ flex-shrink: 0;
2280
+ }
2281
+
2282
+ .form-group {
2283
+ margin-bottom: var(--spacing-sm);
2284
+ }
2285
+
2286
+ .form-label {
2287
+ display: block;
2288
+ font-size: var(--font-size-secondary);
2289
+ font-weight: var(--font-weight-secondary);
2290
+ color: var(--color-text-secondary);
2291
+ margin-bottom: 7px;
2292
+ letter-spacing: 0.01em;
2293
+ }
2294
+
2295
+ .form-input {
2296
+ width: 100%;
2297
+ padding: 13px var(--spacing-sm);
2298
+ border: 1.5px solid var(--color-border-soft);
2299
+ border-radius: var(--radius-sm);
2300
+ font-size: var(--font-size-body);
2301
+ background-color: var(--color-surface-alt);
2302
+ color: var(--color-text-primary);
2303
+ outline: none;
2304
+ transition: all var(--transition-fast) var(--ease-spring);
2305
+ font-family: var(--font-family-body);
2306
+ box-shadow: inset 0 1px 2px rgba(31, 26, 23, 0.04);
2307
+ }
2308
+
2309
+ .form-input:hover {
2310
+ border-color: var(--color-border-strong);
2311
+ }
2312
+
2313
+ .form-input:focus {
2314
+ border-color: var(--color-brand);
2315
+ background-color: var(--color-surface);
2316
+ box-shadow: var(--shadow-input-focus);
2317
+ }
2318
+
2319
+ .form-input::placeholder {
2320
+ color: var(--color-text-tertiary);
2321
+ opacity: 0.7;
2322
+ }
2323
+
2324
+ .template-editor {
2325
+ min-height: min(60vh, 520px);
2326
+ max-height: min(65vh, 620px);
2327
+ resize: vertical;
2328
+ overflow: auto;
2329
+ white-space: pre;
2330
+ font-family: var(--font-family-mono);
2331
+ font-size: 13px;
2332
+ line-height: 1.45;
2333
+ }
2334
+
2335
+ .template-editor-warning {
2336
+ margin-top: 8px;
2337
+ color: #8d5b31;
2338
+ font-size: var(--font-size-caption);
2339
+ line-height: 1.4;
2340
+ }
2341
+
2342
+ .form-input:disabled,
2343
+ .form-input[readonly] {
2344
+ background: linear-gradient(to right, var(--color-bg) 0%, rgba(247, 241, 232, 0.5) 100%);
2345
+ color: var(--color-text-tertiary);
2346
+ cursor: not-allowed;
2347
+ border-color: transparent;
2348
+ }
2349
+
2350
+ .form-hint {
2351
+ font-size: var(--font-size-caption);
2352
+ color: var(--color-text-tertiary);
2353
+ margin-top: 5px;
2354
+ opacity: 0.8;
2355
+ }
2356
+
2357
+ .quick-section {
2358
+ margin-top: var(--spacing-md);
2359
+ padding: var(--spacing-sm);
2360
+ border-radius: var(--radius-lg);
2361
+ border: 1px solid var(--color-border-soft);
2362
+ background: linear-gradient(140deg, rgba(255, 252, 247, 0.95), rgba(255, 255, 255, 0.6));
2363
+ }
2364
+
2365
+ .quick-header {
2366
+ display: flex;
2367
+ flex-wrap: wrap;
2368
+ gap: var(--spacing-xs);
2369
+ align-items: flex-start;
2370
+ justify-content: space-between;
2371
+ margin-bottom: var(--spacing-sm);
2372
+ }
2373
+
2374
+ .quick-title {
2375
+ font-size: var(--font-size-secondary);
2376
+ font-weight: var(--font-weight-secondary);
2377
+ color: var(--color-text-secondary);
2378
+ }
2379
+
2380
+ .quick-actions {
2381
+ display: flex;
2382
+ flex-wrap: wrap;
2383
+ gap: var(--spacing-xs);
2384
+ }
2385
+
2386
+ .quick-steps {
2387
+ display: flex;
2388
+ flex-wrap: wrap;
2389
+ gap: var(--spacing-xs);
2390
+ margin-bottom: var(--spacing-sm);
2391
+ }
2392
+
2393
+ .quick-step {
2394
+ display: inline-flex;
2395
+ align-items: center;
2396
+ gap: 6px;
2397
+ padding: 4px 10px;
2398
+ border-radius: 999px;
2399
+ border: 1px dashed var(--color-border-soft);
2400
+ background: var(--color-surface);
2401
+ font-size: var(--font-size-caption);
2402
+ color: var(--color-text-secondary);
2403
+ }
2404
+
2405
+ .step-badge {
2406
+ width: 20px;
2407
+ height: 20px;
2408
+ border-radius: 999px;
2409
+ display: inline-flex;
2410
+ align-items: center;
2411
+ justify-content: center;
2412
+ background: var(--color-brand);
2413
+ color: #fff;
2414
+ font-size: 12px;
2415
+ font-weight: var(--font-weight-secondary);
2416
+ }
2417
+
2418
+ .quick-grid {
2419
+ display: grid;
2420
+ gap: var(--spacing-sm);
2421
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
2422
+ }
2423
+
2424
+ .quick-card {
2425
+ background: var(--color-surface);
2426
+ border: 1px solid var(--color-border-soft);
2427
+ border-radius: var(--radius-sm);
2428
+ padding: var(--spacing-sm);
2429
+ box-shadow: var(--shadow-subtle);
2430
+ }
2431
+
2432
+ .quick-option {
2433
+ display: flex;
2434
+ align-items: center;
2435
+ gap: 8px;
2436
+ font-size: var(--font-size-caption);
2437
+ color: var(--color-text-secondary);
2438
+ margin-bottom: 6px;
2439
+ }
2440
+
2441
+ .quick-option input {
2442
+ accent-color: var(--color-brand);
2443
+ }
2444
+
2445
+ .structured-section {
2446
+ margin-top: var(--spacing-md);
2447
+ padding: var(--spacing-sm);
2448
+ border-radius: var(--radius-lg);
2449
+ border: 1px solid var(--color-border-soft);
2450
+ background: rgba(255, 255, 255, 0.6);
2451
+ }
2452
+
2453
+ .structured-header {
2454
+ display: flex;
2455
+ flex-wrap: wrap;
2456
+ gap: var(--spacing-xs);
2457
+ align-items: baseline;
2458
+ justify-content: space-between;
2459
+ margin-bottom: var(--spacing-sm);
2460
+ }
2461
+
2462
+ .structured-title {
2463
+ font-size: var(--font-size-secondary);
2464
+ font-weight: var(--font-weight-secondary);
2465
+ color: var(--color-text-secondary);
2466
+ }
2467
+
2468
+ .structured-grid {
2469
+ display: grid;
2470
+ gap: var(--spacing-sm);
2471
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
2472
+ }
2473
+
2474
+ .structured-card {
2475
+ background: var(--color-surface);
2476
+ border: 1px solid var(--color-border-soft);
2477
+ border-radius: var(--radius-sm);
2478
+ padding: var(--spacing-sm);
2479
+ box-shadow: var(--shadow-subtle);
2480
+ }
2481
+
2482
+ .structured-card-title {
2483
+ font-size: var(--font-size-body);
2484
+ font-weight: var(--font-weight-secondary);
2485
+ color: var(--color-text-secondary);
2486
+ margin-bottom: 8px;
2487
+ }
2488
+
2489
+ .provider-list {
2490
+ display: flex;
2491
+ flex-direction: column;
2492
+ gap: var(--spacing-xs);
2493
+ }
2494
+
2495
+ .provider-item {
2496
+ border: 1px dashed var(--color-border-soft);
2497
+ border-radius: var(--radius-sm);
2498
+ padding: var(--spacing-xs);
2499
+ background: var(--color-surface-alt);
2500
+ }
2501
+
2502
+ .provider-header {
2503
+ display: flex;
2504
+ flex-wrap: wrap;
2505
+ gap: var(--spacing-xs);
2506
+ align-items: center;
2507
+ margin-bottom: 6px;
2508
+ }
2509
+
2510
+ .provider-name {
2511
+ font-weight: var(--font-weight-secondary);
2512
+ color: var(--color-text-secondary);
2513
+ }
2514
+
2515
+ .provider-source {
2516
+ font-size: var(--font-size-caption);
2517
+ color: var(--color-text-tertiary);
2518
+ }
2519
+
2520
+ .provider-fields {
2521
+ display: grid;
2522
+ gap: 6px;
2523
+ }
2524
+
2525
+ .provider-field {
2526
+ display: flex;
2527
+ flex-wrap: wrap;
2528
+ gap: 6px;
2529
+ align-items: baseline;
2530
+ }
2531
+
2532
+ .provider-field-key {
2533
+ font-family: var(--font-family-mono);
2534
+ font-size: var(--font-size-caption);
2535
+ color: var(--color-text-muted);
2536
+ min-width: 110px;
2537
+ }
2538
+
2539
+ .provider-field-value {
2540
+ font-family: var(--font-family-mono);
2541
+ font-size: var(--font-size-caption);
2542
+ color: var(--color-text-secondary);
2543
+ word-break: break-all;
2544
+ }
2545
+
2546
+ .auth-profile-list {
2547
+ display: flex;
2548
+ flex-direction: column;
2549
+ gap: var(--spacing-xs);
2550
+ }
2551
+
2552
+ .auth-profile-item {
2553
+ border: 1px dashed var(--color-border-soft);
2554
+ border-radius: var(--radius-sm);
2555
+ padding: var(--spacing-sm);
2556
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.82) 0%, rgba(247, 241, 232, 0.4) 100%);
2557
+ }
2558
+
2559
+ .auth-profile-header {
2560
+ display: flex;
2561
+ align-items: flex-start;
2562
+ justify-content: space-between;
2563
+ gap: var(--spacing-sm);
2564
+ }
2565
+
2566
+ .auth-profile-main {
2567
+ min-width: 0;
2568
+ flex: 1;
2569
+ display: flex;
2570
+ flex-direction: column;
2571
+ gap: 6px;
2572
+ }
2573
+
2574
+ .auth-profile-title {
2575
+ font-size: var(--font-size-body);
2576
+ font-weight: var(--font-weight-secondary);
2577
+ color: var(--color-text-secondary);
2578
+ letter-spacing: -0.01em;
2579
+ word-break: break-all;
2580
+ }
2581
+
2582
+ .auth-profile-meta {
2583
+ display: flex;
2584
+ flex-wrap: wrap;
2585
+ gap: 8px;
2586
+ align-items: center;
2587
+ }
2588
+
2589
+ .auth-profile-actions {
2590
+ display: flex;
2591
+ flex-wrap: wrap;
2592
+ gap: 8px;
2593
+ justify-content: flex-end;
2594
+ }
2595
+
2596
+ .auth-profile-grid {
2597
+ margin-top: 10px;
2598
+ display: grid;
2599
+ grid-template-columns: minmax(96px, 130px) minmax(0, 1fr);
2600
+ gap: 8px 12px;
2601
+ align-items: start;
2602
+ }
2603
+
2604
+ .auth-profile-row {
2605
+ display: contents;
2606
+ }
2607
+
2608
+ .auth-profile-key {
2609
+ font-family: var(--font-family-mono);
2610
+ font-size: var(--font-size-caption);
2611
+ color: var(--color-text-muted);
2612
+ line-height: 1.4;
2613
+ }
2614
+
2615
+ .auth-profile-value {
2616
+ font-family: var(--font-family-mono);
2617
+ font-size: var(--font-size-caption);
2618
+ color: var(--color-text-secondary);
2619
+ line-height: 1.4;
2620
+ word-break: break-all;
2621
+ }
2622
+
2623
+ .agent-list {
2624
+ display: flex;
2625
+ flex-direction: column;
2626
+ gap: var(--spacing-xs);
2627
+ }
2628
+
2629
+ .agent-item {
2630
+ border: 1px dashed var(--color-border-soft);
2631
+ border-radius: var(--radius-sm);
2632
+ padding: var(--spacing-xs);
2633
+ background: var(--color-surface-alt);
2634
+ }
2635
+
2636
+ .agent-header {
2637
+ display: flex;
2638
+ flex-wrap: wrap;
2639
+ gap: var(--spacing-xs);
2640
+ align-items: center;
2641
+ margin-bottom: 6px;
2642
+ }
2643
+
2644
+ .agent-name {
2645
+ font-weight: var(--font-weight-secondary);
2646
+ color: var(--color-text-secondary);
2647
+ }
2648
+
2649
+ .agent-id {
2650
+ font-size: var(--font-size-caption);
2651
+ color: var(--color-text-tertiary);
2652
+ }
2653
+
2654
+ .agent-meta {
2655
+ display: flex;
2656
+ flex-wrap: wrap;
2657
+ gap: 8px;
2658
+ font-size: var(--font-size-caption);
2659
+ color: var(--color-text-secondary);
2660
+ }
2661
+
2662
+ .list-row {
2663
+ display: flex;
2664
+ flex-wrap: wrap;
2665
+ gap: var(--spacing-xs);
2666
+ align-items: center;
2667
+ margin-bottom: var(--spacing-xs);
2668
+ }
2669
+
2670
+ .list-row:last-child {
2671
+ margin-bottom: 0;
2672
+ }
2673
+
2674
+ .list-row .form-input {
2675
+ flex: 1;
2676
+ min-width: 140px;
2677
+ }
2678
+
2679
+ .btn-mini {
2680
+ padding: 6px 10px;
2681
+ border-radius: var(--radius-sm);
2682
+ border: 1px solid var(--color-border-soft);
2683
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.85) 100%);
2684
+ font-size: var(--font-size-caption);
2685
+ font-weight: var(--font-weight-secondary);
2686
+ color: var(--color-text-secondary);
2687
+ cursor: pointer;
2688
+ transition: all var(--transition-fast) var(--ease-spring);
2689
+ box-shadow: var(--shadow-subtle);
2690
+ }
2691
+
2692
+ .btn-mini:hover {
2693
+ border-color: var(--color-brand);
2694
+ color: var(--color-brand);
2695
+ transform: translateY(-1px);
2696
+ }
2697
+
2698
+ .btn-mini.delete {
2699
+ color: var(--color-error);
2700
+ border-color: rgba(193, 72, 59, 0.35);
2701
+ }
2702
+
2703
+ .btn-mini.delete:hover {
2704
+ border-color: rgba(193, 72, 59, 0.7);
2705
+ color: var(--color-error);
2706
+ }
2707
+
2708
+ .btn-group {
2709
+ display: flex;
2710
+ gap: var(--spacing-sm);
2711
+ margin-top: var(--spacing-md);
2712
+ }
2713
+
2714
+ .btn {
2715
+ flex: 1;
2716
+ padding: 14px var(--spacing-sm);
2717
+ border-radius: var(--radius-sm);
2718
+ font-size: var(--font-size-body);
2719
+ font-weight: var(--font-weight-secondary);
2720
+ cursor: pointer;
2721
+ transition: all var(--transition-fast) var(--ease-spring);
2722
+ border: 1px solid var(--color-border-soft);
2723
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
2724
+ color: var(--color-text-secondary);
2725
+ box-shadow: var(--shadow-subtle);
2726
+ letter-spacing: -0.01em;
2727
+ }
2728
+
2729
+ .btn:active {
2730
+ transform: scale(0.985);
2731
+ }
2732
+
2733
+ .btn-cancel {
2734
+ background: linear-gradient(to bottom, var(--color-bg) 0%, rgba(247, 241, 232, 0.8) 100%);
2735
+ color: var(--color-text-primary);
2736
+ border: 1px solid var(--color-border-soft);
2737
+ }
2738
+
2739
+ .btn-cancel:hover {
2740
+ background: linear-gradient(to bottom, var(--color-border) 0%, rgba(208, 196, 182, 0.5) 100%);
2741
+ }
2742
+
2743
+ .btn-confirm {
2744
+ background: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
2745
+ color: white;
2746
+ box-shadow: 0 2px 4px rgba(210, 107, 90, 0.2);
2747
+ border: none;
2748
+ }
2749
+
2750
+ .btn-confirm:hover {
2751
+ box-shadow: 0 4px 8px rgba(210, 107, 90, 0.25);
2752
+ filter: brightness(1.05);
2753
+ }
2754
+
2755
+ .btn-confirm.secondary {
2756
+ background: linear-gradient(135deg, var(--color-success) 0%, rgba(90, 139, 106, 0.85) 100%);
2757
+ box-shadow: 0 2px 4px rgba(90, 139, 106, 0.2);
2758
+ border: none;
2759
+ }
2760
+
2761
+ .btn-confirm.secondary:hover {
2762
+ box-shadow: 0 4px 8px rgba(90, 139, 106, 0.25);
2763
+ filter: brightness(1.05);
2764
+ }
2765
+
2766
+ /* ============================================
2767
+ 模型列表
2768
+ ============================================ */
2769
+ .model-list {
2770
+ max-height: 200px;
2771
+ overflow-y: auto;
2772
+ border: 1px solid rgba(208, 196, 182, 0.4);
2773
+ border-radius: var(--radius-sm);
2774
+ margin-bottom: var(--spacing-sm);
2775
+ scrollbar-width: none;
2776
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.8) 100%);
2777
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.02);
2778
+ }
2779
+
2780
+ .model-list::-webkit-scrollbar {
2781
+ display: none;
2782
+ }
2783
+
2784
+ .model-item {
2785
+ display: flex;
2786
+ justify-content: space-between;
2787
+ align-items: center;
2788
+ padding: 11px var(--spacing-sm);
2789
+ border-bottom: 1px solid rgba(208, 196, 182, 0.3);
2790
+ font-size: var(--font-size-body);
2791
+ color: var(--color-text-primary);
2792
+ transition: all var(--transition-fast) var(--ease-spring);
2793
+ letter-spacing: -0.005em;
2794
+ }
2795
+
2796
+ .model-item:last-child {
2797
+ border-bottom: none;
2798
+ }
2799
+
2800
+ .model-item:hover {
2801
+ background: linear-gradient(to right, rgba(247, 241, 232, 0.6) 0%, rgba(247, 241, 232, 0.3) 100%);
2802
+ }
2803
+
2804
+ .btn-remove-model {
2805
+ font-size: var(--font-size-caption);
2806
+ font-weight: var(--font-weight-caption);
2807
+ color: var(--color-text-tertiary);
2808
+ cursor: pointer;
2809
+ padding: 5px 10px;
2810
+ border-radius: var(--radius-full);
2811
+ transition: all var(--transition-fast) var(--ease-spring);
2812
+ background: transparent;
2813
+ border: 1px solid rgba(139, 118, 104, 0.2);
2814
+ letter-spacing: 0.03em;
2815
+ }
2816
+
2817
+ .btn-remove-model:hover {
2818
+ background: linear-gradient(135deg, var(--color-error) 0%, rgba(200, 74, 58, 0.9) 100%);
2819
+ color: white;
2820
+ transform: scale(1.08);
2821
+ box-shadow: 0 2px 6px rgba(200, 74, 58, 0.25);
2822
+ border-color: transparent;
2823
+ }
2824
+
2825
+ /* ============================================
2826
+ Toast - 顶部横幅
2827
+ ============================================ */
2828
+ .toast {
2829
+ position: fixed;
2830
+ top: 16px;
2831
+ left: 50%;
2832
+ transform: translateX(-50%);
2833
+ background: linear-gradient(to bottom, var(--color-surface) 0%, rgba(255, 255, 255, 0.95) 100%);
2834
+ padding: 12px 24px;
2835
+ border-radius: var(--radius-full);
2836
+ box-shadow: var(--shadow-raised);
2837
+ z-index: 200;
2838
+ animation: slideDown var(--transition-slow) var(--ease-spring);
2839
+ display: flex;
2840
+ align-items: center;
2841
+ gap: var(--spacing-xs);
2842
+ font-size: var(--font-size-body);
2843
+ font-weight: var(--font-weight-body);
2844
+ border: 1px solid rgba(255, 255, 255, 0.8);
2845
+ backdrop-filter: blur(8px);
2846
+ -webkit-backdrop-filter: blur(8px);
2847
+ }
2848
+
2849
+ .toast.error {
2850
+ border-left: 3px solid var(--color-error);
2851
+ }
2852
+
2853
+ .toast.success {
2854
+ border-left: 3px solid var(--color-success);
2855
+ }
2856
+
2857
+ /* ============================================
2858
+ 状态消息
2859
+ ============================================ */
2860
+ .state-message {
2861
+ text-align: center;
2862
+ padding: 60px var(--spacing-md);
2863
+ color: var(--color-text-tertiary);
2864
+ font-size: var(--font-size-body);
2865
+ opacity: 0.7;
2866
+ letter-spacing: -0.005em;
2867
+ }
2868
+
2869
+ .state-message.error {
2870
+ color: var(--color-error);
2871
+ }
2872
+
2873
+ /* 空状态 */
2874
+ .empty-state {
2875
+ text-align: center;
2876
+ padding: 48px var(--spacing-md);
2877
+ color: var(--color-text-tertiary);
2878
+ }
2879
+
2880
+ .empty-state-icon {
2881
+ width: 48px;
2882
+ height: 48px;
2883
+ margin: 0 auto var(--spacing-sm);
2884
+ opacity: 0.3;
2885
+ }
2886
+
2887
+ .empty-state-title {
2888
+ font-size: var(--font-size-body);
2889
+ font-weight: var(--font-weight-secondary);
2890
+ color: var(--color-text-secondary);
2891
+ margin-bottom: 4px;
2892
+ }
2893
+
2894
+ .empty-state-subtitle {
2895
+ font-size: var(--font-size-secondary);
2896
+ color: var(--color-text-tertiary);
2897
+ opacity: 0.8;
2898
+ }
2899
+
2900
+ /* ============================================
2901
+ 动画
2902
+ ============================================ */
2903
+ @keyframes fadeIn {
2904
+ from { opacity: 0; }
2905
+ to { opacity: 1; }
2906
+ }
2907
+
2908
+ @keyframes slideUp {
2909
+ from { transform: translateY(24px); opacity: 0; }
2910
+ to { transform: translateY(0); opacity: 1; }
2911
+ }
2912
+
2913
+ @keyframes slideDown {
2914
+ from { transform: translateX(-50%) translateY(-100%); opacity: 0; }
2915
+ to { transform: translateX(-50%) translateY(0); opacity: 1; }
2916
+ }
2917
+
2918
+ @keyframes spin {
2919
+ from { transform: rotate(0deg); }
2920
+ to { transform: rotate(360deg); }
2921
+ }
2922
+
2923
+ [v-cloak] {
2924
+ display: none !important;
2925
+ }
2926
+
2927
+ /* 模式内容容器 */
2928
+ .mode-content {
2929
+ animation: fadeIn var(--transition-normal) var(--ease-spring);
2930
+ }
2931
+
2932
+ /* 内容区域包裹器 - 稳定高度 */
2933
+ .content-wrapper {
2934
+ min-height: 300px;
2935
+ position: relative;
2936
+ }
2937
+
2938
+ button:focus-visible,
2939
+ select:focus-visible,
2940
+ input:focus-visible,
2941
+ textarea:focus-visible {
2942
+ outline: 3px solid rgba(201, 94, 75, 0.25);
2943
+ outline-offset: 2px;
2944
+ }
2945
+
2946
+ @media (max-width: 1280px) {
2947
+ .app-shell {
2948
+ grid-template-columns: 220px minmax(0, 1fr) 300px;
2949
+ gap: 14px;
2950
+ }
2951
+
2952
+ .status-inspector {
2953
+ top: 16px;
2954
+ height: calc(100vh - 32px);
2955
+ }
2956
+
2957
+ .main-panel {
2958
+ padding: var(--spacing-sm) var(--spacing-md);
2959
+ }
2960
+ }
2961
+
2962
+ @media (max-width: 960px) {
2963
+ .container {
2964
+ padding: 12px;
2965
+ }
2966
+ .app-shell {
2967
+ grid-template-columns: 1fr;
2968
+ }
2969
+ .side-rail {
2970
+ display: none;
2971
+ }
2972
+ .status-inspector {
2973
+ display: none;
2974
+ }
2975
+ .hero-logo {
2976
+ display: block;
2977
+ }
2978
+ .main-panel {
2979
+ padding: var(--spacing-sm) var(--spacing-sm);
2980
+ border-radius: 14px;
2981
+ }
2982
+ .top-tabs {
2983
+ display: grid !important;
2984
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2985
+ }
2986
+ .status-strip {
2987
+ gap: var(--spacing-sm);
2988
+ margin-top: 4px;
2989
+ }
2990
+ .status-chip {
2991
+ flex: 1 1 calc(50% - var(--spacing-sm));
2992
+ min-width: 0;
2993
+ }
2994
+ }
2995
+
2996
+ @media (max-width: 720px) {
2997
+ .main-title {
2998
+ font-size: 40px;
2999
+ }
3000
+
3001
+ .hero-title {
3002
+ font-size: 32px;
3003
+ }
3004
+
3005
+ .subtitle {
3006
+ font-size: var(--font-size-secondary);
3007
+ margin-bottom: 16px;
3008
+ }
3009
+
3010
+ .segmented-control {
3011
+ flex-direction: column;
3012
+ gap: 6px;
3013
+ }
3014
+
3015
+ .status-strip {
3016
+ flex-direction: row;
3017
+ flex-wrap: wrap;
3018
+ }
3019
+
3020
+ .status-chip {
3021
+ flex: 1 1 100%;
3022
+ }
3023
+ }
3024
+
3025
+ @media (max-width: 540px) {
3026
+ body {
3027
+ padding: var(--spacing-md) var(--spacing-sm);
3028
+ }
3029
+ .container {
3030
+ padding: 0 var(--spacing-sm) var(--spacing-md);
3031
+ }
3032
+ .hero-title {
3033
+ font-size: 32px;
3034
+ }
3035
+ .hero-subtitle {
3036
+ font-size: var(--font-size-secondary);
3037
+ }
3038
+ .top-tabs {
3039
+ grid-template-columns: repeat(1, minmax(0, 1fr));
3040
+ }
3041
+ .main-panel {
3042
+ padding: var(--spacing-sm);
3043
+ }
3044
+ .card {
3045
+ padding: 12px;
3046
+ }
3047
+ .session-layout {
3048
+ grid-template-columns: 1fr;
3049
+ height: auto;
3050
+ min-height: 0;
3051
+ }
3052
+
3053
+ .status-strip {
3054
+ gap: var(--spacing-xs);
3055
+ }
3056
+
3057
+ .status-chip {
3058
+ flex: 1 1 100%;
3059
+ min-width: 100%;
3060
+ }
3061
+
3062
+ .btn-add,
3063
+ .btn-tool,
3064
+ .card-action-btn,
3065
+ .btn-session-export,
3066
+ .btn-session-open,
3067
+ .btn-session-clone,
3068
+ .btn-session-refresh,
3069
+ .btn-session-delete,
3070
+ .btn-icon,
3071
+ .session-item-copy {
3072
+ min-height: 44px;
3073
+ padding-top: 12px;
3074
+ padding-bottom: 12px;
3075
+ }
3076
+
3077
+ .btn-icon,
3078
+ .session-item-copy {
3079
+ min-width: 44px;
3080
+ }
3081
+
3082
+ .session-item {
3083
+ min-height: 75px;
3084
+ height: 75px;
3085
+ padding: 12px 14px;
3086
+ }
3087
+
3088
+ .session-item-header {
3089
+ flex-direction: row;
3090
+ align-items: center;
3091
+ gap: 8px;
3092
+ }
3093
+
3094
+ .session-item-main {
3095
+ align-items: center;
3096
+ }
3097
+
3098
+ .session-item-copy {
3099
+ width: 20px;
3100
+ height: 20px;
3101
+ min-width: 20px;
3102
+ min-height: 20px;
3103
+ border-radius: 6px;
3104
+ padding: 2px;
3105
+ display: inline-flex;
3106
+ align-items: center;
3107
+ justify-content: center;
3108
+ transform: translate(-3px, 0);
3109
+ }
3110
+
3111
+ .session-item-copy svg {
3112
+ width: 12px;
3113
+ height: 12px;
3114
+ }
3115
+
3116
+ .session-item-title {
3117
+ -webkit-line-clamp: 1;
3118
+ max-height: none;
3119
+ white-space: nowrap;
3120
+ text-overflow: ellipsis;
3121
+ overflow: hidden;
3122
+ }
3123
+
3124
+ .session-item-actions {
3125
+ margin-top: 0;
3126
+ }
3127
+
3128
+ .session-item-meta {
3129
+ margin-top: -2px;
3130
+ margin-bottom: 0;
3131
+ gap: 4px;
3132
+ align-items: center;
3133
+ }
3134
+
3135
+ .card {
3136
+ padding: 8px;
3137
+ }
3138
+
3139
+ .card-list {
3140
+ gap: 4px;
3141
+ margin-bottom: 4px;
3142
+ }
3143
+
3144
+ .card-actions {
3145
+ gap: 8px;
3146
+ }
3147
+
3148
+ .card-action-btn {
3149
+ width: 40px;
3150
+ height: 40px;
3151
+ border-radius: 10px;
3152
+ }
3153
+
3154
+ .card-action-btn svg {
3155
+ width: 18px;
3156
+ height: 18px;
3157
+ }
3158
+
3159
+ .card-trailing {
3160
+ grid-auto-flow: row;
3161
+ grid-auto-columns: 1fr;
3162
+ justify-content: stretch;
3163
+ justify-items: end;
3164
+ }
3165
+
3166
+ .card-trailing .card-actions {
3167
+ width: 100%;
3168
+ justify-content: flex-end;
3169
+ justify-self: end;
3170
+ }
3171
+
3172
+ /* 移动端不显示配置状态 pill,节省空间 */
3173
+ .card-trailing .pill {
3174
+ display: none;
3175
+ }
3176
+
3177
+ .auth-profile-item {
3178
+ padding: 10px;
3179
+ }
3180
+
3181
+ .auth-profile-header {
3182
+ flex-direction: column;
3183
+ align-items: stretch;
3184
+ gap: 10px;
3185
+ }
3186
+
3187
+ .auth-profile-actions {
3188
+ justify-content: flex-start;
3189
+ }
3190
+
3191
+ .auth-profile-grid {
3192
+ grid-template-columns: 1fr;
3193
+ gap: 6px;
3194
+ margin-top: 8px;
3195
+ }
3196
+
3197
+ .auth-profile-row {
3198
+ display: flex;
3199
+ flex-direction: column;
3200
+ gap: 2px;
3201
+ padding-bottom: 4px;
3202
+ border-bottom: 1px dashed rgba(160, 145, 130, 0.25);
3203
+ }
3204
+
3205
+ .auth-profile-row:last-child {
3206
+ border-bottom: none;
3207
+ padding-bottom: 0;
3208
+ }
3209
+
3210
+ .session-preview {
3211
+ border-radius: var(--radius-lg);
3212
+ }
3213
+ }