evolclaw-web 1.2.0 → 1.2.3

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.
@@ -318,16 +318,215 @@ tr:hover td { background: var(--bg2); }
318
318
  .usage-subtabs { flex-shrink: 0; padding: 12px 16px 0; }
319
319
  .usage-subpanel { display: none; flex: 1; overflow: hidden; }
320
320
  .usage-subpanel.active { display: flex; flex-direction: column; }
321
- #usage-dashboard { overflow-y: auto; padding: 16px; }
322
321
  #usage-overview { overflow-y: auto; padding: 16px; }
322
+ .overview-filters {
323
+ margin-bottom: 16px;
324
+ padding: 12px;
325
+ background: var(--bg2);
326
+ border: 1px solid var(--border);
327
+ border-radius: 8px;
328
+ }
329
+ .ov-range-tabs {
330
+ display: flex;
331
+ gap: 8px;
332
+ flex-wrap: wrap;
333
+ }
334
+ .ov-range-btn {
335
+ padding: 6px 14px;
336
+ font-size: 12px;
337
+ border: 1px solid var(--border);
338
+ background: var(--bg3);
339
+ color: var(--fg);
340
+ border-radius: 5px;
341
+ cursor: pointer;
342
+ transition: all 0.2s;
343
+ }
344
+ .ov-range-btn:hover {
345
+ border-color: var(--accent);
346
+ color: var(--accent);
347
+ }
348
+ .ov-range-btn.active {
349
+ background: var(--accent);
350
+ color: white;
351
+ border-color: var(--accent);
352
+ }
353
+ .ov-custom-date {
354
+ display: none;
355
+ margin-top: 12px;
356
+ gap: 10px;
357
+ align-items: center;
358
+ }
359
+ .ov-custom-date label {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: 6px;
363
+ font-size: 12px;
364
+ color: var(--dim);
365
+ }
366
+ .ov-custom-date input[type="date"] {
367
+ padding: 4px 8px;
368
+ font-size: 12px;
369
+ border: 1px solid var(--border);
370
+ border-radius: 4px;
371
+ background: var(--bg3);
372
+ color: var(--fg);
373
+ }
374
+ .ov-custom-date button {
375
+ padding: 5px 16px;
376
+ font-size: 12px;
377
+ border: 1px solid var(--accent);
378
+ background: var(--accent);
379
+ color: white;
380
+ border-radius: 4px;
381
+ cursor: pointer;
382
+ }
383
+ .ov-custom-date button:hover {
384
+ opacity: 0.9;
385
+ }
386
+ .detail-filters {
387
+ display: flex;
388
+ gap: 12px;
389
+ align-items: center;
390
+ flex-wrap: wrap;
391
+ margin-bottom: 12px;
392
+ }
393
+ .detail-filters label {
394
+ display: flex;
395
+ align-items: center;
396
+ gap: 6px;
397
+ font-size: 12px;
398
+ color: var(--dim);
399
+ }
400
+ .detail-filters select,
401
+ .detail-filters input[type="date"] {
402
+ padding: 4px 8px;
403
+ font-size: 12px;
404
+ border: 1px solid var(--border);
405
+ border-radius: 4px;
406
+ background: var(--bg3);
407
+ color: var(--fg);
408
+ min-width: 120px;
409
+ }
410
+ .detail-filters button {
411
+ padding: 5px 16px;
412
+ font-size: 12px;
413
+ border: 1px solid var(--accent);
414
+ background: var(--accent);
415
+ color: white;
416
+ border-radius: 4px;
417
+ cursor: pointer;
418
+ }
419
+ .detail-filters button:hover {
420
+ opacity: 0.9;
421
+ }
422
+ .detail-pagination {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 8px;
426
+ margin-top: 12px;
427
+ padding: 8px 0;
428
+ }
429
+ .detail-pagination button {
430
+ padding: 4px 12px;
431
+ font-size: 12px;
432
+ border: 1px solid var(--border);
433
+ background: var(--bg3);
434
+ color: var(--fg);
435
+ border-radius: 4px;
436
+ cursor: pointer;
437
+ }
438
+ .detail-pagination button:hover:not(:disabled) {
439
+ border-color: var(--accent);
440
+ color: var(--accent);
441
+ }
442
+ .detail-pagination button:disabled {
443
+ opacity: 0.4;
444
+ cursor: not-allowed;
445
+ }
446
+ .detail-pagination input[type="number"] {
447
+ padding: 4px 8px;
448
+ font-size: 12px;
449
+ border: 1px solid var(--border);
450
+ border-radius: 4px;
451
+ background: var(--bg3);
452
+ color: var(--fg);
453
+ }
323
454
  .usage-cards {
324
- display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
325
- gap: 12px; margin-bottom: 20px;
455
+ display: flex;
456
+ flex-wrap: wrap;
457
+ gap: 16px;
458
+ margin-bottom: 20px;
326
459
  }
