@becrafter/prompt-manager 0.1.9 → 0.1.11

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 (36) hide show
  1. package/env.example +1 -1
  2. package/package.json +4 -1
  3. package/packages/admin-ui/admin.html +49 -0
  4. package/packages/admin-ui/css/codemirror-theme_xq-light.css +43 -0
  5. package/packages/admin-ui/css/codemirror.css +344 -0
  6. package/packages/admin-ui/css/main.css +4485 -0
  7. package/packages/admin-ui/css/markdown.css +468 -0
  8. package/packages/admin-ui/css/optimization.css +1015 -0
  9. package/packages/admin-ui/css/recommended-prompts.css +610 -0
  10. package/packages/admin-ui/css/terminal-fix.css +571 -0
  11. package/packages/admin-ui/package-lock.json +8287 -0
  12. package/packages/admin-ui/package.json +46 -0
  13. package/packages/admin-ui/src/codemirror.js +53 -0
  14. package/packages/admin-ui/src/components/ArgumentModal.js +53 -0
  15. package/packages/admin-ui/src/components/DeletePromptModal.js +30 -0
  16. package/packages/admin-ui/src/components/HeaderView.js +40 -0
  17. package/packages/admin-ui/src/components/LoadingOverlay.js +12 -0
  18. package/packages/admin-ui/src/components/LoginView.js +22 -0
  19. package/packages/admin-ui/src/components/ModelConfigModal.js +103 -0
  20. package/packages/admin-ui/src/components/NewFolderModal.js +58 -0
  21. package/packages/admin-ui/src/components/OptimizationConfigModal.js +36 -0
  22. package/packages/admin-ui/src/components/OptimizationDrawer.js +135 -0
  23. package/packages/admin-ui/src/components/PrimaryNav.js +34 -0
  24. package/packages/admin-ui/src/components/PromptsArea.js +140 -0
  25. package/packages/admin-ui/src/components/RecommendedPromptModal.js +37 -0
  26. package/packages/admin-ui/src/components/SidebarView.js +24 -0
  27. package/packages/admin-ui/src/components/SyncPromptModal.js +44 -0
  28. package/packages/admin-ui/src/components/TemplateEditorModal.js +75 -0
  29. package/packages/admin-ui/src/components/TemplateListModal.js +30 -0
  30. package/packages/admin-ui/src/components/TerminalComponent.js +995 -0
  31. package/packages/admin-ui/src/components/TerminalView.js +25 -0
  32. package/packages/admin-ui/src/components/ToolDetailModal.js +23 -0
  33. package/packages/admin-ui/src/components/ToolsArea.js +119 -0
  34. package/packages/admin-ui/src/components/ToolsUploadModal.js +59 -0
  35. package/packages/admin-ui/src/index.js +6766 -0
  36. package/packages/server/utils/config.js +1 -1
