evolclaw-web 1.2.0 → 1.2.2

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);
@@ -510,16 +709,20 @@ tr.ag-disabled .ag-name { color: var(--dim); }
510
709
  .ag-msg .text-in { color: var(--msg-in); font-weight: 500; }
511
710
  .ag-msg .text-out { color: var(--msg-out); font-weight: 500; }
512
711
  .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; }
712
+ .ag-msg .mtag-reply { color: var(--green); font-weight: 700; }
513
713
  .ag-msg .mtags { color: var(--magenta); font-size: 10.5px; }
514
714
  .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
715
 
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; }
716
+ /* 消息 tooltip(JS 定位的单例浮层)*/
717
+ .msg-tip-src { display: none; }
718
+ .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; }
719
+ .msg-tip.show { display: block; }
720
+ .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
721
  .tip-row-in { color: var(--msg-in); }
521
722
  .tip-row-out { color: var(--msg-out); }
723
+ .tip-time { margin-right: 4px; color: var(--dim); font-size: 10.5px; font-variant-numeric: tabular-nums; }
522
724
  .tip-kind { margin: 0 2px; font-weight: 600; }
725
+ .tip-kind-reply { color: var(--green); font-weight: 700; }
523
726
  .tip-flag { margin: 0 2px; padding: 0 4px; border-radius: 3px; background: var(--bg3); color: var(--magenta); font-size: 10.5px; }
524
727
  .tip-row b { color: var(--orange); font-weight: 600; }
525
728
 
@@ -580,25 +783,143 @@ tr.ag-disabled .ag-name { color: var(--dim); }
580
783
  background: var(--accent); color: #fff; border-color: var(--accent);
581
784
  }
582
785
 
583
- /* ── Explorer filters ── */
786
+ /* ── Explorer time filters (类似总览的时间选择) ── */
787
+ .exp-time-filters {
788
+ margin-bottom: 16px;
789
+ padding: 12px;
790
+ background: var(--bg3);
791
+ border-radius: 8px;
792
+ border: 1px solid var(--border);
793
+ }
794
+
795
+ .exp-range-tabs {
796
+ display: flex;
797
+ gap: 8px;
798
+ flex-wrap: wrap;
799
+ margin-bottom: 8px;
800
+ }
801
+
802
+ .exp-range-btn {
803
+ padding: 6px 12px;
804
+ font-size: 12px;
805
+ border: 1px solid var(--border);
806
+ background: var(--bg2);
807
+ color: var(--fg);
808
+ border-radius: 6px;
809
+ cursor: pointer;
810
+ transition: all 0.2s;
811
+ }
812
+
813
+ .exp-range-btn:hover {
814
+ background: var(--bg3);
815
+ border-color: var(--accent);
816
+ }
817
+
818
+ .exp-range-btn.active {
819
+ background: var(--accent);
820
+ color: white;
821
+ border-color: var(--accent);
822
+ }
823
+
824
+ .exp-custom-date {
825
+ display: flex;
826
+ gap: 12px;
827
+ align-items: flex-end;
828
+ flex-wrap: wrap;
829
+ padding-top: 8px;
830
+ border-top: 1px solid var(--border);
831
+ }
832
+
833
+ .exp-custom-date label {
834
+ display: flex;
835
+ flex-direction: column;
836
+ gap: 4px;
837
+ font-size: 12px;
838
+ color: var(--dim);
839
+ }
840
+
841
+ .exp-custom-date input {
842
+ padding: 6px 10px;
843
+ font-size: 12px;
844
+ border: 1px solid var(--border);
845
+ border-radius: 4px;
846
+ background: var(--bg2);
847
+ color: var(--fg);
848
+ min-width: 200px;
849
+ }
850
+
851
+ .exp-custom-date button {
852
+ padding: 6px 16px;
853
+ background: var(--accent);
854
+ color: white;
855
+ border: none;
856
+ border-radius: 6px;
857
+ cursor: pointer;
858
+ font-size: 12px;
859
+ font-weight: 500;
860
+ }
861
+
862
+ .exp-custom-date button:hover {
863
+ opacity: 0.9;
864
+ }
865
+
866
+ /* ── Explorer filters (优化后的样式) ── */
584
867
  .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);