327
460
  .usage-card {
328
461
  background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
329
462
  padding: 16px; text-align: center;
330
463
  box-shadow: 0 1px 3px rgba(0,0,0,0.06);
464
+ flex: 1 1 140px;
465
+ min-width: 140px;
466
+ }
467
+ /* 多值卡片样式 */
468
+ .usage-card.multi-value-card {
469
+ flex: 1 1 280px;
470
+ min-width: 280px;
471
+ text-align: left;
472
+ }
473
+ .usage-card .card-title {
474
+ font-size: 13px;
475
+ font-weight: 600;
476
+ color: var(--fg);
477
+ margin-bottom: 12px;
478
+ padding-bottom: 8px;
479
+ border-bottom: 1px solid var(--border);
480
+ }
481
+ .usage-card .card-items {
482
+ display: grid;
483
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
484
+ gap: 10px;
485
+ }
486
+ .usage-card .card-item {
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 4px;
490
+ }
491
+ .usage-card .card-item-label {
492
+ font-size: 10px;
493
+ color: var(--dim);
494
+ text-transform: uppercase;
495
+ letter-spacing: 0.5px;
496
+ }
497
+ .usage-card .card-item-value {
498
+ font-size: 16px;
499
+ font-weight: 700;
500
+ color: var(--accent);
501
+ font-variant-numeric: tabular-nums;
502
+ }
503
+ /* 会话组卡片 - 蓝色调 */
504
+ .usage-card.session-group {
505
+ border-left: 3px solid #4f6ef7;
506
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(79, 110, 247, 0.03) 100%);
507
+ }
508
+ .usage-card.session-group .card-value,
509
+ .usage-card.session-group .card-item-value {
510
+ color: #4f6ef7;
511
+ }
512
+ /* 用量组卡片 - 绿色调 */
513
+ .usage-card.usage-group {
514
+ border-left: 3px solid #38a169;
515
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(56, 161, 105, 0.03) 100%);
516
+ }
517
+ .usage-card.usage-group .card-value,
518
+ .usage-card.usage-group .card-item-value {
519
+ color: #38a169;
520
+ }
521
+ /* 花费组卡片 - 橙色调 */
522
+ .usage-card.cost-group {
523
+ border-left: 3px solid #dd6b20;
524
+ background: linear-gradient(135deg, var(--bg2) 0%, rgba(221, 107, 32, 0.03) 100%);
525
+ flex: 1 1 210px;
526
+ }
527
+ .usage-card.cost-group .card-value,
528
+ .usage-card.cost-group .card-item-value {
529
+ color: #dd6b20;
331
530
  }
332
531
  .usage-card .card-value {
333
532
  font-size: 22px; font-weight: 700; color: var(--accent);
@@ -481,6 +680,7 @@ tr.ag-disabled .ag-name { color: var(--dim); }
481
680
 
482
681
  /* 队列数列 */
483
682
  .ag-queue-num { color: var(--orange); font-weight: 600; font-variant-numeric: tabular-nums; }
683
+ .ag-queue-empty { color: var(--dim); }
484
684
 
485
685
  /* 子标签栏 */
486
686
  .ag-subtabs { display: inline-flex; gap: 2px; }
@@ -510,16 +710,20 @@ tr.ag-disabled .ag-name { color: var(--dim); }
510
710
  .ag-msg .text-in { color: var(--msg-in); font-weight: 500; }
511
711
  .ag-msg .text-out { color: var(--msg-out); font-weight: 500; }
512
712
  .ag-msg .mtag { display: inline-block; padding: 0 4px; margin: 0 2px; border-radius: 3px; font-size: 10px; background: var(--bg3); color: var(--magenta); vertical-align: middle; }
713
+ .ag-msg .mtag-reply { color: var(--green); font-weight: 700; }
513
714
  .ag-msg .mtags { color: var(--magenta); font-size: 10.5px; }
514
715
  .ag-path { font-family: ui-monospace, Consolas, monospace; font-size: 10.5px; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 70vw; }
515
716
 
516
- /* 消息 tooltip(hover 浮层)*/
517
- .msg-tip { display: none; position: absolute; bottom: calc(100% + 4px); left: 0; z-index: 200; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 8px 12px; min-width: 300px; max-width: 600px; white-space: normal; }
518
- .ag-msg-wrap:hover .msg-tip { display: block; }
519
- .tip-row { font-size: 12px; line-height: 1.8; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: 500; }
717
+ /* 消息 tooltip(JS 定位的单例浮层)*/
718
+ .msg-tip-src { display: none; }
719
+ .msg-tip { display: none; position: fixed; top: 0; left: 0; z-index: 200; background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,.2); padding: 8px 12px; min-width: 300px; max-width: 600px; white-space: normal; }
720
+ .msg-tip.show { display: block; }
721
+ .tip-row { font-size: 12px; line-height: 1.6; font-weight: 500; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-word; }
520
722
  .tip-row-in { color: var(--msg-in); }