@@ -0,0 +1,4485 @@
1
+ /* 主要应用样式 */
2
+ :root {
3
+ --primary: #393939;
4
+ --primary-dark: #393939;
5
+ --success: #28a745;
6
+ --danger: #dc3545;
7
+ --warning: #ffc107;
8
+ --dark: #1a1a1a;
9
+ --light: #f8f9fa;
10
+ --gray: #6c757d;
11
+ --gray-light: #dee2e6;
12
+ --border: #e0e0e0;
13
+ --sidebar-bg: #f8f9fa;
14
+ --editor-bg: #263238;
15
+ --preview-bg: #f5f5f5;
16
+ --scrollbar-width: 6px;
17
+ --scrollbar-thumb-color: rgba(0, 0, 0, 0.15);
18
+ --scrollbar-thumb-hover-color: rgba(0, 0, 0, 0.25);
19
+ }
20
+
21
+ /* 全局滚动条样式 - 默认隐藏,悬停时显示 */
22
+ * {
23
+ scrollbar-width: thin;
24
+ scrollbar-color: transparent transparent;
25
+ }
26
+
27
+ *:hover {
28
+ scrollbar-color: var(--scrollbar-thumb-color) transparent;
29
+ }
30
+
31
+ /* Webkit 浏览器滚动条样式 */
32
+ *::-webkit-scrollbar {
33
+ width: var(--scrollbar-width);
34
+ height: var(--scrollbar-width);
35
+ }
36
+
37
+ *::-webkit-scrollbar-track {
38
+ background: transparent;
39
+ }
40
+
41
+ *::-webkit-scrollbar-thumb {
42
+ background: transparent;
43
+ border-radius: calc(var(--scrollbar-width) / 2);
44
+ transition: background-color 0.2s ease;
45
+ }
46
+
47
+ *:hover::-webkit-scrollbar-thumb {
48
+ background: var(--scrollbar-thumb-color);
49
+ }
50
+
51
+ *::-webkit-scrollbar-thumb:hover {
52
+ background: var(--scrollbar-thumb-hover-color);
53
+ }
54
+
55
+ * {
56
+ box-sizing: border-box;
57
+ margin: 0;
58
+ padding: 0;
59
+ font-family: "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;
60
+ -webkit-font-smoothing: antialiased;
61
+ -moz-osx-font-smoothing: grayscale;
62
+ text-rendering: optimizeLegibility;
63
+ }
64
+
65
+ body {
66
+ background-color: var(--light);
67
+ color: var(--dark);
68
+ min-height: 100vh;
69
+ display: flex;
70
+ flex-direction: column;
71
+ letter-spacing: -0.01em;
72
+ font-weight: 420;
73
+ overflow-y: hidden;
74
+ }
75
+
76
+ header {
77
+ background-color: white;
78
+ padding: 8px 25px;
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: space-between;
82
+ box-shadow: 0 2px 8px rgba(0,0,0,0.05);
83
+ border-bottom: 1px solid var(--border);
84
+ }
85
+
86
+ .logo {
87
+ font-size: 24px;
88
+ font-weight: 580;
89
+ color: var(--primary);
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 10px;
93
+ letter-spacing: -0.02em;
94
+ }
95
+
96
+ .logo span {
97
+ color: #8e8989;
98
+ font-size: 12px;
99
+ padding: 3px 8px;
100
+ border-radius: 5px;
101
+ font-weight: 450;
102
+ border: 1px solid var(--border);
103
+ letter-spacing: 0;
104
+ }
105
+
106
+ .nav-right {
107
+ display: flex;
108
+ gap: 12px;
109
+ align-items: center;
110
+ position: relative;
111
+ }
112
+
113
+ .github-link {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ width: 32px;
118
+ height: 32px;
119
+ color: #6c757d;
120
+ text-decoration: none;
121
+ border-radius: 6px;
122
+ transition: all 0.2s ease;
123
+ }
124
+
125
+ .github-link:hover {
126
+ color: #24292e;
127
+ background-color: rgba(36, 41, 46, 0.1);
128
+ text-decoration: none;
129
+ }
130
+
131
+ .user-profile {
132
+ position: relative;
133
+ }
134
+
135
+ .avatar-btn {
136
+ width: 32px;
137
+ height: 32px;
138
+ padding: 0;
139
+ border: none;
140
+ background: rgba(0,0,0,0.02);
141
+ cursor: pointer;
142
+ border-radius: 50%;
143
+ overflow: hidden;
144
+ transition: all 0.2s ease;
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ }
149
+
150
+ .avatar-btn:hover {
151
+ transform: translateY(-1px);
152
+ background: rgba(0,0,0,0.04);
153
+ box-shadow: 0 2px 8px rgba(0,0,0,0.05);
154
+ }
155
+
156
+ /* 当不需要认证时,头像显示为不可点击状态 */
157
+ .avatar-btn.no-auth {
158
+ cursor: default;
159
+ }
160
+
161
+ .avatar-btn.no-auth:hover {
162
+ transform: none;
163
+ background: rgba(0,0,0,0.02);
164
+ box-shadow: none;
165
+ }
166
+
167
+ .avatar-img {
168
+ width: 26px;
169
+ height: 26px;
170
+ object-fit: cover;
171
+ border-radius: 50%;
172
+ opacity: 0.75;
173
+ transition: opacity 0.2s ease;
174
+ }
175
+
176
+ .avatar-btn:hover .avatar-img {
177
+ opacity: 0.9;
178
+ }
179
+
180
+ .dropdown-menu {
181
+ position: absolute;
182
+ top: calc(100% + 8px);
183
+ right: 0;
184
+ width: 240px;
185
+ background: white;
186
+ border-radius: 12px;
187
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
188
+ opacity: 0;
189
+ visibility: hidden;
190
+ transform: translateY(-8px) scale(0.96);
191
+ transform-origin: top right;
192
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
193
+ z-index: 1000;
194
+ border: 1px solid var(--border);
195
+ }
196
+
197
+ .dropdown-menu.show {
198
+ opacity: 1;
199
+ visibility: visible;
200
+ transform: translateY(0) scale(1);
201
+ }
202
+
203
+ .dropdown-header {
204
+ padding: 16px;
205
+ border-bottom: 1px solid var(--border);
206
+ }
207
+
208
+ .user-info {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 12px;
212
+ }
213
+
214
+ .user-avatar {
215
+ width: 36px;
216
+ height: 36px;
217
+ border-radius: 50%;
218
+ background: var(--light);
219
+ padding: 3px;
220
+ opacity: 0.8;
221
+ }
222
+
223
+ .user-details {
224
+ flex: 1;
225
+ min-width: 0;
226
+ padding: 2px 0;
227
+ }
228
+
229
+ .user-name {
230
+ font-size: 15px;
231
+ font-weight: 500;
232
+ color: var(--dark);
233
+ margin-bottom: 2px;
234
+ }
235
+
236
+ .user-role {
237
+ font-size: 13px;
238
+ color: var(--gray);
239
+ }
240
+
241
+ .dropdown-divider {
242
+ height: 1px;
243
+ background: var(--border);
244
+ margin: 8px 0;
245
+ }
246
+
247
+ .dropdown-item {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: 10px;
251
+ width: 100%;
252
+ padding: 12px 16px;
253
+ border: none;
254
+ background: none;
255
+ font-size: 14px;
256
+ color: var(--dark);
257
+ cursor: pointer;
258
+ transition: all 0.2s ease;
259
+ }
260
+
261
+ .dropdown-item:last-child {
262
+ border-radius: 0 0 12px 12px;
263
+ }
264
+
265
+ .dropdown-item:hover {
266
+ background: rgba(0, 0, 0, 0.04);
267
+ }
268
+
269
+ .dropdown-item .dropdown-icon {
270
+ width: 18px;
271
+ height: 18px;
272
+ color: var(--gray);
273
+ }
274
+
275
+ .dropdown-item:hover .dropdown-icon {
276
+ color: var(--primary);
277
+ }
278
+
279
+ .btn {
280
+ padding: 8px 16px;
281
+ border-radius: 6px;
282
+ font-size: 14px;
283
+ font-weight: 500;
284
+ cursor: pointer;
285
+ transition: all 0.2s;
286
+ border: none;
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 6px;
290
+ }
291
+
292
+ .btn-primary {
293
+ background: var(--primary);
294
+ color: white;
295
+ }
296
+
297
+ .btn-primary:hover {
298
+ background: var(--primary-dark);
299
+ }
300
+
301
+ .btn-success {
302
+ background: var(--success);
303
+ color: white;
304
+ }
305
+
306
+ .btn-outline {
307
+ background: transparent;
308
+ border: 1px solid var(--border);
309
+ color: var(--dark);
310
+ }
311
+
312
+ .btn-outline:hover {
313
+ background: var(--light);
314
+ }
315
+
316
+ .btn-light {
317
+ background: white;
318
+ border: 1px solid var(--border);
319
+ color: var(--dark);
320
+ }
321
+
322
+ .btn-light:hover {
323
+ background: var(--light);
324
+ }
325
+
326
+ .btn-dark {
327
+ background: var(--dark);
328
+ color: white;
329
+ }
330
+
331
+ .btn-dark:hover {
332
+ background: #000;
333
+ }
334
+
335
+ .btn-danger {
336
+ background: var(--danger);
337
+ color: white;
338
+ }
339
+
340
+ .btn-danger:hover {
341
+ background: #b71f31;
342
+ }
343
+
344
+ .btn-sm {
345
+ padding: 6px 12px;
346
+ font-size: 13px;
347
+ }
348
+
349
+ #addArgumentBtn {
350
+ padding: 6px 12px;
351
+ font-size: 12px;
352
+ }
353
+
354
+ button#saveBtn{
355
+ padding: 8px 16px;
356
+ font-size: 14px;
357
+ }
358
+
359
+ .btn.loading {
360
+ opacity: 0.6;
361
+ pointer-events: none;
362
+ }
363
+
364
+ .btn-icon {
365
+ padding: 6px;
366
+ width: 32px;
367
+ height: 32px;
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ }
372
+
373
+ main {
374
+ display: flex;
375
+ flex: 1;
376
+ overflow: hidden;
377
+ height: calc(100vh - 57px); /* 减去header高度 */
378
+ }
379
+
380
+ /* 一级导航样式 */
381
+ .primary-nav {
382
+ width: 58px;
383
+ background: #fafafa;
384
+ border-right: 1px solid var(--border);
385
+ display: flex;
386
+ flex-direction: column;
387
+ padding: 12px 0;
388
+ flex-shrink: 0;
389
+ height: 100%;
390
+ overflow-y: auto;
391
+ }
392
+
393
+ .primary-nav-items {
394
+ display: flex;
395
+ flex-direction: column;
396
+ gap: 8px;
397
+ padding: 0 8px;
398
+ }
399
+
400
+ .primary-nav-item {
401
+ display: flex;
402
+ flex-direction: column;
403
+ align-items: center;
404
+ justify-content: center;
405
+ gap: 4px;
406
+ padding: 12px 8px;
407
+ border: none;
408
+ background: transparent;
409
+ border-radius: 10px;
410
+ cursor: pointer;
411
+ transition: all 0.2s ease;
412
+ color: var(--gray);
413
+ position: relative;
414
+ }
415
+
416
+ .primary-nav-item svg {
417
+ width: 14px;
418
+ height: 14px;
419
+ stroke-width: 2;
420
+ transition: all 0.2s ease;
421
+ /* transform: rotate(90deg); */
422
+ }
423
+
424
+ .primary-nav-item span {
425
+ font-size: 11px;
426
+ font-weight: 700;
427
+ letter-spacing: 1px;
428
+ writing-mode: vertical-lr;
429
+ text-transform: uppercase;
430
+ opacity: 0.85;
431
+ }
432
+
433
+ .primary-nav-item:hover {
434
+ background: rgba(0, 0, 0, 0.04);
435
+ color: var(--primary);
436
+ }
437
+
438
+ .primary-nav-item.active {
439
+ background: white;
440
+ color: var(--primary);
441
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
442
+ }
443
+
444
+ .primary-nav-item.active::before {
445
+ content: '';
446
+ position: absolute;
447
+ left: 0;
448
+ top: 50%;
449
+ transform: translateY(-50%);
450
+ width: 3px;
451
+ height: 60%;
452
+ background: var(--primary);
453
+ border-radius: 0 3px 3px 0;
454
+ }
455
+
456
+ aside {
457
+ width: 320px;
458
+ background: var(--sidebar-bg);
459
+ border-right: 1px solid var(--border);
460
+ padding: 0;
461
+ display: flex;
462
+ flex-direction: column;
463
+ height: 100%;
464
+ overflow-y: auto;
465
+ flex-shrink: 0;
466
+ }
467
+
468
+ .sidebar-header {
469
+ padding: 15px;
470
+ display: flex;
471
+ flex-direction: column;
472
+ gap: 12px;
473
+ background: white;
474
+ border-bottom: 1px solid var(--border);
475
+ }
476
+
477
+ .new-prompt-btn {
478
+ background: var(--primary);
479
+ color: white;
480
+ border: none;
481
+ border-radius: 10px;
482
+ padding: 12px 16px;
483
+ font-size: 15px;
484
+ font-weight: 500;
485
+ cursor: pointer;
486
+ display: flex;
487
+ align-items: center;
488
+ justify-content: center;
489
+ gap: 8px;
490
+ width: 100%;
491
+ transition: all 0.2s ease;
492
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
493
+ }
494
+
495
+ .new-prompt-btn:hover {
496
+ background: #333;
497
+ transform: translateY(-1px);
498
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
499
+ }
500
+
501
+ .blank-area-new-prompt-btn {
502
+ font-weight: 500;
503
+ background: none;
504
+ border: none;
505
+ color: inherit;
506
+ text-decoration: none;
507
+ cursor: pointer;
508
+ padding: 0;
509
+ display: inline;
510
+ font-size: inherit;
511
+ transition: color 0.2s ease;
512
+ }
513
+
514
+ .blank-area-new-prompt-btn:hover {
515
+ color: var(--primary);
516
+ text-decoration: none;
517
+ }
518
+
519
+ .search-container {
520
+ display: flex;
521
+ gap: 10px;
522
+ margin-top: 2px;
523
+ }
524
+
525
+ .search-box {
526
+ position: relative;
527
+ flex: 1;
528
+ }
529
+
530
+ .search-box input {
531
+ width: 100%;
532
+ padding: 9px 32px 9px 38px;
533
+ border: 1px solid var(--border);
534
+ border-radius: 8px;
535
+ font-size: 14px;
536
+ transition: all 0.2s ease;
537
+ background: white;
538
+ }
539
+
540
+ .search-box input:focus {
541
+ outline: none;
542
+ border-color: var(--primary);
543
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.1);
544
+ }
545
+
546
+ .search-box::before {
547
+ content: '';
548
+ position: absolute;
549
+ left: 12px;
550
+ top: 50%;
551
+ transform: translateY(-50%);
552
+ width: 16px;
553
+ height: 16px;
554
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") no-repeat center;
555
+ background-size: contain;
556
+ opacity: 0.6;
557
+ }
558
+
559
+ .search-box .clear-btn {
560
+ position: absolute;
561
+ right: 8px;
562
+ top: 50%;
563
+ transform: translateY(-50%);
564
+ width: 20px;
565
+ height: 20px;
566
+ border: none;
567
+ background: transparent;
568
+ cursor: pointer;
569
+ padding: 0;
570
+ display: none;
571
+ align-items: center;
572
+ justify-content: center;
573
+ color: var(--gray);
574
+ opacity: 0.6;
575
+ transition: opacity 0.2s ease;
576
+ }
577
+
578
+ .search-box .clear-btn::before {
579
+ content: '';
580
+ width: 16px;
581
+ height: 16px;
582
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='15' y1='9' x2='9' y2='15'/%3E%3Cline x1='9' y1='9' x2='15' y2='15'/%3E%3C/svg%3E") no-repeat center;
583
+ background-size: contain;
584
+ }
585
+
586
+ .search-box .clear-btn:hover {
587
+ opacity: 1;
588
+ }
589
+
590
+ .search-box input:not(:placeholder-shown) + .clear-btn {
591
+ display: flex;
592
+ }
593
+
594
+ .folder-btn {
595
+ background: white;
596
+ border: 1px solid var(--border);
597
+ border-radius: 8px;
598
+ width: 38px;
599
+ height: 38px;
600
+ cursor: pointer;
601
+ display: flex;
602
+ align-items: center;
603
+ justify-content: center;
604
+ transition: all 0.2s ease;
605
+ flex-shrink: 0;
606
+ }
607
+
608
+ .folder-btn::before {
609
+ content: '';
610
+ width: 18px;
611
+ height: 18px;
612
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z'/%3E%3Cline x1='12' y1='11' x2='12' y2='17'/%3E%3Cline x1='9' y1='14' x2='15' y2='14'/%3E%3C/svg%3E") no-repeat center;
613
+ background-size: contain;
614
+ opacity: 0.6;
615
+ transition: opacity 0.2s ease;
616
+ }
617
+
618
+ .folder-btn:hover {
619
+ background: #f8f9fa;
620
+ border-color: var(--primary);
621
+ transform: translateY(-1px);
622
+ box-shadow: 0 2px 8px rgba(0,0,0,0.08);
623
+ }
624
+
625
+ .folder-btn:hover::before {
626
+ opacity: 1;
627
+ }
628
+
629
+ .toast-container {
630
+ position: fixed;
631
+ bottom: 24px;
632
+ right: 24px;
633
+ display: flex;
634
+ flex-direction: column-reverse;
635
+ gap: 12px;
636
+ z-index: 5000;
637
+ align-items: flex-end;
638
+ }
639
+
640
+ .toast {
641
+ min-width: 280px;
642
+ max-width: 360px;
643
+ background: rgba(255, 255, 255, 0.96);
644
+ border-radius: 12px;
645
+ padding: 16px 18px;
646
+ display: flex;
647
+ align-items: flex-start;
648
+ gap: 14px;
649
+ box-shadow: 0 20px 45px rgba(0, 0, 0, 0.18);
650
+ border: 1px solid transparent;
651
+ opacity: 0;
652
+ transform: translateY(16px);
653
+ animation: toast-enter 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards;
654
+ pointer-events: auto;
655
+ }
656
+
657
+ .toast.toast-leave {
658
+ animation: toast-leave 0.25s ease forwards;
659
+ }
660
+
661
+ .toast-success {
662
+ border-color: rgba(40,167,69,0.35);
663
+ background: linear-gradient(145deg, rgba(40,167,69,0.08), rgba(40,167,69,0.02));
664
+ }
665
+
666
+ .toast-error {
667
+ border-color: rgba(220,53,69,0.35);
668
+ background: linear-gradient(145deg, rgba(220,53,69,0.08), rgba(220,53,69,0.02));
669
+ }
670
+
671
+ .toast-info {
672
+ border-color: rgba(0,102,255,0.3);
673
+ background: linear-gradient(145deg, rgba(0,102,255,0.08), rgba(0,102,255,0.02));
674
+ }
675
+
676
+ .toast-warning {
677
+ border-color: rgba(255,193,7,0.35);
678
+ background: linear-gradient(145deg, rgba(255,193,7,0.1), rgba(255,193,7,0.03));
679
+ }
680
+
681
+ .toast-icon {
682
+ width: 36px;
683
+ height: 36px;
684
+ border-radius: 50%;
685
+ display: flex;
686
+ align-items: center;
687
+ justify-content: center;
688
+ font-size: 18px;
689
+ font-weight: 600;
690
+ flex-shrink: 0;
691
+ background: rgba(0,0,0,0.05);
692
+ color: var(--dark);
693
+ }
694
+
695
+ .toast-success .toast-icon {
696
+ background: rgba(40,167,69,0.15);
697
+ color: var(--success);
698
+ }
699
+
700
+ .toast-error .toast-icon {
701
+ background: rgba(220,53,69,0.15);
702
+ color: var(--danger);
703
+ }
704
+
705
+ .toast-info .toast-icon {
706
+ background: rgba(0,102,255,0.15);
707
+ color: var(--primary);
708
+ }
709
+
710
+ .toast-warning .toast-icon {
711
+ background: rgba(255,193,7,0.2);
712
+ color: #b58100;
713
+ }
714
+
715
+ .toast-content {
716
+ flex: 1;
717
+ display: flex;
718
+ flex-direction: column;
719
+ gap: 4px;
720
+ }
721
+
722
+ .toast-title {
723
+ font-size: 15px;
724
+ font-weight: 600;
725
+ color: var(--dark);
726
+ }
727
+
728
+ .toast-message {
729
+ font-size: 13px;
730
+ color: var(--gray);
731
+ line-height: 1.5;
732
+ white-space: pre-line;
733
+ }
734
+
735
+ .toast-close {
736
+ border: none;
737
+ background: transparent;
738
+ color: var(--gray);
739
+ font-size: 18px;
740
+ cursor: pointer;
741
+ padding: 2px;
742
+ line-height: 1;
743
+ margin-left: 8px;
744
+ flex-shrink: 0;
745
+ }
746
+
747
+ .toast-close:hover {
748
+ color: var(--dark);
749
+ }
750
+
751
+ @keyframes toast-enter {
752
+ to {
753
+ opacity: 1;
754
+ transform: translateY(0);
755
+ }
756
+ }
757
+
758
+ @keyframes toast-leave {
759
+ to {
760
+ opacity: 0;
761
+ transform: translateY(12px);
762
+ }
763
+ }
764
+
765
+ .variable-desc {
766
+ font-size: 12px;
767
+ color: var(--gray);
768
+ margin-top: 2px;
769
+ }
770
+
771
+ .group-section {
772
+ margin-bottom: 8px;
773
+ }
774
+
775
+ .group-header {
776
+ padding: 12px 15px;
777
+ font-size: 14px;
778
+ font-weight: 500;
779
+ color: var(--dark);
780
+ display: flex;
781
+ align-items: center;
782
+ justify-content: space-between;
783
+ cursor: pointer;
784
+ border-bottom: 1px solid var(--border);
785
+ }
786
+
787
+ .group-section.disabled {
788
+ position: relative;
789
+ }
790
+
791
+ .group-section.disabled .group-header {
792
+ position: relative;
793
+ color: #858a91;
794
+ background: rgba(0,0,0,0.02);
795
+ box-shadow: inset 0 -1px 0 rgba(0,0,0,0.06);
796
+ }
797
+
798
+ .group-section.disabled .group-header::before {
799
+ content: '';
800
+ position: absolute;
801
+ top: 8px;
802
+ left: 9px;
803
+ width: 40px;
804
+ height: 40px;
805
+ background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc1NicgaGVpZ2h0PSc1Nic+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSdnJyB4MT0nMCcgeTE9JzAnIHgyPScxJyB5Mj0nMSc+PHN0b3Agb2Zmc2V0PScwJyBzdG9wLWNvbG9yPScjZDVkOWRlJy8+PHN0b3Agb2Zmc2V0PScxJyBzdG9wLWNvbG9yPScjYWViNGJjJy8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHBvbHlnb24gcG9pbnRzPScwLDAgMCw1NiA1NiwwJyBmaWxsPSd1cmwoI2cpJy8+PHRleHQgeD0nNicgeT0nMjQnIGZvbnQtZmFtaWx5PSdJbnRlcixzeXN0ZW0tdWksU2Vnb2UgVUksSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGZpbGw9JyM3ZTdmODInIHRyYW5zZm9ybT0ncm90YXRlKC00NSAxOCAyMCknIGZvbnQtd2VpZ2h0PSc2MDAnPuWGu+e7kzwvdGV4dD48L3N2Zz4=") no-repeat;
806
+ background-size: contain;
807
+ pointer-events: none;
808
+ transform: translate(-8px, -8px);
809
+ }
810
+
811
+ .group-section.disabled .group-header:hover {
812
+ background: rgba(0,0,0,0.04);
813
+ }
814
+
815
+ .group-header:hover {
816
+ background: #f0f0f0;
817
+ }
818
+
819
+ .group-content {
820
+ overflow: hidden;
821
+ transition: max-height 0.3s ease-out;
822
+ }
823
+
824
+ .group-content.collapsed {
825
+ max-height: 0;
826
+ }
827
+
828
+ .group-content.expanded {
829
+ max-height: 2400px;
830
+ overflow: visible;
831
+ }
832
+
833
+ .group-children {
834
+ display: flex;
835
+ flex-direction: column;
836
+ margin-top: 4px;
837
+ }
838
+
839
+ .group-count {
840
+ background: #9ea2a6;
841
+ color: white;
842
+ font-size: 11px;
843
+ padding: 2px 6px;
844
+ border-radius: 10px;
845
+ }
846
+
847
+ .group-section.disabled .group-count {
848
+ background: rgba(0,0,0,0.35);
849
+ }
850
+
851
+ .prompt-list {
852
+ padding: 10px 15px;
853
+ }
854
+
855
+ .prompt-item {
856
+ padding: 12px;
857
+ margin-bottom: 8px;
858
+ border-radius: 8px;
859
+ cursor: pointer;
860
+ position: relative;
861
+ background: #f5f5f5;
862
+ border: 1px solid transparent;
863
+ transition: all 0.2s;
864
+ margin-right: 10px;
865
+ overflow: hidden;
866
+ }
867
+
868
+ .prompt-info {
869
+ display: flex;
870
+ flex-direction: column;
871
+ justify-content: center;
872
+ width: 100%;
873
+ min-width: 0;
874
+ padding-right: 10px; /* 为 prompt-meta 预留空间 */
875
+ }
876
+
877
+ .prompt-name {
878
+ font-weight: 500;
879
+ margin-bottom: 4px;
880
+ white-space: nowrap;
881
+ overflow: hidden;
882
+ text-overflow: ellipsis;
883
+ }
884
+
885
+ .prompt-meta {
886
+ position: absolute;
887
+ right: 0;
888
+ top: 0;
889
+ bottom: 0;
890
+ width: 50px;
891
+ display: flex;
892
+ align-items: center;
893
+ justify-content: center;
894
+ }
895
+
896
+ .prompt-item:hover {
897
+ background: #eeeeee;
898
+ border-color: var(--primary);
899
+ box-shadow: 0 2px 8px rgba(0,102,255,0.1);
900
+ }
901
+
902
+ .prompt-item.active {
903
+ background: rgba(0,102,255,0.05);
904
+ border-color: var(--primary);
905
+ }
906
+
907
+ .prompt-desc {
908
+ font-size: 12px;
909
+ color: var(--gray);
910
+ line-height: 1.3;
911
+ height: 16px;
912
+ overflow: hidden;
913
+ position: relative;
914
+ text-overflow: ellipsis;
915
+ white-space: nowrap;
916
+ cursor: pointer;
917
+ }
918
+
919
+ .prompt-meta-hint {
920
+ font-size: 11px;
921
+ color: var(--gray);
922
+ margin-top: 4px;
923
+ text-transform: none;
924
+ }
925
+
926
+ /* Tooltip样式 */
927
+ .tooltip {
928
+ position: relative;
929
+ }
930
+
931
+ .tooltip::after {
932
+ content: attr(title);
933
+ position: absolute;
934
+ bottom: 100%;
935
+ left: 50%;
936
+ transform: translateX(-50%);
937
+ background: rgba(0, 0, 0, 0.8);
938
+ color: white;
939
+ padding: 8px 12px;
940
+ border-radius: 4px;
941
+ font-size: 12px;
942
+ white-space: pre-wrap;
943
+ word-wrap: break-word;
944
+ max-width: 300px;
945
+ z-index: 1000;
946
+ opacity: 0;
947
+ visibility: hidden;
948
+ transition: opacity 0.2s, visibility 0.2s;
949
+ pointer-events: none;
950
+ }
951
+
952
+ .tooltip:hover::after {
953
+ opacity: 1;
954
+ visibility: visible;
955
+ }
956
+
957
+ /* 启用状态边框样式 */
958
+ .prompt-item.enabled {
959
+ border-left: 4px solid #b8b3b3; /* 浅30%的深灰色,原#333调浅30%约为#666 */
960
+ }
961
+
962
+ /* 选中状态样式 */
963
+ .prompt-item.active {
964
+ border-left: 4px solid #666; /* 选中时的灰色边框 */
965
+ }
966
+
967
+ /* 悬停状态样式 */
968
+ .prompt-item:hover {
969
+ border-color: #666; /* 鼠标悬停时的灰色边框 */
970
+ }
971
+
972
+ /* 操作按钮样式 */
973
+ .prompt-actions {
974
+ display: flex;
975
+ flex-direction: column;
976
+ justify-content: center;
977
+ gap: 8px;
978
+ position: absolute;
979
+ right: 0;
980
+ top: 0;
981
+ bottom: 0;
982
+ width: 100px;
983
+ opacity: 0;
984
+ visibility: hidden;
985
+ padding: 12px 16px;
986
+ transform: translateX(100%);
987
+ transition: all 0.25s ease;
988
+ background: linear-gradient(to left,
989
+ rgba(238, 238, 238, 0.95) 0%,
990
+ rgba(238, 238, 238, 0.9) 30%,
991
+ rgba(238, 238, 238, 0.6) 60%,
992
+ rgba(238, 238, 238, 0) 100%);
993
+ z-index: 1;
994
+ }
995
+
996
+ .prompt-item {
997
+ padding-right: 24px; /* 为操作按钮预留空间 */
998
+ }
999
+
1000
+ .prompt-item:hover .prompt-actions {
1001
+ opacity: 1;
1002
+ visibility: visible;
1003
+ transform: translateX(0);
1004
+ }
1005
+
1006
+ .action-btn {
1007
+ background: rgba(255, 255, 255, 0.8);
1008
+ border: 1px solid var(--border);
1009
+ border-radius: 4px;
1010
+ padding: 4px;
1011
+ margin: -3px;
1012
+ font-size: 11px;
1013
+ cursor: pointer;
1014
+ white-space: nowrap;
1015
+ text-align: center;
1016
+ transition: all 0.2s ease;
1017
+ backdrop-filter: blur(2px);
1018
+ width: 100%;
1019
+ }
1020
+
1021
+ .action-btn:hover {
1022
+ background: rgba(255, 255, 255, 0.95);
1023
+ transform: translateX(-2px);
1024
+ box-shadow: 0 1px 23px rgba(0,0,0,0.1);
1025
+ }
1026
+
1027
+ /* 美化目录三角图标 */
1028
+ .group-toggle {
1029
+ position: relative;
1030
+ width: 20px;
1031
+ height: 20px;
1032
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1033
+ }
1034
+
1035
+ .group-toggle::before {
1036
+ content: '';
1037
+ position: absolute;
1038
+ width: 16px;
1039
+ height: 16px;
1040
+ top: 50%;
1041
+ left: 50%;
1042
+ transform: translate(-50%, -50%);
1043
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") no-repeat center;
1044
+ background-size: contain;
1045
+ opacity: 0.6;
1046
+ transition: opacity 0.2s ease;
1047
+ }
1048
+
1049
+ .group-toggle.collapsed {
1050
+ transform: rotate(-90deg);
1051
+ }
1052
+
1053
+ .group-header:hover .group-toggle::before {
1054
+ opacity: 1;
1055
+ }
1056
+
1057
+ .prompt-meta {
1058
+ display: flex;
1059
+ align-items: center;
1060
+ gap: 6px;
1061
+ }
1062
+
1063
+ .prompt-tag {
1064
+ background: rgba(0,102,255,0.1);
1065
+ color: var(--primary);
1066
+ font-size: 11px;
1067
+ padding: 2px 6px;
1068
+ border-radius: 4px;
1069
+ font-weight: 500;
1070
+ }
1071
+
1072
+ .prompt-status {
1073
+ width: 8px;
1074
+ height: 8px;
1075
+ border-radius: 50%;
1076
+ }
1077
+
1078
+ .prompt-status.enabled {
1079
+ background: var(--success);
1080
+ }
1081
+
1082
+ .prompt-status.disabled {
1083
+ background: var(--gray-light);
1084
+ }
1085
+
1086
+ .prompt-list-empty {
1087
+ padding: 16px 14px;
1088
+ border: 1px dashed rgba(0,0,0,0.12);
1089
+ border-radius: 10px;
1090
+ color: var(--gray);
1091
+ font-size: 13px;
1092
+ line-height: 1.6;
1093
+ background: rgba(0,0,0,0.02);
1094
+ text-align: left;
1095
+ }
1096
+
1097
+ .prompt-list-empty span {
1098
+ display: block;
1099
+ color: var(--dark);
1100
+ font-weight: 550;
1101
+ margin-bottom: 4px;
1102
+ }
1103
+
1104
+ .group-modal-content {
1105
+ min-width: 460px;
1106
+ }
1107
+
1108
+ .group-modal-tabs {
1109
+ display: flex;
1110
+ gap: 8px;
1111
+ padding: 4px;
1112
+ background: rgba(0,0,0,0.03);
1113
+ border-radius: 10px;
1114
+ margin-bottom: 16px;
1115
+ }
1116
+
1117
+ .group-modal-tab {
1118
+ flex: 1;
1119
+ border: none;
1120
+ background: transparent;
1121
+ border-radius: 8px;
1122
+ padding: 10px 12px;
1123
+ font-size: 14px;
1124
+ font-weight: 500;
1125
+ color: var(--gray);
1126
+ cursor: pointer;
1127
+ transition: all 0.2s ease;
1128
+ }
1129
+
1130
+ .group-modal-tab:hover {
1131
+ color: var(--primary);
1132
+ }
1133
+
1134
+ .group-modal-tab.active {
1135
+ background: white;
1136
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
1137
+ color: var(--primary);
1138
+ font-weight: 580;
1139
+ }
1140
+
1141
+ .group-modal-panel {
1142
+ display: flex;
1143
+ flex-direction: column;
1144
+ gap: 12px;
1145
+ }
1146
+
1147
+ .group-modal-panel.hidden {
1148
+ display: none;
1149
+ }
1150
+
1151
+ .group-modal-hint {
1152
+ font-size: 12px;
1153
+ color: var(--gray);
1154
+ margin-top: 6px;
1155
+ }
1156
+
1157
+ .group-modal-footer {
1158
+ display: flex;
1159
+ gap: 12px;
1160
+ width: 100%;
1161
+ justify-content: flex-end;
1162
+ }
1163
+
1164
+ .group-modal-footer.hidden {
1165
+ display: none;
1166
+ }
1167
+
1168
+ .group-manage-toolbar {
1169
+ display: flex;
1170
+ align-items: center;
1171
+ gap: 10px;
1172
+ }
1173
+
1174
+ .group-manage-toolbar input {
1175
+ flex: 1;
1176
+ padding: 8px 12px;
1177
+ border: 1px solid var(--border);
1178
+ border-radius: 8px;
1179
+ font-size: 14px;
1180
+ transition: all 0.2s ease;
1181
+ }
1182
+
1183
+ .group-manage-toolbar input:focus {
1184
+ outline: none;
1185
+ border-color: var(--primary);
1186
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08);
1187
+ }
1188
+
1189
+ .group-manage-list {
1190
+ display: flex;
1191
+ flex-direction: column;
1192
+ gap: 10px;
1193
+ max-height: 300px;
1194
+ overflow-y: auto;
1195
+ padding-right: 4px;
1196
+ }
1197
+
1198
+ .group-manage-empty {
1199
+ padding: 18px 12px;
1200
+ text-align: center;
1201
+ color: var(--gray);
1202
+ font-size: 13px;
1203
+ border-radius: 10px;
1204
+ background: rgba(0,0,0,0.04);
1205
+ }
1206
+
1207
+ .group-manage-empty.hidden {
1208
+ display: none;
1209
+ }
1210
+
1211
+ .group-manage-item {
1212
+ --depth: 0;
1213
+ display: flex;
1214
+ align-items: flex-start;
1215
+ justify-content: space-between;
1216
+ gap: 12px;
1217
+ padding: 12px 14px;
1218
+ border: 1px solid rgba(0,0,0,0.08);
1219
+ border-radius: 12px;
1220
+ background: white;
1221
+ transition: all 0.2s ease;
1222
+ }
1223
+
1224
+ .group-manage-item:hover {
1225
+ border-color: rgba(0,0,0,0.15);
1226
+ box-shadow: 0 12px 30px rgba(15,23,42,0.12);
1227
+ }
1228
+
1229
+ .group-manage-item.is-disabled {
1230
+ opacity: 0.85;
1231
+ }
1232
+
1233
+ .group-manage-info {
1234
+ flex: 1;
1235
+ min-width: 0;
1236
+ }
1237
+
1238
+ .group-manage-name {
1239
+ display: flex;
1240
+ align-items: center;
1241
+ gap: 8px;
1242
+ font-size: 14px;
1243
+ font-weight: 560;
1244
+ color: var(--dark);
1245
+ padding-left: calc(var(--depth) * 16px);
1246
+ }
1247
+
1248
+ .group-manage-edit {
1249
+ display: flex;
1250
+ align-items: center;
1251
+ gap: 8px;
1252
+ padding-left: calc(var(--depth) * 16px);
1253
+ }
1254
+
1255
+ .group-manage-path {
1256
+ font-size: 12px;
1257
+ color: var(--gray);
1258
+ margin-top: 4px;
1259
+ word-break: break-all;
1260
+ }
1261
+
1262
+ .group-status-badge {
1263
+ font-size: 11px;
1264
+ padding: 2px 6px;
1265
+ border-radius: 999px;
1266
+ background: rgba(0,0,0,0.06);
1267
+ color: var(--gray);
1268
+ font-weight: 500;
1269
+ margin-left: 6px;
1270
+ }
1271
+
1272
+ .group-status-badge.enabled {
1273
+ background: rgba(40,167,69,0.12);
1274
+ color: var(--success);
1275
+ }
1276
+
1277
+ .group-status-badge.disabled {
1278
+ background: rgba(220,53,69,0.15);
1279
+ color: var(--danger);
1280
+ }
1281
+
1282
+ .group-status-badge.default {
1283
+ background: rgba(0,0,0,0.08);
1284
+ color: var(--dark);
1285
+ }
1286
+
1287
+ .group-manage-actions {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: 8px;
1291
+ }
1292
+
1293
+ .group-manage-action-btn {
1294
+ border: none;
1295
+ background: transparent;
1296
+ padding: 6px 8px;
1297
+ border-radius: 6px;
1298
+ font-size: 13px;
1299
+ color: var(--primary);
1300
+ cursor: pointer;
1301
+ transition: all 0.2s ease;
1302
+ }
1303
+
1304
+ .group-manage-action-btn:hover {
1305
+ background: rgba(0,0,0,0.05);
1306
+ }
1307
+
1308
+ .group-manage-action-btn.danger {
1309
+ color: var(--danger);
1310
+ }
1311
+
1312
+ .group-manage-action-btn[disabled] {
1313
+ cursor: not-allowed;
1314
+ opacity: 0.6;
1315
+ }
1316
+
1317
+ .group-manage-rename-input {
1318
+ width: 100%;
1319
+ padding: 8px 10px;
1320
+ border: 1px solid var(--border);
1321
+ border-radius: 8px;
1322
+ font-size: 14px;
1323
+ transition: all 0.2s ease;
1324
+ }
1325
+
1326
+ .group-manage-rename-input:focus {
1327
+ outline: none;
1328
+ border-color: var(--primary);
1329
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08);
1330
+ }
1331
+
1332
+ .editor-container {
1333
+ flex: 1;
1334
+ display: flex;
1335
+ flex-direction: column;
1336
+ background: #f5f5f5;
1337
+ border-left: 1px solid var(--border);
1338
+ padding: 16px 16px 0 16px;
1339
+ overflow-y: auto;
1340
+ min-width: 0;
1341
+ }
1342
+
1343
+ .editor-header {
1344
+ padding: 8px 0 8px;
1345
+ display: flex;
1346
+ flex-direction: column;
1347
+ gap: 12px;
1348
+ background: white;
1349
+ flex-shrink: 0;
1350
+ }
1351
+
1352
+ .editor-header-top {
1353
+ display: flex;
1354
+ gap: 8px;
1355
+ align-items: center;
1356
+ width: 100%;
1357
+ }
1358
+
1359
+ .editor-header-top input,
1360
+ .prompt-description {
1361
+ padding: 8px 12px;
1362
+ border: 1px solid var(--border);
1363
+ border-radius: 6px;
1364
+ font-size: 14px;
1365
+ background: white;
1366
+ }
1367
+
1368
+ .editor-header-top input {
1369
+ flex: 1;
1370
+ min-width: 0;
1371
+ }
1372
+
1373
+ .editor-header-top input:focus,
1374
+ .prompt-description:focus {
1375
+ outline: none;
1376
+ border-color: var(--primary);
1377
+ }
1378
+
1379
+ .group-selector {
1380
+ position: relative;
1381
+ flex-shrink: 0;
1382
+ }
1383
+
1384
+ .group-selector-btn {
1385
+ display: flex;
1386
+ align-items: center;
1387
+ gap: 8px;
1388
+ min-width: 160px;
1389
+ padding: 8px 12px;
1390
+ border: 1px solid var(--border);
1391
+ border-radius: 6px;
1392
+ background: white;
1393
+ font-size: 14px;
1394
+ color: var(--dark);
1395
+ cursor: pointer;
1396
+ transition: all 0.2s ease;
1397
+ }
1398
+
1399
+ .group-selector-btn:hover {
1400
+ border-color: var(--primary);
1401
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
1402
+ transform: translateY(-1px);
1403
+ }
1404
+
1405
+ .group-selector-label {
1406
+ color: var(--gray);
1407
+ font-size: 12px;
1408
+ letter-spacing: 0;
1409
+ }
1410
+
1411
+ .group-selector-value {
1412
+ font-weight: 500;
1413
+ color: var(--primary);
1414
+ max-width: 160px;
1415
+ overflow: hidden;
1416
+ text-overflow: ellipsis;
1417
+ white-space: nowrap;
1418
+ }
1419
+
1420
+ .group-selector-icon {
1421
+ margin-left: auto;
1422
+ display: flex;
1423
+ align-items: center;
1424
+ justify-content: center;
1425
+ color: var(--gray);
1426
+ }
1427
+
1428
+ .group-selector-input {
1429
+ position: absolute;
1430
+ inset: 0;
1431
+ opacity: 0;
1432
+ pointer-events: none;
1433
+ }
1434
+
1435
+ .prompt-description {
1436
+ width: 100%;
1437
+ min-height: 38px;
1438
+ max-height: 200px;
1439
+ line-height: 1.5;
1440
+ resize: vertical;
1441
+ overflow-y: auto;
1442
+ transition: border-color 0.2s ease;
1443
+ }
1444
+
1445
+ .editor-controls {
1446
+ display: flex;
1447
+ align-items: center;
1448
+ gap: 16px;
1449
+ margin-left: auto;
1450
+ }
1451
+
1452
+ .mode-toggle {
1453
+ display: inline-flex;
1454
+ align-items: center;
1455
+ padding: 3px;
1456
+ border-radius: 999px;
1457
+ background: var(--light);
1458
+ border: 1px solid var(--border);
1459
+ }
1460
+
1461
+ .mode-btn {
1462
+ padding: 6px 18px;
1463
+ border: none;
1464
+ background: transparent;
1465
+ border-radius: 999px;
1466
+ font-size: 13px;
1467
+ font-weight: 500;
1468
+ cursor: pointer;
1469
+ color: var(--gray);
1470
+ transition: all 0.2s;
1471
+ }
1472
+
1473
+ .mode-btn.active {
1474
+ background: white;
1475
+ color: var(--primary);
1476
+ box-shadow: 0 1px 4px rgba(0,0,0,0.08);
1477
+ }
1478
+
1479
+ .editor-content {
1480
+ display: flex;
1481
+ flex-direction: column;
1482
+ gap: 16px;
1483
+ margin: 12px 0 0 0;
1484
+ min-height: 0;
1485
+ }
1486
+
1487
+ .arguments-section {
1488
+ padding: 10px 20px;
1489
+ background: white;
1490
+ border: 1px solid var(--border);
1491
+ border-radius: 12px;
1492
+ box-shadow: 0 8px 24px rgba(0,0,0,0.05);
1493
+ display: flex;
1494
+ flex-direction: column;
1495
+ gap: 16px;
1496
+ transition: all 0.3s ease;
1497
+ }
1498
+
1499
+ .arguments-section.collapsed {
1500
+ padding: 10px 20px 10px 20px;
1501
+ gap: 0;
1502
+ }
1503
+
1504
+ .arguments-section.collapsed .arguments-list {
1505
+ max-height: 0;
1506
+ overflow: hidden;
1507
+ opacity: 0;
1508
+ margin-top: 0;
1509
+ transition: all 0.3s ease;
1510
+ }
1511
+
1512
+ .arguments-section:not(.collapsed) .arguments-list {
1513
+ max-height: 2000px;
1514
+ opacity: 1;
1515
+ margin-top: 16px;
1516
+ transition: all 0.3s ease;
1517
+ }
1518
+
1519
+ .arguments-section.has-error {
1520
+ border-color: rgba(220,53,69,0.4);
1521
+ box-shadow: 0 0 0 2px rgba(220,53,69,0.08), 0 8px 24px rgba(220,53,69,0.08);
1522
+ }
1523
+
1524
+ .arguments-header {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ justify-content: space-between;
1528
+ gap: 12px;
1529
+ flex-wrap: wrap;
1530
+ cursor: pointer;
1531
+ user-select: none;
1532
+ }
1533
+
1534
+ .arguments-header:hover .arguments-toggle {
1535
+ opacity: 1;
1536
+ }
1537
+
1538
+ .arguments-title {
1539
+ display: flex;
1540
+ align-items: center;
1541
+ gap: 8px;
1542
+ }
1543
+
1544
+ .arguments-toggle {
1545
+ width: 24px;
1546
+ height: 24px;
1547
+ display: flex;
1548
+ align-items: center;
1549
+ justify-content: center;
1550
+ border: none;
1551
+ background: transparent;
1552
+ color: var(--gray);
1553
+ cursor: pointer;
1554
+ border-radius: 4px;
1555
+ transition: all 0.3s ease;
1556
+ opacity: 0.6;
1557
+ padding: 0;
1558
+ }
1559
+
1560
+ .arguments-toggle:hover {
1561
+ background: rgba(0,0,0,0.05);
1562
+ opacity: 1;
1563
+ }
1564
+
1565
+ .arguments-section.collapsed .arguments-toggle {
1566
+ transform: rotate(-90deg);
1567
+ }
1568
+
1569
+ .arguments-title > span {
1570
+ font-size: 14px;
1571
+ font-weight: 600;
1572
+ color: var(--gray);
1573
+ }
1574
+
1575
+ .arguments-count {
1576
+ font-size: 12px;
1577
+ font-weight: 500;
1578
+ color: var(--gray);
1579
+ opacity: 0.7;
1580
+ }
1581
+
1582
+ .arguments-title small {
1583
+ font-size: 12px;
1584
+ color: var(--gray);
1585
+ }
1586
+
1587
+ .arguments-actions {
1588
+ display: flex;
1589
+ gap: 10px;
1590
+ align-items: center;
1591
+ }
1592
+
1593
+ .arguments-list {
1594
+ display: grid;
1595
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1596
+ gap: 12px;
1597
+ }
1598
+
1599
+ .arguments-empty {
1600
+ grid-column: 1 / -1;
1601
+ font-size: 13px;
1602
+ color: var(--gray);
1603
+ background: var(--light);
1604
+ border: 1px dashed var(--border);
1605
+ border-radius: 8px;
1606
+ padding: 16px;
1607
+ text-align: center;
1608
+ }
1609
+
1610
+ .argument-card {
1611
+ border: 1px solid var(--border);
1612
+ border-radius: 12px;
1613
+ background: linear-gradient(180deg, rgba(248,249,250,0.9), rgba(255,255,255,0.9));
1614
+ padding: 16px;
1615
+ display: flex;
1616
+ flex-direction: column;
1617
+ gap: 12px;
1618
+ /* min-height: 150px; */
1619
+ position: relative;
1620
+ overflow: hidden;
1621
+ }
1622
+
1623
+ .argument-card.argument-card-unused {
1624
+ border-color: rgba(220,53,69,0.45);
1625
+ box-shadow: 0 0 0 1px rgba(220,53,69,0.18);
1626
+ background: rgba(220,53,69,0.04);
1627
+ }
1628
+
1629
+ .argument-card-header {
1630
+ display: flex;
1631
+ justify-content: space-between;
1632
+ align-items: flex-start;
1633
+ gap: 8px;
1634
+ }
1635
+
1636
+ .argument-name {
1637
+ font-size: 15px;
1638
+ font-weight: 600;
1639
+ color: var(--primary);
1640
+ word-break: break-all;
1641
+ }
1642
+
1643
+ .argument-badges {
1644
+ display: flex;
1645
+ flex-wrap: wrap;
1646
+ gap: 6px;
1647
+ }
1648
+
1649
+ .argument-badge {
1650
+ padding: 2px 8px;
1651
+ border-radius: 999px;
1652
+ font-size: 11px;
1653
+ background: rgba(0,0,0,0.04);
1654
+ color: var(--gray);
1655
+ }
1656
+
1657
+ .argument-required {
1658
+ background: rgba(220,53,69,0.12);
1659
+ color: var(--danger);
1660
+ font-weight: 600;
1661
+ }
1662
+
1663
+ .argument-body {
1664
+ display: flex;
1665
+ flex-direction: column;
1666
+ gap: 6px;
1667
+ color: var(--gray);
1668
+ font-size: 12px;
1669
+ /* margin-bottom: 24px; */
1670
+ }
1671
+
1672
+ .argument-body .argument-description {
1673
+ color: var(--dark);
1674
+ font-size: 13px;
1675
+ line-height: 1.5;
1676
+ display: -webkit-box;
1677
+ -webkit-line-clamp: 3;
1678
+ -webkit-box-orient: vertical;
1679
+ overflow: hidden;
1680
+ }
1681
+
1682
+ .argument-body .argument-placeholder {
1683
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1684
+ background: rgba(0,0,0,0.04);
1685
+ padding: 2px 6px;
1686
+ border-radius: 4px;
1687
+ color: var(--primary);
1688
+ display: inline-block;
1689
+ }
1690
+
1691
+ .argument-actions {
1692
+ display: flex;
1693
+ justify-content: center;
1694
+ gap: 8px;
1695
+ opacity: 0;
1696
+ visibility: hidden;
1697
+ transition: all 0.25s ease;
1698
+ position: absolute;
1699
+ left: 0;
1700
+ right: 0;
1701
+ bottom: 0;
1702
+ padding: 12px;
1703
+ background: linear-gradient(to top,
1704
+ rgba(255, 255, 255, 0.95) 0%,
1705
+ rgba(255, 255, 255, 0.9) 50%,
1706
+ rgba(255, 255, 255, 0) 100%);
1707
+ transform: translateY(100%);
1708
+ }
1709
+
1710
+ .argument-card:hover .argument-actions {
1711
+ opacity: 1;
1712
+ visibility: visible;
1713
+ transform: translateY(0);
1714
+ }
1715
+
1716
+ .argument-action-btn {
1717
+ border: none;
1718
+ background: rgba(0,0,0,0.06);
1719
+ color: var(--primary);
1720
+ font-size: 12px;
1721
+ padding: 6px 12px;
1722
+ border-radius: 6px;
1723
+ cursor: pointer;
1724
+ transition: all 0.2s ease;
1725
+ backdrop-filter: blur(4px);
1726
+ }
1727
+
1728
+ .argument-action-btn:hover {
1729
+ background: rgba(0,0,0,0.1);
1730
+ transform: translateY(-1px);
1731
+ }
1732
+
1733
+ .argument-action-btn.delete {
1734
+ color: var(--danger);
1735
+ background: rgba(220,53,69,0.12);
1736
+ }
1737
+
1738
+ .argument-action-btn.delete:hover {
1739
+ background: rgba(220,53,69,0.18);
1740
+ }
1741
+
1742
+ .modal {
1743
+ position: fixed;
1744
+ inset: 0;
1745
+ background: rgba(17, 17, 17, 0.35);
1746
+ display: flex;
1747
+ align-items: center;
1748
+ justify-content: center;
1749
+ z-index: 1200;
1750
+ padding: 24px;
1751
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1752
+ backdrop-filter: blur(4px);
1753
+ }
1754
+
1755
+ .modal.hidden {
1756
+ opacity: 0;
1757
+ pointer-events: none;
1758
+ }
1759
+
1760
+ .modal.hidden .modal-content {
1761
+ transform: scale(0.95) translateY(10px);
1762
+ }
1763
+
1764
+ .modal-dialog {
1765
+ width: min(520px, 90vw);
1766
+ margin: auto;
1767
+ }
1768
+
1769
+ .modal-content {
1770
+ background: white;
1771
+ border-radius: 16px;
1772
+ box-shadow: 0 25px 50px -12px rgba(0,0,0,0.15);
1773
+ overflow: hidden;
1774
+ transform: scale(1) translateY(0);
1775
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1776
+ border: 1px solid rgba(0,0,0,0.08);
1777
+ max-height: 85vh;
1778
+ display: flex;
1779
+ flex-direction: column;
1780
+ }
1781
+
1782
+ .modal-header {
1783
+ padding: 12px 24px;
1784
+ border-bottom: 1px solid var(--border);
1785
+ display: flex;
1786
+ align-items: center;
1787
+ justify-content: space-between;
1788
+ background: linear-gradient(to bottom, rgba(255,255,255,1), rgba(255,255,255,0.95));
1789
+ }
1790
+
1791
+ .modal-header h3 {
1792
+ font-size: 18px;
1793
+ font-weight: 580;
1794
+ color: var(--dark);
1795
+ letter-spacing: -0.01em;
1796
+ margin: 0;
1797
+ }
1798
+
1799
+ .modal-close {
1800
+ width: 32px;
1801
+ height: 32px;
1802
+ border: none;
1803
+ background: transparent;
1804
+ border-radius: 8px;
1805
+ color: var(--gray);
1806
+ cursor: pointer;
1807
+ display: flex;
1808
+ align-items: center;
1809
+ justify-content: center;
1810
+ transition: all 0.2s ease;
1811
+ padding: 0;
1812
+ }
1813
+
1814
+ .modal-close:hover {
1815
+ background: rgba(0,0,0,0.04);
1816
+ color: var(--dark);
1817
+ }
1818
+
1819
+ .modal-body {
1820
+ padding: 24px;
1821
+ flex: 1;
1822
+ overflow-y: auto;
1823
+ min-height: 0;
1824
+ }
1825
+
1826
+ .modal-footer {
1827
+ padding: 12px 24px;
1828
+ border-top: 1px solid var(--border);
1829
+ display: flex;
1830
+ justify-content: flex-end;
1831
+ gap: 12px;
1832
+ background: rgba(248,249,250,0.65);
1833
+ }
1834
+
1835
+ .group-dropdown {
1836
+ position: absolute;
1837
+ top: calc(100% + 8px);
1838
+ right: 0;
1839
+ width: 420px;
1840
+ max-height: 420px;
1841
+ padding: 16px;
1842
+ border-radius: 14px;
1843
+ background: white;
1844
+ border: 1px solid rgba(0,0,0,0.08);
1845
+ box-shadow: 0 20px 50px rgba(15, 23, 42, 0.18);
1846
+ display: none;
1847
+ flex-direction: column;
1848
+ gap: 14px;
1849
+ z-index: 1200;
1850
+ }
1851
+
1852
+ .group-dropdown.show {
1853
+ display: flex;
1854
+ }
1855
+
1856
+ .group-dropdown-search input {
1857
+ width: 100%;
1858
+ padding: 10px 14px;
1859
+ border: 1px solid var(--border);
1860
+ border-radius: 8px;
1861
+ font-size: 14px;
1862
+ transition: all 0.2s ease;
1863
+ }
1864
+
1865
+ .group-dropdown-search input:focus {
1866
+ outline: none;
1867
+ border-color: var(--primary);
1868
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08);
1869
+ }
1870
+
1871
+ .group-dropdown-body {
1872
+ display: flex;
1873
+ flex-direction: column;
1874
+ gap: 10px;
1875
+ min-height: 220px;
1876
+ }
1877
+
1878
+ .group-cascader {
1879
+ display: flex;
1880
+ gap: 12px;
1881
+ }
1882
+
1883
+ .group-cascader-column {
1884
+ flex: 1;
1885
+ min-width: 0;
1886
+ display: flex;
1887
+ flex-direction: column;
1888
+ gap: 4px;
1889
+ max-height: 260px;
1890
+ overflow-y: auto;
1891
+ padding-right: 4px;
1892
+ border-right: 1px solid rgba(0,0,0,0.06);
1893
+ }
1894
+
1895
+ .group-cascader-column:last-child {
1896
+ border-right: none;
1897
+ }
1898
+
1899
+ .group-cascader-title {
1900
+ font-size: 12px;
1901
+ color: var(--gray);
1902
+ letter-spacing: 0;
1903
+ padding: 0 6px;
1904
+ }
1905
+
1906
+ .group-cascader-list {
1907
+ display: flex;
1908
+ flex-direction: column;
1909
+ gap: 2px;
1910
+ }
1911
+
1912
+ .group-cascader-empty {
1913
+ padding: 6px 4px;
1914
+ font-size: 12px;
1915
+ color: var(--gray);
1916
+ }
1917
+
1918
+ .group-cascader-item {
1919
+ border: none;
1920
+ background: transparent;
1921
+ text-align: left;
1922
+ padding: 6px 8px;
1923
+ border-radius: 8px;
1924
+ font-size: 13px;
1925
+ color: var(--dark);
1926
+ cursor: pointer;
1927
+ transition: background 0.18s ease, color 0.18s ease, padding-left 0.18s ease;
1928
+ position: relative;
1929
+ }
1930
+
1931
+ .group-cascader-item:hover {
1932
+ background: rgba(0,0,0,0.05);
1933
+ color: var(--primary);
1934
+ padding-left: 12px;
1935
+ }
1936
+
1937
+ .group-cascader-item.active {
1938
+ background: rgba(0,0,0,0.04);
1939
+ color: var(--primary);
1940
+ }
1941
+
1942
+ .group-cascader-label {
1943
+ display: inline-flex;
1944
+ align-items: center;
1945
+ gap: 6px;
1946
+ }
1947
+
1948
+ .group-cascader-path-hint {
1949
+ font-size: 11px;
1950
+ color: var(--gray);
1951
+ letter-spacing: 0;
1952
+ margin-left: 6px;
1953
+ }
1954
+
1955
+ .group-cascader-suffix {
1956
+ margin-left: auto;
1957
+ font-size: 12px;
1958
+ color: var(--gray);
1959
+ transition: color 0.18s ease;
1960
+ display: inline-flex;
1961
+ align-items: center;
1962
+ }
1963
+
1964
+ .group-cascader-item:hover .group-cascader-suffix,
1965
+ .group-cascader-item.active .group-cascader-suffix,
1966
+ .group-cascader-item.selected .group-cascader-suffix {
1967
+ color: var(--primary);
1968
+ }
1969
+
1970
+ .group-cascader-check {
1971
+ margin-left: auto;
1972
+ font-size: 12px;
1973
+ color: var(--primary);
1974
+ display: inline-flex;
1975
+ align-items: center;
1976
+ }
1977
+
1978
+ .group-search-results {
1979
+ display: none;
1980
+ flex-direction: column;
1981
+ gap: 6px;
1982
+ max-height: 280px;
1983
+ overflow-y: auto;
1984
+ padding-right: 4px;
1985
+ }
1986
+
1987
+ .group-search-results.show {
1988
+ display: flex;
1989
+ }
1990
+
1991
+ .group-search-item {
1992
+ border: 1px solid rgba(0,0,0,0.06);
1993
+ border-radius: 10px;
1994
+ padding: 8px 10px;
1995
+ display: flex;
1996
+ flex-direction: column;
1997
+ gap: 4px;
1998
+ cursor: pointer;
1999
+ transition: all 0.2s ease;
2000
+ background: white;
2001
+ text-align: left;
2002
+ font-size: 13px;
2003
+ color: var(--dark);
2004
+ }
2005
+
2006
+ .group-search-item:hover {
2007
+ border-color: var(--primary);
2008
+ box-shadow: 0 12px 24px rgba(15, 23, 42, 0.12);
2009
+ transform: translateY(-1px);
2010
+ }
2011
+
2012
+ .group-search-item.selected {
2013
+ border-color: var(--primary);
2014
+ box-shadow: inset 0 0 0 1px var(--primary);
2015
+ }
2016
+
2017
+ .group-search-path {
2018
+ font-size: 12px;
2019
+ color: var(--gray);
2020
+ letter-spacing: 0;
2021
+ }
2022
+
2023
+ .group-dropdown-empty {
2024
+ padding: 18px 12px;
2025
+ border-radius: 10px;
2026
+ text-align: center;
2027
+ background: rgba(0,0,0,0.03);
2028
+ color: var(--gray);
2029
+ font-size: 13px;
2030
+ }
2031
+
2032
+ .group-dropdown-empty.hidden {
2033
+ display: none;
2034
+ }
2035
+
2036
+ .form-group {
2037
+ margin-bottom: 0;
2038
+ }
2039
+
2040
+ .form-group label {
2041
+ display: block;
2042
+ margin-bottom: 8px;
2043
+ font-size: 14px;
2044
+ font-weight: 500;
2045
+ color: var(--gray);
2046
+ }
2047
+
2048
+ .form-group input {
2049
+ width: 100%;
2050
+ padding: 12px 14px;
2051
+ border: 1.5px solid var(--border);
2052
+ border-radius: 10px;
2053
+ font-size: 15px;
2054
+ transition: all 0.2s ease;
2055
+ background: white;
2056
+ }
2057
+
2058
+ .form-group input:focus {
2059
+ outline: none;
2060
+ border-color: var(--primary);
2061
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08);
2062
+ }
2063
+
2064
+ .form-group input::placeholder {
2065
+ color: #adb5bd;
2066
+ opacity: 0.8;
2067
+ }
2068
+
2069
+ .argument-modal {
2070
+ position: fixed;
2071
+ inset: 0;
2072
+ background: rgba(17, 17, 17, 0.4);
2073
+ display: flex;
2074
+ align-items: center;
2075
+ justify-content: center;
2076
+ z-index: 1200;
2077
+ padding: 24px;
2078
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2079
+ backdrop-filter: blur(4px);
2080
+ }
2081
+
2082
+ .argument-modal.hidden {
2083
+ opacity: 0;
2084
+ pointer-events: none;
2085
+ }
2086
+
2087
+ .argument-modal.hidden .argument-modal-dialog {
2088
+ transform: scale(0.95) translateY(10px);
2089
+ }
2090
+
2091
+ .argument-modal-dialog {
2092
+ width: min(520px, 100%);
2093
+ background: white;
2094
+ border-radius: 16px;
2095
+ box-shadow: 0 25px 50px -12px rgba(0,0,0,0.15);
2096
+ display: flex;
2097
+ flex-direction: column;
2098
+ overflow: hidden;
2099
+ border: 1px solid rgba(0,0,0,0.08);
2100
+ transform: scale(1) translateY(0);
2101
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2102
+ }
2103
+
2104
+ .argument-modal-header {
2105
+ display: flex;
2106
+ justify-content: space-between;
2107
+ align-items: center;
2108
+ padding: 20px 24px;
2109
+ border-bottom: 1px solid var(--border);
2110
+ background: linear-gradient(to bottom, rgba(255,255,255,1), rgba(255,255,255,0.95));
2111
+ }
2112
+
2113
+ .argument-modal-header h3 {
2114
+ font-size: 18px;
2115
+ font-weight: 580;
2116
+ color: var(--dark);
2117
+ letter-spacing: -0.01em;
2118
+ margin: 0;
2119
+ }
2120
+
2121
+ .argument-modal-close {
2122
+ width: 32px;
2123
+ height: 32px;
2124
+ border: none;
2125
+ background: transparent;
2126
+ border-radius: 8px;
2127
+ color: var(--gray);
2128
+ cursor: pointer;
2129
+ display: flex;
2130
+ align-items: center;
2131
+ justify-content: center;
2132
+ transition: all 0.2s ease;
2133
+ padding: 0;
2134
+ }
2135
+
2136
+ .argument-modal-close:hover {
2137
+ background: rgba(0,0,0,0.04);
2138
+ color: var(--dark);
2139
+ }
2140
+
2141
+ .argument-modal-body {
2142
+ padding: 24px;
2143
+ }
2144
+
2145
+ .argument-form-grid {
2146
+ display: grid;
2147
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2148
+ gap: 20px;
2149
+ }
2150
+
2151
+ .form-field {
2152
+ display: flex;
2153
+ flex-direction: column;
2154
+ }
2155
+
2156
+ .form-field.full-width {
2157
+ grid-column: 1 / -1;
2158
+ }
2159
+
2160
+ .form-field-inline {
2161
+ align-self: end;
2162
+ height: 100%;
2163
+ display: flex;
2164
+ align-items: flex-end;
2165
+ padding-top: 26px;
2166
+ }
2167
+
2168
+ .argument-modal label {
2169
+ font-size: 13px;
2170
+ color: var(--dark);
2171
+ font-weight: 500;
2172
+ letter-spacing: 0.01em;
2173
+ margin-bottom: 6px;
2174
+ }
2175
+
2176
+ .argument-modal .required {
2177
+ color: var(--danger);
2178
+ font-weight: 600;
2179
+ font-size: 12px;
2180
+ }
2181
+
2182
+ /* 统一表单字段样式 */
2183
+ .argument-modal .form-field input,
2184
+ .argument-modal .form-field textarea {
2185
+ width: 100%;
2186
+ padding: 10px 12px;
2187
+ border: 1px solid var(--border);
2188
+ border-radius: 8px;
2189
+ font-size: 14px;
2190
+ transition: all 0.2s ease;
2191
+ background: white;
2192
+ box-shadow: 0 1px 2px rgba(0,0,0,0.02);
2193
+ color: var(--dark);
2194
+ }
2195
+
2196
+ .argument-modal .form-field input:focus,
2197
+ .argument-modal .form-field textarea:focus {
2198
+ outline: none;
2199
+ border-color: var(--primary);
2200
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.1), 0 1px 2px rgba(0,0,0,0.05);
2201
+ background: white;
2202
+ }
2203
+
2204
+ .argument-modal .form-field input::placeholder,
2205
+ .argument-modal .form-field textarea::placeholder {
2206
+ color: #a0aec0;
2207
+ opacity: 0.8;
2208
+ }
2209
+
2210
+ /* 必填字段的特殊样式 */
2211
+ .argument-modal .form-field.required-field input,
2212
+ .argument-modal .form-field.required-field textarea {
2213
+ border: 1px solid #cbd5e0;
2214
+ background: #fafafa;
2215
+ }
2216
+
2217
+ .argument-modal .form-field.required-field input:focus,
2218
+ .argument-modal .form-field.required-field textarea:focus {
2219
+ border-color: var(--primary);
2220
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.1), 0 1px 2px rgba(0,0,0,0.05);
2221
+ background: white;
2222
+ }
2223
+
2224
+ .argument-modal textarea {
2225
+ resize: vertical;
2226
+ min-height: 100px;
2227
+ line-height: 1.5;
2228
+ }
2229
+
2230
+ /* 现代化复选框样式 */
2231
+ .checkbox-field {
2232
+ display: inline-flex;
2233
+ align-items: center;
2234
+ gap: 8px;
2235
+ font-size: 13px;
2236
+ color: var(--dark);
2237
+ cursor: pointer;
2238
+ padding: 6px 0;
2239
+ border: none;
2240
+ border-radius: 0;
2241
+ }
2242
+
2243
+ .checkbox-field:hover {
2244
+ /* background-color: rgba(0,0,0,0.03); */
2245
+ }
2246
+
2247
+ .checkbox-field input[type="checkbox"] {
2248
+ position: relative;
2249
+ width: 18px;
2250
+ height: 18px;
2251
+ appearance: none;
2252
+ background: white;
2253
+ border: 1px solid #cbd5e0;
2254
+ border-radius: 4px;
2255
+ cursor: pointer;
2256
+ padding: 10px 10px;
2257
+ transition: all 0.2s ease;
2258
+ box-shadow: 0 1px 2px rgba(0,0,0,0.03);
2259
+ }
2260
+
2261
+ .checkbox-field input[type="checkbox"]:checked {
2262
+ background: var(--primary);
2263
+ border-color: var(--primary);
2264
+ }
2265
+
2266
+ .checkbox-field input[type="checkbox"]:checked::before {
2267
+ content: '';
2268
+ position: absolute;
2269
+ left: 50%;
2270
+ top: 50%;
2271
+ width: 4px;
2272
+ height: 8px;
2273
+ border: solid white;
2274
+ border-width: 0 2px 2px 0;
2275
+ transform: translate(-50%, -50%) rotate(45deg);
2276
+ }
2277
+
2278
+ .checkbox-field input[type="checkbox"]:focus {
2279
+ outline: none;
2280
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.1), 0 1px 2px rgba(0,0,0,0.05);
2281
+ }
2282
+
2283
+ .form-control {
2284
+ width: 100%;
2285
+ padding: 12px 14px;
2286
+ border: 1.5px solid var(--border);
2287
+ border-radius: 10px;
2288
+ font-size: 15px;
2289
+ transition: all 0.2s ease;
2290
+ background: white;
2291
+ }
2292
+
2293
+ .form-control:focus {
2294
+ outline: none;
2295
+ border-color: var(--primary);
2296
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08);
2297
+ }
2298
+
2299
+ .form-control::placeholder {
2300
+ color: #adb5bd;
2301
+ opacity: 0.8;
2302
+ }
2303
+
2304
+ .argument-modal-footer {
2305
+ display: flex;
2306
+ justify-content: flex-end;
2307
+ gap: 12px;
2308
+ padding: 16px 24px;
2309
+ border-top: 1px solid var(--border);
2310
+ background: rgba(248,249,250,0.65);
2311
+ }
2312
+
2313
+ body.modal-open {
2314
+ overflow: hidden;
2315
+ }
2316
+
2317
+ .editor-body {
2318
+ box-sizing: border-box;
2319
+ }
2320
+
2321
+ .workspace-pane {
2322
+ display: flex;
2323
+ flex-direction: column;
2324
+ background: white;
2325
+ transition: opacity 0.25s ease;
2326
+ border-radius: 12px;
2327
+ overflow: hidden;
2328
+ border: 1px solid var(--border);
2329
+ box-shadow: 0 8px 24px rgba(0,0,0,0.05);
2330
+ }
2331
+
2332
+ .workspace-pane.hidden {
2333
+ opacity: 0;
2334
+ visibility: hidden;
2335
+ pointer-events: none;
2336
+ display: none;
2337
+ }
2338
+
2339
+ .pane-header {
2340
+ padding: 10px 24px;
2341
+ border-bottom: 1px solid var(--border);
2342
+ background: white;
2343
+ font-size: 14px;
2344
+ font-weight: 600;
2345
+ color: var(--gray);
2346
+ }
2347
+
2348
+ .pane-content {
2349
+ display: flex;
2350
+ flex-direction: column;
2351
+ padding: 0;
2352
+ }
2353
+
2354
+ .pane-content.preview {
2355
+ background: var(--preview-bg);
2356
+ padding: 24px;
2357
+ }
2358
+
2359
+ /* 原始textarea样式 */
2360
+ #editor {
2361
+ width: 100%;
2362
+ height: 100%;
2363
+ min-height: 200px;
2364
+ border: none;
2365
+ outline: none;
2366
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2367
+ font-size: 14px;
2368
+ line-height: 1.5;
2369
+ padding: 8px 12px;
2370
+ resize: none;
2371
+ flex: 1;
2372
+ }
2373
+
2374
+ /* CodeMirror 5 编辑器样式 */
2375
+ .CodeMirror {
2376
+ height: auto;
2377
+ min-height: 200px;
2378
+ font-size: 14px;
2379
+ line-height: 1.5;
2380
+ color: #000;
2381
+ background: #fff;
2382
+ border-radius: 4px;
2383
+ padding: 8px;
2384
+ }
2385
+
2386
+ .cm-scroller {
2387
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
2388
+ height: 100%;
2389
+ overflow: auto;
2390
+ }
2391
+
2392
+ .cm-content {
2393
+ padding: 8px 12px;
2394
+ height: 100%;
2395
+ }
2396
+
2397
+ .cm-gutters {
2398
+ display: none;
2399
+ }
2400
+
2401
+ .cm-line {
2402
+ padding: 0 4px;
2403
+ height: 1.5em;
2404
+ }
2405
+
2406
+ .preview-content {
2407
+ flex: 1;
2408
+ padding: 24px;
2409
+ overflow: auto;
2410
+ background: white;
2411
+ border-radius: 12px;
2412
+ }
2413
+
2414
+ /* 预览模式下的 CodeMirror 样式调整 */
2415
+ .preview-content .CodeMirror {
2416
+ height: auto;
2417
+ background: transparent;
2418
+ border: none;
2419
+ padding: 0;
2420
+ font-size: 14px;
2421
+ }
2422
+
2423
+ .preview-content .CodeMirror-scroll {
2424
+ overflow: hidden !important;
2425
+ }
2426
+
2427
+ .preview-content .CodeMirror-gutters {
2428
+ display: none;
2429
+ }
2430
+
2431
+ .preview-content .CodeMirror-cursor {
2432
+ display: none !important;
2433
+ }
2434
+
2435
+ @media (max-width: 1100px) {
2436
+ .arguments-list {
2437
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
2438
+ }
2439
+ }
2440
+
2441
+ .empty-state {
2442
+ text-align: center;
2443
+ padding: 40px 20px;
2444
+ color: var(--gray);
2445
+ }
2446
+
2447
+ .empty-state h3 {
2448
+ margin-bottom: 8px;
2449
+ font-weight: 500;
2450
+ }
2451
+
2452
+ .empty-state p {
2453
+ font-size: 14px;
2454
+ margin-bottom: 16px;
2455
+ }
2456
+
2457
+ .login-container {
2458
+ position: fixed;
2459
+ top: 0;
2460
+ left: 0;
2461
+ right: 0;
2462
+ bottom: 0;
2463
+ background: linear-gradient(135deg,
2464
+ rgba(255,255,255,0.92),
2465
+ rgba(248,249,250,0.95),
2466
+ rgba(255,255,255,0.98)
2467
+ );
2468
+ display: flex;
2469
+ align-items: center;
2470
+ justify-content: center;
2471
+ z-index: 1000;
2472
+ backdrop-filter: blur(12px);
2473
+ }
2474
+
2475
+ .login-box {
2476
+ width: 400px;
2477
+ background: white;
2478
+ border-radius: 20px;
2479
+ box-shadow: 0 25px 50px -12px rgba(0,0,0,0.15);
2480
+ padding: 48px 40px;
2481
+ text-align: center;
2482
+ border: 1px solid rgba(0,0,0,0.06);
2483
+ position: relative;
2484
+ animation: login-box-show 0.5s cubic-bezier(0.21, 1.02, 0.73, 1) forwards;
2485
+ backdrop-filter: blur(10px);
2486
+ background: linear-gradient(180deg,
2487
+ rgba(255, 255, 255, 0.98) 0%,
2488
+ rgba(255, 255, 255, 0.96) 100%
2489
+ );
2490
+ }
2491
+
2492
+ @keyframes login-box-show {
2493
+ 0% {
2494
+ opacity: 0;
2495
+ transform: translateY(20px);
2496
+ }
2497
+ 100% {
2498
+ opacity: 1;
2499
+ transform: translateY(0);
2500
+ }
2501
+ }
2502
+
2503
+ .login-box h2 {
2504
+ font-size: 28px;
2505
+ font-weight: 600;
2506
+ color: var(--primary);
2507
+ margin-bottom: 36px;
2508
+ position: relative;
2509
+ display: inline-block;
2510
+ }
2511
+
2512
+ .login-box h2::after {
2513
+ content: '';
2514
+ position: absolute;
2515
+ bottom: -12px;
2516
+ left: 50%;
2517
+ transform: translateX(-50%);
2518
+ width: 45px;
2519
+ height: 4px;
2520
+ background: linear-gradient(to right, var(--primary), var(--primary-dark));
2521
+ border-radius: 4px;
2522
+ opacity: 0.8;
2523
+ }
2524
+
2525
+ .login-box .input-group {
2526
+ position: relative;
2527
+ margin-bottom: 24px;
2528
+ width: 100%;
2529
+ }
2530
+
2531
+ .login-box .input-group::before {
2532
+ content: '';
2533
+ position: absolute;
2534
+ left: 16px;
2535
+ top: 50%;
2536
+ transform: translateY(-50%);
2537
+ width: 16px;
2538
+ height: 16px;
2539
+ opacity: 0.5;
2540
+ transition: opacity 0.2s ease;
2541
+ background-size: contain;
2542
+ background-repeat: no-repeat;
2543
+ }
2544
+
2545
+ .login-box .input-group.username::before {
2546
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E");
2547
+ }
2548
+
2549
+ .login-box .input-group.password::before {
2550
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2' ry='2'/%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'/%3E%3C/svg%3E");
2551
+ }
2552
+
2553
+ .login-box .input-group:focus-within::before {
2554
+ opacity: 1;
2555
+ }
2556
+
2557
+ .login-box input {
2558
+ width: 100%;
2559
+ padding: 14px 15px 14px 48px;
2560
+ border: 1.5px solid var(--border);
2561
+ border-radius: 12px;
2562
+ font-size: 16px;
2563
+ font-weight: 450;
2564
+ letter-spacing: -0.01em;
2565
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2566
+ background: rgba(255, 255, 255, 0.9);
2567
+ box-shadow: 0 2px 6px rgba(0,0,0,0.02);
2568
+ }
2569
+
2570
+ .login-box input:focus {
2571
+ outline: none;
2572
+ border-color: var(--primary);
2573
+ border-width: 1.5px;
2574
+ box-shadow: 0 0 0 3px rgba(57,57,57,0.08), 0 2px 8px rgba(0,0,0,0.04);
2575
+ background: white;
2576
+ }
2577
+
2578
+ .login-box input::placeholder {
2579
+ color: #adb5bd;
2580
+ font-size: 15px;
2581
+ font-weight: 450;
2582
+ letter-spacing: -0.01em;
2583
+ opacity: 0.85;
2584
+ }
2585
+
2586
+ .login-box button {
2587
+ width: 100%;
2588
+ padding: 16px 132px;
2589
+ margin-top: 32px;
2590
+ border: none;
2591
+ border-radius: 12px;
2592
+ font-size: 16px;
2593
+ font-weight: 520;
2594
+ background: var(--primary);
2595
+ color: white;
2596
+ cursor: pointer;
2597
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2598
+ position: relative;
2599
+ overflow: hidden;
2600
+ letter-spacing: 0.02em;
2601
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
2602
+ }
2603
+
2604
+ .login-box button::before {
2605
+ content: '';
2606
+ position: absolute;
2607
+ top: 0;
2608
+ left: 0;
2609
+ right: 0;
2610
+ bottom: 0;
2611
+ background: linear-gradient(to right, transparent, rgba(255,255,255,0.1), transparent);
2612
+ transform: translateX(-100%);
2613
+ transition: transform 0.8s ease;
2614
+ }
2615
+
2616
+ .login-box button:hover {
2617
+ background: var(--primary-dark);
2618
+ transform: translateY(-2px);
2619
+ box-shadow: 0 8px 16px rgba(0,0,0,0.12);
2620
+ }
2621
+
2622
+ .login-box button:active {
2623
+ transform: translateY(0);
2624
+ box-shadow: 0 3px 8px rgba(0,0,0,0.08);
2625
+ background: var(--primary);
2626
+ }
2627
+
2628
+ .login-box button:hover::before {
2629
+ transform: translateX(100%);
2630
+ }
2631
+
2632
+ .error-msg {
2633
+ color: var(--danger);
2634
+ font-size: 13px;
2635
+ margin-top: 12px;
2636
+ text-align: center;
2637
+ opacity: 0;
2638
+ transform: translateY(-10px);
2639
+ animation: error-show 0.3s ease forwards;
2640
+ display: flex;
2641
+ align-items: center;
2642
+ justify-content: center;
2643
+ gap: 6px;
2644
+ }
2645
+
2646
+ .error-msg::before {
2647
+ content: '';
2648
+ width: 16px;
2649
+ height: 16px;
2650
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc3545' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='12'/%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'/%3E%3C/svg%3E") no-repeat center;
2651
+ background-size: contain;
2652
+ }
2653
+
2654
+ @keyframes error-show {
2655
+ to {
2656
+ opacity: 1;
2657
+ transform: translateY(0);
2658
+ }
2659
+ }
2660
+
2661
+ .success-msg {
2662
+ color: var(--success);
2663
+ font-size: 13px;
2664
+ margin-top: 12px;
2665
+ text-align: center;
2666
+ display: flex;
2667
+ align-items: center;
2668
+ justify-content: center;
2669
+ gap: 6px;
2670
+ }
2671
+
2672
+ .success-msg::before {
2673
+ content: '';
2674
+ width: 16px;
2675
+ height: 16px;
2676
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328a745' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/%3E%3Cpolyline points='22 4 12 14.01 9 11.01'/%3E%3C/svg%3E") no-repeat center;
2677
+ background-size: contain;
2678
+ }
2679
+
2680
+ .loading {
2681
+ opacity: 0.6;
2682
+ pointer-events: none;
2683
+ }
2684
+
2685
+ .status-badge {
2686
+ display: inline-flex;
2687
+ align-items: center;
2688
+ gap: 4px;
2689
+ padding: 4px 8px;
2690
+ border-radius: 12px;
2691
+ font-size: 12px;
2692
+ font-weight: 500;
2693
+ }
2694
+
2695
+ .status-badge.enabled {
2696
+ background: rgba(40,167,69,0.1);
2697
+ color: var(--success);
2698
+ }
2699
+
2700
+ .status-badge.disabled {
2701
+ background: rgba(220,53,69,0.1);
2702
+ color: var(--danger);
2703
+ }
2704
+
2705
+ /* 加载中效果 */
2706
+ .loading-overlay {
2707
+ position: fixed;
2708
+ top: 0;
2709
+ left: 0;
2710
+ width: 100%;
2711
+ height: 100%;
2712
+ background: rgba(255, 255, 255, 0.92);
2713
+ display: flex;
2714
+ flex-direction: column;
2715
+ align-items: center;
2716
+ justify-content: center;
2717
+ z-index: 9999;
2718
+ backdrop-filter: blur(1px);
2719
+ }
2720
+
2721
+ .loading-overlay.hidden {
2722
+ display: none;
2723
+ }
2724
+
2725
+ .loading-spinner {
2726
+ width: 50px;
2727
+ height: 50px;
2728
+ border: 4px solid rgba(57, 57, 57, 0.08);
2729
+ border-top: 4px solid rgba(57, 57, 57, 0.4);
2730
+ border-radius: 50%;
2731
+ animation: spin 1s linear infinite;
2732
+ margin-bottom: 20px;
2733
+ }
2734
+
2735
+ .loading-text {
2736
+ font-size: 16px;
2737
+ color: rgba(26, 26, 26, 0.7);
2738
+ font-weight: 500;
2739
+ text-align: center;
2740
+ }
2741
+
2742
+ .loading-subtext {
2743
+ font-size: 13px;
2744
+ color: rgba(108, 117, 125, 0.7);
2745
+ margin-top: 8px;
2746
+ text-align: center;
2747
+ }
2748
+
2749
+ @keyframes spin {
2750
+ 0% { transform: rotate(0deg); }
2751
+ 100% { transform: rotate(360deg); }
2752
+ }
2753
+
2754
+ .custom-blank-content {
2755
+ display: flex;
2756
+ flex-direction: column;
2757
+ width: min(1280px, 100%);
2758
+ margin: 0 auto 16px auto;
2759
+ padding: 24px;
2760
+ background: #ffffff;
2761
+ border-radius: 8px;
2762
+ box-shadow: 4px 4px 4px #ccc;
2763
+ min-height: 400px;
2764
+ }
2765
+
2766
+ .blank-placeholder {
2767
+ flex: 1;
2768
+ display: flex;
2769
+ align-items: center;
2770
+ justify-content: center;
2771
+ padding: 40px 20px;
2772
+ }
2773
+
2774
+ .blank-placeholder-body {
2775
+ text-align: center;
2776
+ color: var(--gray);
2777
+ }
2778
+
2779
+ .blank-placeholder-emoji {
2780
+ font-size: 48px;
2781
+ margin-bottom: 16px;
2782
+ }
2783
+
2784
+ .blank-placeholder-text {
2785
+ font-size: 14px;
2786
+ line-height: 1.6;
2787
+ color: var(--gray);
2788
+ }
2789
+
2790
+ #promptEditorArea {
2791
+ display: none;
2792
+ flex-direction: column;
2793
+ width: min(1280px, 100%);
2794
+ margin: 0 auto 16px auto;
2795
+ padding: 8px 15px 16px 15px;
2796
+ background: #ffffff;
2797
+ border-radius: 8px;
2798
+ box-shadow: 4px 4px 4px #ccc;
2799
+ }
2800
+
2801
+ /* 工具区域样式 */
2802
+ .tools-area {
2803
+ flex: 1;
2804
+ display: flex;
2805
+ flex-direction: column;
2806
+ background: white;
2807
+ border-left: 1px solid var(--border);
2808
+ overflow: hidden;
2809
+ }
2810
+
2811
+ /* 工具页面头部 */
2812
+ .tools-header {
2813
+ display: flex;
2814
+ justify-content: space-between;
2815
+ align-items: center;
2816
+ padding: 18px 32px;
2817
+ border-bottom: 1px solid var(--border);
2818
+ background: #fafafa;
2819
+ }
2820
+
2821
+ .tools-header-left {
2822
+ display: flex;
2823
+ align-items: center;
2824
+ gap: 24px;
2825
+ }
2826
+
2827
+ .tools-title {
2828
+ font-size: 24px;
2829
+ font-weight: 600;
2830
+ color: var(--dark);
2831
+ margin: 0;
2832
+ }
2833
+
2834
+ .tools-search {
2835
+ position: relative;
2836
+ width: 360px;
2837
+ }
2838
+
2839
+ .tools-search input {
2840
+ width: 100%;
2841
+ padding: 10px 40px 10px 16px;
2842
+ border: 1px solid var(--border);
2843
+ border-radius: 8px;
2844
+ font-size: 14px;
2845
+ transition: all 0.2s ease;
2846
+ background: white;
2847
+ }
2848
+
2849
+ .tools-search input:focus {
2850
+ outline: none;
2851
+ border-color: var(--primary);
2852
+ box-shadow: 0 0 0 3px rgba(57, 57, 57, 0.1);
2853
+ }
2854
+
2855
+ .search-clear-btn {
2856
+ position: absolute;
2857
+ right: 10px;
2858
+ top: 50%;
2859
+ transform: translateY(-50%);
2860
+ background: none;
2861
+ border: none;
2862
+ color: var(--gray);
2863
+ cursor: pointer;
2864
+ padding: 6px;
2865
+ border-radius: 4px;
2866
+ display: flex;
2867
+ align-items: center;
2868
+ justify-content: center;
2869
+ transition: all 0.2s ease;
2870
+ }
2871
+
2872
+ .search-clear-btn:hover {
2873
+ background: var(--light);
2874
+ color: var(--dark);
2875
+ }
2876
+
2877
+ .tools-header-right {
2878
+ display: flex;
2879
+ align-items: center;
2880
+ gap: 20px;
2881
+ }
2882
+
2883
+ .tools-filter {
2884
+ display: flex;
2885
+ gap: 2px;
2886
+ background: var(--light);
2887
+ padding: 3px;
2888
+ border-radius: 10px;
2889
+ }
2890
+
2891
+ .filter-btn {
2892
+ padding: 8px 16px;
2893
+ border: none;
2894
+ background: transparent;
2895
+ color: var(--gray);
2896
+ font-size: 14px;
2897
+ border-radius: 7px;
2898
+ cursor: pointer;
2899
+ transition: all 0.2s ease;
2900
+ font-weight: 500;
2901
+ white-space: nowrap;
2902
+ }
2903
+
2904
+ .filter-btn:hover {
2905
+ background: white;
2906
+ color: var(--dark);
2907
+ }
2908
+
2909
+ .filter-btn.active {
2910
+ background: white;
2911
+ color: var(--primary);
2912
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
2913
+ }
2914
+
2915
+ /* 工具内容区域 */
2916
+ .tools-content {
2917
+ flex: 1;
2918
+ overflow-y: auto;
2919
+ /* padding: 32px; */
2920
+ min-height: 0;
2921
+ }
2922
+
2923
+ /* 工具网格 */
2924
+ .tools-grid {
2925
+ display: grid;
2926
+ grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
2927
+ gap: 24px;
2928
+ animation: fadeIn 0.3s ease;
2929
+ margin: 24px;
2930
+ }
2931
+
2932
+ /* 工具卡片 */
2933
+ .tool-card {
2934
+ background: white;
2935
+ border: 1px solid var(--border);
2936
+ border-radius: 12px;
2937
+ padding: 24px;
2938
+ transition: all 0.3s ease;
2939
+ cursor: pointer;
2940
+ position: relative;
2941
+ overflow: hidden;
2942
+ height: 100%;
2943
+ display: flex;
2944
+ flex-direction: column;
2945
+ }
2946
+
2947
+ .tool-card::before {
2948
+ content: '';
2949
+ position: absolute;
2950
+ top: 0;
2951
+ left: 0;
2952
+ right: 0;
2953
+ height: 4px;
2954
+ /* background: linear-gradient(90deg, var(--primary), #6366f1); */
2955
+ background: var(--primary);
2956
+ opacity: 0;
2957
+ transition: opacity 0.3s ease;
2958
+ }
2959
+
2960
+ .tool-card:hover {
2961
+ transform: translateY(-4px);
2962
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
2963
+ border-color: var(--primary);
2964
+ }
2965
+
2966
+ .tool-card:hover::before {
2967
+ opacity: 1;
2968
+ }
2969
+
2970
+ .tool-card-header {
2971
+ display: flex;
2972
+ justify-content: space-between;
2973
+ align-items: flex-start;
2974
+ margin-bottom: 16px;
2975
+ }
2976
+
2977
+ .tool-card-title {
2978
+ font-size: 18px;
2979
+ font-weight: 600;
2980
+ color: var(--dark);
2981
+ margin: 0;
2982
+ display: flex;
2983
+ align-items: center;
2984
+ gap: 10px;
2985
+ line-height: 1.3;
2986
+ flex: 1;
2987
+ }
2988
+
2989
+ .tool-card-icon {
2990
+ width: 28px;
2991
+ height: 28px;
2992
+ background: linear-gradient(135deg, var(--primary), #6366f1);
2993
+ border-radius: 8px;
2994
+ display: flex;
2995
+ align-items: center;
2996
+ justify-content: center;
2997
+ color: white;
2998
+ font-size: 14px;
2999
+ font-weight: 600;
3000
+ flex-shrink: 0;
3001
+ }
3002
+
3003
+ .tool-card-version {
3004
+ font-size: 12px;
3005
+ color: var(--gray);
3006
+ background: var(--light);
3007
+ padding: 4px 10px;
3008
+ border-radius: 6px;
3009
+ font-weight: 500;
3010
+ flex-shrink: 0;
3011
+ }
3012
+
3013
+ .tool-card-description {
3014
+ color: var(--gray);
3015
+ font-size: 14px;
3016
+ line-height: 1.6;
3017
+ /* margin-bottom: 20px; */
3018
+ display: -webkit-box;
3019
+ -webkit-line-clamp: 2;
3020
+ line-clamp: 2;
3021
+ -webkit-box-orient: vertical;
3022
+ overflow: hidden;
3023
+ text-overflow: ellipsis;
3024
+ max-height: calc(1.6em * 2); /* 2行高度:line-height * 行数 */
3025
+ flex-grow: 1;
3026
+ word-break: break-word;
3027
+ }
3028
+
3029
+ .tool-card-meta {
3030
+ display: flex;
3031
+ flex-wrap: wrap;
3032
+ gap: 8px;
3033
+ margin-bottom: 20px;
3034
+ }
3035
+
3036
+ .tool-card-category-row {
3037
+ margin-bottom: 12px;
3038
+ padding-bottom: 12px;
3039
+ border-bottom: 1px solid #f0f0f0;
3040
+ }
3041
+
3042
+ .tool-card-category {
3043
+ font-size: 14px;
3044
+ font-weight: 600;
3045
+ color: #2d3748;
3046
+ display: inline-block;
3047
+ padding: 6px 0;
3048
+ position: relative;
3049
+ }
3050
+
3051
+ .tool-card-category::before {
3052
+ content: '';
3053
+ position: absolute;
3054
+ left: -12px;
3055
+ top: 50%;
3056
+ transform: translateY(-50%);
3057
+ width: 4px;
3058
+ height: 16px;
3059
+ background: #4299e1;
3060
+ border-radius: 2px;
3061
+ }
3062
+
3063
+ .tool-card-description-wrapper {
3064
+ margin-bottom: 10px;
3065
+ padding-bottom: 10px;
3066
+ border-bottom: 1px dashed var(--gray-light);
3067
+ }
3068
+
3069
+ .tool-card-category-badge {
3070
+ display: inline-block;
3071
+ font-size: 12px;
3072
+ font-weight: 600;
3073
+ color: #838282;
3074
+ background: linear-gradient(135deg, #e3f2fd 0%, #f0f7ff 100%);
3075
+ /* border: 1px solid #90caf9; */
3076
+ border-radius: 4px;
3077
+ padding: 1px 6px;
3078
+ margin-right: 6px;
3079
+ vertical-align: baseline;
3080
+ box-shadow: 0 1px 2px rgba(66, 153, 225, 0.1);
3081
+ transition: all 0.2s ease;
3082
+ }
3083
+
3084
+ .tool-card-category-badge:hover {
3085
+ background: linear-gradient(135deg, #bbdefb 0%, #e3f2fd 100%);
3086
+ border-color: #64b5f6;
3087
+ box-shadow: 0 2px 4px rgba(66, 153, 225, 0.15);
3088
+ }
3089
+
3090
+ .tool-card-tags-row {
3091
+ position: relative;
3092
+ height: 32px;
3093
+ margin-bottom: 8px;
3094
+ overflow-y: auto;
3095
+ }
3096
+
3097
+ .tool-card-tags-container {
3098
+ display: flex;
3099
+ flex-wrap: wrap;
3100
+ gap: 8px;
3101
+ line-height: 1.2;
3102
+ max-height: 64px;
3103
+ overflow-y: auto;
3104
+ }
3105
+
3106
+ .tool-card-tags-row.expanded .tool-card-tags-container {
3107
+ max-height: 200px;
3108
+ }
3109
+
3110
+ .tool-card-tag {
3111
+ font-size: 12px;
3112
+ color: #718096;
3113
+ background: #f7fafc;
3114
+ border: 1px solid #e2e8f0;
3115
+ padding: 4px 8px;
3116
+ border-radius: 4px;
3117
+ font-weight: 400;
3118
+ transition: all 0.2s ease;
3119
+ position: relative;
3120
+ }
3121
+
3122
+ .tool-card-tag:hover {
3123
+ background: #edf2f7;
3124
+ border-color: #cbd5e0;
3125
+ color: #4a5568;
3126
+ }
3127
+
3128
+ /* 展开按钮 */
3129
+ .tool-card-footer {
3130
+ display: flex;
3131
+ justify-content: space-between;
3132
+ align-items: center;
3133
+ padding-top: 16px;
3134
+ border-top: 1px solid var(--gray-light);
3135
+ margin-top: auto;
3136
+ }
3137
+
3138
+ .tool-card-author {
3139
+ font-size: 13px;
3140
+ color: var(--gray);
3141
+ display: flex;
3142
+ align-items: center;
3143
+ gap: 8px;
3144
+ }
3145
+
3146
+ .tool-card-author::before {
3147
+ content: '👤';
3148
+ font-size: 14px;
3149
+ }
3150
+
3151
+ .tool-card-actions {
3152
+ display: flex;
3153
+ gap: 8px;
3154
+ }
3155
+
3156
+ .tool-card-action {
3157
+ padding: 6px 12px;
3158
+ font-size: 12px;
3159
+ border: 1px solid var(--border);
3160
+ background: white;
3161
+ color: var(--gray);
3162
+ border-radius: 6px;
3163
+ cursor: pointer;
3164
+ transition: all 0.2s ease;
3165
+ font-weight: 500;
3166
+ }
3167
+
3168
+ .tool-card-action:hover {
3169
+ background: var(--primary);
3170
+ color: white;
3171
+ border-color: var(--primary);
3172
+ }
3173
+
3174
+ /* 工具卡片特殊字段 - Tab设计 */
3175
+ .tool-card-meta {
3176
+ /* margin-top: 16px; */
3177
+ padding-top: 16px;
3178
+ border-top: 1px dashed var(--gray-light);
3179
+ }
3180
+
3181
+ .tool-card-meta-tabs {
3182
+ display: flex;
3183
+ border-bottom: 1px solid var(--gray-light);
3184
+ margin-bottom: 12px;
3185
+ width: 100%;
3186
+ }
3187
+
3188
+ .tool-card-meta-tab {
3189
+ padding: 6px 22px 6px 12px;
3190
+ font-size: 11px;
3191
+ font-weight: 500;
3192
+ color: var(--gray);
3193
+ background: none;
3194
+ border: none;
3195
+ border-bottom: 1px solid transparent;
3196
+ cursor: pointer;
3197
+ transition: all 0.2s ease;
3198
+ text-transform: uppercase;
3199
+ letter-spacing: 0.5px;
3200
+ display: flex;
3201
+ align-items: center;
3202
+ gap: 4px;
3203
+ /* flex: 1; */
3204
+ justify-content: center;
3205
+ }
3206
+
3207
+ .tool-card-meta-tab:hover {
3208
+ color: var(--dark);
3209
+ background: rgba(57, 57, 57, 0.04);
3210
+ border-radius: 4px 4px 0 0;
3211
+ }
3212
+
3213
+ .tool-card-meta-tab.active {
3214
+ color: var(--primary);
3215
+ border-bottom-color: var(--primary);
3216
+ }
3217
+
3218
+ .tool-card-meta-tab.scenarios-tab.active {
3219
+ color: var(--dark);
3220
+ border-bottom-color: var(--dark);
3221
+ }
3222
+
3223
+ .tool-card-meta-tab.limitations-tab.active {
3224
+ color: var(--danger);
3225
+ border-bottom-color: var(--danger);
3226
+ }
3227
+
3228
+ .tool-card-meta-content {
3229
+ min-height: 40px;
3230
+ max-height: 120px;
3231
+ overflow-y: auto;
3232
+ }
3233
+
3234
+ .tool-card-meta-panel {
3235
+ display: none;
3236
+ }
3237
+
3238
+ .tool-card-meta-panel.active {
3239
+ display: block;
3240
+ }
3241
+
3242
+ .tool-card-meta-list {
3243
+ display: flex;
3244
+ flex-wrap: wrap;
3245
+ gap: 4px;
3246
+ }
3247
+
3248
+ .tool-card-meta-item {
3249
+ font-size: 11px;
3250
+ padding: 2px 6px;
3251
+ border-radius: 3px;
3252
+ background: var(--light);
3253
+ color: var(--gray);
3254
+ border: 1px solid var(--gray-light);
3255
+ transition: all 0.2s ease;
3256
+ line-height: 1.3;
3257
+ }
3258
+
3259
+ .tool-card-meta-panel.scenarios .tool-card-meta-item {
3260
+ background: rgba(57, 57, 57, 0.06);
3261
+ color: var(--dark);
3262
+ border-color: rgba(57, 57, 57, 0.12);
3263
+ }
3264
+
3265
+ .tool-card-meta-panel.scenarios .tool-card-meta-item:hover {
3266
+ background: rgba(57, 57, 57, 0.1);
3267
+ border-color: rgba(57, 57, 57, 0.2);
3268
+ }
3269
+
3270
+ .tool-card-meta-panel.limitations .tool-card-meta-item {
3271
+ background: rgba(220, 53, 69, 0.06);
3272
+ color: var(--danger);
3273
+ border-color: rgba(220, 53, 69, 0.12);
3274
+ }
3275
+
3276
+ .tool-card-meta-panel.limitations .tool-card-meta-item:hover {
3277
+ background: rgba(220, 53, 69, 0.1);
3278
+ border-color: rgba(220, 53, 69, 0.2);
3279
+ }
3280
+
3281
+ /* 单个tab时的样式 */
3282
+ .tool-card-meta-tabs.single-tab .tool-card-meta-tab {
3283
+ border-bottom: 2px solid var(--primary);
3284
+ color: var(--primary);
3285
+ }
3286
+
3287
+ .tool-card-meta-tabs.single-tab.scenarios-only .tool-card-meta-tab {
3288
+ border-bottom-color: var(--dark);
3289
+ color: var(--dark);
3290
+ }
3291
+
3292
+ .tool-card-meta-tabs.single-tab.limitations-only .tool-card-meta-tab {
3293
+ border-bottom-color: var(--danger);
3294
+ color: var(--danger);
3295
+ }
3296
+
3297
+ /* 聚合视图样式 */
3298
+ .tools-aggregated-view {
3299
+ animation: fadeIn 0.3s ease;
3300
+ padding: 0 8px 0 0;
3301
+ height: 100%;
3302
+ overflow: hidden;
3303
+ }
3304
+
3305
+ .aggregated-view {
3306
+ width: 100%;
3307
+ height: 100%;
3308
+ display: flex;
3309
+ gap: 18px;
3310
+ }
3311
+
3312
+ .aggregated-sidebar {
3313
+ width: 280px;
3314
+ height: 100%;
3315
+ flex-shrink: 0;
3316
+ background: white;
3317
+ border-right: 1px solid var(--border);
3318
+ /* border-radius: 12px; */
3319
+ overflow: hidden;
3320
+ display: flex;
3321
+ flex-direction: column;
3322
+ }
3323
+
3324
+ .aggregated-sidebar-header {
3325
+ padding: 13px 25px;
3326
+ background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
3327
+ border-bottom: 1px solid var(--border);
3328
+ flex-shrink: 0;
3329
+ }
3330
+
3331
+ .aggregated-sidebar-header h3 {
3332
+ font-size: 16px;
3333
+ font-weight: 600;
3334
+ color: var(--dark);
3335
+ margin: 0;
3336
+ }
3337
+
3338
+ .aggregated-sidebar-list {
3339
+ flex: 1;
3340
+ overflow-y: auto;
3341
+ padding: 8px;
3342
+ }
3343
+
3344
+ .aggregated-content {
3345
+ flex: 1;
3346
+ height: 100%;
3347
+ display: flex;
3348
+ flex-direction: column;
3349
+ min-width: 0;
3350
+ overflow-y: auto;
3351
+ padding: 11px 20px 0 0;
3352
+ }
3353
+
3354
+ .aggregated-content-header {
3355
+ margin-bottom: 24px;
3356
+ padding-bottom: 16px;
3357
+ border-bottom: 2px solid var(--border);
3358
+ flex-shrink: 0;
3359
+ }
3360
+
3361
+ .aggregated-content-header h3 {
3362
+ font-size: 20px;
3363
+ font-weight: 600;
3364
+ color: var(--dark);
3365
+ margin: 0;
3366
+ }
3367
+
3368
+ .aggregated-content-grid {
3369
+ display: grid;
3370
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
3371
+ gap: 20px;
3372
+ padding-bottom: 32px;
3373
+ }
3374
+
3375
+ .aggregated-header {
3376
+ margin-bottom: 32px;
3377
+ padding-bottom: 16px;
3378
+ border-bottom: 2px solid var(--border);
3379
+ flex-shrink: 0;
3380
+ }
3381
+
3382
+ .aggregated-header h3 {
3383
+ font-size: 22px;
3384
+ font-weight: 600;
3385
+ color: var(--dark);
3386
+ margin: 0;
3387
+ }
3388
+
3389
+ /* 侧边栏列表项 */
3390
+ .sidebar-item {
3391
+ padding: 12px 16px;
3392
+ margin-bottom: 4px;
3393
+ border-radius: 8px;
3394
+ cursor: pointer;
3395
+ transition: all 0.2s ease;
3396
+ display: flex;
3397
+ align-items: center;
3398
+ gap: 12px;
3399
+ background: transparent;
3400
+ }
3401
+
3402
+ .sidebar-item:hover {
3403
+ background: #f8f9fa;
3404
+ }
3405
+
3406
+ .sidebar-item.active {
3407
+ background: linear-gradient(135deg, #f5f5f5 0%, #f0f7ff 100%);
3408
+ border-left: 3px solid var(--primary);
3409
+ padding-left: 13px;
3410
+ }
3411
+
3412
+ .sidebar-item-icon {
3413
+ width: 36px;
3414
+ height: 36px;
3415
+ border-radius: 8px;
3416
+ display: flex;
3417
+ align-items: center;
3418
+ justify-content: center;
3419
+ font-size: 18px;
3420
+ background: linear-gradient(135deg, var(--primary), #6366f1);
3421
+ color: white;
3422
+ flex-shrink: 0;
3423
+ }
3424
+
3425
+ .sidebar-item.active .sidebar-item-icon {
3426
+ box-shadow: 0 2px 8px rgba(66, 153, 225, 0.3);
3427
+ }
3428
+
3429
+ .sidebar-item-content {
3430
+ flex: 1;
3431
+ min-width: 0;
3432
+ }
3433
+
3434
+ .sidebar-item-name {
3435
+ font-size: 14px;
3436
+ font-weight: 600;
3437
+ color: var(--dark);
3438
+ margin-bottom: 2px;
3439
+ white-space: nowrap;
3440
+ overflow: hidden;
3441
+ text-overflow: ellipsis;
3442
+ }
3443
+
3444
+ .sidebar-item-count {
3445
+ font-size: 12px;
3446
+ color: var(--gray);
3447
+ }
3448
+
3449
+ .sidebar-item.active .sidebar-item-name {
3450
+ color: var(--primary);
3451
+ }
3452
+
3453
+ /* 类别网格 */
3454
+ .category-grid {
3455
+ display: grid;
3456
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
3457
+ gap: 20px;
3458
+ }
3459
+
3460
+ .category-card {
3461
+ background: white;
3462
+ border: 1px solid var(--border);
3463
+ border-radius: 12px;
3464
+ padding: 24px;
3465
+ text-align: center;
3466
+ cursor: pointer;
3467
+ transition: all 0.3s ease;
3468
+ height: 100%;
3469
+ }
3470
+
3471
+ .category-card:hover {
3472
+ transform: translateY(-4px);
3473
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
3474
+ border-color: var(--primary);
3475
+ }
3476
+
3477
+ .category-icon {
3478
+ width: 56px;
3479
+ height: 56px;
3480
+ margin: 0 auto 16px;
3481
+ background: linear-gradient(135deg, var(--primary), #6366f1);
3482
+ border-radius: 16px;
3483
+ display: flex;
3484
+ align-items: center;
3485
+ justify-content: center;
3486
+ color: white;
3487
+ font-size: 24px;
3488
+ box-shadow: 0 4px 12px rgba(57, 57, 57, 0.2);
3489
+ }
3490
+
3491
+ .category-name {
3492
+ font-size: 16px;
3493
+ font-weight: 600;
3494
+ color: var(--dark);
3495
+ margin-bottom: 6px;
3496
+ }
3497
+
3498
+ .category-count {
3499
+ font-size: 13px;
3500
+ color: var(--gray);
3501
+ }
3502
+
3503
+ /* 标签视图特殊布局 */
3504
+ #tagView.aggregated-view {
3505
+ flex-direction: column;
3506
+ overflow-y: auto;
3507
+ padding: 0 20px 32px 20px;
3508
+ }
3509
+
3510
+ /* 标签云 */
3511
+ .tag-cloud {
3512
+ display: flex;
3513
+ flex-wrap: wrap;
3514
+ gap: 10px;
3515
+ margin-bottom: 32px;
3516
+ padding: 20px;
3517
+ background: var(--light);
3518
+ border-radius: 12px;
3519
+ flex-shrink: 0;
3520
+ }
3521
+
3522
+ .tag-item {
3523
+ padding: 8px 16px;
3524
+ background: white;
3525
+ border: 1px solid var(--border);
3526
+ border-radius: 10px;
3527
+ font-size: 14px;
3528
+ color: var(--gray);
3529
+ cursor: pointer;
3530
+ transition: all 0.2s ease;
3531
+ font-weight: 500;
3532
+ }
3533
+
3534
+ .tag-item:hover {
3535
+ background: var(--primary);
3536
+ color: white;
3537
+ border-color: var(--primary);
3538
+ transform: translateY(-1px);
3539
+ }
3540
+
3541
+ .tag-item.active {
3542
+ background: var(--primary);
3543
+ color: white;
3544
+ border-color: var(--primary);
3545
+ box-shadow: 0 2px 8px rgba(57, 57, 57, 0.2);
3546
+ }
3547
+
3548
+ .tag-tools-list {
3549
+ display: grid;
3550
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
3551
+ gap: 20px;
3552
+ padding-bottom: 20px;
3553
+ }
3554
+
3555
+ /* 作者网格 */
3556
+ .author-grid {
3557
+ display: grid;
3558
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
3559
+ gap: 24px;
3560
+ }
3561
+
3562
+ .author-card {
3563
+ background: white;
3564
+ border: 1px solid var(--border);
3565
+ border-radius: 16px;
3566
+ padding: 28px;
3567
+ text-align: center;
3568
+ cursor: pointer;
3569
+ transition: all 0.3s ease;
3570
+ height: 100%;
3571
+ }
3572
+
3573
+ .author-card:hover {
3574
+ transform: translateY(-4px);
3575
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
3576
+ border-color: var(--primary);
3577
+ }
3578
+
3579
+ .author-avatar {
3580
+ width: 72px;
3581
+ height: 72px;
3582
+ margin: 0 auto 16px;
3583
+ border-radius: 50%;
3584
+ background: linear-gradient(135deg, var(--primary), #6366f1);
3585
+ display: flex;
3586
+ align-items: center;
3587
+ justify-content: center;
3588
+ color: white;
3589
+ font-size: 28px;
3590
+ font-weight: 600;
3591
+ box-shadow: 0 4px 16px rgba(57, 57, 57, 0.2);
3592
+ }
3593
+
3594
+ .author-name {
3595
+ font-size: 18px;
3596
+ font-weight: 600;
3597
+ color: var(--dark);
3598
+ margin-bottom: 6px;
3599
+ }
3600
+
3601
+ .author-role {
3602
+ font-size: 14px;
3603
+ color: var(--gray);
3604
+ margin-bottom: 12px;
3605
+ font-weight: 500;
3606
+ }
3607
+
3608
+ .author-bio {
3609
+ font-size: 13px;
3610
+ color: var(--gray);
3611
+ line-height: 1.5;
3612
+ margin-bottom: 16px;
3613
+ }
3614
+
3615
+ .author-stats {
3616
+ display: flex;
3617
+ justify-content: center;
3618
+ gap: 24px;
3619
+ padding-top: 16px;
3620
+ border-top: 1px solid var(--gray-light);
3621
+ }
3622
+
3623
+ .author-stat {
3624
+ text-align: center;
3625
+ }
3626
+
3627
+ .author-stat-value {
3628
+ font-size: 20px;
3629
+ font-weight: 600;
3630
+ color: var(--dark);
3631
+ }
3632
+
3633
+ .author-stat-label {
3634
+ font-size: 12px;
3635
+ color: var(--gray);
3636
+ margin-top: 2px;
3637
+ }
3638
+
3639
+ /* 上传弹窗样式 */
3640
+ .upload-area {
3641
+ border: 2px dashed var(--border);
3642
+ border-radius: 12px;
3643
+ padding: 40px;
3644
+ text-align: center;
3645
+ transition: all 0.3s ease;
3646
+ margin-bottom: 24px;
3647
+ background: rgba(248, 249, 250, 0.5);
3648
+ }
3649
+
3650
+ .upload-area.dragover {
3651
+ border-color: var(--primary);
3652
+ background: rgba(57, 57, 57, 0.05);
3653
+ transform: scale(1.01);
3654
+ }
3655
+
3656
+ .upload-content {
3657
+ display: flex;
3658
+ flex-direction: column;
3659
+ align-items: center;
3660
+ gap: 20px;
3661
+ }
3662
+
3663
+ .upload-icon {
3664
+ color: var(--gray);
3665
+ opacity: 0.7;
3666
+ }
3667
+
3668
+ .upload-title {
3669
+ font-size: 16px;
3670
+ font-weight: 500;
3671
+ color: var(--dark);
3672
+ margin: 0;
3673
+ }
3674
+
3675
+ .upload-subtitle {
3676
+ font-size: 14px;
3677
+ color: var(--gray);
3678
+ margin: 0;
3679
+ line-height: 1.4;
3680
+ }
3681
+
3682
+ .upload-progress {
3683
+ margin-top: 24px;
3684
+ }
3685
+
3686
+ .progress-bar {
3687
+ width: 100%;
3688
+ height: 10px;
3689
+ background: var(--light);
3690
+ border-radius: 6px;
3691
+ overflow: hidden;
3692
+ margin-bottom: 12px;
3693
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
3694
+ }
3695
+
3696
+ .progress-fill {
3697
+ height: 100%;
3698
+ background: linear-gradient(90deg, var(--primary), #6366f1);
3699
+ width: 0%;
3700
+ transition: width 0.3s ease;
3701
+ border-radius: 6px;
3702
+ }
3703
+
3704
+ .progress-text {
3705
+ font-size: 14px;
3706
+ color: var(--gray);
3707
+ text-align: center;
3708
+ font-weight: 500;
3709
+ }
3710
+
3711
+ .upload-requirements {
3712
+ background: var(--light);
3713
+ padding: 20px;
3714
+ border-radius: 12px;
3715
+ border: 1px solid var(--gray-light);
3716
+ }
3717
+
3718
+ .upload-requirements h4 {
3719
+ font-size: 14px;
3720
+ font-weight: 600;
3721
+ color: var(--dark);
3722
+ margin-bottom: 12px;
3723
+ }
3724
+
3725
+ .upload-requirements ul {
3726
+ list-style: none;
3727
+ padding: 0;
3728
+ margin: 0;
3729
+ }
3730
+
3731
+ .upload-requirements li {
3732
+ font-size: 13px;
3733
+ color: var(--gray);
3734
+ padding: 6px 0;
3735
+ padding-left: 20px;
3736
+ position: relative;
3737
+ line-height: 1.4;
3738
+ }
3739
+
3740
+ .upload-requirements li::before {
3741
+ content: '•';
3742
+ position: absolute;
3743
+ left: 0;
3744
+ color: var(--primary);
3745
+ font-weight: bold;
3746
+ }
3747
+
3748
+ /* 工具详情弹窗样式 - 已迁移到 markdown.css */
3749
+ /* 新样式请查看 css/markdown.css 文件 */
3750
+
3751
+ /* 空状态 */
3752
+ .tools-empty {
3753
+ display: flex;
3754
+ flex-direction: column;
3755
+ align-items: center;
3756
+ justify-content: center;
3757
+ gap: 16px;
3758
+ color: var(--gray);
3759
+ padding: 60px 20px;
3760
+ }
3761
+
3762
+ .tools-empty-icon {
3763
+ font-size: 64px;
3764
+ opacity: 0.5;
3765
+ }
3766
+
3767
+ .tools-empty-text {
3768
+ font-size: 20px;
3769
+ font-weight: 500;
3770
+ color: var(--dark);
3771
+ }
3772
+
3773
+ .tools-empty-hint {
3774
+ font-size: 14px;
3775
+ color: var(--gray);
3776
+ }
3777
+
3778
+ /* 动画效果 */
3779
+ @keyframes fadeIn {
3780
+ from {
3781
+ opacity: 0;
3782
+ transform: translateY(10px);
3783
+ }
3784
+ to {
3785
+ opacity: 1;
3786
+ transform: translateY(0);
3787
+ }
3788
+ }
3789
+
3790
+ /* 响应式设计 */
3791
+ @media (max-width: 768px) {
3792
+ .tools-header {
3793
+ flex-direction: column;
3794
+ gap: 16px;
3795
+ align-items: stretch;
3796
+ }
3797
+
3798
+ .tools-header-left,
3799
+ .tools-header-right {
3800
+ flex-direction: column;
3801
+ gap: 12px;
3802
+ }
3803
+
3804
+ .tools-search {
3805
+ width: 100%;
3806
+ }
3807
+
3808
+ .tools-filter {
3809
+ justify-content: center;
3810
+ }
3811
+
3812
+ .tools-grid {
3813
+ grid-template-columns: 1fr;
3814
+ }
3815
+
3816
+ .category-grid,
3817
+ .tag-tools-list,
3818
+ .author-grid {
3819
+ grid-template-columns: 1fr;
3820
+ }
3821
+ }
3822
+
3823
+ /* 终端样式 */
3824
+ .terminal-area {
3825
+ display: flex;
3826
+ flex-direction: column;
3827
+ flex: 1;
3828
+ background: var(--bg);
3829
+ position: relative;
3830
+ height: 100%;
3831
+ min-width: 0;
3832
+ }
3833
+
3834
+ .terminal-header {
3835
+ display: flex;
3836
+ align-items: center;
3837
+ justify-content: space-between;
3838
+ padding: 12px 20px;
3839
+ border-bottom: 1px solid var(--border);
3840
+ background: #1a1a1a;
3841
+ min-height: 60px;
3842
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
3843
+ }
3844
+
3845
+ .terminal-header-left {
3846
+ display: flex;
3847
+ align-items: center;
3848
+ gap: 12px;
3849
+ }
3850
+
3851
+ .terminal-title {
3852
+ font-size: 18px;
3853
+ font-weight: 500;
3854
+ color: #e0e0e0;
3855
+ margin: 0;
3856
+ }
3857
+
3858
+ .terminal-status {
3859
+ display: flex;
3860
+ align-items: center;
3861
+ gap: 5px;
3862
+ font-size: 11px;
3863
+ color: #9e9e9e;
3864
+ background: rgba(255, 255, 255, 0.05);
3865
+ padding: 4px 12px;
3866
+ border-radius: 16px;
3867
+ margin-right: 4px;
3868
+ }
3869
+
3870
+ .status-indicator {
3871
+ width: 10px;
3872
+ height: 10px;
3873
+ border-radius: 50%;
3874
+ background: #4caf50;
3875
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
3876
+ transition: all 0.3s ease;
3877
+ }
3878
+
3879
+ .status-indicator.connected {
3880
+ background: #4caf50;
3881
+ box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
3882
+ animation: pulse 2s infinite;
3883
+ }
3884
+
3885
+ .status-indicator.disconnected {
3886
+ background: #f44336;
3887
+ box-shadow: 0 0 0 2px rgba(244, 67, 54, 0.2);
3888
+ }
3889
+
3890
+ .status-indicator.reconnecting {
3891
+ background: #ff9800;
3892
+ box-shadow: 0 0 0 2px rgba(255, 152, 0, 0.2);
3893
+ animation: pulse 1s infinite;
3894
+ }
3895
+
3896
+ @keyframes pulse {
3897
+ 0% {
3898
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.4);
3899
+ }
3900
+ 70% {
3901
+ box-shadow: 0 0 0 6px rgba(76, 175, 80, 0);
3902
+ }
3903
+ 100% {
3904
+ box-shadow: 0 0 0 0 rgba(76, 175, 80, 0);
3905
+ }
3906
+ }
3907
+
3908
+ .terminal-header-right {
3909
+ display: flex;
3910
+ gap: 12px;
3911
+ align-items: center;
3912
+ }
3913
+
3914
+ .terminal-header-right .btn {
3915
+ background: rgba(255, 255, 255, 0.08);
3916
+ border: 1px solid rgba(255, 255, 255, 0.1);
3917
+ color: #e0e0e0;
3918
+ padding: 8px 16px;
3919
+ border-radius: 6px;
3920
+ font-size: 13px;
3921
+ transition: all 0.2s ease;
3922
+ }
3923
+
3924
+ .terminal-header-right .btn:hover {
3925
+ background: rgba(255, 255, 255, 0.12);
3926
+ border-color: rgba(255, 255, 255, 0.2);
3927
+ color: #fff;
3928
+ transform: translateY(-1px);
3929
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
3930
+ }
3931
+
3932
+ .terminal-content {
3933
+ flex: 1;
3934
+ display: flex;
3935
+ flex-direction: column;
3936
+ background: var(--bg);
3937
+ min-height: 0;
3938
+ overflow: hidden;
3939
+ }
3940
+
3941
+ .terminal-output {
3942
+ flex: 1;
3943
+ padding: 20px;
3944
+ overflow-y: auto;
3945
+ font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;
3946
+ font-size: 13px;
3947
+ line-height: 1.4;
3948
+ background: #000000;
3949
+ color: #ffffff;
3950
+ }
3951
+
3952
+ .terminal-welcome {
3953
+ text-align: center;
3954
+ padding: 40px 20px;
3955
+ color: #666;
3956
+ }
3957
+
3958
+ .welcome-icon {
3959
+ font-size: 48px;
3960
+ margin-bottom: 16px;
3961
+ }
3962
+
3963
+ .welcome-text {
3964
+ font-size: 18px;
3965
+ font-weight: 600;
3966
+ color: #ffffff;
3967
+ margin-bottom: 8px;
3968
+ }
3969
+
3970
+ .welcome-hint {
3971
+ font-size: 14px;
3972
+ color: #666;
3973
+ }
3974
+
3975
+ .terminal-line {
3976
+ margin-bottom: 4px;
3977
+ white-space: pre-wrap;
3978
+ word-break: break-word;
3979
+ }
3980
+
3981
+ .terminal-line.terminal-error {
3982
+ color: #ff6b6b;
3983
+ }
3984
+
3985
+ .terminal-line.terminal-success {
3986
+ color: #51cf66;
3987
+ }
3988
+
3989
+ .terminal-line.terminal-info {
3990
+ color: #74c0fc;
3991
+ }
3992
+
3993
+ .terminal-input-area {
3994
+ padding: 12px 20px;
3995
+ background: #000000;
3996
+ border-top: 1px solid #333;
3997
+ }
3998
+
3999
+ .terminal-prompt {
4000
+ display: flex;
4001
+ align-items: center;
4002
+ gap: 8px;
4003
+ font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;
4004
+ font-size: 13px;
4005
+ }
4006
+
4007
+ .prompt-symbol {
4008
+ color: #51cf66;
4009
+ font-weight: bold;
4010
+ user-select: none;
4011
+ white-space: nowrap;
4012
+ }
4013
+
4014
+ #terminalInput {
4015
+ flex: 1;
4016
+ background: transparent;
4017
+ border: none;
4018
+ outline: none;
4019
+ color: #ffffff;
4020
+ font-family: inherit;
4021
+ font-size: 13px;
4022
+ padding: 8px 0;
4023
+ min-width: 0;
4024
+ }
4025
+
4026
+ #terminalInput::placeholder {
4027
+ color: #666;
4028
+ }
4029
+
4030
+ #terminalInput:focus {
4031
+ outline: none;
4032
+ }
4033
+
4034
+ /* 响应式设计 */
4035
+ @media (max-width: 768px) {
4036
+ .terminal-header {
4037
+ padding: 12px 16px;
4038
+ }
4039
+
4040
+ .terminal-title {
4041
+ font-size: 18px;
4042
+ }
4043
+
4044
+ .terminal-output {
4045
+ padding: 16px;
4046
+ font-size: 12px;
4047
+ }
4048
+
4049
+ .terminal-input-area {
4050
+ padding: 8px 16px;
4051
+ }
4052
+
4053
+ .terminal-welcome {
4054
+ padding: 20px 10px;
4055
+ }
4056
+
4057
+ .welcome-icon {
4058
+ font-size: 32px;
4059
+ }
4060
+ }
4061
+
4062
+ /* XTerm.js 终端组件样式 */
4063
+ .xterm-container {
4064
+ width: 100%;
4065
+ height: 100%;
4066
+ position: relative;
4067
+ background: #000000;
4068
+ /* border-radius: 6px; */
4069
+ overflow: hidden;
4070
+ }
4071
+
4072
+ .terminal-toolbar {
4073
+ display: flex;
4074
+ justify-content: space-between;
4075
+ align-items: center;
4076
+ padding: 8px 16px;
4077
+ background: rgba(255, 255, 255, 0.05);
4078
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
4079
+ backdrop-filter: blur(10px);
4080
+ -webkit-backdrop-filter: blur(10px);
4081
+ }
4082
+
4083
+ .terminal-status {
4084
+ display: flex;
4085
+ align-items: center;
4086
+ gap: 5px;
4087
+ font-size: 11px;
4088
+ color: #ccc;
4089
+ }
4090
+
4091
+ .status-indicator {
4092
+ width: 8px;
4093
+ height: 8px;
4094
+ border-radius: 50%;
4095
+ background: #666;
4096
+ transition: background-color 0.3s ease;
4097
+ }
4098
+
4099
+ .status-indicator.connected {
4100
+ background: #0dbc79;
4101
+ box-shadow: 0 0 8px rgba(13, 188, 121, 0.5);
4102
+ }
4103
+
4104
+ .status-indicator.disconnected {
4105
+ background: #cd3131;
4106
+ box-shadow: 0 0 8px rgba(205, 49, 49, 0.5);
4107
+ }
4108
+
4109
+ .status-indicator.reconnecting {
4110
+ background: #e5e510;
4111
+ box-shadow: 0 0 8px rgba(229, 229, 16, 0.5);
4112
+ animation: pulse 1s infinite;
4113
+ }
4114
+
4115
+ @keyframes pulse {
4116
+ 0%, 100% { opacity: 1; }
4117
+ 50% { opacity: 0.5; }
4118
+ }
4119
+
4120
+ .terminal-actions {
4121
+ display: flex;
4122
+ gap: 4px;
4123
+ }
4124
+
4125
+ .terminal-actions .btn {
4126
+ width: 26px;
4127
+ height: 26px;
4128
+ font-size: 12px;
4129
+ background: rgba(255, 255, 255, 0.05);
4130
+ border: 1px solid rgba(255, 255, 255, 0.1);
4131
+ color: #b0b0b0;
4132
+ border-radius: 6px;
4133
+ cursor: pointer;
4134
+ display: inline-flex;
4135
+ align-items: center;
4136
+ justify-content: center;
4137
+ transition: all 0.2s ease;
4138
+ margin: 0 2px;
4139
+ }
4140
+
4141
+ .terminal-actions .btn:hover {
4142
+ background: rgba(255, 255, 255, 0.1);
4143
+ border-color: rgba(255, 255, 255, 0.2);
4144
+ color: #fff;
4145
+ transform: scale(1.05);
4146
+ }
4147
+
4148
+ .terminal-actions .btn:active {
4149
+ transform: scale(0.95);
4150
+ }
4151
+
4152
+ /* XTerm.js 样式覆盖 */
4153
+ .xterm {
4154
+ padding: 12px;
4155
+ font-feature-settings: "liga" 0;
4156
+ position: relative;
4157
+ user-select: none;
4158
+ -ms-user-select: none;
4159
+ -webkit-user-select: none;
4160
+ font-family: "SF Mono", Monaco, "Cascadia Code", "Fira Code", "JetBrains Mono", "Consolas", "Courier New", monospace;
4161
+ line-height: 1.2;
4162
+ letter-spacing: 0.01em;
4163
+ -webkit-font-smoothing: antialiased;
4164
+ -moz-osx-font-smoothing: grayscale;
4165
+ text-rendering: optimizeLegibility;
4166
+ }
4167
+
4168
+ .xterm:focus {
4169
+ outline: none;
4170
+ }
4171
+
4172
+ .xterm .xterm-viewport {
4173
+ background-color: transparent;
4174
+ overflow-y: scroll;
4175
+ cursor: default;
4176
+ position: absolute;
4177
+ right: 0;
4178
+ left: 0;
4179
+ top: 0;
4180
+ bottom: 0;
4181
+ }
4182
+
4183
+ .xterm .xterm-screen {
4184
+ position: relative;
4185
+ }
4186
+
4187
+ /* 隐藏 xterm 的 textarea 输入元素 */
4188
+ .xterm textarea {
4189
+ position: absolute !important;
4190
+ opacity: 0 !important;
4191
+ width: 1px !important;
4192
+ height: 1px !important;
4193
+ left: -9999px !important;
4194
+ top: -9999px !important;
4195
+ border: none !important;
4196
+ outline: none !important;
4197
+ resize: none !important;
4198
+ overflow: hidden !important;
4199
+ pointer-events: none !important;
4200
+ -webkit-appearance: none !important;
4201
+ appearance: none !important;
4202
+ }
4203
+
4204
+ .xterm .xterm-screen canvas {
4205
+ position: absolute;
4206
+ left: 0;
4207
+ top: 0;
4208
+ }
4209
+
4210
+ .xterm .xterm-scroll-area {
4211
+ visibility: hidden;
4212
+ }
4213
+
4214
+ .xterm-char-measure-element {
4215
+ display: inline-block;
4216
+ visibility: hidden;
4217
+ position: absolute;
4218
+ top: 0;
4219
+ left: -9999em;
4220
+ line-height: normal;
4221
+ }
4222
+
4223
+ .xterm.enable-mouse-events {
4224
+ cursor: default;
4225
+ }
4226
+
4227
+ .xterm.xterm-cursor-pointer {
4228
+ cursor: pointer;
4229
+ }
4230
+
4231
+ .xterm.column-select.focus {
4232
+ cursor: crosshair;
4233
+ }
4234
+
4235
+ .xterm .xterm-accessibility,
4236
+ .xterm .xterm-message {
4237
+ position: absolute;
4238
+ left: 0;
4239
+ top: 0;
4240
+ bottom: 0;
4241
+ right: 0;
4242
+ z-index: 10;
4243
+ color: transparent;
4244
+ }
4245
+
4246
+ .xterm .live-region {
4247
+ position: absolute;
4248
+ left: -9999px;
4249
+ width: 1px;
4250
+ height: 1px;
4251
+ overflow: hidden;
4252
+ }
4253
+
4254
+ .xterm-dim {
4255
+ opacity: 0.5;
4256
+ }
4257
+
4258
+ .xterm-underline {
4259
+ text-decoration: underline;
4260
+ }
4261
+
4262
+ .xterm-strikethrough {
4263
+ text-decoration: line-through;
4264
+ }
4265
+
4266
+ .xterm-screen .xterm-decoration-container .xterm-decoration.top {
4267
+ z-index: 2;
4268
+ position: relative;
4269
+ }
4270
+
4271
+ .xterm-decoration-overview-ruler {
4272
+ z-index: 6;
4273
+ position: absolute;
4274
+ top: 0;
4275
+ right: 0;
4276
+ pointer-events: none;
4277
+ }
4278
+
4279
+ .xterm-decoration-top {
4280
+ z-index: 2;
4281
+ position: relative;
4282
+ }
4283
+
4284
+ /* 搜索框样式 */
4285
+ .xterm-search {
4286
+ position: absolute;
4287
+ top: 10px;
4288
+ right: 10px;
4289
+ background: rgba(30, 30, 30, 0.95);
4290
+ border: 1px solid rgba(255, 255, 255, 0.2);
4291
+ border-radius: 4px;
4292
+ padding: 8px;
4293
+ display: none;
4294
+ z-index: 1000;
4295
+ backdrop-filter: blur(10px);
4296
+ -webkit-backdrop-filter: blur(10px);
4297
+ }
4298
+
4299
+ .xterm-search.show {
4300
+ display: block;
4301
+ }
4302
+
4303
+ .xterm-search input {
4304
+ background: transparent;
4305
+ border: none;
4306
+ color: #d4d4d4;
4307
+ outline: none;
4308
+ font-size: 12px;
4309
+ width: 200px;
4310
+ }
4311
+
4312
+ .xterm-search .btn {
4313
+ background: rgba(255, 255, 255, 0.1);
4314
+ border: 1px solid rgba(255, 255, 255, 0.2);
4315
+ border-radius: 3px;
4316
+ color: #ccc;
4317
+ font-size: 11px;
4318
+ padding: 4px 8px;
4319
+ margin-left: 4px;
4320
+ cursor: pointer;
4321
+ }
4322
+
4323
+ .xterm-search .btn:hover {
4324
+ background: rgba(255, 255, 255, 0.2);
4325
+ color: #fff;
4326
+ }
4327
+
4328
+ /* 主题切换动画 */
4329
+ .terminal-focused {
4330
+ box-shadow: 0 0 0 2px rgba(36, 114, 200, 0.3);
4331
+ }
4332
+
4333
+ /* xterm容器样式 */
4334
+ .xterm-container {
4335
+ flex: 1;
4336
+ height: 100%;
4337
+ background: #1e1e1e;
4338
+ position: relative;
4339
+ }
4340
+
4341
+ .xterm-container .xterm {
4342
+ height: 100% !important;
4343
+ width: 100% !important;
4344
+ }
4345
+
4346
+ .xterm-container .terminal-toolbar {
4347
+ position: absolute;
4348
+ top: 16px;
4349
+ right: 16px;
4350
+ z-index: 100;
4351
+ background: rgb(30 30 30 / 58%);
4352
+ backdrop-filter: blur(10px);
4353
+ padding: 8px 12px;
4354
+ border-radius: 8px;
4355
+ border: 1px solid rgba(255, 255, 255, 0.1);
4356
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
4357
+ }
4358
+
4359
+ /* 响应式设计 */
4360
+ @media (max-width: 768px) {
4361
+ .terminal-toolbar {
4362
+ padding: 6px 12px;
4363
+ }
4364
+
4365
+ .terminal-status {
4366
+ font-size: 11px;
4367
+ }
4368
+
4369
+ .terminal-actions .btn {
4370
+ width: 24px;
4371
+ height: 24px;
4372
+ font-size: 10px;
4373
+ }
4374
+
4375
+ .xterm {
4376
+ padding: 6px;
4377
+ }
4378
+ }
4379
+
4380
+ /* 图标样式(使用Unicode字符代替图标字体) */
4381
+ .icon-back::before { content: "←"; }
4382
+ .icon-refresh::before { content: "↻"; }
4383
+ .icon-clear::before { content: "✕"; }
4384
+ .icon-search::before { content: "🔍"; }
4385
+ .icon-theme::before { content: "🌙"; }
4386
+
4387
+ /* 终端加载状态样式 */
4388
+ .terminal-loading {
4389
+ display: flex;
4390
+ flex-direction: column;
4391
+ align-items: center;
4392
+ justify-content: center;
4393
+ position: absolute;
4394
+ top: 0;
4395
+ left: 0;
4396
+ right: 0;
4397
+ bottom: 0;
4398
+ background: linear-gradient(135deg, #1e1e1e 0%, #2d2d2d 100%);
4399
+ color: #e0e0e0;
4400
+ font-family: 'SF Mono', 'JetBrains Mono', 'Cascadia Code', 'Fira Code', Monaco, 'Menlo', 'Consolas', 'Courier New', monospace;
4401
+ z-index: 10;
4402
+ }
4403
+
4404
+ .terminal-loading .loading-spinner {
4405
+ width: 48px;
4406
+ height: 48px;
4407
+ border: 3px solid rgba(255, 255, 255, 0.1);
4408
+ border-top: 3px solid #4a9eff;
4409
+ border-radius: 50%;
4410
+ animation: spin 0.8s linear infinite;
4411
+ margin-bottom: 20px;
4412
+ box-shadow: 0 0 20px rgba(74, 158, 255, 0.3);
4413
+ }
4414
+
4415
+ @keyframes spin {
4416
+ 0% { transform: rotate(0deg); }
4417
+ 100% { transform: rotate(360deg); }
4418
+ }
4419
+
4420
+ .terminal-loading p {
4421
+ margin: 0;
4422
+ font-size: 15px;
4423
+ font-weight: 500;
4424
+ opacity: 0.9;
4425
+ letter-spacing: 0.5px;
4426
+ }
4427
+
4428
+ /* 为全局loading-spinner添加特定样式,避免冲突 */
4429
+ .loading-overlay .loading-spinner {
4430
+ width: 50px;
4431
+ height: 50px;
4432
+ border: 4px solid rgba(57, 57, 57, 0.08);
4433
+ border-top: 4px solid rgba(57, 57, 57, 0.4);
4434
+ border-radius: 50%;
4435
+ animation: spin 1s linear infinite;
4436
+ margin-bottom: 20px;
4437
+ box-shadow: none;
4438
+ }
4439
+
4440
+ /* 终端错误状态样式 */
4441
+ .terminal-error {
4442
+ padding: 20px;
4443
+ background: #2d1b1b;
4444
+ color: #ff6b6b;
4445
+ border-radius: 4px;
4446
+ font-family: 'Consolas', 'Courier New', monospace;
4447
+ margin: 10px;
4448
+ }
4449
+
4450
+ .terminal-error h3 {
4451
+ margin: 0 0 10px 0;
4452
+ color: #ff8787;
4453
+ }
4454
+
4455
+ .terminal-error p {
4456
+ margin: 5px 0;
4457
+ font-size: 13px;
4458
+ }
4459
+
4460
+ .terminal-error ul {
4461
+ margin: 10px 0;
4462
+ padding-left: 20px;
4463
+ }
4464
+
4465
+ .terminal-error li {
4466
+ margin: 3px 0;
4467
+ font-size: 12px;
4468
+ opacity: 0.9;
4469
+ }
4470
+
4471
+ .terminal-error button {
4472
+ margin-top: 15px;
4473
+ padding: 8px 16px;
4474
+ background: #ff6b6b;
4475
+ color: white;
4476
+ border: none;
4477
+ border-radius: 4px;
4478
+ cursor: pointer;
4479
+ font-size: 13px;
4480
+ transition: background-color 0.2s;
4481
+ }
4482
+
4483
+ .terminal-error button:hover {
4484
+ background: #ff5252;
4485
+ }