868
+ display: flex;
869
+ gap: 12px;
870
+ align-items: flex-end;
871
+ flex-wrap: wrap;
872
+ margin-bottom: 16px;
873
+ padding: 12px;
874
+ background: var(--bg3);
875
+ border-radius: 8px;
876
+ border: 1px solid var(--border);
588
877
  }
878
+
589
879
  .explorer-filters label {
590
- font-size: 11px; color: var(--dim); display: flex; flex-direction: column; gap: 2px;
880
+ display: flex;
881
+ flex-direction: column;
882
+ gap: 4px;
883
+ font-size: 12px;
884
+ color: var(--dim);
885
+ min-width: 160px;
591
886
  }
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);
887
+
888
+ .explorer-filters label span {
889
+ font-weight: 500;
595
890
  }
891
+
892
+ .explorer-filters input,
893
+ .explorer-filters select {
894
+ padding: 6px 10px;
895
+ font-size: 13px;
896
+ border: 1px solid var(--border);
897
+ border-radius: 4px;
898
+ background: var(--bg2);
899
+ color: var(--fg);
900
+ width: 100%;
901
+ }
902
+
903
+ .explorer-filters select {
904
+ cursor: pointer;
905
+ }
906
+
596
907
  .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;
908
+ padding: 7px 20px;
909
+ background: var(--accent);
910
+ color: white;
911
+ border: none;
912
+ border-radius: 6px;
913
+ cursor: pointer;
914
+ font-size: 13px;
915
+ font-weight: 500;
916
+ transition: all 0.2s;
917
+ }
918
+
919
+ .explorer-filters button:hover {
920
+ opacity: 0.9;
921
+ transform: translateY(-1px);
600
922
  }
601
- .explorer-filters button:hover { opacity: 0.9; }
602
923
 
603
924
  /* ── Explorer layout (左侧列表 + 右侧详情) ── */
604
925
  .exp-layout { display: flex; flex: 1; overflow: hidden; }
@@ -625,6 +946,48 @@ tr.ag-disabled .ag-name { color: var(--dim); }
625
946
  font-size: 10px; color: var(--dim); margin-left: 6px; flex-shrink: 0;
626
947
  }
627
948
  .exp-sidebar-item.active .item-meta { color: rgba(255,255,255,0.7); }
949
+ .peer-tag {
950
+ display: inline-block;
951
+ padding: 2px 6px;
952
+ margin-right: 6px;
953
+ font-size: 10px;
954
+ border-radius: 4px;
955
+ font-weight: 600;
956
+ line-height: 1.2;
957
+ vertical-align: middle;
958
+ }
959
+ .peer-tag-group {
960
+ background: #e3f2fd;
961
+ color: #1976d2;
962
+ border: 1px solid #bbdefb;
963
+ }
964
+ .peer-tag-private {
965
+ background: #f3e5f5;
966
+ color: #7b1fa2;
967
+ border: 1px solid #e1bee7;
968
+ }
969
+ .peer-tag-count {
970
+ background: var(--bg3);
971
+ color: var(--dim);
972
+ margin-left: 6px;
973
+ margin-right: 0;
974
+ border: 1px solid var(--border);
975
+ }
976
+ .exp-sidebar-item.active .peer-tag-group {
977
+ background: rgba(227, 242, 253, 0.3);
978
+ color: #90caf9;
979
+ border-color: rgba(255,255,255,0.3);
980
+ }
981
+ .exp-sidebar-item.active .peer-tag-private {
982
+ background: rgba(243, 229, 245, 0.3);
983
+ color: #ce93d8;
984
+ border-color: rgba(255,255,255,0.3);
985
+ }
986
+ .exp-sidebar-item.active .peer-tag-count {
987
+ background: rgba(255,255,255,0.2);
988
+ color: rgba(255,255,255,0.8);
989
+ border-color: rgba(255,255,255,0.2);
990
+ }
628
991
  .exp-detail { flex: 1; padding: 16px; overflow-y: auto; }
629
992
  .exp-detail-header {
630
993
  font-size: 14px; font-weight: 600; margin-bottom: 12px; color: var(--fg);
@@ -667,3 +1030,465 @@ tr.ag-disabled .ag-name { color: var(--dim); }
667
1030
  .mon-toolbar { flex-wrap: wrap; }
668
1031
  }