521
723
  .tip-row-out { color: var(--msg-out); }
724
+ .tip-time { margin-right: 4px; color: var(--dim); font-size: 10.5px; font-variant-numeric: tabular-nums; }
522
725
  .tip-kind { margin: 0 2px; font-weight: 600; }
726
+ .tip-kind-reply { color: var(--green); font-weight: 700; }
523
727
  .tip-flag { margin: 0 2px; padding: 0 4px; border-radius: 3px; background: var(--bg3); color: var(--magenta); font-size: 10.5px; }
524
728
  .tip-row b { color: var(--orange); font-weight: 600; }
525
729
 
@@ -580,25 +784,143 @@ tr.ag-disabled .ag-name { color: var(--dim); }
580
784
  background: var(--accent); color: #fff; border-color: var(--accent);
581
785
  }
582
786
 
583
- /* ── Explorer filters ── */
787
+ /* ── Explorer time filters (类似总览的时间选择) ── */
788
+ .exp-time-filters {
789
+ margin-bottom: 16px;
790
+ padding: 12px;
791
+ background: var(--bg3);
792
+ border-radius: 8px;
793
+ border: 1px solid var(--border);
794
+ }
795
+
796
+ .exp-range-tabs {
797
+ display: flex;
798
+ gap: 8px;
799
+ flex-wrap: wrap;
800
+ margin-bottom: 8px;
801
+ }
802
+
803
+ .exp-range-btn {
804
+ padding: 6px 12px;
805
+ font-size: 12px;
806
+ border: 1px solid var(--border);
807
+ background: var(--bg2);
808
+ color: var(--fg);
809
+ border-radius: 6px;
810
+ cursor: pointer;
811
+ transition: all 0.2s;
812
+ }
813
+
814
+ .exp-range-btn:hover {
815
+ background: var(--bg3);
816
+ border-color: var(--accent);
817
+ }
818
+
819
+ .exp-range-btn.active {
820
+ background: var(--accent);
821
+ color: white;
822
+ border-color: var(--accent);
823
+ }
824
+
825
+ .exp-custom-date {
826
+ display: flex;
827
+ gap: 12px;
828
+ align-items: flex-end;
829
+ flex-wrap: wrap;
830
+ padding-top: 8px;
831
+ border-top: 1px solid var(--border);
832
+ }
833
+
834
+ .exp-custom-date label {
835
+ display: flex;
836
+ flex-direction: column;
837
+ gap: 4px;
838
+ font-size: 12px;
839
+ color: var(--dim);
840
+ }
841
+
842
+ .exp-custom-date input {
843
+ padding: 6px 10px;
844
+ font-size: 12px;
845
+ border: 1px solid var(--border);
846
+ border-radius: 4px;
847
+ background: var(--bg2);
848
+ color: var(--fg);
849
+ min-width: 200px;
850
+ }
851
+
852
+ .exp-custom-date button {
853
+ padding: 6px 16px;
854
+ background: var(--accent);
855
+ color: white;
856
+ border: none;
857
+ border-radius: 6px;
858
+ cursor: pointer;
859
+ font-size: 12px;
860
+ font-weight: 500;
861
+ }
862
+
863
+ .exp-custom-date button:hover {
864
+ opacity: 0.9;
865
+ }
866
+
867
+ /* ── Explorer filters (优化后的样式) ── */
584
868
  .explorer-filters {
585
- display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
586
- margin-bottom: 16px; padding: 12px; background: var(--bg3);
587
- border-radius: 8px; border: 1px solid var(--border);
869
+ display: flex;
870
+ gap: 12px;
871
+ align-items: flex-end;
872
+ flex-wrap: wrap;
873
+ margin-bottom: 16px;
874
+ padding: 12px;
875
+ background: var(--bg3);
876
+ border-radius: 8px;
877
+ border: 1px solid var(--border);
588
878
  }
879
+
589
880
  .explorer-filters label {
590
- font-size: 11px; color: var(--dim); display: flex; flex-direction: column; gap: 2px;
881
+ display: flex;
882
+ flex-direction: column;
883
+ gap: 4px;
884
+ font-size: 12px;
885
+ color: var(--dim);
886
+ min-width: 160px;
591
887
  }
