@becrafter/prompt-manager 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/env.example +1 -1
  2. package/package.json +2 -2
  3. package/packages/server/app.js +13 -3
  4. package/packages/server/utils/config.js +1 -1
  5. package/packages/server/utils/util.js +7 -7
  6. package/packages/admin-ui/admin.html +0 -49
  7. package/packages/admin-ui/css/codemirror-theme_xq-light.css +0 -43
  8. package/packages/admin-ui/css/codemirror.css +0 -344
  9. package/packages/admin-ui/css/main.css +0 -4485
  10. package/packages/admin-ui/css/markdown.css +0 -468
  11. package/packages/admin-ui/css/optimization.css +0 -1015
  12. package/packages/admin-ui/css/recommended-prompts.css +0 -610
  13. package/packages/admin-ui/css/terminal-fix.css +0 -571
  14. package/packages/admin-ui/package-lock.json +0 -8287
  15. package/packages/admin-ui/package.json +0 -46
  16. package/packages/admin-ui/src/codemirror.js +0 -53
  17. package/packages/admin-ui/src/components/ArgumentModal.js +0 -53
  18. package/packages/admin-ui/src/components/DeletePromptModal.js +0 -30
  19. package/packages/admin-ui/src/components/HeaderView.js +0 -40
  20. package/packages/admin-ui/src/components/LoadingOverlay.js +0 -12
  21. package/packages/admin-ui/src/components/LoginView.js +0 -22
  22. package/packages/admin-ui/src/components/ModelConfigModal.js +0 -103
  23. package/packages/admin-ui/src/components/NewFolderModal.js +0 -58
  24. package/packages/admin-ui/src/components/OptimizationConfigModal.js +0 -36
  25. package/packages/admin-ui/src/components/OptimizationDrawer.js +0 -135
  26. package/packages/admin-ui/src/components/PrimaryNav.js +0 -34
  27. package/packages/admin-ui/src/components/PromptsArea.js +0 -140
  28. package/packages/admin-ui/src/components/RecommendedPromptModal.js +0 -37
  29. package/packages/admin-ui/src/components/SidebarView.js +0 -24
  30. package/packages/admin-ui/src/components/SyncPromptModal.js +0 -44
  31. package/packages/admin-ui/src/components/TemplateEditorModal.js +0 -75
  32. package/packages/admin-ui/src/components/TemplateListModal.js +0 -30
  33. package/packages/admin-ui/src/components/TerminalComponent.js +0 -995
  34. package/packages/admin-ui/src/components/TerminalView.js +0 -25
  35. package/packages/admin-ui/src/components/ToolDetailModal.js +0 -23
  36. package/packages/admin-ui/src/components/ToolsArea.js +0 -119
  37. package/packages/admin-ui/src/components/ToolsUploadModal.js +0 -59
  38. package/packages/admin-ui/src/index.js +0 -6766
@@ -1,4485 +0,0 @@
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
- }