669
1032
 
1033
+
1034
+ /* ── Gateway 视图 ── */
1035
+ .gw-wrap { padding: 12px 16px; }
1036
+
1037
+ /* 环境变量配置不一致横幅 */
1038
+ .gw-env-mismatch-banner {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ gap: 12px;
1042
+ padding: 16px;
1043
+ margin-bottom: 16px;
1044
+ background: linear-gradient(135deg, #fee 0%, #fdd 100%);
1045
+ border: 2px solid #f88;
1046
+ border-radius: 8px;
1047
+ box-shadow: 0 2px 8px rgba(255, 100, 100, 0.15);
1048
+ }
1049
+ [data-theme="dark"] .gw-env-mismatch-banner {
1050
+ background: linear-gradient(135deg, #3a1a1a 0%, #4a1a1a 100%);
1051
+ border-color: #c44;
1052
+ }
1053
+ .gw-env-mismatch-header {
1054
+ display: flex;
1055
+ align-items: flex-start;
1056
+ gap: 12px;
1057
+ }
1058
+ .gw-env-mismatch-icon {
1059
+ font-size: 28px;
1060
+ flex-shrink: 0;
1061
+ }
1062
+ .gw-env-mismatch-content {
1063
+ flex: 1;
1064
+ display: flex;
1065
+ flex-direction: column;
1066
+ gap: 8px;
1067
+ }
1068
+ .gw-env-mismatch-title {
1069
+ font-size: 15px;
1070
+ font-weight: 700;
1071
+ color: #c00;
1072
+ }
1073
+ [data-theme="dark"] .gw-env-mismatch-title {
1074
+ color: #f88;
1075
+ }
1076
+ .gw-env-mismatch-desc {
1077
+ font-size: 13px;
1078
+ color: #800;
1079
+ line-height: 1.5;
1080
+ }
1081
+ [data-theme="dark"] .gw-env-mismatch-desc {
1082
+ color: #daa;
1083
+ }
1084
+ .gw-mismatch-details {
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+ gap: 8px;
1088
+ margin-top: 8px;
1089
+ padding: 12px;
1090
+ background: rgba(255, 255, 255, 0.7);
1091
+ border-radius: 6px;
1092
+ border: 1px solid #faa;
1093
+ }
1094
+ [data-theme="dark"] .gw-mismatch-details {
1095
+ background: rgba(0, 0, 0, 0.3);
1096
+ border-color: #844;
1097
+ }
1098
+ .gw-mismatch-empty-hint {
1099
+ padding: 12px;
1100
+ text-align: center;
1101
+ color: #999;
1102
+ font-size: 12px;
1103
+ font-style: italic;
1104
+ }
1105
+ [data-theme="dark"] .gw-mismatch-empty-hint {
1106
+ color: #666;
1107
+ }
1108
+ .gw-mismatch-item {
1109
+ display: flex;
1110
+ flex-direction: column;
1111
+ gap: 8px;
1112
+ padding: 12px;
1113
+ background: #fff;
1114
+ border-left: 3px solid #f44;
1115
+ border-radius: 4px;
1116
+ font-size: 12px;
1117
+ }
1118
+ [data-theme="dark"] .gw-mismatch-item {
1119
+ background: #2a1a1a;
1120
+ border-color: #f44;
1121
+ }
1122
+ .gw-mismatch-item.gw-mismatch-sensitive {
1123
+ border-left-color: #f90;
1124
+ background: #fffaf0;
1125
+ }
1126
+ [data-theme="dark"] .gw-mismatch-item.gw-mismatch-sensitive {
1127
+ border-left-color: #f90;
1128
+ background: #2a2010;
1129
+ }
1130
+ .gw-mismatch-header-row {
1131
+ display: flex;
1132
+ align-items: center;
1133
+ gap: 8px;
1134
+ padding-bottom: 6px;
1135
+ border-bottom: 1px solid #eee;
1136
+ }
1137
+ [data-theme="dark"] .gw-mismatch-header-row {
1138
+ border-bottom-color: #444;
1139
+ }
1140
+ .gw-mismatch-scope {
1141
+ font-weight: 700;
1142
+ font-size: 13px;
1143
+ color: #c00;
1144
+ }
1145
+ [data-theme="dark"] .gw-mismatch-scope {
1146
+ color: #f88;
1147
+ }
1148
+ .gw-mismatch-field {
1149
+ font-family: monospace;
1150
+ font-size: 11px;
1151
+ color: #666;
1152
+ background: #f5f5f5;
1153
+ padding: 3px 8px;
1154
+ border-radius: 3px;
1155
+ }
1156
+ [data-theme="dark"] .gw-mismatch-field {
1157
+ color: #aaa;
1158
+ background: #1a1a1a;
1159
+ }
1160
+ .gw-mismatch-info {
1161
+ display: flex;
1162
+ flex-direction: column;
1163
+ gap: 6px;
1164
+ }
1165
+ .gw-info-row {
1166
+ display: flex;
1167
+ align-items: baseline;
1168
+ gap: 8px;
1169
+ font-size: 12px;
1170
+ }
1171
+ .gw-info-label {
1172
+ flex-shrink: 0;
1173
+ width: 100px;
1174
+ color: #666;
1175
+ font-weight: 500;
1176
+ }
1177
+ [data-theme="dark"] .gw-info-label {
1178
+ color: #aaa;
1179
+ }
1180
+ .gw-info-value {
1181
+ flex: 1;
1182
+ word-break: break-all;
1183
+ }
1184
+ .gw-info-value code,
1185
+ .gw-info-value.gw-value-config {
1186
+ background: #f8f8f8;
1187
+ padding: 2px 6px;
1188
+ border-radius: 3px;
1189
+ font-size: 11px;
1190
+ font-family: monospace;
1191
+ color: #333;
1192
+ }
1193
+ [data-theme="dark"] .gw-info-value code,
1194
+ [data-theme="dark"] .gw-info-value.gw-value-config {
1195
+ background: #2a2a2a;
1196
+ color: #ddd;
1197
+ }
1198
+ .gw-value-env {
1199
+ color: #080;
1200
+ font-weight: 600;
1201
+ font-family: monospace;
1202
+ }
1203
+ [data-theme="dark"] .gw-value-env {
1204
+ color: #6d6;
1205
+ }
1206
+ .gw-value-file {
1207
+ font-family: monospace;
1208
+ }
1209
+ .gw-value-diff {
1210
+ color: #c60;
1211
+ text-decoration: line-through;
1212
+ opacity: 0.7;
1213
+ }
1214
+ [data-theme="dark"] .gw-value-diff {
1215
+ color: #f90;
1216
+ }
1217
+ .gw-info-hint {
1218
+ margin-top: 6px;
1219
+ padding: 6px 10px;
1220
+ background: #f0f8ff;
1221
+ border-left: 3px solid #4a90e2;
1222
+ border-radius: 3px;
1223
+ font-size: 11px;
1224
+ color: #555;
1225
+ line-height: 1.5;
1226
+ }
1227
+ [data-theme="dark"] .gw-info-hint {
1228
+ background: #1a2a3a;
1229
+ border-color: #58a6ff;
1230
+ color: #bbb;
1231
+ }
1232
+ .gw-mismatch-empty {
1233
+ color: #f00;
1234
+ font-weight: 600;
1235
+ }
1236
+ .gw-env-mismatch-help {
1237
+ padding: 10px 12px;
1238
+ background: rgba(255, 255, 255, 0.8);
1239
+ border-radius: 6px;
1240
+ font-size: 12px;
1241
+ line-height: 1.6;
1242
+ color: #555;
1243
+ border-left: 3px solid #4a90e2;
1244
+ }
1245
+ [data-theme="dark"] .gw-env-mismatch-help {
1246
+ background: rgba(0, 0, 0, 0.3);
1247
+ color: #bbb;
1248
+ border-color: #58a6ff;
1249
+ }
1250
+ .gw-env-mismatch-help code {
1251
+ background: #e8f4ff;
1252
+ padding: 2px 5px;
1253
+ border-radius: 3px;
1254
+ color: #0066cc;
1255
+ font-size: 11px;
1256
+ }
1257
+ [data-theme="dark"] .gw-env-mismatch-help code {
1258
+ background: #1a2a3a;
1259
+ color: #58a6ff;
1260
+ }
1261
+ .gw-env-mismatch-actions {
1262
+ display: flex;
1263
+ gap: 8px;
1264
+ align-items: center;
1265
+ justify-content: flex-end;
1266
+ padding-top: 8px;
1267
+ border-top: 1px solid rgba(200, 0, 0, 0.2);
1268
+ }
1269
+ [data-theme="dark"] .gw-env-mismatch-actions {
1270
+ border-top-color: rgba(200, 68, 68, 0.3);
1271
+ }
1272
+ .gw-env-mismatch-actions .ctrl-btn {
1273
+ padding: 6px 12px;
1274
+ font-size: 12px;
1275
+ white-space: nowrap;
1276
+ background: #fff;
1277
+ border: 1px solid #c44;
1278
+ color: #c00;
1279
+ }
1280
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn {
1281
+ background: #2a1a1a;
1282
+ border-color: #c44;
1283
+ color: #f88;
1284
+ }
1285
+ .gw-env-mismatch-actions .ctrl-btn:hover {
1286
+ background: #c00;
1287
+ color: #fff;
1288
+ border-color: #c00;
1289
+ }
1290
+ [data-theme="dark"] .gw-env-mismatch-actions .ctrl-btn:hover {
1291
+ background: #c44;
1292
+ color: #fff;
1293
+ border-color: #c44;
1294
+ }
1295
+ .gw-dismiss-banner {
1296
+ background: transparent !important;
1297
+ border: none !important;
1298
+ font-size: 20px !important;
1299
+ padding: 4px 8px !important;
1300
+ color: #800 !important;
1301
+ cursor: pointer;
1302
+ }
1303
+ [data-theme="dark"] .gw-dismiss-banner {
1304
+ color: #daa !important;
1305
+ }
1306
+ .gw-dismiss-banner:hover {
1307
+ background: rgba(0,0,0,0.1) !important;
1308
+ color: #c00 !important;
1309
+ }
1310
+
1311
+ /* Agent 选择模态框 */
1312
+ .gw-agent-select-list {
1313
+ display: flex;
1314
+ flex-direction: column;
1315
+ gap: 8px;
1316
+ max-height: 400px;
1317
+ overflow-y: auto;
1318
+ padding: 8px;
1319
+ background: var(--bg);
1320
+ border: 1px solid var(--border);
1321
+ border-radius: 6px;
1322
+ }
1323
+ .gw-agent-select-item {
1324
+ display: flex;
1325
+ align-items: center;
1326
+ gap: 10px;
1327
+ padding: 10px 12px;
1328
+ background: var(--bg2);
1329
+ border: 1px solid var(--border);
1330
+ border-radius: 5px;
1331
+ cursor: pointer;
1332
+ transition: all 0.15s ease;
1333
+ }
1334
+ .gw-agent-select-item:hover {
1335
+ background: var(--bg3);
1336
+ border-color: var(--accent);
1337
+ }
1338
+ .gw-agent-checkbox {
1339
+ flex-shrink: 0;
1340
+ cursor: pointer;
1341
+ }
1342
+ .gw-agent-label {
1343
+ font-size: 13px;
1344
+ font-weight: 600;
1345
+ color: var(--fg);
1346
+ min-width: 80px;
1347
+ }
1348
+ .gw-agent-aid {
1349
+ font-size: 11px;
1350
+ color: var(--dim);
1351
+ font-family: monospace;
1352
+ overflow: hidden;
1353
+ text-overflow: ellipsis;
1354
+ white-space: nowrap;
1355
+ }
1356
+
1357
+ .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); }
1358
+ .gw-intro code { background: var(--bg); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 11px; }
1359
+ .gw-scope { margin-bottom: 20px; }
1360
+ .gw-scope-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
1361
+ .gw-scope-title { font-size: 14px; font-weight: 700; color: var(--fg); }
1362
+ .gw-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
1363
+ .gw-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 12px; display: flex; flex-direction: column; }
1364
+ .gw-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; }
1365
+ .gw-card-icon { font-size: 16px; }
1366
+ .gw-card-title { font-weight: 700; font-size: 13px; color: var(--fg); }
1367
+ .gw-card-type { font-size: 10px; color: var(--dim); background: var(--bg3); padding: 1px 6px; border-radius: 8px; margin-left: auto; }
1368
+ .gw-card-body { display: flex; flex-direction: column; gap: 5px; margin-bottom: 10px; }
1369
+ .gw-row { display: flex; align-items: baseline; gap: 8px; font-size: 12px; }
1370
+ .gw-row-label { flex-shrink: 0; width: 72px; color: var(--dim); }
1371
+ .gw-row-val { flex: 1; color: var(--fg); word-break: break-all; }
1372
+ .gw-dim { color: var(--dim); font-style: italic; }
1373
+ .gw-env { background: var(--bg3); padding: 1px 5px; border-radius: 3px; color: var(--green); font-size: 11px; }
1374
+ .gw-card-actions { display: flex; gap: 5px; margin-top: auto; padding-top: 8px; border-top: 1px solid var(--border); }
1375
+ .gw-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1376
+ .gw-dot-ok { background: var(--green); }
1377
+ .gw-dot-err { background: var(--red); }
1378
+ .gw-dot-unknown { background: var(--dim); opacity: .4; }
1379
+ .ctrl-btn.primary { color: #fff; background: var(--accent); border-color: var(--accent); }
1380
+ .ctrl-btn.primary:hover { opacity: .9; }
1381
+
1382
+ /* Gateway 编辑弹窗 */
1383
+ .gw-modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; z-index: 200; }
1384
+ .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); }
1385
+ .gw-modal-head { font-size: 15px; font-weight: 700; padding: 14px 18px; border-bottom: 1px solid var(--border); color: var(--fg); }
1386
+ .gw-modal-body { padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
1387
+ .gw-field { display: flex; flex-direction: column; gap: 4px; }
1388
+ .gw-field-label { font-size: 12px; color: var(--dim); font-weight: 500; }
1389
+ .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; }
1390
+ .gw-field input:focus, .gw-field select:focus { outline: none; border-color: var(--accent); }
1391
+ .gw-field input:disabled { opacity: .55; cursor: not-allowed; }
1392
+ .gw-hint { font-size: 11px; color: var(--dim); line-height: 1.5; }
1393
+ .gw-hint code { background: var(--bg3); padding: 1px 4px; border-radius: 3px; color: var(--accent); }
1394
+ .gw-modal-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--border); }
1395
+
1396
+ /* Gateway Effective 视图 */
1397
+ .gw-effective-section { margin-top: 24px; padding-top: 16px; border-top: 2px solid var(--border); }
1398
+ .gw-eff-agent { margin-bottom: 16px; }
1399
+ .gw-eff-agent-head { font-size: 13px; font-weight: 700; color: var(--fg); margin-bottom: 8px; }
1400
+ .gw-eff-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
1401
+ .gw-eff-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; }
1402
+ .gw-eff-card-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
1403
+ .gw-eff-card-body { display: flex; flex-direction: column; gap: 4px; }
1404
+ .gw-eff-row { display: flex; align-items: baseline; gap: 6px; font-size: 12px; }
1405
+ .gw-eff-row.gw-eff-inherited { opacity: .7; font-style: italic; }
1406
+ .gw-eff-label { flex-shrink: 0; width: 64px; color: var(--dim); font-style: normal; }
1407
+ .gw-eff-val { flex: 1; color: var(--fg); word-break: break-all; font-style: normal; }
1408
+ .gw-eff-src { flex-shrink: 0; font-size: 10px; padding: 1px 5px; border-radius: 8px; white-space: nowrap; }
1409
+ .gw-src-agent { color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent); }
1410
+ .gw-src-defaults { color: var(--dim); background: var(--bg3); }
1411
+ .gw-src-env { color: var(--green); background: color-mix(in srgb, var(--green) 12%, transparent); }
1412
+ .gw-src-none { color: var(--dim); background: transparent; }
1413
+ .gw-eff-card.gw-eff-inherited-block { border-left: 3px solid var(--dim); opacity: .85; }
1414
+ .gw-eff-block-hint { margin-left: auto; font-size: 14px; opacity: .7; }
1415
+
1416
+ /* Gateway Effective 表格(替换卡片布局) */
1417
+ .gw-eff-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 12px; background: var(--bg2); border-radius: 6px; overflow: hidden; }
1418
+ .gw-eff-table thead { background: var(--bg3); }
1419
+ .gw-eff-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
1420
+ .gw-eff-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
1421
+ .gw-eff-tr:hover { background: var(--bg3); }
1422
+ .gw-eff-tr-inherited { opacity: .75; }
1423
+ .gw-eff-td-aid { font-weight: 600; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1424
+ .gw-eff-td-url { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: monospace; font-size: 11px; }
1425
+ .gw-eff-src-tag { padding: 2px 6px; border-radius: 8px; font-size: 10px; white-space: nowrap; }
1426
+ .gw-eff-edit { padding: 3px 8px; font-size: 11px; }
1427
+
1428
+ /* Effective 表格:URL 完整显示 + 操作列 + 模型弹窗 */
1429
+ .gw-eff-td-url { max-width: none; white-space: normal; word-break: break-all; font-family: monospace; font-size: 11px; min-width: 240px; }
1430
+ .gw-eff-td-actions { white-space: nowrap; }
1431
+ .gw-eff-td-actions .ctrl-btn { padding: 3px 10px; font-size: 11px; margin-right: 4px; }
1432
+ .gw-model-list { max-height: 50vh; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }
1433
+ .gw-model-item { padding: 6px 10px; background: var(--bg3); border-radius: 4px; }
1434
+ .gw-model-item code { font-size: 12px; color: var(--fg); background: transparent; }
1435
+
1436
+ /* Gateway config modal (wide) + price table */
1437
+ .gw-modal-wide { max-width: 90vw; width: 1100px; }
1438
+ .gw-modal-subtitle { font-size: 12px; font-weight: normal; color: var(--dim); margin-top: 4px; }
1439
+ .gw-price-table { width: 100%; border-collapse: collapse; font-size: 12px; }
1440
+ .gw-price-table thead { background: var(--bg3); }
1441
+ .gw-price-table th { padding: 8px 10px; text-align: left; font-weight: 600; color: var(--dim); border-bottom: 1px solid var(--border); }
1442
+ .gw-price-subhead th { font-weight: 500; font-size: 11px; padding: 4px 10px; }
1443
+ .gw-price-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); }
1444
+ .gw-price-row:hover { background: var(--bg3); }
1445
+ .gw-price-model code { font-size: 11px; background: transparent; color: var(--fg); }
1446
+ .gw-price-edit { padding: 3px 10px; font-size: 11px; }
1447
+ .gw-src-gateway { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
1448
+ .gw-src-local { background: var(--bg3); color: var(--dim); }
1449
+
1450
+ /* 网关配置:模型系列分组 */
1451
+ .gw-model-series { margin-bottom: 16px; }
1452
+ .gw-series-header {
1453
+ display: flex;
1454
+ align-items: center;
1455
+ gap: 8px;
1456
+ padding: 10px 12px;
1457
+ background: var(--bg3);
1458
+ border: 1px solid var(--border);
1459
+ border-radius: 6px;
1460
+ cursor: pointer;
1461
+ user-select: none;
1462
+ transition: background 0.15s;
1463
+ }
1464
+ .gw-series-header:hover { background: color-mix(in srgb, var(--bg3) 90%, var(--accent)); }
1465
+ .gw-series-toggle {
1466
+ font-size: 10px;
1467
+ color: var(--dim);
1468
+ transition: transform 0.2s;
1469
+ width: 12px;
1470
+ display: inline-block;
1471
+ }
1472
+ .gw-series-title {
1473
+ font-weight: 600;
1474
+ font-size: 13px;
1475
+ color: var(--fg);
1476
+ flex: 1;
1477
+ }
1478
+ .gw-series-count {
1479
+ font-size: 11px;
1480
+ color: var(--dim);
1481
+ background: var(--bg2);
1482
+ padding: 2px 8px;
1483
+ border-radius: 10px;
1484
+ }
1485
+ .gw-series-content {
1486
+ margin-top: 8px;
1487
+ overflow: hidden;
1488
+ transition: max-height 0.3s ease;
1489
+ }
1490
+ .gw-series-content .gw-price-table {
1491
+ border: 1px solid var(--border);
1492
+ border-radius: 4px;
1493
+ overflow: hidden;
1494
+ }