592
- .explorer-filters input, .explorer-filters select {
593
- padding: 4px 8px; font-size: 12px; border: 1px solid var(--border);
594
- border-radius: 4px; background: var(--bg2); color: var(--fg);
888
+
889
+ .explorer-filters label span {
890
+ font-weight: 500;
595
891
  }
892
+
893
+ .explorer-filters input,
894
+ .explorer-filters select {
895
+ padding: 6px 10px;
896
+ font-size: 13px;
897
+ border: 1px solid var(--border);
898
+ border-radius: 4px;
899
+ background: var(--bg2);
900
+ color: var(--fg);
901
+ width: 100%;
902
+ }
903
+
904
+ .explorer-filters select {
905
+ cursor: pointer;
906
+ }
907
+
596
908
  .explorer-filters button {
597
- padding: 6px 16px; background: var(--accent); color: #fff; border: none;
598
- border-radius: 6px; cursor: pointer; font-size: 12px; font-weight: 500;
599
- align-self: flex-end;
909
+ padding: 7px 20px;
910
+ background: var(--accent);
911
+ color: white;
912
+ border: none;
913
+ border-radius: 6px;
914
+ cursor: pointer;
915
+ font-size: 13px;
916
+ font-weight: 500;
917
+ transition: all 0.2s;
918
+ }
919
+
920
+ .explorer-filters button:hover {
921
+ opacity: 0.9;
922
+ transform: translateY(-1px);
600
923
  }
601
- .explorer-filters button:hover { opacity: 0.9; }
602
924
 
603
925
  /* ── Explorer layout (左侧列表 + 右侧详情) ── */
604
926
  .exp-layout { display: flex; flex: 1; overflow: hidden; }
@@ -625,6 +947,48 @@ tr.ag-disabled .ag-name { color: var(--dim); }
625
947
  font-size: 10px; color: var(--dim); margin-left: 6px; flex-shrink: 0;
626
948
  }
627
949
  .exp-sidebar-item.active .item-meta { color: rgba(255,255,255,0.7); }
950
+ .peer-tag {
951
+ display: inline-block;
952
+ padding: 2px 6px;
953
+ margin-right: 6px;
954
+ font-size: 10px;
955
+ border-radius: 4px;
956
+ font-weight: 600;
957
+ line-height: 1.2;
958
+ vertical-align: middle;
959
+ }
960
+ .peer-tag-group {
961
+ background: #e3f2fd;
962
+ color: #1976d2;
963
+ border: 1px solid #bbdefb;
964
+ }
965
+ .peer-tag-private {
966
+ background: #f3e5f5;
967
+ color: #7b1fa2;
968
+ border: 1px solid #e1bee7;
969
+ }
970
+ .peer-tag-count {
971
+ background: var(--bg3);
972
+ color: var(--dim);
973
+ margin-left: 6px;
974
+ margin-right: 0;
975
+ border: 1px solid var(--border);
976
+ }
977
+ .exp-sidebar-item.active .peer-tag-group {
978
+ background: rgba(227, 242, 253, 0.3);
979
+ color: #90caf9;
980
+ border-color: rgba(255,255,255,0.3);
981
+ }
982
+ .exp-sidebar-item.active .peer-tag-private {
983
+ background: rgba(243, 229, 245, 0.3);
984
+ color: #ce93d8;
985
+ border-color: rgba(255,255,255,0.3);
986
+ }
987
+ .exp-sidebar-item.active .peer-tag-count {
988
+ background: rgba(255,255,255,0.2);
989
+ color: rgba(255,255,255,0.8);
990
+ border-color: rgba(255,255,255,0.2);
991
+ }
628
992
  .exp-detail { flex: 1; padding: 16px; overflow-y: auto; }
629
993
  .exp-detail-header {
630
994
  font-size: 14px; font-weight: 600; margin-bottom: 12px; color: var(--fg);
@@ -667,3 +1031,465 @@ tr.ag-disabled .ag-name { color: var(--dim); }
667
1031
  .mon-toolbar { flex-wrap: wrap; }
668
1032
  }
669
1033
 
