codexmate 0.0.10 → 0.0.12

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