1034
+
1035
+ /* ── Gateway 视图 ── */
1036
+ .gw-wrap { padding: 12px 16px; }
1037
+
1038
+ /* 环境变量配置不一致横幅 */
1039
+ .gw-env-mismatch-banner {
1040
+ display: flex;
1041
+ flex-direction: column;
1042
+ gap: 12px;
1043
+ padding: 16px;
1044
+ margin-bottom: 16px;
1045
+ background: linear-gradient(135deg, #fee 0%, #fdd 100%);
1046
+ border: 2px solid #f88;
1047
+ border-radius: 8px;
1048
+ box-shadow: 0 2px 8px rgba(255, 100, 100, 0.15);
1049
+ }
1050
+ [data-theme="dark"] .gw-env-mismatch-banner {
1051
+ background: linear-gradient(135deg, #3a1a1a 0%, #4a1a1a 100%);
1052
+ border-color: #c44;
1053
+ }
1054
+ .gw-env-mismatch-header {
1055
+ display: flex;
1056
+ align-items: flex-start;
1057
+ gap: 12px;
1058
+ }
1059
+ .gw-env-mismatch-icon {
1060
+ font-size: 28px;
1061
+ flex-shrink: 0;
1062
+ }
1063
+ .gw-env-mismatch-content {
1064
+ flex: 1;
1065
+ display: flex;
1066
+ flex-direction: column;
1067
+ gap: 8px;
1068
+ }
1069
+ .gw-env-mismatch-title {
1070
+ font-size: 15px;
1071
+ font-weight: 700;
1072
+ color: #c00;
1073
+ }
1074
+ [data-theme="dark"] .gw-env-mismatch-title {
1075
+ color: #f88;
1076
+ }
1077
+ .gw-env-mismatch-desc {
1078
+ font-size: 13px;
1079
+ color: #800;
1080
+ line-height: 1.5;
1081
+ }
1082
+ [data-theme="dark"] .gw-env-mismatch-desc {
1083
+ color: #daa;
1084
+ }
1085
+ .gw-mismatch-details {
1086
+ display: flex;
1087
+ flex-direction: column;
1088
+ gap: 8px;
1089
+ margin-top: 8px;
1090
+ padding: 12px;
1091
+ background: rgba(255, 255, 255, 0.7);
1092
+ border-radius: 6px;
1093
+ border: 1px solid #faa;
1094
+ }
1095
+ [data-theme="dark"] .gw-mismatch-details {
1096
+ background: rgba(0, 0, 0, 0.3);
1097
+ border-color: #844;
1098
+ }
1099
+ .gw-mismatch-empty-hint {
1100
+ padding: 12px;
1101
+ text-align: center;
1102
+ color: #999;
1103
+ font-size: 12px;
1104
+ font-style: italic;
1105
+ }
1106
+ [data-theme="dark"] .gw-mismatch-empty-hint {
1107
+ color: #666;
1108
+ }
1109
+ .gw-mismatch-item {
1110
+ display: flex;
1111
+ flex-direction: column;
1112
+ gap: 8px;
1113
+ padding: 12px;
1114
+ background: #fff;
1115
+ border-left: 3px solid #f44;
1116
+ border-radius: 4px;
1117
+ font-size: 12px;
1118
+ }
1119
+ [data-theme="dark"] .gw-mismatch-item {
1120
+ background: #2a1a1a;
1121
+ border-color: #f44;
1122
+ }
1123
+ .gw-mismatch-item.gw-mismatch-sensitive {
1124
+ border-left-color: #f90;
1125
+ background: #fffaf0;
1126
+ }
1127
+ [data-theme="dark"] .gw-mismatch-item.gw-mismatch-sensitive {
1128
+ border-left-color: #f90;
1129
+ background: #2a2010;
1130
+ }
1131
+ .gw-mismatch-header-row {
1132
+ display: flex;
1133
+ align-items: center;
1134
+ gap: 8px;
1135
+ padding-bottom: 6px;
1136
+ border-bottom: 1px solid #eee;
1137
+ }
1138
+ [data-theme="dark"] .gw-mismatch-header-row {
1139
+ border-bottom-color: #444;
1140
+ }
1141
+ .gw-mismatch-scope {
1142
+ font-weight: 700;
1143
+ font-size: 13px;
1144
+ color: #c00;
1145
+ }
1146
+ [data-theme="dark"] .gw-mismatch-scope {
1147
+ color: #f88;
1148
+ }
1149
+ .gw-mismatch-field {
1150
+ font-family: monospace;
1151
+ font-size: 11px;
1152
+ color: #666;
1153
+ background: #f5f5f5;
1154
+ padding: 3px 8px;
1155
+ border-radius: 3px;
1156
+ }
1157
+ [data-theme="dark"] .gw-mismatch-field {
1158
+ color: #aaa;
1159
+ background: #1a1a1a;
1160
+ }
1161
+ .gw-mismatch-info {
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ gap: 6px;
1165
+ }
1166
+ .gw-info-row {
1167
+ display: flex;
1168
+ align-items: baseline;
1169
+ gap: 8px;
1170
+ font-size: 12px;
1171
+ }
1172
+ .gw-info-label {
1173
+ flex-shrink: 0;
1174
+ width: 100px;
1175
+ color: #666;
1176
+ font-weight: 500;
1177
+ }
1178
+ [data-theme="dark"] .gw-info-label {
1179
+ color: #aaa;
1180
+ }
1181
+ .gw-info-value {
1182
+ flex: 1;
1183
+ word-break: break-all;
1184
+ }
1185
+ .gw-info-value code,
1186
+ .gw-info-value.gw-value-config {
1187
+ background: #f8f8f8;
1188
+ padding: 2px 6px;
1189
+ border-radius: 3px;
1190
+ font-size: 11px;
1191
+ font-family: monospace;
1192
+ color: #333;
1193
+ }
1194
+ [data-theme="dark"] .gw-info-value code,
1195
+ [data-theme="dark"] .gw-info-value.gw-value-config {
1196
+ background: #2a2a2a;
1197
+ color: #ddd;
1198
+ }
1199
+ .gw-value-env {
1200
+ color: #080;
1201
+ font-weight: 600;
1202
+ font-family: monospace;
1203
+ }
1204
+ [data-theme="dark"] .gw-value-env {
1205
+ color: #6d6;
1206
+ }
1207
+ .gw-value-file {
1208
+ font-family: monospace;
1209
+ }
1210
+ .gw-value-diff {
1211
+ color: #c60;
1212
+ text-decoration: line-through;
1213
+ opacity: 0.7;
1214
+ }
1215
+ [data-theme="dark"] .gw-value-diff {
1216
+ color: #f90;
1217
+ }
1218
+ .gw-info-hint {
1219
+ margin-top: 6px;
1220
+ padding: 6px 10px;
1221
+ background: #f0f8ff;
1222
+ border-left: 3px solid #4a90e2;
1223
+ border-radius: 3px;
1224
+ font-size: 11px;
1225
+ color: #555;
1226
+ line-height: 1.5;
1227
+ }
1228
+ [data-theme="dark"] .gw-info-hint {
1229
+ background: #1a2a3a;
1230
+ border-color: #58a6ff;
1231
+ color: #bbb;
1232
+ }
1233
+ .gw-mismatch-empty {
1234
+ color: #f00;
1235
+ font-weight: 600;
1236
+ }
1237
+ .gw-env-mismatch-help {
1238
+ padding: 10px 12px;
1239
+ background: rgba(255, 255, 255, 0.8);
1240
+ border-radius: 6px;
1241
+ font-size: 12px;
1242
+ line-height: 1.6;
1243
+ color: #555;
1244
+ border-left: 3px solid #4a90e2;
1245
+ }
1246
+ [data-theme="dark"] .gw-env-mismatch-help {
1247
+ background: rgba(0, 0, 0, 0.3);
1248
+ color: #bbb;
1249
+ border-color: #58a6ff;
1250
+ }
1251
+ .gw-env-mismatch-help code {
1252
+ background: #e8f4ff;
1253
+ padding: 2px 5px;
1254
+ border-radius: 3px;
1255
+ color: #0066cc;
1256
+ font-size: 11px;
1257
+ }
1258
+ [data-theme="dark"] .gw-env-mismatch-help code {
1259
+ background: #1a2a3a;
1260
+ color: #58a6ff;
1261
+ }
1262
+ .gw-env-mismatch-actions {
1263
+ display: flex;
1264
+ gap: 8px;
1265
+ align-items: center;
1266
+ justify-content: flex-end;
1267
+ padding-top: 8px;
1268
+ border-top: 1px solid rgba(200, 0, 0, 0.2);
1269
+ }
1270
+ [data-theme="dark"] .gw-env-mismatch-actions {
1271
+ border-top-color: rgba(200, 68, 68, 0.3);
1272
+ }
1273
+ .gw-env-mismatch-actions .ctrl-btn {
1274
+ padding: 6px 12px;
1275
+ font-size: 12px;
1276
+ white-space: nowrap;
1277
+ background: #fff;
1278
+ border: 1px solid #c44;
1279
+ color: #c00;
1280
+ }
1281
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn {
1282
+ background: #2a1a1a;
1283
+ border-color: #c44;
1284
+ color: #f88;
1285
+ }
1286
+ .gw-env-mismatch-actions .ctrl-btn:hover {
1287
+ background: #c00;
1288
+ color: #fff;
1289
+ border-color: #c00;
1290
+ }
1291
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn:hover {
1292
+ background: #c44;
1293
+ color: #fff;
1294
+ border-color: #c44;
1295
+ }
1296
+ .gw-dismiss-banner {
1297
+ background: transparent !important;
1298
+ border: none !important;
1299
+ font-size: 20px !important;
1300
+ padding: 4px 8px !important;
1301
+ color: #800 !important;
1302
+ cursor: pointer;
1303
+ }
1304
+ [data-theme="dark"] .gw-dismiss-banner {
1305
+ color: #daa !important;
1306
+ }
1307
+ .gw-dismiss-banner:hover {
1308
+ background: rgba(0,0,0,0.1) !important;
1309
+ color: #c00 !important;
1310
+ }
1311
+
1312
+ /* Agent 选择模态框 */
1313
+ .gw-agent-select-list {
1314
+ display: flex;
1315
+ flex-direction: column;
1316
+ gap: 8px;
1317
+ max-height: 400px;
1318
+ overflow-y: auto;
1319
+ padding: 8px;
1320
+ background: var(--bg);
1321
+ border: 1px solid var(--border);
1322
+ border-radius: 6px;
1323
+ }
1324
+ .gw-agent-select-item {
1325
+ display: flex;
1326
+ align-items: center;
1327
+ gap: 10px;
1328
+ padding: 10px 12px;
1329
+ background: var(--bg2);
1330
+ border: 1px solid var(--border);
1331
+ border-radius: 5px;
1332
+ cursor: pointer;
1333
+ transition: all 0.15s ease;
1334
+ }
1335
+ .gw-agent-select-item:hover {
1336
+ background: var(--bg3);
1337
+ border-color: var(--accent);
1338
+ }
1339
+ .gw-agent-checkbox {
1340
+ flex-shrink: 0;
1341
+ cursor: pointer;
1342
+ }
1343
+ .gw-agent-label {
1344
+ font-size: 13px;
1345
+ font-weight: 600;
1346
+ color: var(--fg);
1347
+ min-width: 80px;
1348
+ }
1349
+ .gw-agent-aid {
1350
+ font-size: 11px;
1351
+ color: var(--dim);
1352
+ font-family: monospace;
1353
+ overflow: hidden;
1354
+ text-overflow: ellipsis;
1355
+ white-space: nowrap;
1356
+ }
1357
+
1358
+ .gw-intro { font-size: 12px; color: var(--dim); line-height: 1.6; margin-bottom: 16px; padding: 8px 12px; background: var(--bg3); border-radius: 5px; border: 1px solid var(--border); }
1359
+ .gw-intro code { background: var(--bg); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 11px; }
1360
+ .gw-scope { margin-bottom: 20px; }
1361
+ .gw-scope-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
1362
+ .gw-scope-title { font-size: 14px; font-weight: 700; color: var(--fg); }
1363
+ .gw-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
1364
+ .gw-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 12px; display: flex; flex-direction: column; }
1365
+ .gw-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; }
1366
+ .gw-card-icon { font-size: 16px; }
1367
+ .gw-card-title { font-weight: 700; font-size: 13px; color: var(--fg); }
1368
+ .gw-card-type { font-size: 10px; color: var(--dim); background: var(--bg3); padding: 1px 6px; border-radius: 8px; margin-left: auto; }
1369
+ .gw-card-body { display: flex; flex-direction: column; gap: 5px; margin-bottom: 10px; }
1370
+ .gw-row { display: flex; align-items: baseline; gap: 8px; font-size: 12px; }
1371
+ .gw-row-label { flex-shrink: 0; width: 72px; color: var(--dim); }
1372
+ .gw-row-val { flex: 1; color: var(--fg); word-break: break-all; }
1373
+ .gw-dim { color: var(--dim); font-style: italic; }
1374
+ .gw-env { background: var(--bg3); padding: 1px 5px; border-radius: 3px; color: var(--green); font-size: 11px; }
1375
+ .gw-card-actions { display: flex; gap: 5px; margin-top: auto; padding-top: 8px; border-top: 1px solid var(--border); }
1376
+ .gw-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1377
+ .gw-dot-ok { background: var(--green); }
1378
+ .gw-dot-err { background: var(--red); }
1379
+ .gw-dot-unknown { background: var(--dim); opacity: .4; }
1380
+ .ctrl-btn.primary { color: #fff; background: var(--accent); border-color: var(--accent); }
1381
+ .ctrl-btn.primary:hover { opacity: .9; }
1382
+
1383
+ /* Gateway 编辑弹窗 */
1384
+ .gw-modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; z-index: 200; }
1385
+ .gw-modal { background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; width: 440px; max-width: 92vw; max-height: 88vh; overflow-y: auto; box-shadow: 0 8px 32px rgba(0,0,0,.3); }
1386
+ .gw-modal-head { font-size: 15px; font-weight: 700; padding: 14px 18px; border-bottom: 1px solid var(--border); color: var(--fg); }
1387
+ .gw-modal-body { padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
1388
+ .gw-field { display: flex; flex-direction: column; gap: 4px; }
1389
+ .gw-field-label { font-size: 12px; color: var(--dim); font-weight: 500; }
1390
+ .gw-field input, .gw-field select { font-size: 13px; padding: 6px 9px; border: 1px solid var(--border); border-radius: 4px; background: var(--bg); color: var(--fg); font-family: inherit; }
1391
+ .gw-field input:focus, .gw-field select:focus { outline: none; border-color: var(--accent); }
1392
+ .gw-field input:disabled { opacity: .55; cursor: not-allowed; }
1393
+ .gw-hint { font-size: 11px; color: var(--dim); line-height: 1.5; }
1394
+ .gw-hint code { background: var(--bg3); padding: 1px 4px; border-radius: 3px; color: var(--accent); }
1395
+ .gw-modal-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--border); }
1396
+
1397
+ /* Gateway Effective 视图 */
1398
+ .gw-effective-section { margin-top: 24px; padding-top: 16px; border-top: 2px solid var(--border); }
1399
+ .gw-eff-agent { margin-bottom: 16px; }
1400
+ .gw-eff-agent-head { font-size: 13px; font-weight: 700; color: var(--fg); margin-bottom: 8px; }
1401
+ .gw-eff-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
1402
+ .gw-eff-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; }
1403
+ .gw-eff-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
1404
+ .gw-eff-card-body { display: flex; flex-direction: column; gap: 4px; }
1405
+ .gw-eff-row { display: flex; align-items: baseline; gap: 6px; font-size: 12px; }
1406
+ .gw-eff-row.gw-eff-inherited { opacity: .7; font-style: italic; }
1407
+ .gw-eff-label { flex-shrink: 0; width: 64px; color: var(--dim); font-style: normal; }
1408
+ .gw-eff-val { flex: 1; color: var(--fg); word-break: break-all; font-style: normal; }
1409
+ .gw-eff-src { flex-shrink: 0; font-size: 10px; padding: 1px 5px; border-radius: 8px; white-space: nowrap; }
1410
+ .gw-src-agent { color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent); }
1411
+ .gw-src-defaults { color: var(--dim); background: var(--bg3); }
1412
+ .gw-src-env { color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
1413
+ .gw-src-none { color: var(--dim); background: transparent; }
1414
+ .gw-eff-card.gw-eff-inherited-block { border-left: 3px solid var(--dim); opacity: .85; }
1415
+ .gw-eff-block-hint { margin-left: auto; font-size: 14px; opacity: .7; }
1416
+
1417
+ /* Gateway Effective 表格(替换卡片布局) */
1418
+ .gw-eff-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 12px; background: var(--bg2); border-radius: 6px; overflow: hidden; }
1419
+ .gw-eff-table thead { background: var(--bg3); }
1420
+ .gw-eff-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
1421
+ .gw-eff-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
1422
+ .gw-eff-tr:hover { background: var(--bg3); }
1423
+ .gw-eff-tr-inherited { opacity: .75; }
1424
+ .gw-eff-td-aid { font-weight: 600; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1425
+ .gw-eff-td-url { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: monospace; font-size: 11px; }
1426
+ .gw-eff-src-tag { padding: 2px 6px; border-radius: 8px; font-size: 10px; white-space: nowrap; }
1427
+ .gw-eff-edit { padding: 3px 8px; font-size: 11px; }
1428
+
1429
+ /* Effective 表格:URL 完整显示 + 操作列 + 模型弹窗 */
1430
+ .gw-eff-td-url { max-width: none; white-space: normal; word-break: break-all; font-family: monospace; font-size: 11px; min-width: 240px; }
1431
+ .gw-eff-td-actions { white-space: nowrap; }
1432
+ .gw-eff-td-actions .ctrl-btn { padding: 3px 10px; font-size: 11px; margin-right: 4px; }
1433
+ .gw-model-list { max-height: 50vh; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }
1434
+ .gw-model-item { padding: 6px 10px; background: var(--bg3); border-radius: 4px; }
1435
+ .gw-model-item code { font-size: 12px; color: var(--fg); background: transparent; }
1436
+
1437
+ /* Gateway config modal (wide) + price table */
1438
+ .gw-modal-wide { max-width: 90vw; width: 1100px; }
1439
+ .gw-modal-subtitle { font-size: 12px; font-weight: normal; color: var(--dim); margin-top: 4px; }
1440
+ .gw-price-table { width: 100%; border-collapse: collapse; font-size: 12px; }
1441
+ .gw-price-table thead { background: var(--bg3); }
1442
+ .gw-price-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
1443
+ .gw-price-subhead th { font-weight: 500; font-size: 11px; padding: 4px 10px; }
1444
+ .gw-price-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
1445
+ .gw-price-row:hover { background: var(--bg3); }
1446
+ .gw-price-model code { font-size: 11px; background: transparent; color: var(--fg); }
1447
+ .gw-price-edit { padding: 3px 10px; font-size: 11px; }
1448
+ .gw-src-gateway { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
1449
+ .gw-src-local { background: var(--bg3); color: var(--dim); }
1450
+
1451
+ /* 网关配置:模型系列分组 */
1452
+ .gw-model-series { margin-bottom: 16px; }
1453
+ .gw-series-header {
1454
+ display: flex;
1455
+ align-items: center;
1456
+ gap: 8px;
1457
+ padding: 10px 12px;
1458
+ background: var(--bg3);
1459
+ border: 1px solid var(--border);
1460
+ border-radius: 6px;
1461
+ cursor: pointer;
1462
+ user-select: none;
1463
+ transition: background 0.15s;
1464
+ }
1465
+ .gw-series-header:hover { background: color-mix(in srgb, var(--bg3) 90%, var(--accent)); }
1466
+ .gw-series-toggle {
1467
+ font-size: 10px;
1468
+ color: var(--dim);
1469
+ transition: transform 0.2s;
1470
+ width: 12px;
1471
+ display: inline-block;
1472
+ }
1473
+ .gw-series-title {
1474
+ font-weight: 600;
1475
+ font-size: 13px;
1476
+ color: var(--fg);
1477
+ flex: 1;
1478
+ }
1479
+ .gw-series-count {
1480
+ font-size: 11px;
1481
+ color: var(--dim);
1482
+ background: var(--bg2);
1483
+ padding: 2px 8px;
1484
+ border-radius: 10px;
1485
+ }
1486
+ .gw-series-content {
1487
+ margin-top: 8px;
1488
+ overflow: hidden;
1489
+ transition: max-height 0.3s ease;
1490
+ }
1491
+ .gw-series-content .gw-price-table {
1492
+ border: 1px solid var(--border);
1493
+ border-radius: 4px;
1494
+ overflow: hidden;
1495
+ }